📜  RESTful服务的国际化

📅  最后修改于: 2021-01-12 00:52:17             🧑  作者: Mango

RESTful服务的国际化

在本节中,我们将讨论RESTful Web服务的国际化。

国际化

国际化是以这样一种方式设计Web应用程序或服务的过程,即它可以自动为各个国家/地区提供各种语言的支持,而无需在应用程序中进行更改。之所以称为I18N ,是因为国际化一词从IN共有18个字符。

通过添加特定于语言环境的组件(例如翻译的文本,描述特定于语言环境的行为的数据等)来执行本地化。它支持完全集成到提供依赖语言或文化的功能的类和包中。

Java为桌面和服务器应用程序的国际化提供了基础。以下是重要的国际化功能区域。

  • 文本表示: Java基于Unicode字符集,并且一些库实现Unicode标准。
  • 语言环境标识和本地化: Java中的语言环境是可用于请求功能不同区域中特定于语言环境的行为的标识符。 ResourceBundle类支持本地化。该类提供对本地特定对象(包括字符串。
  • 日期和时间处理: Java提供了各种日历。它支持与日历独立的Date对象之间的来回转换。 Java支持世界上所有时区。
  • 文本处理:包括字符分析,大小写映射,字符串比较,将文本分解为单词,将数字,日期和时间值格式化为字符串或从字符串解析回。这些功能大多数都是与语言环境相关的。
  • 字符编码:当从流中读取传入的文本或将传出的文本写入流中时,它支持在Unicode和其他字符编码之间转换文本。

我们需要配置两件事以使服务国际化。

  • LocaleResolver
  • ResourceBundleMessageSource

默认语言环境是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并执行以下更改:

  • 选择GET请求。
  • 输入URI http:// localhost:8080 / hello-world-internationalized
  • 单击标题选项卡,然后键入:

  • 单击发送按钮。

它返回美国区域设置消息早安

现在我们将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。