View Source PlugLocale.Sanitizer (plug_locale v0.2.0)

The default implementation is a function like fn x -> x end, which does nothing. But, in practice, you will need to use something meaningful.

A possible implementation:

defmodule DemoWeb.LocaleSanitizer do
  def sanitize(locale) do
    case locale do
      # explicit matching on supported locales
      locale when locale in ["en", "zh"] ->
        locale

      # fuzzy matching on en locale
      "en-" <> _ ->
        "en"

      # fuzzy matching on zh locale
      "zh-" <> _ ->
        "zh"

      # fallback for unsupported locales
      _ ->
        "en"
    end
  end
end

Then, use above implementation in plugs by using :sanitize_locale option:

# use it for PlugLocale.WebBrowser
plug PlugLocale.WebBrowser,
  default_locale: "en",
  locales: ["en", "zh"],
  sanitize_locale: &DemoWeb.LocaleSanitizer.sanitize/1,
  # ...

# use it for PlugLocale.Header
plug PlugLocale.Header,
  default_locale: "en",
  locales: ["en", "zh"],
  sanitize_locale: &DemoWeb.LocaleSanitizer.sanitize/1,
  # ...