2010-09-15 14 views
5

Birden çok dilde kullanıcı arabirimi sağlamak için Java ResourceBundles'ı kullanmayla ilgili çok sayıda eğitici var. Bununla birlikte, bir cevap bulmayacağım çeviri şirketleri ile tipik etkileşim açısından bir süreci sorusu var.tipik java i18n işlemi - çeviri dosyalarını çevrilmek üzere tercüme firmalarına gönderme

Ben dahil "whatever_en_US.properties" dosyasına onlara

  1. varsayılan kaynak özelliklerini göndereceğini, ben Fransızca biliyor ve uygulamam için çeviri yaptırmak için bir çeviri şirketi istihdam gerekmez örneğin varsayarsak Anahtar ve İngilizce değeri ve "whatever_fr_FR.properties" geri almak?
  2. Boş değerlerle "whatever_fr_FR.properties" ve "whatever_en_US.properties" referansı için?
  3. bazı başka kombinasyonlar var mı?

cevap

4

Sorunuz teknoloji ile ilgili değil, bir süreçle ilgili olduğundan, size kapsamlı bir açıklama yapmaya çalışacağım.Önceki çeviriye sahip olmadığınızı varsayarsak, ideal süreç şu şekilde görünmelidir:

  1. Çeviri için İngilizce dosya gönder. çeviri müteahhit ile yaptığınız sözleşmeye bağlı olarak şunu kullanabilirsiniz:

    • Varsayılan özellikleri dosyaları çeviri için
    • Excell elektronik tablo içeren anahtarları, İngilizce cümleyi ve boş bir sütun (eğer bunları doğru adlandırma sorumlu olacaktır)
    • gettext * dosya (lar) .po size fi aldığınızda
    • Çeviri belleği dosyası (ler) (yani Trados'un * .tmx dosyaları)
  2. gettext kullanacağız eğer Geri döndüğünüzde, bu çevirileri ürün haline getirin, yerelleştirilmiş bir derleme oluşturun ve test edin. Elbette, bazı UI sorunları olacak. Bazılarınız kendi başınıza düzeltebilir, bazıları ek çeviri gerektirecektir (kodlanmış dizeler gibi), diğerleri çeviri kısaltması gerektirecektir. Yine, çeviri yüklenicisi ile bağlantı kuracak ve (yeniden) çevrilmesi gereken dizeleri temin edeceksiniz. E-tabloyu burada kullanabilirsiniz (çevrilmesi gereken çok fazla dizenin bulunmaması koşuluyla).

  3. Aynı anda (aynı anda tüm diller) gönderilmek istiyorsanız, çevirmenleri erkenden devreye sokmanız gerekir. UI dizeleri değişeceğinden (zor UI-donma süresi veya çeviri-donma süresi bulunmadığı sürece) çevirilerinizi güncellemeniz gerekecektir. Bu durumda, daha önce çevrilmiş dosyaları tercüme edilmesi gereken dizelerle (İngilizce olarak) sağlamanız gerekecektir. Değişiklikler gerçekten küçükse, yalnızca İngilizce dizeleri gönderebilir ve çevirileri el ile birleştirebilirsiniz, aksi halde bir çeşit çeviri belleği değişim biçimi kullanmanız en iyisidir (gettext * .po veya trados * .tmx'ler burada harikadır).

  4. Dosyaların çevrilmesi genellikle yeterli değildir. Genellikle verilen bir bağlam olmadığından ve farklı kelimeler bir hedef dilde farklı şeyler anlamına gelebildiğinden, çeviri hataları meydana gelir. Dili bilmedikçe, onların içinde olduklarını bilmenin bir yolu yoktur. Bu yüzden UI ekran görüntülerini almanız ve gözden geçirmeniz için göndermeniz gerekir (çeviri yükleniciniz tarafından veya kalite gereksinimlerine bağlı olarak başka biri tarafından incelenebilir).

  5. kez gözden, sen ... UI sorunları için çeviri değişiklikleri ve testi uygulamak için biz UI dizeleri çeviri sürecinin bahsediyoruz eğer, bu konuda var

gerekecektir. Ancak, bir uygulamayı doğru bir şekilde yerleştirmek için daha fazla şey olduğunu lütfen unutmayın (belgeler, yardım dosyaları, simgeler, renkler, sesler ...).

+0

harika! Burada yükselttiğiniz şeylerin çoğunun farkındayım, ancak bunu düzenleyerek açıklığa kavuşturuldunuz. Ve umarım gelecekteki stackoverflowees yararlı bulacaktır. – jlarson

2

Sorunuzu cevaplamak için seçtim (2).

Pratikte, benim için Java kaynak paketlerinden çok başka bir şey kullanmanın çok daha kolay olduğunu buldum.

Kişisel olarak bunu farklı bir şekilde kullanıyorum. Ben gettext yolunu kullanıyorum (gettext uzantılarından yararlanmak için uygulamanızda kullanmanız gereken GetTextResource.java adında bir dosya var - bkz. here).

Eğer ile tanıyorsanız, gettext ile bu yöntemi çok daha kolay ve pratik bulacaksınız. Sadece çevirmeninize po dosyaları (poedit ile düzenlenebilir) verin. Uygulamanızın içinde kullanacağınız pova sınıfından oluşturduğunuz po dosyalarından (bu, msgfmt kullanılarak yapılır - po dosyalarının java derlenmesi için parametreler belirlenir). Po dosyaları xgettext komutu (komut satırından) kullanılarak oldukça kolay bir şekilde güncellenebilir.

Elbette her şey gettext manual'un içindedir.

Avantajları: (N bir sayıdır) "N dosya (lar) silindi" - ngettext bkz:

  • gettext'lerle size çoğul formu [gibi artık mesaj seçmek için bir yol sunar.

  • java dosyaları yeni jeton

  • bazı makrolar kullanarak her dize erişmek gerek güncellenir kez dizeleri tercüme için komut dosyası yöntemi (gibi çevirme (DELETE_BUTTON_MACRO)). Sadece bu gibi kod yazmak: İyi şanslar:

    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); 
        } 
    } 
    } 
    
    İşte

bir numuneyi olursa olsun seçim ne

// example 
    // similar for plural 

    import static translateutil.TranslateUtil._; 

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

olduğunu!

+0

tam cevap için teşekkür ederim ... Ben gerçekten java resourcebundles ama tescilli bir çözüm kullanarak _really_ değil, ANCAK, soru basitleştirmek için resourcebundles hakkında soran düşündüm. – jlarson