gpt4 book ai didi

java - 用于 java web-app 的数据库支持的 i18n

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:40 29 4
gpt4 key购买 nike

我想使用数据库来存储 i18n 键/值对,以便我们可以在运行时修改/重新加载 i18n 数据。有没有人这样做过?或者有人知道如何实现这个吗?我已经阅读了几个关于此的主题,但我还没有看到可行的解决方案。

我特别指的是一些可以与 jSTL 标签一起工作的东西,比如

<fmt:setlocale>
<fmt:bundle>
<fmt:setBundle>
<fmt:message>

我认为这将涉及扩展 ResourceBundle,但是当我尝试这样做时,我遇到了与 jSTL 标签获取资源包的方式有关的问题。

最佳答案

在 danb 的帮助下,我终于搞定了。

这是我的资源包类和资源包控制类。

我使用了@[danb] 的这段代码。

ResourceBundle bundle = ResourceBundle.getBundle("AwesomeBundle", locale, DbResourceBundle.getMyControl());
javax.servlet.jsp.jstl.core.Config.set(actionBeanContext.getRequest(), Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

并编写了这个类。

public class DbResourceBundle extends ResourceBundle
{
private Properties properties;

public DbResourceBundle(Properties inProperties)
{
properties = inProperties;
}

@Override
@SuppressWarnings(value = { "unchecked" })
public Enumeration<String> getKeys()
{
return properties != null ? ((Enumeration<String>) properties.propertyNames()) : null;
}

@Override
protected Object handleGetObject(String key)
{
return properties.getProperty(key);
}

public static ResourceBundle.Control getMyControl()
{
return new ResourceBundle.Control()
{

@Override
public List<String> getFormats(String baseName)
{
if (baseName == null)
{
throw new NullPointerException();
}
return Arrays.asList("db");
}

@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException,
InstantiationException, IOException
{
if ((baseName == null) || (locale == null) || (format == null) || (loader == null))
throw new NullPointerException();
ResourceBundle bundle = null;
if (format.equals("db"))
{
Properties p = new Properties();
DataSource ds = (DataSource) ContextFactory.getApplicationContext().getBean("clinicalDataSource");
Connection con = null;
Statement s = null;
ResultSet rs = null;
try
{
con = ds.getConnection();
StringBuilder query = new StringBuilder();
query.append("select label, value from i18n where bundle='" + StringEscapeUtils.escapeSql(baseName) + "' ");

if (locale != null)
{
if (StringUtils.isNotBlank(locale.getCountry()))
{
query.append("and country='" + escapeSql(locale.getCountry()) + "' ");

}
if (StringUtils.isNotBlank(locale.getLanguage()))
{
query.append("and language='" + escapeSql(locale.getLanguage()) + "' ");

}
if (StringUtils.isNotBlank(locale.getVariant()))
{
query.append("and variant='" + escapeSql(locale.getVariant()) + "' ");

}
}
s = con.createStatement();
rs = s.executeQuery(query.toString());
while (rs.next())
{
p.setProperty(rs.getString(1), rs.getString(2));
}
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException("Can not build properties: " + e);
}
finally
{
DbUtils.closeQuietly(con, s, rs);
}
bundle = new DbResourceBundle(p);
}
return bundle;
}

@Override
public long getTimeToLive(String baseName, Locale locale)
{
return 1000 * 60 * 30;
}

@Override
public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
{
return true;
}

};
}

关于java - 用于 java web-app 的数据库支持的 i18n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com