我正在创建一个具有多种变体的应用。
这些变体将由多个Localizable.strings文件中的几个字符串控制。
但是,90%的字符串将保持不变。
我想拥有它,以便每个唯一的Localizable.strings文件导入“master”文件,这样当我想更改一个公共文件时,我不必浏览每个app变体文件字符串。
这可能吗?
答案 0 :(得分:5)
两种选择:
使用围绕NSLocalizedString
执行分层查找的自定义包装函数,然后回退到默认情况的NSLocalizedString
机制。
我之前写过关于如何执行此操作的答案:Can .strings resource files be added at runtime?
每种语言使用多个.strings文件。通过 default 可以在“Localizable.strings”中查找,但NSLocalizedStringFromTable()
函数允许您指定自定义“表”名称。因此,如果您将“Configuration”作为表名传递,它将在“Configuration.strings”文件中查找。
我参与了一个应用程序。我们有两个不同的.strings文件。一个控制品牌设置(使用什么名称,使用什么图像,使用什么服务器等),另一个包含所有实际翻译的字符串。应用程序包中只有一个品牌信息的副本,我们选择了正确的变体,以便在编译时使用一些自定义脚本。它工作得非常好。
答案 1 :(得分:2)
不幸的是,Apple不支持其Localizable.strings
文件。
您可以使用sed
通过自定义Ruby或Python脚本或仅使用Bash脚本来模仿该功能;该脚本可以获取根.strings
文件并将内容复制到每个变体的.strings
文件中。它甚至可以是Xcode中的自定义构建步骤。
答案 2 :(得分:1)
我不确定你想要什么,但如果你只是想翻译一些字符串,你可以。
您可以只翻译这些字符串的一部分,如果没有翻译,ios将选择应用程序语言中的字符串并显示它。因此,应用程序语言中的Localizable.strings可以像主要语言一样考虑。
答案 3 :(得分:1)
行。这就是我为解决它所做的一切。
我从Git存储库中删除了各种Localizable.strings文件,但是将它们留在了它们的位置(每个app变体目录中都有一个)。
我只采用了每个变体之间不同的几行,并将它们分成一个单独的文本文件,名为“MyLocalizable.strings”。我将其中的每一个添加到Git中,并将它们添加到项目中,而不将它们与目标相关联。我留下了与每个目标关联的Localizable.strings文件。
所以,我们拥有的是每个目标都有一个与目标相关联的Localizable.strings文件,并将被复制到该包中。每个目标目录都有一个名为“MyLocalizable.strings”的文件,该文件只包含从目标到目标的不同字符串。
然后我接受了绝大多数字符串 - 那些没有改变的字符串 - 并将它们放入另一个名为“MyLocalizable.strings”的文件中,并将其放在中心(公共)目录中。再次,我将此添加到Git和项目中,没有将它与目标相关联。
然后我编写了一个非常小的,可怜的Perl脚本,用于在公共文件中构造给定目标中的Localizable.strings文件,并附加特定于目标的文件。这会覆盖现有的Localizable.strings文件。这意味着Localizable.strings文件对于每次运行脚本都是新的。此脚本放置在公共区域中,并添加到项目中而不与目标关联。该脚本有一个参数,它是目标(及其目录)的名称。该脚本的语法是:
#!/usr/bin/perl
use strict; # I'm anal. What can I say?
use Cwd; # We'll be operating on the working directory.
use File::Path;
my $input1File = cwd()."/BMLT/Supporting\ Files/en.lproj/MyLocalizable.strings";
my $input2File = cwd()."/".$ARGV[0]."/en.lproj/MyLocalizable.strings";
my $outputFile = cwd()."/".$ARGV[0]."/en.lproj/Localizable.strings";
open ( MAIN_FILE, $input1File ) || die ( "Could not open main file!" );
my @file_data = <MAIN_FILE>;
close ( MAIN_FILE );
open ( PRODUCT_FILE, $input2File ) || die ( "Could not open product file!" );
push ( @file_data, <PRODUCT_FILE> );
close ( PRODUCT_FILE );
open ( FINAL_FILE, ">$outputFile" ) || die ( "Could not open destination file!" );
foreach ( @file_data ) print FINAL_FILE $_;
close ( FINAL_FILE );
然后,在Copy Bundle Resources步骤之前添加Run Script构建步骤。此脚本使用以下语法调用Perl脚本:
${PROJECT_DIR}/BMLT/Supporting\ Files/buildLocalizationFile.pl ${PRODUCT_NAME}
构建时,将合并文件,并将合并的文件放入包中。
答案 4 :(得分:1)
为具有公共字符串的所有目标创建一个Localizable.strings
。同时为每个目标创建TargetSpecificLocalizable.strings
并将目标特定的字符串放入其中。然后对于常见的字符串使用
NSLocalizedString("sample string", comment: "")
对于目标特定字符串,请使用
NSLocalizedString("sample string", tableName: "TargetSpecificLocalizable", bundle: Bundle.main, value: "", comment: "")