# 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:
#   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:intl_pc:eng      us(intl_pc)      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:dvp:eng          us(dvp)          en,en-US             DVP  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(oss)    fr,fr-FR FR   login
xkb:fr:bepo:fra   fr(bepo)   fr,fr-FR BEPO 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:fo::fao           fo             fo        FO
xkb:gr::gre           gr             el        GR
xkb:il::heb           il             he        IL
xkb:kz::kaz           kz             kk        KZ
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:hu:qwerty:hun     hu(qwerty)     hu        HU
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:tr:f:tur          tr(f)          tr        TR
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.
