Play!を使用してアプリケーションを構築しています。フレームワークバージョン2.0.4。インプリントなどの法的に必要な一部のページには、ほとんどの場合、さまざまな言語で提供したい静的テキストがたくさん含まれています(それぞれ約10k)。
バージョン1.xには#include
、現在のを使用して実際のリソースパスを構築できるディレクティブがありましたLang
。
Play 2.xと同様のsthを実装するための推奨される方法は何ですか?
ありがとう&よろしく、エリック
Play!を使用してアプリケーションを構築しています。フレームワークバージョン2.0.4。インプリントなどの法的に必要な一部のページには、ほとんどの場合、さまざまな言語で提供したい静的テキストがたくさん含まれています(それぞれ約10k)。
バージョン1.xには#include
、現在のを使用して実際のリソースパスを構築できるディレクティブがありましたLang
。
Play 2.xと同様のsthを実装するための推奨される方法は何ですか?
ありがとう&よろしく、エリック
今のところ、どのように実装するかは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")
Schleichardtが示した方法は、さまざまな言語のメールテンプレートを選択するために使用されplay-authenticate
ていましたが、コントローラーでのリフレクションを使用するように変更されたため、興味深いかもしれません。とにかく、標準のテンプレートの可能性を維持することを目的としていました(送信する前に各メールをパーソナライズする必要があるため)
静的情報ページの場合、各言語のコードを接尾辞ieを付けて保存できます。impressum_en.html
、impressum_de.html
ファイルシステムで、適切なサフィックスを持つファイルを検索し、そのコンテンツをそのまま返す単純なコントローラーを使用します...おそらく、Ok(fileContent)を返し、Content-Typeを手動でに設定する必要がありますtext/html
。
他のオプションも同様のことを行いますが、それをDBに保存するため、単純なバックエンドを作成してブラウザーで編集できます。
それでも一部の要素を置き換える必要がある場合###MARKER###
は、コード+単純な文字列操作の一部、またはクライアント側のJavaScriptを使用して置き換えることができます。
2.0のテンプレートの動作は少し異なります。Scalaベースのテンプレートがコンパイルされます。'別の'を含む'の代わりに1つのテンプレートから、そのテンプレートを呼び出すことができます。あなたが言語のことで何を意味するのか正確にはわかりません。ただし、2.0では、テンプレートのパラメーターは言語である可能性があります。
パッケージwhateverpackageに「included」という名前のテンプレートの例。
@(lang: Lang)
...
'included'という名前のテンプレートを呼び出す例:
@import whateverpackage._
@included(Lang("en"))
@()(implicit lang: Lang)
@main(Messages("imprint")) {
@lang match {
case Lang("de", _) => { @germanImprint() @* uses app/views/germanImprint.scala.html file *@}
case _ => { @englishImprint() }
}
}