如何从Xcode中的字符串字面量自动生成一个具有非默认名称的字符串目录?

f5emj3cl  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(235)

我想长期迁移我的项目,以使用Xcode中全新的String Catalogs。然而,我的项目中仍然有一个Localizable.strings文件,我不想现在迁移整个文件。所以我打算在一段时间内并行使用两者。
在相关的WWDC video中,苹果表示,
字符串目录可以与旧格式共存。
然而,当我将一个String Catalog添加到我的项目中并给予它默认名称Localizable.xcstrings时,Xcode抛出一个编译错误:
可本地化的.xcstrings不能与其他同名的.strings或.stringsdict表共存。
这有点矛盾
无论如何,当我重命名String Catalog文件(例如,将其重命名为WidgetLocalizable.xcstrings)时,项目构建成功。然而,Xcode不会自动为我创建String Catalog中的条目,因为我不再使用默认名称。
我可以手动添加所有这些键,但这有3个缺点:
1.更多的工作。
1.它不太安全,因为Xcode不能再跟踪我的翻译进度(因为它不知道项目中使用的字符串)。
1.每次在代码中创建LocalizedStringResource时,我都必须附加table名称。

有办法解决吗?

1.我可以为字符串目录使用自定义文件名,并且仍然让Xcode自动为我创建键吗?如何创建?
1.有没有办法告诉Xcode中的整个文件或文件夹使用特定的非标准字符串目录文件,这样我就不需要将它附加到我在代码中创建的每个字符串中?

vs91vp4v

vs91vp4v1#

我可以为字符串目录使用自定义文件名,并且仍然让Xcode自动为我创建键吗?如何创建?
是的,但是你必须用正确的表名注解你的源代码。
这并不是很明显,但是.strings/.xcstrings文件的名称是在进行本地化字符串查找时被称为“表名”的名称。默认值(Localizable)恰好是在没有为任何API指定的情况下使用的默认表名。
因此,您可以像这样为WidgetLocalizable.xcstrings Strings Catalog生成键:

// Legacy
let _ = NSLocalizedString("MyKey", tableName: "WidgetLocalizable")

// iOS 15+
let _ = String(localized: "MyKey", table: "WidgetLocalizable")

// SwiftUI
Text("MyKey", tableName: "WidgetLocalizable")

// LocalizedStringResource (iOS 16+)
LocalizedStringResource("MyKey", table: "WidgetLocalizable")

字符串
当编译器在源代码中检测到这些引用时,它将正确地将它们填充到WidgetLocalizable. xcstrings中。
有没有办法告诉Xcode中的整个文件或文件夹使用特定的非标准字符串目录文件,这样我就不需要将它附加到我在代码中创建的每个字符串中?
不,不是开箱即用。
尽管另一种方法是使用外部工具从字符串目录生成帮助器符号/常量。
这违背了您最初的愿望,即避免手动定义Strings Catalog中的字符串,尽管我个人认为将Strings Catalog作为事实的来源最终更可取(特别是因为需要在源代码中引用表名的情况)。
事实上,我专门写了xcstrings-tool来涵盖这个工作流程,如果你感兴趣的话,我写了我的动机on my blog
一般的想法是使用许多字符串目录作为命名空间的一种形式。例如,有App.xcstrings,Map.xcstrings,Profile.xcstrings等。然后,使用XCStrings工具生成的符号,您可以在源代码中引用短语,如Text(.app.name)Text(.profile.title)

相关问题