# 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("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")

assert(is_chromeos)

grit("strings") {
  source = "../ash_strings.grd"
  use_qualified_include = true
  outputs = [
    "grit/ash_strings.h",
    "ash_strings_am.pak",
    "ash_strings_ar.pak",
    "ash_strings_bg.pak",
    "ash_strings_bn.pak",
    "ash_strings_ca.pak",
    "ash_strings_cs.pak",
    "ash_strings_da.pak",
    "ash_strings_de.pak",
    "ash_strings_el.pak",
    "ash_strings_en-GB.pak",
    "ash_strings_en-US.pak",
    "ash_strings_es.pak",
    "ash_strings_es-419.pak",
    "ash_strings_et.pak",
    "ash_strings_fa.pak",
    "ash_strings_fake-bidi.pak",
    "ash_strings_fi.pak",
    "ash_strings_fil.pak",
    "ash_strings_fr.pak",
    "ash_strings_gu.pak",
    "ash_strings_he.pak",
    "ash_strings_hi.pak",
    "ash_strings_hr.pak",
    "ash_strings_hu.pak",
    "ash_strings_id.pak",
    "ash_strings_it.pak",
    "ash_strings_ja.pak",
    "ash_strings_kn.pak",
    "ash_strings_ko.pak",
    "ash_strings_lt.pak",
    "ash_strings_lv.pak",
    "ash_strings_ml.pak",
    "ash_strings_mr.pak",
    "ash_strings_ms.pak",
    "ash_strings_nl.pak",
    "ash_strings_nb.pak",
    "ash_strings_pl.pak",
    "ash_strings_pt-BR.pak",
    "ash_strings_pt-PT.pak",
    "ash_strings_ro.pak",
    "ash_strings_ru.pak",
    "ash_strings_sk.pak",
    "ash_strings_sl.pak",
    "ash_strings_sr.pak",
    "ash_strings_sv.pak",
    "ash_strings_sw.pak",
    "ash_strings_ta.pak",
    "ash_strings_te.pak",
    "ash_strings_th.pak",
    "ash_strings_tr.pak",
    "ash_strings_uk.pak",
    "ash_strings_vi.pak",
    "ash_strings_zh-CN.pak",
    "ash_strings_zh-TW.pak",
  ]
}

# Creates locale-specific pak files with strings needed for ash_unittests, etc.
template("repack_one_locale_ash") {
  locale = invoker.locale
  output = invoker.output

  repack(target_name) {
    # Each input pak file should also have a deps line for completeness.
    sources = [
      "$root_gen_dir/ash/strings/ash_strings_${locale}.pak",
      "$root_gen_dir/device/bluetooth/strings/bluetooth_strings_${locale}.pak",
      "$root_gen_dir/ui/chromeos/strings/ui_chromeos_strings_${locale}.pak",
      "$root_gen_dir/ui/strings/app_locale_settings_${locale}.pak",
      "$root_gen_dir/ui/strings/ui_strings_${locale}.pak",
    ]

    deps = [
      "//ash/strings",
      "//device/bluetooth/strings",
      "//ui/chromeos/strings",
      "//ui/strings:app_locale_settings",
      "//ui/strings:ui_strings",
    ]
  }
}

# Creates a pak file containing en-US strings for ash_unittests, etc.
repack_one_locale_ash("ash_test_strings") {
  output = "$root_build_dir/ash_test_strings.pak"
  locale = "en-US"
}
