Хороший способ сделать текст со ссылками в gettext?

StackOverflow https://stackoverflow.com/questions/1484941

  •  18-09-2019
  •  | 
  •  

Вопрос

В настоящее время я занимаюсь интернационализацией с помощью gettext, используя PHP.Мне было интересно, есть ли какие-нибудь хорошие методы для этого примера:

By using this website, you accept the <a href="<?php print($dir); ?>/tos/">Terms of Use</a>.

Для en_US это предложение будет соответствовать такому формату.Однако на другом языке ссылка "Условия использования" может находиться в начале предложения.Есть ли элегантный способ сделать это?Спасибо, что уделили мне время.

Это было полезно?

Решение

Вот как бы я это сделал.Фраза , подлежащая переводу , будет выглядеть следующим образом

By using this website, you accept the <a>Terms of Use</a>.

Затем я бы заменил ссылку после того, как фраза будет локализована, например

$str = _('By using this website, you accept the <a>Terms of Use</a>.');
$str = preg_replace('#<a>(.*?)</a>#', '<a href="' . $dir . '/tos/">$1</a>', $str);

Конечно, вы можете заменить <a> и </a> с тем, что имеет смысл для вас и ваших переводчиков.Подумайте об этом, поскольку вам нужно экранировать свой вывод, чтобы переводчики не перепутали ваш HTML (намеренно или нет) Я бы, вероятно, выбрал что-то вроде

$str = htmlspecialchars(_('By using this website, you accept the [tos_link]Terms of Use[/tos_link].'));
$str = preg_replace('#\\[tos_link\\](.*?)\\[/tos_link\\]#', '<a href="' . $dir . '/tos/">$1</a>', $str);

Другие советы

Для простой интернационализации я просто создам массив для каждого языка, включу соответствующий файл и получу доступ к этому массиву, а не буду делать то, что делаете вы.

en.php:

$text = array(
     'footer' => 'By using this website, you accept the <a href="' . $dir . '/tos/">Terms of Use</a>.',
     'welcome' => 'Welcome to our website!'
);

index.php:

$langdir = '/path/to/languages';
$lang = ( $_GET['lang'] ) ? $langdir . '/' . $_GET['lang'] . '.php' : $langdir . '/en.php';
if( dirname($lang) != $langdir || !require_once( $lang ) )
     exit('Language does not exist');

echo '<p class="footer">' . $text['footer'] . '</p>';

В dirname() звонок имеет решающее значение;в противном случае пользователи получают несанкционированный доступ к любому php-файлу в вашей файловой системе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top