Merge branch 'master' of https://github.com/openstyles/stylus into dev-user-css

This commit is contained in:
eight 2017-09-12 03:40:56 +08:00
commit d4ddefe8a0
41 changed files with 2148 additions and 493 deletions

View File

@ -1,11 +1,8 @@
<!--
Thank you for reporting an issue. Please make sure that your style is up to
date and you checked that your issue wasn't recently addressed.
If the issue persists, please help us identifying the cause by providing these
details:
-->
* **Browser**:
* **Operating System**:
* **Screenshot**:
<!--
Please make sure you checked that your issue wasn't already addressed.
If the issue persists, please help us identifying the cause by providing the above details.
-->

View File

@ -27,10 +27,6 @@
"message": "Изнасяне",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Проблеми",
"description": "Label for the CSS linter issues block on the style edit page"
},
"optionsBadgeNormal": {
"message": "Цвят на фона",
"description": ""
@ -664,15 +660,6 @@
"message": "Прозорец за настройките",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Проблеми, намерени от $link$ при следните правила:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Значка на иконката на лентата",
"description": ""

View File

@ -27,10 +27,6 @@
"message": "Exportovat",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Problémy",
"description": "Label for the CSS linter issues block on the style edit page"
},
"optionsBadgeNormal": {
"message": "Barva pozadí",
"description": ""
@ -48,7 +44,7 @@
"description": "Label for the button to enable a style"
},
"styleMissingName": {
"message": "Zadejte název.",
"message": "Zadejte název",
"description": "Error displayed when user saves without providing a name"
},
"genericHistoryLabel": {
@ -568,6 +564,10 @@
"message": "Automatické dokončování během psaní",
"description": "Label for the checkbox in the style editor."
},
"stylusUnavailableForURLdetails": {
"message": "Jako bezpečností opatření, prohlížeč brání rozšířením v ovlivnění vestavěných stránek (např. chrome://version, nová úvodní stránka Chromu 61, about:addons, vivaldi://extensions atp.) a stránek dalších rozšíření. Každý prohlížeč také omezuje přístup do vlastního obchodu s rozšířeními (např. Chrome Web Store nebo AMO).",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
},
"cm_matchHighlightSelection": {
"message": "Pouze výběr",
"description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of currently selected text"
@ -652,15 +652,6 @@
"message": "Možnosti rozhraní",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Problémy nalezené aplikací $link$ s těmito povolenými pravidly:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Ikona tlačítka na panelu",
"description": ""

View File

@ -3,6 +3,10 @@
"message": "Alles",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Probleme",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "Standard",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "Exportieren",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Probleme",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "Ungültiges JSON Format",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "Hintergrundfarbe",
@ -135,6 +139,10 @@
"message": "Aktiviert",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Klicken, um diesen Linter zu konfigurieren",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Das Mozilla-Format des Codes kann mit Stylish für Firefox verwendet werden und bei userstyles.org eingereicht werden.",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -151,6 +159,10 @@
"message": "Speichern",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Gespeichert",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Löschen",
"description": ""
@ -201,7 +213,7 @@
}
},
"optionsBadgeDisabled": {
"message": "Hintergrundfarbe wenn deaktiviert.",
"message": "Hintergrundfarbe wenn deaktiviert",
"description": ""
},
"optionsCheck": {
@ -213,9 +225,18 @@
"description": "Help text on the manage page"
},
"manageOnlyLocal": {
"message": "Nur lokale Styles anzeigen",
"message": "Nur lokale Styles",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "Folgende Probleme wurden von $link$ gefunden:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "Inhalte durchsuchen",
"description": "Label for the search filter textbox on the Manage styles page"
@ -237,7 +258,7 @@
"description": "Label for the button to disable a style"
},
"prefShowBadge": {
"message": "Anzahl der aktiven Styles auf der aktuellen Seiten",
"message": "Anzahl der aktiven Styles auf der aktuellen Seite",
"description": "Label for the checkbox controlling toolbar badge text."
},
"manageFavicons": {
@ -322,6 +343,10 @@
}
}
},
"dysfunctional": {
"message": "Stylus funktioniert in privaten Fenstern nicht, weil Firefox hier Direktverbindungen zur internen Hintergrundseite der Erweiterung nicht zulässt.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "Bereiche",
"description": "Title for the style sections section"
@ -330,6 +355,10 @@
"message": "Ungültige übersprungen",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "Zurücksetzen",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "Style $stylename$ bearbeiten",
"description": "Title of the page for editing styles",
@ -445,9 +474,21 @@
"description": "Label for the button to install an update for a single style"
},
"optionsCheckUpdate": {
"message": "Alle verfügbaren Aktualisierungen Installieren.",
"message": "Alle verfügbaren Aktualisierungen Installieren",
"description": ""
},
"filteredStyles": {
"message": "$numShown$ gefiltert von $numTotal$ gesamt",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "Importieren der Styles abgeschlossen.",
"description": "Title of the report shown after importing styles"
@ -460,6 +501,10 @@
"message": "Dieser Style verwendet teilweise Übereinstimmende Reguläre Ausdrücke unter Missachtung der <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>CSS4 @document Spezifikationen</a>, welche eine vollständig Übereinstimmende URL benötigen. Der betroffene CSS Bereich wurde nicht auf die Website angewandt. Dieser Style wurde wahrscheinlich unter Stylish für Chrome erstellt, in der seit der ersten Version eine inkorrekte Überprüfung der Regulären Ausdrücke vorhanden ist (bekannter Fehler).",
"description": ""
},
"linterCSSLintSettings": {
"message": "(Regeln: 0 = Deaktiviert; 1 = Warnung; 2 = Fehler)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "Rücke @media / @supports ein",
"description": "CSS-beautifier option"
@ -472,6 +517,10 @@
"message": "Bereich entfernen",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "Um Styles nur für eine URL zu zeigen, stelle ein \"url:\" voran.\nBeispiel: url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "Schalte alle Stile aus",
"description": "Label for the checkbox that turns all enabled styles off."
@ -492,6 +541,10 @@
"message": "Aktualisierung abgeschlossen.",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "Funktioniert nicht richtig aufgrund eines bekannten Bugs in dieser Version von Firefox: chrome.extension.getBackgroundPage() gibt keinen gültigen Wert zurück",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "Suche nach Aktualisierungen...",
"description": "Text to display when checking a style for an update"
@ -504,6 +557,10 @@
"message": "Anzahl der 'Gilt für' Elemente",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift+Klick oder Rechtsklick öffnen den Stylemanager mit Filter für gültige Styles der aktuellen Seite",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylus nutzt hierzu den externen Dienst https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -512,6 +569,10 @@
"message": "Dieser Style wurde lokal bearbeitet.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "Vollständige Liste der Regeln anzeigen",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "Optionen zurücksetzen",
"description": ""
@ -520,6 +581,15 @@
"message": "'Löschen' im Editor-Kontextmenü hinzufügen",
"description": ""
},
"linterConfigPopupTitle": {
"message": "Einstellungen für $linter$",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "Aktualisierte Meta Infos und Codes",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -548,8 +618,12 @@
"message": "Autovervollständigen bei Eingabe",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "Nur deaktivierte Styles",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "Als Sicherheitsvorkehrung verbietet der Browser Erweiterungen, seine eingebauten Seiten zu beeinflussen (wie chrome://version, die standardmäßige neue Registerkarte ab Chrome 61, about:addons, usw.) sowie andere Erweiterungsseiten. Jeder Browser beschränkt auch den Zugriff auf seine eigene Erweiterungsgalerie (wie Chrome Web Store oder addons.mozilla.org).",
"message": "Als Sicherheitsvorkehrung verbietet der Browser es Erweiterungen, seine eingebauten Seiten (wie chrome://version, dem neuen Standard-Tab ab Chrome 61, about:addons, usw.), sowie Seiten anderer Erweiterungen zu beeinflussen. Jeder Browser beschränkt auch den Zugriff auf seine eigene Erweiterungsgalerie (wie Chrome Web Store oder addons.mozilla.org).",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
},
"cm_matchHighlightSelection": {
@ -576,6 +650,10 @@
"message": "Style überschreiben",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "Wird auch aktiviert durch Lösen des Editor-Tabs vom Browserfenster\nund deaktiviert durch Zusammenführen eines Editor-Tabs mit einem anderen Fenster.",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Ein Fehler ist beim Verwenden der Stylus-Datenbank aufgetreten. Willst Du eine Webseite mit möglichen Lösungen besuchen?",
"description": "Prompt when a DB error is encountered"
@ -604,6 +682,10 @@
"message": "Ungültige Reguläre Ausdrücke übersprungen",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "Nur externe Styles",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "Alles ersetzen",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -632,15 +714,6 @@
"message": "Optionen",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Die von $link$ gefunden Fehler haben die folgenden Einstellungen:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Badge auf dem Toolbar-Icon",
"description": ""
@ -653,6 +726,10 @@
"message": "Popup-Breite (in Pixeln)",
"description": ""
},
"linterInvalidConfigError": {
"message": "Nicht gespeichert aufgrund folgender ungültiger Einstellungen:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "Nein",
"description": "'No' button in a confirm dialog"
@ -717,6 +794,10 @@
"message": "Bearbeiten",
"description": "Label for the button to go to the edit style page"
},
"popupOpenEditInWindow": {
"message": "Editor in neuem Fenster öffnen",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "Wähle eine Datei aus oder ziehe die Datei auf diese Seite. (Drag and Drop)",
"description": "Message for backup"
@ -729,6 +810,10 @@
"message": "Befehlsnamen eingeben",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "Um versehentliches Zurücksetzen rückgängig zu machen, drücke Strg+Z im Textfenster",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Gestalte das Web neu mit Stylus, dem Style Manager. Stylus ermöglicht dir ganz einfach Themes und Designs für viele populäre Websites zu installieren.",
"description": "Extension description"

View File

@ -152,7 +152,7 @@
"description": "Label for the style editor's CSS theme."
},
"dysfunctional": {
"message": "Stylus cannot function because Firefox is either in private mode or is applying its website cookies policy to IndexedDB storage used by Stylus, which erroneously marks the secure moz-extension:// origin as insecure even though WebExtensions aren't websites and Stylus doesn't use cookies.\n\n1. Open Firefox options\n2. Go to 'Privacy & Security'\n3. Set 'History' mode to 'Use custom settings'\n4. Click 'Exceptions'\n5. Paste our manifest URL and click 'Allow'\n6. Click 'Save settings'\n7. Uncheck 'Always use private browsing mode'\n\nThe actual manifest URL is shown below.\nYou can also find it on about:debugging page.",
"message": "Stylus cannot function in private windows because Firefox disallows direct connection to the internal background page context of the extension.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"dysfunctionalBackgroundConnection": {

View File

@ -3,12 +3,16 @@
"message": "Todos los sitios",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Problemas",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "predeterminado",
"description": "Default CodeMirror CSS theme option on the edit style page"
},
"styleRegexpTestTitle": {
"message": "Lista de pestañas coincidentes abiertas (haga clic en la URL para poner el foco en esa pestaña)",
"message": "Lista de pestañas coincidentes abiertas (pulse en el URL para poner el foco en esa pestaña)",
"description": "RegExp test report: title of the report"
},
"bckpInstStyles": {
@ -27,9 +31,9 @@
"message": "Exportar",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Problemas",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "Formato JSON no válido",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "Color de fondo",
@ -143,6 +147,10 @@
"message": "Activado",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Pulse para configurar este deshilvanador (linter)",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "El formato Mozilla del código se puede enviar a userstyles.org y usarse con el Stylish para Firefox clásico.",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -159,8 +167,12 @@
"message": "Guardar",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Guardado",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Borrar",
"message": "Eliminar",
"description": ""
},
"confirmCancel": {
@ -224,6 +236,15 @@
"message": "Sólo estilos creados localmente",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "Estos problemas fueron encontrados por $link$:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "Buscar contenidos",
"description": "Label for the search filter textbox on the Manage styles page"
@ -338,6 +359,10 @@
}
}
},
"dysfunctional": {
"message": "Stylus no puede funcionar en ventanas privadas porque Firefox no permite conexión directa al contexto de la página de entorno interna de la extensión.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "Secciones",
"description": "Title for the style sections section"
@ -346,6 +371,10 @@
"message": "no válidos omitidos",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "Restablecer",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "Editar estilo $stylename$",
"description": "Title of the page for editing styles",
@ -464,6 +493,18 @@
"message": "Buscar e instalar todas las actualizaciones disponibles",
"description": ""
},
"filteredStyles": {
"message": "$numShown$ mostrados de $numTotal$ en total",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "Se completó la importación de estilos",
"description": "Title of the report shown after importing styles"
@ -480,6 +521,10 @@
"message": "Este estilo utiliza expresiones regulares (regexps) parcialmente coincidentes violando así la <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>especificación @document de CSS4</a> que requiere una coincidencia completa de URL. Las secciones CSS afectadas no se aplicaron a la página. Probablemente este estilo fue creado con Stylish-para-Chrome, que evalúa de modo incorrecto las reglas 'regexp()' desde la primera versión (un fallo conocido).",
"description": ""
},
"linterCSSLintSettings": {
"message": "(Establezca la regla como: 0 = deshabilitada; 1 = advertencia; 2 = error)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "Sangrar @media, @supports",
"description": "CSS-beautifier option"
@ -492,6 +537,10 @@
"message": "Eliminar sección",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "Para mostrar estilos para una URL, precédala con 'url:'\nPor ejemplo, url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "Desactivar todos los estilos",
"description": "Label for the checkbox that turns all enabled styles off."
@ -512,6 +561,10 @@
"message": "Actualización completada.",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "No puede funcionar adecuadamente a causa de un fallo conocido en esta versión de Firefox: chrome.extension.getBackgroundPage() no devuelve un resultado válido.",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "Buscando...",
"description": "Text to display when checking a style for an update"
@ -524,14 +577,22 @@
"message": "Número de elementos se-aplica-a",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Mayús+clic o clic secundario abre el administrador con estilos aplicables para el sitio actual.",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylus usa un servicio externo https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
},
"updateCheckSkippedLocallyEdited": {
"message": "Este estilo se editó localmente",
"message": "Este estilo se editó localmente.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "Vea una lista completa de reglas",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "Restablecer opciones",
"description": ""
@ -544,6 +605,15 @@
"message": "Añadir 'Eliminar' al menú contextual del editor",
"description": ""
},
"linterConfigPopupTitle": {
"message": "Establezcer configuración de $linter$ reglas",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "actualizarón tanto meta información como código",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -572,6 +642,10 @@
"message": "Autocompletar al escribir",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "Sólo estilos deshabilitados",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "Como precaución de seguridad, el navegador prohíbe que las extensiones afecten a sus páginas integradas (como chrome://version, o la página estándar de nueva pestaña desde Chrome 61, o about:addons, y demás) así como las páginas de otras extensiones. Cada navegador también restringe el acceso a su propia galería de extensiones (como Chrome Web Store o AMO).",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -600,6 +674,10 @@
"message": "Sobrescribir estilo",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "También se habilita al desacoplar la pestaña del editor de una ventana de navegador,\ny se deshabilita al acoplar una única pestaña de editor en otra ventana.",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Ocurrió un error con la base de datos de Stylus. ¿Desea visitar una página web con posibles soluciones?",
"description": "Prompt when a DB error is encountered"
@ -628,6 +706,10 @@
"message": "Expresiones regulares no válidas omitidas",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "Sólo estilos externos",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "Reemplazar todo",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -656,15 +738,6 @@
"message": "Interfaz de opciones",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Problemas encontrados por $link$ con estas reglas aplicadas:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Distintivo en el icono de barra de herramientas",
"description": ""
@ -677,6 +750,10 @@
"message": "Anchura del diálogo emergente (en píxeles)",
"description": ""
},
"linterInvalidConfigError": {
"message": "No se guardó debido a estos ajustes de configuración no válidos:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"undo": {
"message": "Deshacer",
"description": "Button label"
@ -718,7 +795,7 @@
"description": ""
},
"addStyleLabel": {
"message": "Escribir un nuevo estilo",
"message": "Escribir un estilo nuevo",
"description": "Label for the button to go to the add style page"
},
"optionsUpdateIntervalNote": {
@ -741,6 +818,10 @@
"message": "Temas",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "Abrir editor en una nueva ventana",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "Seleccione un fichero o arrástrelo y suéltelo en esta página.",
"description": "Message for backup"
@ -753,6 +834,10 @@
"message": "Nombre del comando",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "Para deshacer este restablecimiento accidental, pulse Ctrl+Z (o Cmd+Z) en el cuadro de texto",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Rediseñe la web con Stylus, un administrador de estilos de usuario. Stylus le permite instalar fácilmente temas y coberturas para muchos sitios populares.",
"description": "Extension description"

View File

@ -3,6 +3,10 @@
"message": "Kõik",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Vead",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "vaikimisi",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "Ekspordi",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Vead",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "Vigane JSON-formaat",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "Taustavärv",
@ -60,7 +64,7 @@
"description": ""
},
"appliesDomainOption": {
"message": "URLe domeenis",
"message": "URLid domeenis",
"description": "Option to make the style apply to the entered string as a domain"
},
"checkForUpdate": {
@ -112,7 +116,7 @@
"description": "Label before the search input field in the editor shown on Ctrl-F"
},
"manageFaviconsGray": {
"message": "Halliks tehtud",
"message": "Tee halliks",
"description": "Label for the checkbox that toggles grayed out mode of applies-to favicons in the new UI on manage page"
},
"confirmYes": {
@ -139,6 +143,10 @@
"message": "Lubatud",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Selle linteri seadistamiseks klõpsa",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Koodi Mozilla-vormingut saab üles laadida saidile userstyles.org ja kasutada klassikalise Firefoxi Stylish'iga",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -155,6 +163,10 @@
"message": "Salvesta",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Salvestatud",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Kustuta",
"description": ""
@ -172,7 +184,7 @@
"description": "'Stop' button in a confirm dialog"
},
"writeStyleForURL": {
"message": "sellele URLile",
"message": "see URL",
"description": "Text for link in toolbar pop-up to write a new style for the current URL"
},
"optionsSubheading": {
@ -184,11 +196,11 @@
"description": "Label for the button to add an 'applies' entry"
},
"appliesRegexpOption": {
"message": "URLid, mis vastavad regulaaravaldisele",
"message": "Regulaaravaldisele vastavad URLid",
"description": "Option to make the style apply to the entered string as a regular expression"
},
"optionsAdvancedExposeIframesNote": {
"message": "Lubab iframe'i-põhilise CSS-koodi kirjutamist, nagu \"html[stylus-iframe] h1 { display:none }\"",
"message": "Lubab iframe'i-põhise CSS-koodi kirjutamise, nagu \"html[stylus-iframe] h1 { display:none }\"",
"description": ""
},
"importReportLegendUpdatedCode": {
@ -196,7 +208,7 @@
"description": "Text after the number of styles with updated code (meta info is unchanged) in the report shown after importing styles"
},
"styleInstall": {
"message": "Installid \"$stylename$\" Stylus-esse?",
"message": "Installida \"$stylename$\" Stylus'isse?",
"description": "Confirmation when installing a style",
"placeholders": {
"stylename": {
@ -220,6 +232,15 @@
"message": "Ainult kohalikult loodud stiilid",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "$link$ leidis need vead:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "Otsi sisu",
"description": "Label for the search filter textbox on the Manage styles page"
@ -245,7 +266,7 @@
"description": "Label for the checkbox controlling toolbar badge text."
},
"manageFavicons": {
"message": "Favicon'id \"rakendub\"-tulbas",
"message": "Lehe ikoonid rakendub-tulbas",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
},
"menuShowBadge": {
@ -309,7 +330,7 @@
"description": "Heading for options section on manage page."
},
"appliesDisplay": {
"message": "Rakendub: $applies$",
"message": "Rakendub saitidele: $applies$",
"description": "Text on the manage screen to describe what the style applies to",
"placeholders": {
"applies": {
@ -334,6 +355,10 @@
}
}
},
"dysfunctional": {
"message": "Stylus ei saa privaatsetes akendes töötada, sest Firefox ei luba otseühendust laienduse sisemisele taustalehe kontekstile.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "Jaotised",
"description": "Title for the style sections section"
@ -342,6 +367,10 @@
"message": "sobimatut vahele jäetud",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "Lähtesta",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "Muuda stiili $stylename$",
"description": "Title of the page for editing styles",
@ -428,7 +457,7 @@
"description": "Text after the number of styles with updated meta info like name/url in the report shown after importing styles"
},
"appliesLabel": {
"message": "Rakendub",
"message": "Rakendub saitidele",
"description": "Label for 'applies to' fields on the edit/add screen"
},
"openOptionsPopup": {
@ -460,6 +489,18 @@
"message": "Kontrolli ja installi kõik saadaolevad uuendused",
"description": ""
},
"filteredStyles": {
"message": "$numShown$/$numTotal$ kuvatud",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "Stiilide importimine lõpetatud",
"description": "Title of the report shown after importing styles"
@ -476,6 +517,10 @@
"message": "See stiil kasutab osaliselt vastavaid regulaaravaldisi, olles <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>CSS4 @dokument standardiga</a> vastuolus, mis nõuab terve URLi vastet. Mõjutatud CSS-jaotisi ei rakendatud lehele. See stiil tehti tõenäoliselt Chrome'i Stylish'is, mis kontrollib \"regexp()\" reegleid valesti alates esimesest versioonist (teadaolev viga).",
"description": ""
},
"linterCSSLintSettings": {
"message": "(Määra reegel kui: 0 = keelatud; 1 = hoiatus; 2 = viga)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "Taanda @media, @supports",
"description": "CSS-beautifier option"
@ -488,6 +533,10 @@
"message": "Eemalda jaotis",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "Et näidata stiile teatud URL-i jaoks, lisa selle ette 'url:'\nNäiteks url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "Lülita kõik stiilid välja",
"description": "Label for the checkbox that turns all enabled styles off."
@ -508,6 +557,10 @@
"message": "Uuendus teostatud.",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "Ei saa korralikult töötada, sest selles Firefoxi versioonis on tuntud viga: chrome.extension.getBackgroundPage() ei tagasta kehtivat tulemit",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "Kontrollin...",
"description": "Text to display when checking a style for an update"
@ -517,9 +570,13 @@
"description": "RegExp test report: label for the fully matching expressions"
},
"manageMaxTargets": {
"message": "\"Rakendub\"-üksuste arv",
"message": "Rakendub-üksuste arv",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift+klõps või paremklõps avab halduri praeguse saidi kohta käivate stiilidega",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylus kasutab välist teenust https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -528,6 +585,10 @@
"message": "Seda stiili muudeti kohalikult.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "Vaata reeglite täielikku loendit",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "Lähtesta valikud",
"description": ""
@ -540,6 +601,15 @@
"message": "Lisa \"Kustuta\" redaktori kontekstmenüüsse",
"description": ""
},
"linterConfigPopupTitle": {
"message": "Linteri $linter$ reeglite seadistuse määramine",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "said uuenduse nii metaandmetele kui koodile",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -568,6 +638,10 @@
"message": "Automaattäide kirjutamisel",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "Ainult keelatud stiilid",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "Turvakaalutlustel keelab brauser laiendustel sisseehitatud lehtede (nagu chrome://version, standardne uue kaardi leht alates versioonist Chrome 61, about:addons jne) ning ka teiste laienduste lehtede muutmise. Iga brauser piirab lisaks juurdepääsu oma laienduste galeriile (nagu Chrome'i veebipood või AMO).",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -596,8 +670,12 @@
"message": "Kirjuta stiil üle",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "Lubatakse ka redaktori kaardi veebilehitseja aknast eraldamisel,\nja keelatakse üksiku redaktori kaardi haakimisel teise aknasse.",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Stylus'e andmebaasi uuendamisel esines viga. Kas soovid külastada võimalike lahendustega veebilehte?",
"message": "Stylus'i andmebaasi uuendamisel esines viga. Kas soovid külastada võimalike lahendustega veebilehte?",
"description": "Prompt when a DB error is encountered"
},
"optionsAdvanced": {
@ -624,6 +702,10 @@
"message": "Sobimatud regulaaravaldised vahele jäetud",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "Ainult välised stiilid",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "Asenda kõik",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -652,15 +734,6 @@
"message": "Valikute liides",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "$link$ poolt leitud vead nende lubatud reeglitega:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Number tööriistaribaikoonil",
"description": ""
@ -673,6 +746,10 @@
"message": "Hüpikakna laius (pikslites)",
"description": ""
},
"linterInvalidConfigError": {
"message": "Ei salvestatud nende vigaste seadistuste tõttu:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "Ei",
"description": "'No' button in a confirm dialog"
@ -741,6 +818,10 @@
"message": "Teema",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "Ava redaktor uues aknas",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "Vali fail või lohista see siia lehele.",
"description": "Message for backup"
@ -753,8 +834,12 @@
"message": "Kirjuta käsu nimi",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "Kogemata tehtud lähtestamiste tagasi võtmiseks vajuta tekstikastis Ctrl-Z (või Cmd-Z)",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Disaini veeb ümber Stylus'ega - kasutajastiilide haldur. Stylus võimaldab sul lihtsalt installida teemasid ja välimusi mitmetele populaarsetele saitidele.",
"message": "Disaini veeb ümber kasutajastiilide halduri Stylus'iga. Stylus võimaldab sul lihtsalt installida teemasid ja välimusi mitmetele populaarsetele saitidele.",
"description": "Extension description"
}
}

View File

@ -3,6 +3,10 @@
"message": "すべて",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "問題点",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "デフォルト",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "エクスポート",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "問題点",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "不正なJSONフォーマットです",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "背景色",
@ -139,6 +143,10 @@
"message": "有効",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Linter の設定を行うときはクリックしてください",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Mozilla 形式のコードは、userstyles.org に投稿することができ、また従来の Stylish for Firefox でも使用できます。",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -155,6 +163,10 @@
"message": "保存",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "保存しました",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "削除",
"description": ""
@ -220,6 +232,15 @@
"message": "ローカルに作成されたスタイルのみ",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "$link$ によってこれらの問題点が見つかりました :",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "コンテンツの検索",
"description": "Label for the search filter textbox on the Manage styles page"
@ -233,7 +254,7 @@
"description": "Label for the button to apply all detected updates"
},
"unreachableFileHint": {
"message": "Stylusはchrome://extensionsページのStylus拡張機能に対応するチェックボックスを有効にした場合にのみ、file:// URLにアクセスできます。",
"message": "chrome://extensions ページでStylus拡張機能の当該チェックボックスを有効にした場合にのみ、Stylusは file:// URLにアクセスできます。",
"description": "Note in the toolbar popup for file:// URLs"
},
"disableStyleLabel": {
@ -334,6 +355,10 @@
}
}
},
"dysfunctional": {
"message": "Stylusはプライベートウィンドウでは機能しません。これは、Firefoxが拡張機能の内部のバックグラウンドページに直接接続することを禁止しているためです。",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "セクション",
"description": "Title for the style sections section"
@ -342,6 +367,10 @@
"message": "件の無効なスタイルをスキップしました",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "リセット",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "スタイル「$stylename$」を編集",
"description": "Title of the page for editing styles",
@ -460,6 +489,18 @@
"message": "使用可能なすべての更新を確認してインストールする",
"description": ""
},
"filteredStyles": {
"message": "$numTotal$ 件中の $numShown$ 件を表示",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "スタイルのインポートが終了しました",
"description": "Title of the report shown after importing styles"
@ -472,6 +513,10 @@
"message": "このスタイルは、完全なURLの一致を要求する <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>CSS4 @document 仕様</a> に違反した部分一致の正規表現を使用しています。影響を受けるCSSセクションはページに適用されませんでした。このスタイルは、'regexp()' のルールを誤ってチェックしていた かなり初期のバージョンの Stylish-for-Chrome で作成された可能性があります(既知のバグです)",
"description": ""
},
"linterCSSLintSettings": {
"message": "(次のようにルールを設定してください : 0=無効, 1=警告, 2=エラー)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "@media, @supports をインデント",
"description": "CSS-beautifier option"
@ -484,6 +529,10 @@
"message": "セクションを削除",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "URLに対応するスタイルを探すときは、「url:」という接頭辞を付けてください。\n例. url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "すべてのスタイルをオフにする",
"description": "Label for the checkbox that turns all enabled styles off."
@ -504,6 +553,10 @@
"message": "更新が完了しました",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "このバージョンのFirefoxの次の既知のバグのために正常に機能しません : chrome.extension.getBackgroundPage() が正しい結果を返しません",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "チェック中...",
"description": "Text to display when checking a style for an update"
@ -516,6 +569,10 @@
"message": "適用先欄の表示件数",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift-クリック または 右クリック で、現在のサイトに適用可能なスタイルの管理画面を開きます。",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylusは外部サービスを使用します https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -524,6 +581,10 @@
"message": "このスタイルはローカルで編集されました。",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "ルールの完全なリストを見る",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "オプションをリセット",
"description": ""
@ -536,6 +597,15 @@
"message": "エディタのコンテキストメニューに「削除」を追加します",
"description": ""
},
"linterConfigPopupTitle": {
"message": "$linter$ のルールを設定する",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "件のメタ情報とコードを更新しました",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -549,7 +619,7 @@
"description": "RegExp test button label in the editor shown when applies-to list has a regexp value"
},
"appliesHelp": {
"message": "[適用先] を使用すると、このセクションのコードが適用される URL を制限することができます。",
"message": "「適用先」を使用すると、このセクションのコードが適用される URL を制限することができます。",
"description": "Help text for 'applies to' section"
},
"editStyleHeading": {
@ -564,6 +634,10 @@
"message": "入力の自動補完",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "無効なスタイルのみ",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "セキュリティ上の予防措置として、ブラウザは拡張機能がビルトイン ページchrome://version, Chrome 61 の標準の新しいタブページ, about:addons 等に影響を与えることを禁止しています。これは他の拡張機能のページについても同様です。各ブラウザはまた、自身の拡張機能ギャラリーへのアクセスについても制限していますChrome Web ストア や AMO 等)",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -592,6 +666,10 @@
"message": "スタイルを上書き",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "エディタのタブをブラウザのウィンドウから切り離すことでも有効になります。\nそして、分離したエディタのタブを他のブラウザのウィンドウに結合すれば無効になります。",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Stylusのデータベース使用中にエラーが発生しました。考えられる解決策を記載したWebページを開きますか",
"description": "Prompt when a DB error is encountered"
@ -605,7 +683,7 @@
"description": "Tooltip for the button to import a style and append to the existing sections"
},
"editorStylesButton": {
"message": "エディタスタイルを見つける",
"message": "エディタスタイルを見つける",
"description": "Find styles for the editor"
},
"optionsOpen": {
@ -620,6 +698,10 @@
"message": "無効な正規表現がスキップされました",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "外部から取得したスタイルのみ",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "すべて置換",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -648,15 +730,6 @@
"message": "オプション UI",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "これらのルールを有効にして $link$ で見つかった問題:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "ツールバーアイコンのバッジ",
"description": ""
@ -669,6 +742,10 @@
"message": "ポップアップの幅(ピクセル単位)",
"description": ""
},
"linterInvalidConfigError": {
"message": "これらの不正な設定のために保存されませんでした :",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "いいえ",
"description": "'No' button in a confirm dialog"
@ -737,6 +814,10 @@
"message": "テーマ",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "新しいウィンドウでエディタを開く",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "ファイルを選択するか、このページにドラッグ&ドロップします。",
"description": "Message for backup"
@ -749,8 +830,12 @@
"message": "コマンド名を入力",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "予期しないリセットを復旧するには、テキストボックス内で Ctrl-Zまたは Cmd-Zを押してください",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Stylus はユーザー スタイルを管理するツールで、ウェブのスタイルを変更することができます。Stylus を利用すると、さまざまなサイトに対応したテーマやスキンを簡単にインストールできます。",
"message": "Stylus でウェブのデザインを変更しましょう。これは、ユーザースタイルを管理するツールです。Stylus を利用すると、多くの人気サイト向けのテーマやスキンを簡単にインストールできます。",
"description": "Extension description"
}
}

View File

@ -11,10 +11,6 @@
"message": "Exporteren",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Problemen",
"description": "Label for the CSS linter issues block on the style edit page"
},
"cm_tabSize": {
"message": "Tabgrootte",
"description": "Label for the text box controlling tab size option for the style editor."
@ -344,15 +340,6 @@
"message": "Controleer alle stijlen op updates",
"description": "Label for the button to check all styles for updates"
},
"linterIssuesHelp": {
"message": "De door stylelint gevonden problemen, $link$, met deze ingeschakelde regels:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"confirmNo": {
"message": "Nee",
"description": "'No' button in a confirm dialog"

View File

@ -3,6 +3,10 @@
"message": "Wszystkie",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Problemy",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "domyślny",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "Eksportuj",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Problemy",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "Nieprawidłowy format JSON",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "Kolor tła",
@ -139,6 +143,10 @@
"message": "Włączony",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Kliknij, aby skonfigurować ten linter",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Kod w formacie Mozilla może być przesłany do userstyles.org i użyty z klasycznym dodatkiem Stylish dla Firefoksa",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -155,6 +163,10 @@
"message": "Zapisz",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Zapisano",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Usuń",
"description": ""
@ -220,6 +232,15 @@
"message": "Tylko style stworzone lokalnie",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "Te problemy zostały znalezione przez $link$:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "Szukaj treści",
"description": "Label for the search filter textbox on the Manage styles page"
@ -334,6 +355,10 @@
}
}
},
"dysfunctional": {
"message": "Stylus nie może działać w oknach prywatnych, ponieważ Firefox zakazuje bezpośredniego połączenia z kontekstem wewnętrznej strony tła rozszerzenia.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "Sekcje",
"description": "Title for the style sections section"
@ -342,6 +367,10 @@
"message": "nieprawidłowe pominięte",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "Resetuj",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "Edytuj styl $stylename$",
"description": "Title of the page for editing styles",
@ -460,6 +489,18 @@
"message": "Sprawdź i zainstaluj wszystkie dostępne aktualizacje",
"description": ""
},
"filteredStyles": {
"message": "Pokazano $numShown$ z sumy $numTotal$",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "Ukończono importowanie stylów",
"description": "Title of the report shown after importing styles"
@ -473,9 +514,13 @@
"description": "Label for the drop-down list controlling the automatic highlighting of current word/selection occurrences in the style editor."
},
"styleRegexpPartialExplanation": {
"message": "Ten styl wykorzystuje częściowo dopasowane regexpy z naruszeniem <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>specyfikacji CSS4 @document</a> która wymaga pełnego dopasowania adresów URL. Dotkniętych sekcji CSS nie zastosowano do strony. Ten styl prawdopodobnie powstał w Stylish-for-Chrome, który nieprawidłowo sprawdza reguły 'regexp()' od pierwszej wersji (znany błąd).",
"message": "Ten styl wykorzystuje częściowo dopasowane regexpy z naruszeniem <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>specyfikacji CSS4 @document</a>, która wymaga pełnego dopasowania adresów URL. Dotyczących sekcji CSS nie zastosowano do strony. Ten styl prawdopodobnie powstał w Stylish-dla-Chrome, który nieprawidłowo sprawdza reguły 'regexp()' od pierwszej wersji (znany błąd).",
"description": ""
},
"linterCSSLintSettings": {
"message": "(Ustaw regułę jako: 0 = wyłączone; 1 = ostrzeżenie; 2 = błąd)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "Wcięcie @media, @supports",
"description": "CSS-beautifier option"
@ -488,6 +533,10 @@
"message": "Usuń sekcję",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "Aby zobaczyć style dla adresu URL, dodaj prefiks 'url:'\nNa przykład url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "Wyłącz wszystkie style",
"description": "Label for the checkbox that turns all enabled styles off."
@ -508,6 +557,10 @@
"message": "Aktualizacja zakończona.",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "Nie działa prawidłowo ze względu na znany błąd w tej wersji Firefoksa: chrome.extension.getBackgroundPage() nie zwraca prawidłowego wyniku",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "Sprawdzanie...",
"description": "Text to display when checking a style for an update"
@ -520,6 +573,10 @@
"message": "Liczba dotyczących elementów ",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift + kliknięcie lub kliknięcie prawym przyciskiem otwiera menedżera ze stylami obowiązującymi dla bieżącej strony",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylus korzysta z usługi zewnętrznej https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -528,6 +585,10 @@
"message": "Ten styl był edytowany lokalnie.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "Zobacz pełną listę reguł",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "Resetuj opcje",
"description": ""
@ -540,6 +601,15 @@
"message": "Dodaj 'Usuń' do menu kontekstowego edytora",
"description": ""
},
"linterConfigPopupTitle": {
"message": "Ustaw konfigurację reguł $linter$",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "zaktualizowano meta info i kod",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -568,6 +638,10 @@
"message": "Autouzupełnianie podczas pisania",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "Tylko wyłączone style",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "Ze względów bezpieczeństwa przeglądarka nie zezwala, aby rozszerzenia wpływały na wbudowane strony (np. chrome://version, standardowa strona nowej karty od Chrome 61, about:addons itd.), a także na inne strony rozszerzeń. Każda przeglądarka ogranicza również dostęp do własnej galerii rozszerzeń (np. Chrome Web Store lub AMO).",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -600,6 +674,10 @@
"message": "Nadpisz styl",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "Także włączone przez odłączenie karty edytora od okna przeglądarki,\nwyłączone przez dołączenie pojedynczej karty edytora do innego okna.",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Podczas używania bazy danych Stylus wystąpił błąd. Czy chcesz odwiedzić stronę internetową z możliwymi rozwiązaniami?",
"description": "Prompt when a DB error is encountered"
@ -624,10 +702,18 @@
"message": "Naciśnij klawisz skrótu",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"cm_linter": {
"message": "Linter CSS",
"description": "Select the linter to check for CSS issues"
},
"styleRegexpTestInvalid": {
"message": "Nieprawidłowe regexpy pominięto",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "Tylko zewnętrzne style",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "Zamień wszystkie",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -656,15 +742,6 @@
"message": "Opcje interfejsu",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Problemy znalezione przez $link$ z tymi włączonymi regułami:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Emblemat na ikonie paska narzędzi",
"description": ""
@ -677,6 +754,10 @@
"message": "Szerokość okna (w pikselach)",
"description": ""
},
"linterInvalidConfigError": {
"message": "Nie zapisano z powodu tych nieprawidłowych ustawień konfiguracji:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "Nie",
"description": "'No' button in a confirm dialog"
@ -745,6 +826,10 @@
"message": "Motyw",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "Otwórz edytor w nowym oknie",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "Wybierz plik lub przeciągnij i upuść go na tę stronę.",
"description": "Message for backup"
@ -757,8 +842,12 @@
"message": "Wpisz nazwę polecenia",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "Aby cofnąć przypadkowe zresetowanie, w polu tekstowym naciśnij Ctrl-Z (lub Cmd-Z)",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Przeprojektuj sieć za pomocą Stylusa - menedżera stylów użytkownika. Stylus umożliwia łatwe instalowanie motywów i skórek dla wielu popularnych stron.",
"message": "Przeprojektuj sieć za pomocą Stylusa menedżera stylów użytkownika. Stylus umożliwia łatwe instalowanie motywów i skórek dla wielu popularnych stron.",
"description": "Extension description"
}
}

View File

@ -0,0 +1,663 @@
{
"appliesToEverything": {
"message": "Tudo",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Problemas",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "padrão",
"description": "Default CodeMirror CSS theme option on the edit style page"
},
"styleRegexpTestTitle": {
"message": "Lista de separadores abertos correspondentes (clica no URL para focar no separador)",
"description": "RegExp test report: title of the report"
},
"bckpInstStyles": {
"message": "Exportar estilos",
"description": ""
},
"optionsUpdateInterval": {
"message": "Verificar automaticamente e instalar todos as atualizações para estilos do utilizador [userstyles] disponíveis (em horas)",
"description": ""
},
"exportLabel": {
"message": "Exportar",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"optionsBadgeNormal": {
"message": "Cor de fundo",
"description": ""
},
"updateCheckHistory": {
"message": "Histórico de verificação de atualizações",
"description": ""
},
"cm_tabSize": {
"message": "Tamanho do tab",
"description": "Label for the text box controlling tab size option for the style editor."
},
"enableStyleLabel": {
"message": "Ativar",
"description": "Label for the button to enable a style"
},
"styleMissingName": {
"message": "Insira um nome.",
"description": "Error displayed when user saves without providing a name"
},
"genericHistoryLabel": {
"message": "Histórico",
"description": "Used in various places to show a history log of something"
},
"shortcutsNote": {
"message": "Definir atalhos de teclad",
"description": ""
},
"appliesDomainOption": {
"message": "URLs no domínio",
"description": "Option to make the style apply to the entered string as a domain"
},
"checkForUpdate": {
"message": "Verificar por atualização",
"description": "Label for the button to check a single style for an update"
},
"styleRegexpInvalidExplanation": {
"message": "Algumas regras 'regexp()' que não podiam ser compiladas de todo",
"description": ""
},
"importAppendLabel": {
"message": "Anexar ao estilo",
"description": "Label for the button to import a style and append to the existing sections"
},
"optionsOpenManager": {
"message": "Gerir estilos",
"description": ""
},
"updateAllCheckSucceededNoUpdate": {
"message": "Nenhuma atualização encontrada.",
"description": "Text that displays when an update all check completed and no updates are available"
},
"importReportLegendAdded": {
"message": "Adicionado",
"description": "Text after the number of styles added in the report shown after importing styles"
},
"styleFromMozillaFormatPrompt": {
"message": "Colar o código Formato-Mozilla",
"description": "Prompt in the dialog displayed after clicking 'Import from Mozilla format' button"
},
"dragDropMessage": {
"message": "Solta o ficheiro da tua cópia de segurança em qualquer sítio nesta página para importar.",
"description": "Drag'n'drop message"
},
"helpAlt": {
"message": "Ajuda",
"description": "Alternate text for help buttons"
},
"search": {
"message": "Pesquisar",
"description": "Label before the search input field in the editor shown on Ctrl-F"
},
"manageFaviconsGray": {
"message": "Acizentado",
"description": "Label for the checkbox that toggles grayed out mode of applies-to favicons in the new UI on manage page"
},
"confirmYes": {
"message": "Sim",
"description": "'Yes' button in a confirm dialog"
},
"findStylesForSite": {
"message": "Encontrar mais estilos para este site",
"description": "Text for a link that gets a list of styles for the current site"
},
"manageHeading": {
"message": "Estilos instalados",
"description": "Heading for the manage page"
},
"styleBeautify": {
"message": "Embelezar",
"description": "Label for the CSS-beautifier button on the edit style page"
},
"styleEnabledLabel": {
"message": "Ativado",
"description": "Label for the enabled state of styles"
},
"styleToMozillaFormatHelp": {
"message": "O formato Mozilla do código pode ser submetido em userstyles.org e usado com o clássico Stylish para o Firefox",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
},
"sectionAdd": {
"message": "Adicionar outra seção",
"description": "Label for the button to add a section"
},
"styleSaveLabel": {
"message": "Guardar",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Guardados",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Apagar",
"description": ""
},
"confirmCancel": {
"message": "Cancelar",
"description": ""
},
"retrieveBckp": {
"message": "Importar estilos",
"description": ""
},
"confirmStop": {
"message": "Parar",
"description": "'Stop' button in a confirm dialog"
},
"writeStyleForURL": {
"message": "este URL",
"description": "Text for link in toolbar pop-up to write a new style for the current URL"
},
"optionsSubheading": {
"message": "Mais opções",
"description": "Subheading for options section on manage page."
},
"appliesAdd": {
"message": "Adicionar",
"description": "Label for the button to add an 'applies' entry"
},
"appliesRegexpOption": {
"message": "URLs a combinar com o regexp",
"description": "Option to make the style apply to the entered string as a regular expression"
},
"optionsAdvancedExposeIframesNote": {
"message": "Permite escrever CSS específico a iframe como 'html[stylus-iframe] h1 { display:none }'",
"description": ""
},
"importReportLegendUpdatedCode": {
"message": "atualizar código",
"description": "Text after the number of styles with updated code (meta info is unchanged) in the report shown after importing styles"
},
"styleInstall": {
"message": "Instalar '$stylename$' no Stylus?",
"description": "Confirmation when installing a style",
"placeholders": {
"stylename": {
"content": "$1"
}
}
},
"optionsBadgeDisabled": {
"message": "Cor de fundo quando desativado",
"description": ""
},
"optionsCheck": {
"message": "Atualizar estilos",
"description": ""
},
"manageText": {
"message": "<a href='https://userstyles.org'>Obter estilos em userstyles.org</a>|<a href='http://add0n.com/stylus.html'>Obter ajuda</a>",
"description": "Help text on the manage page"
},
"searchStyles": {
"message": "Pesquisar conteúdos",
"description": "Label for the search filter textbox on the Manage styles page"
},
"checkAllUpdatesForce": {
"message": "Verifica outra vez, eu não editei nenhum estilo!",
"description": "Label for the button to apply all detected updates"
},
"unreachableFileHint": {
"message": "O Stylus pode acessar URLs file:// apenas se ativares a checkbox correspondente para a extensão Stylus na página chrome://extensions",
"description": "Note in the toolbar popup for file:// URLs"
},
"disableStyleLabel": {
"message": "Desativar",
"description": "Label for the button to disable a style"
},
"prefShowBadge": {
"message": "Número de estilos ativadas para o site atual",
"description": "Label for the checkbox controlling toolbar badge text."
},
"manageFavicons": {
"message": "Favicons em columas que se aplicam",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
},
"menuShowBadge": {
"message": "Mostrar a conta de estilos ativados",
"description": "Label (must be very short) for the checkbox in the toolbar button context menu controlling toolbar badge text."
},
"cm_lineWrapping": {
"message": "Formatação de palavras",
"description": "Label for the checkbox controlling word wrap option for the style editor."
},
"styleCancelEditLabel": {
"message": "Voltar a gerir",
"description": "Label for cancel button for style editing"
},
"styleChangesNotSaved": {
"message": "Fizeste alterações a este estilo sem as guardar.",
"description": "Text for the prompt when changes are made to a style and the user tries to leave without saving"
},
"importLabel": {
"message": "Importar",
"description": "Label for the button to import a style ('edit' page) or all styles ('manage' page)"
},
"shortcuts": {
"message": "Atalhos",
"description": "Go to shortcut configuration"
},
"updateCheckFailServerUnreachable": {
"message": "A atualização falhou: servidor inacessível.",
"description": "Text that displays when an update check failed because the update server is unreachable"
},
"manageFilters": {
"message": "Filtros",
"description": "Label for filters container"
},
"applyAllUpdates": {
"message": "Aplicar todas as atualizações",
"description": "Label for the button to apply all detected updates"
},
"optionsReset": {
"message": "Restabelecer as opções aos valores iniciais",
"description": ""
},
"optionsCustomizeUpdate": {
"message": "Atualizações",
"description": ""
},
"deleteStyleConfirm": {
"message": "Tens a certeza que queres apagar este estilo?",
"description": "Confirmation before deleting a style"
},
"styleBadRegexp": {
"message": "Regexp é inválido",
"description": "Validation message for a bad regexp in a style"
},
"optionsHeading": {
"message": "Opções",
"description": "Heading for options section on manage page."
},
"appliesDisplay": {
"message": "Aplica-se a: $applies$",
"description": "Text on the manage screen to describe what the style applies to",
"placeholders": {
"applies": {
"content": "$1"
}
}
},
"openStylesManager": {
"message": "Abrir gestor de estilos",
"description": "Label for the style maanger opener in the browser action context menu."
},
"styleUpdate": {
"message": "Tens a certeza que queres atualizar '$stylename$'?",
"description": "Confirmation when updating a style",
"placeholders": {
"stylename": {
"content": "$1"
}
}
},
"styleSectionsTitle": {
"message": "Seções",
"description": "Title for the style sections section"
},
"editStyleTitle": {
"message": "Editar estilo $stylename$",
"description": "Title of the page for editing styles",
"placeholders": {
"stylename": {
"content": "$1"
}
}
},
"updateCheckSucceededNoUpdate": {
"message": "O estilo está atualizado.",
"description": "Text that displays when an update check completed and no update is available"
},
"appliesUrlPrefixOption": {
"message": "URLs a começar com",
"description": "Option to make the style apply to the entered string as a URL prefix"
},
"searchRegexp": {
"message": "Usa a syntax /re/ para pesquisas regexp",
"description": "Label after the search input field in the editor shown on Ctrl-F"
},
"updateCheckManualUpdateHint": {
"message": "Forçar uma atualização vai substituir qualquer edição local.",
"description": "Additional text displayed when an update check skipped updating the style to avoid losing local modifications"
},
"toggleStyle": {
"message": "Alternar estil",
"description": "Label for the checkbox to enable/disable a style"
},
"importReplaceTooltip": {
"message": "Descartar conteúdos do estilo atual e substituir com o estilo importado",
"description": "Label for the button to import and overwrite current style"
},
"popupStylesFirst": {
"message": "Estilos antes de comandos",
"description": "Label for the checkbox controlling section order in the popup."
},
"sectionHelp": {
"message": "As seções deixam definir diferentes peças de código a aplicar em diferentes conjuntos de URLs no mesmo estilo. Por exemplo, um só estilo pode mudar a página principal de um site de uma maneira, enquanto muda o resto do site de outra.",
"description": "Help text for sections"
},
"noStylesForSite": {
"message": "Não tens estilos instalados para este site",
"description": "Text displayed when no styles are installed for the current site"
},
"appliesDisplayTruncatedSuffix": {
"message": "e mais",
"description": "Text added to appliesDisplay when there are more sites for the style than are displayed"
},
"appliesRemove": {
"message": "Remover",
"description": "Label for the button to remove an 'applies' entry"
},
"updatesCurrentlyInstalled": {
"message": "Atualizações instaladas:",
"description": "Text that displays when an update is installed on options page. Followed by the number of currently installed updates."
},
"styleToMozillaFormatTitle": {
"message": "Estilar no formato Mozilla",
"description": "Title of the popup with the style code in Mozilla format, shown after pressing the Export button on Edit style page"
},
"writeStyleFor": {
"message": "Escrever estilo para",
"description": "Label for toolbar pop-up that precedes the links to write a new style"
},
"replace": {
"message": "Substituir",
"description": "Label before the replace input field in the editor shown on Ctrl-H"
},
"styleRegexpTestNone": {
"message": "Nenhum separador correspondente",
"description": "RegExp test report: label for expressions that didn't match any tabs"
},
"appliesLabel": {
"message": "Aplica-se a",
"description": "Label for 'applies to' fields on the edit/add screen"
},
"openOptionsPopup": {
"message": "Opções",
"description": "Go to Options UI"
},
"openManage": {
"message": "Gerir",
"description": "Link to open the manage page."
},
"updateCheckFailBadResponseCode": {
"message": "A atualização falhou: o servidor respondeu com o código $code$.",
"description": "Text that displays when an update check failed because the response code indicates an error",
"placeholders": {
"code": {
"content": "$1"
}
}
},
"appliesSpecify": {
"message": "Especificar",
"description": "Label for the button to make a style apply only to specific sites"
},
"installUpdate": {
"message": "Instalar atualização",
"description": "Label for the button to install an update for a single style"
},
"optionsCheckUpdate": {
"message": "Verificar por e instalar todas as atualizações disponíveis",
"description": ""
},
"styleMozillaFormatHeading": {
"message": "Formato Mozilla",
"description": "Heading for the section with buttons to import/export Mozilla format of the style"
},
"cm_matchHighlight": {
"message": "Realçar",
"description": "Label for the drop-down list controlling the automatic highlighting of current word/selection occurrences in the style editor."
},
"styleRegexpPartialExplanation": {
"message": "Este estilo usa regexps parcialmente correspondentes em violação da <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>CSS4 @document specification</a> que requere um URL inteiro. As seções de CSS afetadas não foram aplicadas nesta página. Este estilo foi provavelmente criado no Stylish-for-Chrome o qual verifica incorretamente as regras 'regexp()' desde a primeira versão (bug conhecido).",
"description": ""
},
"styleBeautifyIndentConditional": {
"message": "Indentar @media, @supports",
"description": "CSS-beautifier option"
},
"sectionRemove": {
"message": "Remover seção",
"description": "Label for the button to remove a section"
},
"disableAllStyles": {
"message": "Desligar todos os estilos",
"description": "Label for the checkbox that turns all enabled styles off."
},
"updateCheckSkippedMaybeLocallyEdited": {
"message": "Este estilo pode ter sido editado localmente",
"description": "Text that displays when an update check skipped updating the style to avoid losing possible local modifications"
},
"undoGlobal": {
"message": "Desfazer em todas as seções",
"description": "CSS-beautify global Undo button label"
},
"updateCompleted": {
"message": "Atualização completa.",
"description": "Text that displays when an update completed"
},
"checkingForUpdate": {
"message": "A verificar...",
"description": "Text to display when checking a style for an update"
},
"styleRegexpTestFull": {
"message": "Separadores corresponedentes",
"description": "RegExp test report: label for the fully matching expressions"
},
"manageMaxTargets": {
"message": "Número de items aos quais se aplica",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"manageFaviconsHelp": {
"message": "O Stylus usa um serviço externo https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
},
"updateCheckSkippedLocallyEdited": {
"message": "Este estilo foi editado localmente.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"optionsResetButton": {
"message": "Restabelecer opções",
"description": ""
},
"sectionCode": {
"message": "Código",
"description": "Label for the code for a section"
},
"cm_smartIndent": {
"message": "Usar indentação inteligente",
"description": "Label for the checkbox controlling smart indentation option for the style editor."
},
"appliesHelp": {
"message": "Usa os controlos \"Aplica-se a\" para limitar a que URLs o código nesta seção se aplica.",
"description": "Help text for 'applies to' section"
},
"editStyleHeading": {
"message": "Editar estil",
"description": "Title of the page for editing styles"
},
"editDeleteText": {
"message": "Apagar",
"description": "Label for the context menu item in the editor to delete selected text"
},
"stylusUnavailableForURLdetails": {
"message": "Como precaução de segurança, o browser proíbe extensões de afetar as páginas embutidas (como chrome://version, a página de novo separador padrão no Chrome 61, about:addons, e por aí em diante) tal como outras páginas de extensões. Cada browser também restringe acesso à sua própria galeria de extensões (como Chrome Web Store ou AMO)",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
},
"updateAllCheckSucceededSomeEdited": {
"message": "Alguns estilos que podem ser atualizados não foram verificados para evitar perder edições locais possíveis. As atualizações podem ser forçadas ao verificar individualmente, ou fazendo outra verificação para todos os estilos (estilos locais vão ser substituidos)",
"description": "Text that displays when an update all check completed and no updates are available"
},
"stylusUnavailableForURL": {
"message": "O Stylus não funciona em páginas como esta.",
"description": "Note in the toolbar pop-up when on a URL Stylus can't affect"
},
"manageOnlyUpdates": {
"message": "Apenas com atualizações ou problemas",
"description": "Checkbox to show only styles that have updates after check-all-styles-for-updates was performed"
},
"addStyleTitle": {
"message": "Adicionar estilo",
"description": "Title of the page for adding styles"
},
"importReplaceLabel": {
"message": "Substituir estil",
"description": "Label for the button to import and overwrite current style"
},
"dbError": {
"message": "Ocorreu um erro ao usar a base de dados do Stylus. Gostarias de visitar um website com soluções possíveis?",
"description": "Prompt when a DB error is encountered"
},
"optionsAdvanced": {
"message": "Avançado",
"description": ""
},
"importAppendTooltip": {
"message": "Anexar o estilo importado ao estilo atual",
"description": "Tooltip for the button to import a style and append to the existing sections"
},
"editorStylesButton": {
"message": "Encontrar editor de estilos",
"description": "Find styles for the editor"
},
"optionsOpen": {
"message": "Abrir",
"description": ""
},
"helpKeyMapHotkey": {
"message": "Carrega numa tecla de atalho",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"replaceAll": {
"message": "Substituir todos",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
},
"importReportUnchanged": {
"message": "Nada foi mudado",
"description": "Message in the report shown after importing styles"
},
"optionsActions": {
"message": "Ações",
"description": ""
},
"editGotoLine": {
"message": "Ir para a linha (ou line:col)",
"description": "Go to line or line:column on Ctrl-G in style code editor"
},
"manageOnlyLocalTooltip": {
"message": "(os estilos não instalados através de uma página userstyles.org)",
"description": "Tooltip for the checkbox to show only locally created styles i.e. non-updatable"
},
"checkAllUpdates": {
"message": "Verificar todos os estilos por atualizações",
"description": "Label for the button to check all styles for updates"
},
"openOptionsManage": {
"message": "Opções de interface",
"description": "Go to Options UI"
},
"importReportLegendIdentical": {
"message": "idênticos ignorados",
"description": "Text after the number of styles skipped due to being identical to the already installed ones in the report shown after importing styles"
},
"optionsPopupWidth": {
"message": "Popup largura (em pixeis)",
"description": ""
},
"confirmNo": {
"message": "Não",
"description": "'No' button in a confirm dialog"
},
"undo": {
"message": "Desfazer",
"description": "Button label"
},
"cm_keyMap": {
"message": "Mapa de teclado",
"description": "Label for the drop-down list controlling the keymap for the style editor."
},
"manageNewUI": {
"message": "Nova gestão de layout de interface",
"description": "Label for the checkbox that toggles the new UI on manage page"
},
"importReportUndoneTitle": {
"message": "Importação foi desfeita",
"description": "Title of the message box shown after undoing the import of styles"
},
"genericDisabledLabel": {
"message": "Desativado",
"description": "Used in various lists/options to indicate that something is disabled"
},
"cm_indentWithTabs": {
"message": "Usar tabs com indentação inteligente",
"description": "Label for the checkbox controlling tabs with smart indentation option for the style editor."
},
"replaceWith": {
"message": "Substituir com",
"description": "Label before the replace-with input field in the editor shown on Ctrl-H etc."
},
"deleteStyleLabel": {
"message": "Apagar",
"description": "Label for the button to delete a style"
},
"updateCheckManualUpdateForce": {
"message": "Instalar atualização (edições locais vão ser substituídas)",
"description": "Additional text displayed when an update check skipped updating the style to avoid losing local modifications"
},
"optionsAdvancedExposeIframes": {
"message": "Export iframes via HTML[stylus-iframe]",
"description": ""
},
"addStyleLabel": {
"message": "Escrever um novo estilo",
"description": "Label for the button to go to the add style page"
},
"optionsUpdateIntervalNote": {
"message": "Para desativar a verificação automática de atualizações de estilos do utilizador [userstyle], estabelce o intervalo a 0",
"description": ""
},
"backupButtons": {
"message": "Cópia de segurança",
"description": "Heading for backup"
},
"manageOnlyEnabled": {
"message": "Apenas estilos ativados",
"description": "Checkbox to show only enabled styles"
},
"editStyleLabel": {
"message": "Editar",
"description": "Label for the button to go to the edit style page"
},
"cm_theme": {
"message": "Tema",
"description": "Label for the style editor's CSS theme."
},
"backupMessage": {
"message": "Seleciona um ficheiro ou arrasta e solta-o nesta página.",
"description": "Message for backup"
},
"importReportUndone": {
"message": "Os estilos foram revertidos",
"description": "Text after the number of styles reverted in the message box shown after undoing the import of styles"
},
"helpKeyMapCommand": {
"message": "Escreve um nome de comando",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"description": {
"message": "Redesenha a web com o Stylus, um gerenciador dos estilos do utilizador [user styles]. O Stylus permite-te instalar facilmente temas e skins em muitos sites populares.",
"description": "Extension description"
}
}

View File

@ -3,6 +3,10 @@
"message": "Все",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "Проблемы",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "по-умолчанию",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "Экспорт",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Проблемы",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "Ошибка формата JSON",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "Цвет фона",
@ -143,6 +147,10 @@
"message": "Включено",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "Настроить проверку CSS",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Формат кода Mozilla можно отправлять на сайт userstyles.org и использовать в дополнении Stylish для Firefox.",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -159,6 +167,10 @@
"message": "Сохранить",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "Сохранено",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "Удалить",
"description": ""
@ -224,6 +236,15 @@
"message": "Только локально созданные стили",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "Проблемы, найденные правилами $link$:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "Искать по содержимому",
"description": "Label for the search filter textbox on the Manage styles page"
@ -338,6 +359,10 @@
}
}
},
"dysfunctional": {
"message": "Стилус не работает в приватном окне, т.к. браузер Firefox не разрешает прямое соединение с внутренним контекстом фоновой страницы расширения.",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "Разделы",
"description": "Title for the style sections section"
@ -346,6 +371,10 @@
"message": "некорректных пропущено",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "Сброс",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "Изменение стиля \"$stylename$\"",
"description": "Title of the page for editing styles",
@ -464,6 +493,18 @@
"message": "Найти и установить обновления стилей",
"description": ""
},
"filteredStyles": {
"message": "найдено $numShown$ из $numTotal$всего",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "Импорт стилей завершен",
"description": "Title of the report shown after importing styles"
@ -480,6 +521,10 @@
"message": "В стиле используются regexp-выражения, которые соответствуют лишь части адреса, что нарушает <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>спецификацию CSS4 @document</a>, требующую соответствия всего адреса целиком. Секции стиля с такими regexp не были применены к странице. Вероятно, этот стиль был создан в \"Stylish для Chrome\", который некорректно проверяет regexp (известный баг).",
"description": ""
},
"linterCSSLintSettings": {
"message": "(значения: 0 = выключить, 1 = предупреждение; 2 = ошибка)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "Отступ внутри @media, @supports",
"description": "CSS-beautifier option"
@ -492,6 +537,10 @@
"message": "Удалить раздел",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "Префикс url: покажет стили для сайта.\nНапример, url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "Выключить все стили",
"description": "Label for the checkbox that turns all enabled styles off."
@ -512,6 +561,10 @@
"message": "Обновление завершено.",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "Функционирование невозможно из-за известной ошибки в вашей версии браузера: chrome.extension.getBackgroundPage() возвращает нулевое значение",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "Проверка…",
"description": "Text to display when checking a style for an update"
@ -524,6 +577,10 @@
"message": "Кол-во целевых сайтов/выражений",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift-клик или правый клик откроет менеджер с стилями только для этого сайта.",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Используется сторонний сервис https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -532,6 +589,10 @@
"message": "Стиль был изменен локально.",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "Открыть полный список правил",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "Сброс настроек",
"description": ""
@ -544,6 +605,15 @@
"message": "Показывать команду \"Удалить\" в контекстном меню редактора",
"description": ""
},
"linterConfigPopupTitle": {
"message": "Установить конфиграцию правил $linter$",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "обновлены мета-данные и код",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -572,6 +642,10 @@
"message": "Подсказки при наборе кода",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "Только неактивные стили",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "В целях обеспечения безопасности браузер запрещает расширениям изменять встроенные страницы (например, chrome://version, стандартная страница новой вкладки начиная с Chrome 61, about:addons и т.д.), страницы других расширений и \"магазин\" расширений (Chrome Web Store в chromium-браузерах, AMO в Firefox и т.д.)",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -600,6 +674,10 @@
"message": "Заменить стиль",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "Также включается вытаскиванием вкладки из окна браузера\nи выключается перетаскиванием вкладки в другое окно браузера.",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "Возникла ошибка доступа к базе данных Stylus. Хотите перейти на страницу с возможными способами решения?",
"description": "Prompt when a DB error is encountered"
@ -624,10 +702,18 @@
"message": "Нажмите клавишу",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"cm_linter": {
"message": "Проверка CSS",
"description": "Select the linter to check for CSS issues"
},
"styleRegexpTestInvalid": {
"message": "Пропущены некомпилируемые регулярки",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "Только сторонние стили",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "Заменить все",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -656,15 +742,6 @@
"message": "Настройки",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "Проблемы и предупреждения по версии $link$ с данными включенными правилами:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "Бейдж на пиктограмме в тулбаре",
"description": ""
@ -677,6 +754,10 @@
"message": "Ширина всплывающего окна (в пикселах)",
"description": ""
},
"linterInvalidConfigError": {
"message": "Не сохранено из-за неправильных настроек ниже:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "Нет",
"description": "'No' button in a confirm dialog"
@ -745,6 +826,10 @@
"message": "Тема",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "Открывать редактор в новом окне",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "Нажмите Импорт чтобы выбрать файл или просто перетащите его на эту страницу",
"description": "Message for backup"
@ -757,6 +842,10 @@
"message": "Введите имя команды",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "Для отмены случайного сброса нажмите Ctrl-Z (или Cmd-Z) в окне ввода",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "Настраивайте стили веб-сайтов с помощью менеджера стилей Stylus. Он позволяет легко установить темы и изменить внешний вид сайтов Google, Facebook, YouTube, Orkut и множества других веб-страниц.",
"description": "Extension description"

View File

@ -11,10 +11,6 @@
"message": "Извези",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "Проблеми",
"description": "Label for the CSS linter issues block on the style edit page"
},
"cm_tabSize": {
"message": "Величина картице",
"description": "Label for the text box controlling tab size option for the style editor."
@ -356,15 +352,6 @@
"message": "Проверите ажурирања за све стилове",
"description": "Label for the button to check all styles for updates"
},
"linterIssuesHelp": {
"message": "Проблем пронађен од стране $link$ са овим омогућеним правилима:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"confirmNo": {
"message": "Не",
"description": "'No' button in a confirm dialog"

View File

@ -27,10 +27,6 @@
"message": "导出",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "问题",
"description": "Label for the CSS linter issues block on the style edit page"
},
"optionsBadgeNormal": {
"message": "背景颜色",
"description": ""
@ -572,6 +568,10 @@
"message": "输入时自动完成",
"description": "Label for the checkbox in the style editor."
},
"stylusUnavailableForURLdetails": {
"message": "出于安全原因,浏览器禁止扩展影响内置页面(例如 chrome://version 或 about:addons以及其他扩展的页面。各浏览器同时也限制介入自己的扩展网站如 Chrome 网上应用店、Firefox 附加组件)。",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
},
"cm_matchHighlightSelection": {
"message": "选择区域",
"description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of currently selected text"
@ -581,7 +581,7 @@
"description": "Option to make the style apply to the entered string as a URL"
},
"updateAllCheckSucceededSomeEdited": {
"message": "如果你修改过一些样式,那它们可能被忽略更新,你可以单独检测这些样式强制升级,也可以 再次检测所有样式强制更新。",
"message": "如果你修改过一些样式,那它们可能被忽略更新,你可以单独检测这些样式强制升级,也可以 再次检测所有样式强制更新。",
"description": "Text that displays when an update all check completed and no updates are available"
},
"stylusUnavailableForURL": {
@ -656,15 +656,6 @@
"message": "设置用户界面",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "$link$ 在已启用的这些规则中找到问题:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "样式计数器",
"description": ""

View File

@ -3,6 +3,10 @@
"message": "全部",
"description": "Text displayed for styles that apply to all sites"
},
"linterIssues": {
"message": "問題",
"description": "Label for the CSS linter issues block on the style edit page"
},
"defaultTheme": {
"message": "默認",
"description": "Default CodeMirror CSS theme option on the edit style page"
@ -27,9 +31,9 @@
"message": "導出",
"description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)"
},
"linterIssues": {
"message": "問題",
"description": "Label for the CSS linter issues block on the style edit page"
"linterJSONError": {
"message": "無效的 JSON 格式",
"description": "Setting linter config with invalid JSON"
},
"optionsBadgeNormal": {
"message": "背景顏色",
@ -143,6 +147,10 @@
"message": "已啟用",
"description": "Label for the enabled state of styles"
},
"linterConfigTooltip": {
"message": "點選以設定此 linter",
"description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration"
},
"styleToMozillaFormatHelp": {
"message": "Mozilla格式的樣式代碼能在火狐版Stylus使用也可以提交至 userstyles.org 。",
"description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format"
@ -159,6 +167,10 @@
"message": "保存",
"description": "Label for save button for style editing"
},
"genericSavedMessage": {
"message": "已儲存",
"description": "Used in various parts of the UI to indicate that something was saved"
},
"confirmDelete": {
"message": "刪除",
"description": ""
@ -224,6 +236,15 @@
"message": "僅本機建立的樣式",
"description": "Checkbox to show only locally created styles i.e. non-updatable"
},
"linterIssuesHelp": {
"message": "這些問題被 $link$ 找到了:",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"searchStyles": {
"message": "搜索內容",
"description": "Label for the search filter textbox on the Manage styles page"
@ -338,6 +359,10 @@
}
}
},
"dysfunctional": {
"message": "Stylus 無法在隱私視窗中運作,因為 Firefox 不允許直接連線到附加元件的內部背景頁面內容。",
"description": "Displayed in Firefox when its settings make Stylus dysfunctional"
},
"styleSectionsTitle": {
"message": "樣式段",
"description": "Title for the style sections section"
@ -346,6 +371,10 @@
"message": "已跳過無效的",
"description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles"
},
"genericResetLabel": {
"message": "重設",
"description": "Used in various parts of UI to indicate that something may be reset to its original state"
},
"editStyleTitle": {
"message": "編輯樣式 $stylename$",
"description": "Title of the page for editing styles",
@ -464,6 +493,18 @@
"message": "檢查並安裝所有可用的更新",
"description": ""
},
"filteredStyles": {
"message": "$numShown$ 個已顯示,總共 $numTotal$ 個",
"description": "TL note - make this message short",
"placeholders": {
"numTotal": {
"content": "$2"
},
"numShown": {
"content": "$1"
}
}
},
"importReportTitle": {
"message": "匯入樣式已完成",
"description": "Title of the report shown after importing styles"
@ -480,6 +521,10 @@
"message": "這個樣式使用部份符合的正規表達式,違反了 <a href='https://developer.mozilla.org/docs/Web/CSS/@document'>CSS4 @document 規範</a>,其需要完整的 URL 符合。授影響的 CSS 不會討用在頁面上。這個樣式由 Chrome 板 Stylish 所建立,其在早期版本不正確地檢查 'regexp()' 規則(已知的臭蟲)。",
"description": ""
},
"linterCSSLintSettings": {
"message": "設定規則為0 = 停用1 = 警告2 = 錯誤)",
"description": "CSSLint rule config values"
},
"styleBeautifyIndentConditional": {
"message": "縮排 @media, @supports",
"description": "CSS-beautifier option"
@ -492,6 +537,10 @@
"message": "移除樣式段",
"description": "Label for the button to remove a section"
},
"searchStylesTooltip": {
"message": "要顯示 URL 的樣式,以 'url:' 做為其前綴:\n舉例來說url:https://github.com/openstyles/stylus",
"description": "Label for the search filter textbox on the Manage styles page"
},
"disableAllStyles": {
"message": "禁用所有樣式",
"description": "Label for the checkbox that turns all enabled styles off."
@ -512,6 +561,10 @@
"message": "更新完成。",
"description": "Text that displays when an update completed"
},
"dysfunctionalBackgroundConnection": {
"message": "由於此版本的 Firefox 中有已知的臭蟲所以無法正常運作chrome.extension.getBackgroundPage() 並未傳回有效的結果",
"description": "Displayed in style manager when unable to connect to the background page"
},
"checkingForUpdate": {
"message": "檢查中…",
"description": "Text to display when checking a style for an update"
@ -524,6 +577,10 @@
"message": "已套用項目的數量",
"description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page"
},
"popupManageTooltip": {
"message": "Shift + 點選或右鍵 + 點選以在管理員中開啟目前頁面可用的樣式",
"description": "Tooltip for the 'Manage' button in the popup."
},
"manageFaviconsHelp": {
"message": "Stylus 使用外部服務 https://www.google.com/s2/favicons",
"description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page"
@ -532,6 +589,10 @@
"message": "這個樣式已在本機編輯。",
"description": "Text that displays when an update check skipped updating the style to avoid losing local modifications"
},
"linterRulesLink": {
"message": "見完整的規則清單",
"description": "Stylelint or CSSLint rules label added immediately before a link"
},
"optionsResetButton": {
"message": "重設選項",
"description": ""
@ -544,6 +605,15 @@
"message": "在編輯器的右鍵選單中加入「刪除」",
"description": ""
},
"linterConfigPopupTitle": {
"message": "設定 $linter$ 規則設定",
"description": "Stylelint or CSSLint popup header",
"placeholders": {
"linter": {
"content": "$1"
}
}
},
"importReportLegendUpdatedBoth": {
"message": "後設資訊與程式碼均已更新",
"description": "Text after the number of styles updated entirely in the report shown after importing styles"
@ -572,6 +642,10 @@
"message": "在輸入時自動完成",
"description": "Label for the checkbox in the style editor."
},
"manageOnlyDisabled": {
"message": "僅已停用的樣式",
"description": "Checkbox to show only disabled styles"
},
"stylusUnavailableForURLdetails": {
"message": "作為安全措施,瀏覽器禁止擴充套件影響其內建頁面(如 chrome://version、截至 Chrome 61 為止的新分頁、about:addons 以及其他頁面)以及其他擴充套件的頁面。每個瀏覽器也都限制對它們自己的擴充套件庫的存取(如 Chrome 線上應用程式商店或是 Firefox 附加元件庫等)。",
"description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect"
@ -604,6 +678,10 @@
"message": "覆蓋樣式",
"description": "Label for the button to import and overwrite current style"
},
"popupOpenEditInWindowTooltip": {
"message": "也透過從瀏覽器視窗分離編輯器分頁來啟用,\n並透過將單獨的編輯器分頁附加到其他視窗中來停用。",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"dbError": {
"message": "使用 Stylus 資料庫時出現錯誤。你想訪問可能包含解決辦法的網頁嗎?",
"description": "Prompt when a DB error is encountered"
@ -632,6 +710,10 @@
"message": "已跳過無效的正規表達式",
"description": "RegExp test report: label for the invalid expressions"
},
"manageOnlyExternal": {
"message": "僅外部樣式",
"description": "Checkbox to show only externally installed styles i.e. updatable"
},
"replaceAll": {
"message": "替換所有",
"description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey"
@ -660,15 +742,6 @@
"message": "選項介面",
"description": "Go to Options UI"
},
"linterIssuesHelp": {
"message": "由$link$發現啟用這些規則會產生衝突",
"description": "Help popup message for the selected CSS linter issues block on the style edit page",
"placeholders": {
"link": {
"content": "$1"
}
}
},
"optionsCustomizeBadge": {
"message": "在工具列圖示上的徽章",
"description": ""
@ -681,6 +754,10 @@
"message": "彈出視窗寬度(以像素計)",
"description": ""
},
"linterInvalidConfigError": {
"message": "因為無效的設定所以未儲存:",
"description": "Invalid linter config will show a message followed by a list of invalid entries"
},
"confirmNo": {
"message": "否",
"description": "'No' button in a confirm dialog"
@ -749,6 +826,10 @@
"message": "主題",
"description": "Label for the style editor's CSS theme."
},
"popupOpenEditInWindow": {
"message": "在新視窗開啟編輯器",
"description": "Label for the checkbox controlling 'edit' action behavior in the popup."
},
"backupMessage": {
"message": "選取檔案並拖曳到此頁面。",
"description": "Message for backup"
@ -761,6 +842,10 @@
"message": "鍵入命令名稱",
"description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short"
},
"linterResetMessage": {
"message": "要復原意外的重設,在文字方塊按下 Ctrl-Z或 Cmd-Z",
"description": "Reset button tooltip to inform user on how to undo an accidental reset"
},
"description": {
"message": "用Stylus一個用戶樣式管理器重塑網頁。 Stylus 讓你能為诸多主流網站輕鬆的安裝主題和皮膚。",
"description": "Extension description"

View File

@ -1,13 +1,11 @@
/* global dbExec, getStyles, saveStyle, filterUsercss, saveUsercss */
/* global dbExec, getStyles, saveStyle */
/* global handleCssTransitionBug */
/* global filterUsercss, saveUsercss */
'use strict';
// eslint-disable-next-line no-var
var browserCommands, contextMenus;
// *************************************************************************
// preload the DB
tryCatch(getStyles);
// *************************************************************************
// register all listeners
chrome.runtime.onMessage.addListener(onRuntimeMessage);
@ -41,8 +39,7 @@ if ('commands' in chrome) {
// *************************************************************************
// set the default icon displayed after a tab is created until webNavigation kicks in
prefs.subscribe(() => updateIcon({id: undefined}, {}), ['iconset']);
updateIcon({id: undefined}, {});
prefs.subscribe(['iconset'], () => updateIcon({id: undefined}, {}));
// *************************************************************************
{
@ -62,24 +59,6 @@ updateIcon({id: undefined}, {});
browserUIlanguage: chrome.i18n.getUILanguage(),
});
}
// TODO: remove in the future
// embed style digests
chrome.storage.local.get(null, data => {
const digestKeys = Object.keys(data).filter(key => key.startsWith('originalDigest'));
if (!digestKeys.length) {
return;
}
chrome.storage.local.remove(digestKeys);
getStyles().then(styles => {
for (const style of styles) {
const digest = data['originalDigest' + style.id];
if (!style.originalDigest && digest) {
style.originalDigest = digest;
dbExec('put', style);
}
}
});
});
};
// bind for 60 seconds max and auto-unbind if it's a normal run
chrome.runtime.onInstalled.addListener(onInstall);
@ -142,7 +121,9 @@ contextMenus = Object.assign({
}
};
createContextMenus();
prefs.subscribe((id, checked) => {
const toggleableIds = Object.keys(contextMenus).filter(key =>
typeof prefs.readOnlyValues[key] === 'boolean');
prefs.subscribe(toggleableIds, (id, checked) => {
if (id === 'editor.contextDelete') {
if (checked) {
createContextMenus([id]);
@ -152,12 +133,16 @@ contextMenus = Object.assign({
} else {
chrome.contextMenus.update(id, {checked}, ignoreChromeError);
}
}, Object.keys(contextMenus).filter(key => typeof prefs.readOnlyValues[key] === 'boolean'));
});
}
// *************************************************************************
// [re]inject content scripts
{
window.addEventListener('storageReady', function _() {
window.removeEventListener('storageReady', _);
updateIcon({id: undefined}, {});
const NTP = 'chrome://newtab/';
const PING = {method: 'ping'};
const ALL_URLS = '<all_urls>';
@ -204,14 +189,16 @@ contextMenus = Object.assign({
setTimeout(pingCS, 0, cs, tab));
}
}));
}
});
// *************************************************************************
function webNavigationListener(method, {url, tabId, frameId}) {
getStyles({matchUrl: url, enabled: true, asHash: true}).then(styles => {
if (method && !url.startsWith('chrome:') && tabId >= 0) {
if (method && URLS.supported(url) && tabId >= 0) {
if (method === 'styleApply') {
handleCssTransitionBug({tabId, frameId, url, styles});
}
chrome.tabs.sendMessage(tabId, {
method,
// ping own page so it retrieves the styles directly
@ -306,13 +293,7 @@ function updateIcon(tab, styles) {
function onRuntimeMessage(request, sender, sendResponse) {
// prevent browser exception bug on sending a response to a closed tab
sendResponse = (sendResponseOriginal =>
data => {
try {
sendResponseOriginal(data);
} catch (e) {}
}
)(sendResponse);
sendResponse = (send => data => tryCatch(send, data))(sendResponse);
switch (request.method) {
case 'getStyles':
getStyles(request).then(sendResponse);

View File

@ -10,6 +10,11 @@ const RX_CSS_COMMENTS = /\/\*[\s\S]*?\*\//g;
// eslint-disable-next-line no-var
var SLOPPY_REGEXP_PREFIX = '\0';
// CSS transition bug workaround: since we insert styles asynchronously,
// the browsers, especially Firefox, may apply all transitions on page load
const CSS_TRANSITION_SUPPRESSOR = '* { transition: none !important; }';
const RX_CSS_TRANSITION_DETECTOR = /([\s\n;/{]|-webkit-|-moz-)transition[\s\n]*:[\s\n]*(?!none)/;
// Note, only 'var'-declared variables are visible from another extension page
// eslint-disable-next-line no-var
var cachedStyles = {
@ -18,6 +23,7 @@ var cachedStyles = {
filters: new Map(), // filterStyles() parameters mapped to the returned results, 10k max
regexps: new Map(), // compiled style regexps
urlDomains: new Map(), // getDomain() results for 100 last checked urls
needTransitionPatch: new Map(), // FF bug workaround
mutex: {
inProgress: false, // while getStyles() is reading IndexedDB all subsequent calls
onDone: [], // to getStyles() are queued and resolved when the first one finishes
@ -36,6 +42,11 @@ var chromeLocal = {
chrome.storage.local.set(data, () => resolve(data));
});
},
remove(keyOrKeys) {
return new Promise(resolve => {
chrome.storage.local.remove(keyOrKeys, resolve);
});
},
getValue(key) {
return chromeLocal.get(key).then(data => data[key]);
},
@ -73,8 +84,65 @@ var chromeSync = {
}
};
// eslint-disable-next-line no-var
var dbExec = dbExecIndexedDB;
dbExec.initialized = false;
function dbExec(method, data) {
// we use chrome.storage.local fallback if IndexedDB doesn't save data,
// which, once detected on the first run, is remembered in chrome.storage.local
// for reliablility and in localStorage for fast synchronous access
// (FF may block localStorage depending on its privacy options)
do {
const done = () => {
getStyles().then(() => {
dbExec.initialized = true;
window.dispatchEvent(new Event('storageReady'));
});
};
const fallback = () => {
dbExec = dbExecChromeStorage;
chromeLocal.set({dbInChromeStorage: true});
localStorage.dbInChromeStorage = 'true';
ignoreChromeError();
done();
};
const fallbackSet = localStorage.dbInChromeStorage;
if (fallbackSet === 'true' || !tryCatch(() => indexedDB)) {
fallback();
break;
} else if (fallbackSet === 'false') {
done();
break;
}
chromeLocal.get('dbInChromeStorage')
.then(data =>
data && data.dbInChromeStorage && Promise.reject())
.then(() => dbExecIndexedDB('getAllKeys', IDBKeyRange.lowerBound(1), 1))
.then(({target}) => (
(target.result || [])[0] ?
Promise.reject('ok') :
dbExecIndexedDB('put', {id: -1})))
.then(() =>
dbExecIndexedDB('get', -1))
.then(({target}) => (
(target.result || {}).id === -1 ?
dbExecIndexedDB('delete', -1) :
Promise.reject()))
.then(() =>
Promise.reject('ok'))
.catch(result => {
if (result === 'ok') {
chromeLocal.set({dbInChromeStorage: false});
localStorage.dbInChromeStorage = 'false';
done();
} else {
fallback();
}
});
} while (0);
function dbExecIndexedDB(method, ...args) {
return new Promise((resolve, reject) => {
Object.assign(indexedDB.open('stylish', 2), {
onsuccess(event) {
@ -84,7 +152,7 @@ function dbExec(method, data) {
} else {
const transaction = database.transaction(['styles'], 'readwrite');
const store = transaction.objectStore('styles');
Object.assign(store[method](data), {
Object.assign(store[method](...args), {
onsuccess: event => resolve(event, store, transaction, database),
onerror: reject,
});
@ -107,6 +175,45 @@ function dbExec(method, data) {
}
function dbExecChromeStorage(method, data) {
const STYLE_KEY_PREFIX = 'style-';
switch (method) {
case 'get':
return chromeLocal.getValue(STYLE_KEY_PREFIX + data)
.then(result => ({target: {result}}));
case 'put':
if (!data.id) {
return getStyles().then(() => {
data.id = 1;
for (const style of cachedStyles.list) {
data.id = Math.max(data.id, style.id + 1);
}
return dbExecChromeStorage('put', data);
});
}
return chromeLocal.setValue(STYLE_KEY_PREFIX + data.id, data)
.then(() => (chrome.runtime.lastError ? Promise.reject() : data.id));
case 'delete':
return chromeLocal.remove(STYLE_KEY_PREFIX + data);
case 'getAll':
return chromeLocal.get(null).then(storage => {
const styles = [];
for (const key in storage) {
if (key.startsWith(STYLE_KEY_PREFIX) &&
Number(key.substr(STYLE_KEY_PREFIX.length))) {
styles.push(storage[key]);
}
}
return {target: {result: styles}};
});
}
return Promise.reject();
}
function getStyles(options) {
if (cachedStyles.list) {
return Promise.resolve(filterStyles(options));
@ -156,15 +263,16 @@ function filterStyles({
) {
return cachedStyles.list;
}
const blankHash = asHash && {
disableAll: prefs.get('disableAll'),
exposeIframes: prefs.get('exposeIframes'),
};
if (matchUrl && !URLS.supported(matchUrl)) {
return asHash ? {} : [];
}
const blankHash = asHash && {
disableAll: prefs.get('disableAll'),
exposeIframes: prefs.get('exposeIframes'),
};
// add \t after url to prevent collisions (not sure it can actually happen though)
const cacheKey = ' ' + enabled + url + '\t' + id + matchUrl + '\t' + asHash + strictRegexp;
const cached = cachedStyles.filters.get(cacheKey);
@ -212,13 +320,12 @@ function filterStylesInternal({
const styles = id === null
? cachedStyles.list
: [cachedStyles.byId.get(id)];
const filtered = asHash ? {} : [];
if (!styles) {
if (!styles[0]) {
// may happen when users [accidentally] reopen an old URL
// of edit.html with a non-existent style id parameter
return filtered;
return asHash ? blankHash : [];
}
const filtered = asHash ? {} : [];
const needSections = asHash || matchUrl !== null;
const matchUrlBase = matchUrl && matchUrl.includes('#') && matchUrl.split('#', 1)[0];
@ -255,6 +362,7 @@ function filterStylesInternal({
cleanupCachedFilters();
}
// a shallow copy is needed because the cache doesn't store options like disableAll
return asHash
? Object.assign(blankHash, filtered)
: filtered;
@ -604,6 +712,7 @@ function invalidateCache({added, updated, deletedId} = {}) {
if (cached) {
Object.assign(cached, updated);
cachedStyles.filters.clear();
cachedStyles.needTransitionPatch.delete(id);
return;
} else {
added = updated;
@ -614,6 +723,7 @@ function invalidateCache({added, updated, deletedId} = {}) {
cachedStyles.list.push(added);
cachedStyles.byId.set(added.id, added);
cachedStyles.filters.clear();
cachedStyles.needTransitionPatch.delete(id);
}
return;
}
@ -623,11 +733,13 @@ function invalidateCache({added, updated, deletedId} = {}) {
cachedStyles.list.splice(cachedIndex, 1);
cachedStyles.byId.delete(deletedId);
cachedStyles.filters.clear();
cachedStyles.needTransitionPatch.delete(id);
return;
}
}
cachedStyles.list = null;
cachedStyles.filters.clear();
cachedStyles.needTransitionPatch.clear(id);
}
@ -699,3 +811,78 @@ function calcStyleDigest(style) {
return parts.join('');
}
}
function handleCssTransitionBug({tabId, frameId, url, styles}) {
for (let id in styles) {
id |= 0;
if (!id) {
continue;
}
let need = cachedStyles.needTransitionPatch.get(id);
if (need === false) {
continue;
}
if (need !== true) {
need = styles[id].some(sectionContainsTransitions);
cachedStyles.needTransitionPatch.set(id, need);
if (!need) {
continue;
}
}
if (FIREFOX && !url.startsWith(URLS.ownOrigin)) {
patchFirefox();
} else {
styles.needTransitionPatch = true;
}
break;
}
function patchFirefox() {
browser.tabs.insertCSS(tabId, {
frameId,
code: CSS_TRANSITION_SUPPRESSOR,
cssOrigin: 'user',
runAt: 'document_start',
matchAboutBlank: true,
}).then(() => setTimeout(() => {
browser.tabs.removeCSS(tabId, {
frameId,
code: CSS_TRANSITION_SUPPRESSOR,
cssOrigin: 'user',
matchAboutBlank: true,
}).catch(ignoreChromeError);
})).catch(ignoreChromeError);
}
function sectionContainsTransitions(section) {
let code = section.code;
const firstTransition = code.indexOf('transition');
if (firstTransition < 0) {
return false;
}
const firstCmt = code.indexOf('/*');
// check the part before the first comment
if (firstCmt < 0 || firstTransition < firstCmt) {
if (quickCheckAround(code, firstTransition)) {
return true;
} else if (firstCmt < 0) {
return false;
}
}
// check the rest
const lastCmt = code.lastIndexOf('*/');
if (lastCmt < firstCmt) {
// the comment is unclosed and we already checked the preceding part
return false;
}
let mid = code.slice(firstCmt, lastCmt + 2);
mid = mid.indexOf('*/') === mid.length - 2 ? '' : mid.replace(RX_CSS_COMMENTS, '');
code = mid + code.slice(lastCmt + 2);
return quickCheckAround(code) || RX_CSS_TRANSITION_DETECTOR.test(code);
}
function quickCheckAround(code, pos = code.indexOf('transition')) {
return RX_CSS_TRANSITION_DETECTOR.test(code.substr(Math.max(0, pos - 10), 50));
}
}

View File

@ -193,4 +193,4 @@ var updater = {
};
updater.schedule();
prefs.subscribe(updater.schedule, ['updateInterval']);
prefs.subscribe(['updateInterval'], updater.schedule);

View File

@ -199,8 +199,25 @@ function applyStyles(styles) {
// which is already autogenerated at this moment
ROOT = document.head;
}
if (styles.needTransitionPatch) {
// CSS transition bug workaround: since we insert styles asynchronously,
// the browsers, especially Firefox, may apply all transitions on page load
delete styles.needTransitionPatch;
const className = chrome.runtime.id + '-transition-bug-fix';
const docId = document.documentElement.id ? '#' + document.documentElement.id : '';
document.documentElement.classList.add(className);
applySections(0, `
${docId}.${className}:root * {
transition: none !important;
}
`);
setTimeout(() => {
removeStyle({id: 0});
document.documentElement.classList.remove(className);
});
}
for (const id in styles) {
applySections(id, styles[id]);
applySections(id, styles[id].map(section => section.code).join('\n'));
}
initDocRewriteObserver();
initDocRootObserver();
@ -215,7 +232,7 @@ function applyStyles(styles) {
}
function applySections(styleId, sections) {
function applySections(styleId, code) {
let el = document.getElementById(ID_PREFIX + styleId);
if (el) {
return;
@ -234,11 +251,12 @@ function applySections(styleId, sections) {
id: ID_PREFIX + styleId,
className: 'stylus',
type: 'text/css',
textContent: sections.map(section => section.code).join('\n'),
textContent: code,
});
addStyleElement(el);
styleElements.set(el.id, el);
disabledElements.delete(Number(styleId));
return el;
}

View File

@ -2,6 +2,17 @@
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<style id="firefox-transitions-bug-suppressor">
/* restrict to FF */
@-moz-document url-prefix("") {
/* increased specificity to override sane selectors in user styles */
html#stylus.firefox #stylus-edit #header *,
html#stylus.firefox #stylus-edit #sections * {
transition: none !important;
}
}
</style>
<script src="js/dom.js"></script>
<script src="js/messaging.js"></script>
<script src="js/prefs.js"></script>
@ -150,8 +161,8 @@
<button id="to-mozilla" i18n-text="exportLabel"></button>
</div>
</section>
<section id="options">
<h2 id="options-heading" i18n-text="optionsHeading"></h2>
<details id="options">
<summary><h2 id="options-heading" i18n-text="optionsHeading"></h2></summary>
<div class="option">
<input id="editor.lineWrapping" type="checkbox">
<label id="lineWrapping-label" for="editor.lineWrapping" i18n-text="cm_lineWrapping"></label>
@ -201,7 +212,8 @@
<use xlink:href="#svg-icon-settings"/>
</svg>&nbsp;
</span>
</section>
</div>
</details>
<section id="lint"><h2 i18n-text="linterIssues">: <span id="issue-count"></span><svg id="lint-help" class="svg-icon info"><use xlink:href="#svg-icon-help"/></svg></h2><div></div></section>
</div>
<section id="sections">

View File

@ -2,6 +2,23 @@ body {
margin: 0;
font: 12px arial,sans-serif;
}
#global-progress {
position: fixed;
height: 4px;
top: 0;
left: 0;
right: 0;
background-color: hsla(180, 66%, 36%, .25);
border-left: 0 solid darkcyan;
z-index: 2147483647;
opacity: 0;
transition: opacity 2s;
}
#global-progress[title] {
opacity: 1;
}
/************ header ************/
#header {
width: 280px;
@ -101,6 +118,15 @@ h2 .svg-icon, label .svg-icon {
margin-bottom: 0.5rem;
}
/* options */
#options summary {
align-items: center;
margin-left: -13px;
cursor: pointer;
outline: none;
}
#options summary h2 {
display: inline-block;
}
#options [type="number"] {
max-width: 2.5rem;
text-align: right;
@ -129,6 +155,12 @@ h2 .svg-icon, label .svg-icon {
#sections {
counter-reset: codebox;
}
#sections > div > label {
animation: 2s highlight;
animation-play-state: paused;
animation-direction: reverse;
animation-fill-mode: both;
}
#sections > div > label::after {
counter-increment: codebox;
content: counter(codebox);
@ -555,6 +587,9 @@ body[data-match-highlight="selection"] .CodeMirror-selection-highlight-scrollbar
-moz-column-count: 2;
column-count: 2;
}
#options h2 {
margin: 0 0 .5em;
}
#options .aligned > *:not(svg) {
margin: 1px 0 0 0; /* workaround the flowing-padding column bug in webkit */
padding-right: 0.4rem;

View File

@ -158,7 +158,7 @@ function setCleanSection(section) {
const cm = section.CodeMirror;
if (cm) {
section.savedValue = cm.changeGeneration();
indicateCodeChange(cm);
updateTitle();
}
}
@ -200,8 +200,8 @@ function initCodeMirror() {
// additional commands
CM.commands.jumpToLine = jumpToLine;
CM.commands.nextEditor = cm => { nextPrevEditor(cm, 1); };
CM.commands.prevEditor = cm => { nextPrevEditor(cm, -1); };
CM.commands.nextEditor = cm => nextPrevEditor(cm, 1);
CM.commands.prevEditor = cm => nextPrevEditor(cm, -1);
CM.commands.save = save;
CM.commands.blockComment = cm => {
cm.blockComment(cm.getCursor('from'), cm.getCursor('to'), {fullLines: false});
@ -384,10 +384,11 @@ function setupCodeMirror(textarea, index) {
const cm = CodeMirror.fromTextArea(textarea, {lint: null});
const wrapper = cm.display.wrapper;
cm.on('change', indicateCodeChange);
cm.on('changes', indicateCodeChangeDebounced);
if (prefs.get('editor.autocompleteOnTyping')) {
setupAutocomplete(cm);
}
wrapper.addEventListener('keydown', event => nextPrevEditorOnKeydown(cm, event), true);
cm.on('blur', () => {
editors.lastActive = cm;
hotkeyRerouter.setState(true);
@ -472,6 +473,11 @@ function indicateCodeChange(cm) {
updateLintReportIfEnabled(cm);
}
function indicateCodeChangeDebounced(cm, ...args) {
clearTimeout(cm.state.stylusOnChangeTimer);
cm.state.stylusOnChangeTimer = setTimeout(indicateCodeChange, 200, cm, ...args);
}
function getSectionForChild(e) {
return e.closest('#sections > div');
}
@ -905,9 +911,9 @@ function setupGlobalSearch() {
let query;
let replacement;
activeCM = focusClosestCM(activeCM);
customizeOpenDialog(activeCM, template[all ? 'replaceAll' : 'replace'], txt => {
customizeOpenDialog(activeCM, template[all ? 'replaceAll' : 'replace'], function (txt) {
query = txt;
customizeOpenDialog(activeCM, template.replaceWith, txt => {
customizeOpenDialog(activeCM, template.replaceWith, function (txt) {
replacement = txt;
queue = editors.rotate(-editors.indexOf(activeCM));
if (all) {
@ -1035,7 +1041,7 @@ function setupAutocomplete(cm, enable = true) {
cm[onOff]('pick', autocompletePicked);
}
function autocompleteOnTyping(cm, info, debounced) {
function autocompleteOnTyping(cm, [info], debounced) {
if (
cm.state.completionActive ||
info.origin && !info.origin.includes('input') ||
@ -1048,7 +1054,7 @@ function autocompleteOnTyping(cm, info, debounced) {
return;
}
if (!debounced) {
debounce(autocompleteOnTyping, 100, cm, info, true);
debounce(autocompleteOnTyping, 100, cm, [info], true);
return;
}
if (info.text.last.match(/[-\w!]+$/)) {
@ -1082,6 +1088,55 @@ function nextPrevEditor(cm, direction) {
cm = editors[(editors.indexOf(cm) + direction + editors.length) % editors.length];
makeSectionVisible(cm);
cm.focus();
return cm;
}
function nextPrevEditorOnKeydown(cm, event) {
const key = event.which;
if (key < 37 || key > 40 || event.shiftKey || event.altKey || event.metaKey) {
return;
}
const {line, ch} = cm.getCursor();
switch (key) {
case 37:
// arrow Left
if (line || ch) {
return;
}
// fallthrough to arrow Up
case 38:
// arrow Up
if (line > 0 || cm === editors[0]) {
return;
}
event.preventDefault();
event.stopPropagation();
cm = nextPrevEditor(cm, -1);
cm.setCursor(cm.doc.size - 1, key === 37 ? 1e20 : ch);
break;
case 39:
// arrow Right
if (line < cm.doc.size - 1 || ch < cm.getLine(line).length - 1) {
return;
}
// fallthrough to arrow Down
case 40:
// arrow Down
if (line < cm.doc.size - 1 || cm === editors.last) {
return;
}
event.preventDefault();
event.stopPropagation();
cm = nextPrevEditor(cm, 1);
cm.setCursor(0, 0);
break;
}
const animation = (cm.getSection().firstElementChild.getAnimations() || [])[0];
if (animation) {
animation.playbackRate = -1;
animation.currentTime = 2000;
animation.play();
}
}
function getEditorInSight(nearbyElement) {
@ -1092,28 +1147,62 @@ function getEditorInSight(nearbyElement) {
} else {
cm = editors.lastActive;
}
if (!cm || offscreenDistance(cm) > 0) {
const sorted = $$('#sections .CodeMirror').map(e => e.CodeMirror)
.map((cm, index) => ({cm: cm, distance: offscreenDistance(cm), index: index}))
.sort((a, b) => a.distance - b.distance || a.index - b.index);
cm = sorted[0].cm;
if (sorted[0].distance > 0) {
// closest editor should have at least 2 lines visible
const lineHeight = editors[0].defaultTextHeight();
const scrollY = window.scrollY;
const windowBottom = scrollY + window.innerHeight - 2 * lineHeight;
const allSectionsContainerTop = scrollY + $('#sections').getBoundingClientRect().top;
const distances = [];
const alreadyInView = cm && offscreenDistance(null, cm) === 0;
return alreadyInView ? cm : findClosest();
function offscreenDistance(index, cm) {
if (index >= 0 && distances[index] !== undefined) {
return distances[index];
}
const section = (cm || editors[index]).getSection();
const top = allSectionsContainerTop + section.offsetTop;
if (top < scrollY + lineHeight) {
return Math.max(0, scrollY - top - lineHeight);
}
if (top < windowBottom) {
return 0;
}
const distance = top - windowBottom + section.offsetHeight;
if (index >= 0) {
distances[index] = distance;
}
return distance;
}
function findClosest() {
const last = editors.length - 1;
let a = 0;
let b = last;
let c;
let cm, distance;
while (a < b - 1) {
c = (a + b) / 2 | 0;
distance = offscreenDistance(c);
if (!distance || !c) {
break;
}
const distancePrev = offscreenDistance(c - 1);
const distanceNext = c < last ? offscreenDistance(c + 1) : 1e20;
if (distancePrev <= distance && distance <= distanceNext) {
b = c;
} else {
a = c;
}
}
while (b && offscreenDistance(b - 1) <= offscreenDistance(b)) {
b--;
}
cm = editors[b];
if (distances[b] > 0) {
makeSectionVisible(cm);
}
}
return cm;
function offscreenDistance(cm) {
// closest editor should have at least # lines visible
const LINES_VISIBLE = 2;
const bounds = cm.getSection().getBoundingClientRect();
if (bounds.top < 0) {
return -bounds.top;
} else if (bounds.top < window.innerHeight - cm.defaultTextHeight() * LINES_VISIBLE) {
return 0;
} else {
return bounds.top - bounds.height;
}
}
}
@ -1209,7 +1298,7 @@ function beautify(event) {
}
}
document.addEventListener('DOMContentLoaded', init);
onDOMready().then(init);
function createEmptyStyle() {
const params = getParams();
@ -1270,9 +1359,9 @@ function init() {
}
function setStyleMeta(style) {
$('#name').value = style.name;
$('#enabled').checked = style.enabled;
$('#url').href = style.url;
$('#name').value = style.name || '';
$('#enabled').checked = style.enabled !== false;
$('#url').href = style.url || '';
}
function initWithStyle({style}) {
@ -1296,37 +1385,46 @@ function _initWithStyle({style, codeIsUpdated}) {
updateTitle();
return;
}
// if this was done in response to an update, we need to clear existing sections
getSections().forEach(div => { div.remove(); });
editors.length = 0;
getSections().forEach(div => div.remove());
const queue = style.sections.length ? style.sections.slice() : [{code: ''}];
const queueStart = new Date().getTime();
const t0 = performance.now();
maximizeCodeHeight.stats = null;
// after 100ms the sections will be added asynchronously
while (new Date().getTime() - queueStart <= 100 && queue.length) {
while (performance.now() - t0 <= 100 && queue.length) {
add();
}
(function processQueue() {
if (queue.length) {
add();
setTimeout(processQueue, 0);
setTimeout(processQueue);
if (performance.now() - t0 > 500) {
setGlobalProgress(editors.length, style.sections.length);
}
} else {
setGlobalProgress();
}
})();
editors[0].focus();
initHooks();
setCleanGlobal();
updateTitle();
function add() {
const sectionDiv = addSection(null, queue.shift());
maximizeCodeHeight(sectionDiv, !queue.length);
const cm = sectionDiv.CodeMirror;
if (CodeMirror.lint) {
setTimeout(() => {
cm.setOption('lint', CodeMirror.defaults.lint);
updateLintReport(cm, 0);
}, prefs.get('editor.lintDelay'));
if (!queue.length) {
editors.last.state.renderLintReportNow = true;
}
}
}
function initHooks() {
if (initHooks.alreadyDone) {
return;
}
initHooks.alreadyDone = true;
$$('#header .style-contributor').forEach(node => {
node.addEventListener('change', onChange);
node.addEventListener('input', onChange);
@ -1340,6 +1438,15 @@ function initHooks() {
$('#sections-help').addEventListener('click', showSectionHelp, false);
$('#keyMap-help').addEventListener('click', showKeyMapHelp, false);
$('#cancel-button').addEventListener('click', goBackToManage);
$('#options').open = prefs.get('editor.options.expanded');
$('#options h2').addEventListener('click', () => {
setTimeout(() => prefs.set('editor.options.expanded', $('#options').open));
});
prefs.subscribe(['editor.options.expanded'], (key, value) => {
$('#options').open = value;
});
initLint();
if (!FIREFOX) {
@ -1358,8 +1465,6 @@ function initHooks() {
});
setupGlobalSearch();
setCleanGlobal();
updateTitle();
}
@ -1431,6 +1536,7 @@ function updateTitle() {
function validate() {
const name = $('#name').value;
if (name === '') {
$('#name').focus();
return t('styleMissingName');
}
// validate the regexps
@ -1460,9 +1566,9 @@ function validate() {
return null;
}
function updateLintReportIfEnabled(cm, time) {
if (CodeMirror.lint) {
updateLintReport(cm, time);
function updateLintReportIfEnabled(...args) {
if (CodeMirror.defaults.lint) {
updateLintReport(...args);
}
}
@ -1574,8 +1680,11 @@ function fromMozillaFormat() {
function doImport(event) {
// parserlib contained in CSSLint-worker.js
onDOMscripted(['vendor-overwrites/csslint/csslint-worker.js'])
.then(() => doImportWhenReady(event.target));
onDOMscripted(['vendor-overwrites/csslint/csslint-worker.js']).then(() => {
doImportWhenReady(event.target);
editors.forEach(cm => updateLintReportIfEnabled(cm, 1));
editors.last.state.renderLintReportNow = true;
});
}
function doImportWhenReady(target) {
@ -1754,7 +1863,8 @@ function showRegExpTester(event, section = getSectionForChild(this)) {
const rxData = Object.assign({text}, cachedRegexps.get(text));
if (!rxData.urls) {
cachedRegexps.set(text, Object.assign(rxData, {
rx: tryRegExp(text),
// imitate buggy Stylish-for-chrome, see detectSloppyRegexps()
rx: tryRegExp('^' + text + '$'),
urls: new Map(),
}));
}
@ -1769,6 +1879,8 @@ function showRegExpTester(event, section = getSectionForChild(this)) {
chrome.tabs.onUpdated.removeListener(_);
}
});
const getMatchInfo = m => m && {text: m[0], pos: m.index};
queryTabs().then(tabs => {
const supported = tabs.map(tab => tab.url)
.filter(url => URLS.supported(url));
@ -1778,7 +1890,7 @@ function showRegExpTester(event, section = getSectionForChild(this)) {
if (rx) {
const urlsNow = new Map();
for (const url of unique) {
const match = urls.get(url) || (url.match(rx) || [])[0];
const match = urls.get(url) || getMatchInfo(url.match(rx));
if (match) {
urlsNow.set(url, match);
}
@ -1812,7 +1924,7 @@ function showRegExpTester(event, section = getSectionForChild(this)) {
? OWN_ICON
: GET_FAVICON_URL + new URL(url).hostname;
const icon = $element({tag: 'img', src: faviconUrl});
if (match.length === url.length) {
if (match.text.length === url.length) {
full.push($element({appendChild: [
icon,
url,
@ -1820,8 +1932,9 @@ function showRegExpTester(event, section = getSectionForChild(this)) {
} else {
partial.push($element({appendChild: [
icon,
$element({tag: 'mark', textContent: match}),
url.substr(match.length),
url.substr(0, match.pos),
$element({tag: 'mark', textContent: match.text}),
url.substr(match.pos + match.text.length),
]}));
}
}
@ -2061,3 +2174,17 @@ function getCodeMirrorThemes() {
});
});
}
function setGlobalProgress(done, total) {
const progressElement = $('#global-progress') ||
total && document.body.appendChild($element({id: 'global-progress'}));
if (total) {
const progress = (done / Math.max(done, total) * 100).toFixed(1);
progressElement.style.borderLeftWidth = progress + 'vw';
setTimeout(() => {
progressElement.title = progress + '%';
});
} else if (progressElement) {
progressElement.remove();
}
}

View File

@ -6,7 +6,8 @@ CodeMirror.registerHelper('lint', 'csslint', code =>
.messages.map(message => ({
from: CodeMirror.Pos(message.line - 1, message.col - 1),
to: CodeMirror.Pos(message.line - 1, message.col),
message: message.message + ` (${message.rule.id})`,
message: message.message,
rule: message.rule.id,
severity : message.type
}))
);
@ -24,7 +25,9 @@ CodeMirror.registerHelper('lint', 'stylelint', code =>
to: CodeMirror.Pos(warning.line - 1, warning.column),
message: warning.text
.replace('Unexpected ', '')
.replace(/^./, firstLetter => firstLetter.toUpperCase()),
.replace(/^./, firstLetter => firstLetter.toUpperCase())
.replace(/\s*\([^(]+\)$/, ''), // strip the rule,
rule: warning.text.replace(/^.*?\s*\(([^(]+)\)$/, '$1'),
severity : warning.severity
}));
})

View File

@ -133,7 +133,7 @@ function initLint() {
linterConfig.loadAll();
linterConfig.watchStorage();
prefs.subscribe(updateLinter, ['editor.linter']);
prefs.subscribe(['editor.linter'], updateLinter);
updateLinter();
}
@ -145,6 +145,10 @@ function updateLinter({immediately} = {}) {
const linter = prefs.get('editor.linter');
const GUTTERS_CLASS = 'CodeMirror-lint-markers';
loadLinterAssets(linter).then(updateEditors);
$('#linter-settings').style.display = !linter ? 'none' : 'inline-block';
$('#lint').style.display = 'none';
function updateEditors() {
CodeMirror.defaults.lint = linterConfig.getForCodeMirror(linter);
const guttersOption = prepareGuttersOption();
@ -153,9 +157,9 @@ function updateLinter({immediately} = {}) {
if (guttersOption) {
cm.setOption('guttersOption', guttersOption);
updateGutters(cm, guttersOption);
}
cm.refresh();
updateLintReport(cm);
}
setTimeout(updateLintReport, 0, cm);
});
}
@ -183,90 +187,100 @@ function updateLinter({immediately} = {}) {
el.remove();
}
}
// load scripts
loadLinterAssets(linter).then(() => {
updateEditors();
});
$('#linter-settings').style.display = !linter ? 'none' : 'inline-block';
}
function updateLintReport(cm, delay) {
if (cm && !cm.options.lint) {
// add 'lint' option back to the freshly created section
setTimeout(() => {
if (!cm.options.lint) {
cm.setOption('lint', linterConfig.getForCodeMirror());
}
});
}
const state = cm && cm.state && cm.state.lint || {};
if (delay === 0) {
// immediately show pending csslint/stylelint messages in onbeforeunload and save
update(cm);
clearTimeout(state.lintTimeout);
updateLintReportInternal(cm);
return;
}
if (delay > 0) {
setTimeout(cm => {
clearTimeout(state.lintTimeout);
state.lintTimeout = setTimeout(cm => {
if (cm.performLint) {
cm.performLint();
update(cm);
updateLintReportInternal(cm);
}
}, delay, cm);
return;
}
// eslint-disable-next-line no-var
var state = cm.state.lint;
if (!state) {
return;
}
// user is editing right now: postpone updating the report for the new issues (default: 500ms lint + 4500ms)
// or update it as soon as possible (default: 500ms lint + 100ms) in case an existing issue was just fixed
if (state.options) {
clearTimeout(state.reportTimeout);
state.reportTimeout = setTimeout(update, state.options.delay + 100, cm);
state.postponeNewIssues = delay === undefined || delay === null;
function update(cm) {
const scope = cm ? [cm] : $$('#sections .CodeMirror').map(e => e.CodeMirror);
let changed = false;
let fixedOldIssues = false;
scope.forEach(cm => {
const scopedState = cm.state.lint || {};
const oldMarkers = scopedState.markedLast || {};
const newMarkers = {};
const html = !scopedState.marked || scopedState.marked.length === 0 ? '' : '<tbody>' +
scopedState.marked.map(mark => {
const info = mark.__annotation;
const isActiveLine = info.from.line === cm.getCursor().line;
const pos = isActiveLine ? 'cursor' : (info.from.line + ',' + info.from.ch);
// rule name added in parentheses at the end; extract it out for the info popup
const text = info.message;
const parenPos = text.endsWith(')') ? text.lastIndexOf('(') : text.length;
const ruleName = text.slice(parenPos + 1, -1);
const title = escapeHtml(text);
const message = escapeHtml(text.substr(0, Math.min(100, parenPos)), {limit: 100});
if (isActiveLine || oldMarkers[pos] === message) {
delete oldMarkers[pos];
}
newMarkers[pos] = message;
return `<tr class="${info.severity}">
<td role="severity" data-rule="${ruleName}">
<div class="CodeMirror-lint-marker-${info.severity}">${info.severity}</div>
</td>
<td role="line">${info.from.line + 1}</td>
<td role="sep">:</td>
<td role="col">${info.from.ch + 1}</td>
<td role="message" title="${title}">${message}</td>
</tr>`;
}).join('') + '</tbody>';
scopedState.markedLast = newMarkers;
fixedOldIssues |= scopedState.reportDisplayed && Object.keys(oldMarkers).length > 0;
if (scopedState.html !== html) {
scopedState.html = html;
changed = true;
}
const delay = cm && cm.state.renderLintReportNow ? 0 : state.options.delay + 100;
state.reportTimeout = setTimeout(updateLintReportInternal, delay, cm, {
postponeNewIssues: delay === undefined || delay === null
});
}
}
function updateLintReportInternal(scope, {postponeNewIssues} = {}) {
const {changed, fixedSome} = (scope ? [scope] : editors).reduce(process, {});
if (changed) {
clearTimeout(state ? state.renderTimeout : undefined);
if (!state || !state.postponeNewIssues || fixedOldIssues) {
renderLintReport(true);
} else {
state.renderTimeout = setTimeout(() => {
renderLintReport(true);
}, CodeMirror.defaults.lintReportDelay);
const renderNow = editors.last.state.renderLintReportNow =
!postponeNewIssues || fixedSome || editors.last.state.renderLintReportNow;
debounce(renderLintReport, renderNow ? 0 : CodeMirror.defaults.lintReportDelay, true);
}
function process(result, cm) {
const lintState = cm.state.lint || {};
const oldMarkers = lintState.stylusMarkers || new Map();
const newMarkers = lintState.stylusMarkers = new Map();
const oldText = (lintState.body || {}).textContentCached || '';
const activeLine = cm.getCursor().line;
const body = !(lintState.marked || {}).length ? {} : $element({
tag: 'tbody',
appendChild: lintState.marked.map(mark => {
const info = mark.__annotation;
const {line, ch} = info.from;
const isActiveLine = line === activeLine;
const pos = isActiveLine ? 'cursor' : (line + ',' + ch);
const title = clipString(info.message, 1000) + `\n(${info.rule})`;
const message = clipString(info.message, 100);
if (isActiveLine || oldMarkers[pos] === message) {
oldMarkers.delete(pos);
}
newMarkers.set(pos, message);
return $element({
tag: 'tr',
className: info.severity,
appendChild: [
$element({
tag: 'td',
attributes: {role: 'severity'},
dataset: {rule: info.rule},
appendChild: $element({
className: 'CodeMirror-lint-marker-' + info.severity,
textContent: info.severity,
}),
}),
$element({tag: 'td', attributes: {role: 'line'}, textContent: line + 1}),
$element({tag: 'td', attributes: {role: 'sep'}, textContent: ':'}),
$element({tag: 'td', attributes: {role: 'col'}, textContent: ch + 1}),
$element({tag: 'td', attributes: {role: 'message'}, textContent: message, title}),
],
});
})
});
body.textContentCached = body.textContent || '';
lintState.body = body.textContentCached && body;
result.changed |= oldText !== body.textContentCached;
result.fixedSome |= lintState.reportDisplayed && oldMarkers.size;
return result;
}
function clipString(str, limit) {
return str.length <= limit ? str : str.substr(0, limit) + '...';
}
}
@ -276,19 +290,31 @@ function renderLintReport(someBlockChanged) {
const label = t('sectionCode');
const newContent = content.cloneNode(false);
let issueCount = 0;
$$('#sections .CodeMirror').map(e => e.CodeMirror).forEach((cm, index) => {
if (cm.state.lint && cm.state.lint.html) {
const html = '<caption>' + label + ' ' + (index + 1) + '</caption>' + cm.state.lint.html;
const newBlock = newContent.appendChild(tHTML(html, 'table'));
newBlock.cm = cm;
editors.forEach((cm, index) => {
cm.state.renderLintReportNow = false;
const lintState = cm.state.lint || {};
const body = lintState.body;
if (!body) {
return;
}
const newBlock = $element({
tag: 'table',
appendChild: [
$element({tag: 'caption', textContent: label + ' ' + (index + 1)}),
body,
],
cm,
});
newContent.appendChild(newBlock);
issueCount += newBlock.rows.length;
const block = content.children[newContent.children.length - 1];
const blockChanged = !block || cm !== block.cm || html !== block.innerHTML;
const blockChanged =
!block ||
block.cm !== cm ||
body.textContentCached !== block.textContentCached;
someBlockChanged |= blockChanged;
cm.state.lint.reportDisplayed = blockChanged;
}
lintState.reportDisplayed = blockChanged;
});
if (someBlockChanged || newContent.children.length !== content.children.length) {
$('#issue-count').textContent = issueCount;

View File

@ -36,10 +36,22 @@ for (const type of [NodeList, NamedNodeMap, HTMLCollection, HTMLAllCollection])
window.addEventListener('resize', () => debounce(addTooltipsToEllipsized, 100));
}
onDOMready().then(() => $('#firefox-transitions-bug-suppressor').remove());
if (navigator.userAgent.includes('Firefox')) {
// die if unable to access BG directly
chrome.windows.getCurrent(wnd => {
if (!BG && wnd.incognito) {
// private windows can't get bg page
location.href = '/msgbox/dysfunctional.html';
throw 0;
}
});
// add favicon in Firefox
// eslint-disable-next-line no-unused-expressions
navigator.userAgent.includes('Firefox') && setTimeout(() => {
dieOnDysfunction();
setTimeout(() => {
if (!window.prefs) {
return;
}
const iconset = ['', 'light/'][prefs.get('iconset')] || '';
for (const size of [38, 32, 19, 16]) {
document.head.appendChild($element({
@ -49,9 +61,10 @@ navigator.userAgent.includes('Firefox') && setTimeout(() => {
sizes: size + 'x' + size,
}));
}
});
// set hyphenation language
document.documentElement.setAttribute('lang', chrome.i18n.getUILanguage());
});
}
function onDOMready() {
@ -169,7 +182,7 @@ function animateElement(
element, {
className = 'highlight',
removeExtraClasses = [],
remove = false,
onComplete,
} = {}) {
return element && new Promise(resolve => {
element.addEventListener('animationend', function _() {
@ -180,9 +193,9 @@ function animateElement(
// This is helpful to clean-up on the same frame
...removeExtraClasses
);
// TODO: investigate why animation restarts if the elements is removed in .then()
if (remove) {
element.remove();
// TODO: investigate why animation restarts for 'display' modification in .then()
if (typeof onComplete === 'function') {
onComplete.call(element);
}
resolve();
});
@ -244,6 +257,12 @@ function $element(opt) {
Object.assign(element.dataset, opt.dataset);
delete opt.dataset;
}
if (opt.attributes) {
for (const attr in opt.attributes) {
element.setAttribute(attr, opt.attributes[attr]);
}
delete opt.attributes;
}
if (ns) {
for (const attr in opt) {
element.setAttributeNS(null, attr, opt[attr]);
@ -255,39 +274,6 @@ function $element(opt) {
}
function dieOnDysfunction() {
function die() {
location.href = '/msgbox/dysfunctional.html';
throw 0;
}
(() => {
try {
return indexedDB;
} catch (e) {
die();
}
})();
Object.assign(indexedDB.open('test'), {
onerror: die,
onupgradeneeded: indexedDB.deleteDatabase('test'),
});
// TODO: fallback to sendMessage in FF since private windows can't get bg page
chrome.windows.getCurrent(wnd => wnd.incognito && die());
// check if privacy settings were fixed but the extension wasn't reloaded,
// use setTimeout to auto-cancel if already dead
setTimeout(() => {
const bg = chrome.extension.getBackgroundPage();
if (bg && !(bg.cachedStyles || {}).list) {
chrome.storage.local.get('reloaded', data => {
if (!data || Date.now() - (data.reloaded || 0) > 10e3) {
chrome.storage.local.set({reloaded: Date.now()}, () => chrome.runtime.reload());
}
});
}
});
}
function escapeHtml(html, {limit} = {}) {
const chars = {'&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;', '/': '&#x2F;'};
let ellipsis = '';

View File

@ -25,6 +25,7 @@ var prefs = new function Prefs() {
'manage.newUI.targets': 3, // max number of applies-to targets visible: 0 = none
'editor.options': {}, // CodeMirror.defaults.*
'editor.options.expanded': true, // UI element state: expanded/collapsed
'editor.lineWrapping': true, // word wrap
'editor.smartIndent': true, // 'smart' indent
'editor.indentWithTabs': false, // smart indent with tabs
@ -152,7 +153,10 @@ var prefs = new function Prefs() {
}
},
subscribe(listener, keys) {
subscribe(keys, listener) {
// keys: string[] ids
// or a falsy value to subscribe to everything
// listener: function (key, value)
if (keys) {
for (const key of keys) {
onChange.specific.set(key, listener);
@ -182,7 +186,8 @@ var prefs = new function Prefs() {
break;
}
} else if (FIREFOX_NO_DOM_STORAGE && BG) {
value = BG.localStorage[key] || defaultValue;
value = BG.localStorage[key];
value = value === undefined ? defaultValue : value;
} else {
value = defaultValue;
}
@ -236,6 +241,13 @@ var prefs = new function Prefs() {
return;
function doBroadcast() {
if (BG && BG === window && !BG.dbExec.initialized) {
window.addEventListener('storageReady', function _() {
window.removeEventListener('storageReady', _);
doBroadcast();
});
return;
}
const affects = {
all: 'disableAll' in broadcastPrefs
|| 'exposeIframes' in broadcastPrefs,
@ -330,7 +342,7 @@ function setupLivePrefs(
updateElement({id, element, force: true});
element.addEventListener('change', onChange);
}
prefs.subscribe((id, value) => updateElement({id, value}), IDs);
prefs.subscribe(IDs, (id, value) => updateElement({id, value}));
function onChange() {
const value = this[checkedProps[this.id]];

View File

@ -9,6 +9,16 @@
<style id="style-overrides"></style>
<style id="firefox-transitions-bug-suppressor">
/* restrict to FF */
@-moz-document url-prefix("") {
/* increased specificity to override sane selectors in user styles */
html#stylus.firefox #stylus-manage #header * {
transition: none !important;
}
}
</style>
<!-- Notes:
* Chrome doesn't garbage-collect (or even leaks) SVG <symbol> referenced via <use> so we'll embed the code directly
* inter-tag whitespace in templates is automatically removed in localization.js
@ -181,7 +191,7 @@
data-filter=":not(.not-matching)"
data-filter-hide=".not-matching">
</fieldset>
<p>
<p class="nowrap">
<button id="check-all-updates" i18n-text="checkAllUpdates"><span id="update-progress"></span></button>
<span id="update-history" i18n-title="genericHistoryLabel">
<svg class="svg-icon" viewBox="0 0 20 20" i18n-alt="helpAlt">

View File

@ -339,7 +339,8 @@ function searchStyles({immediately, container}) {
if (!isMatching) {
const style = urlMode ? siteStyleIds.has(entry.styleId) :
BG.cachedStyles.byId.get(entry.styleId) || {};
isMatching = urlMode ? style : Boolean(style && (
isMatching = Boolean(style && (
urlMode ||
isMatchingText(style.name) ||
style.url && isMatchingText(style.url) ||
isMatchingStyle(style)));

View File

@ -16,6 +16,20 @@ a:hover {
color: #666;
}
select {
font-size: 12px;
}
.nowrap {
white-space: nowrap;
}
.nowrap > * {
white-space: nowrap;
overflow-x: hidden;
text-overflow: ellipsis;
}
#header {
width: 280px;
height: 100vh;
@ -31,9 +45,6 @@ a:hover {
#check-all-updates {
max-width: 220px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
#header h1 {
@ -231,7 +242,7 @@ summary {
font-family: sans-serif;
text-indent: -2em;
padding-left: 3em;
padding-right: 30px;
padding-right: 40px;
}
.newUI .homepage .svg-icon {
@ -241,7 +252,7 @@ summary {
}
.newUI .actions {
width: 60px;
width: 75px;
height: 20px;
white-space: nowrap;
}

View File

@ -577,7 +577,10 @@ function dieOnNullBackground() {
title: 'Stylus',
className: 'danger center',
contents: t('dysfunctionalBackgroundConnection'),
onshow: () => $('#message-box-close-icon').remove(),
onshow: () => {
$('#message-box-close-icon').remove();
window.removeEventListener('keydown', messageBox.listeners.key, true);
}
});
document.documentElement.style.pointerEvents = 'none';
});

View File

@ -1,6 +1,6 @@
{
"name": "Stylus",
"version": "1.1.3.1",
"version": "1.1.4.1",
"minimum_chrome_version": "49",
"description": "__MSG_description__",
"homepage_url": "http://add0n.com/stylus.html",

View File

@ -1,6 +1,6 @@
html {
height: 100vh;
min-height: 450px;
min-height: 12em;
display: flex;
align-items: center;
justify-content: center;
@ -16,7 +16,7 @@ html {
body {
margin: 2em;
color: white;
max-width: 600px;
max-width: 20em;
}
div {

View File

@ -1,8 +1,3 @@
'use strict';
document.body.textContent =
chrome.i18n.getMessage('dysfunctional');
document.body.appendChild(document.createElement('div')).textContent =
chrome.runtime.getURL('manifest.json');
// set hyphenation language
document.documentElement.setAttribute('lang', chrome.i18n.getUILanguage());
document.body.textContent = chrome.i18n.getMessage('dysfunctional');

View File

@ -80,6 +80,10 @@
font-weight: bold;
}
#message-box.danger #message-box-close-icon svg {
fill: maroon;
}
#message-box.danger #message-box-close-icon svg:hover {
fill: #600;
}

View File

@ -45,8 +45,10 @@ function messageBox({
function resolveWith(value) {
unbindGlobalListeners();
setTimeout(messageBox.resolve, 0, value);
animateElement(messageBox.element, {className: 'fadeout', remove: true})
.then(removeSelf);
animateElement(messageBox.element, {
className: 'fadeout',
onComplete: removeSelf,
});
}
function createElement() {

View File

@ -4,6 +4,17 @@
<title i18n-text-append="optionsHeading">Stylus </title>
<link rel="stylesheet" href="options/options.css">
<link rel="stylesheet" href="options/onoffswitch.css">
<style id="firefox-transitions-bug-suppressor">
/* restrict to FF */
@-moz-document url-prefix("") {
/* increased specificity to override sane selectors in user styles */
html#stylus.firefox #options *, #stylus #notes * {
transition: none !important;
}
}
</style>
<script src="js/dom.js"></script>
<script src="js/messaging.js"></script>
<script src="js/localization.js"></script>
@ -94,7 +105,7 @@
</div>
</div>
<div class="block">
<div class="block collapsible" id="advanced">
<h1 i18n-text="optionsAdvanced"></h1>
<div class="items">
<label>

View File

@ -50,6 +50,14 @@ body {
padding-bottom: 0;
}
.collapsed, .collapsible h1 {
cursor: pointer;
}
.collapsed .items {
display: none;
}
h1 {
width: 30%;
margin: 0;

View File

@ -4,6 +4,16 @@ setupLivePrefs();
setupRadioButtons();
enforceInputRange($('#popupWidth'));
if (!FIREFOX && !OPERA) {
const block = $('#advanced');
block.classList.add('collapsed');
block.onclick = event => {
if (block.classList.contains('collapsed') || event.target.closest('h1')) {
block.classList.toggle('collapsed');
}
};
}
// actions
document.onclick = e => {
const target = e.target.closest('[data-cmd]');
@ -81,7 +91,7 @@ function setupRadioButtons() {
sets[name][prefs.get(name)].checked = true;
}
// listen to pref changes and update the values
prefs.subscribe((key, value) => {
prefs.subscribe(Object.keys(sets), (key, value) => {
sets[key][value].checked = true;
}, Object.keys(sets));
});
}

View File

@ -4,6 +4,16 @@
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="stylesheet" href="popup/popup.css">
<style id="firefox-transitions-bug-suppressor">
/* restrict to FF */
@-moz-document url-prefix("") {
/* increased specificity to override sane selectors in user styles */
html#stylus.firefox #stylus-popup #actions * {
transition: none !important;
}
}
</style>
<!-- Notes:
* Chrome doesn't garbage-collect (or even leaks) SVG <symbol> referenced via <use> so we'll embed the code directly
* inter-tag whitespace in templates is automatically removed in localization.js

View File

@ -332,13 +332,9 @@ body.blocked .actions > .left-gutter {
/* confirm */
#confirm,
#confirm > div > span {
#confirm {
align-items: center;
justify-content: center;
}
#confirm {
z-index: 2147483647;
display: none;
position: absolute;
@ -358,6 +354,7 @@ body.blocked .actions > .left-gutter {
animation-fill-mode: both;
}
#confirm.lights-on,
#confirm.lights-on > div {
display: none;
}
@ -368,30 +365,20 @@ body.blocked .actions > .left-gutter {
#confirm > div {
width: 80%;
height: 100px;
max-height: 80%;
min-height: 8em;
min-height: 6em;
padding: 1em;
background-color: #fff;
display: flex;
flex-direction: column;
border: solid 2px rgba(0, 0, 0, 0.5);
}
#confirm > div > span {
display: flex;
flex: 1;
padding: 0 10px;
}
#confirm > div > b {
padding: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
#confirm > div > *:not(:last-child) {
padding-bottom: .5em;
}
#confirm > div > div {
padding: 10px;
text-align: center;
}
@ -400,6 +387,12 @@ body.blocked .actions > .left-gutter {
text-align: right;
}
#confirm > button {
/* add a gap between buttons both for horizontal
or vertical (when the label is wide) layout */
margin: 0 .25em .25em 0;
}
.unreachable .entry {
opacity: .25;
}

View File

@ -312,10 +312,14 @@ Object.assign(handleEvent, {
};
function confirm(ok) {
window.onkeydown = null;
animateElement(box, {className: 'lights-on'})
.then(() => (box.dataset.display = false));
animateElement(box, {
className: 'lights-on',
onComplete: () => (box.dataset.display = false),
});
if (ok) {
deleteStyleSafe({id}).then(() => {
// don't wait for the async notifyAllTabs as we check the children right away
handleDelete(id);
// update view with 'No styles installed for this site' message
if (!installed.children.length) {
showStyles([]);
@ -400,7 +404,7 @@ function handleUpdate(style) {
// Add an entry when a new style for the current url is installed
if (tabURL && BG.getApplicableSections({style, matchUrl: tabURL, stopOnFirst: true}).length) {
document.body.classList.remove('blocked');
$$('.blocked-info').forEach(el => el.remove());
$$('.blocked-info, #no-styles').forEach(el => el.remove());
createStyleElement({style});
}
}