Thanks for the reply. But unfortunately it does not work. In the web browser it shows:
XMLHttpRequest cannot load > http://192.168.10.4:9876/traccar/i18n/org/traccar/web/client/i18n/Messages/default. > > No 'Access-Control-Allow-Origin' header is present on the requested > resource. Origin 'http://192.168.10.4:8888' is therefore not allowed access. This is not that bad. However, on that URL there is nothing: curl -v > http://192.168.10.4:9876/traccar/i18n/org/traccar/web/client/i18n/Messages/default > * Hostname was NOT found in DNS cache > * Trying 192.168.10.4... > * Connected to 192.168.10.4 (192.168.10.4) port 9876 (#0) > > GET /traccar/i18n/org/traccar/web/client/i18n/Messages/default HTTP/1.1 > > User-Agent: curl/7.37.1 > > Host: 192.168.10.4:9876 > > Accept: */* > > > < HTTP/1.1 200 OK > < Content-Length: 0 > * Server Jetty(8.y.z-SNAPSHOT) is not blacklisted > < Server: Jetty(8.y.z-SNAPSHOT) > < > * Connection #0 to host 192.168.10.4 left intact Maybe my approach to generate localized JSON objects for loading at runtime is wrong and I should stick with some kind of servlet. Just thought that for GWT this will be a blessed way. I don't know... пятница, 11 декабря 2015 г., 22:17:42 UTC+3 пользователь Thomas Broyer написал: > > In > https://github.com/vitalidze/traccar-web/blob/12ceb111e20bb79aa9e046b9b9db5aae5aa84ffd/src/main/java/org/traccar/web/i18n/client/StringTranslator.java#L51 > > you need to use GWT.getModuleBaseForStaticFiles() instead of > GWT.getModuleBaseURL(). > > http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/GWT.html#getModuleBaseForStaticFiles() > > On Friday, December 11, 2015 at 4:37:39 PM UTC+1, Vitaly Litvak wrote: >> >> Hi >> >> I am trying to reduce the compilation time of my GWT app. There are about >> 160 permutations done for now and the reason is big number of >> languages/locales supported. The main idea is to get rid of the static >> compilation and replace it with dynamic loading of localized data. I have >> almost succeeded, but now I am facing the problem with linker, which does >> not expose public artifacts when I run project from IntelliJ Idea. I will >> give more details and then point where the problem is now. >> >> I already have the `Messages` interface and multiple `.properties` files >> with defined translations and also I am using GXT library, which also uses >> 'static' internationalization. Thus the only way I can imagine myself is to >> replace the Localizable generator with my own implementation. I have >> defined it in a separate module: >> >> <generate-with class="org.traccar.web.i18n.rebind.LocalizableGenerator"> >> <when-type-assignable class="com.google.gwt.i18n.shared.Localizable" /> >> </generate-with> >> >> >> Then in generator I simply produce a single implementation, which will use >> another class to load the strings from module's resources available under >> {module.base.url}/i18n/path/to/package/ClassName/{locale}, for example >> MyModule/i18n/com/google/gwt/i18n/client/constants/NumberConstantsImpl/ru >> >> >> I intend to store the localized strings as JSON object, which will be >> generated by the 'generator' as well. Here is the code of my >> 'LocalizableGenerator': >> >> >> JsonFactory jsonFactory = new JsonFactory(); >> for (GwtLocale locale : localeParams.allLocales) { >> AbstractResource.ResourceList resourceList = null; >> try { >> resourceList = ResourceFactory.getBundle(logger, targetClass, locale, >> assignableToConstants, context); >> OutputStream os = context.tryCreateResource(logger, resource + "/" + >> locale.toString()); >> if (os != null) { >> JsonGenerator jg = jsonFactory.createGenerator(os, >> JsonEncoding.UTF8); >> jg.writeStartObject(); >> for (String key : resourceList.keySet()) { >> AbstractResource.ResourceEntry entry = >> resourceList.getEntry(key); >> Collection<String> forms = entry.getForms(); >> if (forms.isEmpty()) { >> jg.writeStringField(key, resourceList.getString(key)); >> } else { >> jg.writeObjectFieldStart(key); >> jg.writeStringField("null", resourceList.getString(key)); >> for (String form : forms) { >> jg.writeStringField(form, entry.getForm(form)); >> } >> jg.writeEndObject(); >> } >> } >> jg.writeEndObject(); >> jg.flush(); >> GeneratedResource generatedResource = >> context.commitResource(logger, os); >> context.commitArtifact(logger, generatedResource); >> } >> } catch (MissingResourceException e) { >> throw error(logger, >> "Localization failed; there must be at least one resource >> accessible through" >> + " the classpath in package '" + >> targetClass.getPackage().getName() >> + "' whose base name is '" >> + ResourceFactory.getResourceName(targetClass) + >> "'"); >> } catch (IllegalArgumentException e) { >> // A bad key can generate an illegal argument exception. >> throw error(logger, e.getMessage()); >> } catch (IOException e) { >> throw error(logger, e); >> } >> } >> >> >> The generation works just fine. I can see produced files in a temporary >> folder. Looks like they are included in the .war file as well when I produce >> it with maven. However, they are not visible when I run my application in >> SDM from IntelliJ Idea. >> >> >> Full source code is available on github: >> https://github.com/vitalidze/traccar-web/tree/dynamic_i18n >> >> >> Commit with above changes: >> https://github.com/vitalidze/traccar-web/commit/12ceb111e20bb79aa9e046b9b9db5aae5aa84ffd >> >> >> Any help appreciated. >> >> -- You received this message because you are subscribed to the Google Groups "GWT Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-web-toolkit. For more options, visit https://groups.google.com/d/optout.
