【问题标题】:configuration generator in ScalaScala 中的配置生成器
【发布时间】:2015-06-19 16:58:24
【问题描述】:

假设我有一个用 Scala 实现的通用组件(就像 this post 建议的那个):

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++ 的术语)来配置这个组件?至少有参考吗?或者另一种方式,我如何使用配置文件来配置它?

【问题讨论】:

  • 您的担忧是否与 i18n 相关?
  • @Nader Hadji Ghanbari,不,一点也不。我只是想找到一种方法并以不同的方式配置一堆这样的组件。也许构建一个可以配置它们的 DSL!

标签: scala configuration generator configuration-files


【解决方案1】:

如果您正在寻找一种通过配置文件处理翻译的方法,请查看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,但这是另一回事。

【讨论】:

  • 我现在要检查这种方式...谢谢解释和参考。
猜你喜欢
  • 2018-02-18
  • 2019-07-06
  • 2019-12-20
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多