本地化

本页面讲述的内容长期有效

EU4当中,本地化的内容文件都被存放在游戏目录下的localization文件夹中,它们的扩展名都是.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文件里,只要格式正确,那么它们依然能够正确显示)。半角冒号后面的数字是修订版本号,不会出现在文案里。只有双引号里的内容会在游戏当中显示出来。冒号需要和前面的键(需要给出文案的项目)连在一起,中间不能有空格:

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 给文本上色,依次是:白、蓝、绿、红、黑、灰、黄、浅蓝。
+ 给数值上色,正数是绿色,零是黄色,负数是红色
- 给数值上色,正数是红色,零是黄色,负数是绿色

例如,如果要将定点值转换为带有一个小数的百分数,如果正数将其着色为绿色,则现在可以将其写为「$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 得到几乎任何对象的主要名字: England, Catholicism, Henry VIII, Tudors...
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$ 顾问的名字
$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。在这个文件夹放上你的本地化文件,包含你想要替换的原版本地化关键字。你也能用相同的方式修改本地化就像其他的东西。本地化在计算校验码时是被忽略的。

文化省份名称

如果「使用动态省份名字」是打开的,省份名称基于当前拥有者的文化变为它们在 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,通常称为叶迪山Yedisan,1444年归  克里米亚所有,如果属于土耳其文化国家,则称为霍贾贝伊Hocabey。但如果属于  奥斯曼,则称为奥祖Özü,即使他们也是土耳其文化。

图标

图形图标能用英镑符号(£)插入。

类别 描述 关键字 图标
君主点数 行政点数 £adm£ Administrative power.png
外交点数 £dip£ Diplomatic power.png
军事点数 £mil£ Military power.png
资源 人力 £icon_manpower£ Manpower.png
水手 £icon_sailors£ Sailors.png
船只 重型船 £big_ship_icon_small Heavy ship.png
轻型船 £light_ship_icon_small£ Light ship.png
桨帆船 £galley_icon_small£ Galley.png
运输船 £transport_icon_small£ Transport.png
地面单位 步兵 £infantry_icon_small£ Infantry.png
骑兵 £cavalry_icon_small£ Cavalry.png
炮兵 £artillery_icon_small£ Artillery.png

一般来说,20*20像素的图片都可以这样嵌入本地化字符串,关键字就是文件名。但是要考虑宽度和高度的细微差别,以及文本的流畅性、视觉的协调性。

导入/导出文本用于翻译

要导出,创建一个游戏exe的快捷方式。右键单击并且选择属性,然后在目标的最后输入:

-export_loc

这将会在你的游戏目录创建一个新目录名为「customizable_localization」。这些文件现在能被打开和翻译。把你的翻译放进应用的语言列。如果你的不在那里,你能重命名一个其他的。

如果你正在用 Steam,替代创建快捷方式的做法是。在Steam里右键单击 EU4 并且选择属性。在常规标签页,单击「设置启动选项...」然后输入上面的参数。记住要删除它,因为游戏并不用这个选项实际启动。(导出完就完了,什么提示都没有。)

要导入,创建一个目录挨着刚才创建的,并且重命名为 localization_translated。把你的文件放进去。它们必须被命名为 l_language(语言名)在文件名开始(此处有疑问,需要验证),然后用这行导入:

-import_loc

然后你会在文档目录得到一堆文件,在一个新目录名为:

localization_import

这些文件需要被复制粘贴进游戏的 localization 目录。当你做完导出和导入之后,目录结构看起来就会像是这样:

Modding localisation files.jpg

总而言之,如果你正在将例如我们的英语文本翻译成另一种语言,那么你不必太在意格式,只需模仿我们写的内容。如果你正在为你的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"