iOS:如何在应用内进行I18 N/本地化?

2mbi3lxu  于 2023-10-21  发布在  iOS
关注(0)|答案(3)|浏览(169)

如何在应用程序中执行I18 N,而不更改设备的语言设置?
我想有一个屏幕后,启动画面要求用户的语言,他想使用的应用程序。这应该独立于系统语言。
有没有一种简单的方法可以在应用程序上下文中设置语言设置?例如:

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage]

谢谢你的任何建议。
编辑
好吧,我取得了一些进展。是否有方法覆盖NSLocalizedString()?问题是将NSUserial设置为另一种语言代码只有在重新启动应用程序后才能识别。我当然没有选择。

bfrts1fy

bfrts1fy1#

我最终得到了这个解决方案。我首先定义一个静态类来设置我的In-App语言:

@implementation I18NUtil

static NSBundle *_bundle;
static NSString *_language;

+ (id)alloc 
{
    [NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"];
    return nil;
}

+ (void)setLanguage:(NSString *)languageCode 
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:languageCode, nil] forKey:@"AppleLanguages"];

    NSString *path = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"];
    _bundle = [NSBundle bundleWithPath:path];
    _language = languageCode;
}

+ (NSString *)localizedString:(NSString *)key
{
   return [_bundle localizedStringForKey:key value:@"" table:nil];
}

@end

您可以轻松地使用:用途:

[I18NUtil localizedString:@"myLocalizedString"]

在你的整个项目中。
但是我发现覆盖NSLocalizedString宏并像我习惯的那样使用i18 n要容易得多。您必须将其包含到您的AppName-Prefix.pch中:

#ifdef __OBJC__
    ...

    // Override native NSLocalizedString(key,message) to achieve in-app and on-the-fly i18n
    // Needs to be defined AFTER importing Foundation.h
    #import "I18NUtil.h"

    #ifdef NSLocalizedString
        #undef NSLocalizedString
    #endif

    #define NSLocalizedString(key, message) \
        [I18NUtil localizedString:(key)]
#endif

玩得开心点!

at0kjp5o

at0kjp5o2#

您可以使用NSLocalizedStringFromTable的任意字符串文件。
例如,你可以把所有的字符串文件组织成这样:

localizable_buttons_english.strings
localizable_buttons_spanish.strings
...
localizable_errors_english.strings
localizable_errors_spanish.strings
...

然后,使用用户在应用首选项中选择的语言来获取任何语言的翻译:

NSString *lang = <# read user prefs #> // Example: spanish
NSString *table = [NSString stringWithFormat:@"localizable_buttons_%@", lang];
NSString *text = NSLocalizedStringFromTable(@"SendButtonLabel", table, nil);
sendButton.titleLabel.text = text;

// localizable_buttons_english.strings
"SendButtonLabel" = "Send";

// localizable_buttons_spanish.strings
"SendButtonLabel" = "Enviar";

本地化NIB文件只需要使用用户选择的语言以编程方式加载NIB来构建NIB名称。

pjngdqdw

pjngdqdw3#

使用最新的Xcode15,您可以使用String Catalogs添加和管理本地化的键值对,使用NSLocalizedString调用,或使用SwiftGen自动生成代码。如果您需要翻译成多种语言,可以使用I18n Studio

相关问题