Migliori pratiche per localizzare i testi in C++ di applicazioni cross-platform?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Nell'attuale standard di C++ (C++03), ci sono troppo poche specifiche sulla localizzazione dei testi e che rende il C++ developer la vita più difficile rispetto al solito quando si lavora con testi internazionalizzati (certamente il C++0x standard sarà di aiuto qui di seguito).

Assumendo il seguente scenario (che è da vero PC-Mac sviluppo del gioco dei casi):

  1. reattivo (in tempo reale) applicazione:la domanda deve ridurre al minimo la non-reattivo volte "non evidente", in modo che la velocità di esecuzione è importante.
  2. localizzata testi:testi visualizzati sono localizzate in più di due lingue, potenzialmente più - non aspettatevi un numero fisso di lingue, che dovrebbe essere facilmente estensibile.
  3. linguaggio definito in fase di runtime:i testi non devono essere compilati con l'applicazione (o di una applicazione per lingua), si ottiene il linguaggio scelto di informazioni all'avvio dell'applicazione - che implica un qualche tipo di testo di carico.
  4. cross-platform:l'applicazione è essere codificati con cross-platform in mente (Windows - Linux/Ubuntu - Mac/OSX) in modo che il testo localizzato sistema devono essere cross platform troppo.
  5. applicazione stand-alone:l'applicazione fornisce tutto il necessario per eseguirlo;non utilizzare in qualsiasi ambiente della biblioteca o richiede all'utente di installare qualcosa di diverso dal sistema operativo (come la maggior parte dei giochi per esempio).

Quali sono le migliori pratiche per la gestione localizzata testi in C++ in questo tipo di applicazione?

Ho guardato in questo ultimo anno e le uniche cose che ho sono sicuro che si dovrebbe usare std::wstring o std::basic_string<ABigEnoughType> per manipolare i testi nell'applicazione.Ho fermato la mia ricerca, perché stavo lavorando di più sulla "visualizzazione del testo" il problema (nel caso di 3D in tempo reale), ma credo che ci sono alcune delle migliori pratiche per la gestione localizzata testi in raw C++ al di là di questo e "Unicode".

Così, tutte le buone pratiche, suggerimenti e informazioni (cross-platform rende difficile credo) sono i benvenuti!

È stato utile?

Soluzione

Un piccolo Video Gioco di Società, Black Lantern Studios, ero il capo sviluppatore di un gioco chiamato Lionel Treni DS.Abbiamo localizzato in inglese, spagnolo, francese e tedesco.Sapevamo che tutte le lingue davanti, così li anche in fase di compilazione era l'unica opzione.(Sono bruciati per una ROM, si vede)

Posso darvi informazioni su alcune delle cose che abbiamo fatto.Le nostre corde sono stati inseriti in una matrice di avvio in base alla lingua scelta del giocatore.Ogni singola lingua andato in un file separato con tutte le stringhe nello stesso ordine.Stringa di 1 è sempre stato il titolo del gioco, string 2 sempre la prima opzione del menu, e così via.Abbiamo digitato le matrici di enum, come integer l'indicizzazione è molto veloce, e per i giochi, la velocità è tutto.( La soluzione collegato in una delle altre risposte usi string le ricerche, che tendono ad evitare.) Durante la visualizzazione di stringhe, abbiamo utilizzato un printf() tipo di funzione sostituisci indicatori con valori."Formare 3 è in partenza, città 1."

Ora, per alcune delle insidie.

1) Tra i linguaggi, la frase d'ordine è completamente diverso."Formare 3 è in partenza, città 1."tradotto in tedesco e indietro, finisce per essere "Dalla Città 1, formare 3 è in partenza".Se si utilizza qualcosa di simile printf() e la tua stringa è "Ferroviaria di %d è in partenza, città di %d."il tedesco si finisce dicendo:"Dalla Città 3, 1 Treno è in partenza."che è completamente sbagliato.Abbiamo risolto questo forzando la traduzione, per mantenere lo stesso ordine delle parole, ma ci siamo ritrovati con alcuni abbastanza rotto tedesco.Se fossi io a farlo di nuovo, vorrei scrivere una funzione che richiede una stringa e una matrice a base zero dei valori di mettere in esso.Quindi vorrei utilizzare come marcatori %0 e %1, fondamentalmente incorporare l'indice di un array in una stringa. Aggiornamento:@Jonathan Leffler ha sottolineato che un POSIX-compliant printf() supporta l'utilizzo di %2$s tipo di marcatori in cui il 2$ porzione incarica il printf() per riempire il pennarello con il secondo parametro aggiuntivo.Che sarebbe molto utile, così come è abbastanza veloce.Una soluzione personalizzata può essere ancora più veloce, in modo che si desidera assicurarsi e verificare sia.

2) le Lingue variano notevolmente in lunghezza.Che cosa è stato di 30 caratteri, in inglese è venuto fuori a volte a 110 caratteri in tedesco.Questo significava che spesso non adatte a schermi, si erano di mettere su.Questo è probabilmente meno di una preoccupazione per PC/giochi per Mac, ma se si sta facendo qualche lavoro in cui il testo deve essere contenuto in una casella definiti, si vuole prendere in considerazione questo.Per risolvere questo problema, abbiamo spogliato come molti aggettivi dal nostro testo come possibile per le altre lingue.Questo accorciato la frase, ma conservato il significato, se a perdere un po ' il sapore.In seguito, ho progettato un'applicazione che si potrebbe usare che contiene il tipo di carattere e la dimensione del box e consentire traduttori apportare le proprie modifiche per ottenere il testo adattarsi alla scatola.Non sono sicuro se mai messa in atto.Si potrebbe anche considerare di avere a scorrimento aree di testo, se è questo il problema.

3) per Quanto riguarda cross platform va, abbiamo scritto praticamente puro C++ per il nostro sistema di Localizzazione.Abbiamo scritto personalizzato codificati i file binari di carico, e un programma personalizzato per la conversione da un file CSV di testo di lingua in un .h con l'enum e file di mappa di lingua, e un .lang per ogni lingua.Il più specifico della piattaforma cosa che abbiamo utilizzato è stato il font e il printf() la funzione, ma si avrà qualcosa di adatto per ovunque in via di sviluppo, o potrebbe scrivere il proprio, se necessario.

Altri suggerimenti

GNU Gettext fa tutto.

Non sono assolutamente d'accordo con la risposta accettata. Innanzitutto, la parte sull'utilizzo delle ricerche di array statici per accelerare le ricerche di testo mostra semplicemente che la persona che esegue l'ottimizzazione è molto inesperta - Il calcolo del layout di detto testo e il rendering di detto testo utilizzano 2-4 ordini di grandezza più tempo di una ricerca hash. Se qualcuno volesse implementare la propria libreria di lingue, non dovrebbe mai basarsi su array statici.

Ma questo non è davvero rilevante, perché scrivere la tua libreria di lingue da usare nel tuo gioco è anche peggio dell'utile ottimizzazione prematura. Ci sono alcuni ottimi motivi per non scrivere mai la tua libreria di localizzazione :

  1. Pianificare il tempo per usare una libreria di localizzazione è molto più semplice che pianificare il tempo per scrivere una libreria di localizzazione. Esistono librerie di localizzazione, funzionano e molte persone le hanno utilizzate.

  2. La localizzazione è complicata, quindi sbaglierai le cose. Ogni lingua aggiunge una nuova stranezza, il che significa che ogni volta che aggiungi una nuova lingua alla tua libreria di localizzazione nostrana dovrai cambiare di nuovo il codice per tenere conto delle stranezze. Sapevi che alcune lingue hanno più di 2 forme plurali, a seconda del numero di elementi in questione? Più di 2 generi (più di 10, anche)? Inoltre, i formati di numero e data variano molto tra differenti in molte lingue.

  3. Quando l'applicazione avrà successo, dovrai aggiungere supporto per più lingue. Lingue nessuno nella tua squadra parla fluentemente. Assumere qualcuno per scrivere una traduzione sarà notevolmente più economico se conoscono già gli strumenti con cui stanno lavorando.

Una libreria di localizzazione molto nota e completa è GNU Gettext , che utilizza la GPL, e pertanto dovrebbe essere evitato per lavori commerciali. Puoi invece utilizzare la libreria boost boost.locale che funziona con i file Gettext ed è gratuito da utilizzare e modificare per progetti commerciali e non commerciali di qualsiasi tipo.

Per quanto ne so, non ci saranno funzionalità aggiuntive nello standard C ++ 0x. Sospetto che la commissione lo consideri una questione per biblioteche di terzi.

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