diff --git a/src/locales/en.ini b/src/locales/en.ini index 6077c1f5a..e11688ee4 100644 --- a/src/locales/en.ini +++ b/src/locales/en.ini @@ -1,6 +1,8 @@ [*] +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/index.html = index.newPad = New Pad index.createOpenPad = or create/open a Pad with the name: +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/pad.html = pad.toolbar.bold.title = Bold (Ctrl-B) pad.toolbar.italic.title = Italic (Ctrl-I) pad.toolbar.underline.title = Underline (Ctrl-U) @@ -29,24 +31,28 @@ pad.settings.linenocheck = Line numbers pad.settings.fontType = Font type: pad.settings.fontType.normal = Normal pad.settings.fontType.monospaced = Monospace -pad.settings.globalView = Global View pad.settings.language = Language: +pad.settings.globalView = Global View pad.importExport.import_export = Import/Export pad.importExport.import = Upload any text file or document pad.importExport.successful = Successful! +pad.share.readonly = Read only +pad.share = Share this pad +pad.share.link = Link +pad.share.emebdcode = Embed URL +pad.chat = Chat +pad.chat.title = Open the chat for this pad. +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/timeslider.html = +timeslider.pageTitle = {{appTitle}} Timeslider pad.importExport.export = Export current pad as -pad.importExport.exporthtml = HTML -pad.importExport.exportplain = Plain text -pad.importExport.exportword = Microsoft Word -pad.importExport.exportpdf = PDf -pad.importExport.exportopen = ODF (Open Document Format) -pad.importExport.exportdokuwiki = DokuWiki +timeslider.toolbar.returnbutton = Return to pad +timeslider.toolbar.authors = Authors: +timeslider.toolbar.authorsList = No Authors pad.modals.connected = Connected. pad.modals.reconnecting = Reconnecting to your pad.. -pad.modals.forcereconnect = Force reconnect pad.modals.uderdup = Open in another window pad.modals.userdup.explanation = This pad seems to be opened in more than one browser window on this computer. -pad.modals.userdup.advice = Reconnect to use this windows instead. +pad.modals.connected.advice = pad.modals.unauth = Not authorized pad.modals.unauth.explanation = Your permissions have changes while viewing this page. Try to reconnect. pad.modals.looping = Disconnected. @@ -63,15 +69,22 @@ pad.modals.deleted.explanation = This pad has been removed. pad.modals.disconnected = You have been disconnected. pad.modals.disconnected.explanation = The connection to the server was lost pad.modals.disconnected.cause = The server may be unavailable. Please notify us if this continues to happen. -pad.share = Share this pad -pad.share.readonly = Read only -pad.share.link = Link -pad.share.emebdcode = Embed URL -pad.chat = Chat -pad.chat.title = Open the chat for this pad. +pad.modals.forcereconnect = Force reconnect +timeslider.exportCurrent = Export current version as: +pad.importExport.exporthtml = HTML +pad.importExport.exportplain = Plain text +pad.importExport.exportword = Microsoft Word +pad.importExport.exportpdf = PDf +pad.importExport.exportopen = ODF (Open Document Format) +pad.importExport.exportdokuwiki = DokuWiki +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/translate.html = +translate.assistant = Translator Assistant +translate.from = Translate from: +translate.choose = Choose... +translate.send.title = Send +translate.to = to: +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/index.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/plugins-info.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/plugins.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/settings.html data-l10-id NOT FOUND = -timeslider.pageTitle = {{appTitle}} Timeslider -timeslider.toolbar.returnbutton = Return to pad -timeslider.toolbar.authors = Authors: -timeslider.toolbar.authorsList = No Authors -timeslider.exportCurrent = Export current version as: \ No newline at end of file diff --git a/src/locales/es.ini b/src/locales/es.ini index a119af1c0..b2816f789 100644 --- a/src/locales/es.ini +++ b/src/locales/es.ini @@ -1,6 +1,8 @@ [es] +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/index.html = index.newPad = Nuevo Pad index.createOpenPad = o puedes crear/abrir un Pad con el nombre: +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/pad.html = pad.toolbar.bold.title = Negrita (Ctrl-B) pad.toolbar.italic.title = Cursiva (Ctrl-I) pad.toolbar.underline.title = Subrayado (Ctrl-U) @@ -29,24 +31,28 @@ pad.settings.linenocheck = Números de línea pad.settings.fontType = Tipografía: pad.settings.fontType.normal = Normal pad.settings.fontType.monospaced = Monoespacio -pad.settings.globalView = Vista global pad.settings.language = Idioma: +pad.settings.globalView = Vista global pad.importExport.import_export = Importar/Exportar pad.importExport.import = Subir cualquier texto o documento pad.importExport.successful = ¡Operación exitosa! +pad.share.readonly = Sólo lectura +pad.share = Compatir el pad +pad.share.link = Enlace +pad.share.emebdcode = Incrustar URL +pad.chat = Chat +pad.chat.title = Abrir el chat para este pad. +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/timeslider.html = +timeslider.pageTitle = {{appTitle}} Línea de tiempo pad.importExport.export = Exporta el pad actual como -pad.importExport.exporthtml = HTML -pad.importExport.exportplain = Texto plano -pad.importExport.exportword = Microsoft Word -pad.importExport.exportpdf = PDF -pad.importExport.exportopen = ODF (Open Document Format) -pad.importExport.exportdokuwiki = DokuWiki +timeslider.toolbar.returnbutton = Volver al pad +timeslider.toolbar.authors = Autores: +timeslider.toolbar.authorsList = Sin autores pad.modals.connected = Conectado. pad.modals.reconnecting = Reconectando a tu pad.. -pad.modals.forcereconnect = Reconexión forzosa pad.modals.uderdup = Abrir en otra ventana pad.modals.userdup.explanation = Este pad parece estar abierto en más de una ventana de tu navegador. -pad.modals.userdup.advice = Reconectar para usar esta ventana. +pad.modals.connected.advice = pad.modals.unauth = No autorizado. pad.modals.unauth.explanation = Los permisos han cambiado mientras estabas viendo esta página. Intenta reconectar de nuevo. pad.modals.looping = Desconectado. @@ -63,15 +69,22 @@ pad.modals.deleted.explanation = Este pad ha sido borrado. pad.modals.disconnected = Has sido desconectado. pad.modals.disconnected.explanation = Se perdió la conexión con el servidor pad.modals.disconnected.cause = El servidor podría no estar disponible. Contacte con nosotros si esto continúa sucediendo. -pad.share = Compatir el pad -pad.share.readonly = Sólo lectura -pad.share.link = Enlace -pad.share.emebdcode = Incrustar URL -pad.chat = Chat -pad.chat.title = Abrir el chat para este pad. - -timeslider.pageTitle = {{appTitle}} Línea de tiempo -timeslider.toolbar.returnbutton = Volver al pad -timeslider.toolbar.authors = Autores: -timeslider.toolbar.authorsList = Sin autores +pad.modals.forcereconnect = Reconexión forzosa timeslider.exportCurrent = Exportar la versión actual como: +pad.importExport.exporthtml = HTML +pad.importExport.exportplain = Texto plano +pad.importExport.exportword = Microsoft Word +pad.importExport.exportpdf = PDF +pad.importExport.exportopen = ODF (Open Document Format) +pad.importExport.exportdokuwiki = DokuWiki +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/translate.html = +translate.assistant = Asistente para traductores +translate.from = Traduce de: +translate.choose = Elige... +translate.send.title = Enviar +translate.to = a: +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/index.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/plugins-info.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/plugins.html data-l10-id NOT FOUND = +; /home/joker/webs/tech/etherpad-lite-dev/src/templates/admin/settings.html data-l10-id NOT FOUND = + diff --git a/src/node/hooks/i18n.js b/src/node/hooks/i18n.js index 50946c426..50ea82b08 100644 --- a/src/node/hooks/i18n.js +++ b/src/node/hooks/i18n.js @@ -1,9 +1,12 @@ var Globalize = require('globalize') , fs = require('fs') , path = require('path') + , eejs = require('ep_etherpad-lite/node/eejs') , express = require('express') + , translate = require ('../utils/translate') -var localesPath = __dirname+"/../../locales"; +var localesPath = __dirname+"/../../locales" + , templatesPath = __dirname+"/../../templates"; // Serve English strings directly with /locales.ini var localeIndex = fs.readFileSync(localesPath+'/en.ini')+'\r\n'; @@ -30,6 +33,18 @@ exports.expressCreateServer = function(n, args) { args.app.get('/locales.ini', function(req, res) { res.send(localeIndex); - }) + }); + + args.app.get('/translate', function(req, res) { + res.send( eejs.require("ep_etherpad-lite/templates/translate.html", {}) ); + }); + + args.app.get('/translate/:lang_code', function(req, res) { + var lang_code = req.params.lang_code.substr(0,2), + ids = translate.extractIDs(templatesPath); + res.charset = 'utf-8'; + res.contentType('text'); + res.send(translate.getTranslationINI(localesPath, lang_code, ids)); + }); -} \ No newline at end of file +} diff --git a/src/node/utils/translate.js b/src/node/utils/translate.js new file mode 100644 index 000000000..231ef609b --- /dev/null +++ b/src/node/utils/translate.js @@ -0,0 +1,94 @@ +var fs = require('fs'); +var path = require('path'); + +Array.prototype.unique=function(a){ + return function(){return this.filter(a)}}(function(a,b,c){return c.indexOf(a,b+1)<0 +}); + +var exploreDir = function (padre, callback) { + var stat = fs.statSync(padre); + if (stat.isDirectory()) { + var nombres = fs.readdirSync(padre), + subdirectorios = [], + ficheros = []; + nombres.forEach (function(fich) { + var ruta_fich = path.join(padre,fich); + if (fs.statSync(ruta_fich).isDirectory()) { + subdirectorios.push(ruta_fich); + } else { + ficheros.push(ruta_fich); + } + }); + callback(padre, subdirectorios, ficheros); + subdirectorios.forEach(function (d) { + exploreDir(d, callback); + }); + } else { + throw new Error("path: " + padre + " is not a directory"); + } +}; + +var generateIni = function (ids, ini, section) { + var result = "["+section+"]\n", + sufijos = ["", ".title", ".innerHTML", ".alt", ".textContent"]; + ids.forEach (function (id) { + var partial = ""; + + sufijos.forEach (function (sufijo) { + if (ini.hasOwnProperty(id+sufijo)) partial += id+sufijo+" = "+ini[id+sufijo]+"\n"; + }); + + if (partial == "") partial = id+" = "+"\n"; + result += partial; + }); + return result; +} + +var parseIni = function (input) { + var result = {}, + lineas = input.split('\n'); + lineas.forEach (function(linea) { + linea = linea.trim(); + if ((linea.length > 0) && (linea[0] != ';') && (linea[0] != '[')) { + linea = linea.split('=', 2); + result[linea[0].trim()]=linea[1].trim(); + } + }); + return result; +} + +var extractAttr = function (attr, str) { + var reg_expr = eval("/"+attr+"\s*=\s*['\"]([^'\"]*)['\"]/g"), + result = [], + voypor = null; + while (voypor = reg_expr.exec(str)) { + result.push(voypor[1]); + } + return result; +} + +var extractIDs = function (dir) { + var result = []; + exploreDir (dir, function (p, s, fichs) { + fichs.sort().forEach(function(f) { + var partial = extractAttr ('data-l10n-id', fs.readFileSync(f, 'utf8')); + if (partial.length > 0) { + result.push("; "+f); + result = result.concat(partial); + } else { + result.push("; "+f+" data-l10-id NOT FOUND"); + } + }); + }); + return result.unique(); +} + +var getTranslationINI = function (locales_dir, lang_code, ids) { + var ini = locales_dir+'/'+lang_code+'.ini'; + if (!fs.existsSync(ini)) ini = locales_dir+'/en.ini'; + return generateIni (ids, parseIni (fs.readFileSync(ini,'utf8')), lang_code); +} + +module.exports.extractIDs = extractIDs; +module.exports.getTranslationINI = getTranslationINI; + diff --git a/src/templates/translate.html b/src/templates/translate.html new file mode 100644 index 000000000..8c3384d7f --- /dev/null +++ b/src/templates/translate.html @@ -0,0 +1,299 @@ +<% + var i18n = require("ep_etherpad-lite/node/hooks/i18n"); +%> + + + + Translator Assistant + + + + + + + + + + + + + +
+ +

Translator Assistant

+ + + + + + + + + + + +
+
+ + + + +