Tuesday, June 26, 2007

GWT: Changing locale using cookies

Продолжая работу над своим проектом портирования функционала поисковой системы Look'а на GWT (lab.look.org.ua), я дошел до и18нации. В GWT, как известно, есть довольно хорошо продуманные средства для хорошей локализации. Но мне захотелось, чтоб текущий выбор языка хранился в куках, а не в переменной. В общем, решение получилось довольно простое.

1. Выбор языка и сохранение в cookie.

Этим занимается вот такой виджет:

package client.widgets;

import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Cookies;

import java.util.Date;

/**
* Created by Olostan
* Date: 24.06.2007 23:37:00
*/
public class LangSelection extends Composite {
private static native void RefreshWindow() /*-{
$wnd.location.reload();
}-*/;
private class LangImage extends Image implements ClickListener {
final String code;
public LangImage(String code) {
super();
this.code = code;
this.setUrl("images/flags/"+code+".gif");
this.addClickListener(this);
this.setStyleName("lang-image");
}

public void onClick(Widget sender) {
Date date = new Date();
if (!code.equals("en")) {
Cookies.setCookie("locale",code, new Date(date.getTime()+60*60*60*60));
} else {
Cookies.setCookie("locale","",new Date(date.getTime()-1000));
}
RefreshWindow();
}
}
String[] lang = new String[] { "en","uk","ru" };
public LangSelection() {
HorizontalPanel panel = new HorizontalPanel();
for(int c=0;c<lang.length;c++) {
LangImage img = new LangImage(lang[c]);
panel.add(img);
}
initWidget(panel);
setStyleName("lang-widget");
}
}

 


Тут самый важный код  - это тело метода onClick. Он именно записывает выбранный язык в Cookies и делает рефреш странички.


2. Установка языка при загрузке модуля


Тут пришлось применить вот такой интересный трюк: в исходном html файле в блоке head добавляется вот такой код:

<head>
<title>MyModule title</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript">
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
} else {
begin += 2;
}
var end = document.cookie.indexOf(";", begin);
if (end == -1) {
end = dc.length;
}
return unescape(dc.substring(begin + prefix.length, end));
}
var locale=getCookie("locale");
if (locale!="") {
document.writeln("<meta name=\"gwt:property\" content=\"locale="+locale+"\"> ");
}
</script>
<meta name='gwt:module' content='MyModule'>
<link rel=stylesheet href="MyModule.css">
</head>

 


(тут попрошу прощение за потерянный origin кода на яваскрипте чтения значения cookie).


Таким образом при загрузке модуля будет установленна нужный язык.


Пример того, как оно работает можно посмотреть вот тут: lab.look.org.ua

1 comment:

Anonymous said...

Hey thanks.
This helped me a lot.

-- Devendra