DotProject中文乱码解决总结
时间:2007-05-20
来源:互联网
DotProject中文乱码解决总结
这是我在CSDN上发表的,在这里发表并上传附件,这里有字数限制详细内容见:
http://blog.csdn.net/ilovemilk/archive/2007/03/23/1538688.aspx
最近需要一个项目管理软件,于是就下载DotProject进行了试用,感觉不错,但有中文有乱码问题,如:日历和gantt图。现就对解决DotProject乱码进行一下总结,由于本人以前没接触过PHP,初次修改有错的地方请大家指正。
机器环境:WindowsXP SP2简体中文,apache2.0.59, mysql-5.0.16-win32, php-5.2.0,其他版本没有测过,不能保证在其他版本下正确运行,由其在PHP4下。
1. 加入语言包
DotProject有比较不错的多语言包,项目叫dot modules,在sourceforge上有。DotProject的语言包目录./locales,运行可根据配置动态加载语言包进行对照转换相应的语言。下载中文语言包解压后并复制到语言目录locales下,修改语言包文件夹下locales.php文件:
$locale_char_set = 'GB2312';为$locale_char_set = 'utf-8';
同时把英文语言包的同名文件也进行修改。使用'utf-8'的好处就是浏览器用unicode(utf-8)解码,页面可显示多种语言文字。防照英文语言包创建lang.php文件,加入如下内容:
<?php
$dir = basename(dirname(__FILE__));
$LANGUAGES['zh-cn'] = array ( $dir, 'Chinese (Simplified)', '简体中文', 'chs');
?>
如果繁体则:
<?php
$dir = basename(dirname(__FILE__));
$LANGUAGES['zh-tw'] = array ( $dir, 'Chinese (Traditional)', '繁�w中文', 'cht');
?>
同时把目录下的所有对照文件转换为utf-8编码存储(可用ultraEdit等文本编辑器转换或登录后用DotProject翻译管理进行更改),初步汉化完成。
2. 修正在中文下日历的乱码问题
本地化语言后日历的星期显示为乱码,这是由于DotProject采用读取操作系统本地语言区域日期格式引起的,在windowsXP中文版默认是“星期几,xxxx-x-x”,且可能为GB2312编码(本地区域语言可以更改)。DotProject读取操作系统的日期用utf8_encode转换后再显示,这样只要操作系统的本地区域日期语言格式和运行DotProject选取的语言不一至时就会出现乱码,显然不是聪明的做法。
1)语言包文件夹下locales.php文件中加入日期格式对照表变量如下:
$locale_weeks = array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
$locale_short_week = array('日', '一', '二', '三', '四', '五', '六');
$locale_months = array(null, '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月');
$locale_short_months = array(null, '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月');
2)DotProject的日期处理基类在lib\PEAR\Date下Calc.php文件中,修改或增加其中的相关几个函数。
加入和修改如下函数:
//***************************************************************
//得到月全名称列表
function getMonthNames()
{
global $locale_months;
if(!empty($locale_months)){
$months = $locale_months;
}else{
for($i=1;$i<13;$i++){
$months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
}
}
return($months);
}
//****************************************************************
//得到月短名称列表
function getMonthShortNames($length=3)
{
global $locale_short_months;
if(!empty($locale_short_months)){
$months = $locale_short_months;
}else{
for($i=1;$i<13;$i++){
$months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
$months[$i] = substr($months[$i], 0, $length);
}
}
return($months);
}
//*****************************************************************
//得到星期全名称列表
function getWeekDays()
{
global $locale_weeks;
if(!empty($locale_weeks)){
$weekdays = $locale_weeks;
}else{
for($i=0;$i<7;$i++){
$weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
}
}
return($weekdays);
}
//****************************************************************
//得到星期短名称列表
function getShortWeekDays($length=3)
{
global $locale_short_week;
if(!empty($locale_short_week)){
$weekdays = $locale_short_week;
}else{
for($i=0;$i<7;$i++){
$weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
$weekdays[$i] = substr($weekdays[$i],0,$length);
}
}
return($weekdays);
}
//****************************************************************
//得到月全名称
function getMonthFromFullName($month)
{
$month = strtolower($month);
$months = Date_Calc::getMonthNames();
while(list($id, $name) = each($months)){
if(ereg($month, strtolower($name))){
return($id);
}
}
return(0);
}
//****************************************************************
//得到月短名称
function getMonthAbbrname($month,$length=3)
{
$month = strtolower($month);
$months = Date_Calc::getMonthShortNames();
while(list($id, $name) = each($months)){
if(ereg($month, strtolower($name))){
return($id);
}
}
return(0);
} // end func getMonthAbbrname
//****************************************************************
//得到星期短名称
function getWeekdayFullname($day="",$month="",$year="")
{
if(empty($year))
$year = Date_Calc::dateNow("%Y");
if(empty($month))
$month = Date_Calc::dateNow("%m");
if(empty($day))
$day = Date_Calc::dateNow("%d");
$weekday_names = Date_Calc::getWeekDays();
$weekday = Date_Calc::dayOfWeek($day,$month,$year);
return $weekday_names[$weekday];
} // end func getWeekdayFullname
//****************************************************************
//得到星期短名称
function getWeekdayAbbrname($day="",$month="",$year="",$length=3)
{
if(empty($year))
$year = Date_Calc::dateNow("%Y");
if(empty($month))
$month = Date_Calc::dateNow("%m");
if(empty($day))
$day = Date_Calc::dateNow("%d");
$weekday_names = Date_Calc::getShortWeekDays();
$weekday = Date_Calc::dayOfWeek($day,$month,$year);
return $weekday_names[$weekday];
} // end func getWeekdayAbbrname
以上几个函数有的是修改的,有的是新加的,由于较多,不再一一详细说明。思路是明显的,就是通过对日期列表的的映射获得相应语言名称。有兴趣的朋友可能进行补充和更正。
3)修改日期显示的乱码处,在modules\calendar\calendar.class.php文件把function _drawDays()函数中
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities(utf8_encode($day), ENT_COMPAT, $locale_char_set) . "</th>";
}
utf8_encode函数去掉修改为
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>";
}
完整的函数如下:
//***************************************************************
function _drawDays() {
global $locale_char_set;
$bow = Date_Calc::beginOfWeek( null,null,null,null,LOCALE_FIRST_DAY );
$y = substr( $bow, 0, 4 );
$m = substr( $bow, 4, 2 );
$d = substr( $bow, 6, 2 );
$wk = Date_Calc::getCalendarWeek( $d, $m, $y, "%a", LOCALE_FIRST_DAY );
$s = $this->showWeek ? " <th> </th>" : "";
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>";
}
return " <tr>$s </tr>";
}
//****************************************************************
修改文件module/tasks/ae_dates.php
function cal_work_day_conv($val) {
GLOBAL $locale_char_set;
$wk = Date_Calc::getCalendarWeek( null, null, null, "%a", LOCALE_FIRST_DAY );
$day_name = $wk[($val - LOCALE_FIRST_DAY)%7];
//把utf8_encode调用处注释,不进行编码转换
/*
if ($locale_char_set == "utf-8" && function_exists("utf8_encode")) {
$day_name = utf8_encode($day_name);
}
*/
return htmlentities($day_name, ENT_COMPAT, $locale_char_set);
}
以上是把显示日期名称时的utf8_encode转码去掉,因为读到的日期名称本来就是utf-8编码,类似的地方可能还有,如果找到都要去掉。
3....
在附件中是由DotProject2.1rc版修改过的压缩文件,并加入了最新的JpGraph for PHP5版本。有兴趣的朋友可以下载大家共同研究。
[local]1[/local]
[ 本帖最后由 ilovemilk 于 2007-5-19 18:44 编辑 ]
这是我在CSDN上发表的,在这里发表并上传附件,这里有字数限制详细内容见:
http://blog.csdn.net/ilovemilk/archive/2007/03/23/1538688.aspx
最近需要一个项目管理软件,于是就下载DotProject进行了试用,感觉不错,但有中文有乱码问题,如:日历和gantt图。现就对解决DotProject乱码进行一下总结,由于本人以前没接触过PHP,初次修改有错的地方请大家指正。
机器环境:WindowsXP SP2简体中文,apache2.0.59, mysql-5.0.16-win32, php-5.2.0,其他版本没有测过,不能保证在其他版本下正确运行,由其在PHP4下。
1. 加入语言包
DotProject有比较不错的多语言包,项目叫dot modules,在sourceforge上有。DotProject的语言包目录./locales,运行可根据配置动态加载语言包进行对照转换相应的语言。下载中文语言包解压后并复制到语言目录locales下,修改语言包文件夹下locales.php文件:
$locale_char_set = 'GB2312';为$locale_char_set = 'utf-8';
同时把英文语言包的同名文件也进行修改。使用'utf-8'的好处就是浏览器用unicode(utf-8)解码,页面可显示多种语言文字。防照英文语言包创建lang.php文件,加入如下内容:
<?php
$dir = basename(dirname(__FILE__));
$LANGUAGES['zh-cn'] = array ( $dir, 'Chinese (Simplified)', '简体中文', 'chs');
?>
如果繁体则:
<?php
$dir = basename(dirname(__FILE__));
$LANGUAGES['zh-tw'] = array ( $dir, 'Chinese (Traditional)', '繁�w中文', 'cht');
?>
同时把目录下的所有对照文件转换为utf-8编码存储(可用ultraEdit等文本编辑器转换或登录后用DotProject翻译管理进行更改),初步汉化完成。
2. 修正在中文下日历的乱码问题
本地化语言后日历的星期显示为乱码,这是由于DotProject采用读取操作系统本地语言区域日期格式引起的,在windowsXP中文版默认是“星期几,xxxx-x-x”,且可能为GB2312编码(本地区域语言可以更改)。DotProject读取操作系统的日期用utf8_encode转换后再显示,这样只要操作系统的本地区域日期语言格式和运行DotProject选取的语言不一至时就会出现乱码,显然不是聪明的做法。
1)语言包文件夹下locales.php文件中加入日期格式对照表变量如下:
$locale_weeks = array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
$locale_short_week = array('日', '一', '二', '三', '四', '五', '六');
$locale_months = array(null, '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月');
$locale_short_months = array(null, '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月');
2)DotProject的日期处理基类在lib\PEAR\Date下Calc.php文件中,修改或增加其中的相关几个函数。
加入和修改如下函数:
//***************************************************************
//得到月全名称列表
function getMonthNames()
{
global $locale_months;
if(!empty($locale_months)){
$months = $locale_months;
}else{
for($i=1;$i<13;$i++){
$months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
}
}
return($months);
}
//****************************************************************
//得到月短名称列表
function getMonthShortNames($length=3)
{
global $locale_short_months;
if(!empty($locale_short_months)){
$months = $locale_short_months;
}else{
for($i=1;$i<13;$i++){
$months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
$months[$i] = substr($months[$i], 0, $length);
}
}
return($months);
}
//*****************************************************************
//得到星期全名称列表
function getWeekDays()
{
global $locale_weeks;
if(!empty($locale_weeks)){
$weekdays = $locale_weeks;
}else{
for($i=0;$i<7;$i++){
$weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
}
}
return($weekdays);
}
//****************************************************************
//得到星期短名称列表
function getShortWeekDays($length=3)
{
global $locale_short_week;
if(!empty($locale_short_week)){
$weekdays = $locale_short_week;
}else{
for($i=0;$i<7;$i++){
$weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
$weekdays[$i] = substr($weekdays[$i],0,$length);
}
}
return($weekdays);
}
//****************************************************************
//得到月全名称
function getMonthFromFullName($month)
{
$month = strtolower($month);
$months = Date_Calc::getMonthNames();
while(list($id, $name) = each($months)){
if(ereg($month, strtolower($name))){
return($id);
}
}
return(0);
}
//****************************************************************
//得到月短名称
function getMonthAbbrname($month,$length=3)
{
$month = strtolower($month);
$months = Date_Calc::getMonthShortNames();
while(list($id, $name) = each($months)){
if(ereg($month, strtolower($name))){
return($id);
}
}
return(0);
} // end func getMonthAbbrname
//****************************************************************
//得到星期短名称
function getWeekdayFullname($day="",$month="",$year="")
{
if(empty($year))
$year = Date_Calc::dateNow("%Y");
if(empty($month))
$month = Date_Calc::dateNow("%m");
if(empty($day))
$day = Date_Calc::dateNow("%d");
$weekday_names = Date_Calc::getWeekDays();
$weekday = Date_Calc::dayOfWeek($day,$month,$year);
return $weekday_names[$weekday];
} // end func getWeekdayFullname
//****************************************************************
//得到星期短名称
function getWeekdayAbbrname($day="",$month="",$year="",$length=3)
{
if(empty($year))
$year = Date_Calc::dateNow("%Y");
if(empty($month))
$month = Date_Calc::dateNow("%m");
if(empty($day))
$day = Date_Calc::dateNow("%d");
$weekday_names = Date_Calc::getShortWeekDays();
$weekday = Date_Calc::dayOfWeek($day,$month,$year);
return $weekday_names[$weekday];
} // end func getWeekdayAbbrname
以上几个函数有的是修改的,有的是新加的,由于较多,不再一一详细说明。思路是明显的,就是通过对日期列表的的映射获得相应语言名称。有兴趣的朋友可能进行补充和更正。
3)修改日期显示的乱码处,在modules\calendar\calendar.class.php文件把function _drawDays()函数中
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities(utf8_encode($day), ENT_COMPAT, $locale_char_set) . "</th>";
}
utf8_encode函数去掉修改为
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>";
}
完整的函数如下:
//***************************************************************
function _drawDays() {
global $locale_char_set;
$bow = Date_Calc::beginOfWeek( null,null,null,null,LOCALE_FIRST_DAY );
$y = substr( $bow, 0, 4 );
$m = substr( $bow, 4, 2 );
$d = substr( $bow, 6, 2 );
$wk = Date_Calc::getCalendarWeek( $d, $m, $y, "%a", LOCALE_FIRST_DAY );
$s = $this->showWeek ? " <th> </th>" : "";
foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>";
}
return " <tr>$s </tr>";
}
//****************************************************************
修改文件module/tasks/ae_dates.php
function cal_work_day_conv($val) {
GLOBAL $locale_char_set;
$wk = Date_Calc::getCalendarWeek( null, null, null, "%a", LOCALE_FIRST_DAY );
$day_name = $wk[($val - LOCALE_FIRST_DAY)%7];
//把utf8_encode调用处注释,不进行编码转换
/*
if ($locale_char_set == "utf-8" && function_exists("utf8_encode")) {
$day_name = utf8_encode($day_name);
}
*/
return htmlentities($day_name, ENT_COMPAT, $locale_char_set);
}
以上是把显示日期名称时的utf8_encode转码去掉,因为读到的日期名称本来就是utf-8编码,类似的地方可能还有,如果找到都要去掉。
3....
在附件中是由DotProject2.1rc版修改过的压缩文件,并加入了最新的JpGraph for PHP5版本。有兴趣的朋友可以下载大家共同研究。
[local]1[/local]
[ 本帖最后由 ilovemilk 于 2007-5-19 18:44 编辑 ]
作者: ilovemilk 发布时间: 2007-05-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28