# 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:workman:eng      us(workman)      en,en-US             WM   login
xkb:us:workman-intl:eng us(workman-intl) en,en-US             WMI  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:ro:std:rum        ro(std)        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
xkb:mt::mlt           mt             mt        MT login
xkb:mk::mkd           mk             mk        MK

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