Xcode 5で言語を変更する方法
ChangeLanguageViewController
に3つのボタンがあります
これは:
ここにコードがあります:
#import <UIKit/UIKit.h>
@interface ChangeLanguageViewController :UIViewController
-(IBAction)changeEnglish:(id)sender;
-(IBAction)changeChinesesimplified:(id)sender;
-(IBAction)changeBahasaMalaysia:(id)sender;
-(IBAction)changeEnglish:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"en", @"zh-Hans", @"ms", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeChinesesimplified:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"ms", @"en", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeBahasaMalaysia:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"ms",@"en",@"zh-Hans", nil] forKey:@"AppleLanguage"];
}
ユーザーがボタンを押したときに言語が変化するのを確認したいのですが、アプリケーションが強制終了されることはありませんが、内部のアプリの言語が変更されます。
通常、Appleがサポートする公式言語をサポートする場合、アプリ内で言語切り替えを提供する理由はありません。プロジェクトで翻訳を適切に設定するだけで、インターフェイス言語がシステムで自動的に切り替わります。しかし、あなたはアプリからそれを望んでいるので、これについていくいくつかの方法があります:
1)次のコードを使用して、特定の言語をアプリのみに強制できます。
_[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
_
このコードをmain.mファイル内の「int main」関数の「return UIApplicationMain」の直前に置くことをお勧めします。ただし、この方法では、アプリを強制終了するか、アプリを再起動して有効にする必要があります。
ユーザーにexit(0)
を使用して強制的にアプリを終了させなくてもアプリを強制終了できますが、ユーザーがUIAlertView
または同様のもの、またはAppleアプリを拒否する可能性があります。
2)代替案は、独自のローカリゼーションロジックを実装することで、独自の言語ファイルから翻訳を取得するだけです。 1つの方法 この例です は、公式のlprojファイルから翻訳を取得します。この方法では、再起動せずにオンザフライで言語を変更できますが、コードからすべてのラベルテキストを手動でロードする必要があります。翻訳を変更すると、画面上のテキストを再入力する必要があります。
アプリを再起動せずにこれを行うことはできません。したがって、選択した言語をNSUserDefaults
に保存し、main.h
に以下の行を入力した後、アプリを再起動する必要があります。
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: your_lang, nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
編集:Swift 3。
このヘルパークラスを要件に使用します。
class LanguageManager: NSObject {
var availableLocales = [CustomLocale]()
static let sharedInstance = LanguageManager()
var lprojBasePath = String()
override fileprivate init() {
super.init()
let english = CustomLocale(languageCode: GlobalConstants.englishCode, countryCode: "gb", name: "United Kingdom")
let finnish = CustomLocale(languageCode: GlobalConstants.finnishLangCode, countryCode: "fi", name: "Finland")
self.availableLocales = [english,finnish]
self.lprojBasePath = getSelectedLocale()
}
fileprivate func getSelectedLocale()->String{
let lang = Locale.preferredLanguages//returns array of preferred languages
let languageComponents: [String : String] = Locale.components(fromIdentifier: lang[0])
if let languageCode: String = languageComponents["kCFLocaleLanguageCodeKey"]{
for customlocale in availableLocales {
if(customlocale.languageCode == languageCode){
return customlocale.languageCode!
}
}
}
return "en"
}
func getCurrentBundle()->Bundle{
if let bundle = Bundle.main.path(forResource: lprojBasePath, ofType: "lproj"){
return Bundle(path: bundle)!
}else{
fatalError("lproj files not found on project directory. /n Hint:Localize your strings file")
}
}
func setLocale(_ langCode:String){
UserDefaults.standard.set([langCode], forKey: "AppleLanguages")//replaces Locale.preferredLanguages
UserDefaults.standard.synchronize()
self.lprojBasePath = getSelectedLocale()
}
}
class CustomLocale: NSObject {
var name:String?
var languageCode:String?
var countryCode:String?
init(languageCode: String,countryCode:String,name: String) {
self.name = name
self.languageCode = languageCode
self.countryCode = countryCode
}
}
github でデモプロジェクトを作成しました。