123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
|
/*******************************************************************************
copyright: Copyright (c) 2005 John Chapman. All rights reserved
license: BSD style: $(LICENSE)
version: Initial release: 2005
author: John Chapman
******************************************************************************/
module tango.text.locale.Posix;
version (Posix)
{
alias tango.text.locale.Posix nativeMethods;
private import tango.core.Exception;
private import tango.text.locale.Data;
private import tango.stdc.ctype;
private import tango.stdc.posix.stdlib;
private import tango.stdc.string;
private import tango.stdc.stringz;
private import tango.stdc.locale;
/*private extern(C) char* setlocale(int type, char* locale);
private extern(C) void putenv(char*);
private enum {LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, LC_ALL, LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION};*/
int getUserCulture() {
char* env = getenv("LC_ALL");
if (!env || *env == '\0') {
env = getenv("LANG");
}
// getenv returns a string of the form <language>_<region>.
// Therefore we need to replace underscores with hyphens.
const(char)[] s;
if (env){
char[] s2 = fromStringz(env).dup;
foreach (ref c; s2)
if (c == '.')
break;
else
if (c == '_')
c = '-';
s=s2;
} else {
s="en-US";
}
foreach (entry; CultureData.cultureDataTable) {
// todo: there is also a local compareString defined. Is it correct that here
// we use tango.text.locale.Data, which matches the signature?
if (tango.text.locale.Data.compareString(entry.name, s) == 0)
return entry.lcid;
}
foreach (entry; CultureData.cultureDataTable) {
// todo: there is also a local compareString defined. Is it correct that here
// we use tango.text.locale.Data, which matches the signature?
if (tango.text.locale.Data.compareString(entry.name, "en-US") == 0)
return entry.lcid;
}
return 0;
}
import tango.io.Stdout;
import tango.stdc.stdio;
void setUserCulture(int lcid) {
char[] name;
try {
name = CultureData.getDataFromCultureID(lcid).name ~ ".utf-8";
}
catch(Exception e) {
return;
}
for(int i = 0; i < name.length; i++) {
if(name[i] == '.') break;
if(name[i] == '-') name[i] = '_';
}
putenv(("LANG=" ~ name).ptr);
setlocale(LC_CTYPE, name.ptr);
setlocale(LC_NUMERIC, name.ptr);
setlocale(LC_TIME, name.ptr);
setlocale(LC_COLLATE, name.ptr);
setlocale(LC_MONETARY, name.ptr);
version (GNU) {} else {
/* setlocale(LC_MESSAGES, name.ptr); */
}
setlocale(LC_PAPER, name.ptr);
setlocale(LC_NAME, name.ptr);
setlocale(LC_ADDRESS, name.ptr);
setlocale(LC_TELEPHONE, name.ptr);
setlocale(LC_MEASUREMENT, name.ptr);
setlocale(LC_IDENTIFICATION, name.ptr);
}
int compareString(int lcid, const(char)[] stringA, size_t offsetA, size_t lengthA, const(char)[] stringB, size_t offsetB, size_t lengthB, bool ignoreCase) {
void strToLower(char[] string) {
for(int i = 0; i < string.length; i++) {
string[i] = cast(char)(tolower(cast(int)string[i]));
}
}
char* tempCol = setlocale(LC_COLLATE, null), tempCType = setlocale(LC_CTYPE, null);
const(char)[] locale;
try {
locale = CultureData.getDataFromCultureID(lcid).name ~ ".utf-8";
}
catch(Exception e) {
return 0;
}
setlocale(LC_COLLATE, locale.ptr);
setlocale(LC_CTYPE, locale.ptr);
char[] s1 = stringA[offsetA..offsetA+lengthA] ~ "\0",
s2 = stringB[offsetB..offsetB+lengthB] ~ "\0";
if(ignoreCase) {
strToLower(s1);
strToLower(s2);
}
int ret = strcoll(s1.ptr, s2.ptr);
setlocale(LC_COLLATE, tempCol);
setlocale(LC_CTYPE, tempCType);
return ret;
}
debug(UnitTest)
{
unittest
{
int c = getUserCulture();
assert(compareString(c, "Alphabet", 0, 8, "Alphabet", 0, 8, false) == 0);
assert(compareString(c, "Alphabet", 0, 8, "alphabet", 0, 8, true) == 0);
assert(compareString(c, "Alphabet", 0, 8, "alphabet", 0, 8, false) != 0);
assert(compareString(c, "lphabet", 0, 7, "alphabet", 0, 8, true) != 0);
assert(compareString(c, "Alphabet", 0, 8, "lphabet", 0, 7, true) != 0);
assert(compareString(c, "Alphabet", 0, 7, "ZAlphabet", 1, 7, false) == 0);
}
}
}
|