Автор Тема: А теперь правильная русификация (бета, будем дополнять)  (Прочитано 40216 раз)

Fugokker

  • Гость
Недопередополнил
« Ответ #15 : 22 Сентябрь 2010, 19:13:57 »
Цитировать
/001/etc/rc.d/rc.slax
Меняем в нем
/usr/bin/reset на /usr/bin/clear

А зачем это? В оригинальном скрипте ошибка или как?

Цитировать
а менять стартовые скрипты- маразм

Оффлайн novah

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 335
  • Карма: +2/-0
    • Просмотр профиля
Уффф, да я написал, что после этой команды слетает локаль koi8, сp1251, iso...

Fugokker

  • Гость
Да-да, это тоже относится к нашей теме
« Ответ #17 : 09 Октябрь 2010, 21:04:11 »
Как внутри bash-скрипта определить, запущена оболочка bash просто в консоли, или же внутри сессии X, в каком-нибудь эмуляторе терминала?

Fugokker

  • Гость
Re: Да-да, это тоже относится к нашей теме
« Ответ #18 : 10 Октябрь 2010, 09:42:33 »
Как внутри bash-скрипта определить, запущена оболочка bash просто в консоли, или же внутри сессии X, в каком-нибудь эмуляторе терминала?

Команда "tty" за это отвечает. Если она выдаёт "/dev/ttyN", значит, ты в консоли; если "/dev/pts/N" - в X-терминале.

Fugokker

  • Гость
Правильная правильной рознь
« Ответ #19 : 10 Октябрь 2010, 20:04:49 »
Добился кой-какого успеха в выставлении всех четырёх локалей описанным выше способом (через выставление параметра загрузки "locale=..."). Библиотеку "liblinuxlive" модифицировал по-другому. Кому интересно, могу описать.

Оффлайн Slax User

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 244
  • Карма: +2/-0
    • Просмотр профиля
Fugokker, определённо интересно.

Fugokker

  • Гость
Таким образом, удалось справиться с поддержкой четырёх русских локалей: UTF-8, ISO-8859-5, KOI8-R и CP1251. Локаль назначается при загрузке передачей параметра ядру "locale=...". Параметр "iocharset" игнорируется.

1. Установка локали в консоли

1.1. Распаковать и смонтировать initrd (см. выше).
1.2. Сгенерировать файлы соответствующих локалей и добавить в usr.lzm (там же).
1.3. Создать в каталоге /usr/lib/locale (т. е. в usr.lzm) символическую ссылку с именем ru_RU.iso8859-5, показывающую на /usr/lib/locale/ru_RU. (Вот и чешите репу, соображая, что я хотел сказать.)
1.4. перейти в каталог, где смонтирован начальный образ, и далее в <initrd>/lib/modules/2.6.27.27/kernel/fs/nls. В этот каталог надо добавить файл nls_utf8.ko - это модуль ядра, якобы отвечающий за работу с кодировкой UTF-8 в смонтированных системах. (Не знаю, где лучше его брать; я брал из аналогичного места в установленной Слаквари.).
1.5. запустить команду depmod -b <каталог монтирования initrd>.

1.6. изменить скрипт liblinuxlive в смонтированном initrd.
Функция locale_id() должна иметь вид:

locale_id()
{
   debug_log "locale_id" "$*"
   local LOCALE LOCALE_FOUND ALIAS_FILE

   ALIAS_FILE='/usr/share/locale/locale.alias'

   # First, try to find out locale from boot parameters
   LOCALE="$1"
   if [ ! "$LOCALE" ]; then LOCALE=$(cmdline_value locale); fi
   if [ ! "$LOCALE" ]; then LOCALE=$(cmdline_value language); fi
   if [ ! "$LOCALE" ]; then LOCALE=$(cmdline_value lang); fi

   # If locale is given without iocharset
   if [ ! "$(echo $LOCALE | grep -o "\\..*" | cut -c 2-)" ] && [ -r "$ALIAS_FILE" ]; then
      LOCALE_FOUND=$(cat $ALIAS_FILE \
                     | sed -r "s/#.*//" \
                     | grep -m 1 -o "[[:space:]]\+$LOCALE\\..\+\$" \
                     | tr -d "[:space:]")
      if [ "$LOCALE_FOUND" ]; then
         echo "$LOCALE_FOUND"
         return 0
      fi
   fi

   # Try to find some default locale
   if [ ! "$LOCALE" ]; then
      # Get list of locales from "/usr/lib/locale/"
      LOCALE_FOUND=$(ls -A1p '/usr/lib/locale' 2>/dev/null \
                     | grep -e "/$" \
                     | sed -r "s:\/::g" \
                     | tr -s "[:space:]" " ")
      # Check list of locales:
      # If more than one locale in the list, then...
      if [ $(echo $LOCALE_FOUND | grep -c " ") -gt 0 ]; then
         # ...cutting first locale from list
         LOCALE_FOUND=$(echo $LOCALE_FOUND | cut -d " " -f 1)
         # ...try to find some data in "/usr/share/locale/locale.alias"
         if [ -r "$ALIAS_FILE" ]; then
            # Cutting iocharset data
            LOCALE=$(echo $LOCALE_FOUND | sed -r "s/\\..*//")
            # Check in file
            LOCALE=$(cat $ALIAS_FILE \
                     | sed -r "s/#.*//" \
                     | grep -m 1 -o "[[:space:]]\+$LOCALE\\..\+\$" \
                     | tr -d "[:space:]")
         fi
      fi
   fi
   if [ ! "$LOCALE" ]; then LOCALE=$LOCALE_FOUND; fi

   # Return with code
   if [ "$LOCALE" ]; then
      echo "$LOCALE"
   else
      echo "POSIX"
      return 1
   fi
}

Функция iocharset() должна иметь вид:

iocharset()
{
   debug_log "iocharset" "$*"
   local IOCHARSET LOCALE

   # Find out the iocharset from "locale_id" output,
   # ignoring "iocharset" boot parameter
   LOCALE=$(locale_id)
   IOCHARSET=$(echo $LOCALE \
               | grep -o "\\..*" \
               | cut -c 2- \
               | tr "[[:upper:]]" "[[:lower:]]" \
               | sed -r "s/-//g;s/^iso8859/iso8859-/;s/^koi8/koi8-/;s/^euc/euc-/")

   # Find out the iocharset from "locale.alias" file
   if [ ! "$IOCHARSET" ] && [ -r '/usr/share/locale/locale.alias' ]; then
      IOCHARSET=$(cat '/usr/share/locale/locale.alias' \
                  | sed -r "s/#.*//" \
                  | grep -m 1 -o "[[:space:]]\+$LOCALE\\..\+\$" \
                  | sed -r "s/.*\\.//;s/[[:space:]-]//g" \
                  | tr "[[:upper:]]" "[[:lower:]]" \
                  | sed -r "s/^iso8859/iso8859-/;s/^koi8/koi8-/;s/^euc/euc-/")
   fi

   # "utf8" is the kernel built-in charset, there is no need to check it
   if [ "$IOCHARSET" = "utf8" ]; then
      echo "$IOCHARSET"
      return 0
   fi

   # System default charset
   if [ ! "$IOCHARSET" ]; then IOCHARSET="iso8859-1"; fi

   # Found string should match some kernel module (after stripping out few
   # of the dashes)
   if [ $(find '/lib/modules' -name "nls_*" \
          | sed -r "s:^.*/|[.]ko$::g" \
          | cut -b 5- \
          | tr "[[:upper:]]" "[[:lower:]]" \
          | sed -r "s/-//g;s/^iso8859/iso8859-/;s/^koi8/koi8-/;s/^euc/euc-/" \
          | grep -m 1 -o $IOCHARSET) ]; then
      echo "$IOCHARSET"
      return 0
   fi
   return 1
}

Функция fs_options() должна иметь вид:

fs_options()
{
   debug_log "fs_options" "$*"
   local NOAUTO IOCHARSET LOCALE

   NOAUTO=$(cmdline_parameter noauto)
   if [ "$NOAUTO" = "" ]; then NOAUTO="auto"; fi
   if [ "$2" = "fstab" ]; then echo -n "$NOAUTO," ; fi
   if [ "$1" = "swap" ]; then echo "defaults,pri=1"; return 0; fi
   echo -n "noatime,users,suid,dev,exec"

   IOCHARSET=$(iocharset)
   LOCALE=$(locale_id | sed -r "s/\\..*//")

   case "$1" in
      "vfat" )
         echo -n ",quiet,fmask=113,dmask=2,check=s,shortname=mixed"
         if [ $(echo $LOCALE | cut -d _ -f 1) = "ru" ]; then
            echo -n ",codepage=866"
         else
            echo -n ",codepage=437"
         fi
         if [ "$IOCHARSET" ]; then
            echo ",iocharset=$IOCHARSET"
         fi
      ;;
      "iso9660" )
         echo -n ",ro"
         if [ "$IOCHARSET" ]; then
            echo ",iocharset=$IOCHARSET"
         fi
      ;;
      "ntfs" )
         echo -n ",ro"
         if [ "$IOCHARSET" ]; then
            echo ",nls=$IOCHARSET"
         fi
      ;;
      "ntfs-3g" )
         echo -n ",force,fmask=113,dmask=2,locale=$LOCALE"
         if [ "$IOCHARSET" ]; then
            echo ".$IOCHARSET"
         fi
      ;;
   esac
}

1.7. Запаковать всё, что наизменяли, обратно в initrd.gz.
« Последнее редактирование: 13 Октябрь 2010, 17:54:10 от Fugokker »

Fugokker

  • Гость
2. Установка консольных шрифтов и раскладок клавиатуры

2.1. Добавить скрипт /etc/rc.d/rc.font следующего содержания:

#!/bin/sh

. /usr/lib/liblinuxlive

if [ $(locale_id | sed -r "s/\\..*//g" | cut -c -2) = "ru" ]; then
  case $(iocharset) in
    "utf8" ) setfont -v Cyr_a8x16 ;;
    "iso8859-5" ) setfont -v Cyr_a8x16 -m 8859-5_to_uni ;;
    "koi8-r" ) setfont -v Cyr_a8x16 -m koi8-r_to_uni ;;
    "koi8-u" ) setfont -v Cyr_a8x16 -m koi8-u_to_uni ;;
    "cp1251" ) setfont -v Cyr_a8x16 -m cp1251_to_uni ;;
    * ) setfont -v ;;
  esac
else
  setfont -v
fi

2.2. Добавить скрипт /etc/rc.d/rc.keymap следующего содержания:

#!/bin/sh
# Load the keyboard map. More maps are in /usr/share/kbd/keymaps.
if [ -x /usr/bin/loadkeys ]; then

  # Get the locale string from liblinuxlive script and transform it
  . /usr/lib/liblinuxlive

  # Set keymap that depends on locale
  if [ $(locale_id | sed -r "s/\..*//g" | cut -c -2) = "ru" ]; then
    case $(iocharset) in
      "utf8" ) /usr/bin/loadkeys 'ruwin_ct_sh-UTF-8.map.gz' ;;
      "iso8859-5" ) /usr/bin/loadkeys 'ruwin_ct_sh-ISO8859-5.map.gz' ;;
      "koi8-r" ) /usr/bin/loadkeys 'ruwin_ct_sh-KOI8-R.map.gz' ;;
      "cp1251" ) /usr/bin/loadkeys 'ruwin_ct_sh-CP1251.map.gz' ;;
      * ) /usr/bin/loadkeys 'us.map.gz' ;;
    esac
  else
    /usr/bin/loadkeys 'us.map.gz'
  fi
fi

Внимание: те файлы раскладок, на которые ссылается скрипт (ruwin_ct_sh-UTF-8.map.gz и пр.) я брал частью из пакета kbd для Слаквари, а частью те, которые генерировал автор поста. Потом переименовал некоторые, чтобы имели одинаковый вид. В "Слаксе" по умолчанию нет этих файлов. Их нужно переписывать в каталог /usr/share/kbd/keymaps/i386/qwerty.

2.3. Добавить скрипт /etc/rc.d/rc.vtmap следующего содержания (вот и команда tty пригодилась, слава те господи):

#!/bin/sh

. /usr/lib/liblinuxlive

NUM_TTY=$(grep '^[^#].*respawn:/sbin/agetty' /etc/inittab | grep -o '\btty[[:digit:]]*\b')

if [ $(iocharset) = "utf8" ]; then
  for TTY in $NUM_TTY
  do
    openvt -f -w -c ${TTY#tty} -- /bin/sh -c "echo -ne '\033%G' && kbd_mode -u"
  done
else
  for TTY in $NUM_TTY
  do
    openvt -f -w -c ${TTY#tty} -- /bin/sh -c "echo -ne '\033%@\033(K' && kbd_mode -a"
  done
fi

2.4. Добавить скрипты /root/.bashrc и /root/.profile следующего содержания:

Код: (.basrc) [Выделить]
for TTY in $(grep '^[^#].*respawn:/sbin/agetty' /etc/inittab | grep -o '\btty[[:digit:]]*\b')
do
  if [ $(tty | sed -r "s:^/dev/::") = $TTY ]; then
    if [ $( . /usr/lib/liblinuxlive ; iocharset) = "utf8" ]; then
      openvt -f -w -c $(echo $TTY | sed -r "s:^tty::") -- /bin/sh -c "echo -ne '\033%G' && kbd_mode -u"
    else
      openvt -f -w -c $(echo $TTY | sed -r "s:^tty::") -- /bin/sh -c "echo -ne '\033%@\033(K' && kbd_mode -a"
    fi
    break
  fi
done

Код: (.profile) [Выделить]
# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n

2.5. Переписать скрипты .bashrc и .profile в каталог /etc/skel.
2.6. Все изменённые и добавленные файлы упаковать в отдельный модуль. Скрипт liblinuxlive должен находиться в каталоге /usr/lib. Готовый модуль переписать в каталог slax/base на сменном носителе.
« Последнее редактирование: 12 Октябрь 2010, 18:56:15 от Fugokker »

Fugokker

  • Гость
Возникла заминка с переводом виртуальных терминалов в режим ASCII. По-хорошему, этим должен бы заниматься скрипт /etc/rc.d/rc.vtmap, посылающий "магические последовательности" во все виртуальные консоли системы, но он не срабатывает почему-то. Русский шрифт в консоли не виден. Пришлось добавлять .bashrc и .profile, которые посылают эту последовательность в один терминал при каждом старте "баша".

Fugokker

  • Гость
Антр-ну, тык-скыть
« Ответ #24 : 12 Октябрь 2010, 19:21:43 »
А вообще, поглядел я на эти авторские скрипты, которые исправлять пришлось, и пришёл к выводу, что у этого Томаса Эм ручонки уж если не совсем кривые, то точно кривоватые...

Оффлайн novah

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 335
  • Карма: +2/-0
    • Просмотр профиля
« Последнее редактирование: 12 Октябрь 2010, 22:34:30 от Artpsiholog »

Fugokker

  • Гость
Мне нравится ваш лаконизм, но к чему вы это написали?

Оффлайн novah

  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 335
  • Карма: +2/-0
    • Просмотр профиля
1.4. перейти в каталог, где смонтирован начальный образ, и далее в <initrd>/lib/modules/2.6.27.27/kernel/fs/nls. В этот каталог надо добавить файл nls_utf8.ko - это модуль ядра, якобы отвечающий за работу с кодировкой UTF-8 в смонтированных системах. (Не знаю, где лучше его брать; я брал из аналогичного места в установленной Слаквари.).
1.5. запустить команду depmod -b <каталог монтирования initrd>.

Я уже писал что оно не выделено модулем потому что является частью vmlinuz, но вы не слушаете, поэтому я дал ссылку на конфиг ядра.
зыЖ Или это я не вам писал? хз
зыЖЖ У Томаса ручки не кривоватые, он не обязан заниматься проблемами локалей других языков.
« Последнее редактирование: 13 Октябрь 2010, 12:00:00 от novah »

Fugokker

  • Гость
Я уже писал что оно не выделено модулем потому что является частью vmlinuz, но вы не слушаете, поэтому я дал ссылку на конфиг ядра.
зыЖ Или это я не вам писал? хз

Частью так частью, это дело поправимое.

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

Раз дистрибутивы выпускает - обязан как миленький. Другие разработчики линюксов на liveCD решают проблемы многоязычности и Юникода сами, а не пускают на самотёк, чтобы пользователи бились головой об стенку. Сейчас Slax в этом плане - вообще белая ворона, какой линюкс ни возьми, там обязательно есть либо "ru_RU", либо "UTF-8", либо "ru_RU.UTF-8".

Оффлайн Misha from Penza

  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 109
  • Карма: +2/-0
    • Просмотр профиля
Раз дистрибутивы выпускает - обязан как миленький. Другие разработчики линюксов на liveCD решают проблемы многоязычности и Юникода сами, а не пускают на самотёк, чтобы пользователи бились головой об стенку. Сейчас Slax в этом плане - вообще белая ворона, какой линюкс ни возьми, там обязательно есть либо "ru_RU", либо "UTF-8", либо "ru_RU.UTF-8".
он никому ничего не обязан, а теперь, когда проект заморозил - тем более.