2

私は ios プラットフォームでプロジェクトを構築しており、このアプリケーションで 2 つの言語を使用したいと考えています。ユーザーは実行時に言語を変更できます。たとえば、英語用のボタン 1 とドイツ語用のボタン 2 の 2 つの言語ボタンを使用でき、ユーザーはこれらのボタンを使用していつでもアプリケーションの言語を変更できるとします。ヘルプやチュートリアル

前もって感謝します

4

7 に答える 7

3

そのメソッドを持つクラス「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]

魅力的に機能し、実行時に現在の言語を再定義できます。

ビューは自分で更新する必要があることに注意してください。自動的にそれを行うわけではありません。

于 2013-08-05T10:57:17.613 に答える
2

を使用できるようにするソリューションを思いつきましたNSLocalizedStringNSBundlecallのカテゴリを作成します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再定義した警告です。おそらく、誰かがこの部分を修正するのを手伝ってくれるでしょう。

于 2014-05-01T18:28:57.450 に答える
1

ここにデモチュートリアルがあります

https://github.com/object2dot0/Advance-Localization-in-ios-apps

取り除くだけ

 [self dealloc];

から

 -(IBAction) languageSelection:(id)sender

だからクラッシュしません!!! 楽しい!

于 2013-08-05T10:46:13.333 に答える
0

これにはローカリゼーションを使用する必要があります。キーと値を localizable.string 側に保存し、必要に応じて適切な .string ファイルをロードするだけです。これについては、次のチュートリアルを参照できます: http://www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial

于 2013-04-16T08:41:31.870 に答える
0

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

また

http://www.ibabbleon.com/iOS-Language-Codes-ISO-639.html

于 2015-10-29T06:25:56.187 に答える