[JAVA] Prise en charge multilingue de Spring Framework

introduction

J'étudiais le support multilingue dans Spring Framework, mais il y avait quelques encombrements, alors j'ai pris une note. La version de Spring Boot est 2.1.2.

De base

En gros, utilisez ʻorg.springframework.context.MessageSource`.

Exemple de fichier de configuration

Créez le fichier suivant directement sous src / main / resources.

messages.properties


hello=hello

messages_ja.properties


hello=Bonjour

messages.properties est le fichier par défaut et messages_ja.properties est le fichier pour le japonais (spécifiez les paramètres régionaux après le trait de soulignement).

Exemple d'appel

MessageController.java


@CrossOrigin
@RestController
@RequestMapping("/messages")
public class MessageController {
	@Autowired
	private MessageSource messageSource;

	@GetMapping("/hello")
	public String hello(Locale locale) {
		return messageSource.getMessage("hello", new String[] {}, locale);
	}
}

Injectez MessageSource pour appeler le message. L'exemple ci-dessus utilise celui de base, mais dans Official le message par défaut Il existe également une méthode à spécifier.

Exemple d'exécution

ʻAccept-Language le jadans pourle faire en envoyant une requête GET Bonjour ʻest, d'autres langues ( en-USetzh-CN, etc.) faites-le en envoyant une requête par bonjour «Est retourné. Cependant, selon l'environnement, «hello» peut ne pas être retourné même si ce n'est pas «ja» ([décrit plus loin](# lorsque le message est toujours renvoyé en japonais)).

application

Je souhaite modifier l'emplacement et le nom du fichier de paramètres

Par défaut, cela fait référence à messages.properties, mais vous pouvez vouloir changer l'emplacement du fichier ou préparer plusieurs fichiers. Dans ce cas, modifiez le MessageSource injecté.

Exemple de fichier de configuration

Supposons que vous gardiez le contenu de messages.properties et que vous définissiez l'emplacement de sauvegarde sur src / main / resources / i18n. Supposons également que les nouveaux fichiers suivants soient enregistrés dans src / main / resources / i18n / hoge.

hoge.properties


hoge=hoge

hoge_ja.properties


hoge=Hoge

Exemple de configuration côté Spring Framework

MessageSourceConfig.java


@Configuration
public class MessageSourceConfig {
	@Bean
	public MessageSource messageSource() {
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		messageSource.setBasenames("i18n/messages", "i18n/hoge/hoge");
		messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
		return messageSource;
	}
}

Une classe dans laquelle ResourceBundleMessageSource implémente MessageSource. Il semble y avoir un autre ReloadableResourceBundleMessageSource qui peut recharger le fichier de message. Spécifiez l'emplacement et le nom du fichier de message avec setBasenames. Il semble y avoir un moyen de spécifier le fichier de message dans ʻapplication.properties`, mais il n'est pas confirmé.

Exemple d'appel

MessageController.java


@CrossOrigin
@RestController
@RequestMapping("/messages")
public class MessageController {
	@Autowired
	private MessageSource messageSource;

	@GetMapping("/hello")
	public String hello(Locale locale) {
		return messageSource.getMessage("hello", new String[] {}, locale);
	}

	@GetMapping("/hoge")
	public String hoge(Locale locale) {
		return messageSource.getMessage("hoge", new String[] {}, locale);
	}
}

Exemple d'exécution

[De base] par le même ʻAccept-Language de valeur que lorsque le (# exemple d'exécution) ou le japonais renvoyé (Hello ʻand Hoge) est, hello et hoge est retourné.

Supplément

Lorsque le message est toujours renvoyé en japonais

La plupart du temps, lorsque je recherchais MessageSource sur n'importe quel site, cela indiquait que le message du fichier par défaut était renvoyé s'il n'y avait pas de paramètres régionaux spécifiés, mais lorsque je le vérifiais sur mon PC local, le message était toujours renvoyé en japonais. D'après ce que j'ai vérifié, il semble que si la locale n'existe pas, elle reviendra à la locale du système par défaut (Reference context / support / AbstractResourceBasedMessageSource.html # setFallbackToSystemLocale-boolean-)). Lorsque je l'ai vérifié sur mon PC local, je m'attendais à ce que le message soit toujours renvoyé en japonais car les paramètres régionaux du système étaient japonais et le fichier de propriétés en japonais était préparé.

Contre-mesures

MessageSourceConfig.java


@Configuration
public class MessageSourceConfig {
	@Bean
	public MessageSource messageSource() {
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		messageSource.setBasenames("i18n/messages", "i18n/hoge/hoge");
		messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
		messageSource.setFallbackToSystemLocale(false);
		return messageSource;
	}
}

Si vous définissez setFallbackToSystemLocale sur false, le message du fichier par défaut sera renvoyé si le fichier de la locale spécifiée n'existe pas (indépendamment de la locale du système, etc.).

en conclusion

Si c'est «ja», il sera retourné en japonais, mais si c'est «ja_JP», il ne sera pas retourné en japonais, etc.

Recommended Posts

Prise en charge multilingue de Spring Framework
[Spring Framework] Division de la configuration
1. Démarrez Spring Framework à partir de 1
Résumé de Spring Framework - À propos de DI
[Notes personnelles] À propos du framework Spring
Série de mémos d'auto-apprentissage Spring Framework_1
À propos de l'erreur de contexte Spring Framework
Spring Framework 5.0 Résumé des principaux changements
cadre de printemps Mémo d'étude simple (2): AOP
Outils Spring Framework pour développeur Java
Contrôleur de cadre de test Spring avec Junit
Introduction de l'authentification de base à Heroku [Spring Framework]
Prise en charge des tampons de protocole pour Spring Cloud Stream
Modifications majeures liées au test Spring Framework 5.0
XML de définition de bean Spring Framework: balise personnalisée
Pourquoi le printemps est considéré comme un cadre léger
Notes de l'étude Spring Framework [Partie 1] Conteneur DI
À propos de l'affichage initial de Spring Framework
Cache de support nul dans Spring Data Redis
Changements majeurs dans la fonctionnalité de base de Spring Framework 5.0
Fonctionnalités du framework Spring pour les développeurs Java