Branch: refs/heads/master
Home: https://github.com/mono/mono
Compare: https://github.com/mono/mono/compare/ba6de2d5cc4d...64eff753bdeb
Commit: c5918aef8265de049e12c61b2bbdf12fbe1dbf63
Author: Martin Potter <[email protected]> (martinpotter)
Date: 2013-09-17 14:26:27 GMT
URL: https://github.com/mono/mono/commit/c5918aef8265de049e12c61b2bbdf12fbe1dbf63
Improving the retrieval of the user's locale on Apple systems.
The previous behavior used the entire local identifier string that includes optional settings such as variant and calendar format. This returns locales like en_US_POSIX@calendar=buddhist which result in the user's culture being the invariant culture.
This change builds the locale from the language, country code and optional script code so that the locale returned is in the expected format.
This commit is licensed under MIT/X11.
Changed paths:
M mono/metadata/locales.c
Modified: mono/metadata/locales.c
===================================================================
@@ -396,7 +396,12 @@ static gint32 string_invariant_indexof_char (MonoString *source, gint32 sindex,
{
static gchar *darwin_locale = NULL;
CFLocaleRef locale = NULL;
+ CFStringRef locale_language = NULL;
+ CFStringRef locale_country = NULL;
+ CFStringRef locale_script = NULL;
CFStringRef locale_cfstr = NULL;
+ CFIndex bytes_converted;
+ CFIndex bytes_written;
CFIndex len;
int i;
@@ -406,21 +411,51 @@ static gint32 string_invariant_indexof_char (MonoString *source, gint32 sindex,
locale = CFLocaleCopyCurrent ();
if (locale) {
- locale_cfstr = CFLocaleGetIdentifier (locale);
-
- if (locale_cfstr) {
- len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
- darwin_locale = (char *) malloc (len);
- if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
- free (darwin_locale);
- CFRelease (locale);
- darwin_locale = NULL;
- return NULL;
+ locale_language = CFLocaleGetValue (locale, kCFLocaleLanguageCode);
+ if (locale_language != NULL && CFStringGetBytes(locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len = bytes_converted + 1;
+
+ locale_country = CFLocaleGetValue (locale, kCFLocaleCountryCode);
+ if (locale_country != NULL && CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+
+ locale_script = CFLocaleGetValue (locale, kCFLocaleScriptCode);
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+ }
+
+ darwin_locale = (char *) malloc (len + 1);
+ CFStringGetBytes (locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) darwin_locale, len, &bytes_converted);
+
+ darwin_locale[bytes_converted] = '-';
+ bytes_written = bytes_converted + 1;
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted) > 0) {
+ darwin_locale[bytes_written + bytes_converted] = '-';
+ bytes_written += bytes_converted + 1;
+ }
+
+ CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted);
+ darwin_locale[bytes_written + bytes_converted] = NULL;
}
+ }
+
+ if (darwin_locale == NULL) {
+ locale_cfstr = CFLocaleGetIdentifier (locale);
+
+ if (locale_cfstr) {
+ len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
+ darwin_locale = (char *) malloc (len);
+ if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
+ free (darwin_locale);
+ CFRelease (locale);
+ darwin_locale = NULL;
+ return NULL;
+ }
- for (i = 0; i < strlen (darwin_locale); i++)
- if (darwin_locale [i] == '_')
- darwin_locale [i] = '-';
+ for (i = 0; i < strlen (darwin_locale); i++)
+ if (darwin_locale [i] == '_')
+ darwin_locale [i] = '-';
+ }
}
CFRelease (locale);
Commit: 64eff753bdeb747d6c7d35c3c7cc77fe5fd5cea4
Author: Sebastien Pouliot <[email protected]> (spouliot)
Date: 2013-10-21 21:19:26 GMT
URL: https://github.com/mono/mono/commit/64eff753bdeb747d6c7d35c3c7cc77fe5fd5cea4
Merge pull request #730 from LogosBible/locale-changes
Improving the retrieval of the user's locale on Apple systems.
Changed paths:
M mono/metadata/locales.c
Modified: mono/metadata/locales.c
===================================================================
@@ -362,7 +362,12 @@ static gint32 string_invariant_indexof_char (MonoString *source, gint32 sindex,
{
static gchar *darwin_locale = NULL;
CFLocaleRef locale = NULL;
+ CFStringRef locale_language = NULL;
+ CFStringRef locale_country = NULL;
+ CFStringRef locale_script = NULL;
CFStringRef locale_cfstr = NULL;
+ CFIndex bytes_converted;
+ CFIndex bytes_written;
CFIndex len;
int i;
@@ -372,21 +377,51 @@ static gint32 string_invariant_indexof_char (MonoString *source, gint32 sindex,
locale = CFLocaleCopyCurrent ();
if (locale) {
- locale_cfstr = CFLocaleGetIdentifier (locale);
-
- if (locale_cfstr) {
- len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
- darwin_locale = (char *) malloc (len);
- if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
- free (darwin_locale);
- CFRelease (locale);
- darwin_locale = NULL;
- return NULL;
+ locale_language = CFLocaleGetValue (locale, kCFLocaleLanguageCode);
+ if (locale_language != NULL && CFStringGetBytes(locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len = bytes_converted + 1;
+
+ locale_country = CFLocaleGetValue (locale, kCFLocaleCountryCode);
+ if (locale_country != NULL && CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+
+ locale_script = CFLocaleGetValue (locale, kCFLocaleScriptCode);
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+ }
+
+ darwin_locale = (char *) malloc (len + 1);
+ CFStringGetBytes (locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) darwin_locale, len, &bytes_converted);
+
+ darwin_locale[bytes_converted] = '-';
+ bytes_written = bytes_converted + 1;
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted) > 0) {
+ darwin_locale[bytes_written + bytes_converted] = '-';
+ bytes_written += bytes_converted + 1;
+ }
+
+ CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted);
+ darwin_locale[bytes_written + bytes_converted] = NULL;
}
+ }
+
+ if (darwin_locale == NULL) {
+ locale_cfstr = CFLocaleGetIdentifier (locale);
+
+ if (locale_cfstr) {
+ len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
+ darwin_locale = (char *) malloc (len);
+ if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
+ free (darwin_locale);
+ CFRelease (locale);
+ darwin_locale = NULL;
+ return NULL;
+ }
- for (i = 0; i < strlen (darwin_locale); i++)
- if (darwin_locale [i] == '_')
- darwin_locale [i] = '-';
+ for (i = 0; i < strlen (darwin_locale); i++)
+ if (darwin_locale [i] == '_')
+ darwin_locale [i] = '-';
+ }
}
CFRelease (locale);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.