十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

DotProject中文乱码解决总结

上一篇 / 下一篇  2011-03-26 11:01:29 / 个人分类:项目管理

51Testing软件测试网;`i5f@ju

DotProject是一个基于AMP(apache+mysql+php)的开源项目管理工具,DotProject可以支持多语言并采用模块化设计以便于扩展。51Testing软件测试网pni*Q!K4yp
最近需要一个项目管理软件,于是就下载DotProject进行了试用,感觉不错,但有中文有乱码问题,如:日历和gantt图。现就对解决DotProject乱码进行一下总结,由于本人以前没接触过PHP,初次修改有错的地方请大家指正。
TA6I(Q/M$qa1I&E0 机器环境:WindowsXP SP2简体中文,apache2.0.59, mysql-5.0.16-win32, php-5.2.0,其他版本没有测过,不能保证在其他版本下正确运行,由其在PHP4下。51Testing软件测试网Ir2M |~ ~Z{"]
1. 加入语言包
;@#r |"Y k.pV6|u+vF0 DotProject 有比较不错的多语言包,项目叫dot modules,在sourceforge上有。DotProject的语言包目录./locales,运行可根据配置动态加载语言包进行对照转换相应的 语言。下载中文语言包解压后并复制到语言目录locales下,修改语言包文件夹下locales.php文件:
X0M`+F-MW1T GZ9K G0$locale_char_set = 'GB2312';为$locale_char_set = 'utf-8';51Testing软件测试网$JWDZNk
同时把英文语言包的同名文件也进行修改。使用'utf-8'的好处就是浏览器用unicode(utf-8)解码,页面可显示多种语言文字。防照英文语言包创建lang.php文件,加入如下内容:51Testing软件测试网Gk*?N(X n

/UU8CE&i^0
<?php
t\{nyf@G Z0
$dir = basename(dirname(__FILE__));51Testing软件测试网+p5k ^-@ XBg
$LANGUAGES['zh-cn'= array ( $dir, 'Chinese (Simplified)', '简体中文', 'chs');
~I4nH)[;Y|$WS b0
?>

B6fK?*cw B\e4s B051Testing软件测试网 A;HPZqwz
如果繁体则:
2|cLRE8LX0f051Testing软件测试网.@2|Mz4K&D,t$B

<?php51Testing软件测试网!A^:Hp!mN
$dir = basename(dirname(__FILE__));51Testing软件测试网b*^(nM5mY$kM*V
$LANGUAGES['zh-tw'= array ( $dir, 'Chinese (Traditional)', '繁體中文', 'cht');
t&jU pQ8E0
?>
51Testing软件测试网_ Y}H1E-@t

同时把目录下的所有对照文件转换为utf-8编码存储(可用ultraEdit等文本编辑器转换或登录后用DotProject翻译管理进行更改),初步汉化完成。
uQe Dv02. 修正在中文下日历的乱码问题51Testing软件测试网!^/|8j+~Sn]2H|r
本 地化语言后日历的星期显示为乱码,这是由于DotProject采用读取操作系统本地语言区域日期格式引起的,在windowsXP中文版默认是“星期 几,xxxx-x-x”,且可能为GB2312编码(本地区域语言可以更改)。DotProject读取操作系统的日期用utf8_encode转换后再 显示,这样只要操作系统的本地区域日期语言格式和运行DotProject选取的语言不一至时就会出现乱码,显然不是聪明的做法。51Testing软件测试网4{m3_ u v/|&Pw
1)语言包文件夹下locales.php文件中加入日期格式对照表变量如下:

,s$BD!J9W*gD%oO Nm0
$locale_weeks = array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');51Testing软件测试网 u3ax:|Ue
$locale_short_week = array('', '', '', '', '', '', '');
fm qlp*N0
$locale_months = array(null, '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月');51Testing软件测试网7p2V4Qj7?2Bwq*n
$locale_short_months = array(null, '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月');

"y x p#_-~-`;D02)DotProject的日期处理基类在lib\PEAR\Date下Calc.php文件中,修改或增加其中的相关几个函数。
K5{(T x?0加入和修改如下函数:51Testing软件测试网_?5M+ktR5{;`\M

//***************************************************************51Testing软件测试网D'yj!n*Hs7da
//得到月全名称列表
51Testing软件测试网;w;dn`ug
function getMonthNames()
B`&`i2Mt cK+B0{
2E&g1J m.Y9C,f0    
global $locale_months;
z#pZ&NK)G+[-YO.Y"^,Lg0  
if(!empty($locale_months)){51Testing软件测试网W,\z4t B U'ZQ9z8I@)?^
    
$months = $locale_months;51Testing软件测试网lg*y B#p7@w
 51Testing软件测试网2G\ j(P3k!f
 }
else{
x Mu8D{f(Pj w0    
for($i=1;$i<13;$i++){51Testing软件测试网w6d5w7O,A @#l4A1o
        
$months[$i= strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
q;oj3`3[1_#zeh0_0    }51Testing软件测试网_WBde0R1ac
  }51Testing软件测试网VMd^*]HB c
  
return($months);
-iW RE%Y4{qB:Y0}
rx,fDQ h&k0
7G oh[4?%xqg t-Q"c0
//****************************************************************
5h B~p#{vkF-f0//得到月短名称列表    
51Testing软件测试网l;x c/_6I0G:E$eG
function getMonthShortNames($length=3)
g} @;g PW6p0{
3mon3OB^W N/zW0        
global $locale_short_months;51Testing软件测试网0R,dq8H C1ky'a
   
if(!empty($locale_short_months)){51Testing软件测试网;}3],hm4F |xl ta5t
    
$months = $locale_short_months;51Testing软件测试网,R:sLq E}H
   
R+s-Z7w(pN#r$q0  }
else{
gI#\9`;ysfO x Q8{ h0            
for($i=1;$i<13;$i++){
$iY&\i*XU0                
$months[$i= strftime('%B', mktime(0, 0, 0, $i, 1, 2001));51Testing软件测试网#]6KBx6^
                
$months[$i= substr($months[$i], 0, $length);51Testing软件测试网E[@u0av
            }
2q}fBUS m C'L;{NI0        }
8tr4m#i%`e7PU7r4S0        
return($months);51Testing软件测试网"i7RS"? Q)v
}  51Testing软件测试网s5P)F6j2}"B yITg:~z
51Testing软件测试网 c zuXId q1H-a
//*****************************************************************51Testing软件测试网5o1F7Qb9u&G1c
//得到星期全名称列表     
51Testing软件测试网f(l~#`$GJ?*GW
function getWeekDays()
(C\P#^0^W/fF0{51Testing软件测试网w#I|ki.I6F
        
global $locale_weeks;51Testing软件测试网&a*_%B4?g6F
   
if(!empty($locale_weeks)){51Testing软件测试网 DsN"o$G
    
$weekdays = $locale_weeks;
-F;[;[~AH{L;y,Q0  
;J(Z,@.Qp p0  }
else{
P"v:{M/vB}+GXNd@0      
for($i=0;$i<7;$i++){51Testing软件测试网QY7X3e0i,\%\
            
$weekdays[$i= strftime('%A', mktime(0, 0, 0, 1, $i, 2001));51Testing软件测试网zE!w.y Ew#K7B
            }
U!h|9kO)IFm'K0^0        }        51Testing软件测试网!`W4^ p3D
        
return($weekdays);
1m7k+b!p7@L,v0}
x8V;^+z R0
@Myu4b |-O&G0
//****************************************************************
3q7C"xt*r-p@@0//得到星期短名称列表   
51Testing软件测试网 P5ch,SMb2aB
function getShortWeekDays($length=3)
F J@#N)_:c0{
$C yPJF uU0        
global $locale_short_week;
_w-jgH0   
if(!empty($locale_short_week)){
m-I(O/c?*E b,c0    
$weekdays = $locale_short_week;
-[Ih!t;e GX0    
T_E+@5Ww0  }
else{
-\.v/{b"n@0            
for($i=0;$i<7;$i++){51Testing软件测试网9\]#_Gf![UL
                
$weekdays[$i= strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
u o|+G9]|z.~-X0                
$weekdays[$i= substr($weekdays[$i],0,$length);                
L-d)F,xEP0            }51Testing软件测试网 U\'i] `:`r
        } 51Testing软件测试网 rmYw)U3YU i-w
        
return($weekdays);
uZT| j}Y7K0
$Qlb*Uz#xPJ0
u7w}c k1sw0
//****************************************************************
4|Im/aF$a&x;a0//得到月全名称

zEM5Y)V0
function getMonthFromFullName($month)
!zA-DS T0{
8a4v}:R9v_(c g)Rx0        
$month = strtolower($month);
D\ vQ3T"f]E;Psv0        
$months = Date_Calc::getMonthNames();
l1W*~2f/U0o&ceC"_:q;N0        
while(list($id, $name= each($months)){51Testing软件测试网m1i\5i'J${.~
            
if(ereg($month, strtolower($name))){
1t-P.o"_~0                
return($id);
.| T^*y/}\0            }51Testing软件测试网?9rSWEUw
        }51Testing软件测试网;Je*sg8{6u
        
return(0);51Testing软件测试网c/o!zu s8QPL
}  51Testing软件测试网 }dF nNK7C H~

)y` S tXG&{0
//****************************************************************51Testing软件测试网z }X3g$G'CK
//得到月短名称 

{;c^6i TJ-T6k)N0
function getMonthAbbrname($month,$length=3)
*[ O-`M Ee.V0{
!p+JV ?'ocu)z0        
$month = strtolower($month);51Testing软件测试网o,t0}@x-N"S7{
        
$months = Date_Calc::getMonthShortNames();
ly0{:yz[H0        
while(list($id, $name= each($months)){51Testing软件测试网,TuR-l2Y^#v*L Fk
            
if(ereg($month, strtolower($name))){51Testing软件测试网 e(W3c;c b:XNO_4o:X
                
return($id);
'x%Ryvu'}tij g0            }
ht:c/xS7q0        }51Testing软件测试网rt[+I M.vT$Zt
        
return(0);51Testing软件测试网+{h8i2qHC{k;d
// end func getMonthAbbrname51Testing软件测试网O$f;C}2Z*}do
51Testing软件测试网-z!`^7A3\4` {n*r
//****************************************************************
_A&Vr9|+G N0//得到星期短名称

,t.L_-q \#Cw5z0
function getWeekdayFullname($day="",$month="",$year="")51Testing软件测试网CYk-P@
{
$um-GUyC:u0        
if(empty($year))
^;KO2ky&fM0            
$year = Date_Calc::dateNow("%Y");
Z+J;R^^$R C&\0        
if(empty($month))51Testing软件测试网w9v9h2J*@P6JRScS
            
$month = Date_Calc::dateNow("%m");
@%u.Wh"G0        
if(empty($day))51Testing软件测试网,^_8b.y7Xw/SN F!a
            
$day = Date_Calc::dateNow("%d");
~e| j j?V0
:tZ q|oL0        
$weekday_names = Date_Calc::getWeekDays();51Testing软件测试网3B;UA |5M+r
        
$weekday = Date_Calc::dayOfWeek($day,$month,$year);51Testing软件测试网:D5f1TLdU th

1r)t8VO']jQB \0        
return $weekday_names[$weekday];51Testing软件测试网z#^ M$Zk r
51Testing软件测试网8rd;Y:`I6IP7d4Fp
// end func getWeekdayFullname51Testing软件测试网G;G {@g ML&G$u

^ J6s)|3Z|Q0//****************************************************************51Testing软件测试网,}M'[ YbrCv
//得到星期短名称

Pr8CJ9X*c0
function getWeekdayAbbrname($day="",$month="",$year="",$length=3)51Testing软件测试网1JDym!_%ZJ
{51Testing软件测试网6i0xYDha|3T6W
        
if(empty($year))
ls+U9i#od0            
$year = Date_Calc::dateNow("%Y");51Testing软件测试网F,R-Dg0CF6t9f
        
if(empty($month))
'[1KA+Q$Ts$G0            
$month = Date_Calc::dateNow("%m");
3E |}#E+k6a A0        
if(empty($day))
;I{+P[H bb0            
$day = Date_Calc::dateNow("%d");51Testing软件测试网d z^4s p~@

^ X3jY0s6G0        
$weekday_names = Date_Calc::getShortWeekDays();51Testing软件测试网7G1jH,} Nh R
        
$weekday = Date_Calc::dayOfWeek($day,$month,$year);
1j$V)D5bb051Testing软件测试网6d%p*fx|Z1F7\LK
   

TAG: DotProject

 

评分:0

我来说两句