Vic3 mod 制作教程 第六章 本地化和GUI初步(写到一半没星宇了)
事先文件结构准备:
/localization/simp_chinese/modding_l_simp_chinese.yml
/gui/
/customizable_localization/
* 如有必要: journal_entries
* 如需要多语言 /localization/english/ 等
本章所称呼的引号均为半角英文符号`"`, 感叹号均为半角英文符号`!`
## 最基本的本地化, 从key到中文
用双引号括起来的字符虽然能用, 但是既不好维护, 也不方便翻译, 因此, P社给了一个经典的localization选项
使用就仅需要随便新建一个后缀为`_l_simp_chinese.yml`的文件, 当然, 如果希望是英语就是`_l_english.yml`结尾
然后在开头写`l_simp_chinese:`, 如果是英语就是`l_english:`
然后根据`key:0 文本内容`就获得了一个localization, 我们就用, `example_key:0 "这是一个文本内容"`写, 然后在我们上一章说到的事件里面替换掉, 请注意, 因为是变成了localization所以不建议双引号括起来(你要括起来其实也还行)
localization是比较卡的内容, 一开始热刷新会导致很卡, 请注意。
localization之间可以相互引用, 使用$括起key即可, 如`display_exampe_key:0 "这将会展示 $example_key$"`
### 本地化的格式化
localization还能使用#<格式化><文本>#!实现格式化引用, 常见的格式化如下
| 名称 | 含义 |
----
| header | 顶层标题 |
此外还能使用@<texticon>!实现文本图标的引用,创建文本图标在本章后续详述。
## 本地化引用界面代码
本地化之所以单独列一行的原因,因为本地化的文本可以是界面代码风格的文本,仅需要用`"[<界面代码>]"`即可,如果需要进一步格式化,只需要`"[<界面代码>|<格式化>]"`就可以实现。
界面代码是,从头到尾都和文本代码完全不一样的代码,用以展示界面的一类代码,由于这不是hoi4mod制作,`/common/`中完全不能插入任何的界面代码。所谓的在界面展示变量就是通过界面代码实现。
请注意,本地化的引用并不是任何时候都对应界面代码风格的文本,在一些GUI里面的关键词是完全不能用本地化的。
更为详细的会在本章下文描述,但是总之还是先说完文本代码中localization的特殊用法吧
## 文本代码中localization的特殊用法
文本代码有时候可以根据不同情景使用,可以分为必须要定义在定义文本代码中的`first_vaild`型和与scope强绑定的customizable_localization
first_vaild型使用起来没有customizable_localization这么繁琐,应当优先考虑使用
所有的都是上面的优先级大于下面的,上面一旦满足优先显示上面的
实例文本如下:
```perl
first_valid = {
triggered_desc = {
desc = journal_entry_key_status_1
trigger = {
has_variable = mining_strike
}
}
triggered_desc = {
desc = journal_entry_key_status_2
trigger = {
has_variable = industrial_strike
}
}
triggered_desc = {
desc = journal_entry_key_status_2
trigger = {
has_variable = railway_strike
}
}
desc = commander_rank_1_fallback # 均不满足时,使用这个
}
```
event的title,desc,flavor均支持first_vaild型
customizable_localization需要在`
customizable_localization`里面定义,然后在界面代码里面通过Scope.GetCustom('custom_key')引用,嗯,挺繁琐的。
定义的文本代码如下:
```perl
example_custom = {
type = country # 界定root的,custom对于Scope选择很严格的。
random_valid = no # 如果为yes,随机选择,而不考虑上下位置的优先级
# log_loc_errors = no # 不在error.log打印本地化错误
text = {
trigger = {
has_law = law_type:law_council_republic
}
localization_key = custom_newspaper_truth
}
text = {
trigger = {
has_law = law_type:law_council_republic
cu:russian = {
is_primary_culture_of = root
}
}
localization_key = custom_newspaper_pravda
}
text = {
localization_key = custom_generic_newspaper
}
}
```
此外还有一些前后缀和继承的用法,展示一下就可以了。简单来说就是继承某个上级本地化key加上前缀或者后缀。
## GUI初步
GUI代码使用一系列类似文本代码但是完全不能代入进去的代码在gui文件里定义一系列gui
定义一个gui需要以下定义
```
widget = { # gui的类型,可以自定义也可以是预设的
parentanchor = top|right
widgetanchor = top|left
size = { 500 500 }
visible = "" # 不能使用本地化
# enable = "" # 不能使用本地化,仅能用于特殊的gui类型
# datacontext = "" # 数据上下文,内填界面代码,有的是要求datamodel
# datamodel = ""
}
```
### 界面代码概述
简单而言,界面代码就是通过一系列界面获取数据的代码,用"[<界面代码>]"描述,使用.连接,使用括号和里面的参数输入参数。
如果涉及到datacontext或者datamodel(前者一般是单个,后者一般是一个列表),可以事先获取相关的Scope然后在直接在后续使用匿名的Scope
例如:
```
widget = { # gui的类型,可以自定义也可以是预设的
parentanchor = top|right
widgetanchor = top|left
size = { 500 500 }
visible = "" # 不能使用本地化
# enable = "" # 不能使用本地化,仅能用于特殊的gui类型
datacontext = "[AccessPlayer.GetCountry]" # 数据上下文,内填界面代码,有的是要求datamodel
# datamodel = ""
text_single = {
text = "[Counrty.MakeScope.Var('flag_name').GetValue]" # 直接使用Country这一匿名Scope
}
}
```
顺便也能看到如何展示变量的做法,先把支持转换为`Scope`类型的类型用MakeScope转换为`Scope`类型,然后使用Scope.Var(Arg0),使用变量名称作为参数,获取`Scope`类型的变量,最后用Scope.GetValue获取数字。可以看到前后文之间的类型关系需要非常明确
### 界面代码的初步的判断流程以及字符串拼接
界面代码的流程控制自然不会给你循环,但是给出判断流程是可以的,使用Select系列的界面代码就可以,Select系列包括大量的函数,均用Select开头,三个参数,第一个是条件,第二个是满足条件的文本,第三个是不满足条件的文本,不同的函数决定了返回值类型的不同(界面代码的类型要求相当严格)。
可以通过Concatenate( Arg0, Arg1 ),输入两个Cstring类型以获取结合起来的字符串。
# 列举GUI
(这里就没星宇了写下去了,有一个基本的示例可以看看就是了)




(上图为对比测试)
因为V3的音效几乎可以说无法添加所以星宇没了
也不要问为什么CK3可以V3不可以,因为V3没有播放音乐的effect,而CK3有。