资讯详情

ShareX UploadersLib 多语言本地化体系:RESX 资源目录、命名规范与自动化校验

📅 2026/9/30 8:09:26 | 华诺云谱 👁 阅读
ShareX UploadersLib 多语言本地化体系:RESX 资源目录、命名规范与自动化校验
桌面应用图像处理音视频OCR【免费下载链接】ShareXShareX is a free and open-source application that enables users to capture or record any area of their screen with a single keystroke. It also supports uploading images, text, and various file types to a wide range of destinations.项目地址https://gitcode.com/GitHub_Trending/sh/ShareX点击查看免费下载导读ShareX 的上传服务库UploadersLib承载了全部图片、文件、文本上传目标如 Amazon S3、FTP、Backblaze B2、各类图床与短链服务以及邮件、OAuth 监听等对话框是用户界面文本量最大的模块之一。本文以仓库中的 UploadersLib 本地化状态文档 为主线结合源码与校验脚本系统讲解该库的 RESX 资源目录结构、键命名规范、C#/AXAML 引用方式、动态前缀本地化机制以及仓库级的自动化翻译校验流水线。读完本文你将掌握为 ShareX 上传服务模块新增或修改翻译文本的完整流程与验证命令。本地化架构总览字符串目录与资源边界UploadersLib 的所有可翻译用户界面文本与运行时文本统一存放在该库的Localization目录下以共享的Strings.resx为默认英文目录配套 28 个语言目录文件Strings.culture.resx如 Strings.zh-CN.resx。每个资源键key按所属窗口、上传器、枚举或组件进行作用域隔离键名前缀即标识其归属避免不同模块之间出现键名冲突。与字符串目录相分离的是 Properties/Resources.resx 及其生成的Resources.Designer.cs它继续负责非文本资源上传器图标、图片以及 OAuth 回调页面资产HTML。这一分工保证了可翻译文本与二进制/固定资产两条线互不干扰翻译人员只需要关注Localization/Strings*.resx。资源键分区与命名规范依据文档中的分区表UploadersLib 的 488 个键被划分为四个区域每个区域使用独立的前缀体系区域资源前缀键数状态目标Destination设置DestinationSettings_、DestinationSettingsWindow_209完整对话框窗口EmailWindow_、OAuthListenerWindow_、ParserSelectWindow_、ResponseWindow_、TextUploadWindow_、YouTubeVideoOptionsWindow_54完整目标、协议、隐私与格式名称FileDestination_、ImageDestination_、TextDestination_、UrlShortenerType_及相关枚举前缀147完整上传器错误与运行时消息上传器与辅助组件前缀73完整四个区域的键数合计 209 54 147 73 488与文档声明的总键数完全一致。打开 Strings.resx 可以看到实际键名的组织方式枚举值名称类AccountType_Anonymous、AccountType_User、AmazonS3StorageClass_STANDARD、BoxShareAccessLevel_Open运行时错误消息类BackblazeB2_Could_not_authenticate、BackblazeB2_Upload_failed_with_error、AzureStorage_Access_key_must_not_be_empty数据校验类Base58Converter_Invalid_character含{0}、{1}两个复合格式占位符。命名规则可以归纳为组件前缀 语义化名称组件名使用类名或枚举名如BackblazeB2_、DestinationSettings_语义部分使用下划线分隔的自然语言单词如Could_not_get_upload_URL。这种命名法让翻译人员在不阅读代码的情况下也能通过键名判断文本出现在哪个窗口、属于哪个上传器。所有 488 个键在默认英文目录与 28 个文化目录中完全对齐且复合格式占位符composite-format placeholders在每种翻译中保持一致——例如{0}、{1}的位置与数量必须与英文原文相同否则运行时string.Format会抛出异常或产生错误文案。支持的语言与文化映射28 个语言目录并非全部使用完整文化名如cs-CZ部分采用中性文化neutral culture目录如cs这是 .NET 资源回退机制允许的当运行环境是cs-CZ时会回退到cs目录。语言与目录的对应关系由 ShareX/LanguageHelper.cs 中的GetCultureName方法第 68-165 行集中维护例如Arabic → ar-YE、SimplifiedChinese → zh-CN、TraditionalChinese → zh-TW、Portuguese → pt-PT、PortugueseBrazil → pt-BR、MexicanSpanish → es-MX、Spanish → es-ES。运行时若选择SupportedLanguage.Automatic则采用CultureInfo.InstalledUICulture自动适配操作系统语言。校验脚本 ValidateTranslations.ps1 中维护了一份与LanguageHelper严格一致的languageCatalogMap并会反向解析LanguageHelper.cs源码比对两边的文化列表是否完全相同——任何一边新增语言而忘记同步另一边校验都会失败。仓库中共存在 28 个Strings.*.resx文件不含默认的Strings.resx与文档声明的 28 个支持文化吻合。在 C# 与 AXAML 中引用资源键C# 强类型引用UploadersLib 使用强类型访问器类 Strings.Designer.cs它在编译期生成public static string属性代码中直接写Localization.Strings.键名即可例如Localization.Strings.DestinationSettings_Accounts。强类型引用的好处是键名拼写错误会在编译期暴露且 Visual Studio 的重构功能可以安全重命名。AXAML 静态绑定Avalonia 界面中通过x:Static扩展引用资源键。在 DestinationSettingsWindow.axaml 第 14 行的窗口标题即Title{x:Static localization:Strings.DestinationSettingsWindow_ShareX_Destination_settings}EmailWindow.axaml 中大量使用了同样的模式包括EmailWindow_To_email、EmailWindow_Subject、EmailWindow_Message等键以及PlaceholderText{x:Static localization:Strings.EmailWindow_name_example_com}这样的输入框占位文本。校验脚本会扫描所有.axaml与.cs源文件提取Strings.key形式的引用并与目录比对确保源码引用了不存在的键或目录中存在无引用的孤立键都会被报告。动态前缀与数据驱动本地化UploadersLib 中约 147 个枚举名称键FileDestination_、ImageDestination_、TextDestination_、UrlShortenerType_等不是靠手写引用使用的而是通过数据驱动查找在运行时解析枚举描述本地化上传器服务基类 UploaderService.cs 第 39 行通过EnumValue.GetLocalizedDescription(Localization.Strings.ResourceManager)读取枚举值的本地化描述因此目标服务名称如 Imgur、FTP、Amazon S3在界面上会随语言切换而本地化目标设置字段标签本地化设置页构建器 DestinationSettingsPageBuilder.cs 的FormatLabel方法第 984-992 行会把属性名如AccessKeyId转换为可读标签然后拼出DestinationSettings_Field_ 规范化名称作为资源键调用Localization.Strings.ResourceManager.GetString(resourceName)查询若目录中不存在该键则回退到本地格式化生成的英文标签。这套机制的关键在于DestinationSettings_Field_、FileDestination_等属于数据驱动前缀DynamicPrefixes校验脚本不会把未被源码直接引用当作错误——因为键名是运行时拼接出来的。脚本对每个项目配置了前缀白名单UploadersLib 共 20 个动态前缀见 ValidateTranslations.ps1 中$projects数组同时要求源码中必须存在对应的数据驱动查找调用如DestinationSettings_Field_ 与ResourceManager.GetString(resourceName)防止前缀被误删。新增或修改翻译文本的五步流程文档给出了明确的改动流程结合源码可以补充每一步的细节向Strings.resx添加带作用域的键键名遵循组件前缀_语义名规范例如新增某个上传器错误消息时使用MyUploader_Error_message在每一个Strings.culture.resx目录中添加翻译值所有 28 个文化目录必须同步添加键名完全一致使用直接引用C# 中写Strings.keyAXAML 中写{x:Static localization:Strings.key}禁止在界面硬编码可见文本也禁止使用旧的L()帮助方法或using别名这两类用法会被校验脚本直接判错保留复合格式占位符英文原文中的{0}、{1}等占位符在每种翻译中都必须原样保留位置可随语言习惯调整但数量与编号不能变同时翻译中的命令行占位符形如$name$也必须与英文一致构建ShareX.UploadersLib验证资源与 AXAML运行项目构建确保Strings.Designer.cs重新生成、AXAML 绑定编译通过。仓库级自动化校验ValidateTranslations.ps1文档明确指出仓库根目录的 ValidateTranslations.ps1 承担着全部本地化项目的质量门禁。脚本执行完毕后还会自动调用 FormatTranslations.ps1 对资源文件做规范化。综合脚本源码其校验范围包括支持语言与目录清单实际存在的语言目录必须与languageCatalogMap、LanguageHelper.cs三方一致缺一个、多一个都报错条目数量与键奇偶校验每个语言目录的键数必须与英文目录完全相同缺键、多余键都会被列出空值检查键值为空含纯空白即报错格式占位符校验逐键比对英文与翻译的{n}复合格式占位符集合以及$name$命令占位符集合编码与换行格式文件必须是严格的 UTF-8 无 BOM带 BOM 即报错必须使用 CRLF 且以换行结尾禁止裸 LF还会检测可逆的 mojibake乱码与非法控制字符、错误的分号转义实体Designer 一致性Strings.Designer.cs必须存在ResourceManager基名必须为ShareX.UploadersLib.Localization.Strings且每个键都有对应属性源码引用检查扫描全部.cs与.axaml源文件源码引用的键必须在目录中存在目录中无引用的键非动态前缀必须被删除同时禁止本地化资源别名与L()帮助方法残留AXAML 字面文本检查扫描Text、Content、Header、Title、Watermark、PlaceholderText、ToolTip.Tip等属性发现用户可见的硬编码英文文本即报错少量白名单值除外如Auto、None、Transparent等布局关键字英语等价物白名单TranslationEnglishAllowlist.txt 以项目|文化|键|SHA256哈希四列格式记录了允许保留英文原文的特例例如专有名词、域名类文本每条记录附带哈希校验翻译与英文相同且未在白名单中批准的键会被报告同时白名单中的陈旧记录已不再使用也会被清理报告未解决标记检查源码中出现TODO: Translate注释即报错数据驱动前缀检查动态前缀必须被源码使用数据驱动查找调用必须存在。脚本最终输出按项目统计的表格项目 / 英文键数 / 翻译数 / 文化数 / 总计 / 状态全部通过后打印汇总并触发FormatTranslations.ps1任何一项失败都会以非零退出码结束。FormatTranslations.ps1资源文件规范化FormatTranslations.ps1 会遍历仓库中所有含Localization/Strings.resx的项目共 9 个包括ShareX、ShareX.Avalonia、ShareX.HelpersLib、ShareX.HistoryLib、ShareX.ImageEditor、ShareX.ImageEffectsLib、ShareX.ScreenCaptureLib、ShareX.Tools、ShareX.UploadersLib对每个Strings*.resx执行使用禁用 DTD 且XmlResolver null的安全 XML 读取器解析防止 XXE 类风险将data元素按键名**序数排序ordinal**重新排列保证文件内容确定性、便于 diff检测重复键名并报错以 UTF-8 无 BOM、两个空格缩进、CRLF 换行重新写出。脚本只在实际字节发生变化时才覆盖文件并输出格式化的文件总数与实际更新数避免无意义的文件变动。运行校验与构建从仓库根目录执行校验与构建文档给出的两条命令powershell -NoProfile -ExecutionPolicy Bypass -File Scripts\ValidateTranslations.ps1 dotnet build ShareX.UploadersLib/ShareX.UploadersLib.csproj --no-restore第一条命令对全部本地化项目执行上述完整校验结束后自动触发格式化第二条命令编译 UploadersLib 项目本身验证资源嵌入、强类型 Designer 与 AXAML 绑定。--no-restore跳过 NuGet 还原以加速本地迭代在 CI 中则可去掉该参数确保依赖完整。校验脚本还通过扫描Localization/Strings.resx存在的目录自动发现本地化项目清单并与内置的项目配置比对因此新增本地化项目也必须同步更新脚本中的$projects数组。延伸统一的本地化体系UploadersLib 采用的多目录 RESX 强类型 Designer 数据驱动前缀 集中校验脚本这套体系并非孤例而是 ShareX 各模块统一遵循的工程约定。例如 HelpersLib 本地化状态文档 记录了颜色选择器窗口ColorPickerWindow_34 键、错误窗口、图像查看器、输入/输出框、打印窗口等 129 个键同样覆盖全部 28 个文化且同样由ValidateTranslations.ps1把关。理解 UploadersLib 的本地化机制后其他模块的翻译工作流程完全一致可以举一反三。通过这套资源目录分区 强类型引用 数据驱动查找 脚本级质量门禁的组合ShareX 得以在数百个上传目标、数千条界面文本的规模下维持翻译完整性、占位符正确性与编码规范性为社区翻译贡献提供了清晰且可自动验证的协作边界。赞分享桌面应用图像处理音视频OCR【免费下载链接】ShareXShareX is a free and open-source application that enables users to capture or record any area of their screen with a single keystroke. It also supports uploading images, text, and various file types to a wide range of destinations.项目地址https://gitcode.com/GitHub_Trending/sh/ShareX点击查看免费下载相关推荐GameDevMind 文档命名规范全解编号体系、目录结构、标签字段与自动化校验GameDevMind 文档命名规范全解编号体系、目录结构、标签字段与自动化校验 本文以 GameDevMind最全面的游戏开发技术图谱仓库中的《文档命名文档教程知识库游戏开发三步存下在线视频与音频猫抓资源嗅探完整指南三步存下在线视频与音频猫抓资源嗅探完整指南 在某个页面想回看一段课程视频却找不到下载按钮时资源嗅探扩展 cat catch猫抓会把页面里的视频、音频文件音视频Anomalib 图像数据模块全景解析从 MVTecAD 到 Folder 的完整数据接入指南Anomalib 图像数据模块全景解析从 MVTecAD 到 Folder 的完整数据接入指南 在工业与科研异常检测任务中数据接入往往是第一个卡点数据集目桌面应用图像处理音视频OCR上一篇Foundry RPC Fixture 生成指南以 eth_getLogs.json 与 balance_params.json 为例下一篇Kubernetes 扩展性与性能目标全解析SIG Scalability 定义的集群规模基准与实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑