📅  最后修改于: 2021-01-11 05:56:04             🧑  作者: Mango
在本节中,我们将讨论RESTful Web服务的国际化。
国际化是以这样一种方式设计Web应用程序或服务的过程,即它可以自动为各个国家/地区提供各种语言的支持,而无需在应用程序中进行更改。之所以称为I18N ,是因为国际化一词从I到N共有18个字符。
通过添加特定于语言环境的组件(例如翻译的文本,描述特定于语言环境的行为的数据等)来执行本地化。它支持完全集成到提供依赖语言或文化的功能的类和包中。
Java为桌面和服务器应用程序的国际化提供了基础。以下是重要的国际化功能区域。
我们需要配置两件事以使服务国际化。
默认语言环境是Locale.US。如果没有指定位置,它将返回默认语言环境。我们还需要自定义ResourceBundle。它具有要国际化的属性的列表。我们将属性存储在ResourceBundle中。 ResourceBundleMessageSource是用于处理属性的Spring MVC概念。之后,我们将使用MessageSource和一个名为Accept-Language的标头。
让我们配置国际化。
步骤1:打开RestfulWebServicesApplication.java文件。
步骤2:为默认语言环境配置Bean。
@Bean
public LocaleResolver localeResolver()
{
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
注意:在导入LocaleResolver时,导入import org.springframework.web.servlet.LocaleResolver包。
步骤3:现在,我们将属性存储在名为messages.properties的特定文件中。
右键单击src / main / resources文件夹->新建->文件->提供文件名: messages.properties 。它包含默认的区域设置消息。
messages.properties
good.morning.message=Good Morning
步骤4:为法语语言环境创建另一个名称为messages_fr.properties的属性文件。它包含针对法国语言环境的消息。
messages_fr.properties
good.morning.message=Bonjour
步骤5:读取属性并根据输入accept标头对其进行自定义。打开RestfulWebServicesApplication.java并为ResourceBundle配置另一个Bean。
//configuring ResourceBundle
@Bean
public ResourceBundleMessageSource bundleMessageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
RestfulWebServicesApplication.java
package com.javatpoint.server.main;
import java.util.Locale;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@SpringBootApplication
public class RestfulWebServicesApplication
{
public static void main(String[] args)
{
SpringApplication.run(RestfulWebServicesApplication.class, args);
}
//configuring default locale
@Bean
public LocaleResolver localeResolver()
{
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
//configuring ResourceBundle
@Bean
public ResourceBundleMessageSource messageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}
步骤6:更新服务以使用这些来源。打开HelloWorldController.java并自动连接MessageSource。
@Autowired
private MessageSource messageSource;
HelloWorldController.java
package com.javatpoint.server.main.helloworld;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Configuration;
@Configuration
//Controller
@RestController
public class HelloWorldController
{
@Autowired
private MessageSource messageSource;
//using get method and hello-world URI
@GetMapping(path="/hello-world")
public String helloWorld()
{
return "Hello World";
}
@GetMapping(path="/hello-world-bean")
//method- which returns "Hello World"
public HelloWorldBean helloWorldBean()
{
return new HelloWorldBean("Hello World");//constructor of HelloWorldBean
}
//passing a path variable
//hello-world/path-variable/javatpoint
@GetMapping(path="/hello-world/path-variable/{name}")
public HelloWorldBean helloWorldPathVariable(@PathVariable String name)
{
return new HelloWorldBean(String.format("Hello World, %s",name)); //%s replace the name
}
//internationalization
@GetMapping(path="/hello-world-internationalized")
public String helloWorldInternationalized(@RequestHeader(name="Accept-Language", required=false) Locale locale)
{
return messageSource.getMessage("good.morning.message", null, locale);
}
}
步骤7:打开REST客户端Postman并执行以下更改:
它返回美国区域设置消息早安。
现在我们将RequestHeader更改为fr并再次发送GET请求。
它返回法语语言环境消息Bonjour 。
同样,将RequestHeader fr更改为其他RequestHeader,例如nl 。它返回默认的语言环境(美国)消息Good Morning 。
让我们为RequestHeader nl创建一个属性文件message_nl.properties 。它包含荷兰语消息Goede Morgen。
messages_nl.properties
good.morning.message=Goede Morgen
再次发送GET请求,返回消息Goede Morgen 。
现在,我们将简化上面已完成的国际化的实施。在先前的实现中,我们接受了语言环境(RequestHeader)作为REST控制器方法的参数。如果我们将此方法添加到必须国际化的每种方法中,将会增加成本。 Spring提供了从LocaleContextHolder获取它的另一种方法。
让我们实现LocaleContextHolder而不是RequestHeader。
步骤1:打开HelloWorldController.java并更改helloWorldInternationalized()方法的返回类型。
return messageSource.getMessage("good.morning.message", null, LocaleContextHolder.getLocale());
HelloWorldController.java
package com.javatpoint.server.main.helloworld;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.i18n.LocaleContextHolder;
@Configuration
//Controller
@RestController
public class HelloWorldController
{
@Autowired
private MessageSource messageSource;
//using get method and hello-world URI
@GetMapping(path="/hello-world")
public String helloWorld()
{
return "Hello World";
}
@GetMapping(path="/hello-world-bean")
//method- which returns "Hello World"
public HelloWorldBean helloWorldBean()
{
return new HelloWorldBean("Hello World");//constructor of HelloWorldBean
}
//passing a path variable
//hello-world/path-variable/javatpoint
@GetMapping(path="/hello-world/path-variable/{name}")
public HelloWorldBean helloWorldPathVariable(@PathVariable String name)
{
return new HelloWorldBean(String.format("Hello World, %s",name)); //%s replace the name
}
//internationalization
@GetMapping(path="/hello-world-internationalized")
public String helloWorldInternationalized(@RequestHeader(name="Accept-Language", required=false) Locale locale)
{
return messageSource.getMessage("good.morning.message", null, LocaleContextHolder.getLocale());
}
}
步骤2:打开RestfulWebServicesApplication.java并将SessionLocaleResolver更改为AcceptHeaderLocaleResolver。 LocaleResolver实现使用在HTTP请求的“ accept-language”标头中指定的主要语言环境(由客户端浏览器发送的语言环境)。
RestfulWebServicesApplication.java
package com.javatpoint.server.main;
import java.util.Locale;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@SpringBootApplication
public class RestfulWebServicesApplication
{
public static void main(String[] args)
{
SpringApplication.run(RestfulWebServicesApplication.class, args);
}
//configuring default locale
@Bean
public LocaleResolver localeResolver()
{
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
//configuring ResourceBundle
@Bean
public ResourceBundleMessageSource messageSource()
{
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}
AcceptHeaderLocaleResolver的优点是我们不需要在每个控制器方法中都将请求标头配置为参数。
步骤3:打开REST客户端Postman并通过将密钥设置为Accept-Language并将值设置为fr发送GET请求。它返回消息Bonjour。
现在取消选中RequestHeader,将值fr更改为en。它返回默认的语言环境(美国)消息早安。
步骤4:移至RestfulWebServicesApplication.java。删除ResourceBundleMessageSource()方法并在application.properties文件中对其进行配置。
步骤5:打开application.properties文件并配置消息的基本名称,而不是在RestfulWebServicesApplication.java中创建单独的bean。
application.properties
logging.level.org.springframework=info
spring.messages.basename=messages
步骤6:重复步骤3。