Java EE (Enterprise Edition) এবং Spring Framework দুটি জনপ্রিয় Java টেকনোলজি, যা ইন্টারন্যাশনালাইজেশন (i18n) সমর্থন করে, এবং তাদের মাধ্যমে আপনি একাধিক ভাষা ও স্থানীয় সেটিংস অনুযায়ী আপনার অ্যাপ্লিকেশন কনফিগার করতে পারেন। এই টেকনোলজিগুলিতে i18n ইন্টিগ্রেশন ব্যবহারকারী অ্যাপ্লিকেশনকে বিভিন্ন ভাষায় ব্যবহার উপযোগী করে তোলে।
এখানে Java EE এবং Spring Framework এ i18n ইন্টিগ্রেশন করার বিভিন্ন পদ্ধতি আলোচনা করা হবে।
Java EE এ i18n Integration
Java EE তে i18n সমর্থন করার জন্য ResourceBundle এবং LocaleResolver ব্যবহার করা হয়। এছাড়া JSP এবং Servlets এর মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলির জন্য আন্তর্জাতিককরণ পরিচালিত হয়।
1. Java EE Web Application এ i18n Configuring
ResourceBundle ব্যবহার করে Java EE অ্যাপ্লিকেশনগুলোতে i18n কনফিগার করা হয়। এখানে বিভিন্ন ভাষার জন্য .properties ফাইলগুলো রাখতে হবে এবং সার্ভলেট বা JSP তে তাদের ব্যবহার করতে হবে।
a. LocaleResolver Configuration (web.xml)
web.xml এ LocaleResolver কনফিগারেশন করা হয়। এটি ব্যবহারকারী এর ভাষার লোকেল নির্ধারণ করতে সহায়তা করে।
<web-app>
<!-- i18n filter -->
<filter>
<filter-name>i18nFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>i18nFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
b. LocaleResolver Bean Configuration (Spring MVC)
Spring MVC তে LocaleResolver ব্যবহার করে আপনি ব্যবহারকারীর লোকেল নির্ধারণ করতে পারবেন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.context.support.ResourceBundleMessageSource;
@Configuration
public class I18nConfig {
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US); // Default locale can be set here
return localeResolver;
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages"); // messages.properties file
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
c. JSP বা Thymeleaf Template এ i18n ব্যবহার করা
JSP বা Thymeleaf টেমপ্লেটগুলিতে i18n এর মাধ্যমে বিভিন্ন ভাষার স্ট্রিং ব্যবহার করা যায়।
- JSP Example:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<h2>${msg}</h2> <!-- msg is the key from messages.properties -->
</body>
</html>
- Thymeleaf Example:
<p th:text="#{welcome.message}">Welcome</p> <!-- welcome.message is key from messages.properties -->
2. Spring Framework এ i18n Integration
Spring Framework এ i18n ইন্টিগ্রেশন সাধারণত MessageSource, LocaleResolver, এবং Controller এর মাধ্যমে পরিচালিত হয়। Spring এর MessageSource এর মাধ্যমে আপনাকে ভাষানুযায়ী স্ট্রিং প্রদান করা হয়।
a. Spring Configuration (Java Configuration)
Spring Framework এ i18n কনফিগার করতে ResourceBundleMessageSource এবং LocaleResolver ব্যবহার করা হয়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class I18nConfig implements WebMvcConfigurer {
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages"); // The name of the resource bundle (messages.properties)
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
}
}
b. LocaleChangeInterceptor:
LocaleChangeInterceptor ব্যবহার করে Spring MVC তে URL প্যারামিটার বা HTTP হেডারে লোকেল পরিবর্তন করা যায়।
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // URL parameter to change locale
return interceptor;
}
এখানে, URL তে lang প্যারামিটার দিয়ে আপনি লোকেল পরিবর্তন করতে পারবেন। যেমন:
/yourapp/home?lang=fr
c. Using Messages in Controllers
Spring Controller এ মেসেজ ব্যবহার করতে, MessageSource এর মাধ্যমে বিভিন্ন ভাষার স্ট্রিং ব্যবহার করা যায়:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@Autowired
private MessageSource messageSource;
@GetMapping("/home")
public String homePage(Model model, Locale locale) {
String message = messageSource.getMessage("welcome.message", null, locale);
model.addAttribute("message", message);
return "home"; // home.jsp or home.html
}
}
d. Messages.properties Example
messages.properties ফাইলগুলিতে আপনার স্ট্রিংগুলি রিসোর্স বান্ডল হিসেবে সংরক্ষণ করুন:
welcome.message=Welcome to the Internationalized Spring Application
Spring Framework এ Locale Switching (Dynamic Language Switching)
Spring Framework এ লোকেল পরিবর্তন (dynamic language switching) সাধারণত LocaleChangeInterceptor এর মাধ্যমে পরিচালিত হয়। LocaleChangeInterceptor URL প্যারামিটার থেকে লোকেল পরিবর্তন করতে পারে।
Controller Example for Dynamic Language Switching:
@GetMapping("/change-language")
public String changeLanguage(HttpServletRequest request, HttpServletResponse response) {
String lang = request.getParameter("lang"); // Example: /change-language?lang=fr
Locale newLocale = new Locale(lang);
LocaleContextHolder.setLocale(newLocale);
return "redirect:/home"; // Redirect to home page
}
- Java EE এবং Spring Framework উভয়েই আন্তর্জাতিককরণ (i18n) সমর্থন করে, যেখানে ResourceBundle, LocaleResolver, এবং MessageSource ব্যবহৃত হয়।
- Spring প্রজেক্টে আপনি LocaleChangeInterceptor ব্যবহার করে সহজেই ভাষা পরিবর্তন করতে পারেন এবং
messages.propertiesফাইলের মাধ্যমে ভাষানুযায়ী স্ট্রিং প্রদান করতে পারেন। - Java EE অ্যাপ্লিকেশনগুলিতে web.xml এবং ResourceBundle ব্যবহার করে স্থানীয়করণ কনফিগার করা হয়।
এভাবে, আপনি Java EE এবং Spring Framework এ i18n ইন্টিগ্রেশন কার্যকরভাবে করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে বিভিন্ন ভাষা ও সংস্কৃতির ব্যবহারকারীদের জন্য উপযোগী করে তুলবে।
Java EE (Enterprise Edition) ইন্টারন্যাশনালাইজেশন (i18n) সমর্থন করার জন্য বিভিন্ন টুল এবং কনফিগারেশন সরবরাহ করে, যার মাধ্যমে একটি অ্যাপ্লিকেশন বিভিন্ন ভাষা এবং অঞ্চলের জন্য অভিযোজিত হতে পারে। Java EE তে i18n কনফিগারেশন এবং রিসোর্স হ্যান্ডলিং সাধারণত Resource Bundles, Locale Handling, এবং Web Configuration এর মাধ্যমে করা হয়।
এখানে আমরা আলোচনা করবো কীভাবে Java EE তে i18n কনফিগারেশন ও রিসোর্স হ্যান্ডলিং করা যায়।
১. Resource Bundle Management
Resource Bundle হল একটি মূল উপাদান Java EE-তে আন্তর্জাতিককরণের জন্য। এটি key-value জোড়া হিসেবে লোড করা হয় এবং বিভিন্ন ভাষার জন্য কনটেন্ট প্রদানের জন্য ব্যবহৃত হয়। Java EE অ্যাপ্লিকেশন সাধারণত .properties ফাইল ব্যবহার করে রিসোর্স স্টোর করে।
Resource Bundle ফাইল তৈরি:
Java EE অ্যাপ্লিকেশনগুলি বিভিন্ন ভাষার জন্য property files তৈরি করে। উদাহরণস্বরূপ, ইংরেজি, বাংলা, এবং ফরাসি ভাষার জন্য আলাদা আলাদা ফাইল হতে পারে:
messages_en.properties:
greeting=Hello welcomeMessage=Welcome to our Application!messages_bn.properties:
greeting=হ্যালো welcomeMessage=আমাদের অ্যাপ্লিকেশনে স্বাগতম!messages_fr.properties:
greeting=Bonjour welcomeMessage=Bienvenue dans notre application!
Resource Bundle লোড করা:
Java EE তে Resource Bundle লোড করতে ResourceBundle ক্লাস ব্যবহার করা হয়। আপনি এটি @ResourceBundle বা @MessageDrivenBean ব্যবহার করে বিভিন্ন ইন্টারফেসে ব্যবহার করতে পারেন।
Example:
import java.util.ResourceBundle;
import java.util.Locale;
public class GreetingService {
public String getGreeting(Locale locale) {
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
return bundle.getString("greeting");
}
}
এখানে, messages ফাইল থেকে Locale এর ভিত্তিতে রিসোর্স পাওয়া যাবে।
২. Locale Handling in Java EE
Java EE তে Locale Handling অনেক গুরুত্বপূর্ণ, কারণ এটি ভাষা এবং সংস্কৃতি অনুযায়ী কনটেন্ট প্রদান করতে সহায়তা করে। Java EE অ্যাপ্লিকেশনগুলোতে Locale পরিবর্তন করা এবং প্রাসঙ্গিক কনটেন্ট সঠিকভাবে প্রদর্শন করা যায়।
Locale Configuration in Web Applications:
Web.xml Configuration: Java EE ওয়েব অ্যাপ্লিকেশনের web.xml ফাইলে Locale Filter কনফিগার করা যেতে পারে, যাতে একটি নির্দিষ্ট লোকাল (ভাষা) ডিফল্ট হিসেবে সেট করা যায়।
Example:
<web-app> <filter> <filter-name>LocaleFilter</filter-name> <filter-class>com.example.LocaleFilter</filter-class> </filter> <filter-mapping> <filter-name>LocaleFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>Locale Filter Implementation: একটি Locale Filter ব্যবহার করে আপনার অ্যাপ্লিকেশনকে একটি নির্দিষ্ট ভাষার মাধ্যমে সব রিকোয়েস্ট হ্যান্ডলিং করতে পারেন।
Example:
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Locale; public class LocaleFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String lang = httpRequest.getParameter("lang"); Locale locale = (lang != null) ? new Locale(lang) : Locale.getDefault(); request.setAttribute("locale", locale); chain.doFilter(request, response); } @Override public void destroy() {} }এখানে, lang প্যারামিটার ব্যবহার করে ভাষা পরিবর্তন করা হয়েছে।
৩. i18n in JavaServer Pages (JSP)
Java EE তে JSP তে i18n কনফিগারেশন করার জন্য JSTL (JavaServer Pages Standard Tag Library) ব্যবহার করা হয়। fmt:message ট্যাগ ব্যবহার করে Resource Bundle থেকে কনটেন্ট লোড এবং প্রদর্শন করা হয়।
JSP Example:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<body>
<fmt:message key="greeting"/>
<fmt:message key="welcomeMessage"/>
</body>
</html>
এখানে, fmt:message ট্যাগ messages.properties ফাইল থেকে কনটেন্ট লোড করবে এবং বর্তমান Locale অনুযায়ী প্রদর্শন করবে।
৪. Locale-Sensitive Date and Number Formatting
Java EE তে Date এবং Number ফরম্যাটিং অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি প্রতিটি লোকাল অনুযায়ী বিভিন্নভাবে ফরম্যাট হতে পারে। Java EE তে Java.text.NumberFormat এবং Java.text.DateFormat ক্লাস ব্যবহার করা হয়।
Example: Number Formatting in Java EE:
import java.text.NumberFormat;
import java.util.Locale;
public class NumberService {
public String formatNumber(double number, Locale locale) {
NumberFormat formatter = NumberFormat.getInstance(locale);
return formatter.format(number);
}
}
এখানে, Locale অনুযায়ী সংখ্যা ফরম্যাট করা হচ্ছে।
Example: Date Formatting in Java EE:
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateService {
public String formatDate(Date date, Locale locale) {
DateFormat formatter = DateFormat.getDateInstance(DateFormat.LONG, locale);
return formatter.format(date);
}
}
এখানে, Locale অনুযায়ী তারিখ ফরম্যাট করা হচ্ছে।
৫. Locale Switching in Java EE
Java EE তে লোকাল পরিবর্তন করার জন্য সেশন বা কুকি ব্যবহার করা হয় যাতে ব্যবহারকারীর ভাষা/লোকাল পরিবর্তন সেশনভিত্তিকভাবে সেভ করা যায় এবং পরবর্তী রিকোয়েস্টে তা স্বয়ংক্রিয়ভাবে গ্রহণ করা যায়।
Example: Locale Switching Using Session:
public class LocaleSwitcher {
public void setLocale(HttpServletRequest request, HttpServletResponse response) {
String lang = request.getParameter("lang");
Locale locale = new Locale(lang);
request.getSession().setAttribute("locale", locale);
response.sendRedirect(request.getHeader("Referer"));
}
}
এখানে, lang প্যারামিটার ব্যবহার করে লোকাল পরিবর্তন করা হয়েছে এবং সেশন এ সেট করা হয়েছে।
Java EE তে i18n কনফিগারেশন এবং রিসোর্স হ্যান্ডলিং এর মাধ্যমে অ্যাপ্লিকেশনগুলোকে বিভিন্ন ভাষা এবং সংস্কৃতির জন্য সমর্থনযোগ্য করা যায়। Resource Bundle ব্যবহার, Locale Handling, JSP i18n ট্যাগ এবং Date/Number Formatting এর মাধ্যমে আপনি Java EE অ্যাপ্লিকেশনগুলিকে সঠিকভাবে ইন্টারন্যাশনালাইজড করতে পারবেন। এছাড়া, Locale Switching এর মাধ্যমে ব্যবহারকারীর অভিজ্ঞতাকে আরো কাস্টমাইজড করা যায়, এবং প্রয়োজন অনুযায়ী নতুন ভাষা যোগ করা সম্ভব।
Spring Framework ইন্টারন্যাশনালাইজেশন (i18n) সমর্থন করতে একটি শক্তিশালী এবং নমনীয় পদ্ধতি প্রদান করে। এর মাধ্যমে আপনি বিভিন্ন ভাষায় এবং স্থানিক কনফিগারেশনে কনটেন্ট প্রদর্শন করতে পারেন। Spring-এ MessageSource এবং LocaleResolver দুটি গুরুত্বপূর্ণ কম্পোনেন্ট যা ইন্টারন্যাশনালাইজেশন মেকানিজম পরিচালনা করতে ব্যবহৃত হয়।
১. MessageSource Interface:
Spring Framework-এর MessageSource ইন্টারফেসটি মূলত একটি API যা স্থানিকভাবে নির্দিষ্ট বার্তা বা স্ট্রিং রিসোর্স সরবরাহ করে। এটি বিভিন্ন ভাষার জন্য বার্তা/স্ট্রিং কনটেন্ট প্রদান করে, যেমন ResourceBundle এর মাধ্যমে।
MessageSource এর কার্যকারিতা:
- এটি বিভিন্ন লোকাল এবং ভাষার জন্য অনুবাদ করা বার্তা প্রদান করে।
- Spring-এ
MessageSourceকনফিগারেশন অ্যাপ্লিকেশনটির সমস্ত অনুবাদ প্রয়োজনীয় স্ট্রিং ধারণ করে।
MessageSource কনফিগারেশন:
Spring-এর MessageSource ব্যবহারের জন্য প্রথমে আপনাকে এটি কনফিগার করতে হবে। সাধারণত এটি ResourceBundleMessageSource ক্লাস দ্বারা প্রয়োগ করা হয়।
@Configuration
public class AppConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages"); // 'messages' ফাইলটি যেখানে আপনার কনটেন্ট সংরক্ষিত থাকবে
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
এখানে messages হল একটি properties ফাইল (যেমন messages_en.properties, messages_fr.properties) যেখানে প্রতিটি ভাষার জন্য অনুবাদিত স্ট্রিং রাখা হয়।
MessageSource ব্যবহার:
Spring Controller-এ MessageSource ব্যবহার করা হয় বিভিন্ন স্ট্রিং রিসোর্স অ্যাক্সেস করার জন্য।
@Controller
public class WelcomeController {
@Autowired
private MessageSource messageSource;
@RequestMapping("/welcome")
public String welcome(Model model, Locale locale) {
String message = messageSource.getMessage("welcome.message", null, locale);
model.addAttribute("message", message);
return "welcome";
}
}
এখানে getMessage() পদ্ধতিটি নির্দিষ্ট locale অনুযায়ী বার্তা রিটার্ন করে। যেমন, যদি locale ইংরেজি (en_US) থাকে, তবে messages_en.properties ফাইল থেকে বার্তা নেওয়া হবে।
properties ফাইলের উদাহরণ:
messages_en.propertieswelcome.message=Welcome to our site!messages_fr.propertieswelcome.message=Bienvenue sur notre site!
২. LocaleResolver Interface:
Spring Framework-এ LocaleResolver হল একটি ইন্টারফেস যা locale সম্পর্কিত তথ্য সংগ্রহ এবং সেট করার জন্য ব্যবহৃত হয়। এটি স্থানিক কনফিগারেশন এবং ব্যবহারকারীর নির্বাচিত ভাষা ধারণ করার জন্য ব্যবহৃত হয়।
LocaleResolver কনফিগারেশন:
Spring Framework-এ locale সমাধান করার জন্য প্রধানত দুটি ধরনের LocaleResolver ব্যবহৃত হয়:
- SessionLocaleResolver - এটি ব্যবহারকারীর সেশনে Locale ধারণ করে রাখে।
- CookieLocaleResolver - এটি কুকিতে Locale সংরক্ষণ করে।
SessionLocaleResolver উদাহরণ:
@Configuration
public class AppConfig {
@Bean
public LocaleResolver localeResolver() {
return new SessionLocaleResolver();
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 'lang' প্যারামিটার দ্বারা Locale পরিবর্তন করা হবে
return interceptor;
}
@Bean
public HandlerMapping handlerMapping() {
RegistryBeanNameHandlerMapping mapping = new RegistryBeanNameHandlerMapping();
mapping.addInterceptor(localeChangeInterceptor());
return mapping;
}
}
এখানে, SessionLocaleResolver ব্যবহার করা হয়েছে, যা ব্যবহারকারীর সেশন অনুযায়ী locale নির্ধারণ করে।
Locale পরিবর্তন:
Spring Framework আপনাকে locale পরিবর্তন করার জন্য একটি প্যারামিটার সেট করতে দেয়, যেমন lang প্যারামিটার ব্যবহার করে, যা URL-এ পাঠানো হয়।
URL উদাহরণ:
http://localhost:8080/welcome?lang=fr
এখানে lang=fr ব্যবহার করা হলে, সিস্টেম ফরাসি ভাষার কনটেন্ট দেখাবে।
৩. Spring MVC Controller তে LocaleResolver এবং MessageSource ব্যবহার:
@Controller
public class MyController {
@Autowired
private MessageSource messageSource;
@Autowired
private LocaleResolver localeResolver;
@RequestMapping("/changeLocale")
public String changeLocale(HttpServletRequest request, @RequestParam("lang") String lang) {
// locale পরিবর্তন করা
Locale locale = new Locale(lang);
localeResolver.setLocale(request, null, locale);
return "redirect:/welcome";
}
@RequestMapping("/welcome")
public String welcomePage(Model model, Locale locale) {
String message = messageSource.getMessage("welcome.message", null, locale);
model.addAttribute("message", message);
return "welcome";
}
}
এখানে changeLocale() পদ্ধতিটি ইউজারের locale পরিবর্তন করতে ব্যবহার হয় এবং welcomePage() পদ্ধতিটি locale অনুযায়ী সঠিক বার্তা রিটার্ন করে।
৪. LocaleResolver পরিবর্তন:
Spring Framework আপনাকে localeResolver ব্যবহার করে Locale পরিবর্তন করার জন্য বিভিন্ন বিকল্প প্রদান করে:
- SessionLocaleResolver: সেশনে locale সেট করে রাখে, যাতে একাধিক রিকোয়েস্টে একই Locale ব্যবহৃত হয়।
- CookieLocaleResolver: কুকি ব্যবহার করে locale সেট করে রাখে।
CookieLocaleResolver উদাহরণ:
@Bean
public LocaleResolver localeResolver() {
return new CookieLocaleResolver();
}
Spring Framework-এ MessageSource এবং LocaleResolver ব্যবহার করে খুব সহজে এবং কার্যকরভাবে i18n সমর্থন করা যায়। MessageSource ব্যবহার করে আপনি একাধিক ভাষায় কনটেন্ট প্রদান করতে পারেন এবং LocaleResolver ব্যবহার করে ব্যবহারকারীর locale সেট করতে পারেন, যা পুরো অ্যাপ্লিকেশনটিতে স্থানিক তথ্য সঠিকভাবে পরিচালনা করতে সহায়তা করে। Spring-এর এই কনফিগারেশন এবং টুলস আপনাকে একটি বিশ্বব্যাপী প্রেক্ষাপটে অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।
Spring MVC-তে Dynamic Locale Management (ডাইনামিক লোকেল ব্যবস্থাপনা) একটি গুরুত্বপূর্ণ বিষয়, যখন আপনার ওয়েব অ্যাপ্লিকেশনটি বিভিন্ন ভাষার জন্য স্থানিককরণ (Localization) সমর্থন করে। এটি ব্যবহারকারীদের তাদের পছন্দের ভাষায় অ্যাপ্লিকেশনটি ব্যবহারের সুযোগ দেয়। Spring MVC-তে LocaleResolver, LocaleChangeInterceptor, এবং অন্যান্য কনফিগারেশন ব্যবহার করে আপনি ডাইনামিকভাবে ব্যবহারকারীদের লোকেল পরিবর্তন করতে পারেন।
Spring MVC তে Dynamic Locale Management বাস্তবায়ন
Spring MVC-তে ডাইনামিক লোকেল ব্যবস্থাপনা কার্যকর করতে, আপনাকে কয়েকটি পদক্ষেপ অনুসরণ করতে হবে:
1. LocaleResolver কনফিগার করা
Spring MVC তে LocaleResolver ক্লাসটি ব্যবহারকারীর ভাষার পছন্দ বুঝতে এবং সেই অনুযায়ী কনটেন্ট লোড করতে ব্যবহৃত হয়। SessionLocaleResolver বা AcceptHeaderLocaleResolver এর মতো বিভিন্ন প্রকারের LocaleResolver ক্লাস রয়েছে, কিন্তু SessionLocaleResolver সবচেয়ে সাধারণভাবে ব্যবহৃত হয়।
LocaleResolver কনফিগারেশন:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocale(Locale.ENGLISH); // ডিফল্ট ভাষা ইংরেজি সেট করা
return resolver;
}
// অন্যান্য কনফিগারেশন যেমন, ViewResolvers, Controller etc.
}
এখানে, SessionLocaleResolver ব্যবহার করা হয়েছে, যা ব্যবহারকারীর সেশনেই লোকেল সংরক্ষণ করে। এটি ব্যবহারকারী যখন পরবর্তী সময়ে ওয়েবসাইটে ফিরে আসবে, তখন আগের নির্বাচিত ভাষা পুনরুদ্ধার করবে।
2. LocaleChangeInterceptor কনফিগার করা
যতবার ব্যবহারকারী ভাষা পরিবর্তন করতে চায়, তা ট্র্যাক করার জন্য Spring MVC-তে LocaleChangeInterceptor ব্যবহার করা হয়। এটি একটি ইন্টারসেপ্টর যা ইনকামিং HTTP রিকোয়েস্টে লোকেল পরিবর্তন করার জন্য প্যারামিটার শনাক্ত করতে সহায়তা করে।
LocaleChangeInterceptor কনফিগারেশন:
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // প্যারামিটার নাম যা URL-এ ব্যবহারকারী ভাষা পরিবর্তন করতে ব্যবহৃত হবে
return interceptor;
}
এখানে, lang প্যারামিটারটি URL এ ব্যবহারকারীর ভাষা পরিবর্তন করার জন্য ট্র্যাক করবে। যেমন:
http://example.com/home?lang=fr // ফরাসি ভাষায় পরিবর্তন হবে
3. Interceptor Configuration
যেহেতু আমরা LocaleChangeInterceptor ব্যবহার করছি, এটি Spring MVC-এর ইন্টারসেপ্টর চেইনে যুক্ত করতে হবে।
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
4. Locale-Specific Resource Bundles ব্যবহার করা
বিভিন্ন ভাষার জন্য ResourceBundle ব্যবহার করে কনটেন্ট লোকালাইজেশন করা হয়। আপনি .properties ফাইলের মাধ্যমে প্রতিটি ভাষার জন্য আলাদা কনটেন্ট সংরক্ষণ করতে পারেন।
উদাহরণস্বরূপ:
messages_en.properties(ইংরেজি)messages_fr.properties(ফরাসি)
messages_en.properties:
greeting=Hello!
messages_fr.properties:
greeting=Bonjour!
5. Locale ব্যবহার করে থেমপ্লেট-এ কনটেন্ট প্রদর্শন
Spring MVC তে JSP বা Thymeleaf টেমপ্লেট ব্যবহার করলে, আপনি ResourceBundle থেকে কনটেন্ট টেক্সট ডাইনামিকভাবে লোড করতে পারবেন।
Thymeleaf উদাহরণ:
<p th:text="#{greeting}"></p> <!-- এখানে 'greeting' স্ট্রিংটি লোকেল অনুযায়ী পরিবর্তিত হবে -->
এটি ব্যবহারকারীর বর্তমান লোকেলের ওপর ভিত্তি করে সঠিক ভাষায় স্ট্রিংটি প্রদর্শন করবে।
6. URL প্যারামিটার দিয়ে লোকেল পরিবর্তন
আপনার ওয়েব অ্যাপ্লিকেশনটি যখন ব্যবহারকারীদের ভাষা পরিবর্তনের সুযোগ দেয়, তখন আপনি তাদের জন্য একটি ড্রপডাউন বা বাটন তৈরি করতে পারেন, যার মাধ্যমে তারা ভাষা পরিবর্তন করতে পারে।
ড্রপডাউন বা ল্যাঙ্গুয়েজ চয়েস:
<form action="#" method="get">
<select name="lang" onchange="this.form.submit()">
<option value="en">English</option>
<option value="fr">Français</option>
<!-- অন্যান্য ভাষা -->
</select>
</form>
এটি ব্যবহারকারীর পছন্দ অনুযায়ী URL প্যারামিটার lang-এর মান পরিবর্তন করবে, এবং LocaleChangeInterceptor এই প্যারামিটারটি ধরে ভাষা পরিবর্তন করবে।
7. LocaleResolver সেশন এবং কুকির মাধ্যমে ভাষা সংরক্ষণ
যদি আপনি ব্যবহারকারীর ভাষা সেশন বা কুকির মাধ্যমে সংরক্ষণ করতে চান, তাহলে SessionLocaleResolver বা CookieLocaleResolver ব্যবহার করতে পারেন।
CookieLocaleResolver কনফিগারেশন:
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver resolver = new CookieLocaleResolver();
resolver.setDefaultLocale(Locale.ENGLISH);
resolver.setCookieName("localeInfo");
return resolver;
}
এটি ব্যবহারকারীর ভাষা কুকিতে সংরক্ষণ করে রাখবে, যাতে তারা পরবর্তী সময়ে একই ভাষায় ওয়েবসাইটটি দেখতে পারে।
Spring MVC-তে Dynamic Locale Management ব্যবহারকারীদের একটি ব্যক্তিগত অভিজ্ঞতা দেয়, কারণ তারা তাদের পছন্দসই ভাষায় অ্যাপ্লিকেশন ব্যবহার করতে পারে। LocaleResolver, LocaleChangeInterceptor, এবং ResourceBundle ব্যবহার করে আপনি Spring MVC অ্যাপ্লিকেশনে ডাইনামিকভাবে ভাষা পরিবর্তন এবং স্থানিককরণ সহজেই বাস্তবায়ন করতে পারেন।
এই ব্যবস্থা আপনার অ্যাপ্লিকেশনকে গ্লোবাল ইউজারবেসের জন্য আরও উন্নত এবং ব্যবহারকারী-বান্ধব করে তুলবে।
i18n (Internationalization) একটি গুরুত্বপূর্ণ প্রক্রিয়া যা জাভা অ্যাপ্লিকেশনকে বিভিন্ন ভাষা এবং অঞ্চল ভিত্তিক কনফিগারেশন সমর্থন করতে সাহায্য করে। যখন আপনি একটি RESTful Web Service তৈরি করেন, যেখানে একাধিক ভাষায় তথ্য প্রদান করার প্রয়োজন হয়, তখন আপনার সার্ভিসটি আন্তর্জাতিককরণের জন্য উপযুক্ত হতে হবে। এই প্রক্রিয়ায় আপনাকে RESTful Web Services-এ Localization এবং Internationalization কনফিগার করতে হবে যাতে ব্যবহারকারী তার স্থানীয় ভাষায় ডেটা পায়।
i18n এর জন্য RESTful Web Services Configuration:
RESTful Web Services সাধারণত HTTP প্রোটোকলের উপর ভিত্তি করে কাজ করে এবং এই সার্ভিসগুলো ক্লায়েন্টদের বিভিন্ন ফরম্যাটে (যেমন JSON, XML) তথ্য প্রদান করতে সক্ষম। আন্তর্জাতিককরণ (i18n) এর জন্য বিভিন্ন কৌশল অবলম্বন করা যায়।
i18n সমর্থন করার জন্য RESTful Web Service কনফিগারেশন স্টেপস:
Locale ভিত্তিক রিসোর্স কনফিগারেশন:
- RESTful Web Service সার্ভিসে সাধারণত একাধিক ভাষা সমর্থন করার জন্য
Localeহেডার ব্যবহার করা হয়। - ক্লায়েন্ট (যেমন ব্রাউজার বা মোবাইল অ্যাপ্লিকেশন) থেকে প্রাপ্ত
Accept-Languageহেডার অনুযায়ী সার্ভার অনুরোধটি প্রসেস করে এবং উপযুক্ত ভাষার ডেটা রিটার্ন করে।
উদাহরণ:
@Path("/messages") public class MessageService { @GET @Path("/greeting") @Produces(MediaType.APPLICATION_JSON) public Response getGreeting(@HeaderParam("Accept-Language") String language) { Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("messages", locale); String greeting = bundle.getString("greeting"); return Response.ok(new Message(greeting)).build(); } }- এখানে,
Accept-Languageহেডারটি সার্ভিসকে বলে দেয় যে ক্লায়েন্ট কোন ভাষায় ডেটা চায়, এবং তার ভিত্তিতেResourceBundleথেকে উপযুক্ত ভাষায় তথ্য প্রদান করা হয়।
- RESTful Web Service সার্ভিসে সাধারণত একাধিক ভাষা সমর্থন করার জন্য
Resource Bundles ব্যবহার:
- RESTful Web Services-এ
ResourceBundleব্যবহার করা হয় স্থানিক ডেটা এবং ভাষার অনুবাদ লোড করার জন্য। .propertiesফাইল ব্যবহার করে বিভিন্ন ভাষায় অনুবাদ সংরক্ষণ করা হয়, যেমন:messages_en.properties(ইংরেজি)messages_fr.properties(ফরাসি)messages_de.properties(জার্মান)
উদাহরণ:
messages_en.properties:greeting=Hello, World!messages_fr.properties:greeting=Bonjour le monde!- সার্ভার তখন ভাষার ওপর নির্ভর করে সঠিক স্ট্রিং নির্বাচন করে পাঠাবে।
- RESTful Web Services-এ
Locale Based Content Rendering:
- RESTful Web Service সার্ভিসে কন্টেন্ট রেন্ডারিং
Localeঅনুযায়ী করা যেতে পারে। উদাহরণস্বরূপ, আপনি যদি কোনো তারিখ বা সময়ের ডেটা পাঠান, তাহলে তা স্থানীয় অঞ্চলের নিয়ম অনুসারে ফরম্যাট করতে হবে।
উদাহরণ:
@GET @Path("/date") @Produces(MediaType.APPLICATION_JSON) public Response getDate(@HeaderParam("Accept-Language") String language) { Locale locale = new Locale(language); DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG, locale); String formattedDate = dateFormat.format(new Date()); return Response.ok(new Message(formattedDate)).build(); }- RESTful Web Service সার্ভিসে কন্টেন্ট রেন্ডারিং
JSON বা XML Response Formatting:
- একাধিক ভাষা সমর্থন করতে, সার্ভিসটি JSON বা XML রেসপন্স ফরম্যাটে ডেটা পাঠায়।
- RESTful Web Services JSON বা XML ফরম্যাটে ডেটা পাঠানোর জন্য
@Producesএবং@Consumesঅ্যানোটেশন ব্যবহার করে থাকে।
উদাহরণ:
@Path("/user") public class UserService { @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public Response getUser(@PathParam("id") int id, @HeaderParam("Accept-Language") String language) { Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("messages", locale); User user = getUserFromDatabase(id); String greeting = bundle.getString("greeting"); user.setGreeting(greeting); return Response.ok(user).build(); } }Exception Handling:
- আপনি যখন আন্তর্জাতিককরণ সাপোর্ট করেন, তখন বিভিন্ন ভাষায় এরর বা এক্সসেপশন মেসেজ প্রদান করতে হবে। এজন্য বিভিন্ন ভাষার এক্সসেপশন মেসেজগুলোর জন্য রিসোর্স ফাইল ব্যবহার করা যেতে পারে।
উদাহরণ:
@GET @Path("/error") @Produces(MediaType.APPLICATION_JSON) public Response throwError(@HeaderParam("Accept-Language") String language) { Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("errorMessages", locale); String errorMessage = bundle.getString("error.notFound"); return Response.status(Response.Status.NOT_FOUND).entity(new Message(errorMessage)).build(); }- Content Negotiation:
- RESTful Web Services সাধারণত কনটেন্ট নেগোসিয়েশন সাপোর্ট করে, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ভাষা, মিডিয়া টাইপ ইত্যাদির সমঝোতা করে।
- Accept-Language হেডার দিয়ে কনটেন্ট নেগোসিয়েশন করা হয়। এতে সার্ভার জানে যে ক্লায়েন্ট কোন ভাষায় ডেটা চায় এবং সার্ভার সেই ভাষায় উপযুক্ত রেসপন্স প্রদান করে।
Time Zone Handling:
- যদি আপনার API সময় সম্পর্কিত ডেটা প্রদান করে, তবে আপনি তারিখ এবং সময় টাইমজোন অনুযায়ী স্থানিককরণের জন্য Java
TimeZoneএবংZonedDateTimeক্লাস ব্যবহার করতে পারেন। - আপনি
LocaleএবংTimeZoneএর সংমিশ্রণ ব্যবহার করে স্থানিককরণের সময় এবং তারিখ ডেটা ফেরত দিতে পারেন।
উদাহরণ:
@GET @Path("/time") @Produces(MediaType.APPLICATION_JSON) public Response getTime(@HeaderParam("Accept-Language") String language, @HeaderParam("TimeZone") String timeZone) { Locale locale = new Locale(language); TimeZone zone = TimeZone.getTimeZone(timeZone); ZonedDateTime now = ZonedDateTime.now(zone); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z", locale); String formattedTime = now.format(formatter); return Response.ok(new Message(formattedTime)).build(); }- যদি আপনার API সময় সম্পর্কিত ডেটা প্রদান করে, তবে আপনি তারিখ এবং সময় টাইমজোন অনুযায়ী স্থানিককরণের জন্য Java
i18n সমর্থন করার জন্য RESTful Web Services কনফিগার করা হলে, ক্লায়েন্টদের বিভিন্ন ভাষা এবং অঞ্চল অনুযায়ী কনটেন্ট প্রদান করা সম্ভব হয়। ResourceBundle ক্লাস, Locale হেডার, Accept-Language হেডার ব্যবহার করে ভাষাভিত্তিক কনটেন্ট প্রদান করা যায়। একাধিক ভাষা, তারিখ, সময়, এবং অন্যান্য স্থানিক ডেটা সঠিকভাবে কনফিগার করার জন্য এই কৌশলগুলো অনুসরণ করা উচিত।
Read more