# 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_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

# 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([ "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

  # 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
}
