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 会净化成同样的键名从而直接命中这些翻译。

相关条目