ngx / translate - переводить только часть строки

Мне нужно перевести строки, поступающие с сервера, с помощью ngx / translate.

Он отлично работает, когда мне нужно перевести строку, но в некоторых случаях мне нужно перевести только часть строки.

Например: «Привет, Шей» или «Привет, Джон».

И мне нужно перевести только «привет» и оставить имя как есть. Я пытался:

this.i18n.instant('hello {Shay}')

и в файле en.json: "hello {var}": "Hello {var}"

но безуспешно. Любые идеи, как это можно сделать?


person Shay    schedule 18.10.2017    source источник


Ответы (1)


Вам нужны параметризованные переводы. Вам не нужен этот параметр в ключе перевода. Попробуйте так:

en.json:

"hello_name": "Hello {{name}}"

контроллер:

this.i18n.instant('hello_name', {name: 'Shay'});

или в шаблоне:

{{ 'hello_name' | translate: {name: 'Shay'} }}

https://github.com/ngx-translate/core#3-define-the-translations

person Martin Adámek    schedule 18.10.2017
comment
Адамек благодарит за ответ. ваше предложение работает для меня только с двойными скобками, но не решает мою проблему. Дело в том, что ключ, поступающий с сервера, содержит имя, поэтому у меня нет постоянного ключа, такого как hello_name. конечно, я могу использовать 'hello_shay'.split (' _ '), но я ищу более чистый способ сделать это. - person Shay; 19.10.2017
comment
Эти две вещи нужно разделить, вы не должны возвращать их как одну строку со стороны вашего сервера. Вы должны сделать это, как я предлагал, определенно, это лучшая практика ... - person Martin Adámek; 19.10.2017
comment
Я не знаю вашего варианта использования, но ваш сервер должен возвращать вам только значения (например, имя), он не должен заботиться о части приветствия, это работа внешнего интерфейса. - person Martin Adámek; 19.10.2017
comment
Или, если вам это действительно нужно, вы должны вернуть с сервера что-то вроде {message: 'hello_name', name: 'Shay'} и использовать this.i18n.instant(res.message, {name: res.name});. - person Martin Adámek; 19.10.2017
comment
У меня нет контроля над сервером, поэтому я думаю, что просто разделю строку на стороне клиента. Большое спасибо. - person Shay; 19.10.2017
comment
А как насчет увечья? this.i18n.instant(['a','b']); где у каждого своя интерполяция? - person Royi Namir; 06.06.2018
comment
что-то вроде ['a','b'].forEach(k => this.i18n.instant(k));? - person Martin Adámek; 06.06.2018