4

I am building an application using the Play! framework version 2.0.4. Some pages that are legally required such as an imprint mostly contain lots (some 10k each) of static text which I would like to provide in different languages.

In versions 1.x there was an #include directive that allowed to construct the actual resource path using the current Lang.

What is the recommended way of implementing sth similar with Play 2.x?

Thank you & best regards, Erich

4

4 回答 4

2

到目前为止,我还不能 100% 确定你是如何实现它的,但这就是我想出的。

你可以只写你自己的包含助手。将以下内容保存Helpers.scala在您的视图文件夹中的文件中。解释在代码的注释中。

package views.html.helper

object include {
  import play.api.templates.Html
  import play.api.Play
  import play.api.Play.current
  import play.api.i18n._

  // The default is to look in the public dir, but you can change it if necessary
  def apply(filePath: String, rootDir: String = "public")(implicit lang: Lang): Html = {
    // Split filePath at name and suffix to insert the language in between them
    val (fileName, suffix) = filePath.splitAt(filePath.lastIndexOf("."))

    // Retrieve the file with the current language, or as a fallback, without any suffix
    val maybeFile =
      Play.getExistingFile(rootDir + "/" + fileName + "_" + lang.language + suffix).
      orElse(Play.getExistingFile(rootDir + "/" + filePath))

    // Read the file's content and wrap it in HTML or return an error message
    maybeFile map { file =>
      val content = scala.io.Source.fromFile(file).mkString
      Html(content)
    } getOrElse Html("File Not Found")
  }
}

现在在你的imprint.scala.html你可以这样称呼它:

@()(implicit lang: Lang)
@import helper._
@include("static/imprint.html")
于 2013-01-11T18:02:03.100 回答
1

Schleichardt展示的方式用于play-authenticate选择不同语言的邮件模板,现在它已更改为与控制器上的反射一起使用,所以也许对您来说可能会很有趣。无论如何,它是为了保持标准模板的可能性(因为每封邮件都需要在发送前进行个性化)

对于静态信息页面,您可以只保存每种语言的代码,后缀为 ie。impressum_en.htmlimpressum_de.html在文件系统中并使用简单的控制器,它将找到具有适当后缀的文件并完全按原样返回其内容......您可能只需要返回 Ok(fileContent) 并将 Content-Type 手动设置为text/html.

其他选项是做类似的事情,但将其存储在数据库中,因此您可以创建简单的后端并使用浏览器对其进行编辑。

如果你还需要替​​换一些元素,你可以###MARKER###通过代码中的一些 + 简单的字符串操作,或者在客户端使用 JavaScript 来完成。

于 2013-01-11T11:27:46.090 回答
0

2.0 中的模板工作方式略有不同。编译基于 Scala 的模板。从一个模板而不是“包含”另一个模板,您可以调用它。我不确定你所说的语言是什么意思。但在 2.0 中,模板的参数可以是语言。

包whateverpackage中名为“included”的示例模板。

@(lang: Lang)

...

调用名为“包含”的模板的示例:

@import whateverpackage._

@included(Lang("en"))
于 2013-01-11T00:30:19.267 回答
0
@()(implicit lang: Lang)

@main(Messages("imprint")) {
    @lang match {
        case Lang("de", _) => { @germanImprint() @* uses app/views/germanImprint.scala.html file *@}
        case _ => { @englishImprint() }
    }
}
于 2013-01-11T00:32:48.280 回答