В течение последнего года я работал над парой приложений Meteor. Поскольку я разработчик из Бельгии, я столкнулся с I18N почти с самого начала, и вначале все казалось довольно приятным. Есть замечательный пакет tap-i18n, который даже описан в Meteor Guide. Это поможет вам быстро начать работу.
Но это не так уж и страшно, что вам придется вести файл перевода вручную. Дело в том, что я уже пишу {{_ «translatable_tags»}} в файлах JavaScript и HTML. Так зачем мне снова записывать их в файл перевода JSON? Как не терять время на выяснение, какие строки я забыл вставить в файл перевода? И было бы особенно сложно удалить строки, которые устарели после того, как вы сделали третий поворот! Это приведет к тому, что на i18n будет потрачено намного больше времени и денег.
I18Next-parser приходит на помощь
Решение на самом деле намного проще, чем можно было бы ожидать. I18Next-parser - это небольшой пакет NPM, который может автоматически извлекать строки из вашего источника и помещать их в алфавитном порядке в ваш файл перевода. Аккуратный! Для этого потребуется небольшая настройка, но это действительно большая победа, если все будет настроено правильно.
Чтобы это работало правильно, я полностью поместил свой источник метеора в подкаталог моего репозитория git. Затем я добавил i18next-parser в корневой проект devDependencies, как это.
npm install i18next-parser --dev
Парсер I18next для Meteor должен работать с GULP, который необходимо установить глобально.
npm install -g gulp
Теперь мы готовы создать gulpfile.js в этой же корневой папке со следующей конфигурацией:
var gulp = require('gulp'); var i18next = require('i18next-parser'); gulp.task('default', function() { gulp.src(['!src/node_modules/**', '!src/public/**','src/**']) .pipe(i18next({ output: 'i18n', locales: ['en'], functions: ['_','__'], namespace: 'YOUR_PROJECT_NAME', suffix: '.$LOCALE', extension: ".i18n.json", writeOld: false, })) .pipe(gulp.dest('src/i18n')); });
Если вы следовали инструкциям, теперь вы должны иметь возможность выполнить «gulp» в папке проекта и скомпилировать файл i18n. Вы, конечно, можете создавать разные языки, добавляя локали в конфигурацию, но я обрабатываю это по-другому, о чем подробно расскажу в следующем посте.
Теперь у нас есть способ систематического создания файлов i18n, который поможет нам сократить наши файлы перевода и сократить расходы.
Простые схемы, таблицы и другие граничные случаи
Если вы не используете какие-либо пакеты с необычной атмосферой, вам, вероятно, хорошо идти. Но если вы используете простую схему / автоформу, в вашей схеме будет много ярлыков и текстов параметров. Поскольку пакет простой схемы есть повсюду, существует дополнительный пакет gwendall: autoform-i18n, который позволяет вам переводить эти метки и тексты опций.
На мой взгляд, здесь есть несколько проблем. Этот пакет использует отдельный файл перевода, который вы можете прикрепить к своей схеме, но вам придется снова отредактировать его вручную. Вдобавок ко всему, ваша схема становится намного понятнее, если вы сохраняете в ней метки и параметры. Учитывая это, я бы посоветовал управлять переводами в вашей схеме следующим образом.
Dogs.schema = new SimpleSchema({ name: { type: String, label: () => TAPi18n.__("dogs.name") }, color: { type: String, label: () => TAPi18n.__("dogs.color.label"), autoform: { options: [ { value: "black", label: () => TAPi18n.__("dogs.color.opt.brown") }, { value: "white", label: () => TAPi18n.__("dogs.type.opt.black") } ] } } });
Таким образом, ваша схема остается за все, а i18next-parser собирает все переводимые теги.
Другая проблема, с которой вы можете столкнуться, - это когда вы все перевели, но ваши табличные таблицы еще не переведены. Это невозможно с пакетом aldeed. Хотя был сделан пул-реквест, который позволяет использовать тот же подход. Пока можно воспользоваться вилкой.
Заключительное примечание
Этот пост должен помочь вам с большей уверенностью управлять своими начинаниями с i18n. Конвейер перевода настолько силен, насколько сильна его самая слабая часть, поэтому после автоматизации ввода переводимых тегов нам также необходимо автоматизировать процесс перевода. В следующем посте я подробно объясню, как красиво замкнуть цикл.