1

我正在尝试localization为用户定义的输入构建一个。示例:用户可以定义足球等类别,但可以使用多种语言。

模型实体可能有这样的文件:

    @ManyToMany     
    @MapKeyColumn(name = "locale", insertable = false, updatable = false)     
    public Map<String, L18n> titles;

我想像这样存储本地化的字符串:

@Entity
public class L18n {

    @Id
    @Constraints.Required
    @Formats.NonEmpty
    public Integer id;

    public String key;

    public String locale;

    @Column(columnDefinition = "TEXT")
    public String text;

}

我们使用yaml来存储测试数据:

    category:

        - !!models.Category
                ...
                titles: 
                    - !!models.L18n
                         key: soccer


    l18n:

         - !!models.L18n
                key: soccer
                locale: de-CH
                text: fdfdfsee

         - !!models.L18n
                key: soccer
                locale: fr-CH
                text: dlfkjsdlfj

使用此解决方案,我收到此错误:

    [error] Caused by: org.yaml.snakeyaml.error.YAMLException: No suitable constructor with 1 arguments found for interface java.util.Map
    [error]     at org.yaml.snakeyaml.constructor.Constructor$ConstructSequence.construct(Constructor.java:574)
    [error]     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
    [error]     at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:296)
    [error]     ... 65 more
4

1 回答 1

0

我认为问题在于您已将标题定义为地图,但不要使用 YAML 映射语法来定义它。 YAML 集合

我认为标题的语法应该看起来像这里使用语言的示例:YAML 字典示例

titles: 
    soccer: - !!models.L18n
                key: soccer
                locale: de-CH
                text: fdfdfsee
    football: - !!models.L18n
              ...

如果您更改 .yml 文件的格式,以便首先定义 L18n 实例并使用引用,YAML 规范将它们称为Alias Nodes,您可以使您的标题看起来更加精简:

l18n:

     - &soccerDE !!models.L18n
            key: soccer
            locale: de-CH
            text: fdfdfsee

     - &soccerFR !!models.L18n
            key: soccer
            locale: fr-CH
            text: dlfkjsdlfj

category:

    - !!models.Category
            ...
            titles: 
                soccerDE: *soccerDE
                soccerFR: *soccerFR
于 2013-05-22T12:35:48.763 回答