1

.strings現在、英語、フランス語、ドイツ語の3 つのファイルがあります。

設定セクションにがあり、選択したセグメントに応じて使用するUISegmentedControlデフォルト ファイルを変更したいと考えています。.strings

ここに画像の説明を入力

ローカリゼーションは、テスト時にアプリケーションの外部で既に機能しており、選択したセグメントに応じて個々のオブジェクトをローカライズすることさえできました (フランスを選択すると、下のラベル テキストが「南」から「南」に変わり、次に英語が再選択された場合は、もう一度戻ってください) これを使用して:

if(German segment) {
   NSString *path= [[NSBundle mainBundle] pathForResource:@"de" ofType:@"lproj"];
   NSBundle* languageBundle = [NSBundle bundleWithPath:path];

    // Returns german version of localised string as label text.
    self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil]; 

    // I would like to set the default .strings file to 'de' here.
}

else if(French segment) {
   NSString *path= [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
   NSBundle* languageBundle = [NSBundle bundleWithPath:path];

   // Returns french version of localised string as label text
   self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil]; 

   // I would like to set the default .strings file to 'fr' here
}

else if(British segment) {
   NSString *path= [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
   NSBundle* languageBundle = [NSBundle bundleWithPath:path];

    // Returns english version of localised string as label text
    self.defaultName.titleLabel.text = [languageBundle localizedStringForKey:@"PREF_WEATHER_NORTH" value:@"" table:nil]; 

    // I would like to set the default .strings file to 'en' here.
}

さて、ボタンのクリックで個々の文字列がローカライズされているので、各ファイルのすべての文字列を一度にローカライズできるかどうか疑問に思ってい.stringsました (そのため、使用されるデフォルトの .strings をどのセグメントに応じて変更していますか?選択されている) または少なくとも許容可能な量のコードでできるだけ多くをターゲットにします。

明らかに、現時点ではそれらを 1 つずつ入力できますが、アプリケーションで使用されるローカライズされた文字列の量が多いため、実際にはそれはオプションではありません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

このローカリゼーション アプローチを LocalizationSystem クラスにラップできます。

@interface PLLocalizationSystem : NSObject

@property (strong, nonatomic) NSString *language;

+ (PLLocalizationSystem *) sharedLocalizationSystem;
- (NSString *) localizedStringForKey:(NSString *)key value:(NSString *)comment;

@end

@implementation PLLocalizationSystem {
    NSBundle *_bundle;
}


- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment {
    return [_bundle localizedStringForKey:key value:comment table:nil];
}

- (void)setLanguage:(NSString *)newLanguage {
    ...
    NSString *path = [[NSBundle mainBundle] pathForResource:newLanguage ofType:@"lproj"];
    if (path) {
        _bundle = [NSBundle bundleWithPath:path];
        _language = newLanguage;
    } else {
        [self resetLocalization];
    }
    ...
    [[NSNotificationCenter defaultCenter] postNotificationName:kLocalizationChangedNotification object:nil];
}

そして、より簡単なアクセスのためにいくつかの定義を行います (LocalizationSystem ヘッダー ファイルで定義します)。

#define PLLocalizedString(key, comment) \
[[PLLocalizationSystem sharedLocalizationSystem] localizedStringForKey:(key) value:(comment)]

#define PLLocalizationSetLanguage(language) \
[[PLLocalizationSystem sharedLocalizationSystem] setLanguage:(language)]

#define PLLocalizationGetLanguage \
[[PLLocalizationSystem sharedLocalizationSystem] language]

また、このファイルを AppName-Prefix.pch ファイルからインポートして、どこからでもアクセスできます。

次に、コントローラーでローカライズの変更を観察し、適切なメソッドを呼び出すことができます。

したがって、今のところ、NSLocalizedString と同じように使用できます。

PS私はここにすべての実装を書いているわけではありませんが、誰かが望むなら、後でgithubで共有するかもしれません

アップデート。使用例。

たとえば、動的にローカライズしたい UIViewController があります。

@implementation MyCustomViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   //first of all - register for localization changes
   //i made for this purposes category for UIViewController(localizable)
   [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(localize)
                                                name:kLocalizationChangedNotification
                                              object:nil];
}

//here you should apply all localization
- (void)localize {
    [self setTitle:PLLocalizedString(@"myTitle", nil);
    [label setText:PLLocalizedString(@"labelTitle", nil)];
    ....
}

@end

また、環境設定で、言語を変更するときに PLLocalizationSetLanguage(language) を呼び出すと、このイベントに登録されているすべてのコントローラーが自動的にローカライズされます。もちろん、このアプローチでは、すべてのローカリゼーションがlocalizeメソッドに適用される必要があります。

また、コントローラーの割り当てが解除またはアンロードされたときにオブザーバーを削除することを忘れないでください

于 2013-02-15T10:37:50.493 に答える
0

読むことができます: NSLocalizedString に特定の言語を強制的に使用させる方法http://aggressive-mediocrity.blogspot.nl/2010/03/custom-localization-system-for-your.htmlを読んで、それを行う方法を確認してください ( 2番目のものは、あなたが望むものにより適しています)。

しかし、これを読んでください(これも2番目のリンクから):

一般に、アプリケーション内から (AppleLanguages pref キーを使用して) iOS システム言語を変更しないでください。これは、設定アプリで言語を切り替えるための基本的な iOS ユーザー モデルに反するものであり、文書化されていない設定キーも使用しているため、将来のある時点でキー名が変更される可能性があり、アプリケーションが破損する可能性があります。

アプリケーションで言語を切り替えたい場合は、バンドルにリソース ファイルを手動でロードすることで行うことができます。この目的で NSBundle:pathForResource:ofType:inDirectory:forLocalization: を使用できますが、アプリケーションはローカライズされたデータのすべてのロードを担当することに注意してください。

于 2013-02-15T10:12:11.130 に答える