--=REKLAMA=--

Tworzenie paczek językowych dla Joomla 1.6

Z Joomla!WikiPL

(Przekierowano z Tutorial: Tworzenie paczek językowych dla Joomla 1.6)

Tworzenie paczek językowych dla Joomla! 1.6

To jest poradnik prezentujący sposób tworzenia paczek plików językowych dla Joomla! 1.6

Jako przykład posłuży nam przedrostek językowy fr-FR

Paczka tworzona jest z trzech plików. Paczki nazywamy w sposób następujący:

fr-FR_joomla_lang_full_1.6.0v1.zip

fr-FR_joomla_lang_site_1.6.0v1.zip, jeśli paczka zawiera pliki językowe części frontowej

1. Plik fr-FR.install.xml

<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="1.6">
<name>French Language Pack</name>
<packagename>fr-FR</packagename>
<version>1.6</version>
<url></url>
<packager></packager>
<packagerurl></packagerurl>
<description>1.6 Joomla French Language Package</description>
<files>
        <file type="language" client="site" id="fr-FR">site_fr-FR.zip</file>
        <file type="language" client="admin" id="fr-FR">admin_fr-FR.zip</file>
</files>
</extension>

2. Osobne paczki dla witryny i zaplecza (na przykład site i admin)

site_fr-FR.zip

admin_fr-FR.zip

Zawartość paczki na przykładzie części administracyjnej.

a) install.xml

<?xml version="1.0" encoding="utf-8" ?>
<install version="1.6" client="administrator" type="language" method="upgrade">
    <name>French (Fr)</name>
    <tag>fr-FR</tag>
    <version>1.6</version>
    <creationDate>2010-08-01</creationDate>
    <author>French translation team : Joomla!fr</author>
    <authorEmail>traduction@joomla.fr</authorEmail>
    <authorUrl>www.joomla.fr</authorUrl>
    <copyright>Copyright (C) 2005 - 2010 Joomla.fr et Open Source Matters. Tous droits réservés</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <description>French language pack for Joomla! 1.6</description>
    <files>
                <filename>index.html</filename>
                <filename>install.xml</filename> '''//Mandatory! This file lets uninstall a language.'''
                <filename>fr-FR.com_admin.ini</filename>
                <filename>fr-FR.com_admin.sys.ini</filename>
                <filename> .....ini</filename>
                [...]
                <filename>fr-FR.ini</filename>
                <filename file="meta">fr-FR.xml</filename>
                <filename>fr-FR.localise.php</filename> // in the site pack
      </files>
        <media destination="fr-FR"> //if one needs to add a specific calendar
            <filename>index.html</filename>
                <filename>js/index.html</filename>
                <filename>js/calendar-setup.js</filename>
                <filename>js/calendar.js</filename>
        </media>
</install>

b. Uwaga! Nowe formatowanie w plikach .ini Cudzysłów należy zastąpić poprzez "_QQ_" lub &quot;

c. fr-FR.xml

<?xml version="1.0" encoding="utf-8"?>
<metafile version="1.6"  client="administrator" method="upgrade" >
        <tag>fr-FR</tag>
        <name>French (FR)</name>
        <description>French administrator language for Joomla 1.6</description>
        <version>1.6</version>
        <creationDate>2010-08-01</creationDate>
        <author>French translation team : Joomla!fr</author>
        <authorEmail>traduction@joomla.fr</authorEmail>
        <authorUrl>www.joomla.fr</authorUrl>
        <copyright>Copyright (C) 2005 - 2010 Open Source Matters &  Joomla.fr. All rights reserved.</copyright>
        <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
        <metadata>
                <name>French (FR)</name>
                <tag>fr-FR</tag>
                <rtl>0</rtl>
        </metadata>
        </params>
</metafile>

d. fr-FR.localise.php (znajdujący się w paczce ze stroną)

Kilka słów wyjaśnienia:

Plik zastępuje fr-FR.ignore.php i może być dostosowywany w zależności od języka

  • Ignoruj wyrazy wyszukiwania
  • Definiuje minimalną i maksymalną długość słów podlegających wyszukiwaniu
  • Definiuje liczbę znaków wyświetlaną w wynikach wyszukiwania
  • Określenia szczegółowych mnogiej funkcjonalności dla niektórych języków, gdzie wartość string można zmieniać w zależności od liczby (np. rosyjski).
  • Definiowanie niestandardowych transliteracji (np. gdy nie jest używany parametr URL-i w Unicode Global Configuration), aby zapewnić właściwe zmiany niektórych alfabetów do ascii, kiedy SRF jest włączone. (Transliteracja używana domyślnie w Joomla 1.6 powinna zapewnić obsługę wszystkich języków alfabetu łacińskiego)
  • Definiuje własny kalendarz poprzez dodanie funkcji w stopniu podobnym do niektórych plików js.

Przykład podstawowego pliku fr-FR.localise.php (gdzie nie jest zaimplementowana transliteracja)

<?php
/**
 * @version             $Id: fr-FR.localise.php 15628 2010-03-27 05:20:29Z infograf768 $
 * @copyright   Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 */
 
/**
 * fr-FR localise class
 *
 * @package             Joomla.Site
 * @since               1.6
 */
abstract class fr_FRLocalise {    //// !!!! NOTE the use of fr_FR for the class !!!// do the same for your language prefix.
        /**
         * Returns the potential suffixes for a specific number of items
         *
         * @param       int $count  The number of items.
         * @return      array  An array of potential suffixes.
         * @since       1.6
         */
        public static function getPluralSuffixes($count) {
                if ($count == 0) {
                        $return =  array('0');
                }
                elseif($count == 1) {
                        $return =  array('1');
                }
                else {
                        $return = array('MORE');
                }
                return $return;
        }
        /**
         * Returns the ignored search words
         *
         * @return      array  An array of ignored search words.
         * @since       1.6
         */
        public static function getIgnoredSearchWords() {
                $search_ignore = array();
                $search_ignore[] = "et";
                $search_ignore[] = "si";
                $search_ignore[] = "ou";
                return $search_ignore;
        }
        /**
         * Returns the lower length limit of search words
         *
         * @return      integer  The lower length limit of search words.
         * @since       1.6
         */
        public static function getLowerLimitSearchWord() {
                return 3;
        }
        /**
         * Returns the upper length limit of search words
         *
         * @return      integer  The upper length limit of search words.
         * @since       1.6
         */
        public static function getUpperLimitSearchWord() {
                return 20;
        }
        /**
         * Returns the number of chars to display when searching
         *
         * @return      integer  The number of chars to display when searching.
         * @since       1.6
         */
        public static function getSearchDisplayedCharactersNumber() {
                return 200;
        }
}

Przykład funkcji dodawanej, gdy własna transliteracja jest pożądana

/**
         * This method processes a string and replaces all accented UTF-8 characters by unaccented
         * ASCII-7 "equivalents"
         *
         * @param       string  $string The string to transliterate
         * @return      string  The transliteration of the string
         * @since       1.6
         */
        public static function transliterate($string)
        {
                $str = JString::strtolower($string);
 
                //Specific language transliteration.
                //This one is for latin 1, latin supplement , extended A, Cyrillic, Greek
 
                $glyph_array = array(
                'a'            =>   'à,á,â,ã,ä,å,ā,ă,ą,ḁ,α,ά',
                'ae'   =>   'æ',
                'b'            =>   'β,б',
                'c'            =>   'ç,ć,ĉ,ċ,č,ч,ћ,ц',
                'ch'   =>   'ч',
                'd'            =>   'ď,đ,Ð,д,ђ,δ,ð',
                'dz'   =>   'џ',
                'e'            =>   'è,é,ê,ë,ē,ĕ,ė,ę,ě,э,ε,έ',
                'f'            =>   'ƒ,ф',
                'g'            =>   'ğ,ĝ,ğ,ġ,ģ,г,γ',
                'h'            =>   'ĥ,ħ,Ħ,х',
                'i'            =>   'ì,í,î,ï,ı,ĩ,ī,ĭ,į,и,й,ъ,ы,ь,η,ή',
                'ij'   =>   'ij',
                'j'            =>   'ĵ',
                'ja'   =>   'я',
                'ju'   =>   'яю',
                'k'            =>   'ķ,ĸ,κ',
                'l'            =>   'ĺ,ļ,ľ,ŀ,ł,л,λ',
                'lj'   =>   'љ',
                'm'            =>   'μ',
                'n'            =>   'ñ,ņ,ň,ʼn,ŋ,н,ν',
                'nj'   =>   'њ',
                'o'            =>   'ò,ó,ô,õ,ø,ō,ŏ,ő,ο,ό,ω,ώ',
                'oe'   =>   'œ,ö',
                'p'            =>   'п,π',
                'ph'   =>   'φ',
                'ps'   =>   'ψ',
                'r'            =>   'ŕ,ŗ,ř,р,ρ,σ,ς',
                's'            =>   'ş,ś,ŝ,ş,š,с',
                'ss'   =>   'ß,ſ',
                'sh'   =>   'ш',
                'shch' =>   'щ',
                't'            =>   'ţ,ť,ŧ,τ',
                'th'   =>   'θ',
                'u'            =>   'ù,ú,û,ü,ũ,ū,ŭ,ů,ű,ų,у',
                'v'            =>   'в',
                'w'            =>   'ŵ',
                'x'            =>   'χ,ξ',
                'y'            =>   'ý,þ,ÿ,ŷ',
                'z'            =>   'ź,ż,ž,з,ж,ζ'
                );
 
                foreach( $glyph_array as $letter => $glyphs ) {
                        $glyphs = explode( ',', $glyphs );
                        $str = str_replace( $glyphs, $letter, $str );
                }
 
                return $str;
        }

Poniżej mamy przykład funkcji, która dodana do pliku fr-FR.localise.php pozwoli na implementację własnego kalendarza w języku perskim ( fa-IR)

/**
 * fa-IR Date class
 *
 * @package             Joomla.Site
 * @since               1.6
 */
jimport('joomla.utilities.date');
class fa_IRDate extends JDate {
        const DAY_NUMBER        = "\x027\x03";
        const DAY_NUMBER2       = "\x030\x03";
        const DAY_YEAR          = "\x032\x03";
        const MONTH_ABBR        = "\x033\x03";
        const MONTH_NAME        = "\x034\x03";
        const MONTH_NUMBER      = "\x035\x03";
        const MONTH_NUMBER2     = "\x036\x03";
        const MONTH_LENGTH      = "\x037\x03";
        const YEAR_ABBR         = "\x040\x03";
        const YEAR_NAME         = "\x041\x03";
        const AM_LOWER          = "\x042\x03";
        const AM_UPPER          = "\x043\x03";
        const PERSIAN_EPOCH     = 1948320.5;
 
        protected static $month_names = array("فروردين","ارديبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند");
 
 
        /**
         * Gets the date as a formatted string.
         *
         * @param       string  The date format specification string (see {@link PHP_MANUAL#date})
         * @param       boolean True to return the date string in the local time zone, false to return it in GMT.
         * @return      string  The date string in the french republican calendar (see @link{http://en.wikipedia.org/wiki/French_Republican_Calendar}).
         * @since       1.6
         */
        public function calendar($format, $local = false)
        {
                // Do string replacements for date format options that can be translated.
                $format = preg_replace('/(^|[^\\\])d/', "\\1".self::DAY_NUMBER2, $format);
                $format = preg_replace('/(^|[^\\\])j/', "\\1".self::DAY_NUMBER, $format);
                $format = preg_replace('/(^|[^\\\])z/', "\\1".self::DAY_YEAR, $format);
                $format = preg_replace('/(^|[^\\\])M/', "\\1".self::MONTH_ABBR, $format);
                $format = preg_replace('/(^|[^\\\])F/', "\\1".self::MONTH_NAME, $format);
                $format = preg_replace('/(^|[^\\\])n/', "\\1".self::MONTH_NUMBER, $format);
                $format = preg_replace('/(^|[^\\\])m/', "\\1".self::MONTH_NUMBER2, $format);
                $format = preg_replace('/(^|[^\\\])t/', "\\1".self::MONTH_LENGTH, $format);
                $format = preg_replace('/(^|[^\\\])y/', "\\1".self::YEAR_ABBR, $format);
                $format = preg_replace('/(^|[^\\\])Y/', "\\1".self::YEAR_NAME, $format);
                $format = preg_replace('/(^|[^\\\])a/', "\\1".self::AM_LOWER, $format);
                $format = preg_replace('/(^|[^\\\])A/', "\\1".self::AM_UPPER, $format);
 
                // Format the date.
                $return = parent::calendar($format, $local);
 
                $jd = gregoriantojd($this->month, $this->day, $this->year);
                $jalaliDate = self::jd_to_persian($jd);
                $m = $jalaliDate['mon'];
                $d = $jalaliDate['day'];
                $y = $jalaliDate['year'];
 
                // Manually modify the strings in the formated time.
                if (strpos($return, self::DAY_NUMBER) !== false) {
                        $return = str_replace(self::DAY_NUMBER, $d , $return);
                }
                if (strpos($return, self::DAY_NUMBER2) !== false) {
                        $return = str_replace(self::DAY_NUMBER2, sprintf("%02d",$d), $return);
                }
                if (strpos($return, self::DAY_YEAR) !== false) {
                        $return = str_replace(self::DAY_YEAR, $jd - self::persian_to_jd(1,1,$y)+1, $return);
                }
                if (strpos($return, self::MONTH_ABBR) !== false) {
                        $return = str_replace(self::MONTH_ABBR, self::$month_names[$m-1] , $return);
                }
                if (strpos($return, self::MONTH_NAME) !== false) {
                        $return = str_replace(self::MONTH_NAME, self::$month_names[$m-1] , $return);
                }
                if (strpos($return, self::MONTH_NUMBER) !== false) {
                        $return = str_replace(self::MONTH_NUMBER, $m , $return);
                }
                if (strpos($return, self::MONTH_NUMBER2) !== false) {
                        $return = str_replace(self::MONTH_NUMBER2, sprintf("%02d", $m) , $return);
                }
                if (strpos($return, self::MONTH_LENGTH) !== false) {
                        $return = str_replace(self::MONTH_LENGTH, $m < 7 ? 31 : $m < 12 ? 30 : self::leap_persian($y) ? 30 : 29 , $return);
                }
                if (strpos($return, self::YEAR_ABBR) !== false) {
                        $return = str_replace(self::YEAR_ABBR, sprintf("%02d",$y % 100), $return);
                }
                if (strpos($return, self::YEAR_NAME) !== false) {
                        $return = str_replace(self::YEAR_NAME, $y, $return);
                }
                if (strpos($return, self::AM_LOWER) !== false) {
                        $return = str_replace(self::AM_LOWER, $this->format('a',$local)=='pm' ? 'ب ظ' : 'ق ظ', $return);
                }
                if (strpos($return, self::AM_UPPER) !== false) {
                        $return = str_replace(self::AM_UPPER, $this->format('a',$local)=='pm' ? 'ب ظ' : 'ق ظ', $return);
                }
 
                return $return;
        }
        public static function jd_to_persian($jd)
 
        {
 
                //var $year, $month, $day, $depoch, $cycle, $cyear, $ycycle,
 
                //    $aux1, $aux2, $yday;
 
 
 
                $jd = floor($jd) + 0.5;
 
 
 
                $depoch = $jd - self::persian_to_jd(1, 1, 475);
 
                $cycle = floor($depoch / 1029983);
 
                $cyear = $depoch % 1029983;
 
                if ($cyear == 1029982) {
 
                    $ycycle = 2820;
 
                } else {
 
                    $aux1 = floor($cyear / 366);
 
                    $aux2 = $cyear % 366;
 
                    $ycycle = floor(((2134 * $aux1) + (2816 * $aux2) + 2815) / 1028522) +
 
                                $aux1 + 1;
 
                }
 
                $year = $ycycle + (2820 * $cycle) + 474;
 
                if ($year <= 0) {
 
                    $year--;
 
                }
 
                $yday = ($jd - self::persian_to_jd(1, 1, $year)) + 1;
 
                $month = ($yday <= 186) ? ceil($yday / 31) : ceil(($yday - 6) / 30);
 
                $day = ($jd - self::persian_to_jd($month, 1, $year)) + 1;
 
                return array('year'=>$year, 'mon'=>$month,'day'=> $day);
 
        }
        public static function persian_to_jd($month, $day, $year)
 
        {
 
                //var $epbase, $epyear;
 
                $epbase = $year - (($year >= 0) ? 474 : 473);
 
                $epyear = 474 + $epbase % 2820;
 
 
 
                return $day +
 
                        (($month <= 7) ?
 
                            (($month - 1) * 31) :
 
                            ((($month - 1) * 30) + 6)
 
                        ) +
 
                        floor((($epyear * 682) - 110) / 2816) +
 
                        ($epyear - 1) * 365 +
 
                        floor($epbase / 2820) * 1029983 +
 
                        self::PERSIAN_EPOCH;
 
        }
 
        public static function leap_persian($year) {
 
            return (((((($year - (($year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816) < 682;
 
        }
 
}

Oczywiście, do paczki należy dodać właściwe pliki kalendarza.

Dziękujemy za wkład

» Stefan Wajda [zwiastun],