模组:自定义语言
← 目录
此页面解释如何在星露谷物语 1.5.5+ 版本中创建自定义语言。这是面向模组开发者的高级指南。
欲将文本翻译为已有的语言,请参阅模组:翻译模组。
添加自定义语言
数据格式
您可以通过编辑Data/AdditionalLanguages素材以自定义语言。该素材文件中的每个条目都是包含如下字段的数据对象:
字段 | 描述 |
---|---|
ID | 自定义语言的唯一字符串ID。此ID不会在游戏中显示。 |
LanguageCode | 此本地化的语言代码。建议设为仅包含字母和连字符的ISO 639-1 代码。为了与Content Patcher兼容(它会检查{{Language}}标识),应当避免使用逗号。 |
ButtonTexture | 语言菜单中相应按钮贴图的素材名称,贴图尺寸为174x78像素。其中,贴图上半部分为默认状态贴图,下半部分为悬停状态贴图。 |
TimeFormat | 描述游戏时间格式的字符串,可包含如下标识。这些标识会被替换为具体的时间值。例如,[HOURS_12]:[MINUTES] [AM_PM] 会在正午显示12:00 PM 。
可用的标识为:
|
ClockTimeFormat | 描述游戏内时间格式的字符串。等价于TimeFormat但用于游戏内时钟。 |
ClockDateFormat | 描述游戏内日期格式的字符串,可包含如下标识。这些标识会被替换为具体的日期值。例如:A [DAY_OF_WEEK]. [DAY_OF_MONTH] 会在1日显示Mon. 1 。
可用的标识为:
|
FontApplyYOffset | (可选) 是否将字体上移4个像素(乘以FontPixelZoom),以更好地与较大的字符对齐(例如中文或日语)。默认为false。 |
NumberComma | (可选) 千位分隔符,例如"," (半角逗号),效果为5,000,000 。默认为半角逗号。
|
SmallFontLineSpacing | (可选)' smallFont所用行距。默认26。 |
UseGenderedCharacterTranslations | (可选) “友谊”选项卡和礼物日志是否使用与性别有关的翻译(例如葡萄牙语的阴阳性)。默认为false。
特别地,此字段影响Strings\StringsFromCSFiles:SocialPage.cs.11635的翻译("(Single)")。启用此字段后,可以使用 |
自定义字体字段 | 参见下文 添加自定义字体。 |
示例
下述Content Patcher内容包自定义了世界语({{ModId}}
是一个标识,会被自动替换为您的模组ID)。
{
"Format": "2.3.0",
"Changes": [
// define language
{
"Action": "EditData",
"Target": "Data/AdditionalLanguages",
"Entries": {
"{{ModId}}_Esperanto": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
"ID": "{{ModId}}_Esperanto",
"LanguageCode": "eo",
"ButtonTexture": "Mods/{{ModId}}/Button",
"UseLatinFont": true,
"TimeFormat": "[HOURS_24_00]:[MINUTES]",
"ClockTimeFormat": "[HOURS_24_00]:[MINUTES]",
"ClockDateFormat": "[DAY_OF_WEEK] [DAY_OF_MONTH]"
}
}
},
// load button texture
{
"Action": "Load",
"Target": "Mods/{{ModId}}/Button",
"FromFile": "assets/button.png"
}
]
}
一旦定义了语言,您就可以通过一般方式编辑游戏素材,以及使用您的语言代码。例如:
{
"Action": "EditData",
"Target": "Strings/StringsFromCSFiles",
"Entries": {
"Game1.cs.3043": "Lundo",
"Game1.cs.3044": "Mardo",
...
},
"When": {
"Language": "eo"
}
}
添加自定义字体
您可以为自定义语言添加自定义Bitmap字体。Bitmap字体将任意Unicode字符映射为字体贴图。您可以解包Content文件夹并观摩Fonts文件夹下的中文、日语、韩语、俄语字体。
数据格式
为使用自定义字体,请在Data/AdditionalLanguages条目下额外添加这三个字段:
字段 | 描述 |
---|---|
UseLatinFont | 此语言是否使用游戏的默认字体(须设为false才能使用自定义字体)。 |
FontFile | .fnt字体文件的素材名称。必须为Content文件夹中的字体素材名称,而不能是您自己的内容包下面的素材名称。参见下述例子。 |
FontPixelZoom | 字体大小将乘以此数值。推荐的基线值为1.5,但亦可自行调整。 |
字体文件
注意:若您已有TrueType字体,则可以使用此Bitmap字体生成器以将其转为Bitmap格式。
- 字体数据
- 每个字体必须拥有一个扩展名为.fnt的文本文件(XML),用于描述此字体。
- 例如,下面是Content/Fonts/Japanese.fnt文件(为方便演示,省略大部分字符)。
<?xml version="1.0"?> <font> <info face="SetoFont-SP" size="24" bold="0" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="1,1" outline="0"/> <common lineHeight="24" base="21" scaleW="1024" scaleH="1024" pages="2" packed="0" alphaChnl="0" redChnl="4" greenChnl="4" blueChnl="4"/> <pages> <page id="0" file="Japanese_0" /> <page id="1" file="Japanese_1" /> </pages> <chars count="2514"> ... <char id="37347" x="100" y="265" width="24" height="22" xoffset="0" yoffset="1" xadvance="24" page="0" chnl="15" /> ... </chars> </font>
- 参见官方格式文档以深入地理解所有选项。此处仅简要介绍:
字段 描述 info 描述字体信息:名称、TrueType尺寸、内边距 (padding) 和 间距 (spacing)。 common 提供了适用于所有字符的公共信息,例如行高。 pages 列出了作为字体一部分的贴图。在上述示例中,日语字符贴图集共有2张:Japanese_0.png 和 Japanese_1.png。随后的chars字段中的每个字符都需要指定其所在的贴图集(通过page)。 chars 将每个Unicode字符映射到贴图字体。上述例子中,一个char字符须包含如下属性: 字符属性 解释 id 此字符的十进制Unicode ID(例如,“37347”为“釣”)。您可以在Unicodepedia查找字符及其ID。 x
y
width
height依次指定了:贴图集中字符贴图左上角横坐标、纵坐标,字符贴图宽度、高度,单位均为像素。 xoffset
yoffset显示字符时所加的水平和数值偏移,单位为像素。 xadvance 向屏幕绘制多个字符时,字符应当先于光标多少像素。 page 此贴图所在贴图集的ID,后者定义在pages字段中。 chnl 哪些颜色通道包含字体数据。星露谷物语使用所有通道,因此chnl应当取15。
- 字体图像
- 每个字体也需要一至多个包含字符贴图的图像(白色字体、透明背景)。其文件名和贴图位置由上述字体数据文件给出。
- 例如,下面是Content/Fonts/Japanese_0文件(此处背景设为黑色是为了看清字体):
示例
若您正在使用Content Patcher,则您的内容包应当如下图所示(包含上述文件):
📁 Your Mod Name/ 🗎 content.json 🗎 manifest.json 📁 assets/ 🗎 YourLanguage.fnt 🗎 YourLanguage_0.png
现在您只需要通过Content/Fonts游戏文件夹启用此字体即可。请确保语言数据中的FontFile字段指定的.fnt文件,以及字体数据中的pages字段指定的图片文件都准确无误。
例如,如下是包含自定义字体的世界语(注意语言数据中的UseLatinFont和FontFile字段,以及底部的2个新patch):
{
"Format": "2.3.0",
"Changes": [
// define language
{
"Action": "EditData",
"Target": "Data/AdditionalLanguages",
"Entries": {
"{{ModId}}_Esperanto": { // for technical reasons, you need to specify the ID here *and* in the "ID" field
"ID": "{{ModId}}_Esperanto",
"LanguageCode": "eo",
"ButtonTexture": "Mods/{{ModId}}/Button",
"UseLatinFont": false,
"FontFile": "Fonts/{{ModId}}/Esperanto",
"TimeFormat": "[HOURS_24_00]:[MINUTES]",
"ClockTimeFormat": "[HOURS_24_00]:[MINUTES]",
"ClockDateFormat": "[DAY_OF_WEEK] [DAY_OF_MONTH]"
}
}
},
// load button texture
{
"Action": "Load",
"Target": "Mods/{{ModId}}/Button",
"FromFile": "assets/button.png"
}
// load font files
{
"Action": "Load",
"Target": "Fonts/{{ModId}}/Esperanto",
"FromFile": "assets/Esperanto.fnt"
},
{
"Action": "Load",
"Target": "Fonts/{{ModId}}/Esperanto_0",
"FromFile": "assets/Esperanto_0.png"
}
]
}
限制
自定义语言须在游戏启动的非常早期初始化完毕。稍晚,则会出错。这说明:
- 使用Content Patcher包添加自定义语言时不能使用When条件(或仅使用config或HasMod等不可变条件)。
- 使用C#模组添加自定义语言不能晚于GameLaunched。