[ Pobierz całość w formacie PDF ]
.Niestety, nie uda siê to, jeœliu¿ytkownik za¿¹da danych wejœciowych i wyjœciowych (czyli plików i gniazdsieciowych) z kodowaniem w takiej postaci, której program nie mo¿e kontrolowaæ.Ostatecznie, poniewa¿ sk³adowa wystêpuj¹ca za „@” w standardowej nazwie formatuumiejscawiaj¹cego nie zale¿y od aplikacji, program prawdopodobnie nie by³by wstanie okreœliæ tego, co jest poprawne.Administratorzy systemów mog¹ tu pomóc, tworz¹c plik locale.alias z ³atwymi dozapamiêtania nazwami ustawieñ umiejscawiaj¹cych, czêsto stosowanych w danymsystemie./*Uwaga dla t³umaczy: ten komunikat powinien byæ przet³umaczony na"Jeœli nie oczekiwaliœcie tego jêzyka, nale¿y sprawdziæ zmienne LANGUAGE,LANG, LC_MESSAGES oraz LC_ALL.Jeœli s¹ one ustawione poprawnie, tonie ma katalogu komunikatów dla waszego jêzyka."*/puts (_("I hope you're happy with the default `POSIX' locale, because\nthat's what you've got! No message catalog found for you."));puts (_("Succesfully initialized I18N."));Teraz sprawdzamy argumenty i wywo³ujemy potrzebne funkcje:if (argc != 2 || argv[1][1] != '\0'){usage (argv[0]);exit (EXIT_FAILURE);}switch (argv[1][0]) {case '1':do_date ();break;case '2':do_hello ();break;default:usage (argv[0]);exit (EXIT_FAILURE);}putchar('\n');exit(EXIT_SUCCESS);}Ni¿ej podano zlokalizowane funkcje dla wyœwietlania daty i czasu.Specyfikatorykonwersji %c i %Z oznaczaj¹ wymagane formaty dla czasu i daty, zgodnie zumiejscowieniem:#define SIZE 256void do_date (){char fate[SIZE];time_t now;struct tm *tmnow;time (&now);tmnow = localtime(&now);/* strftime(3) ma chyba b³¹d w GNU libc 2.1.3; czas jest poprawnieformatowany dla domyœlnej poprawki czasu lokalnego, leczustawienie TZ lub LANG daje GMT.Podrêcznik informuje, ¿e strftimepowinno automatycznie obs³ugiwaæ poprawkê.*/if (strftime (date, SIZE, %c %Z, tmnow))printf (_("The time now is %s.\n"), date);else/*`do_date' jest identyfikatorem programu i nie mo¿e byæ t³umaczony.Oczywiœcie, specyfikator formatu nie mo¿e byæ "t³umaczony"!*/printf ("do_date: %s\n",_("one of the dates formatted had zero length."));}Teraz funkcja wyœwietlaj¹ca „hello”:void do_hello (){char buffer[SIZE];regtext_t yre, nre;/* prep the regexp */if (regcomp (&yre, nl_langinfo(YESEXPR), REG_NOSUB)|| regcomp (&nre, nl_langinfo(NOEXPR), REG_NOSUB)){fprintf (stderr, "do_hello: %s\n", __("regex compilation failed\n"));exit (EXIT_FAILURE);}while (1){/*Znak zachêty i odczyt odpowiedzi u¿ytkownikaCa³kiem niepotrzebne, faktycznie, poniewa¿ yesstr i nostr s¹przestarza³e i obs³uguje je zaledwie kilka umiejscowieñ.S¹ toar_SA, cs_CZ, sk_SK, th_TH i tr_TR oraz tak¿e POSIX (lecznie w plikach Ÿród³owych!) w GNU libc 2.1.3.*/#ifdef USE_YESNO_STRprintf (_("Would you like to see \"hello\" in some language[%s/%s]? "), nl_langinfo(YESSTR), nl_langinfo(NOSTR));#elseprintf (_("Would you like to see \"hello\" in some language[yes/no]? "));#endifscanf ("%255s", buffer);/* OdpowiedŸ parsera */if (!regexec (&nre, buffer, 0, 0, 0)){/* Dopasowano negatywn¹ odpowiedŸ */printf (_("Later, bye!\n"));exit (EXIT_SUCCESS);}else if (regexec (&yre, buffer, 0, 0, 0)){/* Pozytywna odpowiedŸ nie pasowa³a */printf (_("Answer the question!\n"));continue; /* nadmiarowe */}else{/* Pozytywna odpowiedŸ pasuje */break;}}Program do_hello zawiera dalej banalny przyk³ad zmiany umiejscowienia.Zmianata nie oznacza jednak, ¿e wszystko mo¿na bêdzie zrobiæ za pomoc¹ gettext(3).Wtym przyk³adzie faktycznie nic nie mo¿na zrobiæ./* Znak zachêty oraz odczyt danych wprowadzanych przez u¿ytkownika */printf (_("Enter a POSIX-style locale: "));scanf ("255s", buffer);/* Ustawianie umiejscowienia (locale) */if (setlocale (LC_ALL, buffer)){printf (_("\"Hello\" in English is %s.\n"), "\"hello\"");Pokazano tu, w jaki sposób zmieniæ „w locie” katalog komunikatów gettext.Manipulacja _nl_msg_cat_cntr jest dobrym punktem zaczepienia z powoduoptymalizacji dokonanej w gettext(3) i dgettext(3).Zauwa¿my, ¿e zmieniana jesttu tylko wartoœæ zmiennej œrodowiskowej.Oczywiœcie, jeœli funkcja gettext(3)sprawdza³aby œrodowisko przy ka¿dym wywo³aniu, by³oby to kosztowne.Sprawdzanieto jest zoptymalizowane, chyba ¿e licznik katalogu zostanie zmieniony.Funkcjadcgettext(3) sprawdza œrodowisko przy ka¿dym wywo³aniu.Jest to wykorzystane dooptymalizacji wywo³añ gettext i dgettext.Sprawdza siê wiêc zmienneœrodowiskowe LANGUAGE, LC_ALL, LC_MESSAGES oraz LANG dok³adnie w tej kolejnoœcii wybiera pierwsz¹ pasuj¹c¹.Ta w³aœciwoœæ rzadko kiedy siê przydaje:/* Zmiana jêzyka.*/setenv ("Language", buffer, 1);/* Udostêpnienie zmiany.*/{extern int _nl_msg_cat_cntr;++_nl_msg_cat_cntr;}}elseprintf (_("%s is not a real locale! Not one I know, anyway.\n"),buffer);/* Oczyszczanie - tutaj oczywiœcie nadmiarowe.ale taka jest kolejnoœæ rzeczy */setlocale (LC_ALL, default_locale);}Ta definicja i nastêpuj¹ca funkcja pokazuj¹ sposób t³umaczenia danychstatycznych.Zwróæmy uwagê na wywo³anie gettext (menu[i-1].tag) w ostatniejinstrukcji printf./*Czysty przymus.*//* OPTIONS musz¹ byæ
[ Pobierz całość w formacie PDF ]
Darmowy hosting zapewnia PRV.PL