К сожалению, пока что Opera не поддерживает локализацию виджетов методом, предложенном в стандарте W3C, но даже если будет поддерживать, то это касается только серверной стороны, и, видимо, только языка сервера. Поэтому сделаем всё сами, учитывая, что языки браузера-сервера и браузера-клиента в общем случае разные.
Получение со стороны сервера языка отсылаемой к клиенту информации
Как определить язык клиента на сервере? — по заголовку HTTP Accept-Language. Как до него добраться? — через метод getRequestHeader или свойство headers объёкта типа WebServerRequest. А дальше его по алгоритму, описанному в RFC, обрабатывать? — да. Для этого я написал функцию, принимающую WebServerRequest и список поддерживаемых локализаций, и выдающую предпочитаемую клиентом локализацию:function getLanguageNameForRequest(Request,SelectedArray){
var HeaderCollection=Request.getRequestHeader("Accept-Language");
var AcceptString="";
if(HeaderCollection!=null)if(HeaderCollection.length>=1){
//HeaderCollection является DOMStringList и не имеет метода join, поэтому порнография
for(var i=0,AcceptString=HeaderCollection.item(0); i<HeaderCollection.length-1;){
i++;
AcceptString+=","+HeaderCollection.item(i);
}
}
var AcceptArray=AcceptString.replace(" ","").split(",");
//Смотри RFC2616, #14.4 Accept-Language
//http://tools.ietf.org/html/rfc2616#section-14.4
var Lang=SelectedArray[0],Qu=-Infinity;
for(var i in AcceptArray){
var l,q,lq;
lq=AcceptArray[i].split(";");
l=lq[0];q=1;
try{
if(lq[1].substring(0,2)==="q="){
q=parseFloat(lq[1].substring(2));
}
}catch(err){
q=1;
}
if(SelectedArray.indexOf(l)>=0){
if(q>Qu){
Lang=l;
Qu=q;
}
}
}
return Lang;
}
Пример вызова
Например, если клиент отправил в заголовке Accept-Language строку «ru,ru-RU;q=0.9,en;q=0.8,de;q=0.7», а на сервере поддерживаются языки «ru» и «en», то getLanguageNameForRequest вернёт «ru»:window.onload = function () {opera.io.webserver.addEventListener('_index', function(RequestEvent){
RequestEvent.connection.response.writeLine("Язык клиента: "+getLanguageNameForRequest(RequestEvent.connection.request,["ru","en"]));
RequestEvent.connection.response.close();
}, false);}Почему не использовать вместо всего этого UserAgent? Потому что в нём передаётся язык интерфейса браузера, а не страниц.Получение со стороны сервера языка выводимой на сервер информации
Особенность технологии Opera Unite в том, что серверный скрипт взаимодействует не только с людьми, которые получают через браузеры-клиенты HTML, но и с человеком, который сидит за браузером-сервером, непосредственно через различные API, например отсылкой сообщений через widget.showNotification. К счастью, для серверного кода доступен тот же DOM, что и для обычной страницы, то есть window.navigator.language работает и выдаёт язык интерфейса браузера-сервера. Обёртываем в аналогичную предыдущему случаю функцию, выбирающую язык из доступных:
function getLanguageNameForServer(SelectedArray){
var l=window.navigator.language
return (SelectedArray.indexOf(l)>=0)?l:SelectedArray[0];
}
widget.showNotification("Язык сервера:"+getLanguageNameForServer(["en","ru","de"]));