2016-11-28 74 views
0

我有这样的扩展:斯威夫特本地化问题

func localized() -> String { 
    return NSLocalizedString(self, tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "") 
} 

它工作正常,但如果用户改变了手机上的语言来一个我们不支持,用户界面将显示“example_label”。如果它没有为当前的iOS语言设置找到一个,我希望它默认为英文翻译。

我该怎么做?

修复: 不知道我是否会使用这个,而不是最好的代码/方法,但这个工程。

func localized() -> String { 
    var localizedString = NSLocalizedString(self, tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "") 
    if self == localizedString { 
     let path = NSBundle.mainBundle().pathForResource("en", ofType: "lproj") 
     let bundle = NSBundle(path: path!) 

     localizedString = NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "") 
    } 
    return localizedString 
} 

回答

1

documentation for this exact function (NSLocalizedString(_:tableName:bundle:value:comment:))真的缺乏,但有类似的方式a similar function, localizedString(forKey:value:table:), with complete documentation.这可能行为。

返回如果键是零或者如果键的本地化字符串不能在表中找到的值。

...

返回值

在TABLE表名键指定的字符串的本地化版本。当密钥为零或在表中找不到时,此方法返回以下内容:

如果密钥为零且值为零,则返回一个空字符串。

如果键值为零且值非零,则返回值。

如果找不到密钥并且值为零或空字符串,则返回密钥。

如果未找到密钥并且值非零且不为空,则返回值。

根据这些规则,设置为""因为它是在你的函数,如果键(self,在这种情况下)未找到该值,则密钥(self)应返回。我怀疑example_label来自其他代码中的某个默认设置。

作为一个方面说明,我认为这个函数会更好,如果写成一个计算属性。

extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "") 
    } 
} 
+0

“如果找不到密钥并且值为零或空字符串,则返回密钥。”这是对的。我希望它接下来搜索该密钥的英文版本,而不是仅仅返回密钥本身。 – KotaBear233

+0

@ KotaBear233哦,我想你的钥匙是英文字符串。好的,一秒 – Alexander

+0

@ KotaBear233这个'example_label'从哪里来? 'NSLocalizedString'根据它们的优先级来尝试每一种用户语言,并且如果找不到其他语言,则会回到英语。 – Alexander