4

Play!を使用してアプリケーションを構築しています。フレームワークバージョン2.0.4。インプリントなどの法的に必要な一部のページには、ほとんどの場合、さまざまな言語で提供したい静的テキストがたくさん含まれています(それぞれ約10k)。

バージョン1.xには#include、現在のを使用して実際のリソースパスを構築できるディレクティブがありましたLang

Play 2.xと同様のsthを実装するための推奨される方法は何ですか?

ありがとう&よろしく、エリック

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

他のオプションも同様のことを行いますが、それをDBに保存するため、単純なバックエンドを作成してブラウザーで編集できます。

それでも一部の要素を置き換える必要がある場合###MARKER###は、コード+単純な文字列操作の一部、またはクライアント側のJavaScriptを使用して置き換えることができます。

于 2013-01-11T11:27:46.090 に答える
0

2.0のテンプレートの動作は少し異なります。Scalaベースのテンプレートがコンパイルされます。'別の'を含む'の代わりに1つのテンプレートから、そのテンプレートを呼び出すことができます。あなたが言語のことで何を意味するのか正確にはわかりません。ただし、2.0では、テンプレートのパラメーターは言語である可能性があります。

パッケージwhateverpackageに「included」という名前のテンプレートの例。

@(lang: Lang)

...

'included'という名前のテンプレートを呼び出す例:

@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 に答える