lang 语言文件
基本信息
| 属性 | 值 |
|---|---|
| 资源路径 | assets/gtnhcredits/lang/<locale>.lang(常量 CreditsLayout.LANG_DIR = assets/gtnhcredits/lang,扩展名常量 LANG_EXT = .lang) |
| 打包内语言 | en_US.lang(392 行、333 个键)、fr_FR.lang(36 行、25 个键) |
| 格式 | Minecraft 1.7.10 原版 .lang,key=value 每行一条,# 开头为注释 |
| 覆盖方式 | 标准资源管理器加载,资源包可替换或补充任意 locale |
| 用途 | 分类显示名、分类描述、角色显示名、界面标签 |
打包内
en_US.lang的键数量远多于fr_FR.lang(333 vs 25)。缺失的键不是错误:所有分类 / 角色键都是可选的,缺翻译时直接回退到未翻译的原始 id(CreditsController.getCategoryDisplayName/CreditsContentRenderer.roleDisplayName)。
键的生成规则
分类 id 与角色键在拼接翻译键之前会先经过净化(CreditsController.sanitizeKey,CreditsController.java:152-157):
| 步骤 | 变换 | 示例 |
|---|---|---|
| 1 | 删除所有 . |
Core.Mod → CoreMod |
| 2 | 删除所有 - |
CoreMod → CoreMod |
| 3 | 连续空格折叠为单个 _ |
Core Team → core_team |
| 4 | 转小写 | core_team → core_team |
对分类与角色用同一套净化规则,因此 "Test-Role" → testrole、"No.Trans Role" → notrans_role(en_US.lang:34,38 注释确认了这一点)。
键清单
| 键模式 | 用途 | 来源 |
|---|---|---|
gui.main_menu.button.credits |
主菜单按钮文字 | CreditsButton.java:38 |
gui.credits.title |
界面顶部标题 | CreditsScreen.java:111 |
gui.credits.button.back |
左下角返回按钮 | CreditsScreen.java:143-147 |
gui.credits.filter.hint |
筛选框占位提示 | CreditsScreen.java:241 |
gui.credits.button.filter.exact |
筛选模式按钮的 Exact 文案 | CreditsController.FilterMethod.EXACT |
gui.credits.button.filter.fuzzy |
筛选模式按钮的 Fuzzy 文案 | CreditsController.FilterMethod.FUZZY |
gui.credits.button.filter.exact_tip_line |
tooltip 中的 Exact 说明行 | CreditsScreen.java:179-182 |
gui.credits.button.filter.fuzzy_tip_line |
tooltip 中的 Fuzzy 说明行 | CreditsScreen.java:183-187 |
credits.category.<净化后的 id> |
分类显示名 | CreditsController.java:141 |
credits.category.<净化后的 id>.detail |
分类描述(单键多段式) | CreditsContentRenderer.java:93 |
credits.category.<净化后的 id>.detail.<后缀> |
分类描述(索引分段式) | CreditsContentRenderer.java:107 |
credits.person.role.<净化后的角色键> |
角色显示名 | CreditsContentRenderer.java:261 |
分类名总是作为居中标题显示;detail 的内容只在分类的 class 含 detail 时才渲染(CreditsContentRenderer.java:59)。角色名只在 class 含 role 时才渲染。
分类描述的两种写法
两种格式可以共存,渲染顺序是「单键段在前,索引段在后」(CreditsContentRenderer.java:92-115)。
| 格式 | 分隔符含义 | 段间空行 | 段内 \n |
|---|---|---|---|
...detail(单键) |
字面两字符 \n 分隔段落 |
段落之间空一行 | 不适用(整段一行) |
...detail.<后缀>(索引键) |
每条键一个段落 | 段落之间空一行 | 段内仅换行,不产生空行 |
索引键的后缀按自然序(而非字典序)排序,比较时把数字段按数值比,所以 "1" < "2" < "10"(CreditsContentRenderer.IndexedParagraph,:152-202)。en_US.lang:45-47 特意用 0 / 10 / 2 的乱序后缀验证这一点,注释写明预期渲染顺序为 0, 2, 10。
⚠️ 同一语言文件内两种格式互斥:只要存在任意一条 ...detail.<后缀> 键,纯 ...detail 键就被忽略(README.md 「Lang files」节末尾)。
⚠️ 索引段的枚举依赖反射读 StringTranslate 的私有静态方法 getInstance()(混淆名 func_74808_a)与私有字段 languageList(混淆名 field_74816_c)。CreditsContentRenderer.java:40-51 在静态初始化块里拿这两个句柄,任何一步失败(异常被吞、method == null)都会让 indexedDetailParagraphs 直接返回空列表,索引段落静默不渲染(CreditsContentRenderer.java:126)。只用到当前语言包里实际存在的后缀;不同语言文件可以有不同后缀集合。
打包内 en_US 内容概览
| 分组 | 键前缀 | 内容 |
|---|---|---|
| 界面标签 | gui.* |
8 个(标题、返回、筛选提示、两种模式及其 tooltip) |
| 演示分类 | credits.category.team / .dev / .contrib / .support / .thanks / .loremipsum |
对应打包内 credits.json 的同名分类 |
| 测试分类 | credits.category.key_test / .notrans_cat / .indexed_detail.* / .newcat |
验证键净化、回退、自然序等行为 |
| 正式分类 | credits.category.project_leadership … .donators |
13 个面向真实 GTNH 名单的分类(Project Leadership、Original Mod Authors、Mod Development、Pack Development、Quests、GT Multiblocks、Testing & Quality Assurance、Build & Infrastructure、Wiki & Documentation、Localization、Art & Media、Community、Donators) |
| 角色 | credits.person.role.* |
含 mod_<modid> 形式的前置模组作者角色、多方块名角色、职能角色等 |
正式分类的翻译键已备好但未被打包内 credits.json 引用 —— 真实名单由整合包通过 config/gtnh-credits/credits.json 覆盖提供,对应分类 id 会净化成同样的键名从而直接命中这些翻译。
相关条目
- credits.json 数据文件 - 分类 id 与角色键的来源,净化规则的输入
- Credits 界面 - 消费全部
gui.*与credits.*键 - GTNH Credits 编辑器 - 可视化编辑 lang 文件的桌面工具