عملية Java I18N النموذجية - إرسال ملفات الموارد إلى شركات الترجمة لترجمتها

StackOverflow https://stackoverflow.com/questions/3721882

سؤال

هناك الكثير من البرامج التعليمية حول استخدام Java ResourceBundles لتوفير واجهة المستخدم بلغات متعددة. ومع ذلك ، هناك أ معالجة سؤال فيما يتعلق بالتفاعل النموذجي مع شركات الترجمة التي لا يمكنني العثور على إجابة عليها.

على سبيل المثال ، على سبيل المثال ، لا أعرف الفرنسية ، وأحتاج إلى توظيف شركة ترجمة للحصول على ترجمات لتطبيقي ، هل سأرسلها

  1. ملف خصائص الموارد الافتراضية "anhay_en_us.properties" بما في ذلك القيمة المفتاح والإنجليزية ، واستعادوا "anhay_fr_fr.properties"؟
  2. "anhay_fr_fr.properties" مع قيم فارغة و "anhay_en_us.properties" كمرجع؟
  3. مزيج آخر؟
هل كانت مفيدة؟

المحلول

نظرًا لأن سؤالك يدور حول عملية وليس عن التكنولوجيا ، سأحاول تقديم شرح شامل لك. على افتراض أن لديك تطبيقًا بدون ترجمة سابقة ، يجب أن تبدو العملية المثالية:

  1. إرسال الملفات الإنجليزية للترجمة. اعتمادًا على اتفاقك مع مقاول الترجمة ، يمكنك استخدامه:

    • ملفات الخصائص الافتراضية الخاصة بك (ستكون مسؤولاً عن إعادة تسميتها بشكل صحيح)
    • جدول بيانات التميز الذي يحتوي على مفاتيح وعبارة إنجليزية وعمود فارغ للترجمة
    • ملف (ملفات) getText *. po إذا كنت ستستخدم getText
    • ملفات (ملفات) ذاكرة الترجمة (أي ملفات Trados *.tmx)
  2. عندما تتلقى الملفات مرة أخرى ، يمكنك وضع هذه الترجمات في المنتج ، وإنشاء إنشاء محلي واختباره. بالتأكيد ، ستكون هناك بعض مشكلات واجهة المستخدم. بعضها يمكنك إصلاحه بمفردك ، سيحتاج البعض إلى ترجمة إضافية (مثل السلاسل المتشددين) ، وسيحتاج آخرون إلى تقصير الترجمة. مرة أخرى ، سوف تشارك مقاول الترجمة وتزويدهم بسلاسل تحتاج إلى ترجمة (إعادة). يمكنك استخدام جدول البيانات هنا (شريطة ألا يكون هناك الكثير من السلاسل التي تحتاج إلى ترجمة).

  3. إذا كنت ترغب في الشحن في وقت واحد (جميع اللغات في وقت واحد) ، فأنت بحاجة إلى إشراك المترجمين في وقت مبكر. نظرًا لأن سلاسل واجهة المستخدم ستتغير (شريطة ألا تكون هناك فترة عصيدة من التجربة أو فترة تجميد الترجمة) ، فسيتعين عليك تحديث ترجماتك. في هذه الحالة ، ستحتاج إلى توفير الملفات المترجمة بالفعل بالسلاسل التي تحتاج إلى ترجمة (باللغة الإنجليزية). إذا كانت التغييرات صغيرة حقًا ، فيمكنك إرسال الأوتار الإنجليزية فقط ودمج الترجمات يدويًا ، وإلا فمن الأفضل استخدام نوع من تنسيق تبادل ذاكرة الترجمة (GetText *.PO's أو Trados *.tmx's رائعة هنا).

  4. ترجمة الملفات عادة لا يكفي. نظرًا لعدم وجود سياق معطى ، قد تعني الكلمات المختلفة أشياء مختلفة بلغة مستهدفة ، تحدث أخطاء الترجمة. لا توجد طريقة لمعرفة أنهم في ما لم تعرف اللغة. لهذا السبب تحتاج إلى أخذ لقطات شاشة واجهة المستخدم وإرسالها للمراجعة (يمكن مراجعتها من قبل مقاول الترجمة الخاص بك ، أو أي شخص آخر اعتمادًا على متطلبات الجودة).

  5. بمجرد المراجعة ، ستحتاج إلى تطبيق تغييرات الترجمة واختبار مشكلات واجهة المستخدم ...

هذا عن ذلك ، إذا كنا نتحدث عن عملية ترجمة سلاسل واجهة المستخدم. ولكن يرجى العلم أن هناك الكثير لتوطين التطبيق بشكل صحيح (الوثائق ، ملفات المساعدة ، الرموز ، الألوان ، الأصوات ...).

نصائح أخرى

للإجابة على سؤالك ، كنت اخترت (2).

في الممارسة العملية ، وجدت أنه من الأسهل بالنسبة لي استخدام شيء آخر بدلاً من حزم موارد Java.

أنا شخصياً أستخدم طريقة مختلفة للتعامل مع هذا. أستخدم طريقة getText (يوجد ملف يسمى getTextResource.java الذي يجب عليك استخدامه في تطبيقك للاستفادة من امتدادات getText - انظر هنا).

إذا أنت على دراية بـ GetText ستجد بالتأكيد هذا النهج أسهل وعمليًا. أنت ببساطة تعطي لمترجمي ملفات PO الخاصة بك (والتي يمكن تحريرها بها Poedit). من ملفات PO ، تقوم بإنشاء فئة Java التي ستستخدمها داخل التطبيق الخاص بك (يتم ذلك باستخدام MSGFMT - تحديد المعلمات لتجميع Java لملفات PO). يمكن تحديث ملفات PO بسهولة إلى حد ما باستخدام أمر XgetText (من سطر الأوامر).

بالطبع كل شيء داخل دليل getText.

مزايا:

  • يوفر لك GetText طريقة لتحديد نموذج الجمع [لا توجد رسائل مثل: "ملفات (ملفات) n محذوفة" (حيث N عبارة عن رقم) - انظر ngettext.

  • طريقة قابلة للنص لترجمة السلاسل بمجرد تحديث ملفات Java الخاصة بك برصيد جديد

  • لا حاجة للوصول إلى كل سلسلة باستخدام بعض وحدات الماكرو (مثل الترجمة (delete_button_macro)). أنت فقط تكتب رمزك مثل هذا:

    package translateutil;        
    import gnu.gettext.GettextResource;
    
    import java.util.ResourceBundle;
    
    import java.util.Locale;
    
    public class TranslateUtil
    {
    private static ResourceBundle myResources =null;
    
    public static boolean init(Locale loc, String resourceName)
    {
        boolean bRet = true;
        Locale.setDefault(loc);
    
        try
        {
            myResources = ResourceBundle.getBundle(resourceName);
    
            System.out.printf(  _("Current language: %s\n"),
                                Locale.getDefault().getDisplayName() );
    
            System.out.printf(  _("%s resource found\n"),
                                myResources.getClass().getName() );
        }
        catch(Exception e)
        {
            // let the application go on in English in case the ResourceBundle
            // was not found. Notify about the error
            bRet = false;
            System.out.println( e.toString() );
            myResources = null;
        }
    
        return bRet;
    }
    
    
    public static String _(String str)
    {
        if (myResources == null)
        {
            return str;
        }
        {
            return GettextResource.gettext(myResources, str);
        }
    }
    
    public static String _Plural(String singular, String plural, long param)
    {
        if (myResources == null)
        {
            if (param == 1)
            {
                return singular;
            }
            else
            {
                return plural;
            }
        }
        else
        {
            return GettextResource.ngettext(myResources, singular, plural, param);
        }
    }
    }
    

هنا عينة

    // example
    // similar for plural

    import static translateutil.TranslateUtil._;

    System.out.println(_("The english text"));

بغض النظر عن ما تختاره هو: حظا سعيدا!

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