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