2012-05-31 72 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