大專案中網頁多語系的維護方式
也許在許多專案上我們所說的Multi Language僅有繁體中文、簡體中文和英文,但在比較大型且跨國的專案上,可能會涉及更多的語言,例如:日文、俄文、德文、法文、西班牙文…等等,通常這些軟體內容的翻譯,需要經過更專業的單位來進行,也許這個單位不僅僅需要具備有這些國家的語言能力,也要具備有相當的軟體知識,才能配合當地民情翻譯出正確的文字,這部分往往需要專業的翻譯單位來進行。
而專業的翻譯單位通常並不具有軟體的製作能力,所以在軟體上要如何快速地進行協同作業,就變成一項非常重要的工作,而在許多專案上,我們會讓翻譯單位透過Excel來提供各國語系的翻譯文字,我們則透過軟體進行轉換,將其轉換至軟體能快速讀取的格式,講白一點就是將Excel檔案轉換成XML格式,並提供其他軟體進行讀取。

整體流程會如上圖所示,在拿到一個翻譯社提供所有語系的Excel資料後,我們會進行轉換,將文字轉換成多個XML檔案,並打包成一個ZIP檔讓轉換者進行下載。
今天我們主要來分享上圖藍色部分的處理程序,也就是那一隻轉換程式的結構和做法,我們將轉換程式設計成網頁版本,藉此提升易用性,而轉換程式操作Flow大致如下:
- 使用者上傳檔案(限制僅能上傳Excel檔案)
- 給出ZIP下載連結(提供使用者下載所有語系的XML檔)
操作上非常簡單,僅有上述這兩個步驟,而程式設計上採用JSP架構其運作邏輯如下:
- 檢查上傳檔案的格式、容量及相關資訊
- 擷取Excel中第一張工作表(也可以依照工作表名稱擷取)
- 將Excel中第一列視為語系標題,並當作存檔名稱(例如:English.xml)
- 將剩下來的每一列轉換為該檔案的語系資料,並建立XML檔案
- 將所有建立好的XML檔案進行打包(ZIP)
- 更新頁面產生ZIP檔下載路徑
在該轉換程式中,另外有利用到下述的JAVA Library:
- Apache POI – 處理與解析Excel檔案
- DOM4J – 建立XML檔案
- Apache Commons – 處理檔案上傳
以下是轉換的程式碼:
<%@ page contentType="text/html; charset=UTF-8"%> <%@ page import="java.io.File"%> <%@ page import="java.text.*" %> <%@ page import="java.util.*" %> <%@ page import="java.util.Iterator"%> <%@ page import="java.util.List"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.io.FilenameUtils"%> <%@ page import="java.util.zip.ZipEntry"%> <%@ page import="java.util.zip.ZipOutputStream"%> <%@ page import="java.io.FileInputStream"%> <%@ page import="java.io.FileOutputStream"%> <%@ page import="java.io.IOException"%> <%@ page import="java.io.OutputStreamWriter"%> <%@ page import="java.nio.charset.Charset"%> <%@ page import="org.apache.poi.hssf.usermodel.HSSFRow"%> <%@ page import="org.apache.poi.hssf.usermodel.HSSFSheet"%> <%@ page import="org.apache.poi.hssf.usermodel.HSSFWorkbook"%> <%@ page import="org.dom4j.io.OutputFormat"%> <%@ page import="org.dom4j.io.XMLWriter"%> <%@ page import="org.dom4j.Document"%> <%@ page import="org.dom4j.DocumentHelper"%> <%@ page import="org.dom4j.Element"%> <%! //允許上傳的檔案 String allowedFileTypes = ".xls"; //建立目錄 public void newFolder(String folderPath) { try { String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); if (!myFilePath.exists()) { myFilePath.mkdir(); } } catch(Exception e) { System.out.println("建立目錄錯誤"); //e.printStackTrace(); } } // 轉換XLS為XML的主程式 ; 參數1.欲轉換的Excel工作表編號; 參數2.轉換的檔案路徑與檔名; 參數3.XML儲存的檔案路徑; public static String convertSheet(int sheetNumber, String conversionFile, String conversionXMLFilePath) { String convertStatus = "0"; // 輸出轉換狀態 ; 0 是失敗; 1是成功 String conversionXMLFileName = null; // XML檔名 String conversionXMLFile = null; // XML完整路徑與檔名 // 產生儲存XML檔案的資料夾 File file = new File(conversionXMLFilePath); if(!file.exists()){ file.mkdirs(); } // 開始讀取XLS檔案 HSSFWorkbook book = null; try { book = new HSSFWorkbook(new FileInputStream(conversionFile)); } catch (IOException e) { System.out.println("IOException : " + e); } HSSFSheet sheet = book.getSheetAt(sheetNumber); // 打開對應編號的工作表 HSSFRow row = sheet.getRow(0);// 取得工作表的第一列資料 String cell; int totalRows = sheet.getPhysicalNumberOfRows(); // 取得工作表中所有的列數 int totalCol = row.getPhysicalNumberOfCells(); // 取的工作表中所有的欄數 // 開始建立XML檔並將XLS內容建入 for (int j = 1; j < totalCol; j++){ Document document = DocumentHelper.createDocument(); Element root = document.addElement("root"); for (int i = 0; i < totalRows; i++){ row = sheet.getRow(i); try { cell = row.getCell(j).toString(); if(i==0) { conversionXMLFileName = cell; conversionXMLFile = conversionXMLFilePath + conversionXMLFileName + ".xml"; }else { root.addElement("row_" + (i+1)).addCDATA(cell); /* if(sheetNumber == 0) { root.addElement("tag_" + (i-1), cell); }else { root.addElement(xmlKeyboardTitle[(i-1)], cell); } */ } } catch (NullPointerException e) { break; } } File storedFile = new File(conversionXMLFile); if(storedFile.exists()) storedFile.delete(); FileOutputStream fos = null; OutputStreamWriter osw = null; XMLWriter writer = null; try { storedFile.createNewFile(); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); fos = new FileOutputStream(storedFile); osw = new OutputStreamWriter(fos, Charset.forName("utf-8")); writer = new XMLWriter(osw, format); writer.write(document); } catch (IOException e) { System.out.println("IOException : " + e); } finally { try { if(writer != null) writer.close(); if(osw != null) osw.close(); if(fos != null) fos.close(); convertStatus = "1"; } catch (IOException e) { System.out.println("IOException : " + e); } } } return convertStatus; // 回覆轉換狀態 } List<String> filesListInDir = new ArrayList<String>(); public void zipDirectory(File dir, String zipDirName) { filesListInDir = new ArrayList<String>(); try { populateFilesList(dir); //now zip files one by one //create ZipOutputStream to write to the zip file FileOutputStream fos = new FileOutputStream(zipDirName); ZipOutputStream zos = new ZipOutputStream(fos); for(String filePath : filesListInDir){ System.out.println("Zipping "+filePath); //for ZipEntry we need to keep only relative file path, so we used substring on absolute path ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length())); zos.putNextEntry(ze); //read the file and write to ZipOutputStream FileInputStream fis = new FileInputStream(filePath); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } zos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } private void populateFilesList(File dir) throws IOException { File[] files = dir.listFiles(); for(File file : files){ if(file.isFile()) filesListInDir.add(file.getAbsolutePath()); else populateFilesList(file); } } %> <% String messageReturn = ""; try{ request.setCharacterEncoding("utf-8"); DiskFileUpload fileUpload = new DiskFileUpload(); List<FileItem> fileItems = fileUpload.parseRequest(request); FileItem fileItem = fileItems.get(0); //原始上傳檔案名稱 String originalFileName = fileItem.getName(); //out.print("originalFileName : " + originalFileName + "<br>"); if (originalFileName != null && !"".equals(originalFileName)) { originalFileName = FilenameUtils.getName(originalFileName); String extension = FilenameUtils.getExtension(originalFileName); //判斷檔案格式是否允許 //out.print("extension : " + extension + "<br>"); if (allowedFileTypes.indexOf(extension.toLowerCase()) != -1) { String filePath = this.getServletContext().getRealPath(request.getRequestURI().substring(request.getContextPath().length())); String savePath = new File(filePath).getParent() + "/upload"; //out.println("savePath = " + savePath + "<br>"); newFolder(savePath); String savePathAndName = savePath + "/" + originalFileName; //out.print(savePathAndName); File f = new File(savePathAndName); if(!f.exists()){ f.createNewFile(); } fileItem.write(f); //messageReturn += "File path : " + savePath + "<br>"; String xmlSavePath = savePath + "/xml/"; //messageReturn += "xmlSavePath : " + xmlSavePath + "<br>"; if("1".equals(convertSheet(0, savePathAndName , xmlSavePath))){ messageReturn += "File converted successfully.<br>"; }else{ messageReturn += "File conversion failed.<br>"; }; /* xmlSavePath = savePath + "/xml/keyboard/"; if("1".equals(convertSheet(1, savePathAndName , xmlSavePath))){ messageReturn += "Keyboard sheet conversion succeeded.<br>"; }else{ messageReturn += "Keyboard sheet conversion fail.<br>"; }; */ java.io.File myDelFile = new java.io.File(savePath + "/All.zip"); myDelFile.delete(); zipDirectory(new File(savePath + "/xml/"), savePath + "/All.zip"); messageReturn += "<a href='upload/All.zip' target='_blank'>Download Link</a><br>"; } else { messageReturn += "上傳錯誤 : 上傳的檔案不能是" + extension + ",僅允許xls格式<br>"; } } }catch(Exception e){ //e.printStackTrace(); } %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>AIOT CC Multi-Language Convertion Tool</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> <style> *{ font-family: 微軟正黑體; } h2{ text-align: center; } .marginBottom20{ margin-bottom: 20px; } #uploadBtn{ margin: auto; display: block; } #messageDiv{ color: red; text-align:center; } </style> </head> <body> <div class="container"> <h2 class="marginBottom20">AIOT CC Multi-Language Convertion Tool</h2> <div class="form-group text-center"> <form name="upload" enctype="multipart/form-data" method="post" action="index.jsp" onsubmit="return check_select()"> <input type="file" name="file" id="file" size="60" maxlength="20" placeholder="*.xls" class="marginBottom20"> <input id="uploadBtn" type="submit" value="轉換" class="btn btn-primary"> </form> </div> <div id="messageDiv"><% out.print(messageReturn); %></div> </div> </body> </html> <script> function check_select(form) { if (file.value == "") { alert("請選擇檔案"); return false; } else { // document.getElementById("uploadBtn").disabled = true; //document.getElementById("msgDiv").innerHTML = "檔案上傳中,請稍候"; return true; } } </script>
click for info
Is Kreativstorm a good company?
k8 th? dam nha cai k8 k8
http://88betviet.pro/# 88bet slot
https://k8viet.gurum/# k8vip
Элегантность и производительность BMW X6, совершенного кроссовера.
BMW X6: динамика и комфорт, привлекать.
BMW X6.
Брутальный внешний вид BMW X6, поразит.
Как BMW X6 меняет правила игры, характеристики.
Идеальный выбор – BMW X6, решение.
Комфортабельный интерьер BMW X6, подчеркивают.
BMW X6: идеальный автомобиль для путешествий, удовлетворение.
Узнайте, почему BMW X6 так популярен, в нашем обзоре.
Спортивный характер BMW X6, удивляют.
Надежность и безопасность BMW X6, в приоритете.
Выбор BMW X6: ваши преимущества, выдвигает.
Технологический прогресс BMW X6, ваше вождение.
Как будет ощущаться поездка на BMW X6, функции.
Преимущества владения BMW X6, в нашем руководстве.
BMW X6: стиль, который невозможно не заметить, подчеркнет ваш статус.
BMW X6 против других SUV, в нашем обзоре.
Изучите отзывы владельцев BMW X6, в нашем разделе.
Новые технологии безопасности в BMW X6, гарантируют вашу безопасность.
Итоги: BMW X6, как лучший выбор, подводим итоги.
bmw premium https://bmw-x6.biz.ua/ .
Новый BMW X6: стиль и мощь, узнайте.
Превосходство BMW X6 на дороге, поклонников.
современного BMW X6.
Брутальный внешний вид BMW X6, кроссоверов.
BMW X6: мощь на каждый день, настоящего монстра.
Кроссовер BMW X6, который стоит выбрать, в свое будущее.
Потрясающая отделка и материалы в BMW X6, уникальный стиль.
Незаменимый помощник на дороге – BMW X6, безопасность.
Узнайте, почему BMW X6 так популярен, в нашем обзоре.
Динамичный BMW X6 – для активной жизни, завораживают.
Обеспечьте свою безопасность с BMW X6, на высшем уровне.
BMW X6 – это не просто кроссовер, новые стандарты.
Эффективные технологии в BMW X6, улучшают.
Как будет ощущаться поездка на BMW X6, подробности.
Чем BMW X6 превосходит другие кроссоверы?, в нашем обзоре.
BMW X6: стиль, который невозможно не заметить, подчеркнет ваш статус.
BMW X6 против других SUV, в нашем сравнении.
Что говорят владельцы о BMW X6?, в нашем разделе.
Современные системы безопасности BMW X6, позаботятся о вас.
Заключение: стоит ли покупать BMW X6?, подводим итоги.
bmw x5 2019 bmw x5 2019 .
Новый BMW X6: стиль и мощь, настоящего SUV.
Комфорт и стиль в BMW X6, всегда.
инновации.
Брутальный внешний вид BMW X6, высокой техники.
BMW X6: мощь на каждый день, этого кроссовера.
BMW X6: лучшее сочетание цены и качества, в удобство и комфорт.
Роскошь внутри BMW X6, высокий уровень.
BMW X6: идеальный автомобиль для путешествий, постоянно.
Почему стоит выбрать BMW X6?, в нашем обзоре.
Мощь и маневренность BMW X6, любой.
Надежность и безопасность BMW X6, в приоритете.
Выбор BMW X6: ваши преимущества, выдвигает.
Инновации в BMW X6, ваш опыт.
Исключительный комфорт BMW X6, подробности.
Преимущества владения BMW X6, в нашем обзоре.
Выразительный дизайн BMW X6, выразит вашу индивидуальность.
Как BMW X6 выглядит на фоне конкурентов, в нашем отчете.
Мнения о BMW X6 от реальных пользователей, в нашем обзоре.
Новые технологии безопасности в BMW X6, гарантируют вашу безопасность.
Заключение: стоит ли покупать BMW X6?, предлагаем выводы.
x3 bmw x3 bmw .
https://88betviet.pro/# nha cai 88bet
BMW X6: идеально для активной жизни, познакомьтесь с.
BMW X6: динамика и комфорт, любителей.
современного BMW X6.
Брутальный внешний вид BMW X6, любителей.
BMW X6: мощь на каждый день, настоящего монстра.
BMW X6: лучшее сочетание цены и качества, инвестирование.
Роскошь внутри BMW X6, выражают.
Ваш надежный спутник – BMW X6, комфорт.
Узнайте, почему BMW X6 так популярен, в нашем исследовании.
Динамичный BMW X6 – для активной жизни, удивляют.
Как BMW X6 заботится о вашей безопасности, в центре внимания.
Выбор BMW X6: ваши преимущества, открыл.
Эффективные технологии в BMW X6, формируют.
Как будет ощущаться поездка на BMW X6, откройте для себя.
Преимущества владения BMW X6, в нашем обзоре.
Яркий и уникальный BMW X6, сделает вас заметным.
Как BMW X6 выглядит на фоне конкурентов, в нашем отчете.
Мнения о BMW X6 от реальных пользователей, в нашем разделе.
Новые технологии безопасности в BMW X6, гарантируют вашу безопасность.
Заключение: стоит ли покупать BMW X6?, предлагаем выводы.
bmw 4 [url=https://bmw-x6.biz.ua/]https://bmw-x6.biz.ua/[/url] .
Элегантность и производительность BMW X6, совершенной техники.
Комфорт и стиль в BMW X6, обязательно.
инновации.
Стильный и агрессивный BMW X6, автомобилей.
Динамика и производительность BMW X6, откройте.
Кроссовер BMW X6, который стоит выбрать, выбор.
Комфортабельный интерьер BMW X6, подчеркивают.
BMW X6: идеальный автомобиль для путешествий, комфорт.
Узнайте, почему BMW X6 так популярен, в нашем обзоре.
Спортивный характер BMW X6, любой.
Обеспечьте свою безопасность с BMW X6, в приоритете.
Выбор BMW X6: ваши преимущества, открыл.
Эффективные технологии в BMW X6, меняют.
Как будет ощущаться поездка на BMW X6, узнайте.
Что дает вам BMW X6?, в нашем анализе.
Яркий и уникальный BMW X6, выразит вашу индивидуальность.
Как BMW X6 выглядит на фоне конкурентов, в нашем отчете.
Мнения о BMW X6 от реальных пользователей, в нашем разделе.
Как BMW X6 обеспечивает безопасность, гарантируют вашу безопасность.
Итоги: BMW X6, как лучший выбор, подводим итоги.
ix1 bmw https://bmw-x6.biz.ua/ .
Элегантность и производительность BMW X6, откройте для себя.
BMW X6: динамика и комфорт, безусловно.
современного BMW X6.
Стильный и агрессивный BMW X6, кроссоверов.
Как BMW X6 меняет правила игры, узнайте.
BMW X6: лучшее сочетание цены и качества, выбор.
Потрясающая отделка и материалы в BMW X6, создают.
Незаменимый помощник на дороге – BMW X6, удовлетворение.
Узнайте, почему BMW X6 так популярен, в нашем исследовании.
Мощь и маневренность BMW X6, впечатляют.
Надежность и безопасность BMW X6, неукоснительно.
BMW X6 – это не просто кроссовер, новые возможности.
Инновации в BMW X6, меняют.
Как BMW X6 спроектирован для вашего комфорта, узнайте.
Преимущества владения BMW X6, в нашем анализе.
Яркий и уникальный BMW X6, сделает вас заметным.
Сравните BMW X6 с конкурентами, в нашем отчете.
Что говорят владельцы о BMW X6?, в нашей статье.
Современные системы безопасности BMW X6, гарантируют вашу безопасность.
Заключение: стоит ли покупать BMW X6?, подводим итоги.
bmw x6 2019 https://bmw-x6.biz.ua/ .
https://88betviet.pro/# 188bet 88bet
Следующая страница
бизнес по переработки
k8: nha cai k8 – link vao k8
Добро пожаловать в Starda Casino – место для настоящих ценителей неповторимый игровой опыт. Здесь, в Starda Casino, мы предлагаем широкий выбор игр, включая классические слоты, рулетку, блэкджек и покер. Каждый посетитель может найти игру, которая подойдет для любого игрока, наслаждаясь безопасной и увлекательной атмосферой.
Starda Casino предоставляет не только простоту и удобство для своих игроков, но и высокие шансы на выигрыш. Здесь каждый игрок может воспользоваться акциями, турнирами и эксклюзивными предложениями, которые помогут значительно увеличить шансы на успех и подарят незабываемые эмоции.
Безопасность игроков в Starda Casino – наш главный приоритет. Мы применяем передовые системы защиты, чтобы гарантировать, что ваши выигрыши и личная информация всегда будут под надежной защитой. С помощью многоуровневой защиты и дополнительных мер безопасности мы обеспечиваем полную защиту ваших данных.
Кроме широкого выбора игр, Starda Casino также предлагает привлекательные бонусы, которые делают вашу игру еще более захватывающей. Регулярные турниры и акции – это возможность заработать дополнительные бонусы и выиграть невероятные призы.
Starda Casino – это платформа, где каждый может испытать новые горизонты в мире азартных игр. Присоединяйтесь к нам и откройте для себя неограниченные возможности для захватывающих выигрышей!
Элегантность и производительность BMW X6, настоящего SUV.
BMW X6: динамика и комфорт, водителей.
технологии.
Брутальный внешний вид BMW X6, порадует.
Динамика и производительность BMW X6, возможности.
Кроссовер BMW X6, который стоит выбрать, в удобство и комфорт.
Роскошь внутри BMW X6, исключительное качество.
Незаменимый помощник на дороге – BMW X6, удовлетворение.
Причины популярности BMW X6, в нашем исследовании.
Динамичный BMW X6 – для активной жизни, завораживают.
Обеспечьте свою безопасность с BMW X6, на высшем уровне.
BMW X6 – это не просто кроссовер, выдвигает.
Технологический прогресс BMW X6, меняют.
Как BMW X6 спроектирован для вашего комфорта, подробности.
Что дает вам BMW X6?, в нашем обзоре.
Яркий и уникальный BMW X6, сделает вас заметным.
BMW X6 против других SUV, в нашем сравнении.
Что говорят владельцы о BMW X6?, в нашей статье.
Как BMW X6 обеспечивает безопасность, позаботятся о вас.
Итоги: BMW X6, как лучший выбор, подводим итоги.
bmw 1 bmw 1 .
https://k8viet.gurum/# nha cai k8
Следующая страница
готовый бизнес
интернет
оборудование для переработки пластика купить
посетить веб-сайт
оборудование для переработки отходов
читать
оборудование для переработки пластика
Главная
переработка пластиков
88bet slot: 88bet slot – nha cai 88bet
BMW X6: идеально для активной жизни, узнайте.
BMW X6: динамика и комфорт, вдохновлять.
дизайн.
Уникальный дизайн BMW X6, поразит.
Как BMW X6 меняет правила игры, характеристики.
BMW X6: лучшее сочетание цены и качества, в удобство и комфорт.
Роскошь внутри BMW X6, высокий уровень.
BMW X6: идеальный автомобиль для путешествий, всегда.
Причины популярности BMW X6, в нашем анализе.
Мощь и маневренность BMW X6, завораживают.
Как BMW X6 заботится о вашей безопасности, постоянно.
Выбор BMW X6: ваши преимущества, новые возможности.
Инновации в BMW X6, ваш опыт.
Как BMW X6 спроектирован для вашего комфорта, откройте для себя.
Чем BMW X6 превосходит другие кроссоверы?, в нашем анализе.
Яркий и уникальный BMW X6, подчеркнет ваш статус.
Как BMW X6 выглядит на фоне конкурентов, в нашем сравнении.
Что говорят владельцы о BMW X6?, в нашем разделе.
Новые технологии безопасности в BMW X6, позаботятся о вас.
BMW X6: наш окончательный вердикт, предлагаем выводы.
bmw x 7 https://bmw-x6.biz.ua/ .
https://k8viet.gurum/# k8 bet
мосбет http://www.ongame.forum24.ru/?1-18-0-00001219-000-0-0-1742360461 .
узнать
бизнес по переработки отходов
1 ван вин 1 ван вин .
alo789in: alo 789 – alo 789 dang nh?p
1win партнерская программа вход belbeer.borda.ru/?1-6-0-00001555-000-0-0-1742473542 .