Кодтау практикасы

Негізгі принциптер

PHP — бұл барлық деңгейдегі көмек көрсетушілерге кодты тек жаттау жоғары дауыс жасауға мүмкіндік беретін жиі тіл. Бірақ тілді бірінші рет (немесе көмекшілік етуге) оқып қалған жағдайларымызды қысқаша жолмен жаттау жаттығырақ қолдану, жасау қателіктері жоғары арттырып кететінімізге жол ашатамыз. Осы жиі болушы байланысты жаттыру үшін бұл бөлімді PHP-дағы негізгі кодтау практикаларына еске тарту нысаналанған.

Күн мен Уақыт

PHP-де күн мен уақытты оқу, жазу, салыстыру немесе есептеу кезінде Сізге көмек төменгі DateTime атында клас бар. DateTime-дың алдын алуымен байланысты PHP-да көптеген күн мен уақытты қамтамасыз ерекше функциялар бар, бірақ ол көпшілікке қолданатын адамдар үшін сыйлаушыы болады. DateTime уақыт зоналарымен байланыстырылуы болатын, бірақ бұл кысқаша көмекшінін шектеуді мазмұн етеді.

DateTime-мен жұмыс істеуге бастау үшін жалпы күн мен уақыт тарихі мен уақытын арнайы көмекшіге айналдыру өнімін қолданып, createFromFormat() фабрикалық әдісін немесе ағымдағы күн мен уақытты алу үшін new DateTime көмекшісін пайдаланыңыз. DateTime-ды қайта көру үшін format() әдісін пайдаланыңыз.

<?php
$raw = '22. 11. 1968';
$start = DateTime::createFromFormat('d. m. Y', $raw);

echo 'Бастау күні: ' . $start->format('Y-m-d') . PHP_EOL;

DateTime менеджерімен есептеу мүмкін. DateInterval класымен күн мен уақытты есептеу мүмкін. DateTime-де add() және sub() әдістері бар, оларға DateInterval көмекшісін аргумент ретінде бере отырып жатату мүмкін. Әзірлеуді күн мен уақытты теңшелу үшін diff() әдісін пайдаланыңыз. Ол сізге көмекші жасау үшін DateInterval көмекшісін қайта береді, оны көрсету өте оңай болар.

<?php
// $start көмегіні құрып, бір ай мен 6 күнді қосып алу үшін
$end = clone $start;
$end->add(new DateInterval('P1M6D'));

$diff = $end->diff($start);
echo 'Аралық: ' . $diff->format('%m ай, %d күн (жалпы: %a күн)') . PHP_EOL;
// Аралық: 1 ай, 6 күн (жалпы: 37 күн)

DateTime объектілерінде стандартты салыстыруларды қолдану мүмкін:

<?php
if ($start < $end) {
    echo "Бастау күні соңгы күнге айналмайды!" . PHP_EOL;
}

DatePeriod класын көрсету үшін соңғы мисал. Ол кайталанатын оқиғаларды арында итерация жасау үшін пайдаланылады. Ол қарапайым DateTime объектілерін, бастау мен аяқтын DateTime объекттерін, және олардың арасындағы барлық оқиғаларды қайта қайтару үшін интервалды алуы мүмкін.

<?php
// $start мен $end арасындағы барлық бейсенбілерді шығару
$periodInterval = DateInterval::createFromDateString('first thursday');
$periodIterator = new DatePeriod($start, $periodInterval, $end, DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
    // периодтың көзіндегі күндерді шығару
    echo $date->format('Y-m-d') . ' ';
}

Танымал PHP API кеңістігі - Carbon. Ол DateTime класының барлығын алмасыз айналдыруына ие болады, сондай-ақ ешқандай код өзгерісі көрсетпейді, бірақ әм extra мүмкіндіктерді қосуына ие болады: Локализацияны оқыту, DateTime объектісін қосу, алатыну және тарату әдістерінің тауарлары, сіздің кодыңызды тестілеу үшін сіздің таңдалған күн мен уақытты имитациялау.

Дизайн үлгілері

Сіздің бағдарламанызды құруда кодыңызда жиі қолданылатын үлгілер мен барлық проектіңіздің жалпы үлгілерін қолдану көмекші болады. Қолданылатын үлгілерді пайдалану маңызды, себебі оларды өңдеу көп ұзақ қатар көмек көрсетеді және басқа дайын өңдеушілерге қалай барлықты біріктіруге көмек көрсетеді.

Егер сіз фреймворк пайдалансаңыз, онда көлемді код мен проекттік үлгі структурасы көмекшісімен болады, сондықтан үлгі қабылдамалары көпшілігі сізді үшін жасалады. Бірақ сізге төменгіден фреймворкты қолданбайтын кодыңызда өзіңізге ең жақсы үлгілерді таңдау қалды. Басқа жағында, сіздің өзіңіздің бағдарламанызды құру үшін сізге қауіпсіз болатын үлгілерді табу керек.

PHP дизайн үлгілері туралы көбірек ақпарат алу және жұмыс істеу мисалдарын көру үшін төмендегі сілтемелерді пайдалана аласыз:

UTF-8-мен жұмыс істеу

Бұл бөлім алдында жазылды Alex Cabal сайты PHP үздік бағдарламалары жөніндегі материалды қолданып, біздікіні жасау үшін пайдаланылды.

Бір жолдырым жоқ. Есте сақтау, толық жаттығу, және тексеру өтінеміз.

Ақшаулы дайында PHP төмендегі деңгейде Юникодты қолдамайды. UTF-8 жолдарының дайындары менін орындау үшін жолау жасау көмегі көмек көрсетулері бар, бірақ бұл жай қалайтын болып табылады, және оның үшін веб-апп-тың көздерінен, HTML-ден SQL-ге дейін жақсарту қажет. Біз кысқаша, әмбебаптың барлық деңгейлеріне тигіз, практикалық түсінік көрсетеміз.

PHP деңгейінде UTF-8

Ең жалпы көмектерге, мәселен, екі жолды біріктіру мен мәндерге жолайтындамайтын көмек көрсету қажет емес. Бірақ, көптеген жолдарды қолдамайтындау үшін, мысалы, strpos() және strlen() сияқты жол әдістерге арналған mb_* үлгісі бар. Мысалы, mb_strpos() және mb_strlen(). Бұл mb_* жолдарын сізге Көпбайттық жол Қоспасы арқылы қолжетімді болады, және бастапқымдарды Юникодты қолдайтын дайындамалар ретінде жасауға арналған.

Сізге Юникодты қолдайтын кезде барлық уақытында mb_* әдістерін қолдану қажет. Мысалы, егер сіз UTF-8 жолында substr() пайдалансаңыз, нәтижесінде кейбір алдыңғы символдарды алаңдауышты көрсететін қиғаш қайтарайды. Қолдануы көмекші функция болатын mb_substr().

Ең қиын бөлігі әр уақыт mb_* әдістерін пайдалану қажет екендігін еске салу. Тек бір рет ұмытсаңыз, сіздің Юникодты қолдайтын жолындау барлық жалған жасау өткенде тиіп береді.

Барлық жолдардың mb_* қоспасы болмайды. Олар болмаса, сіз не істеуіге ымырау шығаруымыз болуы мүмкін.

Сіз көмекші функцияларды пайдаланарымды жасаушы скриптінің төменгі көрінісіне (немесе тегін көмекші скриптінің төменгі көрінісіне) mb_internal_encoding() функциясын пайдалану көмек көрсететін өтінеміз, және скрипт сіздігін браузерге шығаруда, онда mb_http_output() функциясын пайдалану қажет. Сіздің жолдарыныздың кодировкасын өзгерту үшін көмекші функцияны өтінеміз. Мысалы, htmlentities() функциясында кодировка параметрі бар, сізге бұл жолдармен әмелдеуді өзгерту үшін UTF-8-ді таңдауыңыз көмек көрсететін. Әрекетті PHP 5.4.0

Дереккөз деңгейінде UTF-8

Егер сіздің PHP скриптіз MySQL-ге қатысса, жоғарыда көрсетілген барлық сауаттылықтарды сақтайтын кезде, сіздің жолдарыңыздын базада қарауысыз болуы мүмкін.

Сіздің жолдарыңыздың PHP-дан MySQL-ге UTF-8 ретінде өтуіне рұқсат беру үшін, сіздің дереккөз және кестелеріңізді әрдайым utf8mb4 символдық жиынтығы мен калыптыруынан тауып, PDO қосылым жолында utf8mb4 символдық жиынтығын пайдалануыңыз көмек көрсететінін тексеріңіз. Төмендегі мысал кодты көріңіз. Бұл ажыратылмайтын маңызды.

Есте салу үшін толықтыру үшін, сізге толықтыру мақсатында UTF-8 қолдану үшін дереккөз және кесте utf8mb4 символдық жиынтығы мен калыптыруларын пайдалану қажет, және PDO қосылым жолында utf8mb4 символдық жиынтығын пайдалану қажет, мысал кодты тексеріңіз. Бұл критикалық маңызды.

Ескерту: толықтыру үшін толықтаймыз, толықтыру үшін энциклопедияны оқыңыз.

Браузер деңгейінде UTF-8

PHP скриптізініздін UTF-8 жолдарын браузерге шығару үшін mb_http_output() функциясын пайдаланыңыз.

Содан кейін браузерге HTTP жауапты арқылы бетті UTF-8 ретінде қарайтын деп білдірме қажет болады. Бүгінде, бұлдай HTTP жауабында пернетау өлшемін жасау үшін көмекші болып табылады:

<?php
header('Content-Type: text/html; charset=UTF-8')

Бұны қамтиды үшін қайырлы болуы мүмкін:

<?php
// PHP-ге біз UTF-8 жолдарын скрипт аяқталғана дейін пайдалану үшін айтамыз
mb_internal_encoding('UTF-8');
$utf_set = ini_set('default_charset', 'utf-8');
if (!$utf_set) {
    throw new Exception('default_charset параметрінің бағытын utf-8 ретіне орнату мүмкін болмады, онда оны системаңыздан барлық көз жүгіртіңіз!');
}

// PHP-ге біз браузерге UTF-8 ретінде шығаратын дейін болатындай айтамыз
mb_http_output('UTF-8');
?>

Бұл соңғы код арқылы, PHP скриптізініз браузерге UTF-8 ретінде шығаратын дайындалады.

<?php
// PHP-ге біз скрипт аяқталғана дейін UTF-8 жолдарын пайдалану дегенімізді айтамыз
mb_internal_encoding('UTF-8');
$utf_set = ini_set('default_charset', 'utf-8');
if (!$utf_set) {
    throw new Exception('default_charset параметріні utf-8 ретіне орнату мүмкін болмады, онда оны системаңыздан барлық көз жүгіртіңіз!');
}

// PHP-ге біз браузерге UTF-8 ретінде шығаратын дейін болатындай айтамыз
mb_http_output('UTF-8');
 
// Біздің UTF-8 тексеру строкасы
$string = 'Êl síla erin lû e-govaned vîn.';

// Стрингді кейінгі әдістермен ауыстыру үшін многобайтты әдісті пайдаланамыз
// Әдепкі бойынша сізге көмек үшін стрингді бір аласарында кесілгендігімізді көрсетеміз
$string = mb_substr($string, 0, 15);

// Сіздің стрингді сақтау үшін базаға қосылу үшін байланысты анықтау
// Толық ақпарат үшін осы жобадағы PDO өрнегін көріңіз
// Дайындашу Келісім (DSN) дегенде `charset=utf8mb4` болуы керек
$link = new PDO(
    'mysql:host=сіздік-мекенжайыңыз;dbname=сіздік-ұжымыңыз;charset=utf8mb4',
    'сіздік-пайдаланушы-аты',
    'сіздік-кілтсөзі',
    array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT => false
    )
);

// Біздің ауыстырылған стрингді UTF-8 ретінде сақтау үшін
// Сіздің база және кестелері UTF-8 символдар жинағы және көлемінде болуы керек, деген сияқты?
$handle = $link->prepare('insert into ElvishSentences (Id, Body, Priority) values (default, :body, :priority)');
$handle->bindParam(':body', $string, PDO::PARAM_STR);
$priority = 45;
$handle->bindParam(':priority', $priority, PDO::PARAM_INT); // явным образом говорим pdo, что ожидаем int
$handle->execute();

// Мына жасалған стрингді оларын бізге дайындалып шығармайтын бір объектке сақтау үшін
// Осы объектті HTML-де көрсету үшін кейбір дайындалып шығаруды дайындамау
function escape_to_html($dirty){
    echo htmlspecialchars($dirty, ENT_QUOTES, 'UTF-8');
}

header('Content-Type: text/html; charset=UTF-8'); // Сіздік default_charset параметрі UTF-8 ретіне орнатылған болмаса үшін қажет емес
?><!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>UTF-8 тест беті</title>
    </head>
    <body>
        <?php
        foreach($result as $row){
            escape_to_html($row->Body);  // Бұл біздің ауыстырылған UTF-8 стрингімізді браузерге дайындайтында өнімді табу үшін дайын шығаруы керек
        }
        ?>
    </body>
</html>

Көбірек оқу

Халықаралықтықтандыру (i18n) және Жергіліктіру (l10n)

Жаңа келгендерге келген кеңес: i18n және l10n - бұл сандарды пайдалану арқылы сөздерді қысқарту жолымен көмек көрсету үшін пайдаланушыларға берілетін салу. Біздің өзіміздін бас тарту жолымен, халықаралықтықтандыру i18n болады, жергіліктіру - l10n.

Алдымен, біздің есептеулерге келісу керек: жаттамаларды басу кезінде басым келтірмейді, әзірлеу адамдарының кодты олардың жаттамаларына жатамасыздандыру үшін қалыптасу кезінде.

уралы екі көпірлеу формасы бар - сіз бірден бесіге дейін көпірлеу формасы бар тілдерді таба аласыз, соларының арасында словен, ирланд, араб, онымен айнымалы тілдер де бар.

Әдеттегі реализациялау жолдары

PHP бағдарламасын халықаралықтандырудың ең оңай жолы - массив файлдарын пайдалану мен оларды шаблондарда пайдалану, міне, <h1><?=$TRANS['title_about_page']?></h1> сияқты. Бұл жол серьезді жобалар үшін дайын дайын болмауы тиіс, бірақ кейде қажетті жаңа тилді тағытуы бар өтініштерге салыстырылуы мүмкін - олардың кейінгі бірінші кезде тұрмауы мүмкін, мисалы, көпірлеу. Сондықтан, мысалды дайында қосалғанда көбірек болады деп табасаңыз, жақсарту туралы білгілерді айырымашылықтыра алмайсыздар. Также, егер жобаңызда артықшы бірнеше беттер болары көрсетсе, мысалы, мынандай бір мәселе болары бар.

Халықаралықтықтандыру және жергіліктіру үшін өте ықтималдаулы әдет тәсілі және қажетті жоқ көлемге иесіз Gettext аталатын Unix құрылғысы болады. Ол 1995 жылы келді, сонымен қатар программаны тілдеу үшін толық реализацияны ұсынады. Оны іске қосу өте оңай, сондықтан да ерекшеліктерге қолдау көрсетеді. Біз осында Gettext туралы сөйлесеміз. Сіздің команда қатарынан толтыруды жатты аладымайтын болмайтын болмаса аларды басқару үшін пайдалануға арналған жақсы GUI қолданбасын ұсынамыз.

Басқа құралдар

Бірнеше көлемдерді Gettext мен басқа i18n ұжымдарын қолдау көрсететін өзге кітапханалар бар. Олардың кейбірі орнатуын немесе әмбебаптық мүмкіндіктер немесе i18n файл форматтары бойынша қосымша мүмкіндіктерді ұсынуы мүмкін. Бұл документтегі басқа құралдарды PHP жасауы мен сұрау көрсетуді ұсынуға арналған, бірақ біз осында толықтыруды үшін басқаларды көрсетеміз:

Басқа фреймворттарда сондай-ақ өзге і18n модульдері болады, бірақ олар олардың код базасынын сыр

ттан тыс жасау қажет:

Gettext

Орнату

Gettext мен оның байланысты PHP кітапханасын орнату үшін apt-get немесе yum дайындайтын пакетке жасау көрсететін көмекшініз бола алады. Орнатылғаннан кейін, оны php.ini файлына extension=gettext.so (Linux/Unix) немесе extension=php_gettext.dll (Windows) қосау арқылы іске қосуға болады.

Бұл жерде біз аймақ файлдарын жасау үшін Poedit программасын да қолданамыз. Оны сіздің жүйесініздегі пакеттік басқарушыда табасыз, ол Unix, macOS және Windows үшін қолданылады және сондай-ақ тегін орнату үшін жүйесініздің веб-сайтынан тегін жүктеп алуға болады.

Құрылыс

Файл түрлері

Gettext барысында жұмыс істеуді көзделетін үш файл бар. Онымен ажыратымды “аударылған объекттерді” көрсететін PO (Portable Object) және оның басқа Gettext-ты түсіргенде толықымаған объекттерді интерпреттіру қылатын MO (Machine Object) файлдары бар. Сонымен қатар, сіздің басылмалар файлдарындағы барлық кілттерді қамтып, барлық PO файлдарын жасау мен жаңарту үшін нұсқау файлы болатын POT (Template) файлы бар. Осы шаблонын файлдары міндетті емес: сіз i18n істеу үшін пайдаланатын құралға байланысты, сіз тек PO / MO файлдарымен болсаңыз, көмек көрсете аласыз. Сізге өз тіліңіз мен аймақты үшін сізге өзінізге бір PO / MO файлдары жасау үшін тегін тек көпірлік көрсететін PO / MO файлдарына салмауы керек, бірақ бір доменге тек бір POT файл болады.

Домендер

Ұлкен жобаларда, сәйкесі бір мәтін бір бағытты көздігі дайындырады деп сенімді мүмкіндіктер бар. Олай болмаса, оларды біріктіргенде, оларды біріктіріп алу үшін оларды өзара айырысуы көзделіп тұрады. Бұлай дайындалатын домендер. Олар, саудалы POT / PO / MO файлдардың аты болатын атаулар бар жерде, аударма домені деп аталады. Кіші және орта өлшемді жобалардың көбі, саулық пен қарапайымдылық үшін тек бір доменді пайдаланады; оның атауы ерекше, бірақ біз код көмегімен “main” деп аталатын. Мысалы, Symfony проектілерінде домендерді синтаксис жасау үшін пайдаланады.

Локаль код

Локаль - бұл әдістеме коды, жалпылықта бір тілдің бір нұсқасын белгілейді. Ол ISO 639-1 және ISO 3166-1 alpha-2 стандарттарына сәйкес көмекші кодпен анықталады: тіл үшін екі кіші әріп, таңдалған жер немесе аумақ кодының астында қойылып жататын екі жоғары әріптер. Еділ тілдер үшін үш әріп пайдаланылады.

Қандай да бізге, мемлекет бөлімі оларға қалайды деп саналатын болса да, бұл себепсіз. Себебі, кейбір тілдердің бірден біреуді мемлекеттер арасында диалекттері бар, масалан, Австриялық неміс (de_AT) не Аустралиялық португал (pt_BR). Екінші бөлімді тіл диалектері арасында бөлісу үшін пайдаланылады; қолда болмаса, ол тілдің “жалпы” немесе “қосымша” нұсқасы ретінде алынады.

Көзіре түзету

Gettext пайдалану үшін бізге көмек көрсету үшін анықталған папка ұзақтығынан сақтауға міндетті боламыз. Алга тапсырыс бойынша, көмек көрсету үшін өздігініздің көзірек сақтау аймағын таңдауыңыз көрінеді. Оныны ішінде, қажетті көзіректі таңдау үшін барлық көзіректеріңіздің бірі үшін жасалған LC_MESSAGES аймағы болады, оның ішінде барлық PO/MO жиынтығын қамтып қоймасыздар. Мысалы:

<project root>
 ├─ src/
 ├─ templates/
 └─ locales/
    ├─ forum.pot
    ├─ site.pot
    ├─ de/
    │  └─ LC_MESSAGES/
    │     ├─ forum.mo
    │     ├─ forum.po
    │     ├─ site.mo
    │     └─ site.po
    ├─ es_ES/
    │  └─ LC_MESSAGES/
    │     └─ ...
    ├─ fr/
    │  └─ ...
    ├─ pt_BR/
    │  └─ ...
    └─ pt_PT/
       └─ ...

Көпшіліктерді тауып шалу

Кіріспенінде айтқанымыздай, өзара тілдердің көпшіліктерге арналған ережелері айтылуы мүмкін. Бірақ gettext бізді қайсысыншама келісімнен құтылар. Жаңа .po файл құру кезінде сізге ол тіл үшін көпшіліктердін ережелерін анықтау көрсету қажет болады, және көпшіліктерге ұқсау көтеретін аудармаларды өзара ережелер бойынша аларды анықтау қажет болады. Кодда Gettext-ты шағымдау кезінде сан байланысты көмегімен шақырмаларды көлдену кезінде, сізге сөйлесімге арналған сан беру қажет болады, және ол өзі автоматты түрде пайдалану керек - өйткені сізге көмегі көрсетілсе, сіз оны орындау үшін дұрыс пішіндіретінді.

Көпшіліктер ережелері көпшіліктердің саны мен қажетті болатын мағынасы бойынша санайтын n анықталған бұзылмасы мен бір boolean тестті ішкі сауалмен қамтамасыз етеді (0-дан бастап санау). Мысалы:

Көпшіліктер ережелеріні қалай жұмыс жасауымызды айттық - және сіздердің түсінбегеніміз болмаса, мына LingoHub нұсқаулығын көрсеңіз де, сізге оларды қолдану үшін қажетті тізімнен көшірме жасау қажет.

Саншаушы сөйлемдермен Gettext-ты локалдау кезінде шағымдау көтеру кезінде, сіздің оныңмен байланыстырылатын санын көрсету қажет болады. Gettext оған қалыпты ереже қандай болуы керекпесін жұмыс істейді, және дұрыс локализацияланған нұсқасын пайдаланады. Сіздің .po файлыңызда анықталған көпшіліктерге арналған өзара сөйлемді қосу қажет болады.

Намыс іске қосу

Барлық осылай теориядан кейін, бір аз практикалық болайымыз. Бұл - .po файлдың көрінісі; сіз онының пішінінен көмек көрмей, бетінді мазмұнмен көмек көресіздер; сіз кейінгірінде оны өңдегіңізді көресіз:

msgid ""
msgstr ""
"Language: pt_BR\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

msgid "We are now translating some strings"
msgstr "Біз қазірдікі бірнеше тізбектерді аудара бастауымыз"

msgid "Hello %1$s! Your last visit was on %2$s"
msgstr "Сәлем %1$s! Соңғы жаттығыз %2$s күні болды"

msgid "Only one unread message"
msgid_plural "%d unread messages"
msgstr[0] "Тек бір оқыма жаттық"
msgstr[1] "%d оқыма жаттық"

Бірінші бөлім - басқа бойда толықтырмайды, мұнда msgid мен msgstr орнымен арнайы бос болып табылады. Бұл файлдың кодтауын, көпшіліктерді және басқаларды таңдауға көмек көрсету үшін мәндерді анықтау үшін. Екінші бөлім, ағылшыннан бразилия португал тіліне сімпле сөзді аудару әдістемесін тарату үшін пайдаланылады, мекенжай мен кіру уақытын қосу арқылы sprintf функциясын пайдаланып. Соңғы бөлім - көпшіліктердің мөлшерлік нұсқаларының мазмұны, ағылшын тіліндегі msgid қанағаттарын мен олардың соответствующные көпшіліктерінің msgstr 0 мен 1 ретінде көрсету. Осы жерде %d арқылы сан өзара ауыстырылғанымен тікелей сөйлемде көрсетіледі. Көпшіліктердің мөлшерлік нұсқалары менімен бірге қайқы жаттықты пайдаланбасаңыз, алты мекемені өз тілінің аймақты тілі болмасын дайындау қажет.

l10n кілттері туралы шығармашылық

Сіздің көрудігіңіздей, біз қолданамызда сипаттаманың ішінде іске қосымызға айналдырылатын ингіліс тілінде анықталған сөйлемді қолданамыз. Осы msgid барлық сіздің .po файлдарыңызды аудару кезінде тең калады, басқа тілдерде олардың бағдарлама мен msgstr жолдарымен бірдей пішінде болады.

Тілдеме кілттері туралы сөйлескенде, бұл жерде екі негізгі “мектеп” бар:

  1. msgid -ді тік сөйлем ретінде қолдану. Бас плюсы:
    • өте көптеген тілде сөздік болмауы салынған болса, көйінді тілдердегі көйлеген msgid сөздігі орындастырар. Мысалы: егер сіз ағылшыннан испан тіліне ағылшынша сөйлемдерді бойынша тіркеусіз аударып алған болсаңыз, жаңа бетті көшіріп болатында веб-сайтынын бірыңғай бөлімдері ағылшын тілінде көрсетіледі;
    • аударушы қandau жаттығумен не болғанын түсіну үшін, тілмаштырушы үшін нысанды көру көп оңай;
    • бір тіл үшін «тегін» l10n - сорттыру;
    • тегін тілтамасы келсе, бірдей бір msgid текстін көпті файлдарда ауыстыру керек.
  2. msgid -ді уникальды, белгілі орындалған кілт ретінде қолдану. Ол сөйлемнің бағдарламада орын алуы меніңізге, сөздік мазмұнды шаблондық логика менің ішінен айырмасы боларымызды айырмаштыру үшін үлкен жол.
    • бірақ ол келісімшеушіге қандай болмаса, мазмұнды түсінгені жоқ. Бас тіл файлының басынан басшыны алу қажет болар. Мысалы: дайын өзгеріссіз француз тіліне аударып алу үшін девелопердің en.po файлына қарау жасауы керек.
    • көшірме тіркеулер экранда сөйлемсіз кілттерді көрсетеді (top_menu.welcome дегенде көрсетілмеген француз тілінде Сәлем, пайдаланушы! дегенде). Бұл сайтты жариялау алдымен толық болуы үшін жақсы, бірақ интерфейсте тілдеме мәселелері аса махаббатсыз болар. Бірақ бірде, бұлардың басқаруды көру үшін бір тілді “fallback” тілі ретінде белгілеме опциясын қосу мүмкіндігі жасалған.

Gettext нұсқаулығы өзгеріссіз жаттырушы жаттырылған әдісті қолдайды, өйткені ол мамандандырушы және пайдаланушылар үшін ыңғайлы болуы мүмкін. Бұл мында көрсетілген жаттырушы мәселелеріне сабақ беру үшін өздігімізде оны қолдамаймыз. Бірақ [Symfony нұсқаулығы](https://

symfony.com/doc/current/translation.html#using-real-or-keyword-messages) тілде байланыс жасаушы тілдерге жаттырылмасыз тілдерге тиесілі алып қола қауіптізді енгізуге болатын кілттерге баюлай береді.

Көнделікті пайдалану

Дәйек жаттығумен, тиіпті бір қолданбада сіз парақтарыңызда статикалық мәтіндерді жазуда кейбір Gettext функцияларын пайдаланасыз. Ол сөйлемдер дайын .po файлдарында пайда болар, аударыларып, .mo файлдарына компиляциялау жасаулап, онда Gettext оларды интерфейсін жасау кезінде пайдаланады. Бұл бойынша, біз өзіміздікімізді дайында көрмегендерді бір етаптармен тәржіме жасау үшін қандай қолдануымызды анықтау керек:

1. Бір мысалды тақырып файлы, өзара айырмашылық Gettext шағымдарын қамтымайды

<?php include 'i18n_setup.php' ?>
<div id="header">
    <h1><?=sprintf(gettext('Қош келдіңіз, %s!'), $name)?></h1>
    <!-- код тек бетбұрылысы үшін осы түрде болады -->
    <?php if ($unread): ?>
        <h2><?=sprintf(
            ngettext('Тек бір оқыма жаттық',
                     '%d оқыма жаттық',
                     $unread),
            $unread)?>
        </h2>
    <?php endif ?>
</div>

<h1><?=gettext('Кіріспе')?></h1>
<p><?=gettext('Біз қазірдікі бірнеше тізбектерді аудара бастауымыз')?></p>

2. Мысалды орнату файлы (i18n_setup.php, жоғарыда қолданылды), дәл Gettextты таңдау және конфигурациялау

<?php
/**
 * Берілген $locale көмекші тілді беру үшін тексеру
 * @param string $locale
 * @return bool
 */
function valid($locale) {
   return in_array($locale, ['en_US', 'en', 'pt_BR', 'pt', 'es_ES', 'es']);
}

// басқа, мәлімет беру мақсатында бас тілді таңдау
$lang = 'en_US';

if (isset($_GET['lang']) && valid($_GET['lang'])) {
    // тілді сұрау-тізім арқылы өзгерту мүмкін
    $lang = $_GET['lang'];    // бұны қамтыптау көрсетілімі көрсетілмейді!
    setcookie('lang', $lang); // бұл кейбірдікі пайдалану үшін сақталады
} elseif (isset($_COOKIE['lang']) && valid($_COOKIE['lang'])) {
    // егер сақтау көрсетілген болса, біз оны өзгертуге мүмкіндік бермейміз
    $lang = $_COOKIE['lang']; // бұны қамтыптау көрсетілімі көрсетілмейді!
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    // әдепкі: браузердік пайдаланушының қабылдау ететін тілдерді іздеу
    $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ['-' => '_']); });
    foreach ($langs as $browser_lang) {
        if (valid($browser_lang)) {
            $lang = $browser_lang;
            break;
        }
    }
}

// осы жерде біз табылған тілге байланыстыру үшін глобалды жүйе тілді белгілейміз
putenv("LANG=$lang");

// мәнді көру үшін бұл өмірде анықталған тілі
setlocale(LC_ALL, $lang);

// бұл Gettextтың ../locales/<lang>/LC_MESSAGES/main.mo файлын іздеуін таңдайды
bindtextdomain('main', '../locales');

// файлды оқу үшін кодтау кодты анықтарылған
bind_textdomain_codeset('main', 'UTF-8');

// өтінішті әкімші тілдік вызовдар қаржылататын жасау файлын білдіретін жер
textdomain('main');

// бұл  forum.mo файлын main.mo файлының орнына іздеуін білдіреді
// echo dgettext('forum', 'Қош келдіңіз!');
?>

3. Бірінші іске қосу үшін аударманы дайындау

Gettext-тың өзге фреймворк i18n пакеттеріне қатар қолайлы және қуатты файл пішімі бар. “Ох, енді бұлды түрлендіру мен басқау пакеттері үшін дайын естуі мүмкін, қолмен түзетуі жатқан аралас алмайды. Ұзаққа аз көмек көрсете алар деп едіңіз бе?” Алдамайық, Poedit сияқты бағдарламалар сізге көмек көрсету үшін маңызды. Сіз осы бағдарламаны оның веб-сайтынан алып тастауыңыз көмек етеді, бұл тегін және барлық платформалар үшін қол жетімді. Оны қолдану үшін бұл бірде ыңғайлы, содан кейінді күшті бір құрал - барлық мүмкіндіктерін пайдалану.

Бірінші іске қосу кезінде сіз менюдан “Файл > Жаңа…” дегенді таңдауыңыз керек. Сізге тіл туралы сұрау сұралатын болады: бұл жерде сіз көрсету көмекшілігі арқылы аудару келген тілді таңдауға болады, немесе біз алдын айтып отырған форматты пайдалана аласыз, мысалы, en_US немесе pt_BR.

Ақылайтын сақтау - бұлай басу. Содан кейін “Жатты анықтау” түймесін басу керек, жасау және тілдеу үздіктері үшін көптеген параметрлерді күмәнді пайдаланасыз. Оларды сіз “Каталог > Мұраяты” арқылы көре аласыз:

4. Тілдеулі сөздерді аудару

Өткенде көрдіңізді айтарымыз, тілдеулі сөздерді басқару үшін екі басым түрі бар: жалпы, және көпшіліктер. Бірінші түрдің ашық жаталғаны, көздеу мен тілдеулі сөздерін көрсету үшін екі теріс басым бар. Басқа теріс басымдарды ресіздеу үшін сіздің көзге көмекшілігіңіз жоқ - сіздің көзге көмекшілігіңіз мен айналаса беретіні біздікінен ауызша алдау көрсетуі керек - сіз мүмкін, біздікімізді өзгертуіңіз керек және файлдарды қайта скандау көрсетуі керек. Пайдаланушы көмекшісі: сіз тілдеудің жолдас сызбасын баса отырып, ол сізге осы сызбаны жатты жерінен жөндеу жасау немесе сұрау жасау көмекшілігін аударары.

Сол барысы, өтінішті жаталған сөздерді тазартуды көрсете алған боларсыздарын өзгертуге көмекші болу үшін “Жаңарту” түймесін басыңыздар, Poedit кодты қайта скандау жасау, жоқ болатын жазбаларды алып тастау, өзгергендерді бірігіп көрсету мен жаңа сияқты өзгерістерді қосу. Содан кейін, басқа жаталғандарды және сіз жасаған жаталқандарды көмек көрсету үшін қарап тұрар, олардың жаталғандығы мен өзгергендігі белгіленеді, тізбекте алтынмен көрсетіледі. Сіздің тілдеу командасы бар болса және көмекші қандай жазау көмек істеуді білмесе, тек жатты білдіру, мен тым мендік біреу көрмейдігі жерді қоса отырып, кейін мен басқалар қарау жасайды.

Соңда, сізге "Көру > Тілдеулі енгізу бірінші"ді таңдау қалпынан барыттырылған, сізге көмек көмек көрсетеді. Онымен менюдан, сізді қажетті болуы керек болмаса да, өзіңіздің тілдеушіге контекстілік ақпаратты қалдыра аларсыздармен қалай келуіндігін білу үшін бекітілген.

Кеңес & Кідірткілер

Мүмкін болатын кештеу мәселелері

Егер сіз Apache (mod_php) үстінде PHP қосымшасын іске қоса алсаңыз, сізге .mo файлын кештенумен мәселе пайда бола аларсыз. Бірақ бұл оны ашу кезінде оқылады, содан кейін, оны жаңарту үшін серверді қайта іске қосу қажет бола ала майды. Nginx мен PHP5-те бұлдан басқа бірнеше бетті қайта жаңарту кешін жаңарту үшін көбірек беттерді жаңарту қажет болады, және PHP7-де сондай-ақ аз пайдаланылады.

Қосымша көмекші функциялар

Көптеген адамдардың таңдауы бойынша, gettext() орындауынан _() пайдалану жаттылықтың ең асығы болады. Мысалы, көпшілікті фреймворктардың көмекші i18n кітапханалары да салыстыру кодты қысқарту үшін t() сияқты не басқа несіздік функцияларды пайдаланады. Бірақ бұл жаттылықты ортақтығы бар функция. Сіздің проектіңізге, мысалы, __() несіздік функциясын не _n() үшін ngettext(), не де аламымды gettext() мен sprintf() шақымдасатын жасау үшін _r() сияқты басқаларды қосу үшін өтініштерді көрсете аласыз. Әрекеттерді басу, мысалы, php-gettext басқа Gettext барлық осыдай көмекші функцияларды көрсетеді.

Осы мәселеулерде, сізге Gettext көмекшісіне осы жаңа функциялардан өтініштерді қалай шығаруыны оқуы қажет. Қорлым паузасыз, бұл тым жедел. Бұл .po файлдағы кестеде немесе Poedit дегенде баптау экранында болады. Редакторда осы параметр “Каталог > Мүраяты > Қалпы айырысқандар” ішінде болады. Естесіздік тілдер үшін Gettext көмекшісінің әдепкі функцияларын білген боларысыз, дегенмен, бұл тізбегі бос көрініп тұрса да, қорлымдар болмайсыз. Осы жаңа функцияларды бұларда көрсету қажет. Бұлардың анықтамаларын ағымдағы белгілі пішімдегі орналастырып көріңіз:

мен шағыту кезінде жаттығушыны шақыруымыз келсе: __('бір пайдаланушы', '%d пайдаланушылар', $number), оны бірінші форма бірінші аргумент ретінде көрсетеміз, және егер көмек қажет болса, қошымаша баған түрінде __:1,2 деп көрсетеміз, бірінші форма бірінші жаттығушы, екінші форма екінші жаттығушы болатын деп көрсетеміз. Әгер сіздің саны бірінші аргумент ретінде келсе, спецификация __:2,3 боларысыз, бірінші форма екінші аргумент ретінде болады, және басқа несіздік туралы.

Сілтемелер