Jelajahi Sumber

Merge pull request #48 from visuddhinanda/master

句子协作消息列表和内容显示不出来,不能自动采纳,存储数据库缺少状态代码。
visuddhinanda 5 tahun lalu
induk
melakukan
eca3e5e4ea

+ 2 - 2
app/studio/css/style.css

@@ -200,8 +200,8 @@ a:active {
 }
 .viewswitch_on {
     -webkit-transform:translateX(0em);
-    -moz-transform:translateX:(0em);
-    transform:translateX:(0em);
+    -moz-transform:translateX(0em);
+    transform:translateX(0em);
     /*box-shadow: 5px 0 20px 5px var(--shadow-color);*/
 }
 .viewswitch_off {

+ 1 - 1
app/studio/editor.php

@@ -267,7 +267,7 @@ foreach($plugin_list as $info){
 		<!--左侧的区块-->
 		<div>
 
-			<svg class="icon" style="fill: #f1ca23;height: 2em;width: 8.5em;margin-top: 0.5em;margin-left: -0.5em;">
+			<svg class="icon" style="height: 2.7em; width: 12em; margin-top: 0.5em; ">
 				<use xlink:href="../public/images/svg/wikipali_banner.svg#wikipali_banner"></use>
 			</svg>
 

+ 4 - 1
app/studio/js/data.js

@@ -523,12 +523,15 @@ function _doc_tran_sent(begin, end, key, value = null) {
 					if (key == "text") {
 						ntf_show("修改:" + key + "=" + value);
 						let blockId;
+						/*
 						if (this.info("parent").length > 0) {
 							blockId = this.info("parent");
 						}
 						else {
 							blockId = this.info("id");
 						}
+						*/
+						blockId = this.info("id");
 						let book = this.info("book");
 						let para = this.info("paragraph");
 						update_tran_block_text(blockId);
@@ -590,7 +593,7 @@ function _doc_tran_info(key, value = null) {
 			setNodeText(this._info, key, value);
 		}
 		else {
-			var output = getNodeText(this._info, key);
+			let output = getNodeText(this._info, key);
 			return (output);
 		}
 	}

+ 2 - 30
app/studio/js/editor.js

@@ -4845,36 +4845,7 @@ function fieldListChanged(inWordId, inField, inChangeTo, sParent = null) {
 	}
 }
 
-function show_tran_msg(bid, begin, end) {
-	msg_show_msg_content(2, bid + "-" + begin + "-" + end);
-}
-
-function word_msg_counter_click(wordId) {
-	msg_show_content(1, wordId);
-	msg_show_content_panal();
-	tab_click('msg_panal_right', 'rb_msg');
-	editor_show_right_tool_bar(true);
-}
-function msg_show_msg_content(type, id) {
-	msg_show_content(type, id);
-	msg_show_content_panal();
-	tab_click('msg_panal_right', 'rb_msg');
-}
 
-function msg_show_list_panal() {
-	$("#msg_panal_content_toolbar").hide();
-	$("#msg_panal_content").hide();
-
-	$("#msg_panal_list_toolbar").show();
-	$("#msg_panal_list").show();
-}
-function msg_show_content_panal() {
-	$("#msg_panal_content_toolbar").show();
-	$("#msg_panal_content").show();
-
-	$("#msg_panal_list_toolbar").hide();
-	$("#msg_panal_list").hide();
-}
 function editor_word_status_by_id(id, newStatus = null) {
 	var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
 	return (editor_word_status(xAllWord[getWordIndex(wordId)]), newStatus);
@@ -4952,8 +4923,9 @@ function tran_sen_save(blockid, senBegin, senEnd, input) {
 
 function tran_text_onchange(blockid, senBegin, senEnd, obj) {
 	let newText = obj.value;
-	sen_save(blockid, senBegin, senEnd, newText);
 	tran_sen_save(blockid, senBegin, senEnd, newText);
+	//保存到数据库
+	sen_save(blockid, senBegin, senEnd, newText);
 }
 
 /*

+ 51 - 13
app/studio/js/message.js

@@ -125,7 +125,7 @@ function msg_send() {
 							msg_show_content(msg_curr_show_content_type, msg_curr_show_content_id);
 
 							switch (obj.type) {
-								case 1: //wbw
+								case "1": //wbw
 									var iFind = false;
 									for (var iWordId = 0; iWordId < arrWordNewMsg.length; iWordId++) {
 										if (arrWordNewMsg[iWordId] == obj.data.id) {
@@ -137,7 +137,7 @@ function msg_send() {
 										arrWordNewMsg.push(obj.data.id);
 									}
 									break;
-								case 2:
+								case "2":
 									break;
 							}
 							gXmlBookDataMsg.appendChild(arrMsg[x].cloneNode(true));
@@ -209,9 +209,7 @@ function msg_apply_data(obj) {
 					let xAllWord = gXmlBookDataBody.getElementsByTagName("word");
 					let xWord = xAllWord[wIndex];
 					let sReal = getNodeText(xWord, "real");
-					let wordStatus = getNodeText(xWord, "status");
-					wordStatus++;
-					wordStatus--;
+					let wordStatus = parseInt(getNodeText(xWord, "status"));
 					let wordBodyChange = false;
 					let wordHeadChange = false;
 					let wordNoteChange = false;
@@ -320,7 +318,7 @@ function msg_apply_data(obj) {
 						console.log("句子 自动采纳");
 						tranBlock.text(obj.data.begin, obj.data.end, "text", obj.data.text);
 						tranBlock.text(obj.data.begin, obj.data.end, "status", 5);
-						sen_save(obj.data.id, obj.data.begin, obj.data.end, obj.data.text);
+						sen_save(tranBlock.info("id"), obj.data.begin, obj.data.end, obj.data.text);
 					}
 				}
 
@@ -382,12 +380,15 @@ function msg_show_content(type, id) {
 	}
 	let arrid;
 	let sen_begin, sen_end;
+	type = parseInt(type);
+
 	if (type == 2) {
-		arrid = id.split("-");
+		arrid = id.split("#");
 		id = arrid[0];
 		sen_begin = arrid[1];
 		sen_end = arrid[2];
 	}
+
 	msg_curr_show_content_id = id;
 	msg_curr_show_content_type = type;
 	var iMsg = 0;
@@ -528,8 +529,8 @@ function msg_update_msg_list() {
 
 	for (var i = 0; i < gDocMsgList.length; i++) {
 		switch (gDocMsgList[i].type) {
-			case 2:
-			case 1:
+			case "2":
+			case "1":
 				var iFind = _msg_find_id_in_list(msgList, gDocMsgList[i].data.id);
 				if (iFind >= 0) {
 					if (gDocMsgList[i].read == 0) {
@@ -543,6 +544,7 @@ function msg_update_msg_list() {
 				else {
 					objMsg = new Object();
 					objMsg.id = gDocMsgList[i].data.id;
+					objMsg.data = gDocMsgList[i].data;
 					objMsg.type = gDocMsgList[i].type;
 					if (gDocMsgList[i].read == 0) {
 						objMsg.unread = 1;
@@ -576,7 +578,7 @@ function msg_update_msg_list() {
 				var d = new Date()
 				d.setTime(msgList[i].newTime * 1000);
 				switch (msgList[i].type) {
-					case 1:
+					case "1":
 						var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
 						var wIndex = getWordIndex(msgList[i].id);
 						if (wIndex >= 0) {
@@ -587,14 +589,16 @@ function msg_update_msg_list() {
 						}
 						strHtml += "<span>";
 						if (msgList[i].unread > 0) {
-							strHtml += "<span class='word_msg'>" + msgList[i].unread + "</span>";
+							strHtml += "<span class='word_msg'  onclick=\"msg_show_msg_content('1','" + msgList[i].id + "')\">" + msgList[i].unread + "</span>";
 						}
 						strHtml += "<a href='#w" + msgList[i].id + "'>[«]</a>";
 						strHtml += "<a onclick=\"msg_show_msg_content('1','" + msgList[i].id + "')\">" + wordSpell + "</a></span>";
 						strHtml += "<span>" + d.toLocaleString() + "</span>";
 						break;
-					case 2:
-						strHtml += "<a onclick=\"msg_show_msg_content('2','" + msgList[i].id + "')\">" + msgList[i].id + "</a></span>";
+					case "2":
+						let sent_id = msgList[i].id + "#" + msgList[i].data.begin + "#" + msgList[i].data.end;
+						let sent_msg_title = msgList[i].data.begin + "-" + msgList[i].data.end + "-" + msgList[i].data.text.slice(0, 5);
+						strHtml += "<a onclick=\"msg_show_msg_content('2','" + sent_id + "')\">" + sent_msg_title + "</a></span>";
 						strHtml += "<span>" + d.toLocaleString() + "</span>";
 						break;
 				}
@@ -617,4 +621,38 @@ function _msg_find_id_in_list(arrList, id) {
 
 function sortNumber(a, b) {
 	return b.newTime - a.newTime;
+}
+
+
+function show_tran_msg(bid, begin, end) {
+	msg_show_msg_content(2, bid + "-" + begin + "-" + end);
+}
+
+function word_msg_counter_click(wordId) {
+	msg_show_content(1, wordId);
+	msg_show_content_panal();
+	//tab_click('msg_panal_right', 'rb_msg');
+	tab_click_b('sys_message', 'tab_rb_sys_message', editor_show_right_tool_bar, true);
+	editor_show_right_tool_bar(true);
+}
+function msg_show_msg_content(type, id) {
+	msg_show_content(type, id);
+	msg_show_content_panal();
+	//tab_click('msg_panal_right', 'rb_msg');
+	tab_click_b('sys_message', 'tab_rb_sys_message', editor_show_right_tool_bar, true);
+}
+
+function msg_show_list_panal() {
+	$("#msg_panal_content_toolbar").hide();
+	$("#msg_panal_content").hide();
+
+	$("#msg_panal_list_toolbar").show();
+	$("#msg_panal_list").show();
+}
+function msg_show_content_panal() {
+	$("#msg_panal_content_toolbar").show();
+	$("#msg_panal_content").show();
+
+	$("#msg_panal_list_toolbar").hide();
+	$("#msg_panal_list").hide();
 }

+ 25 - 16
app/studio/plugin/system_message/gui.html

@@ -1,16 +1,25 @@
-			<!--  消息 -->
-			<div id="msg_panal_right_head" style="display: none">
-				<div id="msg_panal_list_toolbar">
-				<span id="msg_list_title"><?php echo $module_gui_str['editor']['1116'];//Message?></span>
-				</div>
-				<div id="msg_panal_content_toolbar">
-				<button onclick="msg_show_list_panal()"><?php echo $module_gui_str['tools']['1014'];//Back?></button><span id="msg_content_title"></span>
-				</div>
-			</div>
-			<div id="msg_panal_right">
-				<div id="msg_panal_list">
-				</div>
-				<div id="msg_panal_content">
-				</div>
-			</div>
-			
+<!--  消息 -->
+<style>
+	.msgbox_r>.head,
+	.msgbox_s>.head {
+		font-size: 90%;
+		border-bottom: 1px solid var(--border-line-color);
+		color: gray;
+		margin-bottom: 6px;
+	}
+</style>
+<div id="msg_panal_right_head">
+	<div id="msg_panal_list_toolbar">
+		<span id="msg_list_title"><?php echo $module_gui_str['editor']['1116'];//Message?></span>
+	</div>
+	<div id="msg_panal_content_toolbar">
+		<button onclick="msg_show_list_panal()"><?php echo $module_gui_str['tools']['1014'];//Back?></button><span
+			id="msg_content_title"></span>
+	</div>
+</div>
+<div id="msg_panal_right">
+	<div id="msg_panal_list">
+	</div>
+	<div id="msg_panal_content">
+	</div>
+</div>

+ 2 - 2
app/usent/update.php

@@ -13,11 +13,11 @@ PDO_Connect("sqlite:"._FILE_DB_SENTENCE_);
 
 /* 开始一个事务,关闭自动提交 */
 $PDO->beginTransaction();
-$query="UPDATE sentence SET text= ?  , receive_time= ?  , modify_time= ?   where  id= ?  ";
+$query="UPDATE sentence SET text= ?  , status = ? , receive_time= ?  , modify_time= ?   where  id= ?  ";
 $sth = $PDO->prepare($query);
 
 foreach ($aData as $data) {
-    $sth->execute(array($data->text,mTime(),$data->time,$data->id));
+    $sth->execute(array($data->text, $data->status, mTime(),$data->time,$data->id));
 }
 $PDO->commit();
 

+ 51 - 49
app/usent/usent.js

@@ -1,10 +1,10 @@
-var user_sentence_create_buffer=new Array();
-var user_sentence_update_buffer=new Array();
+var user_sentence_create_buffer = new Array();
+var user_sentence_update_buffer = new Array();
 
-var user_sentence_block_create_buffer=new Array();
-var user_sentence_block_update_buffer=new Array();
+var user_sentence_block_create_buffer = new Array();
+var user_sentence_block_update_buffer = new Array();
 
-function usent_block_create(blockid,book,paragraph,lang,author,editor,tag){
+function usent_block_create(blockid, book, paragraph, lang, author, editor, tag) {
 	var d = new Date();
 	let newBlock = new Object();
 	newBlock.id = blockid;
@@ -17,49 +17,51 @@ function usent_block_create(blockid,book,paragraph,lang,author,editor,tag){
 	newBlock.time = d.getTime();
 	user_sentence_block_create_buffer.push(newBlock);
 }
-function usent_block_commit(){
+function usent_block_commit() {
 
-	if(user_sentence_block_create_buffer.length>0){
+	if (user_sentence_block_create_buffer.length > 0) {
 		$.post("../usent/new_block.php",
-		{
-			data:JSON.stringify(user_sentence_block_create_buffer)
-		},
-		usent_server_responce);
-		user_sentence_block_create_buffer=new Array();
+			{
+				data: JSON.stringify(user_sentence_block_create_buffer)
+			},
+			usent_server_responce);
+		user_sentence_block_create_buffer = new Array();
 	}
 
-	if(user_sentence_block_update_buffer.length>0){
+	if (user_sentence_block_update_buffer.length > 0) {
 		$.post("../usent/updata.php",
-		{
-			data:JSON.stringify(user_sentence_block_update_buffer)
-		},
-		usent_server_responce);
-		user_sentence_block_update_buffer=new Array();
+			{
+				data: JSON.stringify(user_sentence_block_update_buffer)
+			},
+			usent_server_responce);
+		user_sentence_block_update_buffer = new Array();
 	}
 }
 
-function usent_block_fork(blockid,newBlockId){
+function usent_block_fork(blockid, newBlockId) {
 
 }
 
-function usent_change(blockid,begin,end,text){
-	
+function usent_change(blockid, begin, end, text) {
+
 }
 
 
-function usent_update(blockid,begin,end,text){
+function usent_update(blockid, begin, end, text) {
 	var d = new Date();
-	let mBlock = doc_tran("#"+blockid);
-	let dbId=mBlock.text(begin,end,"id");
+	let mBlock = doc_tran("#" + blockid);
+	let dbId = mBlock.text(begin, end, "id");
+	let sent_status = mBlock.text(begin, end, "status");
 	let newData = new Object();
 	newData.id = dbId;
 	newData.text = text;
+	newData.status = sent_status;
 	newData.time = d.getTime();
 	user_sentence_update_buffer.push(newData);
 }
 
 
-function usent_create(blockid,id,book,paragraph,begin,end,text,tag,lang,author,editor){
+function usent_create(blockid, id, book, paragraph, begin, end, text, tag, lang, author, editor) {
 	let newData = new Object();
 	newData.blockid = blockid;
 	newData.id = id;
@@ -75,41 +77,41 @@ function usent_create(blockid,id,book,paragraph,begin,end,text,tag,lang,author,e
 	user_sentence_create_buffer.push(newData);
 }
 
-function usent_commit(){
+function usent_commit() {
 
-	if(user_sentence_create_buffer.length>0){
+	if (user_sentence_create_buffer.length > 0) {
 		$.post("../usent/new.php",
-		{
-			data:JSON.stringify(user_sentence_create_buffer)
-		},
-		usent_server_responce);
-		user_sentence_create_buffer=new Array();
+			{
+				data: JSON.stringify(user_sentence_create_buffer)
+			},
+			usent_server_responce);
+		user_sentence_create_buffer = new Array();
 	}
 
-	if(user_sentence_update_buffer.length>0){
+	if (user_sentence_update_buffer.length > 0) {
 		$.post("../usent/update.php",
-		{
-			data:JSON.stringify(user_sentence_update_buffer)
-		},
-		usent_server_responce);
-		user_sentence_update_buffer=new Array();
+			{
+				data: JSON.stringify(user_sentence_update_buffer)
+			},
+			usent_server_responce);
+		user_sentence_update_buffer = new Array();
 	}
 }
 
-function usent_server_responce(data,status){
-	try{
-		let result= JSON.parse(data);
-		if(result.status==0){
-			ntf_show("user sentence"+result.message);
-			return("user sentence"+result.message);
+function usent_server_responce(data, status) {
+	try {
+		let result = JSON.parse(data);
+		if (result.status == 0) {
+			ntf_show("user sentence" + result.message);
+			return ("user sentence" + result.message);
 		}
-		else{
-			ntf_show("user sentence error"+result.message);
-			return("user sentence error"+result.message);
+		else {
+			ntf_show("user sentence error" + result.message);
+			return ("user sentence error" + result.message);
 		}
 	}
-	catch(e){
-		console.error("user_sentence_update:"+e+" data:"+data);
+	catch (e) {
+		console.error("user_sentence_update:" + e + " data:" + data);
 		ntf_show("user sentence error");
 	}
 }

+ 70 - 0
documents/about.md

@@ -0,0 +1,70 @@
+
+## 巴利圣典教育开放平台
+
+### 网站平台
+
+这是一个包含多个实用工具(如:字典)在内的在线巴利语文字处理软件。
+
+这个软件帮助您:
+- 逐词解析巴利原文——巴利语的专业级教案
+- 注释与书签——记录课堂笔记和疑难问题
+- 多版本译文逐句添加和比对——翻译者的好朋友
+- 智能佛教术语——更加轻松地维护译文术语
+- 智能单词本——减少重复劳动
+- 共享与协作——与平台上的其他人共同破解经文的奥秘
+
+
+目前平台还在开发阶段。如果您对平台开发感兴趣,请点击:[详情](development/join_us.md)
+### 在线课程
+老师的**逐个巴利词讲解**这种授课模式在佛教国家流传千年至今,仍然是重要的教学手段。借助软件的**逐词解析功能**,学生可以方便快捷地记录。
+
+我们邀请佛教国家的老师,利用网络课堂技术帮助学生体验这种传统而有效的教学方式。让您能加速实现巴利语的学以致用——早日畅游巴利圣典。
+课程范例
+### 圣典翻译计划
+
+包含根本、义注和复注在内的圣典宝库共包含150多本书。多个世纪以来,一代一代的僧侣守护着这个宝库。巴利教育软件平台和特别安排的在线课程邀请你来探索。我们鼓励你将这些珍宝翻译为你的母语。
+
+欢迎参与这个教育计划,更多的关于课程和翻译计划的信息请[参阅](course/join_us.md)
+
+## 关于我们
+这是一个由巴利圣典爱好者组成的团队。这里的“爱好者”并非指“专业人士”的反面。相反的,此团体由各个领域的专业人士组成。
+大家因为出于对佛法的热爱而聚集在一起。创建一个无国界,无版权的开放的巴利圣典教育平台。
+
+在此平台上,无论老师与学生,内容的创建者或是读者。都以令正法久住为目的贡献自己的智慧。
+您的加入将会给所有热爱佛法的人带来至上的利益。
+
+## Resources相关资源
+### videos视频
+上座部三藏註釋书翻譯項目的構想(2019) [Youtube](https://www.youtube.com/playlist?list=PLgavmc8e-GuWR-FKOr-7RfnUSWX82ED0q)
+[百度网盘](https://pan.baidu.com/s/1VW789wYHLNwA9VP21bmyJQ)
+
+
+conference of translating platform 三藏翻译工程暨教育平台搭建会议简报 
+- [Youtube](https://www.youtube.com/playlist?list=PL_1iJBQvNPFHT6UisME_cOSts5fFecK14)
+- [百度网盘链接](https://pan.baidu.com/s/10_e7vYGyewy7_TIPgmht5A) 提取码:pali
+
+Due to the unstable connection the online video conference had been influnced, organizers re-recorded this presentation by screen shot after the conference.
+由于会议现场网络出现故障,导致会议直播时断时续,为保证质量,会务组于会后以录屏的方式进行了重新录制。
+
+[functions demo 功能演示](https://www.youtube.com/playlist?list=PL_1iJBQvNPFFNLOaZh2u3VwDYUyJuK_xa)
+
+[Example Class 课程范例](https://www.youtube.com/playlist?list=PL_1iJBQvNPFHwP1ZL4sbhtJTnYeMiEm29)
+
+
+### web demo 网站演示版
+
+visit [www.wikipali.org/](https://www.wikipali.org/) to scan, test and check for the developer only, not for the normal users.
+
+
+访问[www.wikipali.org/](https://www.wikipali.org/) 仅仅是针对开发者来进行浏览、测试和检查的,而不是面向普通用户。
+
+### code for wikipali website Demo 网站演示版代码
+1. If anyone want to push his github code to the server, please contact with Ven. Bhikkhu Visuddhinanda and Ven. Bhikkhu Kosalla by wechat or teams.
+想要将其github上的代码推送至服务器,请微信联络Bhikkhu Visuddhinanda和Bhikkhu Kosalla.
+2. download and install "gitbash", "TortoiseGit" and "github desktop" and make the submit and communication esay.
+下载并安装"gitbash", "TortoiseGit"和"github desktop"来进行代码提交,这样相互交流更加便捷。
+
+
+### Others 其他
+
+[collection of conference papers 会议文集](https://drive.google.com/file/d/1CDPKLXMUX30IXc27BeNleHI3uI5OhsFL/view?usp=sharing)(2020.2.12-14)

+ 0 - 0
documents/course/example.md


+ 32 - 0
documents/course/join_us.md

@@ -0,0 +1,32 @@
+# 我们热诚的欢迎您加入我们的圣典翻译计划
+
+## 序言
+此圣典翻译计划以学习和翻译第六次圣典结集的巴利文本为目的设立。学生在老师的带领下学习圣典内容,提升自己的巴利语及教理水平。在正确理解的基础上,以逐词解析或译文的形式翻译巴利圣典。这是一个公益的教学项目,而非带有商业目的的项目。所以在此过程中项目的组织者不会以任何方式向您收取任何费用。您在此活动中产生的笔记,译文,录像或其他教学活动衍生品属于您个人所有,您有署名权。由于此教学活动的公益性,您应该放弃对您的笔记,译文,录像或其他教学活动衍生品宣布商业版权,或以盈利为目的发布这些衍生品。
+
+在这些前提下。我们欢迎您在wikipali平台上公开发表这些内容。以利益他人。
+
+我们欢迎您参与此教学活动,无论是以学生,教师或是教学活动的服务者的身份。请发送电子邮件到:
+
+## 学生
+### 内容
+- 参与授课活动
+- 课前预习
+- 课堂笔记
+
+### 技能需求
+
+## 教师
+### 内容
+### 技能需求
+
+## 教师库专员
+### 工作内容
+### 技能要求
+
+## 教学活动服务者
+### 内容
+- 网络或实体课程的策划
+- 课程表安排
+- 课程视频的录制和网络分享
+
+### 技能需求

+ 47 - 0
documents/development/join_us.md

@@ -0,0 +1,47 @@
+# 我们热诚的欢迎您加入我们的开发团队
+
+
+如果您熟悉并想参与以下的工作,请发邮件到:
+
+我们的项目采用**Github**作为协作平台进行自由合作。请您自行注册账号。项目使用**复刻(Fork)->提交请求(Pull Request)** 的工作模式来将您所做的修改提交至原代码库(**上游upstream**)。虽然不能保证所有的修改都会被采纳。但是您有权发布您自己修改过的代码。
+
+## 用户体验
+### 工作内容
+- 使用户界面更加美观
+- 设计友好的人机交互方式
+### 技能需求
+- 网站或软件美术设计经验
+- 网站或软件策划经验
+
+## 程序设计
+## 前端
+### 工作内容
+- 浏览器端程序设计
+### 技能需求
+- 会用TS开发前端程序
+
+## 后端
+### 工作内容
+- 服务器端程序设计
+### 技能需求
+- linux
+- Rust
+- GraphQL
+
+## 本地化
+### 工作内容
+- 平台的用户界面(UI)的本地化
+### 技能需求
+- 熟悉英语或汉语的其中一种
+- 除了上述语言外,应再熟练掌握另一门语言(本地化的目标语言)。比如:您想做一个平台的法语版。您应该能阅读并正确理解英文或中文版的UI文字内容。然后翻译为法语。
+
+## 功能测试
+### 工作内容
+- 根据Issue测试网站的功能是否符合设计要求,或是已知Bug是否被修改。
+- 通过使用找出新的bug或设计缺陷
+- 提出功能修改建议
+
+### 技能需求
+- 能以英语或中文提出自己的意见和建议
+
+