
后端开发工具【免费下载链接】weblateWeb based localization tool with tight version control integration.项目地址https://gitcode.com/gh_mirrors/we/weblate点击查看免费下载导读本文讲解 Weblate 对 Kotlin 生态中Compose Multiplatform Resourcesstrings.xml资源文件的支持方式该格式自 Weblate 5.12 引入本质上是 Android String Resource 格式的一个变体仅在转义规则上存在差异。读完本文你将掌握如何在 Weblate 中为该格式正确配置组件文件掩码、单语基准文件、模板等理解其支持的特性边界复数、描述、只读字符串、检查标记等并从源码层面认识cmp-resource格式的底层实现与测试验证。Compose Multiplatform Resources 格式在 Weblate 中的定位Compose Multiplatform 是 JetBrains 推出的跨平台 UI 框架其资源体系使用与 Android 相同的strings.xml结构但资源目录约定为commonMain/composeResources/values-*/strings.xml。Weblate 在 docs/formats/compose-multiplatform-resources.rst 中将其正式收录为一种独立文件格式文档明确指出A variant of/formats/android. It differs in escaping.它是 Android 格式的一个变体区别在于转义方式。也就是说Compose Multiplatform ResourceAPI 标识符cmp-resource与普通 Android String Resourcearesource共享同一套解析骨架仅在对字符串的转义处理上按 Compose 资源规范做了调整。与之类似的还有 MOKO Resources 格式moko-resource三者同属一个格式家族。支持的格式特性总览官方文档通过自动生成的特性表见 docs/snippets/format-features/cmp-resource-features.rst由./manage.py list_format_features维护不可手工编辑列出该格式的全部能力特性支持情况文件扩展名.xml语言性Linguality单语Monolingual支持复数是Yes支持描述Description是支持解释Explanation否支持上下文Context否支持位置Location否支持标记Flags是API 标识符cmp-resource支持只读字符串是支持移除过时字符串否该格式附加的检查标记java-printf-format几个关键点的解读单语格式每个语言文件本身就是完整的目标语言资源因此需要显式指定一个基准语言文件monolingual base language file作为源语言与键名来源这与 gettext 等双语格式不同。java-printf-format检查格式会自动为条目添加该检查标记用于校验翻译中%s、%d等 Java printf 风格占位符是否与源字符串一致详见 docs/snippets/checks-autogenerated.rst 中对该检查的说明。支持复数strings.xml中的plurals条目可被正常解析与翻译Weblate 按 Android 复数规则见下文源码中的plural_preference映射 CLDR 复数类别。不支持移除过时字符串清理过时条目需依赖仓库提交与版本管理而非格式自身能力。与 Android 格式共用的转义与解析规则由于 Compose Multiplatform Resource 是 Android 格式的变体其字符串转义规则继承了 Android String Resources 文档 中定义的逻辑翻译者与配置者需要了解这些规则才能避免译文被错误解析合法 XML 直接插入若字符串本身是合法 XML则按 XML 原样写入译文?与前缀转义字符串开头的?样式引用与资源引用会被转义为\?和\防止被误认为样式或资源引用连续空格加引号字符串包含多个连续空格时会用双引号将整段内容括起来换行转义换行符转义为\n同时保留实际换行以便阅读。需要注意的是官方文档只说明 Compose Multiplatform Resource 变体在转义上存在差异具体的转义差异由 translate-toolkit 的CMPResourceFile加载器实现见下文源码仓库内文档未展开细节——配置组件时无需手工干预Weblate 会按对应加载器自动处理。继承自 Android 的限制string-array不受支持沿用 Android 格式的处理方式string-array结构目前不被支持。若源文件中存在字符串数组需要在版本库中预先拆分例如将string-array nameseveral_strings itemFirst string/item itemSecond string/item /string-array改写为string-array nameseveral_strings itemstring/several_strings_0/item itemstring/several_strings_1/item /string-array string nameseveral_strings_0First string/string string nameseveral_strings_1Second string/string且指向各string的string-array应放在单独的文件中并排除出翻译范围。同理若某些字符串无需翻译例如资源引用占位可用translatablefalse标记string namefoobar translatablefalsestring/foo/stringWeblate 组件配置官方文档给出了一份可直接套用的典型组件配置依据 docs/formats/compose-multiplatform-resources.rst 的 Weblate configuration 小节配置项值File mask文件掩码commonMain/composeResources/values-*/strings.xmlMonolingual base language file单语基准语言文件commonMain/composeResources/values/strings.xmlTemplate for new translations新翻译模板空EmptyFile format文件格式Compose Multiplatform Resource配置要点说明文件掩码中的values-*对应各语言的资源目录如values-zh-rCN、values-fr*会被 Weblate 自动识别为语言代码并按 Android 语言代码规范android解析。基准语言文件指向values/strings.xml无语言后缀的默认目录它是单语组件的源文本来源与键清单。模板留空是因为单语格式不需要独立的源语言模板文件源内容直接取自基准语言文件这也意味着新增语言时WeBlate 会基于基准文件的内容生成新语言的strings.xml骨架。文件格式下拉中选择 Compose Multiplatform Resource内部标识cmp-resource而不是普通的 Android String Resource——两者虽然解析逻辑相近但转义行为不同选错格式会导致资源引用的转义不符合 Compose 资源的生成规范。源码实现CMPFormat类在 weblate/formats/ttkit.py 中可以看到该格式的完整定义它直接继承自AndroidFormatclass CMPFormat(AndroidFormat): # Translators: File format name name gettext_lazy(Compose Multiplatform Resource) format_id cmp-resource loader (aresource, CMPResourceFile)结合其父类 AndroidFormat 可以推断出cmp-resource的完整行为基线loader (aresource, CMPResourceFile)解析与写出工作委托给 translate-toolkit 的aresource插件中的CMPResourceFile类这正是转义差异的发生位置——Android 用AndroidResourceFileCompose Multiplatform 用CMPResourceFile继承自AndroidFormat的monolingual True、language_format android、autoload (strings*.xml, values*.xml)等属性解释了前面配置表中单语基准文件Android 语言代码解析等行为继承的plural_preference优先Plural.SOURCE_ANDROID其次 CLDR与strict_format_plurals True保证复数条目按 Android 复数规则严格校验继承的check_flags (java-printf-format,)与supports_read_only True、supports_descriptions True、supports_flags True与特性表一一对应父类还声明了autoaddon {weblate.cleanup.blank: {}}表示该格式默认启用清理空字符串的附加组件。该格式类被注册在 weblate/formats/defaults.py 的格式注册表中weblate.formats.ttkit.CMPFormat这也是组件配置表单中能选中该格式、并能被 API 以cmp-resource标识符引用的原因。此外weblate/trans/migrations/0046_component_file_format_params.py 的历史迁移中也能看到cmp-resource条目说明该格式已纳入迁移后的参数体系。测试验证只读字符串与自定义标记源码测试 weblate/formats/tests/test_formats.py 对AndroidFormat、MOKOFormat、CMPFormat三个变体做了统一回归测试test_android_variant_read_only验证string namelocked translatablefalse会被解析为只读字符串对应特性表中支持只读字符串是test_android_variant_flags验证string namehello weblate-flagsc-format中 Weblate 自定义的weblate-flags属性可被正确解析为条目标记对应特性表中支持标记是。这两组测试表明Compose Multiplatform Resource 与 Android、MOKO 格式在只读标记与自定义 flags 两个关键能力上行为完全一致翻译团队可以放心使用translatablefalse与weblate-flags对资源进行精细化控制。实战小结与进一步阅读要在 Weblate 中接入 Compose Multiplatform 项目的资源翻译实践路径可归纳为在版本库中确认资源目录符合commonMain/composeResources/values-*/strings.xml约定并保证values/strings.xml是完整可用的基准文件在 Weblate 项目文档 中定位该格式并按上文配置表创建组件文件格式务必选择Compose Multiplatform Resource若源文件含string-array先在仓库中按上文方式拆分并移出翻译范围利用translatablefalse排除引用类字符串利用weblate-flags附加校验标记依赖java-printf-format检查在翻译流程中自动拦截占位符不一致的译文。深入参考格式官方文档docs/formats/compose-multiplatform-resources.rst 与同族的 docs/formats/android.rst、docs/formats/moko-resources.rst特性表定义docs/snippets/format-features/cmp-resource-features.rst源码实现weblate/formats/ttkit.py 与格式注册表 weblate/formats/defaults.py回归测试weblate/formats/tests/test_formats.py。赞分享后端开发工具【免费下载链接】weblateWeb based localization tool with tight version control integration.项目地址https://gitcode.com/gh_mirrors/we/weblate点击查看免费下载相关推荐Weblate 中的 Compose Multiplatform Resourcecmp-resource格式功能特性与组件配置指南Weblate 中的 Compose Multiplatform Resourcecmp resource格式功能特性与组件配置指南 本文以 Weblat后端开发工具Weblate 中的 GWT Properties 格式配置、特性与源码级实现解析Weblate 中的 GWT Properties 格式配置、特性与源码级实现解析 本文围绕 Weblate 内置的 GWT properties 文件格式支后端开发工具Weblate 中的 Laravel PHP 本地化文件格式功能特性、组件配置与源码实现解析Weblate 中的 Laravel PHP 本地化文件格式功能特性、组件配置与源码实现解析 Laravel PHP stringsLaravel PHP后端开发工具上一篇MeiGen-MultiTalk长视频生成技巧突破15秒限制的完整指南下一篇如何选择免费持续集成/部署工具12个最佳解决方案全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考