目前,我有三个单独的.strings
个文件 - 分别为英语,法语和德语。
我在偏好设置部分有UISegmentedControl
,我想根据选择的细分更改默认的.strings
文件。
当我测试它时,本地化已经在应用程序之外工作了,我甚至设法根据选择的段来定位单个对象(如果选择了france,则下面的标签文本从“South”变为“Sud” ,如果重新选择英语,则再次返回)使用:
if(German segment) {
NSString *path= [[NSBundle mainBundle] pathForResource:@"de" ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
// Returns german version of localised string as label text.
self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil];
// I would like to set the default .strings file to 'de' here.
}
else if(French segment) {
NSString *path= [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
// Returns french version of localised string as label text
self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil];
// I would like to set the default .strings file to 'fr' here
}
else if(British segment) {
NSString *path= [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
// Returns english version of localised string as label text
self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil];
// I would like to set the default .strings file to 'en' here.
}
现在,由于我已经在单击按钮时已经将各个字符串本地化,我想知道是否可以一次性本地化每个.strings
文件中的所有字符串(所以我正在改变使用的默认.strings取决于选择哪个段)或至少在可接受的代码量中尽可能多地定位。
显然,目前我可以逐个输入,但由于应用程序中使用的本地化字符串数量,这不是一个真正的选项。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您可以将此本地化方法包装在LocalizationSystem类中:
@interface PLLocalizationSystem : NSObject
@property (strong, nonatomic) NSString *language;
+ (PLLocalizationSystem *) sharedLocalizationSystem;
- (NSString *) localizedStringForKey:(NSString *)key value:(NSString *)comment;
@end
@implementation PLLocalizationSystem {
NSBundle *_bundle;
}
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment {
return [_bundle localizedStringForKey:key value:comment table:nil];
}
- (void)setLanguage:(NSString *)newLanguage {
...
NSString *path = [[NSBundle mainBundle] pathForResource:newLanguage ofType:@"lproj"];
if (path) {
_bundle = [NSBundle bundleWithPath:path];
_language = newLanguage;
} else {
[self resetLocalization];
}
...
[[NSNotificationCenter defaultCenter] postNotificationName:kLocalizationChangedNotification object:nil];
}
并为更简单的访问制定一些定义(在LocalizationSystem头文件中定义):
#define PLLocalizedString(key, comment) \
[[PLLocalizationSystem sharedLocalizationSystem] localizedStringForKey:(key) value:(comment)]
#define PLLocalizationSetLanguage(language) \
[[PLLocalizationSystem sharedLocalizationSystem] setLanguage:(language)]
#define PLLocalizationGetLanguage \
[[PLLocalizationSystem sharedLocalizationSystem] language]
您也可以从AppName-Prefix.pch文件导入此文件,以便从任何地方访问。
接下来在您的控制器中,您可以观察本地化的变化并调用适当的方法。
所以现在,您可以像使用NSLocalizedString一样使用它。
P.S。我不是在这里写所有的实现,但如果有人想我以后可以在githab上分享它
<强>更新。使用示例。
例如,您有要动态本地化的UIViewController:
@implementation MyCustomViewController
- (void)viewDidLoad {
[super viewDidLoad];
//first of all - register for localization changes
//i made for this purposes category for UIViewController(localizable)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(localize)
name:kLocalizationChangedNotification
object:nil];
}
//here you should apply all localization
- (void)localize {
[self setTitle:PLLocalizedString(@"myTitle", nil);
[label setText:PLLocalizedString(@"labelTitle", nil)];
....
}
@end
在您的偏好设置中,当您更改语言时调用PLLocalizationSetLanguage(语言),
并且为此事件注册的所有控制器都将自动进行本地化。当然,这种方法需要所有本地化都适用于localize
方法。
当控制器解除分配或卸载时,不要忘记删除观察者
答案 1 :(得分:0)
您可以阅读:How to force NSLocalizedString to use a specific language和http://aggressive-mediocrity.blogspot.nl/2010/03/custom-localization-system-for-your.html,了解如何做到这一点(第二个更适合您想要的内容)。
但请阅读此内容(也来自第二个链接):
通常,您不应在应用程序中更改iOS系统语言(通过使用AppleLanguages pref键)。这违反了在Settings应用程序中切换语言的基本iOS用户模型,并且还使用了未记录的首选项密钥,这意味着在将来的某个时刻,密钥名称可能会更改,这会破坏您的应用程序。
如果要在应用程序中切换语言,可以通过手动加载捆绑包中的资源文件来实现。您可以使用NSBundle:pathForResource:ofType:inDirectory:forLocalization:为此目的,但请记住,您的应用程序将负责所有本地化数据的加载。