¿Traducción en JavaScript como gettext en PHP?
translate (7)
Como otra sugerencia, hay un script en perl llamado po2json que generará json a partir de un archivo .po.
Estoy usando gettext
en mi código PHP, pero tengo un gran problema. Todos los archivos de JavaScript no se ven afectados por la traducción, ¿puede alguien decirme una manera fácil de obtener las traducciones en el idioma elegido en JavaScript también?
Generalmente exporto las traducciones en una estructura de JavaScript:
var app = {}
var app.translations = {
en: { hello: "Hello, World!"
, bye: "Goodbye!"
}
, nl: { hello: "Hallo, Wereld!"
, bye: "Tot ziens!"
}
};
El idioma actual de los textos de la página se puede definir usando: <html xml:lang="en" lang="nl">
Esto se puede leer en JavaScript:
var curentLanguage = document.documentElement.lang || "en";
app.lang = app.translations[ currentLanguage ] || app.translations.en;
Y luego puedes escribir código como este:
alert( app.lang.hello );
Opcionalmente, una función i18n()
o gettext()
puede aportar algo de inteligencia, para devolver el texto predeterminado si la clave no existe). Por ejemplo:
function gettext( key )
{
return app.lang[ key ] || app.translations.en[ key ] || "{translation key not found: " + key + "}";
}
La forma más fácil es tener un archivo PHP escribiendo las traducciones de gettext
en las variables de JavaScript.
js_lang.php:
word_hello = "<?php echo gettext("hello"); ?>"
word_world = "<?php echo gettext("world"); ?>"
word_how_are_you = "<?php echo gettext("how_are_you"); ?>"
y luego incluirlo:
<script type="text/javascript" src="js_lang.php"></script>
También recomendaría este método junto con los complementos de traducción que menciona S.Mark (¡que son muy interesantes!).
También puede definir el diccionario en el encabezado de la página actual, sin incluir un archivo externo, pero de esa manera, tendría que buscar y enviar los datos en cada carga de la página, algo innecesario, ya que un diccionario tiende a cambiar muy raramente.
Para la implementación de JavaScript de GNU gettext API, estos enlaces también pueden ser útiles:
http://tnga.github.io/lib.ijs
http://tnga.github.io/lib.ijs/docs/iJS.Gettext.html
//set the locale in which the messages will be translated
iJS.i18n.setlocale("fr_FR.utf8") ;
//add domain where to find messages data. can also be in .json or .mo
iJS.i18n.bindtextdomain("domain_po", "./path_to_locale", "po") ;
//Always do this after a `setlocale` or a `bindtextdomain` call.
iJS.i18n.try_load_lang() ; //will load and parse messages data from the setting catalog.
//now print your messages
alert( iJS.i18n.gettext("messages to be translated") ) ;
//or use the common way to print your messages
alert( iJS._("another way to get translated messages") ) ;
Probar, jQuery i18n o jQuery localization
Un ejemplo para jQuery i18n y, por supuesto, necesita generar un diccionario basado en JSON a partir de un archivo de idioma desde php
var my_dictionary = {
"some text" : "a translation",
"some more text" : "another translation"
}
$.i18n.setDictionary(my_dictionary);
$(''div#example'').text($.i18n._(''some text''));
Puede hacer su vida mucho más fácil si se deshace del mal hábito de usar literales de cadenas en su código. Es decir, en lugar de
alert("Some message")
utilizar
alert($("#some_message_id").text())
donde "#some_message_id" es una división o intervalo oculto generado en el lado del servidor.
JSGettext ( enlace archivado ) es la mejor implementación de la especificación gettext de GNU. Primero descargue el paquete JSGETTEXT e incluya en su página /js/Gettext.js
<?php
$locale = "ja_JP.utf8";
if(isSet($_GET["locale"]))$locale = $_GET["locale"];
?>
<html>
<head>
<link rel="gettext" type="application/x-po" href="/locale/<?php echo $locale ?>/LC_MESSAGES/messages.po" />
<script type="text/javascript" src="/js/Gettext.js"></script>
<script type="text/javascript" src="/js/test.js"></script>
</head>
<body>
Test!
</body>
</html>
código javascript por ejemplo
window.onload = function init(){
var gt = new Gettext({ ''domain'' : ''messages'' });
alert(gt.gettext(''Hello world''));
}
Para referencia encuentra abajo el enlace. Está funcionando bien sin convertir el archivo .js a .php.