На работе нужно работать, то‐есть — разрабатывать то, о чём в последствии можно будет рассказать.
Сегодня, занимаясь рефакторингом front‐end'а одной очень интересной штуки меня приспичило внедрить локализацию в нее. Так как фронтенд на JavaScript — выбор у нас не большой — хэши. Но мне это показалось очень скучным, да и не особо надёжным, ибо напрямую обращаться к хэшу нельзя. Точнее, как нельзя, можно, но опасно, так как нужной строки в нём может не оказаться, и мы получим undefined.
Как сделал это я?
Сразу скажу, что кода очень мало, и в не сжатом виде он занимает всего 510 байт. Далее приведён листинг кода:
function _(str, locale) {
locale = locale || _.defaultLocale;
if (_.data.hasOwnProperty(locale) && typeof _.data[locale] == 'object') {
if (_.data[locale].hasOwnProperty(str)) {
return _.data[locale][str];
}
}
return str;
}
_.defaultLocale = 'ru';
_.data = {
ru: {}
};
_.registerLocale = function registerLocale(locale, data) {
if (!_.data.hasOwnProperty(locale)) {
_.data[locale] = {};
}
for (var str in data) {
if (data.hasOwnProperty(str)) {
_.data[locale][str] = data[str];
}
}
}
Код предоставляет две функции, это _(string, locale) и _.registerLocale (locale, data). Первая функция используется для получения переведённой строки, а вторая — для добавления словарей.
Пример использования кода:
//попробуем получить строку которой нету в словаре
_('test'); //test
_('two words'); //two words
//регистрируем словарь
_.registerLocale('ru', {
'test': 'Тест',
'two words': 'Два слова',
});
//попробуем снова
_('test'); //Тест
_('two words'); //Два слова
//использование локалей
//указываем явно локаль
_('test', 'ua'); //test, так как украинский не регистрировали
//устанавливаем локаль по умолчанию
_.defaultLocale = 'ua';
_('test'); //test, всё по той же самой причине
//добавим украинский словарь
_.registerLocale('ua', {
'test': 'Це тест',
});
//и попробуем снова
_('test'); //Це тест
//и так же, с явным указанием локали
_('test', 'ru'); //Тест
Как видно из примера — ничего сложного.
P.S. Данный код распространяется как есть, и мне плевать если у вас так что‐то не заработает! :)