Repository navigation
feat(settings): 插件设置支持包内翻译 l10n/<语言>.json - #36
Merged
Merged
Conversation
插件包可以带 l10n/<语言>.json,按设置 ID、选项值、分组原文和按钮 ID 翻译设置页的标题、说明、占位符、单位、选项标题、分组标题和按钮文字。 ID、值、分组和顺序不变,文件没写到的文字显示 plugin.json 原文。 - plugins.declarative.settingsState 新增可选 language、localizations, 返回 localization:候选文件(语言标签逐级截短)、是否需要读取、 选中的文件和被拒绝的文件。Core 不做 I/O,宿主按候选读包内文件后再调一次。 - 有问题的文件整份不用,报 plugin.settings.invalidLocalization 并带字段; 宿主请求格式错误报 invalid_request。 - 新增 plugin-l10n.schema.json、fixtures/settings/l10n/zh-Hans.json 和 localization-cases.json(13 个用例),契约、Core API、API 总表 API-37、设置功能页和更新记录同步更新。 - is_language_tag 从 marketplace 移到 plugin-model 共用。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关联
plugin.json只能写一种语言。这个 PR 让插件包自带翻译文件l10n/<语言>.json,Core 按界面语言挑选,缺哪条就回退到清单原文。pluginAPIVersion0 内的补充,旧宿主不读l10n/,照常显示清单原文,不需要升能力版本。pluginsettings.Store.Load传界面语言、从已安装插件目录读取候选文件;确认弹窗改用状态里翻译过的动作标题;记录被拒绝的翻译文件;把scripts/desktop/build-desktop-core.sh的PINNED_CORE_REVISION升到合并提交。reference/domains/settings.md里“桌面端尚未读取翻译”的那一行。lithe-plugin-go)补l10n/zh-Hans.json,覆盖全部设置、选项和分组标题,宿主支持后发预发布。这个 PR 做什么
1. 翻译文件格式(
shared/plugins/contract/v1/plugin-l10n.schema.json)settingstitle、description、placeholder、unit、options(enum/multiSelect的选项标题,按选项值)sectionssettingActionstitle、description$schema)一律忽略,这样以后给其它文案加翻译的文件在旧宿主上仍然可用;内层对象拒绝未知字段。description的设置不能只在翻译里加说明)。null、重复键;整个文件必须是 JSON 对象且不超过 1 MiB。declaration.section保留原文,ID、值和选项顺序都不变。2.
plugins.declarative.settingsState的请求和返回Core 不做 I/O,所以读取分两步,桌面端
Store.Load本来就调两次,不增加往返:language(界面语言的 BCP 47 标签)、不传localizations。返回的localization里readRequired: true,并列出candidates:标签逐段截短,例如zh-Hans-CN得到l10n/zh-Hans-CN.json、l10n/zh-Hans.json、l10n/zh.json。localizations: { 路径: 文件文本 }。返回的
localization是{ language, candidates, maximumBytes, readRequired, applied, rejected }:rejected:{ path, error: { code, message, field? } },错误码统一为新增的plugin.settings.invalidLocalization(一码一义);field指向第一个问题,整个文件的问题(不是 JSON 对象、重复键、null、未知字段、超长)不带field。被拒绝的文件不会部分生效。rows、actions、sections和动态语言页、构建系统页(pages)的标题都按应用的翻译显示。plugins.settings.catalog的分组标题保持原文。宿主请求本身有误时返回
invalid_request,details说明原因:language不是语言标签、传了localizations却没传language、localizations里的路径不在候选列表里。3. 代码
plugin-model新增settings::localization模块:LocalizationRequest(校验请求、列出候选)、select(逐个检查并挑出应用的翻译、生成报告)、SettingsLocalization(给行、动作、分组标题取翻译文字)。document_state和page_sections接受可选的翻译;plugin-manifest的settings_state_command解析新字段并把报告写进状态的localization。settings_surfaces生成目录时传None。is_language_tag从plugin-marketplace移到plugin-model::names并公开,市场的语言标签校验改为复用它,行为不变。4. 文档
plugin-l10n.schema.json;契约 README 新增“Translations”一节,并更新顶部文件表、fixture 表、包布局、title/description一行(“用英文写,包内可以翻译”)和错误码表。shared/plugins/README.md中英两张 schema 表、$schema说明、VS Code**/l10n/*.json关联示例。rust/contracts/rust-core-api.md:settingsState的请求字段、localization返回、分组排序、invalid_request的几种情况、settingsActionPlan的title是清单原文(确认弹窗应使用状态里的动作标题)、目录不翻译、命令表一行。pluginAPIVersion0 内的补充)。settingsState是宿主调用 Core 的命令,不是插件可调用的宿主方法,不涉及宿主方法索引。fixtures/settings/l10n/zh-Hans.json(settings.plugin.json的翻译)和localization-cases.json(13 个用例,宿主和 Core 共用)。测试
settings::localization::tests::candidates_drop_one_subtag_at_a_timesettings::localization::tests::translates_only_declared_text_and_keeps_the_restsettings::localization::tests::the_most_specific_valid_file_wins_and_invalid_files_are_reportedrejectedsettings::localization::tests::rejects_files_that_do_more_than_translatesettings::localization::tests::rejects_duplicate_keys_and_oversized_filessettings::localization::tests::reports_what_to_read_and_rejects_malformed_requestsreadRequired报告;非法语言标签、缺language、非候选路径tests::plugin_settings_documents::settings_state_names_translation_candidates_before_they_are_readlocalization报告tests::plugin_settings_documents::settings_state_shows_packaged_translation_and_keeps_manifest_identityzh-Hans.json:标题、选项、分组、动作标题翻译;declaration.section保留原文;中英两种语言下每个分组里的行和动作完全一致;language:elixir页的分组标题也翻译tests::plugin_settings_documents::settings_state_localization_fixture_caseslocalization-cases.json的全部 13 个用例tests::plugin_settings_documents::settings_state_refuses_malformed_localization_requestsinvalid_request和对应的details验证
rust/)cargo test --workspace --no-fail-fastcargo clippy --workspace --all-targets -- -D warningscargo fmt --all -- --checkscripts/rust-core/verify-rust-core-comments.sh(仓库根)node shared/plugins/scripts/verify-docs.mjs(仓库根)node --test shared/plugins/scripts/*.test.mjs(仓库根)没有改插件后端协议,没有跑
sdk-e2e.mjs。只在 macOS 上运行。