Функция поддержки мультиязычности.
Сегодня написал функцию, на входе она получает идентификатор фразы, и доп. переменные, на выходе возвращает готовую фразу.
Вопрос: Как этот код приспособить к поддержки других языков? Желательно хранить фразы в отдельных внешних файлах. И подгружать их в зависимости от установленного у пользователя языка. Отрывок кода:
// Массив содержащий все фразы используемые сайтом
var language = {
// ---- тут их может быть сколь угодно.
photos_count: 'Фото %l из %l'
};
function getFrase(langKey){
var value, langArr = language, key = langKey, a = arguments, l = a.length;
for (var k in langArr) {
if (k === key){
value = langArr[k];
if (l>=2){
for(var i = 1; i < l; ++i) {
value = (value || '%l').replace('%l', a[i]);
}
}
}
}
return value;
}
document.getElementById('div_photos_count').innerHTML = '<b>'+getFrase('photos_count',1,20)+'</b>';
Мы получаем: <div id="div_photos_count">Фото 1 из 20</div> |
fiw, мультиязычность, как правило, делают на сервере... Не на клиенте... Оно так сподручнее. :)
|
ksa,
А почему бы не на клиенте сделать? Я вот к примеру, хочу чтобы в зависимости от языка, подгружался тот или иной lang.js В котором массив, содержащий все по текущему языку. |
Цитата:
и выводятся в зависимости от выбранного языка.. Какой такой потайной эротический смысл в том, чтобы подгружать разные js-скрипты в зависимости от языка??? Почему не сделать эти скрипты языконезависимыми? ;) |
Так в том то и прикол, чтобы не делать запросы в БД за этими языками, пускай фразы будут в JS храниться.
А в зависимости от языка используется тот или иной файл. Тем более если учесть что большая часть сайта динамическая. |
Цитата:
|
Цитата:
А насчет вашей функции, зачем в цикле проходить по массиву для того что бы найти ключ, а не просто сразу обратится ? value = langArr[key]; |
Если я правильно понимаю. То поисковики будут индексировать сайт очень криво, так как javascript они не интерпритируют. Короче вместо сайта они покажут шаблон для подстановки слов.
|
Цитата:
Это как рабочая программа) Там индексировать ничего не нужно. |
Цитата:
|
Условие поставить:
if (langArr[key]) value = langArr[key]; else value = 'Not found'; |
Для обычного сайта так делать смысла нет. А вот для самостоятельных приложений (HTA, XUL) так делать имеет смысл.
Цитата:
var texts = {
'Yes': 'Да',
'No': 'Нет',
'Cancel': 'Отмена'
};
function translate(value)
{
return texts[value] || value;
};
alert([
translate('Delete this file?'),
translate('Yes'),
translate('No')
]);
|
Цитата:
|
var lc = function(id){
if(!lc.base[id] || !lc.base[id][lc.is[lc.cur]]) return id;
return lc.base[id][lc.is[lc.cur]];
};
lc.is = {
'ru':0,
'en':1
};
lc.cur = 'en';
lc.init = function(){
var lc = navigator.browserLanguage;
if(!lc) lc = navigator.language;
lc = lc.substring(0,2).toLowerCase();
if(typeof(lc.is[lc]) != 'undefined') this.cur = lc;
};
lc.base = {
'ru':['Русский','Russian'],
'en':['Английский','English'],
...
}
|
нет возможности запомнить язык (например, я хочу сидеть на английском).
lc.base сильно ударит по памяти, если фраз будет около девяти тысяч. |
Цитата:
Цитата:
Цитата:
Где-то память все равно придется выкусывать, чудес не бывает. |
Цитата:
для каждого слова будут храниться переводы для каждого языка?
lc.base = {
'ru':['Русский','Russian'],
'en':['Английский','English'],
...
}
можно просто хранить переводы только для текущего языка, и заменять существующий объект другим при обновлении значения языка |
Цитата:
|
Цитата:
|
Цитата:
..ессно можно сделать подмену lc.base с необходимым словарем при смене языка, несколько увеличив при этом общий размер словарей за счет дублирования ключей, но этот вопрос скорее технический чем принципиальный: ru.js:
lc.base = {
'ru':'Русский',
'en':'Английский',
...
}
en.js:
lc.base = {
'ru':'Russian',
'en':'English',
...
}
|
Идеально это при смене языка в браузере менять ссылку на словарь.
если русский язык, то файл ru.js, при смене языка, средствами DOM удаляем привязанный словарь, и подгружаем сразу необходимый нам. Например en.js или es.js Вот как именно это реализовать? |
Цитата:
lc.base = {
'ru':'Русский',
'en':'Английский',
...
}
en.js:
lc.base = {
'ru':'Russian',
'en':'English',
...
}
var lc = function(id){
if(!lc.base[id]) return id;
return lc.base[id];
};
lc.is = {
'ru':0,
'en':1
};
lc.def = 'en';
lc.init = function(){
var l = navigator.browserLanguage;
if(!l) l = navigator.language;
l = l.substring(0,2).toLowerCase();
if(typeof(lc.is[l]) != 'undefined') lc.load(l);
else lc.load(lc.def);
};
lc.load = function(l){
var e = document.createElement('script',{
'type':'text/javascript',
'src':l + '.js'
});
e.error = e.onload = e.readystatechange = function(){
if(!e.loaded && (!e.readyState || e.readyState == 'loaded' || e.readyState == 'complete')){
e.loaded = 1;
e.onerror = e.onload = e.onreadystatechange = null;
e.parentNode.removeChild(e);
}
};
var head = document.getElementsByTagName('head');
if(head.length) head = head[0];
head.appendChild(e);
}
|
А обновление переменных в странице при подключении нового словаря сразу же произойдет?
|
| Часовой пояс GMT +3, время: 18:48. |