xref: /haiku/src/bin/locale/locale.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright 2011, Haiku, Inc.
3  * Distributed under the terms of the MIT license.
4  *
5  * Authors:
6  *		Ryan Leavengood, leavengood@gmail.com
7  */
8 
9 
10 #include <FormattingConventions.h>
11 #include <Locale.h>
12 #include <LocaleRoster.h>
13 #include <Message.h>
14 #include <String.h>
15 
16 #include <getopt.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 
20 
21 extern const char *__progname;
22 static const char *kProgramName = __progname;
23 
24 
25 void
26 print_available_languages()
27 {
28 	BMessage languages;
29 	BLocaleRoster::Default()->GetAvailableLanguages(&languages);
30 	BString language;
31 	for (int i = 0; languages.FindString("language", i, &language) == B_OK;
32 			i++) {
33 		printf("%s.UTF-8\n", language.String());
34 	}
35 	printf("POSIX\n");
36 }
37 
38 
39 BString
40 preferred_language()
41 {
42 	BMessage preferredLanguages;
43 	BLocaleRoster::Default()->GetPreferredLanguages(&preferredLanguages);
44 	const char* firstPreferredLanguage;
45 	if (preferredLanguages.FindString("language", &firstPreferredLanguage)
46 			!= B_OK) {
47 		// Default to English
48 		firstPreferredLanguage = "en";
49 	}
50 
51 	return firstPreferredLanguage;
52 }
53 
54 
55 void
56 print_formatting_conventions()
57 {
58 	BFormattingConventions conventions;
59 	BLocale::Default()->GetFormattingConventions(&conventions);
60 	if (conventions.CountryCode() != NULL) {
61 		printf("%s_%s.UTF-8\n", conventions.LanguageCode(),
62 			conventions.CountryCode());
63 	} else {
64 		printf("%s.UTF-8\n", conventions.LanguageCode());
65 	}
66 }
67 
68 
69 void
70 print_time_conventions()
71 {
72 	BFormattingConventions conventions;
73 	BLocale::Default()->GetFormattingConventions(&conventions);
74 	if (conventions.CountryCode() != NULL) {
75 		printf("%s_%s.UTF-8%s\n", conventions.LanguageCode(),
76 			conventions.CountryCode(),
77 			conventions.UseStringsFromPreferredLanguage()
78 				? "@strings=messages" : "");
79 	} else {
80 		printf("%s.UTF-8%s\n", conventions.LanguageCode(),
81 			conventions.UseStringsFromPreferredLanguage()
82 				? "@strings=messages" : "");
83 	}
84 }
85 
86 
87 void
88 usage(int status)
89 {
90 	printf("Usage: %s [-alftcm]\n"
91 		"  -a, --all\t\tPrint all available languages\n"
92 		"  -l, --language\tPrint the currently set preferred language\n"
93 		"  -f, --format\t\tPrint the formatting-related locale\n"
94 		"  -t, --time\t\tPrint the time-related locale\n"
95 		"  -c, --message\t\tPrint the message-related locale\n"
96 		"  -m, --charmap\t\tList available character maps\n"
97 		"  -h, --help\t\tDisplay this help and exit\n",
98 		kProgramName);
99 
100 	exit(status);
101 }
102 
103 
104 int
105 main(int argc, char **argv)
106 {
107 	static struct option const longopts[] = {
108 		{"all", no_argument, 0, 'a'},
109 		{"language", no_argument, 0, 'l'},
110 		{"format", no_argument, 0, 'f'},
111 		{"time", no_argument, 0, 't'},
112 		{"message", no_argument, 0, 'c'},
113 		{"charmap", no_argument, 0, 'm'},
114 		{"help", no_argument, 0, 'h'},
115 		{NULL}
116 	};
117 
118 	int c;
119 	while ((c = getopt_long(argc, argv, "lcfmath", longopts, NULL)) != -1) {
120 		switch (c) {
121 			case 'l':
122 				printf("%s\n", preferred_language().String());
123 				break;
124 			case 'f':
125 				print_formatting_conventions();
126 				break;
127 			case 'c':	// for compatibility, we used to use 'c' for ctype
128 				printf("%s.UTF-8\n", preferred_language().String());
129 				break;
130 			case 't':
131 				print_time_conventions();
132 				break;
133 
134 			// POSIX mandatory options
135 			case 'm':
136 				puts("UTF-8");
137 				break;
138 			case 'a':
139 				print_available_languages();
140 				break;
141 			// TODO 'c', 'k'
142 
143 			case 'h':
144 				usage(0);
145 				break;
146 			case 0:
147 				break;
148 			default:
149 				usage(1);
150 				break;
151 		}
152 	}
153 
154 	return 0;
155 }
156