2015-10-01 2 views
1

У меня есть вопрос, я удивляюсь, что это лучший способ, чтобы напечатать много различных строк в зависимости от языка, я имею в виду, сегодня я sthg просто:упростить массовые одинаковые условия PHP

function getStringA($lang,$data1,$data2){ 
    if($lang=='en'){return 'my string is '.$data1.' and '.$data2;} 
    elseif($lang=='fr'){return 'ma chaine est '.$data1.' et '.$data2;} 
    elseif($lang=='it'){return $data1.'blabla '.$data2.' blabla';} 
    .. 
    [50 conditions] 
} 

function getStringB($lang,$data){ 
    [same 50 conditions, one per language] 
} 

function getStringC($lang,$data){ 
    .. 
} 
... 

, а затем:

echo getStringA('en','test','test1'); 
echo getStringB('en','AAAA'); 
echo getStringB('en','BBBB'); 
.. 
  1. всегда есть те же 50 языков условия на каждой функции
  2. место параметров данных можно изменить в строке (в конце, средний ..)

Я думал использовать printf, но я не знаю, будет ли это действительно лучше, мне нужно быстро и самое главное, быстрота обслуживания.

Любая идея?

ответ

0

Почему не массив?

$conditions = ['en' => 'foo', 'fr' => 'bar', etc...] 

if (isset($conditions[$lang])) { 
    return $conditions[$lang]; 
} else { 
    return $default_value; 
} 
+0

и как вы передаете параметры? – Julien

+0

Другая функция, чтобы построить строку, возможно. но вот как вы могли бы уйти от 50-item if/else/else/else/else /......../ else chain –

2

Положите строки в массив и изменения конкатенации в printf()-alike формат функции:

$stringsA = array(
    'en' => 'my string is %s and %s', 
    'fr' => 'ma chaine est %s et %s', 
    // ... 
); 

Затем в функции получить текст с помощью ключа массива:

function getStringA($lang,$data1,$data2){ 
    return isset($stringsA[$lang])? vprintf($stringsA[$lang], array($data1, $data2)) : ''; 
} 

Вы также можете использовать свой собственный заполнители в строках и str_replace() функция:

// e.g. 'my string is {propery} and {secondProperty}' 


function getStringA($lang,$data1,$data2){ 
    return isset($stringsA[$lang])? str_replace(array('{propery}', '{secondProperty}'), array($data1, $data2), $stringsA[$lang]) : ''; 
} 
-1

Используйте массивы и передать PARAMS вы можете использовать функцию vsprintf()

$translate = [ 
    'en' => [ 
    'my_string_is' => 'my string is %s and %s'; 
    ], 
    'fr' => [ 
    'my_string_is' => 'ma chaine est %s et %s'; 
    ] 
]; 

function translate ($translations, $word, $lang, array $params = []) { 
    return isset($translations[$lang][$word]) ? vsprintf($translations[$lang][$word], $params) : $word; 
} 

// usage 

echo translate($translations, 'my_string_is' ,'en', ['wordA', 'wordB']); 
echo translate($translations, 'my_string_is' ,'fr', ['wordA', 'wordB']); 

Это очень основная идея. Его можно написать лучше. Перевод может храниться в конфигурационных файлах, таких как ini, xml, yaml и т. Д. Также он может быть написан в ООП, поэтому было бы лучше использовать.

+0

, это не просто вернуть переведенные строки, это как построить строку с параметрами, использующими языковые шаблоны (место параметров может меняться в строке, в зависимости от языка) – Julien

+0

Я редактировал вопрос, чтобы пройти params – Robert

+0

спасибо, но очень тяжелый, я, наконец, нашел трюк, пожалуйста, прочитайте мой ответ – Julien

Смежные вопросы