EU4当中,本地化的内容文件都被存放在游戏目录下的localisation文件夹中,它们的扩展名都是.yml,这表示它们是采用 YAML 规范编写成的。它们的格式类似这样:
l_english: MENU_MESSAGES_DISABLE_ALL:0 "Disable all" FILTER:0 "Filter" TO_ME:0 "To me" FROM_ME:0 "From me" INTERESTING:0 "Interesting" OTHERS:0 "Others" hre_province_restored:0 "Territory restored to the Empire" DECAY:0 "Decay"
除第一行以外,每一行的开头都必须要有额外的空格,标志着这些本地化条目从属于哪种语言(事实上,你把所有的本地化条目全都丢在一个.yml文件里,只要格式正确,那么它们依然能够正确显示)。半角冒号后面的数字是修订版本号,不会出现在文案里。(所以作为Modder,你完全可以不在半角冒号后加上数字以提高工作效率)只有双引号里的内容会在游戏当中显示出来。冒号需要和前面的键(需要给出文案的项目)连在一起,中间不能有空格:
key: "value"
像下面这样就是错误的:
key : "value"
而如果你的文案里也有双引号,那么作为文案的双引号应该加 \ 作转义,例如:
l_english: STRING_WITH_QUOTES: "This string contains \"quotes\", therefore it's awesome!"
最近的更新当中有的本地化文件不加转义符也不会造成文案错误,不过加上总是没问题的。
在编辑本地化文件的时候,创作者同时要注意编码问题。这些文件必须采用带有字节序标记的UTF-8(UTF-8 with BOM)。注意,只有本地化文件使用 UTF-8 with BOM,而游戏文本文件(.txt)以及地图文件夹下的逗号分隔值文件(.csv)应该用 ANSI 编码(在英文版Windows10当中是指Windows 1252)。如果一个本地化文件用ISO 8859-1(Latin-1)这种单字节字符集编码, 那么游戏将会无法读取这个本地化文件,所有的文案在游戏中无法正常显示,你就会看到 "Missing Localization!" 。
为了确保正确的编码,请备份原始的本地化文件,并使用高级文本编辑器(如Microsoft Visual Studio Code)打开文件,执行 "Reopen with Encoding" 选取正确的字符集后再开始编辑。
注意事项:yml文件名称格式应类似于XXX_l_english(XXX部分任意),即XXX_小写字母L_english.如果命名错误游戏也是检测不到本地化文件的
新的格式化标准
本地化系统也支持在本地化字符串中格式化文本,代替C++代码。为了格式化变量,输入“§”接上想要的格式化规则,然后用“§!”结束表达式。
如下格式化规则实现了:
| 代码 | 效果 |
|---|---|
| % | 转换数值为百分数 |
| * | 转换数值为SI单位 |
| = | 添加“+”如果数值为正数,以及“-”给负数 |
| 0..9 | 数值精度 |
| W,B,G,R,b,g,Y, M,T,O,l,J,P,V |
给文本上色,依次是:
|
| + | 给数值上色,正数是绿色,零是黄色,负数是红色 |
| - | 给数值上色,正数是红色,零是黄色,负数是绿色 |
例如,如果要将定点值转换为带有一个小数的百分数,如果正数将其着色为绿色,则现在可以将其写为「$VAL|%2+$!」。
如果我们想用三个小数点后的颜色将值涂成黄色,如果值是正数,则添加一个「+」号,我们可以将其写为「§=Y3$VAL$§」等。
变量
我们能用两种方式显示本地化动态信息(像是一个省份的宗教)。
名字空间
这是一种更干净、更新以及更灵活的以本地化显示的数据调用方式。它使用了类似于事件修改中的作用域的系统,不过请记住,它使用了一个独特的集合,如下所述。任何进行过面向对象编程的人都会很熟悉。
一些示例 - 注意游戏如何从事件的“root” /“from”以及整个作用域进行定向,直到找到所需信息为止。
[Root.GetAdjective] //获取形容词格
我们能使用附加的作用域:
[FRA.Monarch.GetTitle] //获取法兰西统治者的头衔
我们能使用多个作用域:
[From.From.From.Owner.Monarch.GetHerHim] //前前前拥有者的统治者性别(返回他或她)
作用域
| 运算符 | 来自作用域 | 到达作用域 | 描述 |
|---|---|---|---|
| Capital | 国家 | 省份 | 首都省份 |
| ColonialParent | 国家 | 国家 | 殖民领的宗主国 |
| Culture | 国家 & 省份 | 文化 | 一个国家的文化 |
| Dynasty | 人物 | 王朝 | 统治者的王室 |
| From | FROM(前者)省份或国家 | ||
| Heir | 国家 | 人物 | 继承人 |
| Location | |||
| Monarch | 国家 | 人物 | 统治者 |
| Owner | 省份 | 国家 | 一个省份的拥有者 |
| Religion | 国家 & 省份 | 宗教 | 宗教 |
| Root | ROOT(根)省份或国家 | ||
| TAG | 国家 | 可以直接将作用域指向一个国家的TAG(例如FRA) | |
| This | |||
| TradeCompany | 国家 | 国家(?) | 贸易公司附属国 |
| Dip_Advisor | 国家 | 人物 | 外交顾问 |
| Adm_Advisor | 国家 | 人物 | 行政顾问 |
| Mil_Advisor | 国家 | 人物 | 军事顾问 |
指令
| 指令 | 作用域 | 描述 | 示例 |
|---|---|---|---|
| GetAreaName | 省份 | 一个省份的地区 | [This.GetAreaName] |
| GetAdjective | 国家 | 国家形容词格,例如「Spanish」 | |
| GetAdm | 人物 | 行政能力 | |
| GetCapitalName | 省份 | 获取一个省份的城市名,例如「Paris」 | [From.Capital.GetCapitalName] |
| GetDip | 人物 | 外交能力 | |
| GetGroupName | 文化 | 获取文化组名,例如「British」 (does it work with Religion?) | |
| GetHerHim | 人物 | "her"/"him" | |
| GetHerHimCap | 人物 | "Her"/"Him" 大写的 | |
| GetHerHis | 人物 | "her"/"his" | |
| GetHerHisCap | 人物 | "Her"/"His" 大写的 | |
| GetHerselfHimself | 人物 | "herself"/"himself" | |
| GetHerselfHimselfCap | 人物 | "Herself"/"Himself" 大写的 | |
| GetSheHe | 人物 | "he/"she" | |
| GetSheHeCap | 人物 | "He/"She" 大写的 | |
| GetMil | 人物 | 军事能力 | |
| GetName | all | [Root.Country.GetName]| | |
| GetTitle | 人物 | 获取头衔,例如「King, President」 | |
| GetTradeGoodsName | 省份 | 在省份生产的商品名字 | |
| GetWomanMan | 人物 | "man/woman" | |
| GetYear | none | 不需要作用域,返回当前年份 | [GetYear] |
| GovernmentName | 国家 | 得到一个国家的政体名,例如「Kingdom」 | [Root.GovernmentName] |
| GetXEDip | 国家 | 仅限法语:Permet d'accorder féminin ou masculin | excellent[Root.GetXEDip] |
| GetErEreDip | 国家 | 仅限法语:Permet d'accorder le mot 'conseiller' | conseill[Root.GetErEreDip] |
| GetValue | 国家 | 变量的值 | [Root.myvar.GetValue] |
关键字
游戏现有的本地化文件中出现了许多标量标识符。它们不是很灵活或漂亮,但如果它们有正确的范围我们则可以使用它。
其中一些可能不适用于事件、任务等,因为它们需要通过游戏代码获得其他数据。
| 关键字 | 作用域 | 描述 | 示例值 |
|---|---|---|---|
| $ADM$ | |||
| $ARMY_REFORMER$ | 顾问的名字 | ||
| $ARMY_ORGANISER$ | 顾问的名字 | ||
| $ARTIST$ | 顾问的名字 | ||
| $BASE$ | |||
| $CAPITAL$ | 国家 | 显示root国的首都省份名称 | Île-de-France |
| $CAPITAL_CITY$ | 国家 | 显示root国的首都省份城市名称 | Paris |
| $COLONIAL_GOVERNOR$ | 顾问的名字 | ||
| $COMMANDANT$ | 顾问的名字 | ||
| $CONTINENT$ | |||
| $CONTROLLERNAME$ | 省份 | 显示root省份控制者的名称(围城胜利者) | England |
| $COUNTRY$ | 国家 | 显示root国的名称 | France |
| $COUNTRY_ADJ$ | 国家 | 显示root国的名称形容词格 | French |
| $COUNTRY_RELIGION$ | 国家 | 显示root国的国教 | Catholic |
| $CULTGROUP$ | 文化组,不确定是否可用于事件中 | ||
| $CULTURE$ | 国家 | 显示root国的主流文化 | Francien |
| $DATE$ | |||
| $DIPLOMAT$ | 顾问的名字 | ||
| $DYNASTY$ | 国家 | 显示root国的统治者王朝 | Tudor |
| $EFFECTS$ | |||
| $EMPERORNAME$ | 神罗皇帝? | ||
| $FORTIFICATION_EXPERT$ | |||
| $FROM$ | |||
| $FROMCOUNTRY$ | |||
| $FROM_COUNTRY$ | |||
| $GRAND_CAPTAIN$ | 顾问的名字 | ||
| $Consort$ | 配偶 | ||
| $HEIR$ | Henry Tudor | ||
| $HEIR_ADJ$ | 继承人的所有格 | his/her | |
| $HEIR_CAP_ADJ$ | 大写的继承人的所有格 | His/Her | |
| $HEIR_DYNASTY | |||
| $HEIR_O_PRONOUN$ | 继承人的宾格 | him/her | |
| $HEIR_CAP_O_PRONOUN$ | 大写的继承人的宾格 | him/her | |
| $HEIR_S_PRONOUN$ | 继承人的主格 | he/she | |
| $HEIR_CAP_S_PRONOUN$ | 大写的继承人的主格 | He/She | |
| $INQUISITOR$ | 顾问的名字 | ||
| $KEY$ | |||
| $LIKELYREBELS$ | 省份 | ||
| $LOCATION$ | |||
| $LOYALNAMES$ | |||
| $MASTER_OF_MINT$ | 顾问的名字 | ||
| $MESSENGER$ | |||
| $MONARCH$ | 国家 | 显示root国家的统治者姓名 | Henry VIII |
| $MONARCHTITLE$ | 国家 | 显示root国家的统治者头衔 | King |
| $NAME$ | |||
| $NAVY_REFORMER$ | 顾问的名字 | ||
| $NATION$ | |||
| $NATURAL_SCIENTIST$ | 顾问的名字 | ||
| $NAVIGATOR$ | 顾问的名字 | ||
| $NCARDINALS$ | 枢机主教的整数 | ||
| $NUM$ | |||
| $OVERLORD$ | 国家 | 显示附属国宗主的名字 | |
| $OWNERNAME$ | |||
| $PERYEAR$ | 年度分离主义减少 | ||
| $PLAYER$ | |||
| $PRICE$ | |||
| $PROV$ | |||
| $PROVINCE$ | |||
| $PROVINCECAPITAL$ | 省份 | 显示root省份的首都城市名称 | Paris |
| $PROVINCENAME$ | |||
| $PROVINCECULTURE$ | 省份 | 显示root省份的文化 | |
| $QUARTERMASTER$ | 顾问的名字 | ||
| $RANDOM_OLD_MONARCH$ | |||
| $REBELNAME$ | |||
| $RELIGION$ | |||
| $RECRUITMASTER$ | 顾问的名字 | ||
| $RULER_ADJ$$ | |||
| $SPYMASTER$ | 顾问的名字 | ||
| $STATESMAN$ | 顾问的名字 | ||
| $THEOLOGIAN$ | 顾问的名字 | ||
| $TRADER$ | 顾问的名字 | ||
| $TREASURER$ | 顾问的名字 | ||
| $TYPE$ | |||
| $UNIT$ | |||
| $UNTIL$ | 年度分离主义结束 | ||
| $VAL$ | |||
| $WHO$ | |||
| $YEAR$ | 国家 | 显示当前年份 | 1444 |
替换本地化关键字
要替换原版本地化,在本地化文件夹里面创建一个文件夹名为 replace。在这个文件夹放上你的本地化文件,包含你想要替换的原版本地化关键字。你也能用相同的方式修改本地化就像其他的东西。本地化在计算校验码时是被忽略的。
对Flag的本地化
由于条件中有很多会用到像consort_flag等flag来判断是否存在此flag。然而,会遇到对flag进行本地化无法生效的情况。
经过测试,只需要把flag的名称,比如:将一个叫heiljsf_test_flag的flag,进行本地化。书写方法:
heiljsf_test_flag:0 "heiljsf的测试flag"
写到XXXX_text_l_english.yml的文件里才会生效(XXXX为任意字符)。请一定要注意,存到别的命名格式文件名的本地化文件中不会生效。
文化省份名称
如果「使用动态省份名字」是打开的,省份名称基于当前拥有者的文化变为它们在 localisation 文件夹的值。这些名字列在 common/province_names 下,每个文化组、文化或者tag有一个文件;每个文件包含一个列表,每条记录都是一个省份ID、一个等号和一个半角引号中的名字。例如,common/province_names/czech.txt 开头:
13 = "Slesvicko" 40 = "Klajpeda" 41 = "Královec" 42 = "Varmie" 43 = "Gdansk" 44 = "Hamburk" 45 = "Lubek" 46 = "Roztoky" 48 = "Kolobreh" 49 = "Nová Marka"
将使用最具体的可用名称。例如省份ID282,通常称为
克里米亚所有,如果属于土耳其文化国家,则称为
奥斯曼,则称为
图标
图形图标能用英镑符号(£)插入。
| 类别 | 描述 | 关键字 | 图标 |
|---|---|---|---|
| 君主点数 | 行政点数 | £adm£ | |
| 外交点数 | £dip£ | ||
| 军事点数 | £mil£ | ||
| 资源 | 人力 | £icon_manpower£ | |
| 水手 | £icon_sailors£ | ||
| 船只 | 重型船 | £big_ship_icon_small | |
| 轻型船 | £light_ship_icon_small£ | ||
| 桨帆船 | £galley_icon_small£ | ||
| 运输船 | £transport_icon_small£ | ||
| 地面单位 | 步兵 | £infantry_icon_small£ | |
| 骑兵 | £cavalry_icon_small£ | ||
| 炮兵 | £artillery_icon_small£ |
一般来说,20*20像素的图片都可以这样嵌入本地化字符串,关键字就是文件名。但是要考虑宽度和高度的细微差别,以及文本的流畅性、视觉的协调性。
导入/导出文本用于翻译
要导出,创建一个游戏exe的快捷方式。右键单击并且选择属性,然后在目标的最后输入:
-export_loc
这将会在你的游戏目录创建一个新目录名为「customizable_localization」。这些文件现在能被打开和翻译。把你的翻译放进应用的语言列。如果你的不在那里,你能重命名一个其他的。
如果你正在用 Steam,替代创建快捷方式的做法是。在Steam里右键单击 EU4 并且选择属性。在常规标签页,单击「设置启动选项...」然后输入上面的参数。记住要删除它,因为游戏并不用这个选项实际启动。(导出完就完了,什么提示都没有。)
要导入,创建一个目录挨着刚才创建的,并且重命名为 localization_translated。把你的文件放进去。它们必须被命名为 l_language(语言名)在文件名开始(此处有疑问,需要验证),然后用这行导入:
-import_loc
然后你会在文档目录得到一堆文件,在一个新目录名为:
localization_import
这些文件需要被复制粘贴进游戏的 localization 目录。当你做完导出和导入之后,目录结构看起来就会像是这样:
总而言之,如果你正在将例如我们的英语文本翻译成另一种语言,那么你不必太在意格式,只需模仿我们写的内容。如果你正在为你的mod添加文本,你可能需要对前两个标题多加一些注意。
参考资料
各种本地化关键字
某些情况下,检查过字符串内容的合理性之后,同结构的关键字可以重复利用。例如,写一个与任务或诏书同名的决议,就可以直接复用本地化。再次强调,一定要检查描述部分是否合理。
- 顾问
- <advisor>,<advisor>_desc
- 政体
- <government>,<government>_desc
- 宣战理由
- <cb>,<cb>_desc;<war_goal>,<war_goal>_desc
- 海军学说
- <naval_doctrine>,<naval_doctrine>_desc
- 贸易政策
- <trading_policy>,<trading_policy>_desc
- 理念组
- <tag>_ideas,<tag>_ideas_start,<tag>_ideas_bonus;<idea>_desc,<idea>
- 修会
- <order>,<order>_desc
- 阶层
- <estate>,<estate>_desc
- 派系
- <faction>: "Faction name",<faction>_influence: "Faction Influence",<faction>_FACTION_desc: "Faction description"
- 建筑
- building_<building>: "Name", building_<building>_desc: "Description";building_<building>_<religion group>: "Alt. name here", building_<building>_<religion group>_desc: "Alt. description here"
- 文化
- <custom_culture_group>,<ustom_culture>
- 直属州法案
- <edict>
- 贸易节点
- <tradenode>
- 修正
- <modifier>,desc_<modifier>
- 政策
- <policy>,desc_<policy>
- 特质
- <personality>,desc_<personality>,<personality>_die_desc
- 灾难
- <disaster>,desc_<disaster>
- 思潮
- <思潮名称>_date: 0 "最早开启年份",<思潮名称>: 0 "思潮名称",desc_<思潮名称>: 0 "对思潮的描述",<custom_trigger_tooltip中的tooltip参数>: 0 "对思潮扩散条件的介绍",birthplace_of_<思潮名称>:0 "诞生地的修正名称",desc_birthplace_of_<思潮名称>:0 "诞生地的修正介绍"
- 崇拜物、信条、主神等
- <cult>,<cult>_desc,<deity>,<deity>_desc;<aspect>,desc_<aspect>,<fervor>,<fervor>_short
- 决议
- <decision>_title,<decision>_desc
- 任务
- <mission>_title,<mission>_desc
- 诏书
- <decree>,<decree>_title,<decree>_desc
- 改革
- <imperial_reforms>_title,<imperial_reforms>_desc,<imperial_reforms>_member,desc_<imperial_reforms>_member,<imperial_reforms>_emperor,desc_<imperial_reforms>_emperor
- 事变
- <incident>_title,<incident>_desc
- 孤立主义
- <isolationism>,<isolationism>_title,<isolationism>_desc
- 新外交行动
- <new_diplomatic_action>: "Action",<new_diplomatic_action>_title: "Action",<new_diplomatic_action>_desc: "Description",<new_diplomatic_action>_tooltip: "Description",<new_diplomatic_action>_alert_tooltip: "Action"
- 宗教
- <religion_group>,<religion>;<religion>_rebels_demand,<religion>_rebels_demand_desc,<religion>_rebels_title,<religion>_rebels_name,<religion>_rebels_desc,<religion>_rebels_army
- 叛军类型
- <rebel_type>_demand,<rebel_type>_demand_desc,<rebel_type>_title,<rebel_type>_name,<rebel_type>_desc,<rebel_type>_army;<tooltip>
- 科技
- <type>_tech_cs_<num>_name: "Tech name here",<type>_tech_cs_<num>_desc: "Tech description here"
- 成就
- <achievement>_tooltip
- 时代
- WindowType
- 书签
- name = "<locstring>",desc = "<locstring>"
- 事件
- title = "<key>",desc = "<key>";<key>:0 "Hello, world!"
- 伟大工程
- <project>_title: "Name",<project>: "Name",great_project_<project>: "Name"
- 贸易公司
- name = "<TRADE_COMPANY>_Root_Culture_GetName";<trade_company>,<TRADE_COMPANY>_Root_GetName,<TRADE_COMPANY>_Africa_Trade_Company
- 殖民区域
- <colonial regions>;name = "COLONIAL_ALASKA_Alaska",COLONIAL_ALASKA_Alaska:0 "Alaska",COLONIAL_ALASKA_Alaska_ADJ:0 "Alaskan",COLONIAL_CANADA_Root_Culture_GetGroupName_Canada:0 "[Root.GetAdjective] Canada",COLONIAL_CANADA_Root_Culture_GetGroupName_Canada_ADJ:0 "[Root.GetAdjective] Canadian"
- 新建国家
- <tag>,<tag>_ADJ
- 商品
- <TradeGood>,<TradeGood>DESC
- 单位
- <unit>,<unit>DESCR
- 随机新世界
- province_names = { <name> }
- 音乐
- name = "amongthepoor",file = "amongthepoor.ogg"
| 文档 | 效果指令 • 触发条件 • 修正 • 作用域 • 变量 • 本地化 • 可定制的本地化 |
| 脚本 | 顾问 • 时代 • 书签 • 建筑 • 宣战理由 • 殖民区域 • 新建国家 • 文化 • 决议 • 定义 • 外交行动 • 灾难 • 阶层• 事件 • 派系 • 政府 • 政府互动(1.35) • 伟大工程 • 历史 • 理念组 • 思潮 • 任务树 • 修正 • 自定义国家 • 政策 • 宗教 • 叛军 • 附属国类型 • 科技 • 贸易公司 • 商品 • 单位 • 旗舰 |
| 地图 | 地图 • Map Modding Quick Reference• 随机新世界 • 贸易节点 |
| 图形 | 3D模型 • 界面 • 贴图库 • 字体 • 粒子特效 • 着色器 • 兵模 |
| 音频 | 音乐 • 音效 |
| 其它 | 控制台指令 • 校验码 • JoroDox模组制作工具 • Mod文件结构 • Mod错误调试 • 验证器 • 运行文件 |
| 教程 | 添加省份 • 成就修改 • On actions • 模组制作 |
