Pertama lihat struktur direktori projek tutorial sampel ini:
(Sudah tentu, folder i18n dan tiga fail sifat dalam resource juga Kami perlu membinanya sendiri, tetapi jangan risau tentang Resource Bundle Ini dijana secara automatik dengan menambahkan item konfigurasi yang sepadan dalam yml Jika anda tidak pasti, teruskan membaca tutorial)
Mula menaip (CV) kod:
pom.xml bergantung pada:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
kembali penghitungan kod
CodeEnum.java
/** * @author JCccc */ public enum CodeEnum { SUCCESS(1000, "请求成功"), FAIL(2000, "请求失败"); public final int code; public final String msg; public Integer getCode() { return this.code; } CodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public String getMsg() { return this.msg; } }
data pengembalian Pekapsulan ringkas
ResultData.java
import com.test.myi18n.enums.CodeEnum; import lombok.Data; /** * @author JCccc */ @Data public class ResultData<T> { private Integer code; private String message; private T data; public ResultData(int code, String message) { this.code = code; this.message = message; } public static ResultData success(CodeEnum codeEnum) { return new ResultData(codeEnum.code, codeEnum.msg); } public static ResultData success(String msg) { return new ResultData(CodeEnum.SUCCESS.getCode(),msg); } }
Pengkapsulan kaedah mudah setempat bagi MessageSource
LocaleMessage java
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; import java.util.Locale; /** * @author JCccc */ @Component public class LocaleMessage { @Autowired private MessageSource messageSource; public String getMessage(String code){ return this.getMessage(code,new Object[]{}); } public String getMessage(String code,String defaultMessage){ return this.getMessage(code,null,defaultMessage); } public String getMessage(String code,String defaultMessage,Locale locale){ return this.getMessage(code,null,defaultMessage,locale); } public String getMessage(String code,Locale locale){ return this.getMessage(code,null,"",locale); } public String getMessage(String code,Object[] args){ return this.getMessage(code,args,""); } public String getMessage(String code,Object[] args,Locale locale){ return this.getMessage(code,args,"",locale); } public String getMessage(String code,Object[] args,String defaultMessage){ return this.getMessage(code,args, defaultMessage,LocaleContextHolder.getLocale()); } public String getMessage(String code,Object[]args,String defaultMessage,Locale locale){ return messageSource.getMessage(code,args, defaultMessage,locale); } }
kelas alat penukaran bahasa i18n
I18nUtils.java
import java.util.Locale; import com.test.myi18n.message.LocaleMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class I18nUtils { @Autowired private LocaleMessage localeMessage; /** * 获取key * * @param key * @return */ public String getKey(String key) { String name = localeMessage.getMessage(key); return name; } /** * 获取指定哪个配置文件下的key * * @param key * @param local * @return */ public String getKey(String key, Locale local) { String name = localeMessage.getMessage(key, local); return name; } }
Langkah seterusnya ialah bahagian penting penukaran kami, kaedah aop memintas data yang dikembalikan oleh antara muka pengawal:
LanguageAspect.java
import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * @author JCccc */ @Aspect @Component @AllArgsConstructor @ConditionalOnProperty(prefix = "lang", name = "open", havingValue = "true") public class LanguageAspect { @Autowired I18nUtils i18nUtils; @Pointcut("execution(* com.test.myi18n.controller.*.*(..)))") public void annotationLangCut() { } /** * 拦截controller层返回的结果,修改msg字段 * * @param point * @param obj */ @AfterReturning(pointcut = "annotationLangCut()", returning = "obj") public void around(JoinPoint point, Object obj) { Object resultObject = obj; try { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); String langFlag = request.getHeader("lang"); if (null != langFlag) { ResultData r = (ResultData) obj; String msg = r.getMessage().trim(); if (StringUtils.isNotEmpty(msg)) { if ("CN".equals(langFlag)) { Locale locale = Locale.CHINA; msg = i18nUtils.getKey(msg, locale); } else if ("EN".equals(langFlag)) { Locale locale = Locale.US; msg = i18nUtils.getKey(msg, locale); } else { msg = i18nUtils.getKey(msg); } } r.setMessage(msg); } } catch (Exception e) { e.printStackTrace(); //返回原值 obj = resultObject; } } }
Tafsiran ringkas kod:
1. Alamat potongan anotasiLangCut -kawalan titik mati di atas perlu diubah sendiri, dan ditukar kepada folder yang anda mahu kawal Path2. @ConditionalOnProperty anotasi, baca item konfigurasi bermula dengan lang dalam yml, kunci dibuka, nilainya adalah benar
Hanya jika ia benar, pemintasan aop ini akan berkuat kuasa
3 String langFlag = request.getHeader("lang");
Daripada ayat ini, anda. dapat melihat bahawa apa yang saya pakai dalam artikel ini adalah untuk membiarkan parti antara muka dok (bahagian hadapan) lulus dalam bendera bahasa yang perlu digunakan dalam pengepala. Sebagai contoh, lulus dalam EN (Bahasa Inggeris) bermakna bahasa segera perlu ditukar kepada bahasa Inggeris.
Anda boleh menukarnya untuk membaca daripada yml, membaca daripada pangkalan data, membaca daripada redis, dll. berdasarkan situasi sebenar projek anda.4. ResultData r = (ResultData) obj;
String msg = r.getMessage().trim();
Dua baris kod ini adalah untuk meletakkan obj yang dipintas ke dalam Dapatkan gesaan mesej Jika data pemulangan projek anda bukan ResultData yang digunakan dalam artikel saya, anda perlu membuat pelarasan ajaib sendiri.
Akhirnya terdapat tiga fail sifat kucar-kacir:
sifat kucar-kacir
Bahasa pemulangan tersuai = Hello, jika artikel itu berguna kepada anda, Sila ikut + kegemaran + komen
Mengikut kaedah pemintasan aop dalam artikel ini, fail ini akan mula-mula mengesan nilai bendera bahasa semasa Jika ia tidak dikesan, ia akan diletakkan dalam
fail mess.properties.
mess_en_US.properties
Permintaan berjaya=berjaya
Permintaan gagal=gagal
mess_zh_CN.properties
<🎜 Minta kejayaan = Minta kejayaan
Minta kegagalan = Minta kegagalan
kejayaan = Minta kejayaan
gagal = Minta kegagalan
Akhir sekali, tulis antara muka ujian untuk menunjukkan kesan untuk semua orang:
@GetMapping("test") public ResultData test(@RequestParam int testNum) { if (1==testNum){ return ResultData.success(CodeEnum.SUCCESS); } if (2==testNum){ return ResultData.success(CodeEnum.FAIL); } if (3==testNum){ return ResultData.success("自定义的返回语"); } return ResultData.success(CodeEnum.SUCCESS); }
Ujian panggilan:
Atas ialah kandungan terperinci Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!