46

我制作了一个名为“Localizable.strings”的字符串文件,并向其中添加了两种语言,如下所示:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

我还将文件转换为 Unicode UTF-8 但是,当我像这样创建 UIAlertView 时:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

警报视图仅显示关键文本,而不是值。例如,如果我将 UITextviews 文本设置为 NSLocalizedString(@"CONNECTIONERROR",nil),它会起作用,但警报视图仅显示密钥。有谁知道怎么了?

4

30 回答 30

111

就我而言,这是因为我错误地将文件命名为“Localization.strings”而没有注意到(它必须命名为 Localizable.strings)。如前所述,症状是因为编译器找不到字符串。否则,原因可能有很多,但通常是缺少分号或引号。当您同时进行大量本地化时,很难找到这些。吸取的教训是在开发过程的早期开始构建本地化文件,并在开发过程中构建它,以便更容易发现它们。

于 2012-07-01T17:14:52.977 回答
27

同样的问题,使用文件名解决:Localizable.strings

于 2014-03-20T15:15:08.967 回答
19

.strings将您的文件名更改为Localizable.strings,它对我有用。

于 2017-06-22T07:34:16.517 回答
18

仔细检查Localizable.strings文件是否被添加到

目标 -> 构建阶段 -> 复制捆绑资源

它没有为我自动添加。

编辑 2021:必须将XCode 12Localizable.strings添加到

目标 -> 构建阶段 -> 编译资源

于 2014-09-02T16:36:58.743 回答
13

我已经搜索了 5 个小时的解决方案,我尽我所能使我的应用程序本地化工作。

问题是我项目的一个 Pod 有一个 Localizable.strings 文件(实际上是 Parse pod 没有重命名它)。因此,我的应用程序无法识别我的 Localizable.strings 文件。

我通过将文件名更改为“MyappnameLocalizable.strings”并以这种方式使用 NSLocalizedString 来解决此问题:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
于 2015-08-19T11:54:00.547 回答
10

在实际设备上测试了该应用程序并且它可以工作

于 2012-04-20T17:08:25.740 回答
9

我在 iOS 模拟器上遇到了这个问题。我最终删除了模拟器目录中的 Localization.strings 文件

( /Users/(me)/Library/Application Support/iPhone Simulator/5.0/Applications/(etc)/(project)/(application.app)

cd 到那里并删除在那里找到的所有 Localization.strings 副本。

出于某种原因,构建清洁、退出 iOS 模拟器、退出 XCode 等通常的橡胶鸡巫术不起作用,但确实如此。至少对我来说,今天。

于 2012-07-25T20:18:00.387 回答
8

当运行时出于某种原因找不到指定的键时,就会发生这种情况。在您的情况下,这很可能是由于拼写错误:CONNECTIONERRORITLE缺少Tfor TITLE。在编译文件时还要注意任何警告/错误Localizable.strings:如果文件不平衡"或丢失;,则无法正确编译/读取文件。

于 2012-02-12T18:02:54.743 回答
7

将文件名更改为 Localizable.strings,确保设置了文件检查器中的目标。为避免语法错误,请右键单击 Localizable.strings 文件->打开为->ASCII 属性列表此外,清理项目并再次构建对我来说也很有帮助。

于 2015-07-02T08:11:50.253 回答
6

将 InfoPlist.strings 文件重命名为 Localizable.strings(双击),然后您将获得该键的正确字符串。

于 2014-07-07T19:47:18.433 回答
6

NSLocalizedString 用法意味着您需要精确的大小写和拼写才能从中获取内容。你会注意到这个说

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

什么时候应该

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

如果你看第一个的最后一部分,它说的是“ITLE”,而不是“TITLE”

于 2012-02-12T18:03:01.893 回答
6

如果您在行尾写了双分号,则 NSLocalization 不起作用。你应该检查 Localizable.strings 文件是否有 ';;'

于 2013-11-29T06:21:07.183 回答
5

在开发 SDK 时。你需要一些额外的操作。

1)像往常一样在 YourLocalizeDemoSDK 中创建Localizable.strings 。

2)在 YourLocalizeDemo 中创建相同的Localizable.strings 。

3) 找到 YourLocalizeDemoSDK 的Bundle Path

斯威夫特4

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self))帮助您在 YourLocalizeDemoSDK 中找到捆绑包。如果你Bundle.main改用,你会得到一个错误的值(实际上它将是与键相同的字符串)。

但是,如果您想使用OX 博士提到的 String 扩展名。你需要做更多。原点扩展看起来像这样。

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

众所周知,我们正在开发一个SDK,Bundle.main会得到YourLocalizeDemo的bundle。这不是我们想要的。我们需要 YourLocalizeDemoSDK 中的捆绑包。这是一个快速找到它的技巧。

在 YourLocalizeDemoSDK 的 NSObject 实例中运行以下代码。您将获得 YourLocalizeDemoSDK 的 URL。

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

将这两个url都打印出来,你会发现我们可以在mainBundleURL的基础上构建bundleURLofSDK。在这种情况下,它将是:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

字符串扩展名将是:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

希望能帮助到你。

于 2018-07-05T02:08:21.543 回答
4

要确定是否找到了 Localizable.strings 文件,请检查 .app 构建的内容,您也可以在代码中执行此操作:

//en 例如英语,所以在这里指定你的 NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];

如果路径为 NULL,则表示未找到文件。

于 2013-07-24T17:06:28.603 回答
3

如果您的字符串文件中有任何额外的分号,则它不会本地化。

于 2015-10-07T18:48:37.620 回答
2

我遇到了类似的问题,突然我的可本地化字符串根本不起作用。然后我使用文件比较与旧的 .strings 副本,最后我发现我不小心删除了其中的一个键。

因此,如果格式错误,Xcode 绝对不会为您读取字符串。

这是它期望的格式"Key" = "Value";

于 2016-01-18T11:49:31.280 回答
2

因为我在寻找类似问题的答案时偶然发现了这一点,所以我将解决方案留在这里:

如果您的键中包含“\u2028”而不是“\n”,它将始终只返回键而不是值。似乎是本地化的错误。

于 2018-10-24T03:02:49.433 回答
2

我们正在处理一个问题,其中一些键没有获得它们的值,尽管它们都存在于 Localizable.strings 中。

结果是构建文件的开发人员在一行中添加了两个分号,这导致该文件的解析非常不稳定。

在我找到两个并排的分号并删除其中一个后,该应用程序将无法再编译。在这一点上,我能够找到一些没有分号的行。修复这些并编译应用程序后,我所有的字符串都工作正常。

因此,在同一行中有两个分号会导致文件编译,尽管它在其他行中缺少分号。

看起来 Apple 的.strings文件解析器非常原始。

不幸的是,plist linter 在我们的案例中是无用的。为了找到并解决问题,我复制并粘贴了 Localizable.strings 文件的全部内容(超过 2000 行长),然后开始将其复制回 20 行块并每次编译。这是找到 linter 无法捕获的问题的唯一方法。

于 2020-09-30T13:37:26.120 回答
1

放一个; 在 Localizable.strings 文件的行尾。

于 2014-02-04T11:11:36.130 回答
1

重置模拟器设置对我有用。

iOS 模拟器 > 重置内容和设置...

于 2014-09-04T20:50:22.173 回答
1

就我而言,我尝试清理项目并删除派生数据仍然无效。我删除了字符串文件中的几个换行符,然后 Xcode 再次找到这些字符串。

于 2014-12-08T13:24:17.483 回答
1

建议的解决方案都不适合我,但我确实通过删除 Products 中的 .app 文件解决了这个问题

于 2015-08-19T19:55:28.147 回答
1

当一种语言正常工作而另一种语言有一半时间工作而其他时间我得到密钥而不是该密钥的本地化版本时,我遇到了问题。

在我的情况下,问题是手动合并版本控制冲突后,留下了额外的'>>>>>'行,项目没有抱怨(不像你错过分号时抱怨)并且正在正确构建,所以'>>>>>' 之前的每个键都被翻译,之后的每个键都没有。

如果更简单的解决方案失败,您可能必须遍历每一行并寻找额外的字符(不仅是'>>>>>',还有其他额外的字符),或者如果您使用版本控制,请获取更旧、更稳定的版本Localizable.strings 文件并手动完成更改并添加以后的提交。

于 2018-12-13T18:01:29.053 回答
0

您是否尝试过清理和重建项目?

于 2015-04-30T16:38:24.257 回答
0

本地化文件的第一行必须包含一个映射,否则 SDK 不会读取该文件。

于 2013-12-22T03:53:53.443 回答
0

一定不要把'@'放在你的前面key或者value像这样:

@"key" = @"value";

它应该只是:

"key" = "value";

'@' 仅在访问密钥时位于密钥前面:

NSWebLocalizedString(@"key", @"label for coder");
于 2014-10-02T18:54:38.243 回答
0

对于 xcode 9.2,使用控制台从项目的模拟器中删除“Localizable.strings”文件为我解决了这个问题。这是像我这样的懒人的命令;)

不要忘记将YOUR_APP_NAME_HERE替换为您的项目名称

外壳脚本:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

如果您遇到单元测试问题,它将在模拟器中工作;)

于 2018-03-14T08:38:28.390 回答
0

当突然本地化停止翻译字符串时,我一切正常。这意味着 Xcode 无法读取该文件。

这发生在我身上,因为我在Localized.strings文件中粘贴了一个错误的字符。当我删除带有违规字符的几行时(非 unicode 字符?错误的引号?无法判断),一切都恢复了正常。

为了找到有问题的行,我做了一个断点,并在调试器中手动翻译了我文件中的字符串,直到我点击了第一个不会翻译的字符串。

于 2015-07-10T21:43:01.113 回答
0

我使用这种方法解决了它。

localize文件是用名称创建的main.Strings。然后,我打开main.Strings文件(对于添加的每种语言)并使用名称手动重命名它们localize.strings并将它们一一添加到我的项目中,我还删除了main.strings.

要评估的第二件事是:检查。您的文件,所有文件都keys必须以;并确保所有文件quotes都正确打开和关闭。

您可以在swift 4中使用:

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
于 2018-09-14T00:32:49.943 回答
0

Swift 4:

If you use more than one bundle such as you use it in an external framework:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
于 2018-05-22T09:24:04.647 回答