如何在运行时更改iPhone应用程序语言?

时间:2009-10-16 08:46:16

标签: iphone internationalization performance

有没有办法在运行时更改应用程序语言?

因此,在更改后NSLocalizedString会立即返回新语言的字符串。

我现在正在做的是使用以下代码更改语言:

- (void)onChangeLanguage: (id)sender 
{
    NSArray *lang = [NSArray arrayWithObjects:((InfoWhatever *)sender).language, nil];
    [[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];

    NSLog(@"Current language: %@", currentLanguage);
}

只有在重新启动应用程序后,语言才会更改

7 个答案:

答案 0 :(得分:11)

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
[languages insertObject:@"de" atIndex:0]; // ISO639-1
[[NSUserDefaults standardUserDefaults] synchronize];

答案 1 :(得分:7)

通过从应用程序中选择使用特定语言的技巧是强制NSLocalizedString根据所选语言使用特定的包,

这是我为此http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

撰写的帖子

以下是一个示例应用https://github.com/object2dot0/Advance-Localization-in-ios-apps

的代码

答案 2 :(得分:7)

你可以做到。这是方法 http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html

  1. 简介下载并向项目中添加2个文件

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.h

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.m

  2. 2
         #import "LocalizationSystem.h"

    3

    - (IBAction)btnEnglishClicked:(id)sender {
         LocalizationSetLanguage(@"en");
    }
    

    4设置上述语言后

    AMLocalizedString(@"Key", nil)
    

    多数民众赞成

答案 3 :(得分:5)

我怀疑你能做到这一点,即使设置应用程序也无法做到这一点。

(当您在“设置”应用中更改语言时,屏幕变黑,并显示“设置语言...”和进度轮。经过漫长的等待,您又回到了Springboard。它几乎看起来像手机重新启动。)

答案 4 :(得分:3)

我想出了一个允许你使用NSLocalizedString的解决方案。我创建了一个NSBundle来电NSBundle+RunTimeLanguage类别。界面就是这样。

// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end

实施就是这样。

// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"

@implementation NSBundle (RunTimeLanguage)

- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
    NSBundle *languageBundle = [NSBundle bundleWithPath:path];
    NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
    return localizedString;
}
@end

只需将导入NSBundle+RunTimeLanguage.h添加到使用NSLocalizedString的文件中即可。

如您所见,我将languageCode存储在AppDelegate的属性中。这可以存储在您喜欢的任何地方。

我唯一不喜欢的事情是NSLocalizedString marco重新定义的警告。也许有人可以帮我解决这个问题。

答案 5 :(得分:1)

只需添加以下行:

<ExcludeFoldersFromDeployment>Content;Scripts;Views</ExcludeFoldersFromDeployment>

答案 6 :(得分:-1)

试试这个:  object_setClass([NSBundle mainBundle],[MyBundle class]);

https://github.com/maximbilan/ios_language_manager/blob/master/README.md