سؤال

لدي مشروع XCode ، مع ملفات واجهة XIB التي تم تصميمها باستخدام Builder Interface. أنا أقوم ببناء ملفات XIB المترجمة باستخدام ibtool لاستخراج السلاسل وترجمتها واستخدامها ibtool مرة أخرى لبناء ملفات XIB الموضعية.

ومع ذلك ، فإن القيام بذلك يعني أنه يتعين عليّ ترجمة جميع العناصر في قوائم التطبيق ، بما في ذلك تلك القياسية تمامًا (ملف ، حفظ ، فتح ، تقليل ، إلخ). هل هناك طريقة لتجنب ذلك؟

هل كانت مفيدة؟

المحلول 2

لذلك ، على ما يبدو لا توجد طريقة للتغلب على هذا.

نصائح أخرى

لقد طورت حلًا لهذه المشكلة.

https://www.corecode.io/index_opensource.html

ابحث عن "مترجم" ، فسيتم ترجمة ملف MainMenu.Strings إلى عشرات اللغات مع ترجمات Apple القياسية لسلاسل عنصر القائمة القياسية.

إذا وجدت بعض الأوتار أو اللغات المفقودة التي تضمنتها Aapple في تطبيقاتها الأساسية ، فيرجى إرسال تصحيح.

لقد كنت أبحث عن حل مشابه لفترة من الوقت ووجدت هذا المورد

http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/

يقتبس في نهاية المقال:

سوف يبحث ibtool من خلال mainmenu.xib لكل سلسلة مرئية للمستخدم وإدراج تلك السلسلة مع كائن مرتبط في mainmenu.strings ، وهو في الأساس قاموس الأوتار الذي يرتبط به ObjectId. والأفضل من ذلك ، أن الأداة تصفها بواسطة ObjectId ، لذلك فإن ملفات. يمكنني بسهولة رؤية ما تتم إضافته أو إزالته أو تغييره للتو. اسمحوا لي أن أكرر هذا لأنه مفيد للغاية:. بالطبع ، ملفات .strings هذه أحادية ، لذلك فهي غير قابلة للاستمتاع. فيما يلي مثال على الإخراج لسلسلة:

المضي قدما وألقي نظرة وآمل حقًا أن يساعدك ذلك بقدر ما ساعدني!

مترجم بواسطة https://github.com/core-code/miscapps/blob/master/translator/translator/mainmenutranslations.plistرائع ولكن إذا كنت لا ترغب في التعامل مع 30 ملفات MainMenu.String في بنيتك (أنا شخصياً لا) - يمكنك فقط إضافة التشكيلات الرئيسية. هذه:

- (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)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top