Плагин Webpack I18n - отличный небольшой инструмент, который позволяет вам создавать версии вашего контента на нескольких языках. Используя функцию мультипилятора Webpack, он создает несколько пакетов, обращаясь к различным переводам в зависимости от вашей конфигурации.
Чтобы представить это в контексте, в приведенном ниже примере показано, что содержимое журнала консоли будет варьироваться в зависимости от того, какой вывод вы просматривали, но исходный JavaScript (app.js) остается прежним.
app.js:
console.log(__("Hello World"));
en.json:
{
"Hello World": "Hello World"
}
nl.json:
{
"Hello World": "Hallo Wereld"
}
Результат en.output.js будет читать console.log("Hello World");, тогда какnl.output.js будет читать console.log("Hallo Wereld");. Дальнейшие примеры можно найти в их репозитории GitHub.
Однако при его использовании наша команда столкнулась с довольно серьезной проблемой. Плагин i18n не поддерживает строки и переменные шаблона. Вместо разрешения во время компиляции такие строки, как console.log(__(foo)), выдают ошибку __ is not defined. Это задокументировано на вкладке «Проблемы» на GitHub, но мы не осознавали этого, пока не стало слишком поздно. Эта проблема меня особенно расстраивала, и я взял на себя ее решение.
Затем последовали недели исследований (то и дело). Я придумал несколько разных решений, ни одно из которых не подошло бы для наших сценариев использования. В конце концов, я нашел то, что искал, спрятанный в сообщении StackOverflow, на которое наткнулся.
Решение, на котором мы остановились, использует Webpack PluginProvider. Это позволяет вам установить глобальную переменную, доступную в любом месте вашего связанного кода.
Теперь наша конфигурация Webpack выглядит примерно так:
plugins: [
new I18nPlugin(utils.getVocabJson(language)),
new webpack.ProvidePlugin({
__: path.resolve(__dirname, ‘bin/helpers/webpack-vocabs.js’),
}),
],
Это устанавливает подключаемый модуль i18n, а затем с помощью ProvidePlugin делает __ глобально доступной функцией. Если используется строка, это будет разрешено до времени компиляции, в противном случае __ останется в JS во время выполнения. Затем эту проблему можно решить с помощью объявленной выше функции, теперь доступной глобально.
Я хотел объявить функцию в providePlugin, но казалось, что она принимает только путь, поэтому я переместил простую функцию в отдельный файл. bin/helpers/webpack-vocab.js просто содержит функцию, которая выглядит примерно так:
function getVocabs(propName) {
return getConfig().vocab[propName];
}
module.exports = getVocabs;
Вуаля! Теперь мы можем использовать такой код, как
document.querySelector(`.${item}`).innerHTML = __(`${item}`_title);
без ужасного сообщения об ошибке __ is not defined. И пока что, похоже, все работает нормально.
Надеюсь, это поможет, если вы решите использовать плагин i18n для своих собственных проектов.