@@ -97,37 +97,35 @@ public Locale resolveLocale(HttpServletRequest request) {
97
97
return defaultLocale ;
98
98
}
99
99
Locale requestLocale = request .getLocale ();
100
- if (isSupportedLocale (requestLocale )) {
100
+ List <Locale > supportedLocales = getSupportedLocales ();
101
+ if (supportedLocales .isEmpty () || supportedLocales .contains (requestLocale )) {
101
102
return requestLocale ;
102
103
}
103
- Locale supportedLocale = findSupportedLocale (request );
104
+ Locale supportedLocale = findSupportedLocale (request , supportedLocales );
104
105
if (supportedLocale != null ) {
105
106
return supportedLocale ;
106
107
}
107
108
return (defaultLocale != null ? defaultLocale : requestLocale );
108
109
}
109
110
110
- private boolean isSupportedLocale (Locale locale ) {
111
- List <Locale > supportedLocales = getSupportedLocales ();
112
- return (supportedLocales .isEmpty () || supportedLocales .contains (locale ));
113
- }
114
-
115
- private Locale findSupportedLocale (HttpServletRequest request ) {
111
+ private Locale findSupportedLocale (HttpServletRequest request , List <Locale > supportedLocales ) {
116
112
Enumeration <Locale > requestLocales = request .getLocales ();
117
- List <Locale > supported = getSupportedLocales ();
118
113
Locale languageMatch = null ;
119
114
while (requestLocales .hasMoreElements ()) {
120
115
Locale locale = requestLocales .nextElement ();
121
- if (supported .contains (locale )) {
122
- // Full match: typically language + country
123
- return locale ;
116
+ if (supportedLocales .contains (locale )) {
117
+ if (languageMatch == null || languageMatch .getLanguage ().equals (locale .getLanguage ())) {
118
+ // Full match: language + country, possibly narrowed from earlier language-only match
119
+ return locale ;
120
+ }
124
121
}
125
122
else if (languageMatch == null ) {
126
123
// Let's try to find a language-only match as a fallback
127
- for (Locale candidate : supported ) {
124
+ for (Locale candidate : supportedLocales ) {
128
125
if (!StringUtils .hasLength (candidate .getCountry ()) &&
129
126
candidate .getLanguage ().equals (locale .getLanguage ())) {
130
127
languageMatch = candidate ;
128
+ break ;
131
129
}
132
130
}
133
131
}
0 commit comments