All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.commercetools.sunrise.framework.localization.UserLanguageImpl Maven / Gradle / Ivy

The newest version!
package com.commercetools.sunrise.framework.localization;

import com.commercetools.sunrise.ctp.project.ProjectContext;
import com.commercetools.sunrise.framework.injection.RequestScoped;
import io.sphere.sdk.models.Base;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.mvc.Http;

import javax.inject.Inject;
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;

import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;

/**
 * Provides a distinct list with the selected {@link Locale} and the those coming from the AcceptedLanguage HTTP header.
 * Languages not supported by the {@link ProjectContext} are discarded.
 */
@RequestScoped
final class UserLanguageImpl extends Base implements UserLanguage {

    private static final Logger LOGGER = LoggerFactory.getLogger(UserLanguage.class);

    private final Locale locale;
    private final List locales;

    @Inject
    UserLanguageImpl(final Locale locale, final ProjectContext projectContext) {
        this.locale = locale;
        this.locales = acceptedLocales(locale, projectContext);
        LOGGER.debug("User locale {}, locales {}", locale, locales);
    }

    @Override
    public Locale locale() {
        return locale;
    }

    @Override
    public List locales() {
        return locales;
    }

    private static List acceptedLocales(final Locale locale, final ProjectContext projectContext) {
        final Http.Context httpContext = Http.Context.current.get();
        if (httpContext != null) {
            return Stream.concat(Stream.of(locale), requestAcceptedLanguages(httpContext.request(), projectContext))
                    .distinct()
                    .collect(toList());
        } else {
            return singletonList(locale);
        }
    }

    private static Stream requestAcceptedLanguages(final Http.Request httpRequest, final ProjectContext projectContext) {
        return httpRequest.acceptLanguages().stream()
                .map(lang -> Locale.forLanguageTag(lang.code()))
                .filter(projectContext::isLocaleSupported);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy