2015-06-15 4 views
10

मैं i18n समर्थन के साथ अपना पहला स्प्रिंग एमवीसी 4 ऐप बनाने की कोशिश कर रहा हूं और सोच रहा था कि उपयोगकर्ता भाषा uri में हेरफेर कर रहा है, तो मैं डिफ़ॉल्ट/फ़ॉलबैक लोकेल का उपयोग कैसे कर सकता हूं एक गैर मौजूदा या समर्थित स्थान पैरामीटर उदाहरण के लिए http://localhost.de?lang=abcस्प्रिंग एमवीसी: यूरी पैरामीटर मान में अज्ञात भाषा कोड के लिए फ़ॉलबैक

इम कोड

@Bean 
public LocaleResolver localeResolver() { 
    SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); 
    sessionLocaleResolver.setDefaultLocale(Locale.GERMAN); 
    return sessionLocaleResolver; 
} 

जो सामान्य रूप में काम करता है अगर मैं यूआरएल पहली बार खोलने का उपयोग कर, लेकिन यह मामले के लिए काम करने के लिए नहीं लगता है मैं वर्णन कर रहा था। मुझे पता है कि एक तंत्र है जो डिफ़ॉल्ट संदेश गुण फ़ाइल का उपयोग करेगा, लेकिन मैं इस मामले के लिए एक डिफ़ॉल्ट/फ़ॉलबैक लोकेल सेट करना चाहता हूं। क्या मुझे शायद एक कस्टम फ़िल्टर लागू करने की आवश्यकता है?

+0

क्या किसी के पास कोई विचार नहीं है? बहुत कुछ खोज रहा था लेकिन अभी तक कोई समाधान या विचार नहीं मिला .... – StephanM

+0

जब आप http://localhost.de?lang=abc पर नेविगेट करते हैं तो क्या होता है? इस मामले में किस लोकेल का उपयोग किया जाता है? –

+0

मैं अब आपको नहीं बता सकता क्योंकि मैंने पहले ही एक फ़िल्टर बनाया है जो भाषा कोड की जांच करता है। यदि मेरा ऐप इस भाषा का समर्थन नहीं करता है तो मैं इसे अपनी डिफ़ॉल्ट भाषा में मैन्युअल रूप से सेट कर रहा हूं। तो आपके मामले में इसे "डी"/जर्मन पर सेट किया जाएगा ... – StephanM

उत्तर

5

शायद अब तक सही लेकिन इस मैं क्या बनाया है किया जा रहा से ...

मैं भी है कि मैं डिफ़ॉल्ट भाषा का चयन तंत्र की जरूरत है एसईओ की वजह से थोड़ा बदल गया है और मैं द्वारा भाषा बदलने के लिए नहीं करने का फैसला कहने की जरूरत है एक प्राप्त पैरामीटर का उपयोग कर, लेकिन चयनित भाषा के लिए मेरे यूरी पथ के पहले भाग का उपयोग कर। उदाहरण के लिए: http://myurl.com/test.html?lang=de

मेरी एनोटेशन आधारित विन्यास में के बजाय http://myurl.com/en/test.html:

@Bean 
public LocaleResolver localeResolver() { 
    UriLocaleResolver uriLocaleResolver = new UriLocaleResolver(); 
    return uriLocaleResolver; 
} 

स्थान समाधानकर्ता

public class UriLocaleResolver implements LocaleResolver { 

    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    private Locale locale = null; 

    @Autowired 
    private LocalizationService localizationService; 


    @Override 
    public Locale resolveLocale(final HttpServletRequest servletRequest) { 
     if (locale != null) { 
      return locale; 
     } 

     String languageIsoCode = null; 
     try { 
      languageIsoCode = ((String)servletRequest.getAttribute(RequestKey.LANGUAGE_ISO_CODE)).toLowerCase(); 
     } 
     catch (Exception e) { } 
     if (StringUtils.isBlank(languageIsoCode) || !localizationService.getSupportedLocaleLanguageIsoCodes().contains(languageIsoCode)) { 
      logger.trace("Couldn't find valid language iso code. Using default locale '{}'", GlobalConstant.DEFAULT_LOCALE); 
      return GlobalConstant.DEFAULT_LOCALE; 
     } 

     logger.trace("Found language iso code '{}'", languageIsoCode); 
     return new Locale(languageIsoCode); 
    } 

    @Override 
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale)  { 
    this.locale = locale; 
    } 

} 

फिल्टर जो uri में एक वैध भाषा कोड के लिए जाँच करता ..

@Component 
public class UriLocalizationFilter extends OncePerRequestFilter { 

    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    @Autowired 
    private LocalizationService localizationService; 


    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     String uri = request.getRequestURI().substring(request.getContextPath().length()); 
     String[] pathParts = uri.split("/"); 

     if (!uri.startsWith(GlobalConstant.FRONTEND_RESOURCE_PATH_PREFIX) && pathParts.length >= 1 && pathParts[1].length() == 2) { 
      String originalLanguageIsoCode = pathParts[1]; 
      String lowerCaseLanguageIsoCode = originalLanguageIsoCode.toLowerCase(); 

      if (localizationService.getSupportedLocaleLanguageIsoCodes().contains(lowerCaseLanguageIsoCode)) { 
       logger.debug("Found valid language iso code {}", lowerCaseLanguageIsoCode); 
      } 
      else { 
       logger.debug("Found invalid language iso code {}. Using default language iso code {}.", lowerCaseLanguageIsoCode, GlobalConstant.DEFAULT_LOCALE.getLanguage()); 
       lowerCaseLanguageIsoCode = GlobalConstant.DEFAULT_LOCALE.getLanguage(); 
      } 

      String newUrl = StringUtils.removeStart(uri, '/' + originalLanguageIsoCode); 
      request.setAttribute(RequestKey.LANGUAGE_ISO_CODE, lowerCaseLanguageIsoCode); 
      logger.debug("Dispatching to new url '{}'", newUrl); 
      request.getRequestDispatcher(newUrl).forward(request, response); 
     } 
     else { 
      filterChain.doFilter(request, response); 
     } 
    } 

    public void setLocalizationService(LocalizationService localizationService) { 
     this.localizationService = localizationService; 
    } 

} 

}

फ्रंटएंड पथ मेरे मामले में "संसाधन" है जहां जेएस, सीएसएस, फोंट इत्यादि जैसी सभी स्थिर फाइलें बिछाई कर रही हैं। स्थानीयकरण सेवा.getSupportedLocaleLanguageIsoCodes() वर्तमान में तीन भाषा कोड (एन, आरयू, डी) युक्त एक सेट है। तो गलत भाषा कोड के मामले में जैसे abc im मेरी डिफ़ॉल्ट भाषा "डी" के साथ आगे बढ़ रहा है। मेरे लिए यह स्वीकार्य समाधान था क्योंकि यूरी में गलत भाषा कोड होने का मतलब है कि यूरी उपयोगकर्ता द्वारा छेड़छाड़ की गई थी ...

जैसा कि मैंने कहा था कि यह शायद "समाधान" नहीं है; उदाहरण के लिए मुझे यकीन नहीं है कि यह कैसे और कैसे कुकीज़ के साथ काम करता है और/या "मुझे याद रखें" प्रमाणीकरण (वसंत सुरक्षा का उपयोग करके) ... अभी तक इसका परीक्षण करने का कोई समय नहीं था ...

7

मेरा सुझाव उप-वर्ग होना होगा SessionLocaleResolver और ओवरराइड getLocale विधि:

@SpringBootApplication 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 

    private static Set<Locale> allowedLocales; 

    static { 
     HashSet<Locale> allowed = new HashSet<>(); 
     allowed.add(Locale.GERMAN); 
     allowed.add(Locale.CANADA); 
     allowedLocales = Collections.unmodifiableSet(allowed); 

    } 

    @Bean 
    LocaleResolver localeResolver() { 
     return new LimitedSessionLocaleResolver(); 
    } 

    class LimitedSessionLocaleResolver extends SessionLocaleResolver { 
     @Override 
     public Locale resolveLocale(HttpServletRequest request) { 
      Locale locale = super.resolveLocale(request); 
      if (!allowedLocales.contains(locale)) { 
       return determineDefaultLocale(request); 
      } 
      return locale; 
     } 
    } 
} 

यह किसी भी प्रमुख रास्ते में वसंत कक्षाएं संशोधित नहीं करता है और शायद निकट भविष्य के लिए मुद्दों के बिना काम करने के लिए जा रहा है।

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