【问题标题】:Internationalization for user defined input用户定义输入的国际化
【发布时间】:2013-05-21 07:54:02
【问题描述】:

我正在尝试为用户定义的输入构建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

【问题讨论】:

    标签: internationalization playframework yaml playframework-2.1 ebean


    【解决方案1】:

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

    我认为标题的语法应该类似于此处使用语言的示例:YAML Dictionary Example

    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
    

    【讨论】:

    • 您好,谢谢您的回答!我实施了某种解决方法,但我会在有时间的时候检查一下......
    • 没问题。我绝不是 yaml 专家:我花更多时间诅咒无用的错误消息和语法,而不是有效地编写或调试,但几周前我做了类似的事情。
    猜你喜欢
    • 2015-04-08
    • 2017-12-25
    • 2011-04-26
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多