9
का उपयोग करता

नियंत्रक:i18n त्रुटि: नियंत्रक और टेम्पलेट्स अलग अंतर्निहित भाषाओं

def test = Action { implicit request => 
    import play.api.i18n._ 
    val msg = Messages("error.invalid") 
    implicit val langInController = lang(request) 
    Ok(views.html.test(langInController, msg)) 
} 

दृश्य:

@(langInController: play.api.i18n.Lang, msg:String)(implicit request: Request[_]) 
<div>Lang from controller: @langInController, Message: @msg</div> 
<div>Message from view: @play.api.i18n.Messages("error.required")</div> 

संदेश संसाधन, conf/messages.zh-CN:

error.required=该字段必填 

कोशिश कर रहा

  1. एक अंग्रेजी फ़ायरफ़ॉक्स का उपयोग करता है जो test कार्रवाई पर जाने के लिए अनुरोध शीर्षलेख Accept-Language:en-us,en;q=0.5 भेजता है। परिणाम है:

    Language from controller: Lang(en,), Message: This field is required 
    Message in view: 该字段必填 
    
  2. एक चीनी गूगल क्रोम जो अनुरोध हेडर Accept-Language:zh-CN,zh;q=0.8 भेजता है यह यात्रा करने के लिए उपयोग करता है। परिणाम है:

    Language: Lang(zh,CN), Message: 该字段必填 
    Message in view: 该字段必填 
    

परीक्षण से, हम जानते हैं कि:

  1. नियंत्रक में निहित भाषा अनुरोध हेडर के Accept-Language
  2. अंतर्निहित टेम्पलेट में उपयोग की गई भाषा से है ओएस

पर्यावरण:

द्वारा निर्धारित (2012-03-16)
  • मेरे ओएस विंडोज   7 x64 चीनी संस्करण है
    1. प्ले 2 GitHub से नवीनतम play2.1-स्नैपशॉट है

    मुझे लगता है कि खेलने के 2 एक ही निहित का उपयोग करना चाहिए नियंत्रकों और विचारों के लिए भाषा। कहाँ TemplateMixin बस है

    val main = PlayProject(...) (
        templatesImport ++= Seq("utilis.TemplateMixin._") 
    ) 
    

    :: मैं Build.sbt में कुछ जोड़कर इसे ठीक कर सकते हैं (। यह नियंत्रक प्रदान करता है और सिर्फ implicit def lang(request) की तरह, कुछ तरीकों का पुन: उपयोग करने के लिए है)

    object TemplateMixin extends play.api.mvc.Controller 
    

    लेकिन मुझे लगता है कि इसे प्ले फ्रेमवर्क द्वारा किया जाना चाहिए।

  • उत्तर

    17

    play.api.i18n.Messages(key) फ़ंक्शन Lang प्रकार का एक अतिरिक्त निहित पैरामीटर लेता है। तो जब आप Messages("foo") लिखते हैं तो इसे Messages("foo")(l) तक बढ़ाया जाता है, जहां l वर्तमान अंतर्निहित दायरे से लिया गया Lang प्रकार का मान है।

    आपके जेवीएम डिफ़ॉल्ट लोकेल का उपयोग करते हुए हमेशा default implicit lang (जिसमें low priority है) उपलब्ध है।

    लेकिन जब आप Controller के अंदर हैं, तो उच्च प्राथमिकता वाला एक अंतर्निहित मूल्य पाया जा सकता है यदि कोई निहित अनुरोध है। यह मान अनुरोध के Accept-Language शीर्षलेख में दिखता है।

    जब आप टेम्पलेट के अंदर होते हैं, तो डिफ़ॉल्ट निहित लैंग का उपयोग तब तक किया जाएगा जब तक आपका टेम्पलेट एक और अंतर्निहित लैंग आयात न करे।

    यही कारण है कि, आपके उदाहरण में, नियंत्रक से गणना किए गए संदेश Accept-Language अनुरोध शीर्षलेख का उपयोग करते हैं और दृश्य से गणना किए गए संदेश आपके जेवीएम डिफ़ॉल्ट लोकेल का उपयोग करते हैं।

    आप अपने टेम्पलेट के प्रकार Lang का एक अंतर्निहित पैरामीटर जोड़ दें, तो इस पैरामीटर डिफ़ॉल्ट लैंग तुलना में एक उच्च प्राथमिकता दी जाएगी और संदेशों की गणना करने के लिए इस्तेमाल किया जाएगा:

    @(langInController: Lang, msg:String)(implicit request: RequestHeader, lang: Lang) 
    
    <div>Lang from controller: @langInController, Message: @msg</div> 
    <div>Message from view: @Messages("error.required")</div> 
    

    जब आप टेम्पलेट फोन करता हूँ एक नियंत्रक कार्रवाई से, इसका अंतर्निहित लैंग पारित किया जाएगा, इसलिए वही लैंग आपके दृश्यों और आपके नियंत्रकों दोनों द्वारा उपयोग किया जाएगा।

    +1

    फिर से धन्यवाद। Play2 के दस्तावेज़ों में एक अच्छा जवाब जोड़ा जाना चाहिए। – Freewind

    +0

    यह डिफ़ॉल्ट व्यवहार क्यों नहीं हो सकता है? मैं कल्पना करता हूं कि अधिकतर ऐप्स अंतर्निहित भूमि को दृश्य में उपयोग किए जाने वाले समान होने के लिए चाहते हैं। – Ike

    +0

    इसे बनाना डिफ़ॉल्ट व्यवहार को जावा नियंत्रकों (जो अंतर्निहित मूल्य प्रदान नहीं कर सकता) और स्काला नियंत्रकों के साथ उपयोग किए जाने वाले टेम्पलेट्स के साथ उपयोग किए जाने वाले टेम्पलेट्स के बीच अंतर करने की आवश्यकता होगी। –

    संबंधित मुद्दे