模组:自定义语言

来自Stardew Valley Wiki
跳到导航 跳到搜索

目录

此页面解释如何在星露谷物语 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

可用的标识为:

  • [HOURS_12]:12小时制的小时数,其中午夜和正午都为“12”。
  • [HOURS_12_0]:12小时制的小时数,其中午夜和正午都为“0”。
  • [HOURS_24]:24小时制的小时数,其中午夜为“0”,正午为“12”。
  • [HOURS_24_00]:24小时制的两位小时数,其中午夜为“00”,正午为“12”。
  • [MINUTES]:两位分钟数。
  • [AM_PM]:"am" 或 "pm" 的本地化文本(分别取自Strings\\StringsFromCSFiles:DayTimeMoneyBox.cs.10370DayTimeMoneyBox.cs.10371)。游戏在正午到11:59pm之间(含端点)显示"pm" 否则显示 "am"。
ClockTimeFormat 描述游戏内时间格式的字符串。等价于TimeFormat但用于游戏内时钟。
ClockDateFormat 描述游戏内日期格式的字符串,可包含如下标识。这些标识会被替换为具体的日期值。例如:A [DAY_OF_WEEK]. [DAY_OF_MONTH]会在1日显示Mon. 1

可用的标识为:

  • [DAY_OF_WEEK]:星期缩写,即Game1.shortDayDisplayNameFromDayOfSeason的返回值(例如星期一是Mon for Monday)。
  • [DAY_OF_MONTH]:当月第几天。为一个数值。
FontApplyYOffset (可选) 是否将字体上移4个像素(乘以FontPixelZoom),以更好地与较大的字符对齐(例如中文或日语)。默认为false。
NumberComma (可选) 千位分隔符,例如","(半角逗号),效果为5,000,000。默认为半角逗号。
SmallFontLineSpacing (可选)' smallFont所用行距。默认26。
UseGenderedCharacterTranslations (可选) “友谊”选项卡和礼物日志是否使用与性别有关的翻译(例如葡萄牙语的阴阳性)。默认为false。

特别地,此字段影响Strings\StringsFromCSFiles:SocialPage.cs.11635的翻译("(Single)")。启用此字段后,可以使用/分隔两种性别对应的文本,例如原版的葡萄牙语翻译为"(solteiro)/(solteira)"。

自定义字体字段 参见下文 添加自定义字体

示例

下述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.pngJapanese_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文件(此处背景设为黑色是为了看清字体):
Modding - example font texture.png

示例

若您正在使用Content Patcher,则您的内容包应当如下图所示(包含上述文件):

📁 Your Mod Name/
  🗎 content.json
  🗎 manifest.json
  📁 assets/
    🗎 YourLanguage.fnt
    🗎 YourLanguage_0.png

现在您只需要通过Content/Fonts游戏文件夹启用此字体即可。请确保语言数据中的FontFile字段指定的.fnt文件,以及字体数据中的pages字段指定的图片文件都准确无误。

例如,如下是包含自定义字体的世界语(注意语言数据中的UseLatinFontFontFile字段,以及底部的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

另请参阅