فهرست منبع

Added more localization

Toby Chui 2 سال پیش
والد
کامیت
8e64985771

+ 159 - 150
web/SystemAO/boot/poweroff.html

@@ -1,151 +1,160 @@
-<html>
-    <head>
-        <title>Host Power Options</title>
-        <style>
-
-        </style>
-    </head>
-    <body>
-        <div class="ui container">
-            <div class="ui basic segment">
-                <h3 class="ui header">
-                    <i class="power icon"></i>
-                    <div class="content">
-                        Host Power
-                        <div class="sub header">Change power state of your device</div>
-                    </div>
-                </h3>
-            </div>
-            <div class="ui divider"></div>
-            <div class="ui segment">
-                <h3 class="ui header">
-                    <i id="sysConnStateIcon" class="green check circle icon"></i>
-                    <div class="content">
-                        <span id="sysConnState">System Online</span>
-                        <div class="sub header">Last update: <span id="lastupdateTime"></span></div>
-                    </div>
-                </h3>
-            </div>
-           
-            <div class="ui divider"></div>
-            <p>Power Options</p>
-            <button class="ui red button" onclick="shutdown();"><i class="power off icon"></i> Power Off</button>
-            <button class="ui yellow button" onclick="restart();"><i class="refresh icon"></i> Restart</button>
-            <div id="msgbox" class="ui green message" style="display:none;">
-                <p><i class="checkmark icon"></i> <span id="succmsg"></span></p>
-            </div>
-            <div class="ui divider"></div>
-            <div class="ui icon message">
-                <i class="yellow exclamation circle icon"></i>
-                <div class="content">
-                    <div class="header">
-                        Restart / Shutdown is risky
-                    </div>
-                    <p>If you decided to shutdown your host server, ArozOS will pass the shutdown sequence to the host operating system and there is no way to know from the web interface if the shutdown / restart process has completed. <br>
-                        <b>Please make sure you are shutting it down in a location where you can physcically power on the host again.</b></p>
-                </div>
-            </div>
-            
-        </div>
-        <script>
-            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
-
-            function shutdown(){
-                var apiObject = {
-                    api: "system/power/shutdown",
-                    data: {},
-                    title: "<i class='red exclamation triangle icon'></i> Shutdown Host <i class='red exclamation triangle icon'></i>",
-                    desc: "Please enter your password to confirm operation.",
-                    thisuser: true, //This username as default, set to false for entering other user
-                    method: "GET",
-                    success: "SystemAO/boot/shutdown.html"
-                }
-
-                apiObject = encodeURIComponent(JSON.stringify(apiObject));
-
-                ao_module_newfw({
-                    url: "SystemAO/security/authreq.html#" + apiObject,
-                    width: 480,
-                    height: 300,
-                    appicon: "SystemAO/security/img/lock.svg",
-                    title: "Shutdown - Authentication Required",
-                    parent: ao_module_windowID,
-                    callback: "handleShutdownCallback"
-                });
-            }
-
-            function restart(){
-                var apiObject = {
-                    api: "system/power/restart",
-                    data: {},
-                    title: "Password Required",
-                    desc: "for restarting the ArozOS Host",
-                    thisuser: true, //This username as default, set to false for entering other user
-                    method: "GET"
-                }
-
-                apiObject = encodeURIComponent(JSON.stringify(apiObject));
-
-                ao_module_newfw({
-                    url: "SystemAO/security/authreq.html#" + apiObject,
-                    width: 480,
-                    height: 300,
-                    appicon: "SystemAO/security/img/lock.svg",
-                    title: "Restart - Authentication Required",
-                    parent: ao_module_windowID,
-                    callback: "handleRestartCallback"
-                });
-            }
-
-            function handleRestartCallback(data){
-                if (data != false){
-                    //Not cancelled. Continue
-                    $("#msgbox").slideDown("fast").delay(5000).slideUp("fast");
-                    $("#succmsg").text("Host restarting...");
-                }
-            }
-
-            function handleShutdownCallback(data){
-                if (data != false){
-                    //Not cancelled. Continue
-                    $("#msgbox").slideDown("fast").delay(5000).slideUp("fast");
-                    $("#succmsg").text("Host will start shutdown sequence in 60 seconds");
-                }
-            }
-
-            handleConnectionStateCheck();
-            setTimeout(function(){
-                handleConnectionStateCheck();
-            }, 3000)
-
-            function handleConnectionStateCheck(){
-                if ($("#sysConnState").length > 0){
-                    $.ajax({
-                        url: "../../system/auth/checkLogin",
-                        data: {},
-                        success: function(){
-                            //Online
-                            $("#sysConnState").text("System Online");
-                            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
-                            $("#sysConnStateIcon").attr("class","green check circle icon");
-
-                            setTimeout(function(){
-                                handleConnectionStateCheck();
-                            }, 3000)
-                        },
-                        error: function(){
-                            //Timeout
-                            $("#sysConnState").text("Disconnected");
-                            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
-                            $("#sysConnStateIcon").attr("class","yellow exclamation circle icon");
-                            setTimeout(function(){
-                                handleConnectionStateCheck();
-                            }, 3000)
-                        },
-                        timeout: 1000
-                    });
-                }   
-            }
-        </script>
-    </body>
+<html>
+    <head>
+        <title>Host Power Options</title>
+        <style>
+            .warningStripe {
+                background: repeating-linear-gradient(
+                45deg,
+                #f1e869,
+                #dddb67 10px,
+                #979846 10px,
+                #979846 20px
+                );
+            }
+        </style>
+    </head>
+    <body>
+        <div class="ui container">
+            
+            <div class="ui basic segment">
+                <h3 class="ui header">
+                    <i class="power icon"></i>
+                    <div class="content">
+                        Host Power
+                        <div class="sub header">Change power state of your device</div>
+                    </div>
+                </h3>
+            </div>
+            <div class="ui divider"></div>
+            <div class="ui segment">
+                <h3 class="ui header">
+                    <i id="sysConnStateIcon" class="green check circle icon"></i>
+                    <div class="content">
+                        <span id="sysConnState">System Online</span>
+                        <div class="sub header">Last update: <span id="lastupdateTime"></span></div>
+                    </div>
+                </h3>
+            </div>
+           
+            <div class="ui divider"></div>
+            <p>Power Options</p>
+            <button class="ui red button" onclick="shutdown();"><i class="power off icon"></i> Power Off</button>
+            <button class="ui yellow button" onclick="restart();"><i class="refresh icon"></i> Restart</button>
+            <div id="msgbox" class="ui green message" style="display:none;">
+                <p><i class="checkmark icon"></i> <span id="succmsg"></span></p>
+            </div>
+            <div class="ui divider"></div>
+            <div class="ui icon message">
+                <i class="yellow exclamation circle icon"></i>
+                <div class="content">
+                    <div class="header">
+                        Restart / Shutdown is risky
+                    </div>
+                    <p>If you decided to shutdown your host server, ArozOS will pass the shutdown sequence to the host operating system and there is no way to know from the web interface if the shutdown / restart process has completed. <br>
+                        <b>Please make sure you are shutting it down in a location where you can physcically power on the host again.</b></p>
+                </div>
+            </div>
+            
+        </div>
+        <script>
+            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
+
+            function shutdown(){
+                var apiObject = {
+                    api: "system/power/shutdown",
+                    data: {},
+                    title: "<i class='red exclamation triangle icon'></i> Shutdown Host <i class='red exclamation triangle icon'></i>",
+                    desc: "Please enter your password to confirm operation.",
+                    thisuser: true, //This username as default, set to false for entering other user
+                    method: "GET",
+                    success: "SystemAO/boot/shutdown.html"
+                }
+
+                apiObject = encodeURIComponent(JSON.stringify(apiObject));
+
+                ao_module_newfw({
+                    url: "SystemAO/security/authreq.html#" + apiObject,
+                    width: 480,
+                    height: 300,
+                    appicon: "SystemAO/security/img/lock.svg",
+                    title: "Shutdown - Authentication Required",
+                    parent: ao_module_windowID,
+                    callback: "handleShutdownCallback"
+                });
+            }
+
+            function restart(){
+                var apiObject = {
+                    api: "system/power/restart",
+                    data: {},
+                    title: "Password Required",
+                    desc: "for restarting the ArozOS Host",
+                    thisuser: true, //This username as default, set to false for entering other user
+                    method: "GET"
+                }
+
+                apiObject = encodeURIComponent(JSON.stringify(apiObject));
+
+                ao_module_newfw({
+                    url: "SystemAO/security/authreq.html#" + apiObject,
+                    width: 480,
+                    height: 300,
+                    appicon: "SystemAO/security/img/lock.svg",
+                    title: "Restart - Authentication Required",
+                    parent: ao_module_windowID,
+                    callback: "handleRestartCallback"
+                });
+            }
+
+            function handleRestartCallback(data){
+                if (data != false){
+                    //Not cancelled. Continue
+                    $("#msgbox").slideDown("fast").delay(5000).slideUp("fast");
+                    $("#succmsg").text("Host restarting...");
+                }
+            }
+
+            function handleShutdownCallback(data){
+                if (data != false){
+                    //Not cancelled. Continue
+                    $("#msgbox").slideDown("fast").delay(5000).slideUp("fast");
+                    $("#succmsg").text("Host will start shutdown sequence in 60 seconds");
+                }
+            }
+
+            handleConnectionStateCheck();
+            setTimeout(function(){
+                handleConnectionStateCheck();
+            }, 3000)
+
+            function handleConnectionStateCheck(){
+                if ($("#sysConnState").length > 0){
+                    $.ajax({
+                        url: "../../system/auth/checkLogin",
+                        data: {},
+                        success: function(){
+                            //Online
+                            $("#sysConnState").text("System Online");
+                            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
+                            $("#sysConnStateIcon").attr("class","green check circle icon");
+
+                            setTimeout(function(){
+                                handleConnectionStateCheck();
+                            }, 3000)
+                        },
+                        error: function(){
+                            //Timeout
+                            $("#sysConnState").text("Disconnected");
+                            $("#lastupdateTime").text(ao_module_utils.timeConverter(Date.now()/1000));
+                            $("#sysConnStateIcon").attr("class","yellow exclamation circle icon");
+                            setTimeout(function(){
+                                handleConnectionStateCheck();
+                            }, 3000)
+                        },
+                        timeout: 1000
+                    });
+                }   
+            }
+        </script>
+    </body>
 </html>

+ 31 - 69
web/SystemAO/info/index.html

@@ -24,87 +24,49 @@
     </div>
     <div class="ui container">
         <br>
-        <h3 class="ui header">Specifications</h3>
+        <h3 class="ui header" locale="hwinfo/specifications">Specifications</h3>
         <div class="ui grid">
-            <div class="six wide column">
-                Model :
-            </div>
-            <div class="ten wide column" id="model">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Frequency :
-            </div>
-            <div class="ten wide column" id="freq">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Instruction :
-            </div>
-            <div class="ten wide column" id="instruction">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Hardware :
-            </div>
-            <div class="ten wide column" id="hardware">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Revision :
-            </div>
-            <div class="ten wide column" id="revision">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Memory :
-            </div>
-            <div class="ten wide column" id="ram">
-                Loading...
-            </div>
-            <div class="six wide column">
-                NIC :
-            </div>
-            <div class="ten wide column" id="nic">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Drive :
-            </div>
-            <div class="ten wide column" id="drive">
-                Loading...
-            </div>
-            <div class="six wide column">
-                USB :
-            </div>
-            <div class="ten wide column" id="usb">
-                Loading...
-            </div>
+            <div class="six wide column" locale="hwinfo/model">Model :</div>
+            <div class="ten wide column" id="model">Loading...</div>
+            <div class="six wide column" locale="hwinfo/frequency">Frequency :</div>
+            <div class="ten wide column" id="freq">Loading...</div>
+            <div class="six wide column" locale="hwinfo/instruction">Instruction :</div>
+            <div class="ten wide column" id="instruction">Loading...</div>
+            <div class="six wide column" locale="hwinfo/hardware">Hardware :</div>
+            <div class="ten wide column" id="hardware">Loading...</div>
+            <div class="six wide column" locale="hwinfo/revision">Revision :</div>
+            <div class="ten wide column" id="revision">Loading...</div>
+            <div class="six wide column" locale="hwinfo/memory">Memory :</div>
+            <div class="ten wide column" id="ram">Loading...</div>
+            <div class="six wide column" locale="hwinfo/nic">NIC :</div>
+            <div class="ten wide column" id="nic">Loading...</div>
+            <div class="six wide column" locale="hwinfo/drive">Drive :</div>
+            <div class="ten wide column" id="drive">Loading...</div>
+            <div class="six wide column" locale="hwinfo/usb">USB :</div>
+            <div class="ten wide column" id="usb">Loading...</div>
         </div>
         <br>
-        <h3 class="ui header">Operation Time</h3>
+        <h3 class="ui header" locale="hwinfo/operation_time">Operation Time</h3>
         <div class="ui grid">
-            <div class="six wide column">
-                Boot Time:
-            </div>
-            <div class="ten wide column" id="startup">
-                Loading...
-            </div>
-            <div class="six wide column">
-                Up Time :
-            </div>
-            <div class="ten wide column" id="operation">
-                Loading...
-            </div>
+            <div class="six wide column" locale="hwinfo/boot_time">Boot Time:</div>
+            <div class="ten wide column" id="startup">Loading...</div>
+            <div class="six wide column" locale="hwinfo/up_time">Up Time :</div>
+            <div class="ten wide column" id="operation">Loading...</div>
         </div>
     </div>
+    
     <div class="ui divider"></div>
     <img class="ui small image" id="icon"></img>
     <br>
 </body>
 <script>
+    var specLocale = NewAppLocale();
     $(document).ready(function() {
-        initSystemInfo();
+        specLocale.init("../locale/system_info_spec.json", function(){
+            specLocale.translate();
+            initSystemInfo();
+        });
+        
     });
 
     function initSystemInfo() {

+ 41 - 35
web/SystemAO/info/overview.html

@@ -1,12 +1,13 @@
 <!DOCTYPE html>
 <html ng-app="App">
 <head>
-    <title>System Info</title>
+    <title>System Overview</title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
     <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
     <script type="text/javascript" src="../../script/jquery.min.js"></script>
     <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
+    <script type="text/javascript" src="../../script/applocale.js"></script>
 </head>
 
 <body>
@@ -16,35 +17,35 @@
             <div class="six wide column">
                 <div class="ui fluid card">
                     <div class="image">
-                      <img id="avator" src="../../SystemAO/users/img/user.svg">
+                        <img id="avator" src="../../SystemAO/users/img/user.svg">
                     </div>
                     <div class="content">
-                      <a id="username" class="header">USER</a>
-                      <div class="meta">
-                        <span id="usergroup" class="date">@usergroup</span>
-                      </div>
+                        <a id="username" class="header"><span>USER</span></a>
+                        <div class="meta">
+                            <span id="usergroup" class="date"><span>@usergroup</span></span>
+                        </div>
                     </div>
                     <div class="extra content">
-                      <a href="#" onclick="parent.logout();">
-                        <i class="logout icon"></i>
-                        Logout
-                      </a>
+                        <a href="#" onclick="parent.logout();">
+                            <i class="logout icon"></i>
+                            <span locale="overview/logout">Logout</span>
+                        </a>
                     </div>
-                  </div>
+                </div>
             </div>
             <div class="ten wide column">
                 <div class="ui segment">
-                    <h3 class="ui header"><i class="yellow folder icon"></i> Storage</h3>
+                    <h3 class="ui header"><i style="display: inline;" class="yellow folder icon"></i> <span locale="overview/storage">Storage</span></h3>
                     <div class="ui divider"></div>
                     <div class="ui grid">
                         <div class="six wide column">
-                            Used Space
+                            <span locale="overview/used_space">Used Space</span>
                         </div>
                         <div class="ten wide column" id="usedStorage">
                             Loading...
                         </div>
                         <div class="six wide column">
-                            Total Space
+                            <span locale="overview/total_space">Total Space</span>
                         </div>
                         <div class="ten wide column" id="totalStorage">
                             Loading...
@@ -52,11 +53,11 @@
                     </div>
                 </div>
                 <div class="ui segment">
-                    <h3 class="ui header"><i class="blue globe icon"></i> Personal Homepage</h3>
+                    <h3 class="ui header"><i  style="display: inline;" class="blue globe icon"></i> <span locale="overview/personal_homepage">Personal Homepage</span></h3>
                     <div class="ui divider"></div>
                     <div class="ui grid">
                         <div class="six wide column">
-                            Status:
+                            <span locale="overview/status">Status:</span>
                         </div>
                         <div class="ten wide column" id="homepageStatus">
                             Loading...
@@ -64,17 +65,17 @@
                     </div>
                 </div>
                 <div class="ui segment">
-                    <h3 class="ui header"><i class="teal clock icon"></i>  Operation Time</h3>
+                    <h3 class="ui header"><i  style="display: inline;" class="teal clock icon"></i> <span locale="overview/operation_time">Operation Time</span></h3>
                     <div class="ui divider"></div>
                     <div class="ui grid">
                         <div class="six wide column">
-                            Online Since:
+                            <span locale="overview/online_since">Online Since:</span>
                         </div>
                         <div class="ten wide column" id="startup">
                             Loading...
                         </div>
                         <div class="six wide column">
-                            Up Time :
+                            <span locale="overview/up_time">Up Time :</span>
                         </div>
                         <div class="ten wide column" id="operation">
                             Loading...
@@ -82,9 +83,9 @@
                     </div>
                 </div>
             </div>
-          </div>
-        
+        </div>
     </div>
+    
     <div class="ui divider"></div>
     <div style="float: right; text-align: right; color: #9c9c9c; margin-right: 1.5em;" >
         <p><span id="hostname"></span><br>
@@ -95,18 +96,23 @@
     <br>
 </body>
 <script>
+    var overviewLocale = NewAppLocale();
+    
     $(document).ready(function() {
-        $.getJSON("../../system/info/getRuntimeInfo", function(data){
-            $("#startup").text(ao_module_utils.timeConverter(data.StartupTime));
-            $("#operation").text(ao_module_utils.durationConverter(data.ContinuesRuntime));
-            $("#operation").attr("startunix", data.StartupTime);
-            accumulateOperationTime();
-        });
+        overviewLocale.init("../locale/system_info_overview.json", function(){
+            overviewLocale.translate();
+            $.getJSON("../../system/info/getRuntimeInfo", function(data){
+                $("#startup").text(ao_module_utils.timeConverter(data.StartupTime));
+                $("#operation").text(ao_module_utils.durationConverter(data.ContinuesRuntime));
+                $("#operation").attr("startunix", data.StartupTime);
+                accumulateOperationTime();
+            });
 
-        initHostInfo();
-        initUserInfo();
-        initStorageInfo();
-        initHomepageState();
+            initHostInfo();
+            initUserInfo();
+            initStorageInfo();
+            initHomepageState();
+        });
     });
 
     function initHostInfo(){
@@ -131,9 +137,9 @@
         $.get("../../system/disk/quota/quotaInfo", function(data){
             let percentageText = "0%";
             if (data.Total == -1){
-                $("#totalStorage").text("Unlimited");
+                $("#totalStorage").text(overviewLocale.getString("overview/info/unlimited", "Unlimited"));
             }else if (data.Total == 0){
-                $("#totalStorage").text("Read Only");
+                $("#totalStorage").text(overviewLocale.getString("overview/info/readonly", "Read Only"));
                 percentageText = "100%";
             }else{
                 $("#totalStorage").text(ao_module_utils.formatBytes(data.Total, 2));
@@ -146,9 +152,9 @@
     function initHomepageState(){
         $.get("../../system/network/www/toggle", function(data){
             if (data == true){
-                $("#homepageStatus").html(`<h5><i class="green circle icon"></i> Online</h5>`);
+                $("#homepageStatus").html(`<h5><i class="green circle icon"></i> ${overviewLocale.getString("overview/status/online", "Online")}</h5>`);
             }else{
-                $("#homepageStatus").html(`<h5><i class="red circle icon"></i> Offline</h5>`);
+                $("#homepageStatus").html(`<h5><i class="red circle icon"></i> ${overviewLocale.getString("overview/status/offline", "Offline")}</h5>`);
             }
            
         });

+ 509 - 504
web/SystemAO/info/taskManager.html

@@ -1,505 +1,510 @@
-<!DOCTYPE html>
-<head>
-    <title>Task Manager</title>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
-    <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
-    <script type="text/javascript" src="../../script/jquery.min.js"></script>
-    <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
-    <script type="text/javascript" src="../../script/ao_module.js"></script>
-    <script type="text/javascript" src="../info/js/chart/Chart.min.js"></script>
-</head>
-
-<body>
-    <br>
-    <div class="ui container">
-        <div id="cpuChartContainer" style="position: relative;">
-            <h2 class="ui header">
-                CPU
-                <div class="sub header">CPU Usage (%) in the previous 60 seconds</div>
-            </h2>
-            <p id="CPUname" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;">Generic Processor</p>
-            <canvas id="cpuChart" width="1200" height="300"></canvas>
-            <div class="ui stackable grid">
-                <div class="four wide column">
-                    <div class="ui header" >
-                        <span id="cpuUsage">0%</span>
-                         <div class="sub header">Usage</div>
-                     </div>
-                </div>
-                <div class="four wide column">
-                    <div class="ui header" >
-                        <span id="cpufreq">Loading</span>
-                        <div class="sub header">Frequency</div>
-                     </div>
-                </div>
-            </div>
-           
-        </div>
-        <br>
-        <div id="ramChartContainer" style="position: relative;">
-            <h2 class="ui header">
-                Memory
-                <div class="sub header">RAM Usage</div>
-            </h2>
-            <p id="RAMInfo" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;"></p>
-            <canvas id="ramChart" width="1200" height="300"></canvas>
-            <br>
-            <div class="ui stackable grid">
-                <div class="four wide column">
-                    <div class="ui header" >
-                        <span id="ramUsed">Loading</span>
-                        <div class="sub header">Used</div>
-                    </div>
-                </div>
-                <div class="four wide column">
-                    <div class="ui header" >
-                        <span id="ramUsedPercentage">Loading</span>
-                        <div class="sub header">Used (%)</div>
-                    </div>
-                </div>
-                <div class="four wide column">
-                    <div class="ui header">
-                        <span id="ramTotal">Loading</span>
-                        <div class="sub header">Total</div>
-                    </div>
-                </div>
-            </div>
-           
-           
-        </div>
-        <div id="netChartContainer" style="position: relative; margin-top: 1.2em;">
-            <h2 class="ui header">
-                Network
-                <div class="sub header">Network usage in the previous 60 seconds</div>
-            </h2>
-            <p id="netGraphScale" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;">100 kbps</p>
-            <canvas id="netChart" width="1200" height="300"></canvas>
-            <div class="ui stackable grid">
-                <div class="four wide column">
-                    <div class="ui header" style="border-left: 2px solid #bc793f; padding-left: 1em;">
-                        <span id="rx">Loading</span>
-                         <div class="sub header">Received</div>
-                     </div>
-                </div>
-                <div class="four wide column">
-                    <div class="ui header"  style="border-left: 2px dotted #bc793f; padding-left: 1em;">
-                        <span id="tx">Loading</span>
-                        <div class="sub header">Transmitted</div>
-                     </div>
-                </div>
-            </div>
-           
-        </div>
-
-        <br><br>
-    </div>
-    <script>
-        var cpuChart;
-        var ramChart;
-        var netChart;
-        var previousNetData = [0, 0];
-
-        //Override Chart.js v3 poor API designs
-        Chart.defaults.plugins.tooltip.enabled = false;
-        Chart.defaults.plugins.legend.display = false;
-
-        var options = {
-            maintainAspectRatio: true,
-            responsive: true,
-			spanGaps: false,
-			elements: {
-				line: {
-					tension: 0.000001
-				}
-			},
-			plugins: {
-				filler: {
-					propagate: false
-				},
-			},
-			scales: {
-				x: {
-                    grid: {
-                        color:  "rgba(83, 160, 205, 0.2)"
-                    }
-                },
-                y: {
-                    min: 0,
-                    max: 100,
-                    grid: {
-                        color:  "rgba(83, 160, 205, 0.2)"
-                    },
-                    ticks: {
-                        display: false,
-                    }
-                }
-            },
-            legend: {
-                display: false,
-            },
-            tooltips: {
-                callbacks: {
-                    label: function(tooltipItem) {
-                            return tooltipItem.yLabel;
-                    }
-                }
-            }
-        };
-
-        var ramOptions = {
-            maintainAspectRatio: true,
-            responsive: true,
-			spanGaps: false,
-			elements: {
-				line: {
-					tension: 0.000001
-				}
-			},
-			plugins: {
-				filler: {
-					propagate: false
-				},
-			},
-			scales: {
-				x: {
-                    grid: {
-                        color:  "rgba(156, 55, 185, 0.2)"
-                    }
-                },
-                y: {
-                    min: 0,
-                    max: 100,
-                    grid: {
-                        color:  "rgba(156, 55, 185, 0.2)"
-                    },
-                    ticks: {
-                        display: false,
-                    }
-                }
-            },
-            legend: {
-                display: false,
-            },
-            tooltips: {
-                callbacks: {
-                    label: function(tooltipItem) {
-                            return tooltipItem.yLabel;
-                    }
-                }
-            }
-        };
-
-        var netOptions = {
-            maintainAspectRatio: true,
-            responsive: true,
-			spanGaps: false,
-			elements: {
-				line: {
-					tension: 0.000001
-				}
-			},
-			plugins: {
-				filler: {
-					propagate: false
-				},
-			},
-			scales: {
-				x: {
-                    grid: {
-                        color:  "rgba(167, 79, 1, 0.2)"
-                    }
-                },
-                y: {
-                    min: Math.min.apply(this, getMergedRxTxDataset()),
-                    max: Math.max.apply(this, getMergedRxTxDataset()) + 5,
-                    grid: {
-                        color:  "rgba(167, 79, 1, 0.2)"
-                    },
-                    ticks: {
-                        display: false,
-                    }
-                }
-            },
-            legend: {
-                display: false,
-            },
-            tooltips: {
-                callbacks: {
-                    label: function(tooltipItem) {
-                            return tooltipItem.yLabel;
-                    }
-                }
-            }
-        };
-        
-        initInfo();
-        chartInit();
-
-        //Special code to handle embedding into the System Setting embedded windows
-        var insideIframe = false;
-        if (parent.managerInIframe !== undefined && parent.managerInIframe == true){
-            $(window).on("click", function(e){
-                parent.ao_module_focus();
-            });
-        }
-
-        function initInfo(){
-            $.get("../../system/info/getCPUinfo", function(data){
-                var data = JSON.parse(data);
-                console.log(data);
-                $("#CPUname").text(data.Model);
-                if (parseFloat(data.Freq) > 1000){
-                    $("#cpufreq").text((data.Freq/1000).toFixed(2) + " Ghz");
-                }else{
-                    $("#cpufreq").text(data.Freq + " Mhz");
-                }
-                
-            });
-
-            $.get("../../system/info/getRAMinfo", function(data){
-                //Return ram in byte
-                var ramsize = bytesToSize(data);
-                $("#RAMInfo").text(ramsize);
-            })
-        }
-
-        function bytesToSize(bytes) {
-            var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
-            if (bytes == 0) return '0 Byte';
-            var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
-            return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
-        }
-
-        function bitToSize(bytes) {
-            var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb'];
-            if (bytes == 0) return '0 b';
-            var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1000)));
-            return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
-        }
-
-
-        function chartInit(){
-            cpuChart = new Chart('cpuChart', {
-				type: 'line',
-				data: {
-					labels: [],
-					datasets: [{
-						backgroundColor: "rgba(241,246,250,0.4)",
-						borderColor: "#4c9dcb",
-						data: [],
-                        radius: 0,
-                        borderWidth: 2,
-						fill: 'start'
-                    }]
-				},
-				options: options
-            });
-            
-            //Push 60 empty data into the chart
-            for (var i =0; i < 60; i++){
-                addData(cpuChart, "",0)
-            }
-
-            //Create RAM Chart
-            ramChart = new Chart('ramChart', {
-				type: 'line',
-				data: {
-					labels: [],
-					datasets: [{
-						backgroundColor: "rgba(244,242,244,0.4)",
-						borderColor: "#9528b4",
-						data: [],
-                        radius: 0,
-                        borderWidth: 2,
-						fill: 'start'
-                    }]
-				},
-				options: ramOptions
-            });
-
-            for (var i =0; i < 60; i++){
-                addData(ramChart, "",0)
-            }
-
-            //Create Network Chart
-            netChart = new Chart('netChart', {
-				type: 'line',
-				data: {
-					labels: [],
-					datasets: [{
-						backgroundColor: "rgba(252,243,235,0.4)",
-						borderColor: "#a74f01",
-						data: [],
-                        radius: 0,
-                        borderWidth: 2,
-						fill: 'start'
-                    },
-                    {
-						backgroundColor: "rgba(252,243,235,0.2)",
-						borderColor: "#a74f01",
-                        borderDash: [3, 3],
-						data: [],
-                        radius: 0,
-                        borderWidth: 2,
-						fill: 'start'
-                        
-                    }]
-				},
-				options: netOptions
-            });
-
-            for (var i =0; i < 60; i++){
-                addNetData(netChart, "", 0, 0)
-            }
-            
-        }
-
-        resizeCharts();
-        $(window).on("resize", function(){
-            resizeCharts();
-        })
-
-        function resizeCharts(){
-            $("#cpuChart").width($("#cpuChartContainer").width());
-            $("#ramChart").width($("#ramChartContainer").width());
-        }
-
-        updateData();
-        function updateData(){
-            //Testing use 
-            /*
-            setInterval(function(){
-                addAndShiftChartDate(cpuChart, "", Math.floor(Math.random() * 50) + 20)
-                addAndShiftChartDate(ramChart, "", Math.floor(Math.random() * 10) + 30)
-            }, 1000)
-            */
-
-             //Calculate the bandwidth diff
-            $.get("../../system/network/getNICUsage", function(data){
-                if (data.error !== undefined){
-                    //Error
-                    console.log(data.error);
-                    $("#netGraphScale").text(data.error);
-                    return;
-                }
-                if (previousNetData[0] == 0 && previousNetData[1] == 0){
-                    //Not initiated. Set base and wait for next iteration
-                    previousNetData = [data.RX, data.TX];
-                }else{
-                    var rxd = data.RX - previousNetData[0];
-                    var txd = data.TX - previousNetData[1];
-                    previousNetData = [data.RX, data.TX];
-                    addAndShiftNetworkData(netChart, "", rxd, txd);
-
-                    $("#rx").text(bitToSize(rxd)+"/s");
-                    $("#tx").text(bitToSize(txd)+"/s");
-
-                    //Get the max value of the diagram, round it to the cloest 10x
-                    var chartMaxValue = Math.max.apply(this, getMergedRxTxDataset()) * 1.2;
-
-                    //Special Rounding for calculating graph scale
-                    baseValue = parseInt(chartMaxValue);
-                    var scale = "0 bps"
-                    var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'];
-                    function roundUpNearest(num) {
-                        return Math.ceil(num / 10) * 10;
-                    }
-
-                    if (baseValue == 0){
-
-                    }else{
-                        var i = parseInt(Math.floor(Math.log(baseValue) / Math.log(1000)));
-                        scale = roundUpNearest((baseValue / Math.pow(1024, i)).toFixed(0))
-                        scale += ' ' + sizes[i] + "ps";
-                    }
-                    
-                    //console.log(baseValue, chartMaxValue, scale);
-                    $("#netGraphScale").text(scale);
-                }
-            })
-
-            $.get("../../system/info/getUsageInfo", function(data){
-                //Update graph
-                addAndShiftChartDate(cpuChart, "", data.CPU);
-                addAndShiftChartDate(ramChart, "", data.RamUsage);
-
-                //Update values
-                $("#cpuUsage").text(data.CPU.toFixed(1) + "%");
-                $("#ramUsedPercentage").text(data.RamUsage.toFixed(1) + "%")
-                $("#ramUsed").text(data.UsedRAM);
-                $("#ramTotal").text(data.TotalRam);
-
-                setTimeout(function(){
-                    updateData();
-                }, 1000);
-            });
-
-        }
-
-        function addNetData(chart, label, rx, tx) {
-            chart.data.labels.push(label);
-            chart.data.datasets[0].data.push(rx);
-            chart.data.datasets[1].data.push(tx);
-            chart.update();
-        }
-
-        function addData(chart, label, data) {
-            chart.data.labels.push(label);
-            chart.data.datasets.forEach((dataset) => {
-                dataset.data.push(data);
-            });
-            chart.update();
-        }
-
-        function addAndShiftChartDate(chart, label, newdata) {
-            chart.data.labels.splice(0, 1); // remove first label
-            chart.data.datasets.forEach(function(dataset) {
-                dataset.data.splice(0, 1); // remove first data point
-            });
-
-            chart.update();
-
-            // Add new data
-            chart.data.labels.push(label); // add new label at end
-            chart.data.datasets.forEach(function(dataset, index) {
-                dataset.data.push(newdata); // add new data at end
-            });
-
-            chart.update();
-        }
-
-        function addAndShiftNetworkData(chart, label, rxd, txd) {
-            chart.data.labels.splice(0, 1); // remove first label
-            chart.data.datasets.forEach(function(dataset) {
-                dataset.data.splice(0, 1); // remove first data point
-            });
-
-            chart.update();
-
-            // Add new data
-            chart.data.labels.push(label); // add new label at end
-            chart.data.datasets[0].data.push(rxd);
-            chart.data.datasets[1].data.push(txd);
-            
-            
-
-            //Update the sacle as well
-            netChart.options.scales.y.min = Math.min.apply(this, getMergedRxTxDataset());
-            netChart.options.scales.y.max = Math.max.apply(this, getMergedRxTxDataset()) *1.2;
-
-            chart.update();
-        }
-
-        function getMergedRxTxDataset(){
-            if (netChart == undefined){
-                return [0, 100];
-            }
-            var newArr = [];
-            newArr = newArr.concat(netChart.data.datasets[0].data,netChart.data.datasets[1].data);
-            return newArr;
-        }
-
-    </script>
-</body>
+<!DOCTYPE html>
+<head>
+    <title>Task Manager</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
+    <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
+    <script type="text/javascript" src="../../script/jquery.min.js"></script>
+    <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
+    <script type="text/javascript" src="../../script/ao_module.js"></script>
+    <script type="text/javascript" src="../info/js/chart/Chart.min.js"></script>
+    <script type="text/javascript" src="../../script/applocale.js"></script>
+</head>
+
+<body>
+    <br>
+    <div class="ui container">
+        <div id="cpuChartContainer" style="position: relative;">
+            <h2 class="ui header">
+                <span locale="taskManager/cpu">CPU</span>
+                <div class="sub header" locale="taskManager/cpu_description">CPU Usage (%) in the previous 60 seconds</div>
+            </h2>
+            <p id="CPUname" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;" locale="taskManager/cpu_info">Generic Processor</p>
+            <canvas id="cpuChart" width="1200" height="300"></canvas>
+            <div class="ui stackable grid">
+                <div class="four wide column">
+                    <div class="ui header">
+                        <span id="cpuUsage">0%</span>
+                        <div class="sub header" locale="taskManager/cpu_usage_description">Usage</div>
+                    </div>
+                </div>
+                <div class="four wide column">
+                    <div class="ui header">
+                        <span id="cpufreq">Loading</span>
+                        <div class="sub header" locale="taskManager/cpu_frequency_description">Frequency</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <br>
+        <div id="ramChartContainer" style="position: relative;">
+            <h2 class="ui header">
+                <span locale="taskManager/memory">Memory</span>
+                <div class="sub header" locale="taskManager/memory_description">RAM Usage</div>
+            </h2>
+            <p id="RAMInfo" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;" locale="taskManager/memory_info"></p>
+            <canvas id="ramChart" width="1200" height="300"></canvas>
+            <br>
+            <div class="ui stackable grid">
+                <div class="four wide column">
+                    <div class="ui header">
+                        <span id="ramUsed">Loading</span>
+                        <div class="sub header" locale="taskManager/ram_used_description">Used</div>
+                    </div>
+                </div>
+                <div class="four wide column">
+                    <div class="ui header">
+                        <span id="ramUsedPercentage">Loading</span>
+                        <div class="sub header" locale="taskManager/ram_used_percentage_description">Used (%)</div>
+                    </div>
+                </div>
+                <div class="four wide column">
+                    <div class="ui header">
+                        <span id="ramTotal">Loading</span>
+                        <div class="sub header" locale="taskManager/ram_total_description">Total</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div id="netChartContainer" style="position: relative; margin-top: 1.2em;">
+            <h2 class="ui header">
+                <span locale="taskManager/network">Network</span>
+                <div class="sub header" locale="taskManager/network_description">Network usage in the previous 60 seconds</div>
+            </h2>
+            <p id="netGraphScale" style="position: absolute; top: 1em; right: 0.3em; font-size: 16px;" locale="taskManager/network_scale">100 kbps</p>
+            <canvas id="netChart" width="1200" height="300"></canvas>
+            <div class="ui stackable grid">
+                <div class="four wide column">
+                    <div class="ui header" style="border-left: 2px solid #bc793f; padding-left: 1em;">
+                        <span id="rx">Loading</span>
+                        <div class="sub header" locale="taskManager/network_received_description">Received</div>
+                    </div>
+                </div>
+                <div class="four wide column">
+                    <div class="ui header" style="border-left: 2px dotted #bc793f; padding-left: 1em;">
+                        <span id="tx">Loading</span>
+                        <div class="sub header" locale="taskManager/network_transmitted_description">Transmitted</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+
+        <br><br>
+    </div>
+    <script>
+        var cpuChart;
+        var ramChart;
+        var netChart;
+        var previousNetData = [0, 0];
+
+        var performanceLocale = NewAppLocale();
+        performanceLocale.init("../locale/system_info_spec.json", function(){
+            performanceLocale.translate();
+        });
+
+
+        //Override Chart.js v3 poor API designs
+        Chart.defaults.plugins.tooltip.enabled = false;
+        Chart.defaults.plugins.legend.display = false;
+
+        var options = {
+            maintainAspectRatio: true,
+            responsive: true,
+			spanGaps: false,
+			elements: {
+				line: {
+					tension: 0.000001
+				}
+			},
+			plugins: {
+				filler: {
+					propagate: false
+				},
+			},
+			scales: {
+				x: {
+                    grid: {
+                        color:  "rgba(83, 160, 205, 0.2)"
+                    }
+                },
+                y: {
+                    min: 0,
+                    max: 100,
+                    grid: {
+                        color:  "rgba(83, 160, 205, 0.2)"
+                    },
+                    ticks: {
+                        display: false,
+                    }
+                }
+            },
+            legend: {
+                display: false,
+            },
+            tooltips: {
+                callbacks: {
+                    label: function(tooltipItem) {
+                            return tooltipItem.yLabel;
+                    }
+                }
+            }
+        };
+
+        var ramOptions = {
+            maintainAspectRatio: true,
+            responsive: true,
+			spanGaps: false,
+			elements: {
+				line: {
+					tension: 0.000001
+				}
+			},
+			plugins: {
+				filler: {
+					propagate: false
+				},
+			},
+			scales: {
+				x: {
+                    grid: {
+                        color:  "rgba(156, 55, 185, 0.2)"
+                    }
+                },
+                y: {
+                    min: 0,
+                    max: 100,
+                    grid: {
+                        color:  "rgba(156, 55, 185, 0.2)"
+                    },
+                    ticks: {
+                        display: false,
+                    }
+                }
+            },
+            legend: {
+                display: false,
+            },
+            tooltips: {
+                callbacks: {
+                    label: function(tooltipItem) {
+                            return tooltipItem.yLabel;
+                    }
+                }
+            }
+        };
+
+        var netOptions = {
+            maintainAspectRatio: true,
+            responsive: true,
+			spanGaps: false,
+			elements: {
+				line: {
+					tension: 0.000001
+				}
+			},
+			plugins: {
+				filler: {
+					propagate: false
+				},
+			},
+			scales: {
+				x: {
+                    grid: {
+                        color:  "rgba(167, 79, 1, 0.2)"
+                    }
+                },
+                y: {
+                    min: Math.min.apply(this, getMergedRxTxDataset()),
+                    max: Math.max.apply(this, getMergedRxTxDataset()) + 5,
+                    grid: {
+                        color:  "rgba(167, 79, 1, 0.2)"
+                    },
+                    ticks: {
+                        display: false,
+                    }
+                }
+            },
+            legend: {
+                display: false,
+            },
+            tooltips: {
+                callbacks: {
+                    label: function(tooltipItem) {
+                            return tooltipItem.yLabel;
+                    }
+                }
+            }
+        };
+        
+        initInfo();
+        chartInit();
+
+        //Special code to handle embedding into the System Setting embedded windows
+        var insideIframe = false;
+        if (parent.managerInIframe !== undefined && parent.managerInIframe == true){
+            $(window).on("click", function(e){
+                parent.ao_module_focus();
+            });
+        }
+
+        function initInfo(){
+            $.get("../../system/info/getCPUinfo", function(data){
+                var data = JSON.parse(data);
+                console.log(data);
+                $("#CPUname").text(data.Model);
+                if (parseFloat(data.Freq) > 1000){
+                    $("#cpufreq").text((data.Freq/1000).toFixed(2) + " Ghz");
+                }else{
+                    $("#cpufreq").text(data.Freq + " Mhz");
+                }
+                
+            });
+
+            $.get("../../system/info/getRAMinfo", function(data){
+                //Return ram in byte
+                var ramsize = bytesToSize(data);
+                $("#RAMInfo").text(ramsize);
+            })
+        }
+
+        function bytesToSize(bytes) {
+            var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+            if (bytes == 0) return '0 Byte';
+            var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
+            return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
+        }
+
+        function bitToSize(bytes) {
+            var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb'];
+            if (bytes == 0) return '0 b';
+            var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1000)));
+            return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
+        }
+
+
+        function chartInit(){
+            cpuChart = new Chart('cpuChart', {
+				type: 'line',
+				data: {
+					labels: [],
+					datasets: [{
+						backgroundColor: "rgba(241,246,250,0.4)",
+						borderColor: "#4c9dcb",
+						data: [],
+                        radius: 0,
+                        borderWidth: 2,
+						fill: 'start'
+                    }]
+				},
+				options: options
+            });
+            
+            //Push 60 empty data into the chart
+            for (var i =0; i < 60; i++){
+                addData(cpuChart, "",0)
+            }
+
+            //Create RAM Chart
+            ramChart = new Chart('ramChart', {
+				type: 'line',
+				data: {
+					labels: [],
+					datasets: [{
+						backgroundColor: "rgba(244,242,244,0.4)",
+						borderColor: "#9528b4",
+						data: [],
+                        radius: 0,
+                        borderWidth: 2,
+						fill: 'start'
+                    }]
+				},
+				options: ramOptions
+            });
+
+            for (var i =0; i < 60; i++){
+                addData(ramChart, "",0)
+            }
+
+            //Create Network Chart
+            netChart = new Chart('netChart', {
+				type: 'line',
+				data: {
+					labels: [],
+					datasets: [{
+						backgroundColor: "rgba(252,243,235,0.4)",
+						borderColor: "#a74f01",
+						data: [],
+                        radius: 0,
+                        borderWidth: 2,
+						fill: 'start'
+                    },
+                    {
+						backgroundColor: "rgba(252,243,235,0.2)",
+						borderColor: "#a74f01",
+                        borderDash: [3, 3],
+						data: [],
+                        radius: 0,
+                        borderWidth: 2,
+						fill: 'start'
+                        
+                    }]
+				},
+				options: netOptions
+            });
+
+            for (var i =0; i < 60; i++){
+                addNetData(netChart, "", 0, 0)
+            }
+            
+        }
+
+        resizeCharts();
+        $(window).on("resize", function(){
+            resizeCharts();
+        })
+
+        function resizeCharts(){
+            $("#cpuChart").width($("#cpuChartContainer").width());
+            $("#ramChart").width($("#ramChartContainer").width());
+        }
+
+        updateData();
+        function updateData(){
+            //Testing use 
+            /*
+            setInterval(function(){
+                addAndShiftChartDate(cpuChart, "", Math.floor(Math.random() * 50) + 20)
+                addAndShiftChartDate(ramChart, "", Math.floor(Math.random() * 10) + 30)
+            }, 1000)
+            */
+
+             //Calculate the bandwidth diff
+            $.get("../../system/network/getNICUsage", function(data){
+                if (data.error !== undefined){
+                    //Error
+                    console.log(data.error);
+                    $("#netGraphScale").text(data.error);
+                    return;
+                }
+                if (previousNetData[0] == 0 && previousNetData[1] == 0){
+                    //Not initiated. Set base and wait for next iteration
+                    previousNetData = [data.RX, data.TX];
+                }else{
+                    var rxd = data.RX - previousNetData[0];
+                    var txd = data.TX - previousNetData[1];
+                    previousNetData = [data.RX, data.TX];
+                    addAndShiftNetworkData(netChart, "", rxd, txd);
+
+                    $("#rx").text(bitToSize(rxd)+"/s");
+                    $("#tx").text(bitToSize(txd)+"/s");
+
+                    //Get the max value of the diagram, round it to the cloest 10x
+                    var chartMaxValue = Math.max.apply(this, getMergedRxTxDataset()) * 1.2;
+
+                    //Special Rounding for calculating graph scale
+                    baseValue = parseInt(chartMaxValue);
+                    var scale = "0 bps"
+                    var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'];
+                    function roundUpNearest(num) {
+                        return Math.ceil(num / 10) * 10;
+                    }
+
+                    if (baseValue == 0){
+
+                    }else{
+                        var i = parseInt(Math.floor(Math.log(baseValue) / Math.log(1000)));
+                        scale = roundUpNearest((baseValue / Math.pow(1024, i)).toFixed(0))
+                        scale += ' ' + sizes[i] + "ps";
+                    }
+                    
+                    //console.log(baseValue, chartMaxValue, scale);
+                    $("#netGraphScale").text(scale);
+                }
+            })
+
+            $.get("../../system/info/getUsageInfo", function(data){
+                //Update graph
+                addAndShiftChartDate(cpuChart, "", data.CPU);
+                addAndShiftChartDate(ramChart, "", data.RamUsage);
+
+                //Update values
+                $("#cpuUsage").text(data.CPU.toFixed(1) + "%");
+                $("#ramUsedPercentage").text(data.RamUsage.toFixed(1) + "%")
+                $("#ramUsed").text(data.UsedRAM);
+                $("#ramTotal").text(data.TotalRam);
+
+                setTimeout(function(){
+                    updateData();
+                }, 1000);
+            });
+
+        }
+
+        function addNetData(chart, label, rx, tx) {
+            chart.data.labels.push(label);
+            chart.data.datasets[0].data.push(rx);
+            chart.data.datasets[1].data.push(tx);
+            chart.update();
+        }
+
+        function addData(chart, label, data) {
+            chart.data.labels.push(label);
+            chart.data.datasets.forEach((dataset) => {
+                dataset.data.push(data);
+            });
+            chart.update();
+        }
+
+        function addAndShiftChartDate(chart, label, newdata) {
+            chart.data.labels.splice(0, 1); // remove first label
+            chart.data.datasets.forEach(function(dataset) {
+                dataset.data.splice(0, 1); // remove first data point
+            });
+
+            chart.update();
+
+            // Add new data
+            chart.data.labels.push(label); // add new label at end
+            chart.data.datasets.forEach(function(dataset, index) {
+                dataset.data.push(newdata); // add new data at end
+            });
+
+            chart.update();
+        }
+
+        function addAndShiftNetworkData(chart, label, rxd, txd) {
+            chart.data.labels.splice(0, 1); // remove first label
+            chart.data.datasets.forEach(function(dataset) {
+                dataset.data.splice(0, 1); // remove first data point
+            });
+
+            chart.update();
+
+            // Add new data
+            chart.data.labels.push(label); // add new label at end
+            chart.data.datasets[0].data.push(rxd);
+            chart.data.datasets[1].data.push(txd);
+            
+            
+
+            //Update the sacle as well
+            netChart.options.scales.y.min = Math.min.apply(this, getMergedRxTxDataset());
+            netChart.options.scales.y.max = Math.max.apply(this, getMergedRxTxDataset()) *1.2;
+
+            chart.update();
+        }
+
+        function getMergedRxTxDataset(){
+            if (netChart == undefined){
+                return [0, 100];
+            }
+            var newArr = [];
+            newArr = newArr.concat(netChart.data.datasets[0].data,netChart.data.datasets[1].data);
+            return newArr;
+        }
+
+    </script>
+</body>
 </html>

+ 76 - 0
web/SystemAO/locale/system_info_overview.json

@@ -0,0 +1,76 @@
+{
+    "author": "tobychui",
+    "version": "1.0",
+    "keys": {
+        "zh-tw": {
+            "name": "繁體中文(台灣)",
+            "fontFamily":"\"Microsoft JhengHei\",\"SimHei\", \"Apple LiGothic Medium\", \"STHeiti\"",
+            "strings":{
+                "overview/logout":"登出",
+                "overview/storage":"個人檔案儲存空間",
+                "overview/used_space":"已使用之容量",
+                "overview/total_space":"總容量配額",
+                "overview/personal_homepage":"個人主頁",
+                "overview/status":"狀態:",
+                "overview/operation_time":"系統運行時間",
+                "overview/online_since":"啟動時間與日期:",
+                "overview/up_time":"已連續上線:",
+
+                "overview/info/unlimited": "無限",
+                "overview/info/readonly": "唯讀帳戶",
+                "overview/status/online":"已啟用",
+                "overview/status/offline":"已停用",
+
+                "":""
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        },
+        "zh-hk": {
+            "name": "繁體中文(香港)",
+            "fontFamily":"\"Microsoft JhengHei\",\"SimHei\", \"Apple LiGothic Medium\", \"STHeiti\"",
+            "strings":{
+                "arozaudio/arozaudio-title": "ArozOS 音訊測試",
+                "arozaudio/system-audio": "系統音訊",
+                "arozaudio/system-audio-subheader": "測試和調整您的全局音訊/音量設置",
+                "arozaudio/left-speaker": "左喇叭",
+                "arozaudio/speaker-test": "音訊測試",
+                "arozaudio/right-speaker": "右喇叭",
+                "arozaudio/master-volume": "主音量",
+                "arozaudio/this-device-global-volume": "此設備全局音量:",
+                "arozaudio/some-modules-volume": "某些模組使用獨立的音量管理系統。主音量可能無法控制所有模組的音量。"
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        },
+        "zh-cn": {
+            "name": "简体中文(简体)",
+            "fwtitle" : "",
+            "strings":{
+                "arozaudio/arozaudio-title": "ArozOS 音频测试",
+                "arozaudio/system-audio": "系统音频",
+                "arozaudio/system-audio-subheader": "测试和调整全局音频/音量设置",
+                "arozaudio/left-speaker": "左扬声器",
+                "arozaudio/speaker-test": "扬声器测试",
+                "arozaudio/right-speaker": "右扬声器",
+                "arozaudio/master-volume": "主音量",
+                "arozaudio/this-device-global-volume": "设备全局音量:",
+                "arozaudio/some-modules-volume": "某些模块使用独立的音量管理系统。主音量可能无法控制所有模块的音量。"
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        }
+    }
+}

+ 105 - 0
web/SystemAO/locale/system_info_spec.json

@@ -0,0 +1,105 @@
+{
+    "author": "tobychui",
+    "version": "1.0",
+    "keys": {
+        "zh-tw": {
+            "name": "繁體中文(台灣)",
+            "fontFamily":"\"Microsoft JhengHei\",\"SimHei\", \"Apple LiGothic Medium\", \"STHeiti\"",
+            "strings":{
+                "hwinfo/specifications": "規格",
+                "hwinfo/model": "處理器型號",
+                "hwinfo/frequency": "處理器頻率",
+                "hwinfo/instruction": "指令集",
+                "hwinfo/hardware": "硬件",
+                "hwinfo/revision": "版本",
+                "hwinfo/memory": "記憶體",
+                "hwinfo/nic": "網卡",
+                "hwinfo/drive": "硬碟",
+                "hwinfo/usb": "USB",
+                "hwinfo/operation_time": "運行時間",
+                "hwinfo/boot_time": "啟動時間",
+                "hwinfo/up_time": "運行時間",
+
+            
+                "taskManager/cpu": "處理器",
+                "taskManager/cpu_description": "過去 60 秒內的 CPU 使用率 (%)",
+                "taskManager/cpu_info": "通用處理器",
+                "taskManager/cpu_usage_description": "使用率",
+                "taskManager/cpu_frequency_description": "時脈頻率",
+                "taskManager/memory": "記憶體",
+                "taskManager/memory_description": "RAM 使用率",
+                "taskManager/memory_info": "Loading...",
+                "taskManager/ram_used_description": "已用",
+                "taskManager/ram_used_percentage_description": "已用 (%)",
+                "taskManager/ram_total_description": "總計",
+                "taskManager/network": "網絡",
+                "taskManager/network_description": "過去 60 秒內的網絡使用情況",
+                "taskManager/network_scale": "100 kbps",
+                "taskManager/network_received_description": "接收",
+                "taskManager/network_transmitted_description": "傳輸",
+            
+
+                
+                "":""
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        },
+        "zh-hk": {
+            "name": "繁體中文(香港)",
+            "fontFamily":"\"Microsoft JhengHei\",\"SimHei\", \"Apple LiGothic Medium\", \"STHeiti\"",
+            "strings":{
+                "hwinfo/specifications": "規格",
+                "hwinfo/model": "處理器型號",
+                "hwinfo/frequency": "處理器頻率",
+                "hwinfo/instruction": "指令集",
+                "hwinfo/hardware": "硬件",
+                "hwinfo/revision": "版本",
+                "hwinfo/memory": "內存",
+                "hwinfo/nic": "網卡",
+                "hwinfo/drive": "硬碟",
+                "hwinfo/usb": "USB",
+                "hwinfo/operation_time": "運行時間",
+                "hwinfo/boot_time": "啟動時間",
+                "hwinfo/up_time": "運行時間",
+                "":""
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        },
+        "zh-cn": {
+            "name": "简体中文(简体)",
+            "fwtitle" : "",
+            "strings":{
+                "hwinfo/specifications": "规格",
+                "hwinfo/model": "处理器型号",
+                "hwinfo/frequency": "处理器频率",
+                "hwinfo/instruction": "指令集",
+                "hwinfo/hardware": "硬件",
+                "hwinfo/revision": "版本",
+                "hwinfo/memory": "内存",
+                "hwinfo/nic": "网卡",
+                "hwinfo/drive": "硬碟",
+                "hwinfo/usb": "USB",
+                "hwinfo/operation_time": "运行时间",
+                "hwinfo/boot_time": "启动时间",
+                "hwinfo/up_time": "运行时间",
+                "":""
+            },
+            "titles":{
+
+            },
+            "placeholder":{
+
+            }
+        }
+    }
+}

+ 4 - 1
web/script/applocale.js

@@ -113,4 +113,7 @@ function NewAppLocale(){
     }
 }
 
-var applocale = NewAppLocale();
+if (applocale == undefined){
+    //Only allow once instance of global applocale obj
+    var applocale = NewAppLocale();
+}