From c02ac89f28047526c541e6653fad559c171cc2b7 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 17 Aug 2016 10:58:04 +0200 Subject: [PATCH] Add -i/--input option to locale(1) The default UI language returned by GetUserDefaultUILanguage does not necessarily reflect what the user really wants. E. g., the system could be en_US, but the desired language is en_CA, without having a CA langpack installed. Changing the settings under "Languages" and changing the keyboard layout is only affecting the so-called "Input language", while what's returned by GetUserDefaultUILanguage is the "Display language". Changing the latter requires installing MUI langpacks. Thus, we introduce a way to fetch the "Input language" using the -i or --input option. Also clean up documentation of locale(1). Signed-off-by: Corinna Vinschen --- winsup/doc/utils.xml | 39 +++++++++++++++++++++++++++------------ winsup/utils/locale.cc | 9 +++++++-- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/winsup/doc/utils.xml b/winsup/doc/utils.xml index 906c3773b..4af6583da 100644 --- a/winsup/doc/utils.xml +++ b/winsup/doc/utils.xml @@ -787,7 +787,7 @@ ldd [OPTION]... FILE... locale [-amvhV] locale [-ck] NAME -locale [-usfnU] +locale [-iusfnU] @@ -807,6 +807,7 @@ Modify output format: Default locale information: + -i, --input Print current input locale -u, --user Print locale of user's default UI language -s, --system Print locale of system default UI language -f, --format Print locale of user's regional format settings @@ -826,20 +827,34 @@ Other options: locale without parameters prints information about the current locale environment settings. - The -u, -s, - -f, and -n options can be used to - request the various Windows locale settings. The purpose is to use this - command in scripts to set the POSIX locale variables. + The -i, -u, + -s, -f, and -n + options can be used to request the various Windows locale settings. The + purpose is to use this command in scripts to set the POSIX locale + variables. + + The -i option prints the current input language. + This is called the "Input language" and basically equivalent to the + current keyboard layout setting. The -u option prints the current user's Windows UI locale to stdout. In Windows this setting is called the - "Display Language". The -s option prints the systems - default instead. The -f option prints the user's - setting for time, date, number and currency. That's equivalent to the - setting in the "Formats" or "Regional Options" tab in the "Region and - Language" or "Regional and Language Options" dialog. With the - -U option locale appends a - ".UTF-8". + "Display Language". + + The -s option prints the systems default instead. + + + The -f option prints the user's setting for time, + date, number and currency. That's equivalent to the setting in the + "Formats" or "Regional Options" tab in the "Region and Language" or + "Regional and Language Options" dialog. + + The -n option prints the system's default + language used for applications which don't support Unicode. + + With the -U option locale + appends the string ".UTF-8" to enforce using UTF-8. Using UTF-8 + as codeset is recommended. Usage example: diff --git a/winsup/utils/locale.cc b/winsup/utils/locale.cc index c9d4b5d59..1cd04337c 100644 --- a/winsup/utils/locale.cc +++ b/winsup/utils/locale.cc @@ -48,7 +48,7 @@ usage () printf ( "Usage: %1$s [-amvhV]\n" " or: %1$s [-ck] NAME\n" -" or: %1$s [-usfnU]\n" +" or: %1$s [-iusfnU]\n" "\n" "Get locale-specific information.\n" "\n" @@ -65,6 +65,7 @@ usage () "\n" "Default locale information:\n" "\n" +" -i, --input Print current input locale\n" " -u, --user Print locale of user's default UI language\n" " -s, --system Print locale of system default UI language\n" " -f, --format Print locale of user's regional format settings\n" @@ -93,6 +94,7 @@ struct option longopts[] = { {"category-name", no_argument, NULL, 'c'}, {"format", no_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, + {"input", no_argument, NULL, 'i'}, {"keyword-name", no_argument, NULL, 'k'}, {"charmaps", no_argument, NULL, 'm'}, {"no-unicode", no_argument, NULL, 'n'}, @@ -103,7 +105,7 @@ struct option longopts[] = { {"version", no_argument, NULL, 'V'}, {0, no_argument, NULL, 0} }; -const char *opts = "acfhkmnsuUvV"; +const char *opts = "acfhikmnsuUvV"; int getlocale (LCID lcid, char *name) @@ -786,6 +788,9 @@ main (int argc, char **argv) case 'm': maps = 1; break; + case 'i': + lcid = (UINT_PTR) GetKeyboardLayout (0) & 0xffff; + break; case 's': lcid = GetSystemDefaultUILanguage (); break;