Featured image of post CK3 缺失的姓名本地化条目修补脚本

CK3 缺失的姓名本地化条目修补脚本

快速处理角色名字相关的 Missing loc error

前言

在《十字军之王3》的模组开发中,一个常见的问题是将人名硬编码在代码中后如何快速地将它们迁移到本地化文件中。

实际上这个问题解决起来非常简单,因为当角色名字仅在角色文件中定义而未在本地化文件中定义时,游戏的日志error.log中就会出现关于角色名字本地化条目缺失的报错,例如下面的报错:

1
2
[15:47:18][E][culture_name_equivalency.cpp:101]: Missing loc Chrysanthius: "Chrysanthius"
[15:47:18][E][culture_name_equivalency.cpp:101]: Missing loc Oribasius: "Oribasius"

因为其具备固定的格式,因此只需要用一个简单的脚本快速处理一下就可以解决这个问题。

脚本

代码

可以直接复制下面的代码使用。

需要安装 Python

查看代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import re
import os
from collections import OrderedDict

def generate_loc_from_log(log_file_path, output_file_path):
    """
    从 CK3 的 error.log 文件中提取缺失的本地化条目并生成 .yml 文件。
    """
    # 用于匹配 "Missing loc KEY: " 格式的正则表达式
    # 它会捕获 "Missing loc " 之后、冒号 ":" 之前的部分作为键 (KEY)
    pattern = re.compile(r"Missing loc ([^:]+):")

    # 使用一个集合 (set) 来存储所有找到的键,自动处理重复项
    found_keys = set()

    print(f"正在读取日志文件: {log_file_path}")

    try:
        with open(log_file_path, 'r', encoding='utf-8', errors='ignore') as log_file:
            for line in log_file:
                match = pattern.search(line)
                if match:
                    # 提取匹配到的键,并去除可能存在的前后空格
                    key = match.group(1).strip()
                    if key:  # 确保键不为空
                        found_keys.add(key)
    except FileNotFoundError:
        print(f"错误:找不到文件 '{log_file_path}'。请确保路径正确。")
        return
    except Exception as e:
        print(f"读取文件时发生错误: {e}")
        return

    if not found_keys:
        print("在日志文件中没有找到 'Missing loc' 相关的错误。")
        return

    # 将集合转换为列表并按字母顺序排序,以便输出文件整洁
    sorted_keys = sorted(list(found_keys))

    print(f"找到了 {len(sorted_keys)} 个独一无二的缺失本地化条目。")

    try:
        with open(output_file_path, 'w', encoding='utf-8-sig') as output_file:
            # 写入 yml 文件必需的语言头部
            output_file.write("l_english:\n")

            # 遍历所有排序后的键,并按格式写入文件
            for key in sorted_keys:
                # 格式化为: KEY:0 "KEY"
                # 注意两个空格是 yml 格式的要求
                output_line = f' {key}:0 "{key}"\n'
                output_file.write(output_line)

        print(f"成功!本地化文件已生成: {output_file_path}")
        print("您可以将此文件的内容复制并粘贴到您的 Mod 本地化文件中。")

    except Exception as e:
        print(f"写入输出文件时发生错误: {e}")

if __name__ == "__main__":
    # 1. 请将您的 error.log 文件路径放在这里
    #    例如: "C:/Users/YourUser/Documents/Paradox Interactive/Crusader Kings III/logs/error.log"
    #    如果脚本和log文件在同一个文件夹,可以直接写 "error.log"
    input_log_path = "error.log"

    # 2. 这是生成的文件的名称
    output_yml_path = "generated_names_loc.yml"

    # 运行主函数
    generate_loc_from_log(input_log_path, output_yml_path)

使用

推荐在error.log所在目录创建generate_loc.py文件。路径一般是:

1
%USERPROFILE%\Documents\Paradox Interactive\Crusader Kings III\logs

随后在该目录运行命令提示符或 Powershell ,执行如下命令:

1
python generate_loc.py

脚本运行完毕后,在同一个文件夹下会生成一个名为generated_names_loc.yml的新文件。这个文件里就包含了所有需要的本地化条目。