查看“模组:制作指南/APIs/Translation”的源代码
←
模组:制作指南/APIs/Translation
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
{{../../header}} 翻译接口可让模组实现多语言,并将所有语言包含在一个发行包中,以便 SMAPI 根据游戏语言自动使用。 ==概述== SMAPI 从模组文件夹中的文件读取翻译。当请求翻译时,它将自动处理语言环境<br> 例如,如果指定的翻译文件 <samp>pt-BR.json</samp> 不可用,SMAPI 将检查 <samp>pt.json</samp> 和 <samp>default.json</samp><br>翻译可以是一个简单的字符串,也可以包含将值注入到翻译中的标记。 ==i18n 文件夹== ===文件结构=== SMAPI 从模组文件夹中的 <samp>i18n</samp> 子文件夹中的 JSON 文件读取翻译,文件结构如下: <pre> YourMod/ i18n/ default.json es.json pt.json manifest.json YourMod.dll </pre> <samp>default.json</samp> 文件包含在没有翻译可用时将显示的默认文本,一般是英语<br> 您需要为每种语言创建一个单独的文件,每个翻译文件应是以下文件名之一: {| class="wikitable" |- ! 语言 ! 文件名 |- | 中文 Chinese | <samp>zh.json</samp> |- | 法语 French | <samp>fr.json</samp> |- | 德语 German | <samp>de.json</samp> |- | 匈牙利语 Hungarian | <samp>hu.json</samp> |- | 意大利语 Italian | <samp>it.json</samp> |- | 日语 Japanese | <samp>ja.json</samp> |- | 韩语 Korean | <samp>ko.json</samp> |- | 葡萄牙语 Portuguese | <samp>pt.json</samp> |- | 俄语 Russian | <samp>ru.json</samp> |- | 西班牙语 Spanish | <samp>es.json</samp> |- | 土耳其语 Turkish | <samp>tr.json</samp> |} 对于 [[模组:自定义语言|自定义语言]],请在文件名中使用其 <samp>LanguageCode</samp> 值 ===文件格式=== 每个 <samp>.json</samp> 文件都应是 key→value 键值对格式。 每个键不区分大小写,并且可以包含字母数字、下划线、连字符和点字符。可以随意添加 JavaScript 注释来组织或记录您的翻译,例如: <syntaxhighlight lang="javascript"> { "item-type.label": "Item type", "item-type.fruit-tree": "{{fruitName}} tree", } </syntaxhighlight> 其中的 <code><nowiki>{{fruitName}}</nowiki></code> 是一个令牌。可以添加任何您想要的令牌(每个令牌在名称中只有字母),并用代码中的值替换它们(请参阅下面的 [[#读取翻译|''读取翻译'']]) ===给译者的提示=== * 使用 UTF-8 编码保存 i18n 文件以避免游戏中乱码 * 在 SMAPI 控制台中输入 <code>reload_i18n</code> 并按 Enter 键即可重新加载翻译而无需退出游戏。(如果模组内部缓存了翻译,则可能不会更新。) ==读取翻译== ===内置接口=== 设置 i18n 文件后,就可以在代码中读取当前语言环境的翻译: <syntaxhighlight lang="c#"> // 读取一个简单的翻译 string label = helper.Translation.Get("item-type.label"); // 读取使用标记的翻译(可以是匿名对象、字典或模型) string text = helper.Translation.Get("item-type.fruit-tree", new { FruitName = "apple" }); </syntaxhighlight> <samp>helper.Translate(…)</samp> 方法可以继续调用其返回值来自定义翻译(有关可用方法的说明,请参阅 IntelliSense)<br>要获取文本,只需将其分配给一个字符串: <syntaxhighlight lang="c#"> string text = helper.Translation.Get(key).Tokens(tokens).Tokens(moreTokens).Default("缺少翻译?"); </syntaxhighlight> ===强类型接口=== 内置接口没有构建时验证。例如,如果设置了 <code>fruitName</code> 参数,但翻译实际上使用 <code><nowiki>{{fruit}}</nowiki></code>,则在测试每个参数之前无法知道游戏中的翻译是否正常。这对于大多数模组来说没问题,但对于在许多不同的 UI 流程中拥有数百种翻译的大型模组来说可能会出现问题。 可选的 [https://github.com/Pathoschild/SMAPI-ModTranslationClassBuilder#readme SMAPI 模组翻译类生成器] 可生成一个强类型来读取翻译: <syntaxhighlight lang="c#"> string label = I18n.ItemType_Label(); string text = I18n.ItemType_FruitTree(fruitName: "apple"); </syntaxhighlight> 如果翻译出错就会立即知道,因为它无法编译。 ==也看看== [https://gist.github.com/Pathoschild/4e0af42158583983a4206d4d734bfc0b LINQ 脚本] 格式化翻译事件 [[Category:模组]] [[en:Modding:Modder_Guide/APIs/Translation]]
该页面使用的模板:
模组:制作指南/header
(
查看源代码
)
返回至
模组:制作指南/APIs/Translation
。
导航菜单
个人工具
创建账户
登录
名字空间
模组
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
台灣正體
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
未翻译的页面
帮助:编辑入门
随机页面
官方链接
官方网站
官方论坛
官方商品
Discord
Reddit
工具
链入页面
相关更改
上传文件
特殊页面
页面信息