tipico processo java i18n - l'invio di file di risorse per le aziende di traduzione da tradurre

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

Domanda

Ci sono un sacco di tutorial sull'uso di Java ResourceBundles per fornire interfaccia utente in più lingue. Tuttavia, v'è un processo domanda per quanto riguarda la normale interazione con le aziende di traduzione che io non riesco a trovare una risposta.

Supponendo per esempio che non so francese, e necessità di impiegare una società di traduzione per ottenere traduzioni per la mia app, avrei inviargli il presente

  1. Le proprietà delle risorse di default dei file "whatever_en_US.properties", tra cui la chiave e il valore di inglese, e tornare "whatever_fr_FR.properties"?
  2. "whatever_fr_FR.properties" con valori vuoti e "whatever_en_US.properties" per riferimento?
  3. qualche altra combinazione?
È stato utile?

Soluzione

Dal momento che la tua domanda riguarda un processo e non sulla tecnologia, cercherò di darvi una spiegazione approfondita. Supponendo di avere applicazione senza traduzione precedente, il processo ideale dovrebbe essere simile:

  1. Invia file per la traduzione in inglese. A seconda del contratto con l'appaltatore traduzione è possibile utilizzare:

    • I file di proprietà di default (che sarà responsabile per la ridenominazione in modo corretto)
    • foglio Excel contenente chiavi, frase inglese e una colonna vuota per la traduzione
    • Gettext * .po file (s), se avete intenzione di utilizzare gettext
    • file Memoria di traduzione (s) (cioè Trados * .tmx file)
  2. Quando si ricevono i file avanti, si mette queste traduzioni in prodotto, creare localizzato costruire e collaudare fuori. Sicuramente, ci saranno alcuni problemi di interfaccia utente. Alcuni di loro si potrebbe risolvere il problema da soli, alcuni richiedono traduzione supplementare (come le stringhe hardcoded), altri richiederanno accorciamento traduzione. Anche in questo caso, essere impegnato traduzione contraente e fornire loro le stringhe che devono essere (ri) tradotto. Si potrebbe utilizzare fogli di calcolo qui (a condizione che non ci sono così tante stringhe che hanno bisogno di essere tradotto).

  3. Se volete spedire contemporaneamente (tutte le lingue in una sola volta), è necessario coinvolgere i traduttori presto. Dal momento che le stringhe di interfaccia utente cambierà (purché non vi siano hard-UI-freeze periodo o tempo di traduzione-freeze), si dovrà ottenere le vostre traduzioni aggiornate. In questo caso, sarà necessario fornire i file già tradotti con le corde che hanno bisogno di essere tradotte (in lingua inglese). Se le modifiche sono davvero piccole, è possibile inviare solo le stringhe inglesi e traduzioni di unione manualmente, altrimenti è meglio usare un qualche tipo di formato di scambio di memoria di traduzione (gettext * .po del o TRADOS * .tmx di sono grandi qui).

  4. La traduzione dei file è di solito non è sufficiente. Dal momento che di solito non v'è alcun contesto dato e parole diverse può significare cose diverse in una lingua di destinazione, si verificano errori di traduzione. Non c'è modo di sapere che sono in se non si conosce la lingua. Ecco perché è necessario prendere screenshot dell'interfaccia utente e inviare per la revisione (che potrebbe essere rivisto dal vostro appaltatore di traduzione, o qualcun altro a seconda delle esigenze di qualità).

  5. Una volta rivisto, è necessario applicare le modifiche di traduzione e di test per i problemi di interfaccia utente ...

Questo è tutto, se stiamo parlando di UI stringhe processo di traduzione. Ma prega di notare che c'è un sacco di più per localizzare correttamente un'applicazione (documentazione, file di aiuto, le icone, i colori, i suoni ...).

Altri suggerimenti

Per rispondere alla tua domanda che avrebbe scelto (2).

In pratica ho scoperto che per me è molto più facile da usare qualcos'altro piuttosto che i gruppi di risorse Java.

Io personalmente uso un modo diverso di gestire questo. Io uso il modo gettext (esiste un file chiamato lì GetTextResource.java che è necessario utilizzare nella vostra applicazione per beneficiare delle estensioni gettext - vedere qui ).

se si ha familiarità con gettext sarà sicuramente trovare questo approccio molto più facile e pratico. È sufficiente dare ai vostri traduttori file po (che possono essere modificati con poedit ). Partendo dai file po aver creato la classe Java che verrà utilizzato all'interno della vostra applicazione (questo è fatto utilizzando msgfmt - parametri che specifica per Java compilazione dei file PO). file po possono essere aggiornati abbastanza facile utilizzando il comando xgettext (da linea di comando).

Naturalmente tutto è all'interno del manuale gettext.

I vantaggi:

  • Offerte gettext un modo per selezionare la forma plurale [Niente più messaggi come: "di file N (s) ha cancellato" (dove N è un numero) - vedere ngettext .

  • un metodo script per tradurre le stringhe di una volta che i file Java vengono aggiornati con nuovi token

  • non c'è bisogno di accedere ogni stringa utilizzando alcune macro (come Translate (DELETE_BUTTON_MACRO)). Basta scrivere il codice come questo:

    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);
        }
    }
    }
    

Ecco un esempio

    // example
    // similar for plural

    import static translateutil.TranslateUtil._;

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

Non importa quello che la scelta è:! In bocca al lupo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top