Spring i18n:@LocaleResolver 和 @RequestToViewName 指南

简介: 国际化是设计支持多语言和区域适配的应用程序的关键,有助于扩大市场覆盖、提升用户体验。Spring 提供了丰富的内置支持,如 `MessageSource`、`LocaleResolver` 和 `RequestToViewNameTranslator`,帮助开发者高效实现多语言切换和区域设置管理。通过结合 `@LocaleResolver` 识别用户语言环境,并配合 `@RequestToViewNameTranslator` 动态渲染视图,可构建高度本地化、灵活且用户友好的全球应用。

介绍

在当今的全球化世界中,应用程序不再局限于单一区域或语言。国际化 (i18n) 和本地化 (l10n) 是使您的应用程序可供全球受众访问且用户友好的关键功能。Spring Framework 是一个用于构建基于 Java 的应用程序的强大框架,它具有大量功能,可以使国际化过程变得简单而高效。

在这篇文章中,我们将深入探讨如何使用 Spring@LocaleResolver和来掌握 Spring 国际化的艺术@RequestToViewNameTranslator。我们将探讨这些注释的作用以及如何组合它们以使您的应用程序可在全球范围内访问。

什么是国际化以及为什么它很重要?

国际化,通常缩写为 i18n,可能有点绕口令,但它的概念很简单。从本质上讲,国际化是设计和准备软件的过程,以便可以轻松地将其本地化为各种语言和地区,而无需进行工程更改。让我们进一步解释这个概念。

国际化的基石

  • 区域设置管理:国际化的核心涉及识别“区域设置”,它本质上是一组与用户的语言和区域相关的用户偏好。
  • 文本外部化:最明显且立即引人注目的文本外部化是将用户可见文本与代码隔离并使其在资源文件中可用的行为。然后可以将这些文件翻译成多种语言。
  • 日期和时间格式:国际化还涉及调整符合当地规范的日期和时间格式。
  • 货币换算:各地的价格标签并不相同;格式和货币因国家/地区而异。
  • 排序和校对:甚至列表的排序方式也可能是特定于区域设置的。例如,字母表中字符的顺序可能因语言而异。

国际化如此重要的主要原因

更广泛的市场覆盖范围

国际化最引人注目的优势是扩大市场范围的潜力。想象一下您有一家网上商店;随着国际化,您不再局限于英语市场。您的商店可以吸引日本、德国、巴西等地的客户,从而增加潜在的收入来源。

增强客户参与度

客户更有可能与使用他们语言的平台进行互动。这不仅涉及理解网页上的文字,还涉及掌握随之而来的上下文和文化细微差别。

监管合规性

一些国家/地区的法规要求软件和数字服务必须以该国的官方语言提供。在这种情况下,国际化不仅是一个可有可无的功能,而且是法律上的必要条件。

竞争优势

拥有支持多种语言的应用程序可以让您在饱和市场中获得显着优势。例如,如果您有一个医疗保健应用程序,多语言可以让您打入竞争对手尚未进入的市场,为有需要的非英语用户提供服务。

适应性

国际化软件通常更容易适应各种需求,使其更加灵活和可扩展。从长远来看,随着您向软件添加更多语言和区域,您对精心设计的 i18n 架构的初始投资将会得到回报。

奠定基础:Spring 的 i18n 开箱即用功能

Spring 框架在设计时就考虑到了国际化 (i18n),它带来了许多开箱即用的功能,让您的 i18n 之旅顺利进行。如果您正在考虑国际化您的应用程序,那么了解这些内置功能可以节省您的时间和精力。在这里,我们将深入研究一些关键要素。

MessageSource:外部化文本字符串

也许 Spring 中 i18n 最常用的功能是MessageSource. 该接口提供了一种将文本字符串外部化到属性文件中的机制,从而将文本内容与源代码分离。当您想要将应用程序翻译成多种语言时,这尤其有用,因为您不必筛选代码来查找嵌入的字符串。

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

LocaleResolver:识别用户的区域设置

LocaleResolver帮助您的应用程序确定用户的区域设置。区域设置一旦确定,就可以用于提供特定于用户的语言和区域的内容。这不仅仅是文本;它还可以包括日期格式、货币符号等。

Spring 提供了多种实现LocaleResolver,例如SessionLocaleResolverCookieLocaleResolverAcceptHeaderLocaleResolver

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

ThemeResolver:支持多个主题

虽然与 i18n 并不严格相关,ThemeResolver但当您希望根据用户的区域设置或其他偏好提供不同的主题时,它会很有用。例如,对于从右到左阅读的阿拉伯语言,您可能有不同的设计布局。

@Bean
public ThemeResolver themeResolver() {
    FixedThemeResolver themeResolver = new FixedThemeResolver();
    themeResolver.setDefaultThemeName("default-theme");
    return themeResolver;
}

LocaleChangeInterceptor:动态更改语言环境

Spring i18n 库中另一个有用的功能是LocaleChangeInterceptor. 它允许用户动态更改当前区域设置,而无需重新启动应用程序。这通常作为拦截器来实现,该拦截器检查每个请求中的特定参数并相应地更改区域设置。

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    return localeChangeInterceptor;
}

RequestToViewNameTranslator:将请求映射到视图

虽然RequestToViewNameTranslator它不完全是 i18n 功能,但当您实施动态多语言网站时,它就变得至关重要。它将传入的 HTTP 请求转换为可以根据用户的区域设置或其他属性呈现的特定视图名称。

@Bean
public RequestToViewNameTranslator viewNameTranslator() {
    DefaultRequestToViewNameTranslator translator = new DefaultRequestToViewNameTranslator();
    return translator;
}

理解@LocaleResolver

在 Spring 框架中,语言环境的概念对于国际化至关重要。区域设置本质上捕获重要信息,例如用户的语言、国家/地区以及任何特殊变体首选项。Spring 通过接口提供了语言环境解析的抽象LocaleResolver。该@LocaleResolver注释用于定义自定义LocaleResolverbean,从而允许对应用程序中的区域设置管理进行更细粒度的控制。

LocaleResolver的作用

LocaleResolver接口的主要作用是根据传入 HTTP 请求的某些方面或其他标准来识别当前区域设置。一旦确定了区域设置,其他 i18n 功能就可以使用它来为用户提供个性化的、特定于区域的内容。

下面是使用 Spring 的 Java 配置定义自定义 bean 的简单示例LocaleResolver

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

区域设置解析器的类型

Spring提供了几种内置的接口实现LocaleResolver

  • SessionLocaleResolver:将用户的区域设置存储在 HTTP 会话中。
  • CookieLocaleResolver:使用浏览器 cookie 跟踪区域设置。
  • AcceptHeaderLocaleResolver:根据 HTTP 请求中的“Accept-Language”标头确定区域设置。

示例:使用 CookieLocaleResolver:

如果您想将用户的区域设置存储在 cookie 中以便跨会话持久保存,您可以使用CookieLocaleResolver如下所示的方法:

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    cookieLocaleResolver.setDefaultLocale(Locale.US);
    cookieLocaleResolver.setCookieName("myLocaleCookie");
    return cookieLocaleResolver;
}

区域设置更改拦截器

通常,您可能希望允许用户手动切换区域设置。这就是LocaleChangeInterceptor发挥作用的地方。可以配置此拦截器来检查 HTTP 请求中的特定参数,以动态更改区域设置。

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    return localeChangeInterceptor;
}

与MessageSource的关系

它们LocaleResolver协同工作,MessageSource在您的应用程序中提供特定于区域设置的文本。使用MessageSource提供的区域设置信息来LocaleResolver获取适当的文本字符串。

例如,假设您有以下英语和法语消息属性:

  • messages_en.properties:welcome.message=Welcome
  • messages_fr.properties:welcome.message=Bienvenue

LocaleResolver将帮助MessageSource根据用户的区域设置选择正确的消息。

掌握@RequestToViewNameTranslator

旨在@RequestToViewNameTranslator将请求转换为特定的视图名称。当您尝试根据请求属性或参数动态确定视图时,它就会发挥作用。这是一个示例代码片段:

@Bean
public RequestToViewNameTranslator viewNameTranslator() {
    DefaultRequestToViewNameTranslator translator = new DefaultRequestToViewNameTranslator();
    // Additional configuration
    return translator;
}

组合 @LocaleResolver 和 @RequestToViewNameTranslator

为了有效地国际化您的应用程序,您可以组合@LocaleResolver@RequestToViewNameTranslator。这是分步指南:

第 1 步:定义消息属性

messages在目录中创建一个文件夹resources并添加特定于语言的属性文件,例如messages_en.properties英语、messages_fr.properties法语等。

第2步:配置LocaleResolver

正如已经提到的,您需要设置一个LocaleResolver来识别用户的区域设置。

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

步骤 3:配置 RequestToViewNameTranslator

@Bean
public RequestToViewNameTranslator viewNameTranslator() {
    DefaultRequestToViewNameTranslator translator = new DefaultRequestToViewNameTranslator();
    // Additional configuration
    return translator;
}

第 4 步:更新您的控制器

更新您的控制器以使用已解析的区域设置并将请求转换为特定视图。

@RequestMapping("/welcome")
public String welcomePage(Model model, Locale locale) {
    String message = messageSource.getMessage("welcome.message", null, locale);
    model.addAttribute("message", message);
    return "welcome";
}

在此示例中,将选择“欢迎”视图,并且将根据用户的区域设置显示本地化的欢迎消息。

组合 @LocaleResolver 和 @RequestToViewNameTranslator

当您构建国际化应用程序时,利用两者@LocaleResolver可以@RequestToViewNameTranslator为真正无缝和个性化的用户体验打开大门。通过结合这两种功能,您不仅可以提供特定于区域设置的内容,还可以将用户无缝引导至特定于区域设置的视图。让我们深入研究一下如何有效地集成这两个组件。

为什么将两者结合起来?

  • 区域设置敏感性:确定@LocaleResolver用户的区域设置,从而决定他们应该接收什么类型的本地化内容。
  • 动态视图渲染:@RequestToViewNameTranslator负责将传入的 HTTP 请求转换为逻辑视图名称,这可能是区域设置敏感的。

通过合并这些功能,您可以创建强大的协同作用,不仅可以提供特定于区域设置的文本,还可以提供布局、格式设置和其他 UI 元素。

代码配置:基本示例

下面是一个简化的 Java 配置,用于设置@LocaleResolver@RequestToViewNameTranslator

@Configuration
public class WebConfig {
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.US);
        return localeResolver;
    }
    @Bean
    public RequestToViewNameTranslator viewNameTranslator() {
        DefaultRequestToViewNameTranslator translator = new DefaultRequestToViewNameTranslator();
        return translator;
    }
}

高级用例:动态视图选择

想象一个场景,您的应用程序支持英语和法语,并且每种语言都有两组视图:

  • dashboard_en.jsp对于英语。
  • dashboard_fr.jsp对于法语。

您可以实现一个自定义RequestToViewNameTranslator,从中获取区域设置信息LocaleResolver以动态选择适当的视图:

public class CustomRequestToViewNameTranslator implements RequestToViewNameTranslator {
    @Autowired
    private LocaleResolver localeResolver;
    @Override
    public String getViewName(HttpServletRequest request) throws Exception {
        Locale currentLocale = localeResolver.resolveLocale(request);
        String baseViewName = "dashboard";
        return baseViewName + "_" + currentLocale.getLanguage();
    }
}
@Bean
public RequestToViewNameTranslator customViewNameTranslator() {
    return new CustomRequestToViewNameTranslator();
}

@Beanpublic RequestToViewNameTranslator customViewNameTranslator() {    return new CustomRequestToViewNameTranslator();}

这样,当用户访问仪表板时,应用程序将提供服务dashboard_en.jspdashboard_fr.jsp基于用户当前的区域设置,该区域设置由 确定@LocaleResolver

最佳实践

  1. 一致性:确保特定于区域设置的视图的命名约定保持一致。这将使您更容易实现您的自定义RequestToViewNameTranslator
  2. 后备:在应用程序无法确定用户区域设置的情况下,始终有一个后备区域设置和视图。
  3. 测试:@LocaleResolver广泛测试和之间的交互,@RequestToViewNameTranslator以确保为用户提供正确的特定于区域设置的视图和内容。

结论

@LocaleResolver当您了解和的功能时,在 Spring 中应对国际化 (i18n) 的复杂性将变得更加容易管理@RequestToViewNameTranslator。这些组件为您提供了根据用户区域设置个性化内容和用户界面的工具,使您的应用程序更易于在全球范围内访问。

要点:

  1. 灵活性: Spring 为区域设置解析和视图名称翻译提供了各种选项 - 选择最适合您需求的选项。
  2. 用户体验:始终牢记最终用户。您的 i18n 努力应该旨在提供包容性和无缝的体验。
  3. 最佳实践:一致性、后备选项和彻底的测试是您交付强大的国际化应用程序的盟友。

通过有效地集成这些组件,您不仅可以适应不同的语言,还可以适应不同的语言。您正在真正将全球数字环境中的用户体验国际化。

相关文章
|
存储 Java Spring
Spring之国际化:i18n
【1月更文挑战第17天】 一、i18n概述 二、Java国际化 三、Spring6国际化 1、MessageSource接口 2、使用Spring6国际化
388 1
|
存储 Java 数据库连接
Spring6(五):Resources、i18n、Validation(3)
Spring6(五):Resources、i18n、Validation(3)
83 0
|
XML Java 数据格式
Spring6(五):Resources、i18n、Validation(2)
Spring6(五):Resources、i18n、Validation(2)
142 0
|
Java 数据库 uml
Spring6(五):Resources、i18n、Validation(1)
Spring6(五):Resources、i18n、Validation(1)
99 0
|
存储 人工智能 运维
spring国际化 - i18n
spring国际化 - i18n
248 0
|
存储 开发框架 自然语言处理
Spring6 i18n国际化
Spring6 i18n国际化
|
XML 存储 缓存
从MessageSource源码出发实战spring·i18n国际化的三种改造方案
从源码去看MessageSource的几个实现类的源码出发,基于spring的国际化支持,实现国际化的开箱即用,静态文件配置刷新生效以及全局异常国际化处理。
1000 0
从MessageSource源码出发实战spring·i18n国际化的三种改造方案
|
XML 前端开发 Java
Spring 全家桶之 Spring Web MVC(八)- I18N
Spring 全家桶之 Spring Web MVC(八)- I18N
Spring 全家桶之 Spring Web MVC(八)- I18N
|
10天前
|
XML 前端开发 Java
一文搞懂 Spring Boot 自动配置原理
Spring Boot 自动配置原理揭秘:通过 `@EnableAutoConfiguration` 加载 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 中的配置类,结合 `@Conditional` 按条件注入 Bean,实现“开箱即用”。核心在于约定大于配置,简化开发。
214 0

热门文章

最新文章

下一篇
开通oss服务