这是我的第一篇文章,我对编程很新(PHP,MYSQL,Javascript,CSS),但我是一个快速学习者,一直在这个论坛中寻找解决方案,但我不确定是什么要解决这个问题,我需要一个解决方案。
问题: 我正在使用我正在使用的脚本(我的一个朋友制作了这个并且半年不可用)正在翻译我的云服务时遇到很多麻烦。
云服务有4种语言供用户切换,这意味着我需要一个解决方案来翻译它们。 每次我想使用脚本来翻译某些内容时,我都会遇到很多重复的问题。 对于正在使用云服务并导航到不同页面的每个用户,将会创建另一个条目,其中包含所有内容的副本 - 我已设置要翻译的脚本 - 这些页面将保留。 截至目前,所有被插入的表格由26459行组成。如果没有重复项,则此表将有大约2000行。
这个想法是,如果有任何新功能在网页上显示某种文字,我只需要
<?php echo $translator->{'I can translate this text'} ?>
当脚本处于活动状态(设置为true)并且我访问该函数所在的页面时,文本数据将插入到我的数据库中由三列组成的表中:
value,lang,group
以下列的类型是(我不知道如果您需要了解这一点): 值(类型:文本) lang(类型:varchar(4)) group(type:int(9))
该表易于编辑,并且在我的云服务中设置了非常简单的用户界面。 用户界面如下所示:http://i.imgur.com/zLgHKV7.png
翻译脚本如下所示:
<?php
class Translator {
private $lang_file_path = 'application/lang/';
private $lang;
private $data;
public function __construct($lang) {
$this->lang = $lang;
if (file_exists(ROOT.$this->lang_file_path.$this->lang.'.json')) {
$this->data = json_decode(file_get_contents(ROOT.$this->lang_file_path.$this->lang.'.json'));
}
}
public function __get($val) {
// If translate == true, strings that can be translated will be saved into the database.
global $translate;
if( $translate == true)
{
global $globalDB;
$this->db = $globalDB;
$stmt = $this->db->prepare("SELECT `group` FROM language_string ORDER BY `group` DESC LIMIT 0,1");
$stmt->execute(array());
$res = $stmt->fetch(PDO::FETCH_ASSOC);
$nextGroup = $res['group'] + 1;
$stmt = $this->db->prepare("SELECT * FROM language_string WHERE value = ?");
$stmt->execute(array($val));
$res = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$res) {
$stmt = $this->db->prepare("INSERT INTO language_string (`value`, `lang`, `group`) VALUES (?, ?, ?)");
$stmt->execute(array($val, 'en', $nextGroup));
}
}
if (isset($this->data->{$val})) {
return $this->data->{$val};
} else {
return $val;
}
}
}
?>
这意味着对于脚本所处理的每个单独的文本字符串将被插入为5行,唯一分隔它们的是以下内容:
eng <<--- This is the original text and thus cannot be edited in the cloud service UI
en <<--- English 2 in the picture
de <<--- Deutch
es <<--- Spanish
sv <<--- Swedish
现在,我一直想弄清楚的是如何阻止脚本将大量重复项(http://i.imgur.com/kKXlxDa.png)插入到表中,而不会使列“group”唯一(因为总会有5委托每个翻译,所有5个翻译需要属于同一个组,以便在翻译UI中正确翻译。
对不起,如果这篇文章有点长,但我认为最好不要遗漏任何细节。