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

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

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

import com.commercetools.sunrise.ctp.project.ProjectContext;
import play.mvc.Http;

import javax.inject.Inject;
import javax.inject.Provider;
import java.util.List;
import java.util.Locale;
import java.util.Optional;

import static java.util.Arrays.asList;

/**
 * Provides the {@link Locale} instance extracted from the URL using {@code languageTag} as the route variable name.
 */
public final class LocaleFromUrlProvider implements Provider {

    private static final String ROUTE_LANGUAGE_VAR = "languageTag";

    private final ProjectContext projectContext;

    @Inject
    LocaleFromUrlProvider(final ProjectContext projectContext) {
        this.projectContext = projectContext;
    }

    @Override
    public Locale get() {
        return findCurrentLanguage()
                .filter(projectContext::isLocaleSupported)
                .orElseGet(projectContext::defaultLocale);
    }

    private Optional findCurrentLanguage() {
        final Http.Context httpContext = Http.Context.current.get();
        if (httpContext != null) {
            return indexOfLanguageTagInRoutePattern(httpContext)
                    .map(index -> {
                        final String languageTag = httpContext.request().path().split("/")[index];
                        return Locale.forLanguageTag(languageTag);
                    });
        } else {
            return Optional.empty();
        }
    }

    private Optional indexOfLanguageTagInRoutePattern(final Http.Context httpContext) {
        return Optional.ofNullable(httpContext.args.get("ROUTE_PATTERN"))
                .map(routePattern -> routePattern.toString().replaceAll("<[^>]+>", "")) // Remove regex because splitting '$languageTag<[^/]+>' with '/' would create more words
                .map(routePattern -> {
                    final List paths = asList(routePattern.split("/"));
                    return paths.indexOf("$" + ROUTE_LANGUAGE_VAR);
                })
                .filter(index -> index >= 0);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy