Skip to content

Commit

Permalink
fix: #1528
Browse files Browse the repository at this point in the history
  • Loading branch information
wendal committed Oct 22, 2019
1 parent c8057ec commit 5768273
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 22 deletions.
62 changes: 40 additions & 22 deletions src/org/nutz/mvc/Mvcs.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.nutz.lang.util.Context;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.config.AtMap;
import org.nutz.mvc.i18n.LocalizationManager;
import org.nutz.mvc.impl.NutMessageMap;
import org.nutz.mvc.ioc.SessionIocContext;

Expand Down Expand Up @@ -51,14 +52,25 @@ public abstract class Mvcs {
public static boolean DISABLE_X_POWERED_BY = false;

public static String X_POWERED_BY = "nutz/"+Nutz.version()+" <nutzam.com>";

public static LocalizationManager localizationManager;

public static void setLocalizationManager(LocalizationManager localizationManager) {
Mvcs.localizationManager = localizationManager;
}

// ====================================================================

public static Map<String, Object> getLocaleMessage(String key) {
Map<String, Map<String, Object>> msgss = getMessageSet();
if (null != msgss)
return msgss.get(key);
return null;
public static Map<String, Object> getLocaleMessage(String local) {
if (localizationManager != null) {
return localizationManager.getMessageMap(local);
}
else {
Map<String, Map<String, Object>> msgss = getMessageSet();
if (null != msgss)
return msgss.get(local);
return null;
}
}

/**
Expand Down Expand Up @@ -175,24 +187,30 @@ public static String getDefaultLocalizationKey() {
*/
public static void updateRequestAttributes(HttpServletRequest req) {
// 初始化本次请求的多国语言字符串
Map<String, Map<String, Object>> msgss = getMessageSet();
if (msgss == null && !ctx().localizations.isEmpty())
msgss = ctx().localizations.values().iterator().next();
if (null != msgss) {
Map<String, Object> msgs = null;

String lKey = Strings.sBlank(Mvcs.getLocalizationKey(), getDefaultLocalizationKey());

if (!Strings.isBlank(lKey))
msgs = msgss.get(lKey);

// 没有设定特殊的 Local 名字,随便取一个
if (null == msgs) {
if (msgss.size() > 0)
msgs = msgss.values().iterator().next();
if (localizationManager == null) {
Map<String, Map<String, Object>> msgss = getMessageSet();
if (msgss == null && !ctx().localizations.isEmpty())
msgss = ctx().localizations.values().iterator().next();
if (null != msgss) {
Map<String, Object> msgs = null;

String lKey = Strings.sBlank(Mvcs.getLocalizationKey(), getDefaultLocalizationKey());

if (!Strings.isBlank(lKey))
msgs = msgss.get(lKey);

// 没有设定特殊的 Local 名字,随便取一个
if (null == msgs) {
if (msgss.size() > 0)
msgs = msgss.values().iterator().next();
}
// 记录到请求中
req.setAttribute(MSG, msgs);
}
// 记录到请求中
req.setAttribute(MSG, msgs);
}
else {
NutMessageMap msg = localizationManager.getMessageMap(Mvcs.getLocalizationKey());
req.setAttribute(MSG, msg);
}

// 记录一些数据到请求对象中
Expand Down
18 changes: 18 additions & 0 deletions src/org/nutz/mvc/i18n/LocalizationManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.nutz.mvc.i18n;

import java.util.Set;

import org.nutz.mvc.impl.NutMessageMap;

public interface LocalizationManager {

void setDefaultLocal(String local);

String getDefaultLocal();

Set<String> getLocals();

NutMessageMap getMessageMap(String local);

String getMessage(String local, String key);
}
48 changes: 48 additions & 0 deletions test/org/nutz/mvc/i18n/DemoLocalizationManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.nutz.mvc.i18n;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.nutz.mvc.impl.NutMessageMap;

/**
* LocalizationManager的参考实现.
* 可以在MainSetup.init方法内, 通过Mvcs.setLocalizationManager(ioc.get(MyLocalizationManager.class))设置默认实例.
* @author wendal
*
*/
public class DemoLocalizationManager implements LocalizationManager {

protected String defaultLocal;

protected Map<String, NutMessageMap> msgs = new HashMap<String, NutMessageMap>();

public void setDefaultLocal(String local) {
this.defaultLocal = local;
}

public String getDefaultLocal() {
return defaultLocal;
}

public Set<String> getLocals() {
return msgs.keySet();
}

// 如果要动态替换msg, 例如从数据库读取
// 请实现一个NutMessageMap的子类, 覆盖其get方法, 替换为动态实现
public NutMessageMap getMessageMap(String local) {
return msgs.get(local);
}

public String getMessage(String local, String key) {
NutMessageMap map = getMessageMap(local);
if (defaultLocal != null && map == null) {
map = getMessageMap(defaultLocal);
}
if (map == null)
return key;
return (String) map.getOrDefault(key, key);
}
}

0 comments on commit 5768273

Please sign in to comment.