【发布时间】:2015-01-02 02:46:40
【问题描述】:
我知道,我有一个问题已被广泛讨论,但在我看来,还有一个方面需要澄清。
我正在创建一个带有多语言数据库的 Web 应用程序,我已经找到了一些好的实践文章(例如 this)并在堆栈溢出中找到了答案,例如 this。
所以我决定使用一个包含我的项目 ID 的主表和另一个包含每个项目的翻译的表,例如
Content
ContentTranslation
或
Category
CategoryTranslation
等等。
现在我在做什么?我只是从数据库中获取带有所有翻译的项目,然后我遍历每个项目以根据当前用户的本地查找正确的翻译,如果找到正确的本地,我将设置为页面翻译的主要对象渲染,否则我只会得到标记为“默认”的翻译。
但是,如果有大量对象和翻译,服务器响应时间可能会增加,即使用户可能没有注意到,我也不希望这样。
那么,这个用例也有什么好的做法吗?例如,一些特定的查询说“选择带有语言环境“它”的翻译,但如果你没有找到它,只需获取设置了“默认”标志的翻译?
现在,我将 Spring MVC 与 Hibernate 和 JPA 结合使用(通过 JPARepository)。
我的所有对象都扩展了我以这种方式创建的基本 Translatable 类
@MappedSuperclass
public abstract class Translatable<T extends Translation> extends BaseDTO {
private static final long serialVersionUID = 562001309781752460L;
private String title;
@OneToMany(fetch=FetchType.EAGER, orphanRemoval=true, cascade=CascadeType.ALL)
private Set<T> translations = new HashSet<T>();
@Transient private T currentLocale;
public void addLocale(T translation, boolean edit) {
if (!edit)
getTranslations().add(translation);
}
public void remLocale(String locale) {
T tr = null;
for (T candidate: getTranslations()) {
if (candidate.getLocale().equals(locale))
tr = candidate;
}
getTranslations().remove(tr);
}
public T getLocaleFromString(String locale) {
if (locale == null)
return null;
for (T trans: translations) {
if (trans.getLocale().equals(locale))
return trans;
}
return null;
}
public T getDefaultLocale() {
for (T tr: translations) {
if (tr.isDefaultLocale())
return tr;
}
return null;
}
public Set<T> getTranslations() {
return translations;
}
public void setTranslations(Set<T> translations) {
this.translations = translations;
}
public T getCurrentLocale() {
return currentLocale;
}
public void setCurrentLocale(T currentLocale) {
this.currentLocale = currentLocale;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
因此,在我的控制器中,我遍历翻译,找到具有正确语言环境的翻译并填充“currentLocale”属性,在我的页面中,我只是采用它,用户会按预期获得正确的语言。
我希望我说得清楚而不是乱七八糟,但是如果您需要更多信息,我很乐意告诉您更多信息。
【问题讨论】:
-
对于不同的语言环境使用不同的数据库会不会更容易?
-
我认为这不是一个好的解决方案,因为所有数据必须同时可用,所以我必须查询多个数据库,如果管理员选择添加另一种语言他还必须创建另一个数据库的应用程序...
标签: java database spring jpa multilingual