NSLocalizedString只检索键,而不是Localizable.strings(IOS)中的值

Smi*_*den 41 xcode uialertview localizable.strings nslocalizedstring ios

我创建了一个名为"Localizable.strings"的字符串文件,并为其添加了两种语言,如下所示:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";
Run Code Online (Sandbox Code Playgroud)

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

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

警报视图仅显示关键文本,而不显示值.例如,如果我将UITextviews文本设置为NSLocalizedString(@"CONNECTIONERROR",nil),则它可以工作,但警报视图仅显示密钥.谁知道什么是错的?

Jim*_*ota 98

在我的情况下,这是因为我错误地将文件命名为"Localization.strings"并且没有注意到(它必须被命名为Localizable.strings).如前所述,症状是因为编译器找不到字符串.否则原因可能是任何数量的事情,但通常是缺少半冒号或引号.当您一次进行大量本地化时,很难找到这些内容.我们吸取的教训是在开发过程的早期开始构建本地化文件,并随时进行构建,以便更容易发现.

  • 谢谢,这条评论给了我很多帮助! (3认同)
  • 该文件应该是名称_Localizable.string_,上面是*L*,没有*s*...约定超过配置......我讨厌**这个范例. (2认同)

Pel*_*nes 26

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


ali*_*ara 15

.strings文件名更改为Localizable.strings,它对我有用.


vir*_*nen 12

仔细检查是否正在添加Localizable.strings文件

目标 - > BuildPhases - >复制捆绑资源

它没有自动添加给我.


Smi*_*den 11

在实际设备上测试应用程序并且它有效

  • 另一个问题是Localizable.strings文件没有被清除并正确地重新初始化; 如果您之前在设备上进行测试,然后创建或显着更改了Localizable.strings文件,则不会始终注意到更改,因此您必须清除构建并在更改正确传播之前从设备中删除副本. (17认同)

aiw*_*s31 10

我一直在寻找解决方案5个小时,我尽我所能使我的应用程序本地化工作.

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

我通过将文件名更改为"MyappnameLocalizable.strings"并以这种方式使用NSLocalizedString来修复此问题:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

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

出于某种原因,通常的橡皮鸡伏都教的构建干净,退出iOS模拟器,退出XCode等不起作用,但这样做.至少对我而言,今天.


Dar*_*ust 8

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


小智 7

将文件名更改为Localizable.strings,确保设置了文件检查器中的目标.要避免语法错误,请右键单击Localizable.strings文件 - >打开as-> ASCII属性列表另外,在我的情况下,清理项目和构建再次有帮助.


Cod*_*aFi 6

NSLocalizedString用法意味着您需要密钥的精确案例和拼写才能从中获取内容.你会注意到这个人说的

NSLocalizedString(@"CONNECTIONERRORITLE",nil)
Run Code Online (Sandbox Code Playgroud)

什么时候应该

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)
Run Code Online (Sandbox Code Playgroud)

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


Bur*_*rtK 6

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


Pel*_*nes 6

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


小智 6

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

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

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

3)找到YourLocalizeDemoSDK的Bundle路径

斯威夫特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: "")
Run Code Online (Sandbox Code Playgroud)

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: "")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL
Run Code Online (Sandbox Code Playgroud)

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

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
Run Code Online (Sandbox Code Playgroud)

字符串扩展将是:

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: "")
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。