在iPhone上NSLocalizedString返回iPhone 语言的字符串.是否可以强制NSLocalizedString使用特定语言使应用程序使用与设备不同的语言?
localization objective-c internationalization nslocalizedstring ios
有Swift相当于NSLocalizedString(...)?在Objective-C,我们通常使用:
NSString *string = NSLocalizedString(@"key", @"comment");
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Swift中实现同样的目标?我发现了一个功能:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Run Code Online (Sandbox Code Playgroud)
但是,它很长并且根本不方便.
我正在使用Swift 3语法定义自定义错误类型,我想提供一个用户友好的错误描述,该描述由对象的localizedDescription属性返回Error.我该怎么做?
public enum MyError: Error {
case customError
var localizedDescription: String {
switch self {
case .customError:
return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
}
}
}
let error: Error = MyError.customError
error.localizedDescription
// "The operation couldn’t be completed. (MyError error 0.)"
Run Code Online (Sandbox Code Playgroud)
有没有办法让localizedDescription我返回我的自定义错误描述("用户友好的错误描述.")?请注意,此处的错误对象是类型Error而不是MyError.当然,我可以将对象强制转换为MyError
(error as? MyError)?.localizedDescription
Run Code Online (Sandbox Code Playgroud)
但是有没有办法让它工作而不会转换为我的错误类型?
我(和所有其他人一样)使用NSLocalizedString本地化我的应用程序.
不幸的是,有几个"缺点"(不一定是NSLocalizedString本身的错误),包括
genstring最终会有一个字符串的多个注释genstring在已经对某些字符串进行本地化后使用,则必须小心不要丢失旧的本地化.NSLocalizedString(@"Abort", @"Cancel action")在任何地方都使用过,然后Code Review要求您重命名字符串NSLocalizedString(@"Cancel", @"Cancel action")以使代码更加一致.我所做的(以及经过一些搜索后,我认为很多人这样做)是有一个单独的strings.h文件,我#define所有的本地化代码.例如
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
Run Code Online (Sandbox Code Playgroud)
这基本上提供了代码完成,一个更改变量名称的位置(因此不再需要genstring),以及一个自动重构的唯一关键字.但是,这需要花费大量结果来解决一系列#define非固有结构的语句(例如LocString.Common.Cancel或类似的东西).
所以,虽然这有点好,但我想知道你们是如何在你的项目中做到的.是否有其他方法可以简化NSLocalizedString的使用?甚至可能有一个封装它的框架?
TL; DR:
似乎本地化不适用于xCode 6.1和8.1模拟器.
解决方法:
转到"编辑方案">>"运行"(侧栏)>>"选项"选项卡>>"应用程序语言"
在模拟器上选择要运行应用程序的语言.
很长的故事:
我已将xCode更新为6.1.更新删除了iOS 7.x模拟器,只留下8.x模拟器.
我已经完成了以下步骤:
该项目支持英语和日语.
在7.1模拟器(5s)上,本地化按预期工作.
在8.1模拟器(5s)它不起作用.
我猜测Apple在模拟器上破坏了一些东西,因为它适用于真实设备.
关于这个的任何意见,其他人都遇到过类似的问题吗?
编辑
它似乎是模拟器中的一个错误,参考:
Apple Dev Forums
I'm trying to localize my app using NSLocalizedString. When i import the XLIFF file, most works like a charm but something do not and some string is not localized. I have noticed that the problem is from NSLocalizedString containing something variable inside like:
NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")
Run Code Online (Sandbox Code Playgroud)
or
NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")
Run Code Online (Sandbox Code Playgroud)
Maybe this is not the correct syntax for thi kind of stuff. …
我已经尝试使用变量作为NSLocalizedString的输入参数,但我得到的所有内容都是输入参数.我究竟做错了什么?是否可以使用变量字符串值作为NSLocalized字符串的索引?
例如,我有一些字符串,我希望显示本地化版本.但是,我想使用变量作为NSLocalizedString的参数,而不是常量字符串.同样,我想在NSLocalizedString的参数中包含格式化元素,因此我将能够使用相同的格式参数检索字符串的本地化版本.我可以做以下事情:
案例1:变量NSLocalizedstring:
NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");
Run Code Online (Sandbox Code Playgroud)
案例2:格式化的NSLocalizedString:
NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];
Run Code Online (Sandbox Code Playgroud)
(请注意,变量可以包含任何内容,而不仅仅是一组固定的字符串.)
谢谢!
我有一个带有一些观点的iPhone故事板.例如,命名导航项目标题News,应该为其他语言翻译.
当我向故事板添加新的本地化时,它创建了我当前新语言故事板的副本.在这里我可以更改导航项的标题,但对我来说它似乎没有用.如果我的故事板包含100个视图并且我需要支持10种语言怎么办?如果我需要在原始故事板中更改某些内容,我必须对所有语言进行相同的更改.这看起来很奇怪.在哪些情况下这可能有用?
我该怎么做?我应该只有英文故事板并使用ViewController手动翻译每个元素NSLocalizedString吗?
我创建了一个名为"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),则它可以工作,但警报视图仅显示密钥.谁知道什么是错的?
我将如何使用NSLocalizedString此字符串:
[NSString stringWithFormat:@"Is “%@“ still correct for “%@“ tap “OK“ otherwise tap “Change“ to choose new contact details", individual.contactInfo, individual.name];
Run Code Online (Sandbox Code Playgroud)
在使用stringWithFormat之前我以下列方式使用它:
[NSString stringWithFormat:@"%d %@", itemCount, NSLocalizedString(@"number of items", nil)];
Run Code Online (Sandbox Code Playgroud) ios ×7
localization ×5
objective-c ×5
swift ×3
xcode ×2
swift3 ×1
uialertview ×1
uistoryboard ×1
xcode6.1 ×1
xliff ×1