Македонска локализација

Од Сподели wiki
Преработка од 19:54, 16 мај 2007; направена од 62.162.220.144 (разговор)
(разл) ← Претходна преработка | Последна преработка (разл) | Следна преработка → (разл)
Прејди на прегледникот Прејди на пребарувањето

!!!Македонска локализација


!!Што е тоа locale?


Locale е дел од стандардните C библиотеки на Linux (и кај другите Unix-и), кој ја олеснува интернационализацијата(i18n) на софтверот. На пример locale-то ги дефинира следните стандарди, кои автоматски се користат од сите правилно направени Linux програми:

  • форматот на датите и времето
  • форматот на броевите
  • форматот на паричните единици
  • правила за сортирање
  • множество на буквите и карактерите

!!Македонското locale и негово активирање.


Македонското locale за Linux е стандарден дел на glibc од верзијата 2.1.3, 2.2 и понови, а може да се најде во дистрибуциите Slackware (од 8.0 нагоре) !RedHat (од 7.0), Mandrake (од 8.0) и други. Освен што во Glibc-2.2 е вклучено најновото македонско locale, glibc-2.2 содржи и многу богата подршка за локализирање и интернационализирање на програмите и затоа моја препорака е да надгради glibc-то. Одкога го имаме localeto на компјутерот (стандардната локација: /usr/share/i18n/locales/mk_MK), евентуално треба да се скомпајлира, а тоа се прави со наредбите:

root# localedef -i mk_MK -f ISO-8859-5 mk_MK
root# localedef -i mk_MK -f UTF-8 mk_MK.UTF-8

(Нормално не треба да потсетувам дека овие наредби мора да се извршат како root.)


Следниот чекор е активирање на locale-то. Тоа се прави на едноставен начин со поставување на shell-променливата LANG. На пример тоа може да се направи во __.bashrc__ вака:

export LANG=mk_MK.UTF-8

или во __.cshrc__ вака:

setenv LANG mk_MK.UTF-8

!!Тоа е доволното што треба да го знае обичен Linux корисник. ;)


!!Што потоа?


Со самото подесување на гореспоменатота shell променлива, сите правилно напишани Linux програми автоматски стануваат свесни за македонските стандарди и букви. Како се случува тоа? И што значи тоа правилно напишани Linux програми? За најлесно да се разјасни начинот на дејствување на локализацијата еве неколку примери на "правилно напишани Linux програми".


Првиот пример е мало програмче кое ги претвара малите букви во големи користејќи ја функцијата toupper(3).

/* gcc -o capital capital.c */
#include <locale.h>
#include <ctype.h>
int main() {
  char buff[[1024];
  int len,i;
  setlocale(LC_ALL,"");
  while(len = read(0,buff,1024)) {
      for(i=0;i < len;i++) buff[[i] = toupper(buff[[i]);
  write(1,buff,len);
  }
  puts(""); exit(0);
}


Пробај го на два начина,

LC_CTYPE=mk_MK ./capital

и

LC_CTYPE=C ./capital

и дај му некои кирилични букви на stdin и ќе ја видиш разликата.


Втор пример, употреба на strcoll(3) за сортирање на кириличните букви.


/* gcc -o sortit sortit.c */
#include <locale.h>
#include <string.h>
int compare(char **p1, char **p2) {
    return strcoll(*p1, *p2);
}
int main() {
   char *array[] = {"шамар", "ѕивра", "чаша", "ѓон", "ќумур", "жаба"};
   int nstrings = 6;
   int i;
   setlocale(LC_ALL,"");
   qsort (array, nstrings, sizeof (char *), compare);
   for(i=0; i<nstrings;i++) puts(array[[i]);
   exit(0);
}


Конечно GNU библиотеката нуди решение и за независно преведување на програмите на други јазици. Така на пример мкде тимот го преведува KDE2 на македонски, без притоа да имаат потреба од source кодот на KDE и без ре-компајлирање. Еве како изгледа дел од еден програм предвиден за преведување:

#include <libintl.h>
int main {
   ...
   setlocale(LC_ALL,"");
   bindtextdomain(PACKAGE, LOCALEDIR);
   texdomain(PACKAGE);
   ...
   puts(gettext("loading file"));
   ...
   puts(gettext("saving file"));
   ...
}


каде што PACKAGE="kbabel", а LOCALEDIR="/opt/kde/share/locale/LC_MESSAGES". Може да се види дека string-овите предвидени за преведување се вметнати во gettext функцијата. За да се преведе овој програм треба да се најде таканаречената PO template датотека (.pot), која ги содржи сите string-ови кои треба да се преведат. При преведувањето .pot датотеката ја добива наставката .po . Еве еден дел од преведена PO датотека, за програмот kbabel:

#: catalog.cpp:1086 kbabel.cpp:499
msgid "loading file"
msgstr "датотеката се вчитува"
#: catalog.cpp:1303
msgid "saving file"
msgstr "датотеката се снима"
#: searchresultbox.cpp:914 searchresultbox.cpp:998
#, c-format
msgid ""
"The file does not exist:\n"
"%1"
msgstr ""
"Датотеката не постои:\n"
"%1"


По преведување на PO датотеката, таа се компајлира во hash табела за побрз пристап. Тоа се прави со наредбата

msgfmt kbabel.po -o kbabel.mo

и потоа добиената датотека се копира или во /usr/share/locale/mk/LC_MESSAGES или /opt/kde/share/locale/mk/LC_MESSAGES. За да програмот знае кој јазик да го користи се поставува shell-променливата LANGUAGE=mk:en. При тоа не е потребно никакво пре-компајлирање на софтверот што сме го превеле, ниту пре-инсталирање, ниту ресетирање на компјутерот и слично. За повеќе информации околу правењето на интернационални програми, види __info libc Locales__ и __info gettext__.



%%% %%% %%%