diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index e5da185..b2fa9be 100755
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -442,15 +442,24 @@
"searchSession": {
"message": "Search Session"
},
+ "synchronized": {
+ "message": "Synchronized"
+ },
"synchronizeSession": {
"message": "Synchronize Session"
},
+ "desynchronizeSession": {
+ "message": "Desynchronize Session"
+ },
"restoreSession": {
"message": "Restore Session"
},
"removeSession": {
"message": "Remove Session"
},
+ "window": {
+ "message": "Window"
+ },
"closeWindow": {
"message": "Close Window"
},
@@ -643,10 +652,10 @@
"contributeHeader": {
"message": "Why contribute?"
},
+ "specialThanks": {
+ "message": "Special Thanks"
+ },
"license": {
"message": "license"
- },
- "faq": {
- "message": "FAQ"
}
}
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index 33cd1c0..3aebd80 100644
--- a/app/_locales/es/messages.json
+++ b/app/_locales/es/messages.json
@@ -48,7 +48,7 @@
"message": "marcadores"
},
"tabs": {
- "message": "pestañas"
+ "message": "lengüetas"
},
"sessions": {
"message": "sesiones"
@@ -243,7 +243,7 @@
"message": "Preferencias"
},
"about": {
- "message": "Acerca de"
+ "message": "Sobre"
},
"enableContextMenu": {
"message": "Habilitar menú contextual"
@@ -440,15 +440,24 @@
"searchSession": {
"message": "Sesión de búsqueda"
},
+ "synchronized": {
+ "message": "Sincronizado"
+ },
"synchronizeSession": {
"message": "Sincronizar sesión"
},
+ "desynchronizeSession": {
+ "message": "Desincronizar sesión"
+ },
"restoreSession": {
"message": "Restaurar sesion"
},
"removeSession": {
"message": "Eliminar sesión"
},
+ "window": {
+ "message": "Ventana"
+ },
"closeWindow": {
"message": "Cerrar ventana"
},
@@ -641,6 +650,9 @@
"contributeHeader": {
"message": "¿Por qué contribuir?"
},
+ "specialThanks": {
+ "message": "Gracias Especiales"
+ },
"license": {
"message": "license"
}
diff --git a/app/scripts/components/about.js b/app/scripts/components/about.js
index adeacdc..52a559b 100755
--- a/app/scripts/components/about.js
+++ b/app/scripts/components/about.js
@@ -9,26 +9,30 @@ import {utilityStore} from './stores/main';
import {Btn, Col, Row} from './bootstrap';
import changelog from 'html!markdown!../../../changelog.md';
-import support from 'html!markdown!../../../support.md';
+/*let supportFile = `html!markdown!../../../support_${chrome.i18n.getUILanguage()}.md`;
+import support from supportFile;*/
import license from 'html!markdown!../../../COPYING';
var Contribute = React.createClass({
render:function(){
+ let contributeFile;
+ let locale = chrome.i18n.getUILanguage();
+ if (locale === 'es') {
+ contributeFile = require('html!markdown!../../../contribute_es.md');
+ } else {
+ contributeFile = require('html!markdown!../../../contribute.md');
+ }
+ function createMarkup() { return {__html: contributeFile};}
return (
-
Why contribute?
-
Tab Master 5000 is free of cost and doesn't generate any revenue directly. If you are a happier Chrome user because of this extension, a donation will help me ration more time to this project. As a developer, I have to choose my time wisely, and while I love working on it, it is not always easy to sit down and improve the extension while I have other obligations.
-
If you are a developer and would like to contribute time to this project, you can submit pull requests to this project's master branch on Github.
-
Submitting bug reports and suggesting new features on Github or the Chrome Web Store is also helpful.
-
All contributors will be listed on this page after each extension update unless they opt out.
-
Thanks for using Tab Master!
-
Jason Hicks
+
{utils.t('contributeHeader')}
+
-
Special Thanks
+
{utils.t('specialThanks')}
- Alex Dorey
- Joel Zipkin
@@ -63,7 +67,14 @@ var License = React.createClass({
var Support = React.createClass({
render(){
- function createMarkup() { return {__html: support};}
+ let supportFile;
+ let locale = chrome.i18n.getUILanguage();
+ if (locale === 'es') {
+ supportFile = require('html!markdown!../../../support_es.md');
+ } else {
+ supportFile = require('html!markdown!../../../support.md');
+ }
+ function createMarkup() { return {__html: supportFile};}
return (
diff --git a/app/scripts/components/settings.js b/app/scripts/components/settings.js
index 8be33b8..8b61456 100755
--- a/app/scripts/components/settings.js
+++ b/app/scripts/components/settings.js
@@ -341,14 +341,14 @@ var Theming = React.createClass({
{themeFields2.map((field, i)=>{
- return this.setState({boldUpdate: true})} hoverBg={p.theme.settingsItemHover} color={p.theme[field.themeKey]} themeKey={field.themeKey} label={field.label}/>;
+ return this.setState({boldUpdate: true})} hoverBg={p.theme.settingsItemHover} color={p.theme[field.themeKey]} themeKey={field.themeKey} label={utils.t(field.themeKey)}/>;
})}
{themeFields3.map((field, i)=>{
- return this.setState({boldUpdate: true})} hoverBg={p.theme.settingsItemHover} color={p.theme[field.themeKey]} themeKey={field.themeKey} label={field.label}/>;
+ return this.setState({boldUpdate: true})} hoverBg={p.theme.settingsItemHover} color={p.theme[field.themeKey]} themeKey={field.themeKey} label={utils.t(field.themeKey)}/>;
})}
@@ -447,9 +447,9 @@ var Sessions = React.createClass({
var s = this.state;
p.modal.footer = (
- sessionsStore.exportSessions(p.sessions)} className="ntg-setting-btn" icon="database-export">Export
- Import
- sessionsStore.v2Save({tabs: p.allTabs, label: s.sessionLabelValue})} className="ntg-setting-btn pull-right" icon="floppy-disk">Save Session
+ sessionsStore.exportSessions(p.sessions)} className="ntg-setting-btn" icon="database-export">{utils.t('export')}
+ {utils.t('import')}
+ sessionsStore.v2Save({tabs: p.allTabs, label: s.sessionLabelValue})} className="ntg-setting-btn pull-right" icon="floppy-disk">{utils.t('saveSession')}
);
state.set({modal: p.modal});
@@ -545,7 +545,7 @@ var Sessions = React.createClass({
return (
this.handleSessionHoverOut(-1)}>
-
Saved Sessions {p.sessions.length > 0 ? `(${p.sessions.length})` : null}
+
{utils.t('savedSessions')} {p.sessions.length > 0 ? `(${p.sessions.length})` : null}
{p.sessions.map((session, i)=>{
var time = _.capitalize(moment(session.timeStamp).fromNow());
var _time = time === 'A few seconds ago' ? 'Seconds ago' : time;
@@ -559,13 +559,13 @@ var Sessions = React.createClass({
return int;
};
var tabsCount = getTabsCount();
- var sessionTitle = `${session.label ? session.label : _time}: ${session.tabs.length} Window${session.tabs.length > 1 ? 's' : ''}, ${tabsCount} Tab${tabsCount > 1 ? 's' : ''}`;
+ var sessionTitle = `${session.label ? session.label : _time}: ${session.tabs.length} ${utils.t('window')}${session.tabs.length > 1 ? 's' : ''}, ${tabsCount} ${utils.t('tab')}${tabsCount > 1 ? 's' : ''}`;
return (
this.handleSessionHoverIn(i)} onMouseLeave={()=>this.handleSessionHoverOut(i)} key={i} className="ntg-session-row" style={{backgroundColor: s.sessionHover === i ? p.theme.settingsItemHover : 'initial', minHeight: '30px'}}>
this.expandSelectedSession(i, e)} className={"ntg-session-text session-text-"+i} style={{paddingBottom: s.expandedSession === i ? '4px' : 'initial', cursor: 'pointer'}}>
- {p.prefs.syncedSession === session.id ? : null}
+ {p.prefs.syncedSession === session.id ? : null}
{sessionTitle}
@@ -577,7 +577,7 @@ var Sessions = React.createClass({
icon="cross"
faStyle={{fontSize: '18px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Remove Session" /> : null}
+ data-tip={utils.t('removeSession')} /> : null}
{s.sessionHover === i ?
sessionsStore.restore(session, p.prefs.screenshot)}
@@ -585,7 +585,7 @@ var Sessions = React.createClass({
icon="folder-open2"
faStyle={{fontSize: '14px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Restore Session"/> : null}
+ data-tip={utils.t('restoreSession')}/> : null}
{s.sessionHover === i && p.prefs.sessionsSync ?
msgStore.setPrefs({syncedSession: p.prefs.syncedSession === session.id ? null : session.id})}
@@ -593,7 +593,7 @@ var Sessions = React.createClass({
icon="sync"
faStyle={{fontWeight: p.prefs.syncedSession === session.id ? '600' : 'initial', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip={p.prefs.syncedSession === session.id ? 'Desynchronize Session' : 'Synchronize Session'}/> : null}
+ data-tip={p.prefs.syncedSession === session.id ? utils.t('desynchronizeSession') : utils.t('synchronizeSession')}/> : null}
{s.sessionHover === i ?
this.setState({searchField: i, expandedSession: i})}
@@ -601,7 +601,7 @@ var Sessions = React.createClass({
icon="search4"
faStyle={{fontSize: '13px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Search Session"/> : null}
+ data-tip={utils.t('searchSession')}/> : null}
{!s.labelSession ? s.sessionHover === i && s.labelSession !== i ?
this.setState({labelSession: i, expandedSession: i})}
@@ -609,7 +609,7 @@ var Sessions = React.createClass({
icon="pencil"
faStyle={{fontSize: '13px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Edit Label" /> : null : null}
+ data-tip={utils.t('editLabel')} /> : null : null}
{s.expandedSession === i ?
@@ -628,7 +628,7 @@ var Sessions = React.createClass({
value={s.sessionLabelValue}
className="form-control label-session-input"
style={{backgroundColor: p.theme.settingsBg, color: p.theme.bodyText}}
- placeholder={session.label ? session.label : 'Label...'}
+ placeholder={session.label ? session.label : `${utils.t('label')}...`}
onChange={this.setLabel} />
@@ -644,12 +644,12 @@ var Sessions = React.createClass({
value={s.search}
className="form-control session-field"
style={{backgroundColor: p.theme.settingsBg, color: p.theme.bodyText}}
- placeholder="Search session..."
+ placeholder={`${utils.t('searchSession')}...`}
onChange={(e)=>this.setState({search: e.target.value})} />
: null}
{session.tabs.map((_window, w)=>{
- var windowTitle = `Window ${w + 1}: ${_window.length} Tabs`;
+ var windowTitle = `${utils.t('window')} ${w + 1}: ${_window.length} ${utils.t('tabs')}`;
return (
this.setState({windowHover: w})}>
0 ? '1px' : 'initial', minHeight: '22px'}}>
@@ -662,7 +662,7 @@ var Sessions = React.createClass({
icon="folder-open2"
faStyle={{fontSize: '14px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Restore Window"/> : null}
+ data-tip={utils.t('restoreWindow')}/> : null}
{s.selectedSavedSessionWindow === w || s.search.length > 0 ?
@@ -689,7 +689,7 @@ var Sessions = React.createClass({
icon="cross"
faStyle={{fontSize: '18px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Remove Tab" />: null}
+ data-tip={utils.t('removeTab')} />: null}
);
@@ -707,9 +707,9 @@ var Sessions = React.createClass({
this.setState({currentSessionHover: -1})}>
- Current Session
+ {utils.t('currentSession')}
{p.allTabs ? p.allTabs.map((_window, w)=>{
- var windowTitle = `Window ${w + 1}: ${_window.length} Tabs`;
+ var windowTitle = `${utils.t('window')} ${w + 1}: ${_window.length} ${_.upperFirst(utils.t('tabs'))}`;
return (
this.setState({currentSessionHover: w})} onMouseLeave={()=>this.setState({currentSessionTabHover: -1})}>
@@ -722,7 +722,7 @@ var Sessions = React.createClass({
icon="cross"
faStyle={{fontSize: '18px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Close Window" /> : null}
+ data-tip={utils.t('closeWindow')} /> : null}
{s.selectedCurrentSessionWindow === w ?
@@ -747,7 +747,7 @@ var Sessions = React.createClass({
icon="cross"
faStyle={{fontSize: '18px', position: 'relative', top: '0px'}}
noIconPadding={true}
- data-tip="Close Tab" /> : null}
+ data-tip={utils.t('closeTab')} /> : null}
);
diff --git a/contribute.md b/contribute.md
new file mode 100644
index 0000000..a14c887
--- /dev/null
+++ b/contribute.md
@@ -0,0 +1,11 @@
+Tab Master 5000 is free of cost and doesn't generate any revenue directly. If you are a happier Chrome user because of this extension, a donation will help me ration more time to this project. As a developer, I have to choose my time wisely, and while I love working on it, it is not always easy to sit down and improve the extension while I have other obligations.
+
+If you are a developer and would like to contribute time to this project, you can submit pull requests to this project's master branch on Github.
+
+Submitting bug reports and suggesting new features on Github or the Chrome Web Store is also helpful.
+
+All contributors will be listed on this page after each extension update unless they opt out.
+
+Thanks for using Tab Master!
+
+Jason Hicks
\ No newline at end of file
diff --git a/contribute_es.md b/contribute_es.md
new file mode 100644
index 0000000..edb5ef1
--- /dev/null
+++ b/contribute_es.md
@@ -0,0 +1,11 @@
+Tab Master 5000 está libre de costo y no genera ningún ingreso directamente. Si eres un usuario de Chrome más feliz debido a esta extensión, una donación me ayudará a racionar más tiempo a este proyecto. Como desarrollador, tengo que escoger mi tiempo sabiamente, y aunque me encanta trabajar en él, no siempre es fácil sentarse y mejorar la extensión mientras tengo otras obligaciones.
+
+Si es un desarrollador y desea contribuir con tiempo a este proyecto, puede enviar solicitudes de extracción a la rama principal de este proyecto en Github.
+
+También es útil enviar informes de errores y sugerir nuevas funciones en Github o Chrome Web Store.
+
+Todos los contribuyentes aparecerán en esta página después de cada actualización de la extensión, a menos que se retiren.
+
+Gracias por usar Tab Master!
+
+Jason Hicks
\ No newline at end of file
diff --git a/support_es.md b/support_es.md
new file mode 100755
index 0000000..f2f792f
--- /dev/null
+++ b/support_es.md
@@ -0,0 +1,31 @@
+Si tienes una pregunta que no se puede responder aquí, abre un nuevo problema en la [Chrome Web Store](https://chrome.google.com/webstore/detail/tab-master-5000-tab-swiss/mippmhcfjhliihkkdobllhpdnmmciaim) o en la página [Github](https://github.com/jaszhix/tab-master-5000-chrome-extension/issues) de TM5K.
+
+### Preguntas más frecuentes
+
+**¿Cómo cierro todas las pestañas de un dominio específico?**
+
+Haga clic con el botón derecho en un mosaico y aparecerá un menú contextual con una lista de opciones. Haga clic en "Cerrar todas las pestañas de ..." para activar esta acción.
+
+**¿Qué pasó con la opción de eliminar duplicados de un determinado dominio?**
+
+Tener una opción para eliminar duplicados de un sitio web determinado, y todos los duplicados parecían confusos y desordenado el menú contextual. Mi suposición es que nadie tiene la intención de tener ninguna pestaña duplicada, por lo que ahora es la única opción. Pulsando los mosaicos duplicados puede desactivarse en Preferencias.
+
+**¿Dónde fue el ícono de dragado de azulejos?**
+
+El arrastre de azulejos se ha revisado en V2 y ahora puede arrastrar un mosaico simplemente manteniendo pulsado el botón izquierdo del ratón y moviendo el mosaico a la posición seleccionada. Esto también se puede hacer desde la vista de tabla.
+
+**¿Cómo puedo aplicar acciones a determinadas pestañas?**
+
+Esto se puede hacer en la vista de formato de tabla. Mantenga presionada la tecla CTRL para seleccionar filas, o mantenga presionada la tecla shift para seleccionar un rango de filas. A continuación, pulse la tecla Eliminar para cerrar / quitar elementos o utilice el menú contextual para obtener más opciones para aplicar a su selección.
+
+**La administración de la sesión es lenta.**
+
+Un error estaba causando que los datos de caché de favicon se guardaran con datos de sesión, y esto se ha resuelto. Para reparar los datos de sesión, extráigalos y vuelva a importarlo.
+
+**Estoy experimentando problemas de rendimiento.**
+
+Intente deshabilitar capturas de pantalla, animaciones, sincronización de sesiones o deshacer acciones de tabulación en Preferencias. Hacer posible la eliminación automática de las pestañas también puede ayudar a mejorar el rendimiento de las PC de gama baja.
+
+**La extensión se estrelló.**
+
+Esto está relacionado con la API de captura de pantalla. Mientras se están probando las correcciones, se recomienda desactivar la captura de pantalla si esto le está sucediendo.
\ No newline at end of file