Македонска локализација: Разлика помеѓу преработките

Од Сподели wiki
Прејди на прегледникот Прејди на пребарувањето
Нема опис на уредувањето
(Синтаксички корекции, додаден линк за мКДЕ, ситни корекции во форматирање)
Ред 2: Ред 2:




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


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


!!Македонското locale и негово активирање.
!!Македонското 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''), евентуално треба да се скомпајлира, а тоа се прави со наредбите:
Македонското 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-то. Откако го имаме locale-то на компјутерот (стандардната локација: ''/usr/share/i18n/locales/mk_MK''), евентуално треба да се искомпилира, а тоа се прави со наредбите:
  root# localedef -i mk_MK -f ISO-8859-5 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# localedef -i mk_MK -f UTF-8 mk_MK.UTF-8
Ред 24: Ред 24:
  setenv LANG mk_MK.UTF-8
  setenv LANG mk_MK.UTF-8


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


----
----
Ред 30: Ред 30:




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




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


  /* gcc -o capital capital.c */
  /* gcc -o capital capital.c */
  #include <locale.h>
  #include <locale.h>
  #include <ctype.h>
  #include <ctype.h>
 
  int main() {
  int main() {
   char buff[[1024];
   char buff[[1024];
Ред 58: Ред 58:




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




Ред 64: Ред 64:
  #include <locale.h>
  #include <locale.h>
  #include <string.h>
  #include <string.h>
 
  int compare(char **p1, char **p2) {
  int compare(char **p1, char **p2) {
     return strcoll(*p1, *p2);
     return strcoll(*p1, *p2);
  }
  }
 
  int main() {
  int main() {
     char *array[] = {"шамар", "ѕивра", "чаша", "ѓон", "ќумур", "жаба"};
     char *array[] = {"шамар", "ѕивра", "чаша", "ѓон", "ќумур", "жаба"};
Ред 80: Ред 80:




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


  #include <libintl.h>
  #include <libintl.h>
Ред 96: Ред 96:




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


  #: catalog.cpp:1086 kbabel.cpp:499
  #: catalog.cpp:1086 kbabel.cpp:499
  msgid "loading file"
  msgid "loading file"
  msgstr "датотеката се вчитува"
  msgstr "датотеката се вчитува"
 
  #: catalog.cpp:1303
  #: catalog.cpp:1303
  msgid "saving file"
  msgid "saving file"
  msgstr "датотеката се снима"
  msgstr "датотеката се снима"
 
  #: searchresultbox.cpp:914 searchresultbox.cpp:998
  #: searchresultbox.cpp:914 searchresultbox.cpp:998
  #, c-format
  #, c-format
Ред 116: Ред 116:




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



Преработка од 15:52, 17 мај 2007

Што е тоа 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-то. Откако го имаме locale-то на компјутерот (стандардната локација: /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-библиотеката нуди решение и за независно преведување на програмите на други јазици. Така на пример тимот на мкде го преведува KDE на македонски, без притоа да имаат потреба од изворниот код на 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". Може да се види дека пораките предвидени за преведување се вметнати во функцијата gettext. За да се преведе оваа програма треба да се најде таканаречената PO-template датотека (.pot), која ги содржи сите пораки што треба да се преведат. При преведувањето .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__.



%%% %%% %%%