翻译脚本变得疯狂 - 使用SQL查询删除重复项

时间:2014-01-15 07:10:07

标签: php mysql sql sql-server

这是我的第一篇文章,我对编程很新(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中正确翻译。

对不起,如果这篇文章有点长,但我认为最好不要遗漏任何细节。

0 个答案:

没有答案
相关问题