# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/chromeos/ui_mode.gni")

# This file creates the |locales| which is the set of current
# locales based on the current platform. Locales in this list are formated
# based on what .pak files expect.
# The |locales| variable *may* contain pseudolocales, depending on the
# |enable_pseudolocales| flag.
# If you specifically want to have the locales variable with or without
# pseudolocales, then use |locales_with_pseudolocales| or
# |locales_without_pseudolocales|.

# The following additional platform specific lists are created:
# - |android_apk_locales| subset for Android based apk builds
# - |android_bundle_locales_as_resources| locales formatted for XML output names
# - |locales_as_mac_outputs| formated for mac output bundles
# - |ios_packed_locales| subset for iOS
# - |ios_packed_locales_as_mac_outputs| subset for iOS output

# Android doesn't ship all locales in order to save space (but webview does).
# http://crbug.com/369218
android_apk_omitted_locales = [
  "bn",
  "et",
  "gu",
  "kn",
  "ml",
  "mr",
  "ms",
  "ta",
  "te",
]

# Chrome on iOS only ships with a subset of the locales supported by other
# version of Chrome as the corresponding locales are not supported by the
# operating system (but for simplicity, the corresponding .pak files are
# still generated).
ios_unsupported_locales = [
  "am",
  "bn",
  "et",
  "fil",
  "gu",
  "kn",
  "lv",
  "ml",
  "mr",
  "sl",
  "sw",
  "ta",
  "te",
]

# These list are defined even when not building for Android or iOS for the
# sake of build/locale_tool.py. Ensure that GN doesn't complain about them
# being unused.
not_needed([ "android_apk_omitted_locales" ])
not_needed([ "ios_unsupported_locales" ])

# Superset of all locales used in Chrome with platform specific changes noted.
all_chrome_locales = [
  "af",
  "am",
  "ar",
  "as",
  "az",
  "be",
  "bg",
  "bn",
  "bs",
  "ca",
  "cs",
  "da",
  "de",
  "el",
  "en-GB",
  "en-US",
  "es",
  "es-419",  # "es-MX" in iOS (Mexico vs Latin America) "es-US" on Android
  "et",
  "eu",
  "fa",
  "fi",
  "fil",  # "tl" in .xml but "fil" in TC and .pak
  "fr",
  "fr-CA",
  "gl",
  "gu",
  "he",  # "iw" in .xml and TC but "he" in .pak
  "hi",
  "hr",
  "hu",
  "hy",
  "id",  # "in" in .xml but "id" in TC and .pak
  "is",
  "it",
  "ja",
  "ka",
  "kk",
  "km",
  "kn",
  "ko",
  "ky",
  "lo",
  "lt",
  "lv",
  "mk",
  "ml",
  "mn",
  "mr",
  "ms",
  "my",
  "nb",  # "no" in TC but "nb" in .xml and .pak
  "ne",
  "nl",
  "or",
  "pa",
  "pl",
  "pt-BR",  # just "pt" in iOS
  "pt-PT",
  "ro",
  "ru",
  "si",
  "sk",
  "sl",
  "sq",
  "sr",
  "sr-Latn",  # -b+sr+Latn in .xml
  "sv",
  "sw",
  "ta",
  "te",
  "th",
  "tr",
  "uk",
  "ur",
  "uz",
  "vi",
  "zh-CN",
  "zh-HK",
  "zh-TW",
  "zu",
]

# New locales added to Chrome Android bundle builds.
android_bundle_only_locales = [
  "af",
  "as",
  "az",
  "be",
  "bs",
  "eu",
  "fr-CA",
  "gl",
  "hy",
  "is",
  "ka",
  "kk",
  "km",
  "ky",
  "lo",
  "mk",
  "mn",
  "my",
  "ne",
  "or",
  "pa",
  "si",
  "sq",
  "sr-Latn",
  "ur",
  "uz",
  "zh-HK",
  "zu",
]

# New locales added to ChromeOS builds.
chromeos_only_locales = [ "is" ]

if (is_android) {
  locales = all_chrome_locales

  # Android doesn't ship all locales on KitKat in order to save space
  # (but webview does). http://crbug.com/369218
  android_apk_locales = all_chrome_locales - android_bundle_only_locales -
                        android_apk_omitted_locales

  # List for Android locale names in .xml exports. Note: needs to stay in sync
  # with |ToAndroidLocaleName| in build/android/gyp/util/resource_utils.py.
  #  - add r: (e.g. zh-HK -> zh-rHK )
  android_bundle_locales_as_resources = []
  foreach(_locale, locales) {
    android_bundle_locales_as_resources +=
        [ string_replace(_locale, "-", "-r") ]
  }

  #  - remove en-US
  #  - swap: (he, id, en-419, fil) -> (iw, in, es-rUS, tl)
  #  - sr-rLatn -> -b+sr+Latn
  android_bundle_locales_as_resources -= [
    "en-rUS",
    "es-r419",
    "fil",
    "he",
    "id",
    "sr-rLatn",
  ]
  android_bundle_locales_as_resources += [
    "b+sr+Latn",
    "es-rUS",
    "in",
    "iw",
    "tl",
  ]
} else if (is_chromeos_ash || is_chromeos_lacros) {
  # In ChromeOS we support a few more locales than standard Chrome.
  locales =
      all_chrome_locales - android_bundle_only_locales + chromeos_only_locales
} else {
  # Change if other platforms support more locales.
  locales = all_chrome_locales - android_bundle_only_locales
}

# Chrome on iOS uses different names for "es-419" and "pt-BR" (called
# respectively "es-MX" and "pt" on iOS).
if (is_ios) {
  locales -= [
    "es-419",
    "pt-BR",
  ]
  locales += [
    "es-MX",
    "pt",
  ]
}

pseudolocales = [
  "ar-XB",
  "en-XA",
]
locales_without_pseudolocales = locales
locales_with_pseudolocales = locales + pseudolocales

declare_args() {
  # We want to give pseudolocales to everyone except end-users (devs & QA).
  enable_pseudolocales = !is_official_build
}

if (enable_pseudolocales) {
  # Note that this only packages the locales in, and doesn't add the ui to enable them.
  locales += pseudolocales
}

# Same as the locales list but in the format Mac expects for output files:
# it uses underscores instead of hyphens, and "en" instead of "en-US".
locales_as_mac_outputs = []
foreach(locale, locales) {
  if (locale == "en-US") {
    locales_as_mac_outputs += [ "en" ]
  } else {
    locales_as_mac_outputs += [ string_replace(locale, "-", "_") ]
  }
}

if (is_ios) {
  ios_packed_locales = locales - ios_unsupported_locales
  ios_packed_locales_as_mac_outputs =
      locales_as_mac_outputs - ios_unsupported_locales
}
