使用PHP关联数组创建翻译类

问题描述 投票:0回答:2

我编写了一个非常简单的翻译类,该类应该返回与我赋予它的短语相关的含义。在引擎盖下,它将在构造时从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在数组中找不到键!

php associative-array
2个回答
2
投票

问题是,在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;
}

0
投票

您的csv在我看来更像json。

我可能会永久将文件调整为json,但在此之前,只需手动将其转换为json字符串,然后对其进行解码以创建键/值对即可。

self::$de = json_decode(
    '{' . implode(',', file(__DIR__ . "/a.csv")) . '}'
);
© www.soinside.com 2019 - 2024. All rights reserved.