https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plistによる翻訳者
はクールですが、ビルドで 30 個の MainMenu.string ファイルを処理したくない場合 (私は個人的には't) - MainMenuTranslations.plist をリソースに追加するだけで (圧縮されていない 230KB は小さい)、次のようにオンザフライで実行できます。
- (void) processMenu: (NSString*) app {
NSDictionary* d = [self loadMenuTranslations: app];
NSMenu* mm = NSApplication.sharedApplication.mainMenu;
for (int i = 0; i < mm.numberOfItems; i++) {
NSMenuItem* mi = [mm itemAtIndex: i];
mi.title = [self translateMenu: mi.title withDictionary: d];
NSMenu* sm = [[mm itemAtIndex: i] submenu];
sm.title = [self translateMenu: sm.title withDictionary: d];
for (int j = 0; j < sm.numberOfItems; j++) {
NSMenuItem* mi = [sm itemAtIndex: j];
mi.title = [self translateMenu: mi.title withDictionary: d];
}
}
}
- (NSString*) translateMenu: (NSString*) key withDictionary: (NSDictionary*) dictionary {
for (NSString* lang in dictionary) {
NSDictionary* translation = dictionary[lang];
NSString* t = translation[key];
if (t != null) {
return t;
}
}
return key;
}
- (NSDictionary*) loadMenuTranslations: (NSString*) app {
NSArray* langs = [NSUserDefaults.standardUserDefaults objectForKey: @"AppleLanguages"];
NSURL* url = [NSBundle.mainBundle URLForResource:@"MainMenuTranslations.plist" withExtension: null];
NSMutableDictionary* r = NSMutableDictionary.new;
NSDictionary* translations = [NSDictionary dictionaryWithContentsOfURL: url];
for (NSString* lang in langs) {
NSString* locale = [NSString stringWithFormat:@"%@.lproj", lang];
NSDictionary* translation = translations[locale];
NSMutableDictionary* d = [NSMutableDictionary.alloc initWithCapacity: translations.count * 3 / 2];
for (NSString* k in translation) {
NSString* v = translation[k];
NSString* key = k;
if ([k indexOf: @"APPLICATIONNAME"] >= 0) {
key = [k stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app];
}
if ([v indexOf: @"APPLICATIONNAME"] >= 0) {
v = [v stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app];
}
d[key] = v;
}
if (d.count > 0) {
r[lang] = d;
}
}
return r;
}
から呼び出すだけです
- (void) applicationDidFinishLaunching: (NSNotification*) n {
// ...
[self processMenu: @"<your app name>"];
}
UniversalTranslation.plist がどこかにあるといいのですが (translate.google.com をクリエイティブに使用することで自動的に収集される可能性があります)。