Македонска локализација: Разлика помеѓу преработките
Нема опис на уредувањето |
с (9 ревизии: initial) |
||
(Не се прикажани 8 меѓувремени преработки од 5 корисници) | |||
Ред 1: | Ред 1: | ||
Locale е дел од стандардните C библиотеки на [[GNU/Linux]] (и кај другите Unix-и), кој ја олеснува интернационализацијата (i18n) на софтверот. На пример locale-то ги дефинира следните стандарди, кои автоматски се користат од сите правилно направени [[GNU/Linux]] програми: | |||
*форматот на датумите и времето | |||
*форматот на броевите | |||
*форматот на паричните единици | |||
*правила за подредување (сортирање) | |||
*множество на буквите и знаците | |||
== Македонското locale и негово активирање == | |||
Македонското locale за GNU/Linux е [http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/localedata/locales/mk_MK?cvsroot=glibc|стандарден дел на glibc] од верзијата 2.1.3, 2.2 и понови, така што е дел од сите современи GNU/Linux дистрибуции и стандардно доаѓа и во најосновните инсталации. Евентуално на некои дистрибуции треба да се „искомпајлира“, што се прави или преку едитирање на <code>/etc/locale.gen</code> и потоа извршување на командата <code>locale-gen</code> или пак со командите: | |||
# localedef -i mk_MK -f UTF-8 mk_MK | |||
# localedef -i mk_MK -f UTF-8 mk_MK.UTF-8 | |||
Нормално не треба да потсетувам дека овие наредби мора да се извршат како root. | |||
Следниот чекор е активирање на locale-то. Тоа се прави на едноставен начин со поставување на променливата LANG. На пример тоа може да се направи во <code>~/.bashrc</code> вака: | |||
export LANG=mk_MK.UTF-8 | |||
или во <code>~/.cshrc</code> вака: | |||
или во | |||
setenv LANG mk_MK.UTF-8 | |||
За било кој обичен GNU/Linux корисник, до тука е доволно да се знае. | |||
=== Референци === | |||
* Debian/Ubuntu? | |||
* ArchLinux? | |||
* Gentoo? | |||
* RHEL? | |||
== Што потоа? == | |||
Со самото поставување на гореспоменатота shell-променлива, сите правилно напишани [[GNU/Linux]] програми автоматски стануваат „свесни“ за македонските стандарди и букви. Како се случува тоа? И што значи тоа правилно напишани [[GNU/Linux]] програми? За најлесно да се разјасни начинот на дејствување на локализацијата еве неколку примери на „правилно напишани [[GNU/Linux]] програми“. | |||
Првиот пример е мало програмче во [[C]] кое ги претвора малите букви во големи користејќи ја функцијата toupper(3). | |||
<pre> | |||
/* 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]; | ||
Ред 52: | Ред 53: | ||
puts(""); exit(0); | puts(""); exit(0); | ||
} | } | ||
</pre> | |||
Може да се тестира на два начини: | |||
# LC_CTYPE=mk_MK ./capital | |||
LC_CTYPE=mk_MK ./capital | |||
и | и | ||
LC_CTYPE=C ./capital | # LC_CTYPE=C ./capital | ||
и дај му некои кирилични букви на stdin и ќе ја видиш разликата. | и дај му некои кирилични букви на stdin и ќе ја видиш разликата. | ||
Втор пример, употреба на strcoll(3) за подредување на кириличните букви. | |||
Втор пример, употреба на strcoll(3) за | <pre> | ||
/* gcc -o sortit sortit.c */ | /* gcc -o sortit sortit.c */ | ||
#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[] = {"шамар", "ѕивра", "чаша", "ѓон", "ќумур", "жаба"}; | ||
Ред 81: | Ред 81: | ||
exit(0); | exit(0); | ||
} | } | ||
</pre> | |||
Конечно GNU-библиотеката нуди решение и за независно преведување на програмите на други јазици. Така на пример тимот на [http://mkde.sf.net мкде] го преведува [[KDE]] на македонски, без притоа да имаат потреба од изворниот код на KDE и без ре-компилирање. Еве како изгледа дел од една програма предвидена за преведување: | |||
Конечно GNU библиотеката нуди решение и за независно преведување на програмите на други јазици. Така на пример мкде | <pre> | ||
#include <libintl.h> | #include <libintl.h> | ||
int main { | int main { | ||
Ред 97: | Ред 97: | ||
... | ... | ||
} | } | ||
</pre> | |||
каде што PACKAGE="kbabel", а LOCALEDIR="/opt/kde/share/locale/LC_MESSAGES". Може да се види дека пораките предвидени за преведување се вметнати во функцијата gettext. За да се преведе оваа програма треба да се најде таканаречената PO-template датотека (.pot), која ги содржи сите пораки што треба да се преведат. При преведувањето .pot датотеката ја добива наставката .po . Еве еден дел од преведена PO-датотека, за програмата kbabel: | |||
каде што PACKAGE="kbabel", а LOCALEDIR="/opt/kde/share/locale/LC_MESSAGES". Може да се види дека | |||
#: 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 | ||
Ред 118: | Ред 118: | ||
"%1" | "%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__. | За повеќе информации околу правењето на интернационални програми, види __info libc Locales__ и __info gettext__. | ||
[[Категорија:Локализација]] | |||
[[Категорија:L10n]] | |||
Последна преработка од 17:35, 29 јануари 2011
Locale е дел од стандардните C библиотеки на GNU/Linux (и кај другите Unix-и), кој ја олеснува интернационализацијата (i18n) на софтверот. На пример locale-то ги дефинира следните стандарди, кои автоматски се користат од сите правилно направени GNU/Linux програми:
- форматот на датумите и времето
- форматот на броевите
- форматот на паричните единици
- правила за подредување (сортирање)
- множество на буквите и знаците
Македонското locale и негово активирање
Македонското locale за GNU/Linux е дел на glibc од верзијата 2.1.3, 2.2 и понови, така што е дел од сите современи GNU/Linux дистрибуции и стандардно доаѓа и во најосновните инсталации. Евентуално на некои дистрибуции треба да се „искомпајлира“, што се прави или преку едитирање на /etc/locale.gen
и потоа извршување на командата locale-gen
или пак со командите:
# localedef -i mk_MK -f UTF-8 mk_MK # localedef -i mk_MK -f UTF-8 mk_MK.UTF-8
Нормално не треба да потсетувам дека овие наредби мора да се извршат како root.
Следниот чекор е активирање на locale-то. Тоа се прави на едноставен начин со поставување на променливата LANG. На пример тоа може да се направи во ~/.bashrc
вака:
export LANG=mk_MK.UTF-8
или во ~/.cshrc
вака:
setenv LANG mk_MK.UTF-8
За било кој обичен GNU/Linux корисник, до тука е доволно да се знае.
Референци
- Debian/Ubuntu?
- ArchLinux?
- Gentoo?
- RHEL?
Што потоа?
Со самото поставување на гореспоменатота shell-променлива, сите правилно напишани GNU/Linux програми автоматски стануваат „свесни“ за македонските стандарди и букви. Како се случува тоа? И што значи тоа правилно напишани GNU/Linux програми? За најлесно да се разјасни начинот на дејствување на локализацијата еве неколку примери на „правилно напишани GNU/Linux програми“.
Првиот пример е мало програмче во C кое ги претвора малите букви во големи користејќи ја функцијата 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__.