feat(pool): serve mining pool website from API server

Copy website_example to website/, add static file serving via Node fs
in the API default route handler, and remove website/ from .gitignore.
The API now serves index.html at / and all static assets by path.

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Claude 2026-04-02 13:47:34 +01:00
parent a70bf303d5
commit 78d5fae87c
No known key found for this signature in database
GPG key ID: AF404715446AEB41
95 changed files with 10490 additions and 5 deletions

1
.gitignore vendored
View file

@ -3,5 +3,4 @@ node_modules/
build/
.idea/
logs/
website/
*.swp

View file

@ -7,10 +7,12 @@
// Load required modules
let fs = require('fs');
let path = require('path');
let http = require('http');
let https = require('https');
let url = require("url");
let async = require('async');
let mime = require('mime');
let apiInterfaces = require('./apiInterfaces.js')(config.daemon, config.wallet);
let authSid = Math.round(Math.random() * 10000000000) + '' + Math.round(Math.random() * 10000000000);
@ -174,12 +176,29 @@ function handleServerRequest(request, response) {
handleTestTelegramNotification(urlParts, response);
break;
// Default response
// Default response — serve static website files
default:
response.writeHead(404, {
'Access-Control-Allow-Origin': '*'
let websiteRoot = path.join(__dirname, '..', 'website');
let requestedPath = urlParts.pathname === '/' ? '/index.html' : urlParts.pathname;
let filePath = path.join(websiteRoot, requestedPath);
// Prevent directory traversal outside websiteRoot
if (!filePath.startsWith(websiteRoot)) {
response.writeHead(403, { 'Access-Control-Allow-Origin': '*' });
response.end('Forbidden');
break;
}
fs.readFile(filePath, function(err, data) {
if (err) {
response.writeHead(404, { 'Access-Control-Allow-Origin': '*' });
response.end('Not found');
return;
}
response.writeHead(200, {
'Access-Control-Allow-Origin': '*',
'Content-Type': mime.lookup(filePath) || 'application/octet-stream'
});
response.end(data);
});
response.end('Invalid API call');
break;
}
}

150
website/admin.html Normal file
View file

@ -0,0 +1,150 @@
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
<title>Arqma with PLE or XCY or TRTL Mining Pool - Admin Panel</title>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.3/jquery.timeago.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/3.0.1/mustache.min.js"></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.js"></script>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<!-- Navigation -->
<div class="nav-side-menu">
<div class="brand"><a href="/">Admin Panel</a></div>
<i class="fa fa-bars fa-2x toggle-btn" data-toggle="collapse" data-target="#menu-content"></i>
<div class="menu-list">
<ul id="menu-content" class="menu-content collapsed out">
<li><a class="hot_link" data-page="admin/statistics.html" href="#">
<i class="fa fa-bar-chart-o"></i> Statistics
</a></li>
<li><a class="hot_link" data-page="admin/monitoring.html" href="#monitoring">
<i class="fa fa-eye"></i> Monitoring
</a></li>
<li><a class="hot_link" data-page="admin/userslist.html" href="#users_list">
<i class="fa fa-users"></i> Users List
</a></li>
<li><a class="hot_link" data-page="admin/ports.html" href="#ports">
<i class="fa fa-link"></i> Ports Usage
</a></li>
<li><a class="hot_link" data-page="admin/tools.html" href="#tools">
<i class="fa fa-gears"></i> Tools
</a></li>
<li class="sign-out"><a class="hot_link" href="/">
<i class="fa fa-sign-out"></i> Return to Pool
</a></li>
</ul>
</div>
</div>
<!-- Page content -->
<div id="page-wrapper">
<div id="page"></div>
<p id="loading" class="text-center"><i class="fa fa-circle-o-notch fa-spin"></i></p>
</div>
</div>
<!-- Footer -->
<footer>
<div class="text-muted">
Powered by <a target="_blank" href="https://github.com/dvandal/cryptonote-nodejs-pool"><i class="fa fa-github"></i> cryptonote-nodejs-pool</a>
<span id="poolVersion"></span>
<span class="hidden-xs">open sourced under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GPL</a></span>
</div>
</footer>
<!-- Javascript -->
<script src="config.js"></script>
<script src="js/common.js"></script>
<script>
// Fetch pool statistics
lastStats = {};
mergedStats = {};
let mergedApis = {};
$(function() {
let merged_apis = $.ajax({
url: `${api}/get_apis`,
dataType: 'json',
cache: 'false'
})
let poolStats = $.ajax({
url: `${api}/stats`,
dataType: 'json',
cache: 'false'
})
Promise.all([poolStats, merged_apis])
.then(values => {
lastStats = values[0]
mergedApis = values[1]
let subs = [];
Object.keys(mergedApis).some(key => {
let apiUrl = `${mergedApis[key].api}/stats`
subs.push($.ajax({url: apiUrl, dataType: 'json', cache: 'false'}))
})
Promise.all(subs)
.then(data => {
data.forEach(item => {
mergedStats[item.config.coin] = item
})
$('#poolVersion').html(lastStats.config.version);
routePage();
})
})
});
function fetchLiveStats() {
$.ajax({
url: api + '/live_stats',
dataType: 'json',
cache: 'false'
}).done(function(data) {
if(currentPage.update) {
currentPage.update();
}
}).always(function() {
fetchLiveStats();
});
}
function renderTemplate(usersData, templateId, view) {
let source = $(templateId).html()
Mustache.parse(source)
let rendered = Mustache.render(source, usersData)
$(view).append(rendered)
}
// Initialize
$(function(){
$("head").append("<link rel='stylesheet' href=" + themeCss + ">");
$("head").append("<link rel='stylesheet' href=themes/admin.css>");
$("head").append("<link rel='stylesheet' href=themes/custom.css>");
});
</script>
</body>
</html>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>

19
website/config.js Normal file
View file

@ -0,0 +1,19 @@
var api = "http://127.0.0.1:2117";
let parentCoin = "Lethean"
let byteUnits = [' H', ' KH', ' MH', ' GH', ' TH', ' PH', 'EH', 'ZH', 'YH']
var email = "developers@lethean.io";
var telegram = "https://t.me/laborx";
var discord = "https://discord.gg/lethean";
var facebook = "";
var marketCurrencies = ["{symbol}-BTC", "{symbol}-USDT", "{symbol}-USD", "{symbol}-EUR"];
var blockchainExplorer = "http://127.0.0.1:3335/block/{id}";
var blockchainExplorerMerged = "";
var transactionExplorer = "http://127.0.0.1:3335/transaction/{id}";
var transactionExplorerMerged = "";
var themeCss = "themes/default.css";
var defaultLang = 'en';

BIN
website/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

308
website/index.html Normal file
View file

@ -0,0 +1,308 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
<title>Lethean Mining by Muscleman</title>
<meta name="Description" content="Lethean Mining Pool by Muscleman. Cryptocurrency mining. Mine direct to exchange or wallet. Low pool fees and fast payments!">
<meta name="keywords" content="lethean, mining, pool, cryptocurrency, exchange, bitrex, coinmarketcap, tradeogre, payments, coinbase, escodex, bitrex">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.3/jquery.timeago.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-sparklines/2.1.2/jquery.sparkline.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/3.0.1/mustache.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.js"></script>
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link href="themes/default.css?" rel="stylesheet">
<link href="themes/custom.css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<!-- Navigation -->
<div class="nav-side-menu">
<div class="brand"><a href="/"><span id="coinSymbol"></span> <span data-tkey="miningPool">Mining Pool</span></a></div>
<i class="fa fa-bars fa-2x toggle-btn" data-toggle="collapse" data-target="#menu-content"></i>
<div class="menu-list">
<ul id="menu-content" class="menu-content collapsed out">
<li><a class="hot_link" data-page="home.html" href="#">
<i class="fa fa-home"></i> <span data-tkey="dashboard">Dashboard</span>
</a></li>
<li><a class="hot_link" data-page="worker_stats.html" href="#worker_stats">
<i class="fa fa-dashboard"></i> <span data-tkey="yourStats">Worker Statistics</span>
</a></li>
<li><a class="hot_link" data-page="getting_started.html" href="#getting_started">
<i class="fa fa-rocket"></i> <span data-tkey="gettingStarted">Getting Started</span>
</a></li>
<li><a class="hot_link" data-page="pool_blocks.html" href="#pool_blocks">
<i class="fa fa-cubes"></i> <span data-tkey="poolBlocks">Pool Blocks</span>
</a></li>
<li><a class="hot_link" data-page="payments.html" href="#payments">
<i class="fa fa-money"></i> <span data-tkey="payments">Payments</span>
</a></li>
<li><a class="hot_link" data-page="top10miners.html" href="#top10miners">
<i class="fa fa-trophy"></i> <span data-tkey="top10miners">Top 10 miners</span>
</a></li>
<li><a class="hot_link" data-page="market.html" href="#market">
<i class="fa fa-bank"></i> <span data-tkey="market">Market / Calculator</span>
</a></li>
<li><a class="hot_link" data-page="settings.html" href="#settings">
<i class="fa fa-gears"></i> <span data-tkey="settings">Settings</span>
</a></li>
<li><a class="hot_link" data-page="faq.html" href="#faq">
<i class="fa fa-comments"></i> <span data-tkey="faq">FAQ</span>
</a></li>
</ul>
</div>
</div>
<!-- Top Bar -->
<div id="top-bar">
<div><span data-tkey="network">Network</span>: <strong><span id="g_networkHashrate"><span data-tkey="na">N/A</span></span></strong></div>
<div><span data-tkey="poolProp">Prop Pool</span>: <strong><span id="g_poolHashrate"><span data-tkey="na">N/A</span></span></strong></div>
<div><span data-tkey="poolSolo">Solo Pool</span>: <strong><span id="g_poolHashrateSolo"><span data-tkey="na">N/A</span></span></strong></div>
<div><span data-tkey="you">You</span>: <strong><span id="g_userHashrate"><span tkey="na">N/A</span></span></strong></div>
<div><span id="statsUpdated"><span data-tkey="statsUpdated">Stats Updated</span> &nbsp;</span></div>
<div id="langSelector"></div>
</div>
<!-- Page content -->
<div id="page-wrapper">
<div id="page"></div>
<p id="loading" class="text-center"><i class="fa fa-circle-o-notch fa-spin"></i></p>
</div>
</div>
<!-- Footer -->
<footer>
<div class="text-muted">
<span data-tkey="poweredBy">Powered by</span> <a target="_blank" href="https://github.com/hyle-team/progpowz-nodejs-pool"><i class="fa fa-github"></i> progpowz-nodejs-pool</a>
<span id="poolVersion"></span>
<span class="hidden-xs"><span data-tkey="openSource">open sourced under the</span> <a href="http://www.gnu.org/licenses/gpl-2.0.html">GPL</a></span>
</div>
</footer>
<!-- Javascript -->
<script src="config.js?"></script>
<script src="lang/languages.js"></script>
<script src="js/common.js"></script>
<script src="js/custom.js"></script>
<script>
// Store last pool statistics
let lastStats;
let mergedStats = {};
let blockExplorers = {};
let mergedApis = {};
function getUrlVars() {
let vars = {};
let location = window.location.href.replace('#worker_stats', '');
let parts = location.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
function getUrlParam(parameter, defaultvalue){
let urlparameter = defaultvalue;
if(window.location.href.indexOf(parameter) > -1){
urlparameter = getUrlVars()[parameter];
}
return urlparameter;
}
// Get current miner address
function getCurrentAddress(coin) {
let address = ''
if (coin) {
let urlWalletAddress = getUrlParam(coin, 0);
address = urlWalletAddress || docCookies.getItem(`mining_address_${coin}`);
}
return address;
}
// Pulse live update
function pulseLiveUpdate(){
let stats_update = document.getElementById('statsUpdated');
stats_update.style.transition = 'opacity 100ms ease-out';
stats_update.style.opacity = 1;
setTimeout(function(){
stats_update.style.transition = 'opacity 7000ms linear';
stats_update.style.opacity = 0;
}, 500);
}
// Update live informations
function updateLiveStats(data, key) {
pulseLiveUpdate();
if (key !== parentCoin) {
mergedStats[key] = data;
} else {
lastStats = data;
if (lastStats && lastStats.pool && lastStats.pool.totalMinersPaid.toString() == '-1'){
lastStats.pool.totalMinersPaid = 0;
}
updateIndex();
}
if (currentPage) currentPage.update(key);
}
// Update global informations
function updateIndex(){
updateText('coinSymbol', lastStats.config.symbol);
updateText('g_networkHashrate', getReadableHashRateString(lastStats.network.difficulty / lastStats.config.coinDifficultyTarget) + '/sec');
updateText('g_poolHashrate', getReadableHashRateString(lastStats.pool.hashrate) + '/sec');
updateText('g_poolHashrateSolo', getReadableHashRateString(lastStats.pool.hashrateSolo) + '/sec');
if (lastStats.miner && lastStats.miner.hashrate){
updateText('g_userHashrate', getReadableHashRateString(lastStats.miner.hashrate) + '/sec');
}
else{
updateText('g_userHashrate', 'N/A');
}
updateText('poolVersion', lastStats.config.version);
}
// Load live statistics
function loadLiveStats(reload) {
let apiURL = api + '/stats';
let address = getCurrentAddress();
if (address) { apiURL = apiURL + '?address=' + encodeURIComponent(address); }
if (xhrLiveStats[parentCoin]){
xhrLiveStats[parentCoin].abort();
}
$.get(apiURL, function(data){
updateLiveStats(data, parentCoin);
if (!reload) {
routePage(fetchLiveStats(api, parentCoin));
}
});
Object.keys(mergedApis).some(key => {
let apiUrl = `${mergedApis[key].api}/stats`
// if (xhrLiveStats[key]){
// xhrLiveStats[key].abort();
// }
$.get(apiUrl, function(data){
updateLiveStats(data, key);
if (!reload){
routePage(fetchLiveStats(mergedApis[key].api, key));
}
});
})
}
// Fetch live statistics
let xhrLiveStats = {};
function fetchLiveStats(endPoint, key) {
let apiURL = endPoint + '/live_stats';
let address = getCurrentAddress(key);
if (address) {
apiURL = apiURL + '?address=' + encodeURIComponent(address);
}
// if (xhrLiveStats[key] && xhrLiveStats[key].status !== 200){
// xhrLiveStats[key].abort();
// }
xhrLiveStats[key] = $.ajax({
url: apiURL,
dataType: 'json',
cache: 'false'
}).done(function(data){
updateLiveStats(data, key);
}).always(function(){
fetchLiveStats(endPoint, key);
});
}
// Fetch Block and Transaction Explorer Urls
let xhrBlockExplorers;
let xhrMergedApis;
function fetchBlockExplorers() {
let apiURL = api + '/block_explorers';
xhrBlockExplorers = $.ajax({
url: apiURL,
dataType: 'json',
cache: 'false'
}).done(function(data){
blockExplorers = data;
})
apiURL = api + '/get_apis';
xhrMergedApis = $.ajax({
url: apiURL,
dataType: 'json',
cache: 'false',
}).done(function(data){
mergedApis = data;
loadLiveStats()
})
}
// Initialize
$(function(){
// Load current theme if not default
if (themeCss && themeCss != 'themes/default.css') {
$("head").append("<link rel='stylesheet' href=" + themeCss + ">");
}
// Add support informations to menu
if (typeof telegram !== 'undefined' && telegram) {
$('#menu-content').append('<li><a target="_new" href="'+telegram+'"><i class="fa fa-telegram"></i> <span data-tkey="telegram">Telegram group</span></a></li>');
}
if (typeof discord !== 'undefined' && discord) {
$('#menu-content').append('<li><a target="_new" href="'+discord+'"><i class="fa fa-ticket"></i> <span data-tkey="discord">Discord</span></a></li>');
}
if (typeof email !== 'undefined' && email) {
$('#menu-content').append('<li><a target="_new" href="mailto:'+email+'"><i class="fa fa-envelope"></i> <span data-tkey="contactUs">Contact Us</span></a></li>');
}
if (typeof facebook !== 'undefined' && facebook) {
$('#menu-content').append('<li><a target="_new" href="'+facebook+'"><i class="fa fa-facebook"></i> <span data-tkey="facebook">Facebook</span></a></li>');
}
if (typeof langs !== 'undefined' && langs) {
$('#menu-content').append('<div id="mLangSelector"></div>');
renderLangSelector();
}
if (xhrBlockExplorers)
xhrBlockExplorers.abort();
if (xhrMergedApis)
xhrMergedApis.abort();
fetchBlockExplorers()
});
</script>
</body>
</html>

3108
website/js/common.js Normal file

File diff suppressed because it is too large Load diff

1
website/js/custom.js Normal file
View file

@ -0,0 +1 @@
/* Insert your pool's unique Javascript here */

166
website/lang/ca.json Normal file
View file

@ -0,0 +1,166 @@
{
"miningPool": "Mining Pool",
"dashboard": "Tauler",
"gettingStarted": "Començar",
"yourStats": "Estadístiques personals",
"poolBlocks": "Blocs de la Pool",
"settings": "Ajustaments",
"faq": "FAQ",
"telegram": "Grup de Telegram",
"discord": "Discord",
"contactUs": "Contactar",
"network": "Xarxa",
"pool": "Pool",
"you": "La teva taxa",
"statsUpdated": "Estadístiques actualitzades",
"poolHashrate": "Taxa de la Pool (hash)",
"currentEffort": "Esforç actual",
"networkHashrate": "Taxa de la Xarxa (hash)",
"networkDifficulty": "Dificultat",
"blockchainHeight": "Altura cadena de blocs",
"networkLastReward": "Última recompensa",
"poolMiners": "Miners connectats",
"poolFee": "Tarifa de la Pool",
"minerStats": "Les teves estadístiques i historial de pagaments",
"workerStats": "Estadístiques personals",
"miner": "Miner",
"miners": "Miners",
"minersCount": "miners",
"workers": "Treballadors",
"workersCount": "treballadors",
"workerName": "Nom Treballador",
"lastHash": "Últim hash",
"hashRate": "Taxa (hash)",
"currentHashRate": "Taxa actual (hash)",
"lastShare": "Última acció enviada",
"totalHashes": "Total d'accions enviades",
"top10miners": "Top 10 Miners",
"blocksTotal": "Blocs trobats",
"blockSolvedTime": "Bloc trobat cada",
"blocksMaturityCount": "Maduresa requerida",
"efficiency": "Eficiència",
"averageLuck": "Promitg de sort",
"timeFound": "Data i hora",
"reward": "Recompensa",
"height": "Altura",
"difficulty": "Dificultat",
"blockHash": "Bloc Hash",
"effort": "Esforç",
"blocksFoundLast24": "Blocks found in the last 24 hours",
"blocksFoundLastDays": "Blocks found in the last {DAYS} days",
"payments": "Pagaments",
"paymentsHistory": "Historial de pagaments",
"paymentsTotal": "Total de pagaments",
"paymentsMinimum": "Pagament mínim",
"paymentsInterval": "Interval de pagaments",
"paymentsDenomination": "Unitat de denominació",
"timeSent": "Data",
"transactionHash": "Hash transacció",
"amount": "Import",
"fee": "Tarifa",
"mixin": "Mixin",
"payees": "Beneficiàris",
"pendingBalance": "Balanç pendent",
"totalPaid": "Total pagat",
"payoutEstimate": "Pagament estimat",
"paymentSummarySingle": "El %DATE% has rebut %AMOUNT%",
"paymentSummaryMulti": "El %DATE% has rebut %AMOUNT% en %COUNT% pagaments",
"connectionDetails": "Detalls de connexió",
"cnAlgorithm": "Algoritme",
"miningPoolHost": "Adreça de la Pool",
"username": "Usuari",
"usernameDesc": "La teva adreça del wallet",
"paymentId": "ID de pagament (Exchanges)",
"fixedDiff": "Dificultat fixa",
"address": "adreça",
"addrPaymentId": "IDPagament",
"addrDiff": "diff",
"password": "Contrassenya",
"passwordDesc": "Nom del seu treballador",
"emailNotifications": "Notificacions per E-Mail",
"miningPorts": "Ports de mineria",
"port": "Port",
"portDiff": "Dificultat inicial",
"description": "Descripció",
"miningApps": "Aplicacions de mineria",
"configGeneratorDesc": "Genera la teva configuració personalitzada per minar a la nostra Pool",
"addressField": "Adreça Wallet",
"paymentIdField": "ID de Pagament per a Exchanges (opcional)",
"fixedDiffField": "Dificultat fixa (opcional)",
"workerNameField": "Nom_Treballador",
"emailNotificationsField": "Notificacions per E-Mail (opcional))",
"generateConfig": "Generar configuració",
"appName": "Aplicació",
"appArch": "Arquitectura",
"appDesc": "Característiques",
"download": "Descarregar",
"showConfig": "Veure més",
"market": "Mercat / Calculadora",
"loadingMarket": "Carregant preus del mercat",
"priceIn": "Preu en",
"hashPer": "Hash/",
"estimateProfit": "Beneficis estimats",
"enterYourHashrate": "Entra la teva taxa (hash)",
"perDay": "per dia",
"verificationFields": "Camps de verificació",
"minerVerification": "Per tenir una mica més de seguretat que l'adreça de la cartera és vostra, us demanem que proporcioneu una de les adreces IP que utilitza el vostre miner.",
"minerAddress": "Adreça del moneder",
"minerIP": "Adreça IP del Miner",
"setMinimumPayout": "Estableix el nivell mínim de pagament",
"minerMinPayout": "Si preferiu un nivell de pagament més alt que el predeterminat del grup, aquí podeu canviar-lo per als vostres miners. L'import que indiqueu aquí es convertirà en l'import mínim dels pagaments de la vostra adreça.",
"minimumPayout": "Pagament mínim",
"enableEmailNotifications": "Activar notificacions per de correu electrònic",
"minerEmailNotify": "Aquesta Pool enviarà una notificació per correu electrònic quan es trobi un bloc i quan es produeixi un pagament.",
"emailAddress": "Adreça de correu electrònic",
"noMinerAddress": "No s'ha especificat cap adreça del moneder",
"noMinerIP": "No s'especificat cap adreça IP",
"noPayoutLevel": "No s'ha especificat cap nivell de pagament",
"noEmail": "No s'ha especificat cap adreça de correu electrònic",
"invalidEmail": "S'ha especificat una adreça de correu electrònic no vàlida",
"minerPayoutSet": "Fet! S'ha establert el nivell mínim de pagament",
"notificationEnabled": "Fet! S'han activat les notificacions per correu electrònic",
"notificationDisabled": "Fet! S'han desactivat les notificacions per correu electrònic",
"enterYourAddress": "Introduïu la vostra adreça",
"enterYourMinerIP": "Una adreça IP que utilitzin els miners (qualsevol)",
"enterYourEmail": "Introduïu la vostra adreça de correu electrònic (opcional)",
"lookup": "Cercar",
"searching": "Cercant...",
"loadMore": "Carregar més",
"set": "Establir",
"enable": "Activar",
"disable": "Desactivar",
"status": "Estat",
"updated": "Actualitzat:",
"source": "Origen:",
"error": "Error:",
"na": "N/A",
"estimated": "estimat",
"never": "Mai",
"second": "segon",
"seconds": "segons",
"minute": "minut",
"minutes": "minuts",
"hour": "hora",
"hours": "hores",
"day": "dia",
"days": "dies",
"week": "setmana",
"weeks": "setmanes",
"month": "mes",
"months": "mesos",
"year": "any",
"years": "anys",
"poweredBy": "Powered by",
"openSource": "open sourced under the"
}

168
website/lang/en.json Normal file
View file

@ -0,0 +1,168 @@
{
"miningPool": "Mining Pool",
"dashboard": "Dashboard",
"gettingStarted": "Getting Started",
"yourStats": "Worker Statistics",
"poolBlocks": "Pool Blocks",
"settings": "Settings",
"faq": "FAQ",
"telegram": "Telegram group",
"discord": "Discord",
"contactUs": "Contact Us",
"network": "Network",
"pool": "Pool",
"you": "You",
"statsUpdated": "Stats Updated",
"poolHashrate": "Pool Hash Rate",
"currentEffort": "Current Effort",
"networkHashrate": "Network Hash Rate",
"networkDifficulty": "Difficulty",
"blockchainHeight": "Blockchain Height",
"networkLastReward": "Last Reward",
"poolMiners": "Connected Miners",
"poolFee": "Pool Fee",
"minerStats": "Your Stats & Payment History",
"workerStats": "Workers Statistics",
"miner": "Miner",
"miners": "Miners",
"minersCount": "miners",
"workers": "Workers",
"workersCount": "workers",
"workerName": "Worker Name",
"lastHash": "Last Hash",
"hashRate": "Hash Rate",
"currentHashRate": "Current Hash Rate",
"lastShare": "Last Share Submitted",
"totalHashes": "Total Hashes Submitted",
"top10miners": "Top 10 miners",
"blocksTotal": "Blocks Found",
"blockSolvedTime": "Blocks Found Every",
"blocksMaturityCount": "Maturity Requirement",
"efficiency": "Efficiency",
"averageLuck": "Average Luck",
"timeFound": "Time Found",
"reward": "Reward",
"height": "Height",
"difficulty": "Difficulty",
"blockHash": "Block Hash",
"effort": "Effort",
"blocksFoundLast24": "Blocks found in the last 24 hours",
"blocksFoundLastDays": "Blocks found in the last {DAYS} days",
"payments": "Payments",
"paymentsHistory": "Payments History",
"paymentsTotal": "Total Payments",
"paymentsMinimum": "Minimum Payout",
"paymentsInterval": "Payment Interval",
"paymentsDenomination": "Denomination Unit",
"timeSent": "Time Sent",
"transactionHash": "Transaction Hash",
"amount": "Amount",
"fee": "Fee",
"mixin": "Mixin",
"payees": "Payees",
"pendingBalance": "Pending Balance",
"totalPaid": "Total Paid",
"payoutEstimate": "Current Payout Estimate",
"paymentSummarySingle": "On %DATE% you have received %AMOUNT%",
"paymentSummaryMulti": "On %DATE% you have received %AMOUNT% in %COUNT% payments",
"connectionDetails": "Connection Details",
"miningPoolHost": "Mining Pool Address",
"cnAlgorithm": "Algorithm",
"username": "Username",
"usernameDesc": "This is your wallet address",
"paymentId": "Exchange Payment ID",
"fixedDiff": "Difficulty locking",
"address": "address",
"addrPaymentId": "paymentID",
"addrDiff": "diff",
"password": "Password",
"passwordDesc": "This is your worker name",
"emailNotifications": "Email Notifications",
"miningPorts": "Mining Ports",
"port": "Port",
"portDiff": "Starting Difficulty",
"description": "Description",
"miningApps": "Mining Applications",
"configGeneratorDesc": "Generate your custom configuration to mine on our pool",
"addressField": "Wallet Address",
"paymentIdField": "Payment ID for exchanges (optional)",
"fixedDiffField": "Fixed difficulty (optional)",
"workerNameField": "Worker_Name",
"emailNotificationsField": "Email Notifications (optional)",
"generateConfig": "Generate configuration",
"appName": "App Name",
"appArch": "Architecture",
"appDesc": "Features",
"download": "Download",
"showConfig": "See more",
"market": "Market / Calculator",
"loadingMarket": "Loading market prices",
"priceIn": "Price in",
"hashPer": "Hash/",
"estimateProfit": "Estimate Mining Profits",
"enterYourHashrate": "Enter Your Hash Rate",
"perDay": "per day",
"verificationFields": "Verification fields",
"minerVerification": "In order to get a little more confidence that the wallet address is yours we ask you to give one of the IP addresses that is used by your miner.",
"minerAddress": "Miner Address",
"minerIP": "Miner IP address",
"setMinimumPayout": "Set your minimal payout level",
"minerMinPayout": "If you prefer a higher payout level than the pool's default then this is where you can change it for your miners. The amount you indicate here will become the minimum amount for pool payments to your address.",
"minimumPayout": "Minimum payout",
"enableEmailNotifications": "Enable email notifications",
"minerEmailNotify": "This pool will send out email notification when a block is found and whenever a payout happens.",
"emailAddress": "Email address",
"noMinerAddress": "No miner address specified",
"noMinerIP": "No miner IP address specified",
"noPayoutLevel": "No payout level specified",
"noEmail": "No email address specified",
"invalidEmail": "Invalid email address specified",
"minerPayoutSet": "Done! Your minimum payout level was set",
"notificationEnabled": "Done! Email notifications have been enabled",
"notificationDisabled": "Done! Email notifications have been disabled",
"enterYourAddress": "Enter Your Address",
"enterYourMinerIP": "An IP address your miners use (any)",
"enterYourEmail": "Enter Your E-Mail Address (optional)",
"lookup": "Lookup",
"searching": "Searching...",
"loadMore": "Load more",
"set": "Set",
"enable": "Enable",
"disable": "Disable",
"status": "Status",
"updated": "Updated:",
"source": "Source:",
"error": "Error:",
"na": "N/A",
"estimated": "estimated",
"never": "Never",
"second": "second",
"seconds": "seconds",
"minute": "minute",
"minutes": "minutes",
"hour": "hour",
"hours": "hours",
"day": "day",
"days": "days",
"week": "week",
"weeks": "weeks",
"month": "month",
"months": "months",
"year": "year",
"years": "years",
"poweredBy": "Powered by",
"openSource": "open sourced under the"
}

168
website/lang/es.json Normal file
View file

@ -0,0 +1,168 @@
{
"miningPool": "Mining Pool",
"dashboard": "Panel",
"gettingStarted": "Empezar",
"yourStats": "Estadísticas personales",
"poolBlocks": "Bloques de la Pool",
"settings": "Ajustes",
"faq": "FAQ",
"telegram": "Grupo de Telegram",
"discord": "Discord",
"contactUs": "Contacto",
"network": "Red",
"pool": "Pool",
"you": "Tú Tasa",
"statsUpdated": "Estadísticas actualizadas",
"poolHashrate": "Tasa Pool (hash)",
"currentEffort": "Ronda actual",
"networkHashrate": "Tasa Red (hash)",
"networkDifficulty": "Dificultad",
"blockchainHeight": "Altura",
"networkLastReward": "Última recompensa",
"poolMiners": "Mineros conectados",
"poolFee": "Tarifa Pool",
"minerStats": "Tus estadísticas e historial de pagos",
"workerStats": "Estadísticas personales",
"miner": "Minero",
"miners": "Mineros",
"minersCount": "mineros",
"workers": "Trabajadores",
"workersCount": "trabajadores",
"workerName": "Nombre Trabajador",
"lastHash": "Último hash",
"hashRate": "Tasa (hash)",
"currentHashRate": "Tasa actual (hash)",
"lastShare": "Última acción enviada",
"totalHashes": "Total de acciones enviadas",
"top10miners": "Top 10 Mineros",
"blocksTotal": "Bloques encontrados",
"blockSolvedTime": "Bloque encontrado cada",
"blocksMaturityCount": "Madurez requerida",
"efficiency": "Eficiencia",
"averageLuck": "Promedio de suerte",
"timeFound": "Fecha y hora",
"reward": "Recompensa",
"height": "Altura",
"difficulty": "Dificultad",
"blockHash": "Bloque Hash",
"effort": "Esfuerzo",
"blocksFoundLast24": "Bloques encontrados en las últimas 24 horas",
"blocksFoundLastDays": "Bloques encontrados en los últimos {DAYS} días",
"payments": "Pagos",
"paymentsHistory": "Historial de pagos",
"paymentsTotal": "Total de pagos",
"paymentsMinimum": "Pago mínimo",
"paymentsInterval": "Intervalo de pagos",
"paymentsDenomination": "Unidad de denominación",
"timeSent": "Fecha y hora",
"transactionHash": "Hash transacción",
"amount": "Importe",
"fee": "Tarifa",
"mixin": "Mixin",
"payees": "Beneficiarios",
"pendingBalance": "Balance pendiente",
"totalPaid": "Total pagado",
"payoutEstimate": "Pago estimado",
"paymentSummarySingle": "El %DATE% has recibido %AMOUNT%",
"paymentSummaryMulti": "El %DATE% has recibido %AMOUNT% en %COUNT% pagos",
"connectionDetails": "Detalles de conexión",
"miningPoolHost": "Dirección de la Pool",
"cnAlgorithm": "Algoritmo",
"username": "Usuario",
"usernameDesc": "Tu dirección del wallet",
"paymentId": "ID de pago (Exchanges)",
"fixedDiff": "Dificultad fija",
"address": "dirección",
"addrPaymentId": "IDPago",
"addrDiff": "diff",
"password": "Contraseña",
"passwordDesc": "Nombre de su trabajador",
"emailNotifications": "Notificaciones por E-Mail",
"miningPorts": "Puertos de minería",
"port": "Puerto",
"portDiff": "Dificultad inicial",
"description": "Descripción",
"miningApps": "Aplicaciones de minería",
"configGeneratorDesc": "Genera tu configuración personalizada para minar a nuestra Pool",
"addressField": "Dirección Wallet",
"paymentIdField": "ID de Pago para Exchanges (opcional)",
"fixedDiffField": "Dificultad fija (opcional)",
"workerNameField": "Nombre_Trabajador",
"emailNotificationsField": "Notificaciones por E-Mail (opcional)",
"generateConfig": "Generar configuración",
"appName": "Aplicación",
"appArch": "Arquitectura",
"appDesc": "Características",
"download": "Descargar",
"showConfig": "Ver más",
"market": "Mercado / Calculadora",
"loadingMarket": "Cargando precios del mercado",
"priceIn": "Precio en",
"hashPer": "Hash/",
"estimateProfit": "Beneficios estimados",
"enterYourHashrate": "Entra tu tasa (hash)",
"perDay": "por día",
"verificationFields": "Campos de verificación",
"minerVerification": "Para tener un poco más de seguridad que la dirección de la cartera es vuestra, le pedimos que proporcione una de las direcciones IP que utiliza su minero.",
"minerAddress": "Dirección del monedero",
"minerIP": "Dirección IP del Minero",
"setMinimumPayout": "Establece el nivel mínimo de pago",
"minerMinPayout": "Si prefiere un nivel de pago más alto que el predeterminado del grupo, aquí puede cambiarlo para sus mineros. El importe que indique aquí se convertirá en el importe mínimo de los pagos de su dirección.",
"minimumPayout": "Pago mínimo",
"enableEmailNotifications": "Activar notificaciones por correo electrónico",
"minerEmailNotify": "Esta Pool enviará una notificación por correo electrónico cuando se encuentre un bloque y cuando se produzca un pago.",
"emailAddress": "Dirección de correo electrónico",
"noMinerAddress": "No se ha especificado ninguna dirección del monedero",
"noMinerIP": "No se especificado ninguna dirección IP",
"noPayoutLevel": "No se ha especificado ningún nivel de pago",
"noEmail": "No se ha especificado ninguna dirección de correo electrónico",
"invalidEmail": "Se ha especificado una dirección de correo electrónico no válida",
"minerPayoutSet": "Hecho! Se ha establecido el nivel mínimo de pago",
"notificationEnabled": "Hecho! Se han activado las notificaciones por correo electrónico",
"notificationDisabled": "Hecho! Se han desactivado las notificaciones por correo electrónico",
"enterYourAddress": "Introduzca su dirección",
"enterYourMinerIP": "Una dirección IP que utilicen los mineros (cualquiera)",
"enterYourEmail": "Introduzca su dirección de correo electrónico (opcional)",
"lookup": "Buscar",
"searching": "Buscando...",
"loadMore": "Cargar más",
"set": "Establecer",
"enable": "Activar",
"disable": "Desactivar",
"status": "Estado",
"updated": "Actualizado:",
"source": "Origen:",
"error": "Error:",
"na": "N/A",
"estimated": "estimado",
"never": "Nunca",
"second": "segundo",
"seconds": "segundos",
"minute": "minuto",
"minutes": "minutos",
"hour": "hora",
"hours": "horas",
"day": "día",
"days": "dias",
"week": "semana",
"weeks": "semanas",
"month": "mes",
"months": "meses",
"year": "año",
"years": "años",
"poweredBy": "Powered by",
"openSource": "open sourced bajo "
}

168
website/lang/fr.json Normal file
View file

@ -0,0 +1,168 @@
{
"miningPool": "Mining Pool",
"dashboard": "Tableau de bord",
"gettingStarted": "Comment démarrer",
"yourStats": "Vos statistiques",
"poolBlocks": "Blocs trouvés",
"settings": "Paramètres",
"faq": "FAQ",
"telegram": "Telegram",
"discord": "Discord",
"contactUs": "Nous contacter",
"network": "Réseau",
"pool": "Pool",
"you": "Vous",
"statsUpdated": "Statistiques mises à jour",
"poolHashrate": "Taux de Hash du Pool",
"currentEffort": "Effort actuel",
"networkHashrate": "Taux de Hash du réseau",
"networkDifficulty": "Difficulté",
"blockchainHeight": "Hauteur de la BlockChain",
"networkLastReward": "Dernière récompense",
"poolMiners": "Mineurs connectés",
"poolFee": "Frais du pool",
"minerStats": "Vos statistiques et Historique des paiements",
"workerStats": "Statistiques des travailleurs",
"miner": "Mineur",
"miners": "Mineurs",
"minersCount": "mineurs",
"workers": "Travailleurs",
"workersCount": "travailleurs",
"workerName": "Nom du travailleur",
"lastHash": "Dernier Hash",
"hashRate": "Taux de Hash",
"currentHashRate": "Taux de Hash actuel",
"lastShare": "Dernière transmission",
"totalHashes": "Hashes transmis",
"top10miners": "Top 10 mineurs",
"blocksTotal": "Blocs trouvés",
"blockSolvedTime": "Bloc trouvé chaque",
"blocksMaturityCount": "Maturité requise",
"efficiency": "Efficacité",
"averageLuck": "Chance moyenne",
"timeFound": "Trouvé le",
"reward": "Récompense",
"height": "Hauteur",
"difficulty": "Difficulté",
"blockHash": "Hash du bloc",
"effort": "Effort",
"blocksFoundLast24": "Blocs trouvés dans les 24 dernières heures",
"blocksFoundLastDays": "Blocs trouvés dans les derniers {DAYS} jours",
"payments": "Paiements",
"paymentsHistory": "Historique des paiements",
"paymentsTotal": "Nombre de paiements",
"paymentsMinimum": "Minimum avant paiement",
"paymentsInterval": "Intervale de paiement",
"paymentsDenomination": "Unité de dénomination",
"timeSent": "Envoyé le",
"transactionHash": "Hash de transaction",
"amount": "Montant",
"fee": "Frais",
"mixin": "Mixin",
"payees": "Payés",
"pendingBalance": "Balance en attente",
"totalPaid": "Total payé",
"payoutEstimate": "Estimation de paiement",
"paymentSummarySingle": "Le %DATE% vous avez reçu %AMOUNT%",
"paymentSummaryMulti": "Le %DATE% vous avez reçu %AMOUNT% en %COUNT% paiements",
"connectionDetails": "Détails de connexion",
"miningPoolHost": "Adresse du pool",
"cnAlgorithm": "Algorithme",
"username": "Nom d'utilisateur",
"usernameDesc": "C'est l'adresse de votre wallet",
"paymentId": "ID de paiement de l'exchange",
"fixedDiff": "Difficulté fixe",
"address": "adresse",
"addrPaymentId": "idPaiement",
"addrDiff": "diff",
"password": "Mot de passe",
"passwordDesc": "C'est l'identifiant de votre travailleur",
"emailNotifications": "Notifications par email",
"miningPorts": "Ports de minage",
"port": "Port",
"portDiff": "Difficulté de départ",
"description": "Description",
"miningApps": "Applications de minage",
"configGeneratorDesc": "Générer votre configuration personalisée pour miner sur notre pool",
"addressField": "Adresse de votre wallet",
"paymentIdField": "ID de paiement pour l'exchange (optionnel)",
"fixedDiffField": "Difficulté fixe (optionnel)",
"workerNameField": "Nom_du_Travailleur",
"emailNotificationsField": "Notifications par Email (optionnel)",
"generateConfig": "Générer la configuration",
"appName": "Nom de l'App",
"appArch": "Architecture",
"appDesc": "Fonctionalités",
"download": "Télécharger",
"showConfig": "Afficher",
"market": "Marché et calculateur",
"loadingMarket": "Chargement des prix du marché",
"priceIn": "Prix en",
"hashPer": "Hash/",
"estimateProfit": "Estimation des profits de minage",
"enterYourHashrate": "Entrez votre taux de Hash",
"perDay": "par jour",
"verificationFields": "Champs de vérification",
"minerVerification": "Afin de nous assurer que l'adresse du mineur est bien la vôtre, nous vous demandons d'entrer une adresse IP utilisée par votre mineur.",
"minerAddress": "Adresse du mineur",
"minerIP": "Adresse IP du mineur",
"setMinimumPayout": "Configurer votre niveau de paiement minimum",
"minerMinPayout": "Si vous préférez un montant de paiement minimum plus élevé que celui du pool c'est ici que vous pouvez le changer pour vos mineurs. Le montant que vous indiquerez ici deviendra le montant minimum pour les paiements à votre adresse.",
"minimumPayout": "Paiement minimum",
"enableEmailNotifications": "Activer les notifications par email",
"minerEmailNotify": "Ce pool peut vous envoyer une notification par email lorsqu'un bloc est trouvé ou bien lorsqu'un paiement vous est transmis.",
"emailAddress": "Adresse email",
"noMinerAddress": "Aucune adresse de mineur spécifiée",
"noMinerIP": "Aucune adresse IP pour votre mineur spécifiée",
"noPayoutLevel": "Aucun niveau de paiement spécifié",
"noEmail": "Aucune adresse email spécifiée",
"invalidEmail": "L'adresse email spécifiée est invalide",
"minerPayoutSet": "Fait! Votre niveau de paiement minimum a été configuré",
"notificationEnabled": "Fait! Les notifications par email ont été activées",
"notificationDisabled": "Fait! Les notifications par email ont été désactivées",
"enterYourAddress": "Entrez votre adresse",
"enterYourMinerIP": "Une adresse IP utilisée par votre mineur (peu importe)",
"enterYourEmail": "Votre adresse email",
"lookup": "Chercher",
"searching": "Recherche...",
"loadMore": "Charger plus",
"set": "Configurer",
"enable": "Activer",
"disable": "Désactiver",
"status": "Statut",
"updated": "Mis à jour:",
"source": "Source:",
"error": "Erreur:",
"na": "N/D",
"estimated": "estimé",
"never": "Jamais",
"second": "seconde",
"seconds": "secondes",
"minute": "minute",
"minutes": "minutes",
"hour": "heure",
"hours": "heures",
"day": "jour",
"days": "jours",
"week": "semaine",
"weeks": "weeks",
"month": "mois",
"months": "mois",
"year": "année",
"years": "années",
"poweredBy": "Propulsé par",
"openSource": "et libre de droits sous licence"
}

168
website/lang/it.json Normal file
View file

@ -0,0 +1,168 @@
{
"miningPool": "Mining Pool",
"dashboard": "Dashboard",
"gettingStarted": "Come Iniziare",
"yourStats": "Statistiche del Worker",
"poolBlocks": "Pool Blocks",
"settings": "Impostazioni",
"faq": "FAQ",
"telegram": "Gruppo Telegram",
"discord": "Discord",
"contactUs": "Contattaci",
"network": "Rete",
"pool": "Pool",
"you": "Tu",
"statsUpdated": "Stats Aggiornati",
"poolHashrate": "Pool Hash Rate",
"currentEffort": "Current Effort",
"networkHashrate": "Network Hash Rate",
"networkDifficulty": "Difficoltà",
"blockchainHeight": "Blockchain Height",
"networkLastReward": "Ultimo Reward",
"poolMiners": "Miners Connessi",
"poolFee": "Pool Fee",
"minerStats": "Stats Personali & Storia dei tuoi pagamenti",
"workerStats": "Statistiche del Worker",
"miner": "Miner",
"miners": "Miners",
"minersCount": "miners",
"workers": "Workers",
"workersCount": "workers",
"workerName": "Worker Name",
"lastHash": "Ultimo Hash",
"hashRate": "Hash Rate",
"currentHashRate": "Attuale Hash Rate",
"lastShare": "Ultimo Share Trasmesso",
"totalHashes": "Totale Hashes Trasmessi",
"top10miners": "Top 10 miners",
"blocksTotal": "Blocchi trovati",
"blockSolvedTime": "Blocco trovato ogni",
"blocksMaturityCount": "Maturità richiesta",
"efficiency": "Efficenza",
"averageLuck": "Fortuna",
"timeFound": "Orario trovato",
"reward": "Ricompensa",
"height": "Height",
"difficulty": "Difficoltà",
"blockHash": "Block Hash",
"effort": "Effort",
"blocksFoundLast24": "Blocks found in the last 24 hours",
"blocksFoundLastDays": "Blocks found in the last {DAYS} days",
"payments": "Pagamenti",
"paymentsHistory": "Storia Pagamenti",
"paymentsTotal": "Pagamenti totali",
"paymentsMinimum": "Minimo pagamento",
"paymentsInterval": "intervallo pagamento",
"paymentsDenomination": "Unità di denominazione",
"timeSent": "Orario Inviato",
"transactionHash": "Transazione Hash",
"amount": "Quantità",
"fee": "Fee",
"mixin": "Mixin",
"payees": "Pagati",
"pendingBalance": "In sospeso",
"totalPaid": "Totale pagato",
"payoutEstimate": "Stima del pagamento corrente",
"paymentSummarySingle": "In %DATE% hai ricevuto %AMOUNT%",
"paymentSummaryMulti": "In %DATE% hai ricevuto %AMOUNT% in %COUNT% pagamenti",
"connectionDetails": "Detagli Connessione",
"miningPoolHost": "Mining Pool Address",
"cnAlgorithm": "Algorithmo",
"username": "Username",
"usernameDesc": "questo è L'indrizzo del wallet",
"paymentId": "Exchange Payment ID",
"fixedDiff": "Difficoltà di blocco",
"address": "indrizzo",
"addrPaymentId": "paymentID",
"addrDiff": "diff",
"password": "Password",
"passwordDesc": "Questo è il nome del Worker",
"emailNotifications": "Notifiche Email",
"miningPorts": "Mining Ports",
"port": "Port",
"portDiff": "Difficoltà avvio",
"description": "Descrizione",
"miningApps": "Applicazioni Mining",
"configGeneratorDesc": "Genera La tua configurazione per minare sulla nostra pool",
"addressField": "Indrizzo wallet",
"paymentIdField": "Pagamento ID per exchanges (optionale)",
"fixedDiffField": "Fixed difficulty (optionale)",
"workerNameField": "Worker_Name",
"emailNotificationsField": "Notifiche email (optionale)",
"generateConfig": "Genera configuratione",
"appName": "App Name",
"appArch": "Architettura",
"appDesc": "Features",
"download": "Download",
"showConfig": "Vedi",
"market": "Market / Calculatoe",
"loadingMarket": "Loading market prices",
"priceIn": "Price in",
"hashPer": "Hash/",
"estimateProfit": "Stima dei profitti",
"enterYourHashrate": "Inserisci il tuo Hashrate",
"perDay": "al giorno",
"verificationFields": "Campi di verifica",
"minerVerification": "Per avere un po 'più di fiducia che l'indirizzo del tuo wallet è tuo ti chiediamo di dare uno degli indirizzi IP che viene utilizzato dal tuo miners.",
"minerAddress": "Miner Address",
"minerIP": "Miner IP address",
"setMinimumPayout": "Inserisci il pagamento minimo ",
"minerMinPayout": "Se preferisci un livello di pagamento più alto rispetto al valore predefinito del pool, è qui che puoi cambiarlo per i tuoi miner. L'importo indicato qui diventerà l'importo minimo per i pagamenti del pool al tuo indirizzo.",
"minimumPayout": "Payout Minimo",
"enableEmailNotifications": "Abilitare notifiche email",
"minerEmailNotify": "Questa pool invierà una notifica via email quando viene trovato un blocco e ogni volta che si verifica un pagamento.",
"emailAddress": "Email address",
"noMinerAddress": "Nessun indrizzo wallet indicato",
"noMinerIP": "Nessun indrizzo ip indicato del miner",
"noPayoutLevel": "Nessun livello specificato",
"noEmail": "Nessun indirizzo email specificato",
"invalidEmail": "Indrizzo email invalido",
"minerPayoutSet": "Fatto! Il tuo livello di pagamento minimo è stato impostato",
"notificationEnabled": "Fatto! Le notifiche email sono state abilitate",
"notificationDisabled": "Fatto! Le notifiche email sono state disabilitate",
"enterYourAddress": "Inserisci il tuo indrizzo",
"enterYourMinerIP": "Un indrizzo ip di qualsiasi tuo miner",
"enterYourEmail": "Inserisci il tuo indrizzo email (optionale)",
"lookup": "Consulto..",
"searching": "Cerco...",
"loadMore": "Carica Di più",
"set": "imposta",
"enable": "abilita",
"disable": "Disabilita",
"status": "Stato",
"updated": "Aggiornato:",
"source": "Fonte:",
"error": "Errore:",
"na": "N/A",
"estimated": "stimato",
"never": "mai",
"second": "secondo",
"seconds": "secondi",
"minute": "minuto",
"minutes": "minuti",
"hour": "ora",
"hours": "ore",
"day": "giorno",
"days": "giorni",
"week": "settimana",
"weeks": "settimane",
"month": "mese",
"months": "mesi",
"year": "anno",
"years": "anni",
"poweredBy": "Powered by",
"openSource": "open sourced under the"
}

167
website/lang/ko.json Normal file
View file

@ -0,0 +1,167 @@
{
"miningPool": "Mining Pool",
"dashboard": "풀상황",
"gettingStarted": "도움말:시작",
"yourStats": "마이너(워커) 상황",
"poolBlocks": "풀블럭상태",
"settings": "설정",
"telegram": "텔레그램연결",
"discord": "Discord",
"contactUs": "문의하기",
"network": "네트워크",
"pool": "풀",
"you": "you",
"statsUpdated": "업데이트",
"poolHashrate": "풀의 해시레이트",
"currentEffort": "Current Effort",
"networkHashrate": "네크워크 해시레이트",
"networkDifficulty": "난이도",
"blockchainHeight": "블록체인 높이",
"networkLastReward": "최근 보상량",
"poolMiners": "연결된 마이너수",
"poolFee": "풀 수수료",
"minerStats": "마이너 상태와 지급상황",
"workerStats": "워커 상태",
"miner": "Miner",
"miners": "Miners",
"minersCount": "miners",
"workers": "Workers",
"workersCount": "workers",
"workerName": "Worker Name",
"lastHash": "Last Hash",
"hashRate": "Hash Rate",
"currentHashRate": "Current Hash Rate",
"lastShare": "Last Share Submitted",
"totalHashes": "Total Hashes Submitted",
"top10miners": "상위 10 채굴자",
"blocksTotal": "블록 발견",
"blockSolvedTime": "Blocks Found Every",
"blocksMaturityCount": "적립되기전 블럭수량",
"efficiency": "Efficiency",
"averageLuck": "Average Luck",
"timeFound": "블럭 발견시작",
"reward": "보상",
"height": "블럭번호",
"difficulty": "난이도",
"blockHash": "블럭 해시",
"effort": "풀의노력",
"blocksFoundLast24": "Blocks found in the last 24 hours",
"blocksFoundLastDays": "Blocks found in the last {DAYS} days",
"payments": "출금상황",
"paymentsHistory": "출금 내역",
"paymentsTotal": "전체 출금 수",
"paymentsMinimum": "최소 출금 수량",
"paymentsInterval": "출금 주기",
"paymentsDenomination": "최소 출금 단위",
"timeSent": "출금 시작",
"transactionHash": "트랜잭션 아이디",
"amount": "수량",
"fee": "수수료",
"mixin": "Mixin",
"payees": "출금대상수",
"pendingBalance": "적립 대기",
"totalPaid": "전체 출금",
"payoutEstimate": "Current Payout Estimate",
"paymentSummarySingle": "On %DATE% you have received %AMOUNT%",
"paymentSummaryMulti": "On %DATE% you have received %AMOUNT% in %COUNT% payments",
"connectionDetails": "연결정보",
"miningPoolHost": "풀 접속주소",
"cnAlgorithm": "채굴 알고리즘",
"username": "Username",
"usernameDesc": "This is your wallet address",
"paymentId": "거래소 Payment ID",
"fixedDiff": "고정 난이도 설정",
"address": "지갑주소",
"addrPaymentId": "paymentID",
"addrDiff": "난이도",
"password": "암호",
"passwordDesc": "워커 이름 설정",
"emailNotifications": "Email Notifications",
"miningPorts": "채굴 포트",
"port": "접속포트",
"portDiff": "시작 난이도",
"description": "설명",
"miningApps": "마이닝 프로그램",
"configGeneratorDesc": "Generate your custom configuration to mine on our pool",
"addressField": "지갑 주소",
"paymentIdField": "거래소용 Payment ID (optional)",
"fixedDiffField": "고정난이도 (optional)",
"workerNameField": "워커 이름",
"emailNotificationsField": "Email Notifications (optional)",
"generateConfig": "설정 예제 생성",
"appName": "프로그램 이름",
"appArch": "Architecture",
"appDesc": "Features",
"download": "Download",
"showConfig": "See more",
"market": "시장가격 / 채굴량계산기",
"loadingMarket": "Loading market prices",
"priceIn": "Price in",
"hashPer": "Hash/",
"estimateProfit": "Estimate Mining Profits",
"enterYourHashrate": "Enter Your Hash Rate",
"perDay": "per day",
"verificationFields": "Verification fields",
"minerVerification": "In order to get a little more confidence that the wallet address is yours we ask you to give one of the IP addresses that is used by your miner.",
"minerAddress": "Miner Address",
"minerIP": "Miner IP address",
"setMinimumPayout": "Set your minimal payout level",
"minerMinPayout": "If you prefer a higher payout level than the pool's default then this is where you can change it for your miners. The amount you indicate here will become the minimum amount for pool payments to your address.",
"minimumPayout": "Minimum payout",
"enableEmailNotifications": "Enable email notifications",
"minerEmailNotify": "This pool will send out email notification when a block is found and whenever a payout happens.",
"emailAddress": "Email address",
"noMinerAddress": "No miner address specified",
"noMinerIP": "No miner IP address specified",
"noPayoutLevel": "No payout level specified",
"noEmail": "No email address specified",
"invalidEmail": "Invalid email address specified",
"minerPayoutSet": "Done! Your minimum payout level was set",
"notificationEnabled": "Done! Email notifications have been enabled",
"notificationDisabled": "Done! Email notifications have been disabled",
"enterYourAddress": "Enter Your Address",
"enterYourMinerIP": "An IP address your miners use (any)",
"enterYourEmail": "Enter Your E-Mail Address (optional)",
"lookup": "Lookup",
"searching": "Searching...",
"loadMore": "Load more",
"set": "Set",
"enable": "Enable",
"disable": "Disable",
"status": "Status",
"updated": "Updated:",
"source": "Source:",
"error": "Error:",
"na": "N/A",
"estimated": "estimated",
"never": "Never",
"second": "second",
"seconds": "seconds",
"minute": "minute",
"minutes": "minutes",
"hour": "hour",
"hours": "hours",
"day": "day",
"days": "days",
"week": "week",
"weeks": "weeks",
"month": "month",
"months": "months",
"year": "year",
"years": "years",
"poweredBy": "Powered by",
"openSource": "open sourced under the"
}

View file

@ -0,0 +1 @@
var langs = { 'en': 'English', 'es': 'Español', 'fr': 'Français', 'it': 'Italiano', 'ru': 'Русский', 'ca': 'Català', 'ko': '한국어', 'zh-CN': '简体中文' };

182
website/lang/ru.json Normal file
View file

@ -0,0 +1,182 @@
{
"miningPool": "Майнинг пул",
"dashboard": "Главная",
"gettingStarted": "Присоединиться",
"yourStats": "Статистика",
"poolBlocks": "Блоки пула",
"settings": "Настройки",
"faq": "FAQ",
"telegram": "Группа Telegram",
"discord": "Discord",
"contactUs": "Почта",
"network": "Сеть",
"pool": "Пул",
"you": "Вы",
"statsUpdated": "Статистика обновлена",
"poolHashrate": "Скорость пула",
"currentEffort": "Сложность раунда",
"networkHashrate": "Скорость сети",
"networkDifficulty": "Сложность",
"blockchainHeight": "№ последнего блока",
"networkLastReward": "Последнее вознаграждение",
"poolMiners": "Пользователи пула",
"poolFee": "Комиссия пула",
"minerStats": "Ваша статистика и история платежей",
"workerStats": "Статистика ферм",
"miner": "Miner",
"miners": "Пользователи",
"minersCount": "miners",
"workers": "Фермы",
"workersCount": "фермы",
"workerName": "Имя фермы",
"lastHash": "Последний хеш",
"hashRate": "Скорость",
"currentHashRate": "Текущая скорость",
"lastShare": "Последняя шара принята",
"totalHashes": "Всего принято хешей",
"top10miners": "Лучшие 10 майнеров",
"blocksTotal": "Найдено блоков",
"blockSolvedTime": "Время нахождения блока",
"blocksMaturityCount": "Требование подтверждения",
"efficiency": "Эффективность",
"averageLuck": "Средняя удача",
"timeFound": "Время нахождения",
"reward": "Выплата",
"height": "№ блока",
"difficulty": "Сложность",
"blockHash": "Хеш блока",
"effort": "Усилие",
"blocksFoundLast24": "Блоки найдены за последние 24 часа",
"blocksFoundLastDays": "Блоки найдены за последние {DAYS} дней",
"propSoloConnectedMiners": "PROP / SOLO Подключенные шахтеры",
"payments": "Платежи",
"paymentsHistory": "История платежей",
"paymentsTotal": "Всего платежей",
"paymentsMinimum": "Минимальный платёж",
"paymentsInterval": "Интервал платежей",
"paymentsDenomination": "Единица измерения",
"timeSent": "Время отправления",
"transactionHash": "Хеш транзакции",
"amount": "Сумма",
"fee": "Комиссия",
"mixin": "Mixin",
"payees": "Получателей",
"pendingBalance": "Ожидающий баланс",
"totalPaid": "Всего выплачено",
"payoutEstimate": "Текущая оценка выплат",
"connectionDetails": "Детали подключения",
"miningPoolHost": "Адрес майнинг пула",
"cnAlgorithm": "Алгоритм",
"username": "Имя пользователя",
"usernameDesc": "Это адрес вашего кошелька",
"paymentId": "Биржевой Payment ID",
"fixedDiff": "Фиксированная сложность",
"address": "address",
"addrPaymentId": "paymentID",
"addrDiff": "diff",
"password": "Пароль",
"passwordDesc": "Это имя вашей фермы в статистике",
"emailNotifications": "Уведомление по почте",
"miningPorts": "Порты для майнинга",
"port": "Порт",
"portDiff": "Стартовая сложность",
"description": "Описание",
"miningApps": "Программы для майнинга",
"configGeneratorDesc": "Создайте свою собственную конфигурацию для этого пула",
"addressField": "Адрес вашего кошелька",
"paymentIdField": "Payment ID для биржи (опция)",
"fixedDiffField": "Фиксированная сложность (опция)",
"workerNameField": "Имя_Фермы",
"emailNotificationsField": "Уведомление по почте (опция)",
"generateConfig": "Создать конфигурацию",
"appName": "Программа",
"appArch": "Архитектура",
"appDesc": "Особенности",
"download": "Скачать",
"showConfig": "Посмотреть",
"market": "Рынок / Калькулятор",
"loadingMarket": "Загрузка стоимости",
"priceIn": "Стоимость в",
"hashPer": "Стоимость хеша/",
"estimateProfit": "Рассчёт прибыли",
"enterYourHashrate": "Введите вашу скорость",
"perDay": "/в день",
"verificationFields": "Проверочные данные",
"minerVerification": "Чтобы быть уверенным в том, что адрес кошелька принадлежит вам, мы просим вас указать один из IP-адресов, который используется вашими фермами.",
"minerAddress": "Ваш кошелёк",
"minerIP": "IP адрес фермы",
"setMinimumPayout": "Установите минимальный уровень выплат",
"minerMinPayout": "Вы можете установить минимальный порог оплаты, если предпочитаете более высокий уровень выплат, чем значение по умолчанию. Сумма, которую вы здесь укажете, станет минимальной суммой для платежей пула на ваш адрес.",
"minimumPayout": "Минимальная выплата",
"enableEmailNotifications": "Включить уведомление по почте",
"minerEmailNotify": "Пул отправит уведомление по электронной почте, когда будет найден блок или когда произведёт выплату.",
"emailAddress": "E-mail адрес",
"noMinerAddress": "Вы не ввели свой кошелёк",
"noMinerIP": "Вы не ввели IP адрес фермы",
"noPayoutLevel": "Вы не ввели уровень оплаты",
"noEmail": "Вы не ввели e-mail адрес",
"invalidEmail": "Не правильный e-mail адрес",
"minerPayoutSet": "Минимальный уровень оплаты успешно установлен !",
"notificationEnabled": "Уведомления по электронной почте успешно включены !",
"notificationDisabled": "Уведомления по электронной почте успешно выключены !",
"enterYourAddress": "Введите адрес своего кошелька",
"enterYourMinerIP": "IP-адрес, который используют ваши фермы",
"enterYourEmail": "Введите свой E-Mail адрес (опция)",
"lookup": "Посмотреть",
"searching": "Поиск ...",
"loadMore": "Загрузить ещё",
"set": "Установить",
"enable": "Включить",
"disable": "Выключить",
"status": "Статус",
"updated": "Обновлено:",
"source": "Source:",
"error": "Ошибка:",
"na": "N/A",
"estimated": "примерно",
"never": "Не найден",
"second": "секунда",
"seconds": "секунд",
"minute": "минута",
"minutes": "минут",
"hour": "час",
"hours": "часов",
"day": "день",
"days": "дней",
"week": "неделя",
"weeks": "недель",
"month": "месяц",
"months": "месяцев",
"year": "год",
"years": "года",
"timeagoPrefixAgo": null,
"timeagoPrefixFromNow": null,
"timeagoSuffixAgo": "назад",
"timeagoSuffixFromNow": "from now",
"timeagoSeconds": "меньше минуты",
"timeagoMinute": "около минуты",
"timeagoMinutes": "%d минут",
"timeagoHour": "about an hour",
"timeagoHours": "about %d hours",
"timeagoDay": " день",
"timeagoDays": "%d дней",
"timeagoMonth": "about месяц",
"timeagoMonths": "%d месяцев",
"timeagoYear": "about год",
"timeagoYears": "%d лет",
"poweredBy": "Powered by",
"openSource": "open sourced under the"
}

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Afrikaans
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "gelede",
suffixFromNow: "van nou af",
seconds: "%d sekondes",
minute: "1 minuut",
minutes: "%d minute",
hour: "1 uur",
hours: "%d ure",
day: "1 dag",
days: "%d dae",
month: "1 maand",
months: "%d maande",
year: "1 jaar",
years: "%d jaar",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Amharic
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "በፊት",
suffixFromNow: "በኋላ",
seconds: "ከአንድ ደቂቃ በታች",
minute: "ከአንድ ደቂቃ ገደማ",
minutes: "ከ%d ደቂቃ",
hour: "ከአንድ ሰዓት ገደማ",
hours: "ከ%d ሰዓት ገደማ",
day: "ከአንድ ቀን",
days: "ከ%d ቀን",
month: "ከአንድ ወር ገደማ",
months: "ከ%d ወር",
year: "ከአንድ ዓመት ገደማ",
years: "ከ%d ዓመት",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,104 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
function numpf(n, a) {
return a[plural=n===0 ? 0 : n===1 ? 1 : n===2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5];
}
jQuery.timeago.settings.strings = {
prefixAgo: "منذ",
prefixFromNow: "بعد",
suffixAgo: null,
suffixFromNow: null, // null OR "من الآن"
second: function(value) { return numpf(value, [
'أقل من ثانية',
'ثانية واحدة',
'ثانيتين',
'%d ثوانٍ',
'%d ثانية',
'%d ثانية']); },
seconds: function(value) { return numpf(value, [
'أقل من ثانية',
'ثانية واحدة',
'ثانيتين',
'%d ثوانٍ',
'%d ثانية',
'%d ثانية']); },
minute: function(value) { return numpf(value, [
'أقل من دقيقة',
'دقيقة واحدة',
'دقيقتين',
'%d دقائق',
'%d دقيقة',
'دقيقة']); },
minutes: function(value) { return numpf(value, [
'أقل من دقيقة',
'دقيقة واحدة',
'دقيقتين',
'%d دقائق',
'%d دقيقة',
'دقيقة']); },
hour: function(value) { return numpf(value, [
'أقل من ساعة',
'ساعة واحدة',
'ساعتين',
'%d ساعات',
'%d ساعة',
'%d ساعة']); },
hours: function(value) { return numpf(value, [
'أقل من ساعة',
'ساعة واحدة',
'ساعتين',
'%d ساعات',
'%d ساعة',
'%d ساعة']); },
day: function(value) { return numpf(value, [
'أقل من يوم',
'يوم واحد',
'يومين',
'%d أيام',
'%d يومًا',
'%d يوم']); },
days: function(value) { return numpf(value, [
'أقل من يوم',
'يوم واحد',
'يومين',
'%d أيام',
'%d يومًا',
'%d يوم']); },
month: function(value) { return numpf(value, [
'أقل من شهر',
'شهر واحد',
'شهرين',
'%d أشهر',
'%d شهرًا',
'%d شهر']); },
months: function(value) { return numpf(value, [
'أقل من شهر',
'شهر واحد',
'شهرين',
'%d أشهر',
'%d شهرًا',
'%d شهر']); },
year: function(value) { return numpf(value, [
'أقل من عام',
'عام واحد',
'%d عامين',
'%d أعوام',
'%d عامًا']);
},
years: function(value) { return numpf(value, [
'أقل من عام',
'عام واحد',
'عامين',
'%d أعوام',
'%d عامًا',
'%d عام']);}
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Azerbaijani
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: 'əvvəl',
suffixFromNow: 'sonra',
seconds: 'saniyələr',
minute: '1 dəqiqə',
minutes: '%d dəqiqə',
hour: '1 saat',
hours: '%d saat',
day: '1 gün',
days: '%d gün',
month: '1 ay',
months: '%d ay',
year: '1 il',
years: '%d il',
wordSeparator: '',
numbers: []
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Bulgarian
jQuery.timeago.settings.strings = {
prefixAgo: "преди",
prefixFromNow: "след",
suffixAgo: null,
suffixFromNow: null,
seconds: "по-малко от минута",
minute: "една минута",
minutes: "%d минути",
hour: "един час",
hours: "%d часа",
day: "един ден",
days: "%d дни",
month: "един месец",
months: "%d месеца",
year: "една година",
years: "%d години"
};
}));

View file

@ -0,0 +1,55 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Bosnian
var numpf = function(n, f, s, t) {
var n10;
n10 = n % 10;
if (n10 === 1 && (n === 1 || n > 20)) {
return f;
} else if (n10 > 1 && n10 < 5 && (n > 20 || n < 10)) {
return s;
} else {
return t;
}
};
jQuery.timeago.settings.strings = {
prefixAgo: "prije",
prefixFromNow: "za",
suffixAgo: null,
suffixFromNow: null,
second: "sekund",
seconds: function(value) {
return numpf(value, "%d sekund", "%d sekunde", "%d sekundi");
},
minute: "oko minut",
minutes: function(value) {
return numpf(value, "%d minut", "%d minute", "%d minuta");
},
hour: "oko sat",
hours: function(value) {
return numpf(value, "%d sat", "%d sata", "%d sati");
},
day: "oko jednog dana",
days: function(value) {
return numpf(value, "%d dan", "%d dana", "%d dana");
},
month: "mjesec dana",
months: function(value) {
return numpf(value, "%d mjesec", "%d mjeseca", "%d mjeseci");
},
year: "prije godinu dana ",
years: function(value) {
return numpf(value, "%d godinu", "%d godine", "%d godina");
},
wordSeparator: " "
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Catalan
jQuery.timeago.settings.strings = {
prefixAgo: "fa",
prefixFromNow: "d'aquí",
suffixAgo: null,
suffixFromNow: null,
seconds: "menys d'un minut",
minute: "un minut",
minutes: "%d minuts",
hour: "una hora",
hours: "%d hores",
day: "un dia",
days: "%d dies",
month: "un mes",
months: "%d mesos",
year: "un any",
years: "%d anys",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,34 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Czech
(function() {
function f(n, d, a) {
return a[d>=0 ? 0 : a.length===2 || n<5 ? 1 : 2];
}
jQuery.timeago.settings.strings = {
prefixAgo: 'před',
prefixFromNow: 'za',
suffixAgo: null,
suffixFromNow: null,
seconds: function(n, d) {return f(n, d, ['méně než minutou', 'méně než minutu']);},
minute: function(n, d) {return f(n, d, ['minutou', 'minutu']);},
minutes: function(n, d) {return f(n, d, ['%d minutami', '%d minuty', '%d minut']);},
hour: function(n, d) {return f(n, d, ['hodinou', 'hodinu']);},
hours: function(n, d) {return f(n, d, ['%d hodinami', '%d hodiny', '%d hodin']);},
day: function(n, d) {return f(n, d, ['%d dnem', '%d den']);},
days: function(n, d) {return f(n, d, ['%d dny', '%d dny', '%d dní']);},
month: function(n, d) {return f(n, d, ['%d měsícem', '%d měsíc']);},
months: function(n, d) {return f(n, d, ['%d měsíci', '%d měsíce', '%d měsíců']);},
year: function(n, d) {return f(n, d, ['%d rokem', '%d rok']);},
years: function(n, d) {return f(n, d, ['%d lety', '%d roky', '%d let']);}
};
})();
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Welsh
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "yn ôl",
suffixFromNow: "o hyn",
seconds: "llai na munud",
minute: "am funud",
minutes: "%d munud",
hour: "tua awr",
hours: "am %d awr",
day: "y dydd",
days: "%d diwrnod",
month: "tua mis",
months: "%d mis",
year: "am y flwyddyn",
years: "%d blynedd",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Danish
jQuery.timeago.settings.strings = {
prefixAgo: "for",
prefixFromNow: "om",
suffixAgo: "siden",
suffixFromNow: "",
seconds: "mindre end et minut",
minute: "ca. et minut",
minutes: "%d minutter",
hour: "ca. en time",
hours: "ca. %d timer",
day: "en dag",
days: "%d dage",
month: "ca. en måned",
months: "%d måneder",
year: "ca. et år",
years: "%d år"
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// German
jQuery.timeago.settings.strings = {
prefixAgo: "vor",
prefixFromNow: "in",
suffixAgo: "",
suffixFromNow: "",
seconds: "wenigen Sekunden",
minute: "etwa einer Minute",
minutes: "%d Minuten",
hour: "etwa einer Stunde",
hours: "%d Stunden",
day: "etwa einem Tag",
days: "%d Tagen",
month: "etwa einem Monat",
months: "%d Monaten",
year: "etwa einem Jahr",
years: "%d Jahren"
};
}));

View file

@ -0,0 +1,32 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
/**
* Dhivehi time in Thaana for timeago.js
**/
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ކުރިން",
suffixFromNow: "ފަހުން",
seconds: "ސިކުންތުކޮޅެއް",
minute: "މިނިޓެއްވަރު",
minutes: "%d މިނިޓު",
hour: "ގަޑިއެއްވަރު",
hours: "ގާތްގަނޑަކަށް %d ގަޑިއިރު",
day: "އެއް ދުވަސް",
days: "މީގެ %d ދުވަސް",
month: "މަހެއްވަރު",
months: "މީގެ %d މަސް",
year: "އަހަރެއްވަރު",
years: "މީގެ %d އަހަރު",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Greek
jQuery.timeago.settings.strings = {
prefixAgo: "πριν",
prefixFromNow: "σε",
suffixAgo: "",
suffixFromNow: "",
seconds: "λιγότερο από ένα λεπτό",
minute: "περίπου ένα λεπτό",
minutes: "%d λεπτά",
hour: "περίπου μία ώρα",
hours: "περίπου %d ώρες",
day: "μία μέρα",
days: "%d μέρες",
month: "περίπου ένα μήνα",
months: "%d μήνες",
year: "περίπου ένα χρόνο",
years: "%d χρόνια"
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// English (Template)
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Spanish
jQuery.timeago.settings.strings = {
prefixAgo: "hace",
prefixFromNow: "dentro de",
suffixAgo: "",
suffixFromNow: "",
seconds: "menos de un minuto",
minute: "un minuto",
minutes: "unos %d minutos",
hour: "una hora",
hours: "%d horas",
day: "un día",
days: "%d días",
month: "un mes",
months: "%d meses",
year: "un año",
years: "%d años"
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Estonian
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "tagasi",
suffixFromNow: "pärast",
seconds: function(n, d) { return d < 0 ? "vähem kui minuti aja" : "vähem kui minut aega"; },
minute: function(n, d) { return d < 0 ? "umbes minuti aja" : "umbes minut aega"; },
minutes: function(n, d) { return d < 0 ? "%d minuti" : "%d minutit"; },
hour: function(n, d) { return d < 0 ? "umbes tunni aja" : "umbes tund aega"; },
hours: function(n, d) { return d < 0 ? "%d tunni" : "%d tundi"; },
day: function(n, d) { return d < 0 ? "umbes päeva" : "umbes päev"; },
days: "%d päeva",
month: function(n, d) { return d < 0 ? "umbes kuu aja" : "umbes kuu aega"; },
months: function(n, d) { return d < 0 ? "%d kuu" : "%d kuud"; },
year: function(n, d) { return d < 0 ? "umbes aasta aja" : "umbes aasta aega"; },
years: function(n, d) { return d < 0 ? "%d aasta" : "%d aastat"; }
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
jQuery.timeago.settings.strings = {
prefixAgo: "duela",
prefixFromNow: "hemendik",
suffixAgo: "",
suffixFromNow: "barru",
seconds: "minutu bat bainu gutxiago",
minute: "minutu bat",
minutes: "%d minutu inguru",
hour: "ordu bat",
hours: "%d ordu",
day: "egun bat",
days: "%d egun",
month: "hilabete bat",
months: "%d hilabete",
year: "urte bat",
years: "%d urte"
};
}));

View file

@ -0,0 +1,32 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Persian
// Use DIR attribute for RTL text in Persian Language for ABBR tag .
// By MB.seifollahi@gmail.com
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "پیش",
suffixFromNow: "از حال",
seconds: "کمتر از یک دقیقه",
minute: "حدود یک دقیقه",
minutes: "%d دقیقه",
hour: "حدود یک ساعت",
hours: "حدود %d ساعت",
day: "یک روز",
days: "%d روز",
month: "حدود یک ماه",
months: "%d ماه",
year: "حدود یک سال",
years: "%d سال",
wordSeparator: " ",
numbers: ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']
};
}));

View file

@ -0,0 +1,38 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Finnish
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "sitten",
suffixFromNow: "tulevaisuudessa",
seconds: "alle minuutti",
minute: "minuutti",
minutes: "%d minuuttia",
hour: "tunti",
hours: "%d tuntia",
day: "päivä",
days: "%d päivää",
month: "kuukausi",
months: "%d kuukautta",
year: "vuosi",
years: "%d vuotta"
};
// The above is not a great localization because one would usually
// write "2 days ago" in Finnish as "2 päivää sitten", however
// one would write "2 days into the future" as "2:n päivän päästä"
// which cannot be achieved with localization support this simple.
// This is because Finnish has word suffixes (attached directly
// to the end of the word). The word "day" is "päivä" in Finnish.
// As workaround, the above localizations will say
// "2 päivää tulevaisuudessa" which is understandable but
// not as fluent.
}));

View file

@ -0,0 +1,27 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// French
jQuery.timeago.settings.strings = {
// environ ~= about, it's optional
prefixAgo: "il y a",
prefixFromNow: "d'ici",
seconds: "moins d'une minute",
minute: "environ une minute",
minutes: "environ %d minutes",
hour: "environ une heure",
hours: "environ %d heures",
day: "environ un jour",
days: "environ %d jours",
month: "environ un mois",
months: "environ %d mois",
year: "un an",
years: "%d ans"
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Galician
jQuery.timeago.settings.strings = {
prefixAgo: "hai",
prefixFromNow: "dentro de",
suffixAgo: "",
suffixFromNow: "",
seconds: "menos dun minuto",
minute: "un minuto",
minutes: "uns %d minutos",
hour: "unha hora",
hours: "%d horas",
day: "un día",
days: "%d días",
month: "un mes",
months: "%d meses",
year: "un ano",
years: "%d anos"
};
}));

View file

@ -0,0 +1,26 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Hebrew
jQuery.timeago.settings.strings = {
prefixAgo: "לפני",
prefixFromNow: "עוד",
seconds: "פחות מדקה",
minute: "דקה",
minutes: "%d דקות",
hour: "שעה",
hours: function(number){return (number===2) ? "שעתיים" : "%d שעות";},
day: "יום",
days: function(number){return (number===2) ? "יומיים" : "%d ימים";},
month: "חודש",
months: function(number){return (number===2) ? "חודשיים" : "%d חודשים";},
year: "שנה",
years: function(number){return (number===2) ? "שנתיים" : "%d שנים";}
};
}));

View file

@ -0,0 +1,54 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Croatian
var numpf = function (n, f, s, t) {
var n10;
n10 = n % 10;
if (n10 === 1 && (n === 1 || n > 20)) {
return f;
} else if (n10 > 1 && n10 < 5 && (n > 20 || n < 10)) {
return s;
} else {
return t;
}
};
jQuery.timeago.settings.strings = {
prefixAgo: "prije",
prefixFromNow: "za",
suffixAgo: null,
suffixFromNow: null,
second: "sekundu",
seconds: function (value) {
return numpf(value, "%d sekundu", "%d sekunde", "%d sekundi");
},
minute: "oko minutu",
minutes: function (value) {
return numpf(value, "%d minutu", "%d minute", "%d minuta");
},
hour: "oko jedan sat",
hours: function (value) {
return numpf(value, "%d sat", "%d sata", "%d sati");
},
day: "jedan dan",
days: function (value) {
return numpf(value, "%d dan", "%d dana", "%d dana");
},
month: "mjesec dana",
months: function (value) {
return numpf(value, "%d mjesec", "%d mjeseca", "%d mjeseci");
},
year: "prije godinu dana",
years: function (value) {
return numpf(value, "%d godinu", "%d godine", "%d godina");
},
wordSeparator: " "
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Hungarian
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: null,
suffixFromNow: null,
seconds: "kevesebb mint egy perce",
minute: "körülbelül egy perce",
minutes: "%d perce",
hour: "körülbelül egy órája",
hours: "körülbelül %d órája",
day: "körülbelül egy napja",
days: "%d napja",
month: "körülbelül egy hónapja",
months: "%d hónapja",
year: "körülbelül egy éve",
years: "%d éve"
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Armenian
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "առաջ",
suffixFromNow: "հետո",
seconds: "վայրկյաններ",
minute: "մեկ րոպե",
minutes: "%d րոպե",
hour: "մեկ ժամ",
hours: "%d ժամ",
day: "մեկ օր",
days: "%d օր",
month: "մեկ ամիս",
months: "%d ամիս",
year: "մեկ տարի",
years: "%d տարի"
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Indonesian
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "yang lalu",
suffixFromNow: "dari sekarang",
seconds: "kurang dari semenit",
minute: "sekitar satu menit",
minutes: "%d menit",
hour: "sekitar sejam",
hours: "sekitar %d jam",
day: "sehari",
days: "%d hari",
month: "sekitar sebulan",
months: "%d bulan",
year: "sekitar setahun",
years: "%d tahun"
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
jQuery.timeago.settings.strings = {
prefixAgo: "fyrir",
prefixFromNow: "eftir",
suffixAgo: "síðan",
suffixFromNow: null,
seconds: "minna en mínútu",
minute: "mínútu",
minutes: "%d mínútum",
hour: "klukkutíma",
hours: "um %d klukkutímum",
day: "degi",
days: "%d dögum",
month: "mánuði",
months: "%d mánuðum",
year: "ári",
years: "%d árum",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,26 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Italian
jQuery.timeago.settings.strings = {
suffixAgo: "fa",
suffixFromNow: "da ora",
seconds: "meno di un minuto",
minute: "circa un minuto",
minutes: "%d minuti",
hour: "circa un'ora",
hours: "circa %d ore",
day: "un giorno",
days: "%d giorni",
month: "circa un mese",
months: "%d mesi",
year: "circa un anno",
years: "%d anni"
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Japanese
jQuery.timeago.settings.strings = {
prefixAgo: "",
prefixFromNow: "今から",
suffixAgo: "前",
suffixFromNow: "後",
seconds: "1 分未満",
minute: "約 1 分",
minutes: "%d 分",
hour: "約 1 時間",
hours: "約 %d 時間",
day: "約 1 日",
days: "約 %d 日",
month: "約 1 ヶ月",
months: "約 %d ヶ月",
year: "約 1 年",
years: "約 %d 年",
wordSeparator: ""
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Javanesse (Boso Jowo)
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "kepungkur",
suffixFromNow: "seko saiki",
seconds: "kurang seko sakmenit",
minute: "kurang luwih sakmenit",
minutes: "%d menit",
hour: "kurang luwih sakjam",
hours: "kurang luwih %d jam",
day: "sedina",
days: "%d dina",
month: "kurang luwih sewulan",
months: "%d wulan",
year: "kurang luwih setahun",
years: "%d tahun"
};
}));

View file

@ -0,0 +1,31 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Korean
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "전",
suffixFromNow: "후",
seconds: "1분",
minute: "약 1분",
minutes: "%d분",
hour: "약 1시간",
hours: "약 %d시간",
day: "하루",
days: "%d일",
month: "약 1개월",
months: "%d개월",
year: "약 1년",
years: "%d년",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,42 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Russian
function numpf(n, f, s, t) {
// f - 1, 21, 31, ...
// s - 2-4, 22-24, 32-34 ...
// t - 5-20, 25-30, ...
var n10 = n % 10;
if ( (n10 === 1) && ( (n === 1) || (n > 20) ) ) {
return f;
} else if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) {
return s;
} else {
return t;
}
}
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "через",
suffixAgo: "мурун",
suffixFromNow: null,
seconds: "1 минуттан аз",
minute: "минута",
minutes: function(value) { return numpf(value, "%d минута", "%d минута", "%d минут"); },
hour: "саат",
hours: function(value) { return numpf(value, "%d саат", "%d саат", "%d саат"); },
day: "күн",
days: function(value) { return numpf(value, "%d күн", "%d күн", "%d күн"); },
month: "ай",
months: function(value) { return numpf(value, "%d ай", "%d ай", "%d ай"); },
year: "жыл",
years: function(value) { return numpf(value, "%d жыл", "%d жыл", "%d жыл"); }
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
//Lithuanian
jQuery.timeago.settings.strings = {
prefixAgo: "prieš",
prefixFromNow: null,
suffixAgo: null,
suffixFromNow: "nuo dabar",
seconds: "%d sek.",
minute: "min.",
minutes: "%d min.",
hour: "val.",
hours: "%d val.",
day: "1 d.",
days: "%d d.",
month: "mėn.",
months: "%d mėn.",
year: "metus",
years: "%d metus",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
//Latvian
jQuery.timeago.settings.strings = {
prefixAgo: "pirms",
prefixFromNow: null,
suffixAgo: null,
suffixFromNow: "no šī brīža",
seconds: "%d sek.",
minute: "min.",
minutes: "%d min.",
hour: "st.",
hours: "%d st.",
day: "1 d.",
days: "%d d.",
month: "mēnesis.",
months: "%d mēnesis.",
year: "gads",
years: "%d gads",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Macedonian
(function() {
jQuery.timeago.settings.strings={
prefixAgo: "пред",
prefixFromNow: "за",
suffixAgo: null,
suffixFromNow: null,
seconds: "%d секунди",
minute: "%d минута",
minutes: "%d минути",
hour: "%d час",
hours: "%d часа",
day: "%d ден",
days: "%d денови" ,
month: "%d месец",
months: "%d месеци",
year: "%d година",
years: "%d години"
};
})();
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Dutch
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "over",
suffixAgo: "geleden",
suffixFromNow: null,
seconds: "minder dan een minuut",
minute: "ongeveer een minuut",
minutes: "%d minuten",
hour: "ongeveer een uur",
hours: "ongeveer %d uur",
day: "een dag",
days: "%d dagen",
month: "ongeveer een maand",
months: "%d maanden",
year: "ongeveer een jaar",
years: "%d jaar",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Norwegian
jQuery.timeago.settings.strings = {
prefixAgo: "for",
prefixFromNow: "om",
suffixAgo: "siden",
suffixFromNow: "",
seconds: "mindre enn et minutt",
minute: "ca. et minutt",
minutes: "%d minutter",
hour: "ca. en time",
hours: "ca. %d timer",
day: "en dag",
days: "%d dager",
month: "ca. en måned",
months: "%d måneder",
year: "ca. et år",
years: "%d år"
};
}));

View file

@ -0,0 +1,39 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Polish
function numpf(n, s, t) {
// s - 2-4, 22-24, 32-34 ...
// t - 5-21, 25-31, ...
var n10 = n % 10;
if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) {
return s;
} else {
return t;
}
}
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "za",
suffixAgo: "temu",
suffixFromNow: null,
seconds: "mniej niż minutę",
minute: "minutę",
minutes: function(value) { return numpf(value, "%d minuty", "%d minut"); },
hour: "godzinę",
hours: function(value) { return numpf(value, "%d godziny", "%d godzin"); },
day: "dzień",
days: "%d dni",
month: "miesiąc",
months: function(value) { return numpf(value, "%d miesiące", "%d miesięcy"); },
year: "rok",
years: function(value) { return numpf(value, "%d lata", "%d lat"); }
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Brazilian Portuguese
jQuery.timeago.settings.strings = {
prefixAgo: "há",
prefixFromNow: "em",
suffixAgo: null,
suffixFromNow: null,
seconds: "alguns segundos",
minute: "um minuto",
minutes: "%d minutos",
hour: "uma hora",
hours: "%d horas",
day: "um dia",
days: "%d dias",
month: "um mês",
months: "%d meses",
year: "um ano",
years: "%d anos"
};
}));

View file

@ -0,0 +1,26 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Portuguese
jQuery.timeago.settings.strings = {
suffixAgo: "atrás",
suffixFromNow: "a partir de agora",
seconds: "menos de um minuto",
minute: "cerca de um minuto",
minutes: "%d minutos",
hour: "cerca de uma hora",
hours: "cerca de %d horas",
day: "um dia",
days: "%d dias",
month: "cerca de um mês",
months: "%d meses",
year: "cerca de um ano",
years: "%d anos"
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Romanian
jQuery.timeago.settings.strings = {
prefixAgo: "acum",
prefixFromNow: "in timp de",
suffixAgo: "",
suffixFromNow: "",
seconds: "mai putin de un minut",
minute: "un minut",
minutes: "%d minute",
hour: "o ora",
hours: "%d ore",
day: "o zi",
days: "%d zile",
month: "o luna",
months: "%d luni",
year: "un an",
years: "%d ani"
};
}));

View file

@ -0,0 +1,54 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Serbian
var numpf = function (n, f, s, t) {
var n10;
n10 = n % 10;
if (n10 === 1 && (n === 1 || n > 20)) {
return f;
} else if (n10 > 1 && n10 < 5 && (n > 20 || n < 10)) {
return s;
} else {
return t;
}
};
jQuery.timeago.settings.strings = {
prefixAgo: "pre",
prefixFromNow: "za",
suffixAgo: null,
suffixFromNow: null,
second: "sekund",
seconds: function (value) {
return numpf(value, "%d sekund", "%d sekunde", "%d sekundi");
},
minute: "oko minut",
minutes: function (value) {
return numpf(value, "%d minut", "%d minuta", "%d minuta");
},
hour: "oko jedan sat",
hours: function (value) {
return numpf(value, "%d sat", "%d sata", "%d sati");
},
day: "jedan dan",
days: function (value) {
return numpf(value, "%d dan", "%d dana", "%d dana");
},
month: "mesec dana",
months: function (value) {
return numpf(value, "%d mesec", "%d meseca", "%d meseci");
},
year: "godinu dana",
years: function (value) {
return numpf(value, "%d godinu", "%d godine", "%d godina");
},
wordSeparator: " "
};
}));

View file

@ -0,0 +1,43 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Russian
function numpf(n, f, s, t) {
// f - 1, 21, 31, ...
// s - 2-4, 22-24, 32-34 ...
// t - 5-20, 25-30, ...
n = n % 100;
var n10 = n % 10;
if ( (n10 === 1) && ( (n === 1) || (n > 20) ) ) {
return f;
} else if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) {
return s;
} else {
return t;
}
}
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "через",
suffixAgo: "назад",
suffixFromNow: null,
seconds: "меньше минуты",
minute: "минуту",
minutes: function(value) { return numpf(value, "%d минуту", "%d минуты", "%d минут"); },
hour: "час",
hours: function(value) { return numpf(value, "%d час", "%d часа", "%d часов"); },
day: "день",
days: function(value) { return numpf(value, "%d день", "%d дня", "%d дней"); },
month: "месяц",
months: function(value) { return numpf(value, "%d месяц", "%d месяца", "%d месяцев"); },
year: "год",
years: function(value) { return numpf(value, "%d год", "%d года", "%d лет"); }
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Kinyarwanda
jQuery.timeago.settings.strings = {
prefixAgo: "hashize",
prefixFromNow: "mu",
suffixAgo: null,
suffixFromNow: null,
seconds: "amasegonda macye",
minute: "umunota",
minutes: "iminota %d",
hour: "isaha",
hours: "amasaha %d",
day: "umunsi",
days: "iminsi %d",
month: "ukwezi",
months: "amezi %d",
year: "umwaka",
years: "imyaka %d",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Sinhalese (SI)
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "පෙර",
suffixFromNow: "පසුව",
seconds: "තත්පර කිහිපයකට",
minute: "මිනිත්තුවකට පමණ",
minutes: "මිනිත්තු %d කට",
hour: "පැයක් පමණ ",
hours: "පැය %d කට පමණ",
day: "දවසක ට",
days: "දවස් %d කට ",
month: "මාසයක් පමණ",
months: "මාස %d කට",
year: "වසරක් පමණ",
years: "වසරක් %d කට පමණ"
};
}));

View file

@ -0,0 +1,34 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Slovak
(function() {
function f(n, d, a) {
return a[d>=0 ? 0 : a.length===2 || n<5 ? 1 : 2];
}
jQuery.timeago.settings.strings = {
prefixAgo: 'pred',
prefixFromNow: 'o',
suffixAgo: null,
suffixFromNow: null,
seconds: function(n, d) {return f(n, d, ['menej ako minútou', 'menej ako minútu']);},
minute: function(n, d) {return f(n, d, ['minútou', 'minútu']);},
minutes: function(n, d) {return f(n, d, ['%d minútami', '%d minúty', '%d minút']);},
hour: function(n, d) {return f(n, d, ['hodinou', 'hodinu']);},
hours: function(n, d) {return f(n, d, ['%d hodinami', '%d hodiny', '%d hodín']);},
day: function(n, d) {return f(n, d, ['%d dňom', '%d deň']);},
days: function(n, d) {return f(n, d, ['%d dňami', '%d dni', '%d dní']);},
month: function(n, d) {return f(n, d, ['%d mesiacom', '%d mesiac']);},
months: function(n, d) {return f(n, d, ['%d mesiacmi', '%d mesiace', '%d mesiacov']);},
year: function(n, d) {return f(n, d, ['%d rokom', '%d rok']);},
years: function(n, d) {return f(n, d, ['%d rokmi', '%d roky', '%d rokov']);}
};
})();
}));

View file

@ -0,0 +1,46 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Slovenian with support for dual
var numpf = function (n, a) {
return a[n%100===1 ? 1 : n%100===2 ? 2 : n%100===3 || n%100===4 ? 3 : 0];
};
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "čez",
suffixAgo: "nazaj",
suffixFromNow: null,
second: "sekundo",
seconds: function (value) {
return numpf(value, ["%d sekund", "%d sekundo", "%d sekundi", "%d sekunde"]);
},
minute: "minuto",
minutes: function (value) {
return numpf(value, ["%d minut", "%d minuto", "%d minuti", "%d minute"]);
},
hour: "eno uro",
hours: function (value) {
return numpf(value, ["%d ur", "%d uro", "%d uri", "%d ure"]);
},
day: "en dan",
days: function (value) {
return numpf(value, ["%d dni", "%d dan", "%d dneva", "%d dni"]);
},
month: "en mesec",
months: function (value) {
return numpf(value, ["%d mesecev", "%d mesec", "%d meseca", "%d mesece"]);
},
year: "eno leto",
years: function (value) {
return numpf(value, ["%d let", "%d leto", "%d leti", "%d leta"]);
},
wordSeparator: " "
};
}));

View file

@ -0,0 +1,26 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Albanian SQ
jQuery.timeago.settings.strings = {
suffixAgo: "më parë",
suffixFromNow: "tani",
seconds: "më pak se një minutë",
minute: "rreth një minutë",
minutes: "%d minuta",
hour: "rreth një orë",
hours: "rreth %d orë",
day: "një ditë",
days: "%d ditë",
month: "rreth një muaj",
months: "%d muaj",
year: "rreth një vit",
years: "%d vjet"
};
}));

View file

@ -0,0 +1,54 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Serbian
var numpf = function (n, f, s, t) {
var n10;
n10 = n % 10;
if (n10 === 1 && (n === 1 || n > 20)) {
return f;
} else if (n10 > 1 && n10 < 5 && (n > 20 || n < 10)) {
return s;
} else {
return t;
}
};
jQuery.timeago.settings.strings = {
prefixAgo: "пре",
prefixFromNow: "за",
suffixAgo: null,
suffixFromNow: null,
second: "секунд",
seconds: function (value) {
return numpf(value, "%d секунд", "%d секунде", "%d секунди");
},
minute: "један минут",
minutes: function (value) {
return numpf(value, "%d минут", "%d минута", "%d минута");
},
hour: "један сат",
hours: function (value) {
return numpf(value, "%d сат", "%d сата", "%d сати");
},
day: "један дан",
days: function (value) {
return numpf(value, "%d дан", "%d дана", "%d дана");
},
month: "месец дана",
months: function (value) {
return numpf(value, "%d месец", "%d месеца", "%d месеци");
},
year: "годину дана",
years: function (value) {
return numpf(value, "%d годину", "%d године", "%d година");
},
wordSeparator: " "
};
}));

View file

@ -0,0 +1,28 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Swedish
jQuery.timeago.settings.strings = {
prefixAgo: "för",
prefixFromNow: "om",
suffixAgo: "sedan",
suffixFromNow: "",
seconds: "mindre än en minut",
minute: "ungefär en minut",
minutes: "%d minuter",
hour: "ungefär en timme",
hours: "ungefär %d timmar",
day: "en dag",
days: "%d dagar",
month: "ungefär en månad",
months: "%d månader",
year: "ungefär ett år",
years: "%d år"
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Thai
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ที่แล้ว",
suffixFromNow: "จากตอนนี้",
seconds: "น้อยกว่าหนึ่งนาที",
minute: "ประมาณหนึ่งนาที",
minutes: "%d นาที",
hour: "ประมาณหนึ่งชั่วโมง",
hours: "ประมาณ %d ชั่วโมง",
day: "หนึ่งวัน",
days: "%d วัน",
month: "ประมาณหนึ่งเดือน",
months: "%d เดือน",
year: "ประมาณหนึ่งปี",
years: "%d ปี",
wordSeparator: "",
numbers: []
};
}));

View file

@ -0,0 +1,26 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Turkish
jQuery.timeago.settings.strings = {
suffixAgo: 'önce',
suffixFromNow: null,
seconds: 'birkaç saniye',
minute: '1 dakika',
minutes: '%d dakika',
hour: '1 saat',
hours: '%d saat',
day: '1 gün',
days: '%d gün',
month: '1 ay',
months: '%d ay',
year: '1 yıl',
years: '%d yıl'
};
}));

View file

@ -0,0 +1,42 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Ukrainian
function numpf(n, f, s, t) {
// f - 1, 21, 31, ...
// s - 2-4, 22-24, 32-34 ...
// t - 5-20, 25-30, ...
var n10 = n % 10;
if ( (n10 === 1) && ( (n === 1) || (n > 20) ) ) {
return f;
} else if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) {
return s;
} else {
return t;
}
}
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "через",
suffixAgo: "тому",
suffixFromNow: null,
seconds: "менше хвилини",
minute: "хвилина",
minutes: function(value) { return numpf(value, "%d хвилина", "%d хвилини", "%d хвилин"); },
hour: "година",
hours: function(value) { return numpf(value, "%d година", "%d години", "%d годин"); },
day: "день",
days: function(value) { return numpf(value, "%d день", "%d дні", "%d днів"); },
month: "місяць",
months: function(value) { return numpf(value, "%d місяць", "%d місяці", "%d місяців"); },
year: "рік",
years: function(value) { return numpf(value, "%d рік", "%d роки", "%d років"); }
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Urdu
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "پہلے",
suffixFromNow: "اب سے",
seconds: "کچھ سیکنڈز",
minute: "تقریباً ایک منٹ",
minutes: "%d منٹ",
hour: "تقریباً ایک گھنٹہ",
hours: "تقریباً %d گھنٹے",
day: "ایک دن",
days: "%d دن",
month: "تقریباً ایک مہینہ",
months: "%d مہینے",
year: "تقریباً ایک سال",
years: "%d سال",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
//Uzbek
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "keyin",
suffixAgo: "avval",
suffixFromNow: null,
seconds: "bir necha soniya",
minute: "1 daqiqa",
minutes: function(value) { return "%d daqiqa"; },
hour: "1 soat",
hours: function(value) { return "%d soat"; },
day: "1 kun",
days: function(value) { return "%d kun"; },
month: "1 oy",
months: function(value) { return "%d oy"; },
year: "1 yil",
years: function(value) { return "%d yil"; },
wordSeparator: " "
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Vietnamese
jQuery.timeago.settings.strings = {
prefixAgo: 'cách đây',
prefixFromNow: null,
suffixAgo: null,
suffixFromNow: "trước",
seconds: "chưa đến một phút",
minute: "khoảng một phút",
minutes: "%d phút",
hour: "khoảng một tiếng",
hours: "khoảng %d tiếng",
day: "một ngày",
days: "%d ngày",
month: "khoảng một tháng",
months: "%d tháng",
year: "khoảng một năm",
years: "%d năm",
wordSeparator: " ",
numbers: []
};
}));

View file

@ -0,0 +1,31 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Simplified Chinese
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "之前",
suffixFromNow: "之后",
seconds: "不到1分钟",
minute: "大约1分钟",
minutes: "%d分钟",
hour: "大约1小时",
hours: "大约%d小时",
day: "1天",
days: "%d天",
month: "大约1个月",
months: "%d月",
year: "大约1年",
years: "%d年",
numbers: [],
wordSeparator: ""
};
}));

View file

@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Traditional Chinese, zh-tw
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "之前",
suffixFromNow: "之後",
seconds: "不到1分鐘",
minute: "大約1分鐘",
minutes: "%d分鐘",
hour: "大約1小時",
hours: "%d小時",
day: "大約1天",
days: "%d天",
month: "大約1個月",
months: "%d個月",
year: "大約1年",
years: "%d年",
numbers: [],
wordSeparator: ""
};
}));

169
website/lang/zh-CN.json Normal file
View file

@ -0,0 +1,169 @@
{
"miningPool": "矿池",
"dashboard": "仪表盘",
"gettingStarted": "挖矿指导",
"yourStats": "挖矿数据",
"poolBlocks": "池中区块",
"settings": "设置",
"faq": "常见问题",
"telegram": "Telegram群组",
"discord": "Discord",
"contactUs": "联系方式",
"network": "全网",
"pool": "矿池",
"you": "用户",
"statsUpdated": "数据更新",
"poolHashrate": "矿池算力",
"currentEffort": "当前效益",
"networkHashrate": "全网算力",
"networkDifficulty": "难度",
"blockchainHeight": "区块高度",
"networkLastReward": "上次收益",
"poolMiners": "在线矿工",
"poolFee": "矿池税",
"minerStats": "用户数据及支付历史",
"workerStats": "设备数据",
"miner": "矿工",
"miners": "矿工",
"minersCount": "矿工数",
"workers": "挖矿设备",
"workersCount": "设备数",
"workerName": "设备名",
"lastHash": "上次提交",
"hashRate": "算力",
"currentHashRate": "当前算力",
"lastShare": "上次提交",
"totalHashes": "总提交",
"top10miners": "前十矿工",
"blocksTotal": "已发现区块",
"blockSolvedTime": "区块发现用时",
"blocksMaturityCount": "成熟要求",
"efficiency": "效率",
"averageLuck": "平均幸运值",
"timeFound": "发现时间",
"reward": "收益",
"height": "高度",
"difficulty": "难度",
"blockHash": "区块Hash",
"effort": "功夫",
"blocksFoundLast24": "过去24小时内发现区块",
"blocksFoundLastDays": "过去{DAYS}天中发现区块",
"propSoloConnectedMiners": "成比例的 / 独奏 连接的 矿工",
"payments": "支付",
"paymentsHistory": "支付历史",
"paymentsTotal": "总支付",
"paymentsMinimum": "最小支付额",
"paymentsInterval": "支付周期",
"paymentsDenomination": "面额单位",
"timeSent": "Time Sent",
"transactionHash": "交易Hash",
"amount": "数额",
"fee": "费用",
"mixin": "Mixin",
"payees": "收款人",
"pendingBalance": "处理中余额",
"totalPaid": "总计支付",
"payoutEstimate": "当前支付估计",
"paymentSummarySingle": "在%DATE%您收到%AMOUNT%",
"paymentSummaryMulti": "在%DATE%,通过%COUNT%笔支付,您收到%AMOUNT%",
"connectionDetails": "连接信息",
"miningPoolHost": "矿池地址",
"cnAlgorithm": "算法",
"username": "用户名",
"usernameDesc": "这是你的钱包地址",
"paymentId": "交易所支付ID",
"fixedDiff": "固定难度",
"address": "地址",
"addrPaymentId": "交易ID",
"addrDiff": "难度",
"password": "密码",
"passwordDesc": "这是你的设备名",
"emailNotifications": "邮件提醒",
"miningPorts": "挖矿端口",
"port": "端口",
"portDiff": "初始难度",
"description": "介绍",
"miningApps": "挖矿应用",
"configGeneratorDesc": "生成您定制的配置",
"addressField": "钱包地址",
"paymentIdField": "为交易所的交易ID (可选)",
"fixedDiffField": "固定难度 (可选)",
"workerNameField": "设备名",
"emailNotificationsField": "邮件提醒 (可选)",
"generateConfig": "生成配置",
"appName": "应用名",
"appArch": "架构平台",
"appDesc": "特征",
"download": "下载",
"showConfig": "了解更多",
"market": "市场计算器",
"loadingMarket": "加载市场价格",
"priceIn": "价格",
"hashPer": "Hash/",
"estimateProfit": "预计挖矿收益",
"enterYourHashrate": "确认您的算力",
"perDay": "每天",
"verificationFields": "验证字段",
"minerVerification": "为了确保钱包地址是您的我们要求您提供您的矿工使用的IP地址之一.",
"minerAddress": "矿工地址",
"minerIP": "矿工IP地址",
"setMinimumPayout": "设置您的最低支付水平",
"minerMinPayout": "如果你喜欢比池的默认值更高的支付水平,那么这是你可以为你的矿工改变它。您在此处显示的金额将成为您的地址的最低付款金额.",
"minimumPayout": "最低付款金额",
"enableEmailNotifications": "启用电子邮件通知",
"minerEmailNotify": "当发现一个区块并且每当支付发生时,该池将发送电子邮件通知.",
"emailAddress": "邮箱地址",
"noMinerAddress": "没有指定矿工地址",
"noMinerIP": "没有指定矿工IP地址",
"noPayoutLevel": "没有指定最小付款金额",
"noEmail": "没有指定邮箱地址",
"invalidEmail": "指定的电子邮件地址无效",
"minerPayoutSet": "完成! 您的最低支出水平已设定",
"notificationEnabled": "完成! 电子邮件通知已启用",
"notificationDisabled": "完成! 电子邮件通知已被禁用",
"enterYourAddress": "输入您的地址",
"enterYourMinerIP": "您的矿工使用的IP地址 (任一)",
"enterYourEmail": "输入你的电子邮箱地址 (可选)",
"lookup": "查找",
"searching": "搜索中...",
"loadMore": "加载更多",
"set": "设置",
"enable": "允许",
"disable": "禁止",
"status": "状态",
"updated": "已更新:",
"source": "源:",
"error": "错误:",
"na": "无",
"estimated": "预计",
"never": "从不",
"second": "秒",
"seconds": "秒",
"minute": "分",
"minutes": "分",
"hour": "小时",
"hours": "小时",
"day": "天",
"days": "天",
"week": "周",
"weeks": "周",
"month": "月",
"months": "月",
"year": "年",
"years": "年",
"poweredBy": "驱动源于",
"openSource": "开源于"
}

View file

@ -0,0 +1,177 @@
<ul class="nav nav-tabs" id="coinTabs">
</ul>
<!-- Tab panes -->
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="coinTabs{{coin}}" role="presentation" class="{{active}}"><a href="#{{coin}}" data-coin="{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<!-- Handlebars template -->
<script id="monitoringInfo" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<div class="row">
<div class="infos col-sm-6">
<h3>Daemon</h3>
<div class="card padding-10">
<ul class="list-unstyled">
<li><strong>Last check:</strong> {{monitoringDaemon.lastCheck}}</li>
<li><strong>Last status:</strong>
<span id="daemonStatus">{{monitoringDaemon.lastStatus}}</span>
</li>
<li><strong>Last response:</strong>
<pre>{{monitoringDaemon.lastResponse}}</pre>
</li>
<li><strong>Last fail:</strong>
<span>{{monitoringDaemon.lastFail}}</span>
</li>
<li><strong>Last fail response:</strong>
<pre>{{monitoringDaemon.lastFailResponse}}</pre>
</li>
</ul>
</div>
</div>
<div class="infos col-sm-6">
<h3>Wallet</h3>
<div class="card padding-10">
<ul class="list-unstyled">
<li><strong>Last check:</strong> {{monitoringWallet.lastCheck}}</li>
<li><strong>Last status:</strong>
<span id="walletStatus">{{monitoringWallet.lastStatus}}</span>
</li>
<li><strong>Last response:</strong>
<pre>{{monitoringWallet.lastResponse}}</pre>
</li>
<li><strong>Last fail:</strong>
<span>{{monitoringWallet.lastFail}}</span>
</li>
<li><strong>Last fail response:</strong>
<pre>{{monitoringWallet.lastFailResponse}}</span></pre>
</ul>
</div>
</div>
</div>
<h3>Logs</h3>
<div class="card">
<div class="table-responsive">
<table class="table table-hover table-striped logList" id="logTable">
<thead>
<tr>
<th class="sort">Name <i class="fa fa-sort"></i></th>
<th class="sort">Modified <i class="fa fa-sort"></i></th>
<th class="sort">Size <i class="fa fa-sort"></i></th>
</tr>
</thead>
<tbody>
{{#logs}}
<tr>
<td data-sort="{{name}}"><a href="{{link}}" target="_blank">{{name}}</a></td>
<td data-sort="{{changed}}">{{changed}}</td>
<td data-sort="{{size}}">{{size}} bytes</td>
</tr>
{{/logs}}
</tbody>
</table>
</div>
</div>
</div>
</script>
<!-- Javascript -->
<script>
function getCheckTime(timestamp) {
return timestamp ? $.timeago(new Date(timestamp * 1000).toISOString()) : null;
}
function monitoringInfoParse(endPoint, key, data) {
let monitoringDaemon = {
lastCheck: getCheckTime(data['monitoring'].daemon.lastCheck) || 'never',
lastStatus: data['monitoring'].daemon.lastStatus || '',
lastFail: getCheckTime(data['monitoring'].daemon.lastFail) || 'never',
lastFailResponse: data['monitoring'].daemon.lastFailResponse || ' ',
lastResponse: data['monitoring'].daemon.lastResponse || ' '
};
let monitoringWallet = {
lastCheck: getCheckTime(data['monitoring'].wallet.lastCheck) || 'never',
lastStatus: data['monitoring'].wallet.lastStatus || '',
lastFail: getCheckTime(data['monitoring'].wallet.lastFail) || 'never',
lastFailResponse: data['monitoring'].wallet.lastFailResponse || ' ',
lastResponse: data['monitoring'].wallet.lastResponse || ' '
};
let properData = {};
if(data.hasOwnProperty('logs')) {
properData['logs'] = []
for(let log in data['logs']) {
properData['logs'].push({name: log,
link: `${endPoint}/admin_log?file=${log}&password=${docCookies.getItem('password')}`,
changed: formatDate(data['logs'][log].changed),
size: data['logs'][log].size})
}
}
properData['coin'] = key
properData['active'] = data.active
properData['monitoringDaemon'] = monitoringDaemon;
properData['monitoringWallet'] = monitoringWallet;
return properData;
}
function renderLogInfo(endPoint, key, active, password) {
if(!password) {
password = prompt('Enter admin password');
}
$.ajax({
url: `${endPoint}/admin_monitoring`,
data: {password: password},
dataType: 'json',
cache: false,
success: function(data) {
docCookies.setItem('password', password, Infinity);
data['active'] = active
renderTemplate(monitoringInfoParse(endPoint, key, data), `#monitoringInfo`, `#tab-content`);
$(`#daemonStatus${key}`).addClass(data['monitoring'].daemon.lastStatus == 'ok' ? 'text-success' : 'text-danger');
$(`#walletStatus${key}`).addClass(data['monitoring'].wallet.lastStatus == 'ok' ? 'text-success' : 'text-danger');
$('.logList th.sort').on('click', sortTable)
},
error: function(e) {
docCookies.removeItem('password');
}
});
}
$(function() {
let password = docCookies.getItem('password');
let template = $('#siblingTabTemplate').html();
Mustache.parse(template)
let rendered = Mustache.render(template, {coin:parentCoin, symbol:`(${lastStats.config.symbol})`, active:'active'});
$('#coinTabs').append(rendered)
renderLogInfo(api, parentCoin, 'active', password);
Object.keys(mergedApis).forEach(key => {
template = $('#siblingTabTemplate').html();
Mustache.parse(template)
rendered = Mustache.render(template, {coin:`${mergedStats[key].config.coin}`, symbol:`(${mergedStats[key].config.symbol})`});
$('#coinTabs').append(rendered)
renderLogInfo(mergedApis[key].api, key, '', password)
})
sortElementList($(`#coinTabs`), $(`#coinTabs>li`), mergedStats)
$('#coinTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
});
</script>

View file

@ -0,0 +1,85 @@
<h3>Current Ports Usage (<span id="totalUsers">0</span> users)</h3>
<!-- Handlebars template -->
<script id="portsListTable" type="text/x-handlebars-template">
{{#ports}}
<tr>
<td class="col1" data-sort="{{port.port}}">{{port}}</td>
<td class="col2" data-sort="{{port.users}}">{{users}}</td>
<td class="col3">&nbsp;</td>
</tr>
{{/ports}}
</script>
<!-- Ports List -->
<div class="card">
<div id="portsUsage" class="table-responsive">
<table class="table table-hover table-striped portsList">
<thead>
<tr>
<th class="col1">Port</th>
<th class="col2">Connected Users</th>
<th class="col3">&nbsp;</th>
</tr>
</thead>
<tbody id="template">
</tbody>
</table>
</div>
</div>
<!-- Javascript -->
<script>
function parsePorts(ports) {
var totalUsers = 0;
var portsArray = [];
var properObject = {};
for (var port in ports) {
if (ports.hasOwnProperty(port)) {
var portsData = ports[port];
var usersCount = portsData.users ?parseInt(portsData.users) : 0;
if (usersCount > 0) {
portsArray.push({
port: portsData.port,
users: usersCount
});
totalUsers += usersCount;
}
}
}
$('#totalUsers').html(totalUsers);
properObject['ports'] = portsArray.sort(function(a, b) {
return a.port.port - b.port.port
}).reverse();
return properObject;
}
function createPortsTable(promptPassword) {
var password = docCookies.getItem('password');
if(!password || promptPassword) {
password = prompt('Enter admin password');
}
$.ajax({
url: api + '/admin_ports',
data: {password: password},
cache: false,
dataType: 'json',
success: function(data) {
docCookies.setItem('password', password, Infinity);
renderTemplate(parsePorts(data), '#portsListTable', '#template');
},
error: function(e) {
docCookies.removeItem('password');
}
});
}
$(function() {
$('[data-toggle="tooltip"]').tooltip();
createPortsTable();
});
</script>

View file

@ -0,0 +1,204 @@
<h3>Pool Statistics</h3>
<div id="tab-content">
</div>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div id="poolStats{{coin}}" class="row">
<!-- Total Mined -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-money"></span>
</div>
<div class="content">
<div class="text">Total Mined</div>
<div class="value"><span id="totalMined{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Total Paid -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-money"></span>
</div>
<div class="content">
<div class="text">Total Paid</div>
<div class="value"><span id="totalPaid{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Total Owed -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-money"></span>
</div>
<div class="content">
<div class="text">Total Owed</div>
<div class="value"><span id="totalOwed{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Profit (before tx fees) -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-dollar"></span>
</div>
<div class="content">
<div class="text">Profit (before tx fees)</div>
<div class="value"><span id="profit{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Registered Addresses -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-users"></span>
</div>
<div class="content">
<div class="text">Registered Addresses</div>
<div class="value"><span id="registeredAddresses{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Blocks Unlocked -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-cubes"></span>
</div>
<div class="content">
<div class="text">Blocks Unlocked</div>
<div class="value"><span id="blocksUnlocked{{coin}}"></span></div>
</div>
</div>
</div>
<!-- Blocks Orphaned -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-cubes"></span>
</div>
<div class="content">
<div class="text">Blocks Orphaned</div>
<div class="value"><span id="blocksOrphaned{{coin}}"></span> <span class="smallText">(<span id="orphanPercent{{coin}}">0%</span>)</span></div>
</div>
</div>
</div>
<!-- Average Luck (shares/diff) -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-line-chart"></span>
</div>
<div class="content">
<div class="text">Average Luck (shares/diff)</div>
<div class="value"><span id="averageLuck{{coin}}"></span></div>
</div>
</div>
</div>
</div>
</script>
<!-- Javascript -->
<script>
function formatLuck(difficulty, shares, stats) {
// Only an approximation to reverse the calculations done in pool.js, because the shares with their respective times are not recorded in redis
// Approximation assumes equal pool hashrate for the whole round
// Could potentially be replaced by storing the sum of all job.difficulty in the redis db.
if (stats.config.slushMiningEnabled) {
// Uses integral calculus to calculate the average of a dynamic function
var accurateShares = 1 / stats.config.blockTime * ( // 1/blockTime to get the average
shares * stats.config.weight * ( // Basically calculates the 'area below the graph' between 0 and blockTime
1 - Math.pow(
Math.E,
((- stats.config.blockTime) / stats.config.weight) // blockTime is equal to the highest possible result of (dateNowSeconds - scoreTime)
)
)
);
}
else {
var accurateShares = shares;
}
var percent = Math.round(accurateShares / difficulty * 100);
if(!percent){
return '<span class="luckGood">?</span>';
}
else if(percent <= 100){
return '<span class="luckGood">' + percent + '%</span>';
}
else if(percent >= 101 && percent <= 150){
return '<span class="luckMid">' + percent + '%</span>';
}
else{
return '<span class="luckBad">' + percent + '%</span>';
}
}
function getStats(promptPassword, api, stats) {
var password = docCookies.getItem('password');
if(!password || promptPassword) {
password = prompt('Enter admin password');
}
$.ajax({
url: `${api}/admin_stats`,
data: {password: password},
dataType: 'json',
cache: 'false',
success: function(data) {
docCookies.setItem('password', password, Infinity);
renderData(data, stats);
},
error: function(e) {
docCookies.removeItem('password');
getStats(true, api, stats);
}
});
}
function renderData(data, stats) {
$(`#totalOwed${stats.config.coin}`).text(getReadableCoin(stats, data.totalOwed));
$(`#totalPaid${stats.config.coin}`).text(getReadableCoin(stats, data.totalPaid));
$(`#totalMined${stats.config.coin}`).text(getReadableCoin(stats, data.totalRevenue + data.totalRevenueSolo));
$(`#profit${stats.config.coin}`).text(getReadableCoin(stats, (data.totalRevenue + data.totalRevenueSolo) - data.totalOwed - data.totalPaid));
$(`#blocksUnlocked${stats.config.coin}`).text(data.blocksUnlocked);
$(`#averageLuck${stats.config.coin}`).html(formatLuck(data.totalDiff, data.totalShares, stats));
$(`#blocksOrphaned${stats.config.coin}`).text(data.blocksOrphaned);
$(`#orphanPercent${stats.config.coin}`).text((data.blocksOrphaned / data.blocksUnlocked * 100).toFixed(2) + '%');
$(`#registeredAddresses${stats.config.coin}`).text(data.totalWorkers);
}
$(function() {
let template = $('#siblingTemplate').html()
Mustache.parse(template)
let rendered = Mustache.render(template, {coin:lastStats.config.coin})
$('#tab-content').append(rendered)
getStats(null, api, lastStats);
Object.keys(mergedApis).some(key => {
rendered = Mustache.render(template, {coin:key});
$('#tab-content').append(rendered)
getStats(null, mergedApis[key].api, mergedStats[key]);
})
});
</script>

View file

@ -0,0 +1,124 @@
<!-- Test E-Mail notifications -->
<h3><span data-tkey="testEmailNotifications">Test E-Mail notifications</span></h3>
<div class="card padding-15 padding-b-10">
<div>
<div id="test_email_message" role="alert" ></div>
</div>
<div class="row">
<div class="col-lg-4 col-md-5 col-sm-6 push-down-5">
<input class="form-control" id="emailAddress" type="text" data-tplaceholder="emailAddress" placeholder="E-Mail Address">
</div>
<div class="col-sm-4 push-down-5">
<button class="btn btn-default" type="button" id="testEmailButton">
<span><i class="fa fa-check"></i>&nbsp; <span data-tkey="sendTest">Send test</span></span>
</button>
</div>
</div>
</div>
<!-- Test Telegram notifications -->
<h3><span data-tkey="testTelegramNotifications">Test Telegram Channel notifications</span></h3>
<div class="card padding-15 padding-b-10">
<div>
<div id="test_telegram_message" role="alert" ></div>
</div>
<div class="row">
<div class="col-sm-4 push-down-5">
<button class="btn btn-default" type="button" id="testTelegramButton">
<span><i class="fa fa-check"></i>&nbsp; <span data-tkey="sendTest">Send test</span></span>
</button>
</div>
</div>
</div>
<script>
/**
* Error Message
**/
function showError(testId, message) {
$('#test_'+testId+'_message').text(message);
$('#test_'+testId+'_message').removeClass().addClass('alert alert-danger');
}
/**
* Success Message
**/
function showSuccess(testId, message) {
$('#test_'+testId+'_message').text(message);
$('#test_'+testId+'_message').removeClass().addClass('alert alert-success');
}
/**
* Test E-Mail notification
**/
function isEmail(email) {
var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(email);
}
$('#testEmailButton').click(function() {
var password = docCookies.getItem('password');
if(!password) {
password = prompt('Enter admin password');
}
var email = $('#emailAddress').val().trim();
if (!email) {
showError('email', 'No email address specified');
return;
}
if (!isEmail(email)) {
showError('invalidEmail', 'Invalid email address specified');
return;
}
$.ajax({
url: api + '/test_email_notification',
data: {
password: password,
email: email
},
dataType: 'json',
cache: 'false'
}).done(function(data){
docCookies.setItem('password', password, Infinity);
if (data.status == "done") {
showSuccess('email', 'Done! Test is successful.');
} else {
showError('email', 'Error: ' + data.status);
}
});
});
/**
* Test Telegram Channel notification
**/
$('#testTelegramButton').click(function(){
var password = docCookies.getItem('password');
if(!password) {
password = prompt('Enter admin password');
}
$.ajax({
url: api + '/test_telegram_notification',
data: {
password: password,
},
dataType: 'json',
cache: 'false'
}).done(function(data){
docCookies.setItem('password', password, Infinity);
if (data.status == "done") {
showSuccess('telegram', 'Test done! Check pool logs for more debugging informations.');
} else {
showError('telegram', 'Error: ' + data.status);
}
});
});
</script>

View file

@ -0,0 +1,131 @@
<ul class="nav nav-tabs" id="UserListTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="UserListTabs{{coin}} role="presentation" class="{{active}}"><a href="#{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<h3>Users List (<span id="totalUsers">{{totalUsers}}</span> users)</h3>
<!-- Users list -->
<div class="card">
<div class="table-responsive">
<table class="table table-hover table-striped usersList">
<thead>
<tr>
<th class="col1">Wallet</th>
<th class="col2 sort">Hashrate <i class="fa fa-sort"></i></th>
<th class="col3 sort">Hashes <i class="fa fa-sort"></i></th>
<th class="col4 sort">Pending <i class="fa fa-sort"></i></th>
<th class="col5 sort">Paid <i class="fa fa-sort"></i></th>
<th class="col6 sort">Last share <i class="fa fa-sort"></i></th>
</tr>
</thead>
<tbody id="template">
{{#users}}
<tr>
<td class="col1"><a href="/?{{coin}}={{miner}}{{#childWallet}}&{{childWallet}}{{/childWallet}}#worker_stats">{{miner}}</a></td>
<td class="col2" data-sort="{{wallet.hashrate}}">{{readableHashrate}}</td>
<td class="col3" data-sort="{{wallet.hashes}}">{{readableHashes}}</td>
<td class="col4" data-sort="{{wallet.pending}}">{{readablePending}}</td>
<td class="col5" data-sort="{{wallet.paid}}">{{readablePaid}}</td>
<td class="col6" data-sort="{{wallet.lastShare}}">{{timeago}}</td>
</tr>
{{/users}}
</tbody>
</table>
</div>
</div>
</div>
</script>
<script>
function parseUsers(stats, wallets, active) {
var totalUsers = 0;
var walletsArray = [];
var properObject = {};
for(var wallet in wallets) {
if(wallets.hasOwnProperty(wallet)) {
var userData = wallets[wallet];
walletsArray.push({
coin: stats.config.coin,
miner: wallet,
childWallet: userData.childWallet,
wallet: userData,
timeago: $.timeago(new Date(userData.lastShare * 1000).toISOString()),
readablePending: getReadableCoin(stats, userData.pending, null, true),
readablePaid: getReadableCoin(stats, userData.paid, null, true),
readableHashrate: getReadableHashRateString(userData.hashrate) + '/s',
readableHashes: getReadableHashRateString(userData.hashes)
});
totalUsers++;
}
}
properObject['totalUsers'] = totalUsers
properObject['users'] = walletsArray.sort(function(a, b) {
return a.wallet.hashrate - b.wallet.hashrate
}).reverse();
properObject['coin'] = stats.config.coin
properObject['active'] = active
return properObject;
}
function createUserTable(promptPassword, api, parentStats, otherStats, active) {
var password = docCookies.getItem('password');
if(!password || promptPassword) {
password = prompt('Enter admin password');
}
$.ajax({
url: `${api}/admin_users`,
data: {password: password, otherCoin: otherStats.config.coin},
dataType: 'json',
cache: false,
success: function(data) {
docCookies.setItem('password', password, Infinity);
renderTemplate(parseUsers(parentStats, data, active), '#siblingTemplate', '#tab-content');
$('[data-toggle="tooltip"]').tooltip();
$('.usersList th.sort').on('click', sortTable);
},
error: function(e) {
docCookies.removeItem('password');
}
});
}
function Setup() {
let template = $('#siblingTabTemplate').html();
Mustache.parse(template)
let rendered = Mustache.render(template, {coin:lastStats.config.coin, symbol:`(${lastStats.config.symbol})`, active:'active'});
$('#UserListTabs').append(rendered)
createUserTable(null, api, lastStats, lastStats, 'active');
Object.keys(mergedStats).forEach(key => {
template = $('#siblingTabTemplate').html();
Mustache.parse(template)
rendered = Mustache.render(template, {coin:key, symbol:`(${mergedStats[key].config.symbol})`});
$('#UserListTabs').append(rendered)
createUserTable(null, mergedApis[key].api, mergedStats[key], lastStats);
})
sortElementList($(`#UserListTabs`), $(`#UserListTabs>li`), mergedStats)
$('#UserListTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
}
$(function() {
Setup()
});
</script>

140
website/pages/faq.html Normal file
View file

@ -0,0 +1,140 @@
<h3>Frequently Asked Questions (FAQ)</h3>
<h4 class="push-up-20" data-tkey="faq1_title">How do I pick which coins to merge mine?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq1_text"><p>The hash work of your miner application to the parent coin is also applied to the child coin you specify in the mining software pool password field.</p>
<p>You must mine at one parent coin, which in this case is ARQ for ArQmA.
Specify your ArQmA wallet address and static difficulty per the Getting Started page.
Using the pool password field in your miner to specify one of the child coin wallet addresses. See which child coins are listed on the pool's Dashboard page.
You will need at least a wallet address from an exchange or a wallet/paper wallet application to get an coin address for the parent coin and each child coin you wish to merge mine.</p>
<p>You can also connect multiple rigs with the same wallet address for the parent coin, and different child coin wallet address to apply hash to that child coin also.</p>
<p>Specify your rig_id in your miner software.</p>
<p>Put your child coin wallet address in the pool password field and put "@rig_id" at the end.
It can be a direct to exchange address also.</p>
<p>For example in XMR-STAK, the pools.txt config file looks something like this:
"rig_id" : "Johnny5",
An example wallet for Turtle child coin is "TRTL2aedfsr23blahlongaddressfield+paymentIDsomething"
so make it formatted for the pool password as
"pool_password" : "TRTL2aedfsr23blahlongaddressfield+paymentIDsomething@Johnny5"</p>
<p>You can also use the configuration generator within the <a href="#getting_started">Getting Started</a> section of the pool.</p>
<p>Also, you can segment your cpu mining on one mining application to be applied to
the parent coin and specify your hash work one of the several child coins.
There is no limit on how many workers you can specify. You can also customize your miner application to mine only with certain gpus to a particular parent/child combination. Probably you can run several mining applications in tandem as long as they use only resources you specify.</p>
</div>
<h4 class="push-up-20" data-tkey="faq1_title">Where are the stats for the pool? Why hasn't anything changed?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq1_text">The dashboard lists the coins being mined, reward for each block, current effort on each block for the merged mining. Sometimes the Pool Blocks section and Worker Statistics needs a refresh by your browser to get updated stats. Typically that is pressing CTRL+F5 to flush the cache and ask your brower for fresh data.</div>
<h4 class="push-up-20" data-tkey="faq1_title">What is difficulty?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq1_text">Difficulty is a measure of how difficult it is to find a hash below a given target. The target difficulty changes from block to block based on the network hashrate attempted by all nodes on a coin network. However, the difficulty for child coins can be dissimlar to the parent coin you start mining with</div>
<h4 data-tkey="faq2_title">What is luck?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq2_text">Mining is probabilistic in nature: if you find a block earlier than you statistically should on average you are lucky if it takes longer, you are unlucky. In a perfect World pool would find a block on 100% luck value. Less then 100% means the pool was lucky. More then 100% means the pool was unlucky.
</div>
<h4 data-tkey="faq3_title">What is share?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq3_text">Share is a possible valid hash for the block. Shares are beings sent by your rigs to the pool to prove their work. You should set your fixed difficulty to be somewhere around your hash rate average on your miner multiplied by 28-30. Aim for your average number of accepted shares to be within the block time (30 seconds typically for child coins, 2 minutes for ARQ)
If your shares are accepted faster, but with lower difficulty each share is worth less, but you should get at least one share in per average block time. It doesn't help the pool by spamming a large amount of low difficulty shares. It tends to tie up more resources and might get you banned.</div>
<h4 data-tkey="faq4_title">What is block?<h4>
<div class="card padding-15 push-down-10" data-tkey="faq4_text">Transaction data is recorded in blocks. New transactions are being processes by miners into new blocks which are added to the end of the blockchain.</div>
<h4 data-tkey="faq5_title">How long does it take to find a block?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq5_text">It depends on amount of active miners. The more miners work on pool → the more hashrate pool has → the more blocks are found by the pool. However the more miners are active → the less reward you get from each block found.
Probablistically, even smaller pools will less miners or hash rate will eventually get a block.
Decentralizing the hash proof of work across several pools on any network is important for security of the coin network, for both the parent coin and the child coins.
The block time is how long it can take on average amount effort . The average for ArQmA is 120 seconds. However, some of the child coins have block timeframes on the average of 15 to 30 seconds. Check your child coins network specification. Some blocks are solved faster than the average block time, some blocks can have a higher than average block effort time.
Also some other pools might solve the block first, and there is a slim possibility of an orphan block on a child coin being mined.</div>
<h4 data-tkey="faq6_title">What is an orphan block?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq6_text">An orphan is a block that didn't meet the requirement as a solution to the block found. Also, there can be a situation where another pool or solo miner found the block solution first, and narrowly won the race. Blocks are confirmed by hash verfication by all the nodes on the coin's network. If there is a consensus of which node(pool,solo) found it first, then that block is added to the block chain permanenty with credit applying to that pool/solo/node.
A few orphan blocks on child coins can happen when the parent coin's hash work doesn't meet the requirements. </div>
<h4 data-tkey="faq6_title">Which payouts scheme is used?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq6_text">Proportional (Share-based): Every time a block is found, its reward is split between miners according to the number of shares they submitted.</div>
<h4 data-tkey="faq7_title">How current payout estimate is calculated?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq7_text">The estimated payout is a calculated using your percentage of valid shares on the total for current round in proportion to the total shares submitted by all miners/workers in that round. This percentage is then applied to the reward of the last block found by the network and subtracting the small pool fee.. See the Worker Statistics page on the pool web page.
</div>
<h4 data-tkey="faq8_title">I have been mining on this pool for 1 hour but still have not received any payouts. WTF?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq8_text"><p>As soon as the block is found you will get your reward. Please wait a little bit more time. In the case of ArQmA, a block has at least 18 confirmations before the pool starts its payout cycle. Typically every 36 minutes for a completed block plus the time interval set by the pool operator on the pool's Dashboard screeen. Payments can be halted for various reasons within the automated pool software, but highly unlikely. There is usually a minimum payout for each parent coin and child coins. Payments for matured blocks that meet the minimum can also be triggered manually by a pool operator/administrator. Ask nicely in Telegram or Discord support. Please have your information all in order before you ask such as miner application, version number, gpu and cpu information, wallet addresses, and error messages reported.
</p><p>The merge mined child coins have a different number of confirmation blocks needed, but at least the pool checks for fully verified blocks set at the interval on the Dashboard page. Not every parent block found generates a child block.
Check the Pool Blocks page on the pool. Or configure your settings to get an email alert if you like on the Settings pool page.
</p></div>
<h4 data-tkey="faq9_title">My hashrate is wrong! Why?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq9_text">Since you start to mine your hashrate grows gradually. Please wait. The pool determines your hashrate based on the amount of shares sent by your mining rigs (workers). This value could be a little bit different from reported hasrate (in your mining software).
</div>
<h4 data-tkey="faq9_title">What is solo mining?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq9_text"><p>Solo mining is attempting to find a block by yourself separate from the pool of proportional miners collectively solving the current block.You get almost the entire block reward minus a small fee for the pool. You can specfy your mining software by changing the wallet address with a prefix of "solo:" added to your wallet specification.
However, if the coin network has a high hash in total (see Dashboard), the difficulty is also higher. Typically only very large mining rigs with at least 5-10% of the coin network total is needed to get timely solo blocks. However, you could get a string of blocks on lucky streak, then not find a block solution for a very long time. The more hash rate, the higher the probability(luck). You can generate a solo configuration on the Getting Started page on the pool. Tick the checkbox "solo mining". However, as solo you are also competing against the pool proportional share miners, and evvery single node on the parent coin network also.
</p>
<p>In the case of solo merged mining specified in the pool password field, you are also competing against the main pool users on proportional shares, and the entire child coin network and the other pools on the parent network that are also merge mining. However the reward is much higher since you might get two coin blocks(or more) for the same effort.
</p>
</div>
<h4 data-tkey="faq9_title">I've been banned by the pool itself. What do I do now?</h4>
<div class="card padding-15 push-down-10" data-tkey="faq9_text"><p>Disconnect your miner for five minutes at least. Then try again. Please pay close attention to error messages reported by the pool software to your miner client software. Typical errors are invalid parent wallet address format, or bad child coin wallet address specified in the pool password field. Check your miner logs if you have them turned on.
</p>
<p>Did you forget to turn off nicehash option?</p>
<p>For persistent banning, check with the pool operator or Admininstrator to see if there is something else going wrong outside of your control. Links for Telegram and Discord support are on the left side of the pool web page front end.</p>
</div>
<div id="telegramBot">
<h4 data-tkey="faq10_title">How to use the Telegram Bot?</h4>
<div class="card padding-15">
<div data-tkey="faq10_text">Telegram bot will report via Telegram, when your worker is connected, disconnected or banned, and payments have been made to your wallet. Also you can check pool stats directly from him.</div>
<br/>
<span data-tkey="botName">Bot name</span>: <a id="telegramBotURL" target="_blank" rel="nofollow" href="https://t.me/Pool_bot">@<span id="telegramBotName">Pool_bot</span></a><br/>
<br/>
<span data-tkey="botCommands">Commands</span>:</br/>
<span id="botStats">/stats</span> - <span data-tkey="botStats">Pool statistics</span><br />
<span id="botBlocks">/blocks</span> - <span data-tkey="botBlocks">Blocks notifications (enable or disable)</span><br />
<span id="botReport">/report</span> <em><span data-tkey="botAddress">address</span></em> - <span data-tkey="botReport">Miner statistics</span><br />
<span id="botNotify">/notify</span> <em><span data-tkey="botAddress">address</span></em> - <span data-tkey="botNotify">Miner notifications (enable or disable)</span><br />
<br />
<span data-tkey="botMultiAddresses">Multiple addresses monitoring available.</span></div>
</div>
</div>
<!-- Javascript -->
<script>
// Update current page
currentPage = {
destroy: function(){},
update: function(updateKey){
if (!lastStats.config.telegramBotName) {
$('#telegramBot').hide();
} else {
var botName = lastStats.config.telegramBotName;
var botURL = 'https://t.me/'+botName;
$('#telegramBotURL').attr('href', botURL);
updateText('telegramBotName', botName);
var botStats = lastStats.config.telegramBotStats;
if (botStats) updateText('botStats', botStats);
var botReport = lastStats.config.telegramBotReport;
if (botReport) updateText('botReport', botReport);
var botNotify = lastStats.config.telegramBotNotify;
if (botNotify) updateText('botNotify', botNotify);
var botBlocks = lastStats.config.telegramBotBlocks;
if (botBlocks) updateText('botBlocks', botBlocks);
}
}
};
</script>

View file

@ -0,0 +1,332 @@
<!-- Connection Details -->
<div class="row">
<div class="col-sm-6">
<h3><span data-tkey="connectionDetails">Connection Details</span></h3>
<div class="card padding-l-10 padding-r-10">
<div class="stats">
<div><i class="fa fa-cloud"></i> <span data-tkey="miningPoolHost">Mining Pool Address</span>: <span id="miningPoolHost"></span></div>
<div><i class="fa fa-cubes"></i> <span data-tkey="cnAlgorithm">Algorithm</span>: <span id="cnAlgorithm"></span></div>
</div>
</div>
<h4 class="push-up-15"><span data-tkey="username">Username<span></h4>
<div class="card padding-l-10 padding-r-10">
<div class="stats">
<div><i class="fa fa-key"></i> <span data-tkey="usernameDesc">This is your wallet address</span></div>
<div id="paymentId"><i class="fa fa-exchange"></i> <span data-tkey="paymentId">Exchange Payment ID</span>: <span><u data-tkey="parentaddress">parent address</u><span id="paymentIdSeparator">.</span><u data-tkey="addrPaymentId">paymentID</u></span></div>
<div id="fixedDiff"><i class="fa fa-wrench"></i> <span data-tkey="fixedDiff">Difficulty locking</span>: <span><u data-tkey="parentaddress">parent address</u><span id="fixedDiffSeparator">+</span><u data-tkey="addrDiff">diff</u></span></div>
</div>
</div>
<h4 class="push-up-15"><span data-tkey="password">Password</span></h4>
<div class="card padding-l-10 padding-r-10">
<div class="stats">
<div><i class="fa fa-key"></i> <span data-tkey="usernameDesc2">Use your <strong id="paymentChildCoins">Iridium OR Nibble wallet address</strong> in the password field for merged mining.</span></div>
<div id="paymentId"><i class="fa fa-exchange"></i> <span data-tkey="paymentId">Exchange Payment ID</span>: <span><u data-tkey="childaddress">child address</u><span id="paymentIdSeparator">+</span><u data-tkey="addrPaymentId">paymentID</u></span></div>
<div><i class="fa fa-server"></i> <span data-tkey="fixedDiff2">Worker Name</span>: <span><u data-tkey="childaddress">child-address</u><span id="fixedDiffSeparator2">@</span><u data-tkey="addrDiff2">workerName</u></span></div>
<div><i class="fa fa-exchange fa-server"></i> <span data-tkey="fixedDiff2PaymentId">Payment ID and Worker Name</span>: <span><u data-tkey="childaddress">child-address</u>+<u data-tkey="">paymentID</u><span id="fixedDiffSeparator2">@</span><u data-tkey="addrDiff2">workerName</u></span></div>
</div>
</div>
</div>
<!-- Mining ports -->
<div class="col-sm-6">
<h3><span data-tkey="miningPorts">Mining Ports</span></h3>
<div class="card">
<div id="miningPorts" class="table-responsive">
<table class="table table-hover table-striped">
<thead>
<tr>
<th class="col1"><span data-tkey="port">Port</span></th>
<th class="col2"><span data-tkey="portDiff">Starting Difficulty</span></th>
<th class="col3"><span data-tkey="description">Description</span></th>
</tr>
</thead>
<tbody id="miningPorts_rows">
<tr>
<td class="col1"><span class="miningPort"></span></td>
<td class="col2"><span class="miningPortDiff"></span></td>
<td class="col3"><span class="miningPortDesc"></span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Mining Applications and Configuration Generator -->
<h3><span data-tkey="miningApps">Mining Applications</span></h3>
<!-- Configuration Generator -->
<div class="card padding-15">
<p><span data-tkey="configGeneratorDesc">Generate your custom configuration to mine on our pool</span></p>
<div id="configGenerator" class="row">
<div class="col-sm-3 col-xs-8">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-link"></i></span>
<select class="form-control" id="gMiningPort"></select>
</div>
</div>
<div class="col-sm-3 col-xs-4">
<div class="input-group push-down-5">
<span style="white-space: nowrap;">Solo Mining
<label><input type="checkbox" name="solo" id="gSolo" value="1" title="Check if want to mine both pools solo"></label>
</span>
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-server"></i></span>
<input class="form-control" id="gWorkerName" data-tplaceholder="workerNameField" type="text" placeholder="Worker_Name" />
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-key"></i></span>
<input class="form-control" id="gAddress" type="text" data-tplaceholder="addressField" placeholder="Wallet Address" required="required" />
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-exchange"></i></span>
<input class="form-control" id="gPaymentID" type="text" data-tplaceholder="paymentIdField" placeholder="Parent Payment ID for exchanges (optional)" />
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-key"></i></span>
<input class="form-control" id="gChildAddress" type="text" data-tplaceholder="childAddressField" placeholder="Child Address" required="required" />
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-exchange"></i></span>
<input class="form-control" id="gChildPaymentID" type="text" data-tplaceholder="childPaymentIdField" placeholder="Child Payment ID for exchanges (optional)" />
</div>
</div>
<div class="col-sm-6 col-xs-12">
<div class="input-group push-down-5">
<span class="input-group-addon"><i class="fa fa-wrench"></i></span>
<input class="form-control" id="gDifficulty" type="text" data-tplaceholder="fixedDiffField" placeholder="Fixed difficulty (optional)" />
</div>
</div>
<div class="col-md-12 push-up-5">
<input id="generateConf" type="submit" tvalue="generateConfig" value="Generate configuration" class="btn btn-default" data-toggle="collapse" href="#xmrstak" />
</div>
</div>
</div>
<!-- Mining Applications -->
<div class="card push-up-5">
<div id="miningApps" class="table-responsive">
<table class="table">
<thead>
<tr>
<th><i class="fa fa-book"></i> <span data-tkey="appName">App Name</span></th>
<th><i class="fa fa-car"></i> <span data-tkey="appArch">Architecture</span></th>
<th><i class="fa fa-star"></i> <span data-tkey="appDesc">Features</span></th>
<th><i class="fa fa-download"></i> <span data-tkey="download">Download</span></th>
<th><i class="fa fa-file-code-o"></i> <span data-tkey="configuration">Configuration</span></th>
</tr>
</thead>
<tbody id="miningApps_rows">
<!-- Lethean ProgMiner (recommended) -->
<tr class="appInfo">
<td class="miningAppTitle"><strong>Lethean ProgMiner</strong></td>
<td>GPU (AMD/NVIDIA)</td>
<td>Official Lethean ProgPoWZ GPU miner — recommended</td>
<td><a class="btn btn-success" target="_blank" href="https://forge.lthn.ai/lthn/progminer/releases"><span data-tkey="download">Download</span></a></td>
<td><a class="btn btn-default" role="button" data-toggle="collapse" href="#progminer" aria-expanded="true" aria-controls="collapseExample"><span data-tkey="showConfig">See more</span></a></td>
</tr>
<tr class="appConfig">
<td colspan="5">
<div class="collapse" id="progminer">
<pre><code>./progminer -P stratum+tcp://<span class="exampleLogin">YOUR_WALLET_ADDRESS</span>.<span class="examplePassword">YOUR_WORKER_NAME</span>@<span class="exampleHost">POOL_HOST</span>:<span class="examplePort">PORT</span></code></pre>
</div>
</td>
</tr>
<!-- T-Rex Miner -->
<tr class="appInfo">
<td class="miningAppTitle">T-Rex Miner</td>
<td>CUDA (NVIDIA)</td>
<td>High-performance NVIDIA GPU miner with ProgPoW support</td>
<td><a class="btn btn-success" target="_blank" href="https://github.com/trexminer/T-Rex/releases/latest"><span data-tkey="download">Download</span></a></td>
<td><a class="btn btn-default" role="button" data-toggle="collapse" href="#trex" aria-expanded="true" aria-controls="collapseExample"><span data-tkey="showConfig">See more</span></a></td>
</tr>
<tr class="appConfig">
<td colspan="5">
<div class="collapse" id="trex">
<pre><code>t-rex -a progpowz -o stratum+tcp://<span class="exampleHost">POOL_HOST</span>:<span class="examplePort">PORT</span> -u <span class="exampleLogin">YOUR_WALLET_ADDRESS</span> -p <span class="examplePassword">YOUR_WORKER_NAME</span></code></pre>
</div>
</td>
</tr>
<!-- Team Red Miner -->
<tr class="appInfo">
<td class="miningAppTitle">Team Red Miner</td>
<td>OpenCL (AMD)</td>
<td>AMD GPU miner with ProgPoW support</td>
<td><a class="btn btn-success" target="_blank" href="https://github.com/todxx/teamredminer/releases/latest"><span data-tkey="download">Download</span></a></td>
<td><a class="btn btn-default" role="button" data-toggle="collapse" href="#teamRedMiner" aria-expanded="true" aria-controls="collapseExample"><span data-tkey="showConfig">See more</span></a></td>
</tr>
<tr class="appConfig">
<td colspan="5">
<div class="collapse" id="teamRedMiner">
<pre><code>teamredminer -a progpow -o stratum+tcp://<span class="exampleHost">POOL_HOST</span>:<span class="examplePort">PORT</span> -u <span class="exampleLogin">YOUR_WALLET_ADDRESS</span> -p <span class="examplePassword">YOUR_WORKER_NAME</span></code></pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Javascript -->
<script>
// Cleanup mining ports
var lastPortsJson = '';
var $miningPorts = $('#miningPorts_rows');
var miningPortTemplate = $miningPorts.html();
$miningPorts.empty();
var $miningPortSelect = $('#gMiningPort');
$miningPortSelect.empty();
// Update current page
currentPage = {
destroy: function(){
},
update: function(updateKey){
var portsJson = JSON.stringify(lastStats.config.ports);
if (lastPortsJson !== portsJson) {
lastPortsJson = portsJson;
var $miningPortChildren = [];
var $miningPortOptions = [];
for (var i = 0; i < lastStats.config.ports.length; i++) {
var portData = lastStats.config.ports[i];
var $portChild = $(miningPortTemplate);
$portChild.find('.miningPort').text(portData.port);
$portChild.find('.miningPortDiff').text(formatDifficulty(portData.difficulty));
$portChild.find('.miningPortDesc').text(portData.desc);
$miningPortChildren.push($portChild);
$miningPortOptions.push('<option value="'+portData.port+'">'+portData.port+' &ndash; '+portData.desc+'</option>');
}
$miningPorts.empty().append($miningPortChildren);
$miningPortSelect.empty().append($miningPortOptions);
updateTextClasses('examplePort', lastStats.config.ports[0].port.toString());
}
updateText('miningPoolHost', getPoolHost());
updateTextClasses('exampleHost', getPoolHost());
updateText('paymentIdSeparator', lastStats.config.paymentIdSeparator);
updateText('fixedDiffSeparator', lastStats.config.fixedDiffSeparator);
let childCoins = Object.keys(mergedStats).join(' or ')
updateText('paymentChildCoins', `${childCoins} wallet address`);
if (!lastStats.config.fixedDiffEnabled) $('#fixedDiff').hide();
var coin = lastStats.config.coin.toLowerCase() || null;
var cnAlgorithm = lastStats.config.cnAlgorithm || "cryptonight";
var cnVariant = lastStats.config.cnVariant || 0;
algorithm = '';
xmrstakAlgo = '';
if (cnAlgorithm == "argon2") {
if (cnVariant === 1)
algorithm = 'Argon2id WRKZ';
else
algorithm = 'Argon2id Chukwa';
} else if (cnAlgorithm == "randomx") {
if (cnVariant === 1)
algorithm = 'CryptoNight DefyX';
else if (cnVariant === 2)
algorithm = 'RandomARQ';
else if (cnVariant === 17) {
algorithm = 'RandomWOW';
xmrstakAlgo = 'randomX_wow';
} else if (cnVariant === 18) {
algorithm = 'RandomXL';
xmrstakAlgo = 'randomX_loki';
} else {
algorithm = 'RandomX';
xmrstakAlgo = 'randomX';
}
} else if (cnAlgorithm == "cryptonight_light") {
if (cnVariant === 1) {
algorithm = 'CryptoNight Lite v7';
xmrstakAlgo = 'cryptonight_lite_v7';
} else {
algorithm = 'CryptoNight Lite';
xmrstakAlgo = 'cryptonight_lite';
}
} else if (cnAlgorithm == "cryptonight_pico" || cnAlgorithm == "cryptonight-turtle") {
if (cnAlgorithm == "cryptonight-turtle" && cnVariant === 2) {
algorithm = 'CryptoNight Ultra v2';
} else {
algorithm = 'CryptoNight Turtle';
xmrstakAlgo = 'cryptonight_turtle';
}
} else if (cnAlgorithm == "cryptonight_heavy") {
if (cnVariant === 1) {
algorithm = 'CryptoNight Haven';
xmrstakAlgo = 'cryptonight_haven';
} else if (cnVariant === 2) {
algorithm = 'CryptoNight Saber';
xmrstakAlgo = 'cryptonight_bittube2';
} else {
algorithm = 'CryptoNight Heavy';
xmrstakAlgo = 'cryptonight_heavy';
}
} else if (cnAlgorithm == "progpowz") {
algorithm = 'ProgPoWZ (GPU)';
xmrstakAlgo = 'progpowz';
} else {
algorithm = cnAlgorithm;
xmrstakAlgo = cnAlgorithm;
}
updateText('cnAlgorithm', algorithm);
updateText('xmrstakAlgo', xmrstakAlgo);
}
};
/**
* Configuration generator
**/
$('#generateConf').click(function() {
// Mining Port
var port = $('#gMiningPort').val();
updateTextClasses('examplePort', port);
// Username
var address = $('#gAddress').val().replace(/\s+/g, '').trim();
var childAddress = $('#gChildAddress').val().replace(/\s+/g, '').trim();
var solo = $('#gSolo').val();
var paymentID = $('#gPaymentID').val().replace(/\s+/g, '').trim();
var childPaymentID = $('#gChildPaymentID').val().replace(/\s+/g, '').trim();
var difficulty = parseInt($('#gDifficulty').val().replace(/\s+/g, '').trim());
var workerName = $('#gWorkerName').val().replace(/\s+/g, '').trim();
var login = address ? address : 'YOUR_WALLET_ADDRESS';
if (paymentID) login = login + lastStats.config.paymentIdSeparator + paymentID;
if (difficulty) login = login + lastStats.config.fixedDiffSeparator + difficulty;
if ($('input[name=solo]').is(':checked')) login = `solo:${login}`
updateTextClasses('exampleLogin', login);
// Password
var childLogin = childAddress ? childAddress : 'YOUR_CHILD_WALLET_ADDRESS';
if (childPaymentID) childLogin = childLogin + lastStats.config.paymentIdSeparator + childPaymentID;
if (difficulty) childLogin = childLogin + lastStats.config.fixedDiffSeparator + difficulty;
if (workerName) childLogin = `${childLogin}@${workerName}`
updateTextClasses('examplePassword', childLogin);
});
</script>

303
website/pages/home.html Normal file
View file

@ -0,0 +1,303 @@
<!-- Statistics -->
<div id="poolStats" class="row">
<div id="mainPoolStats"></div>
<div id="networkStats"></div>
<div id="poolDetails"></div>
</div>
<script id="mainPoolTemplate" type="text/x-handlebars-template">
<!-- Pool Hash Rate -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-dashboard"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="poolHashrate">PROP/SOLO Pool Hash Rate</span></div>
<div class="value"><span id="poolHashrate" class="smallText">N/A</span> <span class="smallText">(<span id="hashPower">0%</span>)</span></div>
<div class="value"><span id="poolHashrateSolo" class="smallText">N/A</span> <span class="smallText">(<span id="hashPowerSolo">0%</span>)</span></div>
</div>
</div>
</div>
<!-- Blocks Found -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect" id="infoBlocksTotal">
<div class="icon">
<span class="fa fa-cubes"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blocksTotal">Blocks Found</span> (PROP/SOLO)</div>
<div class="value">
{{#blocks}}
<span class="smallText" id="blocksTotal{{coin}}">{{blocks}}/{{blocksSolo}}</span><sup>{{symbol}}</sup>&nbsp;
{{/blocks}}
</div>
</div>
</div>
</div>
<!-- Blocks Found Every -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect" id="infoBlocksFound">
<div class="icon">
<span class="fa fa-history"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blockSolvedTime">Blocks Found Every</span></div>
<div class="value">
<span class="smallText" id="blockSolvedTime">N/A</span> <span class="smallText">(<span class="smallText">estimated</span>)</span>
</div>
<div class="value">
<span class="smallText">LAST BLOCK: <span id="poolLastBlockFound">Never</span>
</div>
</div>
</div>
</div>
<!-- Current Effort -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-line-chart"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="currentEffort">Current Effort</span></div>
<div class="value">
{{#efforts}}
<span class="smallText" id="currentEffort{{coin}}">{{effort}}</span><sup>{{symbol}}</sup>&nbsp;
{{/efforts}}
</div>
</div>
</div>
</div>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div id="networkStats{{coin}}">
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-dashboard"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="networkHashrate">Network Hash Rate</span> ({{symbol}})</div>
<div class="value"><span id="networkHashrate{{coin}}">N/A</span></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-unlock-alt"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="networkDifficulty">Difficulty</span> ({{symbol}})</div>
<div class="value"><span id="networkDifficulty{{coin}}">N/A</span></div>
</div>
</div>
</div>
<!-- Blockchain Height -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-bars"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blockchainHeight">Blockchain Height</span> ({{symbol}})</div>
<div class="value"><span id="blockchainHeight{{coin}}">N/A</span></div>
</div>
</div>
</div>
<!-- Last Reward -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-dollar"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="networkLastReward">Last Reward</span> ({{symbol}})</div>
<div class="value"><span id="networkLastReward{{coin}}">N/A</span></div>
</div>
</div>
</div>
</div>
</script>
<script id="poolDetailTemplate" type="text/x-handlebars-template">
<!-- Connected Miners -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-group"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="propSoloConnectedMiners">Connected Miners</span> (PROP/SOLO)</div>
<div class="value">
{{#blocks}}
<span class="smallText" id="poolMiners{{coin}}">{{miners}}/{{minersSolo}}</span><sup>{{symbol}}</sup>&nbsp;
{{/blocks}}
</div>
</div>
</div>
</div>
<!-- Pool Fee -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-dollar"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="poolFee">Pool Fee</span></div>
<div class="value"><span id="poolFee">N/A</span><sup>{{symbol}}</sup></div>
</div>
</div>
</div>
<!-- Minimum Payout -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-dollar"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsMinimum">Minimum Payout</span></div>
<div class="value"><span id="paymentsMinimum">N/A</span></div>
</div>
</div>
</div>
<!-- Payment Interval -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect">
<div class="icon">
<span class="fa fa-clock-o"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsInterval">Payment Interval</span></div>
<div class="value"><span id="paymentsInterval">N/A</span></div>
</div>
</div>
</div>
<!-- Last Hash -->
<div class="col-sm-12">
<div class="hashInfo hoverExpandEffect">
<div class="text"><span data-tkey="lastHash">Last Hash</span></div>
<div class="content clearfix">
<div class="value"><a id="lastHash" target="_blank">N/A</a></div>
<div class="time">(<span id="networkLastBlockFound">Never</span>)</div>
</div>
</div>
</div>
</script>
<!-- Pool Charts -->
<div class="row">
<div class="col-sm-6 poolChart push-up-15">
<h4><span data-tkey="hashRate">Hash Rate</span></h4>
<div id="chartHashrate" class="card" data-chart="hashrate">
<div class="chart"></div>
</div>
</div>
<div class="col-sm-6 poolChart push-up-15">
<h4><span data-tkey="difficulty">Difficulty</span></h4>
<div id="chartDifficulty" class="card" data-chart="diff">
<div class="chart"></div>
</div>
</div>
<div class="col-sm-6 poolChart push-up-15">
<h4><span data-tkey="miners">Miners</span></h4>
<div id="chartMiners" class="card" data-chart="miners">
<div class="chart"></div>
</div>
</div>
<div class="col-sm-6 poolChart push-up-15">
<h4><span data-tkey="workers">Workers</span></h4>
<div id="chartWorkers" class="card" data-chart="workers">
<div class="chart"></div>
</div>
</div>
</div>
<!-- Javascript -->
<script>
// Update current page
let lastBlockFound = null
currentPage = {
destroy: function(){
$('#networkLastBlockFound,#poolLastBlockFound').timeago('dispose');
},
update: function(updateKey){
if (lastStats)
$('#networkLastBlockFound').timeago('update', new Date(lastStats.lastblock.timestamp * 1000).toISOString());
let stats = updateKey === parentCoin ? lastStats : mergedStats[updateKey]
if (stats) {
home_GenerateNetworkStats(updateKey, stats.config.symbol)
if (!lastBlockFound)
$('#poolLastBlockFound').removeAttr('title').data('ts', '').update('Never')
if (stats.pool.lastBlockFound) {
let lastChildBlockFound = parseInt(stats.pool.lastBlockFound)
if (lastChildBlockFound > lastBlockFound) {
lastBlockFound = lastChildBlockFound
$('#poolLastBlockFound').timeago('update', new Date(lastBlockFound).toISOString());
}
}
updateText(`networkHashrate${updateKey}`, getReadableHashRateString(stats.network.difficulty / stats.config.coinDifficultyTarget) + '/sec');
updateText(`networkDifficulty${updateKey}`, formatNumber(stats.network.difficulty.toString(), ' '));
updateText(`blockchainHeight${updateKey}`, formatNumber(stats.network.height.toString(), ' '));
updateText(`networkLastReward${updateKey}`, getReadableCoin(stats, stats.lastblock.reward));
updateText(`poolMiners${updateKey}`, `${stats.pool.miners}/${stats.pool.minersSolo}`);
updateText(`blocksTotal${updateKey}`, `${stats.pool.totalBlocks}/${stats.pool.totalBlocksSolo}`);
updateText(`currentEffort${updateKey}`, (stats.pool.roundHashes / stats.network.difficulty * 100).toFixed(1) + '%');
let el = updateText('lastHash', lastStats.lastblock.hash)
if (el)
el.setAttribute('href', getBlockchainUrl(lastStats.lastblock.hash, lastStats));
updateText('poolHashrate', 'PROP: ' + getReadableHashRateString(lastStats.pool.hashrate) + '/sec');
updateText('poolHashrateSolo', 'SOLO: ' + getReadableHashRateString(lastStats.pool.hashrateSolo) + '/sec');
var hashPowerSolo = lastStats.pool.hashrateSolo / (lastStats.network.difficulty / lastStats.config.coinDifficultyTarget) * 100;
updateText ('hashPowerSolo', hashPowerSolo.toFixed(2) + '%');
var hashPower = lastStats.pool.hashrate / (lastStats.network.difficulty / lastStats.config.coinDifficultyTarget) * 100;
updateText('hashPower', hashPower.toFixed(2) + '%');
updateText('blockSolvedTime', getReadableTime(lastStats.network.difficulty / lastStats.pool.hashrate));
}
}
};
// Enable timeago on last block found
$('#networkLastBlockFound,#poolLastBlockFound').timeago();
// Handle charts tooltip
$(function() {
$('[data-toggle="tooltip"]').tooltip();
});
// Render charts
var xhrRenderCharts;
$(function(){
xhrRenderCharts = $.ajax({
url: api + '/stats',
cache: false,
success: home_CreateCharts
});
});
home_InitTemplate(lastStats, mergedStats)
</script>

151
website/pages/market.html Normal file
View file

@ -0,0 +1,151 @@
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<div class="row" id="calculator">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTabs{{coin}} role="presentation" class="{{active}}"><a href="#{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<!-- Market -->
<script id="siblingMarketTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<div id="marketStats{{coin}}" class="row">
<div id="marketInfos{{coin}}" class="clearfix marketInfos"><div class="col-xs-12"><span class="fa fa-spinner fa-spin"></span> <span data-tkey="loadingMarket">Loading market prices</span> ...</div></div>
<div class="col-sm-6 marketChart push-down-15">
<div class="card">
<h4><span data-tkey="priceIn">Price in</span> <span id="priceChartCurrency{{coin}}">USD</span></h4>
<div class="chart" style="height:120px;">
<canvas id="chart{{coin}}_price"></canvas>
<a class="chart-style"></a>
</div>
</div>
</div>
<div class="col-sm-6 marketChart push-down-15">
<div class="card">
<h4><span data-tkey="hashPer">Hash/</span><span id="profitChartProfit{{coin}}">USD</span> <span data-toggle="tooltip" data-placement="top" data-original-title="Reward * Rate / Difficulty"><i class="fa fa-question-circle"></i></span></h4>
<div class="chart" style="height:120px;">
<canvas id="chart{{coin}}_profit"></canvas>
<a class="chart-style"></a>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="siblingCalculatorTemplate" type="text/x-handlebars-template">
<!-- Mining Profit Calculator -->
<div id="miningProfitCalc{{coin}}">
<h3><span data-tkey="estimateProfit">Estimate Mining Profits</span></h3>
<div id="calcHashHolder">
<div class="input-group">
<input class="form-control" id="calcHashRate" data-tplaceholder="enterYourHashrate" placeholder="Enter Your Hash Rate" type="number">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" id="calcHashDropdown">
<span id="calcHashUnit" data-mul="1">KH/s</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="menu" id="calcHashUnits">
<li><a href="#" data-mul="0">H/s</a></li>
<li><a href="#" data-mul="1">KH/s</a></li>
<li><a href="#" data-mul="2">MH/s</a></li>
</ul>
</div>
<span class="input-group-addon">=</span>
</div>
</div>
</div>
</script>
<script id="calcHashResultTemplate" type="text/x-handlebars-template">
<span class="input-group-addon" id="calcHashResultsHolder{{coin}}"><div id="calcHashAmount{{coin}}"><span id="calcHashAmount{{coin}}1"></span><br/><span id="calcHashAmount{{coin}}2"></span></div> <div id="calcHashPeriod{{coin}}"><span data-tkey="perDay">per day</span></div></span>
</script>
<!-- Javascript -->
<script>
// Market settings
let priceSource = 'cryptonator';
let priceCurrency = 'USD';
if (typeof cryptonatorWidget !== 'undefined' && typeof marketCurrencies === 'undefined') {
let marketCurrencies = cryptonatorWidget;
}
// Charts initialized
let chartsInitialized = {}
let loadedData = {}
let intervalChartsUpdate = {}
let ranOnce = false
let xhrMarketGets = {}
let marketPrices = {}
let currencyPairs = {}
// Update current page
currentPage = {
destroy: function(){
if (chartsInitialized) {
Object.keys(chartsInitialized).forEach(key => {
chartsInitialized[key] = false;
clearInterval(intervalChartsUpdate[key]);
})
}
if (xhrMarketGets) {
Object.keys(xhrMarketGets).forEach(key => {
if (xhrMarketGets[key])
xhrMarketGets[key].abort();
})
}
$('#blocksTabs a').off('click')
$('#calcHashUnits > li > a').off('click')
$('#calcHashRate').off('keyup')
},
update: function(updateKey){
}
};
function RunOnce() {
/**
* Hash Profitability Calculator
**/
// Automatically update profit calculation on key press
$('#calcHashRate')
.keyup((e) => {
market_CalcEstimateProfit(marketPrices)
})
.change((e) => {
market_CalcEstimateProfit(marketPrices)
})
// Click on button
$('#calcHashUnits > li > a').click(function(e){
e.preventDefault();
$('#calcHashUnit').text($(this).text()).data('mul', $(this).data('mul'));
market_CalcEstimateProfit(marketPrices);
});
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
return true
}
// Handle tooltip
$(function() {
$('[data-toggle="tooltip"]').tooltip();
});
market_InitTemplate(ranOnce, chartsInitialized, loadedData, marketPrices, intervalChartsUpdate, currencyPairs, xhrMarketGets)
</script>

138
website/pages/payments.html Normal file
View file

@ -0,0 +1,138 @@
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTabs{{coin}}" role="presentation" class="{{active}}"><a href="#{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<!-- Statistics -->
<div class="row paymentsStats">
<!-- Total Payments -->
<div class="col-lg-3 col-sm-6">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-money"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsTotal">Total Payments</span></div>
<div class="value"><span id="paymentsTotal{{coin}}">N/A</span> <span class="smallText">(<strong><span id="paymentsTotalPaid{{coin}}">N/A</span></strong> <span data-tkey="minersCount">miners</span>)</span></div>
</div>
</div>
</div>
<!-- Minimum Payment Threshold -->
<div class="col-lg-3 col-sm-6">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-dollar"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsMinimum">Minimum Payout</span></div>
<div class="value"><span id="paymentsMinimum{{coin}}">N/A</span></div>
</div>
</div>
</div>
<!-- Payment Interval -->
<div class="col-lg-3 col-sm-6">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-clock-o"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsInterval">Payment Interval</span></div>
<div class="value"><span id="paymentsInterval{{coin}}">N/A</span></div>
</div>
</div>
</div>
<!-- Denomination Unit -->
<div class="col-lg-3 col-sm-6">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-hashtag"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="paymentsDenomination">Denomination Unit</span></div>
<div class="value"><span id="paymentsDenomination{{coin}}">N/A</span></div>
</div>
</div>
</div>
</div>
<!-- Report -->
<div class="card push-up-10">
<div id="paymentsReport{{coin}}" class="table-responsive">
<table class="table table-hover table-striped">
<thead>
<tr>
<th class="col1"><span data-tkey="timeSent">Time Sent</span></th>
<th class="col2"><span data-tkey="transactionHash">Transaction Hash</span></th>
<th class="col3"><span data-tkey="amount">Amount</span></th>
<th class="col4"><span data-tkey="fee">Fee</span></th>
<th class="col5"><span data-tkey="mixin">Mixin</span></th>
<th class="col6"><span data-tkey="payees">Payees</span></th>
</tr>
</thead>
<tbody id="paymentsReport{{coin}}_rows">
</tbody>
</table>
</div>
</div>
<p class="text-center push-up-10">
<button type="button" class="btn btn-default" id="loadMorePayments{{coin}}"><span data-tkey="loadMore">Load More</span></button>
</p>
</div>
</script>
<!-- Javascript -->
<script>
let xhrGetPayments = {}
let ranOnce = false
// Update current page
currentPage = {
destroy: function(){
if (xhrGetPayments) {
Object.keys(xhrGetPayments).forEach(key => {
if (xhrGetPayments[key])
xhrGetPayments[key].abort();
$(`#loadMorePayments${key}`).off('click')
})
}
$('#blocksTabs a').off('click')
},
update: function(updateKey){
let stats = updateKey === parentCoin ? lastStats : mergedStats[updateKey]
if (stats) {
updateText(`paymentsTotal${updateKey}`, stats.pool.totalPayments.toString());
updateText(`paymentsTotalPaid${updateKey}`, stats.pool.totalMinersPaid.toString());
updateText(`paymentsInterval${updateKey}`, getReadableTime(stats.config.paymentsInterval));
updateText(`paymentsMinimum${updateKey}`, getReadableCoin(stats, stats.config.minPaymentThreshold));
updateText(`paymentsDenomination${updateKey}`, getReadableCoin(stats, stats.config.denominationUnit, 3));
payments_renderPayments(stats.pool.payments, stats);
}
}
};
function RunOnce() {
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
return true
}
payments_InitTemplate(xhrGetPayments, ranOnce)
</script>

View file

@ -0,0 +1,147 @@
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTabs{{coin}} role="presentation" class="{{active}}"><a href="#{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<!-- Statistics -->
<div class="blocksStats row">
<!-- Total Blocks Mined -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-cubes"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blocksTotal">Total Prop Blocks Mined</span></div>
<div class="value"><span id="blocksTotal{{coin}}">N/A</span> <span class="smallText">(<span id="lastBlockFound{{coin}}">Never</span>)</span></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-cubes"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blocksTotalSolo">Total Solo Blocks Mined</span></div>
<div class="value"><span id="blocksTotalSolo{{coin}}">N/A</span> <span class="smallText">(<span id="lastBlockFoundSolo{{coin}}">Never</span>)</span></div>
</div>
</div>
</div>
<!-- Maturity Depth Requirement -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-unlock-alt"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="blocksMaturityCount">Maturity Requirement</span></div>
<div class="value"><span id="blocksMaturityCount{{coin}}">N/A</span></div>
</div>
</div>
</div>
<!-- Average Luck -->
<div class="col-lg-3 col-sm-4">
<div class="infoBox hoverExpandEffect mergedBg">
<div class="icon">
<span class="fa fa-line-chart"></span>
</div>
<div class="content">
<div class="text"><span data-tkey="averageLuck">Average Luck</span></div>
<div class="value"><span id="averageLuck{{coin}}">N/A</span></div>
</div>
</div>
</div>
</div>
<!-- Chart -->
<div id="blocksChart{{coin}}" class="card padding-15 padding-t-5 padding-b-5">
<h4 id="blocksChartTitle{{coin}}">Blocks found</h4>
<div class="chart" style="height:200px;">
<canvas id="blocksChartObj{{coin}}"></canvas>
<a class="chart-style"></a>
</div>
</div>
<!-- Report -->
<div class="card push-up-10">
<div class="table-responsive blocksReport">
<table class="table table-hover table-striped">
<thead>
<tr>
<th class="col1"><span data-tkey="timeFound">Time Found</span></th>
<th class="col2"><span data-tkey="reward">Reward</span></th>
<th class="col3"><span data-tkey="height">Height</span></th>
<th class="col4"><span data-tkey="difficulty">Difficulty</span></th>
<th class="col5"><span data-tkey="blockHash">Block Hash</span></th>
<th class="col1"><span data-data-tkey="miner">Miner Address</span></th>
<th class="col6"><span data-tkey="effort">Effort</span></th>
<th class="col7" title="How many more blocks network must mine before this block is matured"><span data-tkey="status">Status</span></th>
</tr>
</thead>
<tbody id="blocksReport{{coin}}_rows">
</tbody>
</table>
</div>
</div>
<p class="text-center push-up-10">
<button type="button" class="btn btn-default" id="loadMoreBlocks{{coin}}"><span data-tkey="loadMore">Load More</span></button>
</p>
</div>
</script>
<!-- Javascript -->
<script>
$('#blocksChartarqma').hide();
$('#blocksChartiridium').hide();
let displayedChart = {};
let xhrGetBlocks = {}
let ranOnce = false
// Update current page
currentPage = {
destroy: function(){
if (xhrGetBlocks) {
Object.keys(xhrGetBlocks).forEach(key => {
if (xhrGetBlocks[key])
xhrGetBlocks[key].abort();
$(`#loadMoreBlocks${key}`).off('click')
})
}
$('#blocksTabs a').off('click')
},
update: function(updateKey){
let stats = updateKey === parentCoin ? lastStats : mergedStats[updateKey]
if (stats) {
displayedChart[updateKey] = false
if (stats.charts.blocks) {
poolBlocks_GenerateChart(stats, displayedChart);
}
poolBlocks_RenderBlocks(stats.pool.blocks, stats);
}
}
};
function RunOnce() {
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
return true
}
poolBlocks_InitTemplate(ranOnce, displayedChart, xhrGetBlocks)
</script>

View file

@ -0,0 +1,82 @@
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTabs{{coin}}" role="presentation" class="{{active}}"><a href="#{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<!-- Verification fields -->
<h3><span data-tkey="verificationFields">Verification fields</span></h3>
<div class="card padding-15 padding-b-10">
<p><span data-tkey="minerVerification">In order to get a little more confidence that the wallet address is yours we ask you to give one of the worker names that is used by your miner.</span></p>
<div>
<div id="action_update_message{{coin}}" role="alert" ></div>
</div>
<div class="row push-down-5">
<label class="col-lg-2 col-sm-3 col-form-label col-form-label-lg" for="yourAddress"><span data-tkey="minerAddress">Miner Address:</span>:</label>
<div class="col-md-10 col-sm-9">
<input class="form-control" id="yourAddress{{coin}}" type="text" data-tplaceholder="enterYourAddress" placeholder="Enter your address">
</div>
</div>
<div class="row push-down-5">
<label class="col-lg-2 col-sm-3 col-form-label col-form-label-lg" for="yourIP"><span data-tkey="minerIP">Miner IP Address::</span>:</label>
<div class="col-md-4 col-sm-5">
<input class="form-control" id="yourIP{{coin}}" type="text" data-tkey="enterYourMinerIP" placeholder="An IP address your miners use (any)">
</div>
</div>
</div>
<!-- Minimum payout level -->
<h3><span data-tkey="setMinimumPayout">Set your minimal payout level</span></h3>
<div class="card padding-15 padding-b-10">
<p><span data-tkey="minerMinPayout">If you prefer a higher payout level than the pool's default then this is where you can change it for your miners. The amount you indicate here will become the minimum amount for pool payments to your address.</span></p>
<div class="row">
<label class="col-lg-2 col-sm-3 col-form-label col-form-label-lg" for="yourPayoutRate"><span data-tkey="minimumPayout">Minimum payout</span>:</label>
<div class="col-sm-2 push-down-5">
<input class="form-control" id="yourPayoutRate{{coin}}" type="number" value="">
</div>
<div class="col-sm-4 push-down-5">
<button class="btn btn-default" type="button" id="payoutSetButton{{coin}}">
<span><i class="fa fa-check"></i>&nbsp; <span data-tkey="set">Set</span></span>
</button>
</div>
</div>
</div>
</div>
</script>
<script>
let ranOnce = false
// Update current page
currentPage = {
destroy: function(){
Object.keys(mergedApis).forEach(key => {
$(`#payoutSetButton${key}`).off('click')
$(`#enableButton${key}`).off('click')
$(`#disableButton${key}`).off('click')
})
$('#blocksTabs a').off('click')
},
update: function(updateKey){
}
};
function RunOnce() {
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
return true
}
settings_InitTemplate(ranOnce)
</script>

View file

@ -0,0 +1,70 @@
<!-- Top 10 miners -->
<h3><span data-tkey="top10miners">Top 10 miners</span></h3>
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTab{{coin}}" role="presentation" class="{{active}}"><a href="#{{coin}}" data-coin="{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<div class="card">
<div id="top10miners" class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th class="col1 sort">#</th>
<th class="col2 sort"><span data-tkey="miner">Miner</span></th>
<th class="col3 sort"><span data-tkey="hashRate">Hash Rate</span></th>
<th class="col4 sort"><span data-tkey="lastShare">Last Share Submitted</span></th>
<th class="col5 sort"><span data-tkey="totalHashes">Total Hashes Submitted</span></th>
</tr>
</thead>
<tbody id="top10miners_rows{{coin}}">
</tbody>
</table>
</div>
</div>
</div>
</script>
<!-- Javascript -->
<script>
let ranOnce = false
let xhrGetMiners = {}
// Update current page
currentPage = {
destroy: function(){
if (xhrGetMiners) {
Object.keys(xhrGetMiners).forEach(key => {
if (xhrGetMiners[key])
xhrGetMiners[key].abort();
})
}
$('#blocksTabs a').off('click')
},
update: function(updateKey){
let endPoint = updateKey === parentCoin ? api : mergedApis[updateKey] ? mergedApis[updateKey].api : null
if (endPoint) {
top10Miners_UpdateTop10(xhrGetMiners, endPoint, updateKey)
}
}
};
function RunOnce() {
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
return true
}
top10Miners_InitTemplate(xhrGetMiners, ranOnce)
</script>

View file

@ -0,0 +1,207 @@
<!-- Worker Statistics -->
<h3><span data-tkey="minerStats">Your Stats & Payment History</span></h3>
<ul class="nav nav-tabs" id="blocksTabs">
</ul>
<div class="tab-content" id="tab-content">
</div>
<script id="siblingTabTemplate" type="text/x-handlebars-template">
<li id="blockTab{{coin}}" role="presentation" class="{{active}}"><a href="#{{coin}}" data-coin="{{coin}}">{{coin}} {{symbol}}</a></li>
</script>
<script id="siblingTemplate" type="text/x-handlebars-template">
<div role="tabpanel" class="tab-pane {{active}}" id="{{coin}}">
<div id="workerStats{{coin}}">
<div class="input-group">
<input class="form-control" id="yourStatsInput{{coin}}" type="text" data-tplaceholder="enterYourAddress" placeholder="Enter Your {{coin}} Address">
<span class="input-group-btn"><button class="btn btn-default" type="button" id="lookUp{{coin}}">
<span><i class="fa fa-search"></i> <span data-tkey="lookup">Lookup</span></span>
<span><i class="fa fa-refresh fa-spin"></i> <span data-tkey="searching">Searching...</span></span>
</button></span>
</div>
<div id="addressError{{coin}}"></div>
<!-- Hashrate -->
<div class="yourStats{{coin}} push-up-20">
<h4><i class="fa fa-dashboard"></i>&nbsp; <span data-tkey="hashRate">Hash Rate</span></h4>
<div class="row card">
<div class="col-sm-6 stats push-up-10">
<div><i class="fa fa-tachometer"></i> <span data-tkey="currentHashRate">Current Hash Rate</span>: <span id="yourHashrateHolder{{coin}}"></span></div>
<div id="minerAvgHR{{coin}}"><i class="fa fa-tachometer"></i> <span data-data-tkey="averageHashRate">Average 1/6/24-hour Hash Rate</span>:
<span id="yourHR1h{{coin}}"></span> / <span id="yourHR6h{{coin}}"></span> / <span id="yourHR24h{{coin}}"></span></div>
<div><i class="fa fa-clock-o"></i> <span data-tkey="lastShare">Last Share Submitted</span>: <span id="yourLastShare{{coin}}"></span></div>
<div><i class="fa fa-cloud-upload"></i> <span data-tkey="totalHashes">Total Hashes Submitted</span>: <span id="yourHashes{{coin}}"></span></div>
</div>
<div class="col-sm-6">
<div class="userChart{{coin}} push-up-10" data-chart="user_hashrate_{{coin}}">
<div class="chart">
</div>
</div>
</div>
</div>
</div>
<!-- Payments -->
<div class="yourStats{{coin}} push-up-20">
<h4><i class="fa fa-money"></i>&nbsp; <span data-tkey="payments">Payments</span></h4>
<div class="row card">
<div class="col-sm-6 stats push-up-10">
<div><i class="fa fa-bank"></i> <span data-tkey="pendingBalance">Pending Balance</span>: <span id="yourPendingBalance{{coin}}"></span></div>
<div><i class="fa fa-money"></i> <span data-tkey="totalPaid">Total Paid</span>: <span id="yourPaid{{coin}}"></span></div>
<div><i class="fa fa-money card-icon"></i> <span data-tkey="last24hPaid" class="card-label">Last 24h Paid</span>: <span id="paid24h{{coin}}"></span></div>
<div><i class="fa fa-money card-icon"></i> <span data-tkey="last7dPaid" class="card-label">Last 7d Paid</span>: <span id="paid7d{{coin}}"></span></div>
<div class="card-separate-text"><i class="fa fa-star card-icon"></i> <span class="card-label">Round contribution</span>: <span id="yourRoundShareProportion{{coin}}"></span>%
<span id="slush_round_info"> (shares), <span id="yourRoundScoreProportion{{coin}}"></span>% (<a target="_blank" href="#payments">score</a>)</span></span></div>
<div><i class="fa fa-money"></i> <span data-tkey="payoutEstimate">Current Payout Estimate</span>: <span id="yourPayoutEstimate{{coin}}"></span></div>
</div>
<div class="col-sm-6">
<div class="userChart{{coin}} push-up-10" data-chart="user_payments_{{coin}}">
<div class="chart">
</div>
</div>
</div>
</div>
</div>
<!-- Workers -->
<h4 class="yourStats{{coin}} yourWorkers{{coin}} push-up-20"><i class="fa fa-server"></i>&nbsp; <span data-tkey="workerStats">Workers Statistics</span></h4>
<div class="yourStats{{coin}} yourWorkers{{coin}} card">
<div class="table-responsive workersReport{{coin}}">
<table class="table table-hover table-striped workerStats">
<thead>
<tr>
<th class="col1 sort"><span data-tkey="status">Status</span> <i class="fa fa-sort"></i></th>
<th class="col2 sort"><span data-tkey="workerName">Worker Name</span> <i class="fa fa-sort"></i></th>
<th class="col3 sort"><span data-tkey="hashRate">Hash Rate</span> <i class="fa fa-sort"></i></th>
<th class="col4 sort avghr" title="Average hashrate over the last hour (only includes times the worker was active)"><span data-data-tkey="hashRate1h">HR (1h)</span> <i class="fa fa-sort"></i></th>
<th class="col5 sort avghr" title="Average hashrate over the last six hours (only includes times the worker was active)"><span data-data-tkey="hashRate6h">HR (6h)</span> <i class="fa fa-sort"></i></th>
<th class="col6 sort avghr" title="Average hashrate over the last day (only includes times the worker was active)"><span data-data-tkey="hashRate24h">HR (24h)</span> <i class="fa fa-sort"></i></th>
<th class="col7 sort"><span data-tkey="lastShare">Last Share Submitted</span> <i class="fa fa-sort"></i></th>
<th class="col8 sort"><span data-tkey="totalHashes">Total Hashes Submitted</span> <i class="fa fa-sort"></i></th>
</tr>
</thead>
<tbody id="workersReport_rows_{{coin}}">
</tbody>
</table>
</div>
</div>
<!-- Payments -->
<h4 class="yourStats{{coin}} push-up-20"><i class="fa fa-money"></i>&nbsp; <span data-tkey="paymentsHistory">Payments History</span></h4>
<div class="yourStats{{coin}} card">
<div id="workerPayments{{coin}}" class="table-responsive">
<table class="table table-hover table-striped">
<thead>
<tr>
<th class="col1"><span data-tkey="timeSent">Time Sent</span></th>
<th class="col2"><span data-tkey="transactionHash">Transaction Hash</span></th>
<th class="col3"><span data-tkey="amount">Amount</span></th>
<th class="col4"><span data-tkey="mixin">Mixin</span></th>
</tr>
</thead>
<tbody id="paymentsReport_rows_{{coin}}">
</tbody>
</table>
</div>
</div>
<p class="yourStats{{coin}} text-center push-up-10">
<button type="button" class="btn btn-default" id="loadMorePayments{{coin}}"><span data-tkey="loadMore">Load More</span></button>
</p>
</div>
</div>
</script>
<!-- Javascript -->
<script>
let xhrGetPayments = {}
let xhrAddressPoll = {}
let addressTimeout = {}
let ranOnce = false
// Update current page
currentPage = {
destroy: function(){
$(`#yourLastShare${lastStats.config.coin}`).timeago('dispose');
if (mergedApis) {
Object.keys(mergedApis).forEach(key => {
if (mergedApis[key])
$(`#yourLastShare${key}`).timeago('dispose');
})
}
if (xhrAddressPoll[lastStats.config.coin])
xhrAddressPoll[lastStats.config.coin].abort();
if (xhrAddressPoll) {
Object.keys(xhrAddressPoll).forEach(key => {
if (xhrAddressPoll[key])
xhrAddressPoll[key].abort();
})
}
if (addressTimeout[lastStats.config.coin])
clearTimeout(addressTimeout[lastStats.config.coin])
if (addressTimeout) {
Object.keys(addressTimeout).forEach(key => {
if (addressTimeout[key])
clearTimeout(addressTimeout[key])
})
}
if (xhrGetPayments[lastStats.config.coin])
xhrGetPayments[lastStats.config.coin].abort();
if (xhrGetPayments) {
Object.keys(xhrGetPayments).forEach(key => {
if (xhrGetPayments[key])
xhrGetPayments[key].abort();
})
}
},
update: function(updateKey){
}
};
function RunOnce() {
$('#blocksTabs a').click(function (e) {
e.preventDefault()
$(this).tab('show')
let coin = $(this).data('coin')
$(`#lookUp${coin}`).click();
})
return true
}
// Charts settings
var graphSettings = {
type: 'line',
width: '100%',
height: '140',
lineColor: '#03a9f4',
fillColor: 'rgba(3, 169, 244, .4)',
spotColor: null,
minSpotColor: null,
maxSpotColor: null,
highlightLineColor: '#236d26',
spotRadius: 3,
chartRangeMin: 0,
drawNormalOnTop: false,
tooltipFormat: '<b>{{y}}</b> &ndash; {{offset:names}}'
};
// Handle charts tooltip
$(function() {
$('[data-toggle="tooltip"]').tooltip();
});
workerstats_InitTemplate(ranOnce, addressTimeout, xhrAddressPoll)
</script>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="470.000000pt" height="470.000000pt" viewBox="0 0 470.000000 470.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,470.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 2350 l0 -2020 2350 0 2350 0 0 2020 0 2020 -2350 0 -2350 0 0
-2020z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 603 B

19
website/site.webmanifest Normal file
View file

@ -0,0 +1,19 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-384x384.png",
"sizes": "384x384",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

103
website/themes/admin.css Normal file
View file

@ -0,0 +1,103 @@
#page-wrapper {
padding: 0 15px 0;
min-height: 568px;
}
@media (min-width: 992px) {
#page-wrapper {
padding: 0 30px;
}
}
.nav-side-menu li.sign-out {
border-left: 3px solid darkred;
background-color: rgba(255,0,0,.2);
}
.nav-side-menu li.sign-out:hover {
border-left: 3px solid darkred;
background-color: darkred;
}
/* Pool Statistics */
#poolStats .luckGood {
color: #5eff5e;
}
#poolStats .luckBad {
color: red;
}
#poolStats .luckMid {
color: #FFF500;
}
/* Users list */
.usersList {
word-wrap: break-word;
}
.usersList .tooltip-inner {
max-width: 100%;
}
@media (min-width: 768px) {
.usersList {
table-layout: fixed;
}
.usersList tr > th,
.usersList tr > td {
text-align: center;
white-space: nowrap;
}
.usersList .col1 {
white-space: normal;
}
.usersList .col2 {
width: 100px;
}
.usersList .col3 {
width: 100px;
}
.usersList .col4 {
width: 100px;
}
.usersList .col5 {
width: 100px;
}
.usersList .col6 {
width: 120px;
white-space: normal;
}
}
/* Monitoring */
.adminMonitor code {
white-space: normal;
}
.adminMonitor .tab-pane li {
margin-bottom: 10px;
}
.adminMonitor .infos {
margin-bottom: 20px;
}
.adminMonitor #logTable th {
white-space: nowrap;
}
/* Ports Usage */
#portsUsage tr > td {
vertical-align: middle;
font-size: 0.95em;
}
#portsUsage table .col1,
#portsUsage table .col2 {
text-align: center;
}
@media (min-width: 768px) {
#portsUsage table th {
white-space: nowrap;
}
#portsUsage table .col1 {
width:60px;
}
#portsUsage table .col2 {
width:160px;
text-align: center;
}
}

133
website/themes/custom.css Normal file
View file

@ -0,0 +1,133 @@
/* Insert your pool's unique CSS here */
.nav-side-menu {
background: #164450;
}
.nav-side-menu .brand {
background: #164450;
color: #fff;
padding: 10px;
}
.nav-side-menu .brand a {
color: #fff;
font-size: 16px;
}
.brand { padding-top: 5px }
.brand img.img-responsive {
margin: 0 auto;
}
.nav-side-menu ul .active, .nav-side-menu li .active {
border-left: 3px solid #5fbcd3;
background-color: #2c89a0;
}
.infoBox {
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#2c89a0+0,5fbcd3+100 */
background: #2c89a0; /* Old browsers */
background: -moz-linear-gradient(45deg, #2c89a0 0%, #5fbcd3 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(45deg, #2c89a0 0%,#5fbcd3 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(45deg, #2c89a0 0%,#5fbcd3 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2c89a0', endColorstr='#5fbcd3',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
}
.mergedBg {
background: #3b5ca3;
}
#top-bar {
background-color: #164450;
}
.infoBox .content .value sup {
top: -.9em;
text-decoration: none;
text-shadow: none;
font-size: 45%;
right: -3px;
font-weight: normal;
}
#infoBlocksTotal .content .value .smallText {
font-size: 15px;
font-weight: normal;
/*display: block;*/
/*text-shadow: none;*/
margin-top: -3px;
}
#infoBlocksFound .content .value .smallText {
font-size: 15px;
font-weight: normal;
/*display: block;*/
/*text-shadow: none;*/
margin-top: -3px;
/* Insert your pool's unique CSS here */
.nav-side-menu {
background: #164450;
}
.nav-side-menu .brand {
background: #164450;
color: #fff;
padding: 10px;
}
.nav-side-menu .brand a {
color: #fff;
font-size: 16px;
}
.brand { padding-top: 5px }
.brand img.img-responsive {
margin: 0 auto;
}
.nav-side-menu ul .active, .nav-side-menu li .active {
border-left: 3px solid #5fbcd3;
background-color: #2c89a0;
}
.infoBox {
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#2c89a0+0,5fbcd3+100 */
background: #2c89a0; /* Old browsers */
background: -moz-linear-gradient(45deg, #2c89a0 0%, #5fbcd3 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(45deg, #2c89a0 0%,#5fbcd3 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(45deg, #2c89a0 0%,#5fbcd3 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2c89a0', endColorstr='#5fbcd3',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
}
.mergedBg {
background: #3b5ca3;
}
#top-bar {
background-color: #164450;
}
.infoBox .content .value sup {
top: -.9em;
text-decoration: none;
text-shadow: none;
font-size: 45%;
right: -3px;
font-weight: normal;
}
#infoBlocksTotal .content .value .smallText {
font-size: 15px;
font-weight: normal;
/*display: block;*/
/*text-shadow: none;*/
margin-top: -3px;
}
#infoBlocksFound .content .value .smallText {
font-size: 15px;
font-weight: normal;
/*display: block;*/
/*text-shadow: none;*/
margin-top: -3px;
}

1016
website/themes/default.css Normal file

File diff suppressed because it is too large Load diff