Обработка многоязычности только с помощью jQuery

#javascript #jquery

#javascript #jquery

Вопрос:

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

 label["login"]["fr"]="Connection"
label["login"]["en"]="Login"
  

Как только файл будет загружен, я сделаю (для каждой метки):

 $('#login').text(label["login"][selected_language]);
  

В HTML я бы тогда использовал:

 <a href="login.html"><span id="login"></span></a>
  

Это правильный способ сделать?

Ответ №1:

Я думаю, было бы лучше, если бы вы использовали class и a invented attributed вместо id для управления многоязычием, потому что, если у вас будет один и тот же текст дважды на одной и той же странице, id сломает его, потому что он уникален.

Вы можете попробовать этот подход:

 $(function() {
  $(".is_ml").each(function() {
    $(this).html(label[$(this).attr("ml_label")]["en"])
  })

});
  

Все, что представляет собой текст на нескольких языках, должно иметь class=»is_ml» и ml_label =»label», где меткой может быть, например, «login». Вы поняли мой подход?

Комментарии:

1. @bernardo-mendes, да, я понял! Кажется отличным подходом, я попробую. Приветствия.

Ответ №2:

Было бы правильно, если бы вы закрыли свой <span> тег 🙂 Вы также могли бы просто дать <a> соответствующее значение «id».

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

Конечно, проблема в том, что пользователи, у которых отключен JavaScript, получат только язык по умолчанию, предоставляемый сервером.

Комментарии:

1. На самом деле, как это делает OP, если JS отключен, текста вообще не было бы.

2. @Davy8 да, это правда — я предположил, что OP увидит ошибку в своих способах и включит значение по умолчанию с сервера 🙂

3. Люди, отключающие javascript, все еще существуют ? 🙂

Ответ №3:

salut luc.

Я думаю, что лучший способ — сделать это в каком-нибудь бэкэнде: P Но поскольку вы запрашиваете версию jQuery, я бы использовал наиболее используемый язык в HTML и заменил его другим (ами). Я бы сделал это следующим образом:

http://jsfiddle.net/mHAHz/1
Демонстрация здесь: (нажмите на fr или de, чтобы изменить язык)

 var translation, translate;

translation = { //store your translations in a object.
    "fr": {
        "div > a:eq(0)": "un lien", // this way you are flexible (don't need to use abd id for all you contents you want to translate)
        "div h1"       : "un title",
        "p"            : "du contenu"
    },
    "de": {
        "div > a:eq(0)": "ein Link",
        "div h1"       : "ein Titel",
        "p"            : "eigen Inhalt"
    }
}

translate = function( lng,translationObj ){ //check if lng is provided and if it acually exists in the object.
    if( lng amp;amp; translationObj[lng] ) {
        return $.each(translationObj[lng], function(k,v){
             $(k).text(v); 
        });
    }else{
        return $.error("make the language (lng) exists in your object");
    }
}

translate("fr", translation);
  

Я думаю, мне было бы слишком лениво поддерживать эти объекты с помощью языка, поэтому я бы просто использовал класс language для элементов, которые я хочу перевести… (как я сделал это здесь:http://alainbenoit.com /)

Комментарии:

1. звучит здорово, но что, если я использую несколько h1, например? Нужно ли мне поддерживать каждый h1 отдельно?

2. Вам не нужно поддерживать их отдельно, вы можете просто адаптировать селектор. в моем примере вы могли бы просто изменить «div h1» на «h1», чтобы он переводил все h1 на странице

3. да, хорошо, вместо h1 я мог бы использовать h1.title1, h1.title2, … ок, понял

Ответ №4:

Мне нравится подход Бернардо Мендеса (ответ № 6), однако, поскольку подобъекты необходимо инициализировать, лучше переключить поля ml_label и language, чтобы свести к минимуму количество подобъектов, которые должны быть инициализированы только на один для каждого языка.

Javascript:

 var label = {};
label['fr'] = {};
label['en'] = {};

label["fr"]["login"]="Connection";
label["en"]["login"]="Login";
label["fr"]["firstname"]="Prénom";
label["en"]["firstname"]="First Name";
label["fr"]["lastname"]="Nom de Famille";
label["en"]["lastname"]="Last Name";

$(function() {
  $(".is_ml").each(function() {
    $(this).html(label["en"][$(this).attr("ml_label")])
  })
});
  

HTML:

 <label class="is_ml" ml_label="login">Login</label>
<label class="is_ml" ml_label="firstname">First Name</label>
<label class="is_ml" ml_label="lastname">Last Name</label>