Narzędzia internacjonalizacji programów



Podobne dokumenty
METODY I NARZĘDZIA WSPOMAGAJĄCE TWORZENIE WIELOJĘZYCZNYCH INTERFEJSÓW W APLIKACJACH INTERNETOWYCH. Anna Kempa, Tomasz Staś

Wstęp. #define include include include include include include

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

1. Wprowadzanie danych z klawiatury funkcja scanf

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Operacje na łańcuchach znaków

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Operacje wejścia/wyjścia odsłona pierwsza

Internacjonalizacja i lokalizowanie aplikacji internetowych wg

Internacjonalizacja i lokalizowanie aplikacji internetowych wg

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

2 Przygotował: mgr inż. Maciej Lasota

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie obiektowe

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Zmienne, stałe i operatory

Podstawy programowania C. dr. Krystyna Łapin

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Pliki. Informacje ogólne. Obsługa plików w języku C

WellCommerce Poradnik: Dodawanie języka i waluty. autor: Adrian Potępa (biuro@eclairsoaware.pl)

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wstęp do Programowania, laboratorium 02

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Języki i metodyka programowania. Wprowadzenie do języka C

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Pliki. Informacje ogólne. Obsługa plików w języku C

1. Wprowadzenie do C/C++

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Zasady programowania Dokumentacja

Część 4 życie programu

Argumenty wywołania programu, operacje na plikach

Inicjacja tablicy jednowymiarowej

I - Microsoft Visual Studio C++

Podstawy programowania skrót z wykładów:

Podstawy programowania w języku C++

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Lab 9 Podstawy Programowania

lekcja 8a Gry komputerowe MasterMind

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

IPC: Kolejki komunikatów

Spis treści. 1 Kraj/region i język Ustawienia regionalne Liczby Waluta Czas i data Inne...

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Powłoka I. Popularne implementacje. W stylu sh (powłoki zdefiniowanej w POSIX) W stylu csh. bash (najpopularniejsza) zsh ksh mksh.

1. Wprowadzenie do C/C++

Język angielski ma w dzisiejszym świecie

Podstawy Programowania.

Język C zajęcia nr 5

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie w języku Python. Grażyna Koba

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Liczby pseudolosowe. #include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", RAND_MAX); return 0; }

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie w Ruby

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Podstawy programowania 1

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

I. WSTĘP. Przykład 1. Przykład 2. Programowanie czyli tworzenie programów komputerowych (aplikacji komputerowych)

Języki i metody programowania I

Lokalizacja WiOO krok po kroku

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Podstawy i języki programowania

Utworzenie pliku. Dowiesz się:

Historia aktualizacji

Programowanie komputerowe. Zajęcia 1

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Operatory zmiany sposobu przypisania standardowych strumieni >,<,>> Jeżeli pierwsze polecenie powiodło się to wykona drugie

Podstawy programowania

Podstawy programowania w języku C i C++

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Administracja i programowanie pod Microsoft SQL Server 2000

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Szablony funkcji i szablony klas

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Kodowanie znaków narodowych

Podstawy programowania w języku C++

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Transkrypt:

Spis treści -1 Pojęcia Mechanizm locale Mechanizm locale a Xlib Kto jeszcze nie śpi? Tłumaczenie komunikatów catgets Pakiet gettext (Nawiasem mówiąc) Nowe funkcje glibc 2.2 Problemy

Marcin Woliński Narzędzia internacjonalizacji programów (GNU gettext/gnu libc 2.2)

Pojęcia 1 internationalization (i18n) operacja zastąpienia w programie rozwiązań specyficznych (najczęściej) dla angielskiego rozwiązaniami ogólnymi, przy pomocy których daje się wyrazić konwencje właściwe dla różnych narodowości i języków. (internacjonalizacja?, umiędzynarodowienie?) localization (l10n) przystosowanie programu do konwencji konkretnego języka i narodowości. (lokalizacja?, unarodowienie?)

Mechanizm locale 2 locale [lou ka:l] n. miejsce l. widownia działań l. wypadków.

Mechanizm locale 3 Kategorie locale: LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME porządek sortowania klasyfikacja znaków (np. co jest literą, odpowiedniość małych i wielkich liter) język komunikatów sposób wypisywania kwot pieniężnych, symbol waluty sposób wypisywania liczb (np. separator dziesiętny) sposób wypisywania daty i czasu

Mechanizm locale 4 Wyboru locale dokonuje się przy pomocy zmiennych środowiskowych: LANG lub dla poszczególnych kategorii: LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME lub globalne przebicie: LC_ALL

Mechanizm locale 5 Na przykład: export LANG=pl_PL.ISO-8859-2 export LANG=polish Powyższe są równoważne dzięki aliasom zdefiniowanym w pliku /usr/share/locale/locale.alias

Mechanizm locale 6 Ustawienie zmiennych środowiskowych nie powoduje automatycznej zmiany zachowania procedur biblioteki C. W związku z tym nie każdy program jest wrażliwy na locale. #include <locale.h> main() { setlocale(lc_all,"");... }

Mechanizm locale 7 char *setlocale(int CATEGORY, char *LOCALE) Pierwszy argument setlocale() może być jedną ze stałych określających kategorie lub stałą LC_ALL. Drugi argument określa lokalizację, jaka ma być użyta; pusty napis powoduje pobranie wartości ze środowiska procesu.

Mechanizm locale 8 Większość kategorii locale wpływa jedynie na zachowanie specjalnych, wrażliwych na locale, odmian funkcyj. Na przykład do porównywania napisów przy sortowaniu zamiast strcmp() należy stosować strcoll().

Mechanizm locale a Xlib 9 Fundamentalna różnica między programami konsolowymi a X-owymi : Zwykle nieumiędzynarodowiony program konsolowy będzie w stanie czytać i wyświetlać polskie znaki, przetwarzać je będzie kulawo. Nieumiędzynarodowiony program dla X Window nie jest w stanie odebrać polskich znaków z klawiatury.

Mechanizm locale a Xlib 10 Zdefiniowana w Xlib funkcja XLookupString, używana przez większość programów do dekodowania znaków przychodzących z klawiatury, jest wrażliwa na locale. Funkcja ta przynależy do kategorii LC_CTYPE. Każdy program otwierający choć jedno okienko musi zawierać wywołanie setlocale(), żeby być używalny dla polskiego użytkownika.

Kto jeszcze nie śpi? 11 $ bash $ locale LANG=POSIX LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_ALL= $ export LANG=pl_PL $ printf "%f\n" 1.0???

Kto jeszcze nie śpi? 12 $ bash $ locale LANG=POSIX LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_ALL= $ export LANG=pl_PL $ printf "%f\n" 1.0 1.000000

Kto jeszcze nie śpi? 13 $ bash $ locale LANG=POSIX LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_ALL= $ export LANG=pl_PL $ bash $ printf "%f\n" 1.0???

Kto jeszcze nie śpi? 14 $ bash $ locale LANG=POSIX LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_ALL= $ export LANG=pl_PL $ bash $ printf "%f\n" 1.0 1,000000

Tłumaczenie komunikatów 15 Zajmiemy się bliżej kategorią locale LC_MESSAGES. Dotyczy ona języka, w jakim mają być wyświetlane komunikaty programów.

Tłumaczenie komunikatów 16 Życzymy sobie móc dodać nowe tłumaczenie bez zmian w programie (bez rekompilacji). Dlatego zbiory komunikatów trzymane w oddzielnych plikach dla poszczególnych języków.

Tłumaczenie komunikatów 17 Procedura pobierająca tłumaczenia musi: odnaleźć i załadować plik z tłumaczeniami, na podstawie ustalonego identyfikatora odnaleźć tłumaczenie danego komunikatu.

Tłumaczenie komunikatów 18 W bibliotece GNU C dwa zestawy funkcji: catgets i gettext. Żaden nie jest zdefiniowany w standardzie POSIX. Główną różnicą jest sposób identyfikacji tłumaczonych komunikatów. W zasadzie nie wiadomo, który mechanizm wygra.

catgets 19 W wersji catgets z każdym komunikatem musi być związany jednoznaczny identyfikator (numeryczny). Zadanie wyprodukowania jednoznacznych identyfikatorów spoczywa na programiście.

Pakiet gettext 20 W pakiecie gettext identyfikatorem komunikatu jest tekst tego komunikatu.

Pakiet gettext 21 Składniki pakietu: funkcja gettext() i pokrewne w bibliotece C; biblioteka libintl.a dla systemów, w których brak powyższych funkcji w bibliotece języka C; programy xgettext, msgfmt, msgunfmt,... ; pliki z tłumaczeniami.

Pakiet gettext 22 Dodatkowa zmienna sterująca wyborem języka komunikatów: LANGUAGE=pl:cs:de:en Jej ustawienie przebija normalne ustawienia locale dla kategorii LC_MESSAGES. Wartością może być lista języków.

Pakiet gettext 23 #include <libintl.h> main () { textdomain ("hello"); puts (gettext ("Hello, world!")); }

Pakiet gettext 24 char *textdomain(const char *DOMAINNAME) Ustanawia domyślną dziedzinę, z której należy pobierać przetłumaczone komunikaty. W istocie dziedzina jest nazwą pliku z komunikatami w katalogu locale/<język>/lc_messages/. Jeśli DOMAINNAME==NULL, funkcja zwraca bieżącą wartość domyślnej dziedziny (nie wprowadza zmian).

Pakiet gettext 25 char *gettext(const char *MSGID) char *dgettext(const char *DOMAINNAME, const char *MSGID) char *dcgettext(const char *DOMAINNAME, const char *MSGID, int CATEGORY) DOMAINNAME==NULL znaczy użyj domyślnej

Pakiet gettext 26 char *bindtextdomain(const char *DOMAINNAME, const char *DIRNAME) Określa korzeń struktury katalogów, w której należy poszukiwać plików z komunikatami dla danej dziedziny.

Pakiet gettext 27 xgettext msgfmt msgunfmt msgmerge Narzędzia pakietu gettext: tworzy szablon tłumaczeń (plik.po) na podstawie źródeł programu zamienia plik tłumaczeń na binarną postać.mo ładowaną przez gettext() dokonuje operacji odwrotnej łączy dwa pliki.po (aby wykorzystać tłumaczenia wykonane dla starszej wersji programu)

Pakiet gettext 28 Wynik uruchomienia programu xgettext na pliku hello.c (fragment): #: hello.c:4 msgid "Hello world!\n" msgstr ""

Pakiet gettext 29 Po interwencji tłumacza (plik pl.po): #: hello.c:4 msgid "Hello world!\n" msgstr "Witaj świecie!\n"

(Nawiasem mówiąc) 30 http://www.li18nux.org /root/li18nux2000/li18nux-2000.pdf LI18NUX 2000 Globalization Specification Version 1.0 Linux Internationalization Initiative (Li18nux) Copyright 2000 The Free Standards Group.

Nowe funkcje glibc 2.2 31 printf("%d file(s) deleted.\n", delnum);

Nowe funkcje glibc 2.2 32 printf(gettext("%d file(s) deleted.\n"), delnum); msgid "%d file(s) deleted.\n" msgstr "Skasowano %d plik(ów).\n" Skasowano 2 plik(ów).

Nowe funkcje glibc 2.2 33 char *ngettext( const char *MSGID1, const char *MSGID2, unsigned long int N) char *dngettext(const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N) char *dcngettext(const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N, int CATEGORY)

Nowe funkcje glibc 2.2 34 W pliku PO: msgid "" msgstr "nplurals=3; plural= n==1? 0 : \ n%10>=2 && n%10<=4 && \ (n%100<10 n%100>=20)? 1 : 2" msgid "%d file deleted.\n" msgstr0 "Skasowano %d plik.\n" msgstr1 "Skasowano %d pliki.\n" msgstr2 "Skasowano %d plików.\n"

Nowe funkcje glibc 2.2 35 węgierski, japoński, turecki: nplurals=1; plural=0 angielski, niemiecki,... : nplurals=2; plural=n!=1 francuski: nplurals=2; plural=n>1 rosyjski: nplurals=3; plural=n%10==1? 0 : n%10>=2 && n%10<=4 && (n%100<10 n%100>=20)? 1 : 2 polski: nplurals=3; plural=n==1? 0 : n%10>=2 && n%10<=4 && (n%100<10 n%100>=20)? 1 : 2 słoweński: nplurals=4; plural=n==1? 0 : n%10==2? 1 : n%10==3 n%10==4? 2 : 3

Nowe funkcje glibc 2.2 36 printf(ngettext("%d file deleted.\n", "%d files deleted.\n", delnum), delnum); msgid "%d file deleted.\n" msgstr0 "Skasowano %d plik.\n" msgstr1 "Skasowano %d pliki.\n" msgstr2 "Skasowano %d plików.\n" Skasowano 2 pliki.

Nowe funkcje glibc 2.2 37 printf("you have %d %s and %d %s in your pocket.\n", appnum, ngettext("apple", "apples", appnum), sheepnum, ngettext("sheep", "sheep", sheepnum) ); msgid "You have %d %s and %d %s in your pocket.\n" msgstr "Masz w kieszeni %d %s i %d %s.\n" msgid "sheep" msgstr0 "owcę" msgstr1 "owce" msgstr2 "owiec"