iOS多言語開発


iOS多言語開発


多くの主流appはマルチ言語(またはローカライズ)をサポートしており、システム言語に自動的に適応するものもあれば、ユーザーが修正を選択するものもあります.例えば、微信は以下の言語をサポートしており、システムに応じて適応したり、ユーザーが変更したりすることができます.

多言語ファイルの作成


プロジェクトでcommand + nファイルを作成し、iOS->Resource->Strings Fileファイルを選択し、ファイル名をカスタマイズして作成します.

多言語の追加


新しく作成した多言語ファイルを選択し、右側のサイドバーを展開し、サイドバーでLocalizationの下のLocalize...ボタンをクリックし、Englishを選択し、Localizeをクリックします.
プロジェクトがPROJECTの中にあるLocalizationsを選択し、言語を追加します.
1つ追加するたびに、新しい多言語ファイルの下に.stringsという接尾辞名のファイルが1つ増えます.これが各言語に対応する言語ファイルです.中に格納されている言語文字はkey - value形式で保存され、各ファイルのkeyは同じであり、valueはその言語の下の文字に対応している.例:
中国語簡体字ファイルFile.strings(Chinese(Simplified))に保存されているのは:
"text"="  ,  。";

英語の文書File.strings(English)に保存されているのは:
"text"="hello,world.";
keyの値は一致しており、textvalue対の文字翻訳の各言語である.

てきおうシステムげんご


言語ファイルにアクセスするマクロ定義
#define NSLocalizedString(key, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
        [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
        [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
NSLocalizedStringFromTable(key, tbl, comment)マクロ定義付与値を使用して多言語を表示するコントロールで、keyは多言語ファイルのkey値で、tblは多言語ファイル名で、commentは注釈で、nilを空で記入できます.使用方法は次のとおりです.
_label.text = NSLocalizedStringFromTable(@"text", @"File", nil);

マクロNSLocalizedString(key, comment)を使用することもでき、tblファイル名パラメータがない場合、エンジニアリング内の多言語ファイル名はLocalizableでなければなりません.

手動設定言語


言語ファイルは、エンジニアリング内で.lproj形式で格納されます.例えば、簡体字中国語はzh-Hans.lproj、繁体字中国語はzh-Hant.lproj、英語はen.lprojです.
手動で言語を設定することは、プロジェクトにどのファイルにアクセスさせるかです.appの言語設定を保持するには、次回appを開くか、前回設定した言語環境を開きます.言語設定は好み設定に属し、一般的にNSUserDefaultsで格納される.
環境設定を保存するには
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];//       
[userd synchronize];

言語環境の設定:
NSString *lanType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
NSString *path = [[NSBundle mainBundle] pathForResource:lanType ofType:@"lproj"];
NSString *showValue = [[NSBundle bundleWithPath:path] localizedStringForKey:@"showTxt" value:nil table:@"File"];
_label.text = showValue;

初めてappを開く


デフォルト言語の手動設定


最初にappを開くと、ローカルのUserDefaultsには言語情報が格納されていません.この場合、コードを1つ保存することができ、その後は正常にアクセスできます.didFinishLaunchingWithOptionsで簡単に判断すればいいです.なければ、簡体字中国語を保存します.
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
if (![userd objectForKey:@"appLanguage"]) { 
     [userd setObject:@"zh-Hans" forKey:@"appLanguage"];
     [userd synchronize];
}

システム言語設定の表示


まずシステム環境の言語を取得し、appでサポートされている言語と比較します.appでサポートされている言語に現在のシステム言語がある場合は、その言語が表示され、ない場合はデフォルト言語が表示されます.
システム環境言語の取得:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

具体的な実装:
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
if (![userd objectForKey:@"appLanguage"]) {//          
    NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];//        
    if ([language hasPrefix:@"zh-Hans"]) {//    
        [userd setObject:@"zh-Hans" forKey:@"appLanguage"];//       
    } else if ([language hasPrefix:@"zh-TW"] || [language hasPrefix:@"zh-HK"] || [language hasPrefix:@"zh-Hant"]) {//    ,       
        [userd setObject:@"zh-Hant" forKey:@"appLanguage"];//     
    } else if ([language hasPrefix:@"en"]) {//  
        [userd setObject:@"en" forKey:@"appLanguage"];//     
    }else{//       
        [userd setObject:@"zh-Hans" forKey:@"appLanguage"];//       
    }
}