2014-06-19 12 views
5

Sto cercando di internazionalizzare i miei progetti C++, e non mi ci è voluto molto tempo per chiedermi come si gestisce la traduzione del testo in streaming che è inframmezzato da valori non stringa. L'unica pagina che ho trovato finora che menziona anche questo sarebbe this C++ FQA page, anche se quella pagina purtroppo non è troppo interessata ad offrire soluzioni. C'è anche this Boost mailing list thread from 2000 che non sembra andare da nessuna parte.Esiste un sistema per l'internazionalizzazione degli stream C++?

A titolo di esempio, per questo C-style printf dichiarazione:

printf("There are %d lines in '%s'.", numlines, filename); 

E 'banale per avvolgere tutto il messaggio in una sorta di funzione di traduzione, come ad esempio le varie funzioni di gettext, e consentire il testo e le sue componenti non letterale spostato in base alle necessità. Se si ha accesso alla versione POSIX di printf (o qualche altra libreria che offre miglioramenti al formato printf), è anche possibile disporre i valori in un ordine diverso secondo necessità.

Tuttavia, per l'equivalente C++ basato sul flusso dichiarazione:

std::cout << "There are " << numlines 
      << "lines in '" << filename << "'."; 

devo ancora trovare un modo per marcare l'intero messaggio per la traduzione. È possibile racchiudere ogni stringa nelle funzioni appropriate, ma ciò richiede che il traduttore sappia che queste tre stringhe sono tutte parte di un messaggio e che cosa viene visualizzato tra di esse. Inoltre, almeno alcune soluzioni i18n dovrebbero essere informate che altre occorrenze della stessa stringa letterale sono distinte, per le lingue in cui quel contenuto letterale cambia in base al contesto. E dimentica le situazioni in cui dovresti riorganizzare i valori letterali non stringa.

Quindi la mia domanda è: esiste una soluzione di internazionalizzazione che supporti l'uso delle operazioni di streaming o ci siano solo soluzioni in stile printf per le preoccupazioni che ho sollevato?

risposta

1

Boost.Format può aiutare:

cout << boost::format("There are %d lines in '%s'.") % numlines % filename; 

o

cout << boost::format("There are %1% lines in '%2%'.") % numlines % filename; 
Problemi correlati