Перевод на JavaScript, как gettext на PHP? - PullRequest
28 голосов
/ 08 марта 2010

Я использую gettext в своем коде PHP, но у меня большая проблема. Все мои файлы JavaScript не зависят от перевода, может кто-нибудь подскажет, как легко переводить переводы с выбранного языка на JavaScript.

Ответы [ 8 ]

18 голосов
/ 08 марта 2010

Самый простой способ - заставить PHP-файл записать переводы из gettext в переменные 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"); ?>"

и затем включите его:

<script type="text/javascript" src="js_lang.php"></script>

Я бы также рекомендовал этот метод в сочетании с плагинами перевода, которые упоминает С.Марк (которые очень интересны!).

Вы также можете определить словарь в заголовке текущей страницы, не включая внешний файл, но таким образом, вам придется искать и отправлять данные при каждой загрузке страницы - совершенно ненужно, так как словарь имеет тенденцию изменяться очень редко.

13 голосов
/ 08 марта 2010

Я обычно экспортирую переводы в структуре JavaScript:

var app = {}
var app.translations = {
  en:  { hello: "Hello, World!"
       , bye:   "Goodbye!"
       }
, nl:  { hello: "Hallo, Wereld!"
       , bye:   "Tot ziens!"
       }
};

Текущий язык текстов страницы можно определить с помощью: <html xml:lang="en" lang="nl">

Это можно прочитать на JavaScript:

var curentLanguage = document.documentElement.lang || "en";
app.lang = app.translations[ currentLanguage ] || app.translations.en;

И тогда вы можете написать код, подобный этому:

alert( app.lang.hello );

Опционально, функция i18n() или gettext() может принести некоторую информацию, чтобы вернуть текст по умолчанию, если ключ не существует). Например:

function gettext( key )
{
  return app.lang[ key ] || app.translations.en[ key ] || "{translation key not found: " + key + "}";
}
7 голосов
/ 08 марта 2010

Try, jQuery i18n или jQuery локализация

Пример для jQuery i18n, и, конечно, вам нужно сгенерировать словарь на основе JSON из языкового файла из php

var my_dictionary = { 
    "some text"  : "a translation",
    "some more text"  : "another translation"
}
$.i18n.setDictionary(my_dictionary);


$('div#example').text($.i18n._('some text'));
3 голосов
/ 26 сентября 2013

JSGettext ( архивная ссылка ) - лучшая реализация спецификации GNU gettext. Сначала скачайте пакет JSGETTEXT и включите в свою страницу /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>

код JavaScript, например

window.onload = function init(){
var gt = new Gettext({ 'domain' : 'messages' });
alert(gt.gettext('Hello world'));
}

Для справки найдите ссылку ниже. Работает нормально, без преобразования файла .js в .php.

Нажмите здесь

1 голос
/ 13 августа 2015

Для реализации JavaScript в GNU gettext API эти ссылки также могут быть полезны:
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") ) ;
1 голос
/ 08 апреля 2011

В качестве еще одной подсказки есть скрипт perl под названием po2json, который будет генерировать json из .po файла.

1 голос
/ 08 марта 2010

Вы можете сделать свою жизнь намного проще, если избавитесь от дурной привычки использовать строковые литералы в своем коде. То есть вместо

 alert("Some message")

использование

alert($("#some_message_id").text())

где "#some_message_id" - это скрытый div или span, сгенерированный на стороне сервера.

0 голосов
/ 14 декабря 2018

Эта библиотека кажется лучшей реализацией getText в javascript:

http://messageformat.github.io/Jed/

https://github.com/messageformat/Jed

пример из документации:

<script src="jed.js"></script>
<script>
var i18n = new Jed({
  // Generally output by a .po file conversion
  locale_data : {
    "messages" : {
      "" : {
        "domain" : "messages",
        "lang"   : "en",
        "plural_forms" : "nplurals=2; plural=(n != 1);"
      },
      "some key" : [ "some value"]
    }
  },
  "domain" : "messages"
});

alert( i18n.gettext( "some key" ) ); // alerts "some value"
</script>
...