Pull to refresh

Comments 16

Создай топик
Тесты: функция форматирования для удобной локализации строк
Както нужно было тоже самое на js зделать только в основном по отношению к деньгам. Так я прото передовал масив строк меньше обработак. Но ваш вариант мне больше нравится.
Ну так да, массив работает гораздо быстрее.
Но тут именно локализация. Поэтому массивом уже будет не обойтись.

А кто ведь знает на каких языках будут ещё работать наши проекты. Я даже RTL предусматриваю если легко получается ;-)
Почему бы языковые формулы не вынести во внешний массив тогда новый язык будет проще добавить.
например так:
String.lang = {
    'en':function(n){return ( n != 1 ? 1 : )},
    'ru':function(n){return ( n % 10 == 1 && n % 100 != 11 ? : n % 10 >= 2 && n % 10 <= 4 && ( n % 100 < 10 || n % 100 >= 20 ) ? 1 : 2 )}
};

var idxForm = String.lang[ CultureInfo.name.split('-')[]](n);    // Вставить во внутрь String.wformat



______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru
И да языковую функцию можно получить еще до цикла, чтобы не делать получение формулы в цикле
Можно, тогда лучше сразу в CultureInfo объект

var idxForm = CultureInfo.getNumeralForm(n);

и функцию тогда выносить не надо
все таки один раз получить функцию и несколько раз использовать будет оптимально в вашем варианте ведь каждый раз будет локация проверятся
интересно зачем хабр нолик от сюда вырезал CultureInfo.name.split('-')[0]
Не только тут. Он вырезал все [0].
Типа задачка на внимательность от хабра.
Может тогда есть смысл выложить код куда-нибудь в виде нормального файла?
Честно не вижу смысла выносить один вызов CultureInfo.getNumeralForm и писать что-то вроде

String.wformat = function(f)
{
var getterForm = CultureInfo.getNumeralForm;
var a=arguments;return f.replace(/{(\d+)(.*?)}/ig,function($,$1,$2)
{
var idxForm = getterForm(n);
}
}

Это ведь только один вызов на каждый аргумент.
А другого цикла там больше нигде нет.
У вас ведь где то будет выборка формулы по языку так вот эту выборку надо делать один раз а не каждый раз
Не понимаю.
Вот выбор формулы и сама формула сейчас
switch( CultureInfo.name.split('-')[0] )
{
case «en»: idxForm = ( n != 1? 1: ); break;
case «ru»: idxForm = ( n % 10 == 1 && n % 100 != 11?: n % 10 >= 2 && n % 10 <= 4 && ( n % 100 < 10 || n % 100 >= 20 )? 1: 2 ); break;
}

Вы предложили я поддержал сделать так
idxForm = CultureInfo.getNumeralForm(n);

CultureInfo — глобальный объект, у меня он грузится отдельный скриптом для каждого языка
там будет такая строчка

CultureInfo = {

getNumeralForm: function(n) { return n != 1? 1: 0; },

};
Так да нормально я думал вы предлжили чтото типа

CultureInfo = {

getNumeralForm:function(n){
switch( CultureInfo.name.split('-')[0] )
{
case «en»: idxForm = ( n != 1? 1: ); break;
case «ru»: idxForm = ( n % 10 == 1 && n % 100 != 11?: n % 10 >= 2 && n % 10 <= 4 && ( n % 100 < 10 || n % 100 >= 20 )? 1: 2 ); break;
}
return idxForm;
}

};
Sign up to leave a comment.

Articles