【问题标题】:Symfony i18n table: Ways to get fallback default value?Symfony i18n 表:获取回退默认值的方法?
【发布时间】:2011-01-08 19:44:21
【问题描述】:

我正在 MySQL 中构建一个城市名称表,其中包含大约 10K 行作为 Symfony i18n 表。基本上,默认文化是 en_US 并且表中的每个城市最初都是这种文化。随着时间的推移,我只想将那些可能有不同语言的替代名称的城市添加到表中,例如“伦敦(en_US)/伦敦(es_ES)”,而不必为每个城市复制所有城市数据不同表格中的语言。

现在,据我了解,如果不存在对应的翻译,Symfony 不会自动选择备用默认城市名称。所以我需要制定一个解决方案来执行以下操作:

如果存在翻译,选择它....如果没有,选择默认的 en_US 城市名称。

到目前为止,我似乎应该使用COALESCE。但是,由于我对它不是很熟悉,我想知道经常使用它是否有任何缺点?我问这个是因为我需要在每个城市查询中包含它,这是我网站上非常频繁的操作。

将不胜感激任何意见,甚至建议以更好的方式做事。谢谢。

【问题讨论】:

    标签: mysql internationalization geolocation symfony1 translation


    【解决方案1】:

    如果您将可用语言存储在不同的表中,您可以执行类似的操作。所以它会返回默认的文化名称,或者如果它是 NULL,它会返回一个将被找到的第一个。

    public function getName($culture = null)
    {
      if($this->getCurrentCitiesI18n($culture)->getName() != NULL)
        return $this->getCurrentCitiesI18n($culture)->getName();
      else
      {
        foreach (LanguagesPeer::getAvailablelanguages() as $lang)
        {
          if($this->getCurrentCitiesI18n($lang->getIsoCode())->getName() != NULL)
            return $this->getCurrentCitiesI18n($lang->getIsoCode())->getName();        
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      您还可以做的是覆盖城市模型中的 getName() 方法(或创建一个新方法,例如 getNameWithDefault())。 像这样的东西也可以工作:

      public function getName()
      {
        // Assuming that $this->name will give us the data for the current locale
        return ($this->name == NULL)? $this->Translation->en_US->name: $this->name;
      }
      

      当然,在您的数据库查询中,您每次都必须加载两个翻译。如果您以西班牙语显示主要内容,您将需要获取这两个数据,正如 Crozin 之前指出的那样。

      【讨论】:

        【解决方案3】:

        试试这样的:

        $q = Doctrine_Query::create()
             ->from('Cities c')
             ->leftJoin('c.Translation ct WITH lang IN(?)', array(array('es_ES', 'en_US')))
             ->execute();
        

        【讨论】:

        • 最终并没有完全使用它,但它给了我一个想法,谢谢。
        • 您能编辑您的问题并发布答案吗?它可能会帮助其他人。
        • 不确定我是否希望任何人都跟随我的脚步,因为我是一个完整的 PHP/MySQL 新手,但基本上看起来最简单的方法是使用 DQL 等价于“SELECT cityname WHERE”来检索这两个值文化=x 或文化=y”,其中一个条件始终是默认值。 OR 允许条件之一失败。然后,我可以从 PHP 中的数组中获取正确的值,或者只是添加 ORDER BY id ASC,这将始终在数组顶部返回正确的值,因为新翻译的 id 将高于最初输入的默认值。
        • @Tom 这可行,但如果翻译一半,你会得到 ~5k +~5k/2 行或更少
        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 2020-11-26
        • 1970-01-01
        相关资源
        最近更新 更多