Понятно, почему разработчики, как библиотека ngx-translate, заботятся о интернационализации. В конце концов, это делает нашу жизнь настолько легкой, превращая задачу перевода в отображение 1 на 1. К сожалению, это не так, как это работает с человеческими языками. У одного есть два человека, которые знают более одного языка, чтобы лучше понять недостатки этого подхода.
Вот небольшой пример:
Допустим, у вас есть приложение для командировочных расходов, у вас есть табличное представление, в котором заголовок одного столбца - «время», указывающее, когда были сообщены расходы. Затем представьте, что в таком приложении у вас есть мини-калькулятор для базовой проверки ваших расходов, в котором есть кнопка умножения x с отложенным сообщением «время». Когда вы делаете ngx-translate, вы извлекаете их обоих с одним и тем же ключом «TIMES», который, в свою очередь, переводчик возвращает вам один перевод. Но первое вхождение «время» не обязательно переводится так же, как и второе, во всех других языках. Возьмите, например, испанский:
- "два раза три" (как в калькуляторе) -> "dos POR tres"
- «ВРЕМЯ расхода» (как в табличном представлении) -> «TIEMPOS de gasto»
Именно поэтому интернационализация движется в направлении использования более сложного формата, такого как XLF, для поддержки значения, описания (в случае Angular), а не старого стиля JSON с 1 глубиной, который не может быть приспособлен для перевода в отношении в контекст.
Теперь вы можете утверждать, что это можно решить, зарегистрировав два разных ключа для «времен», которые на английском языке соответствуют одной и той же вещи, но для этого вам, как разработчику, необходимо знать все языки, которые ваше приложение поддерживает при разработке, или вы пришлось бы пройти еще одну итерацию (время - деньги!), чтобы получить обратную связь с клиентом, а затем добавить отдельный ключ, тогда как если вы предоставите описание и значение для вашего сообщения (текста), то переводчик позаботится о вас для вас, не имея никаких знаний другого языка (Если вы знаете испанский, подумайте о том, насколько сложным это может быть с сослагательными и указательными формами глагола, которые одинаковы в английском, но не в испанском).
Чтобы ответить на ваш другой вопрос «Есть ли способ сделать живое переключение языков с помощью angular i18n?»: Да, есть. Взгляните на эту замечательную статью об управлении состоянием в приложениях. Короче говоря, вам нужно, чтобы ваш клиент и постоянные состояния отображались в URL. Тогда все, что вам нужно сделать, это добавить префикс локали к вашему пути, чтобы ваш веб-сервер дал вам правильную сборку локали. Тогда, каким бы ни было состояние вашего приложения до изменения действия по изменению локали, его можно восстановить из URL (поскольку оно «отражает как постоянное состояние, так и состояние клиента»).