Как я могу настроить язык системы?

24

В Система Администрирование Поддержка языков Текст. Я могу выбрать только стандартные локали, но я бы хотел их настроить. Например, в Windows я мог настроить такие вещи, как формат времени и даты, единицы измерения, десятичный разделитель, валюта и т. Д. Вручную - как я могу сделать это в Ubuntu?

Иван
источник

Ответы:

28

Этот ответ продемонстрирует, как полностью настроить локаль, опционально используя существующую локаль в качестве основы. Тип локали, которая будет использоваться в этом ответе, является i18nтипом; такой тип локали будет подразумеваться при каждом упоминании слова «локаль» в тексте ответа.

Найти руководство

Первое, что вам нужно настроить для локали, это узнать формат локали. Этот редактор веб-локали имеет исчерпывающее описание каждого поля в локали, несмотря на то, что его никто не может использовать сразу же. Это будет руководство по использованию.

Необходимые инструменты

Единственные инструменты, которые вам нужны для работы с локалями:

  1. Текстовый редактор. Любой подойдет, хотя VIM превзойдет.
  2. Конвертер текста в Unicode. Скорее всего, у вас его нет, поэтому я предоставлю вам простой. Прочтите следующий подраздел, чтобы получить его.

Я рекомендую вам создать каталог и сохранить в нем все, что связано с работой, которую вы будете выполнять в локали.

Конвертер текста в Unicode (кодировщик)

ПРИМЕЧАНИЕ: если вы используете необычные символы, у вас могут возникнуть проблемы со скриптом, который я напишу ниже; Возможно, вы захотите взглянуть на альтернативные сценарии, связанные с Nass .

Сохраните следующий код в файл. Этот файл будет идентифицирован вашей системой как скрипт на python, и это нормально, потому что он один. Это руководство предполагает, что вы назвали сценарий encodestr.

#!/usr/bin/python

def encode(string):
    newstring = str()
    for ch in string:
        newstring += "<U%04X>" % ord(ch)
    return newstring

if __name__ == '__main__':
    import sys
    print encode(sys.argv[1])

После сохранения дайте разрешение на выполнение файла - это пригодится. Вы можете сделать это с помощью Наутилуса, или убегая от терминала следующей команды на каталоге , в котором вы сохранили сценарий: chmod +x encodestr.

Теперь вы можете проверить этот скрипт работает на том же каталоге: ./encodestr hello. Вы должны получить вывод, равный <U0068><U0065><U006C><U006C><U006F>.

Изменить существующую локаль

Изменение существующего языкового стандарта - это самый простой случай, так как в идеале вы должны выбрать языковой стандарт, который почти полностью соответствует вашим потребностям, и в этом случае вам нужно вносить только небольшие изменения. Чтобы адаптировать его, вы можете использовать руководство, чтобы узнать, какие разделы вы хотите изменить, и как вы можете их изменить. Все установленные языковые стандарты находятся в любом месте /usr/share/i18n/locales, однако руководство содержит практически все когда-либо созданные языковые стандарты.

Тем не менее, первое, что вы заметите, когда откроете локаль, это то, что вы будете читать английские слова так же, как и странные <UXXXX>коды. Вам нужно будет иметь возможность создавать эти коды - вот где encodestrприходит сценарий.

Когда вы знаете, какие разделы вы должны изменить, вам нужно знать каждое поле, содержащееся в разделе.

Например, LC_TIMEраздел содержит поле t_fmtи многие другие. Каждое поле имеет свое описание в руководстве .

Теперь, когда вы знаете, какие поля нужно изменить, используйте руководство еще раз, чтобы узнать, какие значения принимает это поле.

Например, поле t_fmtпринимает текст и общие переменные strfmt .

Просто когда вы знаете, что писать в полях, которые вы хотите изменить, пропустите текст через encodestrскрипт, чтобы получить его закодированный эквивалент.

ПРИМЕЧАНИЕ. Не каждое поле должно быть закодировано, при необходимости используйте существующую локаль в качестве ссылки.

Например, если вы хотите иметь формат времени Time: %Tв t_fmtполе, запустите ./encodestr "Time: %T"; это вернется, <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>и у вас будет строка t_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>в вашей локали (в соответствующем разделе, конечно).

После того, как вы изменили каждое поле, которое вы хотели, вам нужно будет приступить к установке локали в систему, чтобы ее можно было использовать. Перейдите к разделу установки для этого.

Создание локали с нуля

В отличие от изменения одного, другой метод, который вы можете использовать для создания своей собственной локали, работает с ней с нуля. Это не очень сложно, если - опять же - вы используете руководство . Вот полезный совет: вы можете копировать разделы из других языков без реальных методов копирования и вставки . Вы просто должны следовать этому формату:

LC_SECTION
copy "locale"
END LC_SECTION

Где LC_SECTIONнаходится раздел, который вы хотите изменить, и localeлокаль, из которой вы хотите скопировать этот раздел.

Например, если вы хотите скопировать формат времени в английской локали, у вас будет этот текст в вашем файле локали:

LC_TIME
copy "en_GB"
END LC_TIME

И это экономит вам много работы и гарантирует, что любое изменение, внесенное в указанный языковой стандарт, будет отражено в вашем.

Установка вашей собственной локали

Шаги, которые я собираюсь показать ниже, могут быть не оптимальными, но работают.

  1. Скомпилируйте ваш язык. Не паникуйте! Это не займет много времени. Просто запустите команду, sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -vгде customуказано название вашей локали.

  2. Скопируйте вашу локаль в /usr/share/i18n/locales/каталог. Вам определенно понадобятся привилегии sudo, чтобы сделать это, и вы можете сделать это с помощью команды, sudo cp locale /usr/share/i18n/locales/где localeнаходится имя вашей пользовательской локали.

  3. Укажите ваш регион в /var/lib/locales/supported.d/. Например, создайте имя файла /var/lib/locales/supported.d/asdи добавьте строку custom UTF-8, где custom - имя вашей локали.

  4. Запустите магическую команду. Я на самом деле не знаю, что именно делает эта команда, но это важно. Беги sudo locale-gen. Наиболее вероятно, что он генерирует ссылки на доступные локали, где это необходимо.

  5. Скажите вашей системе использовать локаль. Если вы хотите, чтобы языковой стандарт использовался в масштабе всей системы, измените /etc/environmentфайл. Если нет, вы можете изменить свой ~/.profileфайл или любой другой, полученный при запуске. Если вы не знаете, что означает последнее, не беспокойтесь, просто используйте ~/.profileфайл. Чтобы узнать, что в нем нужно написать, сначала запустите localeкоманду. Он должен выдавать список с пунктами как LANGUAGE, LC_MESSAGES, LC_CTYPEи многими другими. Вы будете писать для каждого из разделов , которые вы хотите (перечисленные в предыдущей команде), на отдельных строках, это SECTION="locale"где SECTIONесть раздел и localeназвание вашего пользовательского языка.

Например, если вы хотите использовать формат времени из Нидерландов, но на английском языке, напишите:

LANGUAGE="en_GB:en"
LC_TIME="nl_NL"

ПРИМЕЧАНИЕ. Если вы хотите использовать один языковой стандарт для каждого параметра языкового стандарта, напишите LC_ALL="locale"где localeимя вашей пользовательской локали. Если вы хотите использовать локаль для всего, кроме языка, вы можете написать LANG="locale"и (на другой строке, конечно), LANGUAGE="locale":XXгде XXнаходится двухбуквенный код для языка, который вы хотите.

Например, если вы хотите использовать голландский язык и английский язык, вы можете использовать:

LANG="nl_NL"
LANGUAGE="nl_NL:en"

Вы закончили

При следующем входе в систему ваш язык должен быть использован. Вы можете проверить это, выполнив localeкоманду еще раз.

Пожалуйста, прокомментируйте несоответствия или ложные утверждения в этом руководстве!

Северо Раз
источник
Привет, код Python, который вы используете, не работает для всех случаев. Для греческих символов πμон выводит <U00CF><U0080><U00CE><U00BC>вместо ожидаемых символов <U03C0><U03BC>. Вот ссылка, которая работает.
Nass
Спасибо за ваш вклад! Я включил ваш комментарий в текст, где он должен был быть :)
Severo Raz
Я должен был добавить custom UTF-8к /usr/share/i18n/SUPPORTEDпрежде , чем я мог бежать sudo locale-gen. Иначе его не было бы в списке.
Уилберт
Скопировал ваш метод преобразования строк в мою коллекцию сценариев оболочки: github.com/budhajeewa/shell-scripts/commit/… . Спасибо!
budhajeewa
Если кто-то ищет функцию для обратного метода в этом ответе (мне нужно было прочитать существующие шестнадцатеричные значения в файлах локали.), Я написал PHP-скрипт для этого. github.com/budhajeewa/shell-scripts/commit/… . Если кто-то может написать это на Python, дайте мне знать. Я хотел бы добавить это в мою коллекцию.
budhajeewa
8

Не уверен, какую настройку вы хотите, но вы можете установить некоторые переменные локали, используя ваш ~/.locale. Например, чтобы получать английские сообщения, но немецкое время и лайки, которые я использую

export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"

Создание пользовательских локалей также возможно. Смотрите, например, это руководство для дат.

Карстен Тиль
источник
1
Нет, я хочу настройки на более низком уровне. Например: сообщения на английском языке, метрические единицы измерения, измененная чешская дата / время (ДД.ММ.ГГГГ ЧЧ: мм вместо ДМГГГ Ч.ММ), точка в качестве десятичного разделителя (для чешского языка это запятая) и € в качестве валюты (в чешском языке есть валюта Kč).
Иван
Понимаю. Принимать en_USза LC_NUMERICи de_DEза LC_MONETARYи LC_MEASUREMENTдает вам другие побочные эффекты? Смотрите также новую ссылку для создания личной локали.
Карстен Тиль
1
инструкции по ссылке, кажется, прекрасно отвечают на вопрос, может быть, вы могли бы повторить здесь самые важные биты, если ссылка когда-нибудь не будет доступна?
Стефано Палаццо