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" 选取正确的字符集后再开始编辑。
新的格式化标准
本地化系统也支持在本地化字符串中格式化文本,代替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) • 伟大工程 • 历史 • 理念组 • 思潮 • 任务树 • 修正 • 自定义国家 • 政策 • 宗教 • 叛军 • 附属国类型 • 科技 • 贸易公司 • 商品 • 单位 • 旗舰 |
地图 | 地图 • 随机新世界 • 贸易节点 |
图形 | 3D模型 • 界面 • 贴图库 • 字体 • 粒子特效 • 着色器 • 兵模 |
音频 | 音乐 • 音效 |
其它 | 控制台指令 • 校验码 • JoroDox模组制作工具 • Mod文件结构 • Mod错误调试 • 验证器 • 运行文件 |
教程 | 添加省份 • 成就修改 • On actions • 模组制作 |