راه‌اندازی سایت‌های چند زبانه در فریم ورک اسپرینگ (Spring Framework)

۲۲ آذر ۱۳۹۵

پیش از هر چیز باید بگویم که این نوشته مربوط به برنامه‌نویسی در فریم‌ورک اسپرینگ است؛ اگر با این فریم‌ورک آشنایی ندارید، خواندن این نوشته‌ی من در مورد این چهارچوب برنامه‌نویسی می‌تواند برای شما مفید باشد. امروزه چندزبانه بودن پورتال‌ها و سایت‌ها امر بسیار مهمی است و برای حضور در بازارهای جهانی و بین‌المللی یک نیاز است. در این نوشته قصد افزودن قابلیت internationalization به پروژه‌ی اسپرینگ را داریم.


برای Multilingual کردن یک سایت ابتدا طبق روال زیر عمل کنیم:

- ابتدا باید messageSource را که همان لیست پیام‌های به زبان‌های مختلف است به mvc-dispatcher-servlet.xml اضافه کنیم:


<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="defaultEncoding" value="UTF-8" />
    <property name="basename" value="classpath:/language/language"/>
</bean>

-  سپس باید localeResolver را برای تشخیص زبان و منطقه به mvc-dispatcher-servlet.xml اضافه کنیم:


<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="fa" />
</bean>

-  در نهایت یک interceptor برای تشخیص زبان و منطقه با توجه به پارامتری که از طریق url پاس داده می‌شود را mvc-dispatcher-servlet.xml اضافه کنیم:


<mvc:interceptors>
<!-- Changes the locale when a 'lang' request parameter is sent; e.g. /?lang=de -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
       <property name="paramName" value="lang"/>
    </bean>
</mvc:interceptors>

در اینجا ما با استفاده از ?lang=de/ زبان و منطقه مورد نظر را مشخص کرده و interceptor با توجه به آن فایل زبان مربوطه را از messageSource بارگزاری می‌کند.

اما مشکلی که وجود دارد این است که این تغییر زبان در سمت کنترلر‌ها انجام می‌پذیرد و چون ما به صورت rest کار می‌کنیم و viewهای خود را با استفاده از ابزارهایی نظیر جاوااسکریپت و جی‌کوئری پر می‌کنیم، لذا این تغییر زبان در سمت viewها به درستی انجام نمی‌شود. برای رفع این مشکل، ما در خطوط ابتدایی فایل jspها، زبان را به صورت دستی با توجه به پارامتر پاس داده شده تنظیم می‌کنیم، تکه کد زیر چگونگی این امر را نشان می‌دهد:


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<c:set var="lang" value="${not empty param.lang ? param.lang : \"fa\"}" scope="session" />
<fmt:setLocale value="${lang}" />

حال می‌توانیم به راحتی از spring:messageها استفاده کنیم و تغییر زبان هم در سمت کنترلرها و هم در سمت viewها اتفاق خواهد افتاد:


<spring:message code="language.news" text="اخبار" />

هیچ نظری موجود نیست: