我编写了一个非常简单的翻译类,该类应该返回与我赋予它的短语相关的含义。在引擎盖下,它将在构造时从csv的转换加载到关联数组中。根据翻译请求,它将检查数组。如果短语在数组中作为键存在,则返回其值,即其翻译。如果该短语不作为关键字存在,它将再次从文件中加载数组(因为可能会有新的翻译),再次检查关键字。如果再次找不到该密钥,则将按原样返回该短语。
<?php
class Translate{
function __construct() {
$this->loadTranslations();
}
public function get($message, $lang = "de"): string{
if(key_exists($message, self::$de)){
return self::$de[$message];
}
else {
//Load translations again
$this->loadTranslations();
if(isset(self::$de[$message])){
return self::$de[$message];
}
else {
return $message;
}
}
}
protected static $de = [];
protected function loadTranslations() {
$file = fopen(__DIR__ . "/../data/de.csv", "r");
if($file){
while($line = fgets($file)){
$en_de = explode(":", $line);
self::$de[array_shift($en_de)] = array_shift($en_de);
}
}
fclose($file);
}
}
$t = new Translate();
echo $t->get("Hello") . PHP_EOL;
de.csv的内容如下:
"Hi": "Hallo"
"Hello": "Hallo"
问题是当要求翻译时,该类始终返回给定的短语。当我转储数组时,该短语作为键存在,但是访问$ array [$ phrase]并没有成功,因为PHP在数组中找不到键!
问题是,在CSV文件中,文本带有引号,因此尽管Hello
存在,但实际上它以"Hello"
的形式存储在转换数组中,因此不匹配。
[您可以重做您的翻译文件以不加引号,也可以使用fgetcsv()
的功能来读取它并去除所有引号(使用:
作为分隔符...
protected function loadTranslations() {
$file = fopen(__DIR__ . "/a.csv", "r");
if($file){
while([$key, $trans] = fgetcsv($file, null, ":", '"')){
self::$de[$key] = $trans;
}
}
fclose($file);
}
只需查看要获取翻译的代码,您就可以缩短它。首先检查翻译是否已加载,然后返回翻译-使用??
表示是否找到翻译,然后返回原始消息...
public function get($message, $lang = "de"): string{
if(!isset(self::$de)){
$this->loadTranslations();
}
return self::$de[$message] ?? $message;
}
您的csv在我看来更像json。
我可能会永久将文件调整为json,但在此之前,只需手动将其转换为json字符串,然后对其进行解码以创建键/值对即可。
self::$de = json_decode(
'{' . implode(',', file(__DIR__ . "/a.csv")) . '}'
);