דברים מסוימים פועלים אחרת באתר רב-לשוני באופן מכוון: פונקציית WordPress שמבוססת על מונח בשפת ברירת המחדל, סיומת תאריך ש־WordPress אינו יכול להתאים לשפה המקומית, או מזהה כתובת שעורך התרגום המתקדם אינו ממציא. פניות לתמיכה מציגות אותם כבאגים; הם אינם כאלה. עמוד זה מסביר מה קורה, מדוע, ומה לעשות במקום זאת.
has_category() ותגיות תנאי אחרות בפוסטים מתורגמים
הפונקציה has_category() בליבה של WordPress אינה מסוננת על ידי WPML, בכוונה. בתרגום, הקטגוריה היא המונח המתורגם, שלו יש מזהה כתובת משלו, לכן has_category('news') מחזיר false בפוסט הצרפתי למרות שהפוסט הצרפתי נמצא בקטגוריה הצרפתית "news". הדבר נכון גם לגבי has_term(), in_category() וכל קוד שמשווה מזהה כתובת או מזהה מונח של שפת ברירת המחדל. קרא לתנאי עם מזהה הכתובת המתורגם, או פתור את מזהה המונח דרך הפילטר wpml_object_id תחילה.
מה שאתה רואה
הפונקציה המובנית של WordPress has_category אינה פועלת עבור פוסטים מתורגמים.
דוגמה לכך היא כדלקמן:
- יש לנו קטגוריה עם מזהה הכתובת האנגלי "test" והתרגום שלו לצרפתית "test-fr".
- קטגוריה זו משויכת לפוסטים.
- כאשר אתה קורא ל־
has_category("test")בתוך לולאה בקובץ single.php של ערכת העיצוב שלך, הוא מחזיר true עבור שפת ברירת המחדל אך false עבור התרגום.
מה לעשות
הגדר פילטר חדש בקובץ functions.php של ערכת העיצוב שלך:
function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);החלף את הפונקציה has_category בפילטר החדש הזה:
apply_filters( 'wp_has_category', 'test' )
פילטר זה לוקח את הקטגוריה המתורגמת בהתבסס על שמה של המקורית ובודק אם הקטגוריה המתורגמת משויכת לפוסט.
סימוכין: wpmlcore-3024.
סיומות תאריך (1st, 2nd, 3rd) אינן ניתנות לתרגום
זוהי מגבלה של הליבה של WordPress, לא של WPML: הסיומת מגיעה מעיצוב התאריך של PHP ולעולם אינה עוברת דרך פונקציית תרגום.
מה שאתה רואה
חלק מערכות העיצוב או התוספים משתמשים בפונקציות wp_date() או date_i18n() של WordPress כדי להציג תאריכים. תאריכים אלה עשויים להשתמש בסיומת כמו 1st או 26th, בהתאם לפרמטרים שנבחרו.
נכון לעכשיו, לא ניתן לתרגם סיומות תאריך בגלל מגבלה ידועה ארוכת שנים בליבה של WordPress.
מה לעשות
כפתרון עוקף, תוכל להשתמש בפילטר wp_date כדי לקבל את התאריך, ולאחר מכן לשנות את הסיומת לפני שהיא מוצגת בעמוד. אנא בצע גיבוי מלא של האתר שלך לפני שתמשיך ובצע את השלבים הבאים:
- הוסף פילטר
wp_dateקטן לקובץ functions.php של ערכת העיצוב שלך שרושם כל סיומת כמחרוזת (icl_register_string) ומחזיר את התרגום שלה (icl_t) במקום הסיומת האנגלית: - פתח את העמוד שבו מוצגים התאריכים. פעולה זו תפעיל את הפילטר שנוסף.
- עבור אל WPML → תרגום מחרוזות ותרגם את התאריכים.
- יהיה עליך לתרגם כל סיומת בנפרד (לדוגמה 1st, 2nd...) מכיוון שהיא עשויה להשתנות בהתאם לשפה.
סימוכין: compsupp-5773.
עורך התרגום המתקדם אינו ממציא מזהה כתובת
העורך מתרגם את השדה של מזהה הכתובת כאשר אתה ממלא אותו ושומר על מזהה הכתובת המקורי כאשר אתה משאיר אותו ריק. הוא לעולם אינו גוזר מזהה כתובת מהכותרת המתורגמת בעצמו.
מה שאתה רואה
אם תתרגם פוסט באמצעות עורך התרגום המתקדם שלנו, השדה מזהה כתובת אינו מתמלא אוטומטית. אם לאחר מכן תחליט להשאיר את השדה של מזהה הכתובת ריק, הוא יטען את המזהה כתובת של השפה המקורית בפוסט המתורגם.
סימוכין: wpmlsupp-8574.
שורטקודים של תוסף בניית עמודים בתיאור קצר של מוצר ב־WooCommerce
התיאור הקצר הוא תקציר הפוסט, שדה טקסט רגיל לפי ההגדרה של WordPress, ולכן WPML אינו מפענח בתוכו שורטקודים של תוסף בניית עמודים כפי שהוא עושה בתוכן. WooCommerce במקרה מציג אותם, וזו הסיבה שחוסר ההתאמה מפתיע אנשים.
מה שאתה רואה
התיאור הקצר של מוצר ב־WooCommerce מבוסס על שדה תקציר הפוסט, וזהו בדרך כלל שדה טקסט פשוט שאינו מטפל בשורטקודים. לכן לא מצופה שאם תדביק שורטקודים של תוסף בניית עמודים לתוך תקציר הפוסט הם יעבדו, ובעת תרגום תקצירי פוסטים WPML אינו מנסה לטפל בשורטקודים כאלה.
אך WC מטפל ב"תקצירים" אלה קצת אחרת, ושורטקודים כן עובדים, אבל WPML עדיין מתנהג כאילו הם לא, ואם השורטקוד כולל מאפיינים שזקוקים לתרגום או קישורים פנימיים שאמורים להיות מטופלים אוטומטית, הדבר אינו אפשרי בקלות.
מה לעשות
הכנו קוד שניתן להוסיף כתוסף כדי לספק פונקציונליות זו. העתק והדבק את הקוד להלן לתוך קובץ שתוכל לקרוא לו wpmlpb-excerpts.php ושמור בספרייה wp-content/plugins/ שלך, ולאחר מכן הפעל את התוסף.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}
סימוכין: wpmlpb-686.
דומיין שונה לכל שפה באחסון של WordPress.com
WordPress.com ממפה דומיין אחד לאתר; פורמט ה־URL "דומיין שונה לכל שפה" דורש שכל דומיין של שפה יגיע לאותו WordPress, דבר שאחסון זה אינו מציע.
מה שאתה רואה
בגלל מגבלות על האופן שבו מיפוי דומיינים עובד עם WordPress.com, לא ניתן לבחור בהגדרה של כתובות URL של שפות להשתמש בדומיין שונה לכל שפה כאשר אתרים מאוחסנים אצלם.
מה לעשות
ניתן להשתמש בכל אחת משתי אפשרויות ה־URL האחרות של שפות, עם שפות שונות בספריות או שם השפה נוסף כפרמטר, במקום דומיין שונה לכל שפה.
יהיה צורך במאחסן אחר אם דומיין שונה לכל שפה הוא דרישת חובה.
סימוכין: wpmltriage-2045.
תרגומים מיובאים ועורכי התרגום
ייבוא כותב תרגומים מוגמרים; הוא אינו יוצר משימות תרגום, והעורכים עובדים מתוך משימות. התרגומים הושלמו בצד הלקוח ופשוט אינם ניתנים לעריכה בעורך התרגום המתקדם או בעורך התרגום הקלאסי.
מה שאתה רואה
בכל פעם שאתה מייבא תוכן באמצעות WP All Import והתוסף הנלווה WPML All Import, תראה את תרגומי הפוסטים המיובאים בצורה מושלמת בצד הלקוח. עם זאת, תיתקל בבעיות אם תנסה לעדכן אותם באמצעות עורכי התרגום של WPML:
- עורך התרגום הקלאסי מציג תוכן בשפת ברירת המחדל במקום את התרגומים המיובאים
- עורך התרגום המתקדם מציג תרגומים ריקים
הסיבה לכך היא שכאשר אתה מייבא תוכן רב-לשוני, WPML אינו יוצר משימות תרגום, אשר נדרשות עבור חלוקת מחרוזות (string segmentation).
מה לעשות
כדי לערוך או לעדכן את התרגומים המיובאים שלך, אנא עבור לעורך המובנה של WordPress והשתמש בתרגום ידני.
סימוכין: WPMLAI-168.