代码之家  ›  专栏  ›  技术社区  ›  Tom

symfony i18n表:获取回退默认值的方法?

  •  3
  • Tom  · 技术社区  · 14 年前

    我在MySQL中构建了一个城市名称表,其中大约有10000行是symfony i18n表。基本上,默认的文化是en-u-us,表中的每个城市最初都是这种文化。随着时间的推移,我只想在表中添加那些可能使用不同语言的替代名称的城市,例如“伦敦(en ou us)/londres(es ou es)”,而不必在单独的表中复制每种语言的所有城市数据。

    现在,据我所知,symfony不会自动选择一个回退默认城市名称,如果它的翻译不存在的话。因此,我需要制定一个解决方案来执行以下操作:

    如果存在翻译,请选择它….如果没有,请选择默认的en-us城市名称。

    到目前为止,我似乎应该使用 COALESCE . 但是,由于我不太熟悉它,我想知道大量使用它是否有缺点?我之所以这样问是因为我需要将它包括在每个城市的查询中,这是我的网站上非常频繁的操作。

    会感激任何意见,甚至是对以更好的方式做事的建议。谢谢。

    3 回复  |  直到 11 年前
        1
  •  5
  •   Crozin    14 年前

    尝试如下操作:

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

    您还可以在城市模型中覆盖de 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;
    }
    

    当然,在数据库查询中,每次都必须加载这两个翻译。如果你用西班牙语显示主要内容,你需要得到这两个数据,正如克罗津之前指出的那样。

        3
  •  0
  •   Tom    14 年前

    如果将可用语言存储在不同的表中,则可以执行类似的操作。因此,它将返回默认的区域性名称,或者如果为空,它将返回第一个将被找到的区域性名称。

    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();        
        }
      }
    }