私は ios プラットフォームでプロジェクトを構築しており、このアプリケーションで 2 つの言語を使用したいと考えています。ユーザーは実行時に言語を変更できます。たとえば、英語用のボタン 1 とドイツ語用のボタン 2 の 2 つの言語ボタンを使用でき、ユーザーはこれらのボタンを使用していつでもアプリケーションの言語を変更できるとします。ヘルプやチュートリアル
前もって感謝します
私は ios プラットフォームでプロジェクトを構築しており、このアプリケーションで 2 つの言語を使用したいと考えています。ユーザーは実行時に言語を変更できます。たとえば、英語用のボタン 1 とドイツ語用のボタン 2 の 2 つの言語ボタンを使用でき、ユーザーはこれらのボタンを使用していつでもアプリケーションの言語を変更できるとします。ヘルプやチュートリアル
前もって感謝します
そのメソッドを持つクラス「LanguageUtils」を持っています:
- (NSString *) localizedString:(NSString *)key
{
if (self.currentLanguage == nil) {
self.currentLanguage = @"en";
}
NSString* path = [[NSBundle mainBundle] pathForResource:[self.currentLanguage lowercaseString] ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
return [languageBundle localizedStringForKey:key value:@"" table:nil];
}
そしてプロパティ NSString currentLanguage.
次に、.pch で次のようにします。
#undef NSLocalizedString
#define NSLocalizedString(key, _comment) [[Language sharedInstance] localizedString:key]
魅力的に機能し、実行時に現在の言語を再定義できます。
ビューは自分で更新する必要があることに注意してください。自動的にそれを行うわけではありません。
を使用できるようにするソリューションを思いつきましたNSLocalizedString
。NSBundle
callのカテゴリを作成します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
。
ご覧のとおり、languageCode を のプロパティに保存しますAppDelegate
。これは、好きな場所に保存できます。
私が気に入らない唯一のことは、マルコがNSLocalizedString
再定義した警告です。おそらく、誰かがこの部分を修正するのを手伝ってくれるでしょう。
ここにデモチュートリアルがあります
https://github.com/object2dot0/Advance-Localization-in-ios-apps
取り除くだけ
[self dealloc];
から
-(IBAction) languageSelection:(id)sender
だからクラッシュしません!!! 楽しい!
これにはローカリゼーションを使用する必要があります。キーと値を localizable.string 側に保存し、必要に応じて適切な .string ファイルをロードするだけです。これについては、次のチュートリアルを参照できます: http://www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial
SWIFT 2.0 バージョン 次のように、Swift 2.0 でアプリを再起動せずに実行時にこれを行うことができます。
クラス内に関数を作成します。LanguageManager がクラスの名前であるとしましょう
class LanguageManager
{
static let sharedInstance = LanguageManager()
//Make a function for Localization. Language Code is the one which we will be deciding on button click.
func LocalizedLanguage(key:String,languageCode:String)->String{
//Make sure you have Localizable bundles for specific languages.
var path = NSBundle.mainBundle().pathForResource(languageCode, ofType: "lproj")
//Check if the path is nil, make it as "" (empty path)
path = (path != nil ? path:"")
let languageBundle:NSBundle!
if(NSFileManager.defaultManager().fileExistsAtPath(path!)){
languageBundle = NSBundle(path: path!)
return languageBundle!.localizedStringForKey(key, value: "", table: nil)
}else{
// If path not found, make English as default
path = NSBundle.mainBundle().pathForResource("en", ofType: "lproj")
languageBundle = NSBundle(path: path!)
return languageBundle!.localizedStringForKey(key, value: "", table: nil)
}
}
}
これを使用する方法。
ここで、アプリケーションに 2 つの言語 (英語とスペイン語) があるとします。
英語 - en
スペイン語 - es
ラベルに何かを配置する必要があるとします
//LOGIN_LABEL_KEY is the one that you will define in Localizable.strings for Login label text
logInLabel.text = LanguageManager.sharedInstance.LocalizedLanguage("LOGIN_LABEL_KEY", languageCode: "es")
//This will use the Spanish version of the text.
//"es" is the language code which I have hardcoded here. We can use a variable or some stored value in UserDefaults which will change on Button Click and will be passed in loginLabel
言語コードの詳細については、以下のリンクを参照して
ください https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html
また