У меня есть вопрос, который, я знаю, широко обсуждался, но, на мой взгляд, есть один аспект, который все еще нуждается в разъяснении.
Я создаю веб-приложение с многоязычной базой данных, я уже нашел некоторые статьи о хороших практиках (например, this) и ответы здесь в переполнении стека, например .
Итак, я решил использовать основную таблицу с идентификаторами моих элементов и другую таблицу с переводом для каждого элемента, скажем, например
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, на моей странице я просто беру это, и пользователь получает правильный язык, как предполагалось.
Надеюсь, я был ясен и не беспорядочен, но если вам нужна дополнительная информация, я буду рад рассказать вам больше.