Skip Navigation
الكتابة الأصلية
ديسمبر 12, 2014
تم تحديثه
مارس 11, 2020

يمكن للمطورين إنشاء محوّلات اللغة المخصصة الخاصة بهم باستخدام طلب واجهة البرمجة icl_get_languages من WPML. ستجد في هذا الدليل كل التفاصيل الخاصة بطلب icl_get_languages والأمثلة على محوّلات اللغة المخصصة التي تم إنشاؤها باستخدامه.

مراجعة سريعة:

  1. اطلب icl_get_languages لتحصل على قائمة كاملة بترجمات الصفحة المعروضة حاليًا
  2. اكتب وظيفة PHP الخاصة بك، والتي تعرض محوّل اللغة
  3. ضع محوّل اللغة في قالبك

جلب قائمة اللغات (الأخرى)

استخدم طلب icl_get_languages() لتحصل على قائمة بالترجمات لأي صفحة. إذا كنت تستخدم الإصدار WPML 3.2 أو أعلى، ينبغي عليك استخدام فلتر موضع إضافة الروتين wpml_active_languages المماثل.

الاستخدام:

icl_get_languages('skip_missing=N&orderby=KEY&order=DIR&link_empty_to=str')

* N=0/1
* KEY=id/code/name/custom (name -> translated_name), (default: id)
* DIR=asc/desc (default: asc)
* link_empty_to = str (الافتراضي: فارغ، يعمل بالتزامن مع skip_missing=0 ويتيح لك استخدام الروابط المخصصة للغات التي ليس لها ترجمات للعنصر الحالي. يمكن استخدام {%lang} كعنصر نائب لكود اللغة)

ملاحظات:

  • يقوم المعيار skip_missing بإخبار الوظيفة حول كيفية التعامل مع اللغات التي ليس لها ترجمات.
  • يتيح الجمع بين الأمرين orderby وorder إنشاء محوّل لغة ذي قائمة منسدلة أو محوّلات اللغة التي يتم من خلالها عرض اللغات في نفس الموضع بشكل دائم.
  • يمكنك تحديد الترتيب المخصصفي مدير WordPress من خلال القائمة WPML » اللغات » خيارات محوّل اللغة.

ترد الوظيفة بمصفوفة بمدخلات كل لغة. على سبيل المثال، بالنسبة لموقع WordPress به اللغات، الإنجليزية والفرنسية والإيطالية، سيكون رد الوظيفة:

Array
(
 [en] => Array
 (
 [id] => 1
 [active] => 1
 [native_name] => English
 [missing] => 0
 [translated_name] => English
 [language_code] => en
 [country_flag_url] => http://yourdomain/wpmlpath/res/flags/en.png
 [url] => http://yourdomain/about
 )

 [fr] => Array
 (
 [id] => 4
 [active] => 0
 [native_name] => Français
 [missing] => 0
 [translated_name] => French
 [language_code] => fr
 [country_flag_url] => http://yourdomain/wpmlpath/res/flags/fr.png
 [url] => http://yourdomain/fr/a-propos
 )

 [it] => Array
 (
 [id] => 27
 [active] => 0
 [native_name] => Italiano
 [missing] => 0
 [translated_name] => Italian
 [language_code] => it
 [country_flag_url] => http://yourdomain/wpmlpath/res/flags/it.png
 [url] => http://yourdomain/it/circa
 )
)

كل لغة لها مصفوفتها الخاصة من المعايير، والتي يمكن لوظيفة قالبك استخدامها في إنشاء أي محدد لغة.

  • id: معرف الهوية المرجعي الداخلي
  • active: هذه هي اللغة النشطة حاليًا (تكون هناك لغة واحدة نشطة فقط)
  • native_name: الاسم الأصلي للغة (لا تتم ترجمته أبدًا)
  • translated_name: اسم اللغة مترجمًا إلى اللغة النشطة حاليًا
  • country_flag_url: مسار الإنترنت إلى صورة PNG مع علم اللغة
  • url: الرابط إلى الترجمة بتلك اللغة
  • missing: 1 إذا كانت الترجمة لهذا العنصر مفقودة، و0 إذا كانت موجودة.

التعامل مع الترجمات المفقودة

بعض الصفحات قد تكون غير مترجمة إلى جميع اللغات. يمكنك إخبار الطلب icl_get_languages بما ينبغي عليه فعله مع اللغات التي ليست لها ترجمات.

إذا كان ‘skip_missing=1’، فإن تلك اللغات لن تظهر في النتائج. إذا كان ‘skip_missing=0’، ستظهر جميع اللغات، أما اللغات التي ليست لها ترجمات ستؤدي إلى إعادة التوجيه إلى الصفحة الرئيسية بتلك اللغة.

كيفية الاستخدام في وظائف قالبك

يمكنك إنشاء محوّلات اللغة الخاصة بك بأي طريقة تشاء. سنريك فيما طريقتين شائعتين.

الأمثلة على وظائف PHP التي نعرضها هنا ينبغي أن تدخل في ملف functions.php الخاص بك (في مجلد القالب) – لا تتم إضافتها إلى الملحق.

هذا المقال متاح أيضًا باللغة…

لنفترض أنك ترغب في إضافة سطر في أدنى كل مقال (أو أعلاه) للتوضيح ما إذا كانت هناك ترجمات متاحة لهذا المقال أم لا. ويجب على هذه الوظيفة الرد بالمقالات المترجمة الحالية فقط، وإن لم تكن هناك ترجمات متاحة لن تقوم بعرض أي شيء.

function icl_post_languages(){
 $languages = icl_get_languages('skip_missing=1');
 if(1 < count($languages)){
 echo __('This post is also available in: ');
 foreach($languages as $l){
 if(!$l['active']) $langs[] = '<a href="'.$l['url'].'">'.$l['translated_name'].'</a>';
 }
 echo join(', ', $langs);
 }
}

ما تفعله هذه الوظيفة هو:

  1. جلب قائمة اللغات من WPML – $languages = icl_get_languages(‘skip_missing=1’);
  2. التحقق ما إذا كانت هناك أكثر من لغة لهذا المقال – if(1 < count($languages))
  3. إنشاء النتائج، وتخطي اللغة المعروضة حاليًا – if(!$l[‘active’])

ملاحظات:

  1. يتم تمرير تلك الرسالة عبر gettext. هذا هام للغاية، وذلك كي تظهر تلك الرسالة التي ستلحقها بالمقالات ذات اللغات المختلفة باللغة الصحيحة: __(‘This post is also available in: ‘);
  2. أسماء اللغة المستخدمة هي الأسماء المترجمة للغات. هذا سيضمن كتابة العبارة بأكملها باللغة الصحيحة: $l[‘translated_name’]

والنتيجة تكون:

رسالة عن توافر المقال بلغات أخرى
رسالة عن توافر المقال بلغات أخرى

لتضمين هذه الرسالة في المقالات، قم بإضافة طلب لوظيفة icl_post_languages() من single.php.

قائمة بأسماء اللغات والأعلام لذيل الصفحة

حتى لو كان لديك محوّل لغة في أعلى الصفحة، سيكون من الجيد إضافة قائمة بأسماء اللغات والأعلام إلى ذيل الصفحة. يقوم غالبية الأشخاص في المعتاد بالتمرير لأسفل وصولاً إلى ذيل الصفحة، وذلك للتعرف بشكل أفضل على ما سيأتي لاحقًا، ولهذا، فإن وضع محوّل لغة ظاهر هناك قد يساعد الزوار من الأجانب.

function languages_list_footer(){
 $languages = icl_get_languages('skip_missing=0&orderby=code');
 if(!empty($languages)){
 echo '<div id="footer_language_list"><ul>';
 foreach($languages as $l){
 echo '<li>';
 if($l['country_flag_url']){
 if(!$l['active']) echo '<a href="'.$l['url'].'">';
 echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
 if(!$l['active']) echo '</a>';
 }
 if(!$l['active']) echo '<a href="'.$l['url'].'">';
 echo icl_disp_language($l['native_name'], $l['translated_name']);
 if(!$l['active']) echo '</a>';
 echo '</li>';
 }
 echo '</ul></div>';
 }
}

الوظيفة تفعل ما يلي:

  1. إذا كانت هناك أي لغة ترجمة، تقوم بإنشاء DIV وتبدأ بقائمة غير مرتبة: if(!empty($languages)){ echo ‘<div id=”footer_language_list”><ul>’;
  2. تمر عبر جميع اللغات وتضيف كل لغة منها كعنصر قائمة.
  3. إن لم تكن تلك اللغة هي اللغة النشطة، تقوم أيضًا بعمل رابط إلى تلك الصفحة بتلك اللغة: if(!$l[‘active’]) echo ‘<a href=”‘.$l[‘url’].'”>’;
  4. تضيف علم اللغة: <img src=”‘.$l[‘country_flag_url’].'” alt=”‘.$l[‘language_code’].'” width=”18″ height=”12″ />
  5. تضيف كلاً من اسمي اللغة، الأصلي والمترجم، إذا كانا مختلفين: echo icl_disp_language($l[‘native_name’], $l[‘translated_name’]);

يتم إنشاء الوظيفة icl_disp_language() بواسطة WPML. ما تفعله هو التحقق ما إذا كانت الوسيطتان (native_language_name, translated_language_name) مختلفتين. إذا كانتا كذلك، تقوم بالرد بكلتيهما، وإلا، تقوم بالرد بإحداهما فقط.

ينبغي علينا أيضًا إضافة بعض أكواد CSS لتنميط قائمة اللغات هذه. ستركز أكواد CSS تلك على قائمة اللغات الموجودة في ذيل صفحتك وتقوم بتنسيقها بعض الشيء:

#footer_language_list{
 margin-bottom: 25px;
 text-align: center;
}

#footer_language_list ul{
 list-style: none;
 margin:0;
 padding:0;
}

#footer_language_list ul li img{
 margin-right:5px;
}

#footer_language_list ul li{
 display:inline;
 margin:0 5px 0 5px;
 padding:0;
}

#footer_language_list ul li a, #footer_language_list ul li a:visited{
 color: #fff;
 text-decoration:underline;
}

#footer_language_list ul li a:hover, #footer_language_list ul li a:active{
 color: #fff;
}

فيما يلي محوّل اللغة:

اللغات في ذيل الصفحة
اللغات في ذيل الصفحة

لإضافته إلى قالبك، أضف هذا الطلب إلى languages_list_footer في ملف footer.php .

* ملاحظة: يمكنك تغييره بسهولة عن طريق تغيير محوّل اللغة الأفقي هذا إلى محوّل لغة رأسي. ما عليك سوى إزالة العبارة display: inline من كود CSS.

محدد اللغة ذو الأعلام فقط

وظيفة بسيطة لعرض الأعلام المرتبطة بترجمات الصفحة الحالية.

Language selector with flags only
function language_selector_flags(){
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if(!empty($languages)){
        foreach($languages as $l){
            if(!$l['active']) echo '<a class="wpml-ls-item" href="'.$l['url'].'">';
            echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
            if(!$l['active']) echo '</a>';
        }
    }
}

نتائج هذه الوظيفة تكون بحاجة للتنميط بشكل منفصل. على سبيل المثال، وضع الوظيفة في كتلة div وتحديد الأنماط المخصصة لعلامات img.

<div id="flags_language_selector"><?php language_selector_flags(); ?></div >

كود CSS:

#flags_language_selector img{
 margin:1px;
 border:1px solid #333;
}
محدد اللغة بالأعلام

محوّل اللغة الذي يعرض اللغات غير النشطة فقط

يمكن استخدام الكود المستخدم كمثال في هذا المقال لإنشاء محوّل لغة له الخصائص التالية:

  • يتم عرضه أفقيًا
  • يرتبط بقائمة معينة
  • يستخدم أعلام اللغات مع أسمائها الأصلية
  • يعرض اللغات غير النشطة فقط

يمكنك إضافة هذا الكود إلى ملف functions.php بقالبك. والحل الأفضل هو إضافته إلى ملف functions.php بالقالب الفرعي لقالبك.

بشكل افتراضي، يعمل هذا الكود جيدًا مع قوالب WordPress الافتراضية (Twenty Sixteen، Twenty Fifteen، وما إلى ذلك) مع theme_location == ‘primary’.

هذا هو محوّل اللغة في قالب Twenty Sixteen عندما تكون اللغة الحالية هي اللغة الإنجليزية.
هذه هي النتيجة في قالب Twenty Sixteen عندما تكون اللغة الحالية هي اللغة الإنجليزية.

جعل الكود يعمل مع قالبك

بعض القوالب الأخرى قد تستخدم مواقع أخرى للقالب. وعليه، إذا كان الكود لا يعمل مع قالبك، نرجو منك اتباع الخطوات التالية لجعله يعمل.

  1. قم بإلغاء تعليق السطر بمعنى آخر، قم بإزالة الشرطة المائلة المزدوجة (//) من بداية السطر المحتوي على الكود المذكور آنفًا.
  2. زر الواجهة الأمامية لموقعك. سترى موقع (مواقع) قالبك مثل [theme_location] => my-theme-location.
  3. حدد موقع القائمة الذي ترغب به، مثل: my-theme-location، وقم بتغيير السطر:
if ( $languages && $args->theme_location == 'primary') {

إلى:

if ( $languages && $args->theme_location == 'my-theme-location') {

إذا كنت غير متأكد من الموقع الصحيح الواجب استخدامه، يمكنك بكل بساطة تجربة مواقع القائمة واحدًا تلو الآخر.

  1. اعكس التغييرات التي قمنا بها في الخطوة الأولى، بحيث يعود السطر ليشبه الكود الأصلي.

الكود

// Filter wp_nav_menu() to add additional links and other output
// Show only other language in language switcher
// Use the new filter: https://wpml.org/wpml-hook/wpml_active_languages/ 
add_filter('wp_nav_menu_items', 'new_nav_menu_items', 10, 2);
function new_nav_menu_items($items, $args) {
 // uncomment this to find your theme's menu location
 //echo "args:&lt;pre&gt;"; print_r($args); echo "&lt;/pre&gt;";

 // get languages
 $languages = apply_filters( 'wpml_active_languages', NULL, 'skip_missing=0' );

 // add $args-&gt;theme_location == 'primary-menu' in the conditional if we want to specify the menu location.

 if ( $languages &amp;&amp; $args-&gt;theme_location == 'primary') {

 if(!empty($languages)){

 foreach($languages as $l){
 if(!$l['active']){
 // flag with native name
 $items = $items . '
&lt;li class="menu-item"&gt;&lt;a href="' . $l['url'] . '"&gt;&lt;img src="' . $l['country_flag_url'] . '" height="12" alt="' . $l['language_code'] . '" width="18" /&gt; ' . $l['native_name'] . '&lt;/a&gt;&lt;/li&gt;

';
 //only flag
 //$items = $items . '
&lt;li class="menu-item menu-item-language"&gt;&lt;a href="' . $l['url'] . '"&gt;&lt;img src="' . $l['country_flag_url'] . '" height="12" alt="' . $l['language_code'] . '" width="18" /&gt;&lt;/a&gt;&lt;/li&gt;

';
 }
 }
 }
 }

 return $items;
}

استبدال أعلام الدول وتغيير أسماء اللغات

يشتمل WPML على واجهة مستخدم رسومية GUI لتحرير معلومات اللغة. اذهب إلى WPML->اللغات، وانقر على تحرير اللغات. سيكون بمقدورك تغيير أسماء اللغات، وتحرير قيم الإعدادات المحلية الخاصة بهم، واختيار الأعلام المختلفة.

'skip_missing=0&orderby=name'