来自db的多语言支持数据

时间:2012-07-15 18:10:39

标签: java jpa

我的应用程序具有nameEn和nameDe的实体,用于英语和德语。但现在只使用英语。由于有很多实体可用,我希望有一个可以返回所选语言条目的泛型类,但对于多个条目,我的方法不起作用。

 @Entity
 @Table(name="employee")    
 public class Employee  implements java.io.Serializable {
     // Fields
   private Integer id;
   private String nameEn;      
   private String nameDe;    

   //Getter, Setter Methods 
}

@Entity 
@Table(name="address")
public class Address implements 
  java.io.Serializable {

 private String descriptionEn;
 private String descriptionDe;
}

public interface ILabelText {
   String getNameEn();
   String getNameDe();   
   String getDescriptionEn();
   String getDescriptionDe();   
}

public abstract class LabelText implements ILabelText, Serializable {

private static final long serialVersionUID = 1L;

protected String descriptionEn;
protected String descriptionDe;


private Logger log = Logger.getLogger(LabelText.class);
String language = FacesContext.getCurrentInstance().getViewRoot().getLocale().getLanguage();


public String getDescription() {        
    log.info("Language Selected is  " + language);
    if (language.equals("De")) {
        return getDescriptionDe();
    } else {
        return getDescriptionEn();
    }
}

    public String getName() {       
    log.info("Language Selected is  " + language);
    if (language.equals("De")) {
        return getNameDe();
    } else {
        return getNameEn();
    }
}
}


//In Xhtml, based on selected locale, display value accordingly
<h:outputText value="#{emp.getName()}" />
<h:outputText value="#{add.getDescription()}" />

2 个答案:

答案 0 :(得分:1)

您可以像这样创建一个实体Lang

@Entity
public class Lang implements Serializable
{
  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  private long id;

  @NotNull
  private String key;

  @NotNull
  private String translation;
}

并在您的Address中使用它

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@MapKey(name = "key")
protected Map<String, Lang> name;

然后您就可以在JSF中访问正确的语言了:

<h:outputText value="#{emp.name[userLocale].translation}" />

表达式userLocale应解析为您的语言密钥(ende...),或者可以硬编码,例如#{emp.name['en'].translation}

答案 1 :(得分:0)

您可以更轻松地创建包含翻译的表格:

e.g: 人 - &gt;你所有的人 PersonTranslations

人物| ID PersonTranslations |区域;为person_id;

然后在您的Person类上设置谓词

上所有属性的语言

Person.description(这将使用person_id键和区域设置搜索PersonTranslation) 有些像PersonTranslation.find(1,'en');

enter image description here