来自数据库备份的属性文件的 Grails i18n?

标签 grails internationalization

我想找到一个可以使用由数据库备份的 i18n 属性文件的情况?

所以对于一些标准的东西,我想使用属性文件,但有些字段必须由最终用户编辑,所以我计划为此在数据库中使用 i18n。所以一个真正的组合会很棒。如果在属性文件中找不到 i18n 代码,则在数据库中进行查找。

知道我该如何解决这个问题吗?我看过帖子Grails i18n From Database but Default Back To File

但是这个问题没有真正的答案,关于如何解决这个问题还有其他建议吗?

最佳答案

将一个新的域类放入您的项目中:

class Message {
    String code
    Locale locale
    String text
}

将以下行添加到您的 resources.groovy:

// Place your Spring DSL code here
beans = {
    messageSource(DatabaseMessageSource) {
        messageBundleMessageSource = ref("messageBundleMessageSource")
    }    
    messageBundleMessageSource(org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource) {
        basenames = "WEB-INF/grails-app/i18n/messages"
    }
}

并将以下类添加到您的 src/groovy 文件夹中:

class DatabaseMessageSource extends AbstractMessageSource {

    def messageBundleMessageSource

    protected MessageFormat resolveCode(String code, Locale locale) {
         Message msg = messageBundleMessageSource.resolveCode(code, locale)
         def format
         if(msg) {
             format = new MessageFormat(msg.text, msg.locale)
         }
         else {
             format = Message.findByCodeAndLocale(code, locale)
         }
         return format;
    }
}

现在 grails 将尝试从消息包中解析消息。如果它不可用,它将从数据库中查找。您可以添加一些错误处理,但如果所有消息至少在一个地方可用,则此版本有效。

参见 http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html了解更多详情。


有关 resources.groovy 中所做更改的一些详细信息:

在此文件中,您可以定义可注入(inject)的 groovy 类,只需定义一个与 resources.groovy 中定义的变量同名的变量即可包含这些类。例如。在此文件中,有 messageSourcemessageBundleMessageSource,您可以将其包含在任何 Controller 或服务文件中。如果定义了该变量,则创建括号中类的实例。

在这种情况下,我们覆盖一般的 messageSource 以使用我们的自定义实现 DatabaseMessageSource。因此,I18n 函数 message 现在将使用我们的自定义实现。

由于我们的自定义实现需要检查 message.properties 文件,因此我们将原始 消息源保留在第二个 bean 中。通过在我们的自定义实现中定义这个实例,我们仍然可以使用旧的实现(因此以通常的方式查找消息)。

关于来自数据库备份的属性文件的 Grails i18n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297505/

相关文章:

javascript - ngx-translate 和 ngx-i18next 有什么区别

hibernate - Grails Domain Binder.getMapping(Domain)对于Grails-3.2.4中的非持久性域返回null

chalice 3 : gradle-clover-plugin integration

ios - 为非标准语言环境本地化应用程序

php - Doctrine postSave、postUpdate 和国际化(检测修改)

php - 为语言路径设置 codeigniter 路由

json - 在 Grails 中制作和自定义 JSON 响应的最佳方式?

google-app-engine - 我已经安装了 grails 应用引擎插件,我使用 intellij,我怎样才能让 intellij 不再因为 jdo 错误而对我大喊大叫?

grails - grails 中的自定义标记库未正确传递 HTML 标记

ruby-on-rails - 具有管理 namespace 的 Rails 3 中的 I18n