私は春の起動アプリケーションを持っており、複数の言語と国をサポートしようとしています。国ごとの対応に失敗しました。ローカライズされた応答
これらは、私たちが今のサポートを計画しているコードです。 ja、es、fr、en-gb、es-mx、zh、ja。
私は、ローカライズさに応じて、いくつかのフィールドを得ることに取り組んでいます。 それは、私は(日食)私の地元でアプリケーションを実行して、郵便配達からの応答をチェックすると、私はそれが国の特定のファイルを拾って、正しく応答を与えていることがわかりますが、私はAWSサーバへの私の変更をプッシュするとき、それはありません言語固有のファイルを取得し、国別コードを無視するだけです。
たとえば、私がAccept-Languageをda、es-MX、q = 0.8とすると、es-MX(daはサポートしていません)の応答が期待されますが、 esとes-MXの両方のファイルがあります)、国コードMXは無視されます。
しかし、私はFRとして言語を受け入れている場合、-MXはES; qは= 0.8、それはmessages_fr.propertiesファイルをピックアップし、私が期待するものであるフランス語の応答を与えます。以下は
は私のクラスです。
@Configuration
@ComponentScan("com.hsf")
@EnableWebMvc
public class ApplicationConfig extends WebMvcConfigurerAdapter {
@Value("${spring.application.name}")
String appName;
@Bean
public LocaleResolver localeResolver() {
return new SmartLocaleResolver();
}
@Bean
public DispatcherServlet dispatcherServlet() {
final DispatcherServlet servlet = new DispatcherServlet();
servlet.setDispatchOptionsRequest(true);
return servlet;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:i18n/messages");
// If true, the key of the message will be displayed if the key is not
// found, instead of throwing an exception
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
// The value 0 means always reload the messages to be developer friendly
messageSource.setCacheSeconds(10);
return messageSource;
}
}
このクラスはAccept-Languageヘッダーを解析し、Localeを設定します。
public class SmartLocaleResolver extends AcceptHeaderLocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
try {
List<LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));
if (!list.isEmpty()) {
for (LanguageRange s : list) {
if (ApplicationConstants.LOCALE.contains(s.getRange())) {
return Locale.forLanguageTag(s.getRange());
}
}
}
} catch (IllegalArgumentException e) {
throw e;
}
return request.getLocale();
}
}
私はここに私のApplicationConstantsクラスで
public static final List<String> LOCALE = Collections
.unmodifiableList(Arrays.asList("en", "es", "fr", "es-mx", "zh", "ja"));
を以下の定数を持っているがMessageHandlerのクラス
@Component
public class MessageHandler {
@Autowired
private MessageSource messageSource;
public String localizeMessage(String errorCode, Object args[]) {
Locale locale = LocaleContextHolder.getLocale();
String message = messageSource.getMessage(errorCode, args, locale);
return message;
}
public String localizeMessage(String errorCode) {
return localizeMessage(errorCode, null);
}
}
この上の任意の考えですか?
これはより良いアプローチに見えますが、何らかの理由でmessages_es.propertiesファイルをまだピックアップしていて、messages_es_mx.propertiesを取得していません。しかし、私は以前の私のローカル(私は日食から実行する)の作品を述べたように。これはリクエストda、es-MX; q = 0.8の私のヘッダーです。 – Arun
ファイルの名前はmessages_es_MX.propertiesではなくmessages_es_mx.properties –
でなければなりません。どうもありがとう。投稿したコードで返されたLocaleを印刷すると、MXではなくmxとして印刷されました。なぜ私はMXの代わりにmxでファイル名を保持したのですか?あなたのコードから、es_MXとして印刷されていることがわかります。メッセージの名前をmessages_es_MX.propertiesに変更していました。再度、感謝します。 – Arun