Hi all,
today a simple trick to change the app language, without change phone language.
Add a Settings bundle in your project
Now, open your settings (better if you open it as Source Code):
And add your languages,
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Key</key>
<string>app_language</string>
<key>Title</key>
<string>App Language</string>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>DefaultValue</key>
<string>auto</string>
<key>Titles</key>
<array>
<string>Auto</string>
<string>English</string>
<string>Italian</string>
<string>French</string>
<string>Spanish</string>
<string>German</string>
</array>
<key>Values</key>
<array>
<string>auto</string>
<string>en</string>
<string>it</string>
<string>fr</string>
<string>es</string>
<string>de</string>
</array>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
</plist>[/code]
Build and run, in your device Settings, you should see the option list:
How to use it?
You need to read the app_language key to retrieve the language value at start.
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”][[NSUserDefaults standardUserDefaults] stringForKey:@"app_language"];[/code]
Load different localization string file:
Open your main.m file, and add this method,
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]void configureAppCustomLanguage()
{
NSString *forcedLanguage = [[NSUserDefaults standardUserDefaults] stringForKey:@"app_language"];
NSString *key = @"AppleLanguages";
if ( forcedLanguage && forcedLanguage.length && ![forcedLanguage isEqualToString:@"auto"] )
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSLocale preferredLanguages] forKey:@"PreferredLanguages"];
[defaults setObject:[NSArray arrayWithObject:forcedLanguage] forKey:key];
[defaults synchronize];
}
else
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
forcedLanguage = [defaults valueForKey:key];
if ( forcedLanguage )
{
[defaults removeObjectForKey:key];
}
[defaults synchronize];
}
}[/code]
this method load your app settings language key string and override Apple default.
Next, override your int main() with this one:
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]int main(int argc, char * argv[])
{
@autoreleasepool {
// change language on start!
configureAppCustomLanguage();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}[/code]
Now add your language strings in your project, for example:
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]// Localizable.strings (Italian)
"sample-string-key" = "ITA";
// Localizable.strings (English)
"sample-string-key" = "ENG";
// etc…[/code]
Well, now, your app load string localizations file, based on your language settings, without to change phone language.
Try it!
[code autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]NSLog(@"%@", NSLocalizedString(@"sample-string-key", nil));[/code]
enjoy.