2016-11-28 73 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