Cześć!
Środowisko VS 2008. Nie mogę dojść do ładu z gettextem. Na potrzeby znalezienia problemu zrobiłem nową "Windows Form Application". W konstruktorze formularza dodałem:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
#undef GetCurrentDirectory // winbase.h
char* loc = setlocale(LC_ALL, "");
if (loc != NULL)
{
char *locale_dir = (char*)(void*)Marshal::StringToHGlobalAnsi(Directory::GetCurrentDirectory() + "\\debug\\locale");
if (bindtextdomain(PACKAGE_NAME, locale_dir) != NULL)
{
if (textdomain(PACKAGE_NAME) != NULL)
{
//if (setlocale( LC_ALL, "Polish_Poland" ) == NULL)
//if (setlocale( LC_ALL, "English_United States" ) == NULL)
if (setlocale( LC_ALL, "German_Germany" ) == NULL)
MessageBox::Show("No translation file", "Error!", MessageBoxButtons::OK, MessageBoxIcon::Error);
}
}
}
setlocale(LC_NUMERIC, "C");
this->Text = _d("(Title)");
}
Generalnie standardowy init ustawień lokalnych. Wszystkie języki są odczytywane, setlocale nigdy nie zwraca NULL. Problem jest w tym, że funkcja gettext nie chce "słuchać" mojego ustawienia setlocale. Jedyną metodą żeby zmienić ustawienia lokalizacji dla gettext-a jest zmiania języka w ustawieniach systemu. Jak tam zmieniam na DE czy EN to gra, ale jak zmieniam za pomocą setlocale to i tak zawsze przetłumaczy zgodnie z ustawieniami w systemie.
Zrobiłem do tego dodatkowy test. Analogicznie jak tutaj:
http://msdn.microsoft.com/en-us/library/vstudio/x99tb11d.aspx
// Retieve the time
_time64(<ime);
_gmtime64_s(&thetime, <ime);
Po zmianie locale na inne niż ma system użyłem funkcji standardowych do odczytu daty. I tutaj locale działają tak jak ustawię. Gettext tłumaczy mi tak jak mam system czyli teraz polski, a datę funkcje standardowe mogą wyświetlić np z niemieckimi locale.
Na początku mam jeszcze takie makra:
#define _(text) gettext(text)
#define _d(text) gcnew System::String(gettext(text))
#define PACKAGE_NAME "lang" // nazwa plikow *.mo
Wiecie może dlaczego funkcja gettext nie chce słuchać moich ustawień locale?