我正在尝试在我的grails应用程序中实现i18n功能,但不仅仅是消息(菜单,标签等)。我正在尝试为我的域类的实际文本字段执行此操作。
到目前为止,我的解决方案包括创建一个这样的域类:
class LocalizedText {
String text
Locale locale
static hasMany=[translations : LocalizedText]
String getTranslation(String locale) {
def translation = this.translations.find(locale:locale)
if (translation != null) {
return translation
} else {
return this
}
}
}
然后,例如,我将拥有一个具有单个可翻译字段的域类:
class News {
LocalizedText contents
// [...]
}
然后,在我的控制器上,检查lang参数并选择翻译(如果存在),或者如果没有可用于给定语言环境的翻译,则选择默认语言。 例如:
class NewsController {
def list = {
def newsContents = []
News.list().each {
newsContents << [contents : it.contents.getTranslation(params.lang)]
}
[news : newsContents]
}
}
很抱歉,如果有错误,但这是我在网络表单中编写的想法: - )
我相信那里有更清洁的解决方案,所以我只是想让你开始讨论这个复杂的主题。
谢谢!
答案 0 :(得分:2)
我们遇到了同样的问题,并最终得到了基本相同的实现:
class Translatable {
Map<String, String> values = [:]
static mapping = {
columns {
values column: 'val'
}
values type: 'text', lazy: false
}
def putAt(key, value) {
values[key.toString()] = value.toString()
return value
}
def getAt(key) {
return values[key.toString()]
}
}
putAt和getAt方法允许您将对象视为地图:
Translatable translatable = new Translatable()
translatable[Locale.ENGLISH] = "TexT"
prinlnt translatable[Locale.ENGLISH]
答案 1 :(得分:2)
你应该看看“i18n Fields”插件。
答案 2 :(得分:0)
这是我使用的解决方案
import org.springframework.context.i18n.LocaleContextHolder
/**
* ML = Multi Language
* */
class MLString {
String english
String spanish
boolean hasLanguage(String language){
switch (language){
case 'en':
return english?.trim()
case 'es':
return spanish?.trim()
default:
return false
}
}
String getLanguage(String language){
switch (language){
case 'en':
return english
case 'es':
return spanish
default:
return ''
}
}
String toString() {
String language = LocaleContextHolder.getLocale().getLanguage()
if (hasLanguage(language)){
return getLanguage(language)
} else {
return getLanguage('en')
}
}
static constraints = {
english nullable: true
spanish nullable: true
}
}