6

我正在创建一个具有多种变体的应用程序。

这些变体将由多个 Localizable.strings 文件中的几个字符串控制。

但是,90% 的字符串将保持不变。

我想拥有它,以便每个唯一的 Localizable.strings 文件都导入“主”文件,这样当我想更改公共字符串时,我就不必遍历每个应用程序变体文件。

这可能吗?

4

5 回答 5

7

两种选择:

  1. 使用自定义包装函数NSLocalizedString为您进行分层查找,然后回退到NSLocalizedString默认情况的机制。

    我之前写过一个关于如何做到这一点的答案:Can .strings resource files be added at runtime?

  2. 每种语言使用多个 .strings 文件。默认情况下,在“Localizable.strings”中查找内容,但该NSLocalizedStringFromTable()函数允许您指定自定义“表”名称。因此,如果您将“Configuration”作为表名传入,它会在“Configuration.strings”文件中查找内容。

    我开发了一个应用程序来做到这一点。我们有两个不同的 .strings 文件。一个控制品牌设置(使用什么名称、使用什么图像、使用什么服务器等),另一个包含所有实际翻译的字符串。应用程序包中只有一个品牌信息副本,我们选择了正确的变体以在编译时与一些自定义脚本一起使用。它工作得非常好。

于 2011-10-15T15:44:06.530 回答
2

不幸的是,Apple 不支持它的Localizable.strings文件。

您可以通过自定义 Ruby 或 Python 脚本或仅使用 Bash 脚本来模仿该功能sed;该脚本可以获取根.strings文件并将内容复制到每个变体的.strings文件中。它甚至可以是 Xcode 中的自定义构建步骤。

于 2011-10-12T15:27:56.060 回答
1

我不确定你想要什么,但如果你只想翻译几个字符串,你可以。

你可以只翻译这些字符串的一部分,如果没有翻译,ios会选择应用程序语言中的字符串并显示出来。因此,应用程序语言中的 Localizable.strings 可以被认为是主要的。

于 2011-10-10T13:48:58.777 回答
1

好的。这是我为解决它所做的。

我从 Git 存储库中删除了各种 Localizable.strings 文件,但将它们留在了它们的位置(每个应用程序变体目录中都有一个)。

我只取了每个变体之间不同的几行,并将它们分解成一个单独的文本文件,称为“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}

构建完成后,文件被合并,合并后的文件被放入包中。

于 2011-10-15T01:50:18.583 回答
1

Localizable.strings为所有具有公共字符串的目标创建一个。还TargetSpecificLocalizable.strings为每个目标创建并将目标特定的字符串放入其中。然后对于常见的字符串使用

NSLocalizedString("sample string", comment: "")

对于目标特定的字符串,请使用

NSLocalizedString("sample string", tableName: "TargetSpecificLocalizable", bundle: Bundle.main, value: "", comment: "")
于 2020-01-30T07:29:33.690 回答