2015-04-14 71 views
0

让我们说,我在斯卡拉实现(像一个从this post sugested)的通用组件:配置生成

import scala.collection.mutable.Map 

sealed trait Language { 
    val messages: Map[String, String] 
} 
class English extends Language { 
    val messages: Map[String, String] = 
    Map("M01" -> "Ready for cooking - press START", 
     "M02" -> "Close the door to start cooking") 
} 
class French extends Language { 
    val messages: Map[String, String] = 
    Map("M01" -> "Pret pour la cuisson - presse START", 
     "M02" -> "Fermez la porte pour commencer la cuisson") 
} 
class Lang[A <: Language] { 

    private var language: Language = new English 

    def chosen(lang: A): Unit = { 
    language = lang 
    } 

    def displayMessage(msg: String): Unit = { 
    println(language messages msg) 
    } 

} 

我关心的是我怎么能建立一个配置生成器(我指的C++术语)配置此组件?至少有任何参考?或者另一种方式,我如何使用配置文件来配置它?

+0

您关心的是i18n吗? –

+0

@Nader Hadji Ghanbari,noo,根本没有。我只是想找到一种方法,并配置一堆这样的组件不同。也许建立一个可以配置它们的DSL! – Valerin

回答

3

如果你正在寻找一种方式来处理翻译通过配置文件看看Typesafe Config。在这种特殊情况下,你不得不像下面这样:

import scala.collection.mutable.Map 
import com.typesafe.config.Config 
import scala.collection.JavaConverters._ 

//within some object/class/...you got it 
def loadMessages(config: Config, lang: String): Map[String, String] = config.getObject(lang).asScala map { case (k, v) => k -> v.unwrapped.toString } 

您的配置文件会包含类似以下内容:

translation {  
    english { 
    M01 = "Ready for cooking - press START" 
    M02 = "Close the door to start cooking" 
    } 
    french { 
    M01 = "Pret pour la cuisson - presse START" 
    M02 = "Fermez la porte pour commencer la cuisson" 
    } 
} 

然后加载您的配置文件,并得到翻译映射表如下:

val config: Config = // load your config file. See Typesafe Config for details 

val translationCfg = config.getConfig("translation") 

val english = loadMessages(translationCfg, "english") 
val french = loadMessages(translationCfg, "french") 
... 

课程永恒的缘故,你可以尽量避免使用可变Mapvar,但这是另一回事。

+0

我现在要检查这种方式... thnxx的解释和参考。 – Valerin

+0

不客气。 – lambdista