glibc 2.30: Nowości w obsłudze języków

glibc 2.30: Nowości w obsłudze języków

Wersja 2.30 biblioteki glibc została wydana – zgodnie z planem – 1 sierpnia 2019 roku. Wielkich zmian w obsłudze danych lokalizacyjnych nie ma, większość z nich związana jest z obsługą kalendarzy, ale nie tylko. Przyjrzyjmy się szczegółom, a przy okazji spójrzmy też na wersję 2.29.

Transliteracja cyrylicy

W pseudojęzyku C (wbudowanym na stałe, używanym, jeśli użytkownik wybierze nieprawidłowy język, albo nie wybierze żadnego) została dodana możliwość transliteracji cyrylicy na alfabet łaciński zgodnie  normą GOST 7.79-2000 System B. Wynikowy tekst korzysta wyłącznie ze znaków ASCII. Oto jak można z niej skorzystać:

$ echo "Спутник" | LC_CTYPE=C iconv -f UTF-8 -t ASCII//TRANSLIT
Sputnik

Podobna możliwość istniała już wcześniej w innych językach, np. serbskim i ukraińskim, jednak zawsze implementacja była niedoskonała i niekompletna. Nowo dodana funkcjonalność działa tylko, jeśli aktualny język jest ustawiony na C. Łatkę dostarczył Egor Kobylkin – dziękujemy.

Dlaczego akurat ten standard transliteracji i dlaczego nie zaimplementowano dla innych języków? Wypadałoby dodać co najmniej wsparcie dla standardu ISO 9 w języku rosyjskim. Prace trwają, ale natrafiliśmy na liczne trudności. Głównym problemem jest to, że transliteracja niektórych liter może zależeć od kontekstu (czyli w sąsiedztwie jakich liter znajdują się one), podczas gdy cały algorytm transliteracji w glibc jest bezkontekstowy, to znaczy tłumaczy każdą literę oddzielnie, nie biorąc w ogóle pod uwagę jej sąsiedztwa.

Wsparcie dla Unicode 12.1

Dodanie nowych znaków do standardu Unicode oznacza, że są one poprawnie klasyfikowane jako litery, cyfry itp., a także sortowane i czasami transliterowane. W wersji 12.0 Unicode, opublikowanej 5 marca 2019 r., dodano całe pismo Nyiakeng Puachue Hmong, całe pismo Wancho (opracowane w latach 2001-12), kilkadziesiąt dodatkowych znaków dla pisma tamilskiego, kilkanaście liter alfabetu laotańskiego, kilkanaście nowych znaków dla alfabetu Pollarda (Miao), łacińskie samogłoski ze zwarciem krtaniowym, starożytne pismo Elymais, starożytne pismo Nandinagari, kilka hieroglifów staroegipskich, cyfry starotureckie (Ottoman Siyaq). Dodano też kilkadziesiąt nowych emotek, w tym symbole szachowe. Aktualizacją zajął się Mike Fabian, dzięki niemu glibc zaczął wspierać nowy standard już 3 dni po jego opublikowaniu.

Ale właściwie dlaczego w tytule jest 12.1, a nie 12.0? Wersja 12.1 specyfikacji została opublikowana 7 maja 2019 r. i zawiera tylko jedną zmianę w stosunku do 12.0: został dodany znak oznaczający nową erę Reiwa w kalendarzu japońskim. Temu tematowi został poświęcony oddzielny artykuł. To ważna zmiana dla użytkowników japońskich, dlatego została opublikowana tak szybko. Jak poprzednio, zmiany w glibc wprowadził Mike Fabian.

Kalendarze japońskie, chińskie…

Oczywiście, nowa era w kalendarzu japońskim jest obsługiwana już od początku kwietnia 2019 r., jednak 2.30 jest pierwszą wersją glibc, która obsługuje tę zmianę od początku, od pierwszego dnia wydania. Wsparcie dla nowej ery japońskiej zostało przeniesione także do starszych wersji glibc, jednak tam funkcjonuje jako poprawka: dystrybucje muszą pobrać łatkę i samodzielnie opublikować aktualizację.

Przy tej okazji warto wspomnieć, że w wersji 2.29 uporządkowano wyświetlanie dat w kalendarzu japońskim i innych kalendarzach tradycyjnych: numer roku generowany przez format "%Ey" funkcji strftime ma teraz domyślnie dwie cyfry. Jeśli chcemy, żeby lata o numerach od 1 do 9 były generowane bez zera, trzeba jawnie dodać do formatu flagę '-'. Ponadto umożliwiono dodawanie flag takich, jak '_' i '-' do formatu "%EY", dzięki czemu można decydować, czy numer w pełnej nazwie roku (która zawiera też nazwę ery) jest poprzedzony zerem, spacją, czy niczym.

Poprawiono wyświetlanie pierwszego roku ery Taisho (od 30.07.1912 w kalendarzu gregoriańskim): do tej pory był wyświetlany jako rok 2.

Niewiele języków w glibc wspiera tradycyjne kalendarze. Od wersji 2.30 dodano obsługę tradycyjnego kalendarza chińskiego (Minguo) w językach używanych na Tajwanie.

…i inne

Poprawiono błędy w pisowni nazw miesięcy i dni tygodnia w językach: tatarskim, afarśląskim. W wersji 2.29 podobne poprawki wprowadzono do języka grenlandzkiego (dni tygodnia, miesiące, formaty dat).

Skoro mowa o języku śląskim, wprowadzono poprawną obsługę formatowania dat zgodnie z zasadami gramatyki (miesiąc w dopełniaczu, podobnie jak w polskim). Okazało się jednak, że CLDR nie wspiera języka śląskiego, dlatego zgłoszono prośbę o jego dodanie. Tym zadaniem zajął się śląski językoznawca Grzegorz Kulik. Dzięki temu możemy się spodziewać, że język śląski będzie wkrótce poprawnie obsługiwany również przez inne systemy operacyjne.

Poprawiono pierwszy dzień tygodnia w ustawieniach irlandzkich (język angielski i irlandzki). Od teraz pierwszym dniem tygodnia jest poniedziałek.

Już w poprzedniej wersji 2.29 poprawiono domyślne formaty wyświetlania daty i czasu w 80 różnych językach i wariantach. Najczęściej chodziło o poprawny wybór zegara 12- albo 24-godzinnego. Zgodnie z CLDR zegar 12-godzinny jest używany w większości krajów północnej Afryki, Indiach i Hong Kongu, natomiast Maroko, Malta, Kenia i Sri Lanka od teraz używają zegara 24-godzinnego.

Co ciekawe, wiele języków nie ma zdefiniowanego pola date_fmt, które jest domyślnie używane przez polecenie date do wyświetlenia bieżącego czasu, wskutek czego używają one domyślnego formatu dla pseudojęzyka C. Kilka języków (w tym angielski w USA) dostało poprawny format, jednak pozostałe nadal czekają.

Błędy zaokrągleń w danych lokalizacyjnych

Na koniec warto wspomnieć o jednej ciekawostce. Podczas generowania binarnych baz danych lokalizacyjnych okazało się, że bazy wygenerowane dla różnych, ale kompatybilnych architektur (np. i686 i x86_64) różnią się, chociaż byłoby lepiej, gdyby się nie różniły, bo wtedy pliki binarne byłyby między nimi wymienne. Przyczyną było użycie mnożenia przez 1,4 w algorytmie mieszającym. Ta liczba, choć wygląda całkiem niepozornie, jest w systemie binarnym ułamkiem okresowym nieskończonym i dlatego różne architektury procesorów stosują różne jej zaokrąglenia. Poprawkę w glibc, a następnie w Fedorze wprowadził DJ Delorie – dziękujemy.