Вариабельная замена на i18next и руль

Наконец-то я получил локализацию PhoneGap/Backbone/Handlebars с помощью i18next.js – вроде того.

В настоящее время мне интересно, как получить html со встроенными выражениями руля для локализации и компиляции с помощью ручек. Например, я хочу что-то вроде этого:

Welcome, {{this.name}}. We've been expecting you.

превратиться в:

Welcome, Bob. We've been expecting you.

Это достаточно просто без локализации. Но запустите шаблон i18next, описанный в документации (здесь: http://i18next.com/pages/doc_templates.html)...

// handlebars helper from i18next
Handlebars.registerHelper('t', function(i18n_key) {
  var result = i18n.t(i18n_key);
  return new Handlebars.SafeString(result);
});

//Handlebars string:
{{t 'view.WelcomeMessage'}}

// translation.json file
{ "view":
    {
        "WelcomeMessage": "Welcome, {{this.name}}. We've been expecting you."
    }
}

К сожалению, при локализации это превращается в следующее:

Welcome, {{this.name}}. We've been expecting you.

Как мне получить строку для локализации и компиляции встроенного выражения?


person eb1    schedule 02.05.2014    source источник


Ответы (2)


Похоже, что ответ на этот вопрос находится в помощнике по замене переменных tr:

// handlebars helper from i18next
Handlebars.registerHelper('tr', function(context, options) { 
  var opts = i18n.functions.extend(options.hash, context);
  if (options.fn) opts.defaultValue = options.fn(context);
  var result = i18n.t(opts.key, opts);
  return new Handlebars.SafeString(result);
});

// random "This" object passed in:
var person = {name:"Bob", age:42, eyeColor:"blue"};

//Handlebars string:
{{tr this key='view.WelcomeMessage'}}

// translation.json file
{ "view":
  {
    "WelcomeMessage": "Welcome, __name__. We've been expecting you."
  }
}

// Output
Welcome, Bob. We've been expecting you.

Обратите внимание, что пример tr, приведенный на http://i18next.com/pages/doc_templates.html, иметь дополнительный параметр в конце. Это необходимо только в том случае, если вы хотите заменить один из атрибутов this чем-то другим.

person eb1    schedule 05.05.2014
comment
Я не понимаю, как заменяется __name__. Вызов помощника не должен быть: {{tr key='view.WelcomeMessage' name=this.name}} ? - person gentiane; 15.10.2015
comment
@gentiane: Похоже, я тоже не знал. Помощник tr просматривает объект, переданный через параметр this, и извлекает соответствующие значения атрибутов. Вы можете переопределить их, передав другое значение в конце, но это не обязательно, если ваш объект имеет атрибуты, используемые для замены переменной. Я обновил свой ответ, добавив этот объект с атрибутом name. - person eb1; 19.10.2015

Для i18next v3.2.0 с интерполяцией:

пакет.json | зависимости/dev-зависимости

"i18next": "^3.1.0",
"babel-core": "^6.7.2",
"babel-loader": "^6.2.4",
"handlebars": "^4.0.2",
"handlebars-loader": "^1.1.4",
"webpack": "^1.12.2",

layoutView.js | пример данных модели, передаваемых в шаблон:

  render(){
    let person = {name: 'joe', age: 21};
        person = new Backbone.Model(person);
    this.$el.html(template(person.toJSON()));
  }

layoutView.hbs | шаблон руля

<div>{{{ i18n 'person' name=this.name age=this.age}}}</div>
<!-- after interpolation will read -->
<!-- <div>joe is 21 lang: en </div> -->

i18n.js | используя es2015, поэтому имя файла становится helperName, используемым в layoutView.hbs (выше)

// handlebars helper from i18next
import i18next from 'i18next';
import Handlebars from 'handlebars';

export default function(key, options) {
 let result = i18next.t(key, options.hash);
 return new Handlebars.SafeString(result);
};

перевод.json | выборка для интерполяции

{
  "person": "{{name}} is {{age}} lang: en",
  "good-bye": "good-bye: en",
  "other": "other: en"
}

Эта ветка на github действительно помогла

person bhuizi    schedule 15.06.2016