Локализации в JavaScript — это просто!

На работе нужно работать, то‐есть — разрабатывать то, о чём в последствии можно будет рассказать.

Сегодня, занимаясь рефакторингом 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. Данный код распространяется как есть, и мне плевать если у вас так что‐то не заработает! :)

comments powered by Disqus