Muhtemelen kadar mükemmel ama bu ı inşa budur olmaktan ...
Ben de ben çünkü SEO biraz ihtiyacı varsayılan dil seçme mekanizması değişti ve ben dili değil değiştirmeye karar olduğunu söylemek gerekir
get parametresi kullanmak yerine bunun yerine seçilen dil için uri yolunun ilk bölümünü kullanır. Örneğin : yerine benim açıklama bazlı yapılandırmada http://myurl.com/test.html?lang=de
ait http://myurl.com/en/test.html:
@Bean
public LocaleResolver localeResolver() {
UriLocaleResolver uriLocaleResolver = new UriLocaleResolver();
return uriLocaleResolver;
}
yerel çözümleyici
public class UriLocaleResolver implements LocaleResolver {
private final Logger logger = LoggerFactory.getLogger(getClass());
private Locale locale = null;
@Autowired
private LocalizationService localizationService;
@Override
public Locale resolveLocale(final HttpServletRequest servletRequest) {
if (locale != null) {
return locale;
}
String languageIsoCode = null;
try {
languageIsoCode = ((String)servletRequest.getAttribute(RequestKey.LANGUAGE_ISO_CODE)).toLowerCase();
}
catch (Exception e) { }
if (StringUtils.isBlank(languageIsoCode) || !localizationService.getSupportedLocaleLanguageIsoCodes().contains(languageIsoCode)) {
logger.trace("Couldn't find valid language iso code. Using default locale '{}'", GlobalConstant.DEFAULT_LOCALE);
return GlobalConstant.DEFAULT_LOCALE;
}
logger.trace("Found language iso code '{}'", languageIsoCode);
return new Locale(languageIsoCode);
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
this.locale = locale;
}
}
uri içinde geçerli bir dil kodu için denetler filtre ..
@Component
public class UriLocalizationFilter extends OncePerRequestFilter {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private LocalizationService localizationService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String uri = request.getRequestURI().substring(request.getContextPath().length());
String[] pathParts = uri.split("/");
if (!uri.startsWith(GlobalConstant.FRONTEND_RESOURCE_PATH_PREFIX) && pathParts.length >= 1 && pathParts[1].length() == 2) {
String originalLanguageIsoCode = pathParts[1];
String lowerCaseLanguageIsoCode = originalLanguageIsoCode.toLowerCase();
if (localizationService.getSupportedLocaleLanguageIsoCodes().contains(lowerCaseLanguageIsoCode)) {
logger.debug("Found valid language iso code {}", lowerCaseLanguageIsoCode);
}
else {
logger.debug("Found invalid language iso code {}. Using default language iso code {}.", lowerCaseLanguageIsoCode, GlobalConstant.DEFAULT_LOCALE.getLanguage());
lowerCaseLanguageIsoCode = GlobalConstant.DEFAULT_LOCALE.getLanguage();
}
String newUrl = StringUtils.removeStart(uri, '/' + originalLanguageIsoCode);
request.setAttribute(RequestKey.LANGUAGE_ISO_CODE, lowerCaseLanguageIsoCode);
logger.debug("Dispatching to new url '{}'", newUrl);
request.getRequestDispatcher(newUrl).forward(request, response);
}
else {
filterChain.doFilter(request, response);
}
}
public void setLocalizationService(LocalizationService localizationService) {
this.localizationService = localizationService;
}
}
}
Ön uç yolu, js, css, fontlar vb. Gibi tüm statik dosyaların yerleştirildiği durumda "kaynaklar" dır. localizationService.getSupportedLocaleLanguageIsoCodes(), şu anda üç dil kodu içeren bir kümedir (en, ru, de). Bu yüzden abc gibi yanlış bir dil kodunda varsayılan dilim "de" ile bir ileriye doğru gidiyorum. Benim için bu/kabul edilebilir bir çözümdür uri içinde yanlış bir dil koduna sahip olmanın sebebi, uri'nin kullanıcı tarafından manipüle edildiği anlamına gelir.
Belki de "çözüm" değil; Örneğin, nasıl ve eğer çerezlerle çalışıp çalışmadığını ve/veya "beni hatırla" (bahar güvenliğini kullanarak) kimlik doğrulaması yapıp yapmadığımı bilmiyorum ... sadece test etmek için zamanım olmadı ...
Hiç kimsenin bir fikri yok mu? Çok arama yapıyordum ama henüz bir çözüm veya fikir bulamadım .... – StephanM
http://localhost.de?lang=abc adresine gittiğinizde ne olur? Bu durumda hangi yerel kullanılır? –
Artık dil kodunu kontrol eden bir filtre oluşturduğumdan sözedemiyorum. Uygulamam bu dili desteklemiyorsa, manuel olarak varsayılan dilime ayarlıyorum. Bu durumda sizin durumunuzda "de" olarak ayarlanacaktır/almanca ... – StephanM