12

エストニア語、ラトビア語、リトアニア語をサポートする既存の iPhone アプリ (4.x 以降) を拡張しています。

私の iPhone とシミュレーターではこれらの言語はサポートされておらず、これらの地域で使用するための特別なファームウェアも存在しないと確信しています。

それらをサポートするアプリを作成するにはどうすればよいですか?

私はあまり好きではない2つの解決策を思いつきました。ユーザーは Settings.app リストからバンドルされた言語を選択できないため、どちらもアプリに複数の言語を含めることはできません。つまり、言語ごとに 1 つのバージョンを提出する必要があります。

オプション 1: en.lproj ディレクトリを悪用する

ターゲット言語 (lt、lv、et) ごとに、その言語の文字列ファイルを en.lproj ディレクトリに配置しました。

長所:よく知られたメカニズムを使用します。アプリは、英語で実行されていると考えています。

短所:ローカリゼーション ツールに大混乱をもたらします。将来のメンテナを混乱させるため、エラーが発生しやすくなります。奇妙なビルド設定が必要です。

オプション 2: NSUserDefaults[AppleLanguages] を悪用する

NSUserDefaultsのAppleLanguagesオブジェクトには、アプリが使用する言語のリストが含まれています。このように設定することで、たとえばリトアニア語を lt.lproj ディレクトリからアプリにロードさせることができます。

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"lt", nil] forKey:@"AppleLanguages"];

(歴史的な理由から、アプリの一部のバージョンで非推奨の翻訳を削除するために、これのもう少し複雑なバージョンを既に実行しています。そうしないと、アプリにバンドルしなくなったとしても、古いインストールが lproj dir を取得します。)

長所:適切な名前の lproj ディレクトリを使用します。ローカリゼーション ツールとの統合が良好です。シンプルなセットアップ。main.m実装に必要なのは 1 行だけです。

短所:キーは多くの人に使用されていAppleLanguagesますが、このソリューションではサポートされていない言語をロードするためにキーが使用されているため、薄い氷の上を滑っているのではないかと心配しています。

ル・クエスチョンズ

  • 他のアプリは通常、これらの「サポートされていない」言語をどのようにサポートしていますか?
  • 通常サポートされている言語と一緒にそれらをサポートする方法はありますか?
  • AppleLanguagesハッキングについてどう思いますか?
4

1 に答える 1

9

アプリ内に言語設定を追加してから、このコードを使用してみませんか(クライアントからの要求に応じて、ユーザーがアプリ内で言語を切り替えることができるプロジェクトで使用します)。

基本的にNSLocalizedStringを上書きし、同じファイル構造(en.lprojなど)を使用して、「apple-way」を使用するときに使用するのと同じ言語ファイルを保持します。

試してみる!

.hファイル

#import <Foundation/Foundation.h>

//#undef NSLocalizedString

#define ___(key) \
[[I7I18N sharedInstance] localizedStringForKey:(key)]

#undef NSLocalizedString
#define NSLocalizedString(key,value) \
[[I7I18N sharedInstance] localizedStringForKey:(key)]

@interface I7I18N : NSObject

@property (nonatomic, retain) NSMutableDictionary *i18nTable;
+ (I7I18N *)sharedInstance;
- (NSString *)localizedStringForKey:(NSString *)key;
- (void)setLocale:(NSString *)lProjFile;

@end

.mファイル

#import "I7I18N.h"

static I7I18N *sharedInstance;

@implementation I7I18N
@synthesize i18nTable=_i18nTable;

+ (I7I18N *)sharedInstance {
    if(!sharedInstance) {
        sharedInstance = [[I7I18N alloc] init];
    }

    return sharedInstance;
}

- (id)init
{
    self = [super init];
    if (self) {
        self.i18nTable = [NSMutableDictionary dictionary];

        NSArray *validLocalizations = [[NSBundle mainBundle] localizations];
        [self setLocale:[validLocalizations objectAtIndex:0]];
    }
    return self;
}

- (void)setLocale:(NSString *)lProjFile {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable.strings" ofType:@"" inDirectory:[NSString stringWithFormat:@"%@.lproj",lProjFile]];
    self.i18nTable = [NSDictionary dictionaryWithContentsOfFile:path];
}

- (NSString *)localizedStringForKey:(NSString *)key {
    NSString *possibleI18NString = [self.i18nTable objectForKey:key];
    if(!possibleI18NString) {
        return key;
    }
    return possibleI18NString;

}

@end

更新1:NSLocalizedStringすべてのビュー(言語をで切り替える場合の すべての依存関係)を構築することを忘れないでください[[I7I18N sharedInstance] setLocale:@"yourlang.lproj"]

于 2012-04-21T19:44:22.210 に答える