107.3 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
107 Адміністративні завдання |
Тема: |
107.3 Локалізація та інтернаціоналізація |
Урок: |
1 з 1 |
Вступ
Усі основні дистрибутиви Linux можуть бути налаштовані на використання користувацьких налаштувань локалізації. Ці налаштування включають визначення, пов’язані з регіоном і мовою, наприклад часовий пояс, мову інтерфейсу, а також кодування символів, і їх можна змінити під час встановлення операційної системи або будь-коли після цього.
Програми покладаються на змінні середовища, файли конфігурації системи та команди, щоб визначити правильний час і мову для використання; тому більшість дистрибутивів Linux мають стандартизований спосіб налаштування часу та параметрів локалізації. Ці налаштування важливі не лише для покращення взаємодії з користувачем, але й для забезпечення правильного розрахунку часу системних подій, важливих, наприклад, для звітування про проблеми, пов’язані з безпекою.
Щоб мати можливість представити будь-який письмовий текст, незалежно від усної мови, сучасні операційні системи потребують еталонного стандарту кодування символів, і системи Linux не є виключенням. Оскільки комп’ютери можуть працювати лише з числами, текстовий символ – це не що інше, як число, пов’язане з графічним символом. Різні комп’ютерні платформи можуть пов’язувати різні числові значення з тим самим символом, тому для їх сумісності необхідний загальний стандарт кодування символів. Текстовий документ, створений в одній системі, можна буде прочитати в іншій системі, лише якщо обидва домовляться про формат кодування та про те, яке число пов’язане з яким символом, або принаймні якщо вони знають, як проводити конвертацію між двома стандартами.
Гетерогенний характер налаштувань локалізації в системах на базі Linux призводить до тонких відмінностей між дистрибутивами. Незважаючи на ці відмінності, усі дистрибутиви мають однакові основні інструменти та концепції для налаштування аспектів інтернаціоналізації системи.
Часові пояси
Часові пояси — це приблизно пропорційні дискретні смуги земної поверхні, що охоплюють еквівалент однієї години, тобто регіони світу, які мають однакову годину доби в будь-який момент часу. Оскільки немає жодної довготи, яку можна вважати початком дня для всього світу, часові пояси відносяться до початкового меридіана, де кут довготи Землі визначається як 0. Час на початковому меридіані називається Всесвітній координований час (Coordinated Universal Time), за домовленістю скорочено до UTC. З практичних причин часові пояси не відповідають точній поздовжній відстані від точки відліку (нульового меридіана). Натомість часові пояси штучно пристосовуються до кордонів країн або інших значущих поділів.
Політичні поділи настільки актуальні, що часові пояси називаються на честь якогось головного географічного агента в цій конкретній території, зазвичай на основі назви великої країни чи міста в зоні. Тим не менш, часові пояси поділяються відповідно до їхнього часового зміщення відносно UTC, і це зміщення також може використовуватися для позначення зони, про яку йде мова. Часовий пояс GMT-5, наприклад, вказує на регіон, для якого час UTC на п’ять годин випереджає, тобто цей регіон відстає від UTC на 5 годин. Так само часовий пояс GMT+3 вказує на регіон, для якого час UTC відстає на три години. Термін GMT — від Greenwich Mean Time (час за Грінвичем) — використовується як синонім UTC у назвах зон.
До під’єднаного комп’ютера можна отримати доступ із різних куточків світу, тому рекомендовано встановити апаратний годинник на UTC (часовий пояс GMT+0) і залишити вибір часового поясу для кожного окремого випадку. Хмарні служби, наприклад, зазвичай налаштовані на використання UTC, оскільки це може допомогти зменшити випадкові невідповідності між місцевим часом і часом на клієнтах або на інших серверах. Навпаки, користувачі, які відкривають віддалений сеанс на сервері, можуть захотіти використовувати свій місцевий часовий пояс. Таким чином, операційна система повинна встановити правильний часовий пояс відповідно до кожного випадку.
Окрім поточної дати та часу, команда date
також виведе поточний налаштований часовий пояс:
$ date Mon Oct 21 10:45:21 -03 2019
Зсув відносно UTC задається значенням -03
. Це означає, що відображений час на три години менший за UTC. Таким чином, час UTC на три години вперед, що робить GMT-3 відповідним часовим поясом для даного часу. Команда `timedatectl, яка доступна в дистрибутивах, що використовують systemd, показує більше деталей про системний час і дату:
$ timedatectl Local time: Sat 2019-10-19 17:53:18 -03 Universal time: Sat 2019-10-19 20:53:18 UTC RTC time: Sat 2019-10-19 20:53:18 Time zone: America/Sao_Paulo (-03, -0300) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no
Як видно в рядку Time zone
, також приймаються назви часових поясів на основі місцевостей, наприклад, America/Sao_Paulo
. Часовий пояс за замовчуванням для системи зберігається у файлі /etc/timezone
, або за повною описовою назвою зони, або за зміщенням. Загальні назви часових поясів, надані зсувом відносно UTC, мають містити Etc
як першу частину назви. Отже, щоб встановити часовий пояс за замовчуванням на GMT+3, назва часового поясу має бути Etc/GMT+3
:
$ cat /etc/timezone Etc/GMT+3
Хоча назви часових поясів, засновані на місцевостях, не вимагають зміщення часу для роботи, їх не так просто вибрати. Одна зона може мати більше однієї назви, що ускладнює її запам’ятовування. Щоб полегшити цю проблему, команда tzselect
пропонує інтерактивний метод, який допоможе користувачеві правильно визначити часовий пояс. Команда tzselect
має бути доступною за замовчуванням у всіх дистрибутивах Linux, оскільки вона надається пакунком, який містить необхідні службові програми, пов’язані з бібліотекою GNU C.
Команда tzselect
буде корисною, наприклад, для користувача, який хоче визначити часовий пояс для “São Paulo City” в “Brazil”. tzselect
починається із запиту макрообласті бажаного розташування:
$ tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent, ocean, "coord", or "TZ". 1) Africa 2) Americas 3) Antarctica 4) Asia 5) Atlantic Ocean 6) Australia 7) Europe 8) Indian Ocean 9) Pacific Ocean 10) coord - I want to use geographical coordinates. 11) TZ - I want to specify the time zone using the Posix TZ format. #? 2
Варіант 2
призначений для місць (Північної та Південної) Америки, не обов’язково в одному часовому поясі. Також можна вказати часовий пояс за допомогою географічних координат або нотації зсуву, також відомої як формат Posix TZ. Наступним кроком буде вибір країни:
Please select a country whose clocks agree with yours. 1) Anguilla 19) Dominican Republic 37) Peru 2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico 3) Argentina 21) El Salvador 39) St Barthelemy 4) Aruba 22) French Guiana 40) St Kitts & Nevis 5) Bahamas 23) Greenland 41) St Lucia 6) Barbados 24) Grenada 42) St Maarten (Dutch) 7) Belize 25) Guadeloupe 43) St Martin (French) 8) Bolivia 26) Guatemala 44) St Pierre & Miquelon 9) Brazil 27) Guyana 45) St Vincent 10) Canada 28) Haiti 46) Suriname 11) Caribbean NL 29) Honduras 47) Trinidad & Tobago 12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is 13) Chile 31) Martinique 49) United States 14) Colombia 32) Mexico 50) Uruguay 15) Costa Rica 33) Montserrat 51) Venezuela 16) Cuba 34) Nicaragua 52) Virgin Islands (UK) 17) Curaçao 35) Panama 53) Virgin Islands (US) 18) Dominica 36) Paraguay #? 9
Територія Бразилії охоплює чотири часові пояси, тому лише інформації про країну недостатньо для встановлення часового поясу. На наступному кроці tzselect
вимагатиме від користувача вказати локальний регіон:
Please select one of the following time zone regions. 1) Atlantic islands 2) Pará (east); Amapá 3) Brazil (northeast: MA, PI, CE, RN, PB) 4) Pernambuco 5) Tocantins 6) Alagoas, Sergipe 7) Bahia 8) Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) 9) Mato Grosso do Sul 10) Mato Grosso 11) Pará (west) 12) Rondônia 13) Roraima 14) Amazonas (east) 15) Amazonas (west) 16) Acre #? 8
Не всі назви населених пунктів доступні, але вибрати найближчий регіон буде достатньо. Надана інформація буде використана tzselect
для відображення відповідного часового поясу:
The following information has been given: Brazil Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) Therefore TZ='America/Sao_Paulo' will be used. Selected time is now: sex out 18 18:47:07 -03 2019. Universal Time is now: sex out 18 21:47:07 UTC 2019. Is the above information OK? 1) Yes 2) No #? 1 You can make this change permanent for yourself by appending the line TZ='America/Sao_Paulo'; export TZ to the file '.profile' in your home directory; then log out and log in again. Here is that TZ value again, this time on standard output so that you can use the /usr/bin/tzselect command in shell scripts: America/Sao_Paulo
Отриману назву часового поясу, America/Sao_Paulo
, також можна використовувати як вміст /etc/timezone
, щоб повідомити часовий пояс за замовчуванням для системи:
$ cat /etc/timezone America/Sao_Paulo
Як зазначено в результатах tzselect
, змінна середовища TZ
визначає часовий пояс для сеансу оболонки, яким би не був часовий пояс системи за замовчуванням. Додавання рядка TZ='America/Sao_Paulo'; export TZ
до файлу ~/.profile
зробить America/Sao_Paulo
часовим поясом для майбутніх сеансів користувача. Змінну TZ
можна також тимчасово змінити під час поточного сеансу, щоб відображати час в іншому часовому поясі:
$ env TZ='Africa/Cairo' date Mon Oct 21 15:45:21 EET 2019
У прикладі команда env
запустить дану команду в новому сеансі суб-оболонки з тими самими змінними середовища поточного сеансу, за винятком змінної TZ
, зміненої аргументом TZ='Africa/Cairo'
.
Літній час
Багато регіонів переходять на літній час для частини року, коли годинники зазвичай переводять на годину. Це може призвести до того, що неправильно налаштована система повідомляє неправильний час у цю пору року.
Файл /etc/localtime
містить дані, які використовуються операційною системою для відповідного налаштування годинника. Стандартні системи Linux мають файли для всіх часових поясів у каталозі /usr/share/zoneinfo/
, тому /etc/localtime
є лише символьним посиланням на фактичний файл даних у цьому каталозі. Файли в /usr/share/zoneinfo/
впорядковано за назвою відповідного часового поясу, тому файл даних для часового поясу America/Sao_Paulo
буде /usr/share/zoneinfo/America/Sao_Paulo
Оскільки визначення переходу на літній час можуть змінюватися, важливо оновлювати файли в /usr/share/zoneinfo/
. Команда оновлення інструменту керування пакунками, що надається дистрибутивом, повинна оновлювати їх щоразу, коли доступна нова версія.
Мова та кодування символів
Системи Linux можуть працювати з великою різноманітністю мов і незахідних кодувань символів, ці визначення відомі як locales. Найпростішою конфігурацією локалі є визначення змінної середовища LANG
, за якою більшість програм оболонки визначають мову для використання.
Вміст змінної LANG
відповідає формату ab_CD
, де ab
— код мови, а CD
— код регіону. Код мови має відповідати стандарту ISO-639, а код регіону – стандарту ISO-3166. Система, налаштована на використання бразильської португальської мови, наприклад, повинна мати змінну LANG
, визначену як pt_BR.UTF-8
:
$ echo $LANG pt_BR.UTF-8
Як видно у прикладі вихідних даних, змінна LANG
також містить кодування символів, призначене для системи. ASCII, скорочення від Американського стандартного коду для обміну інформацією, був першим широко використовуваним стандартом кодування символів для електронних комунікацій. Однак, оскільки ASCII має дуже обмежений діапазон доступних числових значень і він заснований на англійському алфавіті, він не містить символів, які використовуються іншими мовами, або розширеного набору неалфавітних символів. Кодування UTF-8 є стандартом Unicode для звичайних західних символів, а також багатьох інших нетрадиційних символів. Як заявив Unicode Consortium, розробник Unicode Standard, цей стандарт слід прийняти за замовчуванням, щоб забезпечити сумісність між комп’ютерними платформами:
Стандарт Unicode надає унікальний номер кожному символу, незалежно від платформи, пристрою, програми чи мови. Він був прийнятий усіма сучасними постачальниками програмного забезпечення і тепер дозволяє транспортувати дані через багато різних платформ, пристроїв і програм без пошкодження. Підтримка Unicode є основою для представлення мов і символів у всіх основних операційних системах, пошукових системах, браузерах, ноутбуках і смартфонах, а також в Інтернеті та Всесвітній павутині (URL-адреси, HTML, XML, CSS, JSON тощо). (…) стандарт Unicode і доступність інструментів, що його підтримують, є одними з найбільш значущих останніх глобальних тенденцій програмного забезпечення.
What is Unicode?
Деякі системи все ще можуть використовувати стандарти ISO, такі як стандарт ISO-8859-1, для кодування символів, відмінних від ASCII. Однак такі стандарти кодування символів мають вважатись застарілими на користь стандартів кодування Unicode. Тим не менш, усі основні операційні системи, як правило, приймають стандарт Unicode за замовчуванням.
Параметри загальносистемної мови налаштовуються у файлі /etc/locale.conf
. Змінна LANG
та інші змінні, пов’язані з локалізацією, призначаються в цьому файлі як звичайна змінна оболонки, наприклад:
$ cat /etc/locale.conf LANG=pt_BR.UTF-8
Користувачі можуть використовувати спеціальну конфігурацію локалі, перевизначивши змінну середовища LANG
. Це можна зробити лише для поточного сеансу або для майбутніх сеансів, додавши нове визначення до профілю Bash користувача в ~/.bash_profile
або ~/.profile
. Однак, доки користувач не ввійде в систему, незалежні від користувача програми, наприклад, екран входу диспетчера дисплеїв, використовуватимуть системну мову за замовчуванням.
Tip
|
Команда |
Окрім змінної LANG
, інші змінні середовища впливають на певні аспекти локалі, наприклад, який символ валюти використовувати або правильний роздільник тисяч для чисел:
LC_COLLATE
-
Встановлює алфавітний порядок. Однією з його цілей є визначення порядку виведення файлів і каталогів.
LC_CTYPE
-
Встановлює, як система оброблятиме певні набори символів. Вона визначає, наприклад, які символи вважати верхнім або нижнім регістром.
LC_MESSAGES
-
Встановлює мову для відображення програмних повідомлень (переважно програм GNU).
LC_MONETARY
-
Встановлює грошову одиницю та формат валюти.
LC_NUMERIC
-
Встановлює числовий формат для негрошових значень. Її головна мета — визначити роздільники тисяч і десяткових дробів.
LC_TIME
-
Встановлює формат часу та дати.
LC_PAPER
-
Встановлює стандартний розмір паперу.
LC_ALL
-
Перевизначає всі інші змінні, включаючи
LANG
.
Команда locale
покаже всі визначені змінні в поточній конфігурації локалі:
$ locale LANG=pt_BR.UTF-8 LC_CTYPE="pt_BR.UTF-8" LC_NUMERIC=pt_BR.UTF-8 LC_TIME=pt_BR.UTF-8 LC_COLLATE="pt_BR.UTF-8" LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES="pt_BR.UTF-8" LC_PAPER=pt_BR.UTF-8 LC_NAME=pt_BR.UTF-8 LC_ADDRESS=pt_BR.UTF-8 LC_TELEPHONE=pt_BR.UTF-8 LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=pt_BR.UTF-8 LC_ALL=
Єдиною невизначеною змінною є LC_ALL
, яку можна використовувати для тимчасового перевизначення всіх інших налаштувань мови. У наведеному нижче прикладі показано, як команда date
, що виконується в системі, налаштованій на мову pt_BR.UTF-8
, змінюватиме свої вихідні дані відповідно до нової змінної LC_ALL
:
$ date seg out 21 10:45:21 -03 2019 $ env LC_ALL=en_US.UTF-8 date Mon Oct 21 10:45:21 -03 2019
Модифікація змінної LC_ALL
дозволила відображати скорочення дня тижня та назви місяця американською англійською мовою (en_US
). Однак не обов’язково встановлювати однакові локалі для всіх змінних. Можна, наприклад, визначити мову як pt_BR
, а числовий формат (LC_NUMERIC
) встановити відповідно до американського стандарту.
Деякі параметри локалізації змінюють спосіб роботи програм з алфавітним упорядкуванням і форматами чисел. У той час як звичайні програми зазвичай готові правильно вибирати загальну мову для таких ситуацій, сценарії можуть поводитися неочікувано, коли, наприклад, намагаються правильно впорядкувати список елементів в алфавітному порядку. З цієї причини рекомендується встановити змінну середовища LANG
на загальну мову C
, як у LANG=C
, щоб сценарій виробляв однозначні результати, незалежно від визначень локалізації, що використовуються в системі, де він виконується. Локаль C проводить лише просте побайтове порівняння, тому вона також працюватиме краще, ніж інші.
Конвертація кодування
Текст може відображатися з незрозумілими символами, якщо він відображається в системі з конфігурацією кодування символів, відмінною від системи, де було створено текст. Щоб вирішити цю проблему, можна використати команду iconv
шляхом перетворення файлу з оригінального кодування символів на потрібне. Наприклад, щоб конвертувати файл під назвою original.txt
із кодування ISO-8859-1 у файл під назвою converted.txt
за допомогою кодування UTF-8, можна використати таку команду:
$ iconv -f ISO-8859-1 -t UTF-8 original.txt > converted.txt
Опція -f ISO-8859-1
(або --from-code=ISO-8859-1
) встановлює кодування вихідного файлу, а опція -t UTF-8
(або --to- code=UTF-8
) встановлює кодування для конвертованого файлу. Усі кодування, які підтримуються командою iconv
, виводяться за допомогою команди iconv -l
або iconv --list
. Замість використання переспрямування виведення, як у прикладі, також можна використовувати опцію -o converted.txt
або --output converted.txt
.
Вправи до посібника
-
Виходячи з наступного результату команди
date
, який часовий пояс системи в нотації GMT?$ date Mon Oct 21 18:45:21 +05 2019
-
На який файл має вказувати символьне посилання
/etc/localtime
, щоб зробитиEurope/Brussel
місцевим часом системи за замовчуванням? -
Символи в текстових файлах можуть не відтворюватися належним чином у системі з кодуванням символів, відмінним від того, що використовується в текстовому документі. Як
iconv
можна використати для перетворення файлуold.txt
у кодуванні WINDOWS-1252 у файлnew.txt
в кодуванні UTF-8?
Дослідницькі вправи
-
Яка команда зробить
Pacific/Auckland
часовим поясом за умовчанням для поточного сеансу оболонки? -
Команда
uptime
показує, серед іншого, середнє завантаження системи в дробових числах. Вона використовує поточні параметри мови, щоб вирішити, чи має бути роздільником десяткових знаків крапка чи кома. Якщо, наприклад, для поточної мови встановленоde_DE.UTF-8
(стандартна мова Німеччини),uptime
використовуватиме кому як роздільник. Знаючи, що в американській англійській мові крапка використовується як роздільник, яка команда змуситьuptime
відображати дроби з використанням крапки замість коми протягом решти поточного сеансу? -
Команда
iconv
замінить усі символи за межами цільового набору символів знаком питання. Якщо до цільового кодування додано//TRANSLIT
, символи, яких немає в цільовому наборі символів, буде замінено (транслітеровано) одним або декількома символами схожого вигляду. Як цей метод можна використати для перетворення текстового файлу UTF-8 під назвоюreadme.txt
у звичайний файл ASCII під назвоюascii.txt
?
Підсумки
У цьому уроці описано, як налаштувати систему Linux для роботи з користувацькими мовами та параметрами часу. Також розглядаються поняття та параметри кодування символів, оскільки вони дуже важливі для правильного відтворення текстового вмісту. На уроці розглядаються такі теми:
-
Як системи Linux вибирають мову для відображення повідомлень оболонки.
-
Розуміння того, як часові пояси впливають на місцевий час.
-
Як визначити відповідний часовий пояс і відповідно змінити налаштування системи.
-
Що таке кодування символів і як проводити конвертацію між ними.
Розглянуті команди та процедури:
-
Змінні середовища, пов’язані з локалізацією та часом, наприклад
LC_ALL
,LANG
іTZ
. -
/etc/timezone
-
/etc/localtime
-
/usr/share/zoneinfo/
-
locale
-
tzselect
-
timedatectl
-
date
-
iconv
Відповіді до вправ посібника
-
Виходячи з наступного результату команди
date
, який часовий пояс системи в нотації GMT?$ date Mon Oct 21 18:45:21 +05 2019
Це часовий пояс
Etc/GMT+5
. -
На який файл має вказувати символьне посилання
/etc/localtime
, щоб зробитиEurope/Brussel
місцевим часом системи за замовчуванням?Посилання
/etc/localtime
має вказувати на/usr/share/zoneinfo/Europe/Brussels
. -
Символи в текстових файлах можуть не відтворюватися належним чином у системі з кодуванням символів, відмінним від того, що використовується в текстовому документі. Як
iconv
можна використати для перетворення файлуold.txt
у кодуванні WINDOWS-1252 у файлnew.txt
в кодуванні UTF-8?Команда
iconv -f WINDOWS-1252 -t UTF-8 -o new.txt old.txt
виконає бажане перетворення.
Відповіді до дослідницьких вправ
-
Яка команда зробить
Pacific/Auckland
часовим поясом за умовчанням для поточного сеансу оболонки?export TZ=Pacific/Auckland
-
Команда
uptime
показує, серед іншого, середнє завантаження системи в дробових числах. Вона використовує поточні параметри мови, щоб вирішити, чи має бути роздільником десяткових знаків крапка чи кома. Якщо, наприклад, для поточної мови встановленоde_DE.UTF-8
(стандартна мова Німеччини),uptime
використовуватиме кому як роздільник. Знаючи, що в американській англійській мові крапка використовується як роздільник, яка команда змуситьuptime
відображати дроби з використанням крапки замість коми протягом решти поточного сеансу?Команда
export LC_NUMERIC=en_US.UTF-8
абоexport LC_ALL=en_US.UTF-8
. -
Команда
iconv
замінить усі символи за межами цільового набору символів знаком питання. Якщо до цільового кодування додано//TRANSLIT
, символи, яких немає в цільовому наборі символів, буде замінено (транслітеровано) одним або декількома символами схожого вигляду. Як цей метод можна використати для перетворення текстового файлу UTF-8 під назвоюreadme.txt
у звичайний файл ASCII під назвоюascii.txt
?Команда
iconv -f UTF-8 -t ASCII//TRANSLIT -o ascii.txt readme.txt
виконає потрібне перетворення.