@@ -43,6 +43,116 @@ String messageEn = bundle.getMessage(new Locale("en"), "HELLO", "world");
4343static StringResource combine(Iterable<StringResource > providers) {... }
4444```
4545
46+ ## 地区解析器
47+
48+ FIT 框架提供了 ` LocaleResolver ` 接口用于从 HTTP 请求中解析用户的地区设置,该接口定义了两个核心方法:
49+
50+ ``` java
51+ public interface LocaleResolver {
52+ /**
53+ * 解析用户的地区设置。
54+ *
55+ * @param request 表示待解析 HTTP 请求的 {@link HttpClassicServerRequest}。
56+ * @return 表示解析出来地区信息的 {@link Locale}。
57+ */
58+ Locale resolveLocale (HttpClassicServerRequest request );
59+
60+ /**
61+ * 设置地区到返回响应中。
62+ *
63+ * @param response 表示待设置地区的 HTTP 响应的 {@link HttpClassicServerResponse}。
64+ * @param locale 表示待设置地区的 {@link Locale}。
65+ */
66+ void setLocale (HttpClassicServerResponse response , Locale locale );
67+ }
68+ ```
69+
70+ 其中,` resolveLocale() ` 方法用于从请求中解析地区信息,` setLocale() ` 方法用于在响应中设置地区信息。
71+
72+ FIT 提供了 ` DefualtLocaleResolver ` 实现类,该类支持从多个来源解析地区信息,按优先级顺序为:
73+
74+ 1 . 请求参数:从 URL 参数中获取名为 ` locale ` 的参数值。
75+ 2 . Cookie:从名为 ` locale ` 的 Cookie 中获取地区信息。
76+ 3 . 请求头:从 ` Accept-Language ` 请求头中解析地区信息。
77+
78+ ## 地区解析过滤器
79+
80+ ` LocaleResolveFilter ` 是一个 HTTP 过滤器,用于自动处理请求的地区解析和响应的地区设置。该过滤器会在请求处理过程中自动执行以下操作:
81+
82+ - 使用配置的 ` LocaleResolver ` 解析请求中的地区信息。
83+ - 将解析得到的地区信息设置到 ` LocaleContextHolder ` 中。
84+ - 根据 ` LocaleResolver ` 的实现逻辑在响应中设置相应的地区状态。
85+ - 在请求处理完成后清理线程本地的地区信息。
86+
87+ 使用示例如下:
88+
89+ ``` java
90+ @Component
91+ public class WebConfig {
92+ @Bean
93+ public LocaleResolveFilter localeResolveFilter () {
94+ return new LocaleResolveFilter (new DefualtLocaleResolver ());
95+ }
96+ }
97+ ```
98+
99+ ## 地区上下文管理
100+
101+ FIT 框架提供了 ` LocaleContextHolder ` 类用于在当前线程中管理地区信息,该类使用 ThreadLocal 机制确保多线程环境下的地区信息隔离。主要方法包括:
102+
103+ ``` java
104+ public class LocaleContextHolder {
105+ /**
106+ * 设置当前线程的地区上下文。
107+ *
108+ * @param locale 表示待存储在当前线程地区上下文的 {@link Locale}。
109+ */
110+ public static void setLocale (Locale locale ) {
111+ if (locale != null ) {
112+ LOCALE_CONTEXT_HOLDER . set(locale);
113+ }
114+ }
115+
116+ /**
117+ * 获取当前线程的地区。
118+ *
119+ * @return 表示当前线程上下文存储地区信息的 {@link Locale}。
120+ */
121+ public static Locale getLocale () {
122+ return LOCALE_CONTEXT_HOLDER . get();
123+ }
124+
125+ /**
126+ * 清除当前线程的地区上下文。
127+ */
128+ public static void clear () {
129+ LOCALE_CONTEXT_HOLDER . remove();
130+ }
131+ }
132+ ```
133+
134+ 使用示例:
135+
136+ ``` java
137+ public class testLocaleContextHolder {
138+ public void test () {
139+ try {
140+ // 设置当前线程的地区为英文。
141+ LocaleContextHolder . setLocale(Locale . ENGLISH );
142+ // 获取当前线程的地区。
143+ Locale currentLocale = LocaleContextHolder . getLocale();
144+ } finally {
145+ // 请在使用完毕后尽快清理当前线程的地区信息。
146+ LocaleContextHolder . clear();
147+ }
148+ }
149+ }
150+ ```
151+
152+ ## 校验消息国际化
153+
154+ FIT 框架的校验功能支持国际化,实现通过 ` LocaleContextMessageInterpolator ` 类实现校验消息的多语言支持。该类会根据 ` LocaleContextHolder ` 中设置的地区信息自动选择对应语言的校验消息模板。
155+
46156# 12.2 Event事件
47157
48158## 12.2.1 相关接口
@@ -254,7 +364,6 @@ FIT 框架提供了基于 Hibernate Validator 的数据校验功能,支持对
254364@Component
255365@Validated
256366public class UserController {
257-
258367 public void createUser (@NotBlank (message = " 用户名不能为空" ) String username ,
259368 @Min (value = 18 , message = " 年龄必须大于等于 18" ) Integer age ) {
260369 // 业务逻辑
0 commit comments