package com.vtence.molecule.middlewares; import com.vtence.molecule.Request; import com.vtence.molecule.Response; import com.vtence.molecule.http.AcceptLanguage; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class Locales extends AbstractMiddleware { private final List<Locale> supported; public Locales(String... supported) { this.supported = fromLanguageTags(supported); } private static List<Locale> fromLanguageTags(String... languageTags) { List<Locale> locales = new ArrayList<>(); for (String tag : languageTags) { locales.add(Locale.forLanguageTag(tag)); } return locales; } public void handle(Request request, Response response) throws Exception { AcceptLanguage acceptedLanguages = AcceptLanguage.of(request); Locale best = acceptedLanguages.selectBest(supported); request.attribute(Locale.class, best != null ? best : Locale.getDefault()); try { forward(request, response).whenComplete((result, error) -> unbindLocale(request)); } catch(Throwable error) { unbindLocale(request); throw error; } } private Request unbindLocale(Request request) { return request.removeAttribute(Locale.class); } }