diff --git a/ChangeLog b/ChangeLog index 7877340a9..c964898d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-12-20 Vicente J. Ruiz Jurado + * Added browser lang recognition and UI init language takes account of this + and also the user lang if is logged + 2007-12-17 Vicente J. Ruiz Jurado * TextEditor & I18n * Translation to English & Spanish diff --git a/TODO b/TODO index 684cdd386..17a053176 100644 --- a/TODO +++ b/TODO @@ -17,6 +17,9 @@ continue with the client search dialog See differences between star-yellow-grey.png and -50.png --> vjrj explorer specific problems: fonts antialiasing problem? + Ext localization: + http://groups.google.com/group/gwt-ext/browse_thread/thread/ebec316effea2b80/bfbdadc7239b4e5d?lnk=gst&q=i18n#bfbdadc7239b4e5d + http://extjs.com/forum/showthread.php?t=20160&highlight=localization MIND-TERM: -------------------------------------------------------------------------------- diff --git a/dev-utils/hibernate.reveng.xml b/dev-utils/hibernate.reveng.xml index db68ea1a1..f01439f71 100644 --- a/dev-utils/hibernate.reveng.xml +++ b/dev-utils/hibernate.reveng.xml @@ -1,12 +1,13 @@ - - - - - + + + + + - \ No newline at end of file + + diff --git a/src/main/java/org/ourproject/kune/app/client/KuneEntryPoint.java b/src/main/java/org/ourproject/kune/app/client/KuneEntryPoint.java index d055942e9..99cded523 100644 --- a/src/main/java/org/ourproject/kune/app/client/KuneEntryPoint.java +++ b/src/main/java/org/ourproject/kune/app/client/KuneEntryPoint.java @@ -27,6 +27,7 @@ import org.ourproject.kune.platf.client.KunePlatform; import org.ourproject.kune.platf.client.app.ApplicationBuilder; import org.ourproject.kune.platf.client.services.I18nUITranslation; +import org.ourproject.kune.platf.client.services.Kune; import org.ourproject.kune.workspace.client.WorkspaceClientModule; import to.tipit.gwtlib.FireLog; @@ -43,18 +44,26 @@ public KuneEntryPoint() { public void onModuleLoad() { final String userHash = Cookies.getCookie("userHash"); FireLog.debug("UserHash: " + userHash); - I18nUITranslation.getInstance().init(new AsyncCallback() { + Kune.I18N.getInitialLanguage(new AsyncCallback() { public void onFailure(final Throwable caught) { FireLog.debug("Workspace adaptation to your language failed"); } public void onSuccess(final Object result) { - I18nUITranslation.getInstance().setLexicon((HashMap) result); - KunePlatform platform = new KunePlatform(); - platform.install(new WorkspaceClientModule()); - platform.install(new DocsClientModule()); - platform.install(new ChatClientModule()); - new ApplicationBuilder(platform).build(userHash); + Kune.I18N.getInitialLexicon((String) result, new AsyncCallback() { + public void onFailure(final Throwable caught) { + FireLog.debug("Workspace adaptation to your language failed"); + } + + public void onSuccess(final Object result) { + I18nUITranslation.getInstance().setLexicon((HashMap) result); + KunePlatform platform = new KunePlatform(); + platform.install(new WorkspaceClientModule()); + platform.install(new DocsClientModule()); + platform.install(new ChatClientModule()); + new ApplicationBuilder(platform).build(userHash); + } + }); } }); } diff --git a/src/main/java/org/ourproject/kune/app/server/KuneApplicationListener.java b/src/main/java/org/ourproject/kune/app/server/KuneApplicationListener.java index 2becbdb0c..a7ed79a51 100644 --- a/src/main/java/org/ourproject/kune/app/server/KuneApplicationListener.java +++ b/src/main/java/org/ourproject/kune/app/server/KuneApplicationListener.java @@ -43,6 +43,7 @@ public void doAfter(final HttpServletRequest request, final HttpServletResponse String userSessionId = request.getSession().getId(); userSession.setHash(userSessionId); userSession.setBrowserLanguage(request.getLocale().getLanguage()); + // TODO: think about: httpServletResponse.sendRedirect(locale) ??? } public void doBefore(final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse) { diff --git a/src/main/java/org/ourproject/kune/platf/client/rpc/I18nService.java b/src/main/java/org/ourproject/kune/platf/client/rpc/I18nService.java index 01b866cc5..d250f7bdc 100644 --- a/src/main/java/org/ourproject/kune/platf/client/rpc/I18nService.java +++ b/src/main/java/org/ourproject/kune/platf/client/rpc/I18nService.java @@ -28,6 +28,8 @@ public interface I18nService extends RemoteService { + String getInitialLanguage(); + /** * @gwt.typeArgs */ diff --git a/src/main/java/org/ourproject/kune/platf/client/rpc/I18nServiceAsync.java b/src/main/java/org/ourproject/kune/platf/client/rpc/I18nServiceAsync.java index 968875f52..9c574236e 100644 --- a/src/main/java/org/ourproject/kune/platf/client/rpc/I18nServiceAsync.java +++ b/src/main/java/org/ourproject/kune/platf/client/rpc/I18nServiceAsync.java @@ -30,4 +30,6 @@ public interface I18nServiceAsync { void setTranslation(String userHash, String id, String translation, AsyncCallback asyncCallback); + void getInitialLanguage(AsyncCallback callback); + } diff --git a/src/main/java/org/ourproject/kune/platf/client/services/I18nUITranslation.java b/src/main/java/org/ourproject/kune/platf/client/services/I18nUITranslation.java index 0b773b6c3..12e39f3eb 100644 --- a/src/main/java/org/ourproject/kune/platf/client/services/I18nUITranslation.java +++ b/src/main/java/org/ourproject/kune/platf/client/services/I18nUITranslation.java @@ -39,7 +39,6 @@ public class I18nUITranslation { private static final String NOTE_FOR_TRANSLATOR_TAG_BEGIN = " [%NT "; private static final String NOTE_FOR_TRANSLATOR_TAG_END = "]"; // Also in I18nTranslation - private static final String DEFAULT_LANG = "en"; private static final String UNTRANSLATED_VALUE = null; private static I18nUITranslation instance; @@ -47,14 +46,21 @@ public class I18nUITranslation { private String currentLanguage; private I18nChangeListenerCollection i18nChangeListeners; - public void init(final AsyncCallback callback) { - currentLanguage = DEFAULT_LANG; + public void getInitialLanguage(final AsyncCallback callback) { Location loc = WindowUtils.getLocation(); String locale = loc.getParameter("locale"); if (locale != null) { + // If locale parameter exist, use it String[] localeSplitted = locale.split("_"); currentLanguage = localeSplitted[0]; + } else { + I18nServiceAsync server = I18nService.App.getInstance(); + server.getInitialLanguage(callback); } + } + + public void getInitialLexicon(final String initLanguage, final AsyncCallback callback) { + currentLanguage = initLanguage; I18nServiceAsync server = I18nService.App.getInstance(); server.getLexicon(currentLanguage, callback); } @@ -203,4 +209,5 @@ private void fireI18nLanguageChange() { i18nChangeListeners.fireI18nLanguageChange(); } } + } diff --git a/src/main/java/org/ourproject/kune/platf/server/domain/Container.java b/src/main/java/org/ourproject/kune/platf/server/domain/Container.java index 628f9d4ac..7d6a8dc25 100644 --- a/src/main/java/org/ourproject/kune/platf/server/domain/Container.java +++ b/src/main/java/org/ourproject/kune/platf/server/domain/Container.java @@ -50,7 +50,6 @@ public class Container implements HasId { private Container parent; @OneToMany(fetch = FetchType.LAZY) - // , mappedBy = "parent") private List childs; @OneToMany(mappedBy = "container") @@ -62,114 +61,126 @@ public class Container implements HasId { private String typeId; @OneToMany(cascade = CascadeType.ALL) - private List aliases; + private List containerTranslations; private String toolName; private String name; + @ManyToOne(fetch = FetchType.LAZY) + private I18nLanguage language; + public Container(final String parentPath, final String title, final Group group, final String toolName) { - this.name = title; - this.absolutePath = parentPath + SEP + title; - owner = group; - this.toolName = toolName; - this.contents = new ArrayList(); - this.childs = new ArrayList(); + this.name = title; + this.absolutePath = parentPath + SEP + title; + owner = group; + this.toolName = toolName; + this.contents = new ArrayList(); + this.childs = new ArrayList(); } public Container() { - this(null, null, null, null); + this(null, null, null, null); } public String getName() { - return name; + return name; } public void setName(final String name) { - this.name = name; + this.name = name; } public Long getParentFolderId() { - return parent != null ? parent.getId() : null; + return parent != null ? parent.getId() : null; } public Container getParent() { - return parent; + return parent; } public Long getId() { - return id; + return id; } public void setId(final Long id) { - this.id = id; + this.id = id; } public void setParent(final Container parent) { - this.parent = parent; + this.parent = parent; } public List getChilds() { - return childs; + return childs; } public void setChilds(final List childs) { - this.childs = childs; + this.childs = childs; } public String getAbsolutePath() { - return absolutePath; + return absolutePath; } public void setAbsolutePath(final String absolutePath) { - this.absolutePath = absolutePath; + this.absolutePath = absolutePath; } - public List getAliases() { - return aliases; + public List getAliases() { + return containerTranslations; } - public void setAliases(final List aliases) { - this.aliases = aliases; + public void setAliases(final List containerTranslations) { + this.containerTranslations = containerTranslations; } public Group getOwner() { - return owner; + return owner; } public void setOwner(final Group owner) { - this.owner = owner; + this.owner = owner; } public String getToolName() { - return toolName; + return toolName; } public void setToolName(final String toolName) { - this.toolName = toolName; + this.toolName = toolName; } public void addContent(final Content descriptor) { - // FIXME: algo de lazy initialization (con size() se arregla...) - contents.size(); - contents.add(descriptor); + // FIXME: something related with lazy initialization (workaround using + // size()) + contents.size(); + contents.add(descriptor); } public String getTypeId() { - return typeId; + return typeId; } public void setTypeId(final String typeId) { - this.typeId = typeId; + this.typeId = typeId; } public List getContents() { - return contents; + return contents; } public void addChild(final Container container) { - childs.size(); - childs.add(container); + childs.size(); + childs.add(container); + } + + public I18nLanguage getLanguage() { + return language; + } + + public void setLanguage(final I18nLanguage language) { + this.language = language; } } diff --git a/src/main/java/org/ourproject/kune/platf/server/domain/Alias.java b/src/main/java/org/ourproject/kune/platf/server/domain/ContainerTranslation.java similarity index 73% rename from src/main/java/org/ourproject/kune/platf/server/domain/Alias.java rename to src/main/java/org/ourproject/kune/platf/server/domain/ContainerTranslation.java index c21a2b34a..a7e2f4151 100644 --- a/src/main/java/org/ourproject/kune/platf/server/domain/Alias.java +++ b/src/main/java/org/ourproject/kune/platf/server/domain/ContainerTranslation.java @@ -21,41 +21,46 @@ package org.ourproject.kune.platf.server.domain; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name = "aliases") -public class Alias implements HasId { +public class ContainerTranslation implements HasId { @Id @GeneratedValue private Long id; - private String locale; + + @ManyToOne(fetch = FetchType.LAZY) + private I18nLanguage language; + private String name; public Long getId() { - return id; + return id; } public void setId(final Long id) { - this.id = id; + this.id = id; } - public String getLocale() { - return locale; + public String getName() { + return name; } - public void setLocale(final String locale) { - this.locale = locale; + public void setName(final String name) { + this.name = name; } - public String getName() { - return name; + public I18nLanguage getLanguage() { + return language; } - public void setName(final String name) { - this.name = name; + public void setLanguage(final I18nLanguage language) { + this.language = language; } } diff --git a/src/main/java/org/ourproject/kune/platf/server/domain/Content.java b/src/main/java/org/ourproject/kune/platf/server/domain/Content.java index 7c65820eb..96e3880c3 100644 --- a/src/main/java/org/ourproject/kune/platf/server/domain/Content.java +++ b/src/main/java/org/ourproject/kune/platf/server/domain/Content.java @@ -26,6 +26,7 @@ import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; @@ -69,19 +70,22 @@ public class Content implements HasStateToken { private String typeId; @OneToMany(cascade = CascadeType.ALL) - private List translations; + private List translations; @ManyToOne private Container container; - // TODO: lang, languages, etc - private String locale; + @ManyToOne(fetch = FetchType.LAZY) + private I18nLanguage language; @OneToOne(cascade = CascadeType.ALL) private AccessLists accessLists; + @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) + private List authors; + public Content() { - translations = new ArrayList(); + translations = new ArrayList(); tags = new ArrayList(); this.createdOn = System.currentTimeMillis(); this.lastRevision = new Revision(); @@ -104,14 +108,6 @@ public void setVersion(final int version) { this.version = version; } - public String getLocale() { - return locale; - } - - public void setLocale(final String locale) { - this.locale = locale; - } - public AccessLists getAccessLists() { return accessLists; } @@ -144,11 +140,11 @@ public void setLastRevision(final Revision revision) { this.lastRevision = revision; } - public List getTranslations() { + public List getTranslations() { return translations; } - public void setTranslations(final List translations) { + public void setTranslations(final List translations) { this.translations = translations; } @@ -201,9 +197,25 @@ public boolean hasAccessList() { return accessLists != null; } + public I18nLanguage getLanguage() { + return language; + } + + public void setLanguage(final I18nLanguage language) { + this.language = language; + } + public String getStateToken() { return getFolder().getOwner().getShortName() + TOKEN_SEPARATOR + getFolder().getToolName() + TOKEN_SEPARATOR + getFolder().getId() + TOKEN_SEPARATOR + getId(); } + public List getAuthors() { + return authors; + } + + public void setAuthors(final List authors) { + this.authors = authors; + } + } diff --git a/src/main/java/org/ourproject/kune/platf/server/domain/Translation.java b/src/main/java/org/ourproject/kune/platf/server/domain/ContentTranslation.java similarity index 70% rename from src/main/java/org/ourproject/kune/platf/server/domain/Translation.java rename to src/main/java/org/ourproject/kune/platf/server/domain/ContentTranslation.java index 8c1a62972..11827f41b 100644 --- a/src/main/java/org/ourproject/kune/platf/server/domain/Translation.java +++ b/src/main/java/org/ourproject/kune/platf/server/domain/ContentTranslation.java @@ -21,41 +21,46 @@ package org.ourproject.kune.platf.server.domain; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity -@Table(name = "translations") -public class Translation implements HasId { +@Table(name = "content_translations") +public class ContentTranslation implements HasId { @Id @GeneratedValue private Long id; - private String locale; + + @ManyToOne(fetch = FetchType.LAZY) + private I18nLanguage language; + private Long contentId; public Long getId() { - return id; + return id; } public void setId(final Long id) { - this.id = id; + this.id = id; } - public String getLocale() { - return locale; + public Long getContentId() { + return contentId; } - public void setLocale(final String locale) { - this.locale = locale; + public void setContentId(final Long contentId) { + this.contentId = contentId; } - public Long getContentId() { - return contentId; + public I18nLanguage getLanguage() { + return language; } - public void setContentId(final Long contentId) { - this.contentId = contentId; + public void setLanguage(final I18nLanguage language) { + this.language = language; } } diff --git a/src/main/java/org/ourproject/kune/platf/server/rpc/I18nRPC.java b/src/main/java/org/ourproject/kune/platf/server/rpc/I18nRPC.java index bb8f13257..ff5771ecf 100644 --- a/src/main/java/org/ourproject/kune/platf/server/rpc/I18nRPC.java +++ b/src/main/java/org/ourproject/kune/platf/server/rpc/I18nRPC.java @@ -24,6 +24,7 @@ import org.ourproject.kune.platf.client.rpc.I18nService; import org.ourproject.kune.platf.server.UserSession; +import org.ourproject.kune.platf.server.domain.I18nTranslation; import org.ourproject.kune.platf.server.manager.I18nTranslationManager; import com.google.gwt.user.client.rpc.SerializableException; @@ -35,12 +36,30 @@ @Singleton public class I18nRPC implements RPC, I18nService { private final I18nTranslationManager i18nTranslationManager; + private final UserSession userSession; @Inject - public I18nRPC(final UserSession session, final I18nTranslationManager i18nTranslationManager) { + public I18nRPC(final UserSession userSession, final I18nTranslationManager i18nTranslationManager) { + this.userSession = userSession; this.i18nTranslationManager = i18nTranslationManager; } + @Transactional(type = TransactionType.READ_ONLY) + public String getInitialLanguage() { + String initLanguage; + if (userSession.isUserLoggedIn()) { + initLanguage = userSession.getUser().getLanguage().getCode(); + } else { + if (userSession.getBrowserLanguage() != null) { + // Not logged, use browser language if possible + initLanguage = userSession.getBrowserLanguage(); + } else { + initLanguage = I18nTranslation.DEFAULT_LANG; + } + } + return initLanguage; + } + @Transactional(type = TransactionType.READ_ONLY) public HashMap getLexicon(final String language) { return i18nTranslationManager.getLexicon(language);