-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcoding_practices.html
455 lines (416 loc) · 94.6 KB
/
coding_practices.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome file</title>
<link rel="stylesheet" href="https://stackedit.io/style.css" />
</head>
<body class="stackedit">
<div class="stackedit__left">
<div class="stackedit__toc">
<ul>
<li><a href="#кодтау-практикасы">Кодтау практикасы</a>
<ul>
<li><a href="#негізгі-принциптер">Негізгі принциптер</a></li>
<li><a href="#күн-мен-уақыт">Күн мен Уақыт</a></li>
<li><a href="#дизайн-үлгілері">Дизайн үлгілері</a></li>
<li><a href="#utf-8-мен-жұмыс-істеу">UTF-8-мен жұмыс істеу</a></li>
<li><a href="#халықаралықтықтандыру-i18n-және-жергіліктіру-l10n">Халықаралықтықтандыру (i18n) және Жергіліктіру (l10n)</a></li>
<li><a href="#әдеттегі-реализациялау-жолдары">Әдеттегі реализациялау жолдары</a></li>
<li><a href="#gettext">Gettext</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="stackedit__right">
<div class="stackedit__html">
<h1 id="кодтау-практикасы">Кодтау практикасы</h1>
<h2 id="негізгі-принциптер">Негізгі принциптер</h2>
<p>PHP — бұл барлық деңгейдегі көмек көрсетушілерге кодты тек жаттау жоғары дауыс жасауға мүмкіндік беретін жиі тіл. Бірақ тілді бірінші рет (немесе көмекшілік етуге) оқып қалған жағдайларымызды қысқаша жолмен жаттау жаттығырақ қолдану, жасау қателіктері жоғары арттырып кететінімізге жол ашатамыз. Осы жиі болушы байланысты жаттыру үшін бұл бөлімді PHP-дағы негізгі кодтау практикаларына еске тарту нысаналанған.</p>
<ul>
<li><a href="https://phptherightway.com/pages/The-Basics.html">Толығырақ оқу үшін</a></li>
</ul>
<h2 id="күн-мен-уақыт">Күн мен Уақыт</h2>
<p>PHP-де күн мен уақытты оқу, жазу, салыстыру немесе есептеу кезінде Сізге көмек төменгі DateTime атында клас бар. DateTime-дың алдын алуымен байланысты PHP-да көптеген күн мен уақытты қамтамасыз ерекше функциялар бар, бірақ ол көпшілікке қолданатын адамдар үшін сыйлаушыы болады. DateTime уақыт зоналарымен байланыстырылуы болатын, бірақ бұл кысқаша көмекшінін шектеуді мазмұн етеді.</p>
<p>DateTime-мен жұмыс істеуге бастау үшін жалпы күн мен уақыт тарихі мен уақытын арнайы көмекшіге айналдыру өнімін қолданып, <code>createFromFormat()</code> фабрикалық әдісін немесе ағымдағы күн мен уақытты алу үшін <code>new DateTime</code> көмекшісін пайдаланыңыз. DateTime-ды қайта көру үшін <code>format()</code> әдісін пайдаланыңыз.</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token variable">$raw</span> <span class="token operator">=</span> <span class="token string">'22. 11. 1968'</span><span class="token punctuation">;</span>
<span class="token variable">$start</span> <span class="token operator">=</span> DateTime<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">createFromFormat</span><span class="token punctuation">(</span><span class="token string">'d. m. Y'</span><span class="token punctuation">,</span> <span class="token variable">$raw</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string">'Бастау күні: '</span> <span class="token punctuation">.</span> <span class="token variable">$start</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'Y-m-d'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span>
</span></code></pre>
<p>DateTime менеджерімен есептеу мүмкін. DateInterval класымен күн мен уақытты есептеу мүмкін. DateTime-де <code>add()</code> және <code>sub()</code> әдістері бар, оларға DateInterval көмекшісін аргумент ретінде бере отырып жатату мүмкін. Әзірлеуді күн мен уақытты теңшелу үшін <code>diff()</code> әдісін пайдаланыңыз. Ол сізге көмекші жасау үшін DateInterval көмекшісін қайта береді, оны көрсету өте оңай болар.</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token comment">// $start көмегіні құрып, бір ай мен 6 күнді қосып алу үшін</span>
<span class="token variable">$end</span> <span class="token operator">=</span> clone <span class="token variable">$start</span><span class="token punctuation">;</span>
<span class="token variable">$end</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DateInterval</span><span class="token punctuation">(</span><span class="token string">'P1M6D'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$diff</span> <span class="token operator">=</span> <span class="token variable">$end</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">diff</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string">'Аралық: '</span> <span class="token punctuation">.</span> <span class="token variable">$diff</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'%m ай, %d күн (жалпы: %a күн)'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span>
<span class="token comment">// Аралық: 1 ай, 6 күн (жалпы: 37 күн)</span>
</span></code></pre>
<p>DateTime объектілерінде стандартты салыстыруларды қолдану мүмкін:</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$start</span> <span class="token operator"><</span> <span class="token variable">$end</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string">"Бастау күні соңгы күнге айналмайды!"</span> <span class="token punctuation">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</span></code></pre>
<p>DatePeriod класын көрсету үшін соңғы мисал. Ол кайталанатын оқиғаларды арында итерация жасау үшін пайдаланылады. Ол қарапайым DateTime объектілерін, бастау мен аяқтын DateTime объекттерін, және олардың арасындағы барлық оқиғаларды қайта қайтару үшін интервалды алуы мүмкін.</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token comment">// $start мен $end арасындағы барлық бейсенбілерді шығару</span>
<span class="token variable">$periodInterval</span> <span class="token operator">=</span> DateInterval<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">createFromDateString</span><span class="token punctuation">(</span><span class="token string">'first thursday'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$periodIterator</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DatePeriod</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">,</span> <span class="token variable">$periodInterval</span><span class="token punctuation">,</span> <span class="token variable">$end</span><span class="token punctuation">,</span> DatePeriod<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">EXCLUDE_START_DATE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$periodIterator</span> <span class="token keyword">as</span> <span class="token variable">$date</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// периодтың көзіндегі күндерді шығару</span>
<span class="token keyword">echo</span> <span class="token variable">$date</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'Y-m-d'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token string">' '</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</span></code></pre>
<p>Танымал PHP API кеңістігі - <a href="https://carbon.nesbot.com/">Carbon</a>. Ол DateTime класының барлығын алмасыз айналдыруына ие болады, сондай-ақ ешқандай код өзгерісі көрсетпейді, бірақ әм extra мүмкіндіктерді қосуына ие болады: Локализацияны оқыту, DateTime объектісін қосу, алатыну және тарату әдістерінің тауарлары, сіздің кодыңызды тестілеу үшін сіздің таңдалған күн мен уақытты имитациялау.</p>
<ul>
<li><a href="https://www.php.net/book.datetime">DateTime туралы оқу</a></li>
<li><a href="https://www.php.net/function.date">Күн мен уақытты орналастыру туралы оқу</a> (рысқа алынған күн мен уақытты орналастыру үшін қабылданатын күн мен уақытты белгілеу жолдары)</li>
</ul>
<h2 id="дизайн-үлгілері">Дизайн үлгілері</h2>
<p>Сіздің бағдарламанызды құруда кодыңызда жиі қолданылатын үлгілер мен барлық проектіңіздің жалпы үлгілерін қолдану көмекші болады. Қолданылатын үлгілерді пайдалану маңызды, себебі оларды өңдеу көп ұзақ қатар көмек көрсетеді және басқа дайын өңдеушілерге қалай барлықты біріктіруге көмек көрсетеді.</p>
<p>Егер сіз фреймворк пайдалансаңыз, онда көлемді код мен проекттік үлгі структурасы көмекшісімен болады, сондықтан үлгі қабылдамалары көпшілігі сізді үшін жасалады. Бірақ сізге төменгіден фреймворкты қолданбайтын кодыңызда өзіңізге ең жақсы үлгілерді таңдау қалды. Басқа жағында, сіздің өзіңіздің бағдарламанызды құру үшін сізге қауіпсіз болатын үлгілерді табу керек.</p>
<p>PHP дизайн үлгілері туралы көбірек ақпарат алу және жұмыс істеу мисалдарын көру үшін төмендегі сілтемелерді пайдалана аласыз:</p>
<ul>
<li><a href="https://refactoring.guru/design-patterns/php">https://refactoring.guru/design-patterns/php</a></li>
<li><a href="https://designpatternsphp.readthedocs.io/en/latest/">https://designpatternsphp.readthedocs.io/</a> (<a href="https://www.computer-pdf.com/web-programming/php/924-tutorial-designpatternsphp-documentation.html">PDF жүктеу</a>)</li>
</ul>
<h2 id="utf-8-мен-жұмыс-істеу">UTF-8-мен жұмыс істеу</h2>
<p><em>Бұл бөлім алдында жазылды <a href="https://alexcabal.com/">Alex Cabal</a> сайты <a href="https://phpbestpractices.org/#utf-8">PHP үздік бағдарламалары</a> жөніндегі материалды қолданып, біздікіні жасау үшін пайдаланылды.</em></p>
<h3 id="бір-жолдырым-жоқ.-есте-сақтау-толық-жаттығу-және-тексеру-өтінеміз.">Бір жолдырым жоқ. Есте сақтау, толық жаттығу, және тексеру өтінеміз.</h3>
<p>Ақшаулы дайында PHP төмендегі деңгейде Юникодты қолдамайды. UTF-8 жолдарының дайындары менін орындау үшін жолау жасау көмегі көмек көрсетулері бар, бірақ бұл жай қалайтын болып табылады, және оның үшін веб-апп-тың көздерінен, HTML-ден SQL-ге дейін жақсарту қажет. Біз кысқаша, әмбебаптың барлық деңгейлеріне тигіз, практикалық түсінік көрсетеміз.</p>
<h3 id="php-деңгейінде-utf-8">PHP деңгейінде UTF-8</h3>
<p>Ең жалпы көмектерге, мәселен, екі жолды біріктіру мен мәндерге жолайтындамайтын көмек көрсету қажет емес. Бірақ, көптеген жолдарды қолдамайтындау үшін, мысалы, <code>strpos()</code> және <code>strlen()</code> сияқты жол әдістерге арналған <code>mb_*</code> үлгісі бар. Мысалы, <code>mb_strpos()</code> және <code>mb_strlen()</code>. Бұл <code>mb_*</code> жолдарын сізге <a href="https://www.php.net/book.mbstring">Көпбайттық жол Қоспасы</a> арқылы қолжетімді болады, және бастапқымдарды Юникодты қолдайтын дайындамалар ретінде жасауға арналған.</p>
<p>Сізге Юникодты қолдайтын кезде барлық уақытында <code>mb_*</code> әдістерін қолдану қажет. Мысалы, егер сіз UTF-8 жолында <code>substr()</code> пайдалансаңыз, нәтижесінде кейбір алдыңғы символдарды алаңдауышты көрсететін қиғаш қайтарайды. Қолдануы көмекші функция болатын <code>mb_substr()</code>.</p>
<p>Ең қиын бөлігі әр уақыт <code>mb_*</code> әдістерін пайдалану қажет екендігін еске салу. Тек бір рет ұмытсаңыз, сіздің Юникодты қолдайтын жолындау барлық жалған жасау өткенде тиіп береді.</p>
<p>Барлық жолдардың <code>mb_*</code> қоспасы болмайды. Олар болмаса, сіз не істеуіге ымырау шығаруымыз болуы мүмкін.</p>
<p>Сіз көмекші функцияларды пайдаланарымды жасаушы скриптінің төменгі көрінісіне (немесе тегін көмекші скриптінің төменгі көрінісіне) <code>mb_internal_encoding()</code> функциясын пайдалану көмек көрсететін өтінеміз, және скрипт сіздігін браузерге шығаруда, онда <code>mb_http_output()</code> функциясын пайдалану қажет. Сіздің жолдарыныздың кодировкасын өзгерту үшін көмекші функцияны өтінеміз. Мысалы, <code>htmlentities()</code> функциясында кодировка параметрі бар, сізге бұл жолдармен әмелдеуді өзгерту үшін UTF-8-ді таңдауыңыз көмек көрсететін. Әрекетті PHP 5.4.0</p>
<h3 id="дереккөз-деңгейінде-utf-8">Дереккөз деңгейінде UTF-8</h3>
<p>Егер сіздің PHP скриптіз MySQL-ге қатысса, жоғарыда көрсетілген барлық сауаттылықтарды сақтайтын кезде, сіздің жолдарыңыздын базада қарауысыз болуы мүмкін.</p>
<p>Сіздің жолдарыңыздың PHP-дан MySQL-ге UTF-8 ретінде өтуіне рұқсат беру үшін, сіздің дереккөз және кестелеріңізді әрдайым <code>utf8mb4</code> символдық жиынтығы мен калыптыруынан тауып, PDO қосылым жолында <code>utf8mb4</code> символдық жиынтығын пайдалануыңыз көмек көрсететінін тексеріңіз. Төмендегі мысал кодты көріңіз. Бұл <em>ажыратылмайтын маңызды</em>.</p>
<p>Есте салу үшін толықтыру үшін, сізге толықтыру мақсатында UTF-8 қолдану үшін дереккөз және кесте <code>utf8mb4</code> символдық жиынтығы мен калыптыруларын пайдалану қажет, және PDO қосылым жолында <code>utf8mb4</code> символдық жиынтығын пайдалану қажет, мысал кодты тексеріңіз. Бұл <em>критикалық маңызды</em>.</p>
<p>Ескерту: толықтыру үшін толықтаймыз, толықтыру үшін <a href="https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html">энциклопедияны оқыңыз</a>.</p>
<h3 id="браузер-деңгейінде-utf-8">Браузер деңгейінде UTF-8</h3>
<p>PHP скриптізініздін UTF-8 жолдарын браузерге шығару үшін <code>mb_http_output()</code> функциясын пайдаланыңыз.</p>
<p>Содан кейін браузерге HTTP жауапты арқылы бетті UTF-8 ретінде қарайтын деп білдірме қажет болады. Бүгінде, бұлдай HTTP жауабында пернетау өлшемін жасау үшін көмекші болып табылады:</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token function">header</span><span class="token punctuation">(</span><span class="token string">'Content-Type: text/html; charset=UTF-8'</span><span class="token punctuation">)</span>
</span></code></pre>
<p>Бұны қамтиды үшін қайырлы болуы мүмкін:</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token comment">// PHP-ге біз UTF-8 жолдарын скрипт аяқталғана дейін пайдалану үшін айтамыз</span>
<span class="token function">mb_internal_encoding</span><span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$utf_set</span> <span class="token operator">=</span> <span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string">'default_charset'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$utf_set</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string">'default_charset параметрінің бағытын utf-8 ретіне орнату мүмкін болмады, онда оны системаңыздан барлық көз жүгіртіңіз!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// PHP-ге біз браузерге UTF-8 ретінде шығаратын дейін болатындай айтамыз</span>
<span class="token function">mb_http_output</span><span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token delimiter important">?></span></span>
</code></pre>
<p>Бұл соңғы код арқылы, PHP скриптізініз браузерге UTF-8 ретінде шығаратын дайындалады.</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token comment">// PHP-ге біз скрипт аяқталғана дейін UTF-8 жолдарын пайдалану дегенімізді айтамыз</span>
<span class="token function">mb_internal_encoding</span><span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$utf_set</span> <span class="token operator">=</span> <span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string">'default_charset'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$utf_set</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string">'default_charset параметріні utf-8 ретіне орнату мүмкін болмады, онда оны системаңыздан барлық көз жүгіртіңіз!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// PHP-ге біз браузерге UTF-8 ретінде шығаратын дейін болатындай айтамыз</span>
<span class="token function">mb_http_output</span><span class="token punctuation">(</span><span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Біздің UTF-8 тексеру строкасы</span>
<span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string">'Êl síla erin lû e-govaned vîn.'</span><span class="token punctuation">;</span>
<span class="token comment">// Стрингді кейінгі әдістермен ауыстыру үшін многобайтты әдісті пайдаланамыз</span>
<span class="token comment">// Әдепкі бойынша сізге көмек үшін стрингді бір аласарында кесілгендігімізді көрсетеміз</span>
<span class="token variable">$string</span> <span class="token operator">=</span> <span class="token function">mb_substr</span><span class="token punctuation">(</span><span class="token variable">$string</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Сіздің стрингді сақтау үшін базаға қосылу үшін байланысты анықтау</span>
<span class="token comment">// Толық ақпарат үшін осы жобадағы PDO өрнегін көріңіз</span>
<span class="token comment">// Дайындашу Келісім (DSN) дегенде `charset=utf8mb4` болуы керек</span>
<span class="token variable">$link</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span>
<span class="token string">'mysql:host=сіздік-мекенжайыңыз;dbname=сіздік-ұжымыңыз;charset=utf8mb4'</span><span class="token punctuation">,</span>
<span class="token string">'сіздік-пайдаланушы-аты'</span><span class="token punctuation">,</span>
<span class="token string">'сіздік-кілтсөзі'</span><span class="token punctuation">,</span>
<span class="token keyword">array</span><span class="token punctuation">(</span>
<span class="token constant">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">ATTR_ERRMODE</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token constant">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">ERRMODE_EXCEPTION</span><span class="token punctuation">,</span>
<span class="token constant">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">ATTR_PERSISTENT</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">false</span>
<span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Біздің ауыстырылған стрингді UTF-8 ретінде сақтау үшін</span>
<span class="token comment">// Сіздің база және кестелері UTF-8 символдар жинағы және көлемінде болуы керек, деген сияқты?</span>
<span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token variable">$link</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token string">'insert into ElvishSentences (Id, Body, Priority) values (default, :body, :priority)'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$handle</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">bindParam</span><span class="token punctuation">(</span><span class="token string">':body'</span><span class="token punctuation">,</span> <span class="token variable">$string</span><span class="token punctuation">,</span> <span class="token constant">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">PARAM_STR</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$priority</span> <span class="token operator">=</span> <span class="token number">45</span><span class="token punctuation">;</span>
<span class="token variable">$handle</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">bindParam</span><span class="token punctuation">(</span><span class="token string">':priority'</span><span class="token punctuation">,</span> <span class="token variable">$priority</span><span class="token punctuation">,</span> <span class="token constant">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">PARAM_INT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// явным образом говорим pdo, что ожидаем int</span>
<span class="token variable">$handle</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Мына жасалған стрингді оларын бізге дайындалып шығармайтын бір объектке сақтау үшін</span>
<span class="token comment">// Осы объектті HTML-де көрсету үшін кейбір дайындалып шығаруды дайындамау</span>
<span class="token keyword">function</span> <span class="token function">escape_to_html</span><span class="token punctuation">(</span><span class="token variable">$dirty</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$dirty</span><span class="token punctuation">,</span> <span class="token constant">ENT_QUOTES</span><span class="token punctuation">,</span> <span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">header</span><span class="token punctuation">(</span><span class="token string">'Content-Type: text/html; charset=UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Сіздік default_charset параметрі UTF-8 ретіне орнатылған болмаса үшін қажет емес</span>
<span class="token delimiter important">?></span></span><span class="token doctype"><!doctype html></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>UTF-8 тест беті<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span>
<span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token keyword">as</span> <span class="token variable">$row</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token function">escape_to_html</span><span class="token punctuation">(</span><span class="token variable">$row</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">Body</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Бұл біздің ауыстырылған UTF-8 стрингімізді браузерге дайындайтында өнімді табу үшін дайын шығаруы керек</span>
<span class="token punctuation">}</span>
<span class="token delimiter important">?></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span>
</code></pre>
<h3 id="көбірек-оқу">Көбірек оқу</h3>
<ul>
<li><a href="https://www.php.net/language.operators.string">PHP Нұсқаулығы: Строка операциялары</a></li>
<li><a href="https://www.php.net/ref.strings">PHP Нұсқаулығы: Строка функциялары</a>
<ul>
<li><a href="https://www.php.net/function.strpos"><code>strpos()</code></a></li>
<li><a href="https://www.php.net/function.strlen"><code>strlen()</code></a></li>
<li><a href="https://www.php.net/function.substr"><code>substr()</code></a></li>
</ul>
</li>
<li><a href="https://www.php.net/ref.mbstring">PHP Нұсқаулығы: Многобайтты Строка функциялары</a>
<ul>
<li><a href="https://www.php.net/function.mb-strpos"><code>mb_strpos()</code></a></li>
<li><a href="https://www.php.net/function.mb-strlen"><code>mb_strlen()</code></a></li>
<li><a href="https://www.php.net/function.mb-substr"><code>mb_substr()</code></a></li>
<li><a href="https://www.php.net/function.mb-internal-encoding"><code>mb_internal_encoding()</code></a></li>
<li><a href="https://www.php.net/function.mb-http-output"><code>mb_http_output()</code></a></li>
<li><a href="https://www.php.net/function.htmlentities"><code>htmlentities()</code></a></li>
<li><a href="https://www.php.net/function.htmlspecialchars"><code>htmlspecialchars()</code></a></li>
</ul>
</li>
<li><a href="https://stackoverflow.com/questions/571694/what-factors-make-php-unicode-incompatible">Stack Overflow: PHP Unicode-сәйкес емес болуын не өзгертеді?</a></li>
<li><a href="https://stackoverflow.com/questions/140728/best-practices-in-php-and-mysql-with-international-strings">Stack Overflow: PHP мен MySQL-де халықаралық тізбекті символдармен қалай жұмыс істеуге болады?</a></li>
<li><a href="https://mathiasbynens.be/notes/mysql-utf8mb4">MySQL деректер базасында толық Юникодты қолдау қалай сипаттайтындықты анықтау</a></li>
<li><a href="https://www.sitepoint.com/bringing-unicode-to-php-with-portable-utf8/">PHP-ге Portable UTF-8 арқылы Юникодты орнату</a></li>
<li><a href="https://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8-correctly">Stack Overflow: DOMDocument loadHTML UTF-8-ді дұрыс кодтау емес</a></li>
</ul>
<h2 id="халықаралықтықтандыру-i18n-және-жергіліктіру-l10n">Халықаралықтықтандыру (i18n) және Жергіліктіру (l10n)</h2>
<p><em>Жаңа келгендерге келген кеңес: i18n және l10n - бұл сандарды пайдалану арқылы сөздерді қысқарту жолымен көмек көрсету үшін пайдаланушыларға берілетін салу. Біздің өзіміздін бас тарту жолымен, халықаралықтықтандыру i18n болады, жергіліктіру - l10n.</em></p>
<p>Алдымен, біздің есептеулерге келісу керек: жаттамаларды басу кезінде басым келтірмейді, әзірлеу адамдарының кодты олардың жаттамаларына жатамасыздандыру үшін қалыптасу кезінде.</p>
<ul>
<li><strong>Халықаралықтықтандыру (i18n)</strong> - бұл кодтынызды көшіруі жоғары болмайтын тілдерге немесе аймақтарға қоса беру үшін жасалған. Бұл бұрын - төменгі болу керек, жақсартудан кейін бір рет орындалады, сонымен қатар - сіз үшінаймызда өзге тілді алу үшін қажетті болса, күпірлі, жатамаларды ауыстыруы керек!</li>
<li><strong>Жергіліктіру (l10n)</strong> - бұл өзіндікті (аса мәнде) баспақ, ережелерді, баспа жатамаларды аударуымен алғашқа қабіздандырылатын кезде, сіз бұрыннан іске қосқан i18n жасау жұмысына негізделген интерфейсізді адаптайтындайды. Сіздің қолданушыларыңыздың барлық қолдану тілдерінде көмек көрсетуі керек және бүтіндіктің анықтамаларында сақтауы керек.</li>
<li><strong>Көпірлеу (Pluralization)</strong> - сан және басқа есіктердегі жолдарды қамтымасыздандыру үшін өтініштерді анықтау үшін көрсетілген ережелерді анықтау. Мысалы, ағылшын тілінде тек бір элемент болған кезде бірдеулі, ол саналады, және онда басқа да ауруп көрсеткен кезде өзгереді; бұл тілде бұлгар, серб, орыс тілдері сондай-ақ бірдеулі т</li>
</ul>
<p>уралы екі көпірлеу формасы бар - сіз бірден бесіге дейін көпірлеу формасы бар тілдерді таба аласыз, соларының арасында словен, ирланд, араб, онымен айнымалы тілдер де бар.</p>
<h2 id="әдеттегі-реализациялау-жолдары">Әдеттегі реализациялау жолдары</h2>
<p>PHP бағдарламасын халықаралықтандырудың ең оңай жолы - массив файлдарын пайдалану мен оларды шаблондарда пайдалану, міне, <code><h1><?=$TRANS['title_about_page']?></h1></code> сияқты. Бұл жол серьезді жобалар үшін дайын дайын болмауы тиіс, бірақ кейде қажетті жаңа тилді тағытуы бар өтініштерге салыстырылуы мүмкін - олардың кейінгі бірінші кезде тұрмауы мүмкін, мисалы, көпірлеу. Сондықтан, мысалды дайында қосалғанда көбірек болады деп табасаңыз, жақсарту туралы білгілерді айырымашылықтыра алмайсыздар. Также, егер жобаңызда артықшы бірнеше беттер болары көрсетсе, мысалы, мынандай бір мәселе болары бар.</p>
<p>Халықаралықтықтандыру және жергіліктіру үшін өте ықтималдаулы әдет тәсілі және қажетті жоқ көлемге иесіз <a href="https://en.wikipedia.org/wiki/Gettext">Gettext аталатын Unix құрылғысы</a> болады. Ол 1995 жылы келді, сонымен қатар программаны тілдеу үшін толық реализацияны ұсынады. Оны іске қосу өте оңай, сондықтан да ерекшеліктерге қолдау көрсетеді. Біз осында Gettext туралы сөйлесеміз. Сіздің команда қатарынан толтыруды жатты аладымайтын болмайтын болмаса аларды басқару үшін пайдалануға арналған жақсы GUI қолданбасын ұсынамыз.</p>
<h3 id="басқа-құралдар">Басқа құралдар</h3>
<p>Бірнеше көлемдерді Gettext мен басқа i18n ұжымдарын қолдау көрсететін өзге кітапханалар бар. Олардың кейбірі орнатуын немесе әмбебаптық мүмкіндіктер немесе i18n файл форматтары бойынша қосымша мүмкіндіктерді ұсынуы мүмкін. Бұл документтегі басқа құралдарды PHP жасауы мен сұрау көрсетуді ұсынуға арналған, бірақ біз осында толықтыруды үшін басқаларды көрсетеміз:</p>
<ul>
<li><a href="https://github.com/auraphp/Aura.Intl">aura/intl</a>: Жасаушылар үшін халықаралықтандыру (I18N) құралдарын ұсынады, аймақ бойынша жат жаттығушы барлық локалды хабарлама. Ол мәтіндер үшін массив пішімдерін пайдаланады. Хабарлама шығарушын ұсынбайтын, бірақ көбірек мәтінді форматтау үшін (көмегімен пайдаланылатын pluralized хабарламалар да бар) <code>intl</code> кеңейтімін ұсынайды.</li>
<li><a href="https://github.com/php-gettext/Gettext">php-gettext/Gettext</a>: Gettext-ті дайындау интерфейсімен қолдау көрсететін; жетекші көмек көмегінен басқа дайындаушы функциялар, көмекші файл форматтары үшін күшті сызбалар (онда басқа дайындаушы файл форматтарының <code>gettext</code> командасынан дайын қолдау көрсетпейді) жататып, <code>.mo/.po</code> файлдарды қаржылауға болмайды. Тілдік тілдеріңіздің барлығында тілдіктіліктерді интероперациялау үшін басқа бір түрлі қалайтындыларды қамтамасыз етіп қолдайды. Сіздің аудармасын жүйе бөлімдеріне тілдерді қосуды талап ететін басқа бөлімдерге тил файлдарын кіруге мәжбүр болса, ол үшін пайдалануға болады.</li>
<li><a href="https://symfony.com/components/Translation">symfony/translation</a>: көптеген өзара форматтарды қолдайды, бірақ verbose XLIFF қолдануын сұрау қылар. Көмекші функциялар мен тілдіктерді жасаушыларды қоспайтынбайтынбай, <code>strtr()</code> пайдалана отырып, оны ішкідегі орындауға қолдау көрсетеді.</li>
<li><a href="https://docs.laminas.dev/laminas-i18n/">laminas/laminas-i18n</a>: массив және INI файлдарын, немесе Gettext форматтарын қолдау көрсетеді. Файлдарды оқу арқылы келген рет оқу сақтау қауырыны жасайды. Бұл өзіндіктіліктерді, көмекшілерді және локальді аударма жасаушыларды орындауы үшін пайдаланады. Бірақ оларда хабарлама шығарушы жоқ.</li>
</ul>
<p>Басқа фреймворттарда сондай-ақ өзге і18n модульдері болады, бірақ олар олардың код базасынын сыр</p>
<p>ттан тыс жасау қажет:</p>
<ul>
<li><a href="https://laravel.com/docs/master/localization">Laravel</a>: жасау файлдарын қолдау көрсетеді, автоматты түсіруші жоқ, бірақ шаблон файлдары үшін <code>@lang</code> көмекшісін қосады.</li>
<li><a href="https://www.yiiframework.com/doc/guide/2.0/en/tutorial-i18n">Yii</a>: массив, Gettext және деректер базасымен тілдіктерді қолдау көрсетеді, қоса тілдіктерді ұсынушы. Ол PHP 5.3 дейін қолдау көрсететін, <a href="https://www.php.net/manual/intro.intl.php"><code>Intl</code></a> кеңейтімімен ұсталған және <a href="https://icu.unicode.org/">ICU проектінің</a> ырым-шырымынан қолдайды, бұл Yii-ге санапты тиіп, санапты аударуды, күндерді, сағаттарды, интервалдарды, валюталарды, немесе ординалдарды қатесіз орындауға болады. Егер сіз эстрактордың емес, дайындаушылардың басқа кітапханаларының біріні таңдасаңыз, сізде оларды қолдану мүмкіндігі бар, сонда басқа кітапханалардың емес, бірақ мазмұнындағы оригинал Gettext құрылғысын (Poedit кімге арналған) пайдалануыңызды ұмытасыздықты ойлауыңыз келеді.</li>
</ul>
<h2 id="gettext">Gettext</h2>
<h3 id="орнату">Орнату</h3>
<p>Gettext мен оның байланысты PHP кітапханасын орнату үшін <code>apt-get</code> немесе <code>yum</code> дайындайтын пакетке жасау көрсететін көмекшініз бола алады. Орнатылғаннан кейін, оны <code>php.ini</code> файлына <code>extension=gettext.so</code> (Linux/Unix) немесе <code>extension=php_gettext.dll</code> (Windows) қосау арқылы іске қосуға болады.</p>
<p>Бұл жерде біз аймақ файлдарын жасау үшін <a href="https://poedit.net/">Poedit</a> программасын да қолданамыз. Оны сіздің жүйесініздегі пакеттік басқарушыда табасыз, ол Unix, macOS және Windows үшін қолданылады және сондай-ақ тегін орнату үшін <a href="https://poedit.net/download">жүйесініздің веб-сайтынан</a> тегін жүктеп алуға болады.</p>
<h3 id="құрылыс">Құрылыс</h3>
<h4 id="файл-түрлері">Файл түрлері</h4>
<p>Gettext барысында жұмыс істеуді көзделетін үш файл бар. Онымен ажыратымды “аударылған объекттерді” көрсететін PO (Portable Object) және оның басқа Gettext-ты түсіргенде толықымаған объекттерді интерпреттіру қылатын MO (Machine Object) файлдары бар. Сонымен қатар, сіздің басылмалар файлдарындағы барлық кілттерді қамтып, барлық PO файлдарын жасау мен жаңарту үшін нұсқау файлы болатын POT (Template) файлы бар. Осы шаблонын файлдары міндетті емес: сіз i18n істеу үшін пайдаланатын құралға байланысты, сіз тек PO / MO файлдарымен болсаңыз, көмек көрсете аласыз. Сізге өз тіліңіз мен аймақты үшін сізге өзінізге бір PO / MO файлдары жасау үшін тегін тек көпірлік көрсететін PO / MO файлдарына салмауы керек, бірақ бір доменге тек бір POT файл болады.</p>
<h3 id="домендер">Домендер</h3>
<p>Ұлкен жобаларда, сәйкесі бір мәтін бір бағытты көздігі дайындырады деп сенімді мүмкіндіктер бар. Олай болмаса, оларды біріктіргенде, оларды біріктіріп алу үшін оларды өзара айырысуы көзделіп тұрады. Бұлай дайындалатын <em>домендер</em>. Олар, саудалы POT / PO / MO файлдардың аты болатын атаулар бар жерде, <em>аударма домені</em> деп аталады. Кіші және орта өлшемді жобалардың көбі, саулық пен қарапайымдылық үшін тек бір доменді пайдаланады; оның атауы ерекше, бірақ біз код көмегімен “main” деп аталатын. Мысалы, <a href="https://symfony.com/components/Translation">Symfony</a> проектілерінде домендерді синтаксис жасау үшін пайдаланады.</p>
<h4 id="локаль-код">Локаль код</h4>
<p>Локаль - бұл әдістеме коды, жалпылықта бір тілдің бір нұсқасын белгілейді. Ол <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> және <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a> стандарттарына сәйкес көмекші кодпен анықталады: тіл үшін екі кіші әріп, таңдалған жер немесе аумақ кодының астында қойылып жататын екі жоғары әріптер. <a href="https://www.gnu.org/software/gettext/manual/gettext.html#Rare-Language-Codes">Еділ тілдер үшін</a> үш әріп пайдаланылады.</p>
<p>Қандай да бізге, мемлекет бөлімі оларға қалайды деп саналатын болса да, бұл себепсіз. Себебі, кейбір тілдердің бірден біреуді мемлекеттер арасында диалекттері бар, масалан, Австриялық неміс (<code>de_AT</code>) не Аустралиялық португал (<code>pt_BR</code>). Екінші бөлімді тіл диалектері арасында бөлісу үшін пайдаланылады; қолда болмаса, ол тілдің “жалпы” немесе “қосымша” нұсқасы ретінде алынады.</p>
<h3 id="көзіре-түзету">Көзіре түзету</h3>
<p>Gettext пайдалану үшін бізге көмек көрсету үшін анықталған папка ұзақтығынан сақтауға міндетті боламыз. Алга тапсырыс бойынша, көмек көрсету үшін өздігініздің көзірек сақтау аймағын таңдауыңыз көрінеді. Оныны ішінде, қажетті көзіректі таңдау үшін барлық көзіректеріңіздің бірі үшін жасалған <code>LC_MESSAGES</code> аймағы болады, оның ішінде барлық PO/MO жиынтығын қамтып қоймасыздар. Мысалы:</p>
<pre class=" language-console"><code class="prism language-console"><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/
└─ ...
</code></pre>
<h3 id="көпшіліктерді-тауып-шалу">Көпшіліктерді тауып шалу</h3>
<p>Кіріспенінде айтқанымыздай, өзара тілдердің көпшіліктерге арналған ережелері айтылуы мүмкін. Бірақ gettext бізді қайсысыншама келісімнен құтылар. Жаңа <code>.po</code> файл құру кезінде сізге ол тіл үшін <a href="https://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html">көпшіліктердін ережелерін</a> анықтау көрсету қажет болады, және көпшіліктерге ұқсау көтеретін аудармаларды өзара ережелер бойынша аларды анықтау қажет болады. Кодда Gettext-ты шағымдау кезінде сан байланысты көмегімен шақырмаларды көлдену кезінде, сізге сөйлесімге арналған сан беру қажет болады, және ол өзі автоматты түрде пайдалану керек - өйткені сізге көмегі көрсетілсе, сіз оны орындау үшін дұрыс пішіндіретінді.</p>
<p>Көпшіліктер ережелері көпшіліктердің саны мен қажетті болатын мағынасы бойынша санайтын <code>n</code> анықталған бұзылмасы мен бір boolean тестті ішкі сауалмен қамтамасыз етеді (0-дан бастап санау). Мысалы:</p>
<ul>
<li>Жапон тілі: <code>nplurals=1; plural=0</code> - тек бір ереже</li>
<li>Ағылшын тілі: <code>nplurals=2; plural=(n != 1);</code> - екі ереже, екінші егер N бір болмаса</li>
<li>Бразилия Португал тілі: <code>nplurals=2; plural=(n > 1);</code> - екі ереже, екінші егер N бірнеше болмаса, бірінші басқа да</li>
</ul>
<p>Көпшіліктер ережелеріні қалай жұмыс жасауымызды айттық - және сіздердің түсінбегеніміз болмаса, мына <a href="https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/#Plurals">LingoHub нұсқаулығын</a> көрсеңіз де, сізге оларды қолдану үшін қажетті тізімнен көшірме жасау қажет.</p>
<p>Саншаушы сөйлемдермен Gettext-ты локалдау кезінде шағымдау көтеру кезінде, сіздің оныңмен байланыстырылатын санын көрсету қажет болады. Gettext оған қалыпты ереже қандай болуы керекпесін жұмыс істейді, және дұрыс локализацияланған нұсқасын пайдаланады. Сіздің <code>.po</code> файлыңызда анықталған көпшіліктерге арналған өзара сөйлемді қосу қажет болады.</p>
<h3 id="намыс-іске-қосу">Намыс іске қосу</h3>
<p>Барлық осылай теориядан кейін, бір аз практикалық болайымыз. Бұл - <code>.po</code> файлдың көрінісі; сіз онының пішінінен көмек көрмей, бетінді мазмұнмен көмек көресіздер; сіз кейінгірінде оны өңдегіңізді көресіз:</p>
<pre class=" language-po"><code class="prism language-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 оқыма жаттық"
</code></pre>
<p>Бірінші бөлім - басқа бойда толықтырмайды, мұнда <code>msgid</code> мен <code>msgstr</code> орнымен арнайы бос болып табылады. Бұл файлдың кодтауын, көпшіліктерді және басқаларды таңдауға көмек көрсету үшін мәндерді анықтау үшін. Екінші бөлім, ағылшыннан бразилия португал тіліне сімпле сөзді аудару әдістемесін тарату үшін пайдаланылады, мекенжай мен кіру уақытын қосу арқылы <code>sprintf</code> функциясын пайдаланып. Соңғы бөлім - көпшіліктердің мөлшерлік нұсқаларының мазмұны, ағылшын тіліндегі <code>msgid</code> қанағаттарын мен олардың соответствующные көпшіліктерінің <code>msgstr</code> 0 мен 1 ретінде көрсету. Осы жерде <code>%d</code> арқылы сан өзара ауыстырылғанымен тікелей сөйлемде көрсетіледі. Көпшіліктердің мөлшерлік нұсқалары менімен бірге қайқы жаттықты пайдаланбасаңыз, алты мекемені өз тілінің аймақты тілі болмасын дайындау қажет.</p>
<h3 id="l10n-кілттері-туралы-шығармашылық">l10n кілттері туралы шығармашылық</h3>
<p>Сіздің көрудігіңіздей, біз қолданамызда сипаттаманың ішінде іске қосымызға айналдырылатын ингіліс тілінде анықталған сөйлемді қолданамыз. Осы <code>msgid</code> барлық сіздің <code>.po</code> файлдарыңызды аудару кезінде тең калады, басқа тілдерде олардың бағдарлама мен <code>msgstr</code> жолдарымен бірдей пішінде болады.</p>
<p>Тілдеме кілттері туралы сөйлескенде, бұл жерде екі негізгі “мектеп” бар:</p>
<ol>
<li><em><code>msgid</code> -ді тік сөйлем ретінде қолдану</em>. Бас плюсы:
<ul>
<li>өте көптеген тілде сөздік болмауы салынған болса, көйінді тілдердегі көйлеген <code>msgid</code> сөздігі орындастырар. Мысалы: егер сіз ағылшыннан испан тіліне ағылшынша сөйлемдерді бойынша тіркеусіз аударып алған болсаңыз, жаңа бетті көшіріп болатында веб-сайтынын бірыңғай бөлімдері ағылшын тілінде көрсетіледі;</li>
<li>аударушы қandau жаттығумен не болғанын түсіну үшін, тілмаштырушы үшін нысанды көру көп оңай;</li>
<li>бір тіл үшін «тегін» l10n - сорттыру;</li>
<li>тегін тілтамасы келсе, бірдей бір <code>msgid</code> текстін көпті файлдарда ауыстыру керек.</li>
</ul>
</li>
<li><em><code>msgid</code> -ді уникальды, белгілі орындалған кілт ретінде қолдану</em>. Ол сөйлемнің бағдарламада орын алуы меніңізге, сөздік мазмұнды шаблондық логика менің ішінен айырмасы боларымызды айырмаштыру үшін үлкен жол.
<ul>
<li>бірақ ол келісімшеушіге қандай болмаса, мазмұнды түсінгені жоқ. Бас тіл файлының басынан басшыны алу қажет болар. Мысалы: дайын өзгеріссіз француз тіліне аударып алу үшін девелопердің <code>en.po</code> файлына қарау жасауы керек.</li>
<li>көшірме тіркеулер экранда сөйлемсіз кілттерді көрсетеді (<code>top_menu.welcome</code> дегенде көрсетілмеген француз тілінде <code>Сәлем, пайдаланушы!</code> дегенде). Бұл сайтты жариялау алдымен толық болуы үшін жақсы, бірақ интерфейсте тілдеме мәселелері аса махаббатсыз болар. Бірақ бірде, бұлардың басқаруды көру үшін бір тілді “fallback” тілі ретінде белгілеме опциясын қосу мүмкіндігі жасалған.</li>
</ul>
</li>
</ol>
<p><a href="https://www.gnu.org/software/gettext/manual/gettext.html">Gettext нұсқаулығы</a> өзгеріссіз жаттырушы жаттырылған әдісті қолдайды, өйткені ол мамандандырушы және пайдаланушылар үшін ыңғайлы болуы мүмкін. Бұл мында көрсетілген жаттырушы мәселелеріне сабақ беру үшін өздігімізде оны қолдамаймыз. Бірақ [Symfony нұсқаулығы](https://</p>
<p><a href="http://symfony.com/doc/current/translation.html#using-real-or-keyword-messages">symfony.com/doc/current/translation.html#using-real-or-keyword-messages</a>) тілде байланыс жасаушы тілдерге жаттырылмасыз тілдерге тиесілі алып қола қауіптізді енгізуге болатын кілттерге баюлай береді.</p>
<h3 id="көнделікті-пайдалану">Көнделікті пайдалану</h3>
<p>Дәйек жаттығумен, тиіпті бір қолданбада сіз парақтарыңызда статикалық мәтіндерді жазуда кейбір Gettext функцияларын пайдаланасыз. Ол сөйлемдер дайын <code>.po</code> файлдарында пайда болар, аударыларып, <code>.mo</code> файлдарына компиляциялау жасаулап, онда Gettext оларды интерфейсін жасау кезінде пайдаланады. Бұл бойынша, біз өзіміздікімізді дайында көрмегендерді бір етаптармен тәржіме жасау үшін қандай қолдануымызды анықтау керек:</p>
<h4 id="бір-мысалды-тақырып-файлы-өзара-айырмашылық-gettext-шағымдарын-қамтымайды">1. Бір мысалды тақырып файлы, өзара айырмашылық Gettext шағымдарын қамтымайды</h4>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">include</span> <span class="token string">'i18n_setup.php'</span> <span class="token delimiter important">?></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>header<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token function">gettext</span><span class="token punctuation">(</span><span class="token string">'Қош келдіңіз, %s!'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$name</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span>
<span class="token comment"><!-- код тек бетбұрылысы үшін осы түрде болады --></span>
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$unread</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">sprintf</span><span class="token punctuation">(</span>
<span class="token function">ngettext</span><span class="token punctuation">(</span><span class="token string">'Тек бір оқыма жаттық'</span><span class="token punctuation">,</span>
<span class="token string">'%d оқыма жаттық'</span><span class="token punctuation">,</span>
<span class="token variable">$unread</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token variable">$unread</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span>
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span> <span class="token delimiter important">?></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">gettext</span><span class="token punctuation">(</span><span class="token string">'Кіріспе'</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">gettext</span><span class="token punctuation">(</span><span class="token string">'Біз қазірдікі бірнеше тізбектерді аудара бастауымыз'</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span>
</code></pre>
<ul>
<li><a href="https://www.php.net/manual/function.gettext.php"><code>gettext()</code></a> просто <code>msgid</code>-ді берілген тілдегі сөздіге аудара бастайды. Оған ойынша <code>()</code> функциясы да бар;</li>
<li><a href="https://www.php.net/manual/function.ngettext.php"><code>ngettext()</code></a> біріншігігімен, бірақ көпшіліктерге арналған;</li>
<li>Олардын ішінде <a href="https://www.php.net/manual/function.dgettext.php">dgettext()</a> және <a href="https://www.php.net/manual/function.dngettext.php">dngettext()</a> дегендер де бар, олар бір дайын белгілі аударманы өзгертуге мүмкіндік береді. Кейінгі мысалдың мұраида бейнеленген домен туралы көбірек ақпарат берілген.</li>
</ul>
<h4 id="мысалды-орнату-файлы-i18n_setup.php-жоғарыда-қолданылды-дәл-gettextты-таңдау-және-конфигурациялау">2. Мысалды орнату файлы (<code>i18n_setup.php</code>, жоғарыда қолданылды), дәл Gettextты таңдау және конфигурациялау</h4>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token comment">/**
* Берілген $locale көмекші тілді беру үшін тексеру
* @param string $locale
* @return bool
*/</span>
<span class="token keyword">function</span> <span class="token function">valid</span><span class="token punctuation">(</span><span class="token variable">$locale</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$locale</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'en_US'</span><span class="token punctuation">,</span> <span class="token string">'en'</span><span class="token punctuation">,</span> <span class="token string">'pt_BR'</span><span class="token punctuation">,</span> <span class="token string">'pt'</span><span class="token punctuation">,</span> <span class="token string">'es_ES'</span><span class="token punctuation">,</span> <span class="token string">'es'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// басқа, мәлімет беру мақсатында бас тілді таңдау</span>
<span class="token variable">$lang</span> <span class="token operator">=</span> <span class="token string">'en_US'</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token function">valid</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// тілді сұрау-тізім арқылы өзгерту мүмкін</span>
<span class="token variable">$lang</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// бұны қамтыптау көрсетілімі көрсетілмейді!</span>
<span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string">'lang'</span><span class="token punctuation">,</span> <span class="token variable">$lang</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// бұл кейбірдікі пайдалану үшін сақталады</span>
<span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_COOKIE</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token function">valid</span><span class="token punctuation">(</span><span class="token variable">$_COOKIE</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// егер сақтау көрсетілген болса, біз оны өзгертуге мүмкіндік бермейміз</span>
<span class="token variable">$lang</span> <span class="token operator">=</span> <span class="token variable">$_COOKIE</span><span class="token punctuation">[</span><span class="token string">'lang'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// бұны қамтыптау көрсетілімі көрсетілмейді!</span>
<span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_ACCEPT_LANGUAGE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// әдепкі: браузердік пайдаланушының қабылдау ететін тілдерді іздеу</span>
<span class="token variable">$langs</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">,</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_ACCEPT_LANGUAGE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">array_walk</span><span class="token punctuation">(</span><span class="token variable">$langs</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token operator">&</span><span class="token variable">$lang</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$lang</span> <span class="token operator">=</span> <span class="token function">strtr</span><span class="token punctuation">(</span><span class="token function">strtok</span><span class="token punctuation">(</span><span class="token variable">$lang</span><span class="token punctuation">,</span> <span class="token string">';'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'-'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'_'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$langs</span> <span class="token keyword">as</span> <span class="token variable">$browser_lang</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">valid</span><span class="token punctuation">(</span><span class="token variable">$browser_lang</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$lang</span> <span class="token operator">=</span> <span class="token variable">$browser_lang</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// осы жерде біз табылған тілге байланыстыру үшін глобалды жүйе тілді белгілейміз</span>
<span class="token function">putenv</span><span class="token punctuation">(</span><span class="token string">"LANG=$lang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// мәнді көру үшін бұл өмірде анықталған тілі</span>
<span class="token function">setlocale</span><span class="token punctuation">(</span><span class="token constant">LC_ALL</span><span class="token punctuation">,</span> <span class="token variable">$lang</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// бұл Gettextтың ../locales/<lang>/LC_MESSAGES/main.mo файлын іздеуін таңдайды</span>
<span class="token function">bindtextdomain</span><span class="token punctuation">(</span><span class="token string">'main'</span><span class="token punctuation">,</span> <span class="token string">'../locales'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// файлды оқу үшін кодтау кодты анықтарылған</span>
<span class="token function">bind_textdomain_codeset</span><span class="token punctuation">(</span><span class="token string">'main'</span><span class="token punctuation">,</span> <span class="token string">'UTF-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// өтінішті әкімші тілдік вызовдар қаржылататын жасау файлын білдіретін жер</span>
<span class="token function">textdomain</span><span class="token punctuation">(</span><span class="token string">'main'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// бұл forum.mo файлын main.mo файлының орнына іздеуін білдіреді</span>
<span class="token comment">// echo dgettext('forum', 'Қош келдіңіз!');</span>
<span class="token delimiter important">?></span></span>
</code></pre>
<h4 id="бірінші-іске-қосу-үшін-аударманы-дайындау">3. Бірінші іске қосу үшін аударманы дайындау</h4>
<p>Gettext-тың өзге фреймворк i18n пакеттеріне қатар қолайлы және қуатты файл пішімі бар. “Ох, енді бұлды түрлендіру мен басқау пакеттері үшін дайын естуі мүмкін, қолмен түзетуі жатқан аралас алмайды. Ұзаққа аз көмек көрсете алар деп едіңіз бе?” Алдамайық, <a href="https://poedit.net/">Poedit</a> сияқты бағдарламалар сізге көмек көрсету үшін маңызды. Сіз осы бағдарламаны <a href="https://poedit.net/download">оның веб-сайтынан</a> алып тастауыңыз көмек етеді, бұл тегін және барлық платформалар үшін қол жетімді. Оны қолдану үшін бұл бірде ыңғайлы, содан кейінді күшті бір құрал - барлық мүмкіндіктерін пайдалану.</p>
<p>Бірінші іске қосу кезінде сіз менюдан “Файл > Жаңа…” дегенді таңдауыңыз керек. Сізге тіл туралы сұрау сұралатын болады: бұл жерде сіз көрсету көмекшілігі арқылы аудару келген тілді таңдауға болады, немесе біз алдын айтып отырған форматты пайдалана аласыз, мысалы, <code>en_US</code> немесе <code>pt_BR</code>.</p>
<p>Ақылайтын сақтау - бұлай басу. Содан кейін “Жатты анықтау” түймесін басу керек, жасау және тілдеу үздіктері үшін көптеген параметрлерді күмәнді пайдаланасыз. Оларды сіз “Каталог > Мұраяты” арқылы көре аласыз:</p>
<ul>
<li>Өтінішті көздер: бұл жерде сіздің проектізде <code>gettext()</code> (және арқауыштар) шағымдарын шақыруда пайдаланатын барлық қалтқыларды қосуыңыз керек - бұл зерттегі тізбек/көрнекініз (темплейттер/көріністер) болады. Бұл тек міндетті параметр;</li>
<li>Тілдеме сипаттамалары:
<ul>
<li>Проекттың аты және нұсқасы, Команда мен Команданың электронды пошта мекенжайы: .po файл басылымына пайдаланатын пайдаланылатын мәліметтер;</li>
<li>Көпшілік тілдері: бұл біздің алдын айтып отырған ережелеріміз - осындай тізімде сізге сілтемелер де бар. Сіз көбірек уақытта, басқа бірнеше тілдер үшін қолайлы ереже базасын қамтып алады, сондықтан бастапқы параметрді белгілеуге болады.</li>
<li>Коддаушылар: UTF-8, бетерік;</li>
<li>Кодтаушылар: кодтау кодын, ал бағдарламанызда қолдануымызды білетін тізім - мүмкін UTF-8 дегенмен, дегенмен сізге неше көмек көрсетілген;</li>
</ul>
</li>
<li>Үсті тақпалар: Орналасатын бағдарламаның өтініштерінің қайсысы сияқты <code>gettext()</code> және оған ұқсас өтініштерді көрінедігін біледі - бірақ сіз өзге</li>
</ul>
<h4 id="тілдеулі-сөздерді-аудару">4. Тілдеулі сөздерді аудару</h4>
<p>Өткенде көрдіңізді айтарымыз, тілдеулі сөздерді басқару үшін екі басым түрі бар: жалпы, және көпшіліктер. Бірінші түрдің ашық жаталғаны, көздеу мен тілдеулі сөздерін көрсету үшін екі теріс басым бар. Басқа теріс басымдарды ресіздеу үшін сіздің көзге көмекшілігіңіз жоқ - сіздің көзге көмекшілігіңіз мен айналаса беретіні біздікінен ауызша алдау көрсетуі керек - сіз мүмкін, біздікімізді өзгертуіңіз керек және файлдарды қайта скандау көрсетуі керек. Пайдаланушы көмекшісі: сіз тілдеудің жолдас сызбасын баса отырып, ол сізге осы сызбаны жатты жерінен жөндеу жасау немесе сұрау жасау көмекшілігін аударары.</p>
<p>Сол барысы, өтінішті жаталған сөздерді тазартуды көрсете алған боларсыздарын өзгертуге көмекші болу үшін “Жаңарту” түймесін басыңыздар, Poedit кодты қайта скандау жасау, жоқ болатын жазбаларды алып тастау, өзгергендерді бірігіп көрсету мен жаңа сияқты өзгерістерді қосу. Содан кейін, басқа жаталғандарды және сіз жасаған жаталқандарды көмек көрсету үшін қарап тұрар, олардың жаталғандығы мен өзгергендігі белгіленеді, тізбекте алтынмен көрсетіледі. Сіздің тілдеу командасы бар болса және көмекші қандай жазау көмек істеуді білмесе, тек жатты білдіру, мен тым мендік біреу көрмейдігі жерді қоса отырып, кейін мен басқалар қарау жасайды.</p>
<p>Соңда, сізге "Көру > Тілдеулі енгізу бірінші"ді таңдау қалпынан барыттырылған, сізге көмек көмек көрсетеді. Онымен менюдан, сізді қажетті болуы керек болмаса да, өзіңіздің тілдеушіге контекстілік ақпаратты қалдыра аларсыздармен қалай келуіндігін білу үшін бекітілген.</p>
<h3 id="кеңес--кідірткілер">Кеңес & Кідірткілер</h3>
<h4 id="мүмкін-болатын-кештеу-мәселелері">Мүмкін болатын кештеу мәселелері</h4>
<p>Егер сіз Apache (<code>mod_php</code>) үстінде PHP қосымшасын іске қоса алсаңыз, сізге <code>.mo</code> файлын кештенумен мәселе пайда бола аларсыз. Бірақ бұл оны ашу кезінде оқылады, содан кейін, оны жаңарту үшін серверді қайта іске қосу қажет бола ала майды. Nginx мен PHP5-те бұлдан басқа бірнеше бетті қайта жаңарту кешін жаңарту үшін көбірек беттерді жаңарту қажет болады, және PHP7-де сондай-ақ аз пайдаланылады.</p>
<h4 id="қосымша-көмекші-функциялар">Қосымша көмекші функциялар</h4>
<p>Көптеген адамдардың таңдауы бойынша, <code>gettext()</code> орындауынан <code>_()</code> пайдалану жаттылықтың ең асығы болады. Мысалы, көпшілікті фреймворктардың көмекші i18n кітапханалары да салыстыру кодты қысқарту үшін <code>t()</code> сияқты не басқа несіздік функцияларды пайдаланады. Бірақ бұл жаттылықты ортақтығы бар функция. Сіздің проектіңізге, мысалы, <code>__()</code> несіздік функциясын не <code>_n()</code> үшін <code>ngettext()</code>, не де аламымды <code>gettext()</code> мен <code>sprintf()</code> шақымдасатын жасау үшін <code>_r()</code> сияқты басқаларды қосу үшін өтініштерді көрсете аласыз. Әрекеттерді басу, мысалы, <a href="https://github.com/php-gettext/Gettext">php-gettext басқа Gettext</a> барлық осыдай көмекші функцияларды көрсетеді.</p>
<p>Осы мәселеулерде, сізге Gettext көмекшісіне осы жаңа функциялардан өтініштерді қалай шығаруыны оқуы қажет. Қорлым паузасыз, бұл тым жедел. Бұл <code>.po</code> файлдағы кестеде немесе Poedit дегенде баптау экранында болады. Редакторда осы параметр “Каталог > Мүраяты > Қалпы айырысқандар” ішінде болады. Естесіздік тілдер үшін Gettext көмекшісінің әдепкі функцияларын білген боларысыз, дегенмен, бұл тізбегі бос көрініп тұрса да, қорлымдар болмайсыз. Осы жаңа функцияларды бұларда көрсету қажет. Бұлардың анықтамаларын <a href="https://www.gnu.org/software/gettext/manual/gettext.html#Language-specific-options">ағымдағы белгілі пішімдегі</a> орналастырып көріңіз:</p>
<ul>
<li>мысалы, <code>t()</code> сияқты несіздік функциясын құруыңыз келе ме? сіз оны <code>t</code> ретінде көрсете аласыз. Gettext тек құқығышты тілді аударуды алармаса, тек аударылатын тіл сізді үшін аударар;</li>
<li>өтінішті функцияда бірнеше аргумент болса, сіз олардан бірінде бірінші жаттығушыны көрсете аласыз - әрекет қажет болса, көпшілікты жаттығушыны көрсете аласыз. Мысалы, егер біз осы түрде функциямызды шағымдарымыздың осыдай атауы</li>
</ul>
<p>мен шағыту кезінде жаттығушыны шақыруымыз келсе: <code>__('бір пайдаланушы', '%d пайдаланушылар', $number)</code>, оны бірінші форма бірінші аргумент ретінде көрсетеміз, және егер көмек қажет болса, қошымаша баған түрінде <code>__:1,2</code> деп көрсетеміз, бірінші форма бірінші жаттығушы, екінші форма екінші жаттығушы болатын деп көрсетеміз. Әгер сіздің саны бірінші аргумент ретінде келсе, спецификация <code>__:2,3</code> боларысыз, бірінші форма екінші аргумент ретінде болады, және басқа несіздік туралы.</p>
<h3 id="сілтемелер">Сілтемелер</h3>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Internationalization_and_localization">Уикипедия: i18n және l10n</a></li>
<li><a href="https://en.wikipedia.org/wiki/Gettext">Уикипедия: Gettext</a></li>
<li><a href="https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/">LingoHub: PHP internationalization with gettext tutorial</a></li>
<li><a href="https://www.php.net/manual/book.gettext.php">PHP құжаттамасы: Gettext</a></li>
<li><a href="https://www.gnu.org/software/gettext/manual/gettext.html">Gettext құжаттамасы</a></li>
</ul>
</div>
</div>
</body>
</html>