Yii默认的 <h1>部分都是英文,这是因为模板文件中类似如下:
$label = $this->pluralize($this->class2name($this->modelClass)); echo "\$this->breadcrumbs=array( '$label', );\n"; ?> $this->menu=array( array('label'=>'Create <?php echo $this->modelClass; ?>','url'=>array('create')), array('label'=>'Manage <?php echo $this->modelClass; ?>','url'=>array('admin')), ); ?> <h1><?php echo $label; ?></h1>
即 $label 是从类的名字转换而来,同时显示为复数,这对于英文是有意义的,但对于中文,根本没有单复数的概念,而且页面中应该显示中文。如果每个地方都手动修改,不仅麻烦,而且一旦数据表结构变动需要重新生成原型,会造成前功尽弃。
考虑在模型类中增加一个静态字段或常量,用它代替作为模型的中文名(扩展开来说是本地语言的名字)。为了做得更彻底些,连模型的生成模板也修改掉。尽管用表的注释来作为中文名也是可能的,但似乎Yii本身并没有提供从表的元数据获取表的注释的代码(获取字段列的注释是本身实现的),如果大范围动yii/gii代码就显得不划算了,因此考虑最小切入点。
修改 framework/gii/generators/model/templates/default/model.php的代码:
class <?php echo $modelClass; ?> extends <?php echo $this->baseClass."\n"; ?> { const LOCAL_LANGUAGE_MODEL_NAME = '<?php echo $this->pluralize($this->class2name($modelClass)); ?>';修改crud模板protected/extensions/Booster/gii/bootstrap/templates/default/index.php的代码如下:
<?php echo "<?php\n"; $className = $this->modelClass; $label = $className::LOCAL_LANGUAGE_MODEL_NAME ;//$this->pluralize($this->class2name($this->modelClass));如此处理,默认生成的代码和原来一模一样,而如果我们在模型生成之后修改类常量的值,然后再生成crud代码,$label就都是中文了。这样做的问题是需要记住:必须在生成模型之后及时修改常量的值。有没有一种更彻底的做法,避免模型重新生成后重新修改常量的值?
把前述模型模板的代码修改成:
const LOCAL_LANGUAGE_MODEL_NAME = '<?php echo isset(Yii::app()->params['localLanguageModelNames']["$modelClass"]) ? Yii::app()->params['localLanguageModelNames']["$modelClass"] : $this->pluralize($this->class2name($modelClass)); ?>';
然后,如果项目配置文件main.php中包含了参数信息:
'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', 'localLanguageModelNames' => array( 'Pcpoint' => '普查点', ), ),那么类Pcpoint将自动带有常量LOCAL_LANGUAGE_MODEL_NAME,并且值为“普查点”。如果项目配置文件中未指定,则沿用yii给出的名称。
所以,完整的方案是:
1、修改模型模板model.php(见前述)
2、修改crud模板index.php、create.php、_form.php、update.php、view.php、admin.php中$label部分,并将Create、List、Manage、View等字样修改为中文(包括菜单、导航条、标题、提交按钮、链接显示名、表单必需字段提示、高级搜索提示)
3、从查看页点击删除的英文问题(此问题应当属于2、,因为在view.php文件菜单部分,无非在该行很后面不容发现需要修改)和日期选择控件的英文问题
我们在项目中配置语言为zh_cn,所以,对 TbDatePicker组件的初始化函数进行fix(注意该组件的js语言文件对应的简体中文后缀是zh-CN.js):
public function init() { $this->htmlOptions['type'] = 'text'; $this->htmlOptions['autocomplete'] = 'off'; if (!isset($this->options['language'])) { $languageInfo = explode('_', Yii::app()->getLanguage()); if($languageInfo[0] == 'zh') { $this->options['language'] = 'zh-'.strtoupper($languageInfo[1]); } else $this->options['language'] = substr(Yii::app()->getLanguage(), 0, 2); } parent::init(); }TbDatePicker的默认后缀文字也是英文的,虽然可以通过设置widgetOptions修改它,但为了省事,我们直接从Booster/gii/bootstrap/BootstrapCode.php修改它:
if($column->dbType == 'date') { return "\$form->datePickerGroup(\$model,'{$column->name}',array('widgetOptions'=>array('options'=>array(),'htmlOptions'=>array('class'=>'span5')), 'prepend'=>'<i class=\"glyphicon glyphicon-calendar\"></i>', 'append'=>'从弹出框选择日期或直接输入年月日(yyyy-mm-dd或yyyy/mm/dd).'))";
另外,TbDatePicker选择后显示的是 yyyy年mm月dd日,而提交后的数据也是如此,这样的数据是不能不能被date类型的mysql字段接受的,可以使用的办法是在控制器的
$model->attributes = $_POST['PcpointHead'];
语句前面添加正规化的语句,如将非数字替换为-,然后去掉首尾的-:
$_POST['PcpointHead']['mktbltime'] = trim(preg_replace('/\D+/', '-', $_POST['PcpointHead']['mktbltime']), '-');