修改编码方式为 UTF-8

修改编码方式为 UTF-8

--- DigitalPlatform.LibraryServer/AppCirculation.cs
+++ DigitalPlatform.LibraryServer/AppCirculation.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Text;

@@ -15,7 +15,7 @@
 using System.Globalization;
 using System.Runtime.Serialization;

-using DigitalPlatform;	// Stop
+using DigitalPlatform;	// Stop类
 using DigitalPlatform.rms.Client;
 using DigitalPlatform.Xml;
 using DigitalPlatform.IO;
@@ -36,36 +36,36 @@
 namespace DigitalPlatform.LibraryServer
 {
     ///
-    /// ͨҵصĴ
+    /// 本部分是流通业务相关的代码
     ///
     public partial class LibraryApplication
     {

-        // Ϊͳָ"/"ݴ(ͨ)һλߵ֤롣̫ܲ׼ȷ
+        // 为统计指标"出纳/读者数"而暂存的(流通操作)最后一位读者的证条码。可能不太准确
         // string m_strLastReaderBarcode = "";

-        // ߼¼Уʷ󱣴
+        // 读者记录中，借阅历史中最大保存个数
         public int MaxPatronHistoryItems = 100;

-        // ¼Уʷ󱣴
+        // 册记录中，借阅历史中最大保存个数
         public int MaxItemHistoryItems = 100;

-        public bool VerifyBarcode = false;  // ޸Ķ߼¼¼ʱǷ֤
+        public bool VerifyBarcode = false;  // 创建和修改读者记录、册记录的时候是否验证条码号

         public bool AcceptBlankItemBarcode = true;
         public bool AcceptBlankReaderBarcode = true;

-        public bool VerifyBookType = false;  // ޸Ĳ¼ʱǷ֤ͼ
-        public bool VerifyReaderType = false;  // ޸Ķ߼¼ʱǷ֤
-        public bool BorrowCheckOverdue = true;  // ʱǷδڲ
+        public bool VerifyBookType = false;  // 创建和修改册记录的时候是否验证图书类型
+        public bool VerifyReaderType = false;  // 创建和修改读者记录的时候是否验证读者类型
+        public bool BorrowCheckOverdue = true;  // 借书的时候是否检查未还超期册

 #if NO
-        // Դ
+        // 保存资源
         // return:
         //		-1	error
-        //		0	صļʵΪգر
-        //		1	Ѿ
+        //		0	发现上载的文件其实为空，不必保存了
+        //		1	已经保存
         public static int SaveUploadFile(
             System.Web.UI.Page page,
             RmsChannel channel,
@@ -82,7 +82,7 @@
             if (String.IsNullOrEmpty(postedFile.FileName) == true
                 && postedFile.ContentLength == 0)
             {
-                return 0;	// ûбҪ
+                return 0;	// 没有必要保存
             }

             WebPageStop stop = new WebPageStop(page);
@@ -94,7 +94,7 @@
             {
                 using (Stream t = File.Create(strLocalFileName))
                 {
-                    // Сߴ
+                    // 缩小尺寸
                     int nRet = GraphicsUtil.ShrinkPic(postedFile.InputStream,
                             postedFile.ContentType,
                             nLogoLimitW,
@@ -104,7 +104,7 @@
                             out strError);
                     if (nRet == -1)
                         return -1;
-                    if (nRet == 0)  // ûбҪ
+                    if (nRet == 0)  // 没有必要缩放
                     {
                         postedFile.InputStream.Seek(0, SeekOrigin.Begin); // 2012/5/20
                         StreamUtil.DumpStream(postedFile.InputStream, t);
@@ -114,19 +114,19 @@
             // t.Close();

-                // ļߴ
+                // 检测文件尺寸
                 FileInfo fi = new FileInfo(strLocalFileName);

                 if (fi.Exists == false)
                 {
-                    strError = "ļ '" + strLocalFileName + "' ...";
+                    strError = "文件 '" + strLocalFileName + "' 不存在...";
                     return -1;
                 }

                 string[] ranges = null;

                 if (fi.Length == 0)
-                { // ļ
+                { // 空文件
                     ranges = new string[1];
                     ranges[0] = "";
                 }
@@ -135,7 +135,7 @@
                     string strRange = "";
                     strRange = "0-" + Convert.ToString(fi.Length - 1);

-                    // 100KΪһchunk
+                    // 按照100K作为一个chunk
                     ranges = RangeList.ChunkRange(strRange,
                         100 * 1024);
                 }
@@ -148,7 +148,7 @@

                 string strLocalPath = postedFile.FileName;

-                // page.Response.Write("
ڱ" + strLocalPath);
+                // page.Response.Write("
正在保存" + strLocalPath);

             REDOWHOLESAVE:
                 string strWarning = "";
@@ -157,17 +157,17 @@
                 {
                 REDOSINGLESAVE:

-                    // Application.DoEvents();	// ýȨ
+                    // Application.DoEvents();	// 出让界面控制权

                     if (stop.State != 0)
                     {
-                        strError = "ûж";
+                        strError = "用户中断";
                         goto ERROR1;
                     }

                     string strWaiting = "";
                     if (j == ranges.Length - 1)
-                        strWaiting = " ĵȴ...";
+                        strWaiting = " 请耐心等待...";

                     string strPercent = "";
                     RangeList rl = new RangeList(ranges[j]);
@@ -178,11 +178,11 @@
                     }

                     if (stop != null)
-                        stop.SetMessage(" " + ranges[j] + "/"
+                        stop.SetMessage("正在上载 " + ranges[j] + "/"
                             + Convert.ToString(fi.Length)
                             + " " + strPercent + " " + strLocalFileName + strWarning + strWaiting);

-                    // page.Response.Write(".");	// ֹǰȴöʱ
+                    // page.Response.Write(".");	// 防止前端因等待过久而超时

                     long lRet = channel.DoSaveResObject(strResPath,
                         strLocalFileName,
@@ -190,7 +190,7 @@
                         postedFile.ContentType,
                         strLastModifyTime,
                         ranges[j],
-                        j == ranges.Length - 1 ? true : false,	// βһβѵײעWebService APIʱʱ
+                        j == ranges.Length - 1 ? true : false,	// 最尾一次操作，提醒底层注意设置特殊的WebService API超时时间
                         timestamp,
                         out output_timestamp,
                         out strError);
@@ -208,7 +208,7 @@

                             timestamp = new byte[output_timestamp.Length];
                             Array.Copy(output_timestamp, 0, timestamp, 0, output_timestamp.Length);
-                            strWarning = " (ʱƥ, Զ)";
+                            strWarning = " (时间戳不匹配, 自动重试)";
                             if (ranges.Length == 1 || j == 0)
                                 goto REDOSINGLESAVE;
                             goto REDOWHOLESAVE;
@@ -221,28 +221,28 @@
                 }

-                return 1;	// Ѿ
+                return 1;	// 已经保存
             ERROR1:
                 return -1;
             }
             finally
             {
-                // Ҫɾʱļ
+                // 不要忘记删除临时文件
                 File.Delete(strLocalFileName);
             }
         }

 #endif

-        // ݶ֤ҵͷԴ·
+        // 根据读者证条码号找到头像资源路径
         // parameters:
-        //      strReaderBarcode    ֤
-        //      strEncryptBarcode   strEncryptBarcodeݣstrReaderBarcode
-        //      strDisplayName  ֤ʾΪnullʾ֤
+        //      strReaderBarcode    读者证条码号
+        //      strEncryptBarcode   如果strEncryptBarcode有内容，则用它，而不用strReaderBarcode
+        //      strDisplayName  供验证的显示名。可以为null，表示不验证
         // return:
-        //      -1
-        //      0   ûҵ߼¼ڣ߶߼¼ûͷ
-        //      1   ҵ
+        //      -1  出错
+        //      0   没有找到。包括读者记录不存在，或者读者记录里面没有头像对象
+        //      1   找到
         public int GetReaderPhotoPath(
             SessionInfo sessioninfo,
             string strReaderBarcode,
@@ -259,13 +259,13 @@
                 string strTemp = LibraryApplication.DecryptPassword(strEncyptBarcode);
                 if (strTemp == null)
                 {
-                    strError = "strEncyptBarcodeаָʽȷ";
+                    strError = "strEncyptBarcode中包含的文字格式不正确";
                     return -1;
                 }
                 strReaderBarcode = strTemp;
             }

-            // ߼¼
+            // 读入读者记录
             string strReaderXml = "";
             byte[] reader_timestamp = null;
             string strOutputReaderRecPath = "";
@@ -278,20 +278,20 @@
                 out strError);
             if (nRet == 0)
             {
-                strError = "֤ '" + strReaderBarcode + "' ";
+                strError = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                 return 0;
             }
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "߼¼ʱ: " + strError;
+                // text-level: 内部错误
+                strError = "读入读者记录时发生错误: " + strError;
                 return -1;
             }

             if (nRet > 1)
             {
-                // text-level: ڲ
-                strError = "߼¼ʱֶ֤ '" + strReaderBarcode + "'  " + nRet.ToString() + " һشϵͳԱ촦";
+                // text-level: 内部错误
+                strError = "读入读者记录时，发现读者证条码号 '" + strReaderBarcode + "' 命中 " + nRet.ToString() + " 条，这是一个严重错误，请系统管理员尽快处理。";
                 return -1;
             }

@@ -301,34 +301,34 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "װض߼¼XML DOMʱ: " + strError;
+                // text-level: 内部错误
+                strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                 return -1;
             }

-            // ֤ʾ
+            // 验证显示名
             if (String.IsNullOrEmpty(strDisplayName) == false)
             {
                 string strDisplayNameValue = DomUtil.GetElementText(readerdom.DocumentElement,
                         "displayName");
                 if (strDisplayName.Trim() != strDisplayNameValue.Trim())
                 {
-                    strError = "Ȼ߼¼ҵˣʾѾƥ";
+                    strError = "虽然读者记录找到了，但是显示名已经不匹配";
                     return 0;
                 }
             }

-            // ǲѾͼ
+            // 看看是不是已经有图像对象

             XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
             nsmgr.AddNamespace("dprms", DpNs.dprms);

-            // ȫ<dprms:file>Ԫ
+            // 全部<dprms:file>元素
             XmlNodeList nodes = readerdom.DocumentElement.SelectNodes("//dprms:file[@usage='photo']", nsmgr);

             if (nodes.Count == 0)
             {
-                strError = "߼¼ûͷ";
+                strError = "读者记录中没有头像对象";
                 return 0;
             }

@@ -337,10 +337,10 @@
             return 1;
         }

-        // ö߿Ĺݴ
+        // 获得读者库的馆代码
         // return:
-        //      -1
-        //      0   ɹ
+        //      -1  出错
+        //      0   成功
         public int GetLibraryCode(
             string strReaderRecPath,
             out string strLibraryCode,
@@ -355,8 +355,8 @@
                 out bReaderDbInCirculation,
                 out strLibraryCode) == false)
             {
-                // text-level: ڲ
-                strError = "߼¼· '" + strReaderRecPath + "' еݿ '" + strReaderDbName + "' ڶĶ߿֮С";
+                // text-level: 内部错误
+                strError = "读者记录路径 '" + strReaderRecPath + "' 中的数据库名 '" + strReaderDbName + "' 不在定义的读者库之列。";
                 return -1;
             }
             return 0;
@@ -366,11 +366,11 @@
         {
             if (strAction == "borrow")
             {
-                return "";
+                return "借阅";
             }
             else if (strAction == "renew")
             {
-                return "";
+                return "续借";
             }
             else return strAction;
         }
@@ -388,12 +388,12 @@
             return strResult;
         }

-        // ݶ֤Źάַ
+        // 根据读者证条码号构造二维码字符串
         public static string BuildQrCode(string strReaderBarcode,
             string strLibraryUid)
         {
             DateTime now = DateTime.UtcNow;
-            // ʱЧַ 20130101
+            // 时效字符串 20130101
             string strDateString = DateTimeUtil.DateTimeToString8(now);
             string strSalt = strDateString + "|" + strReaderBarcode + "|" + GetLibLocCode(strLibraryUid);
             string strHash = BuildPqrHash(strSalt);
@@ -417,7 +417,7 @@
                 || strCode.Length < "PQR:".Length
                 || StringUtil.HasHead(strCode, "PQR:") == false)
             {
-                strError = "Ƕ֤Ŷά";
+                strError = "不是读者证号二维码";
                 return 0;
             }

@@ -433,7 +433,7 @@
             }
             else
             {
-                strError = "PQR ʽ: ȱַ '@'";
+                strError = "PQR 号码格式错误: 缺乏字符 '@'";
                 return -1;
             }

@@ -443,7 +443,7 @@

             if (strVerify != strHashcode)
             {
-                strError = "PQR ʽ: Уʧ";
+                strError = "PQR 号码格式错误: 校验失败";
                 return -1;
             }

@@ -451,12 +451,12 @@
         }

 #if NO
-        // ݶ֤Źάַ
+        // 根据读者证条码号构造二维码字符串
         public static string BuildQrCode(string strReaderBarcode,
             string strLibraryUid)
         {
             DateTime now = DateTime.UtcNow;
-            // ʱЧַ ʼ:   ticks
+            // 时效字符串 开始点:长度 ， 都是 ticks 数字
             string strDateString = now.Ticks.ToString() + ":" + new TimeSpan(24, 0, 0).Ticks.ToString();
             return "PQR:" + Cryptography.Encrypt(strDateString + "|" + strReaderBarcode + "@" + strLibraryUid, LibraryApplication.qrkey);
         }
@@ -474,7 +474,7 @@
                 return nRet;
             if (strLibraryUid != this.UID)
             {
-                strError = "ǱݵĶ֤Ŷά";
+                strError = "不是本馆的读者证号二维码";
                 return -1;
             }

@@ -482,13 +482,13 @@
         }

-        // ѶάַתΪ֤
+        // 把二维码字符串转换为读者证条码号
         // parameters:
-        //      strReaderBcode  [out]֤
+        //      strReaderBcode  [out]读者证条码号
         // return:
-        //      -1
-        //      0       ַǶ֤Ŷά
-        //      1       ɹ
+        //      -1      出错
+        //      0       所给出的字符串不是读者证号二维码
+        //      1       成功
         public static int DecodeQrCode(string strCode,
             out string strReaderBarcode,
             out string strLibraryUid,
@@ -502,32 +502,32 @@
                 || strCode.Length < "PQR:".Length
                 || StringUtil.HasHead(strCode, "PQR:") == false)
             {
-                strError = "Ƕ֤Ŷά";
+                strError = "不是读者证号二维码";
                 return 0;
             }

             strCode = strCode.Substring("PQR:".Length);

-            //
+            // 解密
             try
             {
                 string strPlainText = Cryptography.Decrypt(strCode, LibraryApplication.qrkey);

-                // ʱЧ
+                // 时效部分
                 int nRet = strPlainText.IndexOf("|");
                 if (nRet == -1)
                 {
-                    strError = "ʽ";
+                    strError = "号码格式错误";
                     return -1;
                 }
                 string strTimeString = strPlainText.Substring(0, nRet);
                 string strTemp = strPlainText.Substring(nRet + 1);

-                // ʱЧ
+                // 检查时效性
                 nRet = strTimeString.IndexOf(":");
                 if (nRet == -1)
                 {
-                    strError = "ʽ";
+                    strError = "号码格式错误";
                     return -1;
                 }
                 string strStart = strTimeString.Substring(0, nRet);
@@ -535,15 +535,15 @@
                 long lStart = 0;
                 if (long.TryParse(strStart, out lStart) == false)
                 {
-                    // һֲָʽ
-                    strError = "ʽ";
+                    // 第一个数字部分格式错误
+                    strError = "号码格式错误";
                     return -1;
                 }
                 long lLength = 0;
                 if (long.TryParse(strLength, out lLength) == false)
                 {
-                    // ڶֲָʽ
-                    strError = "ʽ";
+                    // 第二个数字部分格式错误
+                    strError = "号码格式错误";
                     return -1;
                 }
                 DateTime start = new DateTime(lStart);
@@ -551,7 +551,7 @@
                 DateTime now = DateTime.UtcNow;
                 if (now < start || now >= start + delta)
                 {
-                    strError = "ѾʧЧ";
+                    strError = "号码已经失效";
                     return -1;
                 }

@@ -567,18 +567,18 @@
             }
             catch(Exception ex)
             {
-                strError = "ʽ";
+                strError = "号码格式错误";
                 return -1;
             }
         }

 #endif

-        // ģʽ
+        // 检查评估模式
         // return:
-        //      -1  ̳
-        //      0   ͨ
-        //      1   ͨ
+        //      -1  检查过程出错
+        //      0   可以通过
+        //      1   不允许通过
         public static int CheckTestModePath(string strPath,
             out string strError)
         {
@@ -594,33 +594,33 @@
             long id = 0;
             if (long.TryParse(strRecID, out id) == false)
             {
-                strError = "ģʽ¼·Ĺ̳· '"+strPath+"' еļ¼ID '"+strRecID+"' ";
+                strError = "检查评估模式记录路径的过程出错，路经 '"+strPath+"' 中的记录ID '"+strRecID+"' 不是数字";
                 return -1;
             }

             if (id >= 1 && id <= 1000)
                 return 0;
-            strError = "ģʽֻʹID  1-1000 Χڵļ¼ (ǰ¼·Ϊ '"+strPath+"')";
+            strError = "评估模式只能使用ID 在 1-1000 范围内的记录 (当前记录路径为 '"+strPath+"')";
             return 1;
         }

-        // API:
-        // text-level: ûʾ OPAC蹦Ҫô˺
+        // API: 借书
+        // text-level: 用户提示 OPAC续借功能要调用此函数
         // parameters:
-        //      strReaderBarcode    ֤šʱΪ
-        //      strItemBarcode
-        //      strConfirmItemRecPath  ¼·ڲظ£ҪʹƽʱΪnull
-        //      saBorrowedItemBarcode   ͬһǰѾĳɹĲżϡڷصĶhtmlʾضɫѡ
-        //      strStyle    "item"ʾز¼"reader"ʾض߼¼
-        //      strItemFormat   涨strItemRecordصݸʽ
-        //      strItemRecord   ز¼
-        //      strReaderFormat 涨strReaderRecordصݸʽ
-        //      strReaderRecord ض߼¼
-        //      aDupPath    ظﷵز¼·
-        //      return_time νҪʱ䡣GMTʱ䡣
-        // Ȩޣ۹ԱǶߣӦ߱borrowrenewȨޡ
-        //      ڶߣҪеĽ()ԼģstrReaderBarcode˻Ϣе֤һ¡
-        //      Ҳ˵߲˽()ͼ飬涨Ϊ˷ֹߵҡ
+        //      strReaderBarcode    读者证条码号。续借的时候可以为空
+        //      strItemBarcode  册条码号
+        //      strConfirmItemRecPath  册记录路径。在册条码号重复的情况下，才需要使用这个参数，平时为null即可
+        //      saBorrowedItemBarcode   同一读者先前已经借阅成功的册条码号集合。用于在返回的读者html中显示出特定的颜色而已。
+        //      strStyle    操作风格。"item"表示将返回册记录；"reader"表示将返回读者记录
+        //      strItemFormat   规定strItemRecord参数所返回的数据格式
+        //      strItemRecord   返回册记录
+        //      strReaderFormat 规定strReaderRecord参数所返回的数据格式
+        //      strReaderRecord 返回读者记录
+        //      aDupPath    如果发生条码号重复，这里返回了相关册记录的路径
+        //      return_time 本次借阅要求的最后还书时间。GMT时间。
+        // 权限：无论工作人员还是读者，首先应具备borrow或renew权限。
+        //      对于读者，还需要他进行的借阅(续借)操作是针对自己的，即strReaderBarcode必须和账户信息中的证条码号一致。
+        //      也就是说，读者不允许替他人借阅(续借)图书，这样规定是为了防止读者捣乱。
         public LibraryServerResult Borrow(
             SessionInfo sessioninfo,
             bool bRenew,
@@ -660,78 +660,78 @@

             string strActionName = GetBorrowActionName(strAction);

-            // ի
+            // 个人书斋名
             string strPersonalLibrary = "";
             if (sessioninfo.UserType == "reader"
                 && sessioninfo.Account != null)
                 strPersonalLibrary = sessioninfo.Account.PersonalLibrary;

-            // Ȩж
+            // 权限判断
             if (bRenew == false)
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("borrow", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "Ĳܾ߱borrowȨޡ";
+                    result.ErrorInfo = "借阅操作被拒绝。不具备borrow权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     // return result;
                 }

-                // Զݵĸж
-                // עиիģԼִ
+                // 对读者身份的附加判断
+                // 注：具有个人书斋的，还可以继续向后执行
                 if (sessioninfo.UserType == "reader"
                     && sessioninfo.Account != null && strReaderBarcode != sessioninfo.Account.Barcode
                     && string.IsNullOrEmpty(strPersonalLibrary) == true)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ĲܾΪ߲ܴ˽нĲ";
+                    result.ErrorInfo = "借阅操作被拒绝。作为读者不能代他人进行借阅操作。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("renew", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    // text-level: ûʾ
-                    result.ErrorInfo = this.GetString("ܾ߱renewȨޡ"); // "ܾ߱renewȨޡ"
+                    // text-level: 用户提示
+                    result.ErrorInfo = this.GetString("续借操作被拒绝。不具备renew权限。"); // "续借操作被拒绝。不具备renew权限。"
                     result.ErrorCode = ErrorCode.AccessDenied;
                     // return result;
                 }

-                // Զݵĸж
-                // עиիģԼִ
+                // 对读者身份的附加判断
+                // 注：具有个人书斋的，还可以继续向后执行
                 if (sessioninfo.UserType == "reader"
                     && sessioninfo.Account != null && strReaderBarcode != sessioninfo.Account.Barcode
                     && string.IsNullOrEmpty(strPersonalLibrary) == true)
                 {
                     result.Value = -1;
-                    // text-level: ûʾ
-                    result.ErrorInfo = this.GetString("ܾΪ߲ܴ˽");  // "ܾΪ߲ܴ˽"
+                    // text-level: 用户提示
+                    result.ErrorInfo = this.GetString("续借操作被拒绝。作为读者不能代他人进行续借操作。");  // "续借操作被拒绝。作为读者不能代他人进行续借操作。"
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }

-            // ûͨȨޣҪԤȡȨ
+            // 如果没有普通的权限，需要预检查存取权限
             LibraryServerResult result_save = null;
             if (result.Value == -1 && String.IsNullOrEmpty(sessioninfo.Access) == false)
             {
                 string strAccessActionList = GetDbOperRights(sessioninfo.Access,
-                        "", // ʱ֪ʵȡõǰʻһʵĴȡ
+                        "", // 此时还不知道实体库名，先取得当前帐户关于任意一个实体库的存取定义
                         "circulation");
                 if (string.IsNullOrEmpty(strAccessActionList) == true)
                     return result;

-                // ͨһ󣬺ȻҪȡȨޡ
-                // УȷĳʵĴȡȨ޴ڣȡȨޣڣͨȨ
+                // 通过了这样一番检查后，后面依然要检查存取权限。
+                // 如果后面检查中，精确针对某个实体库的存取权限存在，则依存取权限；如果不存在，则依普通权限
                 result_save = result.Clone();
             }
             else if (result.Value == -1)
-                return result;  // ӳٱ 2014/9/16
+                return result;  // 延迟报错 2014/9/16

             result = new LibraryServerResult();

@@ -739,25 +739,25 @@

             if (bForce == true)
             {
-                strError = "bForceΪtrue";
+                strError = "bForce参数不能为true";
                 goto ERROR1;
             }

             int nRet = 0;
             long lRet = 0;
-            string strIdcardNumber = "";    // ֤
+            string strIdcardNumber = "";    // 身份证号
             string strQrCode = "";  //

             if (string.IsNullOrEmpty(strReaderBarcode) == false)
             {
                 string strOutputCode = "";
-                // ѶάַתΪ֤
+                // 把二维码字符串转换为读者证条码号
                 // parameters:
-                //      strReaderBcode  [out]֤
+                //      strReaderBcode  [out]读者证条码号
                 // return:
-                //      -1
-                //      0       ַǶ֤Ŷά
-                //      1       ɹ
+                //      -1      出错
+                //      0       所给出的字符串不是读者证号二维码
+                //      1       成功
                 nRet = DecodeQrCode(strReaderBarcode,
                     out strOutputCode,
                     out strError);
@@ -771,8 +771,8 @@
             }

-            int nRedoCount = 0; // Ϊʱͻ, ԵĴ
-            string strLockReaderBarcode = strReaderBarcode; // רַº汻޸
+            int nRedoCount = 0; // 因为时间戳冲突, 重试的次数
+            string strLockReaderBarcode = strReaderBarcode; // 加锁专用字符串，不怕后面被修改了

             REDO_BORROW:

@@ -785,21 +785,21 @@
             string strOutputReaderRecPath = "";
             string strLibraryCode = "";

-            // Ӷ߼¼
+            // 加读者记录锁
             // this.ReaderLocks.LockForWrite(strLockReaderBarcode);
             if (String.IsNullOrEmpty(strReaderBarcode) == false)
             {
-                // Ӷ߼¼
+                // 加读者记录锁
                 strLockReaderBarcode = strReaderBarcode;
                 this.ReaderLocks.LockForWrite(strReaderBarcode);
                 bReaderLocked = true;
                 strOutputReaderBarcodeParam = strReaderBarcode;
             }

-            try // ߼¼Χʼ
-            {
-
-                // ȡ߼¼
+            try // 读者记录锁定范围开始
+            {
+
+                // 读取读者记录
                 XmlDocument readerdom = null;
                 byte[] reader_timestamp = null;
                 string strOldReaderXml = "";
@@ -823,13 +823,13 @@
                         return result1;
                     }

-                    // ޸ǰĶ߼¼
+                    // 记忆修改前的读者记录
                     strOldReaderXml = readerdom.OuterXml;

                     if (String.IsNullOrEmpty(strIdcardNumber) == false
                         || string.IsNullOrEmpty(strReaderBarcode) == true /* 2013/5/23 */)
                     {
-                        // ö֤
+                        // 获得读者证条码号
                         strReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
                             "barcode");
                     }
@@ -838,11 +838,11 @@

                     string strReaderDbName = ResPath.GetDbName(strOutputReaderRecPath);

-                    // 鵱ǰûϽĶ߷Χ
+                    // 检查当前用户管辖的读者范围
                     // return:
-                    //      -1
-                    //      0
-                    //      1   ȨƣʡstrError ˵ԭ
+                    //      -1  出错
+                    //      0   允许继续访问
+                    //      1   权限限制，不允许继续访问。strError 中有说明原因的文字
                     nRet = CheckReaderRange(sessioninfo,
                         readerdom,
                         strReaderDbName,
@@ -851,7 +851,7 @@
                         goto ERROR1;
                     if (nRet == 1)
                     {
-                        // strError = "ǰû '" + sessioninfo.UserID + "' ĴȡȨ޻ѹϵֹ(֤Ϊ " + strReaderBarcode + ")ԭ" + strError;
+                        // strError = "当前用户 '" + sessioninfo.UserID + "' 的存取权限或好友关系禁止操作读者(证条码号为 " + strReaderBarcode + ")。具体原因：" + strError;
                         result.Value = -1;
                         result.ErrorInfo = strError;
                         result.ErrorCode = ErrorCode.AccessDenied;
@@ -867,27 +867,27 @@
                 RmsChannel channel = sessioninfo.Channels.GetChannel(this.WsUrl);
                 if (channel == null)
                 {
-                    // text-level: ڲ
+                    // text-level: 内部错误
                     strError = "get channel error";
                     goto ERROR1;
                 }

-                // Ӳ¼
+                // 加册记录锁
                 this.EntityLocks.LockForWrite(strItemBarcode);

-                try // ¼Χʼ
-                {
-                    // ¼
+                try // 册记录锁定范围开始
+                {
+                    // 读入册记录
                     DateTime start_time_read_item = DateTime.Now;

-                    // ѾȷĲ¼·
+                    // 如果已经有确定的册记录路径
                     if (String.IsNullOrEmpty(strConfirmItemRecPath) == false)
                     {
-                        // ·еĿǲʵ
+                        // 检查路径中的库名，是不是实体库名
                         // return:
                         //      -1  error
-                        //      0   ʵ
-                        //      1   ʵ
+                        //      0   不是实体库名
+                        //      1   是实体库名
                         nRet = this.CheckItemRecPath(strConfirmItemRecPath,
                             out strError);
                         if (nRet == -1)
@@ -908,21 +908,21 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            // text-level: ڲ
-                            strError = "strConfirmItemRecPath '" + strConfirmItemRecPath + "' ò¼ʧ: " + strError;
+                            // text-level: 内部错误
+                            strError = "根据strConfirmItemRecPath '" + strConfirmItemRecPath + "' 获得册记录失败: " + strError;
                             goto ERROR1;
                         }
                     }
                     else
                     {
-                        // ӲŻò¼
-
-                        // ò¼
+                        // 从册条码号获得册记录
+
+                        // 获得册记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetItemRecXml(
                             sessioninfo.Channels,
                             strItemBarcode,
@@ -934,18 +934,18 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            // text-level: ûʾ
-                            result.ErrorInfo = string.Format(this.GetString("s"),   // " '{0}' "
+                            // text-level: 用户提示
+                            result.ErrorInfo = string.Format(this.GetString("册条码号s不存在"),   // "册条码号 '{0}' 不存在"
                                 strItemBarcode);

-                            // " '" + strItemBarcode + "' ";
+                            // "册条码号 '" + strItemBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            // text-level: ڲ
-                            strError = "¼ʱ: " + strError;
+                            // text-level: 内部错误
+                            strError = "读入册记录时发生错误: " + strError;
                             goto ERROR1;
                         }

@@ -954,18 +954,18 @@
                             if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(
                                 strLibraryCode,
-                                "",
-                                "ظ",
+                                "出纳",
+                                "借书遇册条码号重复次数",
                                 1);

                             result.Value = -1;
-                            // text-level: ûʾ
-                            result.ErrorInfo = string.Format(this.GetString("ΪsĲ¼s޷нĲ"),  // "Ϊ '{0}' Ĳ¼ "{1}" ޷нĲڸӲ¼·ύĲ"
+                            // text-level: 用户提示
+                            result.ErrorInfo = string.Format(this.GetString("册条码号为s的册记录有s条，无法进行借阅操作"),  // "册条码号为 '{0}' 的册记录有 "{1}" 条，无法进行借阅操作。请在附加册记录路径后重新提交借阅操作。"
                                 strItemBarcode,
                                 aPath.Count.ToString());
                             this.WriteErrorLog(result.ErrorInfo);   // 2012/12/30

-                            // "Ϊ '" + strItemBarcode + "' Ĳ¼ " + aPath.Count.ToString() + " ޷нĲڸӲ¼·ύĲ";
+                            // "册条码号为 '" + strItemBarcode + "' 的册记录有 " + aPath.Count.ToString() + " 条，无法进行借阅操作。请在附加册记录路径后重新提交借阅操作。";
                             result.ErrorCode = ErrorCode.ItemBarcodeDup;

                             aDupPath = new string[aPath.Count];
@@ -986,7 +986,7 @@

                     string strItemDbName = "";

-                    // ¼ݿ⣬Ƿڲͨʵ֮
+                    // 看看册记录所从属的数据库，是否在参与流通的实体库之列
                     // 2008/6/4 new add
                     if (String.IsNullOrEmpty(strOutputItemRecPath) == false)
                     {
@@ -994,25 +994,25 @@
                         bool bItemDbInCirculation = true;
                         if (this.IsItemDbName(strItemDbName, out bItemDbInCirculation) == false)
                         {
-                            // text-level: ڲ
-                            strError = "¼· '" + strOutputItemRecPath + "' еݿ '" + strItemDbName + "' Ȼڶʵ֮С";
+                            // text-level: 内部错误
+                            strError = "册记录路径 '" + strOutputItemRecPath + "' 中的数据库名 '" + strItemDbName + "' 居然不在定义的实体库之列。";
                             goto ERROR1;
                         }

                         if (bItemDbInCirculation == false)
                         {
-                            // text-level: ڲ
-                            strError = "ܾ '" + strItemBarcode + "' ڵĲ¼ '" + strOutputItemRecPath + "' ݿ '" + strItemDbName + "' δͨʵ";
+                            // text-level: 内部错误
+                            strError = "借书操作被拒绝。册条码号 '" + strItemBarcode + "' 所在的册记录 '" + strOutputItemRecPath + "' 因其数据库 '" + strItemDbName + "' 属于未参与流通的实体库";
                             goto ERROR1;
                         }
                     }

-                    // ȡȨ
+                    // 检查存取权限
                     string strAccessParameters = "";

                     {

-                        // ȡȨ circulation
+                        // 检查存取权限 circulation
                         if (String.IsNullOrEmpty(sessioninfo.Access) == false)
                         {
                             string strAccessActionList = "";
@@ -1022,8 +1022,8 @@
 #if NO
                             if (String.IsNullOrEmpty(strAccessActionList) == true && result_save != null)
                             {
-                                // TODO: Ҳֱӷ result_save
-                                strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ  ĴȡȨ";
+                                // TODO: 也可以直接返回 result_save
+                                strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳 操作的存取权限";
                                 result.Value = -1;
                                 result.ErrorInfo = strError;
                                 result.ErrorCode = ErrorCode.AccessDenied;
@@ -1033,19 +1033,19 @@
                             if (strAccessActionList == null)
                             {
                                 strAccessActionList = GetDbOperRights(sessioninfo.Access,
-            "", // ʱ֪ʵȡõǰʻһʵĴȡ
+            "", // 此时还不知道实体库名，先取得当前帐户关于任意一个实体库的存取定义
             "circulation");
                                 if (strAccessActionList == null)
                                 {
-                                    // ʵⶼûжκδȡȨޣʱҪ˶ʹͨȨ
+                                    // 对所有实体库都没有定义任何存取权限，这时候要退而使用普通权限
                                     strAccessActionList = sessioninfo.Rights;

-                                    // עʵʱ result_save == null ͨȨ޼Ѿͨ˵
+                                    // 注：其实此时 result_save == null 即表明普通权限检查已经通过了的
                                 }
                                 else
                                 {
-                                    // ʵⶨ˴ȡȨޣ strItemDbName ûж
-                                    strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ  ĴȡȨ";
+                                    // 对其他实体库定义了存取权限，但对 strItemDbName 没有定义
+                                    strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳 操作的存取权限";
                                     result.Value = -1;
                                     result.ErrorInfo = strError;
                                     result.ErrorCode = ErrorCode.AccessDenied;
@@ -1055,13 +1055,13 @@

                             if (strAccessActionList == "*")
                             {
-                                // ͨ
+                                // 通配
                             }
                             else
                             {
                                 if (IsInAccessList(strAction, strAccessActionList, out strAccessParameters) == false)
                                 {
-                                    strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ   " + strActionName + " ĴȡȨ";
+                                    strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳  " + strActionName + " 操作的存取权限";
                                     result.Value = -1;
                                     result.ErrorInfo = strError;
                                     result.ErrorCode = ErrorCode.AccessDenied;
@@ -1079,86 +1079,86 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        // text-level: ڲ
-                        strError = "װز¼XML DOMʱ: " + strError;
+                        // text-level: 内部错误
+                        strError = "装载册记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    WriteTimeUsed(start_time_read_item, "Borrow()жȡ¼ ʱ ");
+                    WriteTimeUsed(start_time_read_item, "Borrow()中读取册记录 耗时 ");

                     DateTime start_time_process = DateTime.Now;

-                    // ģʽĿ¼·
+                    // 检查评估模式下书目记录路径
                     if (this.TestMode == true || sessioninfo.TestMode == true)
                     {
                         string strBiblioDbName = "";
-                        // ʵ, ҵӦĿ
+                        // 根据实体库名, 找到对应的书目库名
                         // return:
-                        //      -1
-                        //      0   ûҵ
-                        //      1   ҵ
+                        //      -1  出错
+                        //      0   没有找到
+                        //      1   找到
                         nRet = this.GetBiblioDbNameByItemDbName(strItemDbName,
                             out strBiblioDbName,
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "ʵ '"+strItemDbName+"' Ŀʱ: " + strError;
+                            strError = "根据实体库名 '"+strItemDbName+"' 获得书目库名时出错: " + strError;
                             goto ERROR1;
                         }

                         string strParentID = DomUtil.GetElementText(itemdom.DocumentElement,
     "parent");
-                        // ģʽ
+                        // 检查评估模式
                         // return:
-                        //      -1  ̳
-                        //      0   ͨ
-                        //      1   ͨ
+                        //      -1  检查过程出错
+                        //      0   可以通过
+                        //      1   不允许通过
                         nRet = CheckTestModePath(strBiblioDbName + "/" + strParentID,
                             out strError);
                         if (nRet != 0)
                         {
-                            strError = strActionName + "ܾ: " + strError;
+                            strError = strActionName + "操作被拒绝: " + strError;
                             goto ERROR1;
                         }
                     }

                     // ***
-                    // ӳٻö֤
+                    // 延迟获得读者证条码号
                     if (string.IsNullOrEmpty(strReaderBarcode) == true)
                     {
                         if (bRenew == false)
                         {
-                            strError = "ṩ strReaderBarcode ֵܽ " +strActionName+ " ";
+                            strError = "必须提供 strReaderBarcode 参数值才能进行 " +strActionName+ " 操作";
                             goto ERROR1;
                         }

-                        string strOutputReaderBarcode = ""; // صĽ֤
-                        // ڲ¼лý֤
+                        string strOutputReaderBarcode = ""; // 返回的借阅者证条码号
+                        // 在册记录中获得借阅者证条码号
                         // return:
-                        //      -1
-                        //      0   òΪδ״̬
-                        //      1   ɹ
+                        //      -1  出错
+                        //      0   该册为未借出状态
+                        //      1   成功
                         nRet = GetBorrowerBarcode(itemdom,
                             out strOutputReaderBarcode,
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = strError + " (¼·Ϊ '" + strOutputItemRecPath + "')";
+                            strError = strError + " (册记录路径为 '" + strOutputItemRecPath + "')";
                             goto ERROR1;
                         }

                         if (nRet == 0 || string.IsNullOrEmpty(strOutputReaderBarcode) == true)
                         {
-                            strError = " '"+strItemBarcode+"' ǰδκζ߽ģ޷"+strActionName+"";
+                            strError = "册 '"+strItemBarcode+"' 当前未曾被任何读者借阅，所以无法进行"+strActionName+"操作";
                             goto ERROR1;
                         }
 #if NO
-                    // ṩ˶֤ţҪʵ
+                    // 如果提供了读者证条码号，则需要核实
                     if (String.IsNullOrEmpty(strReaderBarcode) == false)
                     {
                         if (strOutputReaderBarcode != strReaderBarcode)
                         {
-                            // ʱͺ֤
+                            // 暂时不报错，滞后验证
                             bDelayVerifyReaderBarcode = true;
                             strIdcardNumber = strReaderBarcode;
                         }
@@ -1168,11 +1168,11 @@
                         if (String.IsNullOrEmpty(strReaderBarcode) == true)
                             strReaderBarcode = strOutputReaderBarcode;

-                        // *** ߼¼ǰû,
+                        // *** 如果读者记录在前面没有锁定, 在这里锁定
                         if (bReaderLocked == false)
                         {
 #if NO
-                        // Ӷ߼¼
+                        // 加读者记录锁
                         strLockReaderBarcode = strReaderBarcode;
                         this.ReaderLocks.LockForWrite(strLockReaderBarcode);
                         bReaderLocked = true;
@@ -1186,35 +1186,35 @@
                     // ***

-                    // У֤ŲǷXML¼ȫһ
+                    // 校验读者证条码号参数是否和XML记录中完全一致
                     string strTempReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
                         "barcode");

                     if (string.IsNullOrEmpty(strReaderBarcode) == false
                         && strReaderBarcode != strTempReaderBarcode)
                     {
-                        // text-level: ڲ
-                        strError = "Ĳܾ֤Ų '" + strReaderBarcode + "' Ͷ߼¼<barcode>ԪڵĶֵ֤ '" + strTempReaderBarcode + "' һ¡";
+                        // text-level: 内部错误
+                        strError = "借阅操作被拒绝。因读者证条码号参数 '" + strReaderBarcode + "' 和读者记录中<barcode>元素内的读者证条码号值 '" + strTempReaderBarcode + "' 不一致。";
                         goto ERROR1;
                     }

                     // 2007/1/2 new add
-                    // УŲǷXML¼ȫһ
+                    // 校验册条码号参数是否和XML记录中完全一致

                     string strRefID = "";
                     string strHead = "@refID:";
-                    // string strFrom = "";
+                    // string strFrom = "册条码";
                     if (StringUtil.HasHead(strItemBarcode, strHead, true) == true)
                     {
-                        // strFrom = "οID";
+                        // strFrom = "参考ID";
                         strRefID = strItemBarcode.Substring(strHead.Length);

                         string strTempRefID = DomUtil.GetElementText(itemdom.DocumentElement,
     "refID");
                         if (strRefID != strTempRefID)
                         {
-                            // text-level: ڲ
-                            strError = "ĲܾοID '" + strRefID + "' Ͳ¼<refID>ԪڵĲֵ '" + strTempRefID + "' һ¡";
+                            // text-level: 内部错误
+                            strError = "借阅操作被拒绝。因册参考ID参数 '" + strRefID + "' 和册记录中<refID>元素内的册条码号值 '" + strTempRefID + "' 不一致。";
                             goto ERROR1;
                         }
                     }
@@ -1224,8 +1224,8 @@
     "barcode");
                         if (strItemBarcode != strTempItemBarcode)
                         {
-                            // text-level: ڲ
-                            strError = "ĲܾŲ '" + strItemBarcode + "' Ͳ¼<barcode>ԪڵĲֵ '" + strTempItemBarcode + "' һ¡";
+                            // text-level: 内部错误
+                            strError = "借阅操作被拒绝。因册条码号参数 '" + strItemBarcode + "' 和册记录中<barcode>元素内的册条码号值 '" + strTempItemBarcode + "' 不一致。";
                             goto ERROR1;
                         }
                     }
@@ -1253,27 +1253,27 @@

                     bool bReaderDomChanged = false;

-                    // ˢͣ
+                    // 刷新以停代金事项
                     if (StringUtil.IsInList("pauseBorrowing", this.OverdueStyle) == true)
                     {
                         //
-                        // ͣ
+                        // 处理以停代金功能
                         // return:
                         //      -1  error
-                        //      0   readerdomû޸
-                        //      1   readerdom޸
+                        //      0   readerdom没有修改
+                        //      1   readerdom发生了修改
                         nRet = ProcessPauseBorrowing(
                             strLibraryCode,
                             ref readerdom,
                             strOutputReaderRecPath,
                             sessioninfo.UserID,
                             "refresh",
-                            sessioninfo.ClientAddress,  // ǰ˴
+                            sessioninfo.ClientAddress,  // 前端触发
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ڲ
-                            strError = "ˢͣĹз: " + strError;
+                            // text-level: 内部错误
+                            strError = "在刷新以停代金的过程中发生错误: " + strError;
                             goto ERROR1;
                         }

@@ -1284,23 +1284,23 @@
                     byte[] output_timestamp = null;
                     string strOutputPath = "";

-                    // Ȩ
+                    // 检查借阅权限
                     // return:
-                    //      -1  ò
-                    //      0   Ȩ޲ĲӦܾ
-                    //      1   Ȩ޹
+                    //      -1  配置参数错误
+                    //      0   权限不够，借阅操作应当被拒绝
+                    //      1   权限够
                     nRet = CheckBorrowRights(
                         sessioninfo.Account,
                         calendar,
                         bRenew,
-                        strLibraryCode, // ߼¼ڶ߿Ĺݴ
+                        strLibraryCode, // 读者记录所在读者库的馆代码
                         strAccessParameters,
                         ref  readerdom,
                         ref  itemdom,
                         out  strError);
                     if (nRet == -1 || nRet == 0)
                     {
-                        // бҪض߼¼(ǰˢͣ)
+                        // 如果有必要保存回读者记录(因前面刷新了以停代金数据)
                         if (bReaderDomChanged == true)
                         {
                             string strError_1 = "";
@@ -1309,7 +1309,7 @@
                             string strOutputPath = "";
                              * */

-                            // дض߼¼
+                            // 写回读者记录
                             lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                                 readerdom.OuterXml,
                                 false,
@@ -1320,8 +1320,8 @@
                                 out strError_1);
                             if (lRet == -1)
                             {
-                                // text-level: ڲ
-                                strError = strError + "Ȼд߼¼У: " + strError_1;
+                                // text-level: 内部错误
+                                strError = strError + "。然而在写入读者记录过程中，发生错误: " + strError_1;
                                 goto ERROR1;
                             }
                         }
@@ -1330,7 +1330,7 @@
                         {
                             result.Value = -1;
                             result.ErrorInfo = strError;
-                            result.ErrorCode = ErrorCode.AccessDenied;  // Ȩ޲
+                            result.ErrorCode = ErrorCode.AccessDenied;  // 权限不够
                             return result;
                         }

@@ -1343,28 +1343,28 @@
                     domOperLog.LoadXml("<root />");
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "libraryCode",
-                        strLibraryCode);    // ڵĹݴ
+                        strLibraryCode);    // 读者所在的馆代码
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "operation",
                         "borrow");
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "action",
                         bRenew == true ? "renew" : "borrow");
-                    // ԭ
-
-
-
-
-
-
-                    // APIĴ
-                    // ԤԼϢ
+                    // 原来在这里
+
+
+
+
+
+
+                    // 借阅API的从属函数
+                    // 检查预约相关信息
                     // return:
                     //      -1  error
-                    //      0
-                    //      1   ָòᱻ) ܽ
-                    //      2   ָòԤԼ
-                    //      3   ָòᱻ ܽġұ޸˲¼(<location>Ԫط˱仯)Ҫغ󣬰Ѳ¼档
+                    //      0   正常
+                    //      1   发现该册被保留)， 不能借阅
+                    //      2   发现该册预约， 不能续借
+                    //      3   发现该册被保留， 不能借阅。而且本函数修改了册记录(<location>元素发生了变化)，需要本函数返回后，把册记录保存。
                     nRet = DoBorrowReservationCheck(
                         sessioninfo,
                         bRenew,
@@ -1376,7 +1376,7 @@
                         goto ERROR1;
                     if (nRet == 1 || nRet == 2)
                     {
-                        // ԤԼ, ܽ
+                        // 被预约保留, 不能借阅
                         result.Value = -1;
                         result.ErrorInfo = strError;
                         if (nRet == 1)
@@ -1397,7 +1397,7 @@
                         string strOutputPath = "";
                          * */

-                        // дز¼
+                        // 写回册记录
                         lRet = channel.DoSaveTextRes(strOutputItemRecPath,
                             itemdom.OuterXml,
                             false,
@@ -1408,19 +1408,19 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            // text-level: ڲ
-                            strError = "ĲڼԤԼͼҪдز¼ " + strOutputItemRecPath + " ʱ: " + strError;
+                            // text-level: 内部错误
+                            strError = "借阅操作中遇在架预约图书需要写回册记录 " + strOutputItemRecPath + " 时出错: " + strError;
                             this.WriteErrorLog(strError);
-                            strError += "Ĳܾ";
+                            strError += "。借阅操作被拒绝。";
                             goto ERROR1;
                         }

                         return result;
                     }

-                    // ƶ
-
-                    // ڶ߼¼Ͳ¼ӽϢ
+                    // 移动到这里
+
+                    // 在读者记录和册记录中添加借阅信息
                     // string strNewReaderXml = "";
                     nRet = DoBorrowReaderAndItemXml(
                         bRenew,
@@ -1438,18 +1438,18 @@
                         goto ERROR1;

-                    WriteTimeUsed(start_time_process, "Borrow()ниݴ ʱ ");
+                    WriteTimeUsed(start_time_process, "Borrow()中进行各种数据处理 耗时 ");

                     DateTime start_time_write_reader = DateTime.Now;
-                    // ԭxmlxmlڴ
-
-
-                    // дضߡ¼
+                    // 原来输出xml或xml的语句在此
+
+
+                    // 写回读者、册记录
                     // byte[] timestamp = null;

-                    // дض߼¼
+                    // 写回读者记录
                     lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                         readerdom.OuterXml,
                         false,
@@ -1465,8 +1465,8 @@
                             nRedoCount++;
                             if (nRedoCount > 10)
                             {
-                                // text-level: ڲ
-                                strError = "дض߼¼ʱ,ʱͻ,10,ʧ...";
+                                // text-level: 内部错误
+                                strError = "写回读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                 goto ERROR1;
                             }
                             goto REDO_BORROW;
@@ -1474,14 +1474,14 @@
                         goto ERROR1;
                     }

-                    WriteTimeUsed(start_time_write_reader, "Borrow()дض߼¼ ʱ ");
+                    WriteTimeUsed(start_time_write_reader, "Borrow()中写回读者记录 耗时 ");

                     DateTime start_time_write_item = DateTime.Now;

-                    // ʱʱ
+                    // 及时更新时间戳
                     reader_timestamp = output_timestamp;

-                    // дز¼
+                    // 写回册记录
                     lRet = channel.DoSaveTextRes(strOutputItemRecPath,
                         itemdom.OuterXml,
                         false,
@@ -1492,7 +1492,7 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        // ҪUndoղŶԶ߼¼д
+                        // 要Undo刚才对读者记录的写入
                         string strError1 = "";
                         lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                             strOldReaderXml,
@@ -1502,16 +1502,16 @@
                             out output_timestamp,
                             out strOutputPath,
                             out strError1);
-                        if (lRet == -1) // Undoʧ
+                        if (lRet == -1) // 初次Undo失败
                         {
                             if (channel.ErrorCode == ChannelErrorCode.TimestampMismatch)
                             {
-                                // ߼¼Undoʱ, ʱͻ
-                                // ʱҪִ¼, ͼɾӵ<borrows><borrow>Ԫ
+                                // 读者记录Undo的时候, 发现时间戳冲突了
+                                // 这时需要读出现存记录, 试图删除新增加的<borrows><borrow>元素
                                 // return:
                                 //      -1  error
-                                //      0   ûбҪUndo
-                                //      1   Undoɹ
+                                //      0   没有必要Undo
+                                //      1   Undo成功
                                 nRet = UndoBorrowReaderRecord(
                                     channel,
                                     strOutputReaderRecPath,
@@ -1520,50 +1520,50 @@
                                     out strError);
                                 if (nRet == -1)
                                 {
-                                    // text-level: ڲ
-                                    strError = "Undo߼¼ '" + strOutputReaderRecPath + "' (֤Ϊ'" + strReaderBarcode + "') Ĳ '" + strItemBarcode + "' ޸ʱ޷Undo: " + strError;
+                                    // text-level: 内部错误
+                                    strError = "Undo读者记录 '" + strOutputReaderRecPath + "' (读者证条码号为'" + strReaderBarcode + "') 借阅册条码号 '" + strItemBarcode + "' 的修改时，发生错误，无法Undo: " + strError;
                                     this.WriteErrorLog(strError);
                                     goto ERROR1;
                                 }

-                                // ɹ
+                                // 成功
                                 goto REDO_BORROW;
                             }

-                            // Ϊ ʱͻ
-                            // text-level: ڲ
-                            strError = "Undo߼¼ '" + strOutputReaderRecPath + "' (֤Ϊ'" + strReaderBarcode + "') Ĳ '" + strItemBarcode + "' ޸ʱ޷Undo: " + strError;
-                            // strError = strError + ", Undoдؾɶ߼¼Ҳʧ: " + strError1;
+                            // 以下为 不是时间戳冲突的其他错误情形
+                            // text-level: 内部错误
+                            strError = "Undo读者记录 '" + strOutputReaderRecPath + "' (读者证条码号为'" + strReaderBarcode + "') 借阅册条码号 '" + strItemBarcode + "' 的修改时，发生错误，无法Undo: " + strError;
+                            // strError = strError + ", 并且Undo写回旧读者记录也失败: " + strError1;
                             this.WriteErrorLog(strError);
                             goto ERROR1;
-                        } // end of Undoʧ
-
-                        // ΪUndoɹ
+                        } // end of 初次Undo失败
+
+                        // 以下为Undo成功的情形
                         goto REDO_BORROW;

-                    } // end of дز¼ʧ
-
-                    WriteTimeUsed(start_time_write_item, "Borrow()дز¼ ʱ ");
+                    } // end of 写回册记录失败
+
+                    WriteTimeUsed(start_time_write_item, "Borrow()中写回册记录 耗时 ");

                     DateTime start_time_write_operlog = DateTime.Now;

-                    // д־
+                    // 写入日志
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "confirmItemRecPath", strConfirmItemRecPath);

                     if (string.IsNullOrEmpty(strIdcardNumber) == false)
                     {
-                        // ʹ֤ɽĲ
+                        // 表明是使用身份证号来完成借阅操作的
                         DomUtil.SetElementText(domOperLog.DocumentElement,
         "idcardNumber", strIdcardNumber);
                     }

-                    // д߼¼
+                    // 写入读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "readerRecord", readerdom.OuterXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);

-                    // д¼
+                    // 写入册记录
                     node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "itemRecord", itemdom.OuterXml);
                     DomUtil.SetAttr(node, "recPath", strOutputItemRecPath);
@@ -1573,23 +1573,23 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "Borrow() API д־ʱ: " + strError;
+                        strError = "Borrow() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    WriteTimeUsed(start_time_write_operlog, "Borrow()д־ ʱ ");
+                    WriteTimeUsed(start_time_write_operlog, "Borrow()中写操作日志 耗时 ");

                     DateTime start_time_write_statis = DateTime.Now;

-                    // дͳָ
+                    // 写入统计指标
 #if NO
                     if (this.m_strLastReaderBarcode != strReaderBarcode)
                     {
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "",
-                            "",
+                            "出纳",
+                            "读者数",
                             1);
                         this.m_strLastReaderBarcode = strReaderBarcode;

@@ -1602,25 +1602,25 @@
                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(
                         strLibraryCode,
-                        "",
-                        "",
+                        "出纳",
+                        "借册",
                         1);

-                    WriteTimeUsed(start_time_write_statis, "Borrow()дͳָ ʱ ");
+                    WriteTimeUsed(start_time_write_statis, "Borrow()中写统计指标 耗时 ");

                     strOutputItemXml = itemdom.OuterXml;
                     strOutputReaderXml = readerdom.OuterXml;
                     strBiblioRecID = DomUtil.GetElementText(itemdom.DocumentElement, "parent"); //

-                } // ¼Χ
+                } // 册记录锁定范围结束
                 finally
                 {
-                    // ¼
-                    this.EntityLocks.UnlockForWrite(strItemBarcode);    // strItemBarcode в޸
-                }
-
-            } // ߼¼Χ
+                    // 解册记录锁
+                    this.EntityLocks.UnlockForWrite(strItemBarcode);    // strItemBarcode 在整个函数中不允许被修改
+                }
+
+            } // 读者记录锁定范围结束
             finally
             {
                 // this.ReaderLocks.UnlockForWrite(strLockReaderBarcode);
@@ -1628,8 +1628,8 @@
                     this.ReaderLocks.UnlockForWrite(strLockReaderBarcode);
             }

-            //
-            // ݲַڶⷶΧΪ˾ʱ䣬߲Ч
+            // 输出数据
+            // 把输出数据部分放在读者锁以外范围，是为了尽量减少锁定的时间，提高并发运行效率

             if (String.IsNullOrEmpty(strOutputReaderXml) == false
                 && StringUtil.IsInList("reader", strStyle) == true)
@@ -1642,7 +1642,7 @@
                 for (int i = 0; i < reader_formats.Length; i++)
                 {
                     string strReaderFormat = reader_formats[i];
-                    // ߼¼ݴXMLʽתΪHTMLʽ
+                    // 将读者记录数据从XML格式转换为HTML格式
                     // if (String.Compare(strReaderFormat, "html", true) == 0)
                     if (IsResultType(strReaderFormat, "html") == true)
                     {
@@ -1662,16 +1662,16 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
-                            // "Ȼд󣬵ǽĲѾɹ: " + strError;
+                            // "虽然出现了下列错误，但是借阅操作已经成功: " + strError;
                             goto ERROR1;
                         }
                         reader_records[i] = strReaderRecord;

                     }
-                    // ߼¼ݴXMLʽתΪtextʽ
+                    // 将读者记录数据从XML格式转换为text格式
                     // else if (String.Compare(strReaderFormat, "text", true) == 0)
                     else if (IsResultType(strReaderFormat, "text") == true)
                     {
@@ -1691,8 +1691,8 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
@@ -1709,8 +1709,8 @@
             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
@@ -1726,9 +1726,9 @@
                         }
                         catch (Exception ex)
                         {
-                            strError = " XML װ DOM : " + ex.Message;
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            strError = "读者 XML 装入 DOM 出错: " + ex.Message;
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
@@ -1736,9 +1736,9 @@
                     }
                     else
                     {
-                        strError = "strReaderFormatList˲ֵ֧ݸʽ '" + strReaderFormat + "'";
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                        strError = "strReaderFormatList参数出现了不支持的数据格式类型 '" + strReaderFormat + "'";
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                             strError);
                         goto ERROR1;
                     }
@@ -1746,7 +1746,7 @@

                 } // end of for

-                WriteTimeUsed(start_time_1, "Borrow()תxml¼ ʱ ");
+                WriteTimeUsed(start_time_1, "Borrow()中转换xml记录 耗时 ");
             }

             if (String.IsNullOrEmpty(strOutputItemXml) == false
@@ -1759,7 +1759,7 @@
                 {
                     string strItemFormat = item_formats[i];

-                    // ¼ݴXMLʽתΪHTMLʽ
+                    // 将册记录数据从XML格式转换为HTML格式
                     //if (String.Compare(strItemFormat, "html", true) == 0)
                     if (IsResultType(strItemFormat, "html") == true)
                     {
@@ -1773,14 +1773,14 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
                         item_records[i] = strItemRecord;
                     }
-                    // ¼ݴXMLʽתΪtextʽ
+                    // 将册记录数据从XML格式转换为text格式
                     // else if (String.Compare(strItemFormat, "text", true) == 0)
                     else if (IsResultType(strItemFormat, "text") == true)
                     {
@@ -1794,8 +1794,8 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
@@ -1811,8 +1811,8 @@
             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
@@ -1820,9 +1820,9 @@
                     }
                     else
                     {
-                        strError = "strItemFormatList˲ֵ֧ݸʽ '" + strItemFormat + "'";
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                        strError = "strItemFormatList参数出现了不支持的数据格式类型 '" + strItemFormat + "'";
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                             strError);
                         goto ERROR1;
                     }
@@ -1834,9 +1834,9 @@
             {
                 if (String.IsNullOrEmpty(strBiblioRecID) == true)
                 {
-                    strError = "¼XML<parent>ԪȱֵΪ, ޷λּ¼ID";
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                    strError = "册记录XML中<parent>元素缺乏或者值为空, 因此无法定位种记录ID";
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                         strError);
                     goto ERROR1;
                 }
@@ -1844,11 +1844,11 @@
                 string strItemDbName = ResPath.GetDbName(strOutputItemRecPath);

                 string strBiblioDbName = "";
-                // ʵ, ҵӦĿ
+                // 根据实体库名, 找到对应的书目库名
                 // return:
-                //      -1
-                //      0   ûҵ
-                //      1   ҵ
+                //      -1  出错
+                //      0   没有找到
+                //      1   找到
                 nRet = this.GetBiblioDbNameByItemDbName(strItemDbName,
                     out strBiblioDbName,
                     out strError);
@@ -1856,9 +1856,9 @@
                     goto ERROR1;
                 if (nRet == 0)
                 {
-                    strError = "ʵ '" + strItemDbName + "' ûҵӦĿ";
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                    strError = "实体库名 '" + strItemDbName + "' 没有找到对应的书目库名";
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                         strError);
                     goto ERROR1;
                 }
@@ -1869,7 +1869,7 @@
                 biblio_records = new string[biblio_formats.Length];

                 string strBiblioXml = "";
-                // html xml text֮һŻȡstrBiblioXml
+                // 至少有html xml text之一，才获取strBiblioXml
                 if (StringUtil.IsInList("html", strBiblioFormatList) == true
                     || StringUtil.IsInList("xml", strBiblioFormatList) == true
                     || StringUtil.IsInList("text", strBiblioFormatList) == true)
@@ -1878,8 +1878,8 @@
                     if (channel == null)
                     {
                         strError = "get channel error";
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                             strError);
                         goto ERROR1;
                     }
@@ -1895,9 +1895,9 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        strError = "ּ¼ '" + strBiblioRecPath + "' ʱ: " + strError;
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                        strError = "获得种记录 '" + strBiblioRecPath + "' 时出错: " + strError;
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                             strError);
                         goto ERROR1;
                     }
@@ -1907,14 +1907,14 @@
                 {
                     string strBiblioFormat = biblio_formats[i];

-                    // Ҫںӳļ
+                    // 需要从内核映射过来文件
                     string strLocalPath = "";
                     string strBiblio = "";

-                    // Ŀ¼ݴXMLʽתΪHTMLʽ
+                    // 将书目记录数据从XML格式转换为HTML格式
                     if (String.Compare(strBiblioFormat, "html", true) == 0)
                     {
-                        // TODO: cache
+                        // TODO: 可以cache
                         nRet = this.MapKernelScriptFile(
                             sessioninfo,
                             strBiblioDbName,
@@ -1923,13 +1923,13 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }

-                        // ּ¼ݴXMLʽתΪHTMLʽ
+                        // 将种记录数据从XML格式转换为HTML格式
                         string strFilterFileName = strLocalPath;    // app.CfgDir + "\\biblio.fltx";
                         if (string.IsNullOrEmpty(strBiblioXml) == false)
                         {
@@ -1942,8 +1942,8 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                // text-level: ûʾ
-                                strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                                // text-level: 用户提示
+                                strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                     strError);
                                 goto ERROR1;
                             }
@@ -1954,10 +1954,10 @@

                         biblio_records[i] = strBiblio;
                     }
-                    // ¼ݴXMLʽתΪtextʽ
+                    // 将册记录数据从XML格式转换为text格式
                     else if (String.Compare(strBiblioFormat, "text", true) == 0)
                     {
-                        // TODO: cache
+                        // TODO: 可以cache
                         nRet = this.MapKernelScriptFile(
                             sessioninfo,
                             strBiblioDbName,
@@ -1966,12 +1966,12 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ûʾ
-                            strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                            // text-level: 用户提示
+                            strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                 strError);
                             goto ERROR1;
                         }
-                        // ּ¼ݴXMLʽתΪTEXTʽ
+                        // 将种记录数据从XML格式转换为TEXT格式
                         string strFilterFileName = strLocalPath;    // app.CfgDir + "\\biblio.fltx";
                         if (string.IsNullOrEmpty(strBiblioXml) == false)
                         {
@@ -1984,8 +1984,8 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                // text-level: ûʾ
-                                strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                                // text-level: 用户提示
+                                strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                                     strError);
                                 goto ERROR1;
                             }
@@ -2010,16 +2010,16 @@
                     }
                     else
                     {
-                        strError = "strBiblioFormatList˲ֵ֧ݸʽ '" + strBiblioFormat + "'";
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("Ȼд󣬵ǽĲѾɹs"),   // "Ȼд󣬵ǽĲѾɹ: {0}";
+                        strError = "strBiblioFormatList参数出现了不支持的数据格式类型 '" + strBiblioFormat + "'";
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("虽然出现了下列错误，但是借阅操作已经成功s"),   // "虽然出现了下列错误，但是借阅操作已经成功: {0}";
                             strError);
                         goto ERROR1;
                     }
                 } // end of for
             }

-            WriteTimeUsed(start_time, "Borrow() ʱ ");
+            WriteTimeUsed(start_time, "Borrow() 耗时 ");
             return result;
         ERROR1:
             result.Value = -1;
@@ -2031,7 +2031,7 @@
         LibraryServerResult GetReaderRecord(
             SessionInfo sessioninfo,
             string strActionName,
-            ref string strReaderBarcode,    // 2015/1/4  ref
+            ref string strReaderBarcode,    // 2015/1/4 加上 ref
             ref string strIdcardNumber,
             ref string strLibraryCode,
             out XmlDocument readerdom,
@@ -2049,7 +2049,7 @@

                 DateTime start_time_read_reader = DateTime.Now;

-                // ߼¼
+                // 读入读者记录
                 string strReaderXml = "";
                 nRet = this.GetReaderRecXml(
                     sessioninfo.Channels,
@@ -2060,53 +2060,53 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "߼¼ʱ: " + strError;
+                    // text-level: 内部错误
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 if (nRet == 0)
                 {
-                    // ֤ţ֤̽š;
+                    // 如果是身份证号，则试探检索“身份证号”途径
                     if (StringUtil.IsIdcardNumber(strReaderBarcode) == true)
                     {
                         strIdcardNumber = strReaderBarcode;
-                        strReaderBarcode = ""; // ʹغ» reader barcode
-
-                        // ͨض;ö߼¼
+                        strReaderBarcode = ""; // 迫使函数返回后，重新获得 reader barcode
+
+                        // 通过特定检索途径获得读者记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetReaderRecXmlByFrom(
                             sessioninfo.Channels,
                             strIdcardNumber,
-                            "֤",
+                            "身份证号",
                             out strReaderXml,
                             out strOutputReaderRecPath,
                             out reader_timestamp,
                             out strError);
                         if (nRet == -1)
                         {
-                            // text-level: ڲ
-                            strError = "֤ '" + strIdcardNumber + "' ߼¼ʱ: " + strError;
+                            // text-level: 内部错误
+                            strError = "用身份证号 '" + strIdcardNumber + "' 读入读者记录时发生错误: " + strError;
                             goto ERROR1;
                         }
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            // text-level: ûʾ
-                            result.ErrorInfo = string.Format(this.GetString("֤s"),   // "֤ '{0}' "
+                            // text-level: 用户提示
+                            result.ErrorInfo = string.Format(this.GetString("身份证号s不存在"),   // "身份证号 '{0}' 不存在"
                                 strIdcardNumber);
                             result.ErrorCode = ErrorCode.IdcardNumberNotFound;
                             return result;
                         }
                         if (nRet > 1)
                         {
-                            // text-level: ûʾ
+                            // text-level: 用户提示
                             result.Value = -1;
-                            result.ErrorInfo = "֤ '" + strIdcardNumber + "' ߼¼ " + nRet.ToString() + " ޷֤н軹֤н軹";
+                            result.ErrorInfo = "用身份证号 '" + strIdcardNumber + "' 检索读者记录命中 " + nRet.ToString() + " 条，因此无法用身份证号来进行借还操作。请改用证条码号来进行借还操作。";
                             result.ErrorCode = ErrorCode.IdcardNumberDup;
                             return result;
                         }
@@ -2116,7 +2116,7 @@
                     else
                     {
                         // 2013/5/24
-                        // ҪӶ֤ŵȸ;м
+                        // 如果需要，从读者证号等辅助途径进行检索
                         foreach (string strFrom in this.PatronAdditionalFroms)
                         {
                             nRet = this.GetReaderRecXmlByFrom(
@@ -2130,17 +2130,17 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                // text-level: ڲ
-                                strError = "" + strFrom + " '" + strReaderBarcode + "' ߼¼ʱ: " + strError;
+                                // text-level: 内部错误
+                                strError = "用" + strFrom + " '" + strReaderBarcode + "' 读入读者记录时发生错误: " + strError;
                                 goto ERROR1;
                             }
                             if (nRet == 0)
                                 continue;
                             if (nRet > 1)
                             {
-                                // text-level: ûʾ
+                                // text-level: 用户提示
                                 result.Value = -1;
-                                result.ErrorInfo = "" + strFrom + " '" + strReaderBarcode + "' ߼¼ " + nRet.ToString() + " ޷"+strFrom+"н軹֤н軹";
+                                result.ErrorInfo = "用" + strFrom + " '" + strReaderBarcode + "' 检索读者记录命中 " + nRet.ToString() + " 条，因此无法用"+strFrom+"来进行借还操作。请改用证条码号来进行借还操作。";
                                 result.ErrorCode = ErrorCode.IdcardNumberDup;
                                 return result;
                             }
@@ -2156,10 +2156,10 @@
                     }

                     result.Value = -1;
-                    // text-level: ûʾ
-                    result.ErrorInfo = string.Format(this.GetString("֤s"),   // "֤ '{0}' "
+                    // text-level: 用户提示
+                    result.ErrorInfo = string.Format(this.GetString("读者证条码号s不存在"),   // "读者证条码号 '{0}' 不存在"
                         strReaderBarcode);
-                    // "֤ '" + strReaderBarcode + "' ";
+                    // "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
@@ -2167,29 +2167,29 @@
                 // 2008/6/17 new add
                 if (nRet > 1)
                 {
-                    // text-level: ڲ
-                    strError = "߼¼ʱֶ֤ '" + strReaderBarcode + "'  " + nRet.ToString() + " һشϵͳԱ촦";
+                    // text-level: 内部错误
+                    strError = "读入读者记录时，发现读者证条码号 '" + strReaderBarcode + "' 命中 " + nRet.ToString() + " 条，这是一个严重错误，请系统管理员尽快处理。";
                     goto ERROR1;
                 }

             SKIP0:

-                // ߼¼ݿ⣬ǷڲͨĶ߿֮
+                // 看看读者记录所从属的数据库，是否在参与流通的读者库之列
                 // 2008/6/4 new add
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
                     if (this.TestMode == true || sessioninfo.TestMode == true)
                     {
-                        // ģʽ
+                        // 检查评估模式
                         // return:
-                        //      -1  ̳
-                        //      0   ͨ
-                        //      1   ͨ
+                        //      -1  检查过程出错
+                        //      0   可以通过
+                        //      1   不允许通过
                         nRet = CheckTestModePath(strOutputReaderRecPath,
                             out strError);
                         if (nRet != 0)
                         {
-                            strError = strActionName + "ܾ: " + strError;
+                            strError = strActionName + "操作被拒绝: " + strError;
                             goto ERROR1;
                         }
                     }
@@ -2200,28 +2200,28 @@
                         out bReaderDbInCirculation,
                         out strLibraryCode) == false)
                     {
-                        // text-level: ڲ
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' еݿ '" + strReaderDbName + "' ȻڶĶ߿֮С";
+                        // text-level: 内部错误
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 中的数据库名 '" + strReaderDbName + "' 居然不在定义的读者库之列。";
                         goto ERROR1;
                     }

                     if (bReaderDbInCirculation == false)
                     {
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ܾ֤sڵĶ߼¼sݿsδͨĶ߿"),  // "ܾ֤ '{0}' ڵĶ߼¼ '{1}' ݿ '{2}' δͨĶ߿"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("借书操作被拒绝。读者证条码号s所在的读者记录s因其数据库s属于未参与流通的读者库"),  // "借书操作被拒绝。读者证条码号 '{0}' 所在的读者记录 '{1}' 因其数据库 '{2}' 属于未参与流通的读者库"
                             strReaderBarcode,
                             strOutputReaderRecPath,
                             strReaderDbName);

-                        // "ܾ֤ '" + strReaderBarcode + "' ڵĶ߼¼ '" +strOutputReaderRecPath + "' ݿ '" +strReaderDbName+ "' δͨĶ߿";
+                        // "借书操作被拒绝。读者证条码号 '" + strReaderBarcode + "' 所在的读者记录 '" +strOutputReaderRecPath + "' 因其数据库 '" +strReaderDbName+ "' 属于未参与流通的读者库";
                         goto ERROR1;
                     }
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -2232,12 +2232,12 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    // text-level: 内部错误
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                WriteTimeUsed(start_time_read_reader, "Borrow()жȡ߼¼ ʱ ");
+                WriteTimeUsed(start_time_read_reader, "Borrow()中读取读者记录 耗时 ");

                 return result;
             ERROR1:
@@ -2247,7 +2247,7 @@
                 return result;
         }

-        // ߼¼ ڶ߷Χ˵Ԫб
+        // 读者记录中 允许用于读者范围过滤的元素名列表
         static string[] reader_content_fields = new string[] {
                 "barcode",
                 "state",
@@ -2267,20 +2267,20 @@
                 "email",
                 "comment",
                 "cardNumber",
-                "displayName",  // ʾ
+                "displayName",  // 显示名
                 "nation",
                 "rights",
                 "personalLibrary",
                 "friends",
             };

-        // 鵱ǰûϽĶ߷Χ
+        // 检查当前用户管辖的读者范围
         // parameters:
         //
         // return:
-        //      -1
-        //      0
-        //      1   ȨƣʡstrError ˵ԭ
+        //      -1  出错
+        //      0   允许继续访问
+        //      1   权限限制，不允许继续访问。strError 中有说明原因的文字
         static int CheckReaderRange(
             SessionInfo sessioninfo,
             XmlDocument reader_dom,
@@ -2296,10 +2296,10 @@
             if (String.IsNullOrEmpty(strAccessString) == false)
             {
                 // return:
-                //      -1
-                //      0
-                //      1   ȨƣʡstrError ˵ԭ
-                //      2   ûжصĴȡ
+                //      -1  出错
+                //      0   允许继续访问
+                //      1   权限限制，不允许继续访问。strError 中有说明原因的文字
+                //      2   没有定义相关的存取定义参数
                 nRet = AccessReaderRange(
                     strAccessString,
                     reader_dom,
@@ -2309,7 +2309,7 @@
                     return -1;
                 if (nRet == 1)
                 {
-                    strError = "ǰû '" + sessioninfo.UserID + "' ĴȡȨ޽ֹ(֤Ϊ " + strReaderBarcode + ")ԭ" + strError;
+                    strError = "当前用户 '" + sessioninfo.UserID + "' 的存取权限禁止操作读者(证条码号为 " + strReaderBarcode + ")。具体原因：" + strError;
                     return 1;
                 }
                 if (nRet == 0)
@@ -2318,26 +2318,26 @@

             if (sessioninfo.UserType == "reader")
             {
-                //   ǷǲԼ?
+                // 看看 借书者 是否就是操作者自己?
                 if (sessioninfo.UserID == strReaderBarcode)
                     return 0;

-                // ûƥ reader 룬ôͿ reader_dom е fiends Ԫ
+                // 没有匹配的 reader 范畴，那么就看 reader_dom 中的 fiends 元素
                 string strFields = DomUtil.GetElementText(reader_dom.DocumentElement, "friends");
                 if (string.IsNullOrEmpty(strFields) == false)
                 {
-                    // жϵǰûǷΪ reader_dom ߵ friends
+                    // 判断当前用户是否为 reader_dom 读者的 friends
                     if (StringUtil.IsInList(sessioninfo.Account.Barcode, strFields) == true)
                         return 0;
-                    strError = "'" + sessioninfo.Account.Barcode + "'  '" + strReaderBarcode + "' ĺб";
-                    strError = " (֤Ϊ " + strReaderBarcode + ") ĺѹϵֹǰû '" + sessioninfo.UserID + "' в)ԭ" + strError;
+                    strError = "'" + sessioninfo.Account.Barcode + "' 不在 '" + strReaderBarcode + "' 的好友列表中";
+                    strError = "借阅者 (证条码号为 " + strReaderBarcode + ") 的好友关系禁止当前用户 '" + sessioninfo.UserID + "' 进行操作)。具体原因：" + strError;
                     return 1;
                 }
                 else
                 {
-                    // ûжκκѹϵ
-                    strError = "'" + strReaderBarcode + "' δб";
-                    strError = " (֤Ϊ " + strReaderBarcode + ") ĺѹϵֹǰû '" + sessioninfo.UserID + "' в)ԭ" + strError;
+                    // 没有定义任何好友关系
+                    strError = "'" + strReaderBarcode + "' 尚未定义好友列表";
+                    strError = "借阅者 (证条码号为 " + strReaderBarcode + ") 的好友关系禁止当前用户 '" + sessioninfo.UserID + "' 进行操作)。具体原因：" + strError;
                     return 1;
                 }
             }
@@ -2345,14 +2345,14 @@
                 return 0;
         }

-        // ȡȨе reader
+        // 检查存取权限中的 reader
         // parameters:
         //
         // return:
-        //      -1
-        //      0
-        //      1   ȨƣʡstrError ˵ԭ
-        //      2   ûжصĴȡ
+        //      -1  出错
+        //      0   允许继续访问
+        //      1   权限限制，不允许继续访问。strError 中有说明原因的文字
+        //      2   没有定义相关的存取定义参数
         static int AccessReaderRange(
             string strAccessString,
             XmlDocument reader_dom,
@@ -2371,7 +2371,7 @@
                 "reader");
             if (strAccessActionList == "*")
             {
-                // ͨ
+                // 通配
                 return 0;
             }

@@ -2384,14 +2384,14 @@
                 if (IsInAccessList(name, strAccessActionList, out strAccessParameters) == false)
                     continue;

-                // ƥһֶ
+                // 匹配一个读者字段
                 // parameters:
-                //      strName     ֶ
-                //      strMatchCase  ֶƥģʽ @ʽͨǺģƥ䷽ʽ
+                //      strName     字段名
+                //      strMatchCase  字段内容匹配模式 @引导的是正则表达式，否则是普通星号模糊匹配方式
                 // return:
-                //      -1
-                //      0   ûƥ
-                //      1   ƥ
+                //      -1  出错
+                //      0   没有匹配上
+                //      1   匹配上了
                 nRet = MatchReaderField(reader_dom,
                     name,
                     strAccessParameters,
@@ -2405,14 +2405,14 @@
             return 0;
         }

-        // ƥһֶ
+        // 匹配一个读者字段
         // parameters:
-        //      strName     ֶ
-        //      strMatchCase  ֶƥģʽ @ʽͨǺģƥ䷽ʽ
+        //      strName     字段名
+        //      strMatchCase  字段内容匹配模式 @引导的是正则表达式，否则是普通星号模糊匹配方式
         // return:
-        //      -1
-        //      0   ûƥϡstrError ˵ԭ
-        //      1   ƥ
+        //      -1  出错
+        //      0   没有匹配上。strError 中有说明原因的文字
+        //      1   匹配上了
         static int MatchReaderField(XmlDocument reader_dom,
             string strName,
             string strMatchCase,
@@ -2438,7 +2438,7 @@
                     strValue) == true)
                 return 1;

-            strError = "ֶ " + strName + "  '" + strValue + "' ޷ƥ '" + strMatchCase + "'";
+            strError = "字段 " + strName + " 内容 '" + strValue + "' 无法匹配 '" + strMatchCase + "'";
             return 0;
         }

@@ -2482,7 +2482,7 @@
             }
             catch (Exception ex)
             {
-                strError = "XML װ DOM ʱ: " + ex.Message;
+                strError = "XML 装入 DOM 时出错: " + ex.Message;
                 return -1;
             }

@@ -2492,7 +2492,7 @@
                 return 0;
             }

-            // ȥ <borrowHistory> ¼Ԫ
+            // 去掉 <borrowHistory> 的下级元素
             XmlNodeList nodes = dom.DocumentElement.SelectNodes("borrowHistory/*");
             foreach (XmlNode node in nodes)
             {
@@ -2503,7 +2503,7 @@
             return 0;
         }

-        // ڵļдķʱϢ
+        // 在调试文件中写入耗费时间信息
         void WriteTimeUsed(DateTime start_time,
             string strPrefix)
         {
@@ -2514,18 +2514,18 @@
             this.WriteDebugInfo(strTiming);
         }

-        #region Borrow()¼
-
-        // APIĴ
-        // Ȩ
-        // text-level: ûʾ OPACҪBorrow()ñ
+        #region Borrow()下级函数
+
+        // 借阅API的从属函数
+        // 检查借阅权限
+        // text-level: 用户提示 OPAC的续借要调用Borrow()函数，进而调用本函数
         // parameters:
-        //      strLibraryCode  ߼¼ڶ߿Ĺݴ
-        //      strAccessParameters ɲĹݲصصбΪ   "*"ʾȫ
+        //      strLibraryCode  读者记录所在读者库的馆代码
+        //      strAccessParameters 许可操作的馆藏地点列表。如果为 空 或者 "*"，表示全部许可
         // return:
-        //      -1  ò
-        //      0   Ȩ޲ĲӦܾ
-        //      1   Ȩ޹
+        //      -1  配置参数错误
+        //      0   权限不够，借阅操作应当被拒绝
+        //      1   权限够
         int CheckBorrowRights(
             Account account,
             Calendar calendar,
@@ -2543,24 +2543,24 @@

             if (StringUtil.IsInList("pauseBorrowing", this.OverdueStyle) == true)
             {
-                /* һѾƶȥˣΪ漰readerdom޸
+                /* 这一段已经移动到本函数外面去做了，因为涉及到对readerdom的修改问题
                 //
-                // ͣ
+                // 处理以停代金功能
                 // return:
                 //      -1  error
-                //      0   readerdomû޸
-                //      1   readerdom޸
+                //      0   readerdom没有修改
+                //      1   readerdom发生了修改
                 nRet = ProcessPauseBorrowing(ref readerdom,
                     "refresh",
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "ˢͣĹз: " + strError;
+                    strError = "在刷新以停代金的过程中发生错误: " + strError;
                     return -1;
                 }
                  * */

-                // Ƿͣ
+                // 是否存在以停代金事项？
                 string strMessage = "";
                 nRet = HasPauseBorrowing(
                     calendar,
@@ -2570,25 +2570,25 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "ڼͣĹз: " + strError;
+                    // text-level: 内部错误
+                    strError = "在计算以停代金的过程中发生错误: " + strError;
                     return -1;
                 }
                 if (nRet == 1)
                 {
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("Ĳܾös"),   // "Ĳܾö{0}"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("借阅操作被拒绝，因该读者s"),   // "借阅操作被拒绝，因该读者{0}"
                         strMessage);

-                    // "Ĳܾö" + strMessage;
+                    // "借阅操作被拒绝，因该读者" + strMessage;
                     return 0;
                 }
             }

-            string strOperName = this.GetString("");
+            string strOperName = this.GetString("借阅");

             if (bRenew == true)
-                strOperName = this.GetString("");
+                strOperName = this.GetString("续借");

             string strRefID = DomUtil.GetElementText(itemdom.DocumentElement,
 "refID");
@@ -2599,44 +2599,44 @@
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
 #if NO
-                // text-level: ڲ
-                strError = "¼вŲΪ";
+                // text-level: 内部错误
+                strError = "册记录中册条码号不能为空";
                 return -1;
 #endif
-                // Ϊգʹ οID
+                // 如果册条码号为空，则使用 参考ID
                 if (String.IsNullOrEmpty(strRefID) == true)
                 {
-                    // text-level: ڲ
-                    strError = "¼вźͲοIDӦͬʱΪ";
+                    // text-level: 内部错误
+                    strError = "册记录中册条码号和参考ID不应同时为空";
                     return -1;
                 }
                 strItemBarcodeParam = "@refID:" + strRefID;
             }

-            // ݲصص
+            // 馆藏地点
             string strLocation = DomUtil.GetElementText(itemdom.DocumentElement, "location");

-            // ȥ#reservation
+            // 去掉#reservation部分
             // StringUtil.RemoveFromInList("#reservation", true, ref strLocation);
             strLocation = StringUtil.GetPureLocationString(strLocation);

-            // ĹݲصصǷ϶ڵĹݲصصǺ
+            // 检查册所属的馆藏地点是否合读者所在的馆藏地点吻合
             string strRoom = "";
             string strCode = "";
             {

-                //
+                // 解析
                 ParseCalendarName(strLocation,
             out strCode,
             out strRoom);
                 if (strCode != strLibraryCode)
                 {
-                    strError = "Ĳܾ¼Ĺݲص '" + strLocation + "' ڶڹݴ '" + strLibraryCode + "' ";
+                    strError = "借阅操作被拒绝。因册记录的馆藏地 '" + strLocation + "' 不属于读者所在馆代码 '" + strLibraryCode + "' ";
                     return 0;
                 }
             }

-            // ݲصб
+            // 检查馆藏地列表
             if (string.IsNullOrEmpty(strAccessParameters) == false && strAccessParameters != "*")
             {
                 bool bFound = false;
@@ -2666,22 +2666,22 @@

                 if (bFound == false)
                 {
-                    strError = "Ĳܾ¼Ĺݲص '" + strLocation + "' ڵǰûȡ涨ĹݲصɷΧ '" + strAccessParameters + "' ֮";
+                    strError = "借阅操作被拒绝。因册记录的馆藏地 '" + strLocation + "' 不在当前用户存取定义规定的馆藏地许可范围 '" + strAccessParameters + "' 之内";
                     return 0;
                 }
             }

             // 2006/12/29
-            // Ƿܹ
+            // 检查册是否能够被借出
             bool bResultValue = false;
             string strMessageText = "";

-            // ִнűItemCanBorrow
+            // 执行脚本函数ItemCanBorrow
             // parameters:
             // return:
             //      -2  not found script
-            //      -1
-            //      0   ɹ
+            //      -1  出错
+            //      0   成功
             nRet = app.DoItemCanBorrowScriptFunction(
                 bRenew,
                 account,
@@ -2691,38 +2691,38 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "ִCanBorrow()űʱ: " + strError;
+                // text-level: 内部错误
+                strError = "执行CanBorrow()脚本函数时出错: " + strError;
                 return -1;
             }
             if (nRet == -2)
             {
-                // ûýű͸ݹݲصص쿴صǷ
+                // 如果没有配置脚本函数，就根据馆藏地点察看地点允许配置来决定是否允许借阅
                 List<string> locations = app.GetLocationTypes(strLibraryCode, true);
                 if (locations.IndexOf(strRoom) == -1)
                 {
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("sĹݲصصΪs涨˲᲻"),  // " {0} ĹݲصصΪ {1}涨(<locationTypes>)˲᲻衣"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("册s的馆藏地点为s，按规定此册不允许外借"),  // "册 {0} 的馆藏地点为 {1}，按规定(<locationTypes>配置)此册不允许外借。"
                         strItemBarcodeParam,
                         strLocation);

-                    // " " + strItemBarcode + " ĹݲصصΪ " + strLocation + "涨(<locationTypes>)˲᲻衣";
+                    // "册 " + strItemBarcode + " 的馆藏地点为 " + strLocation + "，按规定(<locationTypes>配置)此册不允许外借。";
                     return 0;
                 }
             }
             else
             {
-                // ݽűؽ
+                // 根据脚本返回结果
                 if (bResultValue == false)
                 {
-                    strError = string.Format(this.GetString("sΪs״̬Ϊs"),   // " {0}Ϊ {1} ״̬Ϊ {2}"
+                    strError = string.Format(this.GetString("不允许s。因为册s的状态为s"),   // "不允许 {0}。因为册 {1} 的状态为 {2}"
                         strOperName,
                         strItemBarcodeParam,
                         strMessageText);
                     /*
-                    strError = ""
-                        + (bRenew == true ? "" : "")
-                        + "Ϊ " + strItemBarcode + " ״̬Ϊ "+strMessageText;
+                    strError = "不允许"
+                        + (bRenew == true ? "续借" : "外借")
+                        + "。因为册 " + strItemBarcode + " 的状态为 "+strMessageText;
                      * */
                     return 0;
                 }
@@ -2730,7 +2730,7 @@
             }

             //
-            // իļ
+            // 个人书斋的检查
             string strPersonalLibrary = "";
             if (account != null)
                 strPersonalLibrary = account.PersonalLibrary;
@@ -2739,9 +2739,9 @@
             {
                 if (strRoom != "*" && StringUtil.IsInList(strRoom, strPersonalLibrary) == false)
                 {
-                    strError = "ǰû '" + account.Barcode + "' ֻܲݴ '" + strLibraryCode + "' еصΪ '" + strPersonalLibrary + "' ͼ飬ܲصΪ '" + strRoom + "' ͼ";
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("sܾԭs"),  // "{0} ܾԭ: {1}"
+                    strError = "当前用户 '" + account.Barcode + "' 只能操作馆代码 '" + strLibraryCode + "' 中地点为 '" + strPersonalLibrary + "' 的图书，不能操作地点为 '" + strRoom + "' 的图书";
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("s操作被拒绝，原因s"),  // "{0} 操作被拒绝，原因: {1}"
                         strOperName,
                         strError);
                     return 0;
@@ -2750,7 +2750,7 @@

             if (bRenew == false)
             {
-                // ߼¼ǷѾ˶Ӧ<borrow>
+                // 检查读者记录中是否已经有了对应册的<borrow>
                 XmlNode node = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcodeParam + "']");
                 if (node != null)
                 {
@@ -2758,54 +2758,54 @@
                         node = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
                     if (node != null)
                     {
-                        // text-level: ûʾ
+                        // text-level: 用户提示

                         // string strReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement, "barcode");
-                        strError = "Ĳܾ '" + strReaderBarcode + "' Ѿ˲ '" + strItemBarcodeParam + "' (߼¼ѴڶӦ<borrow>Ԫ)";
-                        // strError = "ǰڶ߼¼з־ȻѴڱ߽˲'"+strItemBarcode+"'ֶϢ " + node.OuterXml;
+                        strError = "借阅操作被拒绝。读者 '" + strReaderBarcode + "' 早先已经借阅了册 '" + strItemBarcodeParam + "' 。(读者记录中已存在对应的<borrow>元素)";
+                        // strError = "操作前在读者记录中发现居然已存在表明读者借阅了册'"+strItemBarcode+"'的字段信息 " + node.OuterXml;
                         return -1;
                     }
                 }
             }

-            // ֤ǷڣǷйʧ״̬
+            // 检查借阅证是否超期，是否有挂失等状态
             // return:
-            //      -1  ̷˴Ӧܽ
-            //      0   Խ
-            //      1   ֤ѾʧЧڣܽ
-            //      2   ֤вýĵ״̬
+            //      -1  检测过程发生了错误。应当作不能借阅来处理
+            //      0   可以借阅
+            //      1   证已经过了失效期，不能借阅
+            //      2   证有不让借阅的状态
             nRet = CheckReaderExpireAndState(readerdom,
                 out strError);
             if (nRet != 0)
             {
-                // text-level: ûʾ
-                strError = string.Format(this.GetString("sܾԭs"),  // "{0} ܾԭ: {1}"
+                // text-level: 用户提示
+                strError = string.Format(this.GetString("s操作被拒绝，原因s"),  // "{0} 操作被拒绝，原因: {1}"
                     strOperName,
                     strError);
-                // strOperName + "ܾԭ: " + strError;
+                // strOperName + "操作被拒绝，原因: " + strError;
                 return -1;
             }

-            // ǷѾм˵<overdue>ֶ
+            // 检查是否已经有记载了的<overdue>字段
             XmlNodeList nodes = readerdom.DocumentElement.SelectNodes("overdues/overdue");
             if (nodes.Count > 0)
             {
-                // text-level: ûʾ
-                strError = string.Format(this.GetString("öߵǰsѻΥԼ¼δ"), // "öߵǰ {0} ѻΥԼ¼δ{1}ܾ߾ΥԼ罻ΥԼ𣩣Ȼ󷽿ɽ{2}"
+                // text-level: 用户提示
+                strError = string.Format(this.GetString("该读者当前有s个已还违约记录尚未处理"), // "该读者当前有 {0} 个已还违约记录尚未处理，因此{1}操作被拒绝。请读者尽快办理违约后相关手续（如交纳违约金），然后方可进行{2}。"
                     nodes.Count.ToString(),
                     strOperName,
                     strOperName);
-                // "öߵǰ " + Convert.ToString(nodes.Count) + " ѻΥԼ¼δ" + strOperName + "ܾ߾ΥԼ罻ΥԼ𣩣Ȼ󷽿ɽ" + strOperName + "";
+                // "该读者当前有 " + Convert.ToString(nodes.Count) + " 个已还违约记录尚未处理，因此" + strOperName + "操作被拒绝。请读者尽快办理违约后相关手续（如交纳违约金），然后方可进行" + strOperName + "。";
                 return 0;
             }

             if (this.BorrowCheckOverdue == true)
             {
-                // 鵱ǰǷǱڵĳڲ
+                // 检查当前是否有潜在的超期册
                 // return:
                 //      -1  error
-                //      0   ûгڲ
-                //      1   гڲ
+                //      0   没有超期册
+                //      1   有超期册
                 nRet = CheckOverdue(
                     calendar,
                     readerdom,
@@ -2815,11 +2815,11 @@
                     return -1;
                 if (nRet == 1)
                 {
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("Ϊڣsܾ"),   //  + "{0}{1}ܾ߾콫Щѳڲл"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("因为超期，操作s被拒绝"),   //  + "{0}，因此{1}操作被拒绝。请读者尽快将这些已超期册履行还书手续。"
                         strError,
                         strOperName);
-                    // strError + "" + strOperName + "ܾ߾콫Щѳڲл";
+                    // strError + "，因此" + strOperName + "操作被拒绝。请读者尽快将这些已超期册履行还书手续。";
                     return 0;
                 }
             }
@@ -2829,12 +2829,12 @@
             string strBookState = DomUtil.GetElementText(itemdom.DocumentElement, "state");
             if (String.IsNullOrEmpty(strBookState) == false)
             {
-                // text-level: ûʾ
-                strError = string.Format(this.GetString("sܾΪ״̬Ϊs"),  // "{0}ܾԭ:  '{1}' ״̬Ϊ '{2}'"
+                // text-level: 用户提示
+                strError = string.Format(this.GetString("s操作被拒绝，因为册状态为s"),  // "{0}操作被拒绝，原因: 册 '{1}' 的状态为 '{2}'。"
                     strOperName,
                     strItemBarcodeParam,
                     strBookState);
-                // strOperName + "ܾԭ:  '" + strItemBarcode + "' ״̬Ϊ '"+ strBookState + "'";
+                // strOperName + "操作被拒绝，原因: 册 '" + strItemBarcode + "' 的状态为 '"+ strBookState + "'。";
                 return 0;
             }

@@ -2842,54 +2842,54 @@
             XmlNode nodeParentItem = itemdom.DocumentElement.SelectSingleNode("binding/bindingParent");
             if (nodeParentItem != null)
             {
-                // text-level: ûʾ
-                strError = string.Format(this.GetString("sܾΪ϶Ա᲻ܵ"),  // "{0}ܾԭ: ϶Ա {1} ܵ衣"
+                // text-level: 用户提示
+                strError = string.Format(this.GetString("s操作被拒绝，因为合订成员册不能单独外借"),  // "{0}操作被拒绝，原因: 合订成员册 {1} 不能单独外借。"
                     strOperName,
                     strItemBarcodeParam);
                 return 0;
             }

-            // ҪĵĲϢУҵͼ
+            // 从想要借阅的册信息中，找到图书类型
             string strBookType = DomUtil.GetElementText(itemdom.DocumentElement, "bookType");

-            // ӶϢ, ҵ
+            // 从读者信息中, 找到读者类型
             string strReaderType = DomUtil.GetElementText(readerdom.DocumentElement, "readerType");

-            // ״νҪжϲ
-            // ΪǰĽѾжϹȨˣ˲ж
+            // 首次借阅情况，需要判断册数限制条件
+            // 而续借情况，因为先前的借阅已经判断过相关权限了，因此不必判断了
             if (bRenew == false)
             {
-                // ӶϢУҳöǰѾĹͬͼĲ
+                // 从读者信息中，找出该读者以前已经借阅过的同类图书的册数
                 nodes = readerdom.DocumentElement.SelectNodes("borrows/borrow[@type='" + strBookType + "']");

                 int nThisTypeCount = nodes.Count;

-                // õͼĲ
+                // 得到该类图书的册数限制配置
                 MatchResult matchresult;
                 string strParamValue = "";
                 // return:
-                //      readerbook;ƥ 4
-                //      ֻreaderƥ䣬3
-                //      ֻbookƥ䣬2
-                //      readerbookͶƥ䣬1
+                //      reader和book类型均匹配 算4分
+                //      只有reader类型匹配，算3分
+                //      只有book类型匹配，算2分
+                //      reader和book类型都不匹配，算1分
                 nRet = app.GetLoanParam(
                     //null,
                     strLibraryCode,
                     strReaderType,
                     strBookType,
-                    "ɽ",
+                    "可借册数",
                     out strParamValue,
                     out matchresult,
                     out strError);
                 if (nRet == -1 || nRet < 4)
                 {
-                    // text-level: ûʾ
-                    strError = "ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "' δ ɽ , ˾ܾ" + strOperName + "";
+                    // text-level: 用户提示
+                    strError = "馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 图书类型 '" + strBookType + "' 尚未定义 可借册数 参数, 因此拒绝" + strOperName + "操作";
                     return -1;
                 }

-                // Ǵ񳬹
+                // 看看是此类否超过册数限制
                 int nThisTypeMax = 0;
                 try
                 {
@@ -2897,46 +2897,46 @@
                 }
                 catch
                 {
-                    strError = "ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'  ɽ ֵ '" + strParamValue + "' ʽ, ˾ܾ" + strOperName + "";
+                    strError = "馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 图书类型 '" + strBookType + "' 的 可借册数 参数值 '" + strParamValue + "' 格式有问题, 因此拒绝" + strOperName + "操作";
                     return -1;
                 }

                 if (nThisTypeCount + 1 > nThisTypeMax)
                 {
-                    strError = " '" + strReaderBarcode + "'  '" + strBookType + "' ͼ ݴ '" + strLibraryCode + "'  ö '" + strReaderType + "' Ըͼ '" + strBookType + "'  ɽ ֵ '" + strParamValue + "'˱" + strOperName + "ܾ";
+                    strError = "读者 '" + strReaderBarcode + "' 所借 '" + strBookType + "' 类图书数量将超过 馆代码 '" + strLibraryCode + "' 中 该读者类型 '" + strReaderType + "' 对该图书类型 '" + strBookType + "' 的最多 可借册数 值 '" + strParamValue + "'，因此本次" + strOperName + "操作被拒绝";
                     return 0;
                 }

-                // õöͼܲ
+                // 得到该读者类型针对所有类型图书的总册数限制配置
                 // return:
-                //      readerbook;ƥ 4
-                //      ֻreaderƥ䣬3
-                //      ֻbookƥ䣬2
-                //      readerbookͶƥ䣬1
+                //      reader和book类型均匹配 算4分
+                //      只有reader类型匹配，算3分
+                //      只有book类型匹配，算2分
+                //      reader和book类型都不匹配，算1分
                 nRet = app.GetLoanParam(
                     //null,
                     strLibraryCode,
                     strReaderType,
                     "",
-                    "ɽܲ",
+                    "可借总册数",
                     out strParamValue,
                     out matchresult,
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ûʾ
-                    strError = "ڻȡݴ '" + strLibraryCode + "'   '" + strReaderType + "'  ɽܲ г: "+strError+"˾ܾ" + strOperName + "";
+                    // text-level: 用户提示
+                    strError = "在获取馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 的 可借总册数 参数过程中出错: "+strError+"。因此拒绝" + strOperName + "操作";
                     return -1;
                 }
                 if (nRet < 3)
                 {
-                    // text-level: ûʾ
-                    strError = "ݴ '" + strLibraryCode + "'   '" + strReaderType + "' δ ɽܲ , ˾ܾ" + strOperName + "";
+                    // text-level: 用户提示
+                    strError = "馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 尚未定义 可借总册数 参数, 因此拒绝" + strOperName + "操作";
                     return -1;
                 }

-                // Ȼ󿴿ܲǷѾ
+                // 然后看看总册数是否已经超过限制
                 int nMax = 0;
                 try
                 {
@@ -2944,31 +2944,31 @@
                 }
                 catch
                 {
-                    // text-level: ûʾ
-                    strError = "ݴ '" + strLibraryCode + "'   '" + strReaderType + "'  ɽܲ ֵ '" + strParamValue + "' ʽ, ˾ܾ" + strOperName + "";
+                    // text-level: 用户提示
+                    strError = "馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 的 可借总册数 参数值 '" + strParamValue + "' 格式有问题, 因此拒绝" + strOperName + "操作";
                     return -1;
                 }

-                // ӶϢУҳöѾĹĲ
+                // 从读者信息中，找出该读者已经借阅过的册数
                 nodes = readerdom.DocumentElement.SelectNodes("borrows/borrow");

                 int nCount = nodes.Count;

                 if (nCount + 1 > nMax)
                 {
-                    // text-level: ûʾ
-                    strError = " '" + strReaderBarcode + "'  ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ɽܲ ֵ'" + strParamValue + "'˱" + strOperName + "ܾ";
+                    // text-level: 用户提示
+                    strError = "读者 '" + strReaderBarcode + "' 所借册数将超过 馆代码 '" + strLibraryCode + "' 中 类型 '" + strReaderType + "' 可借总册数 值'" + strParamValue + "'，因此本次" + strOperName + "操作被拒绝";
                     return 0;
                 }
             }

             if (bRenew == false)
             {
-                // ͼܼ۸Ƿ񳬹Ѻ
+                // 检查所借图书的总价格是否超过押金余额
                 // return:
                 //      -1  error
-                //      0   ûг
-                //      1
+                //      0   没有超过
+                //      1   超过
                 nRet = CheckTotalPrice(readerdom,
                     itemdom,
                     out strError);
@@ -2982,7 +2982,7 @@
             return 1;
         }

-        // <foregift borrowStyle="????"/>ֵ(????)
+        // 获得<foregift borrowStyle="????"/>的值(????部分)
         public string GetForegiftBorrowStyle()
         {
             if (this.LibraryCfgDom == null)
@@ -2995,11 +2995,11 @@
             return DomUtil.GetAttr(node, "borrowStyle");
         }

-        // ͼܼ۸Ƿ񳬹Ѻ
+        // 检查所借图书的总价格是否超过押金余额
         // return:
         //      -1  error
-        //      0   ûг
-        //      1
+        //      0   没有超过
+        //      1   超过
         int CheckTotalPrice(XmlDocument readerdom,
             XmlDocument itemdom,
             out string strError)
@@ -3009,14 +3009,14 @@

             string strCfgStyle = GetForegiftBorrowStyle();
             if (StringUtil.IsInList("checkSum", strCfgStyle) == false)
-                return 0;   // ûü۸ܶǷ񳬹ѺĹ
-
-            // öѺ
+                return 0;   // 没有启用检查册价格总额是否超过押金余额的功能
+
+            // 获得读者押金余额
             string strForegift = DomUtil.GetElementText(readerdom.DocumentElement,
                 "foregift");
             if (String.IsNullOrEmpty(strForegift) == true)
             {
-                strError = "ûѺܽ顣Ѻ󣬲ܽ顣";
+                strError = "读者没有押金余额，不能借书。交纳押金后，才能借书。";
                 return -1;
             }

@@ -3026,23 +3026,23 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "ܶѺַ '"+ strForegift + "' Ĺ̷: " + strError;
+                strError = "汇总读者押金余额字符串 '"+ strForegift + "' 的过程发生错误: " + strError;
                 return -1;
             }

             if (foregift_results.Count == 0)
             {
-                strError = "Ѻַ '" + strForegift + "' ܺΪգܽ顣Ѻܽ顣";
+                strError = "读者押金余额字符串 '" + strForegift + "' 经汇总后发现为空，不能借书。交纳押金后才能借书。";
                 return -1;
             }

             if (foregift_results.Count > 1)
             {
-                strError = "Ѻַ '" + strForegift + "' ܺжֻ("+foregift_results.Count.ToString()+")޷۸Ƚϣ˲ܽ顣";
+                strError = "读者押金余额字符串 '" + strForegift + "' 经汇总后发现有多种货币(共"+foregift_results.Count.ToString()+"种)，无法参与册价格比较，因此不能借书。";
                 return -1;
             }

-            // ѾڽĲļ۸
+            // 汇总已经在借的册的价格总数
             List<string> prices = new List<string>();
             XmlNodeList nodes = readerdom.DocumentElement.SelectNodes("borrows/borrow");
             for (int i = 0; i < nodes.Count; i++)
@@ -3059,14 +3059,14 @@
                 prices.Add(strPrice);
             }

-            // ټϼҪһ
+            // 再加上即将要借的一册
             string strThisPrice = DomUtil.GetElementText(itemdom.DocumentElement,
                 "price");
             if (String.IsNullOrEmpty(strThisPrice) == false)
                 prices.Add(strThisPrice);

             if (prices.Count == 0)
-                return 0;   // ûм۸ַҲ޷м
+                return 0;   // 都没有价格字符串，也就无法进行计算了

             List<string> results = null;

@@ -3078,42 +3078,42 @@

             if (results.Count == 0)
             {
-                strError = "TotalPrice()۸ܺȻΪա";
+                strError = "TotalPrice()出错。册价格汇总后居然为空。";
                 return -1;
             }

             if (results.Count > 1)
             {
-                strError = "ö߽ĵͼУ۸ıΪ " + results.Count.ToString() + " ޷򵥼ܼ";
+                strError = "该读者借阅的图书中，其价格的币种为 " + results.Count.ToString() + " 个，无法简单计算出总价";
                 return -1;
             }

-            // Ƚ۸ַ
+            // 比较两个价格字符串
             // return:
-            //      -3  ֲͬ޷ֱӱȽ strError˵
-            //      -2  error strError˵
-            //      -1  strPrice1СstrPrice2
-            //      0
-            //      1   strPrice1strPrice2
+            //      -3  币种不同，无法直接比较 strError中有说明
+            //      -2  error strError中有说明
+            //      -1  strPrice1小于strPrice2
+            //      0   等于
+            //      1   strPrice1大于strPrice2
             nRet = PriceUtil.Compare(foregift_results[0],
                 results[0],
                 out strError);
             if (nRet == -2)
             {
-                strError = "۸ѺбȽϵʱ󣬽Ĳܾ飺" + strError;
+                strError = "将所借册价格和押金余额进行比较的时候发生错误，借阅操作被拒绝。详情：" + strError;
                 return -1;
             }

             if (nRet == -3)
             {
-                strError = "۸Ѻıֲͬ޷м۸Ƚϣ˽Ĳܾ飺" + strError;
+                strError = "所借册价格和押金余额的币种不同，无法进行价格比较，因此借阅操作被拒绝。详情：" + strError;
                 return -1;
             }

             if (nRet == -1)
             {
-                strError = "Ѿĵͼ͵ǰͼĲ۸Ϊ " + results[0] + "Ѻ " + foregift_results[0] + "Ĳܾ";
+                strError = "本读者已经借阅的图书和当前拟借图书的册价格共为 " + results[0] + "，超过读者押金余额 " + foregift_results[0] + "，借阅操作被拒绝。";
                 return 1;
             }

@@ -3121,18 +3121,18 @@
         }

-        // Borrow()¼
-        // Ѿд߼¼ĽϢ
-        // ¼ѾڣǷҪö֤ٲλõĶ߼¼
-        // ΪûнϢĶ߼¼ȷʵܱûƶλá
+        // Borrow()下级函数
+        // 撤销已经写入读者记录的借阅信息
+        // 如果记录已经不存在？是否需要用读者证条码号再查出新位置的读者记录来？
+        // 因为没有借阅信息的读者记录，确实可能被另外的用户移动位置。
         // parameters:
-        //      strReaderRecPath    ߼¼·
-        //      strReaderBarcode    ֤šҪ¼ǷѾ仯ˣʹ飬null
-        //      strItemBarcode  ѾĲ
+        //      strReaderRecPath    读者记录路径
+        //      strReaderBarcode    读者证条码号。若需要检查记录，看看里面条码号是否已经变化了，就使用这个参数。如果不想检查，就用null
+        //      strItemBarcode  已经借的册条码号
         // return:
         //      -1  error
-        //      0   ûбҪUndo
-        //      1   Undoɹ
+        //      0   没有必要Undo
+        //      1   Undo成功
         int UndoBorrowReaderRecord(
             RmsChannel channel,
             string strReaderRecPath,
@@ -3162,7 +3162,7 @@
     out strError);
             if (lRet == -1)
             {
-                strError = "ԭ¼ '" + strReaderRecPath + "' ʱ";
+                strError = "读出原记录 '" + strReaderRecPath + "' 时出错";
                 return -1;
             }

@@ -3172,33 +3172,33 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "װؿж߼¼ '" + strReaderRecPath + "' XML DOMʱ: " + strError;
+                strError = "装载库中读者记录 '" + strReaderRecPath + "' 进入XML DOM时发生错误: " + strError;
                 return -1;
             }

-            // ֶ֤ Ƿ仯
+            // 检查读者证条码号字段 是否发生变化
             if (String.IsNullOrEmpty(strReaderBarcode) == false)
             {
                 string strReaderBarcodeContent = DomUtil.GetElementText(readerdom.DocumentElement,
                     "barcode");
                 if (strReaderBarcode != strReaderBarcodeContent)
                 {
-                    strError = "ִݿжĶ߼¼ '" + strReaderRecPath + "' <barcode>ֶ '" + strReaderBarcodeContent + "' ҪUndoĶ߼¼֤ '" + strReaderBarcode + "' Ѳͬ";
+                    strError = "发现从数据库中读出的读者记录 '" + strReaderRecPath + "' ，其<barcode>字段内容 '" + strReaderBarcodeContent + "' 和要Undo的读者记录证条码号 '" + strReaderBarcode + "' 已不同。";
                     return -1;
                 }
             }

-            // ȥdomбʾĵĽڵ
+            // 去除dom中表示借阅的节点
             XmlNode node = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
             if (node == null)
-                return 0;   // ѾûбҪUndo
+                return 0;   // 已经没有必要Undo了

             node.ParentNode.RemoveChild(node);

             byte[] output_timestamp = null;
             // string strOutputPath = "";

-            // дض߼¼
+            // 写回读者记录
             lRet = channel.DoSaveTextRes(strReaderRecPath,
                 readerdom.OuterXml,
                 false,
@@ -3214,26 +3214,26 @@
                     nRedoCount++;
                     if (nRedoCount > 10)
                     {
-                        strError = "дض߼¼ʱʱͻѾ10ΣԷֹֻͣ";
+                        strError = "写回读者记录的时候发生时间戳冲突，并且已经重试10次，仍发生错误，只好停止重试";
                         return -1;
                     }
                     goto REDO;
                 }

-                strError = "дض߼¼ʱ" + strError;
+                strError = "写回读者记录的时候发生错误" + strError;
                 return -1;
             }

-            return 1;   // UndoѾɹ
+            return 1;   // Undo已经成功
         }

-        // ظŵĲ¼Уѡзϵǰ֤ŵ
+        // 从若干重复条码号的册记录中，选出其中符合当前读者证条码号的
         // parameters:
-        //      bOnlyGetFirstItemXml    ΪtrueaItemXmlֻװƥϵĵһ¼XMLΪ˷ֹڴ
-        //                              Ϊfalseȫƥ¼aItemXml
+        //      bOnlyGetFirstItemXml    如果为true，表明在aItemXml中只装入匹配上的第一个记录的XML。这是为了防止内存崩溃。
+        //                              如果为false，表明全部匹配记录都进入aItemXml
         // return:
-        //      -1
-        //          ѡ
+        //      -1  出错
+        //      其他    选出的数量
         static int FindItem(
             RmsChannel channel,
             string strReaderBarcode,
@@ -3267,7 +3267,7 @@
                 if (lRet == -1)
                     goto ERROR1;

-                // װDOM
+                // 装入DOM
                 XmlDocument dom = new XmlDocument();
                 try
                 {
@@ -3275,11 +3275,11 @@
                 }
                 catch (Exception ex)
                 {
-                    strError = "¼ '" + strPath + "' XMLװDOM: " + ex.Message;
+                    strError = "记录 '" + strPath + "' XML装入DOM出错: " + ex.Message;
                     goto ERROR1;
                 }

-                // <borrower>
+                // 检查<borrower>
                 string strBorrower = DomUtil.GetElementText(dom.DocumentElement,
                     "borrower");
                 if (String.IsNullOrEmpty(strBorrower) == true)
@@ -3288,7 +3288,7 @@
                 if (
                     (String.IsNullOrEmpty(strReaderBarcode) == false
                     && strBorrower == strReaderBarcode)
-                    // ûṩ֤Ǿȡ˽в
+                    // 或者没有提供读者证条码号来鉴别，那就提取出有人借过的所有册
                     || (String.IsNullOrEmpty(strReaderBarcode) == true
                     && String.IsNullOrEmpty(strBorrower) == false)
                     )
@@ -3296,7 +3296,7 @@
                     aFoundPath.Add(strPath);
                     if (bOnlyGetFirstItemXml == true && aItemXml.Count >= 1)
                     {
-                        // Ż
+                        // 被优化掉了
                     }
                     else
                     {
@@ -3315,7 +3315,7 @@
         #endregion

         // 2009/10/27 new add
-        // ö
+        // 获得读者姓名
         // return:
         //      -1  error
         //      0   not found
@@ -3330,7 +3330,7 @@
             strReaderName = "";
             int nRet = 0;

-            // ߼¼
+            // 读入读者记录
             string strReaderXml = "";
             byte[] reader_timestamp = null;
             string strOutputReaderRecPath = "";
@@ -3357,7 +3357,7 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "װض߼¼XML DOMʱ: " + strError;
+                strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                 return -1;
             }

@@ -3370,21 +3370,21 @@
         {
             if (strAction == "return")
             {
-                return "";
+                return "还书";
             }
             else if (strAction == "lost")
             {
-                return "ʧ";
+                return "丢失声明";
             }
             else return strAction;
         }

-        // API:
-        // Ȩޣ  ԱҪreturnȨޣǶʧҪlostȨޣж߾߱Ȩޡ
+        // API: 还书
+        // 权限：  工作人员需要return权限，如果是丢失处理需要lost权限；所有读者均不具备还书操作权限。
         // parameters:
         //      strAction   return/lost
         // return:
-        //      Result.Value    -1   0 ɹ 1 ɹֵòԱгظҪԤԼ
+        //      Result.Value    -1  出错 0 操作成功 1 操作成功，但有值得操作人员留意的情况：如有超期情况；发现条码号重复；需要放入预约架
         public LibraryServerResult Return(
             SessionInfo sessioninfo,
             string strAction,
@@ -3422,68 +3422,68 @@

             string strActionName = GetReturnActionName(strAction);

-            // ի
+            // 个人书斋名
             string strPersonalLibrary = "";
             if (sessioninfo.UserType == "reader"
                 && sessioninfo.Account != null)
                 strPersonalLibrary = sessioninfo.Account.PersonalLibrary;

-            // Ȩж
+            // 权限判断
             if (strAction == "return")
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("return", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = strActionName + "ܾ߱returnȨޡ";
+                    result.ErrorInfo = strActionName + "操作被拒绝。不具备return权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     // return result;
                 }
             }
             else if (strAction == "lost")
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("lost", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = strActionName + " ܾ߱lostȨޡ";
+                    result.ErrorInfo = strActionName + " 操作被拒绝。不具备lost权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     // return result;
                 }
             }
             else
             {
-                strError = "޷ʶ strAction ֵ '"+strAction+"'";
+                strError = "无法识别的 strAction 参数值 '"+strAction+"'。";
                 goto ERROR1;
             }

-            // Զݵĸж
-            // עиիģԼִ
+            // 对读者身份的附加判断
+            // 注：具有个人书斋的，还可以继续向后执行
             if (sessioninfo.UserType == "reader"
                 && string.IsNullOrEmpty(strPersonalLibrary) == true)
             {
                 result.Value = -1;
-                result.ErrorInfo = strActionName + "ܾΪ߲ܽл";
+                result.ErrorInfo = strActionName + "操作被拒绝。作为读者不能进行还书操作。";
                 result.ErrorCode = ErrorCode.AccessDenied;
                 return result;
             }

-            // ûͨȨޣҪԤȡȨ
+            // 如果没有普通的权限，需要预检查存取权限
             LibraryServerResult result_save = null;
             if (result.Value == -1 && String.IsNullOrEmpty(sessioninfo.Access) == false)
             {
                 string strAccessActionList = GetDbOperRights(sessioninfo.Access,
-                        "", // ʱ֪ʵȡõǰʻһʵĴȡ
+                        "", // 此时还不知道实体库名，先取得当前帐户关于任意一个实体库的存取定义
                         "circulation");
                 if (string.IsNullOrEmpty(strAccessActionList) == true)
                     return result;

-                // ͨһ󣬺ȻҪȡȨޡ
-                // УȷĳʵĴȡȨ޴ڣȡȨޣڣͨȨ
+                // 通过了这样一番检查后，后面依然要检查存取权限。
+                // 如果后面检查中，精确针对某个实体库的存取权限存在，则依存取权限；如果不存在，则依普通权限
                 result_save = result.Clone();
             }
             else if (result.Value == -1)
-                return result;  // ӳٱ 2014/9/16
+                return result;  // 延迟报错 2014/9/16

             result = new LibraryServerResult();

@@ -3495,25 +3495,25 @@
             int nRet = 0;
             string strIdcardNumber = "";
             string strQrCode = "";  //
-            bool bDelayVerifyReaderBarcode = false; // Ƿӳ֤
+            bool bDelayVerifyReaderBarcode = false; // 是否延迟验证
             string strLockReaderBarcode = "";

             if (bForce == true)
             {
-                strError = "bForceΪtrue";
+                strError = "bForce参数不能为true";
                 goto ERROR1;
             }

             if (string.IsNullOrEmpty(strReaderBarcode) == false)
             {
                 string strOutputCode = "";
-                // ѶάַתΪ֤
+                // 把二维码字符串转换为读者证条码号
                 // parameters:
-                //      strReaderBcode  [out]֤
+                //      strReaderBcode  [out]读者证条码号
                 // return:
-                //      -1
-                //      0       ַǶ֤Ŷά
-                //      1       ɹ
+                //      -1      出错
+                //      0       所给出的字符串不是读者证号二维码
+                //      1       成功
                 nRet = this.DecodeQrCode(strReaderBarcode,
                     out strOutputCode,
                     out strError);
@@ -3535,7 +3535,7 @@

             if (String.IsNullOrEmpty(strReaderBarcodeParam) == false)
             {
-                // Ӷ߼¼
+                // 加读者记录锁
                 strLockReaderBarcode = strReaderBarcodeParam;
                 this.ReaderLocks.LockForWrite(strReaderBarcodeParam);
                 bReaderLocked = true;
@@ -3549,7 +3549,7 @@
             string strOutputReaderRecPath = "";
             string strLibraryCode = "";

-            try // ߼¼Χ()ʼ
+            try // 读者记录锁定范围(可能)开始
             {
                 List<string> aPath = null;

@@ -3563,32 +3563,32 @@
                     goto ERROR1;
                 }

-                // *** ò¼ ***
-                bool bItemBarcodeDup = false;   // Ƿظ
-                string strDupBarcodeList = "";  // 󷵻ErrorInfoظб
-
-                // ¼ܼ
-                // ߼¼ʱѾ, Ϊ¼
+                // *** 获得册记录 ***
+                bool bItemBarcodeDup = false;   // 是否发生册条码号重复情况
+                string strDupBarcodeList = "";  // 用于最后返回ErrorInfo的重复册条码号列表
+
+                // 册记录可能加锁
+                // 如果读者记录此时已经加锁, 就为册记录加锁
                 if (bReaderLocked == true)
                 {
                     this.EntityLocks.LockForWrite(strItemBarcodeParam);
                     bEntityLocked = true;
                 }

-                try // ¼Χʼ
-                {
-                    WriteTimeUsed(start_time, "Return()ǰڼ ʱ ");
+                try // 册记录锁定范围开始
+                {
+                    WriteTimeUsed(start_time, "Return()中前期检查和锁定 耗时 ");

                     DateTime start_time_read_item = DateTime.Now;

-                    // ѾȷĲ¼·
+                    // 如果已经有确定的册记录路径
                     if (String.IsNullOrEmpty(strConfirmItemRecPath) == false)
                     {
-                        // ·еĿǲʵ
+                        // 检查路径中的库名，是不是实体库名
                         // return:
                         //      -1  error
-                        //      0   ʵ
-                        //      1   ʵ
+                        //      0   不是实体库名
+                        //      1   是实体库名
                         nRet = this.CheckItemRecPath(strConfirmItemRecPath,
                             out strError);
                         if (nRet == -1)
@@ -3609,7 +3609,7 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            strError = "strConfirmItemRecPath '" + strConfirmItemRecPath + "' ò¼ʧ: " + strError;
+                            strError = "根据strConfirmItemRecPath '" + strConfirmItemRecPath + "' 获得册记录失败: " + strError;
                             goto ERROR1;
                         }
                     }
@@ -3617,12 +3617,12 @@
                     {

                         /*
-                        // ò¼
+                        // 获得册记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetItemXml(
                             sessioninfo.Channels,
                             strItemBarcode,
@@ -3632,25 +3632,25 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = " '" + strItemBarcode + "' ";
+                            result.ErrorInfo = "册条码号 '" + strItemBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            strError = "¼ʱ: " + strError;
+                            strError = "读入册记录时发生错误: " + strError;
                             goto ERROR1;
                         }
                          */

-                        // ӲŻò¼
-
-                        // ò¼
+                        // 从册条码号获得册记录
+
+                        // 获得册记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetItemRecXml(
                             sessioninfo.Channels,
                             strItemBarcodeParam,
@@ -3662,13 +3662,13 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = " '" + strItemBarcodeParam + "' ";
+                            result.ErrorInfo = "册条码号 '" + strItemBarcodeParam + "' 不存在";
                             result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            strError = "¼ʱ: " + strError;
+                            strError = "读入册记录时发生错误: " + strError;
                             goto ERROR1;
                         }

@@ -3677,13 +3677,13 @@
                             if (this.Statis != null)
                                 this.Statis.IncreaseEntryValue(
                                 strLibraryCode,
-                                "",
-                                "ظ",
+                                "出纳",
+                                "还书遇册条码号重复次数",
                                 1);

-                            bItemBarcodeDup = true; // ʱѾҪ״̬ȻԽһʶĲ¼
-
-                            // strDupBarcodeList
+                            bItemBarcodeDup = true; // 此时已经需要设置状态。虽然后面可以进一步识别出真正的册记录
+
+                            // 构造strDupBarcodeList
                             /*
                             string[] pathlist = new string[aPath.Count];
                             aPath.CopyTo(pathlist);
@@ -3700,13 +3700,13 @@
                                 if (this.Statis != null)
                                     this.Statis.IncreaseEntryValue(
                                     strLibraryCode,
-                                    "",
-                                    "ظ޶֤Ÿжϴ",
+                                    "出纳",
+                                    "还书遇册条码号重复并无读者证条码号辅助判断次数",
                                     1);

-                                // ûи֤Ų
+                                // 如果没有给出读者证条码号参数
                                 result.Value = -1;
-                                result.ErrorInfo = "Ϊ '" + strItemBarcodeParam + "' ¼ " + aPath.Count.ToString() + " ޷лڸӲ¼·ύ";
+                                result.ErrorInfo = "册条码号为 '" + strItemBarcodeParam + "' 册记录有 " + aPath.Count.ToString() + " 条，无法进行还书操作。请在附加册记录路径后重新提交还书操作。";
                                 result.ErrorCode = ErrorCode.ItemBarcodeDup;

                                 aDupPath = new string[aPath.Count];
@@ -3714,29 +3714,29 @@
                                 return result;
                             }

-                            // ظŵĲ¼Уѡзϵǰ֤ŵ
+                            // 从若干重复条码号的册记录中，选出其中符合当前读者证条码号的
                             // return:
-                            //      -1
-                            //          ѡ
+                            //      -1  出错
+                            //      其他    选出的数量
                             nRet = FindItem(
                                 channel,
                                 strReaderBarcode,
                                 aPath,
-                                true,   // Ż
+                                true,   // 优化
                                 out aFoundPath,
                                 out aItemXml,
                                 out aTimestamp,
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "ѡظŵĲ¼ʱ: " + strError;
+                                strError = "选择重复条码号的册记录时发生错误: " + strError;
                                 goto ERROR1;
                             }

                             if (nRet == 0)
                             {
                                 result.Value = -1;
-                                result.ErrorInfo = " '" + strItemBarcodeParam + "'  " + aPath.Count + " ¼Уûκһ<borrower>Ԫر˱ '" + strReaderBarcode + "' ġ";
+                                result.ErrorInfo = "册条码号 '" + strItemBarcodeParam + "' 检索出的 " + aPath.Count + " 条记录中，没有任何一条其<borrower>元素表明了被读者 '" + strReaderBarcode + "' 借阅。";
                                 result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                                 return result;
                             }
@@ -3746,12 +3746,12 @@
                                 if (this.Statis != null)
                                     this.Statis.IncreaseEntryValue(
                                     strLibraryCode,
-                                    "",
-                                    "ظ֤Ҳ޷ȥش",
+                                    "出纳",
+                                    "借书遇册条码号重复并读者证条码号也无法去重次数",
                                     1);

                                 result.Value = -1;
-                                result.ErrorInfo = "Ϊ '" + strItemBarcodeParam + "' <borrower>ԪرΪ '" + strReaderBarcode + "' ĵĲ¼ " + aFoundPath.Count.ToString() + " ޷лڸӲ¼·ύ";
+                                result.ErrorInfo = "册条码号为 '" + strItemBarcodeParam + "' 并且<borrower>元素表明为读者 '" + strReaderBarcode + "' 借阅的册记录有 " + aFoundPath.Count.ToString() + " 条，无法进行还书操作。请在附加册记录路径后重新提交还书操作。";
                                 result.ErrorCode = ErrorCode.ItemBarcodeDup;
                                 this.WriteErrorLog(result.ErrorInfo);   // 2012/12/30

@@ -3764,11 +3764,11 @@

                             if (this.Statis != null)
                                 this.Statis.IncreaseEntryValue(strLibraryCode,
-                                "",
-                                "ظݶ֤ųɹȥش",
+                                "出纳",
+                                "借书遇册条码号重复但根据读者证条码号成功去重次数",
                                 1);

-                            this.WriteErrorLog(" '" + strItemBarcodeParam + "' ظݶ֤ '" + strReaderBarcode + "' ɹȥ");   // 2012/12/30
+                            this.WriteErrorLog("借书遇册条码号 '" + strItemBarcodeParam + "' 重复但根据读者证条码号 '" + strReaderBarcode + "' 成功去重");   // 2012/12/30

                             strOutputItemRecPath = aFoundPath[0];
                             item_timestamp = aTimestamp[0];
@@ -3782,17 +3782,17 @@
                             if (nRet == 1)
                             {
                                 strOutputItemRecPath = aPath[0];
-                                // strItemXmlѾв¼
+                                // strItemXml已经有册记录了
                             }
                         }

-                        // غ
+                        // 函数返回后有用
                         aDupPath = new string[1];
                         aDupPath[0] = strOutputItemRecPath;
                     }

-                    // ¼ݿ⣬Ƿڲͨʵ֮
+                    // 看看册记录所从属的数据库，是否在参与流通的实体库之列
                     // 2008/6/4 new add
                     bool bItemDbInCirculation = true;
                     string strItemDbName = "";
@@ -3801,17 +3801,17 @@
                         strItemDbName = ResPath.GetDbName(strOutputItemRecPath);
                         if (this.IsItemDbName(strItemDbName, out bItemDbInCirculation) == false)
                         {
-                            strError = "¼· '" + strOutputItemRecPath + "' еݿ '" + strItemDbName + "' Ȼڶʵ֮С";
+                            strError = "册记录路径 '" + strOutputItemRecPath + "' 中的数据库名 '" + strItemDbName + "' 居然不在定义的实体库之列。";
                             goto ERROR1;
                         }
                     }

-                    // ȡȨ
+                    // 检查存取权限
                     string strAccessParameters = "";

                     {

-                        // ȡȨ
+                        // 检查存取权限
                         if (String.IsNullOrEmpty(sessioninfo.Access) == false)
                         {
                             string strAccessActionList = "";
@@ -3821,8 +3821,8 @@
 #if NO
                             if (String.IsNullOrEmpty(strAccessActionList) == true && result_save != null)
                             {
-                                // TODO: Ҳֱӷ result_save
-                                strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ  ĴȡȨ";
+                                // TODO: 也可以直接返回 result_save
+                                strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳 操作的存取权限";
                                 result.Value = -1;
                                 result.ErrorInfo = strError;
                                 result.ErrorCode = ErrorCode.AccessDenied;
@@ -3832,19 +3832,19 @@
                             if (strAccessActionList == null)
                             {
                                 strAccessActionList = GetDbOperRights(sessioninfo.Access,
-            "", // ʱ֪ʵȡõǰʻһʵĴȡ
+            "", // 此时还不知道实体库名，先取得当前帐户关于任意一个实体库的存取定义
             "circulation");
                                 if (strAccessActionList == null)
                                 {
-                                    // ʵⶼûжκδȡȨޣʱҪ˶ʹͨȨ
+                                    // 对所有实体库都没有定义任何存取权限，这时候要退而使用普通权限
                                     strAccessActionList = sessioninfo.Rights;

-                                    // עʵʱ result_save == null ͨȨ޼Ѿͨ˵
+                                    // 注：其实此时 result_save == null 即表明普通权限检查已经通过了的
                                 }
                                 else
                                 {
-                                    // ʵⶨ˴ȡȨޣ strItemDbName ûж
-                                    strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ  ĴȡȨ";
+                                    // 对其他实体库定义了存取权限，但对 strItemDbName 没有定义
+                                    strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳 操作的存取权限";
                                     result.Value = -1;
                                     result.ErrorInfo = strError;
                                     result.ErrorCode = ErrorCode.AccessDenied;
@@ -3855,13 +3855,13 @@

                             if (strAccessActionList == "*")
                             {
-                                // ͨ
+                                // 通配
                             }
                             else
                             {
                                 if (IsInAccessList(strAction, strAccessActionList, out strAccessParameters) == false)
                                 {
-                                    strError = "ǰû '" + sessioninfo.UserID + "' ߱ ݿ '" + strItemDbName + "' ִ   " + strActionName + " ĴȡȨ";
+                                    strError = "当前用户 '" + sessioninfo.UserID + "' 不具备 针对数据库 '" + strItemDbName + "' 执行 出纳  " + strActionName + " 操作的存取权限";
                                     result.Value = -1;
                                     result.ErrorInfo = strError;
                                     result.ErrorCode = ErrorCode.AccessDenied;
@@ -3878,64 +3878,64 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "װز¼ XML DOM ʱ: " + strError;
+                        strError = "装载册记录进入 XML DOM 时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    WriteTimeUsed(start_time_read_item, "Return()жȡ¼ ʱ ");
+                    WriteTimeUsed(start_time_read_item, "Return()中读取册记录 耗时 ");

                     DateTime start_time_lock = DateTime.Now;

-                    // ģʽĿ¼·
+                    // 检查评估模式下书目记录路径
                     if (this.TestMode == true || sessioninfo.TestMode == true)
                     {
                         string strBiblioDbName = "";
-                        // ʵ, ҵӦĿ
+                        // 根据实体库名, 找到对应的书目库名
                         // return:
-                        //      -1
-                        //      0   ûҵ
-                        //      1   ҵ
+                        //      -1  出错
+                        //      0   没有找到
+                        //      1   找到
                         nRet = this.GetBiblioDbNameByItemDbName(strItemDbName,
                             out strBiblioDbName,
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "ʵ '" + strItemDbName + "' Ŀʱ: " + strError;
+                            strError = "根据实体库名 '" + strItemDbName + "' 获得书目库名时出错: " + strError;
                             goto ERROR1;
                         }

                         string strParentID = DomUtil.GetElementText(itemdom.DocumentElement,
     "parent");
-                        // ģʽ
+                        // 检查评估模式
                         // return:
-                        //      -1  ̳
-                        //      0   ͨ
-                        //      1   ͨ
+                        //      -1  检查过程出错
+                        //      0   可以通过
+                        //      1   不允许通过
                         nRet = CheckTestModePath(strBiblioDbName + "/" + strParentID,
                             out strError);
                         if (nRet != 0)
                         {
-                            strError = strActionName + "ܾ: " + strError;
+                            strError = strActionName + "操作被拒绝: " + strError;
                             goto ERROR1;
                         }
                     }

-                    string strOutputReaderBarcode = ""; // صĽ֤
-                    // ڲ¼лý֤
+                    string strOutputReaderBarcode = ""; // 返回的借阅者证条码号
+                    // 在册记录中获得借阅者证条码号
                     // return:
-                    //      -1
-                    //      0   òΪδ״̬
-                    //      1   ɹ
+                    //      -1  出错
+                    //      0   该册为未借出状态
+                    //      1   成功
                     nRet = GetBorrowerBarcode(itemdom,
                         out strOutputReaderBarcode,
                         out strError);
                     if (nRet == -1 || nRet == 0)
                     {
-                        strError = strError + " (¼·Ϊ '" + strOutputItemRecPath + "')";
+                        strError = strError + " (册记录路径为 '" + strOutputItemRecPath + "')";
                         goto ERROR1;
                     }

-                    // ṩ˶֤ţҪʵ
+                    // 如果提供了读者证条码号，则需要核实
                     if (String.IsNullOrEmpty(strReaderBarcodeParam) == false)
                     {
                         if (strOutputReaderBarcode != strReaderBarcodeParam)
@@ -3943,17 +3943,17 @@
 #if NO
                             if (StringUtil.IsIdcardNumber(strReaderBarcodeParam) == true)
                             {
-                                // ʱͺ֤
+                                // 暂时不报错，滞后验证
                                 bDelayVerifyReaderBarcode = true;
                                 strIdcardNumber = strReaderBarcodeParam;
                             }
                             else
                             {
-                                strError = "¼ " + strItemBarcode + " ʵʱ " + strOutputReaderBarcode + " ģǰĶ(֤) " + strReaderBarcodeParam + "";
+                                strError = "册记录表明，册 " + strItemBarcode + " 实际被读者 " + strOutputReaderBarcode + " 所借阅，而不是您当前输入的读者(证条码号) " + strReaderBarcodeParam + "。还书操作被放弃。";
                                 goto ERROR1;
                             }
 #endif
-                            // ʱͺ֤
+                            // 暂时不报错，滞后验证
                             bDelayVerifyReaderBarcode = true;
                             strIdcardNumber = strReaderBarcodeParam;
                         }
@@ -3962,24 +3962,24 @@
                     if (String.IsNullOrEmpty(strReaderBarcode) == true)
                         strReaderBarcode = strOutputReaderBarcode;

-                    // *** ߼¼ǰû,
+                    // *** 如果读者记录在前面没有锁定, 在这里锁定
                     if (bReaderLocked == false)
                     {
-                        // Ӷ߼¼
+                        // 加读者记录锁
                         strLockReaderBarcode = strReaderBarcode;
                         this.ReaderLocks.LockForWrite(strLockReaderBarcode);
                         bReaderLocked = true;
                         strOutputReaderBarcodeParam = strReaderBarcode;
                     }

-                    // *** ¼ǰû
+                    // *** 如果册记录在前面没有锁定，则在这里锁定
                     if (bEntityLocked == false)
                     {
                         this.EntityLocks.LockForWrite(strItemBarcodeParam);
                         bEntityLocked = true;

-                        // Ϊǰڲ¼һֱûмҪ
-                        // ʱȷ¼ûУʵԣı
+                        // 因为前面对于册记录一直没有加锁，所以这里锁定后要
+                        // 检查时间戳，确保记录内容没有（实质性）改变
                         byte[] temp_timestamp = null;
                         string strTempOutputPath = "";
                         string strTempItemXml = "";
@@ -3994,57 +3994,57 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            strError = "(ͺ)ȡ¼ '" + strOutputItemRecPath + "' ʱ: " + strError;
+                            strError = "册条码号(滞后)加锁后重新提取册记录 '" + strOutputItemRecPath + "' 时发生错误: " + strError;
                             goto ERROR1;
                         }

-                        // ʱı
+                        // 如果时间戳发生过改变
                         if (ByteArray.Compare(item_timestamp, temp_timestamp) != 0)
                         {
-                            // װ¼¼DOM
+                            // 装载新记录进入DOM
                             XmlDocument temp_itemdom = null;
                             nRet = LibraryApplication.LoadToDom(strTempItemXml,
                                 out temp_itemdom,
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "װز¼strTempItemXml ·'" + strOutputItemRecPath + "' XML DOMʱ: " + strError;
+                                strError = "装载册记录strTempItemXml 路径'" + strOutputItemRecPath + "' 进入XML DOM时发生错误: " + strError;
                                 goto ERROR1;
                             }

-                            // ¾ɲ¼ҪԸı䣿
+                            // 检查新旧册记录有无要害性改变？
                             if (IsItemRecordSignificantChanged(itemdom,
                                 temp_itemdom) == true)
                             {

-                                // ֻ
+                                // 则只好重做
                                 nRedoCount++;
                                 if (nRedoCount > 10)
                                 {
-                                    strError = "(ͺ)ȡ¼ʱ,ʱͻ,10,ʧ...";
+                                    strError = "册条码号(滞后)加锁后重新提取册记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                     goto ERROR1;
                                 }
                                 /*
-                                // 5Σ޸Ķ֤ŲУȡģȷֵͲͺ
+                                // 如果重做超过5次，则索性修改读者证条码号参数，让它具有（经检索提取的）确定的值，这样就不会滞后加锁了
                                 if (nRedoCount > 5)
                                     strReaderBarcodeParam = strReaderBarcode;
                                  * */
                                 goto REDO_RETURN;
                             }

-                            // ûҪԸı䣬ˢزȻ
+                            // 如果没有要害性改变，就刷新相关参数，然后继续向后进行
                             itemdom = temp_itemdom;
                             item_timestamp = temp_timestamp;
                             strItemXml = strTempItemXml;

                         }

-                        // ʱûзı䣬򲻱ˢκβ
-                    }
-
-                    WriteTimeUsed(start_time_lock, "Return()в ʱ ");
-
-                    // ߼¼
+                        // 如果时间戳没有发生过改变，则不必刷新任何参数
+                    }
+
+                    WriteTimeUsed(start_time_lock, "Return()中补充锁定 耗时 ");
+
+                    // 读入读者记录
                     DateTime start_time_read_reader = DateTime.Now;

                     string strReaderXml = "";
@@ -4059,46 +4059,46 @@
                         out strError);
                     if (nRet == 0)
                     {
-                        // ֤ţ֤̽š;
+                        // 如果是身份证号，则试探检索“身份证号”途径
                         if (StringUtil.IsIdcardNumber(strReaderBarcode) == true)
                         {
                             strIdcardNumber = strReaderBarcode;
                             strReaderBarcode = "";

-                            // ͨض;ö߼¼
+                            // 通过特定检索途径获得读者记录
                             // return:
                             //      -1  error
                             //      0   not found
-                            //      1   1
-                            //      >1  ж1
+                            //      1   命中1条
+                            //      >1  命中多于1条
                             nRet = this.GetReaderRecXmlByFrom(
                                 sessioninfo.Channels,
                                 strIdcardNumber,
-                                "֤",
+                                "身份证号",
                                 out strReaderXml,
                                 out strOutputReaderRecPath,
                                 out reader_timestamp,
                                 out strError);
                             if (nRet == -1)
                             {
-                                // text-level: ڲ
-                                strError = "֤ '" + strIdcardNumber + "' ߼¼ʱ: " + strError;
+                                // text-level: 内部错误
+                                strError = "用身份证号 '" + strIdcardNumber + "' 读入读者记录时发生错误: " + strError;
                                 goto ERROR1;
                             }
                             if (nRet == 0)
                             {
                                 result.Value = -1;
-                                // text-level: ûʾ
-                                result.ErrorInfo = string.Format(this.GetString("֤s"),   // "֤ '{0}' "
+                                // text-level: 用户提示
+                                result.ErrorInfo = string.Format(this.GetString("身份证号s不存在"),   // "身份证号 '{0}' 不存在"
                                     strIdcardNumber);
                                 result.ErrorCode = ErrorCode.IdcardNumberNotFound;
                                 return result;
                             }
                             if (nRet > 1)
                             {
-                                // text-level: ûʾ
+                                // text-level: 用户提示
                                 result.Value = -1;
-                                result.ErrorInfo = "֤ '" + strIdcardNumber + "' ߼¼ " + nRet.ToString() + " ޷֤н軹֤н軹";
+                                result.ErrorInfo = "用身份证号 '" + strIdcardNumber + "' 检索读者记录命中 " + nRet.ToString() + " 条，因此无法用身份证号来进行借还操作。请改用证条码号来进行借还操作。";
                                 result.ErrorCode = ErrorCode.IdcardNumberDup;
                                 return result;
                             }
@@ -4108,7 +4108,7 @@
                         else
                         {
                             // 2013/5/24
-                            // ҪӶ֤ŵȸ;м
+                            // 如果需要，从读者证号等辅助途径进行检索
                             foreach (string strFrom in this.PatronAdditionalFroms)
                             {
                                 nRet = this.GetReaderRecXmlByFrom(
@@ -4122,17 +4122,17 @@
                                     out strError);
                                 if (nRet == -1)
                                 {
-                                    // text-level: ڲ
-                                    strError = "" + strFrom + " '" + strReaderBarcode + "' ߼¼ʱ: " + strError;
+                                    // text-level: 内部错误
+                                    strError = "用" + strFrom + " '" + strReaderBarcode + "' 读入读者记录时发生错误: " + strError;
                                     goto ERROR1;
                                 }
                                 if (nRet == 0)
                                     continue;
                                 if (nRet > 1)
                                 {
-                                    // text-level: ûʾ
+                                    // text-level: 用户提示
                                     result.Value = -1;
-                                    result.ErrorInfo = "" + strFrom + " '" + strReaderBarcode + "' ߼¼ " + nRet.ToString() + " ޷" + strFrom + "н軹֤н軹";
+                                    result.ErrorInfo = "用" + strFrom + " '" + strReaderBarcode + "' 检索读者记录命中 " + nRet.ToString() + " 条，因此无法用" + strFrom + "来进行借还操作。请改用证条码号来进行借还操作。";
                                     result.ErrorCode = ErrorCode.IdcardNumberDup;
                                     return result;
                                 }
@@ -4148,26 +4148,26 @@
                         }

                         result.Value = -1;
-                        result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                        result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                         result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                         return result;
                     }
                     if (nRet == -1)
                     {
-                        strError = "߼¼ʱ: " + strError;
+                        strError = "读入读者记录时发生错误: " + strError;
                         goto ERROR1;
                     }

                     // 2008/6/17 new add
                     if (nRet > 1)
                     {
-                        strError = "߼¼ʱֶ֤ '" + strReaderBarcode + "'  " + nRet.ToString() + " һشϵͳԱ촦";
+                        strError = "读入读者记录时，发现读者证条码号 '" + strReaderBarcode + "' 命中 " + nRet.ToString() + " 条，这是一个严重错误，请系统管理员尽快处理。";
                         goto ERROR1;
                     }

                     SKIP0:

-                    // ߼¼ݿ⣬ǷڲͨĶ߿֮
+                    // 看看读者记录所从属的数据库，是否在参与流通的读者库之列
                     // 2008/6/4 new add
                     bool bReaderDbInCirculation = true;
                     string strReaderDbName = "";
@@ -4175,16 +4175,16 @@
                     {
                         if (this.TestMode == true || sessioninfo.TestMode == true)
                         {
-                            // ģʽ
+                            // 检查评估模式
                             // return:
-                            //      -1  ̳
-                            //      0   ͨ
-                            //      1   ͨ
+                            //      -1  检查过程出错
+                            //      0   可以通过
+                            //      1   不允许通过
                             nRet = CheckTestModePath(strOutputReaderRecPath,
                                 out strError);
                             if (nRet != 0)
                             {
-                                strError = strActionName + "ܾ: " + strError;
+                                strError = strActionName + "操作被拒绝: " + strError;
                                 goto ERROR1;
                             }
                         }
@@ -4194,19 +4194,19 @@
                             out bReaderDbInCirculation,
                             out strLibraryCode) == false)
                         {
-                            strError = "߼¼· '" + strOutputReaderRecPath + "' еݿ '" + strReaderDbName + "' ȻڶĶ߿֮С";
+                            strError = "读者记录路径 '" + strOutputReaderRecPath + "' 中的数据库名 '" + strReaderDbName + "' 居然不在定义的读者库之列。";
                             goto ERROR1;
                         }
                     }

-                    // 㲻ǲͨݿ⣬Ҳû?
-
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 即便不是参与流通的数据库，也让还书?
+
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }

@@ -4216,18 +4216,18 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "װض߼¼XML DOMʱ: " + strError;
+                        strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }
-                    WriteTimeUsed(start_time_read_reader, "Return()жȡ߼¼ ʱ ");
+                    WriteTimeUsed(start_time_read_reader, "Return()中读取读者记录 耗时 ");

                     // string strReaderDbName = ResPath.GetDbName(strOutputReaderRecPath);

-                    // ۲߼¼ǷڲΧ
+                    // 观察读者记录是否在操作范围内
                     // return:
-                    //      -1
-                    //      0
-                    //      1   ȨƣʡstrError ˵ԭ
+                    //      -1  出错
+                    //      0   允许继续访问
+                    //      1   权限限制，不允许继续访问。strError 中有说明原因的文字
                     nRet = CheckReaderRange(sessioninfo,
                         readerdom,
                         strReaderDbName,
@@ -4236,7 +4236,7 @@
                         goto ERROR1;
                     if (nRet == 1)
                     {
-                        // strError = "ǰû '" + sessioninfo.UserID + "' ĴȡȨ޽ֹ(֤Ϊ " + strReaderBarcode + ")ԭ" + strError;
+                        // strError = "当前用户 '" + sessioninfo.UserID + "' 的存取权限禁止操作读者(证条码号为 " + strReaderBarcode + ")。具体原因：" + strError;
                         result.Value = -1;
                         result.ErrorInfo = strError;
                         result.ErrorCode = ErrorCode.AccessDenied;
@@ -4249,7 +4249,7 @@

                     if (bDelayVerifyReaderBarcode == true)
                     {
-                        // ˳֤һ֤
+                        // 顺便验证一下身份证号
                         if (string.IsNullOrEmpty(strIdcardNumber) == false)
                         {
                             Debug.Assert(string.IsNullOrEmpty(strIdcardNumber) == false, "");
@@ -4257,18 +4257,18 @@
                             string strTempIdcardNumber = DomUtil.GetElementText(readerdom.DocumentElement, "idCardNumber");
                             if (strIdcardNumber != strTempIdcardNumber)
                             {
-                                strError = "¼ " + strItemBarcodeParam + " ʵʱ(֤) " + strOutputReaderBarcode + " ģ˶ߵ֤Ϊ " + strTempIdcardNumber + "ǰ(֤)֤ " + strIdcardNumber + "";
+                                strError = "册记录表明，册 " + strItemBarcodeParam + " 实际被读者(证条码号) " + strOutputReaderBarcode + " 所借阅，此读者的身份证号为 " + strTempIdcardNumber + "，不是您当前输入的(验证用)身份证号 " + strIdcardNumber + "。还书操作被放弃。";
                                 goto ERROR1;
                             }
                         }
-                        // »ȡ֤
+                        // 重新获取读者证条码号
                         strReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement, "barcode");
-                        strOutputReaderBarcodeParam = strReaderBarcode; // Ϊ˷ֵ
+                        strOutputReaderBarcodeParam = strReaderBarcode; // 为了返回值

                         {
                             if (strOutputReaderBarcode != strReaderBarcode)
                             {
-                                strError = "¼ " + strItemBarcodeParam + " ʵʱ " + strOutputReaderBarcode + " ģǰƶĶ(֤) " + strReaderBarcodeParam + "";
+                                strError = "册记录表明，册 " + strItemBarcodeParam + " 实际被读者 " + strOutputReaderBarcode + " 所借阅，而不是您当前制定的读者(证条码号) " + strReaderBarcodeParam + "。还书操作被放弃。";
                                 goto ERROR1;
                             }
                         }
@@ -4278,19 +4278,19 @@
                     domOperLog.LoadXml("<root />");
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "libraryCode",
-                        strLibraryCode);    // ڵĹݴ
+                        strLibraryCode);    // 读者所在的馆代码
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operation", "return");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "action", strAction);

-                    // ӶϢ, ҵ
+                    // 从读者信息中, 找到读者类型
                     string strReaderType = DomUtil.GetElementText(readerdom.DocumentElement,
                         "readerType");

-                    // ֤״̬ 2009/1/29 new add
+                    // 证状态 2009/1/29 new add
                     string strReaderState = DomUtil.GetElementText(readerdom.DocumentElement,
                         "state");

-                    //
+                    // 获得相关日历
                     Calendar calendar = null;
                     nRet = GetReaderCalendar(strReaderType,
                         strLibraryCode,
@@ -4302,7 +4302,7 @@
                     string strOperTime = this.Clock.GetClock();
                     string strWarning = "";

-                    // ¼
+                    // 处理册记录
                     string strOverdueString = "";
                     string strLostComment = "";
                     nRet = DoReturnItemXml(
@@ -4312,12 +4312,12 @@
                         strReaderType,
                         strLibraryCode,
                         strAccessParameters,
-                        readerdom,  // Ϊ˵GetLost()ű
+                        readerdom,  // 为了调用GetLost()脚本函数
                         ref itemdom,
                         bForce,
-                        bItemBarcodeDup,  // Զλ򲻼ʵ¼·
+                        bItemBarcodeDup,  // 若条码号足以定位，则不记载实体记录路径
                         strOutputItemRecPath,
-                        sessioninfo.UserID, //
+                        sessioninfo.UserID, // 还书操作者
                         strOperTime,
                         out strOverdueString,
                         out strLostComment,
@@ -4337,13 +4337,13 @@

                     string strItemBarcode = DomUtil.GetElementText(itemdom.DocumentElement, "barcode");

-                    // ־¼
+                    // 创建日志记录
                     DomUtil.SetElementText(domOperLog.DocumentElement, "itemBarcode",
                         string.IsNullOrEmpty(strItemBarcode) == false ? strItemBarcode : strItemBarcodeParam);
-                    /* д<overdues>
+                    /* 后面会写入<overdues>
                     if (nRet == 1)
                     {
-                        // гںͻʧϢ
+                        // 如果有超期和或丢失处理信息
                         DomUtil.SetElementText(domOperLog.DocumentElement, "overdueString",
                         strOverdueString);
                     }
@@ -4359,7 +4359,7 @@
                     }

-                    // ߼¼
+                    // 处理读者记录
                     // string strNewReaderXml = "";
                     string strDeletedBorrowFrag = "";
                     nRet = DoReturnReaderXml(
@@ -4368,15 +4368,15 @@
                         strItemBarcodeParam,
                         strItemBarcode,
                         strOverdueString,
-                        sessioninfo.UserID, //
+                        sessioninfo.UserID, // 还书操作者
                         strOperTime,
-                        sessioninfo.ClientAddress,  // ǰ˴
+                        sessioninfo.ClientAddress,  // 前端触发
                         out strDeletedBorrowFrag,
                         out strError);
                     if (nRet == -1)
                         goto ERROR1;

-                    // ־¼
+                    // 创建日志记录
                     Debug.Assert(string.IsNullOrEmpty(strReaderBarcode) == false, "");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "readerBarcode",
                         strReaderBarcode);
@@ -4385,19 +4385,19 @@
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
                         strOperTime);

-                    WriteTimeUsed(start_time_process, "Return()ниݴ ʱ ");
-
-
-                    // ԭxmlhtmlʽĴڴ
+                    WriteTimeUsed(start_time_process, "Return()中进行各种数据处理 耗时 ");
+
+
+                    // 原来创建输出xml或html格式的代码在此

                     DateTime start_time_reservation_check = DateTime.Now;

-                    // 쿴ԤԼ, г
-                    // ΪʧҪ֪ͨȴߣѾʧˣٵȴ
+                    // 察看本册预约情况, 并进行初步处理
+                    // 如果为丢失处理，需要通知等待者，书已经丢失了，不用再等待
                     // return:
                     //      -1  error
-                    //      0   û޸
-                    //      1   й޸
+                    //      0   没有修改
+                    //      1   进行过修改
                     nRet = DoItemReturnReservationCheck(
                         (strAction == "lost") ? true : false,
                         ref itemdom,
@@ -4408,23 +4408,23 @@

                     if (nRet == 1 && return_info != null)
                     {
-                        // <location>Ԫп #reservation
+                        // <location>元素中可能增加了 #reservation 部分
                         return_info.Location = DomUtil.GetElementText(itemdom.DocumentElement,
                             "location");
                     }

-                    WriteTimeUsed(start_time_reservation_check, "Return()нԤԼ ʱ ");
+                    WriteTimeUsed(start_time_reservation_check, "Return()中进行预约检查 耗时 ");

                     /*
-                    bool bFoundReservation = false; // Ƿ񱾴λΪԤԼ֮
+                    bool bFoundReservation = false; // 是否本次还书的为已预约之册

                     if (nRet == 1)
                         bFoundReservation = true;
                      * */

-                    // дضߡ¼
+                    // 写回读者、册记录
                     // byte[] timestamp = null;
                     byte[] output_timestamp = null;
                     string strOutputPath = "";
@@ -4454,7 +4454,7 @@
                             nRedoCount++;
                             if (nRedoCount > 10)
                             {
-                                strError = "дض߼¼ʱ,ʱͻ,10,ʧ...";
+                                strError = "写回读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                 goto ERROR1;
                             }
                             goto REDO_RETURN;
@@ -4465,7 +4465,7 @@

                     reader_timestamp = output_timestamp;

-                    WriteTimeUsed(start_time_write_reader, "Return()дض߼¼ ʱ ");
+                    WriteTimeUsed(start_time_write_reader, "Return()中写回读者记录 耗时 ");

                     DateTime start_time_write_item = DateTime.Now;

@@ -4479,7 +4479,7 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        // ҪUndoղŶԶ߼¼д
+                        // 要Undo刚才对读者记录的写入
                         string strError1 = "";
                         lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                             strReaderXml,
@@ -4493,12 +4493,12 @@
                         {
                             if (channel.ErrorCode == ChannelErrorCode.TimestampMismatch)
                             {
-                                // ߼¼Undoʱ, ʱͻ
-                                // ʱҪִ¼, ͼӻظɾ<borrows><borrow>Ԫ
+                                // 读者记录Undo的时候, 发现时间戳冲突了
+                                // 这时需要读出现存记录, 试图增加回刚删除的<borrows><borrow>元素
                                 // return:
                                 //      -1  error
-                                //      0   ûбҪUndo
-                                //      1   Undoɹ
+                                //      0   没有必要Undo
+                                //      1   Undo成功
                                 nRet = UndoReturnReaderRecord(
                                     channel,
                                     strOutputReaderRecPath,
@@ -4509,57 +4509,57 @@
                                     out strError);
                                 if (nRet == -1)
                                 {
-                                    strError = "Undo߼¼ '" + strOutputReaderRecPath + "' (֤Ϊ '" + strReaderBarcode + "' Ϊ '"+strReaderName+"')  '" + strItemBarcodeParam + "' ޸ʱ޷Undo: " + strError;
+                                    strError = "Undo读者记录 '" + strOutputReaderRecPath + "' (读者证条码号为 '" + strReaderBarcode + "' 读者姓名为 '"+strReaderName+"') 还书册条码号 '" + strItemBarcodeParam + "' 的修改时，发生错误，无法Undo: " + strError;
                                     this.WriteErrorLog(strError);
                                     goto ERROR1;
                                 }

-                                // ɹ
+                                // 成功
                                 goto REDO_RETURN;
                             }

-                            // Ϊ ʱͻ
-                            strError = "Undo߼¼ '" + strOutputReaderRecPath + "' (֤Ϊ '" + strReaderBarcode + "' Ϊ '"+strReaderName+"')  '" + strItemBarcodeParam + "' ޸ʱ޷Undo: " + strError;
-                            // strError = strError + ", Undoдؾɶ߼¼Ҳʧ: " + strError1;
+                            // 以下为 不是时间戳冲突的其他错误情形
+                            strError = "Undo读者记录 '" + strOutputReaderRecPath + "' (读者证条码号为 '" + strReaderBarcode + "' 读者姓名为 '"+strReaderName+"') 还书册条码号 '" + strItemBarcodeParam + "' 的修改时，发生错误，无法Undo: " + strError;
+                            // strError = strError + ", 并且Undo写回旧读者记录也失败: " + strError1;
                             this.WriteErrorLog(strError);
                             goto ERROR1;
                         }

-                        // ΪUndoɹ
+                        // 以下为Undo成功的情形
                         goto REDO_RETURN;
                     }

-                    WriteTimeUsed(start_time_write_item, "Return()дز¼ ʱ ");
+                    WriteTimeUsed(start_time_write_item, "Return()中写回册记录 耗时 ");

                     DateTime start_time_write_operlog = DateTime.Now;

-                    // д־
-
-                    // overdueϢ
+                    // 写入日志
+
+                    // overdue信息
                     if (String.IsNullOrEmpty(strOverdueString) == false)
                     {
                         DomUtil.SetElementText(domOperLog.DocumentElement,
                             "overdues", strOverdueString);
                     }

-                    // ȷϲ·
+                    // 确认册路径
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "confirmItemRecPath", strConfirmItemRecPath);

                     if (string.IsNullOrEmpty(strIdcardNumber) == false)
                     {
-                        // ʹ֤ɻ
+                        // 表明是使用身份证号来完成还书操作的
                         DomUtil.SetElementText(domOperLog.DocumentElement,
         "idcardNumber", strIdcardNumber);
                     }

-                    // д߼¼
+                    // 写入读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "readerRecord", readerdom.OuterXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);

-                    // д¼
+                    // 写入册记录
                     node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "itemRecord", itemdom.OuterXml);
                     DomUtil.SetAttr(node, "recPath", strOutputItemRecPath);
@@ -4576,23 +4576,23 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "Return() API д־ʱ: " + strError;
+                        strError = "Return() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    WriteTimeUsed(start_time_write_operlog, "Return()д־ ʱ ");
+                    WriteTimeUsed(start_time_write_operlog, "Return()中写操作日志 耗时 ");

                     DateTime start_time_write_statis = DateTime.Now;

-                    // дͳָ
+                    // 写入统计指标
 #if NO
                     if (this.m_strLastReaderBarcode != strReaderBarcode)
                     {
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(strLibraryCode,
-                            "",
-                            "",
+                            "出纳",
+                            "读者数",
                             1);
                         this.m_strLastReaderBarcode = strReaderBarcode;
                     }
@@ -4603,27 +4603,27 @@

                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(strLibraryCode,
-                        "",
-                        "",
+                        "出纳",
+                        "还册",
                         1);

                     if (strAction == "lost")
                     {
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(strLibraryCode,
-                            "",
-                            "ʧ",
+                            "出纳",
+                            "声明丢失",
                             1);
                     }
-                    WriteTimeUsed(start_time_write_statis, "Return()дͳָ ʱ ");
-
-                    result.ErrorInfo = strActionName + "ɹ" + result.ErrorInfo;  // 2013/11/13
+                    WriteTimeUsed(start_time_write_statis, "Return()中写统计指标 耗时 ");
+
+                    result.ErrorInfo = strActionName + "操作成功。" + result.ErrorInfo;  // 2013/11/13

                     if (bReaderDbInCirculation == false)
                     {
                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
                             result.ErrorInfo += "\r\n";
-                        result.ErrorInfo += "֤ '" + strReaderBarcode + "' ڵĶ߼¼ '" + strOutputReaderRecPath + "' ݿ '" + strReaderDbName + "' δͨĶ߿⡣";
+                        result.ErrorInfo += "读者证条码号 '" + strReaderBarcode + "' 所在的读者记录 '" + strOutputReaderRecPath + "' 其数据库 '" + strReaderDbName + "' 属于未参与流通的读者库。";
                         result.Value = 1;
                     }

@@ -4631,7 +4631,7 @@
                     {
                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
                             result.ErrorInfo += "\r\n";
-                        result.ErrorInfo += " '" + strItemBarcodeParam + "' ڵĲ¼ '" + strOutputItemRecPath + "' ݿ '" + strReaderDbName + "' δͨʵ⡣";
+                        result.ErrorInfo += "册条码号 '" + strItemBarcodeParam + "' 所在的册记录 '" + strOutputItemRecPath + "' 其数据库 '" + strReaderDbName + "' 属于未参与流通的实体库。";
                         result.Value = 1;
                     }

@@ -4639,8 +4639,8 @@
                     {
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(strLibraryCode,
-                            "",
-                            "ڲ",
+                            "出纳",
+                            "还超期册",
                             1);

                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
@@ -4655,14 +4655,14 @@
                     {
                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
                             result.ErrorInfo += "\r\n";
-                        result.ErrorInfo += "******: "+strActionName+"зв¼ǵĲŷظ: " + strDupBarcodeList + "֪ͨϵͳԱݴ";
+                        result.ErrorInfo += "***警告***: "+strActionName+"操作过程中发现下列册记录它们的册条码号发生了重复: " + strDupBarcodeList + "。请通知系统管理员纠正此数据错误。";
                         result.Value = 1;
                     }

                     if (String.IsNullOrEmpty(strReservationReaderBarcode) == false // 2009/10/19 changed  //bFoundReservation == true
                         && strAction != "lost")
                     {
-                        // ΪʾϢгֶԻȡ
+                        // 为了提示信息中出现读者姓名，这里特以获取读者姓名
                         string strReservationReaderName = "";

                         if (strReaderBarcode == strReservationReaderBarcode)
@@ -4671,7 +4671,7 @@
                         {
                             DateTime start_time_getname = DateTime.Now;

-                            // ö
+                            // 获得读者姓名
                             // return:
                             //      -1  error
                             //      0   not found
@@ -4682,23 +4682,23 @@
                                 out strReservationReaderName,
                                 out strError);

-                            WriteTimeUsed(start_time_getname, "Return()лԤԼߵ ʱ ");
+                            WriteTimeUsed(start_time_getname, "Return()中获得预约者的姓名 耗时 ");
                         }

                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
                             result.ErrorInfo += "\r\n";
-                        result.ErrorInfo += "򱾲ͼѱ " + strReservationReaderBarcode + " "
-                            + strReservationReaderName + " ԤԼԤԼܡ";    // 2009/10/10 changed
+                        result.ErrorInfo += "因本册图书已被读者 " + strReservationReaderBarcode + " "
+                            + strReservationReaderName + " 预约，请放入预约保留架。";    // 2009/10/10 changed
                         result.Value = 1;
                     }

-                    // ֤״̬Ϊµʾ
+                    // 读者证状态不为空情况下的提示
                     // 2008/1/29 new add
                     if (String.IsNullOrEmpty(strReaderState) == false)
                     {
                         if (String.IsNullOrEmpty(result.ErrorInfo) == false)
                             result.ErrorInfo += "\r\n";
-                        result.ErrorInfo += "******: ǰ֤״̬Ϊ: " + strReaderState + "עк";
+                        result.ErrorInfo += "***警告***: 当前读者证状态为: " + strReaderState + "。请注意进行后续处理。";
                         result.Value = 1;
                     }

@@ -4706,68 +4706,68 @@
                     strOutputReaderXml = readerdom.OuterXml;
                     strBiblioRecID = DomUtil.GetElementText(itemdom.DocumentElement, "parent"); //

-                } // ¼Χ
+                } // 册记录锁定范围结束
                 finally
                 {
-                    // ¼
+                    // 册记录解锁
                     if (bEntityLocked == true)
                         this.EntityLocks.UnlockForWrite(strItemBarcodeParam);
                 }

-            } // ߼¼Χ
+            } // 读者记录锁定范围结束
             finally
             {
                 if (bReaderLocked == true)
                     this.ReaderLocks.UnlockForWrite(strLockReaderBarcode);
             }

-            // TODO: ԸĽΪʧʱԤԼҲ֪֪ͨͨҪ߲ٵȴˡ
+            // TODO: 将来可以改进为，丢失时发现有人预约，也通知，不过通知的内容是要读者不再等待了。
             if (String.IsNullOrEmpty(strReservationReaderBarcode) == false
                 && strAction != "lost")
             {
-                List<string> DeletedNotifyRecPaths = null;  // ɾ֪ͨ¼á
-                // ֪ͨԤԼĲ
-                // ڶԶ߿ı, ˴˺
+                List<string> DeletedNotifyRecPaths = null;  // 被删除的通知记录。不用。
+                // 通知预约到书的操作
+                // 出于对读者库加锁方面的便利考虑, 单独做了此函数
                 // return:
                 //      -1  error
-                //      0   ûҵ<request>Ԫ
+                //      0   没有找到<request>元素
                 nRet = DoReservationNotify(
                     sessioninfo.Channels,
                     strReservationReaderBarcode,
-                    true,   // Ҫڼ
+                    true,   // 需要函数内加锁
                     strItemBarcodeParam,
-                    false,  // ڴ
-                    false,  // Ҫ޸ĵǰ¼ΪǰѾ޸Ĺ
+                    false,  // 不在大架
+                    false,  // 不需要再修改当前册记录，因为前面已经修改过了
                     out DeletedNotifyRecPaths,
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "Ѿɹ, ԤԼ֪ͨʧ, ԭ: " + strError;
+                    strError = "还书操作已经成功, 但是预约到书通知功能失败, 原因: " + strError;
                     goto ERROR1;
                 }
                 /*
                             if (this.Statis != null)
                 this.Statis.IncreaseEntryValue(strLibraryCode,
-                    "",
-                    "ԤԼ",
+                    "出纳",
+                    "预约到书册",
                     1);
                  * */

-                /* ǰѾ֪ͨ
+                /* 前面已经通知过了
                 result.Value = 1;
                 result.ErrorCode = ErrorCode.ReturnReservation;
                 if (result.ErrorInfo != "")
                     result.ErrorInfo += "\r\n";

-                result.ErrorInfo += "ɹ˲ͼ鱻 " + strReservationReaderBarcode + " ԤԼԤԼܡ";
+                result.ErrorInfo += "还书操作成功。因此册图书被读者 " + strReservationReaderBarcode + " 预约，请放入预约保留架。";
                  * */

-                // óںͱ״̬Բ?
-            }
-
-            //
-            // ݲַڶⷶΧΪ˾ʱ䣬߲Ч
+                // 最好超期和保留两种状态码可以并存?
+            }
+
+            // 输出数据
+            // 把输出数据部分放在读者锁以外范围，是为了尽量减少锁定的时间，提高并发运行效率
             if (String.IsNullOrEmpty(strOutputReaderXml) == false
                 && StringUtil.IsInList("reader", strStyle) == true)
             {
@@ -4778,7 +4778,7 @@
                     {
                         string strReaderFormat = reader_formats[i];

-                        // ߼¼ݴXMLʽתΪHTMLʽ
+                        // 将读者记录数据从XML格式转换为HTML格式
                         // if (String.Compare(strReaderFormat, "html", true) == 0)
                         if (IsResultType(strReaderFormat, "html") == true)
                         {
@@ -4798,12 +4798,12 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }
                             reader_records[i] = strReaderRecord;
                         }
-                        // ߼¼ݴXMLʽתΪtextʽ
+                        // 将读者记录数据从XML格式转换为text格式
                         // else if (String.Compare(strReaderFormat, "text", true) == 0)
                         else if (IsResultType(strReaderFormat, "text") == true)
                         {
@@ -4823,7 +4823,7 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }
                             reader_records[i] = strReaderRecord;
@@ -4839,7 +4839,7 @@
                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }
                             reader_records[i] = strResultXml;
@@ -4854,16 +4854,16 @@
                             }
                             catch (Exception ex)
                             {
-                                strError = " XML װ DOM : " + ex.Message;
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "读者 XML 装入 DOM 出错: " + ex.Message;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }
                             reader_records[i] = DomUtil.GetElementText(dom.DocumentElement, "name");
                         }
                         else
                         {
-                            strError = "strReaderFormatList˲ֵ֧ݸʽ '" + strReaderFormat + "'";
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "strReaderFormatList参数出现了不支持的数据格式类型 '" + strReaderFormat + "'";
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }
                     } // end of for
@@ -4881,7 +4881,7 @@
                 {
                     string strItemFormat = item_formats[i];

-                    // ¼ݴXMLʽתΪHTMLʽ
+                    // 将册记录数据从XML格式转换为HTML格式
                     // if (String.Compare(strItemFormat, "html", true) == 0)
                     if (IsResultType(strItemFormat, "html") == true)
                     {
@@ -4895,12 +4895,12 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }
                         item_records[i] = strItemRecord;
                     }
-                    // ¼ݴXMLʽתΪtextʽ
+                    // 将册记录数据从XML格式转换为text格式
                     // else if (String.Compare(strItemFormat, "text", true) == 0)
                     else if (IsResultType(strItemFormat, "text") == true)
                     {
@@ -4914,7 +4914,7 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }
                         item_records[i] = strItemRecord;
@@ -4930,15 +4930,15 @@
             out strError);
                         if (nRet == -1)
                         {
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }
                         item_records[i] = strResultXml;
                     }
                     else
                     {
-                        strError = "strItemFormatList˲ֵ֧ݸʽ '" + strItemFormat + "'";
-                        strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                        strError = "strItemFormatList参数出现了不支持的数据格式类型 '" + strItemFormat + "'";
+                        strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                         goto ERROR1;
                     }
                 } // end of for
@@ -4949,19 +4949,19 @@
             {
                 if (String.IsNullOrEmpty(strBiblioRecID) == true)
                 {
-                    strError = "¼XML<parent>ԪȱֵΪ, ޷λּ¼ID";
-                    strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                    strError = "册记录XML中<parent>元素缺乏或者值为空, 因此无法定位种记录ID";
+                    strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                     goto ERROR1;
                 }

                 string strItemDbName = ResPath.GetDbName(strOutputItemRecPath);

                 string strBiblioDbName = "";
-                // ʵ, ҵӦĿ
+                // 根据实体库名, 找到对应的书目库名
                 // return:
-                //      -1
-                //      0   ûҵ
-                //      1   ҵ
+                //      -1  出错
+                //      0   没有找到
+                //      1   找到
                 nRet = this.GetBiblioDbNameByItemDbName(strItemDbName,
                     out strBiblioDbName,
                     out strError);
@@ -4969,8 +4969,8 @@
                     goto ERROR1;
                 if (nRet == 0)
                 {
-                    strError = "ʵ '" + strItemDbName + "' ûҵӦĿ";
-                    strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                    strError = "实体库名 '" + strItemDbName + "' 没有找到对应的书目库名";
+                    strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                     goto ERROR1;
                 }

@@ -4980,7 +4980,7 @@
                 biblio_records = new string[biblio_formats.Length];

                 string strBiblioXml = "";
-                // html xml text֮һŻȡstrBiblioXml
+                // 至少有html xml text之一，才获取strBiblioXml
                 if (StringUtil.IsInList("html", strBiblioFormatList) == true
                     || StringUtil.IsInList("xml", strBiblioFormatList) == true
                     || StringUtil.IsInList("text", strBiblioFormatList) == true)
@@ -4989,7 +4989,7 @@
                     if (channel == null)
                     {
                         strError = "get channel error";
-                        strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                        strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                         goto ERROR1;
                     }

@@ -5004,8 +5004,8 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        strError = "ּ¼ '" + strBiblioRecPath + "' ʱ: " + strError;
-                        strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                        strError = "获得种记录 '" + strBiblioRecPath + "' 时出错: " + strError;
+                        strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                         goto ERROR1;
                     }
                 }
@@ -5014,14 +5014,14 @@
                 {
                     string strBiblioFormat = biblio_formats[i];

-                    // Ҫںӳļ
+                    // 需要从内核映射过来文件
                     string strLocalPath = "";
                     string strBiblio = "";

-                    // Ŀ¼ݴXMLʽתΪHTMLʽ
+                    // 将书目记录数据从XML格式转换为HTML格式
                     if (String.Compare(strBiblioFormat, "html", true) == 0)
                     {
-                        // TODO: cache
+                        // TODO: 可以cache
                         nRet = this.MapKernelScriptFile(
                             sessioninfo,
                             strBiblioDbName,
@@ -5030,11 +5030,11 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }

-                        // ּ¼ݴXMLʽתΪHTMLʽ
+                        // 将种记录数据从XML格式转换为HTML格式
                         string strFilterFileName = strLocalPath;    // app.CfgDir + "\\biblio.fltx";

                         if (string.IsNullOrEmpty(strBiblioXml) == false)
@@ -5048,7 +5048,7 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }

@@ -5058,10 +5058,10 @@

                         biblio_records[i] = strBiblio;
                     }
-                    // ¼ݴXMLʽתΪtextʽ
+                    // 将册记录数据从XML格式转换为text格式
                     else if (String.Compare(strBiblioFormat, "text", true) == 0)
                     {
-                        // TODO: cache
+                        // TODO: 可以cache
                         nRet = this.MapKernelScriptFile(
                             sessioninfo,
                             strBiblioDbName,
@@ -5070,10 +5070,10 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                            strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                             goto ERROR1;
                         }
-                        // ּ¼ݴXMLʽתΪTEXTʽ
+                        // 将种记录数据从XML格式转换为TEXT格式
                         string strFilterFileName = strLocalPath;    // app.CfgDir + "\\biblio.fltx";
                         if (string.IsNullOrEmpty(strBiblioXml) == false)
                         {
@@ -5086,7 +5086,7 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                                strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                                 goto ERROR1;
                             }

@@ -5110,16 +5110,16 @@
                     }
                     else
                     {
-                        strError = "strBiblioFormatList˲ֵ֧ݸʽ '" + strBiblioFormat + "'";
-                        strError = "Ȼд󣬵ǻѾɹ: " + strError;
+                        strError = "strBiblioFormatList参数出现了不支持的数据格式类型 '" + strBiblioFormat + "'";
+                        strError = "虽然出现了下列错误，但是还书操作已经成功: " + strError;
                         goto ERROR1;
                     }
                 } // end of for
             }

-            this.WriteTimeUsed(start_time, "Return() ʱ ");
-            // result.Valueֵǰܱó1
+            this.WriteTimeUsed(start_time, "Return() 耗时 ");
+            // result.Value值在前面可能被设置成1
             return result;
         ERROR1:
             result.Value = -1;
@@ -5128,10 +5128,10 @@
             return result;
         }

-        #region Return()¼
-
-        // ¾ɲ¼ǷʵԸı
-        // νʵԸı䣬<barcode><borrower>ֶεݷ˱仯
+        #region Return()下级函数
+
+        // 看看新旧册记录是否有实质性改变
+        // 所谓实质性改变，就是<barcode>和<borrower>两个字段的内容发生了变化
         static bool IsItemRecordSignificantChanged(XmlDocument domOld,
             XmlDocument domNew)
         {
@@ -5154,17 +5154,17 @@
             return false;
         }

-        // Զ߼¼ĽϢɾ()
+        // 撤销对读者记录的借阅信息删除操作(撤销还书)
         // parameters:
-        //      strReaderRecPath    ߼¼·
-        //      strReaderBarcode    ֤šҪ¼ǷѾ仯ˣʹ飬null
-        //      strItemBarcode  ѾĲ
-        //      strDeleteBorrowFrag ɾ<borrow>ԪƬ
-        //      strAddedOverdueFrag Ѿ<overdue>ԪƬ
+        //      strReaderRecPath    读者记录路径
+        //      strReaderBarcode    读者证条码号。若需要检查记录，看看里面条码号是否已经变化了，就使用这个参数。如果不想检查，就用null
+        //      strItemBarcode  已经借的册条码号
+        //      strDeleteBorrowFrag 被删除掉的<borrow>元素片断
+        //      strAddedOverdueFrag 已经加入的<overdue>元素片断
         // return:
         //      -1  error
-        //      0   ûбҪUndo
-        //      1   Undoɹ
+        //      0   没有必要Undo
+        //      1   Undo成功
         int UndoReturnReaderRecord(
             RmsChannel channel,
             string strReaderRecPath,
@@ -5196,7 +5196,7 @@
     out strError);
             if (lRet == -1)
             {
-                strError = "ԭ¼ '" + strReaderRecPath + "' ʱ";
+                strError = "读出原记录 '" + strReaderRecPath + "' 时出错";
                 return -1;
             }

@@ -5206,29 +5206,29 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "װؿж߼¼ '" + strReaderRecPath + "' XML DOMʱ: " + strError;
+                strError = "装载库中读者记录 '" + strReaderRecPath + "' 进入XML DOM时发生错误: " + strError;
                 return -1;
             }

-            // ֶ֤ Ƿ仯
+            // 检查读者证条码号字段 是否发生变化
             if (String.IsNullOrEmpty(strReaderBarcode) == false)
             {
                 string strReaderBarcodeContent = DomUtil.GetElementText(readerdom.DocumentElement,
                     "barcode");
                 if (strReaderBarcode != strReaderBarcodeContent)
                 {
-                    strError = "ִݿжĶ߼¼ '" + strReaderRecPath + "' <barcode>ֶ '" + strReaderBarcodeContent + "' ҪUndoĶ߼¼֤ '" + strReaderBarcode + "' Ѳͬ";
+                    strError = "发现从数据库中读出的读者记录 '" + strReaderRecPath + "' ，其<barcode>字段内容 '" + strReaderBarcodeContent + "' 和要Undo的读者记录证条码号 '" + strReaderBarcode + "' 已不同。";
                     return -1;
                 }
             }

-            // ۲domбʾĵĽڵ
+            // 观察dom中表示借阅的节点
             XmlNode node = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
             if (node != null)
-                return 0;   // ѾûбҪUndo
-
-
-            // <borrows>ԪǷ
+                return 0;   // 已经没有必要Undo了
+
+
+            // 检查<borrows>元素是否存在
             XmlNode root = readerdom.DocumentElement.SelectSingleNode("borrows");
             if (root == null)
             {
@@ -5236,18 +5236,18 @@
                 root = readerdom.DocumentElement.AppendChild(root);
             }

-            // ӻ<borrow>Ԫ
+            // 加回<borrow>元素
             XmlDocumentFragment fragment = readerdom.CreateDocumentFragment();
             fragment.InnerXml = strAddedOverdueFrag;

             root.AppendChild(fragment);

-            // ɾѾ<overdue>Ԫ
+            // 删除已经加入的<overdue>元素
             {
                 XmlDocument tempdom = new XmlDocument();
                 tempdom.LoadXml(strAddedOverdueFrag);
-                // id
+                // 获得其id属性
                 string strID = DomUtil.GetAttr(tempdom.DocumentElement,
                     "id");

@@ -5261,12 +5261,12 @@

             }

-            // TODO: ɾѾ뵽<borrowHistory>е<borrow>Ԫأ
+            // TODO: 删除已经加入到<borrowHistory>中的<borrow>元素？

             byte[] output_timestamp = null;
             // string strOutputPath = "";

-            // дض߼¼
+            // 写回读者记录
             lRet = channel.DoSaveTextRes(strReaderRecPath,
                 readerdom.OuterXml,
                 false,
@@ -5282,22 +5282,22 @@
                     nRedoCount++;
                     if (nRedoCount > 10)
                     {
-                        strError = "дض߼¼ʱʱͻѾ10ΣԷֹֻͣ";
+                        strError = "写回读者记录的时候发生时间戳冲突，并且已经重试10次，仍发生错误，只好停止重试";
                         return -1;
                     }
                     goto REDO;
                 }

-                strError = "дض߼¼ʱ" + strError;
+                strError = "写回读者记录的时候发生错误" + strError;
                 return -1;
             }

-            return 1;   // UndoѾɹ
+            return 1;   // Undo已经成功
         }

         #endregion

-        // װ汾,Ϊ˼ݽűʹ
+        // 包装版本,为了兼容脚本使用
         public int GetReaderCalendar(string strReaderType,
     out Calendar calendar,
     out string strError)
@@ -5308,15 +5308,15 @@
                 out strError);
         }

-        // ȫ
-        // أ"./"ָǰݴĻ統ǰݴΪֹݡӦù淶Ϊֹ/
+        // 获得日历全名
+        // 特殊地，"./基本日历"，指当前馆代码的基本日历，假如当前馆代码为“海淀分馆”，则应该规范为“海淀分馆/基本日历”
         public static string GetCalencarFullName(string strName,
             string strLibraryCodeParam)
         {
             string strLibraryCode = "";
             string strPureName = "";

-            //
+            // 解析日历名
             ParseCalendarName(strName,
         out strLibraryCode,
         out strPureName);
@@ -5332,7 +5332,7 @@
             return strName;
         }

-        // úһض
+        // 获得和一个特定读者类型相关联的日历
         // return:
         //      -1  error
         //      0   succeed
@@ -5344,35 +5344,35 @@
             strError = "";
             calendar = null;

-            //  '' ò
+            // 获得 '工作日历名' 配置参数
             string strCalendarName = "";
             MatchResult matchresult;
             // return:
-            //      readerbook;ƥ 4
-            //      ֻreaderƥ䣬3
-            //      ֻbookƥ䣬2
-            //      readerbookͶƥ䣬1
+            //      reader和book类型均匹配 算4分
+            //      只有reader类型匹配，算3分
+            //      只有book类型匹配，算2分
+            //      reader和book类型都不匹配，算1分
             int nRet = this.GetLoanParam(
                 //null,
                 strLibraryCode,
                 strReaderType,
                 "",
-                "",
+                "工作日历名",
                 out strCalendarName,
                 out matchresult,
                 out strError);
             if (nRet == -1)
             {
-                strError = " ݴ '"+strLibraryCode+"'   '" + strReaderType + "'   ʱ: " + strError;
+                strError = "获得 馆代码 '"+strLibraryCode+"' 中 读者类型 '" + strReaderType + "' 的 工作日历名 参数时发生错误: " + strError;
                 return -1;
             }
             if (nRet < 3)
             {
-                strError = "ݴ '" + strLibraryCode + "'   '" + strReaderType + "'   ޷: " + strError;
+                strError = "馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 的 工作日历名 参数无法获得: " + strError;
                 return -1;
             }

-            // أ"./"ָǰݴĻ統ǰݴΪֹݡӦáֹ/ȥѰ
+            // 特殊地，"./基本日历"，指当前馆代码的基本日历，假如当前馆代码为“海淀分馆”，则应该用“海淀分馆/基本日历”去寻找
             strCalendarName = GetCalencarFullName(strCalendarName, strLibraryCode);

             string strXPath = "";
@@ -5382,7 +5382,7 @@

             if (nodes.Count == 0)
             {
-                strError = "Ϊ '" + strCalendarName + "' ò";
+                strError = "名为 '" + strCalendarName + "' 的日历配置不存在";
                 return -1;
             }

@@ -5395,15 +5395,15 @@
             }
             catch (Exception ex)
             {
-                strError = " '" + strCalendarName + "' ݹCalerdarʱ: " + ex.Message;
+                strError = "日历 '" + strCalendarName + "' 的数据构造Calerdar对象时出错: " + ex.Message;
                 return -1;
             }

             return 0;
         }

-        // (ΪĿ)
-        // ֹûҲܿȫ
+        // (为管理目的)获得日历
+        // 分馆用户也能看到全部日历
         // parameters:
         //      strAction   get list getcount
         public int GetCalendar(string strAction,
@@ -5421,17 +5421,17 @@

 #if NO
             if (strAction == "list" || strAction == "getcount")
-                strXPath = "calendars/calendar";    // г
+                strXPath = "calendars/calendar";    // 列出所有
             else if (strAction == "get")
             {
                 if (string.IsNullOrEmpty(strName) == false)
                     strXPath = "calendars/calendar[@name='" + strName + "']";
                 else
-                    strXPath = "calendars/calendar";    // г
+                    strXPath = "calendars/calendar";    // 列出所有
             }
             else
             {
-                strError = "ʶstrAction '" + strAction + "'";
+                strError = "不能识别的strAction参数 '" + strAction + "'";
                 return -1;
             }
 #endif
@@ -5439,11 +5439,11 @@
             if (string.IsNullOrEmpty(strName) == false)
                 strXPath = "calendars/calendar[@name='" + strName + "']";
             else
-                strXPath = "calendars/calendar";    // г
+                strXPath = "calendars/calendar";    // 列出所有

             XmlNodeList nodes = this.LibraryCfgDom.DocumentElement.SelectNodes(strXPath);

-            // Ҫõ
+            // 仅仅需要得到数量
             if (strAction == "getcount")
                 return nodes.Count;

@@ -5465,7 +5465,7 @@

                 if (strAction == "list")
                 {
-                    //
+                    // 不返回内容
                     contents.Add(info);
                     continue;
                 }
@@ -5475,10 +5475,10 @@
                 contents.Add(info);
             }

-            return nodes.Count; //
+            return nodes.Count; // 返回总数
         }

-        //
+        // 解析日历名
         public static void ParseCalendarName(string strName,
             out string strLibraryCode,
             out string strPureName)
@@ -5496,8 +5496,8 @@
         }

-        // ޸
-        // ֹûֻ޸ԼϽķֹݵ
+        // 修改日历
+        // 分馆用户只能修改自己管辖的分馆的日历
         // parameters:
         //      strAction   change new delete overwirte(2008/8/23 new add)
         public int SetCalendar(string strAction,
@@ -5511,21 +5511,21 @@
                 string strLibraryCode = "";
                 string strPureName = "";

-                //
+                // 解析日历名
                 ParseCalendarName(info.Name,
             out strLibraryCode,
             out strPureName);

-                // йݴ롣ʹõݴ
+                // 检查日历名中馆代码。必须使用单个馆代码
                 if (strLibraryCode.IndexOf(",") != -1)
                 {
-                    strError = "йݴ벿ֲж";
+                    strError = "日历名中馆代码部分不允许含有逗号";
                     return -1;
                 }
-                // йݴ롣ʹ.
+                // 检查日历名中馆代码。不能使用.
                 if (strLibraryCode.IndexOf(".") != -1)
                 {
-                    strError = "йݴ벿ֲʹ÷ '.' ";
+                    strError = "日历名中馆代码部分不允许使用符号 '.' ";
                     return -1;
                 }

@@ -5534,7 +5534,7 @@

                     if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                     {
-                        strError = "ǰûϽĹݴΪ '" + strLibraryCodeList + "'еĹݴ '" + strLibraryCode + "'޸Ĳܾ";
+                        strError = "当前用户管辖的馆代码为 '" + strLibraryCodeList + "'，不包含日历名中的馆代码 '" + strLibraryCode + "'，修改操作被拒绝";
                         return -1;
                     }
                 }
@@ -5553,7 +5553,7 @@
             {
                 if (String.IsNullOrEmpty(info.Name) == true)
                 {
-                    strError = "Ϊ";
+                    strError = "日历名不能为空";
                     return -1;
                 }

@@ -5571,7 +5571,7 @@
                 }
                 else if (nodes.Count > 1)
                 {
-                    // ǿ׳
+                    // 增强健壮性
                     for (int i = 1; i < nodes.Count; i++)
                     {
                         nodes[i].ParentNode.RemoveChild(nodes[i]);
@@ -5585,7 +5585,7 @@
                     node = nodes[0];
                 }

-                DomUtil.SetAttr(node, "name", info.Name);   // 2008/10/8 ӡԭȱٱУΪһbug
+                DomUtil.SetAttr(node, "name", info.Name);   // 2008/10/8 增加。原来缺少本行，为一个bug
                 DomUtil.SetAttr(node, "range", info.Range);
                 DomUtil.SetAttr(node, "comment", info.Comment);
                 node.InnerText = info.Content;
@@ -5598,12 +5598,12 @@
             {
                 if (nodes.Count == 0)
                 {
-                    strError = " '" + info.Name + "' ";
+                    strError = "日历名 '" + info.Name + "' 不存在";
                     return -1;
                 }
                 if (nodes.Count > 1)
                 {
-                    strError = " '" + info.Name + "'   " + nodes.Count.ToString() + " ޸Ĳܾ";
+                    strError = "日历名 '" + info.Name + "' 存在  " + nodes.Count.ToString() + " 个。修改操作被拒绝。";
                     return -1;
                 }
                 node = nodes[0];
@@ -5618,13 +5618,13 @@
             {
                 if (String.IsNullOrEmpty(info.Name) == true)
                 {
-                    strError = "Ϊ";
+                    strError = "日历名不能为空";
                     return -1;
                 }

                 if (nodes.Count > 0)
                 {
-                    strError = " '" + info.Name + "' Ѿ";
+                    strError = "日历名 '" + info.Name + "' 已经存在";
                     return -1;
                 }

@@ -5650,7 +5650,7 @@
             {
                 if (nodes.Count == 0)
                 {
-                    strError = " '" + info.Name + "' ";
+                    strError = "日历名 '" + info.Name + "' 不存在";
                     return -1;
                 }

@@ -5663,7 +5663,7 @@
                 return 0;
             }

-            strError = "޷ʶstrActionֵ '" + strAction + "' ";
+            strError = "无法识别的strAction参数值 '" + strAction + "' ";
             return -1;
         }

@@ -5690,15 +5690,15 @@
         }
 #endif

-        // װİ汾
-        // ͨ
+        // 包装后的版本
+        // 获得流通参数
         // parameters:
-        //      strLibraryCode  ͼݴ, Ϊ,ʾʹ<library>ԪƬ
+        //      strLibraryCode  图书馆代码, 如果为空,表示使用<library>元素以外的片段
         // return:
-        //      readerbook;ƥ 4
-        //      ֻreaderƥ䣬3
-        //      ֻbookƥ䣬2
-        //      readerbookͶƥ䣬1
+        //      reader和book类型均匹配 算4分
+        //      只有reader类型匹配，算3分
+        //      只有book类型匹配，算2分
+        //      reader和book类型都不匹配，算1分
         public int GetLoanParam(
             string strLibraryCode,
             string strReaderType,
@@ -5718,7 +5718,7 @@
             XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode("rightsTable");
             if (root == null)
             {
-                strError = "library.xml ļδ <rightsTable> Ԫ";
+                strError = "library.xml 配置文件中尚未配置 <rightsTable> 元素";
                 return -1;
             }

@@ -5741,7 +5741,7 @@
         public List<string> GetReaderTypes()
         {
             List<string> result = new List<string>();
-            XmlNodeList nodes = this.LibraryCfgDom.DocumentElement.SelectNodes("//readerTypes/item");   // 0.02ǰΪreadertypes
+            XmlNodeList nodes = this.LibraryCfgDom.DocumentElement.SelectNodes("//readerTypes/item");   // 0.02以前为readertypes

             for (int i = 0; i < nodes.Count; i++)
             {
@@ -5756,7 +5756,7 @@
         public List<string> GetBookTypes()
         {
             List<string> result = new List<string>();
-            XmlNodeList nodes = this.LibraryCfgDom.DocumentElement.SelectNodes("//bookTypes/item");   // 0.02ǰΪbooktypes
+            XmlNodeList nodes = this.LibraryCfgDom.DocumentElement.SelectNodes("//bookTypes/item");   // 0.02以前为booktypes

             for (int i = 0; i < nodes.Count; i++)
             {
@@ -5781,7 +5781,7 @@
                 out strError);
         }

-        // ǰ˷ȨXMLµlibrary.xml
+        // 将前端发来的权限XML代码更新到library.xml中
         public int SetRightsTableXml(
 string strLibraryCodeList,
 string strFragment,
@@ -5794,7 +5794,7 @@
                 out strError);
         }

-        // ǰ˷ƬXMLµlibrary.xml
+        // 将前端发来的片断XML代码更新到library.xml中
         public int SetLibraryFragmentXml(
             string strRootElementName,
 string strLibraryCodeList,
@@ -5803,7 +5803,7 @@
         {
             strError = "";

-            XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode(strRootElementName);   // 0.02ǰΪrightstable
+            XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode(strRootElementName);   // 0.02前为rightstable
             if (root == null)
             {
                 root = this.LibraryCfgDom.CreateElement(strRootElementName);
@@ -5820,18 +5820,18 @@
             }
             catch (Exception ex)
             {
-                strError = "fragment XMLװXmlDocumentFragmentʱ: " + ex.Message;
+                strError = "fragment XML装入XmlDocumentFragment时出错: " + ex.Message;
                 return -1;
             }

             source_dom.DocumentElement.AppendChild(fragment);

-            // <library>Ԫصcodeֵ
+            // 检查所有<library>元素的code属性值
             // parameters:
             // return:
-            //      -1  Ĺ̳
-            //      0   ûд
-            //      1   ִ
+            //      -1  检查的过程出错
+            //      0   没有错误
+            //      1   检查后发现错误
             int nRet = CheckLibraryCodeAttr(source_dom.DocumentElement,
                 strLibraryCodeList,
                 out strError);
@@ -5846,7 +5846,7 @@
                 }
                 catch (Exception ex)
                 {
-                    strError = "<" + strRootElementName + ">ԪصInnerXmlʱ: " + ex.Message;
+                    strError = "设置<" + strRootElementName + ">元素的InnerXml时发生错误: " + ex.Message;
                     return -1;
                 }

@@ -5854,18 +5854,18 @@
             }
             else
             {
-                // Ƿвκ<library>ԪصԪ
+                // 检查是否有不属于任何<library>元素的元素
                 XmlNodeList nodes = source_dom.DocumentElement.SelectNodes("descendant::*[count(ancestor-or-self::library) = 0]");
                 if (nodes.Count > 0)
                 {
-                    strError = "ǰûķֹûݲⱣ<" + strRootElementName + ">гַ<library>Ԫ¼Ԫ";
+                    strError = "当前用户的分馆用户身份不允许拟保存的<" + strRootElementName + ">代码中出现非<library>元素下级的事项元素";
                     return -1;
                 }
             }

             List<string> librarycodes = StringUtil.FromListString(strLibraryCodeList);

-            // ԵǰûܹϽÿݴд -- ɾÿlibraryԪ
+            // 对当前用户能管辖的每个馆代码进行处理 -- 删除每个library元素
             foreach (string strLibraryCode in librarycodes)
             {
                 XmlNode target = root.SelectSingleNode("descendant::library[@code='" + strLibraryCode + "']");
@@ -5875,12 +5875,12 @@
                 }
             }

-            // ԵǰûܹϽÿݴд -- ǰ˷<library>Ԫ
+            // 对当前用户能管辖的每个馆代码进行处理 -- 创建前端发来的<library>元素
             foreach (string strLibraryCode in librarycodes)
             {
                 XmlNode source = source_dom.DocumentElement.SelectSingleNode("descendant::library[@code='" + strLibraryCode + "']");
                 if (source == null)
-                    continue;   // ԴûԪ
+                    continue;   // 源没有这个元素

                 Debug.Assert(source != null, "");

@@ -5928,7 +5928,7 @@
             strError = "";
             strValue = "";

-            XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode(strRootElementName);   // 0.02ǰΪrightstable
+            XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode(strRootElementName);   // 0.02前为rightstable
             if (root == null)
                 return 0;
             if (SessionInfo.IsGlobalUser(strLibraryCodeList) == true)
@@ -5958,12 +5958,12 @@
             return 0;
         }

-        // <library>Ԫصcodeֵ
+        // 检查所有<library>元素的code属性值
         // parameters:
         // return:
-        //      -1  Ĺ̳
-        //      0   ûд
-        //      1   ִ
+        //      -1  检查的过程出错
+        //      0   没有错误
+        //      1   检查后发现错误
         public static int CheckLibraryCodeAttr(XmlNode root,
             string strLibraryCodeList,
             out string strError)
@@ -5979,17 +5979,17 @@
                     continue;
                 if (strCode.IndexOf(" ") != -1)
                 {
-                    strError = "<library>Ԫصcodeֵ '"+strCode+"' вӦոַ";
+                    strError = "<library>元素的code属性值 '"+strCode+"' 中不应包含空格字符";
                     return 1;
                 }
                 if (strCode.IndexOf(",") != -1)
                 {
-                    strError = "<library>Ԫصcodeֵ '" + strCode + "' вӦַ";
+                    strError = "<library>元素的code属性值 '" + strCode + "' 中不应包含逗号字符";
                     return 1;
                 }
                 if (strCode.IndexOf("*") != -1)
                 {
-                    strError = "<library>Ԫصcodeֵ '" + strCode + "' вӦǺַ";
+                    strError = "<library>元素的code属性值 '" + strCode + "' 中不应包含星号字符";
                     return 1;
                 }

@@ -5999,12 +5999,12 @@
             if (SessionInfo.IsGlobalUser(strLibraryCodeList) == false)
             {
                 List<string> range = StringUtil.FromListString(strLibraryCodeList);
-                // ۲all_librarycodesǷ񳬹strLibraryCodeListΧ
+                // 观察all_librarycodes集合是否超过strLibraryCodeList范围
                 foreach (string strCode in all_librarycodes)
                 {
                     if (range.IndexOf(strCode) == -1)
                     {
-                        strError = "<library>Ԫصcodeֵ '" + strCode + "' Χ '" + strLibraryCodeList + "'ǲ";
+                        strError = "<library>元素的code属性值 '" + strCode + "' 超出范围 '" + strLibraryCodeList + "'，这是不允许的";
                         return 1;
                     }
                 }
@@ -6013,7 +6013,7 @@
             return 0;
         }

-        // ȡϵĽ沿
+        // 取连个集合的交叉部分
         static List<string> AND(List<string> list1, List<string> list2)
         {
             List<string> result = new List<string>();
@@ -6026,11 +6026,11 @@
             return result;
         }

-        // ¾<location>ԪذnameԽײó
+        // 将新旧两组<location>元素按照name属性进行碰撞，得出三个集合
         // parameters:
-        //      create_nodes    [out]Ľڵ ( new_nodes)
-        //      delete_nodes    [out]ɾĽڵ ( old_nodes)
-        //      remain_nodes    [out]¾֮乲ͬĽڵ ( old_nodes)
+        //      create_nodes    [out]打算新增的节点 (来自 new_nodes)
+        //      delete_nodes    [out]打算删除的节点 (来自 old_nodes)
+        //      remain_nodes    [out]新旧之间共同的节点 (来自 old_nodes)
         static int GetThreeLocationCollections(XmlNode new_root,
             XmlNode old_root,
             out List<XmlNode> create_nodes,
@@ -6075,13 +6075,13 @@
                 /*
                 if (string.IsNullOrEmpty(strName) == true)
                 {
-                    strError = "ݲصصΪա'" + node.OuterXml + "'";
+                    strError = "馆藏地点名不能为空。'" + node.OuterXml + "'";
                     return -1;
                 }
                  * */
                 if (old_names.IndexOf(strName) != -1)
                 {
-                    strError = "ݲصص '" + strName + "' Ӧظʹ";
+                    strError = "馆藏地点名 '" + strName + "' 不应重复使用";
                     return -1;
                 }
                 old_names.Add(strName);
@@ -6093,19 +6093,19 @@
                 /*
                 if (string.IsNullOrEmpty(strName) == true)
                 {
-                    strError = "ݲصصΪա'" + node.OuterXml + "'";
+                    strError = "馆藏地点名不能为空。'" + node.OuterXml + "'";
                     return -1;
                 }
                  * */
                 if (new_names.IndexOf(strName) != -1)
                 {
-                    strError = "ݲصص '" + strName + "' Ӧظʹ";
+                    strError = "馆藏地点名 '" + strName + "' 不应重复使用";
                     return -1;
                 }
                 new_names.Add(strName);
             }

-            //
+            // 公共部分
             List<string> common_names = AND(old_names, new_names);

             foreach (string strName in common_names)
@@ -6113,13 +6113,13 @@
                 XmlNode node = old_root.SelectSingleNode("location[@name='" + strName + "']");
                 if (node == null)
                 {
-                    strError = " old_root ûҵ name Ϊ '" + strName + "' <location>Ԫ";
+                    strError = "很奇怪 old_root 下没有找到 name 属性为 '" + strName + "' 的<location>元素";
                     return -1;
                 }
                 remain_nodes.Add(node);
             }

-            // ҪĲ
+            // 要创建的部分
             foreach (XmlNode node in new_nodes)
             {
                 string strName = DomUtil.GetAttr(node, "name");
@@ -6129,7 +6129,7 @@
                 }
             }

-            // ҪɾĲ
+            // 要删除的部分
             foreach (XmlNode node in old_nodes)
             {
                 string strName = DomUtil.GetAttr(node, "name");
@@ -6141,11 +6141,11 @@
             return 0;
         }

-        // ¾<group>ԪذnameԽײó
+        // 将新旧两组<group>元素按照name属性进行碰撞，得出三个集合
         // parameters:
-        //      create_nodes    [out]Ľڵ ( new_nodes)
-        //      delete_nodes    [out]ɾĽڵ ( old_nodes)
-        //      remain_nodes    [out]¾֮乲ͬĽڵ ( old_nodes)
+        //      create_nodes    [out]打算新增的节点 (来自 new_nodes)
+        //      delete_nodes    [out]打算删除的节点 (来自 old_nodes)
+        //      remain_nodes    [out]新旧之间共同的节点 (来自 old_nodes)
         static int GetThreeGroupCollections(XmlNode new_root,
             XmlNode old_root,
             out List<XmlNode> create_nodes,
@@ -6189,12 +6189,12 @@
                 string strName = DomUtil.GetAttr(node, "name");
                 if (string.IsNullOrEmpty(strName) == true)
                 {
-                    strError = "żϵΪա'"+node.OuterXml+"'";
+                    strError = "排架体系名不能为空。'"+node.OuterXml+"'";
                     return -1;
                 }
                 if (old_names.IndexOf(strName) != -1)
                 {
-                    strError = "żϵ '"+strName+"' Ӧظʹ";
+                    strError = "排架体系名 '"+strName+"' 不应重复使用";
                     return -1;
                 }
                 old_names.Add(strName);
@@ -6205,18 +6205,18 @@
                 string strName = DomUtil.GetAttr(node, "name");
                 if (string.IsNullOrEmpty(strName) == true)
                 {
-                    strError = "żϵΪա'" + node.OuterXml + "'";
+                    strError = "排架体系名不能为空。'" + node.OuterXml + "'";
                     return -1;
                 }
                 if (new_names.IndexOf(strName) != -1)
                 {
-                    strError = "żϵ '" + strName + "' Ӧظʹ";
+                    strError = "排架体系名 '" + strName + "' 不应重复使用";
                     return -1;
                 }
                 new_names.Add(strName);
             }

-            //
+            // 公共部分
             List<string> common_names = AND(old_names, new_names);

             foreach (string strName in common_names)
@@ -6224,13 +6224,13 @@
                 XmlNode node = old_root.SelectSingleNode("group[@name='"+strName+"']");
                 if (node == null)
                 {
-                    strError = " old_root ûҵ name Ϊ '"+strName+"' <group>Ԫ";
+                    strError = "很奇怪 old_root 下没有找到 name 属性为 '"+strName+"' 的<group>元素";
                     return -1;
                 }
                 remain_nodes.Add(node);
             }

-            // ҪĲ
+            // 要创建的部分
             foreach (XmlNode node in new_nodes)
             {
                 string strName = DomUtil.GetAttr(node, "name");
@@ -6240,7 +6240,7 @@
                 }
             }

-            // ҪɾĲ
+            // 要删除的部分
             foreach (XmlNode node in old_nodes)
             {
                 string strName = DomUtil.GetAttr(node, "name");
@@ -6252,7 +6252,7 @@
             return 0;
         }

-        // ۲XmlNodeǷȫһ
+        // 观察两个XmlNode的属性是否完全一致
         static bool AttrEqual(XmlNode node1, XmlNode node2)
         {
             if (node1.Attributes.Count != node2.Attributes.Count)
@@ -6285,7 +6285,7 @@
             return true;
         }

-        // ޸ <callNumber> Ԫض塣רڷֹûȫûֱ޸Ԫص InnerXml
+        // 修改 <callNumber> 元素定义。本函数专用于分馆用户。全局用户可以直接修改这个元素的 InnerXml 即可
         public int SetCallNumberXml(
 string strLibraryCodeList,
 string strFragment,
@@ -6303,7 +6303,7 @@
             }
             catch (Exception ex)
             {
-                strError = "fragment XMLװXmlDocumentFragmentʱ: " + ex.Message;
+                strError = "fragment XML装入XmlDocumentFragment时出错: " + ex.Message;
                 return -1;
             }

@@ -6318,21 +6318,21 @@
                 this.Changed = true;
             }

-            // ֱද
-            // 1) µ<group>Ԫ
-            // 2) ɾԭе<group>Ԫ
-            // 3) ޸ԭе<group>Ԫ
-
-            // ¾<group>ԪذnameԽײó
+            // 分别处理三类动作：
+            // 1) 增加了新的<group>元素
+            // 2) 删除了原有的<group>元素
+            // 3) 修改了原有的<group>元素
+
+            // 将新旧两组<group>元素按照name属性进行碰撞，得出三个集合

             List<XmlNode> create_group_nodes = null;
             List<XmlNode> delete_group_nodes = null;
             List<XmlNode> remain_group_nodes = null;

             // parameters:
-            //      create_nodes    [out]Ľڵ ( new_nodes)
-            //      delete_nodes    [out]ɾĽڵ ( old_nodes)
-            //      remain_nodes    [out]¾֮乲ͬĽڵ ( old_nodes)
+            //      create_nodes    [out]打算新增的节点 (来自 new_nodes)
+            //      delete_nodes    [out]打算删除的节点 (来自 old_nodes)
+            //      remain_nodes    [out]新旧之间共同的节点 (来自 old_nodes)
             int nRet = GetThreeGroupCollections(source_root,
                 exist_root,
                 out create_group_nodes,
@@ -6340,7 +6340,7 @@
                 out remain_group_nodes,
                 out strError);

-            // ۲´<group>ԪأǷ<location>ԪضǵǰûϽΧڵĹݲصص
+            // 观察打算新创建的<group>元素，是否下属的<location>元素都是当前用户管辖范围内的馆藏地点名称
             foreach (XmlNode group_node in create_group_nodes)
             {
                 XmlNodeList location_nodes = group_node.SelectNodes("location");
@@ -6351,20 +6351,20 @@
                     string strLibraryCode = "";
                     string strPureName = "";

-                    //
+                    // 解析
                     ParseCalendarName(strLocationName,
                 out strLibraryCode,
                 out strPureName);

                     if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                     {
-                        strError = "ҪnameֵΪ '" + DomUtil.GetAttr(group_node, "name") + "' <group>Ԫ<location>ԪnameеĹݲصص '" + strLocationName + "' ڵǰûϽΧ '" + strLibraryCodeList + "' ڣ޸<callNumber>ܾ";
+                        strError = "要新增的name属性值为 '" + DomUtil.GetAttr(group_node, "name") + "' 的<group>元素因其下属的<location>元素name属性中的馆藏地点 '" + strLocationName + "' 不在当前用户管辖范围 '" + strLibraryCodeList + "' 内，修改<callNumber>定义操作被拒绝";
                         return -1;
                     }
                 }
             }

-            // ۲ɾ<group>ԪأǷ<location>ԪضǵǰûϽΧڵĹݲصص
+            // 观察打算删除的<group>元素，是否下属的<location>元素都是当前用户管辖范围内的馆藏地点名称
             foreach (XmlNode group_node in delete_group_nodes)
             {
                 XmlNodeList location_nodes = group_node.SelectNodes("location");
@@ -6375,37 +6375,37 @@
                     string strLibraryCode = "";
                     string strPureName = "";

-                    //
+                    // 解析
                     ParseCalendarName(strLocationName,
                 out strLibraryCode,
                 out strPureName);

                     if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                     {
-                        strError = "ҪɾnameֵΪ '"+DomUtil.GetAttr(group_node, "name")+"' <group>Ԫ<location>ԪnameеĹݲصص '" + strLocationName + "' ڵǰûϽΧ '" + strLibraryCodeList + "' ڣ޸<callNumber>ܾ";
+                        strError = "要删除的name属性值为 '"+DomUtil.GetAttr(group_node, "name")+"' 的<group>元素因其下属的<location>元素name属性中的馆藏地点 '" + strLocationName + "' 不在当前用户管辖范围 '" + strLibraryCodeList + "' 内，修改<callNumber>定义操作被拒绝";
                         return -1;
                     }
                 }
             }

-            // ۲޸ĵÿ<group>Ԫأӵ<location>Ԫغɾ<location>ԪضڵǰûĹϽΧ
-            // Ҫ޸<group>ԪرĳnameκһԣҪ<location>ȫڵǰûĹϽΧڲ
+            // 观察打算修改的每个<group>元素，其中下属增加的<location>元素和删除的<location>元素都必须是在当前用户的管辖范围内
+            // 另外如果要修改<group>元素本身的除了name以外的任何一个属性，都要求下属的<location>全部在当前用户的管辖范围内才行
             foreach (XmlNode group_node in remain_group_nodes)
             {
-                // ע node  old_nodes
+                // 注意 node 来自 old_nodes 集合
                 string strGroupName = DomUtil.GetAttr(group_node, "name");

                 XmlNode new_group = source_root.SelectSingleNode("group[@name='"+strGroupName+"']");
                 if (new_group == null)
                 {
-                    strError = "nameֵΪ '"+strGroupName+"' <group>Ԫύ<callNumber> XMLƬоȻûҵ";
+                    strError = "name属性值为 '"+strGroupName+"' 的<group>元素在新提交的<callNumber> XML片断中居然没有找到";
                     return -1;
                 }

                 XmlNode old_group = exist_root.SelectSingleNode("group[@name='" + strGroupName + "']");
                 if (old_group == null)
                 {
-                    strError = "nameֵΪ '" + strGroupName + "' <group>Ԫԭе<callNumber> XMLƬоȻûҵ";
+                    strError = "name属性值为 '" + strGroupName + "' 的<group>元素在原有的<callNumber> XML片断中居然没有找到";
                     return -1;
                 }

@@ -6413,11 +6413,11 @@
                 List<XmlNode> delete_location_nodes = null;
                 List<XmlNode> remain_location_nodes = null;

-                // ¾<location>ԪذnameԽײó
+                // 将新旧两组<location>元素按照name属性进行碰撞，得出三个集合
                 // parameters:
-                //      create_nodes    [out]Ľڵ ( new_nodes)
-                //      delete_nodes    [out]ɾĽڵ ( old_nodes)
-                //      remain_nodes    [out]¾֮乲ͬĽڵ ( old_nodes)
+                //      create_nodes    [out]打算新增的节点 (来自 new_nodes)
+                //      delete_nodes    [out]打算删除的节点 (来自 old_nodes)
+                //      remain_nodes    [out]新旧之间共同的节点 (来自 old_nodes)
                 nRet = GetThreeLocationCollections(new_group,
                     old_group,
                     out create_location_nodes,
@@ -6427,7 +6427,7 @@
                 if (nRet == -1)
                     return -1;

-                // ۲´<location>ԪأǷǵǰûϽΧڵĹݲصص
+                // 观察打算新创建的<location>元素，是否都是当前用户管辖范围内的馆藏地点名称
                 foreach (XmlNode location in create_location_nodes)
                 {
                     string strLocationName = DomUtil.GetAttr(location, "name");
@@ -6435,20 +6435,20 @@
                     string strLibraryCode = "";
                     string strPureName = "";

-                    //
+                    // 解析
                     ParseCalendarName(strLocationName,
                 out strLibraryCode,
                 out strPureName);

                     if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                     {
-                        strError = "nameֵΪ '"+strGroupName+"' <group>Ԫ£<location>ԪnameֵеĹݲصص '" + strLocationName + "' ڵǰûϽΧ '" + strLibraryCodeList + "' ڣ޸<callNumber>ܾ";
+                        strError = "name属性值为 '"+strGroupName+"' 的<group>元素下，拟新增的<location>元素name属性值中的馆藏地点 '" + strLocationName + "' 不在当前用户管辖范围 '" + strLibraryCodeList + "' 内，修改<callNumber>定义操作被拒绝";
                         return -1;
                     }
                 }

-                // ۲ɾ<location>ԪأǷǵǰûϽΧڵĹݲصص
+                // 观察打算删除的<location>元素，是否都是当前用户管辖范围内的馆藏地点名称
                 foreach (XmlNode location in delete_location_nodes)
                 {
                     string strLocationName = DomUtil.GetAttr(location, "name");
@@ -6456,22 +6456,22 @@
                     string strLibraryCode = "";
                     string strPureName = "";

-                    //
+                    // 解析
                     ParseCalendarName(strLocationName,
                 out strLibraryCode,
                 out strPureName);

                     if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                     {
-                        strError = "nameֵΪ '" + strGroupName + "' <group>Ԫ£ɾԭ<location>ԪnameֵеĹݲصص '" + strLocationName + "' ڵǰûϽΧ '" + strLibraryCodeList + "' ڣ޸<callNumber>ܾ";
+                        strError = "name属性值为 '" + strGroupName + "' 的<group>元素下，拟删除的原有<location>元素name属性值中的馆藏地点 '" + strLocationName + "' 不在当前用户管辖范围 '" + strLibraryCodeList + "' 内，修改<callNumber>定义操作被拒绝";
                         return -1;
                     }
                 }

-                // ۲<group>Ԫر޸
+                // 观察<group>元素本身的属性修改情况
                 if (AttrEqual(old_group, new_group) == false)
                 {
-                    // new_root<location>Ԫأ붼ڵǰûĹϽΧ
+                    // new_root下所有<location>元素，必须都在当前用户的管辖范围内
                     XmlNodeList locations = new_group.SelectNodes("location");
                     foreach (XmlNode location in locations)
                     {
@@ -6480,14 +6480,14 @@
                         string strLibraryCode = "";
                         string strPureName = "";

-                        //
+                        // 解析
                         ParseCalendarName(strLocationName,
                     out strLibraryCode,
                     out strPureName);

                         if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                         {
-                            strError = "nameֵΪ '" + strGroupName + "' <group>ԪأԷ޸ģҪµ<location>ԪӦڵǰûĹϽΧڡ<group>Ԫµ<location>ԪnameֵеĹݲصص '" + strLocationName + "' ڵǰûϽΧ '" + strLibraryCodeList + "' ڣ޸<callNumber>ܾ";
+                            strError = "name属性值为 '" + strGroupName + "' 的<group>元素，若其属性发生了修改，这要求其下的所有<location>元素应在当前用户的管辖范围内。但发现这个<group>元素其下的<location>元素name属性值中的馆藏地点 '" + strLocationName + "' 不在当前用户管辖范围 '" + strLibraryCodeList + "' 内，修改<callNumber>定义操作被拒绝";
                             return -1;
                         }

@@ -6495,7 +6495,7 @@
                 }
             }

-            // ûˣ޸
+            // 若没有问题了，兑现修改
             exist_root.InnerXml = source_root.InnerXml;
             this.Changed = true;
             return 0;
@@ -6518,18 +6518,18 @@
             }
             catch (Exception ex)
             {
-                strError = "fragment XMLװXmlDocumentFragmentʱ: " + ex.Message;
+                strError = "fragment XML装入XmlDocumentFragment时出错: " + ex.Message;
                 return -1;
             }

             source_dom.DocumentElement.AppendChild(fragment);

-            // <library>Ԫصcodeֵ
+            // 检查所有<library>元素的code属性值
             // parameters:
             // return:
-            //      -1  Ĺ̳
-            //      0   ûд
-            //      1   ִ
+            //      -1  检查的过程出错
+            //      0   没有错误
+            //      1   检查后发现错误
             int nRet = CheckLibraryCodeAttr(source_dom.DocumentElement,
                 strLibraryCodeList,
                 out strError);
@@ -6543,8 +6543,8 @@
                 this.LibraryCfgDom.DocumentElement.AppendChild(root);
                 this.Changed = true;
             }
-            // ѵǰûܹϽȫƬɾȻһһ
-            // ע⣬listΪջ"*"Ͻȫ
+            // 把当前用户能管辖的全部已有片断删除，然后一个一个插入
+            // 注意，list为空或者"*"，管辖全部内容
             if (SessionInfo.IsGlobalUser(strLibraryCodeList) == true)
             {
                 // root.RemoveAll();
@@ -6555,11 +6555,11 @@
             }
             else
             {
-                // Ƿвκ<library>ԪصԪ
+                // 检查是否有不属于任何<library>元素的元素
                 XmlNodeList nodes = source_dom.DocumentElement.SelectNodes("descendant::*[count(ancestor-or-self::library) = 0]");
                 if (nodes.Count > 0)
                 {
-                    strError = "ǰûķֹûݲⱣ<locationTypes>гַ<library>Ԫ¼Ԫ";
+                    strError = "当前用户的分馆用户身份不允许拟保存的<locationTypes>代码中出现非<library>元素下级的事项元素";
                     return -1;
                 }

@@ -6574,12 +6574,12 @@
                 }
             }

-            // һ<item>
-            {
-
-            }
-
-            // һһ<library>Ԫصز
+            // 第一级<item>插入
+            {
+
+            }
+
+            // 一个一个<library>元素地插入
             {
                 List<string> librarycodes = StringUtil.FromListString(strLibraryCodeList);
                 foreach (string strLibraryCode in librarycodes)
@@ -6599,7 +6599,7 @@
             return 0;
         }

-        // չݴб<locationTypes>ڵʵƬ
+        // 按照馆代码列表，返回<locationTypes>内的适当片断
         public int GetLocationTypesXml(
             string strLibraryCodeList,
             out string strValue,
@@ -6608,7 +6608,7 @@
             strError = "";
             strValue = "";
 #if NO
-            XmlNode root = app.LibraryCfgDom.DocumentElement.SelectSingleNode("locationTypes"); // 0.02ǰΪlocationtypes
+            XmlNode root = app.LibraryCfgDom.DocumentElement.SelectSingleNode("locationTypes"); // 0.02前为locationtypes
             if (root == null)
             {
                 nRet = 0;
@@ -6619,7 +6619,7 @@
 #endif
             if (SessionInfo.IsGlobalUser(strLibraryCodeList) == true)
             {
-                XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode("locationTypes"); // 0.02ǰΪlocationtypes
+                XmlNode root = this.LibraryCfgDom.DocumentElement.SelectSingleNode("locationTypes"); // 0.02前为locationtypes
                 if (root == null)
                     return 0;
                 strValue = root.InnerXml;
@@ -6646,7 +6646,7 @@
             }

 #if NO
-            // ǰϰߡѵһ<item>ԪҲ
+            // 兼容以前的习惯。把第一级的<item>元素也返回
             if (string.IsNullOrEmpty(strLibraryCodeList) == true
                 || strLibraryCodeList == "*")
             {
@@ -6666,12 +6666,12 @@
             return 0;
         }

-        // ùݲصصб
+        // 获得馆藏地点类型列表
         // parameters:
-        //      strLibraryCode  һͼݴ
-        //      bOnlyCanBorrow  ǽгcanborrowΪ'yes'<item>
+        //      strLibraryCode  一个图书馆代码
+        //      bOnlyCanBorrow  是仅仅列出canborrow属性为'yes'的<item>事项
         //`return:
-        //      Ĺݲصصַ顣ν⣬ǡݴ/صеĵص
+        //      纯粹的馆藏地点名字符串数组。所谓纯粹，就是“馆代码/地点名”中的地点名部分
         public List<string> GetLocationTypes(string strLibraryCode,
             bool bOnlyCanBorrow)
         {
@@ -6691,7 +6691,7 @@
                 result.Add(node.InnerText);
             }

-            // ԭϰߡҵЩ<library>Ԫغ<item>Ԫ
+            // 兼容原来的习惯。找到那些不属于<library>元素后代的<item>元素
             if (string.IsNullOrEmpty(strLibraryCode) == true)
             {
                 strXPath = "";
@@ -6726,7 +6726,7 @@
         {
             CultureInfo ci = new CultureInfo(Thread.CurrentThread.CurrentUICulture.Name);

-            // TODO: ׳쳣Ҫȡzh-cnַ߷һַ
+            // TODO: 如果抛出异常，则要试着取zh-cn的字符串，或者返回一个报错的字符串
             try
             {

@@ -6737,15 +6737,15 @@
             }
             catch (Exception /*ex*/)
             {
-                return strID + "  " + Thread.CurrentThread.CurrentUICulture.Name + " ûҵӦԴ";
+                return strID + " 在 " + Thread.CurrentThread.CurrentUICulture.Name + " 中没有找到对应的资源。";
             }
         }

-        // 鳬
+        // 检查超期情况。
         // return:
-        //      -1  ݸʽ
-        //      0   ûзֳ    strErrorҲδڵʾϢ
-        //      1   ֳ   strErrorʾϢ
+        //      -1  数据格式错误
+        //      0   没有发现超期    strError也有未来到期的提示信息
+        //      1   发现超期   strError中有提示信息
         public int CheckPeriod(
             Calendar calendar,
             string strBorrowDate,
@@ -6765,12 +6765,12 @@
         }

-        // 鳬ɼϢģڽǰм飨ڻ飩
+        // 检查超期情况。但不生成记载信息。本模块用于借书前的例行检查（而不是用于还书）。
         // return:
-        //      -1  ݸʽ
-        //      0   ûзֳ
-        //      1   ֳ   strErrorʾϢ
-        //      2   Ѿڿڣ׳ 2009/3/13 new add
+        //      -1  数据格式错误
+        //      0   没有发现超期
+        //      1   发现超期   strError中有提示信息
+        //      2   已经在宽限期内，很容易超期 2009/3/13 new add
         public int CheckPeriod(
             Calendar calendar,
             string strBorrowDate,
@@ -6791,15 +6791,15 @@
             }
             catch
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽ"), // "ֵ '{0}' ʽ"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅日期值s格式错误"), // "借阅日期值 '{0}' 格式错误"
                     strBorrowDate);

-                // "ֵ '" + strBorrowDate + "' ʽ";
+                // "借阅日期值 '" + strBorrowDate + "' 格式错误";
                 return -1;
             }

-            // ֵ
+            // 解析期限值
             // string strPeriodUnit = "";
             long lPeriodValue = 0;

@@ -6809,24 +6809,24 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽs"),    // " ֵ '{0}' ʽ: {1}"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅期限值s格式错误s"),    // "借阅期限 值 '{0}' 格式错误: {1}"
                     strPeriod,
                     strError);
-                    // " ֵ '" + strPeriod + "' ʽ: " + strError;
+                    // "借阅期限 值 '" + strPeriod + "' 格式错误: " + strError;
                 return -1;
             }

-            DateTime timeEnd = DateTime.MinValue;   //
-            DateTime nextWorkingDay = DateTime.MinValue;   // һǹϣôһ
-
-            // 㻹
+            DateTime timeEnd = DateTime.MinValue;   // 还书最后期限
+            DateTime nextWorkingDay = DateTime.MinValue;   // 如果还书最后期限正好在一个非工作日上，那么这是其下一个工作日
+
+            // 测算还书日期
             // parameters:
-            //      calendar    Ϊnullʾзǹжϡ
+            //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
             // return:
-            //      -1
-            //      0   ɹtimeEndڹշΧڡ
-            //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+            //      -1  出错
+            //      0   成功。timeEnd在工作日范围内。
+            //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
             nRet = GetReturnDay(
                 calendar,
                 borrowdate,
@@ -6837,20 +6837,20 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "㻹ʱ̷: " + strError;
+                // text-level: 内部错误
+                strError = "测算还书时间过程发生错误: " + strError;
                 return -1;
             }
             bool bEndInNonWorkingDay = false;
             if (nRet == 1)
             {
-                // nowڷǹ
+                // now在非工作日
                 bEndInNonWorkingDay = true;
             }

-            DateTime now_rounded = app.Clock.UtcNow;  //
-
-            // 滯ʱ
+            DateTime now_rounded = app.Clock.UtcNow;  //  今天
+
+            // 正规化时间
             nRet = RoundTime(strPeriodUnit,
                 ref now_rounded,
                 out strError);
@@ -6860,7 +6860,7 @@
             TimeSpan delta = now_rounded - timeEnd;

             long lDelta = 0;
-            long lDelta1 = 0;   // УǹգĲ
+            long lDelta1 = 0;   // 校正（考虑工作日）后的差额

             nRet = ParseTimeSpan(
                 delta,
@@ -6896,26 +6896,26 @@
             {
                 if (bEndInNonWorkingDay == true)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ޶"), // "ѳ ({0}) {1} {2}",
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("已超过借阅期限多少天"), // "已超过借阅期限 ({0}) {1} {2}。",
                         timeEnd.ToLongDateString(),
                         Convert.ToString(lDelta1),
                         GetDisplayTimeUnitLang(strPeriodUnit));
-                    // ѾڣһǲڷǹվûбҪ
-
-                    // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // 反正已经超期，最后一天是不是在非工作日就没有必要提醒了
+
+                    // "已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "。";
                     lOver = lDelta1;    // 2009/8/5 new add
                     return 1;
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ޶"), // "ѳ ({0}) {1} {2}",
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("已超过借阅期限多少天"), // "已超过借阅期限 ({0}) {1} {2}。",
                         timeEnd.ToLongDateString(),
                         Convert.ToString(lDelta),
                         GetDisplayTimeUnitLang(strPeriodUnit));

-                        // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                        // "已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "。";
                     lOver = lDelta;    // 2009/8/5 new add
                     return 1;
                 }
@@ -6925,34 +6925,34 @@
             {
                 if (strPeriodUnit == "day")
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ǻ"), // "ǻ ({0})"
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("今天就是还书的最后期限"), // "今天就是还书的最后期限 ({0})。"
                         timeEnd.ToLongDateString());
-                        // "ǻ (" + timeEnd.ToLongDateString() + ")";
+                        // "今天就是还书的最后期限 (" + timeEnd.ToLongDateString() + ")。";
                 }
                 else if (strPeriodUnit == "hour")
                 {
-                    // text-level: ûʾ
-                    strError += this.GetString("ǰСʱǻ");
-                        // "ǰСʱǻޡ";
+                    // text-level: 用户提示
+                    strError += this.GetString("当前这个小时就是还书的最后期限");
+                        // "当前这个小时就是还书的最后期限。";
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += this.GetString("ھǻ");
-                        // "ھǻޡ";
+                    // text-level: 用户提示
+                    strError += this.GetString("现在就是还书的最后期限");
+                        // "现在就是还书的最后期限。";
                 }

                 if (bEndInNonWorkingDay && lDelta1 < 0)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString(""),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("但根据"),
                         calendar.Name,
                         now_rounded.ToLongDateString(),
                         nextWorkingDay.ToLongDateString());
-                    // " {0} ʾ({1})Ƿǹգһ({2})ȥͼݻ顣"
-
-                    // " '" + calendar.Name + "' ʾ(" + now_rounded.ToLongDateString() + ")Ƿǹգһ(" + nextWorkingDay.ToLongDateString() + ")ȥͼݻ顣";
+                    // "但根据 {0} 显示，今天({1})是非工作日，您可以在最近第一个工作日({2})去图书馆还书。"
+
+                    // "但根据 '" + calendar.Name + "' 显示，今天(" + now_rounded.ToLongDateString() + ")是非工作日，您可以在最近第一个工作日(" + nextWorkingDay.ToLongDateString() + ")去图书馆还书。";
                 }

                 lOver = 0;    // 2009/8/5 new add
@@ -6962,48 +6962,48 @@
                 Debug.Assert(lDelta1 < 0, "");

                 bool bOverdue = false;
-                // Ѿޣǻڿ
+                // 理论上已经超过最后期限，但是还在宽限期以内
                 if (lDelta > 0)
                 {
                     Debug.Assert(bEndInNonWorkingDay == true, "");

-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("本已超过借阅期限"),
                         timeEnd.ToLongDateString(),
                         Convert.ToString(lDelta),
                         GetDisplayTimeUnitLang(strPeriodUnit));

-                        // "ѳ ({0}) {1}{2}";
-
-                        // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                        // "本已超过借阅期限 ({0}) {1}{2}。但";
+
+                        // "本已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "。但";
                     bOverdue = true;

                     lOver = lDelta;    // 2009/8/5 new add
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("޻"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("距最后期限还有"),
                         timeEnd.ToLongDateString(),
                         Convert.ToString(-lDelta),  // lDelta1 BUG!!!
                         GetDisplayTimeUnitLang(strPeriodUnit));
-                    // " ({0})  {1}{2}";
-
-                        // " (" + timeEnd.ToLongDateString() + ")  " + Convert.ToString(-lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // "距最后期限 ({0}) 还有 {1}{2}。";
+
+                        // "距最后期限 (" + timeEnd.ToLongDateString() + ") 还有 " + Convert.ToString(-lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "。";

                     lOver = lDelta1;    // 2009/8/5 new add
                 }

                 if (bEndInNonWorkingDay == true)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ݵ֪"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("根据得知"),
                         calendar.Name,
                         timeEnd.ToLongDateString(),
                         nextWorkingDay.ToLongDateString());
-                    // " '{0}' ֹ֪ ({1}) ǡͼݷǹգѡڽֹպĵһ ({2}) ȥͼݻ顣";
-
-                        // " '" + calendar.Name + "' ֹ֪ (" + timeEnd.ToLongDateString() + ") ǡͼݷǹգѡڽֹպĵһ (" + nextWorkingDay.ToLongDateString() + ") ȥͼݻ顣";
+                    // "根据 '{0}' 得知，还书截止日 ({1}) 恰逢图书馆非工作日，您可以选择最迟在截止日后的第一个工作日 ({2}) 去图书馆还书。";
+
+                        // "根据 '" + calendar.Name + "' 得知，还书截止日 (" + timeEnd.ToLongDateString() + ") 恰逢图书馆非工作日，您可以选择最迟在截止日后的第一个工作日 (" + nextWorkingDay.ToLongDateString() + ") 去图书馆还书。";
                 }

                 if (bOverdue == true)
@@ -7016,12 +7016,12 @@
             return 0;
         }

-        // û
+        // 获得还书日期
         // return:
-        //      -1  ݸʽ
-        //      0   ûзֳ
-        //      1   ֳ   strErrorʾϢ
-        //      2   Ѿڿڣ׳
+        //      -1  数据格式错误
+        //      0   没有发现超期
+        //      1   发现超期   strError中有提示信息
+        //      2   已经在宽限期内，很容易超期
         public int GetReturningTime(
             Calendar calendar,
             string strBorrowDate,
@@ -7036,28 +7036,28 @@
             lOver = 0;
             strPeriodUnit = "";

-            timeReturning = DateTime.MinValue;   //
-            timeNextWorkingDay = DateTime.MinValue;   // һǹϣôһ
+            timeReturning = DateTime.MinValue;   // 还书最后期限
+            timeNextWorkingDay = DateTime.MinValue;   // 如果还书最后期限正好在一个非工作日上，那么这是其下一个工作日

             LibraryApplication app = this;

             try
             {
-                // ĿʼգGMTʱ
+                // 借阅开始日，GMT时间
                 borrowdate = DateTimeUtil.FromRfc1123DateTimeString(strBorrowDate);
             }
             catch
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽ"), // "ֵ '{0}' ʽ"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅日期值s格式错误"), // "借阅日期值 '{0}' 格式错误"
                     strBorrowDate);

-                // "ֵ '" + strBorrowDate + "' ʽ";
+                // "借阅日期值 '" + strBorrowDate + "' 格式错误";
                 return -1;
             }

-            // ֵ
+            // 解析期限值
             // string strPeriodUnit = "";
             long lPeriodValue = 0;

@@ -7067,22 +7067,22 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽs"),    // " ֵ '{0}' ʽ: {1}"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅期限值s格式错误s"),    // "借阅期限 值 '{0}' 格式错误: {1}"
                     strPeriod,
                     strError);
-                // " ֵ '" + strPeriod + "' ʽ: " + strError;
+                // "借阅期限 值 '" + strPeriod + "' 格式错误: " + strError;
                 return -1;
             }

-            // 㻹
+            // 测算还书日期
             // parameters:
-            //      calendar    Ϊnullʾзǹжϡ
+            //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
             // return:
-            //      -1
-            //      0   ɹtimeEndڹշΧڡ
-            //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+            //      -1  出错
+            //      0   成功。timeEnd在工作日范围内。
+            //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
             nRet = GetReturnDay(
                 calendar,
                 borrowdate,
@@ -7093,20 +7093,20 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "㻹ʱ̷: " + strError;
+                // text-level: 内部错误
+                strError = "测算还书时间过程发生错误: " + strError;
                 return -1;
             }
             bool bEndInNonWorkingDay = false;
             if (nRet == 1)
             {
-                // nowڷǹ
+                // now在非工作日
                 bEndInNonWorkingDay = true;
             }

-            DateTime now_rounded = app.Clock.UtcNow;  //
-
-            // 滯ʱ
+            DateTime now_rounded = app.Clock.UtcNow;  //  今天
+
+            // 正规化时间
             nRet = RoundTime(strPeriodUnit,
                 ref now_rounded,
                 out strError);
@@ -7116,7 +7116,7 @@
             TimeSpan delta = now_rounded - timeReturning;

             long lDelta = 0;
-            long lDelta1 = 0;   // УǹգĲ
+            long lDelta1 = 0;   // 校正（考虑工作日）后的差额

             nRet = ParseTimeSpan(
                 delta,
@@ -7152,26 +7152,26 @@
             {
                 if (bEndInNonWorkingDay == true)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ޶"), // "ѳ ({0}) {1} {2}",
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("已超过借阅期限多少天"), // "已超过借阅期限 ({0}) {1} {2}。",
                         timeReturning.ToLongDateString(),
                         Convert.ToString(lDelta1),
                         GetDisplayTimeUnitLang(strPeriodUnit));
-                    // ѾڣһǲڷǹվûбҪ
-
-                    // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // 反正已经超期，最后一天是不是在非工作日就没有必要提醒了
+
+                    // "已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "。";
                     lOver = lDelta1;    // 2009/8/5 new add
                     return 1;
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ޶"), // "ѳ ({0}) {1} {2}",
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("已超过借阅期限多少天"), // "已超过借阅期限 ({0}) {1} {2}。",
                         timeReturning.ToLongDateString(),
                         Convert.ToString(lDelta),
                         GetDisplayTimeUnitLang(strPeriodUnit));

-                    // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // "已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "。";
                     lOver = lDelta;    // 2009/8/5 new add
                     return 1;
                 }
@@ -7181,34 +7181,34 @@
             {
                 if (strPeriodUnit == "day")
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ǻ"), // "ǻ ({0})"
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("今天就是还书的最后期限"), // "今天就是还书的最后期限 ({0})。"
                         timeReturning.ToLongDateString());
-                    // "ǻ (" + timeEnd.ToLongDateString() + ")";
+                    // "今天就是还书的最后期限 (" + timeEnd.ToLongDateString() + ")。";
                 }
                 else if (strPeriodUnit == "hour")
                 {
-                    // text-level: ûʾ
-                    strError += this.GetString("ǰСʱǻ");
-                    // "ǰСʱǻޡ";
+                    // text-level: 用户提示
+                    strError += this.GetString("当前这个小时就是还书的最后期限");
+                    // "当前这个小时就是还书的最后期限。";
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += this.GetString("ھǻ");
-                    // "ھǻޡ";
+                    // text-level: 用户提示
+                    strError += this.GetString("现在就是还书的最后期限");
+                    // "现在就是还书的最后期限。";
                 }

                 if (bEndInNonWorkingDay && lDelta1 < 0)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString(""),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("但根据"),
                         calendar.Name,
                         now_rounded.ToLongDateString(),
                         timeNextWorkingDay.ToLongDateString());
-                    // " {0} ʾ({1})Ƿǹգһ({2})ȥͼݻ顣"
-
-                    // " '" + calendar.Name + "' ʾ(" + now_rounded.ToLongDateString() + ")Ƿǹգһ(" + nextWorkingDay.ToLongDateString() + ")ȥͼݻ顣";
+                    // "但根据 {0} 显示，今天({1})是非工作日，您可以在最近第一个工作日({2})去图书馆还书。"
+
+                    // "但根据 '" + calendar.Name + "' 显示，今天(" + now_rounded.ToLongDateString() + ")是非工作日，您可以在最近第一个工作日(" + nextWorkingDay.ToLongDateString() + ")去图书馆还书。";
                 }

                 lOver = 0;    // 2009/8/5 new add
@@ -7218,48 +7218,48 @@
                 Debug.Assert(lDelta1 < 0, "");

                 bool bOverdue = false;
-                // Ѿޣǻڿ
+                // 理论上已经超过最后期限，但是还在宽限期以内
                 if (lDelta > 0)
                 {
                     Debug.Assert(bEndInNonWorkingDay == true, "");

-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ѳ"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("本已超过借阅期限"),
                         timeReturning.ToLongDateString(),
                         Convert.ToString(lDelta),
                         GetDisplayTimeUnitLang(strPeriodUnit));

-                    // "ѳ ({0}) {1}{2}";
-
-                    // "ѳ (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // "本已超过借阅期限 ({0}) {1}{2}。但";
+
+                    // "本已超过借阅期限 (" + timeEnd.ToLongDateString() + ") " + Convert.ToString(lDelta) + GetDisplayTimeUnit(strPeriodUnit) + "。但";
                     bOverdue = true;

                     lOver = lDelta;    // 2009/8/5 new add
                 }
                 else
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("޻"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("距最后期限还有"),
                         timeReturning.ToLongDateString(),
                         Convert.ToString(-lDelta1),
                         GetDisplayTimeUnitLang(strPeriodUnit));
-                    // " ({0})  {1}{2}";
-
-                    // " (" + timeEnd.ToLongDateString() + ")  " + Convert.ToString(-lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "";
+                    // "距最后期限 ({0}) 还有 {1}{2}。";
+
+                    // "距最后期限 (" + timeEnd.ToLongDateString() + ") 还有 " + Convert.ToString(-lDelta1) + GetDisplayTimeUnit(strPeriodUnit) + "。";

                     lOver = lDelta1;    // 2009/8/5 new add
                 }

                 if (bEndInNonWorkingDay == true)
                 {
-                    // text-level: ûʾ
-                    strError += string.Format(this.GetString("ݵ֪"),
+                    // text-level: 用户提示
+                    strError += string.Format(this.GetString("根据得知"),
                         calendar.Name,
                         timeReturning.ToLongDateString(),
                         timeNextWorkingDay.ToLongDateString());
-                    // " '{0}' ֹ֪ ({1}) ǡͼݷǹգѡڽֹպĵһ ({2}) ȥͼݻ顣";
-
-                    // " '" + calendar.Name + "' ֹ֪ (" + timeEnd.ToLongDateString() + ") ǡͼݷǹգѡڽֹպĵһ (" + nextWorkingDay.ToLongDateString() + ") ȥͼݻ顣";
+                    // "根据 '{0}' 得知，还书截止日 ({1}) 恰逢图书馆非工作日，您可以选择最迟在截止日后的第一个工作日 ({2}) 去图书馆还书。";
+
+                    // "根据 '" + calendar.Name + "' 得知，还书截止日 (" + timeEnd.ToLongDateString() + ") 恰逢图书馆非工作日，您可以选择最迟在截止日后的第一个工作日 (" + nextWorkingDay.ToLongDateString() + ") 去图书馆还书。";
                 }

                 if (bOverdue == true)
@@ -7272,10 +7272,10 @@
             return 0;
         }

-        // ÿ֪ͨ㣬صǰʱѾﵽ֪߳ͨЩ±
+        // 检查每个通知点，返回当前时间已经达到或者超过了通知点的那些检查点的下标
         // return:
-        //      -1  ݸʽ
-        //      0   ɹ
+        //      -1  数据格式错误
+        //      0   成功
         public int CheckNotifyPoint(
             Calendar calendar,
             string strBorrowDate,
@@ -7297,20 +7297,20 @@

             try
             {
-                // עⷵصGMTʱ
+                // 注意返回的是GMT时间
                 borrowdate = DateTimeUtil.FromRfc1123DateTimeString(strBorrowDate);
             }
             catch
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽ"), // "ֵ '{0}' ʽ"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅日期值s格式错误"), // "借阅日期值 '{0}' 格式错误"
                     strBorrowDate);

-                // "ֵ '" + strBorrowDate + "' ʽ";
+                // "借阅日期值 '" + strBorrowDate + "' 格式错误";
                 return -1;
             }

-            // ֵ
+            // 解析期限值
             // string strPeriodUnit = "";
             long lPeriodValue = 0;

@@ -7320,24 +7320,24 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = string.Format(this.GetString("ֵsʽs"),    // " ֵ '{0}' ʽ: {1}"
+                // text-level: 内部错误
+                strError = string.Format(this.GetString("借阅期限值s格式错误s"),    // "借阅期限 值 '{0}' 格式错误: {1}"
                     strPeriod,
                     strError);
-                // " ֵ '" + strPeriod + "' ʽ: " + strError;
+                // "借阅期限 值 '" + strPeriod + "' 格式错误: " + strError;
                 return -1;
             }

-            DateTime timeEnd = DateTime.MinValue;   //
-            DateTime nextWorkingDay = DateTime.MinValue;   // һǹϣôһ
-
-            // 㻹
+            DateTime timeEnd = DateTime.MinValue;   // 还书最后期限
+            DateTime nextWorkingDay = DateTime.MinValue;   // 如果还书最后期限正好在一个非工作日上，那么这是其下一个工作日
+
+            // 测算还书日期
             // parameters:
-            //      calendar    Ϊnullʾзǹжϡ
+            //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
             // return:
-            //      -1
-            //      0   ɹtimeEndڹշΧڡ
-            //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+            //      -1  出错
+            //      0   成功。timeEnd在工作日范围内。
+            //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
             nRet = GetReturnDay(
                 calendar,
                 borrowdate,
@@ -7348,8 +7348,8 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "㻹ʱ̷: " + strError;
+                // text-level: 内部错误
+                strError = "测算还书时间过程发生错误: " + strError;
                 return -1;
             }

@@ -7357,13 +7357,13 @@
             bool bEndInNonWorkingDay = false;
             if (nRet == 1)
             {
-                // nowڷǹ
+                // now在非工作日
                 bEndInNonWorkingDay = true;
             }
 #endif
             DateTime now = this.Clock.UtcNow;

-            // 滯ʱ
+            // 正规化时间
             nRet = RoundTime(strPeriodUnit,
                 ref borrowdate,
                 out strError);
@@ -7384,13 +7384,13 @@
             int index = 0;
             foreach (string strOnePoint in points)
             {
-                // ۲쵱ǲǴڵڼʱ
+                // 观察当天是不是大于等于检查点时刻
                 // parameters:
-                //      strCheckPoint   ļ㶨塣-1day,1hour,-19%,10%
+                //      strCheckPoint   单个的检查点定义。-1day,1hour,-19%,10%
                 // return:
-                //      -1
-                //      0
-                //      1
+                //      -1  出错
+                //      0   不满足
+                //      1   满足
                 nRet = GetCheckPoint(borrowdate,
                     timeEnd,
                     now,
@@ -7398,7 +7398,7 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "ַ֪ͨ '" + strNotifyDef + "'  '" + strOnePoint + "' ָʽ: " + strError;
+                    strError = "提醒通知定义字符串 '" + strNotifyDef + "' 中 '" + strOnePoint + "' 部分格式错误: " + strError;
                     return -1;
                 }

@@ -7411,16 +7411,16 @@
             return 0;
         }

-        // ۲쵱ǲǴڵڼʱ
+        // 观察当天是不是大于等于检查点时刻
         // parameters:
-        //      start   ʱ(GMTʱ)ǰӦѾݻλ滯
-        //      end     Ӧʱ(GMTʱ)ǰӦѾݻλ滯
-        //      now     ǰʱ(GMTʱ)ǰӦѾݻλ滯
-        //      strCheckPoint   ļ㶨塣-1day,1hour,-19%,10%
+        //      start   借阅时间(GMT时间)。调用前应当已经根据基本单位进行了正规化
+        //      end     应还时间(GMT时间)。调用前应当已经根据基本单位进行了正规化
+        //      now     当前时间(GMT时间)。调用前应当已经根据基本单位进行了正规化
+        //      strCheckPoint   单个的检查点定义。-1day,1hour,-19%,10%
         // return:
-        //      -1
-        //      0
-        //      1
+        //      -1  出错
+        //      0   不满足
+        //      1   满足
         static int GetCheckPoint(DateTime start,
             DateTime end,
             DateTime now,
@@ -7431,11 +7431,11 @@

             if (string.IsNullOrEmpty(strCheckPoint) == true)
             {
-                strError = "strCheckPoint ֵΪ";
+                strError = "strCheckPoint 值不能为空";
                 return -1;
             }

-            bool bReverse = false;  // Ƿĩβʼ ?
+            bool bReverse = false;  // 是否从末尾开始找 ?
             DateTime point;
             string strValue = strCheckPoint.Trim();

@@ -7446,36 +7446,36 @@

                 if (string.IsNullOrEmpty(strValue) == true)
                 {
-                    strError = "ұ߲Ϊ";
+                    strError = "负号右边不能为空";
                     return -1;
                 }
             }

-            // ǷΪٷֺʽ?
+            // 是否为百分号形式?
             if (strValue[strValue.Length - 1] == '%')
             {
                 strValue = strValue.Substring(0, strValue.Length - 1).Trim();
                 if (string.IsNullOrEmpty(strValue) == true)
                 {
-                    strError = "ٷֺ߲Ϊ";
+                    strError = "百分号左边不能为空";
                     return -1;
                 }

-                // ֵ
+                // 数值
                 float v = 0;
                 if (float.TryParse(strValue, out v) == false)
                 {
-                    strError = "㶨 '"+strCheckPoint+"' ʽ '"+strValue+"' ӦΪֵ̬";
+                    strError = "检查点定义 '"+strCheckPoint+"' 格式错误，其中 '"+strValue+"' 部分应该为数值形态";
                     return -1;
                 }

-                // ʱ
+                // 计算出时间点
                 if (bReverse == true)
                     point = end - new TimeSpan((long)((end - start).Ticks * (v / 100)));
                 else
                     point = start + new TimeSpan((long)((end - start).Ticks * (v / 100)));

-                // point ǷҪ滯 Ǵʱ߱ʱ
+                // point 是否需要正规化？ 困难是此时不具备时间参数参数

                 if (point <= start || point >= end)
                     return 0;
@@ -7486,7 +7486,7 @@
                 return 0;
             }

-            // ֵ
+            // 解析期限值
             string strPeriodUnit = "";
             long lPeriodValue = 0;

@@ -7505,11 +7505,11 @@
                 delta = new TimeSpan((int)lPeriodValue, 0, 0);
             else
             {
-                strError = "δ֪ʱ䵥λ '" + strPeriodUnit + "'";
+                strError = "未知的时间单位 '" + strPeriodUnit + "'";
                 return -1;
             }

-            // ʱ
+            // 计算出时间点
             if (bReverse == true)
                 point = end - delta;
             else
@@ -7524,53 +7524,53 @@
             return 0;
         }

-        // ʱ䵥λ任Ϊɶ̬
-        // ǰİ汾
+        // 把时间单位变换为可读的形态
+        // 以前的版本
         public static string GetDisplayTimeUnit(string strUnit)
         {
             if (strUnit == "day")
-                return "";
+                return "天";
             if (strUnit == "hour")
-                return "Сʱ";
-
-            return strUnit; // ޷
+                return "小时";
+
+            return strUnit; // 无法翻译的
         }

-        // ʱ䵥λ任Ϊɶ̬
-        // °汾ܹԶӦǰ
+        // 把时间单位变换为可读的形态
+        // 新版本，能够自动适应当前语言
         public string GetDisplayTimeUnitLang(string strUnit)
         {
             if (strUnit == "day")
-                return this.GetString("");
+                return this.GetString("天");
             if (strUnit == "hour")
-                return this.GetString("Сʱ");
-
-            return strUnit; // ޷
+                return this.GetString("小时");
+
+            return strUnit; // 无法翻译的
         }

-        // ַеʱ䵥λ任Ϊɶ̬
-        // ص°汾
+        // 把整个字符串中的时间单位变换为可读的形态
+        // 语言相关的最新版本
         public string GetDisplayTimePeriodStringEx(string strText)
         {
-            strText = strText.Replace("day", this.GetString(""));
-
-            return strText.Replace("hour", this.GetString("Сʱ"));
+            strText = strText.Replace("day", this.GetString("天"));
+
+            return strText.Replace("hour", this.GetString("小时"));
         }

-        // ַеʱ䵥λ任Ϊɶ̬
-        // Ϊ˼ĳЩɵĽűİ汾ҪˣGetDisplayTimePeriodStringEx()
+        // 把整个字符串中的时间单位变换为可读的形态
+        // 为了兼容某些旧的脚本而保留的版本，建议今后不要用了，而改用GetDisplayTimePeriodStringEx()
         public static string GetDisplayTimePeriodString(string strText)
         {
-            strText = strText.Replace("day", "");
-
-            return strText.Replace("hour", "Сʱ");
+            strText = strText.Replace("day", "天");
+
+            return strText.Replace("hour", "小时");
         }

-        // strPeriodеʱ䵥λ(day/hour)رڻʱַ
+        // 根据strPeriod中的时间单位(day/hour)，返回本地日期或者时间字符串
         // parameters:
-        //      strPeriod   ԭʼʽʱ䳤ַҲ˵ʱ䵥λأ"day""hour"
+        //      strPeriod   原始格式的时间长度字符串。也就是说，时间单位不和语言相关，是"day"或"hour"
         public static string LocalDateOrTime(string strTimeString,
             string strPeriod)
         {
@@ -7589,9 +7589,9 @@
             return DateTimeUtil.LocalTime(strTimeString);
         }

-        // strPeriodеʱ䵥λ(day/hour)رڻʱַ
+        // 根据strPeriod中的时间单位(day/hour)，返回本地日期或者时间字符串
         // parameters:
-        //      strPeriod   ԭʼʽʱ䳤ַҲ˵ʱ䵥λأ"day""hour"
+        //      strPeriod   原始格式的时间长度字符串。也就是说，时间单位不和语言相关，是"day"或"hour"
         public static string LocalDateOrTime(DateTime time,
             string strPeriod)
         {
@@ -7605,13 +7605,13 @@
             if (nRet == -1)
                 strUnit = "day";
             if (strUnit == "day")
-                return time.ToString("d");  // ȷ
-
-            return time.ToString("g");  // ȷӡGȷ
+                return time.ToString("d");  // 精确到日
+
+            return time.ToString("g");  // 精确到分钟。G精确到秒
             // http://www.java2s.com/Tutorial/CSharp/0260__Date-Time/UsetheToStringmethodtoconvertaDateTimetoastringdDfFgGmrstTuUy.htm
         }

-        // ۸
+        // 分析价格参数
         // 2006/10/11
         public static int ParsePriceUnit(string strString,
             out string strPrefix,
@@ -7628,7 +7628,7 @@

             if (String.IsNullOrEmpty(strString) == true)
             {
-                strError = "۸ַΪ";
+                strError = "价格字符串为空";
                 return -1;
             }

@@ -7656,28 +7656,28 @@
                 }
             }

-            // strValueתΪ
+            // 将strValue转换为数字
             try
             {
                 fValue = Convert.ToDouble(strValue);
             }
             catch (Exception)
             {
-                strError = "۸ֲ'" + strValue + "'ʽϷ";
+                strError = "价格参数数字部分'" + strValue + "'格式不合法";
                 return -1;
             }

             /*
             if (String.IsNullOrEmpty(strUnit) == true)
-                strUnit = "CNY";   // ȱʡλΪ Ԫ
-
-            strUnit = strUnit.ToUpper();    // ͳһתΪд
+                strUnit = "CNY";   // 缺省单位为 人民币元
+
+            strUnit = strUnit.ToUpper();    // 统一转换为大写
              * */

             return 0;
         }

-        // ޲
+        // 分析期限参数
         public static int ParsePeriodUnit(string strPeriod,
             out long lValue,
             out string strUnit,
@@ -7691,7 +7691,7 @@

             if (String.IsNullOrEmpty(strPeriod) == true)
             {
-                strError = "ַΪ";
+                strError = "期限字符串为空";
                 return -1;
             }

@@ -7711,35 +7711,35 @@
                 }
             }

-            // strValueתΪ
+            // 将strValue转换为数字
             try
             {
                 lValue = Convert.ToInt64(strValue);
             }
             catch (Exception)
             {
-                strError = "޲ֲ'" + strValue + "'ʽϷ";
+                strError = "期限参数数字部分'" + strValue + "'格式不合法";
                 return -1;
             }

             if (String.IsNullOrEmpty(strUnit) == true)
-                strUnit = "day";   // ȱʡλΪ""
-
-            strUnit = strUnit.ToLower();    // ͳһתΪСд
+                strUnit = "day";   // 缺省单位为"天"
+
+            strUnit = strUnit.ToLower();    // 统一转换为小写

             return 0;
         }

-        // ʱ䵥λ,ʱֵͷȥ,滯,ں
+        // 按照时间单位,把时间值零头去除,正规化,便于后面计算差额
         ///
-        /// ʱλȥͷڻ(λ)
-        /// 㷨תΪʱ䣬ȥͷת GMT ʱ
+        /// 按照时间基本单位，去掉零头，便于互相计算(整单位的)差额。
+        /// 算法是先转换为本地时间，去掉零头，再转换回 GMT 时间
         ///
-        /// <param name="strUnit">ʱ䵥λday/hour֮һΪգ൱ day</param>
-        /// <param name="time">Ҫʱ䡣Ϊ GMT ʱ</param>
-        /// <param name="strError">سϢ</param>
-        /// <returns>-1: ; 0: ɹ</returns>
+        /// <param name="strUnit">时间单位。day/hour之一。如果为空，相当于 day</param>
+        /// <param name="time">要处理的时间。为 GMT 时间</param>
+        /// <param name="strError">返回出错信息</param>
+        /// <returns>-1: 出错; 0: 成功</returns>
         public static int RoundTime(string strUnit,
             ref DateTime time,
             out string strError)
@@ -7759,7 +7759,7 @@
             }
             else
             {
-                strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                strError = "未知的时间单位 '" + strUnit + "'";
                 return -1;
             }
             time = time.ToUniversalTime();
@@ -7782,14 +7782,14 @@
                 lValue = (long)delta.TotalHours;
             else
             {
-                strError = "ʶʱ䵥λ '" + strUnit + "'";
+                strError = "不能识别的时间单位 '" + strUnit + "'";
                 return -1;
             }

             return 0;
         }

-        // TimeSpan
+        // 构造TimeSpan
         public static int BuildTimeSpan(
             long lPeriod,
             string strUnit,
@@ -7805,15 +7805,15 @@
             else
             {
                 delta = new TimeSpan(0);
-                strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                strError = "未知的时间单位 '" + strUnit + "'";
                 return -1;
             }

             return 0;
         }

-        // ԤԼĩʱ
-        // мҪųзǹ
+        // 获得预约保留末端时间
+        // 中间要排除所有非工作日
         public static int GetOverTime(
             Calendar calendar,
             DateTime timeStart,
@@ -7825,7 +7825,7 @@
             strError = "";
             timeEnd = DateTime.MinValue;

-            // 滯ʱ
+            // 正规化时间
             int nRet = RoundTime(strUnit,
                 ref timeStart,
                 out strError);
@@ -7842,13 +7842,13 @@
                     delta = new TimeSpan((int)lPeriod, 0, 0);
                 else
                 {
-                    strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                    strError = "未知的时间单位 '" + strUnit + "'";
                     return -1;
                 }

                 timeEnd = timeStart + delta;

-                // 滯ʱ
+                // 正规化时间
                 nRet = RoundTime(strUnit,
                     ref timeEnd,
                     out strError);
@@ -7865,14 +7865,14 @@
                     delta = new TimeSpan((int)lPeriod, 0, 0);
                 else
                 {
-                    strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                    strError = "未知的时间单位 '" + strUnit + "'";
                     return -1;
                 }

                 timeEnd = calendar.GetEndTime(timeStart,
                     delta);

-                // 滯ʱ
+                // 正规化时间
                 nRet = RoundTime(strUnit,
                     ref timeEnd,
                     out strError);
@@ -7885,15 +7885,15 @@
             return 0;
         }

-        // 㻹
+        // 测算还书日期
         // parameters:
-        //      calendar    Ϊnullʾзǹжϡ
-        //      timeStart   Ŀʼʱ䡣GMTʱ
-        //      timeEnd     Ӧصʱ䡣GMTʱ
+        //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
+        //      timeStart   借阅开始时间。GMT时间
+        //      timeEnd     返回应还回的最后时间。GMT时间
         // return:
-        //      -1
-        //      0   ɹtimeEndڹշΧڡ
-        //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+        //      -1  出错
+        //      0   成功。timeEnd在工作日范围内。
+        //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
         public static int GetReturnDay(
             Calendar calendar,
             DateTime timeStart,
@@ -7907,7 +7907,7 @@
             timeEnd = DateTime.MinValue;
             nextWorkingDay = DateTime.MinValue;

-            // 滯ʱ
+            // 正规化时间
             int nRet = RoundTime(strUnit,
                 ref timeStart,
                 out strError);
@@ -7922,13 +7922,13 @@
                 delta = new TimeSpan((int)lPeriod, 0, 0);
             else
             {
-                strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                strError = "未知的时间单位 '" + strUnit + "'";
                 return -1;
             }

             timeEnd = timeStart + delta;

-            // 滯ʱ
+            // 正规化时间
             nRet = RoundTime(strUnit,
                 ref timeEnd,
                 out strError);
@@ -7937,7 +7937,7 @@

             bool bInNonWorkingDay = false;

-            // ĩǷڷǹ
+            // 看看末端是否正好在非工作日
             if (calendar != null)
             {
                 bInNonWorkingDay = calendar.IsInNonWorkingDay(timeEnd,
@@ -7959,13 +7959,13 @@

         }

-        // ʱ֮ľ
+        // 计算时间之间的距离
         // parameters:
-        //      calendar    Ϊnullʾзǹжϡ
+        //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
         // return:
-        //      -1
-        //      0   ɹtimeEndڹշΧڡ
-        //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+        //      -1  出错
+        //      0   成功。timeEnd在工作日范围内。
+        //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
         public static int GetTimeDistance(
             Calendar calendar,
             string strUnit,
@@ -7994,7 +7994,7 @@

             bool bInNonWorkingDay = false;

-            // ĩǷڷǹ
+            // 看看末端是否正好在非工作日
             if (calendar != null)
             {
                 bInNonWorkingDay = calendar.IsInNonWorkingDay(timeEnd,
@@ -8020,7 +8020,7 @@
             }
             else
             {
-                strError = "δ֪ʱ䵥λ '" + strUnit + "'";
+                strError = "未知的时间单位 '" + strUnit + "'";
                 return -1;
             }

@@ -8035,7 +8035,7 @@

-        // һǷб
+        // 检测一个条码号是否在列表中
         static bool IsInBarcodeList(string strBarcode,
             string strBarcodeList)
         {
@@ -8053,7 +8053,7 @@
             return false;
         }

-        // UndoһѽѼ¼
+        // Undo一个已交费记录
         int UndoOneAmerce(SessionInfo sessioninfo,
             string strReaderBarcode,
             string strAmercedItemId,
@@ -8085,13 +8085,13 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼: " + strError;
+                strError = "检索ID为 '" + strAmercedItemId + "' 的已付违约金记录出错: " + strError;
                 return -1;
             }

             if (lRet == 0)
             {
-                strError = "ûҵIDΪ '" + strAmercedItemId + "' ѸΥԼ¼";
+                strError = "没有找到ID为 '" + strAmercedItemId + "' 的已付违约金记录";
                 return -1;
             }

@@ -8104,25 +8104,25 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼ȡʽ׶γ: " + strError;
+                strError = "检索ID为 '" + strAmercedItemId + "' 的已付违约金记录，获取浏览格式阶段出错: " + strError;
                 return -1;
             }

             if (lRet == 0)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼ѼУǻȡʽûҵ";
+                strError = "检索ID为 '" + strAmercedItemId + "' 的已付违约金记录，已检索命中，但是获取浏览格式没有找到";
                 return -1;
             }

             if (aPath.Count == 0)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼ѼУǻȡʽûҵ";
+                strError = "检索ID为 '" + strAmercedItemId + "' 的已付违约金记录，已检索命中，但是获取浏览格式没有找到";
                 return -1;
             }

             if (aPath.Count > 1)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼ϵͳԱʱ˴";
+                strError = "ID为 '" + strAmercedItemId + "' 的已付违约金记录检索出多条。请系统管理员及时更正此错误。";
                 return -1;
             }

@@ -8141,18 +8141,18 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "ȡѸΥԼ¼ '" + strAmercedRecPath + "' ʱ: " + strError;
+                strError = "获取已付违约金记录 '" + strAmercedRecPath + "' 时出错: " + strError;
                 return -1;
             }

             string strOverdueString = "";
             string strOutputReaderBarcode = "";

-            // ΥԼ¼ʽתΪ߼¼е<overdue>Ԫظʽ
+            // 将违约金记录格式转换为读者记录中的<overdue>元素格式
             // return:
             //      -1  error
-            //      0   strAmercedXml<state>ԪصֵΪ**"settlemented"
-            //      1   strAmercedXml<state>ԪصֵΪ"settlemented"
+            //      0   strAmercedXml中<state>元素的值为*非*"settlemented"
+            //      1   strAmercedXml中<state>元素的值为"settlemented"
             nRet = ConvertAmerceRecordToOverdueString(strAmercedXml,
                 out strOutputReaderBarcode,
                 out strOverdueString,
@@ -8161,25 +8161,25 @@
                 return -1;
             if (nRet == 1)
             {
-                strError = "IDΪ " + strAmercedItemId + " (·Ϊ '" + strOutputPath + "' ) ΥԼ¼״̬Ϊ ѽ(settlemented)ܳؽѲ";
+                strError = "ID为 " + strAmercedItemId + " (路径为 '" + strOutputPath + "' ) 的违约金库记录其状态为 已结算(settlemented)，不能撤回交费操作";
                 return -1;
             }

-            // strReaderBarcodeֵǿգҪһ¼ѸΥԼ¼Ƿ
+            // 如果strReaderBarcode参数值非空，则要检查一下检索出来的已付违约金记录是否真的属于这个读者
             if (String.IsNullOrEmpty(strReaderBarcode) == false
                 && strReaderBarcode != strOutputReaderBarcode)
             {
-                strError = "IDΪ '" + strAmercedItemId + "' ѸΥԼ¼ָĶ '" + strReaderBarcode + "'һ '" + strOutputReaderBarcode + "'";
+                strError = "ID为 '" + strAmercedItemId + "' 的已付违约金记录，并不是属于所指定的读者 '" + strReaderBarcode + "'，而是属于另一读者 '" + strOutputReaderBarcode + "'";
                 return -1;
             }

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForWrite(strReaderBarcode);

             try
             {
-                // ߼¼
+                // 读入读者记录
                 strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -8193,26 +8193,26 @@
                     out strError);
                 if (nRet == 0)
                 {
-                    strError = "֤ '" + strReaderBarcode + "' ";
+                    strError = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     goto ERROR1;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 string strLibraryCode = "";
-                // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList,
             out strLibraryCode) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -8223,29 +8223,29 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // ׼־DOM
+                // 准备日志DOM
                 XmlDocument domOperLog = new XmlDocument();
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "libraryCode",
-                    strLibraryCode);    // ڵĹݴ
+                    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement, "operation",
                     "amerce");

                 bool bReaderDomChanged = false;

-                // ޸Ķ߼¼
-                // Ϣ
+                // 修改读者记录
+                // 增添超期信息
                 if (String.IsNullOrEmpty(strOverdueString) != true)
                 {
                     XmlDocumentFragment fragment = readerdom.CreateDocumentFragment();
                     fragment.InnerXml = strOverdueString;

-                    // ǷoverduesԪ
+                    // 看看根下面是否有overdues元素
                     XmlNode root = readerdom.DocumentElement.SelectSingleNode("overdues");
                     if (root == null)
                     {
@@ -8255,13 +8255,13 @@

                     // 2008/11/11 new add
-                    // undoѺ
+                    // undo交押金
                     XmlNode node_added = root.AppendChild(fragment);
                     bReaderDomChanged = true;

                     Debug.Assert(node_added != null, "");
                     string strReason = DomUtil.GetAttr(node_added, "reason");
-                    if (strReason == "Ѻ")
+                    if (strReason == "押金。")
                     {
                         string strPrice = "";

@@ -8270,26 +8270,26 @@
                             strPrice = DomUtil.GetAttr(node_added, "price");
                         else
                         {
-                            Debug.Assert(strPrice.IndexOf('%') == -1, "newPriceȡļ۸ַܰ%");
+                            Debug.Assert(strPrice.IndexOf('%') == -1, "从newPrice属性中取出来的价格字符串，岂能包含%符号");
                         }

                         if (String.IsNullOrEmpty(strPrice) == false)
                         {
-                            // Ҫ<foregift>Ԫмȥ۸
+                            // 需要从<foregift>元素中减去这个价格
                             string strContent = DomUtil.GetElementText(readerdom.DocumentElement,
                                 "foregift");

                             string strNegativePrice = "";
-                            // "-123.4+10.55-20.3"ļ۸ַת
+                            // 将形如"-123.4+10.55-20.3"的价格字符串反转正负号
                             // parameters:
-                            //      bSum    ǷҪ˳? trueʾҪ
+                            //      bSum    是否要顺便汇总? true表示要汇总
                             nRet = PriceUtil.NegativePrices(strPrice,
                                 false,
                                 out strNegativePrice,
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "ת۸ַ '" + strPrice + "ʱ: " + strError;
+                                strError = "反转价格字符串 '" + strPrice + "时发生错误: " + strError;
                                 goto ERROR1;
                             }

@@ -8310,7 +8310,7 @@
                     byte[] output_timestamp = null;

                     strReaderXml = readerdom.OuterXml;
-                    // Ұд
+                    // 野蛮写入
                     lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                         strReaderXml,
                         false,
@@ -8324,7 +8324,7 @@

                     int nRedoDeleteCount = 0;
                 REDO_DELETE:
-                    // ɾѸΥԼ¼
+                    // 删除已付违约金记录
                     lRet = channel.DoDeleteRes(strAmercedRecPath,
                         amerced_timestamp,
                         out output_timestamp,
@@ -8338,12 +8338,12 @@
                             amerced_timestamp = output_timestamp;
                             goto REDO_DELETE;
                         }
-                        strError = "ɾѸΥԼ¼ '" + strAmercedRecPath + "' ʧ: " + strError;
+                        strError = "删除已付违约金记录 '" + strAmercedRecPath + "' 失败: " + strError;
                         this.WriteErrorLog(strError);
                         goto ERROR1;
                     }

-                    // 嶯
+                    // 具体动作
                     DomUtil.SetElementText(domOperLog.DocumentElement,
                         "action", "undo");

@@ -8367,12 +8367,12 @@
                         "amerceItemID", strAmercedItemId);
                      */

-                    // ɾΥԼ¼
+                    // 删除掉的违约金记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "amerceRecord", strAmercedXml);
                     DomUtil.SetAttr(node, "recPath", strAmercedRecPath);

-                    // µĶ߼¼
+                    // 最新的读者记录
                     node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "readerRecord", strReaderXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);
@@ -8380,28 +8380,28 @@

                     string strOperTime = this.Clock.GetClock();
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operator",
-                        sessioninfo.UserID);   //
+                        sessioninfo.UserID);   // 操作者
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
-                        strOperTime);   // ʱ
+                        strOperTime);   // 操作时间

                     nRet = this.OperLog.WriteOperLog(domOperLog,
                         sessioninfo.ClientAddress,
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "Amerce() API д־ʱ: " + strError;
+                        strError = "Amerce() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }

                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(strLibraryCode,
-                        "ΥԼ",
-                        "ȡ",
+                        "违约金",
+                        "取消次",
                         1);

                     {
                         string strPrice = "";
-                            // ȡΥԼ¼еĽ
+                            // 取出违约金记录中的金额数字
                         nRet = GetAmerceRecordPrice(strAmercedXml,
                             out strPrice,
                             out strError);
@@ -8410,7 +8410,7 @@
                             string strPrefix = "";
                             string strPostfix = "";
                             double fValue = 0.0;
-                            // ۸
+                            // 分析价格参数
                             nRet = ParsePriceUnit(strPrice,
                                 out strPrefix,
                                 out fValue,
@@ -8421,8 +8421,8 @@
                                 if (this.Statis != null)
                                     this.Statis.IncreaseEntryValue(
                                     strLibraryCode,
-                                    "ΥԼ",
-                                    "ȡԪ",
+                                    "违约金",
+                                    "取消元",
                                     fValue);
                             }
                         }
@@ -8439,11 +8439,11 @@
             return -1;
         }

-        // UNDOΥԼ
+        // UNDO违约金交纳
         // return:
         //      -1  error
         //      0   succeed
-        //      1   ֳɹstrErrorбϢfailed_itemЩûбitemб
+        //      1   部分成功。strError中有报错信息，failed_item中有那些没有被处理的item的列表
         int UndoAmerces(
             SessionInfo sessioninfo,
             string strReaderBarcode,
@@ -8490,32 +8490,32 @@
                 }
             }

-            // ÿID˴
+            // 每个ID都发生了错误
             if (nErrorCount >= amerce_items.Length)
                 return -1;

-            // ַ
+            // 部分发生错误
             if (nErrorCount > 0)
             {
                 failed_items = new AmerceItem[failed_list.Count];
                 failed_list.CopyTo(failed_items);

-                strError = "ֳɹ(ύ " + amerce_items.Length + "  "+nErrorCount+" ) \r\n" + strError;
+                strError = "操作部分成功。(共提交了 " + amerce_items.Length + " 个事项，发生错误的有 "+nErrorCount+" 个) \r\n" + strError;
                 return 1;
             }

             return 0;
         }

-        // ΥԼ/ΥԼ
+        // 交违约金/撤销交违约金
         // parameters:
-        //      strReaderBarcode    "undo"Խ˲Ϊnull˲ΪnullҪк˶ԣߵѸΥԼ¼Ҫ
-        //      strAmerceItemIdList idб, Զŷָ
-        // ȨޣҪamerce/amercemodifyprice/amerceundo/amercemodifycommentȨ
-        // ־
-        //      Ҫ־
+        //      strReaderBarcode    如果功能是"undo"，可以将此参数设置为null。如果此参数不为null，则软件要进行核对，如果不是这个读者的已付违约金记录，则要报错
+        //      strAmerceItemIdList id列表, 以逗号分割
+        // 权限：需要有amerce/amercemodifyprice/amerceundo/amercemodifycomment等权限
+        // 日志：
+        //      要产生日志
         // return:
-        //      result.Value    0 ɹ1 ֳɹ(result.ErrorInfoϢ)
+        //      result.Value    0 成功；1 部分成功(result.ErrorInfo中有信息)
         public LibraryServerResult Amerce(
             SessionInfo sessioninfo,
             string strFunction,
@@ -8531,11 +8531,11 @@

             if (String.Compare(strFunction, "amerce", true) == 0)
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("amerce", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ΥԼܾ߱amerceȨޡ";
+                    result.ErrorInfo = "交违约金操作被拒绝。不具备amerce权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -8543,11 +8543,11 @@

             if (String.Compare(strFunction, "modifyprice", true) == 0)
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("amercemodifyprice", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "޸ΥԼĲܾ߱amercemodifypriceȨޡ";
+                    result.ErrorInfo = "修改违约金额的操作被拒绝。不具备amercemodifyprice权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -8556,11 +8556,11 @@
             if (String.Compare(strFunction, "modifycomment", true) == 0)
             {
                 /*
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("amercemodifycomment", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "޸ΥԼ֮ע͵Ĳܾ߱amercemodifycommentȨޡ";
+                    result.ErrorInfo = "修改违约金之注释的操作被拒绝。不具备amercemodifycomment权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -8569,11 +8569,11 @@

             if (String.Compare(strFunction, "undo", true) == 0)
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("amerceundo", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ΥԼܾ߱amerceundoȨޡ";
+                    result.ErrorInfo = "撤销交违约金操作被拒绝。不具备amerceundo权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -8581,11 +8581,11 @@

             if (String.Compare(strFunction, "rollback", true) == 0)
             {
-                // Ȩַ
+                // 权限字符串
                 if (StringUtil.IsInList("amerce", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ؽΥԼĲܾ߱amerceȨޡ";
+                    result.ErrorInfo = "撤回交违约金事务的操作被拒绝。不具备amerce权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -8593,20 +8593,20 @@

             if (strFunction != "rollback")
             {
-                // amerce_itemsǷм۸עͱ
+                // 看看amerce_items中是否有价格变更或注释变更的情况
                 bool bHasNewPrice = false;
-                bool bHasOverwriteComment = false;    // NewCommentСΪǡҲ˵NewPriceNewCommentͬʱе
+                bool bHasOverwriteComment = false;    // NewComment具有、并且为覆盖。也就是说包括NewPrice和NewComment同时具有的情况
                 for (int i = 0; i < amerce_items.Length; i++)
                 {
                     AmerceItem item = amerce_items[i];

-                    // NewPriceֵ
+                    // NewPrice域中有值
                     if (String.IsNullOrEmpty(item.NewPrice) == false)
                     {
                         bHasNewPrice = true;
                     }

-                    // NewCommentֵ
+                    // NewComment域中有值
                     if (String.IsNullOrEmpty(item.NewComment) == false)
                     {
                         string strNewComment = item.NewComment;
@@ -8630,14 +8630,14 @@
                     }
                 }

-                // Ҫ۸ҪamercemodifypriceȨޡ
-                // amercemodifypriceڹamercemodifypriceжõؼǿǷύ¼۸Ĳ
+                // 如果要变更价格，则需要额外的amercemodifyprice权限。
+                // amercemodifyprice在功能amerce和modifyprice中都可能用到，关键是看是否提交了有新价格的参数
                 if (bHasNewPrice == true)
                 {
                     if (StringUtil.IsInList("amercemodifyprice", sessioninfo.RightsOrigin) == false)
                     {
                         result.Value = -1;
-                        result.ErrorInfo = "м۸ҪĽΥԼܾ߱amercemodifypriceȨޡ(߱amerceȨ޻)";
+                        result.ErrorInfo = "含有价格变更要求的交违约金操作被拒绝。不具备amercemodifyprice权限。(仅仅具备amerce权限还不够的)";
                         result.ErrorCode = ErrorCode.AccessDenied;
                         return result;
                     }
@@ -8645,12 +8645,12 @@

                 if (bHasOverwriteComment == true)
                 {
-                    // amerceȨޣ򰵺amerceappendcommentȨ
+                    // 如果有了amerce权限，则暗含有了amerceappendcomment的权限

                     if (StringUtil.IsInList("amercemodifycomment", sessioninfo.RightsOrigin) == false)
                     {
                         result.Value = -1;
-                        result.ErrorInfo = "ΥԼע()ҪĲܾ߱amercemodifycommentȨޡ(߱amerceȨ޻)";
+                        result.ErrorInfo = "含有违约金注释(覆盖型)变更要求的操作被拒绝。不具备amercemodifycomment权限。(仅仅具备amerce权限还不够的)";
                         result.ErrorCode = ErrorCode.AccessDenied;
                         return result;
                     }
@@ -8667,19 +8667,19 @@
                 && String.Compare(strFunction, "rollback", true) != 0)
             {
                 result.Value = -1;
-                result.ErrorInfo = "δ֪strFunctionֵ '" + strFunction + "'";
+                result.ErrorInfo = "未知的strFunction参数值 '" + strFunction + "'";
                 result.ErrorCode = ErrorCode.InvalidParameter;
                 return result;
             }

-            // undo, ҪȼָidΥԼ¼ȻӼ¼еõ<readerBarcode>Ͳ˶
+            // 如果是undo, 需要先检索出指定id的违约金库记录，然后从记录中得到<readerBarcode>，和参数核对
             if (String.Compare(strFunction, "undo", true) == 0)
             {
-                // UNDOΥԼ
+                // UNDO违约金交纳
                 // return:
                 //      -1  error
                 //      0   succeed
-                //      1   ֳɹstrErrorбϢ
+                //      1   部分成功。strError中有报错信息
                 nRet = UndoAmerces(
                     sessioninfo,
                     strReaderBarcode,
@@ -8697,29 +8697,29 @@
                 return result;
             }

-            // ع
+            // 回滚
             // 2009/7/14 new add
             if (String.Compare(strFunction, "rollback", true) == 0)
             {
                 if (amerce_items != null)
                 {
-                    strError = "rollbackʱamerce_itemΪ";
+                    strError = "调用rollback功能时amerce_item参数必须为空";
                     goto ERROR1;
                 }

                 if (sessioninfo.AmerceIds == null
                     || sessioninfo.AmerceIds.Count == 0)
                 {
-                    strError = "ǰûпrollbackΥԼ";
+                    strError = "当前没有可以rollback的违约金事项";
                     goto ERROR1;
                 }

-                // strReaderBarcodeֵһΪռɡֵҪSessionInfoдһεAmerce֤һ
+                // strReaderBarcode参数值一般为空即可。如果有值，则要求和SessionInfo对象中储存的最近一次的Amerce操作读者证条码号一致
                 if (String.IsNullOrEmpty(strReaderBarcode) == false)
                 {
                     if (sessioninfo.AmerceReaderBarcode != strReaderBarcode)
                     {
-                        strError = "rollbackʱstrReaderBarcodeһAmerceĶ֤Ųһ";
+                        strError = "调用rollback功能时strReaderBarcode参数和最近一次Amerce操作的读者证条码号不一致";
                         goto ERROR1;
                     }
                 }
@@ -8734,11 +8734,11 @@
                     amerce_items[i] = item;
                 }

-                // UNDOΥԼ
+                // UNDO违约金交纳
                 // return:
                 //      -1  error
                 //      0   succeed
-                //      1   ֳɹstrErrorбϢ
+                //      1   部分成功。strError中有报错信息
                 nRet = UndoAmerces(
                     sessioninfo,
                     sessioninfo.AmerceReaderBarcode,
@@ -8749,7 +8749,7 @@
                 if (nRet == -1 || nRet == 1)
                     goto ERROR1;

-                // ids
+                // 清空ids
                 sessioninfo.AmerceIds = new List<string>();
                 sessioninfo.AmerceReaderBarcode = "";

@@ -8757,12 +8757,12 @@
                 return result;
             }

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForWrite(strReaderBarcode);

             try
             {
-                // ߼¼
+                // 读入读者记录
                 strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -8776,26 +8776,26 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                    result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // Ķ߿¹ݴ
+                // 所操作的读者库德馆代码
                 string strLibraryCode = "";

-                // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
-                    // ö߿Ĺݴ
+                    // 获得读者库的馆代码
                     // return:
-                    //      -1
-                    //      0   ɹ
+                    //      -1  出错
+                    //      0   成功
                     nRet = GetLibraryCode(
             strOutputReaderRecPath,
             out strLibraryCode,
@@ -8803,12 +8803,12 @@
                     if (nRet == -1)
                         goto ERROR1;

-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -8819,25 +8819,25 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // ׼־DOM
+                // 准备日志DOM
                 XmlDocument domOperLog = new XmlDocument();
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "operation",
                     "amerce");

-                // 嶯
+                // 具体动作
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "action", strFunction.ToLower());

-                // ֤
+                // 读者证条码号
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "readerBarcode", strReaderBarcode);

@@ -8848,13 +8848,13 @@
                 List<string> Ids = null;

-                string strOperTimeString = this.Clock.GetClock();   // RFC1123ʽ
-
-
-                bool bReaderDomChanged = false; // domǷ˱仯Ҫش
-
-                {
-                    // ־бɵĶ߼¼
+                string strOperTimeString = this.Clock.GetClock();   // RFC1123格式
+
+
+                bool bReaderDomChanged = false; // 读者dom是否发生了变化，需要回存
+
+                {
+                    // 在日志中保留旧的读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
         "oldReaderRecord", strReaderXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);
@@ -8863,7 +8863,7 @@
                 if (String.Compare(strFunction, "modifyprice", true) == 0)
                 {
                     /*
-                    // ־бɵĶ߼¼
+                    // 在日志中保留旧的读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
         "oldReaderRecord", strReaderXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);
@@ -8881,14 +8881,14 @@
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "ΥԼ",
-                            "޸Ĵ",
+                            "违约金",
+                            "修改次",
                             nRet);
                     }
                     else
                     {
-                        // һҲûз޸ģҪشϢǰ˵ľ
-                        strError = "棺ûκļ۸(ע)޸ġ";
+                        // 如果一个事项也没有发生修改，则需要返回错误信息，以引起前端的警觉
+                        strError = "警告：没有任何事项的价格(和注释)被修改。";
                         goto ERROR1;
                     }

@@ -8898,7 +8898,7 @@
                 if (String.Compare(strFunction, "modifycomment", true) == 0)
                 {
                     /*
-                    // ־бɵĶ߼¼
+                    // 在日志中保留旧的读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
         "oldReaderRecord", strReaderXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);
@@ -8917,14 +8917,14 @@
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "ΥԼ֮ע",
-                            "޸Ĵ",
+                            "违约金之注释",
+                            "修改次",
                             nRet);
                     }
                     else
                     {
-                        // һҲûз޸ģҪشϢǰ˵ľ
-                        strError = "棺ûκעͱ޸ġ";
+                        // 如果一个事项也没有发生修改，则需要返回错误信息，以引起前端的警觉
+                        strError = "警告：没有任何事项的注释被修改。";
                         goto ERROR1;
                     }

@@ -8934,11 +8934,11 @@
                 List<string> NotFoundIds = null;
                 Ids = null;

-                // ΥԼڶ߼¼ȥѡ<overdue>Ԫأҹһ¼¼׼ΥԼ
+                // 交违约金：在读者记录中去除所选的<overdue>元素，并且构造一批新记录准备加入违约金库
                 // return:
                 //      -1  error
-                //      0   domûб仯
-                //      1   dom˱仯
+                //      0   读者dom没有变化
+                //      1   读者dom发生了变化
                 nRet = DoAmerceReaderXml(
                     strLibraryCode,
                     ref readerdom,
@@ -8956,10 +8956,10 @@
                     bReaderDomChanged = true;

-                // ΥԼݿдµΥԼ¼
+                // 在违约金数据库中创建若干新的违约金记录
                 // parameters:
-                //      AmerceRecordXmls    Ҫд¼¼
-                //      CreatedNewPaths Ѿ¼¼·顣Undo(ɾոմ¼¼)
+                //      AmerceRecordXmls    需要写入的新记录的数组
+                //      CreatedNewPaths 已经创建的新记录的路径数组。可以用于Undo(删除刚刚创建的新记录)
                 nRet = CreateAmerceRecords(
                     sessioninfo.Channels,
                     AmerceRecordXmls,
@@ -8967,7 +8967,7 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // undoѾдĲּ¼
+                    // undo已经写入的部分记录
                     if (CreatedNewPaths != null
                         && CreatedNewPaths.Count != 0)
                     {
@@ -8985,7 +8985,7 @@
                                     strList += ",";
                                 strList += CreatedNewPaths[i];
                             }
-                            strError = "ڴµΥԼ¼Ĺз: " + strError + "Undo´ΥԼ¼ĹУַ: " + strNewError + ", ϵͳԱֹɾ´ķ¼: " + strList;
+                            strError = "在创建新的违约金记录的过程中发生错误: " + strError + "。在Undo新创建的违约金记录的过程中，又发生错误: " + strNewError + ", 请系统管理员手工删除新创建的罚款记录: " + strList;
                             goto ERROR1;
                         }
                     }
@@ -8995,7 +8995,7 @@

             SAVERECORD:

-                // Ϊдضߡ¼׼
+                // 为写回读者、册记录做准备
                 // byte[] timestamp = null;
                 byte[] output_timestamp = null;
                 string strOutputPath = "";
@@ -9039,13 +9039,13 @@
                         "itemBarcodeList", strItemBarcodeList);
                      */

-                    // ΪamerceʱŰѱ޸ĵʵ¼д־
+                    // 仅当功能为amerce时，才把被修改的实体记录写入日志。
                     if (String.Compare(strFunction, "amerce", true) == 0)
                     {

                         Debug.Assert(AmerceRecordXmls.Count == CreatedNewPaths.Count, "");

-                        // дظ<amerceRecord>Ԫ
+                        // 写入多个重复的<amerceRecord>元素
                         for (int i = 0; i < AmerceRecordXmls.Count; i++)
                         {
                             XmlNode nodeAmerceRecord = domOperLog.CreateElement("amerceRecord");
@@ -9061,13 +9061,13 @@
                             if (this.Statis != null)
                                 this.Statis.IncreaseEntryValue(
                                 strLibraryCode,
-                                "ΥԼ",
-                                "",
+                                "违约金",
+                                "给付次",
                                 1);

                             {
                                 string strPrice = "";
-                                // ȡΥԼ¼еĽ
+                                // 取出违约金记录中的金额数字
                                 nRet = GetAmerceRecordPrice(AmerceRecordXmls[i],
                                     out strPrice,
                                     out strError);
@@ -9076,7 +9076,7 @@
                                     string strPrefix = "";
                                     string strPostfix = "";
                                     double fValue = 0.0;
-                                    // ۸
+                                    // 分析价格参数
                                     nRet = ParsePriceUnit(strPrice,
                                         out strPrefix,
                                         out fValue,
@@ -9087,14 +9087,14 @@
                                         if (this.Statis != null)
                                             this.Statis.IncreaseEntryValue(
                                             strLibraryCode,
-                                            "ΥԼ",
-                                            "Ԫ",
+                                            "违约金",
+                                            "给付元",
                                             fValue);
                                     }
                                     else
                                     {
                                         // 2012/11/15
-                                        this.WriteErrorLog("ۼ ΥԼ Ԫ [" + strPrice + "] ʱ: " + strError);
+                                        this.WriteErrorLog("累计 违约金 给付元 [" + strPrice + "] 时出错: " + strError);
                                     }
                                 }
                             }
@@ -9103,7 +9103,7 @@

                     }

-                    // µĶ߼¼
+                    // 最新的读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
         "readerRecord", strReaderXml);
                     DomUtil.SetAttr(node, "recPath", strOutputReaderRecPath);
@@ -9111,21 +9111,21 @@

                     string strOperTime = this.Clock.GetClock();
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operator",
-                        sessioninfo.UserID);   //
+                        sessioninfo.UserID);   // 操作者
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
-                        strOperTime);   // ʱ
+                        strOperTime);   // 操作时间

                     nRet = this.OperLog.WriteOperLog(domOperLog,
                         sessioninfo.ClientAddress,
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "Amerce() API д־ʱ: " + strError;
+                        strError = "Amerce() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }
                 }

-                // һAmerceIDͶ֤
+                // 记忆下最近一次Amerce操作的ID和读者证条码号
                 if (strFunction != "rollback"
                     && Ids != null
                     && Ids.Count != 0)
@@ -9147,8 +9147,8 @@
             return result;
         }

-        // AmerceItem飬޸readerdomе<amerce>Ԫеļ۸priceԡ
-        // Ϊ"modifyprice"
+        // 根据AmerceItem数组，修改readerdom中的<amerce>元素中的价格price属性。
+        // 为功能"modifyprice"服务。
         int ModifyPrice(ref XmlDocument readerdom,
             AmerceItem[] amerce_items,
             out string strError)
@@ -9160,24 +9160,24 @@
             {
                 AmerceItem item = amerce_items[i];

-                // NewPriceֵΪյģֱ
-                // ˵޸ļ۸Ϊȫյַ
+                // 遇到NewPrice域值为空的，直接跳过。
+                // 这说明，不接受修改价格为完全空的字符串。
                 if (String.IsNullOrEmpty(item.NewPrice) == true)
                 {
                     if (String.IsNullOrEmpty(item.NewComment) == false)
                     {
-                        strError = "modifypriceӹ޸ע(޸ļ۸)appendcommentmodifycommentӹ";
+                        strError = "不能用modifyprice子功能来单独修改注释(而不修改价格)，请改用appendcomment和modifycomment子功能";
                         return -1;
                     }

                     continue;
                 }

-                // ͨidֵڶ߼¼ҵӦ<overdue>Ԫ
+                // 通过id值在读者记录中找到对应的<overdue>元素
                 XmlNode nodeOverdue = readerdom.DocumentElement.SelectSingleNode("overdues/overdue[@id='"+item.ID+"']");
                 if (nodeOverdue == null)
                 {
-                    strError = "IDΪ '"+item.ID+"' <overdues/overdue>Ԫûҵ...";
+                    strError = "ID为 '"+item.ID+"' 的<overdues/overdue>元素没有找到...";
                     return -1;
                 }

@@ -9185,15 +9185,15 @@

                 if (strOldPrice != item.NewPrice)
                 {
-                    // ޸price
+                    // 修改price属性
                     DomUtil.SetAttr(nodeOverdue, "price", item.NewPrice);
                     nChangedCount++;

-                    // ע
+                    // 增补注释
                     string strNewComment = item.NewComment;
                     string strExistComment = DomUtil.GetAttr(nodeOverdue, "comment");

-                    // ׷ӱ־
+                    // 处理追加标志
                     bool bAppend = true;
                     if (string.IsNullOrEmpty(strNewComment) == false
                         && strNewComment[0] == '<')
@@ -9217,7 +9217,7 @@
                         if (String.IsNullOrEmpty(strNewComment) == false)
                         {
                             if (String.IsNullOrEmpty(strText) == false)
-                                strText += "";
+                                strText += "；";
                             strText += strNewComment;
                         }

@@ -9234,8 +9234,8 @@
         }

         // 2008/6/19 new add
-        // AmerceItem飬޸readerdomе<amerce>Ԫеcommentԡ
-        // Ϊ"modifycomment"
+        // 根据AmerceItem数组，修改readerdom中的<amerce>元素中的comment属性。
+        // 为功能"modifycomment"服务。
         int ModifyComment(
             ref XmlDocument readerdom,
             AmerceItem[] amerce_items,
@@ -9248,26 +9248,26 @@
             {
                 AmerceItem item = amerce_items[i];

-                // ͬʱ޸ļ۸
+                // 不能同时修改价格。
                 if (String.IsNullOrEmpty(item.NewPrice) == false)
                 {
-                    strError = "modifycommentӹ޸ļ۸modifypriceӹ";
+                    strError = "不能用modifycomment子功能来修改价格，请改用modifyprice子功能";
                     return -1;
                 }

                 /*
-                // NewCommentֵΪաΪ׷ӵģֱ
+                // 遇到NewComment域值为空、并且为追加的，直接跳过
                 if (String.IsNullOrEmpty(item.NewComment) == true
                     && strFunction == "appendcomment")
                 {
                     continue;
                 }*/

-                // ͨidֵڶ߼¼ҵӦ<overdue>Ԫ
+                // 通过id值在读者记录中找到对应的<overdue>元素
                 XmlNode nodeOverdue = readerdom.DocumentElement.SelectSingleNode("overdues/overdue[@id='" + item.ID + "']");
                 if (nodeOverdue == null)
                 {
-                    strError = "IDΪ '" + item.ID + "' <overdues/overdue>Ԫûҵ...";
+                    strError = "ID为 '" + item.ID + "' 的<overdues/overdue>元素没有找到...";
                     return -1;
                 }

@@ -9275,10 +9275,10 @@
                 {
                     string strExistComment = DomUtil.GetAttr(nodeOverdue, "comment");

-                    // ޸ע
+                    // 增补或修改注释
                     string strNewComment = item.NewComment;

-                    // ׷ӱ־
+                    // 处理追加标志
                     bool bAppend = true;
                     if (string.IsNullOrEmpty(strNewComment) == false
                         && strNewComment[0] == '<')
@@ -9302,7 +9302,7 @@
                         if (String.IsNullOrEmpty(strNewComment) == false)
                         {
                             if (String.IsNullOrEmpty(strText) == false)
-                                strText += "";
+                                strText += "；";
                             strText += strNewComment;
                         }

@@ -9312,7 +9312,7 @@
                     else if (bAppend == false)
                     {
                         DomUtil.SetAttr(nodeOverdue, "comment", strNewComment);
-                        nChangedCount++;    // BUG!!! 2011/12/1ǰ仰
+                        nChangedCount++;    // BUG!!! 2011/12/1前少了这句话
                     }
                 }
             }
@@ -9320,7 +9320,7 @@
             return nChangedCount;
         }

-        // ־DOMжΥԼϢ
+        // 从日志DOM中读出违约金事项信息
         public static AmerceItem[] ReadAmerceItemList(XmlDocument domOperLog)
         {
             XmlNodeList nodes = domOperLog.DocumentElement.SelectNodes("amerceItems/amerceItem");
@@ -9343,7 +9343,7 @@
             return results;
         }

-        // ־DOMдΥԼϢ
+        // 在日志DOM中写入违约金事项信息
         static void WriteAmerceItemList(XmlDocument domOperLog,
             AmerceItem[] amerce_items)
         {
@@ -9376,11 +9376,11 @@
             */
         }

-        // ڲ¼лý֤
+        // 在册记录中获得借阅者证条码号
         // return:
-        //      -1
-        //      0   òΪδ״̬
-        //      1   ɹ
+        //      -1  出错
+        //      0   该册为未借出状态
+        //      1   成功
         static int GetBorrowerBarcode(XmlDocument dom,
             out string strOutputReaderBarcode,
             out string strError)
@@ -9393,7 +9393,7 @@

             if (String.IsNullOrEmpty(strOutputReaderBarcode) == true)
             {
-                strError = "òΪδ״̬";   // "¼<borrower>ԪֵòᲢδκζĹ";
+                strError = "该册为未借出状态";   // "册记录中<borrower>元素值表明该册并未曾被任何读者所借阅过";
                 return 0;
             }

@@ -9401,7 +9401,7 @@
         }

-        // ɾոմΥԼ¼
+        // 删除刚刚创建的新违约金记录
         int DeleteAmerceRecords(
             RmsChannelCollection channels,
             List<string> CreatedNewPaths,
@@ -9432,7 +9432,7 @@
                 if (lRet == -1)
                 {
                     if (channel.ErrorCode == ChannelErrorCode.TimestampMismatch
-                        && nRedoCount < 5) // ԴС5
+                        && nRedoCount < 5) // 重试次数小于5次
                     {
                         timestamp = output_timestamp;
                         nRedoCount++;
@@ -9448,10 +9448,10 @@
             return 0;
         }

-        // ΥԼݿдµΥԼ¼
+        // 在违约金数据库中创建若干新的违约金记录
         // parameters:
-        //      AmerceRecordXmls    Ҫд¼¼
-        //      CreatedNewPaths Ѿ¼¼·顣Undo(ɾոմ¼¼)
+        //      AmerceRecordXmls    需要写入的新记录的数组
+        //      CreatedNewPaths 已经创建的新记录的路径数组。可以用于Undo(删除刚刚创建的新记录)
         int CreateAmerceRecords(
             RmsChannelCollection channels,
             List<string> AmerceRecordXmls,
@@ -9464,7 +9464,7 @@

             if (string.IsNullOrEmpty(this.AmerceDbName) == true)
             {
-                strError = "δΥԼ";
+                strError = "尚未配置违约金库名";
                 return -1;
             }

@@ -9485,7 +9485,7 @@
                 byte[] timestamp = null;
                 byte[] output_timestamp = null;

-                // д¼¼
+                // 写新记录
                 lRet = channel.DoSaveTextRes(
                     strPath,
                     strXml,
@@ -9504,7 +9504,7 @@
             return 0;
         }

-        // ȡΥԼ¼еĽ
+        // 取出违约金记录中的金额数字
         static int GetAmerceRecordPrice(string strAmercedXml,
             out string strPrice,
             out string strError)
@@ -9519,7 +9519,7 @@
             }
             catch (Exception ex)
             {
-                strError = "XML¼װDOMʱ: " + ex.Message;
+                strError = "XML记录装入DOM时出错: " + ex.Message;
                 return -1;
             }

@@ -9528,11 +9528,11 @@
             return 0;
         }

-        // ΥԼ¼ʽתΪ߼¼е<overdue>Ԫظʽ
+        // 将违约金记录格式转换为读者记录中的<overdue>元素格式
         // return:
         //      -1  error
-        //      0   strAmercedXml<state>ԪصֵΪ**"settlemented"
-        //      1   strAmercedXml<state>ԪصֵΪ"settlemented"
+        //      0   strAmercedXml中<state>元素的值为*非*"settlemented"
+        //      1   strAmercedXml中<state>元素的值为"settlemented"
         static int ConvertAmerceRecordToOverdueString(string strAmercedXml,
             out string strReaderBarcode,
             out string strOverdueString,
@@ -9549,7 +9549,7 @@
             }
             catch (Exception ex)
             {
-                strError = "XML¼װDOMʱ: " + ex.Message;
+                strError = "XML记录装入DOM时出错: " + ex.Message;
                 return -1;
             }

@@ -9596,7 +9596,7 @@
             string strPauseStart = DomUtil.GetElementText(dom.DocumentElement,
                 "pauseStart");

-            // дDOM
+            // 写入DOM
             XmlDocument domOutput = new XmlDocument();
             domOutput.LoadXml("<overdue />");
             XmlNode nodeOverdue = domOutput.DocumentElement;
@@ -9622,13 +9622,13 @@
                 DomUtil.SetAttr(nodeOverdue, "price", strPrice);

-            // صʱ򲻶ʧע͡ΪѾ޷ֱĴ׷ӵעͣԭ
+            // 撤回的时候不丢失注释。因为已经无法分辨哪次追加的注释，所以原样保留。
             // 2007/4/19
             if (String.IsNullOrEmpty(strComment) == false)
                 DomUtil.SetAttr(nodeOverdue, "comment", strComment);

-            // TODO: ֵоһ¡AmerceItem.CommentܸеcommentϢ
-            // ôصʱͲҪʧע͡
+            // TODO: 这里值得研究一下。如果AmerceItem.Comment能覆盖数据中的comment信息，
+            // 那么撤回的时候就不要丢失注释。

             DomUtil.SetAttr(nodeOverdue, "borrowDate", strBorrowDate);
             DomUtil.SetAttr(nodeOverdue, "borrowPeriod", strBorrowPeriod);
@@ -9649,12 +9649,12 @@
             return 0;
         }

-        // ߼¼е<overdue>ԪغתΪΥԼļ¼ʽ
+        // 将读者记录中的<overdue>元素和属性转换为违约金库的记录格式
         // parameters:
-        //      strLibraryCode  ߼¼Ĺݴ
-        //      strState    һΪ"amerced"ʾδ
-        //      strNewPrice ļ۸Ϊգʾԭļ۸
-        //      strComment  ǰ˸ע͡
+        //      strLibraryCode  读者记录从属的馆代码
+        //      strState    一般为"amerced"，表示尚未结算
+        //      strNewPrice 例外的价格。如果为空，则表示沿用原来的价格。
+        //      strComment  前端给出的注释。
         static int ConvertOverdueStringToAmerceRecord(XmlNode nodeOverdue,
             string strLibraryCode,
             string strReaderBarcode,
@@ -9663,8 +9663,8 @@
             string strNewComment,
             string strOperator,
             string strOperTime,
-            string strForegiftPrice,    // Զ߼¼<foregift>Ԫڵļ۸ַ
-            out string strFinalPrice,   // ʹõļ۸ַ
+            string strForegiftPrice,    // 来自读者记录<foregift>元素内的价格字符串
+            out string strFinalPrice,   // 最终使用的价格字符串
             out string strAmerceRecord,
             out string strError)
         {
@@ -9693,27 +9693,27 @@
             }

             // 2008/11/15 new add
-            // ۸ַǷΪ?
+            // 看看价格字符串是否为宏?
             if (strPrice == "%return_foregift_price%")
             {
-                // ȡı仯
+                // 记忆下取宏的变化
                 if (String.IsNullOrEmpty(strOriginPrice) == true)
                     strOriginPrice = strPrice;

-                // "-123.4+10.55-20.3"ļ۸ַת
+                // 将形如"-123.4+10.55-20.3"的价格字符串反转正负号
                 // parameters:
-                //      bSum    ǷҪ˳? trueʾҪ
+                //      bSum    是否要顺便汇总? true表示要汇总
                 nRet = PriceUtil.NegativePrices(strForegiftPrice,
                     true,
                     out strPrice,
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "ת(Զ߼¼е<foregift>Ԫص)۸ַ '" + strForegiftPrice + "' ʱ: " + strError;
+                    strError = "反转(来自读者记录中的<foregift>元素的)价格字符串 '" + strForegiftPrice + "' 时出错: " + strError;
                     return -1;
                 }

-                // תļ۸ַΪգҪر滻Ϊ0滷ڱûֵĿַģʾ˿(ǽ)Ӵ
+                // 如果经过反转后的价格字符串为空，则需要特别替换为“0”，以免后面环节被当作没有值的空字符串。负号是有意义的，表示退款(而不是交款)哟
                 if (String.IsNullOrEmpty(strPrice) == true)
                     strPrice = "-0";

@@ -9721,7 +9721,7 @@

             if (strPrice.IndexOf('%') != -1)
             {
-                strError = "۸ַ '" + strPrice + "' ʽ󣺳ʹú%return_foregift_price%⣬۸ַв%";
+                strError = "价格字符串 '" + strPrice + "' 格式错误：除了使用宏%return_foregift_price%以外，价格字符串中不允许出现%符号";
                 return -1;
             }

@@ -9738,7 +9738,7 @@
             // 2008/6/23 new add
             string strPauseStart = DomUtil.GetAttr(nodeOverdue, "pauseStart");

-            // дDOM
+            // 写入DOM
             XmlDocument dom = new XmlDocument();
             dom.LoadXml("<root />");
             DomUtil.SetElementText(dom.DocumentElement,
@@ -9801,7 +9801,7 @@
                     if (String.IsNullOrEmpty(strNewComment) == false)
                     {
                         if (String.IsNullOrEmpty(strText) == false)
-                            strText += "";
+                            strText += "；";
                         strText += strNewComment;
                     }

@@ -9829,11 +9829,11 @@
                 if (String.IsNullOrEmpty(strNewComment) == false)
                 {
                     if (String.IsNullOrEmpty(strText) == false)
-                        strText += "";
+                        strText += "；";
                     strText += strNewComment;
                 }

-                // 2008/6/25 SetElementInnerXml()޸Ķ
+                // 2008/6/25 从SetElementInnerXml()修改而来
                 DomUtil.SetElementText(dom.DocumentElement,
                     "comment",
                     strText);
@@ -9853,7 +9853,7 @@
                 "returnOperator", strReturnOperator);

             DomUtil.SetElementText(dom.DocumentElement,
-                "operator", strOperator);   //
+                "operator", strOperator);   // 罚金操作者
             DomUtil.SetElementText(dom.DocumentElement,
                 "operTime", strOperTime);

@@ -9870,13 +9870,13 @@
             return 0;
         }

-        // ΥԼڶ߼¼ȥѡ<overdue>Ԫأҹһ¼¼׼ΥԼ
+        // 交违约金：在读者记录中去除所选的<overdue>元素，并且构造一批新记录准备加入违约金库
         // parameters:
-        //      strLibraryCode  ߼¼Ĺݴ
+        //      strLibraryCode  读者记录从属的馆代码
         // return:
         //      -1  error
-        //      0   domûб仯
-        //      1   dom˱仯
+        //      0   读者dom没有变化
+        //      1   读者dom发生了变化
         static int DoAmerceReaderXml(
             string strLibraryCode,
             ref XmlDocument readerdom,
@@ -9898,11 +9898,11 @@
                 "barcode");
             if (String.IsNullOrEmpty(strReaderBarcode) == true)
             {
-                strError = "߼¼оȻû<barcode>Ԫֵ";
+                strError = "读者记录中竟然没有<barcode>元素值";
                 return -1;
             }

-            bool bChanged = false;  // domǷ˸ı
+            bool bChanged = false;  // 读者dom是否发生了改变

             // string strNotFoundIds = "";

@@ -9930,9 +9930,9 @@
                 string strForegiftPrice = DomUtil.GetElementText(readerdom.DocumentElement,
                     "foregift");

-                string strFinalPrice = "";  // ʹõļ۸ַǴitem.NewPricenodeڵpriceѡҾȥһ۸ַ
+                string strFinalPrice = "";  // 最终使用的价格字符串。这是从item.NewPrice和node节点的price属性中选择出来，并且经过去除宏操作的一个最后价格字符串
                 string strAmerceRecord = "";
-                // ߼¼е<overdue>ԪغתΪΥԼļ¼ʽ
+                // 将读者记录中的<overdue>元素和属性转换为违约金库的记录格式
                 nRet = ConvertOverdueStringToAmerceRecord(node,
                     strLibraryCode,
                     strReaderBarcode,
@@ -9952,12 +9952,12 @@

                 Ids.Add(item.ID);

-                // ѺҪ/<foregift>Ԫڵļ۸ֵΪ˷ΪѾڼ۸ַУԶΪ
+                // 如果是押金，需要增/减<foregift>元素内的价格值。交费为增，退费为减。不过正负号已经含在价格字符串中，可以都理解为交费
                 string strReason = "";
                 strReason = DomUtil.GetAttr(node, "reason");

                 // 2008/11/11 new add
-                if (strReason == "Ѻ")
+                if (strReason == "押金。")
                 {
                     string strNewPrice = "";

@@ -9967,7 +9967,7 @@

                     if (strOldPrice.IndexOf('%') != -1)
                     {
-                        strError = "Զ߼¼<foregift>Ԫصļ۸ַ '" + strOldPrice + "' ʽ󣺼۸ַв%";
+                        strError = "来自读者记录<foregift>元素的价格字符串 '" + strOldPrice + "' 格式错误：价格字符串中不允许出现%符号";
                         return -1;
                     }

@@ -9978,26 +9978,26 @@
                     else
                         strPrice = item.NewPrice;

-                    // ۸ַǷΪ?
+                    // 看看价格字符串是否为宏?
                     if (strPrice == "%return_foregift_price%")
                     {
-                        // "-123.4+10.55-20.3"ļ۸ַת
+                        // 将形如"-123.4+10.55-20.3"的价格字符串反转正负号
                         // parameters:
-                        //      bSum    ǷҪ˳? trueʾҪ
+                        //      bSum    是否要顺便汇总? true表示要汇总
                         nRet = PriceUtil.NegativePrices(strOldPrice,
                             true,
                             out strPrice,
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "ת(Զ߼¼е<foregift>Ԫص)۸ַ '" + strOldPrice + "' ʱ: " + strError;
+                            strError = "反转(来自读者记录中的<foregift>元素的)价格字符串 '" + strOldPrice + "' 时出错: " + strError;
                             return -1;
                         }
                     }

                     if (strPrice.IndexOf('%') != -1)
                     {
-                        strError = "۸ַ '" + strPrice + "' ʽ󣺳ʹú%return_foregift_price%⣬۸ַв%";
+                        strError = "价格字符串 '" + strPrice + "' 格式错误：除了使用宏%return_foregift_price%以外，价格字符串中不允许出现%符号";
                         return -1;
                     }

@@ -10024,11 +10024,11 @@
                         "foregift",
                         strNewPrice);

-                    // Ƿ˳дһεĽʱ?
+                    // 是否顺便写入最近一次的交费时间?
                     bChanged = true;
                 }

-                // ڶ߼¼ɾڵ
+                // 在读者记录中删除这个节点
                 node.ParentNode.RemoveChild(node);
                 bChanged = true;
             }
@@ -10036,12 +10036,12 @@
             /*
             if (strNotFoundIds != "")
             {
-                strError = "idûƥ<overdue>Ԫ" + strNotFoundIds;
+                strError = "下列id没有相匹配的<overdue>元素" + strNotFoundIds;
                 return -1;
             }*/
             if (NotFoundIds.Count > 0)
             {
-                strError = "idûƥ<overdue>Ԫ: " + StringUtil.MakePathList(NotFoundIds);
+                strError = "下列id没有相匹配的<overdue>元素: " + StringUtil.MakePathList(NotFoundIds);
                 return -1;
             }

@@ -10051,7 +10051,7 @@
             return 0;
         }
         /*
-        // Ƿͣ
+        // 是否存在以停代金事项？
         static bool InPauseBorrowing(XmlDocument readerdom,
             out string strMessage)
         {
@@ -10066,7 +10066,7 @@

             string strPauseStart = "";

-            // ͣĿ
+            // 计算以停代金事项总数目
             for (int i = 0; i < nodes.Count; i++)
             {
                 node = nodes[i];
@@ -10075,7 +10075,7 @@
                     nTotalCount++;
             }

-            // ҵһ
+            // 找到第一个已启动事项
             for (int i = 0; i < nodes.Count; i++)
             {
                 node = nodes[i];
@@ -10086,25 +10086,25 @@

             if (nTotalCount > 0)
             {
-                strMessage = "δ " + nTotalCount.ToString() + " ͣ";
+                strMessage = "有未启动的 " + nTotalCount.ToString() + " 项以停代金事项";
                 return true;
             }

-            return false;   // ûҵ
+            return false;   // 没有找到已启动的事项
         FOUND:
             string strOverduePeriod = DomUtil.GetAttr(node, "overduePeriod");
-            strMessage = "һ " + DateTimeUtil.LocalDate(strPauseStart) + " ʼģΪ " + strOverduePeriod + " ͣ";
+            strMessage = "有一项于 " + DateTimeUtil.LocalDate(strPauseStart) + " 开始的，为期 " + strOverduePeriod + " 的以停代金过程";

             if (nTotalCount > 1)
-                strMessage += "(⻹δ "+(nTotalCount-1).ToString()+" )";
+                strMessage += "(此外还有未启动的 "+(nTotalCount-1).ToString()+" 项)";

             return true;
         }
          * */

-        // Ϊ˼ǰİ汾Уʹ⣬Ҫʹ
-        // ֵͣͣ
+        // 为了兼容以前的版本。除了在校本中使用外，尽量不要使用了
+        // 计算以停代金的停借周期值
         public int ComputePausePeriodValue(string strReaderType,
             long lValue,
             out long lResultValue,
@@ -10119,7 +10119,7 @@
                 out strError);
         }

-        // ֵͣͣ
+        // 计算以停代金的停借周期值
         public int ComputePausePeriodValue(string strReaderType,
             string strLibraryCode,
             long lValue,
@@ -10131,31 +10131,31 @@
             strPauseCfgString = "1.0";
             lResultValue = lValue;

-            //  'ͣ' ò
+            // 获得 '以停代金因子' 配置参数
             MatchResult matchresult;
             // return:
-            //      readerbook;ƥ 4
-            //      ֻreaderƥ䣬3
-            //      ֻbookƥ䣬2
-            //      readerbookͶƥ䣬1
+            //      reader和book类型均匹配 算4分
+            //      只有reader类型匹配，算3分
+            //      只有book类型匹配，算2分
+            //      reader和book类型都不匹配，算1分
             int nRet = this.GetLoanParam(
                 //null,
                 strLibraryCode,
                 strReaderType,
                 "",
-                "ͣ",
+                "以停代金因子",
                 out strPauseCfgString,
                 out matchresult,
                 out strError);
             if (nRet == -1)
             {
-                strError = " ݴ '" + strLibraryCode + "'   '" + strReaderType + "'  ͣ ʱ: " + strError;
+                strError = "获得 馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 的 以停代金因子 参数时发生错误: " + strError;
                 return -1;
             }

             if (nRet < 3 || string.IsNullOrEmpty(strPauseCfgString) == true)
             {
-                // ûҵƥ͵Ķ壬 1.0
+                // 没有找到匹配读者类型的定义，则按照 1.0 计算
                 strPauseCfgString = "1.0";
                 return 0;
             }
@@ -10168,7 +10168,7 @@
             }
             catch
             {
-                strError = "ͣ ַ '" + strPauseCfgString + "' ʽӦΪһС";
+                strError = "以停代金因子 配置字符串 '" + strPauseCfgString + "' 格式错误。应该为一个小数。";
                 return -1;
             }

@@ -10176,7 +10176,7 @@
             return 1;
         }

-        // װ汾Ϊ˼ǰűһδвҪʹ
+        // 包装版本，为了兼容以前脚本。一次代码中不要使用这个函数
         public int HasPauseBorrowing(
     Calendar calendar,
     XmlDocument readerdom,
@@ -10191,12 +10191,12 @@
                 out strError);
         }

-        // Ƿͣ
-        // text-level: ûʾ
+        // 是否存在以停代金事项？
+        // text-level: 用户提示
         // return:
         //      -1  error
-        //      0
-        //      1
+        //      0   不存在
+        //      1   存在
         public int HasPauseBorrowing(
             Calendar calendar,
             string strLibraryCode,
@@ -10221,7 +10221,7 @@
             string strFirstPauseStart = "";

-            // ҵһ
+            // 找到第一个已启动事项
             for (int i = 0; i < nodes.Count; i++)
             {
                 node = nodes[i];
@@ -10229,9 +10229,9 @@
                 strPauseStart = DomUtil.GetAttr(node, "pauseStart");
                 if (String.IsNullOrEmpty(strPauseStart) == false)
                 {
-                    // 2008/1/16
-                    // pauseStartԣûoverduePeriodԣڸʽ
-                    // ҪѰҸʽȷĵһ
+                    // 2008/1/16 修正：
+                    // 如果有pauseStart属性，但是没有overduePeriod属性，属于格式错误，
+                    // 需要接着向后寻找格式正确的第一项
                     string strOverduePeriod = DomUtil.GetAttr(node, "overduePeriod");
                     if (String.IsNullOrEmpty(strOverduePeriod) == true)
                     {
@@ -10247,7 +10247,7 @@
             long lTotalOverduePeriod = 0;
             string strTotalUnit = "";

-            // ͣʱܳȺ
+            // 遍历以停代金事项，计算时程总长度和最后结束日期
             for (int i = 0; i < nodes.Count; i++)
             {
                 node = nodes[i];
@@ -10258,7 +10258,7 @@
                 string strUnit = "";
                 long lOverduePeriod = 0;

-                // ޲
+                // 分析期限参数
                 nRet = ParsePeriodUnit(strOverduePeriod,
                     out lOverduePeriod,
                     out strUnit,
@@ -10272,15 +10272,15 @@
                 {
                     if (strTotalUnit != strUnit)
                     {
-                        // ʱ䵥λĲһ
+                        // 出现了时间单位的不一致
                         if (strTotalUnit == "day" && strUnit == "hour")
                             lOverduePeriod = lOverduePeriod / 24;
                         else if (strTotalUnit == "hour" && strUnit == "day")
                             lOverduePeriod = lOverduePeriod * 24;
                         else
                         {
-                            // text-level: ڲ
-                            strError = "ʱ䵥λ '" + strUnit + "' ǰùʱ䵥λ '" + strTotalUnit + "' һ£޷мӷ";
+                            // text-level: 内部错误
+                            strError = "时间单位 '" + strUnit + "' 和前面曾用过的时间单位 '" + strTotalUnit + "' 不一致，无法进行加法运算";
                             return -1;
                         }

@@ -10289,7 +10289,7 @@

                 long lResultValue = 0;
                 string strPauseCfgString = "";
-                // ֵͣͣ
+                // 计算以停代金的停借周期值
                 nRet = ComputePausePeriodValue(strReaderType,
                     strLibraryCode,
                     lOverduePeriod,
@@ -10310,10 +10310,10 @@
             {
                 if (nTotalCount > 0)
                 {
-                    // text-level: ûʾ
-                    strMessage = string.Format(this.GetString("sδͣ"), // " {0} δͣ"
+                    // text-level: 用户提示
+                    strMessage = string.Format(this.GetString("有s项未启动的以停代金事项"), // "有 {0} 项未启动的以停代金事项"
                         nTotalCount.ToString());
-                        // " " + nTotalCount.ToString() + " δͣ";
+                        // "有 " + nTotalCount.ToString() + " 项未启动的以停代金事项";
                     return 1;
                 }

@@ -10327,21 +10327,21 @@
             }
             catch
             {
-                // text-level: ڲ
-                strError = "ͣ迪ʼ '" + strFirstPauseStart + "' ʽ";
+                // text-level: 内部错误
+                strError = "停借开始日期 '" + strFirstPauseStart + "' 格式错误";
                 return -1;
             }

-            DateTime timeEnd;   // ͣĽ
+            DateTime timeEnd;   // 以停代金整个的结束日期
             DateTime nextWorkingDay;

-            // 㻹
+            // 测算还书日期
             // parameters:
-            //      calendar    Ϊnullʾзǹжϡ
+            //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
             // return:
-            //      -1
-            //      0   ɹtimeEndڹշΧڡ
-            //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+            //      -1  出错
+            //      0   成功。timeEnd在工作日范围内。
+            //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
             nRet = GetReturnDay(
                 calendar,
                 pause_start,
@@ -10352,21 +10352,21 @@
                 out strError);
             if (nRet == -1)
             {
-                // text-level: ڲ
-                strError = "ͣڹ̷: " + strError;
+                // text-level: 内部错误
+                strError = "测算以停代金结束日期过程发生错误: " + strError;
                 return -1;
             }

             bool bEndInNonWorkingDay = false;
             if (nRet == 1)
             {
-                // endڷǹ
+                // end在非工作日
                 bEndInNonWorkingDay = true;
             }

-            DateTime now_rounded = this.Clock.UtcNow;  //
-
-            // 滯ʱ
+            DateTime now_rounded = this.Clock.UtcNow;  //  今天
+
+            // 正规化时间
             nRet = RoundTime(strTotalUnit,
                 ref now_rounded,
                 out strError);
@@ -10386,47 +10386,47 @@

             if (strTotalUnit == "hour")
             {
-                // text-level: ûʾ
-                strMessage = string.Format(this.GetString("sͣsʼܼӦͣs, s"),
-                    // " {0} ͣ {1} ʼܼӦͣ {2},  {3} "
+                // text-level: 用户提示
+                strMessage = string.Format(this.GetString("共有s项以停代金事项，从s开始，总计应暂停借阅s, 于s结束"),
+                    // "共有 {0} 项以停代金事项，从 {1} 开始，总计应暂停借阅 {2}, 于 {3} 结束。"
                     nTotalCount.ToString(),
                     pause_start.ToString("s"),
                     lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit),
                     timeEnd.ToString("s"));
-                    // " " + nTotalCount.ToString() + " ͣ " + pause_start.ToString("s") + " ʼܼӦͣ " + lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit) + ",  " + timeEnd.ToString("s") + " ";
+                    // "共有 " + nTotalCount.ToString() + " 项以停代金事项，从 " + pause_start.ToString("s") + " 开始，总计应暂停借阅 " + lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit) + ", 于 " + timeEnd.ToString("s") + " 结束。";
             }
             else
             {
-                // text-level: ûʾ
-
-                strMessage = string.Format(this.GetString("sͣsʼܼӦͣs, s"),
-                    // " {0} ͣ {1} ʼܼӦͣ {2},  {3} "
+                // text-level: 用户提示
+
+                strMessage = string.Format(this.GetString("共有s项以停代金事项，从s开始，总计应暂停借阅s, 于s结束"),
+                    // "共有 {0} 项以停代金事项，从 {1} 开始，总计应暂停借阅 {2}, 于 {3} 结束。"
                     nTotalCount.ToString(),
                     pause_start.ToString("d"),  // "yyyy-MM-dd"
                     lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit),
                     timeEnd.ToString("d")); // "yyyy-MM-dd"
-                // " " + nTotalCount.ToString() + " ͣ " + pause_start.ToString("yyyy-MM-dd") + " ʼܼӦͣ " + lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit) + ",  " + timeEnd.ToString("yyyy-MM-dd") + " ";
+                // "共有 " + nTotalCount.ToString() + " 项以停代金事项，从 " + pause_start.ToString("yyyy-MM-dd") + " 开始，总计应暂停借阅 " + lTotalOverduePeriod.ToString() + GetDisplayTimeUnitLang(strTotalUnit) + ", 于 " + timeEnd.ToString("yyyy-MM-dd") + " 结束。";
             }

             if (lDelta > 0)
             {
-                // text-level: ûʾ
-                strMessage += this.GetString("ǰʱ̣ͣѾ"); // "ǰʱ̣ͣѾ"
+                // text-level: 用户提示
+                strMessage += this.GetString("到当前时刻，上述整个以停代金周期已经结束。"); // "到当前时刻，上述整个以停代金周期已经结束。"
             }

             return 1;
         }

-        // ͣ
-        // TODO: ־ָãڲUtcNowΪǰʱǲȷġӦ־мصĽĵʱʱ
-        // TODO: д־ͬʱҲҪд<overdues>Ԫһ˵Եλãʱ
+        // 处理以停代金功能
+        // TODO: 如果本函数被日志恢复程序调用，则其内部采用UtcNow作为当前时间就是不正确的。应当是日志中记载的借阅当时时间
+        // TODO: 写入日志的同时，也需要写入<overdues>元素内一个说明性的位置，便于随时查对
         // parameters:
-        //      strReaderRecPath    strActionΪ"refresh"ʱҪݡԱд־
+        //      strReaderRecPath    当strAction为"refresh"时，需要给这个参数内容。以便写入日志。
         // return:
         //      -1  error
-        //      0   readerdomû޸
-        //      1   readerdom޸
+        //      0   readerdom没有修改
+        //      1   readerdom发生了修改
         public int ProcessPauseBorrowing(
             string strLibraryCode,
             ref XmlDocument readerdom,
@@ -10440,7 +10440,7 @@
             int nRet = 0;

-            //
+            // 启动
             if (strAction == "start")
             {
                 XmlNodeList nodes = readerdom.DocumentElement.SelectNodes("overdues/overdue");
@@ -10453,11 +10453,11 @@
                     XmlNode node = nodes[i];
                     string strPauseStart = DomUtil.GetAttr(node, "pauseStart");
                     if (String.IsNullOrEmpty(strPauseStart) == false)
-                        return 0;   // Ѿ˵
+                        return 0;   // 已经有启动了的事项，不必再启动
                 }

                 // 2008/1/16 changed
-                // ѰҵһoverduePeriodֵΪ
+                // 寻找第一个具有overduePeriod属性值的事项，设置为启动
                 bool bFound = false;
                 for (int i = 0; i < nodes.Count; i++)
                 {
@@ -10465,7 +10465,7 @@
                     string strOverduePeriod = DomUtil.GetAttr(node, "overduePeriod");
                     if (String.IsNullOrEmpty(strOverduePeriod) == false)
                     {
-                        // ѵһoverduePeriodֵΪ
+                        // 把第一个具有overduePeriod属性值的事项设置为启动
                         DomUtil.SetAttr(node, "pauseStart", this.Clock.GetClock());
                         bFound = true;
                         break;
@@ -10473,29 +10473,29 @@
                 }

                 if (bFound == false)
-                    return 0;   // ûҵoverduePeriodֵ
-
-
-                // дͳָ
-                // Ƕ߸
+                    return 0;   // 没有找到具有overduePeriod属性值的事项
+
+
+                // 写入统计指标
+                // 启动事项数，而不是读者个数
                 if (this.Statis != null)
                     this.Statis.IncreaseEntryValue(
                     strLibraryCode,
-                    "",
-                    "ͣ",
+                    "出纳",
+                    "以停代金事项启动",
                     1);

-                // TODO: ¼־¼Ķ
+                // TODO: 创建事件日志，记录启动事项的动作
                 return 1;
             }

-            // ˢ
+            // 刷新
             if (strAction == "refresh")
             {
                 if (String.IsNullOrEmpty(strReaderRecPath) == true)
                 {
-                    strError = "refreshʱṩstrReaderRecPathֵ޷־¼";
+                    strError = "refresh时必须提供strReaderRecPath参数值，否则无法创建日志记录";
                     return -1;
                 }

@@ -10509,7 +10509,7 @@
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "operation",
                     "amerce");
@@ -10536,16 +10536,16 @@
                         break;

-                    // ҵһ
+                    // 找到第一个已启动事项
                     XmlNode node = null;
                     string strPauseStart = "";
-                    XmlNode node_firstOverdueItem = null;   // һϳ(һ˵)<overdue>Ԫ
+                    XmlNode node_firstOverdueItem = null;   // 第一项符合超期条件(但不一定启动了的)的<overdue>元素
                     for (int i = 0; i < nodes.Count; i++)
                     {
                         node = nodes[i];
                         string strTempOverduePeriod = DomUtil.GetAttr(node, "overduePeriod");
                         if (String.IsNullOrEmpty(strTempOverduePeriod) == true)
-                            continue;   // ЩûoverduePeriodԪ
+                            continue;   // 忽略那些没有overduePeriod的元素

                         if (node_firstOverdueItem == null)
                             node_firstOverdueItem = node;
@@ -10554,14 +10554,14 @@
                             goto FOUND;
                     }

-                    // ûҵҪѵһ
+                    // 没有找到已启动的事项，则需要把第一个符合条件的事项启动
                     if (node_firstOverdueItem != null)
                     {
                         DomUtil.SetAttr(node_firstOverdueItem,
                             "pauseStart",
                             this.Clock.GetClock());
                         bChanged = true;
-                        continue;   // ִˢ²ƺûбҪΪûиտʼģ
+                        continue;   // 重新执行刷新操作似乎没有必要，因为没有刚开始就立即结束的？
                     }
                     break;
                 FOUND:
@@ -10571,7 +10571,7 @@

                     string strOverduePeriod = DomUtil.GetAttr(node, "overduePeriod");

-                    // ޲
+                    // 分析期限参数
                     nRet = ParsePeriodUnit(strOverduePeriod,
                         out lOverduePeriod,
                         out strUnit,
@@ -10582,7 +10582,7 @@
                     long lResultValue = 0;
                     string strPauseCfgString = "";

-                    // ֵͣͣ
+                    // 计算以停代金的停借周期值
                     nRet = ComputePausePeriodValue(strReaderType,
                         strLibraryCode,
                         lOverduePeriod,
@@ -10612,13 +10612,13 @@

                     DateTime nextWorkingDay = new DateTime(0);
                     long lDistance = 0;
-                    // ʱ֮ľ
+                    // 计算时间之间的距离
                     // parameters:
-                    //      calendar    Ϊnullʾзǹжϡ
+                    //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
                     // return:
-                    //      -1
-                    //      0   ɹtimeEndڹշΧڡ
-                    //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+                    //      -1  出错
+                    //      0   成功。timeEnd在工作日范围内。
+                    //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
                     nRet = GetTimeDistance(
                         null,   // Calendar calendar,
                         strUnit,
@@ -10633,38 +10633,38 @@
                     long lDelta = lDistance - lOverduePeriod;

                     if (lDelta < 0)
-                        break;  // Ѿõδ
-
-                    // Ѿͷڵ<overdue>Ԫ
+                        break;  // 已经起作用的事项尚未到期
+
+                    // 消除已经惩罚到期的<overdue>元素
                     DomUtil.SetAttr(node, "pauseStart", "");
                     Debug.Assert(node.ParentNode != null);
                     if (node.ParentNode != null)
                     {
-                        // ¼־
+                        // 推入事件日志
                         XmlDocumentFragment fragment = domOperLog.CreateDocumentFragment();
                         fragment.InnerXml = node.OuterXml;
                         node_expiredOverdues.AppendChild(fragment);

                         nExpiredCount++;

-                        // ڵ<overdue>ԪشӶ߼¼ɾ
+                        // 将到期的<overdue>元素从读者记录中删除
                         node.ParentNode.RemoveChild(node);
                         bChanged = true;

-                        // дͳָ
-                        // Ƕ߸
+                        // 写入统计指标
+                        // 到期事项数，而不是读者个数
                         if (this.Statis != null)
                             this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "",
-                            "ͣ",
+                            "出纳",
+                            "以停代金事项到期",
                             1);
                     }

-                    // TODO: ¼־¼Ķ
-
-
-                    // һoverduePeriodԵ<overdue>Ԫ
+                    // TODO: 创建事件日志，记录到期消除事项的动作
+
+
+                    // 启动下一个具有overduePeriod属性的<overdue>元素
                     nodes = readerdom.DocumentElement.SelectNodes("overdues/overdue");
                     for (int i = 0; i < nodes.Count; i++)
                     {
@@ -10674,12 +10674,12 @@
                             goto FOUND_1;
                     }

-                    break;// ûҵһ
+                    break;// 没有找到下一个可启动的事项了
                 FOUND_1:

                     TimeSpan delta;

-                    // TimeSpan
+                    // 构造TimeSpan
                     nRet = BuildTimeSpan(
                         lDelta,
                         strUnit,
@@ -10690,26 +10690,26 @@

                     DateTime timeLastEnd = timeNow - delta;

-                    // ѵһΪ
-                    // һڵӣǽ
+                    // 把第一个事项设置为启动
+                    // 启动的日期是上一个事项到期的日子，而不是今日
                     DomUtil.SetAttr(nodes[0],
                         "pauseStart",
                         DateTimeUtil.Rfc1123DateTimeStringEx(timeLastEnd.ToLocalTime()));
                     bChanged = true;

-                    // дͳָ
-                    // Ƕ߸
+                    // 写入统计指标
+                    // 启动事项数，而不是读者个数
                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(
                         strLibraryCode,
-                        "",
-                        "ͣ",
+                        "出纳",
+                        "以停代金事项启动",
                         1);

-                    // TODO: ¼־¼Ķ
-
-                    // Ҫˢ£ΪϾ͵
+                    // TODO: 创建事件日志，记录启动事项的动作
+
+                    // 需要重新刷新，因为刚启动的事项可能马上就到期
                 } // end of for

                 if (nExpiredCount > 0)
@@ -10722,12 +10722,12 @@
                         strOperTime);

                     // 2012/5/7
-                    // ޸ǰĶ߼¼
+                    // 修改前的读者记录
                     XmlNode node = DomUtil.SetElementText(domOperLog.DocumentElement,
-    "oldReaderRecord", strOldReaderXml);   // 2014/3/8 ǰ oldReeaderRecord
+    "oldReaderRecord", strOldReaderXml);   // 2014/3/8 以前 oldReeaderRecord
                     DomUtil.SetAttr(node, "recPath", strReaderRecPath);

-                    // ־а޸ĺĶ߼¼
+                    // 日志中包含修改后的读者记录
                     node = DomUtil.SetElementText(domOperLog.DocumentElement,
                         "readerRecord", readerdom.OuterXml);
                     DomUtil.SetAttr(node, "recPath", strReaderRecPath);
@@ -10737,7 +10737,7 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "Refresh Pause Borrowing  д־ʱ: " + strError;
+                        strError = "Refresh Pause Borrowing 操作 写入日志时发生错误: " + strError;
                         return -1;
                     }
                 }
@@ -10749,12 +10749,12 @@
             return 0;
         }

-        // 飺ڶ߼¼ȥϢȥĽϢʷֶ
-        // 볬ڼ龯
+        // 还书：在读者记录中去除借书信息，所去除的借书信息进入历史字段
+        // 加入超期检查警告
         // parameters:
-        //      strItemBarcodeParam return() API е strItemBarcodeParamܰ @refID: ǰ׺
-        //      strItemBarcode  ¼е <barcode> Ԫ
-        //      strDeletedBorrowFrag شӶ߼¼ɾ<borrow>ԪxmlƬַ(OuterXml)
+        //      strItemBarcodeParam return() API 中的 strItemBarcodeParam，可能包含 @refID: 前缀部分
+        //      strItemBarcode  册记录中的 <barcode> 元素内容
+        //      strDeletedBorrowFrag 返回从读者记录中删除的<borrow>元素xml片断字符串(OuterXml)
         int DoReturnReaderXml(
             string strLibraryCode,
             ref XmlDocument readerdom,
@@ -10771,40 +10771,40 @@
             strDeletedBorrowFrag = "";
             int nRet = 0;

-            // ʱ strItemBarcodeParam п refID: ǰ׺
+            // 此时 strItemBarcodeParam 中可能有 refID: 前缀部分

             if (String.IsNullOrEmpty(strItemBarcodeParam) == true)
             {
-                strError = "ŲΪ";
+                strError = "册条码号不能为空";
                 return -1;
             }

             XmlNode nodeBorrow = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcodeParam + "']");
             if (nodeBorrow == null)
             {
-                // ٳһֱ
+                // 再尝试一次直接用 册条码号
                 if (string.IsNullOrEmpty(strItemBarcode) == false)
                     nodeBorrow = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
                 if (nodeBorrow == null)
                 {
-                    strError = "ڶ߼¼ö߲δĹ '" + strItemBarcodeParam + "'";
+                    strError = "在读者记录表明该读者并未曾借阅过册 '" + strItemBarcodeParam + "'。";
                     return -1;
                 }
             }

-            // ɾǰ
+            // 删除前记载下来
             strDeletedBorrowFrag = nodeBorrow.OuterXml;

-            // ɾĲϢ
+            // 删除借阅册信息
             nodeBorrow.ParentNode.RemoveChild(nodeBorrow);

-            // Ϣ
+            // 增添超期信息
             if (String.IsNullOrEmpty(strOverdueString) != true)
             {
                 XmlDocumentFragment fragment = readerdom.CreateDocumentFragment();
                 fragment.InnerXml = strOverdueString;

-                // ǷoverduesԪ
+                // 看看根下面是否有overdues元素
                 XmlNode root = readerdom.DocumentElement.SelectSingleNode("overdues");
                 if (root == null)
                 {
@@ -10813,38 +10813,38 @@
                 }

                 // root.AppendChild(fragment);
-                // 뵽ǰ
+                // 插入到最前面
                 DomUtil.InsertFirstChild(root, fragment);

                 if (StringUtil.IsInList("pauseBorrowing", this.OverdueStyle) == true)
                 {
                     //
-                    // ͣ
+                    // 处理以停代金功能
                     // return:
                     //      -1  error
-                    //      0   readerdomû޸
-                    //      1   readerdom޸
+                    //      0   readerdom没有修改
+                    //      1   readerdom发生了修改
                     nRet = ProcessPauseBorrowing(
                         strLibraryCode,
                         ref readerdom,
-                        "", // ΪactionΪstartʡ
+                        "", // 因为action为start，可以省略
                         strReturnOperator,
                         "start",
                         strClientAddress,
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "ͣĹз: " + strError;
+                        strError = "在启动以停代金的过程中发生错误: " + strError;
                         return -1;
                     }
                 }

             }

-            // 뵽ʷֶ
-            {
-                // ǷborrowHistoryԪ
+            // 加入到借阅历史字段中
+            {
+                // 看看根下面是否有borrowHistory元素
                 XmlNode root = readerdom.DocumentElement.SelectSingleNode("borrowHistory");
                 if (root == null)
                 {
@@ -10857,27 +10857,27 @@
                     XmlDocumentFragment fragment = readerdom.CreateDocumentFragment();
                     fragment.InnerXml = strDeletedBorrowFrag;

-                    // 뵽ǰ
+                    // 插入到最前面
                     XmlNode temp = DomUtil.InsertFirstChild(root, fragment);
                     if (temp != null)
                     {
-                        // 뻹ʱ
+                        // 加入还书时间
                         DomUtil.SetAttr(temp, "returnDate", strOperTime);

                         string strBorrowOperator = DomUtil.GetAttr(temp, "operator");
-                        // ԭoperatorֵƵborrowOperator
+                        // 把原来的operator属性值复制到borrowOperator属性中
                         DomUtil.SetAttr(temp, "borrowOperator", strBorrowOperator);
-                        // operatorʱҪʾ
+                        // operator此时需要表示还书操作者了
                         DomUtil.SetAttr(temp, "operator", strReturnOperator);

                     }
                 }

-                // 100ɾ
+                // 如果超过100个，则删除多余的
                 while (root.ChildNodes.Count > this.MaxPatronHistoryItems)
                     root.RemoveChild(root.ChildNodes[root.ChildNodes.Count - 1]);

-                // ֵ
+                // 增量借阅量属性值
                 string strBorrowCount = DomUtil.GetAttr(root, "count");
                 if (String.IsNullOrEmpty(strBorrowCount) == true)
                     strBorrowCount = "1";
@@ -10898,28 +10898,28 @@
             return 0;
         }

-        // һǰΨһַ
+        // 获得一个代表当前超期事项的唯一性字符串
         public string GetOverdueID()
         {
-            // һԴӦ
+            // 获得一个自从应用启动以来的增量序号
             long lNumber = Interlocked.Increment(ref m_lSeed);

-            // ôǰʱticks
+            // 获得代表当前时间的ticks
             long lTicks = DateTime.Now.Ticks;

             return lTicks.ToString() + "-" + lNumber.ToString();
         }

-        // ΥԼļ۸ַ
-        // 㷨
-        // 1) ַ RMB0.5YUAN/day Ϊ֡prefix=RMB single_price=0.5 postfix=YUAN unit=day
-        // 2) ճڵʱ䣬 singgle_priceȻ prefix  postfic ֣ͿԵõַҪһʱ䵥λ㡣Ŀǰֻ֧ day  hour ֮任
-        // ע RMB0.5YUAN/day RMB0.5YUAN мȰǰ׺Ҳ˺׺ǸӡʵӦУһֻǰ׺֣ "CNY0.5"
+        // 计算出超期违约金的价格字符串
+        // 算法是
+        // 1) 将字符串 RMB0.5YUAN/day 拆分为几个部分。prefix=RMB single_price=0.5 postfix=YUAN unit=day
+        // 2) 按照超期的时间，乘以 singgle_price，然后加上 prefix 和 postfic 部分，就可以得到结果字符串。不过，还需要考虑一下时间单位换算。目前只支持在 day 和 hour 之间换算
+        // 注：所举例的 RMB0.5YUAN/day，金额部分 RMB0.5YUAN 中既包含了前缀，也包含了后缀，是个不错的例子。但实际应用中，一般只有前缀部分，例如 "CNY0.5"
         // parameters:
-        //      strPriceCfgString   ΥԼַ̬Ϊ 'CNY0.5/day'
-        //      lDistance   ʱ
-        //      strPeriodUnit   ʱ䵥λ
-        //      strOverduePrice ΥԼ۸ַ
+        //      strPriceCfgString   违约金配置字符串。形态为 'CNY0.5/day'
+        //      lDistance   超期时间数
+        //      strPeriodUnit   超期时间单位
+        //      strOverduePrice 返回所计算出的违约金价格字符串
         // return:
         //      -1  error
         //      0   succeed
@@ -10934,11 +10934,11 @@
             strError = "";
             int nRet = 0;

-            // strPriceCfgString
+            // 解析strPriceCfgString参数
             string strPriceBase = "";
             string strPerUnit = "day";

-            // '/'Ǽ۸ұʱ䵥λ '0.5yuan/day'
+            // '/'左边是价格，右边是时间单位。例如 '0.5yuan/day'
             nRet = strPriceCfgString.IndexOf("/");
             if (nRet == -1)
             {
@@ -10962,11 +10962,11 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "ַ '" + strPriceBase + "' ʱ: " + strError;
+                strError = "解析金额字符串 '" + strPriceBase + "' 时发生错误: " + strError;
                 return -1;
             }

-            // ʱĿĵλ  ΥԼʱ䵥λ ÷
+            // 如果超期时间数目的单位 和 配置违约金额的时间单位 正好符合
             if (strPeriodUnit.ToLower() == strPerUnit.ToLower())
             {
                 strOverduePrice = strPrefix + ((double)(fSinglePrice * lDistance)).ToString() + strPostfix;
@@ -10989,19 +10989,19 @@
                 return 0;
             }

-            strError = "õ ʱ䵥λ '" + strPeriodUnit + "'  ΥԼʱ䵥λ '" + strPerUnit + "' ֮޷л㡣";
+            strError = "配置的 超期时间单位 '" + strPeriodUnit + "' 和 违约金额时间单位 '" + strPerUnit + "' 之间无法进行换算。";
             return -1;
         }

-        // ʧͼΥԼļ۸ַ
+        // 计算出丢失图书的违约金的价格字符串
         // parameters:
-        //      strPriceCfgString   ΥԼʡ̬ΪһС '10.5'
-        //      strItemPrice   ԭ۸
-        //      strLostPrice ΥԼ۸ַ
+        //      strPriceCfgString   违约金倍率。形态为一个小数，例如 '10.5'
+        //      strItemPrice   册原价格
+        //      strLostPrice 返回所计算出的违约金价格字符串
         // return:
         //      -1  error
         //      0   succeed
-        //      1   Ϊȱԭʼ۸񣬴Ӷֻô˴ʺŵʽ
+        //      1   因为缺原始价格，从而只好创建了带问号的算式
         int ComputeLostPrice(
             string strPriceCfgString,
             string strItemPrice,
@@ -11020,11 +11020,11 @@
             }
             catch
             {
-                strError = "ΥԼַ '"+strPriceCfgString+"' ʽӦΪһС";
+                strError = "违约金因子配置字符串 '"+strPriceCfgString+"' 格式错误。应该为一个小数。";
                 return -1;
             }

-            // ԭʼ۸Ϊ
+            // 如果原始价格为空
             if (String.IsNullOrEmpty(strItemPrice) == true)
             {
                 strLostPrice = "?*" + strPriceCfgString;
@@ -11032,25 +11032,25 @@
             }

             /*
-            // ۸ַпܴڵĳ˺š
+            // 处理价格字符串中可能存在的乘号、除号
             List<string> temp_prices = new List<string>();
             temp_prices.Add(strItemPrice);

             string strOutputPrice = "";
-            // TODO: ƺSumPrices()
+            // TODO: 似乎可用SumPrices()
             nRet = PriceUtil.TotalPrice(temp_prices,
                 out strOutputPrice,
                 out strError);
             if (nRet == -1)
             {
-                strError = "۸ַ '" + strItemPrice + "' ʱ1: " + strError;
+                strError = "解析价格字符串 '" + strItemPrice + "' 时发生错误1: " + strError;
                 return -1;
             }

             strItemPrice = strOutputPrice;
              * */
-            // 滯۸ַ
-            // ۸ַпܴڵĳ˺š
+            // 正规化价格字符串
+            // 处理价格字符串中可能存在的乘号、除号
             nRet = CanonicalizeItemPrice(ref strItemPrice,
                 out strError);
             if (nRet == -1)
@@ -11060,7 +11060,7 @@
             string strPrefix = "";
             string strPostfix = "";

-            // ܹͬʱǰ׺ͺ׺
+            // 最好能够同时处理前缀和后缀
             nRet = ParsePriceUnit(strItemPrice,
                 out strPrefix,
                 out fItemPrice,
@@ -11068,7 +11068,7 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "۸ַ '" + strItemPrice + "' ʱ2: " + strError;
+                strError = "解析价格字符串 '" + strItemPrice + "' 时发生错误2: " + strError;
                 return -1;
             }

@@ -11076,8 +11076,8 @@
             return 0;
         }

-        // 滯۸ַ
-        // ۸ַпܴڵĳ˺š
+        // 正规化价格字符串
+        // 处理价格字符串中可能存在的乘号、除号
         public static int CanonicalizeItemPrice(ref string strPrice,
             out string strError)
         {
@@ -11087,13 +11087,13 @@
             temp_prices.Add(strPrice);

             string strOutputPrice = "";
-            // TODO: ƺSumPrices()
+            // TODO: 似乎可用SumPrices()
             int nRet = PriceUtil.TotalPrice(temp_prices,
                 out strOutputPrice,
                 out strError);
             if (nRet == -1)
             {
-                strError = "滯۸ַ '" + strPrice + "' ʱ1: " + strError;
+                strError = "正规化价格字符串 '" + strPrice + "' 时发生错误1: " + strError;
                 return -1;
             }

@@ -11102,13 +11102,13 @@
         }

-        // ڲ¼ɾϢ
+        // 在册记录中删除借书信息
         // parameters:
-        //      strOverdueString    ʾϢַborrowOperatorԱʾĲߣoperatorԱʾ
+        //      strOverdueString    表示超期信息的字符串。borrowOperator属性表示借阅操作者；operator属性表示还书操作者
         // return:
-        //      -1
-        //      0
-        //      1   ڻ߶ʧ
+        //      -1  出错
+        //      0   正常
+        //      1   超期还书或者丢失处理的情况
         int DoReturnItemXml(
             // bool bLost,
             string strAction,
@@ -11149,44 +11149,44 @@
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
 #if NO
-                // text-level: ڲ
-                strError = "¼вŲΪ";
+                // text-level: 内部错误
+                strError = "册记录中册条码号不能为空";
                 return -1;
 #endif
-                // Ϊգ οID
+                // 如果册条码号为空，则记载 参考ID
                 string strRefID = DomUtil.GetElementText(itemdom.DocumentElement,
     "refID");
                 if (String.IsNullOrEmpty(strRefID) == true)
                 {
-                    // text-level: ڲ
-                    strError = "¼вźͲοIDӦͬʱΪ";
+                    // text-level: 内部错误
+                    strError = "册记录中册条码号和参考ID不应同时为空";
                     return -1;
                 }
                 strItemBarcode = "@refID:" + strRefID;
             }

-            // ݲصص
+            // 馆藏地点
             string strLocation = DomUtil.GetElementText(itemdom.DocumentElement, "location");
-            // ȥ#reservation
+            // 去掉#reservation部分
             strLocation = StringUtil.GetPureLocationString(strLocation);

-            // Ȼһ¼ѾˣǾҪܲĹݲصصǷڵĹݲصص㡣ֲһ£Ҫ
-            // ĹݲصصǷ϶ڵĹݲصصǺ
+            // 既然一个册记录已经被允许借了，那就无条件要允许还，不管册的馆藏地点是否属于这个读者所在的馆藏地点。如果发现不一致，需要警告
+            // 检查册所属的馆藏地点是否合读者所在的馆藏地点吻合
                 string strCode = "";
                 string strRoom = "";
             {

-                //
+                // 解析
                 ParseCalendarName(strLocation,
             out strCode,
             out strRoom);
                 if (strCode != strLibraryCode)
                 {
-                    strWarning += "¼Ĺݲص '" + strLocation + "' ڶڹݴ '" + strLibraryCode + "'ע";
-                }
-            }
-
-            // ȡݲصб
+                    strWarning += "册记录的馆藏地 '" + strLocation + "' 不属于读者所在馆代码 '" + strLibraryCode + "'，请注意后续处理。";
+                }
+            }
+
+            // 检查存取定义馆藏地列表
             if (string.IsNullOrEmpty(strAccessParameters) == false && strAccessParameters != "*")
             {
                 bool bFound = false;
@@ -11216,21 +11216,21 @@

                 if (bFound == false)
                 {
-                    strError = strActionName + "ܾ¼Ĺݲص '" + strLocation + "' ڵǰûȡ涨 "+strActionName+" ĹݲصɷΧ '" + strAccessParameters + "' ֮";
+                    strError = strActionName + "操作被拒绝。因册记录的馆藏地 '" + strLocation + "' 不在当前用户存取定义规定的 "+strActionName+" 操作的馆藏地许可范围 '" + strAccessParameters + "' 之内";
                     return -1;
                 }
             }
             ///
-            // Ƿܹ
+            // 检查册是否能够被还回
             bool bResultValue = false;
             string strMessageText = "";

-            // ִнűItemCanReturn
+            // 执行脚本函数ItemCanReturn
             // parameters:
             // return:
             //      -2  not found script
-            //      -1
-            //      0   ɹ
+            //      -1  出错
+            //      0   成功
             nRet = app.DoItemCanReturnScriptFunction(
                 sessioninfo.Account,
                 itemdom,
@@ -11239,7 +11239,7 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "ִCanReturn()űʱ: " + strError;
+                strError = "执行CanReturn()脚本函数时出错: " + strError;
                 return -1;
             }
             if (nRet == -2)
@@ -11247,16 +11247,16 @@
             }
             else
             {
-                // ݽűؽ
+                // 根据脚本返回结果
                 if (bResultValue == false)
                 {
-                    strError = "ʧܡΪ " + strItemBarcode + " ״̬Ϊ " + strMessageText;
+                    strError = "还书失败。因为册 " + strItemBarcode + " 的状态为 " + strMessageText;
                     return -1;
                 }
             }

             //
-            // իļ
+            // 个人书斋的检查
             string strPersonalLibrary = "";
             if (sessioninfo.UserType == "reader"
                 && sessioninfo.Account != null)
@@ -11266,7 +11266,7 @@
             {
                 if (strRoom != "*" && StringUtil.IsInList(strRoom, strPersonalLibrary) == false)
                 {
-                    strError = "ʧܡǰû '" + sessioninfo.Account.Barcode + "' ֻܲݴ '" + strLibraryCode + "' еصΪ '" + strPersonalLibrary + "' ͼ飬ܲصΪ '" + strRoom + "' ͼ";
+                    strError = "还书失败。当前用户 '" + sessioninfo.Account.Barcode + "' 只能操作馆代码 '" + strLibraryCode + "' 中地点为 '" + strPersonalLibrary + "' 的图书，不能操作地点为 '" + strRoom + "' 的图书";
                     return -1;
                 }
             }
@@ -11275,17 +11275,17 @@

             string strOverdueMessage = "";

-            // ͼ
+            // 图书类型
             string strBookType = DomUtil.GetElementText(itemdom.DocumentElement, "bookType");

             string strBorrowDate = DomUtil.GetElementText(itemdom.DocumentElement, "borrowDate");
             string strPeriod = DomUtil.GetElementText(itemdom.DocumentElement, "borrowPeriod");

-            // ǽʱĲ
+            // 这是借阅时的操作者
             string strBorrowOperator = DomUtil.GetElementText(itemdom.DocumentElement, "operator");

-            // ״̬
+            // 册状态
             string strState = DomUtil.GetElementText(itemdom.DocumentElement,
                 "state");
             string strComment = DomUtil.GetElementText(itemdom.DocumentElement,
@@ -11293,7 +11293,7 @@
             string strBorrower = DomUtil.GetElementText(itemdom.DocumentElement,
                 "borrower");

-            // ۸
+            // 册价格
             string strItemPrice = DomUtil.GetElementText(itemdom.DocumentElement, "price");

@@ -11301,7 +11301,7 @@
                 && String.IsNullOrEmpty(strItemPrice) == true
                 && bForce == false)
             {
-                strError = "۸(<price>Ԫ)Ϊգ޷㶪ʧͼΥԼΪò۸Ϣ½жʧ";
+                strError = "册价格(<price>元素)为空，无法计算丢失图书违约金数。请先为该册登入价格信息，再重新进行丢失声明处理。";
                 return -1;
             }

@@ -11315,11 +11315,11 @@
             {
                 if (bForce == true)
                     goto DOCHANGE;
-                strError = "ַ '" + strBorrowDate + "' ʽ";
+                strError = "借阅日期字符串 '" + strBorrowDate + "' 格式错误";
                 return -1;
             }

-            // Ƿ
+            // 看看是否超期
             string strPeriodUnit = "";
             long lPeriodValue = 0;

@@ -11331,20 +11331,20 @@
             {
                 if (bForce == true)
                     goto DOCHANGE;
-                strError = "¼нֵ '" + strPeriod + "' ʽ: " + strError;
+                strError = "册记录中借阅期限值 '" + strPeriod + "' 格式错误: " + strError;
                 return -1;
             }

             DateTime timeEnd = DateTime.MinValue;
             DateTime nextWorkingDay = DateTime.MinValue;

-            // 㻹
+            // 测算还书日期
             // parameters:
-            //      calendar    Ϊnullʾзǹжϡ
+            //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
             // return:
-            //      -1
-            //      0   ɹtimeEndڹշΧڡ
-            //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+            //      -1  出错
+            //      0   成功。timeEnd在工作日范围内。
+            //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
             nRet = LibraryApplication.GetReturnDay(
                 calendar,
                 borrowdate,
@@ -11357,7 +11357,7 @@
             {
                 if (bForce == true)
                     goto DOCHANGE;
-                strError = "㻹ڹ̷: " + strError;
+                strError = "测算还书日期过程发生错误: " + strError;
                 return -1;
             }

@@ -11366,13 +11366,13 @@
             bool bEndInNonWorkingDay = false;
             if (nRet == 1)
             {
-                // ڷǹ
+                // 结束在非工作日
                 bEndInNonWorkingDay = true;
             }

-            DateTime now = app.Clock.UtcNow;  //
-
-            // 滯ʱ
+            DateTime now = app.Clock.UtcNow;  //  今天  当下
+
+            // 正规化时间
             DateTime now_rounded = now;
             nRet = RoundTime(strPeriodUnit,
                 ref now_rounded,
@@ -11384,7 +11384,7 @@

             long lOver = 0;
             long lDelta = 0;
-            long lDelta1 = 0;   // УǹգĲ
+            long lDelta1 = 0;   // 校正（考虑工作日）后的差额

             nRet = ParseTimeSpan(
                 delta,
@@ -11418,20 +11418,20 @@
                 string strOverduePrice = "";

-                //  'ΥԼ' ò
+                // 获得 '超期违约金因子' 配置参数
                 string strPriceCfgString = "";
                 MatchResult matchresult;
                 // return:
-                //      readerbook;ƥ 4
-                //      ֻreaderƥ䣬3
-                //      ֻbookƥ䣬2
-                //      readerbookͶƥ䣬1
+                //      reader和book类型均匹配 算4分
+                //      只有reader类型匹配，算3分
+                //      只有book类型匹配，算2分
+                //      reader和book类型都不匹配，算1分
                 nRet = app.GetLoanParam(
                     //null,
                     strLibraryCode,
                     strReaderType,
                     strBookType,
-                    "ΥԼ",
+                    "超期违约金因子",
                     out strPriceCfgString,
                     out matchresult,
                     out strError);
@@ -11439,7 +11439,7 @@
                 {
                     if (bForce == true)
                         goto CONTINUE_OVERDUESTRING;
-                    strError = "ʧܡ ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'  ΥԼ ʱ: " + strError;
+                    strError = "还书失败。获得 馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 超期违约金因子 参数时发生错误: " + strError;
                     return -1;
                 }
                 if (nRet < 4) // nRet == 0
@@ -11447,12 +11447,12 @@
                     if (bForce == true)
                         goto CONTINUE_OVERDUESTRING;

-                    strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'  ΥԼ ޷: " + strError;
+                    strError = "还书失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 超期违约金因子 参数无法获得: " + strError;
                     return -1;
                 }

                 // long lOver = 0;
-                // <amerce overdueStyle="...">аincludeNoneworkingDayʾհĩβǹյ㷨򣬾ǲĩβǹգӵһտʼĳ
+                // 如果<amerce overdueStyle="...">中包含了includeNoneworkingDay，表示超期天数按照包含了末尾非工作日的算法。否则，就是不包含末尾非工作日，从第一个工作日开始后面的超过天数。
                 if (StringUtil.IsInList("includeNoneworkingDay", this.OverdueStyle) == true)
                     lOver = lDelta;
                 else
@@ -11460,7 +11460,7 @@

                 nRet = ComputeOverduePrice(
                     strPriceCfgString,
-                    lDelta1,    // յĲ
+                    lDelta1,    // 按照调整后的差额计算
                     strPeriodUnit,
                     out strOverduePrice,
                     out strError);
@@ -11469,29 +11469,29 @@
                     if (bForce == true)
                         goto CONTINUE_OVERDUESTRING;

-                    strError = "ʧܡ㳬ΥԼ۸ʱ: " + strError;
+                    strError = "还书失败。计算超期违约金价格时出错: " + strError;
                     return -1;
                 }

             CONTINUE_OVERDUESTRING:

-                strOverdueMessage += "ʱѳ " + Convert.ToString(lOver) + GetDisplayTimeUnitLang(strPeriodUnit) + "г";
-
-                // XmlTextWriterDOMstrOverdueString
+                strOverdueMessage += "还书时已超过借阅期限 " + Convert.ToString(lOver) + GetDisplayTimeUnitLang(strPeriodUnit) + "。请履行超期手续。";
+
+                // 最好用XmlTextWriter或者DOM来构造strOverdueString
                 XmlDocument tempdom = new XmlDocument();
                 tempdom.LoadXml("<overdue />");
                 DomUtil.SetAttr(tempdom.DocumentElement, "barcode", strItemBarcode);

                 if (bItemBarcodeDup == true)
                 {
-                    // Զλ򲻼ʵ¼·
+                    // 若条码号足以定位，则不记载实体记录路径
                     DomUtil.SetAttr(tempdom.DocumentElement, "recPath", strItemRecPath);
                 }

-                string strReason = "ڡ " + (lOver).ToString() + GetDisplayTimeUnitLang(strPeriodUnit) + "; ΥԼ: " + strPriceCfgString;
+                string strReason = "超期。超 " + (lOver).ToString() + GetDisplayTimeUnitLang(strPeriodUnit) + "; 违约金因子: " + strPriceCfgString;
                 DomUtil.SetAttr(tempdom.DocumentElement, "reason", strReason);

-                // ʱ䳤 2007/12/17 new add
+                // 超期时间长度 2007/12/17 new add
                 DomUtil.SetAttr(tempdom.DocumentElement, "overduePeriod", (lOver).ToString() + strPeriodUnit);

                 DomUtil.SetAttr(tempdom.DocumentElement, "price", strOverduePrice);
@@ -11500,7 +11500,7 @@
                 DomUtil.SetAttr(tempdom.DocumentElement, "returnDate", DateTimeUtil.Rfc1123DateTimeStringEx(now.ToLocalTime()));
                 DomUtil.SetAttr(tempdom.DocumentElement, "borrowOperator", strBorrowOperator);
                 DomUtil.SetAttr(tempdom.DocumentElement, "operator", strReturnOperator);
-                // idΨһ, ΪΥԼC/S洴
+                // id属性是唯一的, 为交违约金C/S界面创造了有利条件
                 string strOverdueID = GetOverdueID();
                 DomUtil.SetAttr(tempdom.DocumentElement, "id", strOverdueID);

@@ -11522,16 +11522,16 @@
             if (strAction == "lost")
             {
                 string strLostPrice = "?";
-                string strReason = "ʧ";
+                string strReason = "丢失。";

                 string strBiblioRecID = DomUtil.GetElementText(itemdom.DocumentElement, "parent");  //
                 string strItemDbName = ResPath.GetDbName(strItemRecPath);
                 string strBiblioDbName = "";
-                // ʵ, ҵӦĿ
+                // 根据实体库名, 找到对应的书目库名
                 // return:
-                //      -1
-                //      0   ûҵ
-                //      1   ҵ
+                //      -1  出错
+                //      0   没有找到
+                //      1   找到
                 nRet = this.GetBiblioDbNameByItemDbName(strItemDbName,
                     out strBiblioDbName,
                     out strError);
@@ -11539,7 +11539,7 @@
                     return -1;
                 if (nRet == 0)
                 {
-                    strError = "ʵ '" + strItemDbName + "' ûҵӦĿ";
+                    strError = "实体库名 '" + strItemDbName + "' 没有找到对应的书目库名";
                     return -1;
                 }
                 string strBiblioRecPath = strBiblioDbName + "/" + strBiblioRecID;
@@ -11547,13 +11547,13 @@

                 int nResultValue = 0;
                 string strTempReason = "";
-                // ִнűGetLost
-                // ݵǰ߼¼ʵ¼Ŀ¼ʧ⳥
+                // 执行脚本函数GetLost
+                // 根据当前读者记录、实体记录、书目记录，计算出丢失后的赔偿金额
                 // parameters:
                 // return:
                 //      -2  not found script
-                //      -1
-                //      0   ɹ
+                //      -1  出错
+                //      0   成功
                 nRet = this.DoGetLostScriptFunction(
                     sessioninfo,
             readerdom,
@@ -11565,7 +11565,7 @@
             out strError);
                 if (nRet == -1)
                 {
-                    strError = "ýűGetLost()ʱ: " + strError;
+                    strError = "调用脚本函数GetLost()时出错: " + strError;
                     return -1;
                 }

@@ -11573,29 +11573,29 @@
                 {
                     if (nResultValue == -1)
                     {
-                        strError = "(ű)㶪ʧ⳥ʱ: " + strError;
+                        strError = "(脚本函数)计算丢失赔偿金额时报错: " + strError;
                         return -1;
                     }

                     strReason += strTempReason;
                 }
-                // ûзֽűñҵ
+                // 没有发现脚本函数，则从配置表中找到参数并计算
                 else if (nRet == -2)
                 {
-                    //  'ʧΥԼ' ò
+                    // 获得 '丢失违约金因子' 配置参数
                     string strPriceCfgString = "";
                     MatchResult matchresult;
                     // return:
-                    //      readerbook;ƥ 4
-                    //      ֻreaderƥ䣬3
-                    //      ֻbookƥ䣬2
-                    //      readerbookͶƥ䣬1
+                    //      reader和book类型均匹配 算4分
+                    //      只有reader类型匹配，算3分
+                    //      只有book类型匹配，算2分
+                    //      reader和book类型都不匹配，算1分
                     nRet = app.GetLoanParam(
                         //null,
                         strLibraryCode,
                         strReaderType,
                         strBookType,
-                        "ʧΥԼ",
+                        "丢失违约金因子",
                         out strPriceCfgString,
                         out matchresult,
                         out strError);
@@ -11603,7 +11603,7 @@
                     {
                         if (bForce == true)
                             goto CONTINUE_LOSTING;
-                        strError = "ʧʧܡ ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'  ʧΥԼ ʱ: " + strError;
+                        strError = "丢失处理失败。获得 馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 丢失违约金因子 参数时发生错误: " + strError;
                         return -1;
                     }
                     if (nRet < 4)  // nRet == 0
@@ -11611,7 +11611,7 @@
                         if (bForce == true)
                             goto CONTINUE_LOSTING;

-                        strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'  ʧΥԼ ޷: " + strError;
+                        strError = "还书失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 丢失违约金因子 参数无法获得: " + strError;
                         return -1;
                     }

@@ -11626,11 +11626,11 @@
                         if (bForce == true)
                             goto CONTINUE_LOSTING;

-                        strError = "ʧʧܡ㶪ʧΥԼ۸ʱ: " + strError;
+                        strError = "丢失处理失败。计算丢失违约金价格时出错: " + strError;
                         return -1;
                     }

-                    strReason = "ʧԭ۸: " + strItemPrice + "; ΥԼ:" + strPriceCfgString;
+                    strReason = "丢失。原价格: " + strItemPrice + "; 违约金因子:" + strPriceCfgString;
                 }
                 else
                 {
@@ -11639,9 +11639,9 @@

             CONTINUE_LOSTING:

-                strOverdueMessage += "жʧΥԼ " + strLostPrice + "иΥԼ";
-
-                // strOverdueString
+                strOverdueMessage += "有丢失违约金 " + strLostPrice + "。请履行付违约金手续。";
+
+                // 构造strOverdueString
                 XmlDocument tempdom = new XmlDocument();
                 tempdom.LoadXml("<overdue />");
                 DomUtil.SetAttr(tempdom.DocumentElement, "barcode", strItemBarcode);
@@ -11652,13 +11652,13 @@
                 DomUtil.SetAttr(tempdom.DocumentElement, "returnDate", DateTimeUtil.Rfc1123DateTimeStringEx(now.ToLocalTime()));
                 DomUtil.SetAttr(tempdom.DocumentElement, "borrowOperator", strBorrowOperator);
                 DomUtil.SetAttr(tempdom.DocumentElement, "operator", strReturnOperator);
-                // idΨһ, ΪΥԼC/S洴
+                // id属性是唯一的, 为交违约金C/S界面创造了有利条件
                 string strOverdueID = GetOverdueID();
                 DomUtil.SetAttr(tempdom.DocumentElement, "id", strOverdueID);

                 strOverdueString += tempdom.DocumentElement.OuterXml;

-                strLostComment = " " + DateTimeUtil.Rfc1123DateTimeStringEx(now.ToLocalTime()) + " ɶ " + strBorrower + " ʧΥԼ¼idΪ " + strOverdueID + "һνĵ: : " + strBorrowDate + "; : " + strPeriod + "";
+                strLostComment = "本册于 " + DateTimeUtil.Rfc1123DateTimeStringEx(now.ToLocalTime()) + " 由读者 " + strBorrower + " 声明丢失。违约金记录id为 " + strOverdueID + "。最后一次借阅的情况如下: 借阅日期: " + strBorrowDate + "; 借阅期限: " + strPeriod + "。";
             }

@@ -11666,9 +11666,9 @@

             XmlNode nodeOldBorrower = null;

-            // 뵽ʷֶ
-            {
-                // ǷborrowHistoryԪ
+            // 加入到借阅历史字段中
+            {
+                // 看看根下面是否有borrowHistory元素
                 XmlNode root = itemdom.DocumentElement.SelectSingleNode("borrowHistory");
                 if (root == null)
                 {
@@ -11680,20 +11680,20 @@
                 if (this.MaxItemHistoryItems > 0)
                 {
                     nodeOldBorrower = itemdom.CreateElement("borrower");
-                    // 뵽ǰ
+                    // 插入到最前面
                     XmlNode temp = DomUtil.InsertFirstChild(root, nodeOldBorrower);
                     if (temp != null)
                     {
-                        // 뻹ʱ
+                        // 加入还书时间
                         DomUtil.SetAttr(temp, "returnDate", strOperTime);
                     }
                 }

-                // 100ɾ
+                // 如果超过100个，则删除多余的
                 while (root.ChildNodes.Count > this.MaxItemHistoryItems)
                     root.RemoveChild(root.ChildNodes[root.ChildNodes.Count - 1]);

-                // ֵ
+                // 增量借阅量属性值
                 string strBorrowCount = DomUtil.GetAttr(root, "count");
                 if (String.IsNullOrEmpty(strBorrowCount) == true)
                     strBorrowCount = "1";
@@ -11766,18 +11766,18 @@

             // string strBorrowOperator = DomUtil.GetElementText(itemdom.DocumentElement, "operator");
             //DomUtil.SetElementText(itemdom.DocumentElement,
-            //    "operator", "");    //
+            //    "operator", "");    // 清除
             DomUtil.DeleteElement(itemdom.DocumentElement,
 "operator");

-            // itemԭoperatorԪֵʾĲߣʱӦתʷеborrowOperatorԪ
+            // item中原operator元素值表示借阅操作者，此时应转入历史中的borrowOperator元素中
             if (nodeOldBorrower != null)
                 DomUtil.SetAttr(nodeOldBorrower,
                 "borrowOperator",
                 strBorrowOperator);

-            // ʷoperatorֵʾ
+            // 借阅历史中operator属性值表示还书操作者
             if (nodeOldBorrower != null)
                 DomUtil.SetAttr(nodeOldBorrower,
                 "operator",
@@ -11825,11 +11825,11 @@
                     /*
                     if (String.IsNullOrEmpty(strState) == false)
                         strState += ",";
-                    strState += "ʧ";
+                    strState += "丢失";
                      * */

                     StringUtil.SetInList(ref strState,
-                "ʧ",
+                "丢失",
                 true);

                     DomUtil.SetElementText(itemdom.DocumentElement,
@@ -11845,7 +11845,7 @@
                 }
             }

-            //  ͳָ
+            //  统计指标
             {
                 TimeSpan delta_0 = this.Clock.UtcNow - borrowdate;
                 if (delta_0.TotalDays < 1)
@@ -11853,8 +11853,8 @@
                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(
                         strLibraryCode,
-                        "",
-                        "",
+                        "出纳",
+                        "当日内立即还册",
                         1);
                 }

@@ -11898,17 +11898,17 @@
             return 0;
         }

-        // Բ¼еԤԼϢмʹ
-        // 㷨ǣҵһûг(expireDate)statearrived<request>Ԫأ
-        // ԪصreaderԣһԤԼߣҰҵ<request>
-        // ԪصstateԴarrivedǡ
-        // ΪʧĵҪ֪ͨȴߣѾʧˣٵȴ
+        // 还书后对册记录中的预约信息进行检查和处理
+        // 算法是：找到第一个没有超期(expireDate)并且state不是arrived的<request>元素，
+        // 返回这个元素的reader属性（这就是下一个预约者），并且把这个找到的<request>
+        // 元素的state属性打上arrived标记。
+        // 如果为丢失处理，本函数的调用者需要通知等待者：书已经丢失了，不用再等待
         // parameters:
-        //      bMaskLocationReservation    Ҫ<location>#reservation
+        //      bMaskLocationReservation    不要给<location>打上#reservation标记
         // return:
         //      -1  error
-        //      0   û޸
-        //      1   Բ¼й޸ġй޸ģһstrReservationReaderBarcode޸Ŀ˳ɾ˹ڵ<request>Ԫ
+        //      0   没有修改
+        //      1   对册记录进行过修改。进行过修改，不一定返回strReservationReaderBarcode。修改可能是顺便删除了过期的<request>元素
         internal int DoItemReturnReservationCheck(
             bool bDontMaskLocationReservation,
             ref XmlDocument itemdom,
@@ -11919,35 +11919,35 @@
             strError = "";
             bool bChanged = false;

-            // ҵ<reservations/request>Ԫ
+            // 找到所有<reservations/request>元素
             XmlNodeList nodes = itemdom.DocumentElement.SelectNodes("reservations/request");
             if (nodes.Count == 0)
-                return 0;   // ûҵ<request>Ԫ, Ҳ˵ûбԤԼ
+                return 0;   // 没有找到<request>元素, 也就是说明没有被预约

             XmlNode node = null;
             for (int i = 0; i < nodes.Count; i++)
             {
                 node = nodes[i];
                 string strExpireDate = DomUtil.GetAttr(node, "expireDate");
-                // Ƿ
+                // 看看请求是否过期
                 if (String.IsNullOrEmpty(strExpireDate) == false)
                 {
                     DateTime expiredate = DateTimeUtil.FromRfc1123DateTimeString(strExpireDate);
                     DateTime now = this.Clock.UtcNow;   // 2007/12/17 changed //  DateTime.UtcNow;
                     if (expiredate > now)
                     {
-                        // TODO: ڵԤԼǷԶɾ?
+                        // TODO: 过期的预约请求，是否自动删除?
                         node.ParentNode.RemoveChild(node);
                         bChanged = true;
                         continue;
                     }
                 }

-                // ״̬ǲarrived
+                // 看看状态是不是arrived
                 string strState = DomUtil.GetAttr(node, "state");
                 if (strState == "arrived")
                 {
-                    // ɾǰģ״̬Ϊarrived<request>Ԫ
+                    // 删除以前残留的，状态为arrived的<request>元素
                     node.ParentNode.RemoveChild(node);
                     bChanged = true;
                     continue;
@@ -11958,7 +11958,7 @@

             if (bChanged == false)
                 return 0;   // not changed
-            return 1;   // Ȼûҵǲ¼޸
+            return 1;   // 虽然没有找到，但是册记录发生了修改
         FOUND:

             Debug.Assert(node != null, "");
@@ -11966,24 +11966,24 @@

             if (String.IsNullOrEmpty(strReservationReaderBarcode) == true)
             {
-                strError = "<request>ԪreaderֵΪ";
+                strError = "<request>元素中reader属性值为空";
                 return -1;
             }

             /*
-            // ɾ<request>Ԫ
+            // 删除<request>元素
             node.ParentNode.RemoveChild(node);
              * */
-            // <request>Ԫصstateֵ޸Ϊarrived
+            // 将<request>元素的state属性值修改为arrived
             DomUtil.SetAttr(node, "state", "arrived");
-            // ʱ
+            // 到达时间
             DomUtil.SetAttr(node, "arrivedDate", this.Clock.GetClock());

             bChanged = true;

             if (bDontMaskLocationReservation == false)
             {
-                // ޸<location>Ԫ,һ#reservationоֵ
+                // 修改<location>元素,加入一个#reservation列举值
                 string strText = DomUtil.GetElementText(itemdom.DocumentElement, "location");
                 if (strText == null)
                     strText = "";
@@ -12002,7 +12002,7 @@
             return 1;
         }

-        // smtpϢ
+        // 获得smtp服务器配置信息
         // return:
         //      -1  error
         //      0   not found
@@ -12019,14 +12019,14 @@
                 "smtpServer");
             if (node == null)
             {
-                strError = "library.xmlûҵ<smtpServer>Ԫ";
+                strError = "在library.xml中没有找到<smtpServer>元素";
                 return 0;
             }
             strAddress = DomUtil.GetAttr(node, "address");

             if (String.IsNullOrEmpty(strAddress) == true)
             {
-                strError = "<smtpServer>δaddressֵ";
+                strError = "<smtpServer>未配置address参数值。";
                 return -1;
             }

@@ -12034,7 +12034,7 @@

             if (String.IsNullOrEmpty(strManagerEmail) == true)
             {
-                strError = "<smtpServer>δmanagerEmailֵ";
+                strError = "<smtpServer>未配置managerEmail参数值。";
                 return -1;
             }

@@ -12042,7 +12042,7 @@
         }

 #if NOOOOOOOOOOOOOO
-        // ֪ͨemail
+        // 发送通知email
         // return:
         //      -1  error
         //      0   not found smtp server cfg
@@ -12058,7 +12058,7 @@
             string strManagerEmail = "";

             string strSmtpServerAddress = "";
-                    // smtpϢ
+                    // 获得smtp服务器配置信息
         // return:
         //      -1  error
         //      0   not found
@@ -12098,7 +12098,7 @@
         }
 #endif

-        // ֪ͨemail
+        // 发送通知email
         // return:
         //      -1  error
         //      0   not found smtp server cfg
@@ -12115,7 +12115,7 @@
             string strManagerEmail = "";

             string strSmtpServerAddress = "";
-            // smtpϢ
+            // 获得smtp服务器配置信息
             // return:
             //      -1  error
             //      0   not found
@@ -12135,7 +12135,7 @@
             try
             {

-            // System.Net.Mail ֿռ
+            // System.Net.Mail 新名字空间
             MailMessage message = new MailMessage(
                 strManagerEmail,
                 strUserEmail,
@@ -12173,9 +12173,9 @@
         }

-        // ʼģ
+        // 获得邮件模板
         int GetMailTemplate(
-            string strType, // dpmail email
+            string strType, // dpmail email 等
             string strTemplateName,
             out string strText,
             out string strError)
@@ -12197,13 +12197,13 @@
                 }
             }

-            // ûҵͲõһ
-            // Ϊ˼ǰûtypeԵ<template>÷
+            // 如果没有找到，就采用第一个
+            // 这是为了兼容以前没有type属性的<template>用法
             strText = nodes[0].InnerText;
             return 1;
         }

-        // ģֵ滻յ
+        // 根据模板和值表，替换出最终的文字
         int GetMailText(string strTemplate,
             Hashtable valueTable,
             out string strText,
@@ -12222,15 +12222,15 @@
             return 0;
         }

-        // APIĴ
-        // ԤԼϢ
-        // text-level: ûʾ
+        // 借阅API的从属函数
+        // 检查预约相关信息
+        // text-level: 用户提示
         // return:
         //      -1  error
-        //      0
-        //      1   ָòᱻ ܽ
-        //      2   ָòԤԼ
-        //      3   ָòᱻ ܽġұ޸˲¼(<location>Ԫط˱仯)Ҫغ󣬰Ѳ¼档
+        //      0   正常
+        //      1   发现该册被保留， 不能借阅
+        //      2   发现该册预约， 不能续借
+        //      3   发现该册被保留， 不能借阅。而且本函数修改了册记录(<location>元素发生了变化)，需要本函数返回后，把册记录保存。
         int DoBorrowReservationCheck(
             SessionInfo sessioninfo,
             bool bRenew,
@@ -12244,7 +12244,7 @@
             int nRet = 0;
             long lRet = 0;

-            // в
+            // 获得例行参数
             string strRefID = DomUtil.GetElementText(itemdom.DocumentElement,
 "refID");
             string strReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
@@ -12257,15 +12257,15 @@
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
 #if NO
-                // text-level: ڲ
-                strError = "¼вŲΪ";
+                // text-level: 内部错误
+                strError = "册记录中册条码号不能为空";
                 return -1;
 #endif
-                // Ϊգʹ οID
+                // 如果册条码号为空，则使用 参考ID
                 if (String.IsNullOrEmpty(strRefID) == true)
                 {
-                    // text-level: ڲ
-                    strError = "¼вźͲοIDӦͬʱΪ";
+                    // text-level: 内部错误
+                    strError = "册记录中册条码号和参考ID不应同时为空";
                     return -1;
                 }
                 strItemBarcodeParam = "@refID:" + strRefID;
@@ -12273,14 +12273,14 @@

             if (String.IsNullOrEmpty(strReaderBarcode) == true)
             {
-                // text-level: ڲ
-                strError = "߼¼ж֤ŲΪ";
+                // text-level: 内部错误
+                strError = "读者记录中读者证条码号不能为空";
                 return -1;
             }

             XmlNodeList nodesReservationRequest = itemdom.DocumentElement.SelectNodes("reservations/request");

-            // 账
+            // 续借处理
             if (bRenew == true)
             {

@@ -12298,24 +12298,24 @@
                         strList += strReader;
                     }

-                    // ԤԼΪͨߣstrListʾ
+                    // 如果预约操作者为普通读者，则strList不便显示
                     if (sessioninfo.UserType == "reader")
                     {
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ܾsǰѱsλԤԼ"),    // "ܾ  {0} ǰѱ {1} λԤԼΪˣ뾡绹ش飬лл"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("续借操作被拒绝。因册s当前已被s位读者预约"),    // "续借操作被拒绝。因 册 {0} 当前已被 {1} 位读者预约。为方便他人，请尽早还回此书，谢谢。"
                             strItemBarcodeParam,
                             nodesReservationRequest.Count.ToString());
-                            // "ܾ  " + strItemBarcode + " ǰѱ " + nodesReservationRequest.Count.ToString() + " λԤԼΪˣ뾡绹ش飬лл";
+                            // "续借操作被拒绝。因 册 " + strItemBarcode + " 当前已被 " + nodesReservationRequest.Count.ToString() + " 位读者预约。为方便他人，请尽早还回此书，谢谢。";
                     }
                     else
                     {
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ܾsǰѱжԤԼs"),  // "ܾ  {0} ǰѱжԤԼ: {1}Ϊˣ뾡绹ش飬лл"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("续借操作被拒绝。因册s当前已被下列读者预约s"),  // "续借操作被拒绝。因 册 {0} 当前已被下列读者预约: {1}。为方便他人，请尽早还回此书，谢谢。"
                             strItemBarcodeParam,
                             strList);
-                            // "ܾ  " + strItemBarcode + " ǰѱжԤԼ: " + strList + "Ϊˣ뾡绹ش飬лл";
-                    }
-                    // ǰдĶ޷裬ֻڵǰ黹ͼݡ
+                            // "续借操作被拒绝。因 册 " + strItemBarcode + " 当前已被下列读者预约: " + strList + "。为方便他人，请尽早还回此书，谢谢。";
+                    }
+                    // 当前持有此书的读者无法续借，则只好在到期前归还图书馆。
                     return 2;
                 }
             }
@@ -12323,26 +12323,26 @@
             string strLocation = DomUtil.GetElementText(itemdom.DocumentElement,
                 "location");

-            // ò¼<location>Ƿ#reservationжƺ֡
-            // ӦҲ<reservations/request>Ƿڡ
+            // 用册记录<location>中是否有#reservation字样来判断似乎并不充分。
+            // 应当也看看<reservations/request>是否存在。
             if (nodesReservationRequest.Count == 0
-                && StringUtil.IsInList("#reservation", strLocation) == false)// ǷԤԼϵ
+                && StringUtil.IsInList("#reservation", strLocation) == false)// 看看这册是否属于在预约保留架上的
                 return 0;

             int nRedoLoadCount = 0;

         REDO_LOAD_QUEUE_REC:

-            // һԤԼ, ǷѾ֪ͨȡĲ, ǵȴͨܵԤԼδȡ
+            // 进一步检索预约到书库, 看看是否属于已经通知来取书的册, 或者是等待上普通架的预约超期未取册
             string strNotifyXml = "";
             string strOutputPath = "";
             byte[] timestamp = null;
-            // ԤԼм¼
+            // 获得预约到书队列记录
             // return:
             //      -1  error
             //      0   not found
-            //      1   1
-            //      >1  ж1
+            //      1   命中1条
+            //      >1  命中多于1条
             nRet = GetArrivedQueueRecXml(
                 sessioninfo.Channels,
                 strItemBarcodeParam,    // strItemBarcode
@@ -12355,8 +12355,8 @@

             if (nRet == 0)
             {
-                // Ȼlocation#reservation֪ͨвû¼
-                // סı¼location
+                // 虽然册location中有#reservation，但是通知队列中并没有这个记录
+                // 记住改变册记录的location
                 goto CHANGEITEMLOCATION;
             }

@@ -12367,8 +12367,8 @@
             }
             catch (Exception ex)
             {
-                // text-level: ڲ
-                strError = "װԤԼ֪ͨ¼XMLDOMʱ: " + ex.Message;
+                // text-level: 内部错误
+                strError = "装载预约到书通知记录XML到DOM时出错: " + ex.Message;
                 return -1;
             }

@@ -12378,23 +12378,23 @@
                 "state");
             if (StringUtil.IsInList("outof", strState) == true)
             {
-                // ֪ͨ¼, Ѿ, õǰ߽, ɾ֪ͨ¼ˡע޸Ĳ¼locationȥ#reservation
+                // 通知记录存在, 但是已经超期, 正好当前读者借走这册, 可以删除这个通知记录了。注意修改册记录的location，去掉#reservation

             }
             else
             {
-                // ǲ֪ͨıȡ
+                // 检查是不是正好通知的本读者取书
                 string strNotifyReaderBarcode = DomUtil.GetElementText(notifydom.DocumentElement,
                     "readerBarcode");

-                // Ǳȡ
+                // 正好是本读者来取书了
                 if (strNotifyReaderBarcode == strReaderBarcode)
                 {
-                    // ɾ߼¼еreservation֪ͨ
-
-
-                    // ڲ¼Уɾص<reservations/request>Ԫ 2007/1/17 new add
+                    // 删除读者记录中的reservation通知行
+
+
+                    // 在册记录中，删除相关的<reservations/request>元素 2007/1/17 new add
                     XmlNodeList nodes = itemdom.DocumentElement.SelectNodes("reservations/request[@reader='" + strReaderBarcode + "']");
                     for (int i = 0; i < nodes.Count; i++)
                     {
@@ -12402,19 +12402,19 @@
                         node.ParentNode.RemoveChild(node);
                     }
                 }
-                else // ԤԼ
-                {
-
-                    // ڼԤԼ֪ͨ
+                else // 不是预约者来借书
+                {
+
+                    // 如果是在架预约的通知情形
                     if (StringUtil.IsInList("#reservation", strLocation) == false)
                     {
-                        // Ҫ޸Ĳ¼<location>Ϊ#reservation־ҰѶм¼<itemBarcode>onShelfΪfalse
+                        // 需要修改册记录的<location>为包含#reservation标志，并且把队列记录的<itemBarcode>的onShelf设置为false。
                         if (strLocation != "")
                             strLocation += ",";
                         strLocation += "#reservation";
                         DomUtil.SetElementText(itemdom.DocumentElement, "location", strLocation);

-                        // ޸ԤԼ֪ͨ¼
+                        // 修改预约通知记录
                         //XmlNode nodeItemBarcode = notifydom.DocumentElement.SelectSingleNode("itemBarcode");
                         //if (nodeItemBarcode != null)
                         {
@@ -12441,33 +12441,33 @@
                                     goto REDO_LOAD_QUEUE_REC;
                                 }

-                                // text-level: ڲ
-                                strError = "дضм¼ '" + strOutputPath + "' ʱ : " + strError;
-                                this.WriteErrorLog("ĲڼԤԼͼҪдضм¼ " + strOutputPath + " ʱ: " + strError);
+                                // text-level: 内部错误
+                                strError = "写回队列记录 '" + strOutputPath + "' 时发生错误 : " + strError;
+                                this.WriteErrorLog("借阅操作中遇在架预约图书需要写回队列记录 " + strOutputPath + " 时出错: " + strError);
                                 return -1;
                             }
                         }

-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ĲܾΪsΪsڼԤԼѴڱ֪ͨȡ״̬"),
-                            // "ĲܾΪ  {0} Ϊ {1} (ڼ)ԤԼѴڱ֪ͨȡ״̬\r\nͼԱע⣺ȻνĲܾ˲صϢѱԶ޸ΪԤԼ(ԭͨ)´ԤԼ(ضλã硰ڼܡ)"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("借阅操作被拒绝。因为册s为读者s所在架预约，已处于保留和通知取书状态"),
+                            // "借阅操作被拒绝。因为 册 {0} 为读者 {1} 所(在架)预约，已处于保留和通知取书状态。\r\n图书馆员请注意：虽然本次借阅操作被拒绝，但此册地点信息已被软件自动修改为在预约保留架(而不是在原来的普通架)，请收下此书后放入预约保留架(的特定位置，例如“曾在架”部分)。"
                             strItemBarcodeParam,
                             strNotifyReaderBarcode);
-                            // "ĲܾΪ  " + strItemBarcode + " Ϊ " + strNotifyReaderBarcode + " (ڼ)ԤԼѴڱ֪ͨȡ״̬\r\nͼԱע⣺ȻνĲܾ˲صϢѱԶ޸ΪԤԼ(ԭͨ)´ԤԼ(ضλã硰ڼܡ)";
+                            // "借阅操作被拒绝。因为 册 " + strItemBarcode + " 为读者 " + strNotifyReaderBarcode + " 所(在架)预约，已处于保留和通知取书状态。\r\n图书馆员请注意：虽然本次借阅操作被拒绝，但此册地点信息已被软件自动修改为在预约保留架(而不是在原来的普通架)，请收下此书后放入预约保留架(的特定位置，例如“曾在架”部分)。";
                         return 3;
                     }

-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("ĲܾΪsΪsԤԼѴڱ֪ͨȡ״̬"),
-                        // "ĲܾΪ  {0} Ϊ {1} ԤԼѴڱ֪ͨȡ״̬"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("借阅操作被拒绝。因为册s为读者s所预约，已处于保留和通知取书状态"),
+                        // "借阅操作被拒绝。因为 册 {0} 为读者 {1} 所预约，已处于保留和通知取书状态。"
                         strItemBarcodeParam,
                         strNotifyReaderBarcode);
-                        // "ĲܾΪ  " + strItemBarcode + " Ϊ " + strNotifyReaderBarcode + " ԤԼѴڱ֪ͨȡ״̬";
+                        // "借阅操作被拒绝。因为 册 " + strItemBarcode + " 为读者 " + strNotifyReaderBarcode + " 所预约，已处于保留和通知取书状态。";
                     return 1;
                 }
             }

-            // ɾ֪ͨм¼
+            // 删除通知队列记录
             {
                 byte[] output_timestamp = null;
                 int nRedoCount = 0;
@@ -12485,8 +12485,8 @@
                         timestamp = output_timestamp;
                         goto REDO_DELETE;
                     }
-                    // д־?
-                    this.WriteErrorLog("ڽĲУɾԤԼ¼ '" + strOutputPath + "' : " + strError);
+                    // 写入错误日志?
+                    this.WriteErrorLog("在借阅操作中，删除预约到书库记录 '" + strOutputPath + "' 出错: " + strError);
                 }
             }

@@ -12498,11 +12498,11 @@
             DomUtil.SetElementText(itemdom.DocumentElement,
                 "location", strLocation);

-            // Σ̽߼¼пܵԤԼϢ
-
-            // ڶ߼¼мɾԤԼϢ
+            // 无论如何，均试探性清除读者记录中可能的预约信息
+
+            // 在读者记录中加入或删除预约信息
             // parameters:
-            //      strFunction "new"ԤԼϢ"delete"ɾԤԼϢ; "merge"ϲ; "split"ɢ
+            //      strFunction "new"新增预约信息；"delete"删除预约信息; "merge"合并; "split"拆散
             // return:
             //      -1  error
             //      0   unchanged
@@ -12515,23 +12515,23 @@
                 out strError);
             if (nRet == -1)
             {
-                // д־?
-                this.WriteErrorLog("Ĳ, ڶ߼¼ɾǱڵԤԼϢʱ(DoReservationReaderXml() function=delete itembarcode=" + strItemBarcodeParam + "): " + strError);
+                // 写入错误日志?
+                this.WriteErrorLog("借阅操作中, 在读者记录中删除潜在的预约信息时(调用DoReservationReaderXml() function=delete itembarcode=" + strItemBarcodeParam + ")出错: " + strError);
             }

             return 0;
         }

-        // APIĴ
-        // ڶ߼¼Ͳ¼мϢ
-        // text-level: ûʾ
+        // 借阅API的从属函数
+        // 在读者记录和册记录中加入借书信息
+        // text-level: 用户提示
         // parameters:
-        //      domOperLog ־¼DOM
-        //      this_return_time    νĵӦʱ䡣GMTʱ䡣
+        //      domOperLog 构造日志记录DOM
+        //      this_return_time    本次借阅的应还最后时间。GMT时间。
         // return:
         //      -1  error
-        //      0
-        //      // 1   ǰĵͼĿǰг
+        //      0   正常
+        //      // 1   发现先前借阅的图书目前有超期情况
         int DoBorrowReaderAndItemXml(
             bool bRenew,
             string strLibraryCode,
@@ -12553,7 +12553,7 @@

             LibraryApplication app = this;

-            // в
+            // 获得例行参数
             string strReaderBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
                 "barcode");

@@ -12563,17 +12563,17 @@
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
 #if NO
-                // text-level: ڲ
-                strError = "¼вŲΪ";
+                // text-level: 内部错误
+                strError = "册记录中册条码号不能为空";
                 return -1;
 #endif
-                // Ϊգ οID
+                // 如果册条码号为空，则记载 参考ID
                 string strRefID = DomUtil.GetElementText(itemdom.DocumentElement,
     "refID");
                 if (String.IsNullOrEmpty(strRefID) == true)
                 {
-                    // text-level: ڲ
-                    strError = "¼вźͲοIDӦͬʱΪ";
+                    // text-level: 内部错误
+                    strError = "册记录中册条码号和参考ID不应同时为空";
                     return -1;
                 }
                 strItemBarcode = "@refID:" + strRefID;
@@ -12581,38 +12581,38 @@

             if (String.IsNullOrEmpty(strReaderBarcode) == true)
             {
-                // text-level: ڲ
-                strError = "߼¼ж֤ŲΪ";
+                // text-level: 内部错误
+                strError = "读者记录中读者证条码号不能为空";
                 return -1;
             }

-            // ҪĵĲϢУҵͼ
+            // 从想要借阅的册信息中，找到图书类型
             string strBookType = DomUtil.GetElementText(itemdom.DocumentElement, "bookType");

-            // ӶϢ, ҵ
+            // 从读者信息中, 找到读者类型
             string strReaderType = DomUtil.GetElementText(readerdom.DocumentElement, "readerType");

-            // ޸Ķ߼¼
+            // 修改读者记录
             int nNo = 0;

             XmlNode nodeBorrow = null;

             if (bRenew == true)
             {
-                // ǷѾǰѾĵĲ
+                // 看看是否已经有先前已经借阅的册
                 nodeBorrow = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
                 if (nodeBorrow == null)
                 {
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("öδĹs޷"),
-                        // "öδĹ '{0}'޷衣"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("该读者未曾借阅过册s，因此无法续借"),
+                        // "该读者未曾借阅过册 '{0}'，因此无法续借。"
                         strItemBarcode);
-                        // "öδĹ '" + strItemBarcode + "'޷衣";
+                        // "该读者未曾借阅过册 '" + strItemBarcode + "'，因此无法续借。";
                     return -1;
                 }

-                // ϴε
+                // 获得上次的序号
                 string strNo = DomUtil.GetAttr(nodeBorrow, "no");
                 if (String.IsNullOrEmpty(strNo) == true)
                     nNo = 0;
@@ -12626,8 +12626,8 @@
                     {
                         if (bForce == false)
                         {
-                            // text-level: ڲ
-                            strError = "߼¼ XML Ƭ " + nodeBorrow.OuterXml + " no ֵ'" + strNo + "' ʽ";
+                            // text-level: 内部错误
+                            strError = "读者记录中 XML 片断 " + nodeBorrow.OuterXml + "其中 no 属性值'" + strNo + "' 格式错误";
                             return -1;
                         }
                         nNo = 0;
@@ -12637,7 +12637,7 @@
             }
             else // bRenew == false
             {
-                // <borrows>ԪǷ
+                // 检查<borrows>元素是否存在
                 XmlNode root = readerdom.DocumentElement.SelectSingleNode("borrows");
                 if (root == null)
                 {
@@ -12645,40 +12645,40 @@
                     root = readerdom.DocumentElement.AppendChild(root);
                 }

-                // ĲϢ
+                // 加入借阅册信息
                 nodeBorrow = readerdom.CreateElement("borrow");
-                nodeBorrow = DomUtil.InsertFirstChild(root, nodeBorrow); // 2006/12/24 changed2015/1/12 ӵȺߵĲ
+                nodeBorrow = DomUtil.InsertFirstChild(root, nodeBorrow); // 2006/12/24 changed，2015/1/12 增加等号左边的部分
                 // nodeBorrow = root.AppendChild(nodeBorrow);
             }

             //
-            string strThisBorrowPeriod = "10day";   // νĵ
-            string strLastBorrowPeriod = "";    // ϴνĵ
+            string strThisBorrowPeriod = "10day";   // 本次借阅的期限
+            string strLastBorrowPeriod = "";    // 上次借阅的期限

             // barcode
             DomUtil.SetAttr(nodeBorrow, "barcode", strItemBarcode);

-            // ز¼·
+            // 记载册记录路径
             if (String.IsNullOrEmpty(strItemRecPath) == false)
                 DomUtil.SetAttr(nodeBorrow, "recPath", strItemRecPath); // 2006/12/24 new add

-            // ֶ
-            // ߼¼еĽֶΣĿΪ˲ѯ㣬עûзЧ
-            // Գжõģǲ¼еĽֶΡ
+            // 加入借期字段
+            // 读者记录中的借期字段，目的是为了查询方便，但注意没有法律效力。
+            // 真正对超期判断起作用的，是册记录中的借期字段。
             string strBorrowPeriodList = "";
             MatchResult matchresult;
             // return:
-            //      readerbook;ƥ 4
-            //      ֻreaderƥ䣬3
-            //      ֻbookƥ䣬2
-            //      readerbookͶƥ䣬1
+            //      reader和book类型均匹配 算4分
+            //      只有reader类型匹配，算3分
+            //      只有book类型匹配，算2分
+            //      reader和book类型都不匹配，算1分
             nRet = app.GetLoanParam(
                 //null,
                 strLibraryCode,
                 strReaderType,
                 strBookType,
-                "",
+                "借期",
                 out strBorrowPeriodList,
                 out matchresult,
                 out strError);
@@ -12686,8 +12686,8 @@
             {
                 if (bForce == true)
                     goto DOCHANGE;
-                // text-level: ڲ
-                strError = "ʧܡ ݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'   ʱ: " + strError;
+                // text-level: 内部错误
+                strError = "借阅失败。获得 馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数时发生错误: " + strError;
                 return -1;
             }
             if (nRet < 4)  // nRet == 0
@@ -12695,12 +12695,12 @@
                 if (bForce == true)
                     goto DOCHANGE;

-                // text-level: ڲ
-                strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'   ޷: " + strError;
+                // text-level: 内部错误
+                strError = "借阅失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数无法获得: " + strError;
                 return -1;
             }

-            // նŷֵҪȡĳ
+            // 按照逗号分列值，需要根据序号取出某个参数

             string[] aPeriod = strBorrowPeriodList.Split(new char[] { ',' });

@@ -12709,8 +12709,8 @@
                 if (bForce == true)
                     goto DOCHANGE;

-                // text-level: ڲ
-                strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'    '" + strBorrowPeriodList + "'ʽ";
+                // text-level: 内部错误
+                strError = "借阅失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数 '" + strBorrowPeriodList + "'格式错误";
                 return -1;
             }

@@ -12722,25 +12722,25 @@
                 {
                     if (aPeriod.Length == 1)
                     {
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ʧܡsͼsĽڲֵs涨"),
-                            // "ʧܡ '{0}' ͼ '{1}'   ֵ '{2}' 涨衣(һޣָһνĵ)"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("续借失败。读者类型s针对图书类型s的借期参数值s规定，不能续借"),
+                            // "续借失败。读者类型 '{0}' 针对图书类型 '{1}' 的 借期 参数值 '{2}' 规定，不能续借。(所定义的一个期限，是指第一次借阅的期限)"
                             strReaderType,
                             strBookType,
                             strBorrowPeriodList);

-                        // "ʧܡ '" + strReaderType + "' ͼ '" + strBookType + "'   ֵ '" + strBorrowPeriodList + "' 涨衣(һޣָһνĵ)";
+                        // "续借失败。读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数值 '" + strBorrowPeriodList + "' 规定，不能续借。(所定义的一个期限，是指第一次借阅的期限)";
                     }
                     else
                     {
-                        // text-level: ûʾ
-                        strError = string.Format(this.GetString("ʧܡsͼsĽڲֵs涨ֻs"),
-                            // "ʧܡ '{0}' ͼ '{1}'   ֵ '{2}' 涨ֻ {3} Ρ"
+                        // text-level: 用户提示
+                        strError = string.Format(this.GetString("续借失败。读者类型s针对图书类型s的借期参数值s规定，只能续借s次"),
+                            // "续借失败。读者类型 '{0}' 针对图书类型 '{1}' 的 借期 参数值 '{2}' 规定，只能续借 {3} 次。"
                             strReaderType,
                             strBookType,
                             strBorrowPeriodList,
                             Convert.ToString(aPeriod.Length - 1));
-                            // "ʧܡ '" + strReaderType + "' ͼ '" + strBookType + "'   ֵ '" + strBorrowPeriodList + "' 涨ֻ " + Convert.ToString(aPeriod.Length - 1) + " Ρ";
+                            // "续借失败。读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数值 '" + strBorrowPeriodList + "' 规定，只能续借 " + Convert.ToString(aPeriod.Length - 1) + " 次。";
                     }
                     return -1;
                 }
@@ -12754,8 +12754,8 @@
                     if (bForce == true)
                         goto DOCHANGE;

-                    // text-level: ڲ
-                    strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'    '" + strBorrowPeriodList + "' ʽ󣺵 " + Convert.ToString(nNo) + "Ϊա";
+                    // text-level: 内部错误
+                    strError = "借阅失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数 '" + strBorrowPeriodList + "' 格式错误：第 " + Convert.ToString(nNo) + "个部分为空。";
                     return -1;
                 }
             }
@@ -12768,13 +12768,13 @@
                     if (bForce == true)
                         goto DOCHANGE;

-                    // text-level: ڲ
-                    strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'    '" + strBorrowPeriodList + "' ʽ󣺵һΪա";
+                    // text-level: 内部错误
+                    strError = "借阅失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数 '" + strBorrowPeriodList + "' 格式错误：第一部分为空。";
                     return -1;
                 }
             }

-            // strBorrowPeriodǷϷ
+            // 检查strBorrowPeriod是否合法
             {
                 long lPeriodValue = 0;
                 string strPeriodUnit = "";
@@ -12788,17 +12788,17 @@
                     if (bForce == true)
                         goto DOCHANGE;

-                    // text-level: ڲ
-                    strError = "ʧܡݴ '" + strLibraryCode + "'   '" + strReaderType + "' ͼ '" + strBookType + "'    '" + strBorrowPeriodList + "' ʽ'" +
-                         strThisBorrowPeriod + "' ʽ: " + strError;
+                    // text-level: 内部错误
+                    strError = "借阅失败。馆代码 '" + strLibraryCode + "' 中 读者类型 '" + strReaderType + "' 针对图书类型 '" + strBookType + "' 的 借期 参数 '" + strBorrowPeriodList + "' 格式错误：'" +
+                         strThisBorrowPeriod + "' 格式错误: " + strError;
                     return -1;
                 }
             }

         DOCHANGE:

-            // 㱾 / Ӧʱ
-            DateTime now = app.Clock.UtcNow;  //  죬¡GMTʱ
+            // 测算本次 借阅/续借 的应还书时间
+            DateTime now = app.Clock.UtcNow;  //  今天，当下。GMT时间

             {
                 long lPeriodValue = 0;
@@ -12814,11 +12814,11 @@
                 DateTime nextWorkingDay;

                 // parameters:
-                //      calendar    Ϊnullʾзǹжϡ
+                //      calendar    工作日历。如果为null，表示函数不进行非工作日判断。
                 // return:
-                //      -1
-                //      0   ɹtimeEndڹշΧڡ
-                //      1   ɹtimeEndڷǹաnextWorkingDayѾһյʱ
+                //      -1  出错
+                //      0   成功。timeEnd在工作日范围内。
+                //      1   成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间
                 nRet = GetReturnDay(
                     null,
                     now,
@@ -12829,29 +12829,29 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "λʱ̷: " + strError;
+                    // text-level: 内部错误
+                    strError = "测算这次还书时间过程发生错误: " + strError;
                     return -1;
                 }

-                // 滯ʱ
+                // 正规化时间
                 nRet = RoundTime(strPeriodUnit,
                     ref this_return_time,
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "λʱ̷: " + strError;
+                    // text-level: 内部错误
+                    strError = "测算这次还书时间过程发生错误: " + strError;
                     return -1;
                 }

             }

-            // 裬鲻ӦںӦĸ
-            // ڻ衣
+            // 如果是续借，检查不续借的应还最后日期和续借后的应还最后日期哪个靠后。
+            // 如果不续借的日期还靠后，则不许读者续借。
             if (bRenew == true)
             {
-                // ϴν
+                // 上次借阅日
                 string strLastBorrowDate = DomUtil.GetAttr(nodeBorrow, "borrowDate");
                 if (String.IsNullOrEmpty(strLastBorrowDate) == true)
                     goto SKIP_CHECK_RENEW_PERIOD;
@@ -12875,15 +12875,15 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = " ֵ '" + strLastBorrowPeriod + "' ʽ: " + strError;
+                    // text-level: 内部错误
+                    strError = "借阅期限 值 '" + strLastBorrowPeriod + "' 格式错误: " + strError;
                     goto SKIP_CHECK_RENEW_PERIOD;
                 }

                 DateTime nextWorkingDay;

                 DateTime last_return_time;
-                // ϴνĻ
+                // 测算上次借书的还书日期
                 nRet = GetReturnDay(
                     null,
                     last_borrowdate,
@@ -12894,13 +12894,13 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    // text-level: ڲ
-                    strError = "ϴλʱ̷: " + strError;
+                    // text-level: 内部错误
+                    strError = "测算上次还书时间过程发生错误: " + strError;
                     goto SKIP_CHECK_RENEW_PERIOD;
                 }

-                // 滯ʱ
+                // 正规化时间
                 nRet = RoundTime(strLastPeriodUnit,
                     ref last_return_time,
                     out strError);
@@ -12911,8 +12911,8 @@

                 if (delta.Ticks > 0)
                 {
-                    strError = string.Format(this.GetString("ܾʵкӦڽǰ"),
-                        // "ܾʵкӦڽΪ {0} (עڴӵտʼ㡣ӽտʼΪ {1})裬ӦڱΪ {2} (ע {3} ʼΪ {4} )Ӧڷǰˡ"
+                    strError = string.Format(this.GetString("本次续借操作被拒绝。假如这次续借实行后，应还日期将反而提前了"),
+                        // "本次续借操作被拒绝。假如这次续借实行后，应还日期将为 {0} (注：续借借期从当日开始计算。从今日开始借期为 {1})；而如果您不续借，应还日期本来为 {2} (注：从 {3} 开始借期为 {4} )。即，续借后的应还日期反而提前了。"
                         GetLocalTimeString(strLastPeriodUnit, this_return_time),
                         GetDisplayTimePeriodStringEx(strThisBorrowPeriod),
                         GetLocalTimeString(strLastPeriodUnit, last_return_time),
@@ -12920,17 +12920,17 @@
                         GetDisplayTimePeriodStringEx(strLastBorrowPeriod));
                     /*
                     // 2008/5/8 changed
-                    strError = "ܾʵкӦڽΪ "
+                    strError = "本次续借操作被拒绝。假如这次续借实行后，应还日期将为 "
                         + GetLocalTimeString(strLastPeriodUnit, this_return_time)
-                        + " (עڴӵտʼ㡣ӽտʼΪ "
+                        + " (注：续借借期从当日开始计算。从今日开始借期为 "
                         + GetDisplayTimePeriodString(strThisBorrowPeriod)
-                        + " )裬ӦڱΪ "
+                        + " )；而如果您不续借，应还日期本来为 "
                         + GetLocalTimeString(strLastPeriodUnit, last_return_time) // this_return_time.ToString() BUG!!!
-                        + " (ע "
+                        + " (注：从 "
                         + GetLocalTimeString(strLastPeriodUnit, last_borrowdate)
-                        + " ʼΪ "
+                        + " 开始借期为 "
                         + GetDisplayTimePeriodString(strLastBorrowPeriod)
-                        + " )Ӧڷǰˡ";
+                        + " )。即，续借后的应还日期反而提前了。";
                      * */
                     return -1;
                 }
@@ -12942,16 +12942,16 @@

             string strBorrowDate = app.Clock.GetClock();

-            string strLastReturningDate = "";   // ϴεӦʱ
+            string strLastReturningDate = "";   // 上次的应还时间

             if (bRenew == true)
             {
                 strLastReturningDate = DomUtil.GetAttr(nodeBorrow, "returningDate");

-                //
+                // 修正序号
                 nNo = Math.Max(nNo, 1);

-                // ǰһνĵϢ
+                // 保存前一次借阅的信息
                 strRenewComment = DomUtil.GetAttr(nodeBorrow, "renewComment");

                 if (strRenewComment != "")
@@ -12992,13 +12992,13 @@
             DomUtil.SetAttr(nodeBorrow, "operator", strOperator);

             // 2007/11/5 new add
-            DomUtil.SetAttr(nodeBorrow, "type", strBookType);   // ڶ߼¼<borrows/borrow>ԪдtypeԣΪͼͣںʱжĳһֲǷ񳬹Ȩ޹涨ֵַʽԽʡʱ䣬شӶ¼ȥòֶ
+            DomUtil.SetAttr(nodeBorrow, "type", strBookType);   // 在读者记录<borrows/borrow>元素中写入type属性，内容为图书册类型，便于后续借书的时候判断某一种册类型是否超过读者权限规定值。这种方式可以节省时间，不必从多个册记录中去获得册类型字段

             // 2006/11/12 new add
             string strBookPrice = DomUtil.GetElementText(itemdom.DocumentElement, "price");
-            DomUtil.SetAttr(nodeBorrow, "price", strBookPrice);   // ڶ߼¼<borrows/borrow>ԪдpriceԣΪͼ۸ͣںʱжѾĺͼܼ۸Ƿ񳬹ߵѺַʽԽʡʱ䣬شӶ¼ȥò۸ֶ
-
-            // ޸Ĳ¼
+            DomUtil.SetAttr(nodeBorrow, "price", strBookPrice);   // 在读者记录<borrows/borrow>元素中写入price属性，内容为图书册价格类型，便于后续借书的时候判断已经借的和即将借的总价格是否超过读者的押金余额。这种方式可以节省时间，不必从多个册记录中去获得册价格字段
+
+            // 修改册记录
             string strOldReaderBarcode = "";

             strOldReaderBarcode = DomUtil.GetElementText(itemdom.DocumentElement,
@@ -13012,13 +13012,13 @@
                     // 2007/1/2 new add
                     if (strOldReaderBarcode == strReaderBarcode)
                     {
-                        // text-level: ûʾ
-                        strError = "Ĳܾ '" + strItemBarcode + "' ڱβǰѾǰ '" + strReaderBarcode + "' ˡ";
+                        // text-level: 用户提示
+                        strError = "借阅操作被拒绝。因册 '" + strItemBarcode + "' 在本次操作前已经被当前读者 '" + strReaderBarcode + "' 借阅了。";
                         return -1;
                     }

-                    // text-level: ûʾ
-                    strError = "Ĳܾ '" + strItemBarcode + "' ڱβǰѾڱ '" + strOldReaderBarcode + "' ()״̬(δ黹)\r\nô빤Ա飬跨ˣ\r\nȷϵ(ͬ)Ҫת˲ᣬл\r\nҪ˲ᣬ";
+                    // text-level: 用户提示
+                    strError = "借阅操作被拒绝。因册 '" + strItemBarcode + "' 在本次操作前已经处于被读者 '" + strOldReaderBarcode + "' 借阅(持有)状态(尚未归还)。\r\n如果属于拿错情况，请工作人员立即扣留此书，设法交还给持有人；\r\n如果确系(经持有人同意)其他读者要转借此册，需先履行还书手续；\r\n如果持有人要续借此册，请履行续借手续。";
                     return -1;
                 }
             }
@@ -13045,7 +13045,7 @@

             DomUtil.SetElementText(itemdom.DocumentElement,
                 "borrowPeriod",
-                strThisBorrowPeriod);   // strBorrowPeriodѾǸǶŷָоֵ
+                strThisBorrowPeriod);   // strBorrowPeriod现在已经是个别参数，不是逗号分隔的列举值了

             DomUtil.SetElementText(itemdom.DocumentElement,
                 "returningDate",
@@ -13065,40 +13065,40 @@
                 "operator",
                 strOperator);

-            // ־¼
+            // 创建日志记录
             DomUtil.SetElementText(domOperLog.DocumentElement, "readerBarcode",
-                strReaderBarcode);     // ֤
+                strReaderBarcode);     // 读者证条码号
             DomUtil.SetElementText(domOperLog.DocumentElement, "itemBarcode",
-                strItemBarcode);    //
+                strItemBarcode);    // 册条码号
             DomUtil.SetElementText(domOperLog.DocumentElement, "borrowDate",
-                strBorrowDate);     //
+                strBorrowDate);     // 借阅日期
             DomUtil.SetElementText(domOperLog.DocumentElement, "borrowPeriod",
-                strThisBorrowPeriod);   //
+                strThisBorrowPeriod);   // 借阅期限
             DomUtil.SetElementText(domOperLog.DocumentElement, "returningDate",
-                strReturningDate);     // Ӧ
+                strReturningDate);     // 应还日期

             // 2015/1/12
             DomUtil.SetElementText(domOperLog.DocumentElement, "type",
-    strBookType);    // ͼ
+    strBookType);    // 图书类型
             DomUtil.SetElementText(domOperLog.DocumentElement, "price",
-strBookPrice);    // ͼ۸
-
-            // TODO: 0 Ҫд
+strBookPrice);    // 图书价格
+
+            // TODO: 0 需要忽略写入
             DomUtil.SetElementText(domOperLog.DocumentElement, "no",
-                Convert.ToString(nNo)); //
+                Convert.ToString(nNo)); // 续借次数

             if (nNo > 0)
                 DomUtil.SetElementText(domOperLog.DocumentElement, "lastReturningDate",
-    strLastReturningDate);     // ϴӦ
+    strLastReturningDate);     // 上次应还日期

             DomUtil.SetElementText(domOperLog.DocumentElement, "operator",
-                strOperator);   //
+                strOperator);   // 操作者
             DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
-                strBorrowDate);   // ʱ
-
-            // ؽĳɹϢ
-
-            // RFC1123ʱֵַ GMTʱ
+                strBorrowDate);   // 操作时间
+
+            // 返回借阅成功的信息
+
+            // 返回满足RFC1123的时间值字符串 GMT时间
             borrow_info.LatestReturnTime = DateTimeUtil.Rfc1123DateTimeStringEx(this_return_time.ToLocalTime());
             borrow_info.Period = strThisBorrowPeriod;
             borrow_info.BorrowCount = nNo;
@@ -13115,7 +13115,7 @@
             return 0;
         }

-        // ʱֵıʱ䣬յλתΪʵʾַ
+        // 将时间值的本地时间，按照单位转换为适当的显示字符串
         // 2008/5/7 new add
         static string GetLocalTimeString(string strUnit,
             DateTime time)
@@ -13128,13 +13128,13 @@
             return time.ToLocalTime().ToString("G");
         }

-        // APIĴ
-        // 鵱ǰǷǱڵĳڲ
-        // text-level: ûʾ
+        // 借阅API的从属函数
+        // 检查当前是否有潜在的超期册
+        // text-level: 用户提示
         // return:
         //      -1  error
-        //      0   ûгڲ
-        //      1   гڲ
+        //      0   没有超期册
+        //      1   有超期册
         int CheckOverdue(
             Calendar calendar,
             XmlDocument readerdom,
@@ -13163,10 +13163,10 @@
                     string strOperator = DomUtil.GetAttr(node, "operator");

                     // return:
-                    //      -1  ݸʽ
-                    //      0   ûзֳ
-                    //      1   ֳ   strErrorʾϢ
-                    //      2   Ѿڿڣ׳ 2009/3/13 new add
+                    //      -1  数据格式错误
+                    //      0   没有发现超期
+                    //      1   发现超期   strError中有提示信息
+                    //      2   已经在宽限期内，很容易超期 2009/3/13 new add
                     nRet = app.CheckPeriod(
                         calendar,
                         strBorrowDate,
@@ -13176,8 +13176,8 @@
                     {
                         if (bForce == true)
                             continue;
-                        // text-level: ڲ
-                        strError = "߼¼ йز '" + strBarcode + "' ĽϢִ" + strError;
+                        // text-level: 内部错误
+                        strError = "读者记录中 有关册 '" + strBarcode + "' 的借阅期限信息检查出现错误：" + strError;
                     }

                     if (nRet == 1)
@@ -13191,17 +13191,17 @@

                 }

-                // δ黹Ĳг˳
+                // 发现未归还的册中出现了超期情况
                 if (nOverCount > 0)
                 {
-                    // strError = "öߵǰ " + Convert.ToString(nOverCount) + " δڲ: " + strOverdueItemBarcodeList + " ˽Ĳܾ߾콫Щѳڲл";
-
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("öߵǰsδڲ"),   // "öߵǰ {0} δڲ: {1}"
+                    // strError = "该读者当前有 " + Convert.ToString(nOverCount) + " 个未还超期册: " + strOverdueItemBarcodeList + " ，因此借阅操作被拒绝。请读者尽快将这些已超期册履行还书手续。";
+
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("该读者当前有s个未还超期册"),   // "该读者当前有 {0} 个未还超期册: {1}"
                         Convert.ToString(nOverCount),
                         strOverdueItemBarcodeList);

-                        // "öߵǰ " + Convert.ToString(nOverCount) + " δڲ: " + strOverdueItemBarcodeList + ""; // ˽()ܾ߾콫Щѳڲл
+                        // "该读者当前有 " + Convert.ToString(nOverCount) + " 个未还超期册: " + strOverdueItemBarcodeList + ""; // ，因此借阅(或续借)操作被拒绝。请读者尽快将这些已超期册履行还书手续。
                     return 1;
                 }
             }
@@ -13209,14 +13209,14 @@
             return 0;
         }

-        // ֤ǷڣǷйʧ״̬
-        // 2006/8/23 new add  δ
-        // text-level: ûʾ OPACԤԼҪô˺
+        // 检查借阅证是否超期，是否有挂失等状态
+        // 2006/8/23 new add 但是 尚未测试
+        // text-level: 用户提示 OPAC预约功能要调用此函数
         // return:
-        //      -1  ̷˴Ӧܽ
-        //      0   Խ
-        //      1   ֤ѾʧЧڣܽ
-        //      2   ֤вýĵ״̬
+        //      -1  检测过程发生了错误。应当作不能借阅来处理
+        //      0   可以借阅
+        //      1   证已经过了失效期，不能借阅
+        //      2   证有不让借阅的状态
         public int CheckReaderExpireAndState(XmlDocument readerdom,
             out string strError)
         {
@@ -13232,11 +13232,11 @@
                 }
                 catch
                 {
-                    // text-level: ڲ
-                    strError = string.Format(this.GetString("֤ʧЧֵsʽ"), // "֤ʧЧ<expireDate>ֵ '{0}' ʽ"
+                    // text-level: 内部错误
+                    strError = string.Format(this.GetString("借阅证失效期值s格式错误"), // "借阅证失效期<expireDate>值 '{0}' 格式错误"
                         strExpireDate);

-                        // "֤ʧЧ<expireDate>ֵ '" + strExpireDate + "' ʽ";
+                        // "借阅证失效期<expireDate>值 '" + strExpireDate + "' 格式错误";
                     return -1;
                 }

@@ -13244,11 +13244,11 @@

                 if (expireDate <= now)
                 {
-                    // text-level: ûʾ
-                    strError = string.Format(this.GetString("sѾ֤ʧЧs"),  // "({0})Ѿ֤ʧЧ({1})"
+                    // text-level: 用户提示
+                    strError = string.Format(this.GetString("今天s已经超过借阅证失效期s"),  // "今天({0})已经超过借阅证失效期({1})。"
                         now.ToLocalTime().ToLongDateString(),
                         expireDate.ToLocalTime().ToLongDateString());
-                        // "(" + now.ToLocalTime().ToLongDateString() + ")Ѿ֤ʧЧ(" + expireDate.ToLocalTime().ToLongDateString() + ")";
+                        // "今天(" + now.ToLocalTime().ToLongDateString() + ")已经超过借阅证失效期(" + expireDate.ToLocalTime().ToLongDateString() + ")。";
                     return 1;
                 }

@@ -13257,10 +13257,10 @@
             string strState = DomUtil.GetElementText(readerdom.DocumentElement, "state");
             if (String.IsNullOrEmpty(strState) == false)
             {
-                // text-level: ûʾ
-                strError = string.Format(this.GetString("֤״̬Ϊs"), // "֤״̬Ϊ '{0}'"
+                // text-level: 用户提示
+                strError = string.Format(this.GetString("借阅证的状态为s"), // "借阅证的状态为 '{0}'。"
                     strState);
-                    // "֤״̬Ϊ '" + strState + "'";
+                    // "借阅证的状态为 '" + strState + "'。";
                 return 2;
             }

@@ -13268,12 +13268,12 @@
         }

-        // ߺͲ¼еѵԤԼȡһԤԼ֤
-        // ¼ǰstate=arrived<request>Ԫ
+        // 清除读者和册记录中的已到预约事项，并提取下一个预约读者证条码号
+        // 本函数还负责清除册记录中以前残留的state=arrived的<request>元素
         // parameters:
-        //      strItemBarcode  š֧ "@refID:" ǰ׺÷
-        //      bMaskLocationReservation    Ҫ¼<location>#reservation
-        //      strReservationReaderBarcode һԤԼߵ֤
+        //      strItemBarcode  册条码号。支持 "@refID:" 前缀用法
+        //      bMaskLocationReservation    不要给册记录<location>打上#reservation标记
+        //      strReservationReaderBarcode 返回下一个预约读者的证条码号
         public int ClearArrivedInfo(
             RmsChannelCollection channels,
             string strReaderBarcode,
@@ -13301,7 +13301,7 @@

             bool bDontLock = false;

-            // Ӷ߼¼
+            // 加读者记录锁
             try
             {
                 this.ReaderLocks.LockForWrite(strReaderBarcode);
@@ -13309,14 +13309,14 @@
             catch (System.Threading.LockRecursionException)
             {
                 // 2012/5/31
-                // пܱDigitalPlatform.LibraryServer.LibraryApplication.Reservation()ʱѾԶ߼¼
+                // 有可能本函数被DigitalPlatform.LibraryServer.LibraryApplication.Reservation()调用时，已经对读者记录加了锁
                 bDontLock = true;
             }

             try
             {

-                // ߼¼
+                // 读入读者记录
                 string strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 nRet = this.GetReaderRecXml(
@@ -13327,12 +13327,12 @@
                     out strError);
                 if (nRet == 0)
                 {
-                    strError = "֤ '" + strReaderBarcode + "' ";
+                    strError = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     goto DOITEM;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     return -1;
                 }

@@ -13342,12 +13342,12 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     return -1;
                 }

-                // ӵǰ߼¼ɾйֶ
+                // 从当前读者记录中删除有关字段
                 XmlNodeList nodes = readerdom.DocumentElement.SelectNodes("reservations/request");
                 XmlNode readerRequestNode = null;
                 string strItems = "";
@@ -13367,12 +13367,12 @@
                 {
                     Debug.Assert(readerRequestNode != null, "");

-                    // ޸״̬ǲһΣ
-                    // ͬʱд־ãԱ㽫ѯ
+                    // 是清除，还是修改状态标记并保留一段？
+                    // 现在是清除。如果能同时写入日志最好，以便将来查询
                     readerRequestNode.ParentNode.RemoveChild(readerRequestNode);
                 }

-                // дض߼¼
+                // 写回读者记录
                 if (bFound == true)
                 {
                     lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
@@ -13385,21 +13385,21 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        strError = "дض߼¼ '" + strOutputReaderRecPath + "' ʱ : " + strError;
+                        strError = "写回读者记录 '" + strOutputReaderRecPath + "' 时发生错误 : " + strError;
                         return -1;
                     }
                 }

             DOITEM:
-                // ˳һԤԼ֤
+                // 顺便获得下一个预约读者证条码号
                 string strItemXml = "";
                 string strOutputItemRecPath = "";
-                // ò¼
+                // 获得册记录
                 // return:
                 //      -1  error
                 //      0   not found
-                //      1   1
-                //      >1  ж1
+                //      1   命中1条
+                //      >1  命中多于1条
                 nRet = this.GetItemRecXml(
                     channel,
                     strItemBarcode,
@@ -13408,12 +13408,12 @@
                     out strError);
                 if (nRet == 0)
                 {
-                    strError = " '" + strItemBarcode + "' ";
+                    strError = "册条码号 '" + strItemBarcode + "' 不存在";
                     return 0;
                 }
                 if (nRet == -1)
                 {
-                    strError = "¼ʱ: " + strError;
+                    strError = "读入册记录时发生错误: " + strError;
                     return -1;
                 }

@@ -13423,15 +13423,15 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װز¼XML DOMʱ: " + strError;
+                    strError = "装载册记录进入XML DOM时发生错误: " + strError;
                     return -1;
                 }
-                // 쿴ԤԼ, УȡһԤԼߵ֤
-                // úǰstate=arrived<request>Ԫ
+                // 察看本册预约情况, 如果有，提取出第一个预约读者的证条码号
+                // 该函数还负责清除以前残留的state=arrived的<request>元素
                 // return:
                 //      -1  error
-                //      0   û޸
-                //      1   й޸
+                //      0   没有修改
+                //      1   进行过修改
                 nRet = DoItemReturnReservationCheck(
                     bDontMaskLocationReservation,
                     ref itemdom,
@@ -13461,7 +13461,7 @@
                         out strError);
                     if (lRet == -1)
                     {
-                        strError = "дز¼ '" + strOutputItemRecPath + "' ʱ: " + strError;
+                        strError = "写回册记录 '" + strOutputItemRecPath + "' 时发生错误: " + strError;
                         return -1;
                     }

@@ -13477,12 +13477,12 @@
             return 1;
         }

-        // תƽϢ
-        // Դ߼¼е<borrows><overdues>תƵĿ߼¼
+        // 转移借阅信息
+        // 将源读者记录中的<borrows>和<overdues>转移到目标读者记录中
         // result.Value:
         //      -1  error
-        //      0   ûбҪתơԴ߼¼ûҪתƵĽϢ
-        //      1   Ѿɹת
+        //      0   没有必要转移。即源读者记录中没有需要转移的借阅信息
+        //      1   已经成功转移
         public LibraryServerResult DevolveReaderInfo(
             SessionInfo sessioninfo,
             string strSourceReaderBarcode,
@@ -13491,41 +13491,41 @@
             string strError = "";
             int nRet = 0;
             long lRet = 0;
-            bool bChanged = false;  // ǷʵԸĶ
+            bool bChanged = false;  // 是否发生过实质性改动

             LibraryServerResult result = new LibraryServerResult();

-            // Ȩַ
+            // 权限字符串
             if (StringUtil.IsInList("devolvereaderinfo", sessioninfo.RightsOrigin) == false)
             {
                 result.Value = -1;
-                result.ErrorInfo = "תƽϢܾ߱devolvereaderinfoȨޡ";
+                result.ErrorInfo = "转移借阅信息操作被拒绝。不具备devolvereaderinfo权限。";
                 result.ErrorCode = ErrorCode.AccessDenied;
                 return result;
             }

-            // ԴĿŲͬ
+            // 检查源和目标条码号不能相同
             if (strSourceReaderBarcode == strTargetReaderBarcode)
             {
-                strError = "ԴĿ߼¼֤Ųͬ";
+                strError = "源和目标读者记录证条码号不能相同";
                 goto ERROR1;
             }

             if (String.IsNullOrEmpty(strSourceReaderBarcode) == true)
             {
-                strError = "Դ߼¼֤ŲΪ";
+                strError = "源读者记录证条码号不能为空";
                 goto ERROR1;
             }

             if (String.IsNullOrEmpty(strTargetReaderBarcode) == true)
             {
-                strError = "Ŀ߼¼֤ŲΪ";
+                strError = "目标读者记录证条码号不能为空";
                 goto ERROR1;
             }

-            // ԴĿ֤ż߼¼
-            // ȺмɣȼŽС
+            // 对源和目标两个证条码号加锁，读入两个读者记录
+            // 加锁有先后有技巧：先加条码号较小的锁定。否则容易造成死锁
             string strBarcode1 = "";
             string strBarcode2 = "";
             if (String.Compare(strSourceReaderBarcode, strTargetReaderBarcode) < 0)
@@ -13542,16 +13542,16 @@
             try
             {

-                // Ӷ߼¼1
+                // 加读者记录锁1
                 this.ReaderLocks.LockForWrite(strBarcode1);
-                try // ߼¼1Χʼ
-                {
-                    // Ӷ߼¼2
+                try // 读者记录锁定1范围开始
+                {
+                    // 加读者记录锁2
                     this.ReaderLocks.LockForWrite(strBarcode2);
-                    try // ߼¼2Χʼ
-                    {
-
-                        // Դ߼¼
+                    try // 读者记录锁定2范围开始
+                    {
+
+                        // 读入源读者记录
                         string strSourceReaderXml = "";
                         string strSourceOutputReaderRecPath = "";
                         byte[] source_reader_timestamp = null;
@@ -13565,35 +13565,35 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = "Դ֤ '" + strSourceReaderBarcode + "' ";
+                            result.ErrorInfo = "源读者证条码号 '" + strSourceReaderBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.SourceReaderBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            strError = "Դ߼¼ʱ: " + strError;
+                            strError = "读入源读者记录时发生错误: " + strError;
                             goto ERROR1;
                         }

                         // 2008/6/17 new add
                         if (nRet > 1)
                         {
-                            strError = "Դ߼¼ʱֶ֤ " + strSourceReaderBarcode + "  " + nRet.ToString() + " һشϵͳԱ촦";
+                            strError = "读入源读者记录时，发现读者证条码号 " + strSourceReaderBarcode + " 命中 " + nRet.ToString() + " 条，这是一个严重错误，请系统管理员尽快处理。";
                             goto ERROR1;
                         }

                         string strSourceLibraryCode = "";

-                        // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                        // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                         if (String.IsNullOrEmpty(strSourceOutputReaderRecPath) == false)
                         {
-                            // 鵱ǰǷϽ߿
-                            // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                            // 检查当前操作者是否管辖这个读者库
+                            // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                             if (this.IsCurrentChangeableReaderPath(strSourceOutputReaderRecPath,
                     sessioninfo.LibraryCodeList,
                     out strSourceLibraryCode) == false)
                             {
-                                strError = "Դ߼¼· '" + strSourceOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                                strError = "源读者记录路径 '" + strSourceOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                                 goto ERROR1;
                             }
                         }
@@ -13604,11 +13604,11 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "װԴ߼¼XML DOMʱ: " + strError;
+                            strError = "装载源读者记录进入XML DOM时发生错误: " + strError;
                             goto ERROR1;
                         }

-                        // Ŀ߼¼
+                        // 读入目标读者记录
                         string strTargetReaderXml = "";
                         string strTargetOutputReaderRecPath = "";
                         byte[] target_reader_timestamp = null;
@@ -13622,35 +13622,35 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = "Ŀ֤ '" + strTargetReaderBarcode + "' ";
+                            result.ErrorInfo = "目标读者证条码号 '" + strTargetReaderBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.TargetReaderBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            strError = "Ŀ߼¼ʱ: " + strError;
+                            strError = "读入目标读者记录时发生错误: " + strError;
                             goto ERROR1;
                         }

                         // 2008/6/17 new add
                         if (nRet > 1)
                         {
-                            strError = "Ŀ߼¼ʱֶ֤ " + strTargetReaderBarcode + "  " + nRet.ToString() + " һشϵͳԱ촦";
+                            strError = "读入目标读者记录时，发现读者证条码号 " + strTargetReaderBarcode + " 命中 " + nRet.ToString() + " 条，这是一个严重错误，请系统管理员尽快处理。";
                             goto ERROR1;
                         }

                         string strTargetLibraryCode = "";

-                        // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                        // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                         if (String.IsNullOrEmpty(strTargetOutputReaderRecPath) == false)
                         {
-                            // 鵱ǰǷϽ߿
-                            // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                            // 检查当前操作者是否管辖这个读者库
+                            // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                             if (this.IsCurrentChangeableReaderPath(strTargetOutputReaderRecPath,
                     sessioninfo.LibraryCodeList,
                     out strTargetLibraryCode) == false)
                             {
-                                strError = "Դ߼¼· '" + strTargetOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                                strError = "源读者记录路径 '" + strTargetOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                                 goto ERROR1;
                             }
                         }
@@ -13661,7 +13661,7 @@
                             out strError);
                         if (nRet == -1)
                         {
-                            strError = "װĿ߼¼XML DOMʱ: " + strError;
+                            strError = "装载目标读者记录进入XML DOM时发生错误: " + strError;
                             goto ERROR1;
                         }

@@ -13669,12 +13669,12 @@
                         domOperLog.LoadXml("<root />");
                         DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strSourceLibraryCode + "," + strTargetLibraryCode );    // ڵĹݴ
+    strSourceLibraryCode + "," + strTargetLibraryCode );    // 读者所在的馆代码
                         DomUtil.SetElementText(domOperLog.DocumentElement,
                             "operation", "devolveReaderInfo");

-                        // ߼־ĽǶȣӦ˵ֻҪԴ֤ź
-                        // Ŀ֤ţԸԭ
+                        // 从逻辑日志的角度，应当说，只要有源读者证条码号和
+                        // 目标读者证条码号，就足以复原
                         DomUtil.SetElementText(domOperLog.DocumentElement,
                             "sourceReaderBarcode",
                             strSourceReaderBarcode);
@@ -13682,22 +13682,22 @@
                             "targetReaderBarcode",
                             strTargetReaderBarcode);

-                        string strOperTimeString = this.Clock.GetClock();   // RFC1123ʽ
+                        string strOperTimeString = this.Clock.GetClock();   // RFC1123格式

                         DomUtil.SetElementText(domOperLog.DocumentElement, "operator",
                 sessioninfo.UserID);
                         DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
                             strOperTimeString);

-                        // ׼õʱļ
+                        // 准备附件可能用到的临时文件名
                         string strAttachmentFileName = this.GetTempFileName("attach");  //  Path.GetTempFileName();
                         Stream attachment = null;

-                        try // ڴ˷Χڣעɾʱļ
+                        try // 在此范围内，需注意最后删除临时文件
                         {

-                            // ƶϢ -- <borrows>Ԫ
+                            // 移动借阅信息 -- <borrows>元素内容
                             // return:
                             //      -1  error
                             //      0   not found brrowinfo
@@ -13718,7 +13718,7 @@
                             if (nRet == 1)
                                 bChanged = true;

-                            // ƶΥԼϢ -- <overdues>Ԫ
+                            // 移动超期违约金信息 -- <overdues>元素内容
                             // return:
                             //      -1  error
                             //      0   not found overdueinfo
@@ -13736,7 +13736,7 @@
                             if (nRet == 1)
                                 bChanged = true;

-                            // ûʵԸı
+                            // 没有实质性改变
                             if (bChanged == false)
                             {
                                 result.Value = 0;
@@ -13752,14 +13752,14 @@
                             }

-                            // ߼¼
-                            // дض߼¼
+                            // 保存两条读者记录
+                            // 写回读者记录
                             byte[] output_timestamp = null;
                             string strOutputPath = "";

                             int nRedoCount = 0;

-                            // Ӧȱtarget߼¼Ϊ˺жϣԭĿҪһЩ
+                            // 应当先保存target读者记录。因为如果此后中断，还原的可能性要大一些

@@ -13779,7 +13779,7 @@
                                     nRedoCount++;
                                     if (nRedoCount > 10)
                                     {
-                                        strError = "дĿ߼¼ʱ,ʱͻ,10,ʧ...";
+                                        strError = "写回目标读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                         goto ERROR1;
                                     }
                                     target_reader_timestamp = output_timestamp;
@@ -13805,7 +13805,7 @@
                                     nRedoCount++;
                                     if (nRedoCount > 10)
                                     {
-                                        strError = "дԴ߼¼ʱ,ʱͻ,10,ʧ...";
+                                        strError = "写回源读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                         goto ERROR1;
                                     }
                                     source_reader_timestamp = output_timestamp;
@@ -13814,7 +13814,7 @@
                                 goto ERROR1;
                             }

-                            // дԴ߼¼־
+                            // 记载最终写入的源读者记录到日志
                             XmlNode nodeRecord = DomUtil.SetElementText(domOperLog.DocumentElement,
                                 "sourceReaderRecord",
                                 source_readerdom.OuterXml);
@@ -13822,7 +13822,7 @@
                                 "recPath",
                                 strSourceOutputReaderRecPath);

-                            // дĿ߼¼
+                            // 记载最终写入的目标读者记录
                             nodeRecord = DomUtil.SetElementText(domOperLog.DocumentElement,
                                 "targetReaderRecord",
                                 target_readerdom.OuterXml);
@@ -13832,7 +13832,7 @@

                             if (attachment != null)
                             {
-                                // ļָ븴λͷ
+                                // 将文件指针复位到头部
                                 attachment.Seek(0, SeekOrigin.Begin);
                             }

@@ -13842,11 +13842,11 @@
                                 out strError);
                             if (nRet == -1)
                             {
-                                strError = "DevolveReaderInfo() API д־ʱ: " + strError;
+                                strError = "DevolveReaderInfo() API 写入日志时发生错误: " + strError;
                                 goto ERROR1;
                             }
                         }
-                        finally //  end of ڴ˷Χڣעɾʱļ
+                        finally //  end of 在此范围内，需注意最后删除临时文件
                         {
                             if (attachment != null)
                             {
@@ -13856,14 +13856,14 @@
                             File.Delete(strAttachmentFileName);
                         }

-                    }// ߼¼2Χ
+                    }// 读者记录锁定2范围结束
                     finally
                     {
                         this.ReaderLocks.UnlockForWrite(strBarcode2);
                     }

-                }// ߼¼1Χ
+                }// 读者记录锁定1范围结束
                 finally
                 {
                     this.ReaderLocks.UnlockForWrite(strBarcode1);
@@ -13885,12 +13885,12 @@
             return result;
         }

-        // ƶϢ -- <borrows>Ԫ
-        // ˺Ҳ־ָģʹãֻǻָʱdomOperLogΪnull
+        // 移动借阅信息 -- <borrows>元素内容
+        // 此函数也被日志恢复模块所使用，只是恢复时domOperLog为null
         // parameters:
-        //      domOperLog      ־DOMʱΪnullʾ־־
-        //      strAttachmentFileName   ־ļбҪ־򴴽ļ֡
-        //      attachment              [out]־ش򿪵
+        //      domOperLog      操作日志DOM对象。如果调用时为null，表示根本不创建日志（包括日志附件）
+        //      strAttachmentFileName   日志附件文件名。如果有必要创建日志附件，则创建出的文件用这个名字。
+        //      attachment              [out]如果创建了日志附件，返回打开的流。
         // return:
         //      -1  error
         //      0   not found brrowinfo
@@ -13932,14 +13932,14 @@
             {
                 if (nodesSourceBorrow.Count > 10)
                 {
-                    // 漰ʵ¼̫࣬޷ֱд־¼
-
-                    //
+                    // 涉及的实体记录太多，无法直接写入日志记录
+
+                    // 创建附件流
                     attachment = File.Create(strAttachmentFileName);
                 }
                 else
                 {
-                    attachment = null;  // ʹø
+                    attachment = null;  // 不使用附件
                 }
             }

@@ -13947,13 +13947,13 @@
             {
                 XmlNode source = nodesSourceBorrow[i];

-                // <borrow>Ԫ
+                // 加<borrow>元素
                 XmlDocumentFragment fragment = target_dom.CreateDocumentFragment();
                 fragment.InnerXml = source.OuterXml;

                 XmlNode target = nodeTargetBorrows.AppendChild(fragment);
-                // һעԪ
-                DomUtil.SetAttr(target, "devolveComment", "Ӷ " + strSourceReaderBarcode + " תƶʱ " + strOperTimeString);
+                // 增加一个注释元素
+                DomUtil.SetAttr(target, "devolveComment", "从读者 " + strSourceReaderBarcode + " 转移而来，操作时间 " + strOperTimeString);

                 string strEntityBarcode = DomUtil.GetAttr(source, "barcode");
@@ -13961,7 +13961,7 @@
                 if (String.IsNullOrEmpty(strEntityBarcode) == true)
                     continue;

-                // ͬ޸Ĳ¼еĽ֤
+                // 同步修改册记录中的借者证条码号
                 // return:
                 //      -1  error
                 //      0   entitybarcode not found
@@ -13980,37 +13980,37 @@
                     return -1;
                 if (nRet == 0)
                 {
-                    // ʱ
-                }
-
-            }
-
-            // Դ¼и´һעԪ
-            // ԭ<borrows>Ԫе룬պ󱸲
+                    // 暂时不理会
+                }
+
+            }
+
+            // 源记录中根下创建一个注释元素
+            // 并将原<borrows>元素中的内容移入，用于日后备查
             XmlNode nodeComment = source_dom.CreateElement("devolvedBorrows");
             source_dom.DocumentElement.AppendChild(nodeComment);
             nodeComment.InnerXml = nodeSourceBorrows.InnerXml;

-            DomUtil.SetAttr(nodeComment, "comment", " " + strOperTimeString + " нϢתƵ " + strTargetReaderBarcode + " ");
-
-            // ־¼ϢҪ
+            DomUtil.SetAttr(nodeComment, "comment", "已于 " + strOperTimeString + " 将下列借阅信息转移到读者 " + strTargetReaderBarcode + " 名下");
+
+            // 创建日志记录信息要素
             if (domOperLog != null)
             {
-                // ־¼е<borrows>ԪڴԴ߼¼ƶĿ߼¼Щ<borrow>Ԫ
+                // 日志记录中的<borrows>元素内存放了来自源读者记录打算移动到目标读者记录的那些<borrow>元素
                 DomUtil.SetElementInnerXml(domOperLog.DocumentElement,
                     "borrows",
                     nodeSourceBorrows.InnerXml);
             }

-            // ɾԴ¼е<borrows/borrow>Ԫ
+            // 删除源记录中的<borrows/borrow>元素
             nodeSourceBorrows.InnerXml = "";

             return 1;
         }

-        // ƶΥԼϢ -- <overdues>Ԫ
-        // ˺Ҳ־ָģʹãֻǻָʱdomOperLogΪnull
+        // 移动超期违约金信息 -- <overdues>元素内容
+        // 此函数也被日志恢复模块所使用，只是恢复时domOperLog为null
         // return:
         //      -1  error
         //      0   not found overdueinfo
@@ -14027,7 +14027,7 @@
             strError = "";
             // int nRet = 0;

-            // ƶΥԼϢ
+            // 移动超期违约金信息
             XmlNode nodeSourceOverdues = source_dom.DocumentElement.SelectSingleNode("overdues");
             if (nodeSourceOverdues == null)
                 return 0;
@@ -14047,49 +14047,49 @@
             {
                 XmlNode source = nodesSourceOverdue[i];

-                // <overdue>Ԫ
+                // 加<overdue>元素
                 XmlDocumentFragment fragment = target_dom.CreateDocumentFragment();
                 fragment.InnerXml = source.OuterXml;

                 XmlNode target = nodeTargetOverdues.AppendChild(fragment);

-                // һעԪ
-                DomUtil.SetAttr(target, "devolveComment", "Ӷ " +strSourceReaderBarcode+ " תƶʱ " + strOperTimeString);
-
-
-            }
-
-            // Դ¼и´һעԪ
-            // ԭ<overdues>Ԫе룬պ󱸲
+                // 增加一个注释元素
+                DomUtil.SetAttr(target, "devolveComment", "从读者 " +strSourceReaderBarcode+ " 转移而来，操作时间 " + strOperTimeString);
+
+
+            }
+
+            // 源记录中根下创建一个注释元素
+            // 并将原<overdues>元素中的内容移入，用于日后备查
             XmlNode nodeComment = source_dom.CreateElement("devolvedOverdues");
             source_dom.DocumentElement.AppendChild(nodeComment);
             nodeComment.InnerXml = nodeSourceOverdues.InnerXml;

-            DomUtil.SetAttr(nodeComment, "comment", " "
+            DomUtil.SetAttr(nodeComment, "comment", "已于 "
                 +strOperTimeString
-                + " гϢתƵ " +strTargetReaderBarcode+ " ");
-
-            // ־¼ϢҪ
+                + " 将下列超期信息转移到读者 " +strTargetReaderBarcode+ " 名下");
+
+            // 创建日志记录信息要素
             if (domOperLog != null)
             {
-                // ־¼е<overdues>ԪڴԴ߼¼ƶĿ߼¼Щ<overdue>Ԫ
+                // 日志记录中的<overdues>元素内存放了来自源读者记录打算移动到目标读者记录的那些<overdue>元素
                 DomUtil.SetElementInnerXml(domOperLog.DocumentElement,
                     "overdues",
                     nodeSourceOverdues.InnerXml);
             }

-            // ɾԴ¼е<overdues/overdue>Ԫ
+            // 删除源记录中的<overdues/overdue>元素
             nodeSourceOverdues.InnerXml = "";

             return 1;
         }

-        // ޸Ĳ¼еĽ֤
+        // 修改册记录中的借者证条码号
         // parameters:
-        //      domOperLog  ־¼DOM==nullʾ־־DOM
-        //      attachment    !=nullʾҪʵ¼浽־attachmentС==nullʾֱӰʵ¼浽־¼(DOM)
-        //      nAttachmentIndex    ־¼indexһεõʱ򣬴ֵӦΪ0Ȼ־¼Զֵ
+        //      domOperLog  日志记录DOM对象。如果==null，表示根本不创建日志（包括日志DOM）
+        //      attachment    如果!=null表示要把实体记录保存到日志的attachment中。如果==null，表示直接把实体记录保存到日志记录(DOM)中
+        //      nAttachmentIndex    日志附件记录index。第一次调用的时候，此值应为0，然后如果本函数增添了日志附件记录，会自动增量这个值
         // return:
         //      -1  error
         //      0   entitybarcode not found
@@ -14109,13 +14109,13 @@
             int nRet = 0;
             long lRet = 0;

-            // Ӳ¼
+            // 加册记录锁
             this.EntityLocks.LockForWrite(strEntityBarcode);

-            try // ¼Χʼ
-            {
-
-                // ӲŻò¼
+            try // 册记录锁定范围开始
+            {
+
+                // 从册条码号获得册记录
                 byte[] item_timestamp = null;
                 List<string> aPath = null;
                 string strItemXml = "";
@@ -14124,12 +14124,12 @@
                 int nRedoCount = 0;
                 REDO:

-                // ò¼
+                // 获得册记录
                 // return:
                 //      -1  error
                 //      0   not found
-                //      1   1
-                //      >1  ж1
+                //      1   命中1条
+                //      >1  命中多于1条
                 nRet = this.GetItemRecXml(
                     Channels,
                     strEntityBarcode,
@@ -14140,12 +14140,12 @@
                     out strError);
                 if (nRet == 0)
                 {
-                    strError = " '" + strEntityBarcode + "' ";
+                    strError = "册条码号 '" + strEntityBarcode + "' 不存在";
                     return 0;
                 }
                 if (nRet == -1)
                 {
-                    strError = "¼ '"+strEntityBarcode+"' ʱ: " + strError;
+                    strError = "读入册记录 '"+strEntityBarcode+"' 时发生错误: " + strError;
                     goto ERROR1;
                 }

@@ -14154,13 +14154,13 @@
                 if (aPath.Count > 1)
                 {
                     /*
-                    strError = "Ϊ '" + strEntityBarcode + "' Ĳ¼ " + aPath.Count.ToString() + " ޷޸";
+                    strError = "册条码号为 '" + strEntityBarcode + "' 的册记录有 " + aPath.Count.ToString() + " 条，无法进行修改";
                     return -1;
                      * */

-                    // bItemBarcodeDup = true; // ʱѾҪ״̬ȻԽһʶĲ¼
-
-                    // strDupBarcodeList
+                    // bItemBarcodeDup = true; // 此时已经需要设置状态。虽然后面可以进一步识别出真正的册记录
+
+                    // 构造strDupBarcodeList
                     /*
                     string[] pathlist = new string[aPath.Count];
                     aPath.CopyTo(pathlist);
@@ -14174,7 +14174,7 @@

                     if (String.IsNullOrEmpty(strOldReaderBarcode) == true)
                     {
-                        strError = "strOldReaderBarcodeֵΪ";
+                        strError = "strOldReaderBarcode参数值不能为空";
                         goto ERROR1;
                     }

@@ -14185,34 +14185,34 @@
                         goto ERROR1;
                     }

-                    // ظŵĲ¼Уѡзϵǰ֤ŵ
+                    // 从若干重复条码号的册记录中，选出其中符合当前读者证条码号的
                     // return:
-                    //      -1
-                    //          ѡ
+                    //      -1  出错
+                    //      其他    选出的数量
                     nRet = FindItem(
                         channel,
                         strOldReaderBarcode,
                         aPath,
-                        true,   // Ż
+                        true,   // 优化
                         out aFoundPath,
                         out aItemXml,
                         out aTimestamp,
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "ѡظŵĲ¼ʱ: " + strError;
+                        strError = "选择重复条码号的册记录时发生错误: " + strError;
                         goto ERROR1;
                     }

                     if (nRet == 0)
                     {
-                        strError = " '" + strEntityBarcode + "'  " + aPath.Count + " ¼Уûκһ<borrower>Ԫر˱ '" + strOldReaderBarcode + "' ġ";
+                        strError = "册条码号 '" + strEntityBarcode + "' 检索出的 " + aPath.Count + " 条记录中，没有任何一条其<borrower>元素表明了被读者 '" + strOldReaderBarcode + "' 借阅。";
                         goto ERROR1;
                     }

                     if (nRet > 1)
                     {
-                        strError = "Ϊ '" + strEntityBarcode + "' <borrower>ԪرΪ '" + strOldReaderBarcode + "' ĵĲ¼ " + aFoundPath.Count.ToString() + " ޷ƶ";
+                        strError = "册条码号为 '" + strEntityBarcode + "' 并且<borrower>元素表明为读者 '" + strOldReaderBarcode + "' 借阅的册记录有 " + aFoundPath.Count.ToString() + " 条，无法进行移动操作。";
                         goto ERROR1;
                     }

@@ -14239,7 +14239,7 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װز¼XML DOMʱ: " + strError;
+                    strError = "装载册记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

@@ -14248,27 +14248,27 @@

                 if (String.IsNullOrEmpty(strBorrower) == true)
                 {
-                    strError = "ʵ¼ûнϢ(<borrower>Ԫ)";
+                    strError = "实体记录中没有借者信息(<borrower>元素内容)";
                     goto ERROR1;
                 }

-                // ˶Ծɶ֤
+                // 核对旧读者证条码号
                 if (strBorrower != strOldReaderBarcode)
                 {
-                    strError = "ʵ¼Ун֤ '" + strBorrower + "' ĸǰ֤ '" + strOldReaderBarcode + "' һ...";
+                    strError = "实体记录中，已有借者证条码号 '" + strBorrower + "' 和期望的改前证条码号 '" + strOldReaderBarcode + "' 不一致...";
                     goto ERROR1;
                 }

-                // ޸Ϊ¶֤
+                // 修改为新读者证条码号
                 DomUtil.SetElementText(itemdom.DocumentElement,
                     "borrower",
                     strNewReaderBarcode);

-                // һע
+                // 加上一个注释
                 DomUtil.SetElementText(itemdom.DocumentElement,
                     "devolveComment",
-                    "ԭΪ " + strOldReaderBarcode + " ģ "
-                    +strOperTimeString+" תƵ "+strNewReaderBarcode+" ");
+                    "本册原为读者 " + strOldReaderBarcode + " 所借阅，后于 "
+                    +strOperTimeString+" 被转移到读者 "+strNewReaderBarcode+" 名下");

                 if (channel == null)
                 {
@@ -14280,7 +14280,7 @@
                     }
                 }

-                // ʵ¼
+                // 保存实体记录
                 byte[] output_timestamp = null;
                 string strOutputPath = "";

@@ -14304,7 +14304,7 @@
                     }
                 }

-                // ˵ļ¼д־
+                // 将保存了的记录写入日志
                 if (domOperLog != null)
                 {
                     XmlNode nodeLogRecord = domOperLog.CreateElement("changedEntityRecord");
@@ -14313,15 +14313,15 @@

                     if (attachment == null)
                     {
-                        // ʵ¼ȫ浽־¼
+                        // 实体记录完全保存到日志记录中

                         nodeLogRecord.InnerText = itemdom.OuterXml;
                     }
                     else
                     {
-                        // ʵ¼浽Уֻ־¼
-
-                        // 渽
+                        // 实体记录保存到附件中，只在日志记录中留下序号
+
+                        // 保存附件序号
                         DomUtil.SetAttr(nodeLogRecord, "attachmentIndex", nAttachmentIndex.ToString());

                         byte [] content = Encoding.UTF8.GetBytes(itemdom.OuterXml);
@@ -14343,16 +14343,16 @@
             return -1;
         }

-        // һ߼¼Ľ軹ϢǷ쳣
+        // 检查一个读者记录的借还信息是否异常。
         // parameters:
-        //      nStart      ӵڼĵĲʼ
-        //      nCount      ĵĲ
-        //      nProcessedBorrowItems   [out]δ˶ٸĲ
-        //      nTotalBorrowItems   [out]ǰһжٸĲ
+        //      nStart      从第几个借阅的册事项开始处理
+        //      nCount      共处理几个借阅的册事项
+        //      nProcessedBorrowItems   [out]本次处理了多少个借阅册事项
+        //      nTotalBorrowItems   [out]当前读者一共包含有多少个借阅册事项
         // result.Value
-        //      -1
-        //      0   ޴
-        //      1   鷢д
+        //      -1  错误。
+        //      0   检查无错。
+        //      1   检查发现有错。
         public LibraryServerResult CheckReaderBorrowInfo(
             RmsChannelCollection Channels,
             string strReaderBarcode,
@@ -14371,12 +14371,12 @@
             LibraryServerResult result = new LibraryServerResult();
             int nErrorCount = 0;

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForWrite(strReaderBarcode);

-            try // ߼¼Χʼ
-            {
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+                // 读入读者记录
                 string strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -14390,13 +14390,13 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                    result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

@@ -14406,7 +14406,7 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

@@ -14417,13 +14417,13 @@
                 if (nTotalBorrowItems == 0)
                 {
                     result.Value = 0;
-                    result.ErrorInfo = "߼¼ûн軹Ϣ";
+                    result.ErrorInfo = "读者记录中没有借还信息。";
                     return result;
                 }

                 if (nStart >= nTotalBorrowItems)
                 {
-                    strError = "nStartֵ" + nStart.ToString() + "ڵǰ߼¼еĽĲ" + nTotalBorrowItems.ToString();
+                    strError = "nStart参数值" + nStart.ToString() + "大于当前读者记录中的借阅册个数" + nTotalBorrowItems.ToString();
                     goto ERROR1;
                 }

@@ -14433,7 +14433,7 @@
                     if (nCount != -1 && nProcessedBorrowItems >= nCount)
                         break;

-                    // һAPI10
+                    // 一个API最多做10条
                     if (nProcessedBorrowItems >= 10)
                         break;

@@ -14447,7 +14447,7 @@
                     string strOutputReaderBarcode_0 = "";

                     string[] aDupPath = null;
-                   // һʵ¼Ľ軹ϢǷ쳣
+                   // 检查一个实体记录的借还信息是否异常。
                     LibraryServerResult result_1 = CheckItemBorrowInfo(
                         Channels,
                         strReaderBarcode,
@@ -14490,7 +14490,7 @@

                                     if (result_2.Value == 1)
                                     {
-                                        strCheckError += "߼¼нĲ " + strItemBarcode + " Ĳ¼(¼· " + aDupPath[j] + ") ʱִ: " + result_1.ErrorInfo + "";
+                                        strCheckError += "检查读者记录中借阅册条码号 " + strItemBarcode + " 关联的册记录(记录路径 " + aDupPath[j] + ") 时发现错误: " + result_1.ErrorInfo + "。";
                                         nErrorCount++;
                                     }
                                 }
@@ -14499,13 +14499,13 @@

                             if (linkedPath.Count == 0)
                             {
-                                strCheckError += "߼¼нĲ " + strItemBarcode + "  " + aDupPath.Length + " ¼Щ¼ûκһйض֤ŵĽϢ";
+                                strCheckError += "读者记录中借阅册条码号 " + strItemBarcode + " 关联了 " + aDupPath.Length + " 条册记录，可是这些册记录中没有任何一条中有关联回读者证条码号的借阅信息。";
                                 nErrorCount++;
                             }

                             if (linkedPath.Count > 1)
                             {
-                                strCheckError += "߼¼нĲ " + strItemBarcode + "  " + aDupPath.Length + " ¼Щ¼ " + linkedPath.Count.ToString() + "йض֤ŵĽϢ";
+                                strCheckError += "读者记录中借阅册条码号 " + strItemBarcode + " 关联了 " + aDupPath.Length + " 条册记录，这些册记录中有 " + linkedPath.Count.ToString() + "条中有关联回读者证条码号的借阅信息。";
                                 nErrorCount++;
                             }

@@ -14514,19 +14514,19 @@

                         if (result_1.ErrorCode == ErrorCode.ReaderBarcodeNotFound)
                         {
-                            strCheckError += "߼¼нĲ " + strItemBarcode + " Ĳ¼У<borrower>ֶιصĶ֤ " + strOutputReaderBarcode_0 + "ǳĶ֤ " + strReaderBarcode + "֤Ϊ " + strOutputReaderBarcode_0 + " Ķ߼¼ڡ";
+                            strCheckError += "读者记录中借阅册条码号 " + strItemBarcode + " 关联的册记录中，其<borrower>字段关联回的读者证条码号是 " + strOutputReaderBarcode_0 + "，而不是出发的读者证条码号 " + strReaderBarcode + "。并且证条码号为 " + strOutputReaderBarcode_0 + " 的读者记录不存在。";
                             nErrorCount++;
                             continue;
                         }

                         if (result_1.Value == -1)
                         {
-                            strCheckError += "߼¼нĲ " + strItemBarcode + " Ĳ¼ʱ: " + result_1.ErrorInfo + "";
+                            strCheckError += "检查读者记录中借阅册条码号 " + strItemBarcode + " 关联的册记录时发生错误: " + result_1.ErrorInfo + "。";
                             nErrorCount++;
                         }
                         if (result_1.Value == 1)
                         {
-                            strCheckError += "߼¼нĲ " + strItemBarcode + " Ĳ¼ʱִ: " + result_1.ErrorInfo + "";
+                            strCheckError += "检查读者记录中借阅册条码号 " + strItemBarcode + " 关联的册记录时发现错误: " + result_1.ErrorInfo + "。";
                             nErrorCount++;
                         }
                         continue;
@@ -14535,7 +14535,7 @@

                     if (strOutputReaderBarcode_0 != strReaderBarcode)
                     {
-                        strCheckError += "߼¼нĲ " + strItemBarcode + " Ĳ¼У<borrower>ֶιصĶ֤ " + strOutputReaderBarcode_0 + "ǳĶ֤ " + strReaderBarcode + "";
+                        strCheckError += "读者记录中借阅册条码号 " + strItemBarcode + " 关联的册记录中，其<borrower>字段关联回的读者证条码号是 " + strOutputReaderBarcode_0 + "，而不是出发的读者证条码号 " + strReaderBarcode + "。";
                         nErrorCount++;
                     }
                 }
@@ -14563,14 +14563,14 @@
             return result;
         }

-        // һʵ¼Ľ軹ϢǷ쳣
+        // 检查一个实体记录的借还信息是否异常。
         // parameters:
-        //      strLockedReaderBarcode  ѾšϢԱظ
-        //      exist_readerdom ѾװDOMĶ߼¼֤strLockedReaderBarcodeṩֵŻܡ
+        //      strLockedReaderBarcode  外层已经加锁过的条码号。本函数根据这个信息，可以避免重复加锁。
+        //      exist_readerdom 已经装载入DOM的读者记录。其读者证条码号是strLockedReaderBarcode。如果提供了这个值，本函数会优化性能。
         // result.Value
-        //      -1
-        //      0   ʵ¼ûнϢ߼鷢޴
-        //      1   鷢д
+        //      -1  出错。
+        //      0   实体记录中没有借阅信息，或者检查发现无错。
+        //      1   检查发现有错。
         public LibraryServerResult CheckItemBorrowInfo(
             RmsChannelCollection Channels,
             string strLockedReaderBarcode,
@@ -14595,7 +14595,7 @@
             {
                 if (String.IsNullOrEmpty(strExistReaderRecPath) == true)
                 {
-                    strError = "exist_readerdomΪգstrExistReaderRecPathҲӦΪա";
+                    strError = "如果exist_readerdom参数不为空，则strExistReaderRecPath也不应为空。";
                     goto ERROR1;
                 }
             }
@@ -14614,14 +14614,14 @@

             string strItemXml = "";

-            // ѾȷĲ¼·
+            // 如果已经有确定的册记录路径
             if (String.IsNullOrEmpty(strConfirmItemRecPath) == false)
             {
-                // ·еĿǲʵ
+                // 检查路径中的库名，是不是实体库名
                 // return:
                 //      -1  error
-                //      0   ʵ
-                //      1   ʵ
+                //      0   不是实体库名
+                //      1   是实体库名
                 nRet = this.CheckItemRecPath(strConfirmItemRecPath,
                     out strError);
                 if (nRet == -1)
@@ -14642,21 +14642,21 @@
                     out strError);
                 if (lRet == -1)
                 {
-                    strError = "strConfirmItemRecPath '" + strConfirmItemRecPath + "' ò¼ʧ: " + strError;
+                    strError = "根据strConfirmItemRecPath '" + strConfirmItemRecPath + "' 获得册记录失败: " + strError;
                     goto ERROR1;
                 }
             }
             else
             {
-                // ӲŻò¼
+                // 从册条码号获得册记录
                 List<string> aPath = null;

-                // ò¼
+                // 获得册记录
                 // return:
                 //      -1  error
                 //      0   not found
-                //      1   1
-                //      >1  ж1
+                //      1   命中1条
+                //      >1  命中多于1条
                 nRet = this.GetItemRecXml(
                     Channels,
                     strItemBarcode,
@@ -14668,27 +14668,27 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = " '" + strItemBarcode + "' ";
+                    result.ErrorInfo = "册条码号 '" + strItemBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "¼ʱ: " + strError;
+                    strError = "读入册记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 if (aPath.Count > 1)
                 {
                     /*
-                    // strDupBarcodeList
+                    // 构造strDupBarcodeList
                     string[] pathlist = new string[aPath.Count];
                     aPath.CopyTo(pathlist);
                     strDupBarcodeList = String.Join(",", pathlist);
                      * */

                     result.Value = -1;
-                    result.ErrorInfo = "Ϊ '" + strItemBarcode + "' Ĳ¼ " + aPath.Count.ToString() + " ޷޸ڸӲ¼·ύ޸";
+                    result.ErrorInfo = "册条码号为 '" + strItemBarcode + "' 的册记录有 " + aPath.Count.ToString() + " 条，无法进行修复操作。请在附加册记录路径后重新提交修复操作。";
                     result.ErrorCode = ErrorCode.ItemBarcodeDup;

                     aDupPath = new string[aPath.Count];
@@ -14702,11 +14702,11 @@
                     if (nRet == 1)
                     {
                         strOutputItemRecPath = aPath[0];
-                        // strItemXmlѾв¼
-                    }
-                }
-
-                // غ
+                        // strItemXml已经有册记录了
+                    }
+                }
+
+                // 函数返回后有用
                 aDupPath = new string[1];
                 aDupPath[0] = strOutputItemRecPath;
             }
@@ -14717,30 +14717,30 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "װز¼XML DOMʱ: " + strError;
+                strError = "装载册记录进入XML DOM时发生错误: " + strError;
                 goto ERROR1;
             }

-            strOutputReaderBarcode = ""; // ֤
+            strOutputReaderBarcode = ""; // 借阅者证条码号

             strOutputReaderBarcode = DomUtil.GetElementText(itemdom.DocumentElement,
     "borrower");
             if (String.IsNullOrEmpty(strOutputReaderBarcode) == true)
             {
-                strError = "¼<borrower>Ԫֵòᵱǰδκζ߽";
-                result.Value = 0;   // 2008/1/25 comment ʱ޷϶ǷΪ󡣻ҪstrOutputReaderBarcodeغбȽϲȷ
+                strError = "册记录中<borrower>元素值表明该册当前并未被任何读者借阅";
+                result.Value = 0;   // 2008/1/25 comment 此时无法断定是否为错误。还需要strOutputReaderBarcode返回后进行比较才能确定
                 result.ErrorInfo = strError;
                 return result;
             }

-            // ߼¼Ƿborrows/borrowԪر
-            // Ӷ߼¼
+            // 读出读者记录，看看是否有borrows/borrow元素表明有这个册条码号
+            // 加读者记录锁
             if (strLockedReaderBarcode != strOutputReaderBarcode)
                 this.ReaderLocks.LockForWrite(strOutputReaderBarcode);

-            try // ߼¼Χʼ
-            {
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+                // 读入读者记录
                 string strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -14759,13 +14759,13 @@
                     if (nRet == 0)
                     {
                         result.Value = 1;
-                        result.ErrorInfo = "֤ '" + strOutputReaderBarcode + "' ";
+                        result.ErrorInfo = "读者证条码号 '" + strOutputReaderBarcode + "' 不存在";
                         result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                         return result;
                     }
                     if (nRet == -1)
                     {
-                        strError = "߼¼ʱ: " + strError;
+                        strError = "读入读者记录时发生错误: " + strError;
                         goto ERROR1;
                     }

@@ -14774,7 +14774,7 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "װض߼¼XML DOMʱ: " + strError;
+                        strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }
                 }
@@ -14787,12 +14787,12 @@
                 XmlNodeList nodesBorrow = readerdom.DocumentElement.SelectNodes("borrows/borrow[@barcode='"+strItemBarcode+"']");
                 if (nodesBorrow.Count == 0)
                 {
-                    strCheckError += "Ȼ¼ " + strOutputItemRecPath + " б˱ '" + strOutputReaderBarcode + "' ģǶ߼¼ " + strOutputReaderRecPath + " вûйڲ '" + strItemBarcode + "' Ľļ¼";
+                    strCheckError += "虽然册记录 " + strOutputItemRecPath + " 中表明了被读者 '" + strOutputReaderBarcode + "' 借阅，但是读者记录 " + strOutputReaderRecPath + " 中并没有关于册条码号 '" + strItemBarcode + "' 的借阅记录。";
                     goto END1;
                 }
                 if (nodesBorrow.Count > 1)
                 {
-                    strCheckError = "߼¼ " + strOutputReaderRecPath + " йڲ '" + strItemBarcode + "'  " + nodesBorrow.Count.ToString() + " ļ¼";
+                    strCheckError = "读者记录有 " + strOutputReaderRecPath + " 中关于册条码号 '" + strItemBarcode + "' 的 " + nodesBorrow.Count.ToString() + " 条含糊借阅记录。";
                     goto END1;
                 }

@@ -14822,9 +14822,9 @@
             return result;
         }

-        // ޸߼¼һĽϢ
-        // ˵ǶнϢָʵ岻ڣȻڵ
-        // ûָص
+        // 修复读者记录一侧的借阅信息链条错误
+        // 具体来说，就是读者这边有借阅信息，但是指向的实体不存在，或者虽然存在但是
+        // 其中没有指回的链。
         public LibraryServerResult RepairReaderSideError(
             SessionInfo sessioninfo,
             string strReaderBarcode,
@@ -14839,16 +14839,16 @@

             LibraryServerResult result = new LibraryServerResult();

-            int nRedoCount = 0; // Ϊʱͻ, ԵĴ
+            int nRedoCount = 0; // 因为时间戳冲突, 重试的次数

             if (String.IsNullOrEmpty(strReaderBarcode) == true)
             {
-                strError = "֤ŲΪա";
+                strError = "读者证条码号不能为空。";
                 goto ERROR1;
             }
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
-                strError = "ŲΪա";
+                strError = "册条码号不能为空。";
                 goto ERROR1;
             }
 REDO_REPAIR:
@@ -14859,12 +14859,12 @@
      * */

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForWrite(strReaderBarcode);

-            try // ߼¼Χʼ
-            {
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+                // 读入读者记录
                 string strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -14877,22 +14877,22 @@
                     out strError);
                 if (nRet == 0)
                 {
-                    strError = "֤ '" + strReaderBarcode + "' ";
+                    strError = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     goto ERROR1;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 string strLibraryCode = "";
-                // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                 if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
                     sessioninfo.LibraryCodeList,
                     out strLibraryCode) == false)
                 {
-                    strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                    strError = "读者记录路径 '" + strOutputReaderRecPath + "' 的读者库不在当前用户管辖范围内";
                     goto ERROR1;
                 }

@@ -14902,23 +14902,23 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // У֤ŲǷXML¼ȫһ
+                // 校验读者证条码号参数是否和XML记录中完全一致
                 string strTempBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
                     "barcode");
                 if (strReaderBarcode != strTempBarcode)
                 {
-                    strError = "޸ܾ֤Ų '" + strReaderBarcode + "' Ͷ߼¼<barcode>ԪڵĶֵ֤ '" + strTempBarcode + "' һ¡";
+                    strError = "修复操作被拒绝。因读者证条码号参数 '" + strReaderBarcode + "' 和读者记录中<barcode>元素内的读者证条码号值 '" + strTempBarcode + "' 不一致。";
                     goto ERROR1;
                 }

                 XmlNode nodeBorrow = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='"+strItemBarcode+"']");
                 if (nodeBorrow == null)
                 {
-                    strError = "޸ܾ߼¼ "+strReaderBarcode+" вйز "+strItemBarcode+" ĽϢ";
+                    strError = "修复操作被拒绝。读者记录 "+strReaderBarcode+" 中并不存在有关册 "+strItemBarcode+" 的借阅信息。";
                     goto ERROR1;
                 }

@@ -14934,21 +14934,21 @@
                     goto ERROR1;
                 }

-                // Ӳ¼
+                // 加册记录锁
                 this.EntityLocks.LockForWrite(strItemBarcode);

-                try // ¼Χʼ
-                {
-                    // ¼
-
-                    // ѾȷĲ¼·
+                try // 册记录锁定范围开始
+                {
+                    // 读入册记录
+
+                    // 如果已经有确定的册记录路径
                     if (String.IsNullOrEmpty(strConfirmItemRecPath) == false)
                     {
-                        // ·еĿǲʵ
+                        // 检查路径中的库名，是不是实体库名
                         // return:
                         //      -1  error
-                        //      0   ʵ
-                        //      1   ʵ
+                        //      0   不是实体库名
+                        //      1   是实体库名
                         nRet = this.CheckItemRecPath(strConfirmItemRecPath, out strError);
                         if (nRet != 1)
                             goto ERROR1;
@@ -14963,20 +14963,20 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            strError = "strConfirmItemRecPath '" + strConfirmItemRecPath + "' ò¼ʧ: " + strError;
+                            strError = "根据strConfirmItemRecPath '" + strConfirmItemRecPath + "' 获得册记录失败: " + strError;
                             goto ERROR1;
                         }
                     }
                     else
                     {
-                        // ӲŻò¼
-
-                        // ò¼
+                        // 从册条码号获得册记录
+
+                        // 获得册记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetItemRecXml(
                             sessioninfo.Channels,
                             strItemBarcode,
@@ -14989,24 +14989,24 @@
                         {
                             /*
                             result.Value = -1;
-                            result.ErrorInfo = " '" + strItemBarcode + "' ";
+                            result.ErrorInfo = "册条码号 '" + strItemBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                             return result;
                              * */
-                            // ŲҲҪ޸֮һ
+                            // 册条码号不存在也是需要修复的情况之一。
                             // bItemRecordNotFound = true;
                             goto DELETE_CHAIN;
                         }
                         if (nRet == -1)
                         {
-                            strError = "¼ʱ: " + strError;
+                            strError = "读入册记录时发生错误: " + strError;
                             goto ERROR1;
                         }

                         if (aPath.Count > 1)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = "Ϊ '" + strItemBarcode + "' Ĳ¼ " + aPath.Count.ToString() + " ޷޸ڸӲ¼·ύ޸";
+                            result.ErrorInfo = "册条码号为 '" + strItemBarcode + "' 的册记录有 " + aPath.Count.ToString() + " 条，无法进行修复操作。请在附加册记录路径后重新提交修复操作。";
                             result.ErrorCode = ErrorCode.ItemBarcodeDup;

                             aDupPath = new string[aPath.Count];
@@ -15034,37 +15034,37 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "װز¼XML DOMʱ: " + strError;
+                        strError = "装载册记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    // УŲǷXML¼ȫһ
+                    // 校验册条码号参数是否和XML记录中完全一致
                     string strTempItemBarcode = DomUtil.GetElementText(itemdom.DocumentElement,
                         "barcode");
                     if (strItemBarcode != strTempItemBarcode)
                     {
-                        strError = "޸ܾŲ '" + strItemBarcode + "' Ͳ¼<barcode>ԪڵĲֵ '" + strTempItemBarcode + "' һ¡";
+                        strError = "修复操作被拒绝。因册条码号参数 '" + strItemBarcode + "' 和册记录中<barcode>元素内的册条码号值 '" + strTempItemBarcode + "' 不一致。";
                         goto ERROR1;
                     }

-                    // ¼Ƿָض߼¼
+                    // 看看册记录中是否有指回读者记录的链
                     string strBorrower = DomUtil.GetElementText(itemdom.DocumentElement,
                         "borrower");
                     if (strBorrower == strReaderBarcode)
                     {
-                        strError = "޸ܾҪ޸һȷֱӽͨ";
+                        strError = "修复操作被拒绝。您所请求要修复的链，本是一条完整正确的链。可直接进行普通还书操作。";
                         goto ERROR1;
                     }

                     DELETE_CHAIN:

-                    // Ƴ߼¼
+                    // 移除读者记录侧的链
                     nodeBorrow.ParentNode.RemoveChild(nodeBorrow);

                     byte[] output_timestamp = null;
                     string strOutputPath = "";

-                    // дض߼¼
+                    // 写回读者记录
                     lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                         readerdom.OuterXml,
                         false,
@@ -15080,7 +15080,7 @@
                             nRedoCount++;
                             if (nRedoCount > 10)
                             {
-                                strError = "дض߼¼ʱ,ʱͻ,10,ʧ...";
+                                strError = "写回读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                 goto ERROR1;
                             }
                             goto REDO_REPAIR;
@@ -15088,16 +15088,16 @@
                         goto ERROR1;
                     }

-                    // ʱʱ
+                    // 及时更新时间戳
                     reader_timestamp = output_timestamp;

                     /*
 <root>
   <operation>repairBorrowInfo</operation>
-  <action>...</action> 嶯  repairreaderside repairitemside
+  <action>...</action> 具体动作 有 repairreaderside repairitemside
   <readerBarcode>...</readerBarcode>
   <itemBarcode>...</itemBarcode>
-  <confirmItemRecPath>...</confirmItemRecPath> жõĲ¼·
+  <confirmItemRecPath>...</confirmItemRecPath> 辅助判断用的册记录路径
   <operator>test</operator>
   <operTime>Fri, 08 Dec 2006 10:12:20 GMT</operTime>
 </root>
@@ -15107,7 +15107,7 @@
                     domOperLog.LoadXml("<root />");
                     DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operation", "repairBorrowInfo");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "action", "repairreaderside");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "readerBarcode", strReaderBarcode);
@@ -15124,22 +15124,22 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "RepairReaderSideError() API д־ʱ: " + strError;
+                        strError = "RepairReaderSideError() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    // дͳָ
+                    // 写入统计指标
                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(
                         strLibraryCode,
-                        "޸Ϣ",
-                        "߲",
+                        "修复借阅信息",
+                        "读者侧次数",
                         1);

-                } // ¼Χ
+                } // 册记录锁定范围结束
                 finally
                 {
-                    // ¼
+                    // 解册记录锁
                     this.EntityLocks.UnlockForWrite(strItemBarcode);
                 }

@@ -15157,9 +15157,9 @@
             return result;
         }

-        // ޸¼һĽϢ
-        // ˵ǲнϢָĶ߼¼ڣȻڵ
-        // ûָص
+        // 修复册记录一侧的借阅信息链条错误
+        // 具体来说，就是册这边有借阅信息，但是指向的读者记录不存在，或者虽然存在但是
+        // 其中没有指回的链。
         public LibraryServerResult RepairItemSideError(
             SessionInfo sessioninfo,
             string strReaderBarcode,
@@ -15174,26 +15174,26 @@

             LibraryServerResult result = new LibraryServerResult();

-            int nRedoCount = 0; // Ϊʱͻ, ԵĴ
+            int nRedoCount = 0; // 因为时间戳冲突, 重试的次数

             if (String.IsNullOrEmpty(strReaderBarcode) == true)
             {
-                strError = "֤ŲΪա";
+                strError = "读者证条码号不能为空。";
                 goto ERROR1;
             }
             if (String.IsNullOrEmpty(strItemBarcode) == true)
             {
-                strError = "ŲΪա";
+                strError = "册条码号不能为空。";
                 goto ERROR1;
             }
         REDO_REPAIR:

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForWrite(strReaderBarcode);

-            try // ߼¼Χʼ
-            {
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+                // 读入读者记录
                 string strReaderXml = "";
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
@@ -15206,17 +15206,17 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 string strLibraryCode = "";
-                // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                 if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
                     sessioninfo.LibraryCodeList,
                     out strLibraryCode) == false)
                 {
-                    strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                    strError = "读者记录路径 '" + strOutputReaderRecPath + "' 的读者库不在当前用户管辖范围内";
                     goto ERROR1;
                 }

@@ -15224,7 +15224,7 @@
                 if (nRet == 0)
                 {
                     /*
-                    strError = "֤ '" + strReaderBarcode + "' ";
+                    strError = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     goto ERROR1;
                      * */
                 }
@@ -15235,17 +15235,17 @@
                     out strError);
                     if (nRet == -1)
                     {
-                        strError = "װض߼¼XML DOMʱ: " + strError;
+                        strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    // У֤ŲǷXML¼ȫһ
+                    // 校验读者证条码号参数是否和XML记录中完全一致
                     string strTempBarcode = DomUtil.GetElementText(readerdom.DocumentElement,
                         "barcode");
                     if (strReaderBarcode != strTempBarcode)
                     {
-                        strError = "޸ܾ֤Ų '" + strReaderBarcode + "' Ͷ߼¼<barcode>ԪڵĶֵ֤ '" + strTempBarcode + "' һ¡";
+                        strError = "修复操作被拒绝。因读者证条码号参数 '" + strReaderBarcode + "' 和读者记录中<barcode>元素内的读者证条码号值 '" + strTempBarcode + "' 不一致。";
                         goto ERROR1;
                     }
                 }
@@ -15262,21 +15262,21 @@
                     goto ERROR1;
                 }

-                // Ӳ¼
+                // 加册记录锁
                 this.EntityLocks.LockForWrite(strItemBarcode);

-                try // ¼Χʼ
-                {
-                    // ¼
-
-                    // ѾȷĲ¼·
+                try // 册记录锁定范围开始
+                {
+                    // 读入册记录
+
+                    // 如果已经有确定的册记录路径
                     if (String.IsNullOrEmpty(strConfirmItemRecPath) == false)
                     {
-                        // ·еĿǲʵ
+                        // 检查路径中的库名，是不是实体库名
                         // return:
                         //      -1  error
-                        //      0   ʵ
-                        //      1   ʵ
+                        //      0   不是实体库名
+                        //      1   是实体库名
                         nRet = this.CheckItemRecPath(strConfirmItemRecPath, out strError);
                         if (nRet != 1)
                             goto ERROR1;
@@ -15291,20 +15291,20 @@
                             out strError);
                         if (lRet == -1)
                         {
-                            strError = "strConfirmItemRecPath '" + strConfirmItemRecPath + "' ò¼ʧ: " + strError;
+                            strError = "根据strConfirmItemRecPath '" + strConfirmItemRecPath + "' 获得册记录失败: " + strError;
                             goto ERROR1;
                         }
                     }
                     else
                     {
-                        // ӲŻò¼
-
-                        // ò¼
+                        // 从册条码号获得册记录
+
+                        // 获得册记录
                         // return:
                         //      -1  error
                         //      0   not found
-                        //      1   1
-                        //      >1  ж1
+                        //      1   命中1条
+                        //      >1  命中多于1条
                         nRet = this.GetItemRecXml(
                             sessioninfo.Channels,
                             strItemBarcode,
@@ -15316,20 +15316,20 @@
                         if (nRet == 0)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = " '" + strItemBarcode + "' ";
+                            result.ErrorInfo = "册条码号 '" + strItemBarcode + "' 不存在";
                             result.ErrorCode = ErrorCode.ItemBarcodeNotFound;
                             return result;
                         }
                         if (nRet == -1)
                         {
-                            strError = "¼ʱ: " + strError;
+                            strError = "读入册记录时发生错误: " + strError;
                             goto ERROR1;
                         }

                         if (aPath.Count > 1)
                         {
                             result.Value = -1;
-                            result.ErrorInfo = "Ϊ '" + strItemBarcode + "' Ĳ¼ " + aPath.Count.ToString() + " ޷޸ڸӲ¼·ύ޸";
+                            result.ErrorInfo = "册条码号为 '" + strItemBarcode + "' 的册记录有 " + aPath.Count.ToString() + " 条，无法进行修复操作。请在附加册记录路径后重新提交修复操作。";
                             result.ErrorCode = ErrorCode.ItemBarcodeDup;

                             aDupPath = new string[aPath.Count];
@@ -15357,42 +15357,42 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "װز¼XML DOMʱ: " + strError;
+                        strError = "装载册记录进入XML DOM时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    // УŲǷXML¼ȫһ
+                    // 校验册条码号参数是否和XML记录中完全一致
                     string strTempItemBarcode = DomUtil.GetElementText(itemdom.DocumentElement,
                         "barcode");
                     if (strItemBarcode != strTempItemBarcode)
                     {
-                        strError = "޸ܾŲ '" + strItemBarcode + "' Ͳ¼<barcode>ԪڵĲֵ '" + strTempItemBarcode + "' һ¡";
+                        strError = "修复操作被拒绝。因册条码号参数 '" + strItemBarcode + "' 和册记录中<barcode>元素内的册条码号值 '" + strTempItemBarcode + "' 不一致。";
                         goto ERROR1;
                     }

-                    // ¼Ƿָ߼¼
+                    // 看看册记录中是否有指向读者记录的链
                     string strBorrower = DomUtil.GetElementText(itemdom.DocumentElement,
                         "borrower");
                     if (String.IsNullOrEmpty(strBorrower) == true)
                     {
-                        strError = "޸ܾҪ޸Ĳ¼УûнϢ̸޸";
+                        strError = "修复操作被拒绝。您所请求要修复的册记录中，本来就没有借阅信息，因此谈不上修复。";
                         goto ERROR1;
                     }

                     if (strBorrower != strReaderBarcode)
                     {
-                        strError = "޸ܾҪ޸Ĳ¼УûָǶ "+strReaderBarcode+"";
+                        strError = "修复操作被拒绝。您所请求要修复的册记录中，并没有指明借阅者是读者 "+strReaderBarcode+"。";
                         goto ERROR1;

                     }

-                    // ߼¼Ƿָ
+                    // 看看读者记录中是否有指回链条。
                     if (readerdom != null)
                     {
                         XmlNode nodeBorrow = readerdom.DocumentElement.SelectSingleNode("borrows/borrow[@barcode='" + strItemBarcode + "']");
                         if (nodeBorrow != null)
                         {
-                            strError = "޸ܾҪ޸һȷֱӽͨ";
+                            strError = "修复操作被拒绝。您所请求要修复的链，本是一条完整正确的链。可直接进行普通还书操作。";
                             goto ERROR1;
                         }

@@ -15400,7 +15400,7 @@

                 // DELETE_CHAIN:

-                    // Ƴ¼
+                    // 移除册记录侧的链
                     DomUtil.SetElementText(itemdom.DocumentElement,
                         "borrower", "");
                     DomUtil.SetElementText(itemdom.DocumentElement,
@@ -15411,7 +15411,7 @@
                     byte[] output_timestamp = null;
                     string strOutputPath = "";

-                    // дز¼
+                    // 写回册记录
                     lRet = channel.DoSaveTextRes(strOutputItemRecPath,
                         itemdom.OuterXml,
                         false,
@@ -15427,19 +15427,19 @@
                             nRedoCount++;
                             if (nRedoCount > 10)
                             {
-                                strError = "дز¼ʱ,ʱͻ,10,ʧ...";
+                                strError = "写回册记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                                 goto ERROR1;
                             }
                             goto REDO_REPAIR;
                         }
                         goto ERROR1;
-                    } // end of дز¼ʧ
+                    } // end of 写回册记录失败

                     XmlDocument domOperLog = new XmlDocument();
                     domOperLog.LoadXml("<root />");
                     DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                     DomUtil.SetElementText(domOperLog.DocumentElement, "operation", "repairBorrowInfo");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "action", "repairitemside");
                     DomUtil.SetElementText(domOperLog.DocumentElement, "readerBarcode", strReaderBarcode);
@@ -15456,23 +15456,23 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "RepairItemSideError() API д־ʱ: " + strError;
+                        strError = "RepairItemSideError() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }

-                    // дͳָ
+                    // 写入统计指标
                     if (this.Statis != null)
                         this.Statis.IncreaseEntryValue(
                         strLibraryCode,
-                        "޸Ϣ",
-                        "ʵ",
+                        "修复借阅信息",
+                        "实体侧次数",
                         1);

-                } // ¼Χ
+                } // 册记录锁定范围结束
                 finally
                 {
-                    // ¼
+                    // 解册记录锁
                     this.EntityLocks.UnlockForWrite(strItemBarcode);
                 }

@@ -15490,8 +15490,8 @@
             return result;
         }

-        // ݵǼ
-        // result.Value -1   ض(strGateName)ıεۼ
+        // 入馆登记
+        // result.Value -1 出错 其他 特定门(strGateName)的本次的累计量
         public LibraryServerResult PassGate(
             SessionInfo sessioninfo,
             string strReaderBarcode,
@@ -15510,13 +15510,13 @@
             if (string.IsNullOrEmpty(strReaderBarcode) == false)
             {
                 string strOutputCode = "";
-                // ѶάַתΪ֤
+                // 把二维码字符串转换为读者证条码号
                 // parameters:
-                //      strReaderBcode  [out]֤
+                //      strReaderBcode  [out]读者证条码号
                 // return:
-                //      -1
-                //      0       ַǶ֤Ŷά
-                //      1       ɹ
+                //      -1      出错
+                //      0       所给出的字符串不是读者证号二维码
+                //      1       成功
                 nRet = DecodeQrCode(strReaderBarcode,
                     out strOutputCode,
                     out strError);
@@ -15531,11 +15531,11 @@

             if (sessioninfo.UserType == "reader")
             {
-                // TODO: ʹ֤ţƺ谭
+                // TODO: 如果使用身份证号，似乎这里会遇到阻碍
                 if (strReaderBarcode != sessioninfo.Account.Barcode)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "öϢܾΪֻܶԼݵǼǲ";
+                    result.ErrorInfo = "获得读者信息被拒绝。作为读者只能对自己进行入馆登记操作";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
@@ -15546,12 +15546,12 @@
             string strOutputReaderRecPath = "";
             string strLibraryCode = "";

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForRead(strReaderBarcode);
-            try // ߼¼Χʼ
-            {
-
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+
+                // 读入读者记录
                 byte[] reader_timestamp = null;
                 nRet = this.GetReaderRecXml(
                     sessioninfo.Channels,
@@ -15563,13 +15563,13 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                    result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

@@ -15582,15 +15582,15 @@
                 if (string.IsNullOrEmpty(strLibraryCode) == false)
                     strGateName = strLibraryCode + ":" + strGateName;

-                // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -15602,25 +15602,25 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }
                  * */

-                //
+                // 增量总量
                 if (this.Statis != null)
                     this.Statis.IncreaseEntryValue(
                     strLibraryCode,
-                    "˴",
-                    "֮",
+                    "入馆人次",
+                    "所有门之总量",
                     1);

-                // ضŵۼ
+                // 增量特定门的累计量
                 if (this.Statis != null)
                     nResultValue = this.Statis.IncreaseEntryValue(
                     strLibraryCode,
-                    "˴",
+                    "入馆人次",
                     String.IsNullOrEmpty(strGateName) == true ? "(blank)" : strGateName,
                     (int)1);

@@ -15628,7 +15628,7 @@
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "operation",
                     "passgate");
@@ -15657,13 +15657,13 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "PassGate() API д־ʱ: " + strError;
+                        strError = "PassGate() API 写入日志时发生错误: " + strError;
                         goto ERROR1;
                     }
                 }

-            } // ߼¼Χ
+            } // 读者记录锁定范围结束
             finally
             {
                 this.ReaderLocks.UnlockForRead(strReaderBarcode);
@@ -15671,7 +15671,7 @@

             if (String.IsNullOrEmpty(strResultTypeList) == true)
             {
-                results = null; // κν
+                results = null; // 不返回任何结果
                 goto END1;
             }

@@ -15690,7 +15690,7 @@
                 else if (IsResultType(strResultType, "html") == true)
                 {
                     string strReaderRecord = "";
-                    // ߼¼ݴXMLʽתΪHTMLʽ
+                    // 将读者记录数据从XML格式转换为HTML格式
                     nRet = this.ConvertReaderXmlToHtml(
                         sessioninfo,
                         this.CfgDir + "\\readerxml2html.cs",
@@ -15706,7 +15706,7 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "ConvertReaderXmlToHtml()(űΪ" + this.CfgDir + "\\readerxml2html.cs" + "): " + strError;
+                        strError = "ConvertReaderXmlToHtml()出错(脚本程序为" + this.CfgDir + "\\readerxml2html.cs" + "): " + strError;
                         goto ERROR1;
                     }
                     results[i] = strReaderRecord;
@@ -15715,7 +15715,7 @@
                 else if (IsResultType(strResultType, "text") == true)
                 {
                     string strReaderRecord = "";
-                    // ߼¼ݴXMLʽתΪtextʽ
+                    // 将读者记录数据从XML格式转换为text格式
                     nRet = this.ConvertReaderXmlToHtml(
                         sessioninfo,
                         this.CfgDir + "\\readerxml2text.cs",
@@ -15731,14 +15731,14 @@
                         out strError);
                     if (nRet == -1)
                     {
-                        strError = "ConvertReaderXmlToHtml()(űΪ" + this.CfgDir + "\\readerxml2html.cs" + "): " + strError;
+                        strError = "ConvertReaderXmlToHtml()出错(脚本程序为" + this.CfgDir + "\\readerxml2html.cs" + "): " + strError;
                         goto ERROR1;
                     }
                     results[i] = strReaderRecord;
                 }
                 else
                 {
-                    strError = "δ֪Ľ '" + strResultType + "'";
+                    strError = "未知的结果类型 '" + strResultType + "'";
                     goto ERROR1;
                 }
             }
@@ -15753,11 +15753,11 @@
             return result;
         }

-        // Ѻ𽻷
+        // 创建押金交费请求
         // parameters:
-        //      strOutputReaderXml ޸ĺĶ߼¼
-        //      strOutputID رδĽ ID
-        // result.Value -1   δĽ
+        //      strOutputReaderXml 返回修改后的读者记录
+        //      strOutputID 返回本次创建的交费请求的 ID
+        // result.Value -1 出错 其他 本次创建的交费请求条数
         public LibraryServerResult Foregift(
             SessionInfo sessioninfo,
             string strAction,
@@ -15779,44 +15779,44 @@

             if (strAction == "foregift")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("foregift", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "Ѻ𽻷Ĳܾ߱foregiftȨޡ";
+                    result.ErrorInfo = "创建押金交费请求的操作被拒绝。不具备foregift权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else if (strAction == "return")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("returnforegift", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "˻Ѻ()Ĳܾ߱returnforegiftȨޡ";
+                    result.ErrorInfo = "创建退还押金(交费)请求的操作被拒绝。不具备returnforegift权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else
             {
-                strError = "δ֪strActionֵ '" + strAction + "'";
+                strError = "未知的strAction值 '" + strAction + "'";
                 goto ERROR1;
             }

-            int nRedoCount = 0; // Ϊʱͻ, ԵĴ
+            int nRedoCount = 0; // 因为时间戳冲突, 重试的次数
         REDO_FOREGIFT:

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForRead(strReaderBarcode);

-            try // ߼¼Χʼ
-            {
-
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+
+                // 读入读者记录
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
                 nRet = this.GetReaderRecXml(
@@ -15829,27 +15829,27 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                    result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 string strLibraryCode = "";
-                // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList,
             out strLibraryCode) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -15860,17 +15860,17 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // 鵱ǰǲѾѺ𽻷
+                // 检查当前是不是已经有了押金交费请求
                 XmlNodeList nodeOverdues = readerdom.DocumentElement.SelectNodes("overdues/overdue");
                 for (int i = 0; i < nodeOverdues.Count; i++)
                 {
                     XmlNode node = nodeOverdues[i];

-                    string strWord = "Ѻ";
+                    string strWord = "押金。";

                     string strReason = DomUtil.GetAttr(node, "reason");
                     if (strReason.Length < strWord.Length)
@@ -15878,7 +15878,7 @@
                     string strPart = strReason.Substring(0, strWord.Length);
                     if (strPart == strWord)
                     {
-                        strError = " '" + strReaderBarcode + "' ѾѺ𽻷ҪȽѺ󽻷ɺ󣬲ܴµѺ𽻷";
+                        strError = "读者 '" + strReaderBarcode + "' 已经存在押金交费请求。需要先将此押金请求交费完成后，才能创建新的押金交费请求。";
                         goto ERROR1;
                     }
                 }
@@ -15886,10 +15886,10 @@
                 string strOperTime = this.Clock.GetClock();

                 string strOverdueString = "";
-                // Foregift() APIҪ޸readerdom
+                // 根据Foregift() API要求，修改readerdom
                 nRet = DoForegift(strAction,
                     readerdom,
-                    ref strOutputID,   // ΪձʾԶid
+                    ref strOutputID,   // 为空表示函数内自动创建id
                     sessioninfo.UserID,
                     strOperTime,
                     out strOverdueString,
@@ -15911,7 +15911,7 @@

                 strOutputReaderXml = readerdom.OuterXml;

-                // дض߼¼
+                // 写回读者记录
                 long lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                     strOutputReaderXml,
                     false,
@@ -15927,7 +15927,7 @@
                         nRedoCount++;
                         if (nRedoCount > 10)
                         {
-                            strError = "дض߼¼ʱ,ʱͻ,10,ʧ...";
+                            strError = "写回读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                             goto ERROR1;
                         }
                         goto REDO_FOREGIFT;
@@ -15935,20 +15935,20 @@
                     goto ERROR1;
                 }

-                //
+                // 增量总量
                 if (this.Statis != null)
                     this.Statis.IncreaseEntryValue(
                     strLibraryCode,
-                    "Ѻ",
-                    "",
+                    "押金",
+                    "创建交费请求次",
                     1);
-                // TODO: Ӽ۸?
+                // TODO: 增加价格量?

                 XmlDocument domOperLog = new XmlDocument();
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "operation",
                     "foregift");
@@ -15959,11 +15959,11 @@
                     "readerBarcode",
                     strReaderBarcode);

-                // ϸַ һ߶<overdue> OuterXml
+                // 新增的细节字符串 一个或者多个<overdue> OuterXml内容
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "overdues", strOverdueString/*nodeOverdue.OuterXml*/);

-                // µĶ߼¼
+                // 新的读者记录
                 XmlNode nodeReaderRecord = DomUtil.SetElementText(domOperLog.DocumentElement,
                     "readerRecord", readerdom.OuterXml);
                 DomUtil.SetAttr(nodeReaderRecord, "recPath", strOutputReaderRecPath);
@@ -15981,12 +15981,12 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "PassGate() API д־ʱ: " + strError;
+                    strError = "PassGate() API 写入日志时发生错误: " + strError;
                     goto ERROR1;
                 }

-            } // ߼¼Χ
+            } // 读者记录锁定范围结束
             finally
             {
                 this.ReaderLocks.UnlockForRead(strReaderBarcode);
@@ -16002,10 +16002,10 @@
             return result;
         }

-        // Foregift() APIҪ޸readerdom
+        // 根据Foregift() API要求，修改readerdom
         // parameters:
-        //      strAction   Ϊforegiftreturn֮һ
-        //      strID   ΥԼ¼ID˲ΪnullʾԶһidòֵ
+        //      strAction   为foregift和return之一
+        //      strID   违约金记录ID。如果此参数为null，表示函数会自动产生一个id。否则就用参数值
         int DoForegift(
             string strAction,
             XmlDocument readerdom,
@@ -16022,7 +16022,7 @@
             if (String.IsNullOrEmpty(strID) == true)
                 strID = GetOverdueID();

-            // ز
+            // 获得相关参数
             XmlNode nodeForegift = readerdom.DocumentElement.SelectSingleNode("foregift");
             if (nodeForegift == null)
             {
@@ -16041,45 +16041,45 @@
             }
             else if (strAction == "return")
             {
-                // Ҫеoverdues/overdueԪʧborrows/borrowԪʧܽreturnΪ˱˻ѺгڻҪ۳Ѻ
+                // 要所有的overdues/overdue元素消失，borrows/borrow元素消失，才能进行return操作。这样做是为了避免退回押金后，又有超期还书等情况需要扣除押金
                 XmlNodeList overdue_nodes = readerdom.DocumentElement.SelectNodes("overdues/overdue");
                 XmlNodeList borrow_nodes = readerdom.DocumentElement.SelectNodes("borrows/borrow");

                 string strMessage = "";
                 if (overdue_nodes.Count > 0)
                 {
-                    strMessage += " " + overdue_nodes.Count.ToString() + " δ";
+                    strMessage += " " + overdue_nodes.Count.ToString() + " 个未交费事项";
                 }

                 if (borrow_nodes.Count > 0)
                 {
                     if (String.IsNullOrEmpty(strMessage) == false)
-                        strMessage += "";
-
-                    strMessage += " " + borrow_nodes.Count.ToString() + " ѽδ";
+                        strMessage += "和";
+
+                    strMessage += " " + borrow_nodes.Count.ToString() + " 个已借未还书事项";
                 }

                 if (overdue_nodes.Count + borrow_nodes.Count > 0)
                 {
-                    strError = "ߵǰ" + strMessage + "˲ܴ˻Ѻȹ黹ȫͼͽǷѡ";
+                    strError = "本读者当前有" + strMessage + "，因此不能创建退还押金的请求。请先归还全部图书和交纳所有欠费。";
                     return -1;
                 }
             }
             else
             {
-                strError = "δ֪strActionֵ '" + strAction + "'";
+                strError = "未知的strAction值 '" + strAction + "'";
                 goto ERROR1;
             }

             int nResultValue = 0;
             string strForegiftPrice = "";
-            // ִнűGetForegift
-            // м۸񣬼Ҫ½ļ۸
+            // 执行脚本函数GetForegift
+            // 根据已有价格，计算出需要新交的价格
             // parameters:
             // return:
             //      -2  not found script
-            //      -1
-            //      0   ɹ
+            //      -1  出错
+            //      0   成功
             nRet = this.DoGetForegiftScriptFunction(
                 strAction,
                 readerdom,
@@ -16096,11 +16096,11 @@
                 goto ERROR1;
             }

-            // *** ޸Ķ߼¼
-
-            // action "foregift"  "return" ޸ĵǰ߼¼<foregit>ļǮҪȵѶʱŶ
-
-            // ǷoverduesԪ
+            // *** 修改读者记录
+
+            // action "foregift" 和 "return" 并不立即修改当前读者记录<foregit>里面的价钱，而是要等到交费动作的时候才兑现
+
+            // 看看根下面是否有overdues元素
             XmlNode root = readerdom.DocumentElement.SelectSingleNode("overdues");
             if (root == null)
             {
@@ -16108,22 +16108,22 @@
                 readerdom.DocumentElement.AppendChild(root);
             }

-            // һoverdueԪ
+            // 添加一个overdue元素
             XmlNode nodeOverdue = readerdom.CreateElement("overdue");
             root.AppendChild(nodeOverdue);

-            DomUtil.SetAttr(nodeOverdue, "reason", "Ѻ");
-            DomUtil.SetAttr(nodeOverdue, "price", strForegiftPrice);    // עstrForegiftPriceֵΪ"%return_foregift_price%"ʾǰʣѺĸ
-            DomUtil.SetAttr(nodeOverdue, "borrowDate", strCurrentDate);   // borrowDateзʼڲ
+            DomUtil.SetAttr(nodeOverdue, "reason", "押金。");
+            DomUtil.SetAttr(nodeOverdue, "price", strForegiftPrice);    // 注：strForegiftPrice的值可能为"%return_foregift_price%"，表示当前剩余的押金额的负数
+            DomUtil.SetAttr(nodeOverdue, "borrowDate", strCurrentDate);   // borrowDate中放起始日期参数
             DomUtil.SetAttr(nodeOverdue, "borrowPeriod", "");
             DomUtil.SetAttr(nodeOverdue, "returnDate", "");
-            DomUtil.SetAttr(nodeOverdue, "borrowOperator", strOperator);  //
-
-            // idΨһ, ΪΥԼC/S洴
+            DomUtil.SetAttr(nodeOverdue, "borrowOperator", strOperator);  // 创建交费请求的人
+
+            // id属性是唯一的, 为交违约金C/S界面创造了有利条件
             DomUtil.SetAttr(nodeOverdue, "id", strID);

             if (strAction == "return")
-                DomUtil.SetAttr(nodeOverdue, "comment", "˻Ѻ");
+                DomUtil.SetAttr(nodeOverdue, "comment", "退还押金");

             strOverdueString = nodeOverdue.OuterXml;
@@ -16132,11 +16132,11 @@
             return -1;
         }

-        // 𽻷
+        // 创建租金交费请求
         // parameters:
-        //      strOutputReaderXml ޸ĺĶ߼¼
-        //      strOutputID رδĽ ID
-        // result.Value -1   δĽ
+        //      strOutputReaderXml 返回修改后的读者记录
+        //      strOutputID 返回本次创建的交费请求的 ID
+        // result.Value -1 出错 其他 本次创建的交费请求条数
         public LibraryServerResult Hire(
             SessionInfo sessioninfo,
             string strAction,
@@ -16158,39 +16158,39 @@

             if (strAction == "hire")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("hire", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "𽻷Ĳܾ߱hireȨޡ";
+                    result.ErrorInfo = "创建租金交费请求的操作被拒绝。不具备hire权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else if (strAction == "hirelate")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("hirelate", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "(ӳ)𽻷Ĳܾ߱hirelateȨޡ";
+                    result.ErrorInfo = "(延迟)创建租金交费请求的操作被拒绝。不具备hirelate权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }

-            int nRedoCount = 0; // Ϊʱͻ, ԵĴ
+            int nRedoCount = 0; // 因为时间戳冲突, 重试的次数
         REDO_HIRE:

-            // Ӷ߼¼
+            // 加读者记录锁
             this.ReaderLocks.LockForRead(strReaderBarcode);

-            try // ߼¼Χʼ
-            {
-
-                // ߼¼
+            try // 读者记录锁定范围开始
+            {
+
+                // 读入读者记录
                 string strOutputReaderRecPath = "";
                 byte[] reader_timestamp = null;
                 nRet = this.GetReaderRecXml(
@@ -16203,27 +16203,27 @@
                 if (nRet == 0)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "֤ '" + strReaderBarcode + "' ";
+                    result.ErrorInfo = "读者证条码号 '" + strReaderBarcode + "' 不存在";
                     result.ErrorCode = ErrorCode.ReaderBarcodeNotFound;
                     return result;
                 }
                 if (nRet == -1)
                 {
-                    strError = "߼¼ʱ: " + strError;
+                    strError = "读入读者记录时发生错误: " + strError;
                     goto ERROR1;
                 }

                 string strLibraryCode = "";
-                // ߼¼Ķ߿Ĺݴ룬Ƿ񱻵ǰûϽ
+                // 看看读者记录所从属的读者库的馆代码，是否被当前用户管辖
                 if (String.IsNullOrEmpty(strOutputReaderRecPath) == false)
                 {
-                    // 鵱ǰǷϽ߿
-                    // ۲һ߼¼·ǲڵǰûϽĶ߿ⷶΧ?
+                    // 检查当前操作者是否管辖这个读者库
+                    // 观察一个读者记录路径，看看是不是在当前用户管辖的读者库范围内?
                     if (this.IsCurrentChangeableReaderPath(strOutputReaderRecPath,
             sessioninfo.LibraryCodeList,
             out strLibraryCode) == false)
                     {
-                        strError = "߼¼· '" + strOutputReaderRecPath + "' Ķ߿ⲻڵǰûϽΧ";
+                        strError = "读者记录路径 '" + strOutputReaderRecPath + "' 从属的读者库不在当前用户管辖范围内";
                         goto ERROR1;
                     }
                 }
@@ -16234,17 +16234,17 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "װض߼¼XML DOMʱ: " + strError;
+                    strError = "装载读者记录进入XML DOM时发生错误: " + strError;
                     goto ERROR1;
                 }

-                // 鵱ǰǲѾ𽻷
+                // 检查当前是不是已经有了租金交费请求
                 XmlNodeList nodeOverdues = readerdom.DocumentElement.SelectNodes("overdues/overdue");
                 for (int i = 0; i < nodeOverdues.Count; i++)
                 {
                     XmlNode node = nodeOverdues[i];

-                    string strWord = "";
+                    string strWord = "租金。";

                     string strReason = DomUtil.GetAttr(node, "reason");
                     if (strReason.Length < strWord.Length)
@@ -16252,7 +16252,7 @@
                     string strPart = strReason.Substring(0, strWord.Length);
                     if (strPart == strWord)
                     {
-                        strError = " '" + strReaderBarcode + "' Ѿ𽻷ҪȽ󽻷ɺ󣬲ܴµ𽻷";
+                        strError = "读者 '" + strReaderBarcode + "' 已经存在租金交费请求。需要先将此租金请求交费完成后，才能创建新的租金交费请求。";
                         goto ERROR1;
                     }
                 }
@@ -16260,10 +16260,10 @@
                 string strOperTime = this.Clock.GetClock();

                 string strOverdueString = "";
-                // Hire() APIҪ޸readerdom
+                // 根据Hire() API要求，修改readerdom
                 nRet = DoHire(strAction,
                     readerdom,
-                    ref strOutputID,   // ΪձʾԶid
+                    ref strOutputID,   // 为空表示函数内自动创建id
                     sessioninfo.UserID,
                     strOperTime,
                     out strOverdueString,
@@ -16285,7 +16285,7 @@

                 strOutputReaderXml = readerdom.OuterXml;

-                // дض߼¼
+                // 写回读者记录
                 long lRet = channel.DoSaveTextRes(strOutputReaderRecPath,
                     strOutputReaderXml,
                     false,
@@ -16301,7 +16301,7 @@
                         nRedoCount++;
                         if (nRedoCount > 10)
                         {
-                            strError = "дض߼¼ʱ,ʱͻ,10,ʧ...";
+                            strError = "写回读者记录的时候,遇到时间戳冲突,并因此重试10次,仍失败...";
                             goto ERROR1;
                         }
                         goto REDO_HIRE;
@@ -16309,20 +16309,20 @@
                     goto ERROR1;
                 }

-                //
+                // 增量总量
                 if (this.Statis != null)
                     this.Statis.IncreaseEntryValue(
                     strLibraryCode,
-                    "",
-                    "",
+                    "租金",
+                    "创建交费请求次",
                     1);
-                // TODO: Ӽ۸?
+                // TODO: 增加价格量?

                 XmlDocument domOperLog = new XmlDocument();
                 domOperLog.LoadXml("<root />");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
     "libraryCode",
-    strLibraryCode);    // ڵĹݴ
+    strLibraryCode);    // 读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "operation",
                     "hire");
@@ -16333,11 +16333,11 @@
                     "readerBarcode",
                     strReaderBarcode);

-                // ϸַ һ߶<overdue> OuterXml
+                // 新增的细节字符串 一个或者多个<overdue> OuterXml内容
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "overdues", strOverdueString/*nodeOverdue.OuterXml*/);

-                // µĶ߼¼
+                // 新的读者记录
                 XmlNode nodeReaderRecord = DomUtil.SetElementText(domOperLog.DocumentElement,
                     "readerRecord", readerdom.OuterXml);
                 DomUtil.SetAttr(nodeReaderRecord, "recPath", strOutputReaderRecPath);
@@ -16355,12 +16355,12 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "PassGate() API д־ʱ: " + strError;
+                    strError = "PassGate() API 写入日志时发生错误: " + strError;
                     goto ERROR1;
                 }

-            } // ߼¼Χ
+            } // 读者记录锁定范围结束
             finally
             {
                 this.ReaderLocks.UnlockForRead(strReaderBarcode);
@@ -16376,9 +16376,9 @@
             return result;
         }

-        // Hire() APIҪ޸readerdom
+        // 根据Hire() API要求，修改readerdom
         // parameters:
-        //      strID   ΥԼ¼ID˲ΪnullʾԶһidòֵ
+        //      strID   违约金记录ID。如果此参数为null，表示函数会自动产生一个id。否则就用参数值
         int DoHire(
             string strAction,
             XmlDocument readerdom,
@@ -16395,14 +16395,14 @@
             if (String.IsNullOrEmpty(strID) == true)
                 strID = GetOverdueID();

-            // ز
+            // 获得相关参数
             XmlNode nodeHire = readerdom.DocumentElement.SelectSingleNode("hire");
             if (nodeHire == null)
             {
                 // 2013/6/16
                 nodeHire = readerdom.CreateElement("hire");
                 readerdom.DocumentElement.AppendChild(nodeHire);
-                //strError = "߼¼û (<hire>Ԫ)޷𽻷";
+                //strError = "读者记录中没有租金参数定义 (<hire>元素)，因此无法创建租金交费请求";
                 //goto ERROR1;
             }

@@ -16416,20 +16416,20 @@
             {
                 strStartDate = DomUtil.GetAttr(nodeHire, "expireDate");

-                // ¼еĩʧЧΪգȡ֤ں͵ǰʱĿ
+                // 如果记录中的末次租金失效期为空，则试取办证日期和当前时间的靠后者
                 if (String.IsNullOrEmpty(strStartDate) == true)
                 {
                     string strCreateDate = DomUtil.GetElementText(readerdom.DocumentElement,
                         "createDate");

-                    // ûа֤ʱ
+                    // 如果根本没有办证时间
                     if (String.IsNullOrEmpty(strCreateDate) == true)
                     {
                         strStartDate = strCurrentDate;
                     }
                     else
                     {
-                        // а֤ʱ
+                        // 如果有办证时间
                         DateTime createdate = new DateTime(0);
                         try
                         {
@@ -16437,22 +16437,22 @@
                         }
                         catch
                         {
-                            strError = "֤ <createDate> '" + strCreateDate + "' ʽ";
+                            strError = "办证日期 <createDate> '" + strCreateDate + "' 格式错误";
                             goto ERROR1;
                         }

                         if (createdate > current_date)
-                            strStartDate = strCreateDate;   // ð֤ʱ
+                            strStartDate = strCreateDate;   // 采用办证时间
                         else
-                            strStartDate = strCurrentDate;  // õǰʱ
-                    }
-                }
-            }
-            else if (strAction == "hirelate")   // hirehirelateʲô?
+                            strStartDate = strCurrentDate;  // 采用当前时间
+                    }
+                }
+            }
+            else if (strAction == "hirelate")   // hire和hirelate有什么区别?
             {
                 strStartDate = strCurrentDate;

-                // ѾڵĩʧЧڣο
+                // 已经存在的末次租金失效期，参考
                 string strExistStartDate = DomUtil.GetAttr(nodeHire, "expireDate");

                 if (String.IsNullOrEmpty(strExistStartDate) == true)
@@ -16470,7 +16470,7 @@

                 DateTime temp_startdate = DateTimeUtil.FromRfc1123DateTimeString(strStartDate);

-                // ǰڱѾڵĩʧЧڻǰȡһ߳Կ
+                // 如果当前日期比已经存在的末次租金失效期还靠前，就取靠后的一个，避免读者吃亏
                 if (exist_expiredate > temp_startdate)
                     strStartDate = strExistStartDate;
             }
@@ -16480,13 +16480,13 @@
             int nResultValue = 0;
             string strHireExpireDate = "";
             string strHirePrice = "";
-            // ִнűGetHire
-            // ݵǰʱ䡢ڣʧЧںͼ۸
+            // 执行脚本函数GetHire
+            // 根据当前时间、周期，计算出失效期和价格
             // parameters:
             // return:
             //      -2  not found script
-            //      -1
-            //      0   ɹ
+            //      -1  出错
+            //      0   成功
             nRet = this.DoGetHireScriptFunction(
                 readerdom,
                 strStartDate,
@@ -16504,12 +16504,12 @@
                 goto ERROR1;
             }

-            // *** ޸Ķ߼¼
-
-            // ޸ʧЧ
+            // *** 修改读者记录
+
+            // 修改租金失效期
             DomUtil.SetAttr(nodeHire, "expireDate", strHireExpireDate);

-            // ƶ֤ʧЧ
+            // 推动证失效期
             string strReaderExpireDate = DomUtil.GetElementText(readerdom.DocumentElement,
                 "expireDate");
             if (String.IsNullOrEmpty(strReaderExpireDate) == true)
@@ -16523,7 +16523,7 @@
             }
             catch
             {
-                strError = "֤ʧЧ '" + strReaderExpireDate + "' Ϸ";
+                strError = "证失效期 '" + strReaderExpireDate + "' 不合法";
                 goto ERROR1;
             }

@@ -16535,11 +16535,11 @@
             }
             catch
             {
-                strError = "ʧЧ '" + strHireExpireDate + "' Ϸ";
+                strError = "租金失效期 '" + strHireExpireDate + "' 不合法";
                 goto ERROR1;
             }

-            // ʧЧڴ֤ʧЧڣ߶߼¼ʧЧΪ
+            // 如果租金失效期大于证失效期，或者读者记录中现有失效期为空
             if (hire_expiredate > reader_expiredate
                 || String.IsNullOrEmpty(DomUtil.GetElementText(readerdom.DocumentElement,"expireDate")) == true
                 )
@@ -16549,7 +16549,7 @@
                     DateTimeUtil.Rfc1123DateTimeStringEx(hire_expiredate.ToLocalTime()));
             }

-            // ǷoverduesԪ
+            // 看看根下面是否有overdues元素
             XmlNode root = readerdom.DocumentElement.SelectSingleNode("overdues");
             if (root == null)
             {
@@ -16557,22 +16557,22 @@
                 readerdom.DocumentElement.AppendChild(root);
             }

-            // һoverdueԪ
+            // 添加一个overdue元素
             XmlNode nodeOverdue = readerdom.CreateElement("overdue");
             root.AppendChild(nodeOverdue);

-            // DomUtil.SetAttr(nodeOverdue, "barcode", "");    // Ϊ
+            // DomUtil.SetAttr(nodeOverdue, "barcode", "");    // 册条码号为空
             // DomUtil.SetAttr(nodeOverdue, "recPath", strItemRecPath);

-            DomUtil.SetAttr(nodeOverdue, "reason", " " + strStartDate + "  " + strHirePeriod + " ʧЧΪ " + strHireExpireDate);
+            DomUtil.SetAttr(nodeOverdue, "reason", "租金。于 " + strStartDate + " 交纳 " + strHirePeriod + " 的租金，失效期为 " + strHireExpireDate);
             DomUtil.SetAttr(nodeOverdue, "price", strHirePrice);
-            DomUtil.SetAttr(nodeOverdue, "borrowDate", strStartDate);   // borrowDateзʼڲ
-            DomUtil.SetAttr(nodeOverdue, "borrowPeriod", strHirePeriod);    // borrowperiodзڲ
-            DomUtil.SetAttr(nodeOverdue, "returnDate", strHireExpireDate);  // returnDateзʧЧڲ
-            DomUtil.SetAttr(nodeOverdue, "borrowOperator", strOperator);  //
+            DomUtil.SetAttr(nodeOverdue, "borrowDate", strStartDate);   // borrowDate中放起始日期参数
+            DomUtil.SetAttr(nodeOverdue, "borrowPeriod", strHirePeriod);    // borrowperiod中放租金周期参数
+            DomUtil.SetAttr(nodeOverdue, "returnDate", strHireExpireDate);  // returnDate中放失效期参数
+            DomUtil.SetAttr(nodeOverdue, "borrowOperator", strOperator);  // 创建交费请求的人
             // DomUtil.SetAttr(nodeOverdue, "operator", strOperator);
-            // idΨһ, ΪΥԼC/S洴
+            // id属性是唯一的, 为交违约金C/S界面创造了有利条件
             DomUtil.SetAttr(nodeOverdue, "id", strID);

             strOverdueString = nodeOverdue.OuterXml;
@@ -16581,7 +16581,7 @@
             return -1;
         }

-        //
+        // 结算
         public LibraryServerResult Settlement(
             SessionInfo sessioninfo,
             string strAction,
@@ -16596,40 +16596,40 @@

             if (strAction == "settlement")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("settlement", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ܾ߱settlementȨޡ";
+                    result.ErrorInfo = "结算操作被拒绝。不具备settlement权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else if (strAction == "undosettlement")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("undosettlement", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "Ĳܾ߱undosettlementȨޡ";
+                    result.ErrorInfo = "撤销结算的操作被拒绝。不具备undosettlement权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else if (strAction == "delete")
             {
-                // Ȩж
+                // 权限判断
                 if (StringUtil.IsInList("deletesettlement", sessioninfo.RightsOrigin) == false)
                 {
                     result.Value = -1;
-                    result.ErrorInfo = "ɾ¼Ĳܾ߱deletesettlementȨޡ";
+                    result.ErrorInfo = "删除结算记录的操作被拒绝。不具备deletesettlement权限。";
                     result.ErrorCode = ErrorCode.AccessDenied;
                     return result;
                 }
             }
             else
             {
-                strError = "޷ʶstrActionֵ '" + strAction + "'";
+                strError = "无法识别的strAction参数值 '" + strAction + "'";
                 goto ERROR1;
             }

@@ -16679,13 +16679,13 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "IDΪ '" + strIds + "' ΥԼ¼: " + strError;
+                strError = "检索ID为 '" + strIds + "' 的违约金记录出错: " + strError;
                 goto ERROR1;
             }

             if (lRet == 0)
             {
-                strError = "ûҵidΪ '" + strIds + "' ΥԼ¼";
+                strError = "没有找到id为 '" + strIds + "' 的违约金记录";
                 goto ERROR1;
             }

@@ -16695,7 +16695,7 @@
             long lPerCount = Math.Min(50, lHitCount);
             List<string> aPath = null;

-            // ý¼д
+            // 获得结果集，对逐个记录进行处理
             for (; ; )
             {
                 lRet = channel.DoGetSearchResult(
@@ -16711,21 +16711,21 @@

                 if (lRet == 0)
                 {
-                    strError = "δ";
+                    strError = "未命中";
                     break;  // ??
                 }

-                //
+                // 处理浏览结果
                 for (int i = 0; i < aPath.Count; i++)
                 {
                     string strPath = aPath[i];

                     string strCurrentError = "";

-                    // һѼ¼
+                    // 结算一个交费记录
                     nRet = SettlementOneRecord(
                         sessioninfo.LibraryCodeList,
-                        true,   // Ҫ־
+                        true,   // 要创建日志
                         channel,
                         strAction,
                         strPath,
@@ -16733,12 +16733,12 @@
                         strOperator,
                         sessioninfo.ClientAddress,
                         out strCurrentError);
-                    // һӦ
+                    // 遇到一般出错应当继续处理
                     if (nRet == -1)
                     {
-                        strError += strAction + "ΥԼ¼ '" +strPath+ "' ʱ: " + strCurrentError + "\r\n";
-                    }
-                    // ־ռĴͲܼ
+                        strError += strAction + "违约金记录 '" +strPath+ "' 时发生错误: " + strCurrentError + "\r\n";
+                    }
+                    // 但是遇到日志空间满这样的错误就不能继续处理了
                     if (nRet == -2)
                     {
                         strError = strCurrentError;
@@ -16764,16 +16764,16 @@

         }

-        // һѼ¼
+        // 结算一个交费记录
         // parameters:
-        //      strLibraryCodeList  ǰ߹Ͻͼݴ
-        //      bCreateOperLog  Ƿ񴴽־
-        //      strOperTime Ĳʱ
-        //      strOperator Ĳ
+        //      strLibraryCodeList  当前操作者管辖的图书馆代码
+        //      bCreateOperLog  是否创建日志
+        //      strOperTime 结算的操作时间
+        //      strOperator 结算的操作者
         // return:
-        //      -2  ټѭñ
-        //      -1  һԼѭñ
-        //      0
+        //      -2  致命出错，不宜再继续循环调用本函数
+        //      -1  一般出错，可以继续循环调用本函数
+        //      0   正常
         int SettlementOneRecord(
             string strLibraryCodeList,
             bool bCreateOperLog,
@@ -16792,7 +16792,7 @@
             string strOutputPath = "";
             string strAmercedXml = "";

-            // ׼־DOM
+            // 准备日志DOM
             XmlDocument domOperLog = null;

             if (bCreateOperLog == true)
@@ -16811,7 +16811,7 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "ȡΥԼ¼ '" + strAmercedRecPath + "' ʱ: " + strError;
+                strError = "获取违约金记录 '" + strAmercedRecPath + "' 时出错: " + strError;
                 return -1;
             }

@@ -16821,7 +16821,7 @@
                 out strError);
             if (nRet == -1)
             {
-                strError = "װΥԼ¼XML DOMʱ: " + strError;
+                strError = "装载违约金记录进入XML DOM时发生错误: " + strError;
                 return -1;
             }

@@ -16830,7 +16830,7 @@
             {
                 if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false)
                 {
-                    strError = "ǰûδܹϽΥԼ¼ '"+strAmercedRecPath+"' ڵĹݴ '"+strLibraryCode+"'";
+                    strError = "当前用户未能管辖违约金记录 '"+strAmercedRecPath+"' 所在的馆代码 '"+strLibraryCode+"'";
                     return -1;
                 }
             }
@@ -16841,7 +16841,7 @@
                 domOperLog.LoadXml("<root />");

                 // 2012/10/2
-                // ضڵĹݴ
+                // 相关读者所在的馆代码
                 DomUtil.SetElementText(domOperLog.DocumentElement,
                     "libraryCode", strLibraryCode);

@@ -16851,7 +16851,7 @@
                     strAction);

-                // ־м id
+                // 在日志中记忆 id
                 string strID = DomUtil.GetElementText(amerced_dom.DocumentElement,
                     "id");
                 DomUtil.SetElementText(domOperLog.DocumentElement,
@@ -16865,12 +16865,12 @@
             {
                 if (strOldState != "amerced")
                 {
-                    strError = "ǰ¼״̬Ϊamerced(Ϊ'" + strOldState + "')";
+                    strError = "结算操作前，记录状态必须为amerced。(但发现为'" + strOldState + "')";
                     return -1;
                 }
                 if (strOldState == "settlemented")
                 {
-                    strError = "ǰ¼״̬ѾΪsettlemented";
+                    strError = "结算操作前，记录状态已经为settlemented";
                     return -1;
                 }
             }
@@ -16878,12 +16878,12 @@
             {
                 if (strOldState != "settlemented")
                 {
-                    strError = "ǰ¼״̬Ϊsettlemented(Ϊ'" + strOldState + "')";
+                    strError = "撤销结算操作前，记录状态必须为settlemented。(但发现为'" + strOldState + "')";
                     return -1;
                 }
                 if (strOldState == "amerced")
                 {
-                    strError = "ǰ¼״̬ѾΪsettlemented";
+                    strError = "撤销结算操作前，记录状态已经为settlemented";
                     return -1;
                 }
             }
@@ -16891,13 +16891,13 @@
             {
                 if (strOldState != "settlemented")
                 {
-                    strError = "ɾǰ¼״̬Ϊsettlemented(Ϊ'" + strOldState + "')";
+                    strError = "删除结算操作前，记录状态必须为settlemented。(但发现为'" + strOldState + "')";
                     return -1;
                 }
             }
             else
             {
-                strError = "޷ʶstrActionֵ '" + strAction + "'";
+                strError = "无法识别的strAction参数值 '" + strAction + "'";
                 return -1;
             }

@@ -16913,7 +16913,7 @@

             if (strAction == "delete")
             {
-                // ɾѽΥԼ¼
+                // 删除已结算违约金记录
                 lRet = channel.DoDeleteRes(strAmercedRecPath,
                     amerced_timestamp,
                     out output_timestamp,
@@ -16927,22 +16927,22 @@
                         amerced_timestamp = output_timestamp;
                         goto REDO;
                     }
-                    strError = "ɾѽΥԼ¼ '" + strAmercedRecPath + "' ʧ: " + strError;
+                    strError = "删除已结算违约金记录 '" + strAmercedRecPath + "' 失败: " + strError;
                     this.WriteErrorLog(strError);
                     return -1;
                 }

-                goto END1;  // д־
-            }
-
-            // ޸״̬
+                goto END1;  // 写日志
+            }
+
+            // 修改状态
             if (strAction == "settlement")
             {
                 DomUtil.SetElementText(amerced_dom.DocumentElement,
                     "state", "settlemented");

-                // Ϣ
+                // 清除两个信息
                 DomUtil.DeleteElement(amerced_dom.DocumentElement,
                     "undoSettlementOperTime");
                 DomUtil.DeleteElement(amerced_dom.DocumentElement,
@@ -16962,7 +16962,7 @@
                     "state", "amerced");

-                // Ϣ
+                // 清除两个信息
                 DomUtil.SetElementText(amerced_dom.DocumentElement,
                     "settlementOperTime", "");
                 DomUtil.SetElementText(amerced_dom.DocumentElement,
@@ -16979,13 +16979,13 @@
             if (bCreateOperLog == true)
             {
                 DomUtil.SetElementText(domOperLog.DocumentElement, "operator",
-                    strOperator);   //
+                    strOperator);   // 操作者
                 DomUtil.SetElementText(domOperLog.DocumentElement, "operTime",
-                    strOperTime);   // ʱ
-            }
-
-
-            // ݿ
+                    strOperTime);   // 操作时间
+            }
+
+
+            // 保存回数据库
             lRet = channel.DoSaveTextRes(strAmercedRecPath,
                 amerced_dom.OuterXml,
                 false,
@@ -16996,7 +16996,7 @@
                 out strError);
             if (lRet == -1)
             {
-                strError = "дΥԼ¼ '" + strAmercedRecPath + "' ʱ: " + strError;
+                strError = "写回违约金记录 '" + strAmercedRecPath + "' 时出错: " + strError;
                 return -1;
             }

@@ -17017,15 +17017,15 @@
                     if (strAction == "settlement")
                         this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "ý", "¼", 1);
+                            "费用结算", "结算记录数", 1);
                     else if (strAction == "undosettlement")
                         this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "ý", "¼", 1);
+                            "费用结算", "撤销结算记录数", 1);
                     else if (strAction == "delete")
                         this.Statis.IncreaseEntryValue(
                             strLibraryCode,
-                            "ý", "ɾ¼", 1);
+                            "费用结算", "删除结算记录数", 1);
                 }

@@ -17034,7 +17034,7 @@
                     out strError);
                 if (nRet == -1)
                 {
-                    strError = "settlement() API д־ʱ: " + strError;
+                    strError = "settlement() API 写入日志时发生错误: " + strError;
                     return -2;
                 }
             }
@@ -17077,11 +17077,11 @@
             return result;
         }

-        // ضԴ
+        // 下载对象资源
         // return:
-        //      -1
-        //      0   304
-        //      1   200
+        //      -1  出错
+        //      0   304返回
+        //      1   200返回
         public int DownloadObject(System.Web.UI.Page Page,
             FlushOutput flushOutputMethod,
     RmsChannelCollection channels,
@@ -17103,19 +17103,19 @@

             // strPath = boards.GetCanonicalUri(strPath);

-            // Դдļİ汾رڻԴҲڻ¼塣
+            // 获得资源。写入文件的版本。特别适用于获得资源，也可用于获得主记录体。
             // parameters:
-            //		fileTarget	ļעڵúǰʵļָλáֻڵǰλÿʼддǰıļָ롣
-            //		strStyleParam	һΪ"content,data,metadata,timestamp,outputpath";
-            //		input_timestamp	!=null򱾺ѵһصtimestampͱݱȽϣȣ򱨴
+            //		fileTarget	文件。注意在调用函数前适当设置文件指针位置。函数只会在当前位置开始向后写，写入前不会主动改变文件指针。
+            //		strStyleParam	一般设置为"content,data,metadata,timestamp,outputpath";
+            //		input_timestamp	若!=null，则本函数会把第一个返回的timestamp和本参数内容比较，如果不相等，则报错
             // return:
-            //		-1	ԭthis.ErrorCodeСthis.ErrorInfoгϢ
-            //		0	ɹ
+            //		-1	出错。具体出错原因在this.ErrorCode中。this.ErrorInfo中有出错信息。
+            //		0	成功
             string strMetaData = "";
             string strOutputPath;
             byte[] baOutputTimeStamp = null;

-            // ý
+            // 获得媒体类型
             long lRet = channel.GetRes(
                 strPath,
                 null,	// Response.OutputStream,
@@ -17135,7 +17135,7 @@
             if (Page.Response.IsClientConnected == false)
                 return -1;

-            // ȡmetadataеmimeϢ
+            // 取metadata中的mime类型信息
             Hashtable values = ParseMedaDataXml(strMetaData,
                 out strError);

@@ -17157,11 +17157,11 @@

                     if (isModifiedSince != lastmodified)
                     {
-                        // ޸Ĺ
+                        // 修改过
                     }
                     else
                     {
-                        // û޸Ĺ
+                        // 没有修改过
                         Page.Response.StatusCode = 304;
                         Page.Response.SuppressContent = true;
                         return 0;
@@ -17181,8 +17181,8 @@
             if (strClientPath != "")
                 strClientPath = PathUtil.PureName(strClientPath);

-            // TODO: Ƿimage/????ͣҪcontent-disposition
-            // ǷΪԻ
+            // TODO: 如果是非image/????类型，都要加入content-disposition
+            // 是否出现另存为对话框
             if (bSaveAs == true)
             {
                 string strEncodedFileName = HttpUtility.UrlEncode(strClientPath, Encoding.UTF8);
@@ -17194,7 +17194,7 @@
             Page.Response.AddHeader("Last-Modified", "Wed, 21 Nov 2007 07:10:54 GMT");
              * */

-            //  text/plain IE XML google
+            // 用 text/plain IE XML 搜索google
             // http://support.microsoft.com/kb/329661
             // http://support.microsoft.com/kb/239750/EN-US/
             /*
@@ -17208,7 +17208,7 @@

             /*

-            Page.Response.CacheControl = "no-cache";    // ô˾䣬text/plainᱻxmlļ
+            Page.Response.CacheControl = "no-cache";    // 如果不用此句，text/plain会被当作xml文件打开
             Page.Response.AddHeader("Pragma", "no-cache");
             Page.Response.AddHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
 //            Page.Response.AddHeader("Cache-Control", "public");
@@ -17217,7 +17217,7 @@
              * */

-            // ý
+            // 设置媒体类型
             if (strMime == "text/plain")
                 strMime = "text";
             Page.Response.ContentType = strMime;
@@ -17232,7 +17232,7 @@
             if (Page.Response.IsClientConnected == false)
                 return -1;

-            //
+            // 传输数据

             lRet = channel.GetRes(
                 strPath,
@@ -17262,11 +17262,11 @@
     public class AmerceItem
     {
         [DataMember]
-        public string ID = "";  // ʶid
+        public string ID = "";  // 识别id
         [DataMember]
-        public string NewPrice = "";    // ļ۸
+        public string NewPrice = "";    // 变更的价格
         [DataMember]
-        public string NewComment = ""; // ע
+        public string NewComment = ""; // 注释
     }

     public class WebPageStop : Stop
@@ -17295,79 +17295,79 @@
     }

-    // ɹϢ
+    // 借书成功后的信息
     [DataContract(Namespace = "http://dp2003.com/dp2library/")]
     public class BorrowInfo
     {
-        // Ӧ/ʱ
+        // 应还日期/时间
         [DataMember]
-        public string LatestReturnTime = "";    // RFC1123ʽGMTʱ
-
-        // ޡ硰20day
+        public string LatestReturnTime = "";    // RFC1123格式，GMT时间
+
+        // 借书期限。例如“20day”
         [DataMember]
         public string Period = "";

-        // ǰΪĵڼΣ0ʾν
+        // 当前为续借的第几次？0表示初次借阅
         [DataMember]
         public long BorrowCount = 0;

-        //
+        // 借书操作者
         [DataMember]
         public string BorrowOperator = "";

         /*
         // 2008/5/9 new add
-        // Ĳͼ
+        // 所借的册的图书类型
         public string BookType = "";

         // 2008/5/9 new add
-        // ĲĹݲصص
+        // 所借的册的馆藏地点
         public string Location = "";
          * */
     }

-    // ɹϢ
+    // 还书成功后的信息
     [DataContract(Namespace = "http://dp2003.com/dp2library/")]
     public class ReturnInfo
     {
-        // /ʱ
+        // 借阅日期/时间
         [DataMember]
-        public string BorrowTime = "";    // RFC1123ʽGMTʱ
-
-        // Ӧ/ʱ
+        public string BorrowTime = "";    // RFC1123格式，GMT时间
+
+        // 应还日期/时间
         [DataMember]
-        public string LatestReturnTime = "";    // RFC1123ʽGMTʱ
-
-        // ԭޡ硰20day
+        public string LatestReturnTime = "";    // RFC1123格式，GMT时间
+
+        // 原借书期限。例如“20day”
         [DataMember]
         public string Period = "";

-        // ǰΪĵڼΣ0ʾν
+        // 当前为续借的第几次？0表示初次借阅
         [DataMember]
         public long BorrowCount = 0;

-        // ΥԼַXMLʽ
+        // 违约金描述字符串。XML格式
         [DataMember]
         public string OverdueString = "";

-        //
+        // 借书操作者
         [DataMember]
         public string BorrowOperator = "";

-        //
+        // 还书操作者
         [DataMember]
         public string ReturnOperator = "";

         // 2008/5/9 new add
         ///
-        /// Ĳͼ
+        /// 所还的册的图书类型
         ///
         [DataMember]
         public string BookType = "";

         // 2008/5/9 new add
         ///
-        /// ĲĹݲصص
+        /// 所还的册的馆藏地点
         ///
         [DataMember]
         public string Location = "";