Как вынудить NSLocalizedString использовать определенный язык

Адресная арифметика с указателями.

программисты на C++ предпочитают избегать указателей из-за ошибок, которые могут быть представлены.

самый прохладный C++ я когда-либо видел хотя? Аналоговые литералы.

261
задан TheNeil 8 May 2019 в 17:18
поделиться

4 ответа

NSLocalizedString() (and variants thereof) access the "AppleLanguages" key in NSUserDefaults to determine what the user's settings for preferred languages are. This returns an array of language codes, with the first one being the one set by the user for their phone, and the subsequent ones used as fallbacks if a resource is not available in the preferred language. (on the desktop, the user can specify multiple languages with a custom ordering in System Preferences)

You can override the global setting for your own application if you wish by using the setObject:forKey: method to set your own language list. This will take precedence over the globally set value and be returned to any code in your application that is performing localization. The code for this would look something like:

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

This would make German the preferred language for your application, with English and French as fallbacks. You would want to call this sometime early in your application's startup. You can read more about language/locale preferences here: Internationalization Programming Topics: Getting the Current Language and Locale

259
ответ дан 23 November 2019 в 02:34
поделиться

Вы можете создать подгруппу с набором локализованных строк, с которыми вы хотите это сделать, а затем используйте NSLocalizedStringFromTableInBundle () для их загрузки. (Я предполагаю, что это контент, отдельный от обычной локализации пользовательского интерфейса, которую вы, возможно, делаете в приложении.)

3
ответ дан 23 November 2019 в 02:34
поделиться

Обычно я делаю это таким образом, но в вашем проекте ДОЛЖНЫ быть все файлы локализации.

@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
137
ответ дан 23 November 2019 в 02:34
поделиться

Как было сказано ранее, просто выполните:

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

Но чтобы избежать перезапуска приложения, поместите строку в основной метод main.m непосредственно перед UIApplicationMain ( ...).

32
ответ дан 23 November 2019 в 02:34
поделиться