由于WordPress原生的翻譯僅支持PHP而不支持JS,因此本主題使用的翻譯方法是主題開發(fā)者自己發(fā)明的。因此,本主題中的翻譯可同時(shí)支持JS和PHP并且無需使用翻譯編輯器來進(jìn)行編譯,直接編寫json文件即可實(shí)現(xiàn)
國(guó)際化
本主題使用了主題專用的?_t8()
?_t8n()
?_et8()
?_et8n()
?來實(shí)現(xiàn)文本的翻譯。
并配合?語言名稱.json
?翻譯文件來實(shí)現(xiàn)頁面上的文本替換。下面介紹翻譯方法和原理。
主題翻譯
主題默認(rèn)使用“WordPress后臺(tái)設(shè)置選擇的語言”,在不修改WordPress默認(rèn)語言的前提下,也可使用主題的翻譯功能強(qiáng)制修改主題語言。詳見PHP過濾器:pf_get_translation
部分。
開始翻譯
假定:當(dāng)前已經(jīng)將WordPress切換到英文語言(或:在 pf_get_translation 過濾波器中返回”en_US”)。以此來翻譯主題的英文版
步驟:在R\pandastudio_plugins\public_translation\lang
文件夾中將主題默認(rèn)的default.json
翻譯文件復(fù)制一份,命名為en_US.json
,然后對(duì)文件中的JSON對(duì)象進(jìn)行翻譯即可
注意:翻譯時(shí)務(wù)必注意JSON文件格式,不要出現(xiàn)JSON格式錯(cuò)誤的情況。
代碼實(shí)現(xiàn)
在二次開發(fā)的過程中,無論是 Javascript 還是 PHP 都可能出現(xiàn)文本,那么這些文本在 Javascript 和 PHP 中是怎么實(shí)現(xiàn)翻譯的呢?
簡(jiǎn)單翻譯
_t8("待翻譯的文字",多個(gè)替換參數(shù));
t8表示:translate,t后面有8個(gè)字符,因此被簡(jiǎn)化為t8
待翻譯的文字中可使用{{number}}來替換參數(shù),參數(shù)可有多個(gè),將一一對(duì)應(yīng)替換
使用示例
_t8("{{2}}班有{{1}}個(gè)學(xué)生", 53, 3);
默認(rèn)顯示時(shí),將第一個(gè)替換參數(shù) 53 替換到{{1}}的位置,第二個(gè)替換參數(shù) 3 替換到{{2}}的位置。默認(rèn)語言顯示結(jié)果為:“3班有53個(gè)學(xué)生”。
若此時(shí)有翻譯文件內(nèi)容如下:
{
"{{2}}班有{{1}}個(gè)學(xué)生": "There are {{1}} students in class {{2}}"
}
則參數(shù) 53 將替換到 {{1}} 的位置,參數(shù) 3 將替換到 {{2}} 的位置。翻譯結(jié)果為:“There are 53 students in class 3”
單復(fù)數(shù)翻譯
_t8n("待翻譯的單數(shù)文字","待翻譯的復(fù)數(shù)文字",多個(gè)替換參數(shù));
在上面的例子中我們看到了:當(dāng)出現(xiàn)數(shù)量為單數(shù)時(shí),students的翻譯明顯是錯(cuò)誤的。因此引入單復(fù)數(shù)識(shí)別的翻譯。在原有的t8名稱后加上了n。單復(fù)數(shù)識(shí)別僅識(shí)別第一個(gè)替換參數(shù),若第一個(gè)替換參數(shù)為1,則顯示單數(shù)翻譯,否則使用復(fù)數(shù)翻譯。類似于:
if (number <= 1) {
_t8("單數(shù)內(nèi)容");
} else {
_t8("復(fù)數(shù)內(nèi)容");
}
使用示例
_t8n(
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:?jiǎn)螖?shù)}}",
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:復(fù)數(shù)}}",
1,
3);
我們可以看到,中間加入了雙花括號(hào)的備注來進(jìn)行區(qū)分,在顯示時(shí),備注將自動(dòng)去除。若此時(shí)有語言文件JSON內(nèi)容如下:
{
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:?jiǎn)螖?shù)}}": "There is only {{1}} student in class {{2}}",
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:復(fù)數(shù)}}": "There are {{1}} students in class {{2}}"
}
由于學(xué)生數(shù)量1是單數(shù),因此在翻譯時(shí)候?qū)⑹褂脝螖?shù)翻譯,翻譯結(jié)果為:“There is only 1 student in class 3”
若調(diào)用時(shí)參數(shù)仍然為53:
_t8n(
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:?jiǎn)螖?shù)}}",
"{{2}}班有{{1}}個(gè)學(xué)生{{備注:復(fù)數(shù)}}",
53,
3);
則翻譯結(jié)果為:“There are 53 students in class 3”
其他
上述_t8()
與_t8n()
方法在自定義JS與自定義PHP中均有效。且翻譯文件不存在時(shí),將自動(dòng)回退為代碼中的語言。因此,在編寫完二次開發(fā)的 Javascript 或 PHP 代碼后,應(yīng)手動(dòng)將待翻譯的字符串添加到 JSON 語言文件中,才可以實(shí)現(xiàn)翻譯。
PHP獨(dú)有
在PHP中存在顯示文字的情況(echo),為方便使用,在上述兩個(gè)方法前加上e來進(jìn)行標(biāo)識(shí)。如:_et8()
與_et8n()
,使用方法一致。
關(guān)于備注
替換參數(shù)僅識(shí)別 {{number}} 的情況。凡是待翻譯內(nèi)容 、翻譯內(nèi)容中的雙花括號(hào),都被識(shí)別為備注,將默認(rèn)去除。備注可為翻譯者提供翻譯幫助,如語言文件JSON翻譯為:
{
"編輯{{名詞}}": "Editor",
"編輯{{動(dòng)詞}}": "Edit",
}
如何翻譯/文本替換
翻譯功能不僅可以用于真正的某種語言,還可以用于文本替換。原理:將主題語言定義為當(dāng)前地區(qū)使用的語言,再次進(jìn)行翻譯
例:對(duì)中文語言本身實(shí)現(xiàn)文本替換:
- 復(fù)制lang文件夾的
default.json
,并重命名為當(dāng)前WP后臺(tái)選中的當(dāng)?shù)卣Z言:zh_CN.json
- 對(duì)內(nèi)容進(jìn)行翻譯,例如將 “閱讀全文” 翻譯為 “去看看”
這樣就實(shí)現(xiàn)了主題的翻譯/文本替換。
注:翻譯時(shí)請(qǐng)嚴(yán)格按照 JSON 格式編輯,任何格式錯(cuò)誤都將導(dǎo)致翻譯失敗或報(bào)錯(cuò)!
附:語言文件名稱一覽表
文件名 (.json) | 語言名稱 |
---|---|
en_US | English (United States) |
zh_CN | 中文 (簡(jiǎn)體) |
zh_TW | 中文 (臺(tái)灣) |
zh_HK | 中文 (香港) |
af | Afrikaans |
ar | ??????? |
ary | ??????? ???????? |
as | ??????? |
az | Az?rbaycan dili |
azb | ????? ????????? |
bel | Беларуская мова |
bg_BG | Български |
bn_BD | ????? |
bo | ??????? |
bs_BA | Bosanski |
ca | Català |
ceb | Cebuano |
cs_CZ | ?e?tina |
cy | Cymraeg |
da_DK | Dansk |
de_CH_informal | Deutsch (Schweiz, Du) |
de_DE | Deutsch |
de_CH | Deutsch (Schweiz) |
de_DE_formal | Deutsch (Sie) |
de_AT | Deutsch (?sterreich) |
dzo | ?????? |
el | Ελληνικ? |
en_GB | English (UK) |
en_ZA | English (South Africa) |
en_AU | English (Australia) |
en_CA | English (Canada) |
en_NZ | English (New Zealand) |
eo | Esperanto |
es_VE | Espa?ol de Venezuela |
es_ES | Espa?ol |
es_GT | Espa?ol de Guatemala |
es_MX | Espa?ol de México |
es_CR | Espa?ol de Costa Rica |
es_CO | Espa?ol de Colombia |
es_PE | Espa?ol de Perú |
es_AR | Espa?ol de Argentina |
es_CL | Espa?ol de Chile |
et | Eesti |
eu | Euskara |
fa_IR | ????? |
fi | Suomi |
fr_FR | Fran?ais |
fr_CA | Fran?ais du Canada |
fr_BE | Fran?ais de Belgique |
fur | Friulian |
gd | Gàidhlig |
gl_ES | Galego |
gu | ??????? |
haz | ????? ?? |
he_IL | ???????? |
hi_IN | ?????? |
hr | Hrvatski |
hu_HU | Magyar |
hy | ??????? |
id_ID | Bahasa Indonesia |
is_IS | íslenska |
it_IT | Italiano |
ja | 日本語 |
jv_ID | Basa Jawa |
ka_GE | ??????? |
kab | Taqbaylit |
kk | ?аза? т?л? |
km | ????????? |
kn | ????? |
ko_KR | ??? |
ckb | ?????? |
lo | ??????? |
lt_LT | Lietuvi? kalba |
lv | Latvie?u valoda |
mk_MK | Македонски ?азик |
ml_IN | ?????? |
mn | Монгол |
mr | ????? |
ms_MY | Bahasa Melayu |
my_MM | ????? |
nb_NO | Norsk bokm?l |
ne_NP | ?????? |
nl_BE | Nederlands (Belgi?) |
nl_NL | Nederlands |
nl_NL_formal | Nederlands (Formeel) |
nn_NO | Norsk nynorsk |
oci | Occitan |
pa_IN | ?????? |
pl_PL | Polski |
ps | ???? |
pt_BR | Português do Brasil |
pt_AO | Português de Angola |
pt_PT_ao90 | Português (AO90) |
pt_PT | Português |
rhg | Ruáinga |
ro_RO | Roman? |
ru_RU | Русский |
sah | Сахалыы |
si_LK | ????? |
sk_SK | Sloven?ina |
skr | ??????? |
sl_SI | Sloven??ina |
sq | Shqip |
sr_RS | Српски ?език |
sv_SE | Svenska |
szl | ?lōnsk? g?dka |
ta_IN | ????? |
te | ?????? |
th | ??? |
tl | Tagalog |
tr_TR | Türk?e |
tt_RU | Татар теле |
tah | Reo Tahiti |
ug_CN | ???????? |
uk | Укра?нська |
ur | ???? |
uz_UZ | O‘zbekcha |
vi | Ti?ng Vi?t |