269

在 iPhoneNSLocalizedString上以 iPhone 的语言返回字符串。是否可以强制NSLocalizedString使用特定语言以使应用程序使用与设备不同的语言?

4

28 回答 28

263

NSLocalizedString()(及其变体)访问“AppleLanguages”键NSUserDefaults以确定用户对首选语言的设置是什么。这将返回一组语言代码,第一个是用户为其手机设置的语言代码,如果资源在首选语言中不可用,则后续代码用作后备。(在桌面上,用户可以在 System Preferences 中通过自定义顺序指定多种语言)

如果您愿意,可以通过使用 setObject:forKey: 方法设置您自己的语言列表来覆盖您自己的应用程序的全局设置。这将优先于全局设置值,并返回到应用程序中执行本地化的任何代码。代码如下所示:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate

这将使德语成为您的应用程序的首选语言,英语和法语作为后备语言。您可能希望在应用程序启动的早期调用它。您可以在此处阅读有关语言/区域设置的更多信息:国际化编程主题:获取当前语言和区域设置

于 2009-11-03T22:23:38.007 回答
151

我最近遇到了同样的问题,我不想启动和修补我的整个NSLocalizedString也不想强制应用程序重新启动以使新语言工作。我希望一切都按原样工作。

我的解决方案是动态更改主包的类并在那里加载适当的包:

头文件

@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;
@end

执行

#import <objc/runtime.h>

static const char _bundle=0;

@interface BundleEx : NSBundle
@end

@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end

@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        object_setClass([NSBundle mainBundle],[BundleEx class]);
    });
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

所以基本上,当你的应用程序启动和加载你的第一个控制器之前,只需调用:

[NSBundle setLanguage:@"en"];

当您的用户在您的设置屏幕中更改他的首选语言时,只需再次调用它:

[NSBundle setLanguage:@"fr"];

要重置回系统默认值,只需传递 nil:

[NSBundle setLanguage:nil];

享受...

对于那些需要 Swift 版本的人:

var bundleKey: UInt8 = 0

class AnyLanguageBundle: Bundle {

    override func localizedString(forKey key: String,
                                  value: String?,
                                  table tableName: String?) -> String {

        guard let path = objc_getAssociatedObject(self, &bundleKey) as? String,
              let bundle = Bundle(path: path) else {

            return super.localizedString(forKey: key, value: value, table: tableName)
            }

        return bundle.localizedString(forKey: key, value: value, table: tableName)
    }
}

extension Bundle {

    class func setLanguage(_ language: String) {

        defer {

            object_setClass(Bundle.main, AnyLanguageBundle.self)
        }

        objc_setAssociatedObject(Bundle.main, &bundleKey,    Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}
于 2013-11-28T04:12:10.293 回答
137

我通常是这样做的,但是你的项目中必须有所有的本地化文件。

@implementation Language

static NSBundle *bundle = nil;

+(void)initialize 
{
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    NSArray* languages = [defs objectForKey:@"AppleLanguages"];
    NSString *current = [[languages objectAtIndex:0] retain];
    [self setLanguage:current];
}

/*
  example calls:
    [Language setLanguage:@"it"];
    [Language setLanguage:@"de"];
*/
+(void)setLanguage:(NSString *)l
{
    NSLog(@"preferredLang: %@", l);
    NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
    bundle = [[NSBundle bundleWithPath:path] retain];
}

+(NSString *)get:(NSString *)key alter:(NSString *)alternate 
{
    return [bundle localizedStringForKey:key value:alternate table:nil];
}

@end
于 2009-11-17T06:11:10.297 回答
41

不要在 iOS 9 上使用。这对通过它的所有字符串返回 nil。

我找到了另一个解决方案,它允许您更新语言字符串,无需重新启动应用程序并与 genstrings 兼容:

将此宏放在 Prefix.pch 中:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]

以及任何需要本地化字符串的地方:

NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"")

要设置语言使用:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];

即使有连续的语言跳跃也可以工作,例如:

NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
于 2011-10-28T18:40:43.217 回答
32

如前所述,只需执行以下操作:

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"el", nil] forKey:@"AppleLanguages"];

但是为了避免重新启动应用程序,请将这一行放在 main 方法中main.m,就在UIApplicationMain(...) 之前。

于 2010-06-25T12:44:19.003 回答
32

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

这是我为此在 ios 应用程序中学习高级本地化所写的帖子

这是 ios 应用程序中的一个示例应用程序高级本地化的代码

于 2011-05-01T17:33:57.073 回答
15

您如何看待 Swift 3 的这个解决方案?

extension String {

    func localized(forLanguage language: String = Locale.preferredLanguages.first!.components(separatedBy: "-").first!) -> String {

        guard let path = Bundle.main.path(forResource: language == "en" ? "Base" : language, ofType: "lproj") else {

            let basePath = Bundle.main.path(forResource: "Base", ofType: "lproj")!

            return Bundle(path: basePath)!.localizedString(forKey: self, value: "", table: nil)
        }

        return Bundle(path: path)!.localizedString(forKey: self, value: "", table: nil)
    }
}

简单用法:

"report".localized(forLanguage: "pl") //forced language
"report".localized() //default language selected by user in settings, in case when your app doesnt support selected lanaguage, the default one is selected, here is an english.
于 2016-12-13T14:39:45.933 回答
14

正如 Brian Webster 所提到的,需要“在应用程序启动的早期”设置语言。我认为应该是一个合适applicationDidFinishLaunching:AppDelegate地方,因为它是我进行所有其他初始化的地方。

但正如威廉丹尼斯所说,这似乎只有应用程序重新启动后才会生效,这有点没用。

但是,如果我将代码放在 main 函数中,它似乎工作正常:

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Force language to Swedish.
    [[NSUserDefaults standardUserDefaults]
     setObject:[NSArray arrayWithObject:@"sv"]
     forKey:@"AppleLanguages"];

    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

我很感激对此的任何评论。

于 2010-09-01T22:04:44.897 回答
13

NSLocalizedString()AppleLanguages从标准用户默认值 ( [NSUserDefaults standardUserDefaults]) 中读取键的值。它使用该值在运行时在所有现有本地化中选择适当的本地化。当 Apple 在应用程序启动时构建用户默认字典时,他们会在系统偏好设置中查找首选语言键并从那里复制值。例如,这也解释了为什么在 OS X 中更改语言设置对运行的应用程序没有影响,只会对此后启动的应用程序产生影响。复制后,值不会因为设置更改而更新。这就是为什么如果您更改语言,iOS 会重新启动所有应用程序。

但是,用户默认字典的所有值都可以被命令行参数覆盖。请NSUserDefaults参阅NSArgumentDomain. 这甚至包括从应用首选项 (.plist) 文件加载的那些值。如果您只想更改一次值以进行测试,这真的很好。

所以如果你想改变语言只是为了测试,你可能不想改变你的代码(如果你以后忘记删除这个代码......),而是告诉 Xcode 用命令行参数启动你的应用程序(例如使用西班牙语本地化):

在此处输入图像描述

根本不需要触摸您的代码。只需为不同的语言创建不同的方案,您就可以通过切换方案快速启动应用程序一次在一种语言和另一种语言中。

于 2014-09-10T10:28:02.423 回答
12

我最喜欢 Mauro Delrio 的方法。我还在我的 Project_Prefix.pch 中添加了以下内容

#import "Language.h"    
#define MyLocalizedString(key, alt) [Language get:key alter:alt]

因此,如果您想使用标准方法(使用 NSLocalizedString),您可以在所有文件中进行快速语法替换。

于 2011-01-27T12:38:26.663 回答
10

我想出了一个解决方案,允许您使用NSLocalizedString. 我创建了一个NSBundlecall类别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.

如您所见,我将语言代码存储在AppDelegate. 这可以存储在您想要的任何地方。

我唯一不喜欢的就是NSLocalizedStringmarco重新定义的警告。也许有人可以帮我修复这部分。

于 2014-04-30T18:53:58.573 回答
9

斯威夫特版本:

NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages")
NSUserDefaults.standardUserDefaults().synchronize()
于 2014-12-28T13:04:02.510 回答
9

Swift 3 扩展:

extension Locale {
    static var preferredLanguage: String {
        get {
            return self.preferredLanguages.first ?? "en"
        }
        set {
            UserDefaults.standard.set([newValue], forKey: "AppleLanguages")
            UserDefaults.standard.synchronize()
        }
    }
}

extension String {
    var localized: String {

    var result: String

    let languageCode = Locale.preferredLanguage //en-US

    var path = Bundle.main.path(forResource: languageCode, ofType: "lproj")

    if path == nil, let hyphenRange = languageCode.range(of: "-") {
        let languageCodeShort = languageCode.substring(to: hyphenRange.lowerBound) // en
        path = Bundle.main.path(forResource: languageCodeShort, ofType: "lproj")
    }

    if let path = path, let locBundle = Bundle(path: path) {
        result = locBundle.localizedString(forKey: self, value: nil, table: nil)
    } else {
        result = NSLocalizedString(self, comment: "")
    }
        return result
    }
}

用法:

Locale.preferredLanguage = "uk"

label.text = "localizedKey".localized
于 2017-07-26T16:28:12.503 回答
8

简而言之 :

本地化您的应用程序

您要做的第一件事是使用至少两种语言(在本例中为英语和法语)本地化您的应用程序。

覆盖 NSLocalizedString

在您的代码中,不要使用 using ,而是使用如下定义 NSLocalizedString(key, comment)的宏:MYLocalizedString(key, comment)#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];

这个MYLocalizationSystem单身人士将:

  • 通过设置正确的本地化 NSBundle用户要求来设置语言
  • 根据这个先前设置的语言返回本地化的 NSString

设置用户语言

当用户用法语更改应用程序语言时,调用[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];

- (void)setLanguage:(NSString *)lang
{
    NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"];
    if (!path)
    {
        _bundle = [NSBundle mainBundle];
        NSLog(@"Warning: No lproj for %@, system default set instead !", lang);
        return;
    }

    _bundle = [NSBundle bundleWithPath:path];
}

在此示例中,此方法将本地化捆绑包设置为 fr.lproj

返回本地化字符串

一旦你设置了本地化包,你就可以用这个方法从他那里得到正确的本地化字符串:

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value
{
    // bundle was initialized with [NSBundle mainBundle] as default and modified in setLanguage method
    return [self.bundle localizedStringForKey:key value:value table:nil];
}

希望这会帮助你。

您将在NSWinery.io的这篇文章中找到更多详细信息

于 2015-04-22T18:31:34.653 回答
7

在 swift 4 中,我已经解决了它而无需重新启动或使用库。

在尝试了很多选项后,我找到了这个函数,在这里你传递了你想要翻译的 stringToLocalize(Localizable.String,字符串文件),以及你想要翻译的语言,它返回的是值您在字符串文件中的那个字符串:

func localizeString (stringToLocalize: String, language: String) -> String
{
    let path = Bundle.main.path (forResource: language, ofType: "lproj")
    let languageBundle = Bundle (path: path!)
    return languageBundle! .localizedString (forKey: stringToLocalize, value: "", table: nil)
}

考虑到这个函数,我在一个 Swift 文件中创建了这个函数:

struct CustomLanguage {
    
    func createBundlePath () -> Bundle {
        let selectedLanguage = //recover the language chosen by the user (in my case, from UserDefaults)
        let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj")
        return Bundle(path: path!)!
    }
}

从整个应用程序以及其余 ViewControllers 的每个字符串中访问,而不是放置:

NSLocalizedString ("StringToLocalize", comment: “&quot;)

我已将其替换为

let customLang = CustomLanguage() //declare at top
let bundleLanguage = customLang.createBundle()

NSLocalizedString("StringToLocalize", tableName: nil, bundle: bundleLanguage, value: "", comment: “”) //use in each String

我不知道这是否是最好的方法,但我发现它非常简单,并且对我有用,希望对您有所帮助!

于 2019-05-13T08:55:12.160 回答
5

在文件.pch中定义:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]


#define NSLocalizedString(str,nil) NSLocalizedStringFromTableInBundle(str, nil, currentLanguageBundle, @"")
于 2013-03-13T15:19:27.580 回答
4

也许您应该对此进行补充(在 #import 之后的 .pch 文件上):

extern NSBundle* bundle; // Declared on Language.m

#ifdef NSLocalizedString
    #undef NSLocalizedString
    // Delete this line to avoid warning
    #warning "Undefining NSLocalizedString"
#endif

#define NSLocalizedString(key, comment) \
    [bundle localizedStringForKey:(key) value:@"" table:nil]
于 2011-08-04T15:22:11.360 回答
4

斯威夫特 3 解决方案:

let languages = ["bs", "zh-Hant", "en", "fi", "ko", "lv", "ms", "pl", "pt-BR", "ru", "sr-Latn", "sk", "es", "tr"]
UserDefaults.standard.set([languages[0]], forKey: "AppleLanguages")

给出了一些可以使用的语言代码示例。希望这可以帮助

于 2017-06-23T00:15:05.550 回答
3

您可以使用要执行此操作的本地化字符串集构建一个子捆绑包,然后使用它NSLocalizedStringFromTableInBundle()来加载它们。(我假设这是与您可能在应用程序上执行的正常 UI 本地化分开的内容。)

于 2009-11-03T19:51:36.577 回答
3

就我而言,我有两个本地化文件 ja 和 en

如果系统中的首选语言既不是 en 也不是 ja,我想强制它为 en

我要编辑 main.m 文件

我会检查第一个首选是 en 还是 ja,如果不是,那么我会将第二个首选语言更改为 en。

int main(int argc, char *argv[])
{

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSString *lang = [[NSLocale preferredLanguages] objectAtIndex:0];

    if (![lang isEqualToString:@"en"]  &&  ![lang isEqualToString:@"ja"]){

        NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[NSLocale preferredLanguages]];
        [array replaceObjectAtIndex:1 withObject:@"en"];

        [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];


    }

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));


    }


}
于 2014-04-02T08:40:51.467 回答
2

你可以这样做:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"es"];


NSBundle *spanishBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];

NSLocalizedStringFromTableInBundle(@"House", nil, spanishBundle, nil):
于 2014-11-17T20:59:51.180 回答
2

这是解决此问题的一个不错的解决方案,并且不需要重新启动应用程序。

https://github.com/cmaftuleac/BundleLocalization

这个实现通过在 NSBundle 内部进行调整来工作。这个想法是你覆盖 NSBundle 对象实例上的方法本地化StringForKey,然后在不同的包上用不同的语言调用这个方法。简洁优雅完全兼容各类资源。

于 2015-04-16T19:24:15.770 回答
2

基于Tudorizer 在不离开或重新启动应用程序的情况下更改语言的答案。

代替宏,使用类来访问首选语言,以检查是否存在特定语言代码。

下面是一个用于获取适用于 iOS 9 的当前语言包的类:

@implementation OSLocalization

+ (NSBundle *)currentLanguageBundle
{
    // Default language incase an unsupported language is found
    NSString *language = @"en";

    if ([NSLocale preferredLanguages].count) {
        // Check first object to be of type "en","es" etc
        // Codes seen by my eyes: "en-US","en","es-US","es" etc

        NSString *letterCode = [[NSLocale preferredLanguages] objectAtIndex:0];

        if ([letterCode rangeOfString:@"en"].location != NSNotFound) {
            // English
            language = @"en";
        } else if ([letterCode rangeOfString:@"es"].location != NSNotFound) {
            // Spanish
            language = @"es";
        } else if ([letterCode rangeOfString:@"fr"].location != NSNotFound) {
            // French
            language = @"fr";
        } // Add more if needed
    }

    return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
}

/// Check if preferred language is English
+ (BOOL)isCurrentLanguageEnglish
{
    if (![NSLocale preferredLanguages].count) {
        // Just incase check for no items in array
        return YES;
    }

    if ([[[NSLocale preferredLanguages] objectAtIndex:0] rangeOfString:@"en"].location == NSNotFound) {
        // No letter code for english found
        return NO;
    } else {
        // Tis English
        return YES;
    }
}

/*  Swap language between English & Spanish
 *  Could send a string argument to directly pass the new language
 */
+ (void)changeCurrentLanguage
{
    if ([self isCurrentLanguageEnglish]) {
        [[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"];
    } else {
        [[NSUserDefaults standardUserDefaults] setObject:@[@"en"] forKey:@"AppleLanguages"];
    }
}
@end

使用上面的类来引用一个字符串文件/图像/视频/等:

// Access a localized image
[[OSLocalization currentLanguageBundle] pathForResource:@"my_image_name.png" ofType:nil]
// Access  a localized string from Localizable.strings file
NSLocalizedStringFromTableInBundle(@"StringKey", nil, [OSLocalization currentLanguageBundle], @"comment")

像下面这样在线更改语言或更新上面类中的“changeCurrentLanguage”方法以获取引用新语言的字符串参数。

[[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"];
于 2015-10-28T21:40:08.313 回答
1

此函数将尝试获取当前语言的本地化字符串,如果找不到,它将使用英语获取它。

- (NSString*)L:(NSString*)key
{
    static NSString* valueNotFound = @"VALUE_NOT_FOUND";
    static NSBundle* enBundle = nil;

    NSString* pl = [NSLocale preferredLanguages][0];
    NSString* bp = [[NSBundle mainBundle] pathForResource:pl ofType:@"lproj"];
    NSBundle* b = [NSBundle bundleWithPath:bp];

    NSString* s = [b localizedStringForKey:key value:valueNotFound table:nil];
    if ( [s isEqualToString:valueNotFound] ) {
        if ( !enBundle ) {
            bp = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
            enBundle = [NSBundle bundleWithPath:bp];
        }
        s = [enBundle localizedStringForKey:key value:key table:nil];
    }

    return s;
}
于 2013-06-17T08:41:07.140 回答
1

我想添加对 iOS 未正式支持的语言的支持(未在系统设置下的语言部分列出)。通过遵循Apple 的国际化教程和 Brian Webster 和 geon 的一些提示,我想出了这段代码(放在 main.m 中):

int main(int argc, char * argv[]) {
    @autoreleasepool {
        // Grab regional settings locale, for Slovenian this is either sl_SI or en_SI
        NSLocale *locale = [NSLocale currentLocale];
        NSString *ll = [locale localeIdentifier]; // sl_SI

        // Grab the first part of language identifier
        NSArray *comp = [ll componentsSeparatedByString:@"_"];
        NSString *ll1 = @"en";
        if (comp.count > 0) {
            ll1 = comp[0]; // sl, en, ...
        }
        // Check if we already saved language (user can manually change it inside app for example)
        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"]) {
            //   Slovenian (Slovenia),            Slovenia
            if ([ll isEqualToString:@"sl_SI"] || [ll isEqualToString:@"en_SI"]) {
                ll1 = @"sl-SI"; // This is the part of localized path for Slovenian language that Xcode generates
            }
            // Add more unsupported languages here...

            [[NSUserDefaults standardUserDefaults] setObject:ll1 forKey:@"SelectedLanguage"]; // Save language
        }
        else {
            // Restore language as we have previously saved it
            ll1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"];
        }
        // Overwrite NSLocalizedString and StoryBoard language preference
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:ll1, @"en", @"fr", nil] forKey:@"AppleLanguages"];
        // Make sure settings are stored to disk
        [[NSUserDefaults standardUserDefaults] synchronize];

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

这适用于 Storyboard 和 NSLocalizedString 代码。该代码假定用户稍后可以选择在应用程序内手动更改语言。

当然,不要忘记添加适当的 Storyboard 翻译和 Localizable.strings 翻译(有关如何执行此操作,请参阅上面的 Apple 页面链接)。

于 2013-10-09T19:23:34.873 回答
0

无论你们做什么,最好的方法是使用指定语言的 short_name,即:fr、en、nl、de、it 等......并将其分配给全局值。

使选择器视图像下拉菜单一样弹出(单击时从下方显示选择器视图的按钮与语言列表的组合)并选择您想要的语言。让短名称存储在内部。制作一个名为 LocalisedString 的 .h + .m 文件。

Set the global value of short_name to be equal to the obtained value in LocalisedString.m When the required language is selected assign the NSBundlePath to create project sub-directories for the needed language. 例如,nl.proj、en.proj。

选择特定的Proj文件夹时,调用各个语言的本地化字符串并动态更改语言。

没有违反规则。

于 2011-08-12T11:17:35.487 回答
0

对于 Swift,您可以main.swift在应用程序运行之前覆盖该文件并在那里设置 UserDefaults 字符串。这样您不必重新启动应用程序即可看到所需的效果。

import Foundation
import UIKit

// Your initialisation code here
let langCultureCode: String = "LANGUAGE_CODE"

UserDefaults.standard.set([langCultureCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

@UIApplicationMain与您的AppDelegate.swift文件中的删除配对。

于 2019-07-01T11:00:52.770 回答
0

对我来说,测试计划用户,在测试计划中指定-AppleLanguages (en_BZ)(伯利兹英语)Arguments Passed On Launch是有效的。

由于我们使用 en_GB 和 en_BZ,iOS 总是首选 en_GB。即便如此,当我将设备语言切换为 EN 并将区域切换为 BZ 以及在测试计划Application LanguageApplication Region设置中设置这些值时。除了上面好的旧论点方法外,没有任何帮助:)

在此处输入图像描述

于 2021-08-09T13:28:02.423 回答