From bf805a2211394af64643ea7fd66d451da21a2870 Mon Sep 17 00:00:00 2001 From: wangchunsheng Date: Sat, 3 Mar 2012 00:44:50 +0000 Subject: [PATCH] * conver 2 unix. --- build/windows/xampp/index.php | 166 ++-- module/common/lang/zh-cn.php | 600 ++++++------- module/common/lang/zh-tw.php | 600 ++++++------- module/common/model.php | 734 ++++++++-------- module/common/view/footer.html.php | 62 +- module/common/view/header.html.php | 60 +- module/svn/control.php | 196 ++--- module/svn/lang/en.php | 32 +- module/svn/lang/zh-cn.php | 32 +- module/svn/lang/zh-tw.php | 32 +- module/svn/model.php | 1268 ++++++++++++++-------------- module/svn/syncer/syncer.php | 598 ++++++------- module/svn/view/cat.html.php | 32 +- module/svn/view/diff.html.php | 34 +- 14 files changed, 2223 insertions(+), 2223 deletions(-) diff --git a/build/windows/xampp/index.php b/build/windows/xampp/index.php index 1b817d7f5c..ee6dc35152 100644 --- a/build/windows/xampp/index.php +++ b/build/windows/xampp/index.php @@ -1,83 +1,83 @@ -langs['cn'] = '中文简体'; -$config->langs['en'] = 'EN'; - -$lang->cn->title = '欢迎使用禅道集成运行环境!'; -$lang->cn->poweredBy = "由xampp精简而来"; - -$lang->cn->links['zentao']['link'] = '/zentao/'; -$lang->cn->links['zentao']['text'] = '访问禅道'; -$lang->cn->links['zentao']['target'] = '_self'; -$lang->cn->links['official']['link'] = 'http://www.zentao.net/'; -$lang->cn->links['official']['text'] = '禅道官网'; -$lang->cn->links['official']['target'] = '_blank'; -$lang->cn->links['sqlbudyy']['link'] = '/sqlbuddy/'; -$lang->cn->links['sqlbudyy']['text'] = '数据库管理'; -$lang->cn->links['sqlbudyy']['target'] = '_blank'; -$lang->cn->links['phpinfo']['link'] = '?mode=phpinfo'; -$lang->cn->links['phpinfo']['text'] = 'PHP信息'; -$lang->cn->links['phpinfo']['target'] = '_blank'; - -$lang->en->title = 'Welcome to use zentao!'; -$lang->en->poweredBy = "reduced from xampp"; - -$lang->en->links['zentao']['link'] = '/zentao/'; -$lang->en->links['zentao']['text'] = 'ZenTao'; -$lang->en->links['zentao']['target'] = '_self'; -$lang->en->links['official']['link'] = 'http://www.zentao.net/'; -$lang->en->links['official']['text'] = 'Community'; -$lang->en->links['official']['target'] = '_blank'; -$lang->en->links['sqlbudyy']['link'] = '/sqlbuddy/'; -$lang->en->links['sqlbudyy']['text'] = 'MySQL'; -$lang->en->links['sqlbudyy']['target'] = '_blank'; -$lang->en->links['phpinfo']['link'] = '?mode=phpinfo'; -$lang->en->links['phpinfo']['text'] = 'PHP'; -$lang->en->links['phpinfo']['target'] = '_blank'; - -if(is_file('./my.php')) include './my.php'; - -$acceptLang = stripos($_SERVER['HTTP_ACCEPT_LANGUAGE'], 'zh-CN') !== false ? 'cn' : 'en'; -$acceptLang = isset($_GET['lang']) ? $_GET['lang'] : $acceptLang; -$clientLang = $lang->$acceptLang; -?> - - - - - - <?php echo $clientLang->title;?> - - - - - - - - - - - - - - -
title;?>
- poweredBy . ' '; - foreach($config->langs as $langCode => $langName) echo "$langName"; - ?> -
- - +langs['cn'] = '中文简体'; +$config->langs['en'] = 'EN'; + +$lang->cn->title = '欢迎使用禅道集成运行环境!'; +$lang->cn->poweredBy = "由xampp精简而来"; + +$lang->cn->links['zentao']['link'] = '/zentao/'; +$lang->cn->links['zentao']['text'] = '访问禅道'; +$lang->cn->links['zentao']['target'] = '_self'; +$lang->cn->links['official']['link'] = 'http://www.zentao.net/'; +$lang->cn->links['official']['text'] = '禅道官网'; +$lang->cn->links['official']['target'] = '_blank'; +$lang->cn->links['sqlbudyy']['link'] = '/sqlbuddy/'; +$lang->cn->links['sqlbudyy']['text'] = '数据库管理'; +$lang->cn->links['sqlbudyy']['target'] = '_blank'; +$lang->cn->links['phpinfo']['link'] = '?mode=phpinfo'; +$lang->cn->links['phpinfo']['text'] = 'PHP信息'; +$lang->cn->links['phpinfo']['target'] = '_blank'; + +$lang->en->title = 'Welcome to use zentao!'; +$lang->en->poweredBy = "reduced from xampp"; + +$lang->en->links['zentao']['link'] = '/zentao/'; +$lang->en->links['zentao']['text'] = 'ZenTao'; +$lang->en->links['zentao']['target'] = '_self'; +$lang->en->links['official']['link'] = 'http://www.zentao.net/'; +$lang->en->links['official']['text'] = 'Community'; +$lang->en->links['official']['target'] = '_blank'; +$lang->en->links['sqlbudyy']['link'] = '/sqlbuddy/'; +$lang->en->links['sqlbudyy']['text'] = 'MySQL'; +$lang->en->links['sqlbudyy']['target'] = '_blank'; +$lang->en->links['phpinfo']['link'] = '?mode=phpinfo'; +$lang->en->links['phpinfo']['text'] = 'PHP'; +$lang->en->links['phpinfo']['target'] = '_blank'; + +if(is_file('./my.php')) include './my.php'; + +$acceptLang = stripos($_SERVER['HTTP_ACCEPT_LANGUAGE'], 'zh-CN') !== false ? 'cn' : 'en'; +$acceptLang = isset($_GET['lang']) ? $_GET['lang'] : $acceptLang; +$clientLang = $lang->$acceptLang; +?> + + + + + + <?php echo $clientLang->title;?> + + + + + + + + + + + + + + +
title;?>
+ poweredBy . ' '; + foreach($config->langs as $langCode => $langName) echo "$langName"; + ?> +
+ + diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 73a20eeb01..f483a12ae4 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -1,300 +1,300 @@ - - * @package ZenTaoPMS - * @version $Id$ - * @link http://www.zentao.net - */ -$lang->arrow = ' '; -$lang->colon = '::'; -$lang->comma = ','; -$lang->dot = '。'; -$lang->at = ' 于 '; -$lang->downArrow = '↓'; - -$lang->ZenTaoPMS = '禅道管理'; -$lang->welcome = "欢迎使用『%s』{$lang->colon} {$lang->ZenTaoPMS}"; -$lang->myControl = "我的地盘"; -$lang->currentPos = '当前位置:'; -$lang->logout = '退出'; -$lang->login = '登录'; -$lang->aboutZenTao = '关于'; -$lang->todayIs = '今天是%s,'; -$lang->runInfo = "
时间: %s 毫秒, 内存: %s KB, 查询: %s.
"; - -$lang->reset = '重填'; -$lang->edit = '编辑'; -$lang->copy = '复制'; -$lang->delete = '删除'; -$lang->close = '关闭'; -$lang->link = '关联'; -$lang->unlink = '移除'; -$lang->import = '导入'; -$lang->export = '导出'; -$lang->setFileName = '文件名:'; -$lang->activate = '激活'; -$lang->submitting = '稍候...'; -$lang->save = '保存'; -$lang->confirm = '确认'; -$lang->preview = '查看'; -$lang->goback = '返回'; -$lang->go = 'GO'; -$lang->more = '更多'; - -$lang->actions = '操作'; -$lang->comment = '备注'; -$lang->history = '历史记录'; -$lang->attatch = '附件'; -$lang->reverse = '[切换顺序]'; -$lang->switchDisplay= '[切换显示]'; -$lang->switchHelp = '切换帮助'; -$lang->addFiles = '上传了附件 '; -$lang->files = '附件 '; -$lang->unfold = '+'; -$lang->fold = '-'; - -$lang->selectAll = '全选'; -$lang->notFound = '抱歉,您访问的对象并不存在!'; -$lang->showAll = '++ 全部显示 ++'; -$lang->hideClosed = '-- 隐藏已结束 --'; - -$lang->future = '未来'; -$lang->year = '年'; -$lang->workingHour = '工时'; - -$lang->idAB = 'ID'; -$lang->priAB = 'P'; -$lang->statusAB = '状态'; -$lang->openedByAB = '创建'; -$lang->assignedToAB = '指派'; -$lang->typeAB = '类型'; - -$lang->common->common = '公有模块'; - -/* 主导航菜单。*/ -$lang->menu->my = ' 我的地盘|my|index'; -$lang->menu->product = '产品视图|product|index'; -$lang->menu->project = '项目视图|project|index'; -$lang->menu->qa = '测试视图|qa|index'; -$lang->menu->doc = '文档视图|doc|index'; -$lang->menu->company = '组织视图|company|index'; -$lang->menu->admin = '后台管理|admin|index'; - -/* 查询条中可以选择的对象列表。*/ -$lang->searchObjects['bug'] = 'B:Bug'; -$lang->searchObjects['story'] = 'S:需求'; -$lang->searchObjects['task'] = 'T:任务'; -$lang->searchObjects['testcase'] = 'C:用例'; -$lang->searchObjects['project'] = 'P:项目'; -$lang->searchObjects['product'] = 'P:产品'; -$lang->searchObjects['user'] = 'U:用户'; -$lang->searchObjects['build'] = 'B:Build'; -$lang->searchObjects['release'] = 'R:发布'; -$lang->searchObjects['productplan'] = 'P:产品计划'; -$lang->searchObjects['testtask'] = 'T:测试任务'; -$lang->searchObjects['doc'] = 'D:文档'; -$lang->searchTips = '输入编号'; - -/* 导出文件的类型列表。*/ -$lang->exportFileTypeList['csv'] = 'csv'; -$lang->exportFileTypeList['xml'] = 'xml'; -$lang->exportFileTypeList['html'] = 'html'; - -/* 风格列表。*/ -$lang->themes['default'] = '默认'; -$lang->themes['green'] = '绿色'; -$lang->themes['red'] = '红色'; -$lang->themes['classblue'] = '经典蓝'; - -/* 首页菜单设置。*/ -$lang->index->menu->product = '浏览产品|product|browse'; -$lang->index->menu->project = '浏览项目|project|browse'; - -/* 我的地盘菜单设置。*/ -$lang->my->menu->account = ' %s' . $lang->arrow; -$lang->my->menu->index = '首页|my|index'; -$lang->my->menu->todo = array('link' => '我的TODO|my|todo|', 'subModule' => 'todo'); -$lang->my->menu->task = '我的任务|my|task|'; -$lang->my->menu->bug = '我的Bug|my|bug|'; -$lang->my->menu->testtask = '我的测试|my|testtask|'; -$lang->my->menu->story = '我的需求|my|story|'; -$lang->my->menu->myProject = '我的项目|my|project|'; -$lang->my->menu->dynamic = '我的动态|my|dynamic|'; -$lang->my->menu->profile = array('link' => '我的档案|my|profile|', 'alias' => 'editprofile'); -$lang->todo->menu = $lang->my->menu; - -/* 产品视图设置。*/ -$lang->product->menu->list = '%s'; -$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story'); -$lang->product->menu->dynamic = '动态|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => '计划|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = '路线图|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => '文档|product|doc|productID=%s', 'subModule' => 'doc'); -$lang->product->menu->view = '概况|product|view|productID=%s'; -$lang->product->menu->edit = '编辑|product|edit|productID=%s'; -$lang->product->menu->delete = array('link' => '删除|product|delete|productID=%s', 'target' => 'hiddenwin'); -$lang->product->menu->module = '模块|tree|browse|productID=%s&view=story'; -$lang->product->menu->order = '排序|product|order|productID=%s'; -$lang->product->menu->create = array('link' => ' 新增产品|product|create', 'float' => 'right'); -$lang->product->menu->project = array('link' => ' 项目列表|product|project|status=all&productID=%s', 'float' => 'right'); -$lang->product->menu->all = array('link' => ' 所有产品|product|index|locate=false', 'float' => 'right'); -$lang->story->menu = $lang->product->menu; -$lang->productplan->menu = $lang->product->menu; -$lang->release->menu = $lang->product->menu; - -/* 项目视图菜单设置。*/ -$lang->project->menu->list = '%s'; -$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task', 'alias' => 'grouptask,importtask'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = '动态|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = '测试申请|project|testtask|projectID=%s'; -$lang->project->menu->burn = '燃尽图|project|burn|projectID=%s'; -$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => '文档|project|doc|porjectID=%s', 'subModule' => 'doc'); -$lang->project->menu->product = '产品|project|manageproducts|projectID=%s'; -$lang->project->menu->linkstory = array('link' => '关联需求|project|linkstory|projectID=%s'); -$lang->project->menu->view = '概况|project|view|projectID=%s'; -$lang->project->menu->edit = '编辑|project|edit|projectID=%s'; -$lang->project->menu->delete = array('link' => '删除|project|delete|projectID=%s', 'target' => 'hiddenwin'); -$lang->project->menu->order = '排序|project|order|projectID=%s'; -$lang->project->menu->create = array('link' => ' 新增项目|project|create', 'float' => 'right'); -$lang->project->menu->copy = array('link' => ' 复制项目|project|create|projectID=©ProjectID=%s', 'float' => 'right'); -$lang->project->menu->all = array('link' => ' 所有项目|project|index|locate=false', 'float' => 'right'); -$lang->task->menu = $lang->project->menu; -$lang->build->menu = $lang->project->menu; - -/* QA视图菜单设置。*/ -$lang->bug->menu->product = '%s'; -$lang->bug->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s', 'alias' => 'view,create,edit,resolve,close,activate,report', 'subModule' => 'tree'); -$lang->bug->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,edit'); -$lang->bug->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s'); - -$lang->testcase->menu->product = '%s'; -$lang->testcase->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); -$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree'); -$lang->testcase->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s'); - -$lang->testtask->menu->product = '%s'; -$lang->testtask->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); -$lang->testtask->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s'); -$lang->testtask->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases'); - -/* 文档视图菜单设置。*/ -$lang->doc->menu->list = '%s'; -$lang->doc->menu->browse = array('link' => '文档列表|doc|browse|libID=%s'); -$lang->doc->menu->edit = '编辑文档库|doc|editLib|libID=%s'; -$lang->doc->menu->module = '维护模块|tree|browse|libID=%s&viewType=doc'; -$lang->doc->menu->delete = array('link' => '删除文档库|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); -$lang->doc->menu->create = array('link' => ' 新增文档库|doc|createLib', 'float' => 'right'); - -/* 组织结构视图菜单设置。*/ -$lang->company->menu->name = '%s' . $lang->arrow; -$lang->company->menu->browseUser = array('link' => '用户列表|company|browse', 'subModule' => 'user'); -$lang->company->menu->dept = array('link' => '部门维护|dept|browse', 'subModule' => 'dept'); -$lang->company->menu->browseGroup = array('link' => '权限分组|group|browse', 'subModule' => 'group'); -$lang->company->menu->edit = array('link' => '公司管理|company|edit'); -$lang->company->menu->dynamic = '组织动态|company|dynamic|'; -$lang->company->menu->addGroup = array('link' => ' 添加分组|group|create', 'float' => 'right'); -$lang->company->menu->addUser = array('link' => ' 添加用户|user|create|dept=%s', 'subModule' => 'user', 'float' => 'right'); -$lang->dept->menu = $lang->company->menu; -$lang->group->menu = $lang->company->menu; - -/* 用户信息菜单设置。*/ -$lang->user->menu->account = '%s' . $lang->arrow; -$lang->user->menu->todo = array('link' => 'TODO列表|user|todo|account=%s', 'subModule' => 'todo'); -$lang->user->menu->task = '任务列表|user|task|account=%s'; -$lang->user->menu->bug = 'Bug列表|user|bug|account=%s'; -$lang->user->menu->dynamic = '用户动态|user|dynamic|type=today&account=%s'; -$lang->user->menu->projectList = '项目列表|user|project|account=%s'; -$lang->user->menu->profile = array('link' => '用户信息|user|profile|account=%s', 'alias' => 'edit'); -$lang->user->menu->browse = array('link' => ' 用户管理|company|browse|', 'float' => 'right'); - -/* 后台管理菜单设置。*/ -$lang->admin->menu->index = array('link' => '首页|admin|index', 'subModule' => 'admin'); -$lang->admin->menu->extension = array('link' => '插件管理|extension|browse', 'subModule' => 'extension'); -$lang->admin->menu->editor = array('link' => '扩展编辑器|editor|index', 'subModule' => 'editor'); -$lang->admin->menu->mail = array('link' => 'Email配置|mail|set', 'subModule' => 'mail'); -$lang->admin->menu->convert = array('link' => '从其他系统导入|convert|index', 'subModule' => 'convert'); -$lang->admin->menu->trashes = array('link' => '回收站|action|trash', 'subModule' => 'action'); -$lang->convert->menu = $lang->admin->menu; -$lang->upgrade->menu = $lang->admin->menu; -$lang->action->menu = $lang->admin->menu; -$lang->extension->menu = $lang->admin->menu; -$lang->editor->menu = $lang->admin->menu; -$lang->mail->menu = $lang->admin->menu; - -/*菜单设置:分组设置。*/ -$lang->menugroup->release = 'product'; -$lang->menugroup->story = 'product'; -$lang->menugroup->productplan = 'product'; -$lang->menugroup->task = 'project'; -$lang->menugroup->build = 'project'; -$lang->menugroup->convert = 'admin'; -$lang->menugroup->upgrade = 'admin'; -$lang->menugroup->user = 'company'; -$lang->menugroup->group = 'company'; -$lang->menugroup->bug = 'qa'; -$lang->menugroup->testcase = 'qa'; -$lang->menugroup->testtask = 'qa'; -$lang->menugroup->people = 'company'; -$lang->menugroup->dept = 'company'; -$lang->menugroup->todo = 'my'; -$lang->menugroup->action = 'admin'; -$lang->menugroup->extension = 'admin'; -$lang->menugroup->editor = 'admin'; -$lang->menugroup->mail = 'admin'; - -/* 错误提示信息。*/ -$lang->error->companyNotFound = "您访问的域名 %s 没有对应的公司。"; -$lang->error->length = array("『%s』长度错误,应当为『%s』", "『%s』长度应当不超过『%s』,且不小于『%s』。"); -$lang->error->reg = "『%s』不符合格式,应当为:『%s』。"; -$lang->error->unique = "『%s』已经有『%s』这条记录了。"; -$lang->error->gt = "『%s』应当大于『%s』。"; -$lang->error->notempty = "『%s』不能为空。"; -$lang->error->empty = "『%s』必须为空。"; -$lang->error->equal = "『%s』必须为『%s』。"; -$lang->error->int = array("『%s』应当是数字。", "『%s』应当介于『%s-%s』之间。"); -$lang->error->float = "『%s』应当是数字,可以是小数。"; -$lang->error->email = "『%s』应当为合法的EMAIL。"; -$lang->error->date = "『%s』应当为合法的日期。"; -$lang->error->account = "『%s』应当为合法的用户名。"; -$lang->error->passwordsame = "两次密码应当相等。"; -$lang->error->passwordrule = "密码应该符合规则,长度至少为六位。"; -$lang->error->accessDenied = '您没有访问权限'; - -/* 分页信息。*/ -$lang->pager->noRecord = "暂时没有记录"; -$lang->pager->digest = "共%s条记录,每页 %s条,页面:%s/%s "; -$lang->pager->first = "首页"; -$lang->pager->pre = "上页"; -$lang->pager->next = "下页"; -$lang->pager->last = "末页"; -$lang->pager->locate = "GO!"; - -$lang->zentaoSite = "官方网站"; -$lang->chinaScrum = "Scrum社区 "; -$lang->agileTraining = "培训 "; -$lang->donate = "捐助禅道 "; -$lang->zentaoKeywords = "开源项目管理软件,项目管理,项目管理软件,pmp,pms,php框架,国产php框架,scrum工具,scrum管理工具,scrum管理软件,敏捷项目管理,禅道"; -$lang->zentaoDESC = "禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件(工具、系统),同时也是一款scrum管理工具。 - 它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。禅道项目管理软件使用PHP + MySQL开发, -基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。禅道在手,项目无忧!"; - -/* 时间格式设置。*/ -define('DT_DATETIME1', 'Y-m-d H:i:s'); -define('DT_DATETIME2', 'y-m-d H:i'); -define('DT_MONTHTIME1', 'n/d H:i'); -define('DT_MONTHTIME2', 'n月d日 H:i'); -define('DT_DATE1', 'Y-m-d'); -define('DT_DATE2', 'Ymd'); -define('DT_DATE3', 'Y年m月d日'); -define('DT_DATE4', 'n月j日'); -define('DT_TIME1', 'H:i:s'); -define('DT_TIME2', 'H:i'); + + * @package ZenTaoPMS + * @version $Id$ + * @link http://www.zentao.net + */ +$lang->arrow = ' '; +$lang->colon = '::'; +$lang->comma = ','; +$lang->dot = '。'; +$lang->at = ' 于 '; +$lang->downArrow = '↓'; + +$lang->ZenTaoPMS = '禅道管理'; +$lang->welcome = "欢迎使用『%s』{$lang->colon} {$lang->ZenTaoPMS}"; +$lang->myControl = "我的地盘"; +$lang->currentPos = '当前位置:'; +$lang->logout = '退出'; +$lang->login = '登录'; +$lang->aboutZenTao = '关于'; +$lang->todayIs = '今天是%s,'; +$lang->runInfo = "
时间: %s 毫秒, 内存: %s KB, 查询: %s.
"; + +$lang->reset = '重填'; +$lang->edit = '编辑'; +$lang->copy = '复制'; +$lang->delete = '删除'; +$lang->close = '关闭'; +$lang->link = '关联'; +$lang->unlink = '移除'; +$lang->import = '导入'; +$lang->export = '导出'; +$lang->setFileName = '文件名:'; +$lang->activate = '激活'; +$lang->submitting = '稍候...'; +$lang->save = '保存'; +$lang->confirm = '确认'; +$lang->preview = '查看'; +$lang->goback = '返回'; +$lang->go = 'GO'; +$lang->more = '更多'; + +$lang->actions = '操作'; +$lang->comment = '备注'; +$lang->history = '历史记录'; +$lang->attatch = '附件'; +$lang->reverse = '[切换顺序]'; +$lang->switchDisplay= '[切换显示]'; +$lang->switchHelp = '切换帮助'; +$lang->addFiles = '上传了附件 '; +$lang->files = '附件 '; +$lang->unfold = '+'; +$lang->fold = '-'; + +$lang->selectAll = '全选'; +$lang->notFound = '抱歉,您访问的对象并不存在!'; +$lang->showAll = '++ 全部显示 ++'; +$lang->hideClosed = '-- 隐藏已结束 --'; + +$lang->future = '未来'; +$lang->year = '年'; +$lang->workingHour = '工时'; + +$lang->idAB = 'ID'; +$lang->priAB = 'P'; +$lang->statusAB = '状态'; +$lang->openedByAB = '创建'; +$lang->assignedToAB = '指派'; +$lang->typeAB = '类型'; + +$lang->common->common = '公有模块'; + +/* 主导航菜单。*/ +$lang->menu->my = ' 我的地盘|my|index'; +$lang->menu->product = '产品视图|product|index'; +$lang->menu->project = '项目视图|project|index'; +$lang->menu->qa = '测试视图|qa|index'; +$lang->menu->doc = '文档视图|doc|index'; +$lang->menu->company = '组织视图|company|index'; +$lang->menu->admin = '后台管理|admin|index'; + +/* 查询条中可以选择的对象列表。*/ +$lang->searchObjects['bug'] = 'B:Bug'; +$lang->searchObjects['story'] = 'S:需求'; +$lang->searchObjects['task'] = 'T:任务'; +$lang->searchObjects['testcase'] = 'C:用例'; +$lang->searchObjects['project'] = 'P:项目'; +$lang->searchObjects['product'] = 'P:产品'; +$lang->searchObjects['user'] = 'U:用户'; +$lang->searchObjects['build'] = 'B:Build'; +$lang->searchObjects['release'] = 'R:发布'; +$lang->searchObjects['productplan'] = 'P:产品计划'; +$lang->searchObjects['testtask'] = 'T:测试任务'; +$lang->searchObjects['doc'] = 'D:文档'; +$lang->searchTips = '输入编号'; + +/* 导出文件的类型列表。*/ +$lang->exportFileTypeList['csv'] = 'csv'; +$lang->exportFileTypeList['xml'] = 'xml'; +$lang->exportFileTypeList['html'] = 'html'; + +/* 风格列表。*/ +$lang->themes['default'] = '默认'; +$lang->themes['green'] = '绿色'; +$lang->themes['red'] = '红色'; +$lang->themes['classblue'] = '经典蓝'; + +/* 首页菜单设置。*/ +$lang->index->menu->product = '浏览产品|product|browse'; +$lang->index->menu->project = '浏览项目|project|browse'; + +/* 我的地盘菜单设置。*/ +$lang->my->menu->account = ' %s' . $lang->arrow; +$lang->my->menu->index = '首页|my|index'; +$lang->my->menu->todo = array('link' => '我的TODO|my|todo|', 'subModule' => 'todo'); +$lang->my->menu->task = '我的任务|my|task|'; +$lang->my->menu->bug = '我的Bug|my|bug|'; +$lang->my->menu->testtask = '我的测试|my|testtask|'; +$lang->my->menu->story = '我的需求|my|story|'; +$lang->my->menu->myProject = '我的项目|my|project|'; +$lang->my->menu->dynamic = '我的动态|my|dynamic|'; +$lang->my->menu->profile = array('link' => '我的档案|my|profile|', 'alias' => 'editprofile'); +$lang->todo->menu = $lang->my->menu; + +/* 产品视图设置。*/ +$lang->product->menu->list = '%s'; +$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story'); +$lang->product->menu->dynamic = '动态|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => '计划|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = '路线图|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => '文档|product|doc|productID=%s', 'subModule' => 'doc'); +$lang->product->menu->view = '概况|product|view|productID=%s'; +$lang->product->menu->edit = '编辑|product|edit|productID=%s'; +$lang->product->menu->delete = array('link' => '删除|product|delete|productID=%s', 'target' => 'hiddenwin'); +$lang->product->menu->module = '模块|tree|browse|productID=%s&view=story'; +$lang->product->menu->order = '排序|product|order|productID=%s'; +$lang->product->menu->create = array('link' => ' 新增产品|product|create', 'float' => 'right'); +$lang->product->menu->project = array('link' => ' 项目列表|product|project|status=all&productID=%s', 'float' => 'right'); +$lang->product->menu->all = array('link' => ' 所有产品|product|index|locate=false', 'float' => 'right'); +$lang->story->menu = $lang->product->menu; +$lang->productplan->menu = $lang->product->menu; +$lang->release->menu = $lang->product->menu; + +/* 项目视图菜单设置。*/ +$lang->project->menu->list = '%s'; +$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task', 'alias' => 'grouptask,importtask'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = '动态|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = '测试申请|project|testtask|projectID=%s'; +$lang->project->menu->burn = '燃尽图|project|burn|projectID=%s'; +$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => '文档|project|doc|porjectID=%s', 'subModule' => 'doc'); +$lang->project->menu->product = '产品|project|manageproducts|projectID=%s'; +$lang->project->menu->linkstory = array('link' => '关联需求|project|linkstory|projectID=%s'); +$lang->project->menu->view = '概况|project|view|projectID=%s'; +$lang->project->menu->edit = '编辑|project|edit|projectID=%s'; +$lang->project->menu->delete = array('link' => '删除|project|delete|projectID=%s', 'target' => 'hiddenwin'); +$lang->project->menu->order = '排序|project|order|projectID=%s'; +$lang->project->menu->create = array('link' => ' 新增项目|project|create', 'float' => 'right'); +$lang->project->menu->copy = array('link' => ' 复制项目|project|create|projectID=©ProjectID=%s', 'float' => 'right'); +$lang->project->menu->all = array('link' => ' 所有项目|project|index|locate=false', 'float' => 'right'); +$lang->task->menu = $lang->project->menu; +$lang->build->menu = $lang->project->menu; + +/* QA视图菜单设置。*/ +$lang->bug->menu->product = '%s'; +$lang->bug->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s', 'alias' => 'view,create,edit,resolve,close,activate,report', 'subModule' => 'tree'); +$lang->bug->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,edit'); +$lang->bug->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s'); + +$lang->testcase->menu->product = '%s'; +$lang->testcase->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); +$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree'); +$lang->testcase->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s'); + +$lang->testtask->menu->product = '%s'; +$lang->testtask->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); +$lang->testtask->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s'); +$lang->testtask->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases'); + +/* 文档视图菜单设置。*/ +$lang->doc->menu->list = '%s'; +$lang->doc->menu->browse = array('link' => '文档列表|doc|browse|libID=%s'); +$lang->doc->menu->edit = '编辑文档库|doc|editLib|libID=%s'; +$lang->doc->menu->module = '维护模块|tree|browse|libID=%s&viewType=doc'; +$lang->doc->menu->delete = array('link' => '删除文档库|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); +$lang->doc->menu->create = array('link' => ' 新增文档库|doc|createLib', 'float' => 'right'); + +/* 组织结构视图菜单设置。*/ +$lang->company->menu->name = '%s' . $lang->arrow; +$lang->company->menu->browseUser = array('link' => '用户列表|company|browse', 'subModule' => 'user'); +$lang->company->menu->dept = array('link' => '部门维护|dept|browse', 'subModule' => 'dept'); +$lang->company->menu->browseGroup = array('link' => '权限分组|group|browse', 'subModule' => 'group'); +$lang->company->menu->edit = array('link' => '公司管理|company|edit'); +$lang->company->menu->dynamic = '组织动态|company|dynamic|'; +$lang->company->menu->addGroup = array('link' => ' 添加分组|group|create', 'float' => 'right'); +$lang->company->menu->addUser = array('link' => ' 添加用户|user|create|dept=%s', 'subModule' => 'user', 'float' => 'right'); +$lang->dept->menu = $lang->company->menu; +$lang->group->menu = $lang->company->menu; + +/* 用户信息菜单设置。*/ +$lang->user->menu->account = '%s' . $lang->arrow; +$lang->user->menu->todo = array('link' => 'TODO列表|user|todo|account=%s', 'subModule' => 'todo'); +$lang->user->menu->task = '任务列表|user|task|account=%s'; +$lang->user->menu->bug = 'Bug列表|user|bug|account=%s'; +$lang->user->menu->dynamic = '用户动态|user|dynamic|type=today&account=%s'; +$lang->user->menu->projectList = '项目列表|user|project|account=%s'; +$lang->user->menu->profile = array('link' => '用户信息|user|profile|account=%s', 'alias' => 'edit'); +$lang->user->menu->browse = array('link' => ' 用户管理|company|browse|', 'float' => 'right'); + +/* 后台管理菜单设置。*/ +$lang->admin->menu->index = array('link' => '首页|admin|index', 'subModule' => 'admin'); +$lang->admin->menu->extension = array('link' => '插件管理|extension|browse', 'subModule' => 'extension'); +$lang->admin->menu->editor = array('link' => '扩展编辑器|editor|index', 'subModule' => 'editor'); +$lang->admin->menu->mail = array('link' => 'Email配置|mail|set', 'subModule' => 'mail'); +$lang->admin->menu->convert = array('link' => '从其他系统导入|convert|index', 'subModule' => 'convert'); +$lang->admin->menu->trashes = array('link' => '回收站|action|trash', 'subModule' => 'action'); +$lang->convert->menu = $lang->admin->menu; +$lang->upgrade->menu = $lang->admin->menu; +$lang->action->menu = $lang->admin->menu; +$lang->extension->menu = $lang->admin->menu; +$lang->editor->menu = $lang->admin->menu; +$lang->mail->menu = $lang->admin->menu; + +/*菜单设置:分组设置。*/ +$lang->menugroup->release = 'product'; +$lang->menugroup->story = 'product'; +$lang->menugroup->productplan = 'product'; +$lang->menugroup->task = 'project'; +$lang->menugroup->build = 'project'; +$lang->menugroup->convert = 'admin'; +$lang->menugroup->upgrade = 'admin'; +$lang->menugroup->user = 'company'; +$lang->menugroup->group = 'company'; +$lang->menugroup->bug = 'qa'; +$lang->menugroup->testcase = 'qa'; +$lang->menugroup->testtask = 'qa'; +$lang->menugroup->people = 'company'; +$lang->menugroup->dept = 'company'; +$lang->menugroup->todo = 'my'; +$lang->menugroup->action = 'admin'; +$lang->menugroup->extension = 'admin'; +$lang->menugroup->editor = 'admin'; +$lang->menugroup->mail = 'admin'; + +/* 错误提示信息。*/ +$lang->error->companyNotFound = "您访问的域名 %s 没有对应的公司。"; +$lang->error->length = array("『%s』长度错误,应当为『%s』", "『%s』长度应当不超过『%s』,且不小于『%s』。"); +$lang->error->reg = "『%s』不符合格式,应当为:『%s』。"; +$lang->error->unique = "『%s』已经有『%s』这条记录了。"; +$lang->error->gt = "『%s』应当大于『%s』。"; +$lang->error->notempty = "『%s』不能为空。"; +$lang->error->empty = "『%s』必须为空。"; +$lang->error->equal = "『%s』必须为『%s』。"; +$lang->error->int = array("『%s』应当是数字。", "『%s』应当介于『%s-%s』之间。"); +$lang->error->float = "『%s』应当是数字,可以是小数。"; +$lang->error->email = "『%s』应当为合法的EMAIL。"; +$lang->error->date = "『%s』应当为合法的日期。"; +$lang->error->account = "『%s』应当为合法的用户名。"; +$lang->error->passwordsame = "两次密码应当相等。"; +$lang->error->passwordrule = "密码应该符合规则,长度至少为六位。"; +$lang->error->accessDenied = '您没有访问权限'; + +/* 分页信息。*/ +$lang->pager->noRecord = "暂时没有记录"; +$lang->pager->digest = "共%s条记录,每页 %s条,页面:%s/%s "; +$lang->pager->first = "首页"; +$lang->pager->pre = "上页"; +$lang->pager->next = "下页"; +$lang->pager->last = "末页"; +$lang->pager->locate = "GO!"; + +$lang->zentaoSite = "官方网站"; +$lang->chinaScrum = "Scrum社区 "; +$lang->agileTraining = "培训 "; +$lang->donate = "捐助禅道 "; +$lang->zentaoKeywords = "开源项目管理软件,项目管理,项目管理软件,pmp,pms,php框架,国产php框架,scrum工具,scrum管理工具,scrum管理软件,敏捷项目管理,禅道"; +$lang->zentaoDESC = "禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件(工具、系统),同时也是一款scrum管理工具。 + 它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。禅道项目管理软件使用PHP + MySQL开发, +基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。禅道在手,项目无忧!"; + +/* 时间格式设置。*/ +define('DT_DATETIME1', 'Y-m-d H:i:s'); +define('DT_DATETIME2', 'y-m-d H:i'); +define('DT_MONTHTIME1', 'n/d H:i'); +define('DT_MONTHTIME2', 'n月d日 H:i'); +define('DT_DATE1', 'Y-m-d'); +define('DT_DATE2', 'Ymd'); +define('DT_DATE3', 'Y年m月d日'); +define('DT_DATE4', 'n月j日'); +define('DT_TIME1', 'H:i:s'); +define('DT_TIME2', 'H:i'); diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php index 4ef46eefc0..b782c9af7a 100644 --- a/module/common/lang/zh-tw.php +++ b/module/common/lang/zh-tw.php @@ -1,300 +1,300 @@ - - * @package ZenTaoPMS - * @version $Id: zh-tw.php 2686 2012-03-02 05:45:14Z wyd621@gmail.com $ - * @link http://www.zentao.net - */ -$lang->arrow = ' '; -$lang->colon = '::'; -$lang->comma = ','; -$lang->dot = '。'; -$lang->at = ' 于 '; -$lang->downArrow = '↓'; - -$lang->ZenTaoPMS = '禪道管理'; -$lang->welcome = "歡迎使用『%s』{$lang->colon} {$lang->ZenTaoPMS}"; -$lang->myControl = "我的地盤"; -$lang->currentPos = '當前位置:'; -$lang->logout = '退出'; -$lang->login = '登錄'; -$lang->aboutZenTao = '關於'; -$lang->todayIs = '今天是%s,'; -$lang->runInfo = "
時間: %s 毫秒, 內存: %s KB, 查詢: %s.
"; - -$lang->reset = '重填'; -$lang->edit = '編輯'; -$lang->copy = '複製'; -$lang->delete = '刪除'; -$lang->close = '關閉'; -$lang->link = '關聯'; -$lang->unlink = '移除'; -$lang->import = '導入'; -$lang->export = '導出'; -$lang->setFileName = '檔案名:'; -$lang->activate = '激活'; -$lang->submitting = '稍候...'; -$lang->save = '保存'; -$lang->confirm = '確認'; -$lang->preview = '查看'; -$lang->goback = '返回'; -$lang->go = 'GO'; -$lang->more = '更多'; - -$lang->actions = '操作'; -$lang->comment = '備註'; -$lang->history = '歷史記錄'; -$lang->attatch = '附件'; -$lang->reverse = '[切換順序]'; -$lang->switchDisplay= '[切換顯示]'; -$lang->switchHelp = '切換幫助'; -$lang->addFiles = '上傳了附件 '; -$lang->files = '附件 '; -$lang->unfold = '+'; -$lang->fold = '-'; - -$lang->selectAll = '全選'; -$lang->notFound = '抱歉,您訪問的對象並不存在!'; -$lang->showAll = '++ 全部顯示 ++'; -$lang->hideClosed = '-- 隱藏已結束 --'; - -$lang->future = '未來'; -$lang->year = '年'; -$lang->workingHour = '工時'; - -$lang->idAB = 'ID'; -$lang->priAB = 'P'; -$lang->statusAB = '狀態'; -$lang->openedByAB = '創建'; -$lang->assignedToAB = '指派'; -$lang->typeAB = '類型'; - -$lang->common->common = '公有模組'; - -/* 主導航菜單。*/ -$lang->menu->my = ' 我的地盤|my|index'; -$lang->menu->product = '產品視圖|product|index'; -$lang->menu->project = '項目視圖|project|index'; -$lang->menu->qa = '測試視圖|qa|index'; -$lang->menu->doc = '文檔視圖|doc|index'; -$lang->menu->company = '組織視圖|company|index'; -$lang->menu->admin = '後台管理|admin|index'; - -/* 查詢條中可以選擇的對象列表。*/ -$lang->searchObjects['bug'] = 'B:Bug'; -$lang->searchObjects['story'] = 'S:需求'; -$lang->searchObjects['task'] = 'T:任務'; -$lang->searchObjects['testcase'] = 'C:用例'; -$lang->searchObjects['project'] = 'P:項目'; -$lang->searchObjects['product'] = 'P:產品'; -$lang->searchObjects['user'] = 'U:用戶'; -$lang->searchObjects['build'] = 'B:Build'; -$lang->searchObjects['release'] = 'R:發佈'; -$lang->searchObjects['productplan'] = 'P:產品計劃'; -$lang->searchObjects['testtask'] = 'T:測試任務'; -$lang->searchObjects['doc'] = 'D:文檔'; -$lang->searchTips = '輸入編號'; - -/* 導出檔案的類型列表。*/ -$lang->exportFileTypeList['csv'] = 'csv'; -$lang->exportFileTypeList['xml'] = 'xml'; -$lang->exportFileTypeList['html'] = 'html'; - -/* 風格列表。*/ -$lang->themes['default'] = '預設'; -$lang->themes['green'] = '綠色'; -$lang->themes['red'] = '紅色'; -$lang->themes['classblue'] = '經典藍'; - -/* 首頁菜單設置。*/ -$lang->index->menu->product = '瀏覽產品|product|browse'; -$lang->index->menu->project = '瀏覽項目|project|browse'; - -/* 我的地盤菜單設置。*/ -$lang->my->menu->account = ' %s' . $lang->arrow; -$lang->my->menu->index = '首頁|my|index'; -$lang->my->menu->todo = array('link' => '我的TODO|my|todo|', 'subModule' => 'todo'); -$lang->my->menu->task = '我的任務|my|task|'; -$lang->my->menu->bug = '我的Bug|my|bug|'; -$lang->my->menu->testtask = '我的測試|my|testtask|'; -$lang->my->menu->story = '我的需求|my|story|'; -$lang->my->menu->myProject = '我的項目|my|project|'; -$lang->my->menu->dynamic = '我的動態|my|dynamic|'; -$lang->my->menu->profile = array('link' => '我的檔案|my|profile|', 'alias' => 'editprofile'); -$lang->todo->menu = $lang->my->menu; - -/* 產品視圖設置。*/ -$lang->product->menu->list = '%s'; -$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story'); -$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => '計劃|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => '文檔|product|doc|productID=%s', 'subModule' => 'doc'); -$lang->product->menu->view = '概況|product|view|productID=%s'; -$lang->product->menu->edit = '編輯|product|edit|productID=%s'; -$lang->product->menu->delete = array('link' => '刪除|product|delete|productID=%s', 'target' => 'hiddenwin'); -$lang->product->menu->module = '模組|tree|browse|productID=%s&view=story'; -$lang->product->menu->order = '排序|product|order|productID=%s'; -$lang->product->menu->create = array('link' => ' 新增產品|product|create', 'float' => 'right'); -$lang->product->menu->project = array('link' => ' 項目列表|product|project|status=all&productID=%s', 'float' => 'right'); -$lang->product->menu->all = array('link' => ' 所有產品|product|index|locate=false', 'float' => 'right'); -$lang->story->menu = $lang->product->menu; -$lang->productplan->menu = $lang->product->menu; -$lang->release->menu = $lang->product->menu; - -/* 項目視圖菜單設置。*/ -$lang->project->menu->list = '%s'; -$lang->project->menu->task = array('link' => '任務|project|task|projectID=%s', 'subModule' => 'task', 'alias' => 'grouptask,importtask'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = '動態|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = '測試申請|project|testtask|projectID=%s'; -$lang->project->menu->burn = '燃盡圖|project|burn|projectID=%s'; -$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => '文檔|project|doc|porjectID=%s', 'subModule' => 'doc'); -$lang->project->menu->product = '產品|project|manageproducts|projectID=%s'; -$lang->project->menu->linkstory = array('link' => '關聯需求|project|linkstory|projectID=%s'); -$lang->project->menu->view = '概況|project|view|projectID=%s'; -$lang->project->menu->edit = '編輯|project|edit|projectID=%s'; -$lang->project->menu->delete = array('link' => '刪除|project|delete|projectID=%s', 'target' => 'hiddenwin'); -$lang->project->menu->order = '排序|project|order|projectID=%s'; -$lang->project->menu->create = array('link' => ' 新增項目|project|create', 'float' => 'right'); -$lang->project->menu->copy = array('link' => ' 複製項目|project|create|projectID=©ProjectID=%s', 'float' => 'right'); -$lang->project->menu->all = array('link' => ' 所有項目|project|index|locate=false', 'float' => 'right'); -$lang->task->menu = $lang->project->menu; -$lang->build->menu = $lang->project->menu; - -/* QA視圖菜單設置。*/ -$lang->bug->menu->product = '%s'; -$lang->bug->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s', 'alias' => 'view,create,edit,resolve,close,activate,report', 'subModule' => 'tree'); -$lang->bug->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,edit'); -$lang->bug->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s'); - -$lang->testcase->menu->product = '%s'; -$lang->testcase->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); -$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree'); -$lang->testcase->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s'); - -$lang->testtask->menu->product = '%s'; -$lang->testtask->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); -$lang->testtask->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s'); -$lang->testtask->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases'); - -/* 文檔視圖菜單設置。*/ -$lang->doc->menu->list = '%s'; -$lang->doc->menu->browse = array('link' => '文檔列表|doc|browse|libID=%s'); -$lang->doc->menu->edit = '編輯文檔庫|doc|editLib|libID=%s'; -$lang->doc->menu->module = '維護模組|tree|browse|libID=%s&viewType=doc'; -$lang->doc->menu->delete = array('link' => '刪除文檔庫|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); -$lang->doc->menu->create = array('link' => ' 新增文檔庫|doc|createLib', 'float' => 'right'); - -/* 組織結構視圖菜單設置。*/ -$lang->company->menu->name = '%s' . $lang->arrow; -$lang->company->menu->browseUser = array('link' => '用戶列表|company|browse', 'subModule' => 'user'); -$lang->company->menu->dept = array('link' => '部門維護|dept|browse', 'subModule' => 'dept'); -$lang->company->menu->browseGroup = array('link' => '權限分組|group|browse', 'subModule' => 'group'); -$lang->company->menu->edit = array('link' => '公司管理|company|edit'); -$lang->company->menu->dynamic = '組織動態|company|dynamic|'; -$lang->company->menu->addGroup = array('link' => ' 添加分組|group|create', 'float' => 'right'); -$lang->company->menu->addUser = array('link' => ' 添加用戶|user|create|dept=%s', 'subModule' => 'user', 'float' => 'right'); -$lang->dept->menu = $lang->company->menu; -$lang->group->menu = $lang->company->menu; - -/* 用戶信息菜單設置。*/ -$lang->user->menu->account = '%s' . $lang->arrow; -$lang->user->menu->todo = array('link' => 'TODO列表|user|todo|account=%s', 'subModule' => 'todo'); -$lang->user->menu->task = '任務列表|user|task|account=%s'; -$lang->user->menu->bug = 'Bug列表|user|bug|account=%s'; -$lang->user->menu->dynamic = '用戶動態|user|dynamic|type=today&account=%s'; -$lang->user->menu->projectList = '項目列表|user|project|account=%s'; -$lang->user->menu->profile = array('link' => '用戶信息|user|profile|account=%s', 'alias' => 'edit'); -$lang->user->menu->browse = array('link' => ' 用戶管理|company|browse|', 'float' => 'right'); - -/* 後台管理菜單設置。*/ -$lang->admin->menu->index = array('link' => '首頁|admin|index', 'subModule' => 'admin'); -$lang->admin->menu->extension = array('link' => '插件管理|extension|browse', 'subModule' => 'extension'); -$lang->admin->menu->editor = array('link' => '擴展編輯器|editor|index', 'subModule' => 'editor'); -$lang->admin->menu->mail = array('link' => 'Email配置|mail|set', 'subModule' => 'mail'); -$lang->admin->menu->convert = array('link' => '從其他系統導入|convert|index', 'subModule' => 'convert'); -$lang->admin->menu->trashes = array('link' => '資源回收筒|action|trash', 'subModule' => 'action'); -$lang->convert->menu = $lang->admin->menu; -$lang->upgrade->menu = $lang->admin->menu; -$lang->action->menu = $lang->admin->menu; -$lang->extension->menu = $lang->admin->menu; -$lang->editor->menu = $lang->admin->menu; -$lang->mail->menu = $lang->admin->menu; - -/*菜單設置:分組設置。*/ -$lang->menugroup->release = 'product'; -$lang->menugroup->story = 'product'; -$lang->menugroup->productplan = 'product'; -$lang->menugroup->task = 'project'; -$lang->menugroup->build = 'project'; -$lang->menugroup->convert = 'admin'; -$lang->menugroup->upgrade = 'admin'; -$lang->menugroup->user = 'company'; -$lang->menugroup->group = 'company'; -$lang->menugroup->bug = 'qa'; -$lang->menugroup->testcase = 'qa'; -$lang->menugroup->testtask = 'qa'; -$lang->menugroup->people = 'company'; -$lang->menugroup->dept = 'company'; -$lang->menugroup->todo = 'my'; -$lang->menugroup->action = 'admin'; -$lang->menugroup->extension = 'admin'; -$lang->menugroup->editor = 'admin'; -$lang->menugroup->mail = 'admin'; - -/* 錯誤提示信息。*/ -$lang->error->companyNotFound = "您訪問的域名 %s 沒有對應的公司。"; -$lang->error->length = array("『%s』長度錯誤,應當為『%s』", "『%s』長度應當不超過『%s』,且不小於『%s』。"); -$lang->error->reg = "『%s』不符合格式,應當為:『%s』。"; -$lang->error->unique = "『%s』已經有『%s』這條記錄了。"; -$lang->error->gt = "『%s』應當大於『%s』。"; -$lang->error->notempty = "『%s』不能為空。"; -$lang->error->empty = "『%s』必須為空。"; -$lang->error->equal = "『%s』必須為『%s』。"; -$lang->error->int = array("『%s』應當是數字。", "『%s』應當介於『%s-%s』之間。"); -$lang->error->float = "『%s』應當是數字,可以是小數。"; -$lang->error->email = "『%s』應當為合法的EMAIL。"; -$lang->error->date = "『%s』應當為合法的日期。"; -$lang->error->account = "『%s』應當為合法的用戶名。"; -$lang->error->passwordsame = "兩次密碼應當相等。"; -$lang->error->passwordrule = "密碼應該符合規則,長度至少為六位。"; -$lang->error->accessDenied = '您沒有訪問權限'; - -/* 分頁信息。*/ -$lang->pager->noRecord = "暫時沒有記錄"; -$lang->pager->digest = "共%s條記錄,每頁 %s條,頁面:%s/%s "; -$lang->pager->first = "首頁"; -$lang->pager->pre = "上頁"; -$lang->pager->next = "下頁"; -$lang->pager->last = "末頁"; -$lang->pager->locate = "GO!"; - -$lang->zentaoSite = "官方網站"; -$lang->chinaScrum = "Scrum社區 "; -$lang->agileTraining = "培訓 "; -$lang->donate = "捐助禪道 "; -$lang->zentaoKeywords = "開源項目管理軟件,項目管理,項目管理軟件,pmp,pms,php框架,國產php框架,scrum工具,scrum管理工具,scrum管理軟件,敏捷項目管理,禪道"; -$lang->zentaoDESC = "禪道項目管理軟件(ZenTaoPMS)是一款國產的,基于LGPL協議,開源免費的項目管理軟件(工具、系統),同時也是一款scrum管理工具。 - 它集產品管理、項目管理、測試管理於一體,同時還包含了事務管理、組織管理等諸多功能,是中小型企業項目管理的首選。禪道項目管理軟件使用PHP + MySQL開發, -基于自主的PHP開發框架──ZenTaoPHP而成。第三方開發者或者企業可以非常方便的開發插件或者進行定製。禪道在手,項目無憂!"; - -/* 時間格式設置。*/ -define('DT_DATETIME1', 'Y-m-d H:i:s'); -define('DT_DATETIME2', 'y-m-d H:i'); -define('DT_MONTHTIME1', 'n/d H:i'); -define('DT_MONTHTIME2', 'n月d日 H:i'); -define('DT_DATE1', 'Y-m-d'); -define('DT_DATE2', 'Ymd'); -define('DT_DATE3', 'Y年m月d日'); -define('DT_DATE4', 'n月j日'); -define('DT_TIME1', 'H:i:s'); -define('DT_TIME2', 'H:i'); + + * @package ZenTaoPMS + * @version $Id: zh-tw.php 2686 2012-03-02 05:45:14Z wyd621@gmail.com $ + * @link http://www.zentao.net + */ +$lang->arrow = ' '; +$lang->colon = '::'; +$lang->comma = ','; +$lang->dot = '。'; +$lang->at = ' 于 '; +$lang->downArrow = '↓'; + +$lang->ZenTaoPMS = '禪道管理'; +$lang->welcome = "歡迎使用『%s』{$lang->colon} {$lang->ZenTaoPMS}"; +$lang->myControl = "我的地盤"; +$lang->currentPos = '當前位置:'; +$lang->logout = '退出'; +$lang->login = '登錄'; +$lang->aboutZenTao = '關於'; +$lang->todayIs = '今天是%s,'; +$lang->runInfo = "
時間: %s 毫秒, 內存: %s KB, 查詢: %s.
"; + +$lang->reset = '重填'; +$lang->edit = '編輯'; +$lang->copy = '複製'; +$lang->delete = '刪除'; +$lang->close = '關閉'; +$lang->link = '關聯'; +$lang->unlink = '移除'; +$lang->import = '導入'; +$lang->export = '導出'; +$lang->setFileName = '檔案名:'; +$lang->activate = '激活'; +$lang->submitting = '稍候...'; +$lang->save = '保存'; +$lang->confirm = '確認'; +$lang->preview = '查看'; +$lang->goback = '返回'; +$lang->go = 'GO'; +$lang->more = '更多'; + +$lang->actions = '操作'; +$lang->comment = '備註'; +$lang->history = '歷史記錄'; +$lang->attatch = '附件'; +$lang->reverse = '[切換順序]'; +$lang->switchDisplay= '[切換顯示]'; +$lang->switchHelp = '切換幫助'; +$lang->addFiles = '上傳了附件 '; +$lang->files = '附件 '; +$lang->unfold = '+'; +$lang->fold = '-'; + +$lang->selectAll = '全選'; +$lang->notFound = '抱歉,您訪問的對象並不存在!'; +$lang->showAll = '++ 全部顯示 ++'; +$lang->hideClosed = '-- 隱藏已結束 --'; + +$lang->future = '未來'; +$lang->year = '年'; +$lang->workingHour = '工時'; + +$lang->idAB = 'ID'; +$lang->priAB = 'P'; +$lang->statusAB = '狀態'; +$lang->openedByAB = '創建'; +$lang->assignedToAB = '指派'; +$lang->typeAB = '類型'; + +$lang->common->common = '公有模組'; + +/* 主導航菜單。*/ +$lang->menu->my = ' 我的地盤|my|index'; +$lang->menu->product = '產品視圖|product|index'; +$lang->menu->project = '項目視圖|project|index'; +$lang->menu->qa = '測試視圖|qa|index'; +$lang->menu->doc = '文檔視圖|doc|index'; +$lang->menu->company = '組織視圖|company|index'; +$lang->menu->admin = '後台管理|admin|index'; + +/* 查詢條中可以選擇的對象列表。*/ +$lang->searchObjects['bug'] = 'B:Bug'; +$lang->searchObjects['story'] = 'S:需求'; +$lang->searchObjects['task'] = 'T:任務'; +$lang->searchObjects['testcase'] = 'C:用例'; +$lang->searchObjects['project'] = 'P:項目'; +$lang->searchObjects['product'] = 'P:產品'; +$lang->searchObjects['user'] = 'U:用戶'; +$lang->searchObjects['build'] = 'B:Build'; +$lang->searchObjects['release'] = 'R:發佈'; +$lang->searchObjects['productplan'] = 'P:產品計劃'; +$lang->searchObjects['testtask'] = 'T:測試任務'; +$lang->searchObjects['doc'] = 'D:文檔'; +$lang->searchTips = '輸入編號'; + +/* 導出檔案的類型列表。*/ +$lang->exportFileTypeList['csv'] = 'csv'; +$lang->exportFileTypeList['xml'] = 'xml'; +$lang->exportFileTypeList['html'] = 'html'; + +/* 風格列表。*/ +$lang->themes['default'] = '預設'; +$lang->themes['green'] = '綠色'; +$lang->themes['red'] = '紅色'; +$lang->themes['classblue'] = '經典藍'; + +/* 首頁菜單設置。*/ +$lang->index->menu->product = '瀏覽產品|product|browse'; +$lang->index->menu->project = '瀏覽項目|project|browse'; + +/* 我的地盤菜單設置。*/ +$lang->my->menu->account = ' %s' . $lang->arrow; +$lang->my->menu->index = '首頁|my|index'; +$lang->my->menu->todo = array('link' => '我的TODO|my|todo|', 'subModule' => 'todo'); +$lang->my->menu->task = '我的任務|my|task|'; +$lang->my->menu->bug = '我的Bug|my|bug|'; +$lang->my->menu->testtask = '我的測試|my|testtask|'; +$lang->my->menu->story = '我的需求|my|story|'; +$lang->my->menu->myProject = '我的項目|my|project|'; +$lang->my->menu->dynamic = '我的動態|my|dynamic|'; +$lang->my->menu->profile = array('link' => '我的檔案|my|profile|', 'alias' => 'editprofile'); +$lang->todo->menu = $lang->my->menu; + +/* 產品視圖設置。*/ +$lang->product->menu->list = '%s'; +$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story'); +$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => '計劃|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => '文檔|product|doc|productID=%s', 'subModule' => 'doc'); +$lang->product->menu->view = '概況|product|view|productID=%s'; +$lang->product->menu->edit = '編輯|product|edit|productID=%s'; +$lang->product->menu->delete = array('link' => '刪除|product|delete|productID=%s', 'target' => 'hiddenwin'); +$lang->product->menu->module = '模組|tree|browse|productID=%s&view=story'; +$lang->product->menu->order = '排序|product|order|productID=%s'; +$lang->product->menu->create = array('link' => ' 新增產品|product|create', 'float' => 'right'); +$lang->product->menu->project = array('link' => ' 項目列表|product|project|status=all&productID=%s', 'float' => 'right'); +$lang->product->menu->all = array('link' => ' 所有產品|product|index|locate=false', 'float' => 'right'); +$lang->story->menu = $lang->product->menu; +$lang->productplan->menu = $lang->product->menu; +$lang->release->menu = $lang->product->menu; + +/* 項目視圖菜單設置。*/ +$lang->project->menu->list = '%s'; +$lang->project->menu->task = array('link' => '任務|project|task|projectID=%s', 'subModule' => 'task', 'alias' => 'grouptask,importtask'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = '動態|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = '測試申請|project|testtask|projectID=%s'; +$lang->project->menu->burn = '燃盡圖|project|burn|projectID=%s'; +$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => '文檔|project|doc|porjectID=%s', 'subModule' => 'doc'); +$lang->project->menu->product = '產品|project|manageproducts|projectID=%s'; +$lang->project->menu->linkstory = array('link' => '關聯需求|project|linkstory|projectID=%s'); +$lang->project->menu->view = '概況|project|view|projectID=%s'; +$lang->project->menu->edit = '編輯|project|edit|projectID=%s'; +$lang->project->menu->delete = array('link' => '刪除|project|delete|projectID=%s', 'target' => 'hiddenwin'); +$lang->project->menu->order = '排序|project|order|projectID=%s'; +$lang->project->menu->create = array('link' => ' 新增項目|project|create', 'float' => 'right'); +$lang->project->menu->copy = array('link' => ' 複製項目|project|create|projectID=©ProjectID=%s', 'float' => 'right'); +$lang->project->menu->all = array('link' => ' 所有項目|project|index|locate=false', 'float' => 'right'); +$lang->task->menu = $lang->project->menu; +$lang->build->menu = $lang->project->menu; + +/* QA視圖菜單設置。*/ +$lang->bug->menu->product = '%s'; +$lang->bug->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s', 'alias' => 'view,create,edit,resolve,close,activate,report', 'subModule' => 'tree'); +$lang->bug->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,edit'); +$lang->bug->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s'); + +$lang->testcase->menu->product = '%s'; +$lang->testcase->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); +$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree'); +$lang->testcase->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s'); + +$lang->testtask->menu->product = '%s'; +$lang->testtask->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s'); +$lang->testtask->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s'); +$lang->testtask->menu->testtask = array('link' => '測試任務|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases'); + +/* 文檔視圖菜單設置。*/ +$lang->doc->menu->list = '%s'; +$lang->doc->menu->browse = array('link' => '文檔列表|doc|browse|libID=%s'); +$lang->doc->menu->edit = '編輯文檔庫|doc|editLib|libID=%s'; +$lang->doc->menu->module = '維護模組|tree|browse|libID=%s&viewType=doc'; +$lang->doc->menu->delete = array('link' => '刪除文檔庫|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); +$lang->doc->menu->create = array('link' => ' 新增文檔庫|doc|createLib', 'float' => 'right'); + +/* 組織結構視圖菜單設置。*/ +$lang->company->menu->name = '%s' . $lang->arrow; +$lang->company->menu->browseUser = array('link' => '用戶列表|company|browse', 'subModule' => 'user'); +$lang->company->menu->dept = array('link' => '部門維護|dept|browse', 'subModule' => 'dept'); +$lang->company->menu->browseGroup = array('link' => '權限分組|group|browse', 'subModule' => 'group'); +$lang->company->menu->edit = array('link' => '公司管理|company|edit'); +$lang->company->menu->dynamic = '組織動態|company|dynamic|'; +$lang->company->menu->addGroup = array('link' => ' 添加分組|group|create', 'float' => 'right'); +$lang->company->menu->addUser = array('link' => ' 添加用戶|user|create|dept=%s', 'subModule' => 'user', 'float' => 'right'); +$lang->dept->menu = $lang->company->menu; +$lang->group->menu = $lang->company->menu; + +/* 用戶信息菜單設置。*/ +$lang->user->menu->account = '%s' . $lang->arrow; +$lang->user->menu->todo = array('link' => 'TODO列表|user|todo|account=%s', 'subModule' => 'todo'); +$lang->user->menu->task = '任務列表|user|task|account=%s'; +$lang->user->menu->bug = 'Bug列表|user|bug|account=%s'; +$lang->user->menu->dynamic = '用戶動態|user|dynamic|type=today&account=%s'; +$lang->user->menu->projectList = '項目列表|user|project|account=%s'; +$lang->user->menu->profile = array('link' => '用戶信息|user|profile|account=%s', 'alias' => 'edit'); +$lang->user->menu->browse = array('link' => ' 用戶管理|company|browse|', 'float' => 'right'); + +/* 後台管理菜單設置。*/ +$lang->admin->menu->index = array('link' => '首頁|admin|index', 'subModule' => 'admin'); +$lang->admin->menu->extension = array('link' => '插件管理|extension|browse', 'subModule' => 'extension'); +$lang->admin->menu->editor = array('link' => '擴展編輯器|editor|index', 'subModule' => 'editor'); +$lang->admin->menu->mail = array('link' => 'Email配置|mail|set', 'subModule' => 'mail'); +$lang->admin->menu->convert = array('link' => '從其他系統導入|convert|index', 'subModule' => 'convert'); +$lang->admin->menu->trashes = array('link' => '資源回收筒|action|trash', 'subModule' => 'action'); +$lang->convert->menu = $lang->admin->menu; +$lang->upgrade->menu = $lang->admin->menu; +$lang->action->menu = $lang->admin->menu; +$lang->extension->menu = $lang->admin->menu; +$lang->editor->menu = $lang->admin->menu; +$lang->mail->menu = $lang->admin->menu; + +/*菜單設置:分組設置。*/ +$lang->menugroup->release = 'product'; +$lang->menugroup->story = 'product'; +$lang->menugroup->productplan = 'product'; +$lang->menugroup->task = 'project'; +$lang->menugroup->build = 'project'; +$lang->menugroup->convert = 'admin'; +$lang->menugroup->upgrade = 'admin'; +$lang->menugroup->user = 'company'; +$lang->menugroup->group = 'company'; +$lang->menugroup->bug = 'qa'; +$lang->menugroup->testcase = 'qa'; +$lang->menugroup->testtask = 'qa'; +$lang->menugroup->people = 'company'; +$lang->menugroup->dept = 'company'; +$lang->menugroup->todo = 'my'; +$lang->menugroup->action = 'admin'; +$lang->menugroup->extension = 'admin'; +$lang->menugroup->editor = 'admin'; +$lang->menugroup->mail = 'admin'; + +/* 錯誤提示信息。*/ +$lang->error->companyNotFound = "您訪問的域名 %s 沒有對應的公司。"; +$lang->error->length = array("『%s』長度錯誤,應當為『%s』", "『%s』長度應當不超過『%s』,且不小於『%s』。"); +$lang->error->reg = "『%s』不符合格式,應當為:『%s』。"; +$lang->error->unique = "『%s』已經有『%s』這條記錄了。"; +$lang->error->gt = "『%s』應當大於『%s』。"; +$lang->error->notempty = "『%s』不能為空。"; +$lang->error->empty = "『%s』必須為空。"; +$lang->error->equal = "『%s』必須為『%s』。"; +$lang->error->int = array("『%s』應當是數字。", "『%s』應當介於『%s-%s』之間。"); +$lang->error->float = "『%s』應當是數字,可以是小數。"; +$lang->error->email = "『%s』應當為合法的EMAIL。"; +$lang->error->date = "『%s』應當為合法的日期。"; +$lang->error->account = "『%s』應當為合法的用戶名。"; +$lang->error->passwordsame = "兩次密碼應當相等。"; +$lang->error->passwordrule = "密碼應該符合規則,長度至少為六位。"; +$lang->error->accessDenied = '您沒有訪問權限'; + +/* 分頁信息。*/ +$lang->pager->noRecord = "暫時沒有記錄"; +$lang->pager->digest = "共%s條記錄,每頁 %s條,頁面:%s/%s "; +$lang->pager->first = "首頁"; +$lang->pager->pre = "上頁"; +$lang->pager->next = "下頁"; +$lang->pager->last = "末頁"; +$lang->pager->locate = "GO!"; + +$lang->zentaoSite = "官方網站"; +$lang->chinaScrum = "Scrum社區 "; +$lang->agileTraining = "培訓 "; +$lang->donate = "捐助禪道 "; +$lang->zentaoKeywords = "開源項目管理軟件,項目管理,項目管理軟件,pmp,pms,php框架,國產php框架,scrum工具,scrum管理工具,scrum管理軟件,敏捷項目管理,禪道"; +$lang->zentaoDESC = "禪道項目管理軟件(ZenTaoPMS)是一款國產的,基于LGPL協議,開源免費的項目管理軟件(工具、系統),同時也是一款scrum管理工具。 + 它集產品管理、項目管理、測試管理於一體,同時還包含了事務管理、組織管理等諸多功能,是中小型企業項目管理的首選。禪道項目管理軟件使用PHP + MySQL開發, +基于自主的PHP開發框架──ZenTaoPHP而成。第三方開發者或者企業可以非常方便的開發插件或者進行定製。禪道在手,項目無憂!"; + +/* 時間格式設置。*/ +define('DT_DATETIME1', 'Y-m-d H:i:s'); +define('DT_DATETIME2', 'y-m-d H:i'); +define('DT_MONTHTIME1', 'n/d H:i'); +define('DT_MONTHTIME2', 'n月d日 H:i'); +define('DT_DATE1', 'Y-m-d'); +define('DT_DATE2', 'Ymd'); +define('DT_DATE3', 'Y年m月d日'); +define('DT_DATE4', 'n月j日'); +define('DT_TIME1', 'H:i:s'); +define('DT_TIME2', 'H:i'); diff --git a/module/common/model.php b/module/common/model.php index 3b1227dd5a..37e0008e19 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -1,367 +1,367 @@ - - * @package common - * @version $Id$ - * @link http://www.zentao.net - */ -class commonModel extends model -{ - /** - * Start the session. - * - * @access public - * @return void - */ - public function startSession() - { - session_name($this->config->sessionVar); - if(isset($_GET[$this->config->sessionVar])) session_id($_GET[$this->config->sessionVar]); - session_start(); - } - - /** - * Set the header info. - * - * @access public - * @return void - */ - public function sendHeader() - { - header("Content-Type: text/html; Language={$this->config->encoding}"); - header("Cache-control: private"); - } - - /** - * Set the commpany. - * - * First, search company by the http host. If not found, search by the default domain. Last, use the first as the default. - * After get the company, save it to session. - * @access public - * @return void - */ - public function setCompany() - { - $httpHost = $this->server->http_host; - if(strpos($httpHost, ":")) - { - $httpHost = explode(":", $httpHost); - $httpHost = $httpHost[0]; - } - - if($this->session->company and $this->session->company->pms == $httpHost) - { - $this->app->company = $this->session->company; - } - else - { - $company = $this->loadModel('company')->getByDomain(); - if(!$company and isset($this->config->default->domain)) $company = $this->company->getByDomain($this->config->default->domain); - if(!$company) $company = $this->company->getFirst(); - if(!$company) $this->app->error(sprintf($this->lang->error->companyNotFound, $httpHost), __FILE__, __LINE__, $exit = true); - $this->session->set('company', $company); - $this->app->company = $company; - } - } - - /** - * Set the user info. - * - * @access public - * @return void - */ - public function setUser() - { - if($this->session->user) - { - $this->app->user = $this->session->user; - } - elseif($this->app->company->guest) - { - $user = new stdClass(); - $user->id = 0; - $user->account = 'guest'; - $user->realname = 'guest'; - $user->rights = $this->loadModel('user')->authorize('guest'); - $this->session->set('user', $user); - $this->app->user = $this->session->user; - } - } - - /** - * Juage a method of one module is open or not? - * - * @param string $module - * @param string $method - * @access public - * @return bool - */ - public function isOpenMethod($module, $method) - { - if($module == 'user' and strpos('login|logout|deny', $method) !== false) return true; - if($module == 'api' and $method == 'getsessionid') return true; - if($module == 'misc' and $method == 'about') return true; - if($module == 'misc' and $method == 'checkupdate') return true; - if($module == 'help' and $method == 'field') return true; - return false; - } - - /** - * Deny access. - * - * @access public - * @return void - */ - public function deny($module, $method) - { - $vars = "module=$module&method=$method"; - if(isset($this->server->http_referer)) - { - $referer = helper::safe64Encode($this->server->http_referer); - $vars .= "&referer=$referer"; - } - $denyLink = helper::createLink('user', 'deny', $vars); - - /* Fix the bug of IE: use js locate, can't get the referer. */ - if(strpos($this->server->http_user_agent, 'MSIE') !== false) - { - echo ""; - echo ""; - } - else - { - echo js::locate($denyLink); - } - exit; - } - - /** - * Get the run info. - * - * @param mixed $startTime the start time of this execution - * @access public - * @return array the run info array. - */ - public function getRunInfo($startTime) - { - $info['timeUsed'] = round(getTime() - $startTime, 4) * 1000; - $info['memory'] = round(memory_get_peak_usage() / 1024, 1); - $info['querys'] = count(dao::$querys); - return $info; - } - - /** - * Print top bar. - * - * @static - * @access public - * @return void - */ - public static function printTopBar() - { - global $lang, $app; - - printf($lang->todayIs, date(DT_DATE3)); - if(isset($app->user)) echo $app->user->realname . ' '; - if(isset($app->user) and $app->user->account != 'guest') - { - echo html::a(helper::createLink('my', 'index'), $lang->myControl); - echo html::a(helper::createLink('user', 'logout'), $lang->logout); - } - else - { - echo html::a(helper::createLink('user', 'login'), $lang->login); - } - echo html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao, '', "class='about'"); - echo $lang->agileTraining; - echo $lang->donate; - } - - /** - * Print the main menu. - * - * @param string $moduleName - * @static - * @access public - * @return void - */ - public static function printMainmenu($moduleName) - { - global $app, $lang; - echo "\n"; - } - - /** - * Print the module menu. - * - * @param string $moduleName - * @static - * @access public - * @return void - */ - public static function printModuleMenu($moduleName) - { - global $lang, $app; - - if(!isset($lang->$moduleName->menu)) {echo ""; return;} - - /* Get the sub menus of the module, and get current module and method. */ - $submenus = $lang->$moduleName->menu; - $currentModule = $app->getModuleName(); - $currentMethod = $app->getMethodName(); - - /* The beginning of the menu. */ - echo "\n"; - } - - /** - * Print the bread menu. - * - * @param string $moduleName - * @param string $position - * @static - * @access public - * @return void - */ - public static function printBreadMenu($moduleName, $position) - { - global $lang; - $mainMenu = $moduleName; - if(isset($lang->menugroup->$moduleName)) $mainMenu = $lang->menugroup->$moduleName; - echo html::a(helper::createLink('my', 'index'), $lang->ZenTaoPMS) . $lang->arrow; - if($moduleName != 'index') - { - list($menuLabel, $module, $method) = explode('|', $lang->menu->$mainMenu); - echo html::a(helper::createLink($module, $method), $menuLabel); - } - else - { - echo $lang->index->common; - } - if(empty($position)) return; - echo $lang->arrow; - foreach($position as $key => $link) - { - echo $link; - if(isset($position[$key + 1])) echo $lang->arrow; - } - } - - - /** - * Diff two string. (see phpt) - * - * @param string $text1 - * @param string $text2 - * @static - * @access public - * @return string - */ - public static function diff($text1, $text2) - { - $text1 = str_replace(' ', '', trim($text1)); - $text2 = str_replace(' ', '', trim($text2)); - $w = explode("\n", $text1); - $o = explode("\n", $text2); - $w1 = array_diff_assoc($w,$o); - $o1 = array_diff_assoc($o,$w); - $w2 = array(); - $o2 = array(); - foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1) . "" . trim($val) . ""; - foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1) . "" . trim($val) . ""; - $diff = array_merge($w2, $o2); - ksort($diff); - return implode("\n", $diff); - } -} + + * @package common + * @version $Id$ + * @link http://www.zentao.net + */ +class commonModel extends model +{ + /** + * Start the session. + * + * @access public + * @return void + */ + public function startSession() + { + session_name($this->config->sessionVar); + if(isset($_GET[$this->config->sessionVar])) session_id($_GET[$this->config->sessionVar]); + session_start(); + } + + /** + * Set the header info. + * + * @access public + * @return void + */ + public function sendHeader() + { + header("Content-Type: text/html; Language={$this->config->encoding}"); + header("Cache-control: private"); + } + + /** + * Set the commpany. + * + * First, search company by the http host. If not found, search by the default domain. Last, use the first as the default. + * After get the company, save it to session. + * @access public + * @return void + */ + public function setCompany() + { + $httpHost = $this->server->http_host; + if(strpos($httpHost, ":")) + { + $httpHost = explode(":", $httpHost); + $httpHost = $httpHost[0]; + } + + if($this->session->company and $this->session->company->pms == $httpHost) + { + $this->app->company = $this->session->company; + } + else + { + $company = $this->loadModel('company')->getByDomain(); + if(!$company and isset($this->config->default->domain)) $company = $this->company->getByDomain($this->config->default->domain); + if(!$company) $company = $this->company->getFirst(); + if(!$company) $this->app->error(sprintf($this->lang->error->companyNotFound, $httpHost), __FILE__, __LINE__, $exit = true); + $this->session->set('company', $company); + $this->app->company = $company; + } + } + + /** + * Set the user info. + * + * @access public + * @return void + */ + public function setUser() + { + if($this->session->user) + { + $this->app->user = $this->session->user; + } + elseif($this->app->company->guest) + { + $user = new stdClass(); + $user->id = 0; + $user->account = 'guest'; + $user->realname = 'guest'; + $user->rights = $this->loadModel('user')->authorize('guest'); + $this->session->set('user', $user); + $this->app->user = $this->session->user; + } + } + + /** + * Juage a method of one module is open or not? + * + * @param string $module + * @param string $method + * @access public + * @return bool + */ + public function isOpenMethod($module, $method) + { + if($module == 'user' and strpos('login|logout|deny', $method) !== false) return true; + if($module == 'api' and $method == 'getsessionid') return true; + if($module == 'misc' and $method == 'about') return true; + if($module == 'misc' and $method == 'checkupdate') return true; + if($module == 'help' and $method == 'field') return true; + return false; + } + + /** + * Deny access. + * + * @access public + * @return void + */ + public function deny($module, $method) + { + $vars = "module=$module&method=$method"; + if(isset($this->server->http_referer)) + { + $referer = helper::safe64Encode($this->server->http_referer); + $vars .= "&referer=$referer"; + } + $denyLink = helper::createLink('user', 'deny', $vars); + + /* Fix the bug of IE: use js locate, can't get the referer. */ + if(strpos($this->server->http_user_agent, 'MSIE') !== false) + { + echo ""; + echo ""; + } + else + { + echo js::locate($denyLink); + } + exit; + } + + /** + * Get the run info. + * + * @param mixed $startTime the start time of this execution + * @access public + * @return array the run info array. + */ + public function getRunInfo($startTime) + { + $info['timeUsed'] = round(getTime() - $startTime, 4) * 1000; + $info['memory'] = round(memory_get_peak_usage() / 1024, 1); + $info['querys'] = count(dao::$querys); + return $info; + } + + /** + * Print top bar. + * + * @static + * @access public + * @return void + */ + public static function printTopBar() + { + global $lang, $app; + + printf($lang->todayIs, date(DT_DATE3)); + if(isset($app->user)) echo $app->user->realname . ' '; + if(isset($app->user) and $app->user->account != 'guest') + { + echo html::a(helper::createLink('my', 'index'), $lang->myControl); + echo html::a(helper::createLink('user', 'logout'), $lang->logout); + } + else + { + echo html::a(helper::createLink('user', 'login'), $lang->login); + } + echo html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao, '', "class='about'"); + echo $lang->agileTraining; + echo $lang->donate; + } + + /** + * Print the main menu. + * + * @param string $moduleName + * @static + * @access public + * @return void + */ + public static function printMainmenu($moduleName) + { + global $app, $lang; + echo "\n"; + } + + /** + * Print the module menu. + * + * @param string $moduleName + * @static + * @access public + * @return void + */ + public static function printModuleMenu($moduleName) + { + global $lang, $app; + + if(!isset($lang->$moduleName->menu)) {echo ""; return;} + + /* Get the sub menus of the module, and get current module and method. */ + $submenus = $lang->$moduleName->menu; + $currentModule = $app->getModuleName(); + $currentMethod = $app->getMethodName(); + + /* The beginning of the menu. */ + echo "\n"; + } + + /** + * Print the bread menu. + * + * @param string $moduleName + * @param string $position + * @static + * @access public + * @return void + */ + public static function printBreadMenu($moduleName, $position) + { + global $lang; + $mainMenu = $moduleName; + if(isset($lang->menugroup->$moduleName)) $mainMenu = $lang->menugroup->$moduleName; + echo html::a(helper::createLink('my', 'index'), $lang->ZenTaoPMS) . $lang->arrow; + if($moduleName != 'index') + { + list($menuLabel, $module, $method) = explode('|', $lang->menu->$mainMenu); + echo html::a(helper::createLink($module, $method), $menuLabel); + } + else + { + echo $lang->index->common; + } + if(empty($position)) return; + echo $lang->arrow; + foreach($position as $key => $link) + { + echo $link; + if(isset($position[$key + 1])) echo $lang->arrow; + } + } + + + /** + * Diff two string. (see phpt) + * + * @param string $text1 + * @param string $text2 + * @static + * @access public + * @return string + */ + public static function diff($text1, $text2) + { + $text1 = str_replace(' ', '', trim($text1)); + $text2 = str_replace(' ', '', trim($text2)); + $w = explode("\n", $text1); + $o = explode("\n", $text2); + $w1 = array_diff_assoc($w,$o); + $o1 = array_diff_assoc($o,$w); + $w2 = array(); + $o2 = array(); + foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1) . "" . trim($val) . ""; + foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1) . "" . trim($val) . ""; + $diff = array_merge($w2, $o2); + ksort($diff); + return implode("\n", $diff); + } +} diff --git a/module/common/view/footer.html.php b/module/common/view/footer.html.php index 08a9d68424..fdf4a5f5cb 100644 --- a/module/common/view/footer.html.php +++ b/module/common/view/footer.html.php @@ -1,31 +1,31 @@ - - getExtViewFile(__FILE__)){include $extView; return helper::cd();}?> -
- - - - - - - + + getExtViewFile(__FILE__)){include $extView; return helper::cd();}?> +
+ + + + + + + diff --git a/module/common/view/header.html.php b/module/common/view/header.html.php index 5bdb96e0e6..a3afc7b58e 100644 --- a/module/common/view/header.html.php +++ b/module/common/view/header.html.php @@ -1,30 +1,30 @@ -getExtViewFile(__FILE__)){include $extView; return helper::cd();} -include 'header.lite.html.php'; -include 'colorbox.html.php'; -?> - - - - -
-
+getExtViewFile(__FILE__)){include $extView; return helper::cd();} +include 'header.lite.html.php'; +include 'colorbox.html.php'; +?> + + + + +
+
diff --git a/module/svn/control.php b/module/svn/control.php index a960b7aea3..b5fa68504b 100644 --- a/module/svn/control.php +++ b/module/svn/control.php @@ -1,98 +1,98 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -class svn extends control -{ - /** - * Sync svn. - * - * @access public - * @return void - */ - public function run() - { - $this->svn->run(); - } - - /** - * Diff a file. - * - * @param string $url - * @param int $revision - * @access public - * @return void - */ - public function diff($url, $revision) - { - $url = helper::safe64Decode($url); - $this->view->url = $url; - $this->view->revision = $revision; - $this->view->diff = $this->svn->diff($url, $revision); - - $this->display(); - } - - /** - * Cat a file. - * - * @param string $url - * @param int $revision - * @access public - * @return void - */ - public function cat($url, $revision) - { - $url = helper::safe64Decode($url); - $this->view->url = $url; - $this->view->revision = $revision; - $this->view->code = $this->svn->cat($url, $revision); - - $this->display(); - } - - /** - * Sync from the syncer by api. - * - * @access public - * @return void - */ - public function apiSync() - { - if($this->post->logs) - { - $repoRoot = $this->post->repoRoot; - $logs = stripslashes($this->post->logs); - $logs = simplexml_load_string($logs); - foreach($logs->logentry as $entry) - { - $parsedLogs[] = $this->svn->convertLog($entry); - } - $parsedObjects = array('stories' => array(), 'tasks' => array(), 'bugs' => array()); - foreach($parsedLogs as $log) - { - $objects = $this->svn->parseComment($log->msg); - if($objects) - { - $this->svn->saveAction2PMS($objects, $log, $repoRoot); - if($objects['stories']) $parsedObjects['stories'] = array_merge($parsedObjects['stories'], $objects['stories']); - if($objects['tasks']) $parsedObjects['tasks' ] = array_merge($parsedObjects['tasks'], $objects['tasks']); - if($objects['bugs']) $parsedObjects['bugs'] = array_merge($parsedObjects['bugs'], $objects['bugs']); - } - } - $parsedObjects['stories'] = array_unique($parsedObjects['stories']); - $parsedObjects['tasks'] = array_unique($parsedObjects['tasks']); - $parsedObjects['bugs'] = array_unique($parsedObjects['bugs']); - $this->view->parsedObjects = $parsedObjects; - $this->display(); - exit; - } - } -} + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +class svn extends control +{ + /** + * Sync svn. + * + * @access public + * @return void + */ + public function run() + { + $this->svn->run(); + } + + /** + * Diff a file. + * + * @param string $url + * @param int $revision + * @access public + * @return void + */ + public function diff($url, $revision) + { + $url = helper::safe64Decode($url); + $this->view->url = $url; + $this->view->revision = $revision; + $this->view->diff = $this->svn->diff($url, $revision); + + $this->display(); + } + + /** + * Cat a file. + * + * @param string $url + * @param int $revision + * @access public + * @return void + */ + public function cat($url, $revision) + { + $url = helper::safe64Decode($url); + $this->view->url = $url; + $this->view->revision = $revision; + $this->view->code = $this->svn->cat($url, $revision); + + $this->display(); + } + + /** + * Sync from the syncer by api. + * + * @access public + * @return void + */ + public function apiSync() + { + if($this->post->logs) + { + $repoRoot = $this->post->repoRoot; + $logs = stripslashes($this->post->logs); + $logs = simplexml_load_string($logs); + foreach($logs->logentry as $entry) + { + $parsedLogs[] = $this->svn->convertLog($entry); + } + $parsedObjects = array('stories' => array(), 'tasks' => array(), 'bugs' => array()); + foreach($parsedLogs as $log) + { + $objects = $this->svn->parseComment($log->msg); + if($objects) + { + $this->svn->saveAction2PMS($objects, $log, $repoRoot); + if($objects['stories']) $parsedObjects['stories'] = array_merge($parsedObjects['stories'], $objects['stories']); + if($objects['tasks']) $parsedObjects['tasks' ] = array_merge($parsedObjects['tasks'], $objects['tasks']); + if($objects['bugs']) $parsedObjects['bugs'] = array_merge($parsedObjects['bugs'], $objects['bugs']); + } + } + $parsedObjects['stories'] = array_unique($parsedObjects['stories']); + $parsedObjects['tasks'] = array_unique($parsedObjects['tasks']); + $parsedObjects['bugs'] = array_unique($parsedObjects['bugs']); + $this->view->parsedObjects = $parsedObjects; + $this->display(); + exit; + } + } +} diff --git a/module/svn/lang/en.php b/module/svn/lang/en.php index 2071994f8d..ff31b6a2fa 100644 --- a/module/svn/lang/en.php +++ b/module/svn/lang/en.php @@ -1,16 +1,16 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -/* Methods. */ -$lang->svn->common = 'Subversion'; -$lang->svn->cat = 'View code'; -$lang->svn->diff = 'Diff code'; -$lang->svn->apiSync = 'API: sync svn log'; + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +/* Methods. */ +$lang->svn->common = 'Subversion'; +$lang->svn->cat = 'View code'; +$lang->svn->diff = 'Diff code'; +$lang->svn->apiSync = 'API: sync svn log'; diff --git a/module/svn/lang/zh-cn.php b/module/svn/lang/zh-cn.php index 5d265fb190..09f1573c15 100644 --- a/module/svn/lang/zh-cn.php +++ b/module/svn/lang/zh-cn.php @@ -1,16 +1,16 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -/* 方法列表。*/ -$lang->svn->common = 'Subversion'; -$lang->svn->cat = '查看源代码'; -$lang->svn->diff = '比较源代码'; -$lang->svn->apiSync = '接口:同步svn日志'; + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +/* 方法列表。*/ +$lang->svn->common = 'Subversion'; +$lang->svn->cat = '查看源代码'; +$lang->svn->diff = '比较源代码'; +$lang->svn->apiSync = '接口:同步svn日志'; diff --git a/module/svn/lang/zh-tw.php b/module/svn/lang/zh-tw.php index 980d0a55ba..d7f922aff3 100644 --- a/module/svn/lang/zh-tw.php +++ b/module/svn/lang/zh-tw.php @@ -1,16 +1,16 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -/* 方法列表。*/ -$lang->svn->common = 'Subversion'; -$lang->svn->cat = '查看原始碼'; -$lang->svn->diff = '比較原始碼'; -$lang->svn->apiSync = '介面:同步svn日誌'; + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +/* 方法列表。*/ +$lang->svn->common = 'Subversion'; +$lang->svn->cat = '查看原始碼'; +$lang->svn->diff = '比較原始碼'; +$lang->svn->apiSync = '介面:同步svn日誌'; diff --git a/module/svn/model.php b/module/svn/model.php index aafc5d56ed..6cfd38634c 100644 --- a/module/svn/model.php +++ b/module/svn/model.php @@ -1,634 +1,634 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -?> -loadModel('action'); - } - - /** - * Run. - * - * @access public - * @return void - */ - public function run() - { - $this->setRepos(); - $this->setLogRoot(); - $this->setRestartFile(); - - foreach($this->repos as $name => $repo) - { - $this->printLog("begin repo $name"); - $repo = (object)$repo; - $repo->name = $name; - $this->setRepo($repo); - - $savedRevision = $this->getSavedRevision(); - $this->printLog("start from revision $savedRevision"); - $logs = $this->getRepoLogs($repo, $savedRevision); - $this->printLog("get " . count($logs) . " logs"); - - $this->printLog('begin parsing logs'); - foreach($logs as $log) - { - $this->printLog("parsing log {$log->revision}"); - if($log->revision == $savedRevision) - { - $this->printLog("{$log->revision} alread parsed, ommit it"); - continue; - } - - $this->printLog("comment is\n----------\n" . trim($log->msg) . "\n----------"); - $objects = $this->parseComment($log->msg); - if($objects) - { - $this->printLog('extract' . - 'story:' . join(' ', $objects['stories']) . - ' task:' . join(' ', $objects['tasks']) . - ' bug:' . join(',', $objects['bugs'])); - - $this->saveAction2PMS($objects, $log); - } - else - { - $this->printLog('no objects found' . "\n"); - } - if($log->revision > $savedRevision) $savedRevision = $log->revision; - } - $this->saveLastRevision($savedRevision); - $this->printLog("save revision $savedRevision"); - $this->deleteRestartFile(); - $this->printLog("\n\nrepo $name finished"); - } - } - - /** - * Set the log root. - * - * @access public - * @return void - */ - public function setLogRoot() - { - $this->logRoot = $this->app->getTmpRoot() . 'svn/'; - if(!is_dir($this->logRoot)) mkdir($this->logRoot); - } - - /** - * Set the restart file. - * - * @access public - * @return void - */ - public function setRestartFile() - { - $this->restartFile = dirname(__FILE__) . '/restart'; - } - - /** - * Delete the restart file. - * - * @access public - * @return void - */ - public function deleteRestartFile() - { - if(is_file($this->restartFile)) unlink($this->restartFile); - } - - /** - * Set the repos. - * - * @access public - * @return void - */ - public function setRepos() - { - if(!$this->config->svn->repos) die("You must set one svn repo.\n"); - $this->repos = $this->config->svn->repos; - } - - /** - * Set repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setRepo($repo) - { - $this->setClient($repo); - $this->setLogFile($repo->name); - $this->setRepoRoot($repo); - } - - /** - * Set the svn binary client of a repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setClient($repo) - { - if($this->config->svn->client == '') die("You must set the svn client file.\n"); - $this->client = $this->config->svn->client . " --non-interactive"; - if(isset($repo->username)) $this->client .= " --username $repo->username --password $repo->password --no-auth-cache"; - } - - /** - * Set the log file of a repo. - * - * @param string $repoName - * @access public - * @return void - */ - public function setLogFile($repoName) - { - $this->logFile = $this->logRoot . $repoName; - } - - /** - * set the root path of a repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setRepoRoot($repo) - { - $cmd = $this->client . " info --xml $repo->path"; - $info = `$cmd`; - $info = simplexml_load_string($info); - $repoRoot = $info->entry->repository->root; - $this->repoRoot = $repoRoot; - } - - /** - * Get repo logs. - * - * @param object $repo - * @param int $fromRevision - * @access public - * @return array - */ - public function getRepoLogs($repo, $fromRevision) - { - $parsedLogs = array(); - - /* The svn log command. */ - $cmd = $this->client . " log -r $fromRevision:HEAD -v --xml $repo->path"; - $rawLogs = `$cmd`; - $logs = @simplexml_load_string($rawLogs); // Convert it to object. - if(!$logs) die("Some error occers: \nThe command is $cmd\n the svn logs is $rawLogs\n"); - - /* Process logs. */ - foreach($logs->logentry as $entry) $parsedLogs[] = $this->convertLog($entry); - return $parsedLogs; - } - - /** - * Convert log from xml format to object. - * - * @param object $log - * @access public - * @return ojbect - */ - public function convertLog($log) - { - /* Get author, revision, msg, date attributes. */ - $parsedLog = new stdClass(); - $parsedLog->author = (string)$log->author; - $parsedLog->revision = (int)$log['revision']; - $parsedLog->msg = trim((string)$log->msg); - $parsedLog->date = date('Y-m-d H:i:s', strtotime($log->date)); - - /* Process files. */ - $parsedLog->files = array(); - foreach ($log->paths as $key => $paths) - { - $parsedFiles = array(); - foreach($paths as $path) - { - $action = (string)$path['action']; - $parsedFiles[$action][] = (string)$path; - } - } - $parsedLog->files = $parsedFiles; - - return $parsedLog; - } - - /** - * Parse the comment of svn, extract object id list from it. - * - * @param string $comment - * @access public - * @return array - */ - public function parseComment($comment) - { - $stories = array(); - $tasks = array(); - $bugs = array(); - - // bug|story|task(case insensitive) + some space + #|:|:(Chinese) + id lists(maybe join with space or ,) - // $comment = "bug # 1,2,3,4 Bug:1 2 3 4 5 story:9999,1234566 story:456,1234566"; - $commonReg = "(?:\s){0,}(?:#|:|:){0,}([0-9, ]{1,})"; - $taskReg = '/task' . $commonReg . '/i'; - $storyReg = '/story' . $commonReg . '/i'; - $bugReg = '/bug' . $commonReg . '/i'; - - if(preg_match_all($storyReg, $comment, $result)) $stories = join(' ', $result[1]); - if(preg_match_all($taskReg, $comment, $result)) $tasks = join(' ', $result[1]); - if(preg_match_all($bugReg, $comment, $result)) $bugs = join(' ', $result[1]); - - if($stories) $stories = array_unique(explode(' ', str_replace(',', ' ', $stories))); - if($tasks) $tasks = array_unique(explode(' ', str_replace(',', ' ', $tasks))); - if($bugs) $bugs = array_unique(explode(' ', str_replace(',', ' ', $bugs))); - - if(!$stories and !$tasks and !$bugs) return array(); - return array('stories' => $stories, 'tasks' => $tasks, 'bugs' => $bugs); - } - - /** - * Convert the comment to uft-8. - * - * @param string $comment - * @access public - * @return string - */ - public function iconvComment($comment) - { - /* Get encodings. */ - $encodings = str_replace(' ', '', trim($comment)); - if($encodings == '') return $comment; - $encodings = explode(',', $encodings); - - /* Try convert. */ - foreach($encodings as $encoding) - { - $result = @iconv($encoding, 'utf-8', $comment); - if($result) return $result; - } - - return $comment; - } - - /** - * Diff a url. - * - * @param string $url - * @param int $revision - * @access public - * @return string|bool - */ - public function diff($url, $revision) - { - $repo = $this->getRepoByURL($url); - if(!$repo) return false; - - $this->setClient($repo); - - $oldRevision = $revision - 1; - $cmd = $this->client . " diff --old=$url@$oldRevision --new=$url@$revision"; - $diff = `$cmd`; - return $diff; - } - - /** - * Cat a url. - * - * @param string $url - * @param int $revision - * @access public - * @return string|bool - */ - public function cat($url, $revision) - { - $repo = $this->getRepoByURL($url); - if(!$repo) return false; - - $this->setClient($repo); - - $cmd = $this->client . " cat $url@$revision"; - $code = `$cmd`; - return $code; - } - - /** - * Get repo by url. - * - * @param string $url - * @access public - * @return object|bool - */ - public function getRepoByURL($url) - { - foreach($this->config->svn->repos as $repo) if(strpos($url, $repo['path']) !== false) return (object)$repo; - return false; - } - - /** - * Save action to pms. - * - * @param array $objects - * @param object $log - * @param string $repoRoot - * @access public - * @return void - */ - public function saveAction2PMS($objects, $log, $repoRoot = '') - { - $action->actor = $log->author; - $action->action = 'svncommited'; - $action->date = $log->date; - $action->comment = $this->iconvComment($log->msg); - $action->extra = $log->revision; - - $changes = $this->createActionChanges($log, $repoRoot); - - if($objects['stories']) - { - $products = $this->getStoryProducts($objects['stories']); - foreach($objects['stories'] as $storyID) - { - $storyID = (int)$storyID; - if(!isset($products[$storyID])) continue; - - $action->objectType = 'story'; - $action->objectID = $storyID; - $action->product = $products[$storyID]; - $action->project = 0; - - $this->saveRecord($action, $changes); - } - } - - if($objects['tasks']) - { - $productsAndProjects = $this->getTaskProductsAndProjects($objects['tasks']); - foreach($objects['tasks'] as $taskID) - { - $taskID = (int)$taskID; - if(!isset($productsAndProjects[$taskID])) continue; - - $action->objectType = 'task'; - $action->objectID = $taskID; - $action->product = $productsAndProjects[$taskID]['product']; - $action->project = $productsAndProjects[$taskID]['project']; - - $this->saveRecord($action, $changes); - } - } - - if($objects['bugs']) - { - $productsAndProjects = $this->getBugProductsAndProjects($objects['bugs']); - - foreach($objects['bugs'] as $bugID) - { - $bugID = (int)$bugID; - if(!isset($productsAndProjects[$bugID])) continue; - - $action->objectType = 'bug'; - $action->objectID = $bugID; - $action->product = $productsAndProjects[$bugID]->product; - $action->project = $productsAndProjects[$bugID]->project; - - $this->saveRecord($action, $changes); - } - } - } - - /** - * Save an action to pms. - * - * @param object $action - * @param object $log - * @access public - * @return bool - */ - public function saveRecord($action, $changes) - { - $record = $this->dao->select('*')->from(TABLE_ACTION) - ->where('objectType')->eq($action->objectType) - ->andWhere('objectID')->eq($action->objectID) - ->andWhere('extra')->eq($action->extra) - ->andWhere('action')->eq('svncommited') - ->fetch(); - if($record) - { - $this->dao->update(TABLE_ACTION)->data($action)->where('id')->eq($record->id)->exec(); - if($changes) - { - $historyID = $this->dao->findByAction($record->id)->from(TABLE_HISTORY)->fetch('id'); - $this->dao->update(TABLE_HISTORY)->data($changes)->where('id')->eq($historyID)->exec(); - } - } - else - { - $this->dao->insert(TABLE_ACTION)->data($action)->autoCheck()->exec(); - if($changes) - { - $actionID = $this->dao->lastInsertID(); - $this->action->logHistory($actionID, array($changes)); - } - } - } - - /** - * Create changes for action from a log. - * - * @param object $log - * @param string $repoRoot - * @access public - * @return array - */ - public function createActionChanges($log, $repoRoot) - { - if(!$log->files) return array(); - $diff = ''; - - $oldSelf = $this->server->PHP_SELF; - $this->server->set('PHP_SELF', $this->config->webRoot); - - if(!$repoRoot) $repoRoot = $this->repoRoot; - - foreach($log->files as $action => $actionFiles) - { - foreach($actionFiles as $file) - { - $param = array('url' => helper::safe64Encode($repoRoot . $file), 'revision' => $log->revision); - $catLink = trim(html::a(helper::createLink('svn', 'cat', $param, 'html'), 'view', '', "class='svnlink'")); - $diffLink = trim(html::a(helper::createLink('svn', 'diff', $param, 'html'), 'diff', '', "class='svnlink'")); - $diff .= $action . " " . $file . " $catLink "; - $diff .= $action == 'M' ? "$diffLink\n" : "\n" ; - } - } - $changes->field = 'subversion'; - $changes->old = ''; - $changes->new = ''; - $changes->diff = trim($diff); - - $this->server->set('PHP_SELF', $oldSelf); - return (array)$changes; - } - - /** - * Get products of stories. - * - * @param array $stories - * @access public - * @return array - */ - public function getStoryProducts($stories) - { - return $this->dao->select('id, product')->from(TABLE_STORY)->where('id')->in($stories)->fetchPairs(); - } - - /** - * Get products and projects of tasks. - * - * @param array $tasks - * @access public - * @return array - */ - public function getTaskProductsAndProjects($tasks) - { - $records = array(); - $products = $this->dao->select('t1.id, t2.product') - ->from(TABLE_TASK)->alias('t1') - ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') - ->where('t1.id')->in($tasks)->fetchPairs(); - - $projects = $this->dao->select('id, project')->from(TABLE_TASK)->where('id')->in($tasks)->fetchPairs(); - - foreach($projects as $taskID => $projectID) - { - $record = array(); - $record['project'] = $projectID; - $record['product'] = isset($products[$taskID]) ? $products[$taskID] : 0; - $records[$taskID] = $record; - } - return $records; - } - - /** - * Get products and projects of bugs. - * - * @param array $bugs - * @access public - * @return array - */ - public function getBugProductsAndProjects($bugs) - { - return $this->dao->select('id, project, product')->from(TABLE_BUG)->where('id')->in($bugs)->fetchAll('id'); - } - - /** - * Get the saved revision. - * - * @access public - * @return int - */ - public function getSavedRevision() - { - if(!file_exists($this->logFile)) return 0; - if(file_exists($this->restartFile)) return 0; - return (int)trim(file_get_contents($this->logFile)); - } - - /** - * Save the last revision. - * - * @param int $revision - * @access public - * @return void - */ - public function saveLastRevision($revision) - { - file_put_contents($this->logFile, $revision); - } - - /** - * Pring log. - * - * @param sting $log - * @access public - * @return void - */ - public function printLog($log) - { - echo helper::now() . " $log\n"; - } -} + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +?> +loadModel('action'); + } + + /** + * Run. + * + * @access public + * @return void + */ + public function run() + { + $this->setRepos(); + $this->setLogRoot(); + $this->setRestartFile(); + + foreach($this->repos as $name => $repo) + { + $this->printLog("begin repo $name"); + $repo = (object)$repo; + $repo->name = $name; + $this->setRepo($repo); + + $savedRevision = $this->getSavedRevision(); + $this->printLog("start from revision $savedRevision"); + $logs = $this->getRepoLogs($repo, $savedRevision); + $this->printLog("get " . count($logs) . " logs"); + + $this->printLog('begin parsing logs'); + foreach($logs as $log) + { + $this->printLog("parsing log {$log->revision}"); + if($log->revision == $savedRevision) + { + $this->printLog("{$log->revision} alread parsed, ommit it"); + continue; + } + + $this->printLog("comment is\n----------\n" . trim($log->msg) . "\n----------"); + $objects = $this->parseComment($log->msg); + if($objects) + { + $this->printLog('extract' . + 'story:' . join(' ', $objects['stories']) . + ' task:' . join(' ', $objects['tasks']) . + ' bug:' . join(',', $objects['bugs'])); + + $this->saveAction2PMS($objects, $log); + } + else + { + $this->printLog('no objects found' . "\n"); + } + if($log->revision > $savedRevision) $savedRevision = $log->revision; + } + $this->saveLastRevision($savedRevision); + $this->printLog("save revision $savedRevision"); + $this->deleteRestartFile(); + $this->printLog("\n\nrepo $name finished"); + } + } + + /** + * Set the log root. + * + * @access public + * @return void + */ + public function setLogRoot() + { + $this->logRoot = $this->app->getTmpRoot() . 'svn/'; + if(!is_dir($this->logRoot)) mkdir($this->logRoot); + } + + /** + * Set the restart file. + * + * @access public + * @return void + */ + public function setRestartFile() + { + $this->restartFile = dirname(__FILE__) . '/restart'; + } + + /** + * Delete the restart file. + * + * @access public + * @return void + */ + public function deleteRestartFile() + { + if(is_file($this->restartFile)) unlink($this->restartFile); + } + + /** + * Set the repos. + * + * @access public + * @return void + */ + public function setRepos() + { + if(!$this->config->svn->repos) die("You must set one svn repo.\n"); + $this->repos = $this->config->svn->repos; + } + + /** + * Set repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setRepo($repo) + { + $this->setClient($repo); + $this->setLogFile($repo->name); + $this->setRepoRoot($repo); + } + + /** + * Set the svn binary client of a repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setClient($repo) + { + if($this->config->svn->client == '') die("You must set the svn client file.\n"); + $this->client = $this->config->svn->client . " --non-interactive"; + if(isset($repo->username)) $this->client .= " --username $repo->username --password $repo->password --no-auth-cache"; + } + + /** + * Set the log file of a repo. + * + * @param string $repoName + * @access public + * @return void + */ + public function setLogFile($repoName) + { + $this->logFile = $this->logRoot . $repoName; + } + + /** + * set the root path of a repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setRepoRoot($repo) + { + $cmd = $this->client . " info --xml $repo->path"; + $info = `$cmd`; + $info = simplexml_load_string($info); + $repoRoot = $info->entry->repository->root; + $this->repoRoot = $repoRoot; + } + + /** + * Get repo logs. + * + * @param object $repo + * @param int $fromRevision + * @access public + * @return array + */ + public function getRepoLogs($repo, $fromRevision) + { + $parsedLogs = array(); + + /* The svn log command. */ + $cmd = $this->client . " log -r $fromRevision:HEAD -v --xml $repo->path"; + $rawLogs = `$cmd`; + $logs = @simplexml_load_string($rawLogs); // Convert it to object. + if(!$logs) die("Some error occers: \nThe command is $cmd\n the svn logs is $rawLogs\n"); + + /* Process logs. */ + foreach($logs->logentry as $entry) $parsedLogs[] = $this->convertLog($entry); + return $parsedLogs; + } + + /** + * Convert log from xml format to object. + * + * @param object $log + * @access public + * @return ojbect + */ + public function convertLog($log) + { + /* Get author, revision, msg, date attributes. */ + $parsedLog = new stdClass(); + $parsedLog->author = (string)$log->author; + $parsedLog->revision = (int)$log['revision']; + $parsedLog->msg = trim((string)$log->msg); + $parsedLog->date = date('Y-m-d H:i:s', strtotime($log->date)); + + /* Process files. */ + $parsedLog->files = array(); + foreach ($log->paths as $key => $paths) + { + $parsedFiles = array(); + foreach($paths as $path) + { + $action = (string)$path['action']; + $parsedFiles[$action][] = (string)$path; + } + } + $parsedLog->files = $parsedFiles; + + return $parsedLog; + } + + /** + * Parse the comment of svn, extract object id list from it. + * + * @param string $comment + * @access public + * @return array + */ + public function parseComment($comment) + { + $stories = array(); + $tasks = array(); + $bugs = array(); + + // bug|story|task(case insensitive) + some space + #|:|:(Chinese) + id lists(maybe join with space or ,) + // $comment = "bug # 1,2,3,4 Bug:1 2 3 4 5 story:9999,1234566 story:456,1234566"; + $commonReg = "(?:\s){0,}(?:#|:|:){0,}([0-9, ]{1,})"; + $taskReg = '/task' . $commonReg . '/i'; + $storyReg = '/story' . $commonReg . '/i'; + $bugReg = '/bug' . $commonReg . '/i'; + + if(preg_match_all($storyReg, $comment, $result)) $stories = join(' ', $result[1]); + if(preg_match_all($taskReg, $comment, $result)) $tasks = join(' ', $result[1]); + if(preg_match_all($bugReg, $comment, $result)) $bugs = join(' ', $result[1]); + + if($stories) $stories = array_unique(explode(' ', str_replace(',', ' ', $stories))); + if($tasks) $tasks = array_unique(explode(' ', str_replace(',', ' ', $tasks))); + if($bugs) $bugs = array_unique(explode(' ', str_replace(',', ' ', $bugs))); + + if(!$stories and !$tasks and !$bugs) return array(); + return array('stories' => $stories, 'tasks' => $tasks, 'bugs' => $bugs); + } + + /** + * Convert the comment to uft-8. + * + * @param string $comment + * @access public + * @return string + */ + public function iconvComment($comment) + { + /* Get encodings. */ + $encodings = str_replace(' ', '', trim($comment)); + if($encodings == '') return $comment; + $encodings = explode(',', $encodings); + + /* Try convert. */ + foreach($encodings as $encoding) + { + $result = @iconv($encoding, 'utf-8', $comment); + if($result) return $result; + } + + return $comment; + } + + /** + * Diff a url. + * + * @param string $url + * @param int $revision + * @access public + * @return string|bool + */ + public function diff($url, $revision) + { + $repo = $this->getRepoByURL($url); + if(!$repo) return false; + + $this->setClient($repo); + + $oldRevision = $revision - 1; + $cmd = $this->client . " diff --old=$url@$oldRevision --new=$url@$revision"; + $diff = `$cmd`; + return $diff; + } + + /** + * Cat a url. + * + * @param string $url + * @param int $revision + * @access public + * @return string|bool + */ + public function cat($url, $revision) + { + $repo = $this->getRepoByURL($url); + if(!$repo) return false; + + $this->setClient($repo); + + $cmd = $this->client . " cat $url@$revision"; + $code = `$cmd`; + return $code; + } + + /** + * Get repo by url. + * + * @param string $url + * @access public + * @return object|bool + */ + public function getRepoByURL($url) + { + foreach($this->config->svn->repos as $repo) if(strpos($url, $repo['path']) !== false) return (object)$repo; + return false; + } + + /** + * Save action to pms. + * + * @param array $objects + * @param object $log + * @param string $repoRoot + * @access public + * @return void + */ + public function saveAction2PMS($objects, $log, $repoRoot = '') + { + $action->actor = $log->author; + $action->action = 'svncommited'; + $action->date = $log->date; + $action->comment = $this->iconvComment($log->msg); + $action->extra = $log->revision; + + $changes = $this->createActionChanges($log, $repoRoot); + + if($objects['stories']) + { + $products = $this->getStoryProducts($objects['stories']); + foreach($objects['stories'] as $storyID) + { + $storyID = (int)$storyID; + if(!isset($products[$storyID])) continue; + + $action->objectType = 'story'; + $action->objectID = $storyID; + $action->product = $products[$storyID]; + $action->project = 0; + + $this->saveRecord($action, $changes); + } + } + + if($objects['tasks']) + { + $productsAndProjects = $this->getTaskProductsAndProjects($objects['tasks']); + foreach($objects['tasks'] as $taskID) + { + $taskID = (int)$taskID; + if(!isset($productsAndProjects[$taskID])) continue; + + $action->objectType = 'task'; + $action->objectID = $taskID; + $action->product = $productsAndProjects[$taskID]['product']; + $action->project = $productsAndProjects[$taskID]['project']; + + $this->saveRecord($action, $changes); + } + } + + if($objects['bugs']) + { + $productsAndProjects = $this->getBugProductsAndProjects($objects['bugs']); + + foreach($objects['bugs'] as $bugID) + { + $bugID = (int)$bugID; + if(!isset($productsAndProjects[$bugID])) continue; + + $action->objectType = 'bug'; + $action->objectID = $bugID; + $action->product = $productsAndProjects[$bugID]->product; + $action->project = $productsAndProjects[$bugID]->project; + + $this->saveRecord($action, $changes); + } + } + } + + /** + * Save an action to pms. + * + * @param object $action + * @param object $log + * @access public + * @return bool + */ + public function saveRecord($action, $changes) + { + $record = $this->dao->select('*')->from(TABLE_ACTION) + ->where('objectType')->eq($action->objectType) + ->andWhere('objectID')->eq($action->objectID) + ->andWhere('extra')->eq($action->extra) + ->andWhere('action')->eq('svncommited') + ->fetch(); + if($record) + { + $this->dao->update(TABLE_ACTION)->data($action)->where('id')->eq($record->id)->exec(); + if($changes) + { + $historyID = $this->dao->findByAction($record->id)->from(TABLE_HISTORY)->fetch('id'); + $this->dao->update(TABLE_HISTORY)->data($changes)->where('id')->eq($historyID)->exec(); + } + } + else + { + $this->dao->insert(TABLE_ACTION)->data($action)->autoCheck()->exec(); + if($changes) + { + $actionID = $this->dao->lastInsertID(); + $this->action->logHistory($actionID, array($changes)); + } + } + } + + /** + * Create changes for action from a log. + * + * @param object $log + * @param string $repoRoot + * @access public + * @return array + */ + public function createActionChanges($log, $repoRoot) + { + if(!$log->files) return array(); + $diff = ''; + + $oldSelf = $this->server->PHP_SELF; + $this->server->set('PHP_SELF', $this->config->webRoot); + + if(!$repoRoot) $repoRoot = $this->repoRoot; + + foreach($log->files as $action => $actionFiles) + { + foreach($actionFiles as $file) + { + $param = array('url' => helper::safe64Encode($repoRoot . $file), 'revision' => $log->revision); + $catLink = trim(html::a(helper::createLink('svn', 'cat', $param, 'html'), 'view', '', "class='svnlink'")); + $diffLink = trim(html::a(helper::createLink('svn', 'diff', $param, 'html'), 'diff', '', "class='svnlink'")); + $diff .= $action . " " . $file . " $catLink "; + $diff .= $action == 'M' ? "$diffLink\n" : "\n" ; + } + } + $changes->field = 'subversion'; + $changes->old = ''; + $changes->new = ''; + $changes->diff = trim($diff); + + $this->server->set('PHP_SELF', $oldSelf); + return (array)$changes; + } + + /** + * Get products of stories. + * + * @param array $stories + * @access public + * @return array + */ + public function getStoryProducts($stories) + { + return $this->dao->select('id, product')->from(TABLE_STORY)->where('id')->in($stories)->fetchPairs(); + } + + /** + * Get products and projects of tasks. + * + * @param array $tasks + * @access public + * @return array + */ + public function getTaskProductsAndProjects($tasks) + { + $records = array(); + $products = $this->dao->select('t1.id, t2.product') + ->from(TABLE_TASK)->alias('t1') + ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') + ->where('t1.id')->in($tasks)->fetchPairs(); + + $projects = $this->dao->select('id, project')->from(TABLE_TASK)->where('id')->in($tasks)->fetchPairs(); + + foreach($projects as $taskID => $projectID) + { + $record = array(); + $record['project'] = $projectID; + $record['product'] = isset($products[$taskID]) ? $products[$taskID] : 0; + $records[$taskID] = $record; + } + return $records; + } + + /** + * Get products and projects of bugs. + * + * @param array $bugs + * @access public + * @return array + */ + public function getBugProductsAndProjects($bugs) + { + return $this->dao->select('id, project, product')->from(TABLE_BUG)->where('id')->in($bugs)->fetchAll('id'); + } + + /** + * Get the saved revision. + * + * @access public + * @return int + */ + public function getSavedRevision() + { + if(!file_exists($this->logFile)) return 0; + if(file_exists($this->restartFile)) return 0; + return (int)trim(file_get_contents($this->logFile)); + } + + /** + * Save the last revision. + * + * @param int $revision + * @access public + * @return void + */ + public function saveLastRevision($revision) + { + file_put_contents($this->logFile, $revision); + } + + /** + * Pring log. + * + * @param sting $log + * @access public + * @return void + */ + public function printLog($log) + { + echo helper::now() . " $log\n"; + } +} diff --git a/module/svn/syncer/syncer.php b/module/svn/syncer/syncer.php index cbb9503b85..4285162c3b 100644 --- a/module/svn/syncer/syncer.php +++ b/module/svn/syncer/syncer.php @@ -1,299 +1,299 @@ - - * @package svn - * @version $Id$ - * @link http://www.zentao.net - */ -error_reporting(E_ALL ^ E_STRICT ^ E_WARNING); - -include './config.php'; -include './api.class.php'; - -$syncer = new syncer($config); -$syncer->run(); - -class syncer -{ - /** - * The svn binary svnClient. - * - * @var string - * @access public - */ - public $svnClient; - - /** - * The zentao client. - * - * @var string - * @access public - */ - public $zentaoClient; - - /** - * Repos. - * - * @var array - * @access public - */ - public $repos = array(); - - /** - * The log root. - * - * @var string - * @access public - */ - public $logRoot = ''; - - /** - * The construct function. - * - * @access public - * @return void - */ - public function __construct($config) - { - $this->setConfig($config); - $this->setTimeZone(); - $this->setRepos(); - $this->setLogRoot(); - $this->loginZentao(); - } - - /** - * Set config. - * - * @param object $config - * @access public - * @return void - */ - public function setConfig($config) - { - $this->config = $config; - } - - /** - * Set timezone. - * - * @access public - * @return void - */ - public function setTimeZone() - { - date_default_timezone_set($this->config->timezone); - } - - /** - * Set the repos. - * - * @access public - * @return void - */ - public function setRepos() - { - if(!$this->config->svn->repos) die("You must set one svn repo.\n"); - $this->repos = $this->config->svn->repos; - } - - /** - * Set the log root. - * - * @access public - * @return void - */ - public function setLogRoot() - { - $this->logRoot = './log/'; - if(!is_dir($this->logRoot)) mkdir($this->logRoot); - } - - /** - * Login to zentao. - * - * @access public - * @return void - */ - public function loginZentao() - { - if(!$this->config->zentao->path or !$this->config->zentao->user) die("You must set the zentao path and user.\n"); - $zentaoConfig = $this->config->zentao; - $this->zentaoClient = new ztclient($zentaoConfig->path, $zentaoConfig->user, $zentaoConfig->password); - } - - /** - * Run. - * - * @access public - * @return void - */ - public function run() - { - while(true) - { - foreach($this->repos as $name => $repo) - { - $this->printLog("begin repo $name"); - $repo = (object)$repo; - $repo->name = $name; - - $this->setRepo($repo); - - $savedRevision = $this->getSavedRevision(); - $this->printLog("start from revision $savedRevision"); - $logs = $this->getRepoLogs($repo, $savedRevision); - $revisions = $this->getRevisionsFromLogs($logs); - if(!$revisions) - { - $this->printLog("no logs"); - continue; - } - $this->printLog('fetched ' . count($revisions) . ' logs'); - - $this->printLog('begin posting logs'); - $objects = $this->zentaoClient->post('svn', 'apiSync', array('logs' => $logs, 'repoRoot' => $this->repoRoot)); - $objects = $objects->parsedObjects; - - $this->printLog('parsed objects:'); - echo 'story: ' . join(',', (array)$objects->stories) . "\n"; - echo 'task: ' . join(',', (array)$objects->tasks) . "\n"; - echo 'bugs: ' . join(',', (array)$objects->bugs) . "\n"; - - $this->saveLastRevision(max($revisions)); - echo "----------------------\n"; - } - $this->printLog("sleeping {$this->config->sleep} seconds"); - sleep($this->config->sleep); - } - } - - /** - * Set repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setRepo($repo) - { - $this->setClient($repo); - $this->setLogFile($repo->name); - $this->setRepoRoot($repo); - } - - /** - * Set the svn binary svnClient of a repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setClient($repo) - { - if($this->config->svn->client == '') die("You must set the svn svnClient file.\n"); - $this->svnClient = $this->config->svn->client . " --non-interactive"; - if(isset($repo->username)) $this->svnClient .= " --username $repo->username --password $repo->password --no-auth-cache"; - } - - /** - * Set the log file of a repo. - * - * @param string $repoName - * @access public - * @return void - */ - public function setLogFile($repoName) - { - $this->logFile = $this->logRoot . $repoName; - } - - /** - * set the root path of a repo. - * - * @param object $repo - * @access public - * @return void - */ - public function setRepoRoot($repo) - { - $cmd = $this->svnClient . " info --xml $repo->path"; - $info = `$cmd`; - $info = simplexml_load_string($info); - $repoRoot = (string)$info->entry->repository->root; - $this->repoRoot = $repoRoot; - } - - /** - * Get repo logs. - * - * @param object $repo - * @param int $fromRevision - * @access public - * @return string - */ - public function getRepoLogs($repo, $fromRevision) - { - $parsedLogs = array(); - - /* The svn log command. */ - $cmd = $this->svnClient . " log -r $fromRevision:HEAD -v --xml $repo->path"; - $logs = `$cmd`; - - return $logs; - } - - /** - * Get the saved revision. - * - * @access public - * @return int - */ - public function getSavedRevision() - { - if(!file_exists($this->logFile)) return 0; - return (int)trim(file_get_contents($this->logFile)); - } - - /** - * Get revisons from logs. - * - * @param string $logs - * @access public - * @return array|bool - */ - public function getRevisionsFromLogs($logs) - { - if(!preg_match_all('|revision="(.*)"|', $logs, $results)) return false; - $revisions = $results[1]; - return $revisions; - } - - /** - * Save the last revision. - * - * @param int $revision - * @access public - * @return void - */ - public function saveLastRevision($revision) - { - file_put_contents($this->logFile, $revision); - } - - /** - * Pring log. - * - * @param sting $log - * @access public - * @return void - */ - public function printLog($log) - { - echo date('Y-m-d H:i:s') . " $log\n"; - } -} + + * @package svn + * @version $Id$ + * @link http://www.zentao.net + */ +error_reporting(E_ALL ^ E_STRICT ^ E_WARNING); + +include './config.php'; +include './api.class.php'; + +$syncer = new syncer($config); +$syncer->run(); + +class syncer +{ + /** + * The svn binary svnClient. + * + * @var string + * @access public + */ + public $svnClient; + + /** + * The zentao client. + * + * @var string + * @access public + */ + public $zentaoClient; + + /** + * Repos. + * + * @var array + * @access public + */ + public $repos = array(); + + /** + * The log root. + * + * @var string + * @access public + */ + public $logRoot = ''; + + /** + * The construct function. + * + * @access public + * @return void + */ + public function __construct($config) + { + $this->setConfig($config); + $this->setTimeZone(); + $this->setRepos(); + $this->setLogRoot(); + $this->loginZentao(); + } + + /** + * Set config. + * + * @param object $config + * @access public + * @return void + */ + public function setConfig($config) + { + $this->config = $config; + } + + /** + * Set timezone. + * + * @access public + * @return void + */ + public function setTimeZone() + { + date_default_timezone_set($this->config->timezone); + } + + /** + * Set the repos. + * + * @access public + * @return void + */ + public function setRepos() + { + if(!$this->config->svn->repos) die("You must set one svn repo.\n"); + $this->repos = $this->config->svn->repos; + } + + /** + * Set the log root. + * + * @access public + * @return void + */ + public function setLogRoot() + { + $this->logRoot = './log/'; + if(!is_dir($this->logRoot)) mkdir($this->logRoot); + } + + /** + * Login to zentao. + * + * @access public + * @return void + */ + public function loginZentao() + { + if(!$this->config->zentao->path or !$this->config->zentao->user) die("You must set the zentao path and user.\n"); + $zentaoConfig = $this->config->zentao; + $this->zentaoClient = new ztclient($zentaoConfig->path, $zentaoConfig->user, $zentaoConfig->password); + } + + /** + * Run. + * + * @access public + * @return void + */ + public function run() + { + while(true) + { + foreach($this->repos as $name => $repo) + { + $this->printLog("begin repo $name"); + $repo = (object)$repo; + $repo->name = $name; + + $this->setRepo($repo); + + $savedRevision = $this->getSavedRevision(); + $this->printLog("start from revision $savedRevision"); + $logs = $this->getRepoLogs($repo, $savedRevision); + $revisions = $this->getRevisionsFromLogs($logs); + if(!$revisions) + { + $this->printLog("no logs"); + continue; + } + $this->printLog('fetched ' . count($revisions) . ' logs'); + + $this->printLog('begin posting logs'); + $objects = $this->zentaoClient->post('svn', 'apiSync', array('logs' => $logs, 'repoRoot' => $this->repoRoot)); + $objects = $objects->parsedObjects; + + $this->printLog('parsed objects:'); + echo 'story: ' . join(',', (array)$objects->stories) . "\n"; + echo 'task: ' . join(',', (array)$objects->tasks) . "\n"; + echo 'bugs: ' . join(',', (array)$objects->bugs) . "\n"; + + $this->saveLastRevision(max($revisions)); + echo "----------------------\n"; + } + $this->printLog("sleeping {$this->config->sleep} seconds"); + sleep($this->config->sleep); + } + } + + /** + * Set repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setRepo($repo) + { + $this->setClient($repo); + $this->setLogFile($repo->name); + $this->setRepoRoot($repo); + } + + /** + * Set the svn binary svnClient of a repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setClient($repo) + { + if($this->config->svn->client == '') die("You must set the svn svnClient file.\n"); + $this->svnClient = $this->config->svn->client . " --non-interactive"; + if(isset($repo->username)) $this->svnClient .= " --username $repo->username --password $repo->password --no-auth-cache"; + } + + /** + * Set the log file of a repo. + * + * @param string $repoName + * @access public + * @return void + */ + public function setLogFile($repoName) + { + $this->logFile = $this->logRoot . $repoName; + } + + /** + * set the root path of a repo. + * + * @param object $repo + * @access public + * @return void + */ + public function setRepoRoot($repo) + { + $cmd = $this->svnClient . " info --xml $repo->path"; + $info = `$cmd`; + $info = simplexml_load_string($info); + $repoRoot = (string)$info->entry->repository->root; + $this->repoRoot = $repoRoot; + } + + /** + * Get repo logs. + * + * @param object $repo + * @param int $fromRevision + * @access public + * @return string + */ + public function getRepoLogs($repo, $fromRevision) + { + $parsedLogs = array(); + + /* The svn log command. */ + $cmd = $this->svnClient . " log -r $fromRevision:HEAD -v --xml $repo->path"; + $logs = `$cmd`; + + return $logs; + } + + /** + * Get the saved revision. + * + * @access public + * @return int + */ + public function getSavedRevision() + { + if(!file_exists($this->logFile)) return 0; + return (int)trim(file_get_contents($this->logFile)); + } + + /** + * Get revisons from logs. + * + * @param string $logs + * @access public + * @return array|bool + */ + public function getRevisionsFromLogs($logs) + { + if(!preg_match_all('|revision="(.*)"|', $logs, $results)) return false; + $revisions = $results[1]; + return $revisions; + } + + /** + * Save the last revision. + * + * @param int $revision + * @access public + * @return void + */ + public function saveLastRevision($revision) + { + file_put_contents($this->logFile, $revision); + } + + /** + * Pring log. + * + * @param sting $log + * @access public + * @return void + */ + public function printLog($log) + { + echo date('Y-m-d H:i:s') . " $log\n"; + } +} diff --git a/module/svn/view/cat.html.php b/module/svn/view/cat.html.php index 9233839927..e3e158227c 100644 --- a/module/svn/view/cat.html.php +++ b/module/svn/view/cat.html.php @@ -1,16 +1,16 @@ - - * @package file - * @version $Id$ - * @link http://www.zentao.net - */ -?> - -
-
<?php echo $code;?>
- + + * @package file + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +
+
<?php echo $code;?>
+ diff --git a/module/svn/view/diff.html.php b/module/svn/view/diff.html.php index b901bd3332..6fc5ab0d9e 100644 --- a/module/svn/view/diff.html.php +++ b/module/svn/view/diff.html.php @@ -1,17 +1,17 @@ - - * @package file - * @version $Id$ - * @link http://www.zentao.net - */ -?> - - -
-
<?php echo $diff;?>
- + + * @package file + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + +
+
<?php echo $diff;?>
+