2009-03-28 6 views
5

Sto per decidere come gestire l'internazionalizzazione di un formato basato su XML per la descrizione dell'interfaccia utente.I18N di documenti XML

Il formato sembra tipicamente qualcosa di simile:

... 
<devif> 
    <screen id="scr1" title="Settings for this and that"> 
    <header text="Climate readings"/> 
    <rd setp="123" text="Air temperature" unit="°C"/> 
    <rd setp="234" text="Humidity" unit="%RH"/> 
    <rd setp="345" text="CO2" unit="ppm"/> 

    <header text="Settings"/> 
    <wr setp="567" text="Air temperature demand" unit="°C"/> 
    </screen> 
    ... 
</devif> 

Ogni file contiene un sacco di schermi e può essere fino a circa 10.000 linee, e noi abbiamo una dozzina di questi file nella nostra applicazione.

Posso ancora modificare il formato per soddisfare al meglio le nostre esigenze. Quindi, come faresti a tradurre questo?

Ho riflettuto su alcuni possibili modi per gestire questo:

  • un file separato per ogni lingua che contiene il testo inglese e testo tradotto
  • Utilizzando un ID per ogni tag e utilizzare un file separato con testo tradotto per ogni ID
  • Posizionamento di tutte le traduzioni nello stesso file

la prima soluzione ha il problema in cui il testo inglese potrebbe essere tradotto in messaggi diversi a seconda del contesto.

La seconda soluzione rende il file di origine meno leggibile (sebbene non di molto) e non gestisce facilmente la traduzione di attributi.

La terza soluzione renderebbe il file molto grande e macchinoso con cui lavorare una volta che il file è stato tradotto in 5-6 lingue.

+0

Grazie per i vostri suggerimenti. I primi due suggerimenti sono abbastanza simili, tranne che il primo sembra più XML: ish. Tuttavia, mi piace la semplicità del secondo suggerimento. – Jonatan

risposta

1

Vorrei creare un file modello, ad es. denominato "somename.xml.template"

<devif> 
    <screen id="scr1" title="[SettingsForThisCard]"> 
    <header text="[ClimateReadings]"/> 
    <rd setp="123" text="[AirTemperature]" unit="°C"/> 
... 

Quindi è possibile creare un gruppo di file ini-come per ogni lingua che contiene:

SettingsForThisCard = il vostro messaggio in data lingua

Poi, si può sostituire i tag con i messaggi letti dai file ini. Il vantaggio è che se c'è un tag che non ha traduzione, è facile da rilevare e non sprecare gli sforzi di traduzione. Inoltre, è molto semplice, quindi potrebbe non essere il migliore per le tue esigenze specifiche.

1

Perché non utilizzare le entità XML per definire termini che devono essere localizzati e hanno DTD separati per ogni lingua? Questo è essenzialmente l'approccio utilizzato da Firefox XUL, ad esempio: Localization on MDN.

2

Utilizziamo i file standard TMX, che sono file XML standard per contenere letterali internazionalizzati. Ogni voce è identificata da un'etichetta, che fa riferimento a tutto il codice. Ogni voce ha tutte le traduzioni possibili e la parte più importante è che TMX è uno standard utilizzato dai programmi di traduzione e dai professionisti.

Se si dispone già di file XML per contenere i valori letterali, è possibile convertirli mediante un foglio di stile XSLT.

Ecco un esempio del formato:

<?xml version="1.0" encoding="UTF-8"?> 
<tmx> 
    <body> 
     <tu tuid="$ALARM_BARCODE_READER_COMMS"> 
      <tuv lang="ES"> 
       <seg>Lector códigos de barras: No Operativo</seg> 
      </tuv> 
      <tuv lang="EN"> 
       <seg>Barcode reader: Not operative</seg> 
      </tuv> 
      <tuv lang="ZH"> 
       <seg>读卡器:通讯错误</seg> 
      </tuv> 
     </tu> 
     <tu tuid="$ALARM_BARCODE_READER_FAIL"> 
      <tuv lang="ES"> 
       <seg>Lector códigos de barras: Fallo</seg> 
      </tuv> 
      <tuv lang="EN"> 
       <seg>Barcode Reader: Fail</seg> 
      </tuv> 
      <tuv lang="ZH"> 
       <seg>读卡器:故障</seg> 
      </tuv> 
     </tu> 
     <tu tuid="$NO_PAYMENT_MODE_AVAILABLE"> 
      <tuv lang="ES"> 
       <seg>No hay sistemas de pago disponibles</seg> 
      </tuv> 
      <tuv lang="EN"> 
       <seg>No payment systems available</seg> 
      </tuv> 
      <tuv lang="ZH"> 
       <seg>读卡器:故障</seg> 
      </tuv> 
     </tu>  
     <tu tuid="$ALARM_BLACKLIST_CARD"> 
      <tuv lang="ES"> 
       <seg>Tarjeta de pago en lista negra</seg> 
      </tuv> 
      <tuv lang="EN"> 
       <seg>Payment card in blacklist</seg> 
      </tuv> 
      <tuv lang="ZH"> 
       <seg>付费的IC卡是黑名单卡</seg> 
      </tuv> 
     </tu> 
    </body> 
</tmx>