HTML у рядку перекладу мови __ () або _e ()


24

Який правильний підхід до створення рядків перекладу?

Наприклад,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Чи правильно додавати рядки та / або HTML чи слід це зробити спочатку, а потім виконати переклад:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Відповіді:


41

У функції є другий аргумент __(). Слід встановити домен, який ви використовуєте для свого плагіна або теми. У наведених нижче прикладах я використовую 'text_domain'. Рядок вашого домену має бути унікальним. Він не повинен відповідати жодному іншому рядку домену. Не використовується аргумент текстового домену за замовчуванням до 'default'доменного імені WordPress. Детальнішу інформацію див. За посиланням.

Завжди використовуйте рядок ( 'text_domain'). Ніколи не використовуйте змінну, функцію або константу з рядком в ній. Більшість програм (усіх?) Перекладів не побачать його без рядка.

Ваш код:

echo __( 'Hello ' . $first . ' you own me money.' );

Не включайте змінні в рядок.

Кращий спосіб:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Або просто:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%sЗаповнювач говорить людський перекладач, рядок збирається там. Використовуйте %dдля чисел. Є й інші заповнювачі .

(Це речення є граматично неправильним англійською мовою. Використовуйте 'Hello %s, you owe me money.'або 'Hello %s, you own my money.'залежно від значення, яке ви мали намір.)


Ваш код:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Не перекладайте HTML. Це однаково в будь-якій мові.

Кращий спосіб:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Або розбити його на кілька рядків:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Якщо незрозуміло, що Ви являєте собою Верх і Низ , Ви можете використати _x()для пояснення контексту цих термінів.


Ви можете знайти інші випадки перекладу тут: Інтернаціоналізація: Ви, мабуть, робите неправильно


Ви кажете не перекладайте HTML. Можливо, я зазначу, що це не перекладається, а шукається у існуючій таблиці / с попередньо переведених рядків. Наявність HTML у рядку не має значення, якщо перекладач не видалив їх. Насправді в деяких ситуаціях це забезпечує кращу ефективність, ніж пошук і заміна регулярного вибору.
Двадцять

Неспоріднене, але все, що зауважує: textdomainповинно бути буквальним рядком, воно не може бути змінною / константою / властивістю.
brasofilo

@brasofilo, що поради написані у відповіді вгорі, але вони повторюються. Я помилився в декількох користувацьких плагінах, які я написав для клієнтів.
Чарльз Кларксон

+1 для sprintf(). Це дійсно навпаки наявність HTML в рядку, що перекладається.
helgatheviking

Я не бачу, як використання засобів sprintf()допомагає будь-яким іншим, крім, можливо, більш чистого вигляду. Якщо у вас є речення з HTML всередині, як, наприклад, Some text with a <strong>strong</strong> word inside.як можна перекласти речення в цілому, а не перекладати Some text with a, strongа word insideокремо (що не має сенсу).
phpheini

4

Я не торкнуся питання змінних у рядку, оскільки це вже було сказано.

Ви хочете, щоб ваш рядок був статичним, тобто зміст не змінився. Ви також хочете зберегти зайвий HTML.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Вищенаведене займе два ряди у вашій таблиці для того, що по суті є тим самим текстом. Їх можна переписати так:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Зведення його до одного ряду.

Іноді HTML у тексті неминучий. Візьмемо для прикладу:

__( 'You currently owe <b>%s</b> dollars' );

Оскільки мови є граматичними, розділення тексту може спричинити проблеми для того, хто перекладає.

Практичне правило. Середнє речення тегів для форматування тексту в HTML . Речення, що починаються і закінчуються HTML, просто марнують місце.


В останньому прикладі ви можете обернути жирні теги навколо вставленого аргументу "<b>$string</b>". Тоді можна використовувати 'You currently owe %s dollars'. Але може знадобитися залишитися, якщо використовувати його з _n()функцією, яка вимагає %dзаповнення місця.
Чарльз Кларксон

@CharlesClarkson Гарний дзвінок. Можливо, я повинен був залишити це, %sщоб зробити його трохи більш зрозумілим.
Twifty
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.