2012-05-31 44 views
7

是否可以從特定localized.strings文件獲取本地化字符串,而不是從系統選擇的localized.strings文件中獲取,只有一次。我不需要更改所有本地化的文本,只有其中一些。Iphone sdk - 從特定localized.strings文件獲取本地化文本

我想要做的是從語言首選項定義本地化的字符串,但也需要本地化。因此,來自巴西的英語用戶可以用英文獲得應用程序,但一些文本將針對該地區,因此我希望用葡萄牙語提供。

但是來自阿根廷的用戶,也會用英文版的iPhone來獲得英文版的應用程序,但一些文章將會用西班牙文版。

喜歡的東西

NSLocalizedStringFromTable("string.key","pt_BR",nil) 

我以爲是發送到參數會工作,但它並沒有爲它尋找的文件的名稱,而不是對語言。

回答

3

也許你想要使用NSBundle的localizedStringForKey:value:table:而不是NSLocalizedString()。這種方法可以讓你有機會指定一個不同的表格。

[[NSBundle mainBundle] localizedStringForKey:@"stringKey" 
    value:defaultString table:tableName]; 

順便說一句,不要忘記你的目標C字符串前面的@ ;-)。

+0

是的,我的意思是,但表參數是一個.strings文件名,所以我需要有兩個額外的文件pt.strings和es.strings,而不是使用想要的Localizable.strings fil即雖然沒有問題,但並未回答我的問題。 – htafoya

1
+1

是的,我的意思是,但Table參數是.strings文件名,所以我需要兩個額外的文件pt.strings和es.strings,而不是使用想要的Localizable.strings文件。 – htafoya

+0

你的問題並不那麼清楚,因爲它似乎要求如何從不同的文件中獲取它。 「是否可以從特定文件中獲取本地化字符串,而不是從預定義的localized.strings文件中獲取。」 – Dad

4

您可以使用不同的束來選擇特定的語言:

NSString * path = [[NSBundle mainBundle] pathForResource:@"pt-PT" ofType:@"lproj"]; 
NSBundle * bundle = nil; 
if(path == nil){ 
    bundle = [NSBundle mainBundle]; 
}else{ 
    bundle = [NSBundle bundleWithPath:path]; 
} 
NSString * str = [bundle localizedStringForKey:@"a string" value:@"comment" table:nil]; 

雨燕3.0:

extension Bundle { 
    static let base: Bundle = { 
     if let path = Bundle.main.path(forResource: "Base", ofType: "lproj") { 
      if let baseBundle = Bundle(path: path) { 
       return baseBundle 
      } 
     } 
     return Bundle.main 
    }() 
} 

let localizedStr = Bundle.base.localizedString(forKey: key, value: nil, table: table) 
+1

這太棒了 - 我不知道爲什麼它沒有更多upvotes。比所有其他建議的方法要容易得多。我使用它來獲取開發語言中的字符串版本,所以我使用'[[NSBundle mainBundle] pathForResource:@「Base」ofType:@「lproj」];' – deltacrux

+0

這是最常見的答案,我測試過它和它的作品!增加了Swift 3.0版本。 – kelin