Skip to content

Commit 2994692

Browse files
committed
Introduced CurrentLocaleResolver component allowing to override implementation for guessing current locale in MessagesRouter
It may be useful if, for instance, request.getLocale() is not *always* used to guess current user's locale (for instance if the user's locale is part of the user's data)
1 parent 3689c6b commit 2994692

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package restx.i18n;
2+
3+
import restx.RestxRequest;
4+
import restx.StdRequest;
5+
6+
import java.util.Locale;
7+
8+
/**
9+
* @author fcamblor
10+
*/
11+
public interface CurrentLocaleResolver {
12+
Locale guessLocale(RestxRequest request);
13+
}

restx-i18n/src/main/java/restx/i18n/I18nModule.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import restx.AppSettings;
44
import restx.RestxContext;
5+
import restx.RestxRequest;
56
import restx.factory.Module;
67
import restx.factory.Provides;
78

@@ -25,6 +26,16 @@ public Messages messages(AppSettings appSettings) {
2526
}
2627
}
2728

29+
@Provides @Named("CurrentLocaleResolver")
30+
public CurrentLocaleResolver currentLocaleResolver(){
31+
return new CurrentLocaleResolver() {
32+
@Override
33+
public Locale guessLocale(RestxRequest request) {
34+
return request.getLocale();
35+
}
36+
};
37+
}
38+
2839
@Provides @Named("ROOT")
2940
public SupportedLocale rootSupportedLocale() {
3041
return new SupportedLocale(Locale.ROOT);

restx-i18n/src/main/java/restx/i18n/MessagesRouter.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,24 @@
2323
@Component
2424
public class MessagesRouter extends RestxRouter {
2525
public MessagesRouter(@Named("Messages") Messages messages,
26-
@Named("restx.i18n.labelsJsTemplate") String labelsJsTemplate) {
27-
super("MessagesRouter", new JsonLabelsRoute(messages), new JsLabelsRoute(messages, labelsJsTemplate));
26+
@Named("restx.i18n.labelsJsTemplate") String labelsJsTemplate,
27+
@Named("CurrentLocaleResolver") CurrentLocaleResolver currentLocaleResolver) {
28+
super("MessagesRouter", new JsonLabelsRoute(messages, currentLocaleResolver), new JsLabelsRoute(messages, labelsJsTemplate, currentLocaleResolver));
2829
}
2930

3031
private static class JsonLabelsRoute extends StdRoute {
3132
private final Messages messages;
33+
private CurrentLocaleResolver currentLocaleResolver;
3234

33-
public JsonLabelsRoute(Messages messages) {
35+
public JsonLabelsRoute(Messages messages, CurrentLocaleResolver currentLocaleResolver) {
3436
super("labels.json", new StdRestxRequestMatcher("GET", "/i18n/labels.json"));
3537
this.messages = messages;
38+
this.currentLocaleResolver = currentLocaleResolver;
3639
}
3740

3841
@Override
3942
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
40-
Iterable<Entry<String, String>> entries = messages.entries(req.getLocale());
43+
Iterable<Entry<String, String>> entries = messages.entries(currentLocaleResolver.guessLocale(req));
4144
handleETagFor(req, resp, entries);
4245
resp.setStatus(HttpStatus.OK);
4346
resp.setContentType("application/json");
@@ -50,12 +53,14 @@ public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp
5053

5154
private static class JsLabelsRoute extends StdRoute {
5255
private final Messages messages;
56+
private final CurrentLocaleResolver currentLocaleResolver;
5357
private final String labelsJsBefore;
5458
private final String labelsJsAfter;
5559

56-
public JsLabelsRoute(Messages messages, String labelsJsTemplate) {
60+
public JsLabelsRoute(Messages messages, String labelsJsTemplate, CurrentLocaleResolver currentLocaleResolver) {
5761
super("labels.js", new StdRestxRequestMatcher("GET", "/i18n/labels.js"));
5862
this.messages = messages;
63+
this.currentLocaleResolver = currentLocaleResolver;
5964
int i = labelsJsTemplate.indexOf("{LABELS}");
6065
if (i == -1) {
6166
throw new IllegalArgumentException("invalid labels js template. It must have {LABELS} token inside." +
@@ -67,7 +72,7 @@ public JsLabelsRoute(Messages messages, String labelsJsTemplate) {
6772

6873
@Override
6974
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
70-
Iterable<Entry<String, String>> entries = messages.entries(req.getLocale());
75+
Iterable<Entry<String, String>> entries = messages.entries(currentLocaleResolver.guessLocale(req));
7176
handleETagFor(req, resp, entries);
7277

7378
resp.setStatus(HttpStatus.OK);

0 commit comments

Comments
 (0)