Symfony i18n表:如何获得后备默认值?

时间:2010-01-24 16:20:29

标签: mysql internationalization geolocation symfony1 translation

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

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

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

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

感谢任何观点,甚至建议以更好的方式做事。感谢。

3 个答案:

答案 0 :(得分:5)

尝试这样的事情:

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

答案 1 :(得分:0)

你还可以做的是覆盖城市模型中的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;
}

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

答案 2 :(得分:0)

如果您将可用语言存储在其他表中,则可以执行以下操作。所以它将返回默认的文化名称,或者如果它是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();        
    }
  }
}