# The list of keyboard layouts that we support. The keyboard layout metadata is
# also defined here.
#
# Each non-comment line contains the following tab-or-space-separated columns.
#
# 1) The input method ID used by Chrome. (ex. "xkb:ca::fra") You should *NEVER*
#    change the ID since the ID might be written in user's ~/Preferences. For
#    example, three-letter ISO 639-2/B codes are used for IDs start with "xkb:"
#    for histrical reason, but we should not replace them with two-letter 639-1
#    codes that are currently in use in the 3rd column.
# 2) The keyboard layout ID used by XKB. (ex. "us", "us(dvorak)", "ca",
#    "handwriting-vk,jp"). See also: /usr/share/X11/xkb/symbols.
# 3) The language code (ex. "fr"). Only one format, ISO 639-1 compliant two-
#    letter language code which can be recognized by ICU, is allowed. Do not use
#    three-letter ones (ISO 639-2/T and 639-2/B) here. For "en", "pt", and "zh",
#    two-letter upper-case country code should be added (ex. "en-US", "zh-TW").
#    See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for details.
#    We can specify multiple language code with comma separator.
# 4) The indicator string (ex. INTL for xkb:us:intl:eng). This string will be
#    shown in system tray or indicator window.
# 5) The additional attibution.
#    login: Specified keyboard layout will be used on login screen or lock
#    screen.
#
# Notes:
#   When adding a line to this list, please also add a mapping from the input
#   method ID to the keyboard overlay ID to INPUT_METHOD_ID_TO_OVERLAY_ID in
#
#    * tools/gen_keyboard_overlay_data/gen_keyboard_overlay_data.py
#
#   and update the following files by running this script.
#
#    * chrome/app/generated_resources.grd
#    * chrome/browser/resources/chromeos/keyboard_overlay_data.js
#    * chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
#
#   If you add an XKB layout which depends on AltGr or X11's Mod3Mask
#   (e.g. Germany Neo2 XKB layout), you should also update kAltGrLayoutIds or
#   kMod3LayoutIds in
#   chrome/browser/chromeos/input_method/input_method_manager_impl.cc
#   Otherwise, Mod3Mask might be removed unexpectedly by the rewriter, and
#   sticky keys will not work.
#

# U.S. English
xkb:us::eng           us             en,en-US,en-AU,en-NZ US   login
xkb:us:intl:eng       us(intl)       en,en-US             INTL login
xkb:us:altgr-intl:eng us(altgr-intl) en,en-US             EXTD login
xkb:us:dvorak:eng     us(dvorak)     en,en-US             DV   login
xkb:us:colemak:eng    us(colemak)    en,en-US             CO   login
xkb:us:intl:nld       us(intl)       nl                   INTL login
xkb:us:intl:por       us(intl)       pt-BR                INTL login
xkb:us::ind           us             id                   US   login
xkb:us::fil           us             fil                  US   login
xkb:us::msa           us             ms                   US   login

# U.S. English entiries have to be above the Dutch entry so that xkb:us:intl:eng
# will be selected as the default keyboard when the UI language is set to Dutch.

# Dutch
xkb:be::nld  be nl BE login
# We don't support xkb:nl::nld. See b/4430951.

# French
xkb:fr::fra       fr         fr,fr-FR FR login
xkb:be::fra       be         fr       BE login
xkb:ca::fra       ca         fr,fr-CA CA login
xkb:ch:fr:fra     ch(fr)     fr,fr-CH CH login
xkb:ca:multix:fra ca(multix) fr,fr-CA CA login

# German
xkb:de::ger     de      de,de-DE DE  login
xkb:de:neo:ger  de(neo) de,de-DE NEO login
xkb:be::ger     be      de       BE  login
xkb:ch::ger     ch      de,de-CH CH  login

# Japanese
# |kMozcJaInputMethodIds| in ibus_ui_controller.cc should also be updated when
# a new Mozc Japanese IME for another keyboard layout is added.
xkb:jp::jpn  jp ja JA login

# Russian
xkb:ru::rus          ru           ru RU
xkb:ru:phonetic:rus  ru(phonetic) ru RU

# Keyboard layouts.
xkb:br::por           br             pt-BR,pt  BR login
xkb:bg::bul           bg             bg        BG
xkb:bg:phonetic:bul   bg(phonetic)   bg        BG
xkb:ca:eng:eng        ca(eng)        en,en-CA  CA login
xkb:cz::cze           cz             cs        CZ login
xkb:cz:qwerty:cze     cz(qwerty)     cs        CS login
xkb:ee::est           ee             et        EE login
xkb:es::spa           es             es        ES login
xkb:es:cat:cat        es(cat)        ca        CAS login
xkb:dk::dan           dk             da        DK login
xkb:gr::gre           gr             el        GR
xkb:il::heb           il             he        IL
xkb:latam::spa        latam          es,es-419 LA login
xkb:lt::lit           lt             lt        LT login
xkb:lv:apostrophe:lav lv(apostrophe) lv        LV login
xkb:hr::scr           hr             hr        HR login
xkb:gb:extd:eng       gb(extd)       en,en-GB  GB login
xkb:gb:dvorak:eng     gb(dvorak)     en,en-GB  DV login
xkb:fi::fin           fi             fi        FI login
xkb:hu::hun           hu             hu        HU login
xkb:it::ita           it             it,it-IT  IT login
xkb:is::ice           is             is        IS login
xkb:no::nob           no             nb,nn,no  NO login
xkb:pl::pol           pl             pl        PL login
xkb:pt::por           pt             pt-PT,pt  PT login
xkb:ro::rum           ro             ro        RO login
xkb:se::swe           se             sv        SE login
xkb:sk::slo           sk             sk        SK
xkb:si::slv           si             sl        SI login
xkb:rs::srp           rs             sr        RS
xkb:tr::tur           tr             tr        TR login
xkb:ua::ukr           ua             uk        UA
xkb:by::bel           by             be        BY
xkb:am:phonetic:arm   am             hy        AM
xkb:ge::geo           ge             ka        GE
xkb:mn::mon           mn             mn        MN
xkb:ie::ga            ie             ga        GA login

# TODO(yusukes): Support xkb:latam:deadtilde:spa and/or xkb:latam:nodeadkeys:spa
# if necessary.
