/* * Copyright 2011, Haiku, Inc. * Distributed under the terms of the MIT license. * * Authors: * Ryan Leavengood, leavengood@gmail.com */ #include #include #include #include #include #include #include #include extern const char *__progname; static const char *kProgramName = __progname; void print_available_languages() { BMessage languages; BLocaleRoster::Default()->GetAvailableLanguages(&languages); BString language; for (int i = 0; languages.FindString("language", i, &language) == B_OK; i++) { printf("%s.UTF-8\n", language.String()); } printf("POSIX\n"); } BString preferred_language() { BMessage preferredLanguages; BLocaleRoster::Default()->GetPreferredLanguages(&preferredLanguages); const char* firstPreferredLanguage; if (preferredLanguages.FindString("language", &firstPreferredLanguage) != B_OK) { // Default to English firstPreferredLanguage = "en"; } return firstPreferredLanguage; } void print_formatting_conventions() { BFormattingConventions conventions; BLocale::Default()->GetFormattingConventions(&conventions); if (conventions.CountryCode() != NULL) { printf("%s_%s.UTF-8\n", conventions.LanguageCode(), conventions.CountryCode()); } else { printf("%s.UTF-8\n", conventions.LanguageCode()); } } void print_time_conventions() { BFormattingConventions conventions; BLocale::Default()->GetFormattingConventions(&conventions); if (conventions.CountryCode() != NULL) { printf("%s_%s.UTF-8%s\n", conventions.LanguageCode(), conventions.CountryCode(), conventions.UseStringsFromPreferredLanguage() ? "@strings=messages" : ""); } else { printf("%s.UTF-8%s\n", conventions.LanguageCode(), conventions.UseStringsFromPreferredLanguage() ? "@strings=messages" : ""); } } void usage(int status) { printf("Usage: %s [-alftcm]\n" " -a, --all\t\tPrint all available languages\n" " -l, --language\tPrint the currently set preferred language\n" " -f, --format\t\tPrint the formatting-related locale\n" " -t, --time\t\tPrint the time-related locale\n" " -c, --message\t\tPrint the message-related locale\n" " -m, --charmap\t\tList available character maps\n" " -h, --help\t\tDisplay this help and exit\n", kProgramName); exit(status); } int main(int argc, char **argv) { static struct option const longopts[] = { {"all", no_argument, 0, 'a'}, {"language", no_argument, 0, 'l'}, {"format", no_argument, 0, 'f'}, {"time", no_argument, 0, 't'}, {"message", no_argument, 0, 'c'}, {"charmap", no_argument, 0, 'm'}, {"help", no_argument, 0, 'h'}, {NULL} }; int c; while ((c = getopt_long(argc, argv, "lcfmath", longopts, NULL)) != -1) { switch (c) { case 'l': printf("%s\n", preferred_language().String()); break; case 'f': print_formatting_conventions(); break; case 'c': // for compatibility, we used to use 'c' for ctype printf("%s.UTF-8\n", preferred_language().String()); break; case 't': print_time_conventions(); break; // POSIX mandatory options case 'm': puts("UTF-8"); break; case 'a': print_available_languages(); break; // TODO 'c', 'k' case 'h': usage(0); break; case 0: break; default: usage(1); break; } } return 0; }