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).如前所述,症状是因为编译器找不到字符串.否则原因可能是任何数量的事情,但通常是缺少半冒号或引号.当您一次进行大量本地化时,很难找到这些内容.我们吸取的教训是在开发过程的早期开始构建本地化文件,并随时进行构建,以便更容易发现.
Smi*_*den 11
在实际设备上测试应用程序并且它有效
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等不起作用,但这样做.至少对我而言,今天.
无论出于何种原因,当运行时无法找到指定的密钥时,就会发生这种情况.在你的情况下,它很可能是由于一个错字:CONNECTIONERRORITLE缺少一个Tfor TITLE.在编译Localizable.strings文件时还要注意任何警告/错误:如果存在不平衡"或丢失;,则无法正确编译/读取文件.
小智 7
将文件名更改为Localizable.strings,确保设置了文件检查器中的目标.要避免语法错误,请右键单击Localizable.strings文件 - >打开as-> ASCII属性列表另外,在我的情况下,清理项目和构建再次有帮助.
NSLocalizedString用法意味着您需要密钥的精确案例和拼写才能从中获取内容.你会注意到这个人说的
NSLocalizedString(@"CONNECTIONERRORITLE",nil)
Run Code Online (Sandbox Code Playgroud)
什么时候应该
NSLocalizedString(@"CONNECTIONERRORTITLE",nil)
Run Code Online (Sandbox Code Playgroud)
如果你看第一个的最后一部分,它会说'ITLE',而不是'TITLE'
小智 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)
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
38326 次 |
| 最近记录: |