简化大量相同的php条件

时间:2015-10-01 15:00:54

标签: php templates if-statement printf

我有一个问题,我想知道根据语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我很简单:

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. 数据参数的位置可以在字符串中更改(在末尾,中间..)
  3. 我想使用printf,但我不知道它是否会更好,我需要快速,最重要,易于维护。

    有什么想法吗?

3 个答案:

答案 0 :(得分: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 :(得分:0)

为什么不是阵列?

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

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

答案 2 :(得分:-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等,也可以用OOP编写,因此最好使用。