Repository: prem-k-r/MaterialYouNewTab Branch: main Commit: dcb7a066c81d Files: 78 Total size: 939.2 KB Directory structure: gitextract_i_fhkn0c/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ ├── config.yml │ │ ├── feature_request.yaml │ │ └── general_question.yaml │ └── pull_request_template.md ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs/ │ ├── Get_WeatherAPI_Key.html │ └── feedback.html ├── index.html ├── locales/ │ ├── README.md │ ├── ar_SA.js │ ├── az.js │ ├── bn.js │ ├── cs.js │ ├── de.js │ ├── el.js │ ├── en.js │ ├── es.js │ ├── fa.js │ ├── fr.js │ ├── hi.js │ ├── hu.js │ ├── idn.js │ ├── it.js │ ├── ja.js │ ├── ko.js │ ├── mr.js │ ├── ne.js │ ├── pl.js │ ├── pt.js │ ├── ru.js │ ├── sl.js │ ├── sv.js │ ├── ta.js │ ├── th.js │ ├── tr.js │ ├── uk.js │ ├── ur.js │ ├── uz.js │ ├── vi.js │ ├── zh.js │ └── zh_TW.js ├── manifest(firefox).json ├── manifest.json ├── privacy-policy.html ├── scripts/ │ ├── README.md │ ├── ai-tools.js │ ├── alert-modal.js │ ├── background.js │ ├── backup-restore.js │ ├── bookmarks.js │ ├── browser-utils.js │ ├── clock.js │ ├── custom-text.js │ ├── google-apps.js │ ├── languages.js │ ├── menu-shortcut-page.js │ ├── preload.js │ ├── quotes.js │ ├── save-load-states.js │ ├── script.js │ ├── search-suggestions.js │ ├── search.js │ ├── shortcuts.js │ ├── theme.js │ ├── todo-list.js │ ├── voice-search.js │ ├── wallpaper.js │ ├── weather.js │ └── widgets-transparency.js ├── style.css ├── svgs/ │ └── 0 Don't DELETE any of them └── tools/ └── languagesAnalysis.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yaml ================================================ name: Bug Report description: Report a bug in Material You NewTab. title: "[Bug]: " labels: ["bug"] assignees: [] body: - type: markdown attributes: value: | Thanks for reporting an issue with **Material You NewTab**! Before submitting, please check if the issue already exists in the [issues list](https://github.com/prem-k-r/MaterialYouNewTab/issues). If you need help, feel free to ask in our [Telegram support group](https://t.me/Material_You_NewTab). - type: input id: contact attributes: label: Contact Details description: How can we reach you if we need more info? placeholder: ex. Your Telegram username, email, or GitHub profile (optional) validations: required: false - type: textarea id: what-happened attributes: label: What happened? description: Describe the issue clearly, including what you expected to happen versus what actually happened. placeholder: "### Bug Description\n\n### Expected Behavior\n\n### Actual Behavior" validations: required: true - type: dropdown id: extension-version attributes: label: Extension Version description: What version of Material You NewTab are you using? options: - Latest Stable Release (Chrome Web Store) - Development Build (Main Branch) - Other (Mention Below) default: 0 validations: required: true - type: input id: extension-version-id attributes: label: Extension Version ID description: If you selected "Other" above, mention your extension version. placeholder: ex. v3, v2.4, etc. - type: dropdown id: browsers attributes: label: What browser are you using? multiple: true options: - Google Chrome - Mozilla Firefox - Microsoft Edge - Brave - Opera - Other (mention below) validations: required: true - type: input id: browser-name attributes: label: Browser Name description: If you selected "Other" above, mention your browser name. placeholder: ex. Vivaldi, Safari, etc. validations: required: false - type: input id: os attributes: label: Operating System description: Which OS are you using? placeholder: ex. Windows 10, macOS 14, Ubuntu 22.04 validations: required: true - type: textarea id: reproduce-steps attributes: label: Steps to Reproduce description: Tell us how to reproduce the bug step by step. placeholder: | 1. Open the new tab 2. Enable a specific feature 3. Observe the error or issue validations: required: true - type: textarea id: logs attributes: label: Console Errors / Logs description: If applicable, provide any console errors or logs. (Open DevTools → Console and copy errors) render: shell - type: textarea id: screenshots attributes: label: Screenshots description: If possible, attach screenshots or screen recordings of the bug. - type: checkboxes id: terms attributes: label: Agreement description: By submitting this issue, you agree to follow the project's [Code of Conduct](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CODE_OF_CONDUCT.md). options: - label: I have searched for existing issues and checked the FAQs before submitting this. required: true - label: I agree to follow this project's Code of Conduct. required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: true contact_links: - name: Telegram Support Group url: https://t.me/Material_You_NewTab about: Join our Telegram group for quick support and discussions. - name: Contribution Guidelines url: https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CONTRIBUTING.md about: Learn how to contribute to Material You New Tab. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yaml ================================================ name: Feature Request description: Suggest a new feature or improvement for Material You NewTab. title: "[Feature]: " labels: ["enhancement"] assignees: [] body: - type: markdown attributes: value: | Thanks for taking the time to suggest a feature for **Material You NewTab**! Before submitting, please ensure that your feature isn’t already requested in the [issues list](https://github.com/prem-k-r/MaterialYouNewTab/issues). If you need further discussion, feel free to join our [Telegram support group](https://t.me/Material_You_NewTab). - type: input id: contact attributes: label: Contact Details description: How can we reach you if we need more information? placeholder: ex. Telegram username or email (optional) validations: required: false - type: textarea id: feature-description attributes: label: Describe the Feature description: Clearly explain what feature or improvement you are suggesting. placeholder: Provide a detailed description of your idea. value: "### Feature Description\n\n### Why is this needed?\n\n### Possible Implementation" validations: required: true - type: dropdown id: feature-type attributes: label: What kind of feature is this? options: - UI/UX Improvement - New Functionality - Performance Enhancement - Other (mention below) validations: required: true - type: input id: feature-type-other attributes: label: Specify Feature Type (if "Other") description: If your feature does not fit into the categories above, specify here. placeholder: ex. Accessibility improvement, Customization option validations: required: false - type: textarea id: potential-benefits attributes: label: Benefits of This Feature description: Explain how this feature would improve the extension for users. placeholder: Describe how it enhances usability, functionality, or performance. validations: required: true - type: textarea id: additional-info attributes: label: Additional Context description: Add any relevant information, references, or screenshots. placeholder: ex. Related features, links, or alternative approaches. validations: required: false - type: checkboxes id: agreement attributes: label: Agreement description: By submitting this issue, you agree to follow the project's [Code of Conduct](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CODE_OF_CONDUCT.md). options: - label: I have searched for existing issues and checked the FAQs before submitting this. required: true - label: I agree to follow this project's Code of Conduct. required: true ================================================ FILE: .github/ISSUE_TEMPLATE/general_question.yaml ================================================ name: General Question / Help Needed description: Ask a question or seek help related to Material You NewTab. title: "[Question]: " labels: ["help wanted"] assignees: [] body: - type: markdown attributes: value: | Thanks for reaching out! Please check our [README](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/README.md) and [existing issues](https://github.com/prem-k-r/MaterialYouNewTab/issues) first. For quicker support, join our [Telegram group](https://t.me/Material_You_NewTab). - type: input id: contact attributes: label: Contact Details description: How can we reach you for more info? (optional) placeholder: ex. Telegram username or email validations: required: false - type: textarea id: question-details attributes: label: Your Question or Issue description: Describe your question or issue. placeholder: "Explain your question or what you're trying to achieve." value: "### Question\n\n### Additional Context" validations: required: true - type: dropdown id: extension-version attributes: label: Extension Version options: - Latest Stable Release (Chrome Web Store) - Development Build (Main Branch) - Other (Mention Below) default: 0 validations: required: true - type: input id: extension-version-id attributes: label: Extension Version ID placeholder: ex. v3, v2.4, etc. validations: required: false - type: dropdown id: browsers attributes: label: What browser are you using? multiple: true options: - Google Chrome - Mozilla Firefox - Microsoft Edge - Brave - Opera - Other (mention below) validations: required: true - type: input id: browser-name attributes: label: Browser Name description: If you selected "Other" above, mention your browser name. placeholder: ex. Vivaldi, Safari, etc. validations: required: false - type: input id: os attributes: label: Operating System placeholder: ex. Windows 10, macOS 14, Ubuntu 22.04 validations: required: true - type: textarea id: additional-info attributes: label: Additional Information (if any) placeholder: "Any logs, screenshots, or extra details?" validations: required: false - type: checkboxes id: terms attributes: label: Agreement options: - label: I have searched the FAQs and existing issues before submitting. required: true - label: I agree to follow this project's [Code of Conduct](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CODE_OF_CONDUCT.md). required: true ================================================ FILE: .github/pull_request_template.md ================================================ ## 📌 Description ## 🎨 Visual Changes (Screenshots / Videos) ## 🔗 Related Issues - Closes # - Related to # ## ✅ Checklist - [ ] I have read and followed the [Contributing Guidelines](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CONTRIBUTING.md). - [ ] My code follows the project's coding style and conventions. - [ ] I have tested my changes thoroughly to ensure expected behavior. - [ ] I have verified compatibility across Chrome and Firefox (additional browsers if applicable). - [ ] I have attached relevant visual evidence (screenshots/videos) if applicable. - [ ] I have updated the [CHANGELOG.md](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/CHANGELOG.md) under the appropriate categories with all my changes in this PR. ## 🤖 AI Assistance (Coding) - [ ] None - [ ] Ideas / planning - [ ] Debugging / review help - [ ] Small code snippets - [ ] Partial implementation - [ ] Major implementation help - [ ] Mostly AI-generated - [ ] Full vibe coded ================================================ FILE: .gitignore ================================================ # Ignore macOS system files .DS_Store # Ignore VSCode workspace settings .vscode/ ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project partially follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - `Added` - for new features. - `Changed` - for changes in existing functionality. - `Improved` - for enhancements or optimizations in existing functionality. - `Removed` - for features that have been removed. - `Fixed` - for any bug fixes. - `Localized` - for updates related to translations, localization, or internationalization. - `Other` - for technical updates. ## [Unreleased](https://github.com/prem-k-r/MaterialYouNewTab/compare/v3.3...main) ### Added - Added support for touch-swipe and mouse-wheel gestures on the search engine icon to switch search engines when they are hidden ([@prem-k-r](https://github.com/prem-k-r)) ([#145](https://github.com/prem-k-r/MaterialYouNewTab/pull/145)) - Added support for custom shortcut icons via upload, URL, or pasted SVG ([@smurf11k](https://github.com/smurf11k)), ([@prem-k-r](https://github.com/prem-k-r)) ([#187](https://github.com/prem-k-r/MaterialYouNewTab/pull/187/)), ([#199](https://github.com/prem-k-r/MaterialYouNewTab/pull/199/)) - Added Daily Quote option to show one quote per day instead of refreshing on every new tab ([@KomeshBathula](https://github.com/KomeshBathula)) ([#141](https://github.com/prem-k-r/MaterialYouNewTab/pull/141)) ### Improved - Introduced collapsible sections in the settings menu for improved organization and easier navigation ([@prem-k-r](https://github.com/prem-k-r)) ([#109](https://github.com/prem-k-r/MaterialYouNewTab/pull/109)) - Redesigned the theme selector from dropdown to buttons for easier switching between Light, Dark, and System modes ([@prem-k-r](https://github.com/prem-k-r)) ([#112](https://github.com/prem-k-r/MaterialYouNewTab/pull/112)) - Added expanding animations to todo and Google apps panels and some other minor UI changes ([@prem-k-r](https://github.com/prem-k-r)) ([#118](https://github.com/prem-k-r/MaterialYouNewTab/pull/118)) - Prevented weather condition and shortcut icons from being color-inverted in dark mode ([@prem-k-r](https://github.com/prem-k-r)) ([#191](https://github.com/prem-k-r/MaterialYouNewTab/pull/191)) - Improved fallback behavior of shortcut icons to first-letter icons when custom icons fail to load or when offline ([@prem-k-r](https://github.com/prem-k-r)) ([#187](https://github.com/prem-k-r/MaterialYouNewTab/pull/187/)) - Disabled dragging for weather and location icons ([@anndiy](https://github.com/anndiy)) ([#183](https://github.com/prem-k-r/MaterialYouNewTab/pull/183)) ### Fixed - Fixed an issue where rapid clicks on the AI Tools icon caused race conditions, leading to inconsistent shortcuts panel visibility. ([@prem-k-r](https://github.com/prem-k-r)) ([#118](https://github.com/prem-k-r/MaterialYouNewTab/pull/118)) - Fixed shortcut name and URLs hover behavior by replacing ellipsis with clipped text for improved readability ([@prem-k-r](https://github.com/prem-k-r)) ([283f78d](https://github.com/prem-k-r/MaterialYouNewTab/pull/199/changes/283f78d6e4b202a075ca3d670c1b30cbc701c3a4)) ### Localized - Translation updated for: - Japanese ([@kons10](https://github.com/kons10)) - Arabic ([@heshamoomar](https://github.com/heshamoomar)) - Spanish ([@palacios22c](https://github.com/palacios22c)) - Russian ([@C0dwiz](https://github.com/C0dwiz), [@giwih](https://github.com/giwih)), ([@smurf11k](https://github.com/smurf11k)) - Czech ([@ceskyDJ](https://github.com/ceskyDJ)) - Hindi ([@prem-k-r](https://github.com/prem-k-r)) - Bengali ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)) - Uzbek ([S0ME2](https://github.com/S0ME2)) - Indonesian ([@Ayyas-RF](https://github.com/Ayyas-RF)) - Ukrainian ([@smurf11k](https://github.com/smurf11k)) - Hungarian ([@smurf11k](https://github.com/smurf11k)) - Marathi ([@anndiy](https://github.com/anndiy)) - French ([@iamwinner422](https://github.com/iamwinner422)) - Corrected abbreviations for months and days of the week in Russian ([@Ayyas-RF](https://github.com/Ayyas-RF)) ([#105](https://github.com/prem-k-r/MaterialYouNewTab/pull/105)) - Added support for Ukrainian ([@lozik4](https://github.com/lozik4)) ([#106](https://github.com/prem-k-r/MaterialYouNewTab/pull/106)) - Added support for Swedish ([@empohello-imamempogitub](https://github.com/empohello-imamempogitub)) ([#179](https://github.com/prem-k-r/MaterialYouNewTab/pull/179)) - Localized New Tab title ([@prem-k-r](https://github.com/prem-k-r)) ### Other - Miscellaneous improvements ([@prem-k-r](https://github.com/prem-k-r)) ## [v3.3](https://github.com/prem-k-r/MaterialYouNewTab/compare/v3.2...v3.3) - Nov 23, 2025 ### Added - Added “Follow System Theme” option to the theme dropdown, allowing automatic switching between Light and Dark themes based on the system’s current appearance ([@heshamoomar](https://github.com/heshamoomar)) ([#80](https://github.com/prem-k-r/MaterialYouNewTab/pull/80)) - Added toast notification to hide the footer for Chromium users ([@prem-k-r](https://github.com/prem-k-r)) ([#89](https://github.com/prem-k-r/MaterialYouNewTab/pull/89)) ### Improved - Updated search suggestion behavior to autocomplete the current search term upon selection via keyboard ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)) ([#33](https://github.com/prem-k-r/MaterialYouNewTab/pull/33)) - Added minimum width constraint to the custom text input box ([@anugrahrk](https://github.com/anugrahrk)) ([#70](https://github.com/prem-k-r/MaterialYouNewTab/pull/70)) - Smoothed the opening and closing animation for search dropdown ([@prem-k-r](https://github.com/prem-k-r)) ([#83](https://github.com/prem-k-r/MaterialYouNewTab/pull/83)) ### Fixed - Search dropdown no longer throws an error when Enter is pressed without a selected item ([@prem-k-r](https://github.com/prem-k-r)) ([#83](https://github.com/prem-k-r/MaterialYouNewTab/pull/83)) ### Localized - Adjusted Chinese date formatting ([@quantumfallout](https://github.com/quantumfallout)) ([#43](https://github.com/prem-k-r/MaterialYouNewTab/pull/43)) - Added support for Polish ([@dawid9707](https://github.com/dawid9707)) ([#55](https://github.com/prem-k-r/MaterialYouNewTab/pull/55)) - Corrected the display of Arabic numerals in the digital clock and opacity slider ([@heshamoomar](https://github.com/heshamoomar)) ([#78](https://github.com/prem-k-r/MaterialYouNewTab/pull/78)) - Translation updated for: - Russian ([@giwih](https://github.com/giwih)), ([@Ayyas-RF](https://github.com/Ayyas-RF)) - Spanish ([@zRaidev](https://github.com/zRaidev)) - Arabic ([@heshamoomar](https://github.com/heshamoomar)) - Korean ([@codemaster0524](https://github.com/codemaster0524)) - Japanese ([@kons10](https://github.com/kons10)) - Czech ([@ceskyDJ](https://github.com/ceskyDJ)) - Indonesian ([@Ayyas-RF](https://github.com/Ayyas-RF)) - Hindi ([@prem-k-r](https://github.com/prem-k-r)) - Bengali ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)) ### Other - Docs: Added dark mode to privacy policy page ([@itz-rj-here](https://github.com/itz-rj-here)) ([#32](https://github.com/prem-k-r/MaterialYouNewTab/pull/32)) - Chores ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)) ## [v3.2](https://github.com/XengShi/materialYouNewTab/compare/v3...v3.2) - July 20, 2025 ### Added - Added GPS-based dynamic location option for weather updates ([@prem-k-r](https://github.com/prem-k-r)) ([#331](https://github.com/XengShi/materialYouNewTab/pull/331)) - Added Claude to the list of AI Tools ([@prem-k-r](https://github.com/prem-k-r)) ([#424](https://github.com/XengShi/materialYouNewTab/pull/424)) - Added Dark Mode feature for all Color Themes ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#465](https://github.com/XengShi/materialYouNewTab/pull/465)) - Enabled vertical scroll to also control horizontal scrolling for AI Tools ([@prem-k-r](https://github.com/prem-k-r)) ([#495](https://github.com/XengShi/materialYouNewTab/pull/495)) - Added Discord shortcut ([@prem-k-r](https://github.com/prem-k-r)) ([185a981](https://github.com/XengShi/materialYouNewTab/pull/523/commits/185a98128ab0a066d0002c074df1bfb6212c638d)) - Added option to hide weather widgets ([@Viral-Sachde](https://github.com/Viral-Sachde)), ([@prem-k-r](https://github.com/prem-k-r)) ([#535](https://github.com/XengShi/materialYouNewTab/pull/535)) - Added option to edit bookmark name and URL ([@prem-k-r](https://github.com/prem-k-r)) ([#541](https://github.com/XengShi/materialYouNewTab/pull/541)) - Added DeepSeek to the list of AI Tools ([@prem-k-r](https://github.com/prem-k-r)) ([#544](https://github.com/XengShi/materialYouNewTab/pull/544)) - Replaced default alert and confirm dialog boxes with a custom modal, including default keypress behavior ([@prem-k-r](https://github.com/prem-k-r)) ([#545](https://github.com/XengShi/materialYouNewTab/pull/545)) - Set the browser's current default search engine as the selectable engine ([@prem-k-r](https://github.com/prem-k-r)) ([#479](https://github.com/XengShi/materialYouNewTab/pull/479)) - Added option for sorting by date added in bookmarks ([@hasanakhiar](https://github.com/hasanakhiar)) ([#571](https://github.com/XengShi/materialYouNewTab/pull/571)) - Added Motivational Quotes feature ([@prem-k-r](https://github.com/prem-k-r)), ([@XengShi](https://github.com/XengShi)), ([@Thunder-Blaze](https://github.com/Thunder-Blaze)), ([@itz-rj-here](https://github.com/itz-rj-here)) ([#570](https://github.com/XengShi/materialYouNewTab/pull/570)) - Added search mode categorization: 'Search With' search engines and 'Search On' platforms ([@ashesbloom](https://github.com/ashesbloom)), ([@prem-k-r](https://github.com/prem-k-r)), ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#474](https://github.com/XengShi/materialYouNewTab/pull/474)) - Added Wikipedia and Google Images to the list of search engines ([@prem-k-r](https://github.com/prem-k-r)) ([43aaf55](https://github.com/XengShi/materialYouNewTab/pull/474/commits/43aaf55f61affffa9fe5133d9ad1507e2c14a660)) - Added Tips ([@XengShi](https://github.com/XengShi)), ([@prem-k-r](https://github.com/prem-k-r)) ([0190dee](https://github.com/XengShi/materialYouNewTab/commit/0190dee9e0adfb5e4f68afa8529317eb6810d311)), ([#585](https://github.com/XengShi/materialYouNewTab/pull/585)), ([#589](https://github.com/XengShi/materialYouNewTab/pull/589)) - Added Reddit and Quora as Search Platforms ([@prem-k-r](https://github.com/prem-k-r)) ([#593](https://github.com/XengShi/materialYouNewTab/pull/593)) - Added option to hide Clock ([@XengShi](https://github.com/XengShi)), ([@prem-k-r](https://github.com/prem-k-r)) ([23cd5a8](https://github.com/XengShi/materialYouNewTab/commit/23cd5a86759d11944f447f4f448a710ccfe4d9fc)), ([#599](https://github.com/XengShi/materialYouNewTab/pull/599)) - Added location suggestion dropdown with real-time search feature ([@prem-k-r](https://github.com/prem-k-r)) ([#609](https://github.com/XengShi/materialYouNewTab/pull/609)) - Added option to show Minimun-Maximum temperature instead of Feels like ([@prem-k-r](https://github.com/prem-k-r)) ([#615](https://github.com/XengShi/materialYouNewTab/pull/615)) - Added Grok and Qwen to the list of AI Tools ([@prem-k-r](https://github.com/prem-k-r)) ([#624](https://github.com/XengShi/materialYouNewTab/pull/624)) - Added the ability to choose which AI shortcuts to display and set the order in which they appear ([@prem-k-r](https://github.com/prem-k-r)) ([#624](https://github.com/XengShi/materialYouNewTab/pull/624)) - Added transparency effect to widgets interface when wallpaper is set ([@prem-k-r](https://github.com/prem-k-r)) ([#660](https://github.com/XengShi/materialYouNewTab/pull/660)) - Interactive transparency adjustment slider ([@tahirahmad01](https://github.com/TahirAhmad01)) ([#670](https://github.com/XengShi/materialYouNewTab/pull/670)), ([@prem-k-r](https://github.com/prem-k-r)) ([#678](https://github.com/XengShi/materialYouNewTab/pull/678)) - Added Multilingual Support for Motivational Quotes ([@prem-k-r](https://github.com/prem-k-r)) ([#683](https://github.com/XengShi/materialYouNewTab/pull/683)) - Added toggle to hide or show location in the location tile ([@prem-k-r](https://github.com/prem-k-r)) ([#685](https://github.com/XengShi/materialYouNewTab/pull/685)) - Added drag and drop functionality for reordering shortcuts ([@prem-k-r](https://github.com/prem-k-r)) ([#695](https://github.com/XengShi/materialYouNewTab/pull/695)) - Added edit functionality for todo list ([@GauravKukreti](https://github.com/GauravKukreti)) ([#719](https://github.com/XengShi/materialYouNewTab/pull/719)) ### Changed - Weather retention time set to 7.25 minutes for user-entered API keys and 16 minutes otherwise ([@prem-k-r](https://github.com/prem-k-r)) ([#428](https://github.com/XengShi/materialYouNewTab/pull/428)) - Changed default Vietnamese font to 'Be Vietnam Pro' ([@prem-k-r](https://github.com/prem-k-r)) ([#442](https://github.com/XengShi/materialYouNewTab/pull/442)) - Improved date format for Japanese and Korean ([@prem-k-r](https://github.com/prem-k-r)), ([@dempavof](https://github.com/dempavof)) ([#529](https://github.com/XengShi/materialYouNewTab/pull/529)) - Updated toggle switch design; adjusted the inner thumb size based on state and reduced animation speed ([@vchib1](https://github.com/vchib1)) ([#558](https://github.com/XengShi/materialYouNewTab/pull/558)) - Reduced radio buttons size in search engines ([@vchib1](https://github.com/vchib1)), ([@prem-k-r](https://github.com/prem-k-r)) - Added throttle to Reddit search suggestions to prevent hitting rate limits during rapid typing ([@prem-k-r](https://github.com/prem-k-r)) ([#626](https://github.com/XengShi/materialYouNewTab/pull/626)) - Made host permissions optional (used for search suggestions) ([@prem-k-r](https://github.com/prem-k-r)) ([#709](https://github.com/XengShi/materialYouNewTab/pull/709)) ### Improved - Adaptive icon now matches the theme color ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#435](https://github.com/XengShi/materialYouNewTab/pull/435)), ([@prem-k-r](https://github.com/prem-k-r)) ([#477](https://github.com/XengShi/materialYouNewTab/pull/477)) - Mic icon now hides properly, providing more space for queries ([@prem-k-r](https://github.com/prem-k-r)) ([#450](https://github.com/XengShi/materialYouNewTab/pull/450)) - Smoothed Close button animation ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#454](https://github.com/XengShi/materialYouNewTab/pull/454)) - Made the website responsive for better mobile usability ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#453](https://github.com/XengShi/materialYouNewTab/pull/453)) - Search engines dropdown now closes when an option is selected ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#453](https://github.com/XengShi/materialYouNewTab/pull/453)) - Shortcuts now scroll within their container instead of the whole screen when spanning multiple lines ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#453](https://github.com/XengShi/materialYouNewTab/pull/453)) - Improved keyboard and mouse interactions: clearing selected state when dropdown opens, preventing scrolling with arrow keys, ensuring Enter and clicks switch search engines, close the dropdown, and focus on the search input, including for the search engine radio buttons. ([@prem-k-r](https://github.com/prem-k-r)) ([#483](https://github.com/XengShi/materialYouNewTab/pull/483)) - Updated color picker shades for custom colors ([@prem-k-r](https://github.com/prem-k-r)) ([#493](https://github.com/XengShi/materialYouNewTab/pull/493)) - Updated new tab favicon ([@XengShi](https://github.com/XengShi)), ([@prem-k-r](https://github.com/prem-k-r)) - Enhanced weather icons by using 128x128px images instead of 64x64px ([@prem-k-r](https://github.com/prem-k-r)), ([@ceskyDJ](https://github.com/ceskyDJ)) ([#533](https://github.com/XengShi/materialYouNewTab/pull/533)) - Styled each shortcut as a separate card with a background color in the Edit Shortcuts list ([@prem-k-r](https://github.com/prem-k-r)) ([#536](https://github.com/XengShi/materialYouNewTab/pull/536)) - Added Throttle in Color Picker input for performance optimization ([@prem-k-r](https://github.com/prem-k-r)) ([#511](https://github.com/XengShi/materialYouNewTab/pull/511)) - Added 5 more shared WeatherAPI keys ([@prem-k-r](https://github.com/prem-k-r)) ([916e3d6](https://github.com/XengShi/materialYouNewTab/pull/609/commits/916e3d6bd49c10fde9c2f24ac61a0570922c5c3a)) - Made AI tools shortcut icons a bit larger ([@prem-k-r](https://github.com/prem-k-r)) ([27c592f](https://github.com/XengShi/materialYouNewTab/pull/624/commits/27c592fecbdf0c440fc750ea7503c060e4c4deaf)) - Enhanced 'Sort by' and 'View as' buttons UI ([@prem-k-r](https://github.com/prem-k-r)) ([#635](https://github.com/XengShi/materialYouNewTab/pull/635)) - Enhanced Google apps and Todo list UI ([@XengShi](https://github.com/XengShi)) ([bff0a40](https://github.com/XengShi/materialYouNewTab/commit/bff0a4012ab8e05bc177dfdc1f3c7189be763a54)), ([@prem-k-r](https://github.com/prem-k-r)) - New shortcut now auto-scrolls into view and focuses on URL input; and smooth scrolling for all scrollable areas ([@prem-k-r](https://github.com/prem-k-r)) ([#638](https://github.com/XengShi/materialYouNewTab/pull/638)) - Added confirmation alert before resetting shortcuts ([@prem-k-r](https://github.com/prem-k-r)) ([#657](https://github.com/XengShi/materialYouNewTab/pull/657)) - Use browser-cached bookmark favicons ([@prem-k-r](https://github.com/prem-k-r)) ([#710](https://github.com/XengShi/materialYouNewTab/pull/710)) - Improved search suggestions keyboard and mouse navigation ([@prem-k-r](https://github.com/prem-k-r)) ([#723](https://github.com/XengShi/materialYouNewTab/pull/723)) ### Removed - Removed extension icon change ([@XengShi](https://github.com/XengShi)) - Removed Instagram shortcut ([@prem-k-r](https://github.com/prem-k-r)) ([185a981](https://github.com/XengShi/materialYouNewTab/pull/523/commits/185a98128ab0a066d0002c074df1bfb6212c638d)) - Removed the vertical line that was present after 'Search With' ([@prem-k-r](https://github.com/prem-k-r)) - Removed the invalid URL syntax check for shortcuts ([@prem-k-r](https://github.com/prem-k-r)) ([aa63c4a](https://github.com/XengShi/materialYouNewTab/pull/622/commits/aa63c4a0ee10c44baf63c22acf637ffb11621416)) ### Fixed - Fixed issue where search suggestions were partially hidden behind shortcuts on smaller screen heights ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#407](https://github.com/XengShi/materialYouNewTab/pull/407)) - Fixed issue where keyboard shortcuts were active in custom text box ([@prem-k-r](https://github.com/prem-k-r)) ([fa30642](https://github.com/XengShi/materialYouNewTab/pull/413/commits/fa3064253c45cdedb0d95618a97e66ce39a67ad3)) - Removed slight white boundaries around shortcut icons and the Close button ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#454](https://github.com/XengShi/materialYouNewTab/pull/454)) - Fixed issue with bookmarks toggle on unsupported devices ([@Thunder-Blaze](https://github.com/Thunder-Blaze)), ([@prem-k-r](https://github.com/prem-k-r)) - Fixed display issue when there are fewer than five search suggestions ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#453](https://github.com/XengShi/materialYouNewTab/pull/453)) - Custom text no longer overlaps the clock and is now limited to 2 lines, becoming scrollable beyond that ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#467](https://github.com/XengShi/materialYouNewTab/pull/467)) - Resolved issues where weather details sometimes failed to display properly ([@prem-k-r](https://github.com/prem-k-r)) - Centered shortcut names correctly when the width is 1–2 characters ([@prem-k-r](https://github.com/prem-k-r)) ([06bb4ca](https://github.com/XengShi/materialYouNewTab/pull/496/commits/06bb4cabe66b278a517483358519cc3c66232b90)) - Limited shortcut title width to prevent overflow onto other shortcuts ([@Thunder-Blaze](https://github.com/Thunder-Blaze)) ([#497](https://github.com/XengShi/materialYouNewTab/pull/497)) - Fixed AM/PM display error in certain languages when 12-hour format is enabled ([@shmps40802](https://github.com/shmps40802)) ([#500](https://github.com/XengShi/materialYouNewTab/pull/500)) - Fixed bug where shortcut reset animation occurred only alternately; now it works every time ([@prem-k-r](https://github.com/prem-k-r)) ([c4cdd6c](https://github.com/XengShi/materialYouNewTab/pull/536/commits/c4cdd6c8719937b9fa93afc76cd111a94cf61350)) - Corrected off-center Google menu icon alignment on certain devices ([@vchib1](https://github.com/vchib1)) ([#558](https://github.com/XengShi/materialYouNewTab/pull/558)) - Fixed delayed radio button animation when hiding search engines ([@vchib1](https://github.com/vchib1)) ([#558](https://github.com/XengShi/materialYouNewTab/pull/558)) - Fixed disabled Save button in Edit Bookmark not re-enabling after entering URL ([@prem-k-r](https://github.com/prem-k-r)) ([#635](https://github.com/XengShi/materialYouNewTab/pull/635)) - Fixed inactive Add Shortcut button after resetting maxed-out shortcuts ([@prem-k-r](https://github.com/prem-k-r)) ([#638](https://github.com/XengShi/materialYouNewTab/pull/638)) - Prevent repeated toggle of bookmark on RightArrow key hold ([@prem-k-r](https://github.com/prem-k-r)) ([45ebd54](https://github.com/XengShi/materialYouNewTab/pull/669/commits/45ebd54a0767427f5c2b0b12a735d35f446eba3c)) - Prevent flash of default blue color on page load when using custom theme from color picker ([@prem-k-r](https://github.com/prem-k-r)) ([#708](https://github.com/XengShi/materialYouNewTab/pull/708)) ### Localized - Added support for Hungarian ([@Zan1456](https://github.com/Zan1456)) ([#420](https://github.com/XengShi/materialYouNewTab/pull/420)) - Added support for Nepali ([@sthaB-kash](https://github.com/sthaB-kash)) ([#452](https://github.com/XengShi/materialYouNewTab/pull/452)) - Added support for Traditional Chinese ([@shmps40802](https://github.com/shmps40802)) ([#499](https://github.com/XengShi/materialYouNewTab/pull/499)) - Added support for Urdu ([@prem-k-r](https://github.com/prem-k-r)), ([@asfand-dev](https://github.com/asfand-dev)) ([#548](https://github.com/XengShi/materialYouNewTab/pull/548)) - Added support for German ([@prem-k-r](https://github.com/prem-k-r)) ([#641](https://github.com/XengShi/materialYouNewTab/pull/641)) - Added support for Persian ([@AMIRHOSSEIN-AHMADI-IR](https://github.com/AMIRHOSSEIN-AHMADI-IR)) ([#645](https://github.com/XengShi/materialYouNewTab/pull/645)) - Added support for Arabic ([@Mazen3Alharbi](https://github.com/Mazen3Alharbi)) ([#659](https://github.com/XengShi/materialYouNewTab/pull/659)) - Added support for Greek ([@trlef19](https://github.com/trlef19)) ([#674](https://github.com/XengShi/materialYouNewTab/pull/674)) - Added support for Tamil ([@TamilNeram](https://github.com/TamilNeram)) ([#682](https://github.com/XengShi/materialYouNewTab/pull/682)) - Added support for Thai ([@prinsasina](https://github.com/prinsasina)) ([#702](https://github.com/XengShi/materialYouNewTab/pull/702)) - Translation updated for: - Hindi ([@prem-k-r](https://github.com/prem-k-r)) - Bengali ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)) - Vietnamese ([@Tuan1-2-3](https://github.com/Tuan1-2-3)) - French ([@iamwinner422](https://github.com/iamwinner422)) - Italian ([@ZiClaud](https://github.com/ZiClaud)) - Czech ([@ceskyDJ](https://github.com/ceskyDJ)) - Indonesian ([@Ayyas-RF](https://github.com/Ayyas-RF)) - Marathi ([@prem-k-r](https://github.com/prem-k-r)) - Turkish ([@kerimlcr](https://github.com/kerimlcr)) - Portuguese (Brazil) ([@MestreWalla](https://github.com/MestreWalla)) - Russian ([@giwih](https://github.com/giwih)) - Japanese ([@kons10](https://github.com/kons10)) - Simplified Chinese ([@kons10](https://github.com/kons10)) ### Other - Updated documentations ([@prem-k-r](https://github.com/prem-k-r)), ([@itz-rj-here](https://github.com/itz-rj-here)), ([@ZiClaud](https://github.com/ZiClaud)) - Refactored code ([@ZiClaud](https://github.com/ZiClaud)), ([@prem-k-r](https://github.com/prem-k-r)) - Chores ([@XengShi](https://github.com/XengShi)), ([@itz-rj-here](https://github.com/itz-rj-here)), ([@prem-k-r](https://github.com/prem-k-r)) --- ## [v3](https://github.com/XengShi/materialYouNewTab/compare/v2.4...v3) - Dec 28, 2024 ## [v2.4](https://github.com/XengShi/materialYouNewTab/compare/v2.3...v2.4) - Nov 26, 2024 ## [v2.3](https://github.com/XengShi/materialYouNewTab/compare/v2.2...v2.3) - Nov 1, 2024 ## [v2.2](https://github.com/XengShi/materialYouNewTab/compare/v2.0...v2.2) - Oct 23, 2024 ## [v2.0](https://github.com/XengShi/materialYouNewTab/compare/v1.1...v2.0) - Oct 11, 2024 ## v1.1 - Oct 2, 2024 ## v1 - Aug 20, 2023 ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at . Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at . Translations are available at . ================================================ FILE: CONTRIBUTING.md ================================================ # Contribution Guidelines We welcome all developers to contribute to our extension! Your efforts are truly appreciated. To ensure smooth collaboration, please keep the following points in mind before submitting your pull requests: ## 1. Add Only Relevant Code - Avoid unnecessary modifications to existing code, including formatting changes. - Refrain from using options like "Format Document" in editors like VS Code, as these changes make it difficult to review the actual modifications. ## 2. Provide Visual Context - Always attach a screenshot or screen recording of your changes in action. - Include a detailed description of the changes and their purpose in the pull request. ## 3. Follow Code Style Guidelines - Stick to the existing coding style and structure of the project. - Use consistent indentation and naming conventions. ## 4. Avoid Adding Unnecessary Dependencies - Before adding any library or dependency, explain its purpose and confirm that it's essential for the functionality you're implementing. ## 5. Test Thoroughly - Ensure that your changes are fully functional and do not introduce any bugs or performance issues. - Test your code on various screen sizes and scenarios if applicable. ## 6. Test Across Browsers - Test your code in both **Chrome** and **Firefox** to ensure compatibility and that everything is working properly. ## 7. Keep Pull Requests Focused - Focus on one feature or fix per pull request. Avoid bundling unrelated changes together. ## 8. Document Changes - If your changes introduce new functionality, update any relevant documentation or provide notes for other contributors. By following these guidelines, we can maintain a clean and efficient codebase while making the review process faster and easier for everyone. Thank you for your contributions and for helping improve this project! ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Material You New Tab: A browser extension that replaces your default New Tab or homepage with a sleek, modern interface inspired by Google’s Material You design. Copyright (C) 2023-2025 XengShi Copyright (C) 2024-2026 Prem This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Material You New Tab Copyright (C) 2024-2026 Prem, 2023-2025 XengShi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================


MYNT: Material You New Tab

MYNT: Material You New Tab is a versatile browser extension that personalizes your New Tab page with customizable themes, a welcoming message, and various handy tools, all while integrating seamlessly with your preferred search engine.
![License](https://img.shields.io/github/license/prem-k-r/MaterialYouNewTab) ![Last Commit](https://img.shields.io/github/last-commit/prem-k-r/MaterialYouNewTab) ![GitHub contributors](https://img.shields.io/github/contributors/prem-k-r/MaterialYouNewTab) ![GitHub stars](https://img.shields.io/github/stars/prem-k-r/MaterialYouNewTab) ![GitHub forks](https://img.shields.io/github/forks/prem-k-r/MaterialYouNewTab) [![](https://img.shields.io/chrome-web-store/v/jjpokbgpiljgndebfoljdeihhkpcpfgl.svg)](https://chrome.google.com/webstore/detail/mynt-material-you-new-tab/jjpokbgpiljgndebfoljdeihhkpcpfgl) [![](https://img.shields.io/chrome-web-store/rating/jjpokbgpiljgndebfoljdeihhkpcpfgl.svg)](https://chrome.google.com/webstore/detail/mynt-material-you-new-tab/jjpokbgpiljgndebfoljdeihhkpcpfgl) [![](https://img.shields.io/chrome-web-store/users/jjpokbgpiljgndebfoljdeihhkpcpfgl.svg)](https://chrome.google.com/webstore/detail/mynt-material-you-new-tab/jjpokbgpiljgndebfoljdeihhkpcpfgl) ▪️ [![](https://img.shields.io/amo/v/mynt.svg)](https://addons.mozilla.org/en-US/firefox/addon/mynt/) [![](https://img.shields.io/amo/rating/mynt.svg)](https://addons.mozilla.org/en-US/firefox/addon/mynt/) [![](https://img.shields.io/amo/users/mynt.svg)](https://addons.mozilla.org/en-US/firefox/addon/mynt/) ▪️ [![](https://img.shields.io/badge/dynamic/json?label=edge%20add-on&prefix=v&query=%24.version&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Flcgdmfjofmcblocogcabdpfidfbkblcd)](https://microsoftedge.microsoft.com/addons/detail/mynt-material-you-new-ta/lcgdmfjofmcblocogcabdpfidfbkblcd) [![](https://img.shields.io/badge/dynamic/json?label=rating&suffix=/5&query=%24.averageRating&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Flcgdmfjofmcblocogcabdpfidfbkblcd)](https://microsoftedge.microsoft.com/addons/detail/mynt-material-you-new-ta/lcgdmfjofmcblocogcabdpfidfbkblcd) [![](https://img.shields.io/badge/dynamic/json?label=users&query=%24.activeInstallCount&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Flcgdmfjofmcblocogcabdpfidfbkblcd)](https://microsoftedge.microsoft.com/addons/detail/mynt-material-you-new-ta/lcgdmfjofmcblocogcabdpfidfbkblcd)

FeaturesInstallation GuideDownloadCurrently Supported Languages
ContributingStar HistoryIssues and SupportPrivacy PolicyLicense

Screenshot 1 #### 🔴 🟡 🟢 Test live: [https://prem-k-r.github.io/MaterialYouNewTab/](https://prem-k-r.github.io/MaterialYouNewTab/) ## ✨ Features - **Integrated Search**: Search directly from the New Tab using your preferred search engine — Google, DuckDuckGo, Bing, Brave Search, YouTube, Wikipedia, and more, with integrated voice typing. - **Customizable Themes**: Choose from a selection of themes or use the built-in color picker to match your style. - **Wallpaper**: Upload your own wallpapers or enable daily random images sourced from [Lorem Picsum](https://picsum.photos). - **Personalized Greeting**: Add a custom message or your name, so you're greeted each time you open a new tab. - **Clock & Time Display**: Choose between a modern analog or digital clock. - **Live Weather Updates**: View real-time temperature, conditions, humidity, feels like, and max-min temperature values. Supports °C and °F with location customization. - **Quick Shortcuts**: Access common platforms (YouTube, Email, WhatsApp, etc.) or add your own shortcuts for instant navigation. - **AI Tools**: Open ChatGPT, Gemini, Copilot, Perplexity, Claude, DeepSeek, and more with one click. - **To-Do List**: Manage daily tasks, pin important ones, and enjoy automatic cleanup at the start of each day (pinned tasks reset to pending). - **Sidebar Bookmarks**: View, delete, and organize bookmarks in either list or grid layout. - **Google Apps**: Quickly launch Gmail, Drive, Docs, and other Google services. - **Backup & Reset**: Save or restore your setup anytime, or reset everything to default with one click. - **Language Support**: Use the extension in your preferred language for better accessibility. - **Browser Compatibility**: Supports all Chromium-based browsers, including **Chrome**, **Edge**, **Brave**, and **Opera**, as well as Firefox-based browsers like **Firefox** and **Zen**. ## 📥 Installation Guide ### Download 1. **Development Version** (v3.3.*) - **Clone the Repository**: Use the following command to clone the repository: ```bash git clone https://github.com/prem-k-r/MaterialYouNewTab.git ``` - Alternatively, download the latest version as a ZIP file by clicking below: [![Download ZIP](https://img.shields.io/badge/Download-ZIP-blue.svg)](https://github.com/prem-k-r/MaterialYouNewTab/archive/refs/heads/main.zip) - You can also download the ZIP file by clicking on the Code button. On the repository page, look for a green button labeled **Code**. Click on the **Code** button, and in the dropdown menu, select **Download ZIP**. 2. **Stable Release** (v3.3)

Download from GitHub Download from Chrome Web Store Download from Microsoft Edge Download from Mozilla Add-ons

--- ### Installation #### ![Chromium](https://img.icons8.com/?size=20&id=104996&format=png&color=000000) Chromium-Based Browsers 1. **Install from [Chrome Web Store](https://chromewebstore.google.com/detail/mynt-material-you-new-tab/jjpokbgpiljgndebfoljdeihhkpcpfgl) or [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/mynt-material-you-new-ta/lcgdmfjofmcblocogcabdpfidfbkblcd)**: **Or** follow the manual steps below: 2. **Manual Installation**: - **Prepare the Extension Folder**: - Ensure you’ve cloned the repository or downloaded the ZIP file and extracted it. - **Open Extensions Page**: Open your preferred browser and enter the following text in the address bar: - ![Chrome](https://img.icons8.com/color/20/000000/chrome--v1.png) Chrome: `chrome://extensions` - ![Edge](https://img.icons8.com/?size=20&id=dGm9KIZPpukc&format=png&color=000000) Edge: `edge://extensions` - ![Brave](https://img.icons8.com/color/20/000000/brave-web-browser.png) Brave: `brave://extensions` - ![Opera](https://img.icons8.com/color/20/000000/opera--v1.png) Opera: `opera://extensions` - **Enable Developer Mode**: - Turn on **Developer Mode** in the extensions page. - **Load Unpacked Extension**: - Click on **Load unpacked** and select your extracted extension folder. 3. **Additional Steps ONLY for Opera (or Opera GX)**: > [!NOTE] > Opera does **not support replacing the default New Tab**. > This method only sets the extension as a **startup page**.
Click here for the workaround - Go to the **Settings**. - Scroll to the **On startup** section (use the search option if needed). - Click on **Open a specific page or set of pages** and then click on **Add a new page**. - Add the following (replace 32-character extension ID if installed manually) to the **Site URL**: ```text chrome-extension://jjpokbgpiljgndebfoljdeihhkpcpfgl/index.html ``` - To find the extension ID: - Go to `opera://extensions`, find the extension, and copy the 32-character ID from its details. - To simulate new tabs: - Bookmark the extension page to access new tab pages manually. - Or, right-click the tab and select **Duplicate tab**.
Below are screenshots of the process to guide you through each step visually. Screenshot 1 Screenshot 2 Screenshot 3 --- #### ![Firefox](https://img.icons8.com/color/20/000000/firefox--v1.png) Firefox 1. **Install from [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/addon/mynt/)** Screenshot 2. **Update the Homepage**: - Open Firefox and **obtain the UUID**: - Hover over the New Tab button (next to the tab close button). A tooltip will display the extension's unique ID, which looks like this: `0f31e1c1-d63c-4660-b950-8bfbda3bb20a`. Copy or note this ID. - Alternatively, type `about:debugging#/runtime/this-firefox` in the address bar and find the extension's UUID there. - Open **Settings** and navigate to **Home**, or type `about:preferences#home` in the address bar. - Under the **Homepage and new windows** section, select **Custom URLs...**. - Paste the following URL, replacing the ID with your actual UUID: ```text moz-extension://e31d6701-f699-414f-bb4c-8fde495c432e/index.html ``` - This will update both your homepage and new tab to the extension. 3. **Additional Steps ONLY for Zen Browser** : - Open a new tab and go to `about:config`. - Accept the risk and continue if prompted. - In the search bar, type: ```text zen.urlbar.replace-newtab ``` - Set its value to **false** by clicking the toggle icon. This ensures the browser does not override the custom New Tab page set by the extension. 4. **Manual Installation (Temporary)**: - Clone the repository or download and extract the ZIP file. - **Prepare the Manifest**: - Delete the existing `manifest.json` file. - Rename `manifest(firefox).json` to `manifest.json`. - **Load Temporary Add-on**: - Go to `about:debugging#/runtime/this-firefox`, select **"This Firefox"**, then click **Load Temporary Add-on**. - Browse and select the updated `manifest.json`. --- ## 🌐 Currently Supported Languages (32) | Language | Code | Translator(s) | | -------------------------------------------------------------------------------------------- | :---: | ------------------------------------------------------------------------------------- | |   **English** | en | [XengShi](https://github.com/XengShi/), [Prem](https://github.com/prem-k-r/) | |   **Arabic** - العربية | ar-SA | [Mazen](https://github.com/Mazen3Alharbi) | |   **Azerbaijani** - Azərbaycanca | az | [Hasan Bakhtiar](https://github.com/hasanbakhtiar/) | |   **Bangla** - বাংলা | bn | [It'z RJ](https://github.com/itz-rj-here/), [Prem](https://github.com/prem-k-r/) | |   **Chinese** (Simplified) - 简体中文 | zh-CN | [Guy Berryman](https://github.com/Guy-Berryman), [Tianli](https://github.com/TIANLI0), [Konsento](http://github.com/kons10) | |   **Chinese** (Traditional) - 繁體中文 | zh-TW | [C. Y. Tseng](https://github.com/Eddie40802) | |   **Czech** - Čeština | cz | [Michal Šmahel](https://github.com/ceskyDJ/) | |   **French** - Français | fr | [422.io](https://github.com/iamwinner422) | |   **German** - Deutsch | de | [Prem](https://github.com/prem-k-r/) | |   **Greek** - Ελληνικά | el | [Lefteris T.](https://github.com/trlef19) | |   **Hindi** - हिंदी | hi | [XengShi](https://github.com/XengShi/), [Prem](https://github.com/prem-k-r/) | |   **Hungarian** - Magyar | hu | [Zan1456](https://github.com/Zan1456/), [smurf11k](https://github.com/smurf11k/) | |   **Indonesian** - Bahasa Indonesia | idn | [Ayyas-RF](https://github.com/Ayyas-RF/) | |   **Italian** - Italiano | it | [Claudio Di Maio](https://github.com/ZiClaud/) | |   **Japanese** - 日本語 | ja | [XengShi](https://github.com/XengShi/), [S-H-Y-A](https://github.com/S-H-Y-A/), [Konsento](http://github.com/kons10) | |   **Korean** - 한국어 | ko | [XengShi](https://github.com/XengShi/), [eunsunglee0524](https://github.com/eunsunglee0524/) | |   **Marathi** - मराठी | mr | [Prem](https://github.com/prem-k-r/), [Pratik Lokhande](https://github.com/konprtk), [Anand Naik Gaonkar](https://github.com/anndiy) | |   **Nepali** - नेपाली | ne | [Bikash Shresha](https://github.com/sthaB-kash/) | |   **Persian** - فارسی | fa | [AMIRHOSSEIN](https://github.com/AMIRHOSSEIN-AHMADI-IR) | |   **Polish** - Polski | pl | [Dawid Warkowski](https://github.com/dawid9707/) | |   **Portuguese** - Português | pt-BR | [Maycon Vitor Correa](https://github.com/MestreWalla/) | |   **Russian** - Русский | ru | [giwi](https://github.com/giwih/), [CodWiz](https://github.com/C0dwiz/) | |   **Slovenian** - Slovenščina | sl-SI | [Linux-Alex](https://github.com/Linux-Alex/) | |   **Spanish** - Español | es-ES | [XengShi](https://github.com/XengShi/), [Isaac Vergara](https://github.com/zRaidev), [Saúl Palacios](https://github.com/palacios22c) | |   **Swedish** - Svenska | sv | [HELLOEMPO](https://github.com/empohello-imamempogitub/) | |   **Tamil** - தமிழ் | ta | [தமிழ்நேரம்](https://TamilNeram.github.io/) | |   **Thai** - ภาษาไทย | th | [Prin](https://github.com/prinsasina) | |   **Turkish** - Türkçe | tr | [Nobody](https://github.com/Nobody9512), [Kerim Ölçer](https://github.com/kerimlcr) | |   **Ukrainian** - Українська | uk | [Serhii Lozytskyi](https://github.com/lozik4), [smurf11k](https://github.com/smurf11k/) | |   **Urdu** - اردو | ur | [Asfandiyar Khan](https://github.com/asfand-dev) | |   **Uzbek** - O'zbek | uz | [Firdavs](https://github.com/Firdavs9512/), [S0ME2](https://github.com/S0ME2/) | |   **Vietnamese** - Tiếng Việt | vn | [Diep](https://github.com/diepdo1810/), [Tuan](https://github.com/Tuan1-2-3) | Check the [Translation Status Page](https://prem-k-r.github.io/MaterialYouNewTab/tools/languagesAnalysis.html) for an overview of completed languages and missing strings analysis. If you'd like to contribute quotes in any of the languages used in MYNT, check out [Multilingual Quotes](https://github.com/prem-k-r/multilingual-quotes-api). ## 🤝 Contributing Contributions are welcome! If you’d like to contribute: 1. Follow the guidelines in the [CONTRIBUTING.md](./CONTRIBUTING.md) file. 2. Fork the repository. 3. Create a new branch: `git checkout -b feature/YourFeature`. 4. Commit your changes: `git commit -m 'Add Your Feature'`. 5. Push to the branch: `git push origin feature/YourFeature`. 6. Open a pull request. ## ⭐ Star History Here is the star history chart for the **MYNT: Material You New Tab** repository. It shows the growth of stars over time, reflecting the increasing interest and support for the project. Star History Chart ## ❓ Issues and Support - If you encounter any issues or bugs, feel free to open an issue on [GitHub](https://github.com/prem-k-r/MaterialYouNewTab/issues). - For general questions or support, you can contact the repository maintainers through the **Telegram group**: [Join here](https://t.me/Material_You_NewTab). ## 🛡 Privacy Policy MYNT: Material You New Tab prioritizes your privacy and is focused solely on providing a better browsing experience. We make the following commitments: - **No commercialization** — absolutely no ads, paid features, or premium tiers - **No trackers** — no data collection, analytics, or background reporting of any kind - **No access to personal information** — all settings, cache, and preferences are stored locally in your browser For more details, read our [Privacy Policy](https://prem-k-r.github.io/MaterialYouNewTab/privacy-policy.html). ## 📜 License Copyright (C) 2024-2026 Prem Kumar Copyright (C) 2023-2025 XengShi > This extension is the continuation of XengShi's Material You NewTab [(_Learn more_)](https://github.com/prem-k-r/MaterialYouNewTab/discussions/28#discussioncomment-13837571). This project is licensed under the GNU General Public License v3.0 (GPL-3.0). This means you must **not** distribute this software, whether original or modified, to any platform **without** its source code or the reference to its original source code. See the [LICENSE](https://github.com/prem-k-r/MaterialYouNewTab/blob/main/LICENSE) file for details. ================================================ FILE: docs/Get_WeatherAPI_Key.html ================================================ WeatherAPI's API Key

How to Obtain a WeatherAPI's API Key

Step 1: Visit the WeatherAPI Website

Navigate to the WeatherAPI official website: https://www.weatherapi.com/.

WeatherAPI Homepage

Step 2: Sign Up for an Account

  1. Click on the Sign Up button located at the top right corner of the homepage.
  2. Fill in the required fields:
    • Email Address: Provide a valid email address.
    • Password: Create a secure password.
  3. Agree to the terms and conditions.
  4. Complete the CAPTCHA verification if prompted.
  5. Click Sign Up to create your account.
Sign Up Form

Note: If you already have an account, click Login and proceed with your credentials.

Step 3: Verify Your Email Address

Check your email inbox for a verification email from WeatherAPI. Open the email and click on the verification link provided.

Tip: Check your spam or junk folder if you don’t see the email in your inbox.

Step 4: Log In to Your Account

  1. Return to the WeatherAPI website.
  2. Click on Login.
  3. Enter your email address and password.
  4. Click Login to access your account.
Login Page

Step 5: Copy Your API Key

  1. Once logged in, go to the Dashboard.
  2. If the API section isn’t open, locate and open it.
  3. You will see your API key displayed with a Copy option. Click it to copy your API key.
Dashboard with API Key

Step 6: Paste Your API Key

  1. Paste your API key into the WeatherAPI key field in the extension menu.
  2. Press enter or click on the Save button to integrate it.
Paste API Key

FAQs

Why is the location inaccurate?

The extension determines your location using your IP address, which can often be imprecise. If the detected location differs from your actual location, you can:

  • Manually enter your city name or geographic coordinates.
  • Use the GPS option to fetch your location for greater accuracy.

Why do I need an API key?

An API key serves as a unique identifier for managing access and monitoring usage.

  • Our extension currently uses shared API keys that allow up to 15,000,000 calls per month. With over 300,000 active users, these shared keys can reach their limit quickly. Once the limit is reached, weather data will no longer be accessible until the limit resets the following month.
  • Using your own API key ensures that weather data remains accessible.

What are the benefits of using my own API key?

Using your own unique API key provides several key advantages:

  • No Disruption: Using your own API key helps you avoid unexpected limits and ensures there are no disruptions in service, keeping your access to weather data uninterrupted.
  • Location Suggestions:: Enable location search suggestions in the location input field, allowing you to quickly find and select accurate location options as you type.
  • Analytics: Access detailed insights into your API usage with comprehensive reports available through your account dashboard.
  • Privacy: Your API activity is securely tied only to your account, ensuring that your data remains private and protected from unauthorized access.
  • Compliance: Ensure adherence to WeatherAPI's terms of service and usage policies, and avoiding violations.
================================================ FILE: docs/feedback.html ================================================ Feedback - MaterialYouNewTab

We Value Your Feedback

================================================ FILE: index.html ================================================ New Tab
ToDo List
Bookmarks

Bookmarks

Sort by

View as

    Google Apps
    Thu 9 6 : 28 AM
    Click here to edit
    ?
    Seeing a banner at the bottom?
    To hide it, right-click it and select 'Hide Footer on New Tab Page'.
    ================================================ FILE: locales/README.md ================================================ ## Adding a New Translation 1. **Create a New Translation File** - Name the file using the appropriate language code (e.g., `de.js` for German or `ar_SA.js` for Arabic). - Copy the content from `en.js` and paste it into the new file. Translate the strings as needed. - Delete any inline comments meant for instructions. - Place this file in the `locales` directory.
    2. **Add the Locale to `index.html`** - Open `index.html` and locate the `` section. - Add your new locale script tag in chronological order, like this: ```html ``` - Locate the `` section and add the new language option in lexicographical order: ```html ```
    3. **Update Date Format in `clock.js`** - Add the date display for both analog and digital clocks if the format differs from the default, ensuring chronological order. - Follow the local conventions for date formatting. - Ensure the digital clock display is correct regarding the 12-hour mode.
    4. **Add the Locale to `languages.js`** - Add the language to `languages.js` in chronological order. - Check if the `menuWidth` needs to be adjusted. - If the language uses a comma instead of a dot as the decimal separator, make the necessary adjustments in the appropriate array.
    5. **Update the Currently Supported Languages Section in `README.md`** - Add the new language to the list of supported languages in the README, ensuring lexicographical order. - Increase the count by 1 in both the header and the link at the top.
    6. **Add the Locale to `tools/languagesAnalysis.html`** - (You can use this tool to get an overview of missing or extra strings in the language.) - Add the new language script tag in chronological order: ```html ``` - Add the language to the languages object in lexicographical order.
    7. **Subscribe to Translation Updates for Contributors** (Optional) - Join the [discussion channel](https://github.com/prem-k-r/MaterialYouNewTab/discussions/39) or mailing list to receive notifications about new lines being added to translations.
    ### Notes: - **Test the Translation**: Verify that the translations display correctly when the respective locale is selected, including hover texts and alerts. - **Confirm in `weather.js`**: Ensure the humidity value stays on a single line. If it moves to a second line, increase the minimum width. - **Keep Translations Consistent**: Ensure the structure of the new translation file matches existing ones for consistency across locales. - **Additional Considerations**: Some languages may require specific adjustments based on regional needs. --- ### Definitions: - **Lexicographical Order**: Alphabetical order based on the first character of each word. - **Chronological Order**: The order in which languages are added, from the earliest to the most recent. ================================================ FILE: locales/ar_SA.js ================================================ // Arabic const ar_SA = { // Menu Items github: "جيت‌هاب", feedback: "ملاحظات", // Shortcuts shortcutsText: "الاختصارات", enableShortcutsText: "إظهار الاختصارات المحفوظة", editShortcutsText: "تعديل الاختصارات", shortcutsInfoText: "اختر الاختصارات التي تريد عرضها", editShortcutsList: "الاختصارات المحفوظة", editShortcutsListInfo: 'يمكنك إضافة اختصارات جديدة بالنقر على أيقونة "+" أو تعديل الموجودة بالنقر على اسم الاختصار أو عنوان URL الخاص به.', adaptiveIconText: "الأيقونات التكيفية", adaptiveIconInfoText: "تتطابق أيقونات الاختصارات مع لون المظهر وتظهر أصغر", bookmarksText: "الإشارات المرجعية", bookmarksInfo: "إظهار الشريط الجانبي للإشارات المرجعية", ai_tools_button: "أدوات الذكاء الاصطناعي", enable_ai_tools: "إظهار اختصارات أدوات الذكاء الاصطناعي", aiToolsSettingsText: "إعدادات أدوات الذكاء الاصطناعي", aiToolsSettingsInfo: "إدارة اختصارات أدوات الذكاء الاصطناعي", googleAppsMenuText: "تطبيقات جوجل", googleAppsMenuInfo: "إظهار اختصارات تطبيقات جوجل", googleAppsHover: "تطبيقات جوجل", // To-do List todoListText: "قائمة المهام", todoListInfo: "إظهار قائمة المهام اليومية", todoListHover: "قائمة المهام", todoPlaceholder: "أضف مهمة...", // Clock hideClockBox: "إخفاء الساعة", hideClockBoxInfo: "إخفاء الساعة والتاريخ", digitalclocktitle: "الساعة الرقمية", digitalclockinfo: "التبديل إلى الساعة الرقمية", timeformattitle: "تنسيق 12 ساعة", timeformatinfo: "استخدام تنسيق الوقت 12 ساعة", greetingtitle: "الترحيب", greetinginfo: "عرض رسالة ترحيب أسفل النص المخصص", // Misc userTextTitle: "نص قابل للتخصيص", userTextInfo: "عرض نص مخصص أسفل الساعة", fahrenheitCelsiusCheckbox: "التبديل إلى فهرنهايت", fahrenheitCelsiusText: "أعد تحميل الصفحة لتطبيق التغييرات", hideWeatherTitle: "إخفاء الطقس", hideWeatherInfo: "تعطيل أدوات الطقس", hideWeatherBox: "إخفاء بطاقة الطقس", hideWeatherBoxInfo: "إظهار مؤشر درجة الحرارة فقط", minMaxTempText: "درجة الحرارة الأقل - الأعلى", minMaxTempSubText: "استبدال 'درجة الحرارة المحسوسة' بدرجة الحرارة الأقل والأعلى", // Search micIconTitle: "إخفاء أيقونة الميكروفون", micIconInfo: "إذا لم يعمل الكتابة الصوتية", hideSearchWith: "إخفاء محركات البحث", hideSearchWithInfo: "التبديل بين محركات البحث بالنقر على أيقونة محرك البحث", motivationalQuotesText: "اقتباسات تحفيزية", motivationalQuotesInfo: "عرض الاقتباسات أسفل شريط البحث", search_suggestions_button: "اقتراحات البحث", search_suggestions_text: "تمكين اقتراحات البحث", // Proxy useproxytitletext: "تجاوز الوكيل", useproxyText: "إذا لم تعمل اقتراحات البحث", ProxyText: "وكيل تجاوز CORS", ProxySubtext: "أضف وكيل تجاوز CORS الخاص بك", HostproxyButton: "استضافة وكيل شخصي", // Location useGPS: "استخدام GPS", useGPSInfo: "تمكين GPS لتحديث الموقع المباشر", UserLocText: "أدخل موقعك", UserLocSubtext: "إذا كان موقع الطقس غير صحيح", userLoc: "مدينتك أو إحداثياتك (خط العرض، خط الطول)", PrivacyPolicy: "سياسة الخصوصية", // Weather WeatherApiText: "أدخل مفتاح WeatherAPI الخاص بك", WeatherApiSubtext: "إذا لم تعمل وظيفة الطقس", userAPI: "مفتاح WeatherAPI الخاص بك", LearnMoreButton: "تعلم المزيد", saveAPI: "حفظ", // Body Items // Calendar days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], months: [ "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر", ], // Bookmarks bookmarksHeading: "الإشارات المرجعية", bookmarkSortBy: "ترتيب حسب", sortAlphabetical: "أ-ي", sortTimeAdded: "الأقدم-الأحدث", bookmarkViewAs: "عرض كـ", bookmarkViewGrid: "شبكة", bookmarkViewList: "قائمة", bookmarkSearch: "بحث الإشارة المرجعية", editBookmarkHeading: "تعديل الإشارة المرجعية", editBookmarkName: "اسم الإشارة المرجعية", editBookmarkURL: "عنوان URL للإشارة المرجعية", // New Tab Item conditionText: "مرحباً! كيف حالك اليوم؟", humidityLevel: "الرطوبة", feelsLike: "تشعر وكأنه", minMaxTemp: "الحد الأدنى ~ الحد الأقصى", location: "الموقع", enterBtn: "بحث", searchPlaceholder: "اكتب هنا...", listenPlaceholder: "جارٍ الاستماع...", searchWithHint: "البحث باستخدام", searchOnHint: "البحث على", userText: "انقر هنا للتعديل", // Greeting greeting: { morning: "صباح الخير!", afternoon: "مساء الخير!", evening: "مساء الخير!", }, // Search Engines defaultEngine: "افتراضي", googleEngine: "جوجل", duckEngine: "داك‌داك‌جو", bingEngine: "بينج", braveEngine: "بريف", youtubeEngine: "يوتيوب", gImagesEngine: "الصور", redditEngine: "ريديت", wikipediaEngine: "ويكيبيديا", quoraEngine: "كورا", // AI Tools ai_tools: "أدوات الذكاء الاصطناعي", chatGPT: "ChatGPT", gemini: "Gemini", copilot: "Copilot", claude: "Claude", grok: "Grok", qwen: "Qwen", perplexity: "Perplexity", deepseek: "DeepSeek", metaAI: "Meta AI", firefly: "Adobe Firefly", aiSettingsIntro: "اختر أدوات الذكاء الاصطناعي التي تريد عرضها", resetAISettingsBtn: "إعادة تعيين", // Theme "lightThemed": "فاتح", "darkThemed": "داكن", "systemThemed": "النظام", // Wallpaper and settings uploadWallpaperText: "تحميل خلفية", rangColor: "اختر لوناً", backupText: "نسخ احتياطي", restoreText: "استعادة", resetsettings: "إعادة تعيين الإعدادات", menuCloseText: "إغلاق", opacityTitle: "العتامة", adjustOpacityDesc: "ضبط عتامة الواجهة", // Tips switchSearchModes: "تبديل أوضاع البحث", switchSearchModesInfo: "انقر على 'البحث باستخدام' للتبديل بين الأوضاع.", adjustZoom: "ضبط التكبير", adjustZoomInfo: 'اضغط Ctrl + "+" أو Ctrl + "-" لضبط التكبير.', changeBrowserTheme: "تغيير سمة المتصفح", chromeThemeInfo: "انقر على النقاط الثلاث (⋮) > المزيد من الأدوات > تخصيص Chrome، ثم اختر لوناً يتناسب مع سمة الإضافة.", edgeThemeInfo: "انتقل إلى الإعدادات > المظهر، ثم اختر لوناً يتناسب مع سمة الإضافة.", braveThemeInfo: 'قم بزيارة متجر سمات Chrome، قم بتنزيل وتطبيق سمة تتناسب مع الإضافة.', firefoxThemeInfo: 'قم بزيارة سمات Firefox، قم بتنزيل وتطبيق سمة تتناسب مع الإضافة.', updateFirefoxHomepage: "تحديث الصفحة الرئيسية", updateFirefoxHomepageInfo: 'لتغيير صفحتك الرئيسية لتكون مثل علامة تبويب جديدة، قم بزيارة هذا الرابط واتبع التعليمات.', dontShowTips: "لا تظهر النصائح مرة أخرى", // Footer Toast "footerToastTitle": "هل ترى لافتة في الأسفل؟", "footerToastMessage": "لإخفائها، انقر عليها بزر الماوس الأيمن واختر 'إخفاء التذييل في صفحة علامة التبويب الجديدة'.", // Dialog boxes (alerts) okText: "موافق", yesText: "نعم", noText: "لا", agreeText: "موافق", cancelText: "إلغاء", confirmWallpaper: "هل ترغب في تعيين صورة جديدة كخلفية اليوم؟", confirmRestore: "هل أنت متأكد أنك تريد إعادة تعيين إعداداتك؟ لا يمكن التراجع عن هذا الإجراء.", Nobackgroundset: "لا توجد خلفية معينة حاليًا.", clearbackgroundimage: "هل أنت متأكد أنك تريد مسح صورة الخلفية؟", ProxyDisclaimer: "جميع ميزات الوكيل متوقفة عن التشغيل افتراضياً.\n\nإذا قمت بتمكين اقتراحات البحث ووكيل تجاوز CORS، فمن المستحسن بشدة استضافة وكيلك الخاص لزيادة الخصوصية.\n\nبشكل افتراضي، يتم تعيين الوكيل على https://mynt-proxy.rhythmcorehq.com، مما يعني أن جميع بياناتك ستمر عبر هذه الخدمة، مما قد يثير مخاوف تتعلق بالخصوصية.", GPSDisclaimer: "تُستخدم بيانات موقعك فقط لتوفير تحديثات دقيقة للطقس. تُخزن هذه البيانات مؤقتًا في المتصفح ولا يتم مشاركتها مع أي خدمة طرف ثالث أو يمكن الوصول إليها من قبلنا.\n\nبتمكين GPS، فإنك توافق على مشاركة موقعك مع الإضافة محليًا.", failedbackup: "فشل النسخ الاحتياطي: ", restorecompleted: "تمت الاستعادة بنجاح!", restorefailed: "فشلت الاستعادة: ", invalidBackup: "تم اختيار ملف نسخ احتياطي غير صالح.", deleteBookmark: 'هل أنت متأكد أنك تريد حذف الإشارة المرجعية "{title}"؟', UnsupportedBrowser: "الإشارات المرجعية غير مدعومة في متصفحك.", resetShortcutsPrompt: "سيتم حذف جميع الاختصارات المحفوظة وإعادتها إلى الإعدادات الافتراضية. هل تريد المتابعة؟" }; ================================================ FILE: locales/az.js ================================================ // Azerbaijani const az = { // Menu Items "github": "GitHub", "feedback": "Əlaqə", "resetsettings": "Parametrləri sıfırla", "menuCloseText": "Bağla", // Shortcuts "shortcutsText": "Qısayollar", "enableShortcutsText": "Yadda saxlanmış qısa yolları göstər", "editShortcutsText": "Qısayolları redaktə et", "shortcutsInfoText": "Göstəriləcək qısayolları seçin", "editShortcutsList": "Saxlanmış Qısayollar", // "editShortcutsListInfo": "You can add new shortcuts by clicking the \"+\" icon or edit existing ones by clicking on the shortcut name or URL.", "adaptiveIconText": "Adaptiv ikona formaları", "adaptiveIconInfoText": "Qısayol nişanları dairəvi görünəcək", // "bookmarksText": "Bookmarks", // "bookmarksInfo": "Show bookmarks sidebar", "ai_tools_button": "AI Alətləri", "enable_ai_tools": "AI Alətləri qısayollarını göstər", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "Google Tətbiqləri üçün qısayolları göstər", // "googleAppsHover": "Google Apps", // Keep this shorter // To-do List // "todoListText": "To Do List", // "todoListInfo": "Show a daily To Do list", // "todoListHover": "ToDo List", // Keep this short // "todoPlaceholder": "Add task...", // Digital Clock "digitalclocktitle": "Rəqəmsal saat", "digitalclockinfo": "Rəqəmsal saata keç", "timeformattitle": "12 Saat Format", "timeformatinfo": "12 saatlıq vaxt formatından istifadə edin", "greetingtitle": "Xoş gəlmisiniz", "greetinginfo": "Fərdi mətnin altında salamlama mesajını göstər", // Misc "userTextTitle": "Fərdiləşdirilə bilən mətn", "userTextInfo": "Saat altında fərdi mətni göstər", "fahrenheitCelsiusCheckbox": "Fahrenheit rejiminə keç", "fahrenheitCelsiusText": "Yeniləmələri görmək üçün səhifəni yeniləyin", "micIconTitle": "Mikrofon nişanını gizlət", "micIconInfo": "Səslə yazmaq işləmirsə", // "hideSearchWith": "Hide Search Engines", // "hideSearchWithInfo": "Switch between search engines by clicking its icon", "search_suggestions_button": "Təklifləri axtarın", "search_suggestions_text": "Axtarış təkliflərini aktivləşdirin", // Proxy "useproxytitletext": "Proksidən keçmək", "useproxyText": "Əgər axtarış təklifləri işləmirsə", "ProxyText": "CORS Bypass Proxy", "ProxySubtext": "Öz CORS Bypass Proxy əlavə et", "HostproxyButton": "Öz Proxyinizi Host edin", // Location "UserLocText": "Məkanınızı daxil edin", "UserLocSubtext": "Hava yeri düzgün deyilsə", "userLoc": "Məkanınız (Şəhər/Enlem, Boylam)", // Weather "WeatherApiText": "Öz WeatherAPI açarınızı daxil edin", "WeatherApiSubtext": "Hava funksiyası işləmirsə", "userAPI": "Sizin WeatherAPI açarınız", "LearnMoreButton": "Ətraflı məlumat", "saveAPI": "Saxla", // Body Items // Calendar "days": ['Bazar', 'Bazar ertəsi', 'Çərşənbə axşamı', 'Çərşənbə', 'Cümə axşamı', 'Cümə', 'Şənbə'], "months": ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], // Bookmarks // "bookmarksHeading": "Bookmarks", // "bookmarkViewAs": "View as", // "bookmarkViewGrid": "Grid", // Keep this shorter // "bookmarkViewList": "List", // Keep this shorter // "bookmarkSearch": "Search bookmark", // New Tab Item "conditionText": "Salam! Bu gün necəsən?", "humidityLevel": "Rütubət", "feelsLike": "FeelsLike", "location": "Dünya", "enterBtn": "Axtar", "searchPlaceholder": "Axtarışınız...", "listenPlaceholder": "Dinlənir...", "searchWithHint": "Bununla axtar", "userText": "Bura klikləməklə redaktə edin", // Greeting greeting: { "morning": "Sabahınız xeyir!", "afternoon": "Hər vaxtın xeyir!", "evening": "Axşamın xeyir!" }, // Search Engines "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", // AI Tools "ai_tools": "AI Alətləri", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "perplexity": "Perplexity", "metaAI": "Meta AI", // Wallpaper and misc "uploadWallpaperText": "Divar kağızı yükləyin", "backupText": "Yedək", "restoreText": "Bərpa et", "rangColor": "Rəng seçin", // Dialog boxes (alerts) "confirmWallpaper": "Gün üçün divar kağızı olaraq yeni bir şəkil təyin etmək istərdinizmi?", "confirmRestore": "Parametrlərinizi sıfırlamaq istədiyinizə əminsiniz? Bu əməliyyatı geri qaytarmaq mümkün deyil.", "Nobackgroundset": "Hazırda heç bir fon şəkli qurulmayıb.", "clearbackgroundimage": "Arxa fon şəklini təmizləmək istədiyinizə əminsinizmi?", "ProxyDisclaimer": "Bütün proksi funksiyaları defolt olaraq deaktivdir.\n\nAxtarış təkliflərini və CORS proksisini yan keçmək imkanını aktiv etsəniz, təkmil məxfilik üçün öz proksinizi yerləşdirmək tövsiyə olunur.\n\nDefolt olaraq, proksi quraşdırılacaq. https://mynt-proxy.rhythmcorehq.com ünvanına, yəni bütün məlumatlarınız bu xidmətdən keçəcək və bu, məxfiliklə bağlı narahatlıq yarada bilər.", "failedbackup": "Yedəkləmə uğursuz oldu: ", "restorecompleted": "Bərpa uğurla tamamlandı!", "restorefailed": "Bərpa uğursuz oldu: ", // "invalidBackup": "Invalid backup file selected.", // "deleteBookmark": "Are you sure you want to delete the bookmark \"{title}\"?", // Do not translate {title} // "UnsupportedBrowser": "Bookmarks are not supported in your browser", }; ================================================ FILE: locales/bn.js ================================================ // Bengali const bn = { "newTabTitle": "নতুন ট্যাব", // Menu Items "github": "গিটহাব", "feedback": "মতামত", // Section titles "personalizationSectionTitle": "ব্যক্তিগতকরণ", "clockSectionTitle": "ঘড়ি", "searchSectionTitle": "অনুসন্ধান", "weatherSectionTitle": "আবহাওয়া", "appearanceSectionTitle": "দৃশ্যরূপ", "settingsSectionTitle": "সেটিংস", // Shortcuts "shortcutsText": "শর্টকাট", "enableShortcutsText": "সংরক্ষিত শর্টকাটগুলি প্রদর্শন করুন", "editShortcutsText": "শর্টকাট সম্পাদনা করুন", "shortcutsInfoText": "যে শর্টকাটগুলো দেখাতে চান তা নির্বাচন করুন", "editShortcutsList": "সংরক্ষিত শর্টকাট", "editShortcutsListInfo": "\"+\" আইকনে ক্লিক করে নতুন শর্টকাট যোগ করুন অথবা বিদ্যমান শর্টকাটের নাম বা URL-এ ক্লিক করে সম্পাদনা করুন। কাস্টম আইকন রিসেট করতে ইমেজ URL খালি করুন।", "adaptiveIconText": "অ্যাডাপ্টিভ আইকন", "adaptiveIconInfoText": "শর্টকাট আইকন থিম রঙের সাথে মিলে ছোট আকারে প্রদর্শিত হবে", "bookmarksText": "বুকমার্কস", "bookmarksInfo": "বুকমার্কস সাইডবার দেখুন", "ai_tools_button": "এআই সরঞ্জাম", "enable_ai_tools": "এআই সরঞ্জামের শর্টকাট প্রদর্শন করুন", "aiToolsSettingsText": "এআই সরঞ্জাম সেটিংস", "aiToolsSettingsInfo": "এআই সরঞ্জামের শর্টকাট পরিচালনা করুন", "googleAppsMenuText": "গুগল অ্যাপস", "googleAppsMenuInfo": "গুগল অ্যাপসের শর্টকাট প্রদর্শন করুন", "googleAppsHover": "গুগল অ্যাপস", "shortcutDefaultName": "নতুন শর্টকাট", "shortcutInputName": "শর্টকাটের নাম", "shortcutInputUrl": "শর্টকাটের URL", "shortcutInputIcon": "কাস্টম আইকন: URL অথবা SVG (ঐচ্ছিক)", "recentlyAddedBookmarks": "সম্প্রতি যোগ করা", // To-do List "todoListText": "টু ডু লিস্ট", "todoListInfo": "দৈনিক কাজের তালিকা দেখুন", "todoListHover": "টু ডু লিস্ট", "todoPlaceholder": "টাস্ক যোগ করুন...", // Clock "hideClockBox": "ঘড়ি লুকান", "hideClockBoxInfo": "ঘড়ি এবং তারিখ লুকান", "digitalclocktitle": "ডিজিটাল ঘড়ি", "digitalclockinfo": "ডিজিটাল ঘড়িতে পরিবর্তন করুন", "timeformattitle": "১২-ঘণ্টা ফরম্যাট", "timeformatinfo": "১২-ঘণ্টার সময় ফরম্যাট ব্যবহার করুন", "greetingtitle": "অভিবাদন", "greetinginfo": "কাস্টম টেক্সটের নিচে অভিবাদন দেখান", // Misc "userTextTitle": "কাস্টমাইজেবল টেক্সট", "userTextInfo": "ঘড়ির নিচে কাস্টম টেক্সট দেখান", "fahrenheitCelsiusCheckbox": "ফারেনহাইটে পরিবর্তন করুন", "fahrenheitCelsiusText": "পরিবর্তন প্রয়োগ করতে পেজ রিফ্রেশ করুন", "hideWeatherTitle": "আবহাওয়া লুকান", "hideWeatherInfo": "আবহাওয়া উইজেট বন্ধ করুন", "hideWeatherBox": "আবহাওয়া কার্ড লুকান", "hideWeatherBoxInfo": "শুধুমাত্র তাপমাত্রা পিল দেখান", "minMaxTempText": "সর্বনিম্ন-সর্বাধিক তাপমাত্রা", "minMaxTempSubText": "অনুভূতি তাপমাত্রার পরিবর্তে সর্বনিম্ন ও সর্বাধিক তাপমাত্রা দেখান", // Search "micIconTitle": "মাইক্রোফোন আইকন লুকান", "micIconInfo": "যদি ভয়েস টাইপিং কাজ না করে", "hideSearchWith": "সার্চ ইঞ্জিন লুকান", "hideSearchWithInfo": "সার্চ ইঞ্জিনের আইকনে ক্লিক করে সার্চ ইঞ্জিন পরিবর্তন করুন", "motivationalQuotesText": "অনুপ্রেরণামূলক উক্তি", "motivationalQuotesInfo": "সার্চবারের নিচে উক্তি দেখান", "newQuoteOnRefreshText": "দৈনিক উক্তি", "newQuoteOnRefreshInfo": "প্রতিবার রিফ্রেশ হওয়ার পরিবর্তে দিনে একটি উক্তি দেখান", "search_suggestions_button": "সার্চ সাজেশন", "search_suggestions_text": "সার্চ সাজেশন সক্রিয় করুন", // Proxy "useproxytitletext": "প্রক্সি বাইপাস", "useproxyText": "যদি সার্চ সাজেশন কাজ না করে", "ProxyText": "CORS বাইপাস প্রক্সি", "ProxySubtext": "নিজস্ব CORS বাইপাস প্রক্সি যোগ করুন", "HostproxyButton": "নিজস্ব প্রক্সি হোস্ট করুন", // Location "useGPS": "জিপিএস ব্যবহার করুন", "useGPSInfo": "লাইভ লোকেশন আপডেটের জন্য জিপিএস সক্ষম করুন", "UserLocText": "আপনার অবস্থান লিখুন", "UserLocSubtext": "যদি আবহাওয়া অবস্থান সঠিক না হয়", "userLoc": "আপনার শহর বা স্থানাঙ্ক (অক্ষাংশ, দ্রাঘিমাংশ)", "PrivacyPolicy": "গোপনীয়তা নীতি", // Weather "WeatherApiText": "আপনার WeatherAPI কী লিখুন", "WeatherApiSubtext": "যদি আবহাওয়ার ফাংশন কাজ না করে", "userAPI": "আপনার WeatherAPI কী", "LearnMoreButton": "আরও জানুন", "saveAPI": "সংরক্ষণ করুন", // Body Items // Calendar "days": ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], // Truncated for display //"days": ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], // Full "months": ['জানুয়ারি', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], // "months": ['জানু', 'ফেব্রু', 'মার্চ', 'এপ্রি', 'মে', 'জুন', 'জুলাই', 'আগ', 'সেপ্টে', 'অক্টো', 'নভে', 'ডিসে'], // Truncated // Bookmarks "bookmarksHeading": "বুকমার্কস", "bookmarkSortBy": "অনুসারে সাজান", "sortAlphabetical": "A-Z", "sortTimeAdded": "পুরাতন-নতুন", "bookmarkViewAs": "এইভাবে দেখুন", "bookmarkViewGrid": "গ্রিড", "bookmarkViewList": "লিস্ট", "bookmarkSearch": "বুকমার্ক সার্চ করুন", "editBookmarkHeading": "বুকমার্ক সম্পাদনা করুন", "editBookmarkName": "বুকমার্কের নাম", "editBookmarkURL": "বুকমার্কের URL", // New Tab Item "conditionText": "হ্যালো! আজ আপনি কেমন আছেন?", "humidityLevel": "আর্দ্রতা", "feelsLike": "অনুভূতি হয়", "minMaxTemp": "নিম্ন ~ উচ্চ", "location": "পৃথিবী", "enterBtn": "সার্চ করুন", "searchPlaceholder": "এখানে টাইপ করুন...", "listenPlaceholder": "শোনা হচ্ছে...", "searchWithHint": "দিয়ে সার্চ করুন", "searchOnHint": "এ সার্চ করুন", "userText": "এডিট করতে এখানে ক্লিক করুন", // Greeting greeting: { "morning": "শুভ সকাল!", "afternoon": "শুভ বিকেল!", "evening": "শুভ সন্ধ্যা!" }, // Search Engines "defaultEngine": "ডিফল্ট", "googleEngine": "গুগল", "duckEngine": "ডাকডাকগো", "bingEngine": "বিং", "braveEngine": "ব্রেভ", "youtubeEngine": "ইউটিউব", "gImagesEngine": "ছবি", "redditEngine": "রেডিট", "wikipediaEngine": "উইকিপিডিয়া", "quoraEngine": "কোরা", // AI Tools "ai_tools": "এআই টুলস", "chatGPT": "চ্যাটজিপিটি", "gemini": "জেমিনি", "copilot": "কোপাইলট", "claude": "ক্লড", "grok": "গ্রোক", "qwen": "ক্বেন", "perplexity": "পারপ্লেক্সিটি", "deepseek": "ডিপসিক", "metaAI": "মেটা এআই", "firefly": "অ্যাডোবি ফায়ারফ্লাই", "aiSettingsIntro": "যে এআই টুলগুলো দেখাতে চান তা নির্বাচন করুন", "resetAISettingsBtn": "রিসেট করুন", // Theme "lightThemed": "লাইট", "darkThemed": "ডার্ক", "systemThemed": "সিস্টেম", // Wallpaper and settings "uploadWallpaperText": "ওয়ালপেপার দিন", "rangColor": "রঙ নির্বাচন করুন", "opacityTitle": "অস্বচ্ছতা", "adjustOpacityDesc": "ইন্টারফেসের স্বচ্ছতা সামঞ্জস্য করুন", "backupText": "ব্যাকআপ করুন", "restoreText": "পুনরুদ্ধার করুন", "resetsettings": "সেটিংস পুনরায় সেট করুন", "menuCloseText": "বন্ধ করুন", // Tips "switchSearchModes": "সার্চ মোড পরিবর্তন করুন", "switchSearchModesInfo": "মোড পরিবর্তন করতে ‘দিয়ে সার্চ করুন’ এ ক্লিক করুন", "adjustZoom": "জুম সমন্বয় করুন", "adjustZoomInfo": "জুম সমন্বয় করতে Ctrl + \"+\" বা Ctrl + \"-\" চাপুন।", "changeBrowserTheme": "ব্রাউজারের থিম পরিবর্তন করুন", "chromeThemeInfo": "তিনটি ডট (⋮) এ ক্লিক করুন > আরও টুলস > ক্রোম কাস্টমাইজ করুন, তারপর এক্সটেনশনের থিমের সাথে মিলিয়ে একটি রঙ নির্বাচন করুন।", "edgeThemeInfo": "সেটিংসে যান > রূপ, তারপর এক্সটেনশনের থিমের সাথে মিলিয়ে একটি রঙ নির্বাচন করুন।", "braveThemeInfo": 'ক্রোম থিম স্টোর এ যান, থিম ডাউনলোড করুন এবং এক্সটেনশনের থিমের সাথে মিলিয়ে একটি রঙ নির্বাচন করুন।', "firefoxThemeInfo": 'ফায়ারফক্স থিম এ যান, থিম ডাউনলোড করুন এবং এক্সটেনশনের থিমের সাথে মিলিয়ে একটি রঙ নির্বাচন করুন।', "updateFirefoxHomepage": "হোমপেজ আপডেট করুন", "updateFirefoxHomepageInfo": "আপনার হোমপেজকে নতুন ট্যাবের মতো পরিবর্তন করতে, এই লিংকে যান এবং নির্দেশিকা অনুসরণ করুন।", "dontShowTips": "এটি আর দেখাবেন না", // Footer Toast "footerToastTitle": "নীচে কোনো ব্যানার দেখাচ্ছে?", "footerToastMessage": "এটি লুকাতে, এর উপর রাইট-ক্লিক করুন এবং 'নিউ ট্যাব পেজে ফুটার লুকান' নির্বাচন করুন।", // Dialog boxes (alerts) "okText": "ঠিক আছে", "yesText": "হ্যাঁ", "noText": "না", "agreeText": "আমি রাজি", "cancelText": "বাতিল করুন", "confirmWallpaper": "আপনি কি আজকের জন্য একটি নতুন ছবি ওয়ালপেপার হিসেবে সেট করতে চান?", "confirmRestore": "আপনি কি নিশ্চিত যে আপনি আপনার সেটিংস রিসেট করতে চান? এটি পূর্বাবস্থায় ফেরানো যাবে না।", "Nobackgroundset": "বর্তমানে কোন ব্যাকগ্রাউন্ড ইমেজ সেট করা হয়নি।", "clearbackgroundimage": "আপনি কি ব্যাকগ্রাউন্ড ইমেজ মুছে ফেলতে চান?", "ProxyDisclaimer": "সমস্ত প্রক্সি ফিচার ডিফল্টভাবে বন্ধ থাকে।\n\nআপনি যদি সার্চ সাজেশন এবং CORS বাইপাস প্রক্সি সক্রিয় করেন, তাহলে উন্নত গোপনীয়তার জন্য আপনার নিজস্ব প্রক্সি হোস্ট করার পরামর্শ দেওয়া হয়।\n\nডিফল্টভাবে প্রক্সি https://mynt-proxy.rhythmcorehq.com এ সেট করা হবে, যার মানে আপনার সমস্ত ডেটা এই পরিষেবার মাধ্যমে যাবে, যা গোপনীয়তার ঝুঁকি তৈরি করতে পারে।", "GPSDisclaimer": "আপনার অবস্থানের তথ্য শুধুমাত্র সঠিক আবহাওয়ার আপডেট প্রদানের জন্য ব্যবহার করা হয়। এটি অস্থায়ীভাবে ব্রাউজারের মধ্যে সংরক্ষণ করা হয় এবং কোনও তৃতীয় পক্ষের পরিষেবার সাথে শেয়ার করা হয় না এবং আমাদের কাছে অ্যাক্সেসযোগ্যও নয়।\n\nজিপিএস সক্ষম করার মাধ্যমে, আপনি স্থানীয়ভাবে এক্সটেনশনের সাথে আপনার অবস্থান শেয়ার করে নেওয়ার জন্য সম্মতি দিচ্ছেন।", "failedbackup": "ব্যাকআপ ব্যর্থ: ", "restorecompleted": "পুনরুদ্ধার সফলভাবে সম্পন্ন হয়েছে!", "restorefailed": "পুনরুদ্ধার ব্যর্থ: ", "invalidBackup": "অবৈধ ব্যাকআপ ফাইল নির্বাচিত হয়েছে।", "deleteBookmark": "আপনি কি নিশ্চিত যে আপনি \"{title}\" বুকমার্কটি মুছে ফেলতে চান?", "UnsupportedBrowser": "আপনার ব্রাউজারে বুকমার্ক সমর্থিত নয়।", "resetShortcutsPrompt": "সব সংরক্ষিত শর্টকাট মুছে ফেলা হবে এবং ডিফল্ট অবস্থায় পুনরায় সেট করা হবে। আপনি কি চালিয়ে যেতে চান?", "invalidFileTypeMessage": "একটি বৈধ ইমেজ ফাইল নির্বাচন করুন।", "invalidSvgMessage": "অবৈধ SVG অথবা এতে অনিরাপদ বিষয়বস্তু রয়েছে এবং এটি আইকন হিসাবে ব্যবহার করা যাবে না।", "invalidIconUrlMessage": "একটি বৈধ ইমেজ URL লিখুন (https://, http://, অথবা data:image/ দিয়ে শুরু হতে হবে)।", "iconFileTooLargeMessage": "নির্বাচিত ফাইলটি খুব বড়: {size} KB। অনুগ্রহ করে {max} KB এর কম আকারের ফাইল ব্যবহার করুন।", "iconStorageQuotaMessage": "স্টোরেজ সীমা পূর্ণ হয়ে যাওয়ায় আইকন সংরক্ষণ করা যায়নি। অনুগ্রহ করে ছোট আকারের ছবি ব্যবহার করুন।" }; ================================================ FILE: locales/cs.js ================================================ // Czech const cs = { "newTabTitle": "Nová karta", // Menu Items "github": "GitHub", "feedback": "Zpětná vazba", // Section titles "personalizationSectionTitle": "Přizpůsobení", "clockSectionTitle": "Hodiny", "searchSectionTitle": "Vyhledávání", "weatherSectionTitle": "Počasí", "appearanceSectionTitle": "Vzhled", "settingsSectionTitle": "Nastavení", // Shortcuts "shortcutsText": "Zkratky", "enableShortcutsText": "Zobrazí zkratky", "editShortcutsText": "Upravit zkratky", "shortcutsInfoText": "Vyberte, které zkratky se mají zobrazit", "editShortcutsList": "Uložené zkratky", "editShortcutsListInfo": "Nové zkratky můžete přidat klepnutím na ikonku „+“. Upravit existující můžete klepnutím na název nebo URL adresu zkratky.\nVlastní ikonu resetujete jednoduše smazáním URL adresy obrázku.", "adaptiveIconText": "Adaptivní ikony", "adaptiveIconInfoText": "Ikony zkratek se adaptují vzhledem k motivu", "bookmarksText": "Záložky", "bookmarksInfo": "Zobrazí boční panel se záložkami", "ai_tools_button": "AI nástroje", "enable_ai_tools": "Zobrazí zkratky AI nástrojů", "aiToolsSettingsText": "Nastavení AI nástrojů", "aiToolsSettingsInfo": "Nastavte si zkratky AI nástrojů", "googleAppsMenuText": "Google aplikace", "googleAppsMenuInfo": "Zobrazí zkratky Google aplikací", "googleAppsHover": "Google aplikace", "shortcutDefaultName": "Nová zkratka", "shortcutInputName": "Název zkratky", "shortcutInputUrl": "URL adresa zkratky", "shortcutInputIcon": "Vlastní ikona: URL nebo SVG (nepovinné)", "recentlyAddedBookmarks": "Nedávno přidané", // To-do List "todoListText": "Seznam úkolů", "todoListInfo": "Zobrazí denní seznam úkolů", "todoListHover": "Seznam úkolů", "todoPlaceholder": "Přidat úkol…", // Clock "hideClockBox": "Skrýt hodiny", "hideClockBoxInfo": "Skryje hodiny a datum", "digitalclocktitle": "Digitální hodiny", "digitalclockinfo": "Přepne hodiny na digitální", "timeformattitle": "12hodinový formát", "timeformatinfo": "Použije se 12hodinový formát času", "greetingtitle": "Pozdrav", "greetinginfo": "Zobrazí pozdrav pod upravitelným textem", // Misc "userTextTitle": "Upravitelný text", "userTextInfo": "Zobrazí upravitelný text pod hodinami", "fahrenheitCelsiusCheckbox": "Přepnout na stupně Fahrenheita", "fahrenheitCelsiusText": "Změny se projeví po obnovení stránky", "hideWeatherTitle": "Skrýt počasí", "hideWeatherInfo": "Vypne widgety s počasím", "hideWeatherBox": "Skrýt kartu s počasím", "hideWeatherBoxInfo": "Zobrazí pouze pilulku s teplotou", "minMaxTempText": "Teplota daná rozsahem", "minMaxTempSubText": "Nahradí pocitovou teplotu rozsahem minimální a maximální teploty", // Search "micIconTitle": "Skrýt ikonu mikrofonu", "micIconInfo": "Pokud nefunguje hlasové vyhledávání", "hideSearchWith": "Skrýt vyhledávače", "hideSearchWithInfo": "Mezi vyhledávači přepnete klepnutím na jejich ikonky", "motivationalQuotesText": "Motivační citáty", "motivationalQuotesInfo": "Zobrazí citáty pod vyhledávacím polem", "newQuoteOnRefreshText": "Denní citát", "newQuoteOnRefreshInfo": "Místo neustálé obměny citátů zobrazí jeden citát na celý den", "search_suggestions_button": "Návrhy ve vyhledávání", "search_suggestions_text": "Zapne návrhy vyhledávání", // Proxy "useproxytitletext": "Obcházení proxy", "useproxyText": "Pokud nefungují návrhy ve vyhledávání", "ProxyText": "Proxy pro obcházení CORS", "ProxySubtext": "Nastavte si vlastní proxy pro obcházení CORS", "HostproxyButton": "Provozování vlastní proxy", // Location "useGPS": "Použít GPS", "useGPSInfo": "Zapne GPS pro průběžnou aktualizaci polohy", "UserLocText": "Zadejte svou polohu", "UserLocSubtext": "Pokud není správná poloha počasí", "userLoc": "Město nebo souřadnice (šířka, délka)", "PrivacyPolicy": "Ochrana osobních údajů", // Weather "WeatherApiText": "Zadejte svůj klíč k WeatherAPI", "WeatherApiSubtext": "Pokud nefunguje funkce počasí", "userAPI": "Váš klíč k WeatherAPI", "LearnMoreButton": "Zjistit více", "saveAPI": "Uložit", // Body Items // Calendar "days": ["neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota"], "months": ["ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince"], // Bookmarks "bookmarksHeading": "Záložky", "bookmarkSortBy": "Seřadit podle", "sortAlphabetical": "A–Ž", "sortTimeAdded": "Stáří", "bookmarkViewAs": "Způsob zobrazení", "bookmarkViewGrid": "Mřížka", "bookmarkViewList": "Seznam", "bookmarkSearch": "Vyhledejte záložku", "editBookmarkHeading": "Upravit záložku", "editBookmarkName": "Název záložky", "editBookmarkURL": "URL adresa záložky", // New Tab Item "conditionText": "Dobrý den! Jak se máte?", "humidityLevel": "Vlhkost", "feelsLike": "Pocitová teplota", "minMaxTemp": "Min až max", "location": "Země", "enterBtn": "Vyhledat", "searchPlaceholder": "Zadejte hledaný výraz…", "listenPlaceholder": "Poslouchám…", "searchWithHint": "Vyhledávat prostřednictvím", "searchOnHint": "Vyhledávat na", "userText": "Upravíte po kliknutí", // Greeting "greeting": { "morning": "Dobré ráno!", "afternoon": "Dobré odpoledne!", "evening": "Dobrý večer!" }, // Search Engines "defaultEngine": "Výchozí", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Obrázky", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedie", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI nástroje", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Vyberte, jaké AI nástroje budou zobrazeny", "resetAISettingsBtn": "Resetovat", // Theme "lightThemed": "Světlý", "darkThemed": "Temný", "systemThemed": "Podle systému", // Wallpaper and settings "uploadWallpaperText": "Nahrát tapetu", "rangColor": "Vybrat barvu", "opacityTitle": "Průhlednost", "adjustOpacityDesc": "Upraví průhlednost uživatelského rozhraní", "backupText": "Zálohovat", "restoreText": "Obnovit", "resetsettings": "Resetovat nastavení", "menuCloseText": "Zavřít", // Tips "switchSearchModes": "Změna způsobu vyhledávání", "switchSearchModesInfo": "Pro změnu způsobu vyhledávání klepněte na „Vyhledat prostřednictvím“.", "adjustZoom": "Přizpůsobení přiblížení", "adjustZoomInfo": "Pro přizpůsobení přiblížení stiskněte Ctrl + „+“ nebo Ctrl + „-“.", "changeBrowserTheme": "Změna motivu prohlížeče", "chromeThemeInfo": "Klepněte na tři tečky (⋮) > Další nástroje > Přizpůsobení Chrome, následně zvolte barvu, která sedí k motivu rozšíření.", "edgeThemeInfo": "Běžte do Nastavení > Vzhled, následně zvolte barvu, která sedí k motivu rozšíření.", "braveThemeInfo": 'Navštivte Obchod s motivy pro Chrome, stáhněte a aktivujte motiv, který sedí k rozšíření.', "firefoxThemeInfo": 'Navštivte Motivy vzhledu Firefox, stáhněte a aktivujte motiv, který sedí k rozšíření.', "updateFirefoxHomepage": "Aktualizace domovské stránky", "updateFirefoxHomepageInfo": "Pro změnu domovské stránky, stejně jako nové karty, navštivte tento odkaz a následujte instrukce (anglicky).", "dontShowTips": "Již nezobrazovat", // Footer Toast "footerToastTitle": "Vidíte baner ve spodní části obrazovky?", "footerToastMessage": "Skryjete ho tak, že na něho klepnete pravým tlačítkem a zvolíte „Skrýt zápatí na stránce Nová karta“.", // Dialog boxes (alerts) "okText": "Budiž", "yesText": "Ano", "noText": "Ne", "agreeText": "Souhlasím", "cancelText": "Zrušit", "confirmWallpaper": "Přejete si nastavit nový obrázek jako denní tapetu?", "confirmRestore": "Opravdu si přejete resetovat nastavení? Tuto akci nelze zvrátit.", "Nobackgroundset": "Aktuálně nemáte nastavený žádný obrázek na pozadí.", "clearbackgroundimage": "Opravdu si přejete smazat obrázek na pozadí?", "ProxyDisclaimer": "Všechny funkce proxy jsou ve výchozím nastavení vypnuté.\n\nPokud zapnete našeptávání ve vyhledávání s proxy pro obcházení CORS, pro lepší zabezpečení vám důrazně doporučujeme hostovat si vlastní proxy.\n\nVe výchozím nastavení je proxy nastavena na https://mynt-proxy.rhythmcorehq.com, což znamená, že všechna vaše data procházejí skrz tuto službu. To může vyvolat obavy o soukromí.", "GPSDisclaimer": "Data o poloze jsou využívána pouze pro poskytování odpovídajících aktualizací počasí. Jsou dočasně uložena v prohlížeči, přičemž nejsou ani sdílena se třetími stanami, ani přístupná pro nás.\n\nPovolením GPS souhlasíte s tím, že bude poloha lokálně využita tímto rozšířením.", "failedbackup": "Zálohování selhalo: ", "restorecompleted": "Obnova ze zálohy byla úspěšně dokončena!", "restorefailed": "Obnova ze zálohy selhala: ", "invalidBackup": "Vybrali jste neplatný soubor se zálohou.", "deleteBookmark": "Opravdu si přejete smazat záložku „{title}“?", "UnsupportedBrowser": "Ve vašem prohlížeči nejsou záložky podporované", "resetShortcutsPrompt": "Budou odstraněny všechny uložené zkratky a následně se obnoví výchozí sada zkratek. Přejete si pokračovat?", "invalidFileTypeMessage": "Vyberte prosím validní soubor s obrázkem.", "invalidSvgMessage": "Vložené SVG je nevalidní nebo obsahuje nebezpečný obsah, a nemůže být použito jako ikona.", "invalidIconUrlMessage": "Zadejte prosím validní URL adresu obrázku (musí začínat https://, http://, nebo data:image/).", "iconFileTooLargeMessage": "Vybraný soubor je příliš velký: {size} KB. Použijte prosím menší soubor do velikosti {max} KB.", "iconStorageQuotaMessage": "Ikonu nebylo možné uložit kvůli překročení kapacity úložiště. Odstraňte některé vlastní ikony nebo použijte menší obrázek.", }; ================================================ FILE: locales/de.js ================================================ // German const de = { // Menu Items "github": "GitHub", "feedback": "Rückmeldung", // Shortcuts "shortcutsText": "Shortcuts", "enableShortcutsText": "Gespeicherte Shortcuts anzeigen", "editShortcutsText": "Tastenkombinationen bearbeiten", "shortcutsInfoText": "Wählen Sie, welche Verknüpfungen angezeigt werden", "editShortcutsList": "Gespeicherte Shortcuts", "editShortcutsListInfo": "Sie können neue Verknüpfungen hinzufügen, indem Sie auf das Symbol „+“ klicken, oder vorhandene Verknüpfungen bearbeiten, indem Sie auf den Namen oder die URL der Verknüpfung klicken.", "adaptiveIconText": "Adaptive Symbole", "adaptiveIconInfoText": "Verknüpfungssymbole passen sich der Farbe des Themas an und erscheinen kleiner", "bookmarksText": "Lesezeichen", "bookmarksInfo": "Lesezeichen-Seitenleiste anzeigen", "ai_tools_button": "KI-Werkzeuge", "enable_ai_tools": "Abkürzungen für KI-Werkzeuge anzeigen", "aiToolsSettingsText": "Einstellungen für KI-Werkzeuge", "aiToolsSettingsInfo": "Verknüpfungen zu KI-Werkzeugen verwalten", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "Shortcuts für Google Apps anzeigen", "googleAppsHover": "Google Apps", // To-do List "todoListText": "To-Do Liste", "todoListInfo": "Zeige eine tägliche To-Do-Liste an", "todoListHover": "To-Do Liste", "todoPlaceholder": "Aufgabe hinzufügen...", // Clock "hideClockBox": "Uhr ausblenden", "hideClockBoxInfo": "Uhr und Datum ausblenden", "digitalclocktitle": "Digitaluhr", "digitalclockinfo": "Umschalten auf die digitale Uhr", "timeformattitle": "12-Stunden-Format", "timeformatinfo": "12-Stunden-Zeitformat verwenden", "greetingtitle": "Gruß", "greetinginfo": "Begrüßung unter benutzerdefiniertem Text anzeigen", // Misc "userTextTitle": "Anpassbarer Text", "userTextInfo": "Benutzerdefinierten Text unter der Uhr anzeigen", "fahrenheitCelsiusCheckbox": "Auf Fahrenheit umschalten", "fahrenheitCelsiusText": "Aktualisieren Sie die Seite, um die Änderungen zu übernehmen", "hideWeatherTitle": "Wetter verbergen", "hideWeatherInfo": "Deaktivieren Sie die Wetter-Widgets", "hideWeatherBox": "Wetterkarte ausblenden", "hideWeatherBoxInfo": "Nur Temperaturpille anzeigen", "minMaxTempText": "Min-Max Temperatur", "minMaxTempSubText": "Ersetze „Fühlt sich an“ durch Min- und Max-Temperatur", // Search "micIconTitle": "Mikrofon-Symbol ausblenden", "micIconInfo": "Wenn die Spracheingabe nicht funktioniert", "hideSearchWith": "Suchmaschinen ausblenden", "hideSearchWithInfo": "Wechseln Sie zwischen Suchmaschinen, indem Sie auf das Symbol klicken", "motivationalQuotesText": "Motivationszitate", "motivationalQuotesInfo": "Zitate unterhalb der Suchleiste anzeigen", "search_suggestions_button": "Suchvorschläge", "search_suggestions_text": "Suchvorschläge aktivieren", // Proxy "useproxytitletext": "Proxy-Umgehung", "useproxyText": "Wenn Suchvorschläge nicht funktionieren", "ProxyText": "CORS Bypass Proxy", "ProxySubtext": "Fügen Sie Ihren eigenen CORS-Bypass-Proxy hinzu", "HostproxyButton": "Hosten Sie Ihren eigenen Proxy", // Location "useGPS": "GPS verwenden", "useGPSInfo": "GPS für Live-Standortaktualisierungen aktivieren", "UserLocText": "Geben Sie Ihren Standort ein", "UserLocSubtext": "Wenn der Wetterstandort nicht korrekt ist", "userLoc": "Ihre Stadt oder Koordinaten (Breitengrad, Längengrad)", "PrivacyPolicy": "Datenschutz", // Weather "WeatherApiText": "Geben Sie Ihren WeatherAPI-Schlüssel ein", "WeatherApiSubtext": "Wenn die Wetterfunktionalität nicht funktioniert", "userAPI": "Ihr weatherAPI-Schlüssel", "LearnMoreButton": "Mehr erfahren", "saveAPI": "Speichern", // Body Items // Calendar "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], // Bookmarks "bookmarksHeading": "Lesezeichen", "bookmarkSortBy": "Sortieren nach", "sortAlphabetical": "A-Z", "sortTimeAdded": "Alt-Neu", "bookmarkViewAs": "Ansicht als", "bookmarkViewGrid": "Grid", "bookmarkViewList": "List", "bookmarkSearch": "Lesezeichen suchen", "editBookmarkHeading": "Lesezeichen bearbeiten", "editBookmarkName": "Lesezeichen-Name", "editBookmarkURL": "Lesezeichen-URL", // New Tab Item "conditionText": "Hallo! Wie geht's dir heute?", "humidityLevel": "Luftfeuchtigkeit", "feelsLike": "Fühlt sich an", "minMaxTemp": "Min ~ Max", "location": "Erde", "enterBtn": "Suche", "searchPlaceholder": "Geben Sie hier einen Suchbegriff ein...", "listenPlaceholder": "Sprich jetzt...", "searchWithHint": "Suche mit", "searchOnHint": "Suche auf", "userText": "Hier klicken zum Bearbeiten", // Greeting greeting: { "morning": "Guten Morgen!", "afternoon": "Guten Tag!", "evening": "Guten Abend!" }, // Search Engines "defaultEngine": "Default", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Bilder", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "KI-Werkzeuge", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Wählen Sie aus, welche KI-Tools angezeigt werden sollen", "resetAISettingsBtn": "Zurücksetzen", // Theme "enableDarkMode": "Dunkelmodus (experimentell)", "enableDarkModeInfo": "Themen für den dunklen Modus aktivieren", // Wallpaper and settings "uploadWallpaperText": "Hintergrundbild hochladen", "rangColor": "Farbe auswählen", "opacityTitle": "Opazität", "adjustOpacityDesc": "Transparenz der Schnittstelle anpassen", "backupText": "Sicherung", "restoreText": "Wiederherstellen", "resetsettings": "Einstellungen zurücksetzen", "menuCloseText": "Schließen", // Tips "switchSearchModes": "Suchmodi wechseln", "switchSearchModesInfo": "Klicken Sie auf „Suche mit“, um den Modus zu ändern.", "adjustZoom": "Zoom anpassen", "adjustZoomInfo": "Drücken Sie Strg + „+“ oder Strg + „-“, um den Zoom anzupassen.", "changeBrowserTheme": "Browserthema ändern", "chromeThemeInfo": "Klicken Sie auf die drei Punkte (⋮) > Weitere Tools > Chrome anpassen und wählen Sie dann eine Farbe, die zum Thema der Erweiterung passt.", "edgeThemeInfo": "Gehen Sie zu Einstellungen > Aussehen und wählen Sie dann eine Farbe, die zum Thema der Erweiterung passt", "braveThemeInfo": 'Besuchen Sie Chrome Theme Store, laden Sie das zur Erweiterung passende Theme herunter und wenden Sie es an.', "firefoxThemeInfo": 'Besuchen Sie Firefox Themes, laden Sie das zur Erweiterung passende Theme herunter und wenden Sie es an.', "updateFirefoxHomepage": "Homepage aktualisieren", "updateFirefoxHomepageInfo": "Um Ihre Homepage wie auch den neuen Tab zu ändern, besuchen Sie diesen Link und folgen Sie den Anweisungen.", "dontShowTips": "Nicht mehr anzeigen", // Dialog boxes (alerts) "okText": "OK", "yesText": "Ja", "noText": "Nein", "agreeText": "Ich stimme zu", "cancelText": "Abbrechen", "confirmWallpaper": "Möchten Sie ein neues Bild als Hintergrundbild für den heutigen Tag festlegen?", "confirmRestore": "Sind Sie sicher, dass Sie Ihre Einstellungen zurücksetzen wollen? Diese Aktion kann nicht rückgängig gemacht werden.", "Nobackgroundset": "Es ist derzeit kein Hintergrundbild eingestellt.", "clearbackgroundimage": "Möchten Sie das Hintergrundbild wirklich entfernen?", "ProxyDisclaimer": "Alle Proxy-Funktionen sind standardmäßig ausgeschaltet.\n\nWenn Sie Suchvorschläge und CORS-Bypass-Proxy aktivieren, wird dringend empfohlen, Ihren eigenen Proxy zu hosten, um den Datenschutz zu verbessern.\n\nStandardmäßig ist der Proxy auf https://mynt-proxy.rhythmcorehq.com eingestellt, was bedeutet, dass alle Ihre Daten über diesen Dienst laufen, was zu Datenschutzproblemen führen kann.", "GPSDisclaimer": "Ihre Standortdaten werden ausschließlich für die Bereitstellung von genauen Wetter-Updates verwendet. Sie werden vorübergehend im Browser gespeichert und weder an Drittanbieterdienste weitergegeben noch für uns zugänglich gemacht.\n\nIndem Sie GPS aktivieren, stimmen Sie der lokalen Weitergabe Ihres Standorts an die Erweiterung zu.", "failedbackup": "Sicherung fehlgeschlagen: ", "restorecompleted": "Wiederherstellung erfolgreich abgeschlossen!", "restorefailed": "Wiederherstellung fehlgeschlagen: ", "invalidBackup": "Ungültige Sicherungsdatei ausgewählt.", "deleteBookmark": "Sind Sie sicher, dass Sie das Lesezeichen „{title}“ löschen wollen?", "UnsupportedBrowser": "Lesezeichen werden von Ihrem Browser nicht unterstützt.", "resetShortcutsPrompt": "Alle gespeicherten Verknüpfungen werden gelöscht und auf die Standardwerte zurückgesetzt. Möchten Sie fortfahren?" }; ================================================ FILE: locales/el.js ================================================ //Greek const el = { // Στοιχεία Μενού "github": "GitHub", "feedback": "Σχόλια", // Συντομεύσεις "shortcutsText": "Συντομεύσεις", "enableShortcutsText": "Εμφάνιση αποθηκευμένων συντομεύσεων", "editShortcutsText": "Επεξεργασία Συντομεύσεων", "shortcutsInfoText": "Επιλέξτε ποιες συντομεύσεις θα εμφανίζονται", "editShortcutsList": "Αποθηκευμένες Συντομεύσεις", "editShortcutsListInfo": "Μπορείτε να προσθέσετε νέες συντομεύσεις κάνοντας κλικ στο εικονίδιο \"+\" ή επεξεργαστείτε τις υπάρχουσες κάνοντας κλικ στο όνομα της συντόμευσης ή στη διεύθυνση URL.", "adaptiveIconText": "Προσαρμοστικά Εικονίδια", "adaptiveIconInfoText": "Τα εικονίδια συντομεύσεων θα προσαρμόζονται στο θέμα", "bookmarksText": "Σελιδοδείκτες", "bookmarksInfo": "Εμφάνιση πλαϊνής μπάρας σελιδοδεικτών", "ai_tools_button": "Εργαλεία AI", "enable_ai_tools": "Εμφάνιση συντομεύσεων για εργαλεία AI", "aiToolsSettingsText": "Ρυθμίσεις Εργαλείων AI", "aiToolsSettingsInfo": "Διαχείριση συντομεύσεων εργαλείων AI", "googleAppsMenuText": "Εφαρμογές Google", "googleAppsMenuInfo": "Εμφάνιση συντομεύσεων για Εφαρμογές Google", "googleAppsHover": "Εφαρμογές Google", // Λίστα Εργασιών "todoListText": "Λίστα Εργασιών", "todoListInfo": "Εμφάνιση καθημερινής λίστας εργασιών", "todoListHover": "Λίστα Εργασιών", "todoPlaceholder": "Προσθήκη εργασίας...", // Ρολόι "hideClockBox": "Απόκρυψη Ρολογιού", "hideClockBoxInfo": "Απόκρυψη ρολογιού και ημερομηνίας", "digitalclocktitle": "Ψηφιακό Ρολόι", "digitalclockinfo": "Μετάβαση στο ψηφιακό ρολόι", "timeformattitle": "Μορφή 12 ωρών", "timeformatinfo": "Χρήση μορφής ώρας 12 ωρών", "greetingtitle": "Χαιρετισμός", "greetinginfo": "Εμφάνιση χαιρετισμού κάτω από το προσαρμοσμένο κείμενο", // Διάφορα "userTextTitle": "Προσαρμόσιμο Κείμενο", "userTextInfo": "Εμφάνιση προσαρμοσμένου κειμένου κάτω από το ρολόι", "fahrenheitCelsiusCheckbox": "Μετάβαση σε Φαρενάιτ", "fahrenheitCelsiusText": "Ανανεώστε τη σελίδα για να εφαρμοστούν οι αλλαγές", "hideWeatherTitle": "Απόκρυψη Καιρού", "hideWeatherInfo": "Απενεργοποίηση γραφικών στοιχείων καιρού", "hideWeatherBox": "Απόκρυψη Κάρτας Καιρού", "hideWeatherBoxInfo": "Εμφάνιση μόνο της ένδειξης θερμοκρασίας", "minMaxTempText": "Ελάχιστη-Μέγιστη Θερμοκρασία", "minMaxTempSubText": "Αντικατάσταση της 'Αίσθησης' με την ελάχιστη και μέγιστη θερμοκρασία", // Αναζήτηση "micIconTitle": "Απόκρυψη Εικονιδίου Μικροφώνου", "micIconInfo": "Αν η φωνητική πληκτρολόγηση δεν λειτουργεί", "hideSearchWith": "Απόκρυψη Μηχανών Αναζήτησης", "hideSearchWithInfo": "Εναλλαγή μηχανών αναζήτησης κάνοντας κλικ στο εικονίδιό τους", "motivationalQuotesText": "Παρακινητικά Αποφθέγματα", "motivationalQuotesInfo": "Εμφάνιση αποφθεγμάτων κάτω από τη γραμμή αναζήτησης", "search_suggestions_button": "Προτάσεις Αναζήτησης", "search_suggestions_text": "Ενεργοποίηση προτάσεων αναζήτησης", // Proxy "useproxytitletext": "Παράκαμψη Proxy", "useproxyText": "Αν οι προτάσεις αναζήτησης δεν λειτουργούν", "ProxyText": "Proxy Παράκαμψης CORS", "ProxySubtext": "Προσθέστε τον δικό σας proxy παράκαμψης CORS", "HostproxyButton": "Φιλοξενήστε τον δικό σας proxy", // Τοποθεσία "useGPS": "Χρήση GPS", "useGPSInfo": "Ενεργοποίηση GPS για ζωντανές ενημερώσεις τοποθεσίας", "UserLocText": "Εισαγάγετε την Τοποθεσία σας", "UserLocSubtext": "Αν η τοποθεσία του καιρού δεν είναι σωστή", "userLoc": "Η Πόλη σας ή Συντεταγμένες (Γεωγραφικό Πλάτος, Γεωγραφικό Μήκος)", "PrivacyPolicy": "Πολιτική απορρήτου", // Καιρός "WeatherApiText": "Εισαγάγετε το κλειδί σας WeatherAPI", "WeatherApiSubtext": "Αν η λειτουργία καιρού δεν λειτουργεί", "userAPI": "Το κλειδί σας weatherAPI", "LearnMoreButton": "Μάθετε περισσότερα", "saveAPI": "Αποθήκευση", // Στοιχεία Σώματος // Ημερολόγιο "days": ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'], //"months": ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'], "months": ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μάι', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοέ', 'Δεκ'], // Σελιδοδείκτες "bookmarksHeading": "Σελιδοδείκτες", "bookmarkSortBy": "Ταξινόμηση κατά", "sortAlphabetical": "Α-Ω", "sortTimeAdded": "Παλιό-Νέο", "bookmarkViewAs": "Προβολή ως", "bookmarkViewGrid": "Πλέγμα", "bookmarkViewList": "Λίστα", "bookmarkSearch": "Αναζήτηση σελιδοδείκτη", "editBookmarkHeading": "Επεξεργασία Σελιδοδείκτη", "editBookmarkName": "Όνομα Σελιδοδείκτη", "editBookmarkURL": "URL Σελιδοδείκτη", // Στοιχείο Νέας Καρτέλας "conditionText": "Γεια! Πώς είστε σήμερα;", "humidityLevel": "Υγρασία", "feelsLike": "Αίσθηση", "minMaxTemp": "Ελάχ. ~ Μέγ.", "location": "Γη", "enterBtn": "Αναζήτηση", "searchPlaceholder": "Πληκτρολογήστε εδώ...", "listenPlaceholder": "Ακρόαση...", "searchWithHint": "Αναζήτηση με", "searchOnHint": "Αναζήτηση σε", "userText": "Κλικ εδώ για επεξεργασία", // Χαιρετισμός greeting: { "morning": "Καλημέρα!", "afternoon": "Καλησπέρα!", "evening": "Καλησπέρα!" }, // Μηχανές Αναζήτησης "defaultEngine": "Προεπιλογή", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Εικόνες", "redditEngine": "Reddit", "wikipediaEngine": "Βικιπαίδεια", "quoraEngine": "Quora", // Εργαλεία AI "ai_tools": "Εργαλεία AI", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Επιλέξτε ποια εργαλεία AI θα εμφανίζονται", "resetAISettingsBtn": "Επαναφορά", // Θέμα "enableDarkMode": "Σκοτεινή Λειτουργία (Πειραματική)", "enableDarkModeInfo": "Ενεργοποίηση θεμάτων σκοτεινής λειτουργίας", // Ταπετσαρία και ρυθμίσεις "uploadWallpaperText": "Μεταφόρτωση Ταπετσαρίας", "rangColor": "Επιλογή χρώματος", "backupText": "Αντίγραφο ασφαλείας", "restoreText": "Επαναφορά", "resetsettings": "Επαναφορά Ρυθμίσεων", "menuCloseText": "Κλείσιμο", // Συμβουλές "switchSearchModes": "Εναλλαγή Τρόπων Αναζήτησης", "switchSearchModesInfo": "Κάντε κλικ στο 'Αναζήτηση με' για να αλλάξετε τον τρόπο.", "adjustZoom": "Προσαρμογή Μεγέθυνσης", "adjustZoomInfo": "Πατήστε Ctrl + \"+\" ή Ctrl + \"-\" για να προσαρμόσετε τη μεγέθυνση.", "changeBrowserTheme": "Αλλαγή Θέματος Περιηγητή", "chromeThemeInfo": "Κάντε κλικ στις τρεις τελείες (⋮) > Περισσότερα εργαλεία > Προσαρμογή Chrome και, στη συνέχεια, επιλέξτε ένα χρώμα που ταιριάζει με το θέμα της επέκτασης.", "edgeThemeInfo": "Μεταβείτε στις Ρυθμίσεις > Εμφάνιση και, στη συνέχεια, επιλέξτε ένα χρώμα που ταιριάζει με το θέμα της επέκτασης.", "braveThemeInfo": 'Επισκεφθείτε το Chrome Theme Store, κατεβάστε και εφαρμόστε το θέμα που ταιριάζει με την επέκταση.', "firefoxThemeInfo": 'Επισκεφθείτε τα Θέματα του Firefox, κατεβάστε και εφαρμόστε το θέμα που ταιριάζει με την επέκταση.', "updateFirefoxHomepage": "Ενημέρωση Αρχικής Σελίδας", "updateFirefoxHomepageInfo": "Για να αλλάξετε και την αρχική σας σελίδα όπως τη νέα καρτέλα, επισκεφθείτε αυτόν τον σύνδεσμο και ακολουθήστε τις οδηγίες.", "dontShowTips": "Να μην εμφανιστεί ξανά", // Παράθυρα διαλόγου (ειδοποιήσεις) "okText": "OK", "yesText": "Ναι", "noText": "Όχι", "agreeText": "Συμφωνώ", "cancelText": "Άκυρο", "confirmWallpaper": "Θα θέλατε να ορίσετε μια νέα εικόνα ως ταπετσαρία σας για σήμερα;", "confirmRestore": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε τις ρυθμίσεις σας; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", "Nobackgroundset": "Δεν έχει οριστεί καμία εικόνα φόντου.", "clearbackgroundimage": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την εικόνα φόντου;", "ProxyDisclaimer": "Όλες οι λειτουργίες proxy είναι απενεργοποιημένες από προεπιλογή.\n\nΑν ενεργοποιήσετε τις προτάσεις αναζήτησης και τον proxy παράκαμψης CORS, συνιστάται έντονα να φιλοξενήσετε τον δικό σας proxy για βελτιωμένη προστασία της ιδιωτικής ζωής.\n\nΑπό προεπιλογή, ο proxy θα οριστεί σε https://mynt-proxy.rhythmcorehq.com, που σημαίνει ότι όλα τα δεδομένα σας θα διέρχονται μέσω αυτής της υπηρεσίας, γεγονός που μπορεί να εγείρει ανησυχίες για την προστασία της ιδιωτικής ζωής.", "GPSDisclaimer": "Τα δεδομένα της τοποθεσίας σας χρησιμοποιούνται αποκλειστικά για την παροχή ακριβών ενημερώσεων για τον καιρό. Αποθηκεύονται προσωρινά στον περιηγητή και δεν κοινοποιούνται σε τρίτες υπηρεσίες ούτε είναι προσβάσιμα από εμάς.\n\nΕνεργοποιώντας το GPS, συναινείτε στην κοινοποίηση της τοποθεσίας σας με την επέκταση τοπικά.", "failedbackup": "Η δημιουργία αντιγράφου ασφαλείας απέτυχε: ", "restorecompleted": "Η επαναφορά ολοκληρώθηκε με επιτυχία!", "restorefailed": "Η επαναφορά απέτυχε: ", "invalidBackup": "Επιλέχθηκε μη έγκυρο αρχείο αντιγράφου ασφαλείας.", "deleteBookmark": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον σελιδοδείκτη \"{title}\";", "UnsupportedBrowser": "Οι σελιδοδείκτες δεν υποστηρίζονται στον περιηγητή σας.", "resetShortcutsPrompt": "Όλες οι αποθηκευμένες συντομεύσεις θα διαγραφούν και θα επανέλθουν στις προεπιλογές. Θέλετε να συνεχίσετε;" }; ================================================ FILE: locales/en.js ================================================ // English (Default) const en = { "newTabTitle": "New Tab", // Menu Items "github": "GitHub", "feedback": "Feedback", // Section titles "personalizationSectionTitle": "Personalization", "clockSectionTitle": "Clock", "searchSectionTitle": "Search", "weatherSectionTitle": "Weather", "appearanceSectionTitle": "Appearance", "settingsSectionTitle": "Settings", // Shortcuts "shortcutsText": "Shortcuts", "enableShortcutsText": "Show saved shortcuts", "editShortcutsText": "Edit Shortcuts", "shortcutsInfoText": "Choose which shortcuts get shown", "editShortcutsList": "Saved Shortcuts", "editShortcutsListInfo": "You can add new shortcuts by clicking the \"+\" icon or edit existing ones by clicking on the shortcut name or URL.\nTo reset a custom icon, simply clear the image URL.", "adaptiveIconText": "Adaptive Icons", "adaptiveIconInfoText": "Shortcut icons will adapt to theme", "bookmarksText": "Bookmarks", "bookmarksInfo": "Show bookmarks sidebar", "ai_tools_button": "AI Tools", "enable_ai_tools": "Show shortcuts for AI tools", "aiToolsSettingsText": "AI Tools Settings", "aiToolsSettingsInfo": "Manage AI tools shortcuts", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "Show shortcuts for Google Apps", "googleAppsHover": "Google Apps", // Keep this shorter "shortcutDefaultName": "New Shortcut", "shortcutInputName": "Shortcut Name", "shortcutInputUrl": "Shortcut URL", "shortcutInputIcon": "Custom Icon: URL or SVG (optional)", "recentlyAddedBookmarks": "Recently Added", // To-do List "todoListText": "To Do List", "todoListInfo": "Show a daily To Do list", "todoListHover": "ToDo List", // Keep this short "todoPlaceholder": "Add task...", // Clock "hideClockBox": "Hide Clock", "hideClockBoxInfo": "Hide the clock and date", "digitalclocktitle": "Digital Clock", "digitalclockinfo": "Switch to the digital clock", "timeformattitle": "12-Hour Format", "timeformatinfo": "Use 12-hour time format", "greetingtitle": "Greeting", "greetinginfo": "Show greeting below custom text", // Misc "userTextTitle": "Customizable Text", "userTextInfo": "Show custom text below the clock", "fahrenheitCelsiusCheckbox": "Switch to Fahrenheit", "fahrenheitCelsiusText": "Refresh the page to apply changes", "hideWeatherTitle": "Hide Weather", "hideWeatherInfo": "Disable the weather widgets", "hideWeatherBox": "Hide Weather Card", // Toggle for mobile devices only "hideWeatherBoxInfo": "Show only temperature pill", "minMaxTempText": "Min-Max Temperature", "minMaxTempSubText": "Replace 'Feels Like' with minimum and maximum temperature", // Search "micIconTitle": "Hide Microphone Icon", "micIconInfo": "If voice typing is not working", "hideSearchWith": "Hide Search Engines", "hideSearchWithInfo": "Switch between search engines by clicking its icon", "motivationalQuotesText": "Motivational Quotes", "motivationalQuotesInfo": "Show quotes below the searchbar", "newQuoteOnRefreshText": "Daily Quote", "newQuoteOnRefreshInfo": "Show one quote per day instead of refreshing each time", "search_suggestions_button": "Search Suggestions", "search_suggestions_text": "Enable search suggestions", // Proxy "useproxytitletext": "Proxy Bypass", "useproxyText": "If search suggestions aren't working", "ProxyText": "CORS Bypass Proxy", "ProxySubtext": "Add your own CORS bypass proxy", "HostproxyButton": "Host your own proxy", // Location "useGPS": "Use GPS", "useGPSInfo": "Enable GPS for live location updates", "UserLocText": "Enter your Location", "UserLocSubtext": "If the weather location isn't correct", "userLoc": "Your City or Coordinates (Latitude, Longitude)", "PrivacyPolicy": "Privacy policy", // Weather "WeatherApiText": "Enter your WeatherAPI key", // For 'WeatherAPI' string, only transliterate "WeatherApiSubtext": "If the weather functionality isn't working", "userAPI": "Your weatherAPI key", "LearnMoreButton": "Learn more", "saveAPI": "Save", // Body Items // Calendar "days": ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], "months": ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], // Bookmarks "bookmarksHeading": "Bookmarks", "bookmarkSortBy": "Sort by", "sortAlphabetical": "A-Z", "sortTimeAdded": "Old-New", "bookmarkViewAs": "View as", "bookmarkViewGrid": "Grid", // Keep this shorter "bookmarkViewList": "List", // Keep this shorter "bookmarkSearch": "Search bookmark", "editBookmarkHeading": "Edit Bookmark", "editBookmarkName": "Bookmark Name", "editBookmarkURL": "Bookmark URL", // New Tab Item "conditionText": "Hello! How are you today?", "humidityLevel": "Humidity", "feelsLike": "Feels", "minMaxTemp": "Min ~ Max", "location": "Earth", "enterBtn": "Search", "searchPlaceholder": "Type here...", "listenPlaceholder": "Listening...", "searchWithHint": "Search With", "searchOnHint": "Search On", "userText": "Click here to edit", // Greeting greeting: { "morning": "Good Morning!", "afternoon": "Good Afternoon!", "evening": "Good Evening!" }, // Search Engines "defaultEngine": "Default", "googleEngine": "Google", "duckEngine": "Duck", // DuckDuckGo "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Images", // Google Images, https://www.google.com/search?q=check&hl=bn "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI Tools", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Select which AI tools to display", "resetAISettingsBtn": "Reset", // Theme "lightThemed": "Light", "darkThemed": "Dark", "systemThemed": "System", // Wallpaper and settings "uploadWallpaperText": "Upload Wallpaper", // Keep this short "rangColor": "Pick color", // Keep this short "opacityTitle": "Opacity", "adjustOpacityDesc": "Adjust interface transparency", "backupText": "Backup", "restoreText": "Restore", "resetsettings": "Reset Settings", "menuCloseText": "Close", // Tips "switchSearchModes": "Switch Search Modes", "switchSearchModesInfo": "Click on ‘Search With’ to change the mode.", "adjustZoom": "Adjust Zoom", "adjustZoomInfo": "Press Ctrl + \"+\" or Ctrl + \"-\" to adjust the zoom.", "changeBrowserTheme": "Change Browser Theme", "chromeThemeInfo": "Click the three dots (⋮) > More tools > Customize Chrome, then choose a color that matches the extension theme.", "edgeThemeInfo": "Goto Settings > Appearance, then choose a color that matches the extension theme.", "braveThemeInfo": "Visit Chrome Theme Store, download and apply the theme that matches the extension.", "firefoxThemeInfo": "Visit Firefox Themes, download and apply the theme that matches the extension.", "updateFirefoxHomepage": "Update Homepage", "updateFirefoxHomepageInfo": "To change your homepage like the new tab as well, visit this link and follow the instructions.", "dontShowTips": "Don't show it again", // Footer Toast "footerToastTitle": "Seeing a banner at the bottom?", "footerToastMessage": "To hide it, right-click it and select 'Hide Footer on New Tab Page'.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Yes", "noText": "No", "agreeText": "I Agree", "cancelText": "Cancel", "confirmWallpaper": "Would you like to set a new image as your wallpaper for the day?", "confirmRestore": "Are you sure you want to reset your settings? This action cannot be undone.", "Nobackgroundset": "No background image is currently set.", "clearbackgroundimage": "Are you sure you want to clear the background image?", "ProxyDisclaimer": "All proxy features are off by default.\n\nIf you enable search suggestions and CORS bypass proxy, it is strongly recommended to host your own proxy for enhanced privacy.\n\nBy default, the proxy will be set to https://mynt-proxy.rhythmcorehq.com, meaning all your data will go through this service, which may pose privacy concerns.", "GPSDisclaimer": "Your location data is used solely to provide accurate weather updates. It is temporarily stored within the browser and neither shared with any third-party services nor accessible to us.\n\nBy enabling GPS, you consent to sharing your location with the extension locally.", "failedbackup": "Backup failed: ", "restorecompleted": "Restore completed successfully!", "restorefailed": "Restore failed: ", "invalidBackup": "Invalid backup file selected.", "deleteBookmark": "Are you sure you want to delete the bookmark \"{title}\"?", // Do not translate {title} "UnsupportedBrowser": "Bookmarks are not supported in your browser.", "resetShortcutsPrompt": "All saved shortcuts will be deleted and reset to default. Do you want to continue?", "invalidFileTypeMessage": "Please select a valid image file.", "invalidSvgMessage": "Inserted SVG is invalid, or it contains unsafe content and cannot be used as an icon.", "invalidIconUrlMessage": "Please enter a valid image URL (must start with https://, http://, or data:image/).", "iconFileTooLargeMessage": "Selected file is too large: {size} KB. Please use a file smaller than {max} KB.", "iconStorageQuotaMessage": "Icon couldn’t be saved because the storage limit has been reached. Remove some custom icons or use a smaller image." }; ================================================ FILE: locales/es.js ================================================ // Spanish const es = { // Menu Items "github": "GitHub", "feedback": "Comentarios", // Section titles "personalizationSectionTitle": "Personalización", "clockSectionTitle": "Reloj", "searchSectionTitle": "Buscar", "weatherSectionTitle": "Clima", "appearanceSectionTitle": "Apariencia", "settingsSectionTitle": "Configuración", // Shortcuts "shortcutsText": "Accesos directos", "enableShortcutsText": "Mostrar accesos directos guardados", "editShortcutsText": "Editar accesos directos", "shortcutsInfoText": "Elige qué accesos directos mostrar", "editShortcutsList": "Accesos directos guardados", "editShortcutsListInfo": "Puedes añadir nuevos atajos haciendo click en \"+\" o editando los existentes, haciendo click en el atajo o URL.", "adaptiveIconText": "Iconos adaptativos", "adaptiveIconInfoText": "Los iconos de accesos directos se adaptarán al tema", "bookmarksText": "Marcadores", "bookmarksInfo": "Mostrar barra lateral de marcadores", "ai_tools_button": "Herramientas de IA", "enable_ai_tools": "Mostrar accesos directos de herramientas de IA", "aiToolsSettingsText": "Ajustes de Herramientas de IA", "aiToolsSettingsInfo": "Gestionar atajos de Herramientas de IA", "googleAppsMenuText": "Aplicaciones de Google", "googleAppsMenuInfo": "Mostrar accesos directos a las apps de Google", "googleAppsHover": "Aplicaciones de Google", // To-do List "todoListText": "Lista de tareas", "todoListInfo": "Mostrar una lista diaria de tareas", "todoListHover": "Lista de tareas", "todoPlaceholder": "Añadir tarea...", // Clock "hideClockBox": "Ocultar Reloj", "hideClockBoxInfo": "Ocultar reloj y fecha", "digitalclocktitle": "Reloj digital", "digitalclockinfo": "Cambiar a reloj digital", "timeformattitle": "Formato de 12 horas", "timeformatinfo": "Usar formato de 12 horas", "greetingtitle": "Saludo", "greetinginfo": "Mostrar saludo debajo del texto personalizado", // Misc "userTextTitle": "Texto personalizable", "userTextInfo": "Mostrar texto personalizado debajo del reloj", "fahrenheitCelsiusCheckbox": "Cambiar a Fahrenheit", "fahrenheitCelsiusText": "Recarga la página para aplicar cambios", "hideWeatherTitle": "Ocultar el clima", "hideWeatherInfo": "Deshabilitar las widgets del clima", "hideWeatherBox": "Ocultar tarjeta del clima", "hideWeatherBoxInfo": "Mostrar solo la etiqueta del clima", "minMaxTempText": "Temperatura Mínima-Máxima", "minMaxTempSubText": "Mostrar temperatura mínima y máxima en lugar de \"Sensación\"", // Search "micIconTitle": "Ocultar micrófono", "micIconInfo": "En caso de que la escritura por voz no funcione", "hideSearchWith": "Ocultar motores de búsqueda", "hideSearchWithInfo": "Cambiar entre motores de búsqueda haciendo click en \"Buscar con\"", "motivationalQuotesText": "Citas motivacionales", "motivationalQuotesInfo": "Mostrar citas debajo de barra de búsqueda", "search_suggestions_button": "Sugerencias de búsqueda", "search_suggestions_text": "Habilitar sugerencias de búsqueda", // Proxy "useproxytitletext": "Omisión de proxy", "useproxyText": "Si las sugerencias de búsqueda no funcionan", "ProxyText": "Proxy para omitir CORS", "ProxySubtext": "Añade tu propio proxy CORS", "HostproxyButton": "Aloja tu propio proxy", // Location "useGPS": "Usar GPS", "useGPSInfo": "Habilitar GPS para actualizaciones de ubicación", "UserLocText": "Ingresa tu ubicación", "UserLocSubtext": "Si la ubicación del clima es incorrecta", "userLoc": "Ciudad o coordenadas (Latitud, Longitud)", "PrivacyPolicy": "Política de privacidad", // Weather "WeatherApiText": "Ingresa tu clave de WeatherAPI", "WeatherApiSubtext": "Si hay un problema con la funcionalidad del clima", "userAPI": "Tu clave de WeatherAPI", "LearnMoreButton": "Más información", "saveAPI": "Guardar", // Body Items // Calendar "days": ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'], "months": ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], // Bookmarks "bookmarksHeading": "Marcadores", "bookmarkSortBy": "Ordenar por", "sortAlphabetical": "A-Z", "sortTimeAdded": "Viejo-Nuevo", "bookmarkViewAs": "Ver como", "bookmarkViewGrid": "Icono", "bookmarkViewList": "Lista", "bookmarkSearch": "Buscar marcador", "editBookmarkHeading": "Editar marcador", "editBookmarkName": "Nombre del marcador", "editBookmarkURL": "URL del marcador", // New Tab Item "conditionText": "¡Hola! ¿Cómo estás hoy?", "humidityLevel": "Humedad", "feelsLike": "Sensación", "minMaxTemp": "Min ~ Max", "location": "Ubicación", "enterBtn": "Buscar", "searchPlaceholder": "Escribe tu búsqueda...", "listenPlaceholder": "Escuchando...", "searchWithHint": "Buscar con", "searchOnHint": "Buscar en", "userText": "Haz clic aquí para editar", // Greeting greeting: { "morning": "¡Buenos días!", "afternoon": "¡Buenas tardes!", "evening": "¡Buenas noches!" }, // Search Engines "defaultEngine": "Predeterminado", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Imágenes", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Herramientas de IA", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Selecciona qué herramientas de IA utilizar", "resetAISettingsBtn": "Restablecer", // Theme "lightThemed": "Claro", "darkThemed": "Oscuro", "systemThemed": "Sistema", // Wallpaper and settings "uploadWallpaperText": "Subir Wallpaper", "rangColor": "Elegir color", "opacityTitle": "Opacidad", "adjustOpacityDesc": "Ajustar transparencia de interfaz", "backupText": "Copia de seguridad", "restoreText": "Restablecer", "resetsettings": "Restablecer configuraciones", "menuCloseText": "Cerrar", // Tips "switchSearchModes": "Cambiar modos de búsqueda", "switchSearchModesInfo": "Haz click en \"Buscar con\" para cambiar el modo.", "adjustZoom": "Ajustar zoom", "adjustZoomInfo": "Presiona Ctrl + \"+\" o Ctrl + \"-\" para ajustar el zoom.", "changeBrowserTheme": "Cambiar tema del navegador", "chromeThemeInfo": "Haz click en los tres puntos (⋮) > Más herramientas > Personalizar Chrome, luego escoge un color que coincida con la extensión.", "edgeThemeInfo": "Ve a Configuración > Apariencia, luego escoge el color que coincida con la extensión.", "braveThemeInfo": "Visita Chrome Web Store de temas, descarga y aplica el tema que combine con la extensión.", "firefoxThemeInfo": "Visita Temas para Firefox, descarga y aplica el tema que combine con la extensión.", "updateFirefoxHomepage": "Actualizar página de inicio", "updateFirefoxHomepageInfo": "Para cambiar tu página de inicio y también la nueva pestaña, visita este enlace y sigue las instrucciones.", "dontShowTips": "No volver a mostrar", // Footer Toast "footerToastTitle": "¿Ver un banner en la parte inferior?", "footerToastMessage": "Para ocultarlo, haz click sobre él y selecciona 'Ocultar el pie de página en la página de pestaña nueva'.", // Dialog boxes (alerts) "okText": "Aceptar", "yesText": "Sí", "noText": "No", "agreeText": "Acepto", "cancelText": "Cancelar", "confirmWallpaper": "¿Deseas establecer una nueva imagen como fondo de pantalla para el día?", "confirmRestore": "¿Estás seguro de que deseas restablecer la configuración? Esta acción no se puede deshacer.", "Nobackgroundset": "No se ha establecido ninguna imagen de fondo.", "clearbackgroundimage": "¿Estás seguro de que deseas borrar la imagen de fondo?", "ProxyDisclaimer": "Todas las funciones de proxy están desactivadas por defecto.\n\nSi habilitas las sugerencias de búsqueda y el proxy de omisión CORS, se recomienda encarecidamente alojar tu propio proxy para mejorar la privacidad.\n\nPor defecto, el proxy se establecerá en https://mynt-proxy.rhythmcorehq.com, lo que significa que todos tus datos pasarán por este servicio, lo que puede plantear preocupaciones de privacidad.", "GPSDisclaimer": "Tus datos de ubicación se usan únicamente para ofrecer actualizaciones meteorológicas precisas. Se almacenan temporalmente en el navegador y no se comparten con servicios de terceros ni son accesibles para nosotros.\n\nAl habilitar el GPS, aceptas compartir tu ubicación con la extensión de forma local.", "failedbackup": "Error de copia de seguridad: ", "restorecompleted": "¡Restauración completada con éxito!", "restorefailed": "Error de restauración: ", "invalidBackup": "Archivo de copia de seguridad no válido.", "deleteBookmark": "¿Estás seguro de que deseas eliminar el marcador \"{title}\"?", "UnsupportedBrowser": "Los marcadores no son compatibles con tu navegador", "resetShortcutsPrompt": "Todos los marcadores guardados serán eliminados y restablecidos ¿Deseas continuar?", }; ================================================ FILE: locales/fa.js ================================================ // Farsi (Persian) const fa = { // Menu Items github: "گیت‌هاب", feedback: "بازخورد", // Shortcuts shortcutsText: "میانبر‌ها", enableShortcutsText: "نمایش میانبرهای ذخیره شده", editShortcutsText: "ویرایش میانبر‌ها", shortcutsInfoText: "انتخاب کنید کدام میانبر‌ها نمایش داده شوند", editShortcutsList: "میانبرهای ذخیره شده", editShortcutsListInfo: 'می‌توانید با کلیک روی آیکون "+" میانبرهای جدید اضافه کنید یا با کلیک روی نام یا URL میانبر، موارد موجود را ویرایش کنید.', adaptiveIconText: "آیکون‌های تطبیقی", adaptiveIconInfoText: "آیکون‌های میانبر با رنگ پوسته مطابقت داشته و کوچکتر ظاهر می‌شوند", bookmarksText: "نشانک‌ها", bookmarksInfo: "نمایش نوار کناری نشانک‌ها", ai_tools_button: "ابزارهای هوش مصنوعی", enable_ai_tools: "نمایش میانبرهای ابزارهای هوش مصنوعی", aiToolsSettingsText: "تنظیمات ابزارهای هوش مصنوعی", aiToolsSettingsInfo: "مدیریت میانبرهای ابزارهای هوش مصنوعی", googleAppsMenuText: "برنامه‌های گوگل", googleAppsMenuInfo: "نمایش میانبرهای برنامه‌های گوگل", googleAppsHover: "برنامه‌های گوگل", // To-do List todoListText: "لیست کارها", todoListInfo: "نمایش لیست کارهای روزانه", todoListHover: "لیست کارها", todoPlaceholder: "افزودن کار...", // Clock hideClockBox: "پنهان کردن ساعت", hideClockBoxInfo: "پنهان کردن ساعت و تاریخ", digitalclocktitle: "ساعت دیجیتال", digitalclockinfo: "تغییر به ساعت دیجیتال", timeformattitle: "قالب ۱۲ ساعته", timeformatinfo: "استفاده از قالب زمانی ۱۲ ساعته", greetingtitle: "خوشامدگویی", greetinginfo: "نمایش خوشامدگویی زیر متن سفارشی", // Misc userTextTitle: "متن قابل تنظیم", userTextInfo: "نمایش متن سفارشی زیر ساعت", fahrenheitCelsiusCheckbox: "تغییر به فارنهایت", fahrenheitCelsiusText: "برای اعمال تغییرات، صفحه را بازخوانی کنید", hideWeatherTitle: "پنهان کردن آب و هوا", hideWeatherInfo: "غیرفعال کردن ویجت‌های آب و هوا", hideWeatherBox: "پنهان کردن کارت آب و هوا", hideWeatherBoxInfo: "نمایش فقط نشانگر دما", minMaxTempText: "دمای حداقل-حداکثر", minMaxTempSubText: "جایگزینی 'دمای محسوس' با دمای حداقل و حداکثر", // Search micIconTitle: "پنهان کردن آیکون میکروفون", micIconInfo: "اگر تایپ صوتی کار نمی‌کند", hideSearchWith: "پنهان کردن موتورهای جستجو", hideSearchWithInfo: "با کلیک روی آیکون موتور جستجو، بین آنها جابجا شوید", motivationalQuotesText: "جملات انگیزشی", motivationalQuotesInfo: "نمایش جملات زیر نوار جستجو", search_suggestions_button: "پیشنهادات جستجو", search_suggestions_text: "فعال کردن پیشنهادات جستجو", // Proxy useproxytitletext: "دور زدن پروکسی", useproxyText: "اگر پیشنهادات جستجو کار نمی‌کنند", ProxyText: "پروکسی دور زدن CORS", ProxySubtext: "پروکسی دور زدن CORS خود را اضافه کنید", HostproxyButton: "میزبانی پروکسی شخصی", // Location useGPS: "استفاده از GPS", useGPSInfo: "فعال کردن GPS برای به‌روزرسانی زنده موقعیت مکانی", UserLocText: "موقعیت مکانی خود را وارد کنید", UserLocSubtext: "اگر موقعیت مکانی آب و هوا صحیح نیست", userLoc: "شهر یا مختصات شما (عرض جغرافیایی، طول جغرافیایی)", PrivacyPolicy: "سیاست حفظ حریم خصوصی", // Weather WeatherApiText: "کلید WeatherAPI خود را وارد کنید", // ودرای‌پی‌آی WeatherApiSubtext: "اگر عملکرد آب و هوا کار نمی‌کند", userAPI: "کلید weatherAPI شما", LearnMoreButton: "بیشتر بدانید", saveAPI: "ذخیره", // Body Items // Calendar days: ["یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], months: [ "ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر", ], // Bookmarks bookmarksHeading: "نشانک‌ها", bookmarkSortBy: "مرتب‌سازی بر اساس", sortAlphabetical: "A-Z", sortTimeAdded: "قدیمی-جدید", bookmarkViewAs: "نمایش به صورت", bookmarkViewGrid: "شبکه‌ای", bookmarkViewList: "لیستی", bookmarkSearch: "جستجوی نشانک", editBookmarkHeading: "ویرایش نشانک", editBookmarkName: "نام نشانک", editBookmarkURL: "URL نشانک", // New Tab Item conditionText: "سلام! امروز چطورید؟", humidityLevel: "رطوبت", feelsLike: "دمای محسوس", minMaxTemp: "حداقل ~ حداکثر", location: "زمین", enterBtn: "جستجو", searchPlaceholder: "اینجا تایپ کنید...", listenPlaceholder: "در حال شنیدن...", searchWithHint: "جستجو با", searchOnHint: "جستجو در", userText: "برای ویرایش اینجا کلیک کنید", // Greeting greeting: { morning: "صبح بخیر!", afternoon: "بعد از ظهر بخیر!", evening: "عصر بخیر!", }, // Search Engines defaultEngine: "پیش‌فرض", googleEngine: "گوگل", duckEngine: "داک‌داک‌گو", bingEngine: "بینگ", braveEngine: "بریو", youtubeEngine: "یوتیوب", gImagesEngine: "تصاویر", redditEngine: "ردیت", wikipediaEngine: "ویکی‌پدیا", quoraEngine: "کورا", // AI Tools ai_tools: "ابزارهای هوش مصنوعی", chatGPT: "ChatGPT", gemini: "Gemini", copilot: "Copilot", claude: "Claude", grok: "Grok", qwen: "Qwen", perplexity: "Perplexity", deepseek: "DeepSeek", metaAI: "Meta AI", firefly: "Adobe Firefly", aiSettingsIntro: "انتخاب کنید کدام ابزارهای هوش مصنوعی نمایش داده شوند", resetAISettingsBtn: "بازنشانی", // Theme enableDarkMode: "حالت تاریک (آزمایشی)", enableDarkModeInfo: "فعال کردن پوسته‌های حالت تاریک", // Wallpaper and settings uploadWallpaperText: "آپلود تصویر زمینه", rangColor: "انتخاب رنگ", opacityTitle: "شفافیت", adjustOpacityDesc: "تنظیم شفافیت رابط کاربری", backupText: "پشتیبان‌گیری", restoreText: "بازیابی", resetsettings: "بازنشانی تنظیمات", menuCloseText: "بستن", // Tips switchSearchModes: "تغییر حالت‌های جستجو", switchSearchModesInfo: "برای تغییر حالت، روی 'جستجو با' کلیک کنید.", adjustZoom: "تنظیم بزرگنمایی", adjustZoomInfo: 'برای تنظیم بزرگنمایی، Ctrl + "+" یا Ctrl + "-" را فشار دهید.', changeBrowserTheme: "تغییر پوسته مرورگر", chromeThemeInfo: "روی سه نقطه (⋮) > ابزارهای بیشتر > سفارشی کردن Chrome کلیک کنید، سپس رنگی را انتخاب کنید که با پوسته افزونه مطابقت داشته باشد.", edgeThemeInfo: "به تنظیمات > ظاهر بروید، سپس رنگی را انتخاب کنید که با پوسته افزونه مطابقت داشته باشد.", braveThemeInfo: 'از فروشگاه پوسته Chrome بازدید کنید، پوسته‌ای را که با افزونه مطابقت دارد دانلود و اعمال کنید.', firefoxThemeInfo: 'از پوسته‌های Firefox بازدید کنید، پوسته‌ای را که با افزونه مطابقت دارد دانلود و اعمال کنید.', updateFirefoxHomepage: "به‌روزرسانی صفحه اصلی", updateFirefoxHomepageInfo: 'برای تغییر صفحه اصلی خود مانند برگه جدید، از این پیوند بازدید کرده و دستورالعمل‌ها را دنبال کنید.', dontShowTips: "دیگر نمایش نده", // Dialog boxes (alerts) okText: "تأیید", yesText: "بله", noText: "خیر", agreeText: "موافقم", cancelText: "لغو", confirmWallpaper: "آیا می‌خواهید تصویر جدیدی را به عنوان تصویر زمینه امروز خود تنظیم کنید؟", confirmRestore: "آیا مطمئن هستید که می‌خواهید تنظیمات خود را بازنشانی کنید؟ این عمل قابل بازگشت نیست.", Nobackgroundset: "در حال حاضر هیچ تصویر پس‌زمینه‌ای تنظیم نشده است.", clearbackgroundimage: "آیا مطمئن هستید که می‌خواهید تصویر پس‌زمینه را پاک کنید؟", ProxyDisclaimer: "تمام ویژگی‌های پروکسی به طور پیش‌فرض خاموش هستند.\n\nاگر پیشنهادات جستجو و پروکسی دور زدن CORS را فعال کنید، به شدت توصیه می‌شود برای افزایش حریم خصوصی، پروکسی شخصی خود را میزبانی کنید.\n\nبه طور پیش‌فرض، پروکسی روی https://mynt-proxy.rhythmcorehq.com تنظیم می‌شود، به این معنی که تمام داده‌های شما از طریق این سرویس عبور می‌کند، که ممکن است نگرانی‌های مربوط به حریم خصوصی را ایجاد کند.", GPSDisclaimer: "داده‌های موقعیت مکانی شما صرفاً برای ارائه به‌روزرسانی‌های دقیق آب و هوا استفاده می‌شود. این داده‌ها به طور موقت در مرورگر ذخیره شده و نه با هیچ سرویس شخص ثالثی به اشتراک گذاشته می‌شود و نه برای ما قابل دسترسی است.\n\nبا فعال کردن GPS، شما با اشتراک‌گذاری موقعیت مکانی خود با افزونه به صورت محلی موافقت می‌کنید.", failedbackup: "پشتیبان‌گیری ناموفق بود: ", restorecompleted: "بازیابی با موفقیت انجام شد!", restorefailed: "بازیابی ناموفق بود: ", invalidBackup: "فایل پشتیبان نامعتبر انتخاب شده است.", deleteBookmark: 'آیا مطمئن هستید که می‌خواهید نشانک "{title}" را حذف کنید؟', UnsupportedBrowser: "نشانک‌ها در مرورگر شما پشتیبانی نمی‌شوند.", resetShortcutsPrompt: "همه میانبرهای ذخیره‌شده حذف و به حالت پیش‌فرض بازنشانی خواهند شد. آیا می‌خواهید ادامه دهید؟" }; ================================================ FILE: locales/fr.js ================================================ // French const fr = { "newTabTitle": "Nouvel Onglet", // Menu Items "github": "GitHub", "feedback": "Feedback", "resetsettings": "Réinitialiser les paramètres", "menuCloseText": "Fermer", // Section titles "personalizationSectionTitle": "Personnalisation", "clockSectionTitle": "Horloge", "searchSectionTitle": "Recherche", "weatherSectionTitle": "Météo", "appearanceSectionTitle": "Apparence", "settingsSectionTitle": "Paramètres", // Shortcuts "shortcutsText": "Raccourcis", "enableShortcutsText": "Afficher les raccourcis enregistrés", "editShortcutsText": "Modifier les raccourcis", "shortcutsInfoText": "Choisir les raccourcis à afficher", "editShortcutsList": "Raccourcis Enregistrés", 'editShortcutsListInfo': 'Vous pouvez ajouter de nouveaux raccourcis en cliquant sur l\'icône « + » ou modifier les raccourcis existants en cliquant sur le nom ou l\'URL du raccourci.', "adaptiveIconText": "Icônes Adaptatives", "adaptiveIconInfoText": "L'icône du raccourci correspondra à la couleur du thème et apparaîtra plus petite", "bookmarksText": "Favoris", "bookmarksInfo": "Afficher la barre latérale des favoris", "ai_tools_button": "Outils IA", "enable_ai_tools": "Afficher les raccourcis pour les Outils IA", "aiToolsSettingsText": "Paramètres des Outils IA", "aiToolsSettingsInfo": "Gérer les raccourcis des Outils IA", "googleAppsMenuText": "Apps Google", "googleAppsMenuInfo": "Afficher les raccourcis pour les Applications Google", "googleAppsHover": "Apps Google", // To-do List "todoListText": "Liste To-Do", "todoListInfo": "Afficher une liste de tâches quotidiennes", "todoListHover": "Liste To-Do", "todoPlaceholder": "Ajouter une tâche...", // Digital Clock "hideClockBox": "Masquer l'horloge", "hideClockBoxInfo": "Afficher ou masquer l'horloge et la date", "digitalclocktitle": "Horloge Numérique", "digitalclockinfo": "Passer à l'horloge numérique", "timeformattitle": "Format 12h", "timeformatinfo": "Utiliser le format 12h", "greetingtitle": "Salutation", "greetinginfo": "Afficher la salutation sous le texte personnalisé", // Misc "userTextTitle": "Texte personnalisé", "userTextInfo": "Afficher le texte personnalisé sous l'horloge", "fahrenheitCelsiusCheckbox": "Passer à Fahrenheit", "fahrenheitCelsiusText": "Actualiser la page pour appliquer les changements", "hideWeatherTitle": "Masquer la météo", "hideWeatherInfo": "Désactiver les widgets de météo", "hideWeatherBox": "Masquer la carte météo", "hideWeatherBoxInfo": "Afficher uniquement la température sur mobile", "minMaxTempText": "Température Min-Max", "minMaxTempSubText": "Remplacer 'Ressenti' par la température minimale et maximale", // Search "micIconTitle": "Masquer l'Icône du Microphone", "micIconInfo": "Si la saisie vocale ne fonctionne pas", "switchSearchModes": "Changer de mode de Recherche", "switchSearchModesInfo": "Cliquez sur ‘Rechercher avec’ pour changer le mode", "hideSearchWith": "Masquer les Moteurs de Recherche", "hideSearchWithInfo": "Passez d'un moteur de recherche à l'autre en cliquant sur son icône", "motivationalQuotesText": "Citations de motivation", "motivationalQuotesInfo": "Afficher les citations sous la barre de recherche", "search_suggestions_button": "Suggestions de Recherche", "search_suggestions_text": "Activer les suggestions de recherche", // Proxy "useproxytitletext": "Contournement du Proxy", "useproxyText": "Si les suggestions de recherche ne fonctionnent pas", "ProxyText": "Proxy de contournement CORS", "ProxySubtext": "Ajouter votre propre proxy de contournement CORS", "HostproxyButton": "Hébergez votre propre proxy", // Location "useGPS": "Utiliser le GPS", "useGPSInfo": "Activer le GPS pour des mises à jour en temps réel de la localisation", "UserLocText": "Saisissez votre localisation", "UserLocSubtext": "Si la localisation de la météo n'est pas correct", "userLoc": "Votre ville ou vos coordonnées (Latitude, Longitude)", "PrivacyPolicy": "Politique de confidentialité", // Weather "WeatherApiText": "Entrez votre clé WeatherAPI", "WeatherApiSubtext": "Si la fonctionnalité météo ne fonctionne pas", "userAPI": "Votre clé WeatherAPI", "LearnMoreButton": "En savoir plus", "saveAPI": "Enregistrer", // Body Items // Calendar "days": ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], "months": ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'], // Bookmarks "bookmarksHeading": "Favoris", "bookmarkSortBy": "Trier par", "sortAlphabetical": "A-Z", "sortTimeAdded": "Plus vieux", "bookmarkViewAs": "Afficher en", "bookmarkViewGrid": "Grille", "bookmarkViewList": "Liste", "bookmarkSearch": "Rechercher un favori", "editBookmarkHeading": "Modifier un favori", "editBookmarkName": "Nom du favori", "editBookmarkURL": "URL du favori", // New Tab Item "conditionText": "Bonjour, comment allez-vous?", "humidityLevel": "Humidité", "feelsLike": "Ressenti", "minMaxTemp": "Min ~ Max", "location": "Terre", "enterBtn": "Rechercher", "searchPlaceholder": "Saisissez ici...", "listenPlaceholder": "Écoute...", "searchWithHint": "Rechercher avec", "searchOnHint": "Rechercher sur", "userText": "Cliquez ici pour modifier", // Greeting greeting: { "morning": "Bonjour!", "afternoon": "Bonsoir!", "evening": "Bonne nuit!" }, // Search Engines "defaultEngine": "Par défaut", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Images", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Outils IA", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Sélectionnez les outils IA à afficher", "resetAISettingsBtn": "Réinitialiser", // Theme "lightThemed": "Clair", "darkThemed": "Sombre", "systemThemed": "Système", // Wallpaper and misc "uploadWallpaperText": "Charger un fond d'écran", "backupText": "Sauvegarder", "restoreText": "Restaurer", "rangColor": "Choisir la couleur", "opacityTitle": "Opacité", "adjustOpacityDesc": "Ajuster la transparence de l'interface", // Tips "switchSearchModes": "Changer de mode de recherche", "switchSearchModesInfo": "Cliquer sur ‘Rechercher avec’ pour changer de mode.", "adjustZoom": "Ajuster le zoom", "adjustZoomInfo": "Appuyez Ctrl + \"+\" ou Ctrl + \"-\" pour ajuster le zoom.", "changeBrowserTheme": "Changer le thème du navigateur", "chromeThemeInfo": "Clquez sur les trois points (⋮) > Plus d'outils > Personnaliser Chrome, puis choisissez une couleur qui correspond au thème de l'extension.", "edgeThemeInfo": "Aller dans Paramètres > Apparence, puis choisissez une couleur qui correspond au thème de l'extension.", "braveThemeInfo": 'Visitez Chrome Theme Store, telecharger et appliquer le thème qui correspond au thème de l\'extension.', "firefoxThemeInfo": 'Visitez Firefox Themes, telecharger et appliquer le thème qui correspond au thème de l\'extension.', "updateFirefoxHomepage": "Mettre à jour la page d'accueil", "updateFirefoxHomepageInfo": "Pour changer votre page d'accueil comme le nouvel onglet, visitez ce lien et suivez les instructions.", "dontShowTips": "Ne plus afficher", // Footer Toast "footerToastTitle": "En train de voir une bannière?", "footerToastMessage": "Pour masquer la bannière, faites un clic droit dessus et sélectionnez 'Masquer le pied de page sur un nouvel onglet'.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Oui", "noText": "Non", "agreeText": "J'accepte", "cancelText": "Annuler", "confirmWallpaper": "Souhaitez-vous définir une nouvelle image comme fond d'écran pour la journée?", "confirmRestore": "Êtes-vous sûr de vouloir réinitialiser vos paramètres? Cette action ne peut être annulée.", "Nobackgroundset": "Aucune image de fond n'est actuellement définie.", "clearbackgroundimage": "Êtes-vous sûr de vouloir effacer l'image de fond?", "ProxyDisclaimer": "Toutes les fonctions du proxy sont désactivées par défaut.\n\nSi vous activez les suggestions de recherche et le proxy de contournement CORS, il est fortement recommandé d'héberger votre propre proxy pour une meilleure confidentialité.\n\nPar défaut, le proxy sera réglé sur https://mynt-proxy.rhythmcorehq.com, ce qui signifie que toutes vos données passeront par ce service, ce qui peut poser des problèmes de confidentialité.", "GPSDisclaimer": "Vos données de localisation sont utilisées uniquement pour fournir des mises à jour météorologiques précises. Elles sont stockées temporairement dans le navigateur et ne sont ni partagées avec des services tiers, ni accessibles à nous.\n\nEn activant le GPS, vous consentez à partager localement votre localisation avec l'extension.", "failedbackup": "Échec de la sauvegarde: ", "restorecompleted": "Restauration terminée avec succès!", "restorefailed": "Échec de la restauration: ", "invalidBackup": "Fichier de sauvegarde invalide", "deleteBookmark": "Êtes-vous sûr de vouloir supprimer le favori \"{title}\"?", "UnsupportedBrowser": "Les favoris ne sont pas supportés dans votre navigateur.", "resetShortcutsPrompt": "Tous les raccourcis enregistrés seront supprimés et réinitialisés par défaut. Voulez-vous continuer?" }; ================================================ FILE: locales/hi.js ================================================ // Hindi const hi = { "newTabTitle": "नया टैब", // Menu Items "github": "गिटहब", "feedback": "प्रतिक्रिया", // Section titles "personalizationSectionTitle": "व्यक्तिगतकरण", "clockSectionTitle": "घड़ी", "searchSectionTitle": "खोज", "weatherSectionTitle": "मौसम", "appearanceSectionTitle": "दिखावट", "settingsSectionTitle": "सेटिंग्स", // Shortcuts "shortcutsText": "शॉर्टकट्स", "enableShortcutsText": "सहेजे गए शॉर्टकट प्रदर्शित करें", "editShortcutsText": "शॉर्टकट्स संपादित करें", "shortcutsInfoText": "निर्धारित करें कि कौन से शॉर्टकट दिखेंगे", "editShortcutsList": "सहेजे गए शॉर्टकट", "editShortcutsListInfo": "आप \"+\" आइकन पर क्लिक करके नए शॉर्टकट्स जोड़ सकते हैं या शॉर्टकट के नाम या URL पर क्लिक करके मौजूदा शॉर्टकट्स को संपादित कर सकते हैं। कस्टम आइकन रीसेट करने के लिए इमेज URL को खाली करें।", "adaptiveIconText": "अनुकूलनीय आइकन", "adaptiveIconInfoText": "शॉर्टकट आइकन थीम से मेल खाते हुए दिखेंगे", "bookmarksText": "बुकमार्क्स", "bookmarksInfo": "बुकमार्क्स साइडबार दिखाएँ", "ai_tools_button": "AI उपकरण", "enable_ai_tools": "AI उपकरणों के शॉर्टकट्स प्रदर्शित करें", "aiToolsSettingsText": "AI उपकरण सेटिंग्स", "aiToolsSettingsInfo": "AI उपकरणों के शॉर्टकट्स प्रबंधित करें", "googleAppsMenuText": "गूगल ऐप्स", "googleAppsMenuInfo": "गूगल ऐप्स के शॉर्टकट्स प्रदर्शित करें", "googleAppsHover": "गूगल ऐप्स", "shortcutDefaultName": "नया शॉर्टकट", "shortcutInputName": "शॉर्टकट का नाम", "shortcutInputUrl": "शॉर्टकट का URL", "shortcutInputIcon": "कस्टम आइकन: URL या SVG (वैकल्पिक)", "recentlyAddedBookmarks": "हाल ही में जोड़े गए", // To-do List "todoListText": "कार्य सूची", "todoListInfo": "दैनिक कार्यों की सूची देखें", "todoListHover": "कार्य सूची", "todoPlaceholder": "कार्य जोड़ें...", // Clock "hideClockBox": "घड़ी छिपाएँ", "hideClockBoxInfo": "घड़ी और तारीख छिपाएँ", "digitalclocktitle": "डिजिटल घड़ी", "digitalclockinfo": "डिजिटल घड़ी पर स्विच करें", "timeformattitle": "12 घंटे का प्रारूप", "timeformatinfo": "12 घंटे का समय प्रारूप उपयोग करें", "greetingtitle": "अभिवादन", "greetinginfo": "कस्टम टेक्स्ट के नीचे अभिवादन दिखाएँ", // Misc "userTextTitle": "कस्टमाइज़ेबल टेक्स्ट", "userTextInfo": "घड़ी के नीचे कस्टम टेक्स्ट दिखाएँ", "fahrenheitCelsiusCheckbox": "तापमान फ़ारेनहाइट में बदलें", "fahrenheitCelsiusText": "बदलाव के लिए पृष्ठ को रीफ्रेश करें", "hideWeatherTitle": "मौसम छिपाएँ", "hideWeatherInfo": "मौसम विजेट्स को अक्षम करें", "hideWeatherBox": "मौसम कार्ड छिपाएँ", "hideWeatherBoxInfo": "केवल तापमान पिल दिखाएँ", "minMaxTempText": "न्यूनतम-अधिकतम तापमान", "minMaxTempSubText": "अनुभूत तापमान की जगह न्यूनतम और अधिकतम तापमान दिखाएँ", // Search "micIconTitle": "माइक्रोफोन आइकन छिपाएँ", "micIconInfo": "अगर वॉइस टाइपिंग काम नहीं कर रहा है", "hideSearchWith": "सर्च इंजन छिपाएँ", "hideSearchWithInfo": "आइकन पर क्लिक करके सर्च इंजन बदलें", "motivationalQuotesText": "प्रेरणादायक उद्धरण", "motivationalQuotesInfo": "खोज बार के नीचे उद्धरण दिखाएँ", "newQuoteOnRefreshText": "दैनिक उद्धरण", "newQuoteOnRefreshInfo": "हर बार रिफ्रेश होने के बजाय दिन में एक ही उद्धरण दिखाएँ", "search_suggestions_button": "खोज सुझाव", "search_suggestions_text": "खोज सुझाव सक्षम करें", // Proxy "useproxytitletext": "प्रॉक्सी बायपास", "useproxyText": "यदि खोज सुझाव काम नहीं कर रहे हैं", "ProxyText": "CORS बायपास प्रॉक्सी", "ProxySubtext": "अपना CORS बायपास प्रॉक्सी जोड़ें", "HostproxyButton": "अपना प्रॉक्सी संचालित करें", // Location "useGPS": "GPS का उपयोग करें", "useGPSInfo": "लाइव स्थान अपडेट के लिए GPS सक्षम करें", "UserLocText": "अपना स्थान दर्ज करें", "UserLocSubtext": "यदि मौसम का स्थान सही नहीं है", "userLoc": "आपका शहर या निर्देशांक (अक्षांश, देशांतर)", "PrivacyPolicy": "गोपनीयता नीति", // Weather "WeatherApiText": "अपनी WeatherAPI कुंजी दर्ज करें", "WeatherApiSubtext": "यदि मौसम की सुविधा काम नहीं कर रही है", "userAPI": "आपकी WeatherAPI कुंजी", "LearnMoreButton": "और जानें", "saveAPI": "सहेजें", // Body Items // Calendar "days": ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], // Truncated for display // "days": ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], // Full "months": ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], // "months": ['जन', 'फर', 'मार्च', 'अप्र', 'मई', 'जून', 'जुला', 'अग', 'सित', 'अक्टू', 'नव', 'दिस'], // Truncated // Bookmarks "bookmarksHeading": "बुकमार्क्स", "bookmarkSortBy": "क्रमबद्ध करें", "sortAlphabetical": "A-Z", "sortTimeAdded": "पुराना-नया", "bookmarkViewAs": "इस रूप में देखें", "bookmarkViewGrid": "ग्रिड", "bookmarkViewList": "लिस्ट", "bookmarkSearch": "बुकमार्क खोजें", "editBookmarkHeading": "बुकमार्क संपादित करें", "editBookmarkName": "बुकमार्क नाम", "editBookmarkURL": "बुकमार्क URL", // New Tab Item "conditionText": "नमस्ते! आप आज कैसे हैं?", "humidityLevel": "नमी", "feelsLike": "महसूस", "minMaxTemp": "न्यून ~ अधिक", "location": "पृथ्वी", "enterBtn": "सर्च करें", "searchPlaceholder": "यहाँ लिखें...", "listenPlaceholder": "सुन रहे हैं...", "searchWithHint": "खोज माध्यम", "searchOnHint": "खोज स्रोत", "userText": "यहाँ अपना टेक्स्ट लिखें", // Greeting greeting: { "morning": "सुप्रभात!", "afternoon": "शुभ अपराह्न!", "evening": "शुभ संध्या!" }, // Search Engines "defaultEngine": "डिफ़ॉल्ट", "googleEngine": "गूगल", "duckEngine": "डकडकगो", "bingEngine": "बिंग", "braveEngine": "ब्रेव", "youtubeEngine": "यूट्यूब", "gImagesEngine": "इमेज", "redditEngine": "रेडिट", "wikipediaEngine": "विकिपीडिया", "quoraEngine": "क्वोरा", // AI Tools "ai_tools": "AI उपकरण", "chatGPT": "चैटGPT", "gemini": "जेमिनी", "copilot": "कोपायलट", "claude": "क्लॉड", "grok": "ग्रोक", "qwen": "क्वेन", "perplexity": "पर्प्लेक्सिटी", "deepseek": "डीपसीक", "metaAI": "मेटा AI", "firefly": "एडोबी फायरफ्लाई", "aiSettingsIntro": "चुनें की कौन से AI शॉर्टकट्स रखने हैं", "resetAISettingsBtn": "रीसेट करें", // Theme "lightThemed": "लाइट", "darkThemed": "डार्क", "systemThemed": "सिस्टम", // Wallpaper and settings "uploadWallpaperText": "वॉलपेपर सेट करें", "rangColor": "रंग चुनें", "opacityTitle": "अपारदर्शिता", "adjustOpacityDesc": "इंटरफ़ेस की पारदर्शिता समायोजित करें", "backupText": "बैकअप करें", "restoreText": "रिस्टोर करें", "resetsettings": "सेटिंग्स रीसेट करें", "menuCloseText": "बंद करें", // Tips "switchSearchModes": "खोज मोड बदलें", "switchSearchModesInfo": "मोड बदलने के लिए ‘खोज माध्यम’ पर क्लिक करें।", "adjustZoom": "ज़ूम समायोजित करें", "adjustZoomInfo": "ज़ूम समायोजित करने के लिए Ctrl + \"+\" या Ctrl + \"-\" दबाएँ।", "changeBrowserTheme": "ब्राउज़र थीम बदलें", "chromeThemeInfo": "तीन बिंदु (⋮) पर क्लिक करें > अधिक टूल्स > क्रोम को कस्टमाइज़ करें, फिर एक्सटेंशन थीम से मेल खाने वाला रंग चुनें।", "edgeThemeInfo": "सेटिंग्स > रूपरंग (Appearance) पर जाएं, फिर एक्सटेंशन थीम से मेल खाने वाला रंग चुनें।", "braveThemeInfo": ' क्रोम थीम स्टोर पर जाएं, उपयुक्त थीम डाउनलोड करें और लागू करें।', "firefoxThemeInfo": 'फ़ायरफ़ॉक्स थीम्स पर जाएँ, अपनी पसंद की थीम डाउनलोड करें और उसे लागू करें।', "updateFirefoxHomepage": "होमपेज अपडेट करें", "updateFirefoxHomepageInfo": 'अपने होमपेज को भी नए टैब की तरह बदलने के लिए, इस लिंक पर जाएं और दिए गए निर्देशों का पालन करें।', "dontShowTips": "इसे फिर से न दिखाएँ", // Footer Toast "footerToastTitle": "नीचे एक बैनर दिखाई दे रहा है?", "footerToastMessage": "इसे छिपाने के लिए, उस पर राइट-क्लिक करें और 'नए टैब पेज पर फुटर छिपाएँ' चुनें।", // Dialog boxes (alerts) "okText": "ठीक है", "yesText": "हाँ", "noText": "नहीं", "agreeText": "मैं सहमत हूँ", "cancelText": "रद्द करें", "confirmWallpaper": "क्या आप आज के लिए एक नई छवि को वॉलपेपर के रूप में सेट करना चाहेंगे?", "confirmRestore": "क्या आप अपनी सेटिंग्स रीसेट करना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।", "Nobackgroundset": "कोई बैकग्राउंड छवि वर्तमान में सेट नहीं है।", "clearbackgroundimage": "क्या आप बैकग्राउंड छवि को हटाना चाहते हैं?", "ProxyDisclaimer": "सभी प्रॉक्सी फीचर डिफ़ॉल्ट रूप से बंद रहते हैं।\n\nयदि आप खोज सुझाव और CORS बायपास प्रॉक्सी सक्षम करते हैं, तो गोपनीयता बढ़ाने के लिए अपना प्रॉक्सी होस्ट करना अत्यधिक अनुशंसित है।\n\nडिफ़ॉल्ट रूप से प्रॉक्सी को https://mynt-proxy.rhythmcorehq.com पर सेट किया जाएगा, जिसका अर्थ है कि आपका सारा डेटा इस सेवा से गुजरेगा, जिससे गोपनीयता संबंधित चिंताएँ हो सकती हैं।", "GPSDisclaimer": "आपका स्थान का डेटा केवल सटीक मौसम अपडेट प्रदान करने के लिए उपयोग किया जाता है। इसे अस्थायी रूप से ब्राउज़र में संग्रहीत किया जाता है और न तो किसी तृतीय-पक्ष सेवा के साथ साझा किया जाता है और न ही हमारे लिए सुलभ है।\n\nGPS सक्षम करके, आप एक्सटेंशन के साथ स्थानीय रूप से अपना स्थान साझा करने की सहमति देते हैं।", "failedbackup": "बैकअप विफल: ", "restorecompleted": "पुनर्स्थापना सफलतापूर्वक पूरी हुई!", "restorefailed": "पुनर्स्थापना विफल: ", "invalidBackup": "अमान्य बैकअप फ़ाइल चयनित है।", "deleteBookmark": "क्या आप \"{title}\" बुकमार्क डिलीट करना चाहते हैं?", "UnsupportedBrowser": "आपके ब्राउज़र में बुकमार्क समर्थित नहीं हैं।", "resetShortcutsPrompt": "सभी सहेजे गए शॉर्टकट हटा दिए जाएंगे और डिफ़ॉल्ट पर रीसेट हो जाएंगे। क्या आप जारी रखना चाहते हैं?", "invalidFileTypeMessage": "कृपया एक मान्य छवि फ़ाइल चुनें।", "invalidSvgMessage": "अमान्य SVG या इसमें असुरक्षित सामग्री है और इसे आइकन के रूप में उपयोग नहीं किया जा सकता।", "invalidIconUrlMessage": "कृपया एक मान्य छवि URL दर्ज करें (https://, http://, या data:image/ से शुरू होना चाहिए)।", "iconFileTooLargeMessage": "चयनित फ़ाइल बहुत बड़ी है: {size} KB। कृपया {max} KB से छोटी फ़ाइल का उपयोग करें।", "iconStorageQuotaMessage": "आइकन सहेजा नहीं जा सका क्योंकि स्टोरेज सीमा पूरी हो गई है। कृपया छोटा चित्र उपयोग करें।" }; ================================================ FILE: locales/hu.js ================================================ // Hungarian const hu = { "newTabTitle": "Új oldal", // Menu Items "github": "GitHub", "feedback": "Visszajelzés", // Section titles "personalizationSectionTitle": "Személyre szabás", "clockSectionTitle": "Óra", "searchSectionTitle": "Keresés", "weatherSectionTitle": "Időjárás", "appearanceSectionTitle": "Megjelenés", "settingsSectionTitle": "Beállítások", // Shortcuts "shortcutsText": "Parancsikonok", "enableShortcutsText": "Parancsikonok megjelenítése", "editShortcutsText": "Parancsikonok szerkesztése", "shortcutsInfoText": "Válassza ki a parancsikonokat, amelyeket meg szeretné jeleníteni a kezdőképernyőn", "editShortcutsList": "Elmentett parancsikonok", "editShortcutsListInfo": "Új parancsikonokat adhat hozzá a '+' ikonra kattintva, vagy szerkesztheti a meglévőket a parancsikon nevére vagy URL címére kattintva.", "adaptiveIconText": "Alkalmazkodó ikonformák", "adaptiveIconInfoText": "A parancsikonok a témához alkalmazkodnak", "bookmarksText": "Könyvjelzők", "bookmarksInfo": "Könyvjelzők oldalsáv megjelenítése", "ai_tools_button": "MI-Eszközök", "enable_ai_tools": "Parancsikon az MI-eszközökhöz", "aiToolsSettingsText": "MI-eszközök Beállításai", "aiToolsSettingsInfo": "MI-eszközök parancsikonjainak kezelése", "googleAppsMenuText": "Google Alkalmazások", "googleAppsMenuInfo": "Parancsikonok a Google alkalmazásaihoz", "googleAppsHover": "Google Appok", // To-do List "todoListText": "Teendő lista", "todoListInfo": "Napi teendők lista megjelenítése", "todoListHover": "Teendő lista", "todoPlaceholder": "Feladat hozzáadása...", // Digital Clock "hideClockBox": "Óra elrejtése", "hideClockBoxInfo": "Az óra és dátum elrejtése", "digitalclocktitle": "Digitális óra", "digitalclockinfo": "Váltás a digitális órára", "timeformattitle": "12 órás formátum", "timeformatinfo": "12 órás időformátum használata", "greetingtitle": "Üdvözlés", "greetinginfo": "Üdvözlet megjelenítése az egyéni szöveg alatt", // Misc "userTextTitle": "Testreszabható szöveg", "userTextInfo": "Egyéni szöveg megjelenítése az óra alatt", "fahrenheitCelsiusCheckbox": "Fahrenheit használata", "fahrenheitCelsiusText": "Frissítse az oldalt a módosítások alkalmazásához", "hideWeatherTitle": "Időjárás elrejtése", "hideWeatherInfo": "Az időjárási widgetek letiltása", "hideWeatherBox": "Időjárás kártya elrejtése", "hideWeatherBoxInfo": "Csak a hőmérséklet megjelenítése", "minMaxTempText": "Min-Max hőmérséklet", "minMaxTempSubText": "Kicserélni a 'Hőérzet szerint' a minimum és maximum hőmérsékletre", // Search "micIconTitle": "Mikrofon ikon elrejtése", "micIconInfo": "Ha a hangalapú keresés nem működik", "hideSearchWith": "Keresőmotorok elrejtése", "hideSearchWithInfo": "Váltás a keresőmotorok között az ikonra kattintva", "motivationalQuotesText": "Motivációs idézetek", "motivationalQuotesInfo": "Idézetek megjelenítése a keresősáv alatt", "search_suggestions_button": "Keresési javaslatok", "search_suggestions_text": "Keresési javaslatok bekapcsolása", // Proxy "useproxytitletext": "Proxy megkerülése", "useproxyText": "Ha a keresési javaslatok nem működnek", "ProxyText": "CORS megkerülő proxy", "ProxySubtext": "Saját CORS megkerülő proxy hozzáadása", "HostproxyButton": "Saját proxy üzemeltetése", // Location "useGPS": "GPS használata", "useGPSInfo": "GPS engedélyezése az élő helyzet frissítéséhez", "UserLocText": "Adja meg a tartózkodási helyét", "UserLocSubtext": "Ha az időjárás helye nem megfelelő", "userLoc": "A városa vagy koordinátái (földrajzi szélesség, hosszúság)", "PrivacyPolicy": "Adatvédelmi nyilatkozat", // Weather "WeatherApiText": "Adja meg a WeatherAPI kulcsát", "WeatherApiSubtext": "Ha az időjárási funkciók nem működnek", "userAPI": "A WeatherAPI kulcsa", "LearnMoreButton": "További információk", "saveAPI": "Mentés", // Body Items // Calendar "days": [ "Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" ], "months": ["Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" ], // Bookmarks "bookmarksHeading": "Könyvjelzők", "bookmarkSortBy": "Rendezés", "sortAlphabetical": "A-Z", "sortTimeAdded": "Régi-Új", "bookmarkViewAs": "Megjelenítés mint", "bookmarkViewGrid": "Rács", "bookmarkViewList": "Lista", "bookmarkSearch": "Könyvjelző keresése", "editBookmarkHeading": "Könyvjelző szerkesztése", "editBookmarkName": "Könyvjelző neve", "editBookmarkURL": "Könyvjelző URL-je", // New Tab Item "conditionText": "Szia! Hogy vagy ma?", "humidityLevel": "Páratartalom", "minMaxTemp": "Min / Max", "feelsLike": "Hőérzet szerint", "location": "Föld", "enterBtn": "Keresés", "searchPlaceholder": "Írj ide...", "listenPlaceholder": "Hallgatlak...", "searchWithHint": "Keresés a következővel", "searchOnHint": "Keresés a következőn", "userText": "Kattints ide a szerkesztéshez", // Greeting "greeting": { "morning": "Jó reggelt!", "afternoon": "Jó napot!", "evening": "Jó estét!" }, // Search Engines and rest "defaultEngine": "Alapértelmezett", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Képek", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "MI Eszközök", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Válassza ki a MI eszközöket, amelyeket szeretne használni", "resetAISettingsBtn": "Visszaállítás", // Theme "lightThemed": "Világos", "darkThemed": "Sötét", "systemThemed": "Rendszer", // Wallpaper and misc "uploadWallpaperText": "Háttérkép feltöltése", "rangColor": "Szín kiválasztása", "opacityTitle": "Homályosság", "adjustOpacityDesc": "Homályosság beállítása", "backupText": "Mentés", "restoreText": "Visszaállítás", "resetsettings": "Beállítások visszaállítása", "menuCloseText": "Bezárás", // Tips "switchSearchModes": "Keresési módok váltása", "switchSearchModesInfo": "Kattintson a 'Keresés a következővel' gombra a mód változtatásához.", "adjustZoom": "Zoom beállítása", "adjustZoomInfo": "Nyomja meg a Ctrl + '+' vagy Ctrl + '-' billentyűket a zoom beállításához.", "changeBrowserTheme": "Böngésző témájának változtatása", "chromeThemeInfo": "Nyomja meg a három pontot (⋮) > További eszközök > Chrome személyre szabása, azután pedig válassza ki a kívánt színt.", "edgeThemeInfo": "Lépjen a Beállítások > Megjelenés menüpontba, majd válassza ki a kívánt színt.", "braveThemeInfo": "Látogassa meg a Chrome Theme Store, töltse le és alkalmazza a kívánt témát.", "firefoxThemeInfo": "Látogassa meg a Firefox Themes, töltse le és alkalmazza a kívánt témát.", "updateFirefoxHomepage": "Kezdőlap frissítése", "updateFirefoxHomepageInfo": "Ha a kezdőlapot is új lapként szeretné kezelni, látogasson el erre a linkre és kövesse a lépéseket.", "dontShowTips": "Ne mutassa újra", // Footer Toast "footerToastTitle": "Van egy banner az oldal alján?", "footerToastMessage": "Hogy elrejtse, kattintson rá jobb gombbal és válassza ki a 'Lábléc elrejtése' opciót.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Igen", "noText": "Nem", "agreeText": "Egyetértek", "cancelText": "Mégse", "confirmWallpaper": "Szeretne egy újabb képet beállítani a napi háttérképének?", "confirmRestore": "Biztos, hogy vissza akarja állítani a beállításokat? Ezt a műveletet nem lehet visszacsinálni.", "Nobackgroundset": "Jelenleg nincs beállítva háttérkép.", "clearbackgroundimage": "Biztos, hogy törölni szeretné a háttérképet?", "ProxyDisclaimer": "Alapértelmezés szerint minden proxy funkció ki van kapcsolva.\n\nHa engedélyezi a keresési javaslatokat és a CORS megkerülő proxy-t, erősen ajánlott saját proxy-t üzemeltetni a fokozott adatvédelem érdekében.\n\n\nA proxy alapértelmezés szerint a https://mynt-proxy.rhythmcorehq.com beállítással működik, ami azt jelenti, hogy minden adat ezen a szolgáltatáson keresztül fog átmenni, ami adatvédelmi aggályokat vethet fel.", "GPSDisclaimer": "A helyadataid kizárólag a pontos időjárás-előrejelzés biztosítására szolgálnak. Ezeket a böngésző ideiglenesen tárolja, és semmilyen harmadik fél szolgáltatással nem osztjuk meg, illetve számunkra sem hozzáférhetőek.\n\nA GPS engedélyezésével hozzájárulsz ahhoz, hogy a helyadataidat lokálisan, a bővítménnyel megoszd.", "failedbackup": "Sikertelen mentés: ", "restorecompleted": "A visszaállítás sikeresen befejeződött!", "restorefailed": "Sikertelen visszaállítás: ", "invalidBackup": "A választott mentési fájl érvénytelen.", "deleteBookmark": "Biztos, hogy törölni szeretné a könyvjelzőt '{title}'?", "UnsupportedBrowser": "A könyvjelzők nem támogatottak a böngészőjében", "resetShortcutsPrompt": "Az összes mentett parancsikon törlésre kerül és visszaállításra kerülnek az alapértelmezett beállítások. Szeretné folytatni?", "iconFileTooLargeMessage": "A kiválasztott fájl túl nagy: {size} KB. Kérjük, használjon {max} KB-nál kisebb fájlt.", "iconStorageQuotaMessage": "Az ikon mentése nem sikerült, mert elérte a tárhelykeretet. Távolítson el néhány egyéni ikont, vagy használjon kisebb képet." }; ================================================ FILE: locales/idn.js ================================================ // Indonesian const idn = { "newTabTitle": "Tab Baru", // Menu Items "github": "GitHub", "feedback": "Masukan", // Section titles "personalizationSectionTitle": "Personalisasi", "clockSectionTitle": "Jam", "searchSectionTitle": "Pencarian", "weatherSectionTitle": "Cuaca", "appearanceSectionTitle": "Tampilan", "settingsSectionTitle": "Pengaturan", // Shortcuts "shortcutsText": "Pintasan", "enableShortcutsText": "Tampilkan Pintasan", "editShortcutsText": "Edit Pintasan", "shortcutsInfoText": "Pilih pintasan apa yang dapat ditampilkan", "editShortcutsList": "Pintasan Tersimpan", 'editShortcutsListInfo': 'Anda dapat menambahkan pintasan baru dengan mengeklik ikon \"+\" atau mengedit yang sudah ada dengan mengeklik nama pintasan atau URL.\nUntuk mengatur ulang ikon kustom, cukup kosongkan URL gambar', "adaptiveIconText": "Ikon Adaptif", "adaptiveIconInfoText": "Ikon pintasan akan menyesuaikan dengan tema", "bookmarksText": "Markah Buku", "bookmarksInfo": "Tampilkan sidebar markah buku", "ai_tools_button": "Utilitas AI", "enable_ai_tools": "Tampilkan pintasan untuk utilitas AI", "aiToolsSettingsText": "Setelan Utilitas AI", "aiToolsSettingsInfo": "Kelola pintasan utilitas AI", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "Tampilkan pintasan untuk Google Apps", "googleAppsHover": "Google Apps", // Keep this shorter "shortcutDefaultName": "Pintasan Baru", "shortcutInputName": "Nama Pintasan", "shortcutInputUrl": "URL Pintasan", "shortcutInputIcon": "Ikon Kustom: URL atau SVG (opsional)", "recentlyAddedBookmarks": "Terbaru", // To-do List "todoListText": "To-Do List", "todoListInfo": "Tampilkan To-Do list harian", "todoListHover": "To-Do List", "todoPlaceholder": "Tambah tugas...", // Clock "hideClockBox": "Sembunyikan Jam", "hideClockBoxInfo": "Sembunyikan jam dan tanggal", "digitalclocktitle": "Jam Digital", "digitalclockinfo": "Ganti dengan jam digital", "timeformattitle": "Format 12-Jam", "timeformatinfo": "Gunakan format waktu 12-jam", "greetingtitle": "Sapaan", "greetinginfo": "Tampilkan sapaan di bawah teks kustom", // Misc "userTextTitle": "Teks Kostum", "userTextInfo": "Tampilkan teks kustom di bawah jam", "fahrenheitCelsiusCheckbox": "Ganti dengan Fahrenheit", "fahrenheitCelsiusText": "Muat ulang halaman untuk mengaplikasikan perubahan", "hideWeatherTitle": "Sembunyikan Cuaca", "hideWeatherInfo": "Nonaktifkan widget cuaca", "hideWeatherBox": "Sembunyikan Kartu Cuaca", // Toggle for mobile devices only "hideWeatherBoxInfo": "Hanya tampilkan kapsul suhu", "minMaxTempText": "Suhu Min-Maks", "minMaxTempSubText": "Ganti 'Terasa Seperti' dengan suhu minimum dan maksimum", // Search "micIconTitle": "Sembunyikan Ikon Mikrofon", "micIconInfo": "Jika pengenalan suara tidak berfungsi", "hideSearchWith": "Sembunyikan Mesin Pencarian", "hideSearchWithInfo": "Ganti mesin pencarian dengan mengeklik ikon-nya", "motivationalQuotesText": "Kutipan Motivasi", "motivationalQuotesInfo": "Tampilkan kutipan di bawah bar pencarian", "newQuoteOnRefreshText": "Kutipan Harian", "newQuoteOnRefreshInfo": "Tampilkan 1 kutipan/hari daripada memuat ulang setiap saat", "search_suggestions_button": "Saran Pencarian", "search_suggestions_text": "Aktifkan saran pencarian", // Proxy "useproxytitletext": "Bypass Proksi", "useproxyText": "Jika saran pencarian tidak berfungsi", "ProxyText": "Bypass proksi CORS", "ProxySubtext": "Tambahkan bypass proksi CORS Anda sendiri", "HostproxyButton": "Host proksi Anda sendiri", // Location "useGPS": "Gunakan GPS", "useGPSInfo": "Aktifkan GPS untuk pembaruan lokasi secara langsung", "UserLocText": "Masukkan Lokasi Anda", "UserLocSubtext": "Jika lokasi cuaca tidak berfungsi", "userLoc": "Kota atau Koordinat Anda (Lintang, Bujur)", "PrivacyPolicy": "Kebijakan privasi", // Weather "WeatherApiText": "Masukkan kunci WeatherAPI Anda", "WeatherApiSubtext": "Jika fungsionalitas cuaca tidak berfungsi", "userAPI": "Kunci weatherAPI Anda", "LearnMoreButton": "Pelajari lebih lanjut", "saveAPI": "Simpan", // Body Items // Calendar "days": ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'], "months": ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'], // Bookmarks "bookmarksHeading": "Markah Buku", "bookmarkSortBy": "Urutkan berdasarkan", "sortAlphabetical": "A-Z", "sortTimeAdded": "Lama-Baru", "bookmarkViewAs": "Kisi-kisi", "bookmarkViewGrid": "Tata Letak", "bookmarkViewList": "Daftar", "bookmarkSearch": "Cari markah buku", "editBookmarkHeading": "Edit Markah Buku", "editBookmarkName": "Nama Markah Buku", "editBookmarkURL": "URL Markah Buku", // New Tab Item "conditionText": "Halo! Bagaimana kabarmu hari ini?", "humidityLevel": "Kelembapan", "feelsLike": "Terasa", "minMaxTemp": "Min ~ Maks", "location": "Bumi", "enterBtn": "Telusuri", "searchPlaceholder": "Ketik disini...", "listenPlaceholder": "Mendengarkan...", "searchWithHint": "Cari Dengan", "searchOnHint": "Cari Pada", "userText": "Klik disini untuk mengedit", // Greeting greeting: { "morning": "Selamat Pagi!", "afternoon": "Selamat Sore!", "evening": "Selamat Malam!" }, // Search Engines "defaultEngine": "Default", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Images", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Utilitas AI", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Pilih utilitas AI mana yang ditampilkan", "resetAISettingsBtn": "Atur Ulang", // Theme "lightThemed": "Terang", "darkThemed": "Gelap", "systemThemed": "Sistem", // Wallpaper and settings "uploadWallpaperText": "Unggah Wallpaper", "rangColor": "Pilih warna", "opacityTitle": "Opasitas", "adjustOpacityDesc": "Mengatur transparansi antarmuka", "backupText": "Cadangkan", "restoreText": "Pulihkan", "resetsettings": "Atur Ulang Setelan", "menuCloseText": "Tutup", // Tips "switchSearchModes": "Ubah Mode Pencarian", "switchSearchModesInfo": "Klik pada ‘Cari Dengan’ untuk mengubah mode", "adjustZoom": "Atur Zoom", "adjustZoomInfo": "Tekan Ctrl + \"+\" atau Ctrl + \"-\" untuk mengatur zoom.", "changeBrowserTheme": "Ubah Tema Browser", "chromeThemeInfo": "Klik pada tiga titik (⋮) > Lainnya > Kustomisasi Chrome, lalu pilih warna yang cocok dengan tema ekstensi.", "edgeThemeInfo": "Pergi ke Setelan > Tampilan, lalu pilih warna yang cocok dengan tema ekstensi.", "braveThemeInfo": 'Kunjungi Chrome Theme Store, unduh dan terapkan tema yang cocok dengan ekstensi.', "firefoxThemeInfo": 'Kunjungi Firefox Themes, unduh dan terapkan tema yang cocok dengan ekstensi.', "updateFirefoxHomepage": "Perbarui Beranda", "updateFirefoxHomepageInfo": "Untuk mengubah beranda Anda seperti tab baru juga, kunjungi tautan ini dan ikuti intruksi-nya.", "dontShowTips": "Jangan tampilkan lagi", // Footer Toast "footerToastTitle": "Melihat banner di bawah?", "footerToastMessage": "Untuk menyembunyikannya, klik kanan pada banner dan pilih 'Sembunyikan Footer Pada Halaman Tab Baru'.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Ya", "noText": "Tidak", "agreeText": "Saya Setuju", "cancelText": "Batalkan", "confirmWallpaper": "Apakah Anda ingin memasang gambar baru sebagai wallpaper harian Anda?", "confirmRestore": "Apakah Anda yakin ingin mengatur ulang setelan Anda? Tindakan ini tidak dapat dibatalkan.", "Nobackgroundset": "Tidak ada gambar latar belakang yang dipasang saat ini.", "clearbackgroundimage": "Apakah Anda yakin ingin menghapus gambar latar belakang?", "ProxyDisclaimer": "Semua fitur proxy dimatikan secara default.\n\nJika Anda mengaktifkan saran pencarian dan bypass proksi CORS, sangat disarankan untuk host proksi Anda sendiri untuk privasi yang lebih baik.\n\nSecara default, proksi akan disetel ke https://mynt-proxy.rhythmcorehq.com, yang berarti semua data Anda akan melewati layanan ini, yang mungkin saja dapat menimbulkan kekhawatiran privasi.", "GPSDisclaimer": "Data lokasi Anda digunakan hanya sebatas untuk memberikan pembaruan cuaca yang akurat. Ini tersimpan sementara pada browser dan tidak juga dibagikan pada layanan pihak ketiga apapun dan juga tidak dapat diakses oleh Kami.\n\nDengan mengaktifkan GPS, Anda setuju untuk membagikan lokasi Anda dengan ekstensi ini secara lokal.", "failedbackup": "Pencadangan gagal: ", "restorecompleted": "Pemulihan berhasil dengan sukses!", "restorefailed": "Pemulihan gagal: ", "invalidBackup": "File cadangan yang dipilih tidak valid", "deleteBookmark": "Apakah Anda yakin untuk menghapus markah buku \"{title}\"?", "UnsupportedBrowser": "Markah buku tidak didukung oleh browser Anda", "resetShortcutsPrompt": "Semua pintasan yang tersimpan akan terhapus dan diatur ulang ke default. Apakah Anda ingin melanjutkannya?", "invalidFileTypeMessage": "Pilih file gambar yang valid.", "invalidSvgMessage": "SVG yang dipilih tidak valid, atau mengandung konten tidak pantas dan tidak bisa digunakan sebagai ikon.", "invalidIconUrlMessage": "Masukkan URL gambar yang valid (perlu diawali dengan https://, http://, atau data:image/).", "iconFileTooLargeMessage": "File yang terpilih terlalu besar: {size} KB. Tolong gunakan file yang kurang dari {max} KB.", "iconStorageQuotaMessage": "Ikon tidak bisa tersimpan karena menyentuh batas maksimal penyimpanan. Hapus beberapa ikon kustom atau gunakan gambar yang lebih kecil." }; ================================================ FILE: locales/it.js ================================================ // Italian const it = { // Menu Items "github": "GitHub", "feedback": "Feedback", // Shortcuts "shortcutsText": "Scorciatoie", "enableShortcutsText": "Abilita/disabilita scorciatoie", "editShortcutsText": "Modifica Scorciatoie", "shortcutsInfoText": "Scegli quali scorciatoie mostrare", "editShortcutsList": "Scorciatoie Salvate", "editShortcutsListInfo": "Puoi aggiungere nuove scorciatoie cliccando l'icona \"+\" o modificiare le esistenti cliccando il nome della scorciatoia o dell'URL.", "adaptiveIconText": "Forme di Icona Adattiva", "adaptiveIconInfoText": "Le icone delle scorciatoie saranno sempre rotonde", "bookmarksText": "Segnalibri", "bookmarksInfo": "Mostra segnalibri sulla barra laterale", "ai_tools_button": "Strumenti IA", "enable_ai_tools": "Abilita/disabilita scorciatoie Strumenti IA", "googleAppsMenuText": "App Google", "googleAppsMenuInfo": "Mostra collegamenti App Google", "googleAppsHover": "App di Google", // Keep this shorter // To-do List "todoListText": "Lista cose da fare", "todoListInfo": "Mostra una lista di cose da fare giornaliera", "todoListHover": "Lista ToDo", // Keep this short "todoPlaceholder": "Aggiungi attività...", // Clock "hideClockBox": "Nascondi Orologio", "hideClockBoxInfo": "Mostra e nascodi orologio e ora", "digitalclocktitle": "Orologio Digitale", "digitalclockinfo": "Abilita/disabilita Orologio Digitale", "timeformattitle": "Usa formato 12h", "timeformatinfo": "Usa formato orario a 12 ore", "greetingtitle": "Saluto", "greetinginfo": "Mostra il saluto sotto il testo personalizzato", // Misc "userTextTitle": "Testo personalizzabile", "userTextInfo": "Mostra il testo personalizzato sotto l'orologio", "fahrenheitCelsiusCheckbox": "Passa a Fahrenheit", "fahrenheitCelsiusText": "Ricarica la pagina per vedere gli aggiornamenti", "hideWeatherTitle": "Nascondi Meteo", "hideWeatherInfo": "Disabilita i widget meteo", "hideWeatherBox": "Nascondi Scheda Meteo", // Toggle for mobile devices only "hideWeatherBoxInfo": "Mostra solo l'indicatore della temperatura", // Search "micIconTitle": "Nascondi icona del microfono", "micIconInfo": "Se la digitazione vocale non funziona", "hideSearchWith": "Nascondi motori di ricerca", "hideSearchWithInfo": "Scegli tra i motori di ricerca cliccando l'icona", "motivationalQuotesText": "Frasi Motivazionali", "motivationalQuotesInfo": "Mostra frasi sotto la barra di ricerca", "search_suggestions_button": "Suggerimenti di Ricerca", "search_suggestions_text": "Abilita/disabilita Suggerimenti di Ricerca", // Proxy "useproxytitletext": "Bypass Proxy", "useproxyText": "Se i suggerimenti di ricerca non funzionano", "ProxyText": "Proxy di Bypass CORS", "ProxySubtext": "Aggiungi il tuo Proxy di Bypass CORS", "HostproxyButton": "Hosta il Tuo Proxy", // Location "useGPS": "Usa il GPS", "useGPSInfo": "Abilita il GPS per aggiornamenti in tempo reale sulla posizione", "UserLocText": "Inserisci la tua posizione", "UserLocSubtext": "Se la posizione meteo non è corretta", "userLoc": "La tua posizione (Città/Latitudine,Longitudine)", "PrivacyPolicy": "Informativa sulla privacy", // Weather "WeatherApiText": "Inserisci la tua chiave WeatherAPI", "WeatherApiSubtext": "Se la funzionalità meteo non funziona", "userAPI": "La tua chiave WeatherAPI", "LearnMoreButton": "Scopri di più", "saveAPI": "Salva", // Body Items // Calendar "days": ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'], "months": ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'], // Bookmarks --------- "bookmarksHeading": "Segnalibri", "bookmarkSortBy": "Ordina per", "sortAlphabetical": "A-Z", "sortTimeAdded": "Old-New", "bookmarkViewAs": "Visualizza come", "bookmarkViewGrid": "Griglia", // Keep this shorter "bookmarkViewList": "Elenco", // Keep this shorter "bookmarkSearch": "Cerca segnalibro", "editBookmarkHeading": "Modifica Segnalibro", "editBookmarkName": "Nome del Segnalibro", "editBookmarkURL": "URL del Segnalibro", // New Tab Item "conditionText": "Ciao! Come stai oggi?", "humidityLevel": "Umidità", "feelsLike": "Percepito", "location": "Terra", "enterBtn": "Cerca", "searchPlaceholder": "Cerca...", "listenPlaceholder": "Ascoltando...", "searchWithHint": "Cerca con", "searchOnHint": "Cerca su", "userText": "Clicca qui per modificare", // Greeting greeting: { "morning": "Buongiorno!", "afternoon": "Buon pomeriggio!", "evening": "Buona sera!" }, // Search Engines "defaultEngine": "Default", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Immagini", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Strumenti IA", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", // Theme "enableDarkMode": "Modalità Scura (Sperimentale)", "enableDarkModeInfo": "Abilita i temi in modalità scura", // Wallpaper and misc "uploadWallpaperText": "Carica immagine", "backupText": "Backup", "restoreText": "Ripristina", "rangColor": "Scegli colore", "resetsettings": "Reimposta Impostazioni", "menuCloseText": "Chiudi", // Tips "switchSearchModes": "Cambia modalità di ricerca", "switchSearchModesInfo": "Clicca su ‘Cerca con’ per cambiare modalità.", "adjustZoom": "Regola lo zoom", "adjustZoomInfo": "Premi Ctrl + \" +\" o Ctrl + \" -\" per regolare lo zoom.", "changeBrowserTheme": "Cambia il tema del browser", "chromeThemeInfo": "Clicca sui tre puntini (⋮) > Altri strumenti > Personalizza Chrome, quindi scegli un colore che si abbini al tema dell'estensione.", "edgeThemeInfo": "Vai su Impostazioni > Aspetto, quindi scegli un colore che si abbini al tema dell'estensione.", "braveThemeInfo": "Visita Chrome Theme Store, scarica e applica il tema che corrisponde all'estensione.", "firefoxThemeInfo": "Visita Temi di Firefox, scarica e applica il tema che corrisponde all'estensione.", "updateFirefoxHomepage": "Aggiorna Homepage", "updateFirefoxHomepageInfo": "Per cambiare la tua homepage come la nuova scheda, visita questo link e segui le istruzioni.", "dontShowTips": "Non mostrarlo di nuovo", // Dialog boxes (alerts) "okText": "OK", "yesText": "Yes", "noText": "No", "agreeText": "Accetto", "cancelText": "Annulla", "confirmWallpaper": "Vuoi impostare una nuova immagine come sfondo per oggi?", "confirmRestore": "Sei sicuro di voler reimpostare le impostazioni? Questa azione non può essere annullata.", "Nobackgroundset": "Nessuna immagine di sfondo è attualmente impostata.", "clearbackgroundimage": "Sei sicuro di voler rimuovere l'immagine di sfondo?", "ProxyDisclaimer": "Tutte le funzionalità del proxy sono disattivate di default.\n\nSe abiliti i suggerimenti di ricerca e il proxy per il bypass CORS, è fortemente consigliato usare un proprio proxy per una maggiore privacy.\n\nIl proxy predefinito sarà configurato su https://mynt-proxy.rhythmcorehq.com, il che significa che tutti i tuoi dati passeranno attraverso questo servizio, con possibili rischi per la privacy.", "GPSDisclaimer": "I dati sulla tua posizione vengono utilizzati esclusivamente per fornire aggiornamenti meteo accurati. Sono temporaneamente memorizzati all'interno del browser e non vengono condivisi con servizi di terze parti né sono accessibili da noi.\n\nAbilitando il GPS, acconsenti alla condivisione della tua posizione con l'estensione a livello locale.", "failedbackup": "Backup fallito: ", "restorecompleted": "Ripristino completato con successo!", "restorefailed": "Ripristino fallito: ", "invalidBackup": "File di backup non valido", "deleteBookmark": "Sei sicuro di voler eliminare il segnalibro", "UnsupportedBrowser": "I segnalibri non sono supportati nel tuo browser \"{title}\"?", }; ================================================ FILE: locales/ja.js ================================================ // Japanese const ja = { "newTabTitle": "新しいタブ", // Menu Items "github": "GitHub", "feedback": "フィードバック", // Section titles "personalizationSectionTitle": "パーソナライズ", "clockSectionTitle": "時計", "searchSectionTitle": "検索", "weatherSectionTitle": "天気", "appearanceSectionTitle": "外観", "settingsSectionTitle": "設定", // Shortcuts "shortcutsText": "ショートカット", "enableShortcutsText": "保存されたショートカットを表示", "editShortcutsText": "ショートカットを編集", "shortcutsInfoText": "表示するショートカットを選択", "editShortcutsList": "保存されたショートカット", "editShortcutsListInfo": "\"+\" アイコンをクリックして新しいショートカットを追加したり、名前やURLをクリックして既存のものを編集できます。\nアイコンをリセットするには、画像のURLを空にしてください。", "adaptiveIconText": "アダプティブアイコン", "adaptiveIconInfoText": "ショートカットアイコンをテーマに適応させます", "bookmarksText": "ブックマーク", "bookmarksInfo": "ブックマークのサイドバーを表示", "ai_tools_button": "AIツール", "enable_ai_tools": "AIツールのショートカットを表示", "aiToolsSettingsText": "AIツール設定", "aiToolsSettingsInfo": "AIツールのショートカットを管理", "googleAppsMenuText": "Googleアプリ", "googleAppsMenuInfo": "Googleアプリのショートカットを表示", "googleAppsHover": "Googleアプリ", "shortcutDefaultName": "新しいショートカット", "shortcutInputName": "ショートカット名", "shortcutInputUrl": "ショートカットのURL", "shortcutInputIcon": "カスタムアイコン: URL または SVG (任意)", "recentlyAddedBookmarks": "最近追加された項目", // To-do List "todoListText": "To Doリスト", "todoListInfo": "毎日のTo Doリストを表示", "todoListHover": "To Doリスト", "todoPlaceholder": "タスクを追加...", // Clock "hideClockBox": "時計を非表示", "hideClockBoxInfo": "時計と日付を非表示にする", "digitalclocktitle": "デジタル時計", "digitalclockinfo": "デジタル時計に切り替え", "timeformattitle": "12時間形式", "timeformatinfo": "12時間形式を使用する", "greetingtitle": "あいさつ", "greetinginfo": "カスタムテキストの下にあいさつを表示", // Misc "userTextTitle": "カスタムテキスト", "userTextInfo": "時計の下にカスタムテキストを表示", "fahrenheitCelsiusCheckbox": "華氏に切り替え", "fahrenheitCelsiusText": "変更を適用するにはページを再読み込みしてください", "hideWeatherTitle": "天気を非表示", "hideWeatherInfo": "天気ウィジェットを無効にする", "hideWeatherBox": "天気カードを非表示", "hideWeatherBoxInfo": "気温のピルのみを表示", "minMaxTempText": "最低・最高気温", "minMaxTempSubText": "「体感温度」を最低・最高気温に置き換える", // Search "micIconTitle": "マイクアイコンを非表示", "micIconInfo": "音声入力が動作しない場合", "hideSearchWith": "検索エンジンを隠す", "hideSearchWithInfo": "アイコンをクリックして検索エンジンを切り替える", "motivationalQuotesText": "モチベーションの名言", "motivationalQuotesInfo": "検索バーの下に名言を表示", "newQuoteOnRefreshText": "毎日の名言", "newQuoteOnRefreshInfo": "更新のたびではなく、1日1つの名言を表示", "search_suggestions_button": "検索候補", "search_suggestions_text": "検索候補を有効にする", // Proxy "useproxytitletext": "プロキシバイパス", "useproxyText": "検索候補が機能しない場合", "ProxyText": "CORSバイパスプロキシ", "ProxySubtext": "独自のCORSバイパスプロキシを追加", "HostproxyButton": "独自のプロキシをホスト", // Location "useGPS": "GPSを使う", "useGPSInfo": "ライブ位置情報更新用にGPSを有効にする", "UserLocText": "場所を入力", "UserLocSubtext": "天気の地域が正しくない場合", "userLoc": "都市または座標(緯度、経度)", "PrivacyPolicy": "プライバシーポリシー", // Weather "WeatherApiText": "WeatherAPIキーを入力", "WeatherApiSubtext": "天気機能が動作しない場合", "userAPI": "WeatherAPIキー", "LearnMoreButton": "詳細情報", "saveAPI": "保存", // Body Items // Calendar "days": ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'], "months": ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], // Bookmarks "bookmarksHeading": "ブックマーク", "bookmarkSortBy": "並び替え", "sortAlphabetical": "A-Z", "sortTimeAdded": "追加順", "bookmarkViewAs": "表示形式", "bookmarkViewGrid": "グリッド", "bookmarkViewList": "リスト", "bookmarkSearch": "ブックマークを検索", "editBookmarkHeading": "ブックマークを編集", "editBookmarkName": "ブックマーク名", "editBookmarkURL": "ブックマークのURL", // New Tab Item "conditionText": "こんにちは!本日の調子はいかがですか?", "humidityLevel": "湿度", "feelsLike": "体感", "minMaxTemp": "最低 ~ 最高", "location": "地球", "enterBtn": "検索", "searchPlaceholder": "検索キーワードを入力...", "listenPlaceholder": "聴き取り中...", "searchWithHint": "検索モード", "searchOnHint": "次で検索", "userText": "ここをクリックして編集", // Greeting greeting: { "morning": "おはようございます!", "afternoon": "こんにちは!", "evening": "こんばんは!" }, // Search Engines "defaultEngine": "デフォルト", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "画像", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AIツール", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "表示するAIツールを選択", "resetAISettingsBtn": "リセット", // Theme "lightThemed": "ライト", "darkThemed": "ダーク", "systemThemed": "システム", // Wallpaper and settings "uploadWallpaperText": "壁紙をアップロード", "rangColor": "色を選択", "opacityTitle": "不透明度", "adjustOpacityDesc": "インターフェースの透明度を調整", "backupText": "バックアップ", "restoreText": "復元", "resetsettings": "設定をリセット", "menuCloseText": "閉じる", // Tips "switchSearchModes": "検索モードを切り替え", "switchSearchModesInfo": "「検索モード」をクリックしてモードを変更できます。", "adjustZoom": "ズーム調整", "adjustZoomInfo": "Ctrl + 「+」またはCtrl + 「-」でズームを調整できます。", "changeBrowserTheme": "ブラウザテーマを変更", "chromeThemeInfo": "「⋮」>その他のツール>Chromeのカスタマイズから、テーマに合った色を選択してください。", "edgeThemeInfo": "設定>外観から、テーマに合った色を選択してください。", "braveThemeInfo": "Chrome テーマストアからテーマを適用してください。", "firefoxThemeInfo": "Firefox テーマからテーマを適用してください。", "updateFirefoxHomepage": "ホームページを更新", "updateFirefoxHomepageInfo": "ホームページも新しいタブと同じように変更するには、こちらのリンクの手順に従ってください。", "dontShowTips": "今後表示しない", // Footer Toast "footerToastTitle": "下部にバナーが表示されていますか?", "footerToastMessage": "非表示にするには、右クリックして「新しいタブページでフッターを隠す」を選択してください。", // Dialog boxes (alerts) "okText": "OK", "yesText": "はい", "noText": "いいえ", "agreeText": "同意する", "cancelText": "キャンセル", "confirmWallpaper": "新しい画像を今日の壁紙として設定しますか?", "confirmRestore": "設定をリセットしてもよろしいですか?この操作は元に戻せません。", "Nobackgroundset": "背景画像が設定されていません。", "clearbackgroundimage": "背景画像を削除してもよろしいですか?", "ProxyDisclaimer": "すべてのプロキシ機能はデフォルトでオフになっています。\n\n検索候補やCORSバイパスプロキシを有効にする場合は、プライバシー保護のために独自のプロキシをホストすることを強くお勧めします。\n\nデフォルトでは https://mynt-proxy.rhythmcorehq.com が使用され、すべてのデータがこのサービスを通過するため、プライバシー上の懸念が生じる可能性があります。", "GPSDisclaimer": "位置情報は天気の更新のためだけに使用されます。データはブラウザ内に一時保存され、第三者に共有されたり、開発者がアクセスしたりすることはありません。\n\nGPSを有効にすることで、ローカルでの位置情報の共有に同意したものとみなされます。", "failedbackup": "バックアップに失敗しました: ", "restorecompleted": "復元が完了しました!", "restorefailed": "復元に失敗しました: ", "invalidBackup": "無効なバックアップファイルが選択されました。", "deleteBookmark": "ブックマーク「{title}」を削除してもよろしいですか?", "UnsupportedBrowser": "お使いのブラウザではブックマークはサポートされていません。", "resetShortcutsPrompt": "すべての保存済みショートカットが削除され、デフォルトにリセットされます。続行しますか?", "invalidFileTypeMessage": "有効な画像ファイルを選択してください。", "invalidSvgMessage": "挿入されたSVGが無効か、安全でないコンテンツが含まれているため、アイコンとして使用できません。", "invalidIconUrlMessage": "有効な画像のURLを入力してください(https://、http://、またはdata:image/で始まる必要があります)。", "iconFileTooLargeMessage": "選択されたファイルが大きすぎます: {size} KB。{max} KB 未満のファイルを使用してください。", "iconStorageQuotaMessage": "ストレージ制限に達したため、アイコンを保存できませんでした。いくつかのカスタムアイコンを削除するか、より小さな画像を使用してください。" }; ================================================ FILE: locales/ko.js ================================================ // Korean const ko = { // Menu Items "github": "GitHub", "feedback": "피드백", // Shortcuts "shortcutsText": "바로가기", "enableShortcutsText": "저장된 바로가기 보기", "editShortcutsText": "바로가기 편집", "shortcutsInfoText": "표시할 바로가기를 선택하세요", "editShortcutsList": "저장된 바로가기", "editShortcutsListInfo": "\"+\" 아이콘을 클릭해서 새 바로가기를 추가하거나, 이름 또는 URL을 클릭해서 수정할 수 있어요.", "adaptiveIconText": "테마 적용 아이콘", "adaptiveIconInfoText": "바로가기 아이콘이 테마에 맞춰 변해요", "bookmarksText": "즐겨찾기", "bookmarksInfo": "즐겨찾기 사이드바 표시", "ai_tools_button": "AI 도구", "enable_ai_tools": "AI 도구 바로가기 표시", "aiToolsSettingsText": "AI 도구 설정", "aiToolsSettingsInfo": "AI 도구 바로가기 관리", "googleAppsMenuText": "Google 앱", "googleAppsMenuInfo": "Google 앱 바로가기 표시", "googleAppsHover": "Google 앱", // To-do List "todoListText": "할 일", "todoListInfo": "오늘의 할 일 목록 보기", "todoListHover": "할 일", "todoPlaceholder": "할 일 추가...", // Clock "hideClockBox": "시계 숨기기", "hideClockBoxInfo": "시계와 날짜 숨기기", "digitalclocktitle": "디지털 시계", "digitalclockinfo": "디지털 시계로 바꾸기", "timeformattitle": "12시간제", "timeformatinfo": "12시간 형식으로 표시", "greetingtitle": "인사말", "greetinginfo": "사용자 지정 텍스트 아래에 인사말 표시", // Misc "userTextTitle": "사용자 지정 텍스트", "userTextInfo": "시계 아래에 원하는 텍스트 표시", "fahrenheitCelsiusCheckbox": "화씨로 전환", "fahrenheitCelsiusText": "페이지를 새로고침하면 적용돼요", "hideWeatherTitle": "날씨 숨기기", "hideWeatherInfo": "날씨 위젯 끄기", "hideWeatherBox": "날씨 카드 숨기기", "hideWeatherBoxInfo": "온도만 표시하기", "minMaxTempText": "최저·최고 기온", "minMaxTempSubText": "체감 온도 대신 최저·최고 기온 표시", // Search "micIconTitle": "마이크 아이콘 숨기기", "micIconInfo": "음성 입력이 안 될 때", "hideSearchWith": "검색 엔진 숨기기", "hideSearchWithInfo": "아이콘을 클릭해서 검색 엔진 바꾸기", "motivationalQuotesText": "동기부여 명언", "motivationalQuotesInfo": "검색창 아래에 명언 표시", "search_suggestions_button": "검색 제안", "search_suggestions_text": "검색 제안 켜기", // Proxy "useproxytitletext": "프록시 우회", "useproxyText": "검색 제안이 안 될 때", "ProxyText": "CORS 우회 프록시", "ProxySubtext": "직접 만든 CORS 우회 프록시 추가", "HostproxyButton": "내 프록시 호스팅하기", // Location "useGPS": "GPS 사용", "useGPSInfo": "실시간 위치로 날씨 업데이트", "UserLocText": "위치 입력", "UserLocSubtext": "날씨 위치가 안 맞을 때", "userLoc": "도시명 또는 좌표 (위도, 경도)", "PrivacyPolicy": "개인정보 처리방침", // Weather "WeatherApiText": "WeatherAPI 키 입력", "WeatherApiSubtext": "날씨 기능이 안 될 때", "userAPI": "WeatherAPI 키", "LearnMoreButton": "자세히 알아보기", "saveAPI": "저장", // Body Items // Calendar "days": ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'], "months": ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], // Bookmarks "bookmarksHeading": "즐겨찾기", "bookmarkSortBy": "정렬", "sortAlphabetical": "이름순", "sortTimeAdded": "추가순", "bookmarkViewAs": "보기", "bookmarkViewGrid": "격자", "bookmarkViewList": "목록", "bookmarkSearch": "즐겨찾기 검색", "editBookmarkHeading": "즐겨찾기 편집", "editBookmarkName": "이름", "editBookmarkURL": "URL", // New Tab Item "conditionText": "안녕하세요! 오늘 기분은 어떠세요?", "humidityLevel": "습도", "feelsLike": "체감", "minMaxTemp": "최저 ~ 최고", "location": "지구", "enterBtn": "검색", "searchPlaceholder": "검색어를 입력하세요...", "listenPlaceholder": "듣고 있어요...", "searchWithHint": "검색 방법", "searchOnHint": "검색 위치", "userText": "클릭해서 수정", // Greeting greeting: { "morning": "좋은 아침이에요!", "afternoon": "좋은 오후예요!", "evening": "좋은 저녁이에요!" }, // Search Engines "defaultEngine": "기본", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "이미지", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI 도구", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "표시할 AI 도구를 선택하세요", "resetAISettingsBtn": "초기화", // Theme "enableDarkMode": "다크 모드 (실험적)", "enableDarkModeInfo": "다크 모드 테마 켜기", // Wallpaper and settings "uploadWallpaperText": "배경화면 업로드", "rangColor": "색상 선택", "opacityTitle": "투명도", "adjustOpacityDesc": "인터페이스 투명도 조절", "backupText": "백업", "restoreText": "복원", "resetsettings": "설정 초기화", "menuCloseText": "닫기", // Tips "switchSearchModes": "검색 모드 전환", "switchSearchModesInfo": "'검색 방법'을 클릭해서 모드를 바꾸세요.", "adjustZoom": "화면 확대/축소", "adjustZoomInfo": "Ctrl + \"+\" 또는 Ctrl + \"-\"를 눌러서 화면을 확대/축소할 수 있어요.", "changeBrowserTheme": "브라우저 테마 바꾸기", "chromeThemeInfo": "점 세 개(⋮) > 도구 더보기 > Chrome 맞춤설정을 클릭한 다음 확장 프로그램 테마와 어울리는 색상을 선택하세요.", "edgeThemeInfo": "설정 > 모양으로 가서 확장 프로그램 테마와 어울리는 색상을 선택하세요.", "braveThemeInfo": "Chrome 테마 스토어에서 확장 프로그램과 어울리는 테마를 다운로드해서 적용하세요.", "firefoxThemeInfo": "Firefox 테마에서 확장 프로그램과 어울리는 테마를 다운로드해서 적용하세요.", "updateFirefoxHomepage": "홈페이지 변경", "updateFirefoxHomepageInfo": "새 탭과 함께 홈페이지도 바꾸려면 이 링크를 확인하세요.", "dontShowTips": "다시 보지 않기", // Dialog boxes (alerts) "okText": "확인", "yesText": "예", "noText": "아니요", "agreeText": "동의", "cancelText": "취소", "confirmWallpaper": "이 이미지를 오늘의 배경화면으로 설정할까요?", "confirmRestore": "정말 설정을 초기화할까요? 이 작업은 되돌릴 수 없어요.", "Nobackgroundset": "현재 설정된 배경 이미지가 없어요.", "clearbackgroundimage": "배경 이미지를 지울까요?", "ProxyDisclaimer": "모든 프록시 기능은 기본적으로 꺼져 있어요.\n\n검색 제안과 CORS 우회 프록시를 켜려면, 개인정보 보호를 위해 직접 프록시를 호스팅하는 걸 강력히 권장해요.\n\n기본 설정으로는 https://mynt-proxy.rhythmcorehq.com 프록시를 사용하는데, 이 경우 모든 데이터가 이 서비스를 거치게 돼서 개인정보 문제가 생길 수 있어요.", "GPSDisclaimer": "위치 데이터는 정확한 날씨를 보여주기 위해서만 사용돼요. 브라우저 안에만 임시로 저장되며, 다른 서비스와 공유되지 않고 저희도 볼 수 없어요.\n\nGPS를 켜면 확장 프로그램 내에서만 위치 정보를 공유하는 것에 동의하는 거예요.", "failedbackup": "백업 실패: ", "restorecompleted": "복원 완료!", "restorefailed": "복원 실패: ", "invalidBackup": "잘못된 백업 파일이에요.", "deleteBookmark": "\"{title}\" 즐겨찾기를 삭제할까요?", "UnsupportedBrowser": "이 브라우저에서는 즐겨찾기를 지원하지 않아요.", "resetShortcutsPrompt": "저장된 모든 바로가기가 삭제되고 기본값으로 초기화돼요. 계속할까요?" }; ================================================ FILE: locales/mr.js ================================================ // Marathi const mr = { "newTabTitle": "नवा टैब", // Menu Items "github": "गिटहब", "feedback": "प्रतिसाद", // Section titles "personalizationSectionTitle": "वैयक्तिकरण", "clockSectionTitle": "घड्याळ", "searchSectionTitle": "शोधा", "weatherSectionTitle": "हवामान", "appearanceSectionTitle": "रंगरूप", "settingsSectionTitle": "सेटिंग्ज", // Shortcuts "shortcutsText": "शॉर्टकट्स", "enableShortcutsText": "जतन केलेले शॉर्टकट्स दाखवा", "editShortcutsText": "शॉर्टकट्स संपादित करा", "shortcutsInfoText": "कोणते शॉर्टकट दाखवायचे ते निवडा", "editShortcutsList": "जतन केलेले शॉर्टकट्स", 'editShortcutsListInfo': "आपण \"+\" आयकॉनवर क्लिक करून नवीन शॉर्टकट्स जोडू शकता किंवा शॉर्टकटच्या नावावर किंवा URL वर क्लिक करून विद्यमान शॉर्टकट्स संपादित करू शकता.", "adaptiveIconText": "अनुकूल आयकॉन", "adaptiveIconInfoText": "शॉर्टकट आयकॉन थीमनुसार जुळतील", "bookmarksText": "बुकमार्क्स", "bookmarksInfo": "बुकमार्क्स साइडबार दाखवा", "ai_tools_button": "AI साधने", "enable_ai_tools": "AI साधनांसाठी शॉर्टकट्स दाखवा", "googleAppsMenuText": "गुगल ॲप्स", "googleAppsMenuInfo": "गुगल ॲप्ससाठी शॉर्टकट्स दाखवा", "googleAppsHover": "गुगल ॲप्स", "aiToolsSettingsText": "AI साधनांची सेटिंग्ज", "aiToolsSettingsInfo": "AI साधनांच्या शॉर्टकट्सचे व्यवस्थापन करा", // To-do List "todoListText": "कार्य सूची", "todoListInfo": "दैनिक कार्यांची सूची पहा", "todoListHover": "कार्य सूची", "todoPlaceholder": "कार्ये समाविष्ट करा...", // Digital Clock "hideClockBox": "घड्याळ लपवा", "hideClockBoxInfo": "घड्याळ आणि तारीख लपवा", "digitalclocktitle": "डिजिटल घड्याळ", "digitalclockinfo": "डिजिटल घड्याळावर स्विच करा", "timeformattitle": "१२-तासांचा फॉरमॅट", "timeformatinfo": "१२-तासांचा वेळ फॉरमॅट वापरा", "greetingtitle": "शुभेच्छा", "greetinginfo": "सानुकूल मजकुराखाली शुभेच्छा दाखवा", // Misc "userTextTitle": "सानुकूल मजकूर", "userTextInfo": "घड्याळाखाली सानुकूल मजकूर दाखवा", "fahrenheitCelsiusCheckbox": "फॅरनहाइटमध्ये दाखवा", "fahrenheitCelsiusText": "बदल लागू करण्यासाठी पृष्ठ रीफ्रेश करा", "hideWeatherTitle": "हवामान लपवा", "hideWeatherInfo": "हवामान विजेट निष्क्रिय करा", "hideWeatherBox": "हवामान कार्ड लपवा", "hideWeatherBoxInfo": "फक्त तापमान पिल दाखवा", "minMaxTempText": "किमान-अधिकतम तापमान", "minMaxTempSubText": "भासणार्या तापमानाच्या जागी किमान व अधिकतम तापमान दाखवा", // Search "micIconTitle": "मायक्रोफोनचे चिन्ह लपवा", "micIconInfo": "जर व्हॉइस टायपिंग चालत नसेल", "hideSearchWith": "सर्च इंजिने लपवा", "hideSearchWithInfo": "आयकॉनवर क्लिक करून सर्च इंजिन बदला", "motivationalQuotesText": "प्रेरणादायी सुविचार", "motivationalQuotesInfo": "शोधपट्टीच्या खाली सुविचार दाखवा", "search_suggestions_button": "शोध सूचना", "search_suggestions_text": "शोध सूचना चालू करा", // Proxy "useproxytitletext": "प्रॉक्सी बायपास", "useproxyText": "जर शोध सूचना चालत नसेल", "ProxyText": "CORS बायपास प्रॉक्सी", "ProxySubtext": "आपला स्वतःचा CORS बायपास प्रॉक्सी जोडा", "HostproxyButton": "आपला प्रॉक्सी होस्ट करा", // Location "useGPS": "GPSचा उपयोग", "useGPSInfo": "लाइव स्थान अपडेट करण्यासाठी GPS सुरू करा", "UserLocText": "आपले स्थान नोंद करा", "UserLocSubtext": "जर हवामानाचे स्थान बरोबर नसेल", "userLoc": "आपले शहर किंवा समन्वय (अक्षांश, रेखांश)", "PrivacyPolicy": "गोपनीयता धोरणे", // Weather "WeatherApiText": "आपली WeatherAPI key नोंदवा", "WeatherApiSubtext": "जर हवामान कार्यरत नसेल", "userAPI": "आपली WeatherAPI key", "LearnMoreButton": "अधिक माहिती", "saveAPI": "जतन करा", // Body Items // Calendar "days": ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरु', 'शुक्र', 'शनि'], // Truncated for display // "days": ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], // Full "months": ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], // Bookmarks "bookmarksHeading": "बुकमार्क्स", "bookmarkSortBy": "क्रमवारी लावा", "sortAlphabetical": "ए-झेड", "sortTimeAdded": "जुना-नवा", "bookmarkViewAs": "या रूपात पाहा", "bookmarkViewGrid": "ग्रिड", "bookmarkViewList": "लिस्ट", "bookmarkSearch": "बुकमार्क शोधा", "editBookmarkHeading": "बुकमार्क संपादित करा", "editBookmarkName": "बुकमार्कचे नाव", "editBookmarkURL": "बुकमार्कचे URL", // New Tab Item "conditionText": "नमस्कार! तुम्ही आज कसे आहात?", "humidityLevel": "दमटपणा", "feelsLike": "वाटते", "minMaxTemp": "किमान ~ अधिकतम", "location": "पृथ्वी", "enterBtn": "शोधा", "searchPlaceholder": "येथे लिहा...", "listenPlaceholder": "ऐकत आहे...", "searchWithHint": "यासह शोधा", "searchOnHint": "यावर शोधा", "userText": "येथे आपला मजकूर लिहा", // Greeting greeting: { "morning": "शुभ सकाळ!", "afternoon": "शुभ दुपार!", "evening": "शुभ संध्याकाळ!" }, // Search Engines "defaultEngine": "डिफॉल्ट", "googleEngine": "गुगल", "duckEngine": "डकडकगो", "bingEngine": "बिंग", "braveEngine": "ब्रेव्ह", "youtubeEngine": "यूट्यूब", "gImagesEngine": "इमेज", "redditEngine": "रेडिट", "wikipediaEngine": "विकिपीडिया", "quoraEngine": "क्वोरा", // AI Tools "ai_tools": "AI साधने", "chatGPT": "चॅटGPT", "gemini": "जेमिनी", "copilot": "कोपायलट", "claude": "क्लॉड", "grok": "ग्रोक", "qwen": "क्वेन", "perplexity": "पर्प्लेक्सिटी", "deepseek": "डीपसीक", "metaAI": "मेटा AI", "firefly": "अडोबी फायरफ्लाय", "aiSettingsIntro": "कोणती AI साधने दाखवायची, ते निवडा.", "resetAISettingsBtn": "रीसेट करा", // Theme "lightThemed": "लाइट", "darkThemed": "डार्क", "systemThemed": "सिस्टम", // Wallpaper and settings "uploadWallpaperText": "वॉलपेपर सेट करा", "rangColor": "रंग निवडा", "opacityTitle": "अपारदर्शकता", "adjustOpacityDesc": "इंटरफेसची अपारदर्शकता समायोजित करा", "backupText": "बॅकअप करा", "restoreText": "पुनर्संचयित करा", "resetsettings": "सेटिंग्ज रीसेट करा", "menuCloseText": "बंद करा", // Tips "switchSearchModes": "शोधण्याचा मोड बदला", "switchSearchModesInfo": "मोड बदलण्यासाठी ‘यासह शोधा’ वर क्लिक करा", "adjustZoom": "ज़ूम समायोजित करा", "adjustZoomInfo": "ज़ूम समायोजित करण्यासाठी Ctrl + \"+\" अथवा Ctrl + \"-\" दाबा", "changeBrowserTheme": "ब्राउझरची थीम बदला", "chromeThemeInfo": "तीन बिंदूंवर (⋮) क्लिक करा > अधिक साधने > क्रोम कस्टमाइझ करा, त्यानंतर एक्सटेंशन थीमसोबत जुळणारा रंग निवडा", "edgeThemeInfo": "सेटिंग्ज > स्वरूप (Appearance) वर जा, मग एक्सटेंशन थीमसोबत जुळणारा रंग निवडा", "braveThemeInfo": 'क्रोम थीम स्टोर वर जाऊन, आपल्या पसंतीची थीम डाउनलोड करा आणि लागू करा', "firefoxThemeInfo": 'फायरफॉक्स थीम्स वर जाऊन, आपल्या आवडीचा थीम डाउनलोड करा आणि लागू करा', "updateFirefoxHomepage": "होमपेज अपडेट करा", "updateFirefoxHomepageInfo": 'आपल्या होमपेजला सुद्धा नवीन टॅबाप्रमाणे बदलण्यासाठी, या लिंक वर जा आणि दिलेल्या सूचनांचे पालन करा.', "dontShowTips": "हे पुन्हा दाखवू नका", // Footer Toast "footerToastTitle": "खाली एक बॅनर दिसतोय?", "footerToastMessage": "ते लपवण्यासाठी, त्यावर राइट-क्लिक करा आणि 'नवीन टॅबा पेजवर लपवा' निवडा", // Dialog boxes (alerts) "okText": "ठीक आहे", "yesText": "होय", "noText": "नाही", "agreeText": "मी सहमत आहे", "cancelText": "रद्द करा", "confirmWallpaper": "तुम्हाला आजचा वॉलपेपर बदलायचा आहे का?", "confirmRestore": "तुम्हाला खरंच तुमचे सेटिंग्स रीसेट करायचे आहेत का? ही क्रिया परत केली जाऊ शकत नाही.", "Nobackgroundset": "सद्यस्थितीत कोणतीही पार्श्वभूमी सेट केलेली नाही.", "clearbackgroundimage": "तुम्हाला पार्श्वभूमी इमेज क्लिअर करायची आहे का?", "ProxyDisclaimer": "सर्व प्रॉक्सी फीचर्स डिफॉल्टनुसार बंद असतात.\n\nजर तुम्ही सर्च सुजेशन्स आणि CORS बायपास प्रॉक्सी सक्षम केले, तर गोपनीयतेसाठी तुमची स्वतःची प्रॉक्सी होस्ट करणे अत्यंत शिफारसीय आहे.\n\nडिफॉल्टनुसार, प्रॉक्सी https://mynt-proxy.rhythmcorehq.com म्हणून सेट केले जाईल, म्हणजे तुमचे सर्व डेटा या सर्विसमधून जाईल, ज्यामुळे गोपनीयतेच्या संदर्भात धोका होऊ शकतो.", "GPSDisclaimer": "आपल्या स्थानाची माहिती केवळ अचूक हवामान अपडेट करण्यासाठी उपयोग केली जात आहे. हे ब्राउझरमध्ये तात्पुरते साठवले जाते. ते कोणत्याही त्रयस्थ सेवांशी सामायिक केले जात नाही, तसेच आम्हालाही ते ॲक्सेस करता येत नाही.\n\nGPS सक्षम करून, तुम्ही तुमचे स्थान या एक्स्टेंशनसोबत स्थानिक पातळीवर सामायिक करण्यास संमती देता.", "failedbackup": "बॅकअप अयशस्वी: ", "restorecompleted": "पुनर्संचयित यशस्वी झाले!", "restorefailed": "पुनर्संचयित अयशस्वी: ", "invalidBackup": "अवैध बॅकअप फाइल निवडली आहे.", "deleteBookmark": "तुम्हाला \"{title}\" बुकमार्क डिलीट करायचा आहे का?", "UnsupportedBrowser": "तुमच्या ब्राउझरमध्ये बुकमार्क्सला समर्थन नाही.", "resetShortcutsPrompt": "जतन केलेले सर्व शॉर्टकट्स हटवले जातील आणि पूर्ववत केले जातील. तुम्हाला खरंच पुढे जायचे आहे का?" }; ================================================ FILE: locales/ne.js ================================================ // Nepali const ne = { // Menu Items "github": "गिटहब", "feedback": "प्रतिक्रिया", "resetsettings": "सेटिङहरू रिसेट गर्नुहोस्", "menuCloseText": "मेनु बन्द गर्नुहोस्", // Shortcuts "shortcutsText": "सर्टकटहरू", "enableShortcutsText": "Saved गरिएका सर्टकटहरू देखाउनुहोस्", "editShortcutsText": "सर्टकटहरू परिवर्तन गर्नुहोस्", "shortcutsInfoText": "कुन सर्टकटहरू देखाइन्छ छनौट गर्नुहोस्", "editShortcutsList": "Saved सर्टकटहरू", "editShortcutsListInfo": "तपाईंले \"+\" आइकनमा क्लिक गरेर नयाँ सर्टकटहरू थप्न सक्नुहुन्छ वा सर्टकट नाम वा URL मा क्लिक गरेर अवस्थितहरूलाई परिवर्तन गर्न सक्नुहुन्छ।", "adaptiveIconText": "अनुकूल आइकनहरू", "adaptiveIconInfoText": "सर्टकट आइकनहरू विषयवस्तुको रङसँग मेल खाने र साना देखिनेछन्", "bookmarksText": "बुकमार्कहरू", "bookmarksInfo": "बुकमार्क साइडबार देखाउनुहोस्", "ai_tools_button": "AI-उपकरणहरू", "enable_ai_tools": "AI उपकरणहरूका लागि सर्टकटहरू देखाउनुहोस्", "googleAppsMenuText": "गुगल एप्स", "googleAppsMenuInfo": "गुगल एप्सका लागि सर्टकटहरू देखाउनुहोस्", "googleAppsHover": "गुगल एप्स", // To-do List "todoListText": "गर्नुपर्ने कार्यहरु", "todoListInfo": "दैनिक गर्नुपर्ने कार्यहरु देखाउनुहोस ", "todoListHover": "गर्नुपर्ने कार्यहरु", "todoPlaceholder": "गर्नु पर्ने काम थप्नुहोस...", // Digital Clock "digitalclocktitle": "डिजिटल घडी", "digitalclockinfo": "डिजिटल घडीमा परिवर्तन गर्नुहोस्", "timeformattitle": "12-घण्टा ढाँचा", "timeformatinfo": "12-घण्टा समय ढाँचा प्रयोग गर्नुहोस्", "greetingtitle": "अभिवादन", "greetinginfo": "अनुकूलन पाठ अभिवादनको तल देखाउनुहोस्", // Misc "userTextTitle": "अनुकूलन योग्य पाठ", "userTextInfo": "घडीको तल अनुकूलन पाठ देखाउनुहोस्", "fahrenheitCelsiusCheckbox": "फरेनहाइट मा स्विच गर्नुहोस्", "fahrenheitCelsiusText": "परिवर्तनहरू लागू गर्न रिफ्रेस गर्नुहोस्", "micIconTitle": "माइक्रोफोन आइकन लुकाउनुहोस्", "micIconInfo": "यदि भ्वाइस टाइपिङले काम गरिरहेको छैन भने", "hideSearchWith": "खोज इन्जिनहरू लुकाउनुहोस्", "hideSearchWithInfo": "यसको आइकनमा क्लिक गरेर खोज इन्जिनहरू बीच स्विच गर्नुहोस्", "search_suggestions_button": "खोज सुझावहरू", "search_suggestions_text": "खोज सुझावहरू सक्षम गर्नुहोस्", // Proxy "useproxytitletext": "Proxy Bypass", "useproxyText": "यदि खोज सुझावहरूले काम गरिरहेको छैन भने", "ProxyText": "CORS Bypass Proxy", "ProxySubtext": "आफ्नो CORS bypass proxy थप्नुहोस्", "HostproxyButton": "तपाईंको आफ्नै proxy host गर्नुहोस्", // Location "UserLocText": "आफ्नो स्थान प्रविष्ट गर्नुहोस्", "UserLocSubtext": "मौसम स्थान सही छैन भने", "userLoc": "तपाईंको शहर वा निर्देशांक (अक्षांश, देशान्तर)", "useGPS": "GPS प्रयोग गर्नुहोस्", // Weather "WeatherApiText": "आफ्नो WeatherAPI Key प्रविष्ट गर्नुहोस्", "WeatherApiSubtext": "यदि मौसम कार्यक्षमता काम गरिरहेको छैन भने", "userAPI": "तपाईंको weatherAPI key", "LearnMoreButton": "थप जान्नुहोस्", "saveAPI": "Save", // Body Items // Calendar "days": ["आइतबार", "सोमबार", "मङ्गलबार", "बुधबार", "बिहीबार", "शुक्रबार", "शनिबार"], "months": ["जानेवारी", "फेब्रुवारी", "मार्च", "एप्रिल", "मे", "जून", "जुलै", "ऑगस्ट", "सप्टेंबर", "ऑक्टोबर", "नोव्हेंबर", "डिसेंबर"], // Bookmarks "bookmarksHeading": "बुकमार्कहरू", "bookmarkViewAs": "को रूपमा हेर्नुहोस्", "bookmarkViewGrid": "ग्रिड", "bookmarkViewList": "सूची", "bookmarkSearch": "बुकमार्क खोज्नुहोस्", // New Tab Item "conditionText": "नमस्ते! तपाइलाई आज कस्तो छ?", "humidityLevel": "आर्द्रता", "feelsLike": "महसुस हुन्छ", "location": "पृथ्वी", "enterBtn": "खोज्नुहोस्", "searchPlaceholder": "कृपया यहाँ लेख्नुहोस्", "listenPlaceholder": "सुन्दै...", "searchWithHint": "साथ खोज्नुहोस्", "userText": "तपाईं यहाँ लेख्न सक्नुहुन्छ", // Greeting "greeting": { "morning": "शुभ प्रभात!", "afternoon": "शुभ दिउँसो!", "evening": "शुभ साँझ!", }, // Search Engines "googleEngine": "गूगल", "duckEngine": "डकडकगो", "bingEngine": "बिंग", "braveEngine": "ब्रेव", "youtubeEngine": "यूट्यूब", // AI Tools "ai_tools": "AI उपकरणहरू", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "perplexity": "Perplexity", "metaAI": "Meta AI", // Wallpaper and misc "uploadWallpaperText": "वालपेपर अपलोड गर्नुहोस्", "backupText": "ब्याकअप", "restoreText": "पुनर्स्थापना गर्नुहोस्", "rangColor": "रंग छान्नुहोस्", // Dialog boxes (alerts) "confirmWallpaper": "के तपाईं दिनको लागि आफ्नो वालपेपरको रूपमा नयाँ छवि सेट गर्न चाहनुहुन्छ?", "confirmRestore": "के तपाइँ तपाइँको सेटिङहरू रिसेट गर्न निश्चित हुनुहुन्छ? यो कार्य पुनर्स्थापना गर्न सकिँदैन।", "Nobackgroundset": "हाल कुनै पनि पृष्ठभूमि फोटो सेट गरिएको छैन।", "clearbackgroundimage": "के तपाइँ पृष्ठभूमि फोटो हटाउन निश्चित हुनुहुन्छ?", "ProxyDisclaimer": "सबै प्रोक्सी सुविधाहरू पूर्वनिर्धारित रूपमा बन्द छन्।\n\nयदि तपाईंले खोज सुझावहरू र CORS बाइपास प्रोक्सी सक्षम गर्नुभयो भने, परिष्कृत गोपनीयताको लागि तपाईंको आफ्नै प्रोक्सी होस्ट गर्न दृढ रूपमा सिफारिस गरिन्छ।\n\nपूर्वनिर्धारित रूपमा, प्रोक्सीलाई https://mynt-proxy.rhythmcorehq.com मा सेट गरिनेछ, जसको अर्थ तपाइँको सबै डेटा यस सेवा मार्फत जानेछ, जसले गोपनीयता चिन्ताहरू खडा गर्न सक्छ।", "failedbackup": "ब्याकअप असफल भयो: ", "restorecompleted": "पुनर्स्थापना सफलतापूर्वक सम्पन्न भयो!", "restorefailed": "ब्याकअप असफल भयो: ", "invalidBackup": "अवैध ब्याकअप फाइल", "deleteBookmark": "के तपाइँ निश्चित रूपमा \"{title}\" बुकमार्क मेटाउन चाहनुहुन्छ?", "UnsupportedBrowser": "बुकमार्कहरू तपाईंको ब्राउजरमा समर्थित छैनन्" }; ================================================ FILE: locales/pl.js ================================================ // Polish const pl = { // Menu Items "github": "GitHub", "feedback": "Opinie", // Shortcuts "shortcutsText": "Skróty", "enableShortcutsText": "Pokaż zapisane skróty", "editShortcutsText": "Edytuj skróty", "shortcutsInfoText": "Wybierz pokazywane skróty", "editShortcutsList": "Zapisane skróty", "editShortcutsListInfo": "Możesz dodać nowe skróty klikając ikonę \"+\" lub edytować istniejące klikając na nazwę lub adres URL skrótu.", "adaptiveIconText": "Adaptacyjne ikony", "adaptiveIconInfoText": "Ikony skrótów będą dostosowywać się do motywu", "bookmarksText": "Zakładki", "bookmarksInfo": "Pokaż pasek boczny zakładek", "ai_tools_button": "Narzędzia AI", "enable_ai_tools": "Pokaż skróty do narzędzi AI", "aiToolsSettingsText": "Ustawienia narzędzi AI", "aiToolsSettingsInfo": "Zarządzaj skrótami do narzędzi AI", "googleAppsMenuText": "Aplikacje Google", "googleAppsMenuInfo": "Pokaż skróty do aplikacji Google", "googleAppsHover": "Aplikacje Google", // To-do List "todoListText": "Lista zadań", "todoListInfo": "Pokaż codzienną listę zadań", "todoListHover": "Lista zadań", "todoPlaceholder": "Dodaj zadanie...", // Clock "hideClockBox": "Ukryj zegar", "hideClockBoxInfo": "Ukryj zegar i datę", "digitalclocktitle": "Zegar cyfrowy", "digitalclockinfo": "Przełącz na zegar cyfrowy", "timeformattitle": "Format 12-godzinny", "timeformatinfo": "Używaj formatu 12-godzinnego", "greetingtitle": "Powitanie", "greetinginfo": "Pokaż powitanie poniżej niestandardowego tekstu", // Misc "userTextTitle": "Tekst konfigurowalny", "userTextInfo": "Pokaż niestandardowy tekst poniżej zegara", "fahrenheitCelsiusCheckbox": "Przełącz na Fahrenheita", "fahrenheitCelsiusText": "Odśwież stronę, aby zastosować zmiany", "hideWeatherTitle": "Ukryj pogodę", "hideWeatherInfo": "Wyłącz widżety pogodowe", "hideWeatherBox": "Ukryj kartę pogody", "hideWeatherBoxInfo": "Pokaż tylko kapsułę temperatury", "minMaxTempText": "Min-Maks temperatura", "minMaxTempSubText": "Zastąp 'Odczuwalna' minimalną i maksymalną temperaturą", // Search "micIconTitle": "Ukryj ikonę mikrofonu", "micIconInfo": "Jeśli pisanie głosowe nie działa", "hideSearchWith": "Ukryj wyszukiwarki", "hideSearchWithInfo": "Przełączaj się między wyszukiwarkami klikając ich ikonę", "motivationalQuotesText": "Motywacyjne cytaty", "motivationalQuotesInfo": "Pokaż cytaty pod paskiem wyszukiwania", "search_suggestions_button": "Sugestie wyszukiwania", "search_suggestions_text": "Włącz sugestie wyszukiwania", // Proxy "useproxytitletext": "Obejście Proxy", "useproxyText": "Jeśli sugestie wyszukiwania nie działają", "ProxyText": "Proxy CORS Bypass", "ProxySubtext": "Dodaj własne proxy omijające CORS", "HostproxyButton": "Hostuj własne proxy", // Location "useGPS": "Używaj GPS", "useGPSInfo": "Włącz GPS dla aktualizacji lokalizacji na żywo", "UserLocText": "Wprowadź swoją lokalizację", "UserLocSubtext": "Jeśli lokalizacja pogody jest niepoprawna", "userLoc": "Twoje miasto lub współrzędne (szerokość, długość geograficzna)", "PrivacyPolicy": "Polityka prywatności", // Weather "WeatherApiText": "Wprowadź swój klucz WeatherAPI", "WeatherApiSubtext": "Jeśli funkcja pogody nie działa", "userAPI": "Twój klucz WeatherAPI", "LearnMoreButton": "Dowiedz się więcej", "saveAPI": "Zapisz", // Body Items // Calendar "days": ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'], "months": ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'], // Bookmarks "bookmarksHeading": "Zakładki", "bookmarkSortBy": "Sortuj według", "sortAlphabetical": "A-Z", "sortTimeAdded": "Stare-Nowe", "bookmarkViewAs": "Wyświetl jako", "bookmarkViewGrid": "Siatka", "bookmarkViewList": "Lista", "bookmarkSearch": "Szukaj zakładki", "editBookmarkHeading": "Edytuj zakładkę", "editBookmarkName": "Nazwa zakładki", "editBookmarkURL": "Adres URL zakładki", // New Tab Item "conditionText": "Cześć! Jak się dziś masz?", "humidityLevel": "Wilgotność", "feelsLike": "Odczuwalna", "minMaxTemp": "Min ~ Maks", "location": "Ziemia", "enterBtn": "Szukaj", "searchPlaceholder": "Pisz tutaj...", "listenPlaceholder": "Słucham...", "searchWithHint": "Szukaj za pomocą", "searchOnHint": "Szukaj w", "userText": "Kliknij tutaj, aby edytować", // Greeting greeting: { "morning": "Dzień dobry!", "afternoon": "Dzień dobry po południu!", "evening": "Dobry wieczór!" }, // Search Engines "defaultEngine": "Domyślna", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Obrazy", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Narzędzia AI", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Wybierz, które narzędzia AI wyświetlać", "resetAISettingsBtn": "Resetuj", // Theme "enableDarkMode": "Tryb ciemny (eksperymentalny)", "enableDarkModeInfo": "Włącz motywy ciemne", // Wallpaper and settings "uploadWallpaperText": "Prześlij tapetę", "rangColor": "Wybierz kolor", "opacityTitle": "Przezroczystość", "adjustOpacityDesc": "Dostosuj przezroczystość interfejsu", "backupText": "Kopia zapasowa", "restoreText": "Przywróć", "resetsettings": "Resetuj ustawienia", "menuCloseText": "Zamknij", // Tips "switchSearchModes": "Przełącz tryby wyszukiwania", "switchSearchModesInfo": "Kliknij ‘Szukaj za pomocą’, aby zmienić tryb.", "adjustZoom": "Dostosuj powiększenie", "adjustZoomInfo": "Naciśnij Ctrl + \"+\" lub Ctrl + \"-\", aby dostosować powiększenie.", "changeBrowserTheme": "Zmień motyw przeglądarki", "chromeThemeInfo": "Kliknij trzy kropki (⋮) > Więcej narzędzi > Dostosuj Chrome, a następnie wybierz kolor pasujący do motywu rozszerzenia.", "edgeThemeInfo": "Przejdź do Ustawienia > Wygląd, a następnie wybierz kolor pasujący do motywu rozszerzenia.", "braveThemeInfo": "Odwiedź Chrome Theme Store, pobierz i zastosuj motyw pasujący do rozszerzenia.", "firefoxThemeInfo": "Odwiedź Firefox Themes, pobierz i zastosuj motyw pasujący do rozszerzenia.", "updateFirefoxHomepage": "Zaktualizuj stronę główną", "updateFirefoxHomepageInfo": "Aby zmienić stronę główną również na nową kartę, odwiedź ten link i postępuj zgodnie z instrukcjami.", "dontShowTips": "Nie pokazuj tego ponownie", // Dialog boxes (alerts) "okText": "OK", "yesText": "Tak", "noText": "Nie", "agreeText": "Zgadzam się", "cancelText": "Anuluj", "confirmWallpaper": "Czy chcesz ustawić nowy obraz jako tapetę dnia?", "confirmRestore": "Czy na pewno chcesz zresetować ustawienia? Tej akcji nie można cofnąć.", "Nobackgroundset": "Obecnie nie ustawiono obrazu tła.", "clearbackgroundimage": "Czy na pewno chcesz usunąć obraz tła?", "ProxyDisclaimer": "Wszystkie funkcje proxy są domyślnie wyłączone.\n\nJeśli włączysz sugestie wyszukiwania i proxy CORS bypass, zdecydowanie zaleca się hostowanie własnego proxy dla lepszej prywatności.\n\nDomyślnie proxy będzie ustawione na https://mynt-proxy.rhythmcorehq.com, co oznacza, że wszystkie Twoje dane będą przechodzić przez tę usługę, co może stanowić zagrożenie dla prywatności.", "GPSDisclaimer": "Twoje dane lokalizacyjne są używane wyłącznie do dostarczania dokładnych aktualizacji pogody. Są tymczasowo przechowywane w przeglądarce i nie są ani udostępniane usługom trzecim, ani dostępne dla nas.\n\nWłączając GPS, wyrażasz zgodę na udostępnienie swojej lokalizacji rozszerzeniu lokalnie.", "failedbackup": "Błąd tworzenia kopii zapasowej: ", "restorecompleted": "Przywracanie zakończone pomyślnie!", "restorefailed": "Błąd przywracania: ", "invalidBackup": "Wybrano nieprawidłowy plik kopii zapasowej.", "deleteBookmark": "Czy na pewno chcesz usunąć zakładkę \"{title}\"?", "UnsupportedBrowser": "Zakładki nie są obsługiwane w twojej przeglądarce.", "resetShortcutsPrompt": "Wszystkie zapisane skróty zostaną usunięte i zresetowane do wartości domyślnych. Czy chcesz kontynuować?" }; ================================================ FILE: locales/pt.js ================================================ // Portuguese (Brazil) const pt = { // Menu Items "github": "GitHub", "feedback": "Feedback", // Shortcuts "shortcutsText": "Atalhos", "enableShortcutsText": "Mostrar atalhos salvos", "editShortcutsText": "Editar Atalhos", "shortcutsInfoText": "Escolha quais atalhos serão exibidos", "editShortcutsList": "Atalhos Salvos", "editShortcutsListInfo": "Você pode adicionar novos atalhos clicando no ícone \"+\" ou editar os existentes clicando no nome ou URL do atalho", "adaptiveIconText": "Ícones Adaptativos", "adaptiveIconInfoText": "Os ícones de atalho aparecerão redondos", "bookmarksText": "Favoritos", "bookmarksInfo": "Mostrar barra lateral de favoritos", "ai_tools_button": "Ferramentas de IA", "enable_ai_tools": "Mostrar atalhos para ferramentas de IA", "aiToolsSettingsText": "Configurações de IA", "aiToolsSettingsInfo": "Gerenciar atalhos de ferramentas de IA", "googleAppsMenuText": "Apps Google", "googleAppsMenuInfo": "Mostrar atalhos para Apps Google", "googleAppsHover": "Apps do Google", // To-do List "todoListText": "Lista de Tarefas", "todoListInfo": "Mostrar uma Lista de Tarefas", "todoListHover": "Lista de Tarefas", "todoPlaceholder": "Adicionar tarefa...", // Clock "hideClockBox": "Ocultar Relógio", "hideClockBoxInfo": "Mostrar ou ocultar o relogio e data", "digitalclocktitle": "Relógio Digital", "digitalclockinfo": "Mudar para o relógio digital", "timeformattitle": "Formato 12 Horas", "timeformatinfo": "Usar formato de 12 horas", "greetingtitle": "Saudação", "greetinginfo": "Mostrar saudação abaixo do texto personalizado", // Misc "userTextTitle": "Texto Personalizável", "userTextInfo": "Mostrar texto personalizado abaixo do relógio", "fahrenheitCelsiusCheckbox": "Mudar para Fahrenheit", "fahrenheitCelsiusText": "Atualize a página para aplicar as mudanças", "hideWeatherTitle": "Ocultar Cartão do Tempo", "hideWeatherInfo": "Desativar os widgets do clima", "hideWeatherBox": "Ocultar Cartão do Tempo", "hideWeatherBoxInfo": "Mostrar apenas o pílula de temperatura", "minMaxTempText": "Temperatura Min-Max", "minMaxTempSubText": "Substitua 'Sensação' por 'Min-Max'", // Search "micIconTitle": "Ocultar Ícone do Microfone", "micIconInfo": "Se o ditado por voz não estiver funcionando", "hideSearchWith": "Ocultar o Motor de Busca", "hideSearchWithInfo": "Alternar entre os motores de busca clicando no ícone", "motivationalQuotesText": "Frases Motivacionais", "motivationalQuotesInfo": "Mostrar frases motivacionais abaixo do texto personalizado", "search_suggestions_button": "Sugestões de Pesquisa", "search_suggestions_text": "Ativar sugestões de pesquisa", // Proxy "useproxytitletext": "Bypass de Proxy", "useproxyText": "Se as sugestões de pesquisa não estiverem funcionando", "ProxyText": "Proxy de Bypass CORS", "ProxySubtext": "Adicione seu próprio proxy de bypass CORS", "HostproxyButton": "Hospede seu próprio proxy", // Location "useGPS": "Usar GPS", "useGPSInfo": "Ativar GPS para atualização de localização", "UserLocText": "Digite sua Localização", "UserLocSubtext": "Se a localização do clima não estiver correta", "userLoc": "Sua Cidade ou Coordenadas (Latitude, Longitude)", "PrivacyPolicy": "Política de Privacidade", // Weather "WeatherApiText": "Digite sua chave WeatherAPI", "WeatherApiSubtext": "Se a funcionalidade do clima não estiver funcionando", "userAPI": "Sua chave weatherAPI", "LearnMoreButton": "Saiba mais", "saveAPI": "Salvar", // Body Items // Calendar "days": ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'], "months": ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'], // Bookmarks "bookmarksHeading": "Favoritos", "bookmarkSortBy": "Ordenar por", "sortAlphabetical": "A-Z", "sortTimeAdded": "Antigo-Novo", "bookmarkViewAs": "Visualizar como", "bookmarkViewGrid": "Grade", "bookmarkViewList": "Lista", "bookmarkSearch": "Pesquisar favorito", "editBookmarkHeading": "Editar Favorito", "editBookmarkName": "Nome do Favorito", "editBookmarkURL": "URL do Favorito", // New Tab Item "conditionText": "Olá! Como você está hoje?", "humidityLevel": "Umidade", "feelsLike": "Sensação de", "minMaxTemp": "Min ~ Max", "location": "Terra", "enterBtn": "Pesquisar", "searchPlaceholder": "Digite aqui...", "listenPlaceholder": "Ouvindo...", "searchWithHint": "Pesquisar Com", "searchOnHint": "Pesquisar Em", "userText": "Clique aqui para editar", // Greeting greeting: { "morning": "Bom dia!", "afternoon": "Boa tarde!", "evening": "Boa noite!" }, // Search Engines "defaultEngine": "Padrão", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Imagens", "redditEngine": "Reddit", "wikipediaEngine": "Wikipédia", "quoraEngine": "Quora", // AI Tools "ai_tools": "Ferramentas de IA", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Selecione quais ferramentas de IA exibir", "resetAISettingsBtn": "Redefinir", // Theme "enableDarkMode": "Modo Escuro", "enableDarkModeInfo": "Ativar temas em modo escuro", // Wallpaper and misc "uploadWallpaperText": "Enviar Papel de Parede", "rangColor": "Escolher cor", "backupText": "Backup", "restoreText": "Restaurar", "resetsettings": "Redefinir Configurações", "menuCloseText": "Fechar", // Tips "switchSearchModes": "Mudar modo de pesquisa", "switchSearchModesInfo": "Clique no ‘Pesquisar Com’ para mudar o modo.", "adjustZoom": "Ajustar Zoom", "adjustZoomInfo": "Aperte Ctrl + \"+\" or Ctrl + \"-\" para ajustar o zoom.", "changeBrowserTheme": "Mudar Tema do Navegador", "chromeThemeInfo": "Clique nos tres pontos (⋮) > Mais ferramentas > Personalizar Chrome, depois escolha uma cor que corresponde ao tema da extensão.", "edgeThemeInfo": "Va para Configurações > Aparencia, depois escolha uma cor que corresponde ao tema da extensão.", "braveThemeInfo": 'Visite Chrome Theme Store, Baixe e aplique o tema que corresponde ao tema da extensão.', "firefoxThemeInfo": 'Visite Firefox Themes, Baixe e aplique o tema que corresponde ao tema da extensão.', "updateFirefoxHomepage": "Atualizar Pagina Inicial", "updateFirefoxHomepageInfo": "Para mudar sua página inicial como o NewTab, visite este link e siga as instruções.", "dontShowTips": "Não mostrar novamente", // Dialog boxes (alerts) "okText": "OK", "yesText": "Sim", "noText": "Não", "agreeText": "Concordo", "cancelText": "Cancelar", "confirmWallpaper": "Você gostaria de definir uma nova imagem como seu papel de parede para o dia?", "confirmRestore": "Você tem certeza de que deseja redefinir suas configurações? Esta ação não pode ser desfeita.", "Nobackgroundset": "Nenhuma imagem de fundo está atualmente definida.", "clearbackgroundimage": "Você tem certeza de que deseja limpar a imagem de fundo?", "ProxyDisclaimer": "Todos os recursos de proxy estão desativados por padrão.\n\nSe você ativar sugestões de pesquisa e o proxy de contorno CORS, é altamente recomendável hospedar seu próprio proxy para maior privacidade.\n\nPor padrão, o proxy será definido como https://mynt-proxy.rhythmcorehq.com, o que significa que todos os seus dados passarão por este serviço, o que pode levantar preocupações de privacidade.", "GPSDisclaimer": "Os dados da sua localização são usados exclusivamente para fornecer atualizações precisas sobre o clima. Eles são armazenados temporariamente no navegador e não são compartilhados com nenhum serviço de terceiros nem acessíveis a nós.\n\nAo habilitar o GPS, você consente em compartilhar sua localização localmente com a extensão.", "failedbackup": "Falha no backup: ", "restorecompleted": "Restauração concluída com sucesso!", "restorefailed": "Restauração falhou: ", "invalidBackup": "Arquivo de backup inválido", "deleteBookmark": "Você tem certeza de que deseja excluir o favorito \"{title}\"?", "UnsupportedBrowser": "Bookmarks não são suportados no seu navegador.", }; ================================================ FILE: locales/ru.js ================================================ // Russian const ru = { "newTabTitle": "Новая вкладка", // Menu Items "github": "GitHub", "feedback": "Отзывы", // Section titles "personalizationSectionTitle": "Персонализация", "clockSectionTitle": "Часы", "searchSectionTitle": "Поиск", "weatherSectionTitle": "Погода", "appearanceSectionTitle": "Оформление", "settingsSectionTitle": "Настройки", // Shortcuts "shortcutsText": "Ярлыки", "enableShortcutsText": "Включить/Отключить ярлыки", "editShortcutsText": "Редактировать ярлыки", "shortcutsInfoText": "Выберите, какие ярлыки будут отображаться", "editShortcutsList": "Сохранённые ярлыки", 'editShortcutsListInfo': 'Вы можете добавить новые ярлыки, нажав на "+", или отредактировать существующие, щёлкнув по ярлыку или URL.', "adaptiveIconText": "Адаптивные значки", "adaptiveIconInfoText": "Значки всегда будут круглыми", "bookmarksText": "Закладки", "bookmarksInfo": "Показать боковую панель закладок", "ai_tools_button": "Инструменты ИИ", "enable_ai_tools": "Включить/Отключить ярлыки ИИ", "aiToolsSettingsText": "Настройки ИИ", "aiToolsSettingsInfo": "Управление ярлыками ИИ", "googleAppsMenuText": "Приложения Google", "googleAppsMenuInfo": "Показать ярлыки для приложений Google", "googleAppsHover": "Приложения Google", // To-do List "todoListText": "Список дел", "todoListInfo": "Показать ежедневный список дел", "todoListHover": "Список дел", "todoPlaceholder": "Добавить задачу...", // Clock "hideClockBox": "Скрыть часы", "hideClockBoxInfo": "Скрыть часы и дату", "digitalclocktitle": "Цифровые часы", "digitalclockinfo": "Включить/Отключить цифровые часы", "timeformattitle": "12-часовой формат", "timeformatinfo": "Использовать 12-часовой формат времени", "greetingtitle": "Приветствие", "greetinginfo": "Показать приветствие под часами", // Misc "userTextTitle": "Пользовательский текст", "userTextInfo": "Отображение текста под часами", "fahrenheitCelsiusCheckbox": "Использовать Фаренгейт", "fahrenheitCelsiusText": "Обновите страницу, чтобы применить", "hideWeatherTitle": "Скрыть погоду", "hideWeatherInfo": "Отключить виджет погоды", "hideWeatherBox": "Скрыть карту погоды", "hideWeatherBoxInfo": "Показать только температуру", "minMaxTempText": "Мин-Макс температура", "minMaxTempSubText": "Заменить 'Ощущается' на минимальную/максимальную температуру", // Search "micIconTitle": "Скрыть значок микрофона", "micIconInfo": "Если голосовой ввод не работает", "hideSearchWith": "Скрыть поисковые системы", "hideSearchWithInfo": "Переключайте поисковые системы, щёлкая по их значку", "motivationalQuotesText": "Мотивационные цитаты", "motivationalQuotesInfo": "Показывать мотивационные цитаты под панелью поиска", "search_suggestions_button": "Поисковые подсказки", "search_suggestions_text": "Включить/Отключить поисковые подсказки", // Proxy "useproxytitletext": "Использовать прокси", "useproxyText": "Если поисковые подсказки не работают", "ProxyText": "CORS-прокси для обхода", "ProxySubtext": "Добавьте свой CORS-прокси", "HostproxyButton": "Разместить свой прокси", // Location "useGPS": "Использовать GPS", "useGPSInfo": "Включите GPS для обновления местоположения в режиме реального времени", "UserLocText": "Введите ваше местоположение", "UserLocSubtext": "Если местоположение для погоды указано неверно", "userLoc": "Ваш город или координаты (Широта, Долгота)", "PrivacyPolicy": "Конфиденциальность", // Weather "WeatherApiText": "Введите свой ключ WeatherAPI", "WeatherApiSubtext": "Если функция погоды не работает", "userAPI": "Ваш ключ WeatherAPI", "LearnMoreButton": "Узнать больше", "saveAPI": "Сохранить", // Body Items // Calendar "days": ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], "months": ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сент', 'Окт', 'Нояб', 'Дек'], // Bookmarks "bookmarksHeading": "Закладки", "bookmarkSortBy": "Сортировка", "sortAlphabetical": "A-Z", "sortTimeAdded": "По дате добавления", "bookmarkViewAs": "Отображение", "bookmarkViewGrid": "Сетка", "bookmarkViewList": "Список", "bookmarkSearch": "Поиск закладки", "editBookmarkHeading": "Редактировать закладку", "editBookmarkName": "Имя закладки", "editBookmarkURL": "URL закладки", // New Tab Item "conditionText": "Привет! Как ты сегодня?", "humidityLevel": "Влажность", "feelsLike": "Ощущается", "minMaxTemp": "Мин ~ Макс", "location": "Земля", "enterBtn": "Поиск", "searchPlaceholder": "Ваш запрос...", "listenPlaceholder": "Слушаю...", "searchWithHint": "Поиск с", "searchOnHint": "Искать в", "userText": "Нажмите здесь, чтобы редактировать", // Greeting greeting: { "morning": "Доброе утро!", "afternoon": "Добрый день!", "evening": "Добрый вечер!" }, // Search Engines "defaultEngine": "По умолчанию", "googleEngine": "Google", "duckEngine": "DuckDuckGo", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Картинки", "redditEngine": "Reddit", "wikipediaEngine": "Википедия", "quoraEngine": "Quora", // AI Tools "ai_tools": "Нейросети", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Выберите, какие инструменты искусственного интеллекта отображать", "resetAISettingsBtn": "Сбросить", // Theme "lightThemed": "Светлая", "darkThemed": "Тёмная", "systemThemed": "Система", // Wallpaper and settings "uploadWallpaperText": "Загрузить обои", "rangColor": "Выбрать цвет", "opacityTitle": "Прозрачность", "adjustOpacityDesc": "Настройка прозрачности интерфейса", "backupText": "Экспорт", "restoreText": "Восстановить", "resetsettings": "Сброс настроек", "menuCloseText": "Закрыть", // Tips "switchSearchModes": "Переключение режимов поиска", "switchSearchModesInfo": "Нажмите на ‘Поиск с’, чтобы изменить режим", "adjustZoom": "Регулировка масштаба", "adjustZoomInfo": "Нажмите Ctrl + \"+\" или Ctrl + \"-\", чтобы отрегулировать масштаб.", "changeBrowserTheme": "Изменить тему браузера", "chromeThemeInfo": "Нажмите на три точки (⋮) > Дополнительные инструменты > Настройка Chrome, затем выберите цвет, соответствующий теме расширения.", "edgeThemeInfo": "Перейдите в Настройки > Внешний вид, затем выберите цвет, соответствующий теме расширения.", "braveThemeInfo": 'Посетите Chrome Theme Store, загрузите и примените тему, соответствующую расширению.', "firefoxThemeInfo": 'Посетите Firefox Themes, загрузите и примените тему, соответствующую расширению.', "updateFirefoxHomepage": "Обновить домашнюю страницу", "updateFirefoxHomepageInfo": "Чтобы изменить свою домашнюю страницу на новую вкладку, посетите эту ссылку и следуйте инструкциям.", "dontShowTips": "Не показывать снова", // Footer Toast "footerToastTitle": "Видите баннер внизу?", "footerToastMessage": "Чтобы скрыть его, нажмите на него правой кнопкой мыши и выберите 'Скрыть нижний колонтитул на странице новой вкладки'.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Да", "noText": "Нет", "agreeText": "Согласен", "cancelText": "Отмена", "confirmWallpaper": "Хотите установить новое изображение в качестве обоев на весь день?", "confirmRestore": "Вы уверены, что хотите сбросить настройки? Это действие нельзя отменить.", "Nobackgroundset": "В настоящее время обои не установлены.", "clearbackgroundimage": "Вы уверены, что хотите убрать обои?", "ProxyDisclaimer": "По умолчанию все функции прокси отключены.\n\nЕсли вы включите поисковые предложения и прокси для обхода CORS, настоятельно рекомендуется разместить собственный прокси для повышения конфиденциальности.\n\nПо умолчанию прокси будет установлен на https://mynt-proxy.rhythmcorehq.com, то есть все ваши данные будут проходить через этот сервис, что может вызвать проблемы с конфиденциальностью.", "GPSDisclaimer": "Данные о вашем местоположении используются исключительно для предоставления точных обновлений погоды. Они временно хранятся в браузере, не передаются сторонним службам и не доступны нам.\n\nВключая GPS, вы соглашаетесь на передачу данных о вашем местоположении расширению на месте.", "failedbackup": "Резервное копирование не удалось: ", "restorecompleted": "Восстановление настроек успешно завершено!", "restorefailed": "Восстановление настроек не удалось: ", "invalidBackup": "Недопустимый файл резервной копии.", "deleteBookmark": "Вы уверены, что хотите удалить эту закладку \"{title}\"?", "UnsupportedBrowser": "Закладки не поддерживаются в вашем браузере.", "resetShortcutsPrompt": "Все сохранённые ярлыки будут удалены, и их значение будет восстановлено по умолчанию. Хотите продолжить?", "iconFileTooLargeMessage": "Выбранный файл слишком большой: {size} КБ. Пожалуйста, используйте файл размером менее {max} КБ.", "iconStorageQuotaMessage": "Не удалось сохранить иконку, так как достигнут лимит хранилища. Удалите некоторые пользовательские иконки или используйте изображение меньшего размера." }; ================================================ FILE: locales/sl.js ================================================ // Slovenian const sl = { // Menu Items "github": "GitHub", "feedback": "Povratne informacije", "resetsettings": "Ponastavi nastavitve", "menuCloseText": "Zapri", // Shortcuts "shortcutsText": "Bližnjice", "enableShortcutsText": "Prikaži shranjene bližnjice", "editShortcutsText": "Uredi bližnjice", "shortcutsInfoText": "Izberite, katere bližnjice bodo prikazane", "editShortcutsList": "Shranjene bližnjice", 'editShortcutsListInfo': 'Dodate lahko nove bližnjice s klikom na ikono "+" ali uredite obstoječe s klikom na ime bližnjice ali URL.', "adaptiveIconText": "Prilagodljive oblike ikon", "adaptiveIconInfoText": "Ikone bodo videti manjše", "bookmarksText": "Zaznamki", "bookmarksInfo": "Prikaži stransko vrstico z zaznamki", "ai_tools_button": "AI-orodja", "enable_ai_tools": "Prikaži bližnjice za AI orodja", "googleAppsMenuText": "Google Aplikacije", "googleAppsMenuInfo": "Prikaži bližnjice za Google aplikacije", "googleAppsHover": "Google Aplikacije", // To-do List "todoListText": "Seznam opravil", "todoListInfo": "Prikaži dnevni seznam opravil", "todoListHover": "Seznam opravil", "todoPlaceholder": "Dodaj nalogo...", // Digital Clock "digitalclocktitle": "Digitalna ura", "digitalclockinfo": "Preklopi na digitalno uro", "timeformattitle": "12-urni format", "timeformatinfo": "Uporabi 12-urni časovni format", "greetingtitle": "Pozdrav", "greetinginfo": "Prikaži pozdrav pod prilagojenim besedilom", // Misc "userTextTitle": "Uporabniško prilagodljivo besedilo", "userTextInfo": "Prikaži uporabniško prilagodljivo besedilo pod uro", "fahrenheitCelsiusCheckbox": "Preklopi na Fahrenheit", "fahrenheitCelsiusText": "Osvežite stran za uveljavitev sprememb", "micIconTitle": "Skrij ikono mikrofona", "micIconInfo": "Če glasovno tipkanje ne deluje", "hideSearchWith": "Skrij iskalnike", "hideSearchWithInfo": "Preklapljajte med iskalniki s klikom na ikono", "search_suggestions_button": "Predlogi za iskanje", "search_suggestions_text": "Omogoči predloge za iskanje", // Proxy "useproxytitletext": "Proxy obid", "useproxyText": "Če predlogi za iskanje ne delujejo", "ProxyText": "Proxy obid za CORS", "ProxySubtext": "Dodajte svoj proxy obid za CORS", "HostproxyButton": "Gostite svoj proxy", // Location "UserLocText": "Vnesite svojo lokacijo", "UserLocSubtext": "Če lokacija vremena ni pravilna", "userLoc": "Vaše mesto ali koordinate (geografska širina, dolžina)", // Weather "WeatherApiText": "Vnesite svoj WeatherAPI ključ", "WeatherApiSubtext": "Če vremenska funkcionalnost ne deluje", "userAPI": "Vaš WeatherAPI ključ", "LearnMoreButton": "Izvedite več", "saveAPI": "Shrani", // Body Items // Calendar "days": ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'], "months": ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'], // Bookmarks "bookmarksHeading": "Zaznamki", "bookmarkViewAs": "Prikaži kot", "bookmarkViewGrid": "Mreža", "bookmarkViewList": "Seznam", "bookmarkSearch": "Išči zaznamek", // New Tab Item "conditionText": "Živijo! Kako ste danes?", "humidityLevel": "Vlažnost", "feelsLike": "Občutek", "location": "Zemlja", "enterBtn": "Išči", "searchPlaceholder": "Vnesite tukaj...", "listenPlaceholder": "Poslušam...", "searchWithHint": "Išči z", "userText": "Kliknite tukaj za urejanje", // Greeting greeting: { "morning": "Dobro jutro!", "afternoon": "Dober dan!", "evening": "Dober večer!" }, // Search Engines "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", // AI Tools "ai_tools": "AI orodja", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "perplexity": "Perplexity", "metaAI": "Meta AI", // Wallpaper and misc "uploadWallpaperText": "Naloži ozadje", "backupText": "Varnostna kopija", "restoreText": "Obnovi", "rangColor": "Izberi barvo", // Dialog boxes (alerts) "confirmWallpaper": "Ali želite nastaviti novo sliko kot ozadje danes?", "confirmRestore": "Ali ste prepričani, da želite ponastaviti nastavitve? To dejanje ni mogoče razveljaviti.", "Nobackgroundset": "Trenutno ni nastavljena nobena slika za ozadje.", "clearbackgroundimage": "Ali ste prepričani, da želite odstraniti sliko ozadja?", "ProxyDisclaimer": "Vse funkcije proxyja so privzeto izklopljene.\n\nČe omogočite predloge za iskanje in proxy za obvoz CORS, je močno priporočljivo, da gostite svoj proxy za boljšo zasebnost.\n\nPrivzeto bo proxy nastavljen na https://mynt-proxy.rhythmcorehq.com, kar pomeni, da bodo vsi vaši podatki šli skozi to storitev, kar lahko predstavlja tveganje za zasebnost.", "failedbackup": "Varnostna kopija ni uspela: ", "restorecompleted": "Obnovitev je bila uspešna!", "restorefailed": "Obnovitev ni uspela: ", "invalidBackup": "Neveljavna datoteka za varnostno kopijo", "deleteBookmark": "Ali ste prepričani, da želite odstraniti zaznamek \"{title}\"?", // "UnsupportedBrowser": "Bookmarks are not supported in your browser", }; ================================================ FILE: locales/sv.js ================================================ const sv = { // Menu Items "github": "GitHub", "feedback": "Feedback", // Section titles "personalizationSectionTitle": "Anpassning", "clockSectionTitle": "Klocka", "searchSectionTitle": "Sök", "weatherSectionTitle": "Väder", "appearanceSectionTitle": "Utseende", "settingsSectionTitle": "Inställningar", // Shortcuts "shortcutsText": "Genvägar", "enableShortcutsText": "Visa sparade genvägar", "editShortcutsText": "Redigera genvägar", "shortcutsInfoText": "Välj vilka genvägar som ska visas", "editShortcutsList": "Sparade genvägar", "editShortcutsListInfo": "Du kan lägga till genvägar genom att klicka på \"+\"-ikonen eller ändra befintliga genvägar genom att klicka på deras namn eller adress.", "adaptiveIconText": "Adaptiva ikoner", "adaptiveIconInfoText": "Genvägarnas ikoner anpassas efter temat.", "bookmarksText": "Bokmärken", "bookmarksInfo": "Visa bokmärkespanel", "ai_tools_button": "AI-verktyg", "enable_ai_tools": "Visa genvägar för AI-verktyg", "aiToolsSettingsText": "AI-verktygsinställningar", "aiToolsSettingsInfo": "Inställningar för AI-verktygsgenvägar", "googleAppsMenuText": "Google-appar", "googleAppsMenuInfo": "Visa genvägar för Google-appar", "googleAppsHover": "Google-appar", // To-do List "todoListText": "Att göra-lista", "todoListInfo": "Visa en daglig att göra-lista", "todoListHover": "Att göra", "todoPlaceholder": "Lägg till uppgift...", // Clock "hideClockBox": "Dölj klocka", "hideClockBoxInfo": "Dölj klocka och datum", "digitalclocktitle": "Digital klocka", "digitalclockinfo": "Byt till digital klocka", "timeformattitle": "12-timmarsformat", "timeformatinfo": "Använd 12-timmarsformat", "greetingtitle": "Hälsning", "greetinginfo": "Visa hälsning under anpassad text", // Misc "userTextTitle": "Anpassningsbar text", "userTextInfo": "Visa anpassad text under klockan", "fahrenheitCelsiusCheckbox": "Byt till Fahrenheit", "fahrenheitCelsiusText": "Uppdatera sidan för att tillämpa ändringar", "hideWeatherTitle": "Dölj väder", "hideWeatherInfo": "Inaktivera väderwidgetar", "hideWeatherBox": "Dölj väderkort", "hideWeatherBoxInfo": "Visa endast temperatur", "minMaxTempText": "Min–max-temperatur", "minMaxTempSubText": "Ersätt 'Känns som' med min- och maxtemperatur", // Search "micIconTitle": "Dölj mikrofonikon", "micIconInfo": "Om röstinmatning inte fungerar", "hideSearchWith": "Dölj sökmotorer", "hideSearchWithInfo": "Växla mellan sökmotorer genom att klicka på deras ikon", "motivationalQuotesText": "Motiverande citat", "motivationalQuotesInfo": "Visa citat under sökfältet", "search_suggestions_button": "Sökförslag", "search_suggestions_text": "Aktivera sökförslag", // Proxy "useproxytitletext": "Proxygenomgång", "useproxyText": "Om sökförslag inte fungerar", "ProxyText": "CORS-proxy", "ProxySubtext": "Lägg till din egen CORS-proxy", "HostproxyButton": "Hosta din egen proxy", // Location "useGPS": "Använd GPS", "useGPSInfo": "Aktivera GPS för liveplatsuppdateringar", "UserLocText": "Ange din plats", "UserLocSubtext": "Om väderplatsen inte är korrekt", "userLoc": "Din stad eller koordinater (latitud, longitud)", "PrivacyPolicy": "Integritetspolicy", // Weather "WeatherApiText": "Ange din WeatherAPI-nyckel", "WeatherApiSubtext": "Om väderfunktionen inte fungerar", "userAPI": "Din WeatherAPI-nyckel", "LearnMoreButton": "Läs mer", "saveAPI": "Spara", // Body Items "days": ['Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'], "months": ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'], // Bookmarks "bookmarksHeading": "Bokmärken", "bookmarkSortBy": "Sortera efter", "sortAlphabetical": "A–Ö", "sortTimeAdded": "Äldst–nyast", "bookmarkViewAs": "Visa som", "bookmarkViewGrid": "Rutnät", "bookmarkViewList": "Lista", "bookmarkSearch": "Sök bokmärke", "editBookmarkHeading": "Redigera bokmärke", "editBookmarkName": "Bokmärkesnamn", "editBookmarkURL": "Bokmärkes-URL", // New Tab Item "conditionText": "Hej! Hur mår du idag?", "humidityLevel": "Luftfuktighet", "feelsLike": "Känns som", "minMaxTemp": "Min ~ Max", "location": "Jorden", "enterBtn": "Sök", "searchPlaceholder": "Skriv här...", "listenPlaceholder": "Lyssnar...", "searchWithHint": "Sök med", "searchOnHint": "Sök på", "userText": "Klicka här för att redigera", // Greeting greeting: { "morning": "God morgon!", "afternoon": "God eftermiddag!", "evening": "God kväll!" }, // Search Engines "defaultEngine": "Standard", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Bilder", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI-verktyg", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Välj vilka AI-verktyg som ska visas", "resetAISettingsBtn": "Återställ", // Theme "lightThemed": "Ljust", "darkThemed": "Mörkt", "systemThemed": "System", // Wallpaper and settings "uploadWallpaperText": "Ladda upp bakgrund", "rangColor": "Välj färg", "opacityTitle": "Opacitet", "adjustOpacityDesc": "Justera gränssnittets transparens", "backupText": "Säkerhetskopiera", "restoreText": "Återställ", "resetsettings": "Återställ inställningar", "menuCloseText": "Stäng", // Tips "switchSearchModes": "Växla söklägen", "switchSearchModesInfo": "Klicka på ‘Sök med’ för att ändra läge.", "adjustZoom": "Justera zoom", "adjustZoomInfo": "Tryck Ctrl + \"+\" eller Ctrl + \"-\" för att ändra zoomnivå.", "changeBrowserTheme": "Ändra webbläsartema", "dontShowTips": "Visa inte igen", // Footer Toast "footerToastTitle": "Ser du en banner längst ner?", "footerToastMessage": "För att dölja den, högerklicka och välj 'Dölj sidfot på ny flik'.", // Dialog boxes "okText": "OK", "yesText": "Ja", "noText": "Nej", "agreeText": "Jag godkänner", "cancelText": "Avbryt" }; ================================================ FILE: locales/ta.js ================================================ // தமிழ் (Tamil) const ta = { // Menu Items "github": "கிட்ஹப்", "feedback": "பின்னூட்டம்", // Shortcuts "shortcutsText": "குறுக்குவழிகள்", "enableShortcutsText": "சேமித்த குறுக்குவழிகளைக் காட்டு", "editShortcutsText": "குறுக்குவழிகளைத் திருத்து", "shortcutsInfoText": "எந்த குறுக்குவழிகள் காண்பிக்கப்பட வேண்டும் என்பதைத் தேர்வுசெய்க", "editShortcutsList": "சேமித்த குறுக்குவழிகள்", "editShortcutsListInfo": "\"+\" சின்னத்தைக் சொடுக்குவதன் மூலம் புதிய குறுக்குவழிகளைச் சேர்க்கலாம் அல்லது குறுக்குவழி பெயர் அல்லது முகவரியை சொடுக்குவதன் மூலம் ஏற்கனவே உள்ளவற்றைத் திருத்தலாம்.", "adaptiveIconText": "தகவமைப்பு சின்னகள்", "adaptiveIconInfoText": "குறுக்குவழி சின்னகள் கருப்பொருளுக்கு ஏற்ப மாறும்", "bookmarksText": "புத்தக்குறிகள்", "bookmarksInfo": "புத்தக்குறிகள் பக்கப்பட்டியைக் காட்டு", "ai_tools_button": "செஅ கருவிகள்", "enable_ai_tools": "செஅ கருவிகளுக்கான குறுக்குவழிகளைக் காட்டு", "aiToolsSettingsText": "செஅ கருவிகள் அமைப்புகள்", "aiToolsSettingsInfo": "செஅ கருவிகள் குறுக்குவழிகளை நிர்வகி", "googleAppsMenuText": "கூகிள் பயன்கள்", "googleAppsMenuInfo": "கூகிள் பயன்களுக்கான குறுக்குவழிகளைக் காட்டு", "googleAppsHover": "கூகிள் பயன்கள்", // To-do List "todoListText": "செய்ய வேண்டிய பட்டியல்", "todoListInfo": "தினசரி செய்ய வேண்டிய பட்டியலைக் காட்டு", "todoListHover": "செய்ய வேண்டிய பட்டியல்", "todoPlaceholder": "பணியைச் சேர்...", // Clock "hideClockBox": "கடிகாரத்தை மறை", "hideClockBoxInfo": "கடிகாரத்தையும் தேதியையும் மறை", "digitalclocktitle": "எண்முறை கடிகாரம்", "digitalclockinfo": "எண்முறை கடிகாரத்திற்கு மாறு", "timeformattitle": "12-மணிநேர வடிவமைப்பு", "timeformatinfo": "12-மணிநேர வடிவமைப்பைப் பயன்படுத்து", "greetingtitle": "வாழ்த்து", "greetinginfo": "தனிப்பயன் உரைக்கு கீழே வாழ்த்துக்களைக் காட்டு", // Misc "userTextTitle": "தனிப்பயனாக்கக்கூடிய உரை", "userTextInfo": "கடிகாரத்திற்கு கீழே தனிப்பயன் உரையைக் காட்டு", "fahrenheitCelsiusCheckbox": "பரனைற்றுக்கு மாறு", "fahrenheitCelsiusText": "மாற்றங்களைப் பயன்படுத்த பக்கத்தைப் புதுப்பி", "hideWeatherTitle": "வானிலையை மறை", "hideWeatherInfo": "வானிலை நிரல்பலகைகளை முடக்கு", "hideWeatherBox": "வானிலை அட்டையை மறை", "hideWeatherBoxInfo": "வெப்பநிலை மாத்திரையை மட்டும் காட்டு", "minMaxTempText": "குறைந்தஅளவு-அதிகஅளவு வெப்பநிலை", "minMaxTempSubText": "குறைந்தஅளவு மற்றும் அதிகஅளவு வெப்பநிலையுடன் 'உணர்கிறேன்' என்பதை மாற்று", // Search "micIconTitle": "ஒலிவாங்கி சின்னத்தை மறை", "micIconInfo": "குரல் தட்டச்சு வேலை செய்யவில்லை என்றால்", "hideSearchWith": "தேடல் பொறிகளை மறை", "hideSearchWithInfo": "அதன் சின்னத்தைக் சொடுக்குவதன் மூலம் தேடுபொறிகளுக்கு இடையில் மாறு", "motivationalQuotesText": "ஊக்கமளிக்கும் மேற்கோள்கள்", "motivationalQuotesInfo": "தேடல் பட்டியின் கீழே மேற்கோள்களைக் காட்டு", "search_suggestions_button": "தேடல் பரிந்துரைகள்", "search_suggestions_text": "தேடல் பரிந்துரைகளை இயக்கு", // Proxy "useproxytitletext": "கடந்து செல் பதிலாள்", "useproxyText": "தேடல் பரிந்துரைகள் வேலை செய்யவில்லை என்றால்", "ProxyText": "CORS கடந்து செல் பதிலாள்", "ProxySubtext": "உங்கள் சொந்த CORS கடந்து செல் பதிலாளைச் சேர்", "HostproxyButton": "உங்கள் சொந்த பதிலாளை புரவலன் செய்யவும்", // Location "useGPS": "இடம் காட்டியைப் பயன்படுத்து", "useGPSInfo": "நேரடி இருப்பிட புதுப்பிப்புகளுக்கு இடம் காட்டியை இயக்கு", "UserLocText": "உங்கள் இருப்பிடத்தை உள்ளிடவும்", "UserLocSubtext": "வானிலை இருப்பிடம் சரியாக இல்லாவிட்டால்", "userLoc": "உங்கள் நகரம் அல்லது ஆயத்தொலைவுகள் (நிலகிடமட்டக்கோடு, நிலநடுக்கோடு)", "PrivacyPolicy": "தனியுரிமைக் கொள்கை", // Weather "WeatherApiText": "உங்கள் WeatherAPI விசையை உள்ளிடவும்", "WeatherApiSubtext": "வானிலை செயல்பாடு வேலை செய்யவில்லை என்றால்", "userAPI": "உங்கள் வானிலைபநிஇ விசை", "LearnMoreButton": "மேலும் அறிக", "saveAPI": "சேமி", // Body Items // Calendar "days": ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'அறிவன்', 'வியாழன்', 'வெள்ளி', 'காரி'], "months": ['மா-தை', 'தை-மாசி', 'மா-பங்குனி', 'ப-சித்திரை', 'சி-வைகாசி', 'வை-ஆனி', 'ஆ-ஆடி', 'ஆ-ஆவணி', 'ஆ-புரட்டாசி', 'பு-ஐப்பசி', 'ஐ-கார்த்திகை', 'கா-மார்கழி'], // Bookmarks "bookmarksHeading": "புத்தக்குறிகள்", "bookmarkSortBy": "வரிசைப்படுத்து", "sortAlphabetical": "அ-ஔ", "sortTimeAdded": "பழைய-புதிய", "bookmarkViewAs": "இவ்வாறு காண்க", "bookmarkViewGrid": "கட்டம்", "bookmarkViewList": "பட்டியல்", "bookmarkSearch": "புத்தக்குறியைத் தேடு", "editBookmarkHeading": "புத்தக்குறியைத் திருத்து", "editBookmarkName": "புத்தக்குறியின் பெயர்", "editBookmarkURL": "புத்தக்குறி முகவரி", // New Tab Item "conditionText": "வணக்கம்! இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?", "humidityLevel": "ஈரப்பதம்", "feelsLike": "உணர்கிறது", "minMaxTemp": "குறைந்தஅளவு ~ அதிகஅளவு", "location": "பூமி", "enterBtn": "தேடு", "searchPlaceholder": "இங்கே தட்டச்சு செய்க...", "listenPlaceholder": "கேட்கிறேன்...", "searchWithHint": "உடன் தேடு", "searchOnHint": "மேல் தேடு", "userText": "திருத்த இங்கே சொடுக்கு", // Greeting greeting: { "morning": "காலை வணக்கம்!", "afternoon": "பகல் வணக்கம்!", "evening": "மாலை வணக்கம்!" }, // Search Engines "defaultEngine": "இயல்புநிலை", "googleEngine": "கூகுள்", "duckEngine": "டக்டக்கோ", "bingEngine": "பிங்", "braveEngine": "பிரேவ்", "youtubeEngine": "யூடியூப்", "gImagesEngine": "படங்கள்", "redditEngine": "ரெடிட்", "wikipediaEngine": "விக்கிப்பீடியா", "quoraEngine": "கோரா", // AI Tools "ai_tools": "செஅ கருவிகள்", "chatGPT": "சாட்ஜிபிடி", "gemini": "ஜெமினி", "copilot": "கோபைலட்", "claude": "கிளாட்", "grok": "குரோக்", "qwen": "க்வென்", "perplexity": "பெர்ப்லெக்சிடி", "deepseek": "டீப்சீக்", "metaAI": "மெட்டா ஏஐ", "firefly": "ஃபயர்ஃபிளை", "aiSettingsIntro": "எந்த செஅ கருவிகளைக் காட்ட வேண்டும் என்பதைத் தேர்ந்தெடு", "resetAISettingsBtn": "மீட்டமை", // Theme "enableDarkMode": "இருள் முறை(பரிசோதனை)", "enableDarkModeInfo": "இருள் முறை கருப்பொருள்கள் இயக்கு", // Wallpaper and settings "uploadWallpaperText": "பின்படத்தை பதிவேற்று", "rangColor": "நிறம் எடு", "opacityTitle": "ஒளிபுகாநிலை", "adjustOpacityDesc": "இடைமுக வெளிப்படைத்தன்மையை சரிசெய்", "backupText": "காப்புப்பிரதி", "restoreText": "மீட்டெடு", "resetsettings": "அமைப்புகளை மீட்டமை", "menuCloseText": "மூடு", // Tips "switchSearchModes": "தேடல் முறைகளை மாற்று", "switchSearchModesInfo": "பயன்முறையை மாற்ற 'உடன் தேடு' என்பதைக் சொடுக்கு.", "adjustZoom": "பெரிதாக்கத்தை சரிசெய்", "adjustZoomInfo": "பெரிதாக்கத்தை சரிசெய்ய கட்டு + \"+\" அல்லது கட்டு + \"-\" ஐ அழுத்தவும்.", "changeBrowserTheme": "உலாவி கருப்பொருளை மாற்று", "chromeThemeInfo": "மூன்று புள்ளிகளைக் சொடுக்கவும் (⋮) > கூடுதல் கருவிகள் > நிறமியைத் தனிப்பயனாக்கு, பின்னர் நீட்டிப்பு கருப்பொருளுடன் பொருந்தக்கூடிய வண்ணத்தைத் தேர்வு செய்யவும்.", "edgeThemeInfo": "அமைப்புகள் > தோற்றம் என்பதற்குச் சென்று, நீட்டிப்புகருப்பொருளுடன் பொருந்தக்கூடிய வண்ணத்தைத் தேர்வு செய்யவும்.", "braveThemeInfo": 'நிறமி கருப்பொருள் கடையைப் பார்வையிடவும், நீட்டிப்புடன் பொருந்தக்கூடிய கருப்பொருளைப் பதிவிறக்கிப் பயன்படுத்தவும்.', "firefoxThemeInfo": 'தீநரி கருப்பொருள்களைப் பார்வையிடவும், நீட்டிப்புடன் பொருந்தக்கூடிய கருப்பொருளைப் பதிவிறக்கிப் பயன்படுத்தவும்.', "updateFirefoxHomepage": "முகப்புப் பக்கத்தைப் புதுப்பி", "updateFirefoxHomepageInfo": "புதிய தாவலைப் போல உங்கள் முகப்புப் பக்கத்தையும் மாற்ற, இந்த இணைப்பைப் பார்வையிட்டு வழிமுறைகளைப் பின்பற்றவும்.", "dontShowTips": "மீண்டும் காட்ட வேண்டாம்", // Dialog boxes (alerts) "okText": "சரி", "yesText": "ஆம்", "noText": "இல்லை", "agreeText": "ஒப்புக்கொள்கிறேன்", "cancelText": "நீக்கறல்", "confirmWallpaper": "இன்றைய நாளுக்கு உங்கள் பின்னணிபடமாக ஒரு புதிய படத்தை அமைக்க விரும்புகிறீர்களா?", "confirmRestore": "உங்கள் அமைப்புகளை மீட்டமைக்க விரும்புகிறீர்களா? இந்த செயலை செயல்தவிர்க்க முடியாது.", "Nobackgroundset": "தற்போது எந்த பின்னணி படமும் அமைக்கப்படவில்லை.", "clearbackgroundimage": "பின்னணி படத்தை அழிக்க விரும்புகிறீர்களா?", "ProxyDisclaimer": "இயல்பாகவே அனைத்து பதிலாள் நற்பொருத்தங்களும் முடக்கப்பட்டுள்ளன.\n\nநீங்கள் தேடல் பரிந்துரைகளையும் CORS தனிவழி பதிலாள்யையும் இயக்கினால், மேம்பட்ட தனியுரிமைக்காக உங்கள் சொந்த பதிலாளை புரவலன் செய்ய கடுமையாக பரிந்துரைக்கப்படுகிறது.\n\nஇயல்புநிலையாக, பதிலாள் https://mynt-proxy.rhythmcorehq.com ஆக அமைக்கப்படும், அதாவது உங்கள் எல்லா தரவும் இந்த சேவையின் வழியாக செல்லும், இது தனியுரிமை கவலைகளை ஏற்படுத்தக்கூடும்.", "GPSDisclaimer": "உங்கள் இருப்பிடத் தரவு துல்லியமான வானிலை புதுப்பிப்புகளை வழங்க மட்டுமே பயன்படுத்தப்படுகிறது. இது உலாவியில் தற்காலிகமாக சேமிக்கப்படுகிறது மற்றும் எந்த மூன்றாம் தரப்பு சேவைகளுடனும் பகிரப்படவில்லை அல்லது எங்களாலும் அணுக முடியாது.\n\nGPSஐ இயக்குவதன் மூலம், நீட்டிப்புடன் உங்கள் இருப்பிடத்தை உள்ளகத்தில் பகிர ஒப்புக்கொள்கிறீர்கள்.", "failedbackup": "காப்புப்பிரதி தோல்வியடைந்தது: ", "restorecompleted": "மீட்டெடுப்பு வெற்றிகரமாக முடிந்தது!", "restorefailed": "மீட்டெடுப்பு தோல்வியடைந்தது: ", "invalidBackup": "தவறான காப்புப்பிரதி கோப்பு தேர்ந்தெடுக்கப்பட்டது.", "deleteBookmark": "\"{title}\"என்ற புத்தக்குறியை நீக்க விரும்புகிறீர்களா?", "UnsupportedBrowser": "உங்கள் உலாவியில் புத்தக்குறிகள் ஆதரிக்கப்படவில்லை.", "resetShortcutsPrompt": "சேமிக்கப்பட்ட அனைத்து குறுக்குவழிகளும் நீக்கப்பட்டு இயல்புநிலைக்கு மீட்டமைக்கப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", }; ================================================ FILE: locales/th.js ================================================ // ภาษาไทย (Thai) const th = { // Menu Items "github": "GitHub", "feedback": "ข้อเสนอแนะ", // Shortcuts "shortcutsText": "คำสั่งลัด", "enableShortcutsText": "แสดงคำสั่งลัดที่บันทึกไว้", "editShortcutsText": "แก้ไขคำสั่งลัด", "shortcutsInfoText": "เลือกคำสั่งลัดที่จะแสดง", "editShortcutsList": "คำสั่งลัดทั้งหมด", "editShortcutsListInfo": "คลิกที่เครื่องหมาย \"+\" เพื่อสร้างคำสั่งลัดใหม่ หรือแก้ไขคำสั่งลัดที่มีอยู่แล้วโดยคลิกชื่อคำสั่งลัดหรือ URL", "adaptiveIconText": "ปรับไอคอนอัตโนมัติ", "adaptiveIconInfoText": "ไอคอนจะปรับอัตโนมัติตามธีม", "bookmarksText": "บุ๊กมาร์ก", "bookmarksInfo": "แสดงรายการบุ๊กมาร์ก", "ai_tools_button": "เครื่องมือ AI", "enable_ai_tools": "แสดงคำสั่งลัดสำหรับเครื่องมือ AI", "aiToolsSettingsText": "การตั้งค่าเครื่องมือ AI", "aiToolsSettingsInfo": "จัดการคำสั่งลัดสำหรับเครื่องมือ AI", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "แสดงคำสั่งลัดสำหรับ Google Apps", "googleAppsHover": "Google Apps", // To-do List "todoListText": "To Do List", "todoListInfo": "แสดงรายการสิ่งที่ต้องทำประจำวัน", "todoListHover": "ToDo List", "todoPlaceholder": "เพิ่มรายการ...", // Clock "hideClockBox": "ปิดการแสดงนาฬิกา", "hideClockBoxInfo": "ปิดการแสดงนาฬิกาและวันที่", "digitalclocktitle": "นาฬิกาดิจิทัล", "digitalclockinfo": "สลับไปใช้งานนาฬิกาดิจิทัล", "timeformattitle": "รูปแบบ 12 ชั่วโมง", "timeformatinfo": "ใช้รูปแบบเวลา 12 ชั่วโมง", "greetingtitle": "คำทักทาย", "greetinginfo": "แสดงคำทักทายด้านล่างข้อความที่กำหนดเอง", // Misc "userTextTitle": "ข้อความที่กำหนดเอง", "userTextInfo": "แสดงข้อความที่กำหนดเองด้านล่างนาฬิกา", "fahrenheitCelsiusCheckbox": "สลับไปใช้ฟาเรนไฮต์", "fahrenheitCelsiusText": "รีเฟรชเพื่อใช้งานการเปลี่ยนแปลง", "hideWeatherTitle": "ปิดการแสดงสภาพอากาศ", "hideWeatherInfo": "ปิดการใช้งานวิดเจ็ตสภาพอากาศ", "hideWeatherBox": "ปิดการแสดงรายละเอียดสภาพอากาศ", "hideWeatherBoxInfo": "แสดงผลเพียงอุณหภูมิ", "minMaxTempText": "อุณหภูมิต่ำสุด-สูงสุด", "minMaxTempSubText": "แสดงอุณหภูมิต่ำสุด/สูงสุดแทน 'รู้สึกเหมือน'", // Search "micIconTitle": "ซ่อนไอคอนไมโครโฟน", "micIconInfo": "ซ่อนไอคอนไมโครโฟน", "hideSearchWith": "ซ่อนเครื่องมือค้นหา", "hideSearchWithInfo": "สลับระหว่างเครื่องมือค้นหาโดยคลิกที่ไอคอน", "motivationalQuotesText": "คำคมสร้างแรงบันดาลใจ", "motivationalQuotesInfo": "แสดงคำคมใต้แถบค้นหา", "search_suggestions_button": "คำแนะนำการค้นหา", "search_suggestions_text": "เปิดใช้งานคำแนะนำการค้นหา", // Proxy "useproxytitletext": "Proxy Bypass", "useproxyText": "หากคำแนะนำการค้นหาไม่ทำงาน", "ProxyText": "CORS Bypass Proxy", "ProxySubtext": "เพิ่ม CORS bypass proxy ของคุณ", "HostproxyButton": "โฮสต์ proxy ของคุณ", // Location "useGPS": "เปิดใช้งาน GPS", "useGPSInfo": "เปิดใช้งาน GPS สำหรับอัปเดตตำแหน่งแบบเรียลไทม์", "UserLocText": "ป้อนตำแหน่งของคุณ", "UserLocSubtext": "หากตำแหน่งไม่ถูกต้อง", "userLoc": "เมืองของคุณหรือพิกัด (ละติจูด, ลองจิจูด)", "PrivacyPolicy": "นโยบายความเป็นส่วนตัว", // Weather "WeatherApiText": "ป้อน WeatherAPI key ของคุณ", "WeatherApiSubtext": "หากฟังก์ชันสภาพอากาศไม่ทำงาน", "userAPI": "weatherAPI key ของคุณ", "LearnMoreButton": "เรียนรู้เพิ่มเติม", "saveAPI": "บันทึก", // Body Items // Calendar "days": ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'], "months": ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'], // Bookmarks "bookmarksHeading": "บุ๊กมาร์ก", "bookmarkSortBy": "เรียงตาม", "sortAlphabetical": "A-Z", "sortTimeAdded": "เก่า-ใหม่", "bookmarkViewAs": "แสดงผลแบบ", "bookmarkViewGrid": "กริด", "bookmarkViewList": "ลิสต์", "bookmarkSearch": "ค้นหาบุ๊กมาร์ก", "editBookmarkHeading": "แก้ไขบุ๊กมาร์ก", "editBookmarkName": "ชื่อบุ๊กมาร์ก", "editBookmarkURL": "URL บุ๊กมาร์ก", // New Tab Item "conditionText": "สวัสดี! วันนี้คุณเป็นอย่างไรบ้าง?", "humidityLevel": "ความชื้น", "feelsLike": "รู้สึกเหมือน", "minMaxTemp": "ต่ำสุด ~ สูงสุด", "location": "โลก", "enterBtn": "ค้นหา", "searchPlaceholder": "พิมพ์ที่นี่...", "listenPlaceholder": "กำลังฟัง...", "searchWithHint": "ค้นหาด้วย", "searchOnHint": "ค้นหาใน", "userText": "คลิกเพื่อแก้ไข", // Greeting greeting: { "morning": "อรุณสวัสดิ์!", "afternoon": "สวัสดีตอนบ่าย!", "evening": "'สวัสดีตอนเย็น!" }, // Search Engines "defaultEngine": "ค่าเริ่มต้น", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Images", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "เครื่องมือ AI", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "เลือกเครื่องมือ AI ที่ต้องการแสดง", "resetAISettingsBtn": "รีเซ็ต", // Theme "enableDarkMode": "โหมดมืด (ทดลอง)", "enableDarkModeInfo": "เปิดใช้งานธีมโหมดมืด", // Wallpaper and settings "uploadWallpaperText": "อัปโหลดวอลเปเปอร์", "rangColor": "เลือกสี", "opacityTitle": "ความทึบแสง", "adjustOpacityDesc": "ปรับความโปร่งใสของอินเทอร์เฟซ", "backupText": "สำรองข้อมูล", "restoreText": "กู้คืน", "resetsettings": "รีเซ็ตการตั้งค่า", "menuCloseText": "ปิด", // Tips "switchSearchModes": "สลับโหมดการค้นหา", "switchSearchModesInfo": "คลิกที่ 'ค้นหาด้วย' เพื่อเปลี่ยนโหมด", "adjustZoom": "ปรับการซูม", "adjustZoomInfo": "กด Ctrl + \"+\" หรือ Ctrl + \"-\" เพื่อปรับการซูม", "changeBrowserTheme": "เปลี่ยนธีมเบราว์เซอร์", "chromeThemeInfo": "คลิกจุดสามจุด (⋮) > เครื่องมือเพิ่มเติม > ปรับแต่ง Chrome แล้วเลือกสีให้ตรงกับธีมส่วนขยาย", "edgeThemeInfo": "ไปที่ การตั้งค่า > ลักษณะที่ปรากฏ แล้วเลือกสีให้ตรงกับธีมส่วนขยาย", "braveThemeInfo": 'ไปที่ Chrome Theme Store ดาวน์โหลดและใช้ธีมที่ตรงกับส่วนขยาย', "firefoxThemeInfo": 'ไปที่ Firefox Themes ดาวน์โหลดและใช้ธีมที่ตรงกับส่วนขยาย', "updateFirefoxHomepage": "อัปเดตหน้าแรก", "updateFirefoxHomepageInfo": "หากต้องการเปลี่ยนหน้าแรกให้เหมือนแท็บใหม่ ดูที่ this link และทำตามคำแนะนำ", "dontShowTips": "ไม่ต้องแสดงอีก", // Dialog boxes (alerts) "okText": "ตกลง", "yesText": "ใช่", "noText": "ไม่", "agreeText": "ยอมรับ", "cancelText": "ยกเลิก", "confirmWallpaper": "คุณต้องการตั้งรูปภาพใหม่เป็นวอลเปเปอร์สำหรับวันนี้หรือไม่?", "confirmRestore": "การกระทำนี้ไม่สามารถยกเลิกได้ คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตการตั้งค่า?", "Nobackgroundset": "ยังไม่ได้ตั้งภาพพื้นหลัง", "clearbackgroundimage": "คุณแน่ใจหรือไม่ว่าต้องการลบภาพพื้นหลัง?", "ProxyDisclaimer": "ฟีเจอร์ Proxy ทั้งหมดถูกปิดโดยค่าเริ่มต้น\n\nหากคุณเปิดใช้งานคำแนะนำการค้นหาและ CORS bypass proxy ขอแนะนำให้โฮสต์ Proxy ของคุณเองเพื่อความเป็นส่วนตัวที่ดียิ่งขึ้น\n\nโดยค่าเริ่มต้น Proxy จะถูกตั้งค่าเป็น https://mynt-proxy.rhythmcorehq.com ซึ่งหมายความว่าข้อมูลทั้งหมดของคุณผ่านบริการนี้อาจมีปัญหาความเป็นส่วนตัว", "GPSDisclaimer": "ข้อมูลตำแหน่งของคุณถูกใช้เพื่อให้ข้อมูลสภาพอากาศที่แม่นยำเท่านั้น ข้อมูลจะถูกเก็บชั่วคราวในเบราว์เซอร์และไม่ถูกแบ่งปันกับบริการภายนอกหรือเข้าถึงโดยเรา\n\nเมื่อเปิดใช้งาน GPS คุณยินยอมให้แชร์ตำแหน่งกับส่วนขยายในเครื่องเท่านั้น", "failedbackup": "สำรองข้อมูลล้มเหลว: ", "restorecompleted": "กู้คืนข้อมูลสำเร็จ!", "restorefailed": "กู้คืนข้อมูลล้มเหลว: ", "invalidBackup": "เลือกไฟล์สำรองข้อมูลไม่ถูกต้อง", "deleteBookmark": "คุณแน่ใจหรือไม่ว่าต้องการลบบุ๊กมาร์ก \"{title}\"?", "UnsupportedBrowser": "เบราว์เซอร์ของคุณไม่รองรับบุ๊กมาร์ก", "resetShortcutsPrompt": "คำสั่งลัดทั้งหมดที่บันทึกไว้จะถูกลบและรีเซ็ตเป็นค่าเริ่มต้น คุณต้องการดำเนินการต่อหรือไม่?" }; ================================================ FILE: locales/tr.js ================================================ // Turkish const tr = { // Menu Items "github": "GitHub", "feedback": "Geri Bildirim", "resetsettings": "Ayarları Sıfırla", "menuCloseText": "Kapat", // Shortcuts "shortcutsText": "Kısayollar", "enableShortcutsText": "Kaydedilen kısayolları göster", "editShortcutsText": "Kısayolları Düzenle", "shortcutsInfoText": "Hangi kısayolların gösterileceğini seçin", "editShortcutsList": "Kaydedilen Kısayollar", "editShortcutsListInfo": "\"+\" simgesine tıklayarak yeni kısayollar ekleyebilir veya kısayol adına ya da URL'ye tıklayarak mevcut kısayolları düzenleyebilirsiniz.", "adaptiveIconText": "Uyarlanabilir İkon Şekilleri", "adaptiveIconInfoText": "Kısayol ikonları tema rengine göre uyarlanacak ve daha küçük görünecektir", "bookmarksText": "Yer İmleri", "bookmarksInfo": "Yer imleri kenar çubuğunu göster", "ai_tools_button": "Yapay Zeka Araçları", "enable_ai_tools": "Yapay zeka araçları kısayollarını göster", "googleAppsMenuText": "Google Uygulamaları", "googleAppsMenuInfo": "Google uygulamaları için kısayollarını göster", "googleAppsHover": "Google Apps", // To-do List "todoListText": "Yapılacaklar Listesi", "todoListInfo": "Yapılacaklar listesini göster", "todoListHover": "Yapılacaklar", "todoPlaceholder": "Görev ekle", // Digital Clock "digitalclocktitle": "Dijital Saat", "digitalclockinfo": "Dijital saate geçiş yap", "timeformattitle": "12 Saat Formatı", "timeformatinfo": "12 saat zaman formatını kullanın", "greetingtitle": "Karşılama", "greetinginfo": "Özel metinin altında karşılama mesajını göster", // Misc "userTextTitle": "Özelleştirilebilir Metin", "userTextInfo": "Saatin altında özel metin göster", "fahrenheitCelsiusCheckbox": "Fahrenheit'a geç", "fahrenheitCelsiusText": "Güncellemeleri görmek için sayfayı yenileyin", "micIconTitle": "Mikrofon Simgesini Gizle", "micIconInfo": "Eğer sesli yazma çalışmıyorsa", "hideSearchWith": "Arama Motorlarını Gizle", "hideSearchWithInfo": "İkonuna tıklayarak arama motorları arasında geçiş yapın", "search_suggestions_button": "Arama Önerileri", "search_suggestions_text": "Arama önerilerini etkinleştir", // Proxy "useproxytitletext": "Proxy Atlatma", "useproxyText": "Arama önerileri çalışmıyorsa", "ProxyText": "CORS Atlatma Proxy", "ProxySubtext": "Kendi proxy'nizi ekleyin", "HostproxyButton": "Kendi Proxy'nizi Barındırın", // Location "UserLocText": "Konumunuzu girin", "UserLocSubtext": "Hava durumu konumu doğru değilse", "userLoc": "Bulunduğunuz şehir veya Koordinatlarınız (Enlem, Boylam)", "useGPS": "GPS Kullan", // Weather "WeatherApiText": "WeatherAPI anahtarınızı girin", "WeatherApiSubtext": "Hava durumu işlevi çalışmıyorsa", "userAPI": "WeatherAPI anahtarınız", "LearnMoreButton": "Daha Fazla Bilgi Edinin", "saveAPI": "Kaydet", "hideWeatherBox": "Hava Durumu Kartını Gizle", "hideWeatherBoxInfo": "Sıcaklığı sadece mobilde göster", // Body Items // Calendar "days": ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'], "months": ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], // Bookmarks "bookmarksHeading": "Yer imleri", "bookmarkViewAs": "Görünüm", "bookmarkViewGrid": "Izgara", "bookmarkViewList": "Liste", "bookmarkSearch": "Yer imlerinde ara", // New Tab Item "conditionText": "Merhaba! Bugün nasılsın?", "humidityLevel": "Nem", "feelsLike": "Hissediyor", "location": "Dünya", "enterBtn": "Arama Yap", "searchPlaceholder": "Buraya yazın...", "listenPlaceholder": "Dinleniyor...", "searchWithHint": "ile Ara", "userText": "Düzenlemek için buraya tıklayın", // Greeting greeting: { "morning": "Günaydın!", "afternoon": "Tünaydın!", "evening": "İyi akşamlar!" }, // Search Engines "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Görseller", "redditEngine": "Reddit", // AI Tools "ai_tools": "Yapay Zeka Araçları", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "perplexity": "Perplexity", "metaAI": "Meta AI", // Theme "enableDarkMode": "Karanlık Mod", "enableDarkModeInfo": "Karanlık moda geç", // Wallpaper and misc "uploadWallpaperText": "Duvar Kağıdı Yükle", "backupText": "Yedekleme", "restoreText": "Kurtarma", "rangColor": "Renk seç", // Dialog boxes (alerts) "confirmWallpaper": "Bugün için yeni bir duvar kağıdı ayarlamak ister misiniz?", "confirmRestore": "Ayarlarınızı sıfırlamak istediğinizden emin misiniz? Bu eylem geri alınamaz.", "Nobackgroundset": "Şu anda hiçbir arka plan resmi ayarlanmamış.", "clearbackgroundimage": "Arka plan resmini temizlemek istediğinizden emin misiniz?", "ProxyDisclaimer": "Tüm proxy özellikleri varsayılan olarak kapalıdır.\n\nArama önerilerini ve CORS bypass proxy'sini etkinleştirirseniz, gelişmiş gizlilik için kendi proxy'nizi barındırmanız şiddetle önerilir.\n\nVarsayılan olarak https://mynt-proxy.rhythmcorehq.com ayarlanacaktır, yani tüm verileriniz bu hizmet üzerinden geçecektir, bu da gizlilik endişeleri yaratabilir.", "failedbackup": "Yedekleme başarısız oldu: ", "restorecompleted": "Geri yükleme başarıyla tamamlandı!", "restorefailed": "Geri yükleme başarısız oldu: ", "invalidBackup": "Geçersiz yedekleme dosyası seçildi.", "deleteBookmark": "\"{title}\" yer imini silmek istediğinizden emin misiniz?", "UnsupportedBrowser": "Yer imleri tarayıcınızda desteklenmiyor.", }; ================================================ FILE: locales/uk.js ================================================ // Ukrainian const uk = { "newTabTitle": "Нова вкладка", // Menu Items "github": "GitHub", "feedback": "Відгук", // Section titles "personalizationSectionTitle": "Персоналізація", "clockSectionTitle": "Годинник", "searchSectionTitle": "Пошук", "weatherSectionTitle": "Погода", "appearanceSectionTitle": "Зовнішній вигляд", "settingsSectionTitle": "Налаштування", // Shortcuts "shortcutsText": "Ярлики", "enableShortcutsText": "Показати збережені ярлики", "editShortcutsText": "Редагувати ярлики", "shortcutsInfoText": "Оберіть ярлики для відображення", "editShortcutsList": "Збережені ярлики", "editShortcutsListInfo": "Ви можете додати нові ярлики, натиснувши значок «+», або редагувати існуючі, натиснувши на назву ярлика або URL-адресу.", "adaptiveIconText": "Адаптивні іконки", "adaptiveIconInfoText": "Ярлики будуть адаптуватись до теми", "bookmarksText": "Закладки", "bookmarksInfo": "Показати панель закладок", "ai_tools_button": "AI Інструменти", "enable_ai_tools": "Показати ярлики для AI інструментів", "aiToolsSettingsText": "Налаштування AI інструментів", "aiToolsSettingsInfo": "Керування ярликами AI інструментів", "googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "Показати ярлики для Google Apps", "googleAppsHover": "Google Apps", // To-do List "todoListText": "Список справ", "todoListInfo": "Показати щоденний список справ", "todoListHover": "Список справ", "todoPlaceholder": "Додати задачу...", // Clock "hideClockBox": "Приховати годинник", "hideClockBoxInfo": "Приховати годинник і дату", "digitalclocktitle": "Цифровий годинник", "digitalclockinfo": "Включити цифровий годинник", "timeformattitle": "12-годинний формат", "timeformatinfo": "Включити 12-годинний формат", "greetingtitle": "Привітання", "greetinginfo": "Показати привітання нижче власного тексту", // Misc "userTextTitle": "Кастомізувати текст", "userTextInfo": "Показати змінений текст під годинником", "fahrenheitCelsiusCheckbox": "Включити відображення в Фаренгейтах", "fahrenheitCelsiusText": "Оновіть сторінку, щоб застосувати зміни", "hideWeatherTitle": "Приховати погоду", "hideWeatherInfo": "Вимкнути віджет погоди", "hideWeatherBox": "Приховати картку погоди", "hideWeatherBoxInfo": "Показати тільки температурну картку", "minMaxTempText": "Мінімальна-Максимальна погода", "minMaxTempSubText": "Замінити «Відчувається як» на мінімальну та максимальну температуру", // Search "micIconTitle": "Приховати іконку мікрофона", "micIconInfo": "Якщо голосове введення не працює", "hideSearchWith": "Приховати пошукові системи", "hideSearchWithInfo": "Перемикайтеся між пошуковими системами, натискаючи на їхні значки.", "motivationalQuotesText": "Мотиваційні цитати", "motivationalQuotesInfo": "Показати цитати під рядком пошуку", "search_suggestions_button": "Пошукові пропозиції", "search_suggestions_text": "Увімкнути підказки для пошуку", // Proxy "useproxytitletext": "Обхід проксі-сервера", "useproxyText": "Якщо пошукові підказки не працюють", "ProxyText": "CORS Обхід проксі-сервера", "ProxySubtext": "Додайте власний проксі-сервер для обходу CORS", "HostproxyButton": "Розмістити власний проксі-сервер", // Location "useGPS": "Використовувати GPS", "useGPSInfo": "Включити GPS для оновлення локації в реальному часі", "UserLocText": "Введіть вашу геолокацію", "UserLocSubtext": "Якщо місце розташування погоди невірне", "userLoc": "Ваше місто або координати (широта, довгота)", "PrivacyPolicy": "Політика конфіденційності", // Weather "WeatherApiText": "Введіть ваш WeatherAPI ключ", "WeatherApiSubtext": "Якщо функція погоди не працює", "userAPI": "Ваш weatherAPI ключ", "LearnMoreButton": "Дізнатися більше", "saveAPI": "Зберегти", // Body Items // Calendar "days": ['Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', 'П\'ятниця', 'Субота'], "months": ['Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'], // Bookmarks "bookmarksHeading": "Закладки", "bookmarkSortBy": "Сортувати за", "sortAlphabetical": "A-Z", "sortTimeAdded": "Старі-Нові", "bookmarkViewAs": "Переглянути як", "bookmarkViewGrid": "Сітка", "bookmarkViewList": "Список", "bookmarkSearch": "Пошук закладки", "editBookmarkHeading": "Редагувати закладку", "editBookmarkName": "Назва закладки", "editBookmarkURL": "Посилання закладки", // New Tab Item "conditionText": "Привіт! Ти як сьогодні?", "humidityLevel": "Вологість", "feelsLike": "Відчувається як: ", "minMaxTemp": "Мін ~ Макс", "location": "Земля", "enterBtn": "Пошук", "searchPlaceholder": "Пишіть сюди...", "listenPlaceholder": "Слухаю...", "searchWithHint": "Пошук за допомогою", "searchOnHint": "Пошук", "userText": "Натисніть для редагування", // Greeting greeting: { "morning": "Доброго ранку!", "afternoon": "Доброго дня!", "evening": "Доброго вечора!" }, // Search Engines "defaultEngine": "За Замовчуванням", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Зображення", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI Інструменти", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Виберіть, які інструменти штучного інтелекту відображати", "resetAISettingsBtn": "Скинути", // Theme "lightThemed": "Світла", "darkThemed": "Темна", "systemThemed": "Система", // Wallpaper and settings "uploadWallpaperText": "Завантажити шпалери", "rangColor": "Оберіть колір", "opacityTitle": "Прозорість", "adjustOpacityDesc": "Налаштування прозорості інтерфейсу", "backupText": "Резервне копіювання", "restoreText": "Відновити", "resetsettings": "Скинути налаштування", "menuCloseText": "Закрити", // Tips "switchSearchModes": "Перемикання режимів пошуку", "switchSearchModesInfo": "Натисніть «Шукати за допомогою», щоб змінити режим.", "adjustZoom": "Налаштувати масштаб", "adjustZoomInfo": "Натисніть Ctrl + \"+\" чи Ctrl + \"-\" щоб змінити масштаб", "changeBrowserTheme": "Змінити тему браузера", "chromeThemeInfo": "Натисніть три крапки (⋮) > Більше інструментів > Налаштувати Chrome, а потім виберіть колір, який відповідає темі розширення.", "edgeThemeInfo": "Перейдіть до Налаштування > Зовнішній вигляд, а потім виберіть колір, який відповідає темі розширення.", "braveThemeInfo": "Відвідати Chrome Theme Store, завантажте та застосуйте тему, яка відповідає розширенню.", "firefoxThemeInfo": "Відвідати Firefox Themes, завантажте та застосуйте тему, яка відповідає розширенню.", "updateFirefoxHomepage": "Оновити стартову сторінку", "updateFirefoxHomepageInfo": "Щоб змінити свою домашню сторінку, як і нову вкладку, відвідайте це посилання і дотримуйтесь інструкцій.", "dontShowTips": "Не показувати знову", // Footer Toast "footerToastTitle": "Бачите банер внизу?", "footerToastMessage": "Щоб приховати його, клацніть правою кнопкою миші та виберіть «Приховати нижній колонтитул на сторінці нової вкладки».", // Dialog boxes (alerts) "okText": "OK", "yesText": "Так", "noText": "Ні", "agreeText": "Я згоден", "cancelText": "Відмінити", "confirmWallpaper": "Хочете встановити нове зображення як шпалери на сьогодні?", "confirmRestore": "Ви впевнені, що хочете скинути налаштування? Цю дію неможливо скасувати.", "Nobackgroundset": "Наразі фонове зображення не встановлено.", "clearbackgroundimage": "Ви впевнені, що хочете видалити фонове зображення?", "ProxyDisclaimer": "Всі функції проксі за замовчуванням вимкнені.\n\nЯкщо ви ввімкнете пошукові підказки та проксі-сервер для обходу CORS, настійно рекомендуємо розмістити власний проксі-сервер для підвищення рівня конфіденційності.\n\nЗа замовчуванням проксі буде встановлено на https://mynt-proxy.rhythmcorehq.com, це означає, що всі ваші дані будуть проходити через цей сервіс, що може викликати занепокоєння з приводу конфіденційності.", "GPSDisclaimer": "Ваші дані про місцезнаходження використовуються виключно для надання точних прогнозів погоди. Вони тимчасово зберігаються в браузері і не передаються стороннім сервісам, а також недоступні для нас.\n\nУвімкнувши GPS, ви даєте згоду на передачу вашого місцезнаходження розширенню на місцевому рівні.", "failedbackup": "Не вдалося створити резервну копію: ", "restorecompleted": "Відновлення завершено успішно!", "restorefailed": "Відновлення не вдалося: ", "invalidBackup": "Вибрано недійсний файл резервної копії.", "deleteBookmark": "Ви впевнені, що хочете видалити закладку \"{title}\"?", "UnsupportedBrowser": "Закладки не підтримуються у вашому браузері.", "resetShortcutsPrompt": "Усі збережені ярлики будуть видалені та скинуті до заводських налаштувань. Чи хочете ви продовжити?", "iconFileTooLargeMessage": "Вибраний файл занадто великий: {size} КБ. Будь ласка, використайте файл менше {max} КБ.", "iconStorageQuotaMessage": "Іконку не вдалося зберегти, оскільки було досягнуто ліміт сховища. Видаліть деякі власні іконки або використовуйте менше зображення." }; ================================================ FILE: locales/ur.js ================================================ // Urdu const ur = { // Menu Items "github": "گٹ ہب", // Shortcuts "shortcutsText": "شارٹ کٹس", "enableShortcutsText": "محفوظ کردہ شارٹ کٹس دکھائیں", "editShortcutsText": "شارٹ کٹس میں ترمیم کریں", "shortcutsInfoText": "انتخاب کریں کہ کون سے شارٹ کٹس دکھائے جائیں", "editShortcutsList": "محفوظ کردہ شارٹ کٹس", "editShortcutsListInfo": "آپ '+' آئیکن پر کلک کرکے نئے شارٹ کٹس شامل کرسکتے ہیں، یا موجودہ شارٹ کٹس کے نام یا یو آر ایل پر کلک کرکے ترمیم کرسکتے ہیں۔", "adaptiveIconText": "موافقت پذیر آئیکن کی شکلیں", "adaptiveIconInfoText": "شارٹ کٹ آئیکنز چھوٹے نظر آئیں گے", "ai_tools_button": "اے آئی ٹولز", "enable_ai_tools": "اے آئی ٹولز کے لیے شارٹ کٹس دکھائیں", //"googleAppsMenuText": "Google Apps", "googleAppsMenuInfo": "گوگل ایپس کے لیے شارٹ کٹس دکھائیں", "todoListText": "To Do List", "todoListInfo": "یومیہ ٹو ڈو لسٹ دکھائیں", // Digital Clock "digitalclocktitle": "ڈیجیٹل گھڑی", "digitalclockinfo": "ڈیجیٹل گھڑی پر جائیں", "timeformattitle": "12 گھنٹوں کی شکل", "timeformatinfo": "12 گھنٹے کی شکل استعمال کریں", "greetingtitle": "سلام", "greetinginfo": "کسٹم ٹیکسٹ کے نیچے سلام دکھائیں", // Misc "userTextTitle": "حسب ضرورت ٹیکسٹ", "userTextInfo": "گھڑی کے نیچے اپنا ٹیکسٹ دکھائیں", "fahrenheitCelsiusCheckbox": "فارن ہائیٹ پر تبدیل کریں", "fahrenheitCelsiusText": "تبدیلیوں کے لیے صفحہ ریفریش کریں", "micIconTitle": "مائیکروفون آئیکن چھپائیں", "micIconInfo": "اگر آواز سے ٹائپنگ کام نہیں کر رہی", "hideSearchWith": "سرچ انجن چھپائیں", "hideSearchWithInfo": "سرچ انجن تبدیل کرنے کے لیے آئیکن پر کلک کریں", "search_suggestions_button": "سرچ تجاویز", "search_suggestions_text": "سرچ تجاویز فعال کریں", // Proxy "useproxytitletext": "پراکسی بائی پاس", "useproxyText": "اگر سرچ تجاویز کام نہیں کر رہیں", "ProxyText": "CORS بائی پاس پراکسی", "ProxySubtext": "اپنی CORS بائی پاس پراکسی شامل کریں", "HostproxyButton": "اپنی پراکسی ہوسٹ کریں", // Location "UserLocText": "اپنا مقام درج کریں", "UserLocSubtext": "اگر موسم کا مقام درست نہیں ہے", "userLoc": "آپ کا شہر یا نقاط (عرض البلد، طول البلد)", // Weather "WeatherApiText": "اپنی WeatherAPI کلید درج کریں", "WeatherApiSubtext": "اگر موسم کی فعالیت کام نہیں کر رہی", "userAPI": "آپ کی weatherAPI کلید", "LearnMoreButton": "مزید جانیں", "saveAPI": "محفوظ کریں", // Body Items // Calendar "days": ["اتوار", "پیر", "منگل", "بدھ", "جمعرات", "جمعہ", "ہفتہ"], "months": ["جنوری", "فروری", "مارچ", "اپریل", "مئی", "جون", "جولائی", "اگست", "ستمبر", "اکتوبر", "نومبر", "دسمبر"], // Weather "humidityLevel": "نمی", "feelsLike": "محسوس", "location": "زمین", // New Tab Item "conditionText": "ہیلو! آج آپ کیسے ہیں؟", "enterBtn": "تلاش کریں", "searchPlaceholder": "یہاں لکھیں...", "listenPlaceholder": "سن رہا ہے...", "todoPlaceholder": "کام شامل کریں...", "searchWithHint": "کے ساتھ تلاش کریں", "ai_tools": "اے آئی ٹولز", "userText": "ترمیم کے لیے یہاں کلک کریں", // Greeting "greeting": { "morning": "صبح بخیر!", "afternoon": "دوپہر بخیر!", "evening": "شام بخیر!" }, // Search Engines "googleEngine": "گوگل", "duckEngine": "ڈَک", "bingEngine": "بِنگ", "braveEngine": "بریو", "youtubeEngine": "یوٹیوب", // AI Tools "chatGPT": "چیٹ جی پی ٹی", "gemini": "جیمنائی", "copilot": "کوپائلٹ", "perplexity": "پرپلکسیٹی", "metaAI": "میٹا اے آئی", // Wallpaper and settings "uploadWallpaperText": "وال پیپر اپلوڈ کریں", "rangColor": "رنگ چنیں", "backupText": "بیک اپ", "restoreText": "بحال کریں", "resetsettings": "ترتیبات ری سیٹ کریں", "menuCloseText": "بند کریں", // Dialog boxes (alerts) "confirmWallpaper": "کیا آپ آج کے لیے ایک نئی تصویر کو وال پیپر کے طور پر سیٹ کرنا چاہتے ہیں؟", "confirmRestore": "کیا آپ واقعی اپنی ترتیبات ری سیٹ کرنا چاہتے ہیں؟ یہ عمل واپس نہیں ہو سکے گا۔", "Nobackgroundset": "اس وقت کوئی پس منظر تصویر سیٹ نہیں ہے۔", "clearbackgroundimage": "کیا آپ واقعی پس منظر کی تصویر کو ہٹانا چاہتے ہیں؟", "ProxyDisclaimer": "تمام پراکسی فیچرز ڈیفالٹ طور پر بند ہیں۔\n\nاگر آپ سرچ تجاویز اور CORS بائی پاس پراکسی کو فعال کرتے ہیں تو بہتر رازداری کے لیے اپنی پراکسی کو ہوسٹ کرنا سختی سے مشورہ دیا جاتا ہے۔\n\nڈیفالٹ طور پر پراکسی https://mynt-proxy.rhythmcorehq.com پر سیٹ ہوگی، اس کا مطلب ہے کہ آپ کا سارا ڈیٹا اس سروس کے ذریعے گزرے گا، جو رازداری کے مسائل پیدا کر سکتا ہے۔", "failedbackup": "بیک اپ ناکام ہوگیا: ", "restorecompleted": "بحالی کامیابی سے مکمل ہوگئی!", "restorefailed": "بحالی ناکام ہوگئی: " }; ================================================ FILE: locales/uz.js ================================================ // Uzbek const uz = { // Menu Items "github": "GitHub", "feedback": "Fikr-mulohaza", // Section titles "personalizationSectionTitle": "Shaxsiylashtirish", "clockSectionTitle": "Soat", "searchSectionTitle": "Qidiruv", "weatherSectionTitle": "Ob-havo", "appearanceSectionTitle": "Tashqi ko'rinish", "settingsSectionTitle": "Sozlamalar", // Shortcuts "shortcutsText": "Yorliqlar", "enableShortcutsText": "Saqlangan yorliqlarni ko'rsatish", "editShortcutsText": "Yorliqlarni tahrirlash", "shortcutsInfoText": "Qaysi yorliqlar ko'rsatilishini tanlang", "editShortcutsList": "Saqlangan yorliqlar", "editShortcutsListInfo": "\"+\" tugmasi bilan yangi yorliq qo'shish yoki mavjudlarini nomi yoki URL orqali tahrirlash mumkin.", "adaptiveIconText": "Moslashuvchan ikonlar", "adaptiveIconInfoText": "Yorliq ikonlar mavzuga moslashadi", "bookmarksText": "Xatcho'plar", "bookmarksInfo": "Xatcho'plar panelini ko'rsatish", "ai_tools_button": "AI vositalari", "enable_ai_tools": "AI vositalari uchun yorliqlarni ko'rsatish", "aiToolsSettingsText": "AI sozlamalari", "aiToolsSettingsInfo": "AI vositalari yorliqlarini boshqarish", "googleAppsMenuText": "Google ilovalari", "googleAppsMenuInfo": "Google ilovalari uchun yorliqlarni ko'rsatish", "googleAppsHover": "Google ilovalari", // To-do List "todoListText": "Vazifalar", "todoListInfo": "Kundalik vazifalar ro'yxatini ko'rsatish", "todoListHover": "Vazifalar", "todoPlaceholder": "Vazifa qo'shish...", // Clock "hideClockBox": "Soatni yashirish", "hideClockBoxInfo": "Soat va sanani yashirish", "digitalclocktitle": "Raqamli soat", "digitalclockinfo": "Raqamli soatga o'tish", "timeformattitle": "12 soatlik format", "timeformatinfo": "12 soatlik vaqt formatini ishlatish", "greetingtitle": "Salomlashuv", "greetinginfo": "Maxsus matn ostida salomlashuvni ko'rsatish", // Misc "userTextTitle": "Maxsus matn", "userTextInfo": "Soat ostida maxsus matnni ko'rsatish", "fahrenheitCelsiusCheckbox": "Farengeytga o'tish", "fahrenheitCelsiusText": "O'zgarishlar uchun sahifani yangilang", "hideWeatherTitle": "Ob-havoni yashirish", "hideWeatherInfo": "Ob-havo vidjetlarini o'chirish", "hideWeatherBox": "Ob-havo kartasini yashirish", "hideWeatherBoxInfo": "Faqat harorat ikonini ko'rsatish", "minMaxTempText": "Min-maks harorat", "minMaxTempSubText": "\"His etiladi\" o'rniga minimal va maksimal haroratni ko'rsatish", // Search "micIconTitle": "Mikrofon ikonini yashirish", "micIconInfo": "Agar ovozli yozish ishlamasa", "hideSearchWith": "Qidiruv tizimlarini yashirish", "hideSearchWithInfo": "Ikoni orqali qidiruv tizimlari o'zgartirish mumkin", "motivationalQuotesText": "Ruhlantiruvchi iqtiboslar", "motivationalQuotesInfo": "Qidiruv satri ostida iqtiboslarni ko'rsatish", "search_suggestions_button": "Qidiruv tavsiyalari", "search_suggestions_text": "Qidiruv tavsiyalarini yoqish", // Proxy "useproxytitletext": "Proksi orqali", "useproxyText": "Qidiruv tavsiyalari ishlamasa", "ProxyText": "CORS proksi orqali", "ProxySubtext": "O'zingizning CORS proksingizni qo'shing", "HostproxyButton": "O'zingizning proksingizni ishlatish", // Location "useGPS": "GPSdan foydalanish", "useGPSInfo": "Jonli lokatsiya yangilanishlari uchun GPSni yoqish", "UserLocText": "Lokatsiyani kiriting", "UserLocSubtext": "Agar ob-havo lokatsiyasi noto'g'ri bo'lsa", "userLoc": "Shaharingiz yoki koordinatalar (kenglik, uzunlik)", "PrivacyPolicy": "Maxfiylik siyosati", // Weather "WeatherApiText": "WeatherAPI kalitini kiritish", "WeatherApiSubtext": "Agar ob-havo funksiyasi ishlamasa", "userAPI": "WeatherAPI kalitingiz", "LearnMoreButton": "Batafsil ma'lumot", "saveAPI": "Saqlash", // Body Items // Calendar "days": ["Yakshanba", "Dushanba", "Seshanba", "Chorshanba", "Payshanba", "Juma", "Shanba"], "months": ["Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avgust", "Sentabr", "Oktabr", "Noyabr", "Dekabr"], // Bookmarks "bookmarksHeading": "Xatcho'plar", "bookmarkSortBy": "Saralash", "sortAlphabetical": "A-Z", "sortTimeAdded": "Eski-Yangi", "bookmarkViewAs": "Ko'rinish usuli", "bookmarkViewGrid": "Katakli", "bookmarkViewList": "Ro'yxatli", "bookmarkSearch": "Xatcho'p qidirish", "editBookmarkHeading": "Xatcho'pni tahrirlash", "editBookmarkName": "Xatcho'p nomi", "editBookmarkURL": "Xatcho'p URL", // New Tab Item "conditionText": "Salom! Qalaysiz?", "humidityLevel": "Namlik", "feelsLike": "Seziladi", "minMaxTemp": "Min ~ Maks", "location": "Yer", "enterBtn": "Qidirish", "searchPlaceholder": "Shu yerga yozing...", "listenPlaceholder": "Tinglanmoqda...", "searchWithHint": "Qidiruv tizimi", "searchOnHint": "Qayerda qidirish", "userText": "Tahrirlash uchun bosing", // Greeting greeting: { "morning": "Xayrli tong!", "afternoon": "Xayrli kun!", "evening": "Xayrli kech!" }, // Search Engines "defaultEngine": "Standart", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Rasmlar", "redditEngine": "Reddit", "wikipediaEngine": "Wikipedia", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI Vositalari", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "Ko'rsatiladigan AI vositalarini tanlang", "resetAISettingsBtn": "Qayta tiklash", // Theme "lightThemed": "Yorug'", "darkThemed": "Qorong'u", "systemThemed": "Tizim bo'yicha", // Wallpaper and settings "uploadWallpaperText": "Fon rasmini yuklash", "rangColor": "Rang tanlang", "opacityTitle": "Shaffoflik", "adjustOpacityDesc": "Interfeys shaffofligini sozlash", "backupText": "Zaxiralash", "restoreText": "Qayta tiklash", "resetsettings": "Sozlamalarni tiklash", "menuCloseText": "Yopish", // Tips "switchSearchModes": "Qidiruv rejimini almashtirish", "switchSearchModesInfo": "Rejimni o'zgartirish uchun 'Qidiruv tizimi'ni bosing.", "adjustZoom": "Masshtabni sozlash", "adjustZoomInfo": "Masshtabni o'zgartirish uchun Ctrl + \"+\" yoki Ctrl + \"-\" tugmalarini bosing.", "changeBrowserTheme": "Brauzer mavzusini o'zgartirish", "chromeThemeInfo": "Uch nuqta (⋮) > Qo'shimcha vositalar > Chrome'ni moslash bo'limiga o'ting va kengaytma mavzusiga mos rangni tanlang.", "edgeThemeInfo": "Sozlamalar > Tashqi ko'rinish bo'limiga o'ting va kengaytma mavzusiga mos rangni tanlang.", "braveThemeInfo": "Chrome Theme Store sahifasiga o'ting, kengaytmaga mos mavzuni yuklab o'rnating.", "firefoxThemeInfo": "Firefox Themes sahifasiga o'ting, mos mavzuni yuklab o'rnating.", "updateFirefoxHomepage": "Bosh sahifani yangilash", "updateFirefoxHomepageInfo": "Yangi varaq bilan bir xil bosh sahifa qilish uchun ushbu havola orqali o'ting va ko'rsatmalarga amal qiling.", "dontShowTips": "Qayta ko'rsatilmasin", // Footer Toast "footerToastTitle": "Pastda banner ko'ryapsizmi?", "footerToastMessage": "Uni yashirish uchun ustiga o'ng tugma bilan bosib, “Yangi varaqda pastki panelni yashirish”ni tanlang.", // Dialog boxes (alerts) "okText": "OK", "yesText": "Ha", "noText": "Yo'q", "agreeText": "Roziman", "cancelText": "Bekor qilish", "confirmWallpaper": "Bugun uchun yangi rasmni fon sifatida o'rnatmoqchimisiz?", "confirmRestore": "Sozlamalarni tiklashni xohlaysizmi? Bu amalni bekor qilib bo'lmaydi.", "Nobackgroundset": "Hozircha fon rasmi o'rnatilmagan.", "clearbackgroundimage": "Fon rasmini olib tashlamoqchimisiz?", "ProxyDisclaimer": "Proksi funksiyalari standart holatda o'chirilgan.\n\nAgar qidiruv tavsiyalari va CORS proksini yoqsangiz, maxfiylikni oshirish uchun o'zingizning proksingizdan foydalanish tavsiya etiladi.\n\nStandart holatda proksi https://mynt-proxy.rhythmcorehq.com manziliga ulanadi. Bu holatda barcha ma'lumotlaringiz ushbu xizmat orqali o'tadi va maxfiylikka ta'sir qilishi mumkin.", "GPSDisclaimer": "Lokatsiya ma'lumotlaringiz faqat aniq ob-havo ma'lumotlarini taqdim etish uchun ishlatiladi. U vaqtincha brauzer ichida saqlanadi va uchinchi tomon xizmatlariga uzatilmaydi.\n\nGPS'ni yoqish orqali lokatsiyangizni kengaytma bilan mahalliy tarzda bo'lishishga rozilik bildirasiz.", "failedbackup": "Zaxiralash amalga oshmadi: ", "restorecompleted": "Tiklash muvaffaqiyatli yakunlandi!", "restorefailed": "Tiklash amalga oshmadi: ", "invalidBackup": "Noto'g'ri zaxira fayli tanlandi.", "deleteBookmark": "\"{title}\" xatcho'pini o'chirmoqchimisiz?", "UnsupportedBrowser": "Xatcho'plar brauzeringizda qo'llab-quvvatlanmaydi.", "resetShortcutsPrompt": "Barcha saqlangan yorliqlar o'chiriladi va standart holatga qaytariladi. Davom etilsinmi?" }; ================================================ FILE: locales/vi.js ================================================ // Vietnamese const vi = { // Menu Items "github": "GitHub", "feedback": "Phản hồi", "resetsettings": "Đặt lại cài đặt gốc", "menuCloseText": "Đóng", // Shortcuts "shortcutsText": "Phím tắt", "enableShortcutsText": "Bật/tắt phím tắt", "editShortcutsText": "Chỉnh sửa Phím tắt", "shortcutsInfoText": "Chọn các phím tắt muốn hiển thị", "editShortcutsList": "Chỉnh sửa danh sách Phím tắt", "editShortcutsListInfo": "Bạn có thể thêm phím tắt mới bằng cách nhấp vào biểu tượng \"+\" hoặc chỉnh sửa phím tắt hiện có bằng cách nhấp vào tên phím tắt hoặc URL.", "adaptiveIconText": "Hình dạng biểu tượng Thích ứng", "adaptiveIconInfoText": "Biểu tượng phím tắt sẽ luôn là hình tròn", "bookmarksText": "Dấu trang", "bookmarksInfo": "Hiển thị thanh bên dấu trang", "ai_tools_button": "Công cụ AI", "enable_ai_tools": "Bật/tắt các phím tắt công cụ AI", "googleAppsMenuText": "Ứng dụng Google", "googleAppsMenuInfo": "Hiển thị các phím tắt cho Ứng dụng Google", "googleAppsHover": "Ứng dụng Google", // To-do List "todoListText": "Danh sách việc cần làm", "todoListInfo": "Hiển thị danh sách việc cần làm hàng ngày", "todoListHover": "Việc cần làm", "todoPlaceholder": "Thêm nhiệm vụ...", // Digital Clock "digitalclocktitle": "Đồng hồ kỹ thuật số", "digitalclockinfo": "Bật/tắt đồng hồ Kỹ thuật số", "timeformattitle": "Sử dụng định dạng 12 giờ", "timeformatinfo": "Sử dụng định dạng thời gian 12 giờ", "greetingtitle": "Lời chào", "greetinginfo": "Hiển thị lời chào dưới văn bản tùy chỉnh", // Misc "userTextTitle": "Văn bản tùy chỉnh", "userTextInfo": "Hiển thị văn bản tùy chỉnh dưới đồng hồ", "fahrenheitCelsiusCheckbox": "Chuyển sang Fahrenheit", "fahrenheitCelsiusText": "Tải lại trang để thấy cập nhật", "micIconTitle": "Ẩn biểu tượng mic", "micIconInfo": "Nếu gõ bằng giọng nói không hoạt động", "hideSearchWith": "Ẩn công cụ tìm kiếm", "hideSearchWithInfo": "Chuyển đổi giữa các công cụ tìm kiếm bằng cách nhấp vào biểu tượng của nó", "search_suggestions_button": "Gợi ý tìm kiếm", "search_suggestions_text": "Bật/tắt gợi ý tìm kiếm", // Proxy "useproxytitletext": "Bỏ qua Proxy", "useproxyText": "Nếu gợi ý tìm kiếm không hoạt động", "ProxyText": "Proxy bỏ qua CORS", "ProxySubtext": "Thiết lập proxy bỏ qua CORS của bạn.", "HostproxyButton": "Lưu trữ proxy của riêng bạn", // Location "UserLocText": "Nhập vị trí của bạn", "UserLocSubtext": "Nếu vị trí thời tiết không chính xác", "userLoc": "Thành phố hoặc tọa độ của bạn (Vĩ độ, Kinh độ)", "useGPS": "Sử dụng GPS", // Weather "WeatherApiText": "Nhập khóa WeatherAPI của bạn", "WeatherApiSubtext": "Nếu tính năng thời tiết không hoạt động", "userAPI": "Khóa WeatherAPI của bạn", "LearnMoreButton": "Tìm hiểu Thêm", "saveAPI": "Lưu", // Body Items // Calendar "days": ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], "months": ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'], // Bookmarks "bookmarksHeading": "Dấu trang", "bookmarkViewAs": "Dạng xem", "bookmarkViewGrid": "Lưới", "bookmarkViewList": "Danh sách", "bookmarkSearch": "Tìm dấu trang", // New Tab Item "conditionText": "Xin chào! Bạn cảm thấy thế nào hôm nay?", "humidityLevel": "Độ ẩm", "feelsLike": "Cảm giác như", "location": "Trái Đất", "enterBtn": "Tìm kiếm", "searchPlaceholder": "Nhập câu hỏi của bạn...", "listenPlaceholder": "Đang nghe...", "searchWithHint": "Tìm kiếm Với", "userText": "Nhấp vào đây để chỉnh sửa", // Greeting greeting: { "morning": "Chào buổi sáng!", "afternoon": "Chào buổi chiều!", "evening": "Chào buổi tối!" }, // Search Engines "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "Hình ảnh", // AI Tools "ai_tools": "Công cụ AI", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "perplexity": "Perplexity", "metaAI": "Meta AI", // Wallpaper and misc "uploadWallpaperText": "Tải hình nền", "backupText": "Sao lưu", "restoreText": "Khôi phục", "rangColor": "Chọn màu", // Dialog boxes (alerts) "confirmWallpaper": "Bạn có muốn đặt một hình ảnh mới làm hình nền cho ngày không?", "confirmRestore": "Bạn có chắc chắn muốn đặt lại cài đặt của mình không? Hành động này không thể hoàn tác.", "Nobackgroundset": "Hiện tại chưa có hình nền nào được thiết lập.", "clearbackgroundimage": "Bạn có chắc chắn muốn xóa hình nền không?", "ProxyDisclaimer": "Theo mặc định, mọi tính năng của proxy đều bị tắt.\n\nNếu bạn bật gợi ý tìm kiếm và bỏ qua proxy CORS, chúng tôi khuyên bạn nên lưu trữ proxy riêng để tăng cường quyền riêng tư.\n\nTheo mặc định, proxy sẽ được đặt thành https://mynt-proxy.rhythmcorehq.com, nghĩa là mọi dữ liệu của bạn sẽ đi qua dịch vụ này, điều này có thể gây ra lo ngại về quyền riêng tư.", "failedbackup": "Sao lưu không thành công: ", "restorecompleted": "Đã khôi phục thành công!", "restorefailed": "Khôi phục không thành công: ", "invalidBackup": "Tệp sao lưu không hợp lệ", "deleteBookmark": "Bạn có chắc chắn muốn xóa dấu trang \"{title}\" không?", "UnsupportedBrowser": "Dấu trang không được hỗ trợ trong trình duyệt của bạn", }; ================================================ FILE: locales/zh.js ================================================ // Chinese (Simplified) const zh = { // Menu Items "github": "GitHub", "feedback": "反馈", "resetsettings": "重置设置", "menuCloseText": "关闭", // Shortcuts "shortcutsText": "快捷方式", "enableShortcutsText": "显示已保存的快捷方式", "editShortcutsText": "编辑快捷方式", "shortcutsInfoText": "选择要显示的快捷方式", "editShortcutsList": "已保存的快捷方式", "editShortcutsListInfo": "点击“+”图标添加新快捷方式,或点击名称/URL编辑现有快捷方式", "adaptiveIconText": "自适应图标", "adaptiveIconInfoText": "快捷方式图标随主题变化", "bookmarksText": "书签", "bookmarksInfo": "显示书签侧边栏", "ai_tools_button": "AI工具", "enable_ai_tools": "显示AI工具快捷方式", "aiToolsSettingsText": "AI工具设置", "aiToolsSettingsInfo": "管理AI工具快捷方式", "googleAppsMenuText": "谷歌应用", "googleAppsMenuInfo": "显示谷歌应用快捷方式", "googleAppsHover": "谷歌应用", // To-do List "todoListText": "待办事项", "todoListInfo": "显示每日待办清单", "todoListHover": "待办清单", "todoPlaceholder": "添加任务...", // Clock "hideClockBox": "隐藏时钟", "hideClockBoxInfo": "隐藏时钟和日期", "digitalclocktitle": "数字时钟", "digitalclockinfo": "切换为数字时钟", "timeformattitle": "12小时制", "timeformatinfo": "使用12小时时间格式", "greetingtitle": "问候语", "greetinginfo": "在自定义文本下方显示问候语", // Misc "userTextTitle": "自定义文本", "userTextInfo": "在时钟下方显示自定义文本", "fahrenheitCelsiusCheckbox": "切换为华氏度", "fahrenheitCelsiusText": "刷新页面以应用更改", "hideWeatherTitle": "隐藏天气", "hideWeatherInfo": "禁用天气组件", "hideWeatherBox": "隐藏天气卡片", "hideWeatherBoxInfo": "仅显示温度标签", "minMaxTempText": "最低~最高温度", "minMaxTempSubText": "用最低和最高温度替换“体感温度”", "micIconTitle": "隐藏麦克风图标", "micIconInfo": "若语音输入无法使用", "hideSearchWith": "隐藏搜索引擎", "hideSearchWithInfo": "点击图标切换搜索引擎", "motivationalQuotesText": "励志名言", "motivationalQuotesInfo": "在搜索栏下方显示名言", "search_suggestions_button": "搜索建议", "search_suggestions_text": "启用搜索建议", // Proxy "useproxytitletext": "代理绕过", "useproxyText": "若搜索建议无法工作", "ProxyText": "CORS绕过代理", "ProxySubtext": "添加您的CORS绕过代理", "HostproxyButton": "自托管代理", // Location "useGPS": "使用GPS", "useGPSInfo": "启用GPS获取实时位置更新", "UserLocText": "输入您的位置", "UserLocSubtext": "若天气位置不准确", "userLoc": "城市或坐标(纬度, 经度)", "PrivacyPolicy": "隐私政策", // Weather "WeatherApiText": "输入WeatherAPI密钥", "WeatherApiSubtext": "若天气功能无法工作", "userAPI": "您的WeatherAPI密钥", "LearnMoreButton": "了解更多", "saveAPI": "保存", // Body Items // Calendar "days": ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], "months": ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], // Bookmarks "bookmarksHeading": "书签", "bookmarkSortBy": "排序方式", "sortAlphabetical": "A-Z", "sortTimeAdded": "旧-新", "bookmarkViewAs": "查看方式", "bookmarkViewGrid": "网格", "bookmarkViewList": "列表", "bookmarkSearch": "搜索书签", "editBookmarkHeading": "编辑书签", "editBookmarkName": "书签名称", "editBookmarkURL": "书签URL", // New Tab Item "conditionText": "你好!今天过得如何?", "humidityLevel": "湿度", "feelsLike": "体感", "minMaxTemp": "最低 ~ 最高", "location": "地球", "enterBtn": "搜索", "searchPlaceholder": "输入内容...", "listenPlaceholder": "聆听中...", "searchWithHint": "搜索方式", "searchOnHint": "搜索平台", "userText": "点击编辑", // Greeting greeting: { "morning": "早上好!", "afternoon": "下午好!", "evening": "晚上好!" }, // Search Engines "defaultEngine": "默认", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "图片", "redditEngine": "Reddit", "wikipediaEngine": "维基百科", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI工具", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "选择要显示的AI工具", "resetAISettingsBtn": "重置", // Theme "enableDarkMode": "深色模式(实验性)", "enableDarkModeInfo": "启用深色主题", // Wallpaper and settings "uploadWallpaperText": "上传壁纸", "rangColor": "选择颜色", "opacityTitle": "透明度", "adjustOpacityDesc": "调整界面透明度", "backupText": "备份", "restoreText": "恢复", // Tips "switchSearchModes": "切换搜索模式", "switchSearchModesInfo": "点击“搜索方式”切换模式", "adjustZoom": "调整缩放", "adjustZoomInfo": "按 Ctrl + \"+\" 或 Ctrl + \"-\" 调整", "changeBrowserTheme": "更改浏览器主题", "chromeThemeInfo": "点击 ⋮ > 更多工具 > 自定义 Chrome,选择匹配主题的颜色", "edgeThemeInfo": "前往 设置 > 外观,选择匹配主题的颜色", "braveThemeInfo": "访问 Chrome主题商店下载匹配主题", "firefoxThemeInfo": "访问 Firefox主题下载匹配主题", "updateFirefoxHomepage": "更新主页", "updateFirefoxHomepageInfo": "点击此处查看主页设置指南", "dontShowTips": "不再显示", // Dialog boxes (alerts) "okText": "确定", "yesText": "是", "noText": "否", "agreeText": "我同意", "cancelText": "取消", "confirmWallpaper": "要将此图片设为今日壁纸吗?", "confirmRestore": "确定要重置设置吗?此操作不可撤销", "Nobackgroundset": "当前未设置背景图片", "clearbackgroundimage": "确定要清除背景图片吗?", "ProxyDisclaimer": "所有代理功能默认关闭\n\n启用搜索建议和CORS代理时,建议自建代理以保护隐私\n\n默认代理为 https://mynt-proxy.rhythmcorehq.com,您的数据将经过该服务", "GPSDisclaimer": "位置数据仅用于天气功能\n临时存储在浏览器中,不会共享给第三方\n启用GPS即表示同意本地位置共享", "failedbackup": "备份失败:", "restorecompleted": "恢复成功!", "restorefailed": "恢复失败:", "invalidBackup": "无效的备份文件", "deleteBookmark": "确定要删除书签“{title}”吗?", "UnsupportedBrowser": "您的浏览器不支持书签功能", "resetShortcutsPrompt": "所有快捷方式将重置为默认值,是否继续?" }; ================================================ FILE: locales/zh_TW.js ================================================ // Chinese (Traditional) const zh_TW = { // Menu Items "github": "GitHub", "feedback": "意見回饋", // Shortcuts "shortcutsText": "捷徑", "enableShortcutsText": "顯示已儲存的捷徑", "editShortcutsText": "編輯捷徑", "shortcutsInfoText": "選擇要顯示的捷徑", "editShortcutsList": "已儲存的捷徑", "editShortcutsListInfo": "您可以透過點擊“+”圖示新增新的捷徑,或透過點擊捷徑名稱或 URL 來編輯現有捷徑", "adaptiveIconText": "自適應圖示形狀", "adaptiveIconInfoText": "捷徑圖示將依主題色顯示,且以較小尺寸呈現", "bookmarksText": "書籤", "bookmarksInfo": "顯示書籤側邊欄", "ai_tools_button": "AI 工具", "enable_ai_tools": "顯示 AI 工具捷徑", "aiToolsSettingsText": "AI 工具設定", "aiToolsSettingsInfo": "管理 AI 工具捷徑", "googleAppsMenuText": "Google 應用程式", "googleAppsMenuInfo": "顯示 Google 應用程式的捷徑", "googleAppsHover": "Google 應用程式", // To-do List "todoListText": "待辦清單", "todoListInfo": "顯示每日待辦清單", "todoListHover": "待辦清單", "todoPlaceholder": "新增任務...", // Clock "hideClockBox": "隱藏時鐘", "hideClockBoxInfo": "顯示或隱藏時鐘和日期", "digitalclocktitle": "數位時鐘", "digitalclockinfo": "切換到數位時鐘", "timeformattitle": "12 小時制", "timeformatinfo": "使用 12 小時制時間格式", "greetingtitle": "問候語", "greetinginfo": "在自訂文字下顯示問候語", // Misc "userTextTitle": "自訂文字", "userTextInfo": "在時鐘下方顯示自訂文字", "fahrenheitCelsiusCheckbox": "切換到華氏溫度", "fahrenheitCelsiusText": "重新整理頁面以套用變更", "hideWeatherTitle": "隱藏天氣", "hideWeatherInfo": "停用天氣小工具", "hideWeatherBox": "隱藏天氣卡片", "hideWeatherBoxInfo": "只在裝置上顯示溫度", "minMaxTempText": "最低-最高溫度", "minMaxTempSubText": "將「體感溫度」替換為最低和最高溫度", // Search "micIconTitle": "隱藏麥克風圖示", "micIconInfo": "如果語音輸入無法使用", "hideSearchWith": "隱藏搜尋引擎", "hideSearchWithInfo": "透過點擊圖示切換搜尋引擎", "motivationalQuotesText": "勵志語錄", "motivationalQuotesInfo": "在搜尋列下方顯示語錄", "search_suggestions_button": "搜尋建議", "search_suggestions_text": "啟用搜尋建議", // Proxy "useproxytitletext": "繞過代理", "useproxyText": "如果搜尋建議無法正常運作", "ProxyText": "CORS 繞過代理", "ProxySubtext": "新增您的地址以繞過 CORS 限制", "HostproxyButton": "托管您自己的代理", // Location "useGPS": "使用 GPS", "useGPSInfo": "啟用 GPS 以獲取即時位置更新", "UserLocText": "輸入您的位置", "UserLocSubtext": "如果天氣位置不正確", "userLoc": "您的城市或座標(緯度,經度)", "PrivacyPolicy": "隱私權政策", // Weather "WeatherApiText": "輸入您的 WeatherAPI 密鑰", "WeatherApiSubtext": "如果天氣功能無法正常運作", "userAPI": "您的 WeatherAPI 密鑰", "LearnMoreButton": "了解更多", "saveAPI": "儲存", // Body Items // Calendar "days": ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], "months": ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], // Bookmarks "bookmarksHeading": "書籤", "bookmarkSortBy": "排序方式", "sortAlphabetical": "A-Z", "sortTimeAdded": "由舊到新", "bookmarkViewAs": "檢視方式", "bookmarkViewGrid": "網格", "bookmarkViewList": "列表", "bookmarkSearch": "搜尋書籤", "editBookmarkHeading": "編輯書籤", "editBookmarkName": "書籤名稱", "editBookmarkURL": "書籤網址", // New Tab Item "conditionText": "你好!今天感覺怎麼樣?", "humidityLevel": "濕度", "feelsLike": "體感溫度", "minMaxTemp": "最低 ~ 最高", "location": "地球", "enterBtn": "搜尋", "searchPlaceholder": "輸入搜尋內容...", "listenPlaceholder": "正在聆聽...", "searchWithHint": "搜尋引擎", "searchOnHint": "搜尋網站", "userText": "點擊這裡以編輯", // Greeting greeting: { "morning": "早安!", "afternoon": "午安!", "evening": "晚安!" }, // Search Engines "defaultEngine": "預設", "googleEngine": "Google", "duckEngine": "Duck", "bingEngine": "Bing", "braveEngine": "Brave", "youtubeEngine": "YouTube", "gImagesEngine": "圖片", "redditEngine": "Reddit", "wikipediaEngine": "維基百科", "quoraEngine": "Quora", // AI Tools "ai_tools": "AI 工具", "chatGPT": "ChatGPT", "gemini": "Gemini", "copilot": "Copilot", "claude": "Claude", "grok": "Grok", "qwen": "Qwen", "perplexity": "Perplexity", "deepseek": "DeepSeek", "metaAI": "Meta AI", "firefly": "Adobe Firefly", "aiSettingsIntro": "選擇要顯示的 AI 工具", "resetAISettingsBtn": "重設", // Theme "enableDarkMode": "深色模式(實驗性)", "enableDarkModeInfo": "啟用深色模式主題", // Wallpaper and settings "uploadWallpaperText": "上傳桌布", "rangColor": "選擇顏色", "backupText": "備份", "restoreText": "還原", "resetsettings": "重設設定", "menuCloseText": "關閉", // Tips "switchSearchModes": "切換搜尋模式", "switchSearchModesInfo": "點擊「搜尋引擎」以更改模式。", "adjustZoom": "調整縮放比例", "adjustZoomInfo": "按下 Ctrl + 加號鍵或 Ctrl + 減號鍵來調整縮放比例。", "changeBrowserTheme": "更改瀏覽器主題", "chromeThemeInfo": "點擊右上角的三個點 (⋮) > 更多工具 > 自訂 Chrome,然後選擇與擴充套件主題相符的顏色。", "edgeThemeInfo": "前往設定 > 外觀,然後選擇與擴充套件主題相符的顏色。", "braveThemeInfo": '造訪 Chrome 主題商店,下載並套用與擴充套件相符的主題。', "firefoxThemeInfo": '造訪 Firefox 主題,下載並套用與擴充套件相符的主題。', "updateFirefoxHomepage": "更新首頁", "updateFirefoxHomepageInfo": "若要將首頁更改為與新分頁相同,請造訪 此連結 並按照指示操作。", "dontShowTips": "不要再顯示此提示", // Dialog boxes (alerts) "okText": "確定", "yesText": "是", "noText": "否", "agreeText": "我同意", "cancelText": "取消", "confirmWallpaper": "您想要將新的影像設定為今日的桌布嗎?", "confirmRestore": "您確定要重設設定嗎?此動作無法恢復。", "Nobackgroundset": "目前尚未設定背景圖片。", "clearbackgroundimage": "確定要清除背景圖片嗎?", "ProxyDisclaimer": "所有代理功能預設為關閉。\n\n如果啟用搜尋建議和 CORS 繞過代理,強烈建議自行代管代理伺服器以提升隱私。\n\n預設情況下,代理會設定為 https://mynt-proxy.rhythmcorehq.com,這表示您的所有資料都會通過此服務,可能會出現隱私疑慮。", "GPSDisclaimer": "您的位置資料僅用於提供準確的天氣更新。資料會暫時儲存在瀏覽器內,不會與任何第三方共享或供我們存取。\n\n啟用 GPS 即表示您同意與擴充功能共享您的位置資料。", "failedbackup": "備份失敗:", "restorecompleted": "還原成功!", "restorefailed": "還原失敗:", "invalidBackup": "選擇的備份檔案無效。", "deleteBookmark": "您確定要刪除書籤 \"{title}\" 嗎?", "UnsupportedBrowser": "您的瀏覽器不支援書籤功能", }; ================================================ FILE: manifest(firefox).json ================================================ { "manifest_version": 2, "name": "MYNT: Material You New Tab", "version": "3.3.504", "description": "A Simple New Tab (browser's home page) inspired by Google's 'Material You' design.", "permissions": [ "search", "bookmarks", "https://www.google.com/complete/search?client=*", "https://duckduckgo.com/ac/?q=*", "https://search.brave.com/api/suggest?q=*", "https://*.wikipedia.org/w/api.php?action=opensearch&search=*" ], "background": { "scripts": ["scripts/background.js"] }, "icons": { "16": "favicon/icon16.png", "48": "favicon/icon48.png", "128": "favicon/icon128.png" }, "browser_action": { "default_icon": "favicon/icon48.png" }, "chrome_url_overrides": { "newtab": "index.html" }, "incognito": "spanning", "browser_specific_settings": { "gecko": { "id": "{c30c387e-cd01-42b4-b5c7-6af2d820535b}", "data_collection_permissions": { "required": ["none"] } } } } ================================================ FILE: manifest.json ================================================ { "manifest_version": 3, "name": "MYNT: Material You New Tab", "version": "3.3.504", "description": "A Simple New Tab (browser's home page) inspired by Google's 'Material You' design.", "permissions": ["search"], "optional_permissions": ["bookmarks", "favicon"], "optional_host_permissions": [ "https://www.google.com/complete/search?client=*", "https://duckduckgo.com/ac/?q=*", "https://search.brave.com/api/suggest?q=*", "https://*.wikipedia.org/w/api.php?action=opensearch&search=*" ], "icons": { "16": "favicon/icon16.png", "48": "favicon/icon48.png", "128": "favicon/icon128.png" }, "action": { "default_icon": "favicon/icon48.png" }, "chrome_url_overrides": { "newtab": "index.html" }, "incognito": "split" } ================================================ FILE: privacy-policy.html ================================================ Privacy Policy for MYNT

    Privacy Policy for MYNT: Material You New Tab

    Introduction

    "MYNT: Material You New Tab" is an open-source extension designed to enhance the appearance of your browser’s default home page and new tab. It was originally developed as a personal project using HTML, CSS, and JavaScript. Due to positive feedback, it was later made available on both the Firefox and Chrome Web Stores.

    Community Contributions

    Since its release, talented developers from the community have contributed to improving the extension through GitHub. These contributors have added new features and fixed bugs, making the extension even better. Each pull request is carefully reviewed, tested, and verified to ensure it meets our standards before being merged.

    Data Collection and Permissions

    MYNT: Material You New Tab prioritizes your privacy and is focused solely on providing a better browsing experience. This extension does not collect, store, or share any personal data. All processing is done locally within your browser. No analytics, tracking scripts, or remote logging systems are included.

    Permissions

    We only request the minimal permissions needed to deliver a rich, dynamic browsing experience. Below is a breakdown of the permissions used and what they are for:

    • Search: Enables integration with the browser’s default search engine.
    • Bookmarks (optional): If granted, allows optional display of your bookmarks directly on the new tab page.
    • Favicon (optional): Used to retrieve bookmark favicons from the browser cache. It only returns icons the browser already has cached and does not expose browsing history or page content.

    Browser APIs

    • Speech Recognition (Web Speech API): Enables voice search. Microphone access is triggered only when the mic icon is clicked and is handled entirely by your browser. No voice data is collected or stored.
    • Geolocation: Used to improve weather accuracy. Access is browser-managed and is not tracked or shared.

    External APIs

    We use the following external services to improve the user experience:

    • Search Suggestions:
      • Google: https://www.google.com/complete/search?client=*
      • DuckDuckGo: https://duckduckgo.com/ac/?q=*
      • Brave: https://search.brave.com/api/suggest?q=*
      • Wikipedia: https://*.wikipedia.org/w/api.php?action=opensearch&search=*

      These are used to provide auto-complete suggestions while typing in the search bar. You can control which sites the extension can access from your browser settings.

    • Location Detection (IPinfo):
      • https://ipinfo.io/json – fetches approximate city-level location based on your IP for local weather display.
    • Weather Updates (WeatherAPI):
      • https://api.weatherapi.com/v1/forecast.json?key=* – retrieves daily forecasts based on your location and language preferences.
      • https://api.weatherapi.com/v1/search.json?key=* – used to fetch location suggestions when searching for a city.
    • Random Wallpapers (Lorem Picsum):
      • https://picsum.photos/1920/1080 – used to fetch high-quality random images.
    • Quotes (Multilingual Quotes API):
      • https://github.com/prem-k-r/multilingual-quotes-api – used to fetch quotes.
    • Favicon Fetching (Google's Favicon API):
      • https://s2.googleusercontent.com/s2/favicons*
      • https://www.google.com/s2/favicons*
      These are used to fetch favicons of websites for shortcuts and bookmarks.

    Proxy Server (Optional)

    MYNT: Material You New Tab includes an optional proxy feature that is disabled by default. This feature can be used to bypass CORS restrictions when fetching search suggestions.

    For users who wish to enable this feature, we highly recommend hosting your own proxy server to maintain full control and ensure maximum privacy.

    If enabled and left at the default setting, search suggestion requests will be routed through the public proxy at: https://mynt-proxy.rhythmcorehq.com.

    Transparency and Security

    While we strive to keep our code secure, we acknowledge that no project is entirely immune to potential issues. In rare cases, unintended code or errors could be introduced through contributions. We encourage users to review the source code directly on GitHub for peace of mind. Please use this extension only when you are fully comfortable with its contents.

    Thank You

    Thank you for your trust in the MYNT: Material You New Tab extension. We hope it enhances your browsing experience with every new tab you open!

    ================================================ FILE: scripts/README.md ================================================ # Contributing to the Project ## Adding a New Feature 1. **Create a new script file** - Name the file appropriately to reflect the feature you're adding. For example, if your feature involves animations, the file could be named `animation-feature.js`. - Place this new file in the `scripts` directory. 2. **Include the copyright comment** - Add the following copyright block at the top of your new script file: ```javascript /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) */ ``` 3. **Integrate the script into the project** - Open `index.html` and locate the `` section. - Add your script as follows: ```html ``` 4. **Develop your feature** - Implement your functionality within the script. Write clean, maintainable code and follow any existing coding standards used in the project. 5. **Update the changelog** - Edit [CHANGELOG.md](../CHANGELOG.md) and add your changes under the [Unreleased] section. - Group all your changes under the most appropriate categories. --- ## Additional Notes Ensure you've read the [code of conduct](../CODE_OF_CONDUCT.md) and the [contributing](../CONTRIBUTING.md). ================================================ FILE: scripts/ai-tools.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Define the list of available AI tools and their default visibility const aiToolsRaw = [ { id: "chatGPT", visible: true, order: 0 }, { id: "gemini", visible: true, order: 1 }, { id: "copilot", visible: true, order: 2 }, { id: "claude", visible: true, order: 3 }, { id: "deepseek", visible: true, order: 4 }, { id: "perplexity", visible: false, order: 5 }, { id: "grok", visible: false, order: 6 }, { id: "metaAI", visible: false, order: 7 }, { id: "qwen", visible: false, order: 8 }, { id: "firefly", visible: false, order: 9 } ]; // Translations for AI tools const aiTools = aiToolsRaw.map(tool => ({ ...tool, label: translations[currentLanguage]?.[tool.id] || translations["en"][tool.id] })); // DOM Elements const aiToolName = document.getElementById("toolsCont"); const shortcuts = document.getElementById("shortcutsContainer"); const aiToolsIcon = document.getElementById("aiToolsIcon"); const aiToolsSettingsModal = document.getElementById("aiToolsSettingsModal"); const aiToolsSettingsOverlay = document.getElementById("aiToolsSettingsOverlay"); const aiToolsForm = document.getElementById("aiToolsForm"); const closeAISettingsBtn = document.getElementById("closeAISettingsBtn"); const resetAISettingsBtn = document.getElementById("resetAISettingsBtn"); const saveAISettingsBtn = document.getElementById("saveAISettingsBtn"); const aiToolsEditButton = document.getElementById("aiToolsEditButton"); const aiToolsCont = document.getElementById("aiToolsCont"); const aiToolsEditField = document.getElementById("aiToolsEditField"); // Animation helper function function animateReorder(element1, element2, direction) { return new Promise((resolve) => { // Get the current positions const rect1 = element1.getBoundingClientRect(); const rect2 = element2.getBoundingClientRect(); // Calculate the distance to move const distance = Math.abs(rect1.top - rect2.top); // Set CSS custom properties for the distance element1.style.setProperty("--move-distance", `${distance}px`); element2.style.setProperty("--move-distance", `${distance}px`); // Get button references const element1UpBtn = element1.querySelector(".reorder-up"); const element1DownBtn = element1.querySelector(".reorder-down"); const element2UpBtn = element2.querySelector(".reorder-up"); const element2DownBtn = element2.querySelector(".reorder-down"); // Disable interactions element1.style.pointerEvents = "none"; element2.style.pointerEvents = "none"; // Add animation classes if (direction === "up") { element1.classList.add("reorder-animate-up"); element2.classList.add("reorder-animate-down"); } else { element1.classList.add("reorder-animate-down"); element2.classList.add("reorder-animate-up"); } // Update button states at halfway point setTimeout(() => { [element1UpBtn.disabled, element2UpBtn.disabled] = [element2UpBtn.disabled, element1UpBtn.disabled]; [element1DownBtn.disabled, element2DownBtn.disabled] = [element2DownBtn.disabled, element1DownBtn.disabled]; }, 150); // Complete animation setTimeout(() => { // Perform DOM swap if (direction === "up") { aiToolsForm.insertBefore(element1, element2); } else { aiToolsForm.insertBefore(element2, element1); } // Clean up [element1, element2].forEach(el => { el.classList.remove("reorder-animate-up", "reorder-animate-down"); el.style.removeProperty("--move-distance"); el.style.pointerEvents = ""; }); updateReorderButtonStates(); resolve(); }, 300); }); } // Function to save AI tools settings function saveAIToolsSettings() { const aiToolsSettings = []; const toolOptions = document.querySelectorAll(".ai-tool-option"); // Save each tool's visibility based on current order toolOptions.forEach((option) => { const toolId = option.dataset.toolId; const isVisible = document.getElementById(`setting_${toolId}`).checked; // Add to array based on visibility if (isVisible) { // For visible tools, just add the ID string aiToolsSettings.push(toolId); } else { // For hidden tools, add an object with the ID as key and false as value const hiddenTool = {}; hiddenTool[toolId] = false; aiToolsSettings.push(hiddenTool); } }); // Save settings to localStorage localStorage.setItem("aiToolsSettings", JSON.stringify(aiToolsSettings)); } // Function to apply saved settings (visibility and order) function applyAIToolsSettings() { const savedSettings = JSON.parse(localStorage.getItem("aiToolsSettings") || "null"); let settingsToApply; if (!savedSettings || !Array.isArray(savedSettings)) { // Initialize with default values if no settings exist settingsToApply = aiTools.map(tool => tool.visible ? tool.id : { [tool.id]: false }); localStorage.setItem("aiToolsSettings", JSON.stringify(settingsToApply)); } else { settingsToApply = savedSettings; } // Create a map of current tool elements for quick lookup const toolElements = new Map(); const allToolLinks = aiToolName.querySelectorAll("a"); allToolLinks.forEach(link => { const toolId = [...link.children].find(el => aiToolsRaw.some(t => t.id === el.id))?.id; if (toolId) toolElements.set(toolId, link); }); // Clear container aiToolName.innerHTML = ""; // Append tools in order based on settings settingsToApply.forEach(item => { let toolId, isVisible; if (typeof item === "string") { toolId = item; isVisible = true; } else { toolId = Object.keys(item)[0]; isVisible = false; } const toolElement = toolElements.get(toolId); if (toolElement) { toolElement.style.display = isVisible ? "flex" : "none"; aiToolName.appendChild(toolElement); } }); } // Function to generate the AI Tools settings form elements function generateAIToolsForm(settings) { aiToolsForm.innerHTML = ""; // Create form elements settings.forEach((settingItem, index) => { let toolId, isVisible; if (typeof settingItem === "string") { toolId = settingItem; isVisible = true; } else { toolId = Object.keys(settingItem)[0]; isVisible = false; } const originalTool = aiTools.find(t => t.id === toolId); const toolLabel = originalTool?.label || toolId; const toolOption = document.createElement("div"); toolOption.className = "ai-tool-option"; toolOption.dataset.toolId = toolId; toolOption.innerHTML = `
    `; aiToolsForm.appendChild(toolOption); }); // Single event listener for all reorder buttons aiToolsForm.addEventListener("click", async (event) => { const upButton = event.target.closest(".reorder-up"); const downButton = event.target.closest(".reorder-down"); if (!upButton && !downButton) return; const toolOption = event.target.closest(".ai-tool-option"); if (!toolOption) return; // Skip if button is disabled or animation in progress if (event.target.disabled || event.target.dataset.animating === "true") return; event.target.dataset.animating = "true"; if (upButton) { const prevToolOption = toolOption.previousElementSibling; if (prevToolOption) { await animateReorder(toolOption, prevToolOption, "up"); } } else if (downButton) { const nextToolOption = toolOption.nextElementSibling; if (nextToolOption) { await animateReorder(toolOption, nextToolOption, "down"); } } event.target.dataset.animating = "false"; }); updateReorderButtonStates(); } // Function to show AI Tools settings modal function showAIToolsSettings() { // Clear previous form content aiToolsForm.innerHTML = ""; // Load saved tool order and visibility or initialize from defaults let savedSettings = JSON.parse(localStorage.getItem("aiToolsSettings") || "null"); // If no settings exist, create from aiTools if (!savedSettings || !Array.isArray(savedSettings)) { savedSettings = aiTools.map(tool => { if (tool.visible) { return tool.id; } else { const hiddenTool = {}; hiddenTool[tool.id] = false; return hiddenTool; } }); } // Generate the form with the saved settings generateAIToolsForm(savedSettings); // Show modal and overlay aiToolsSettingsModal.style.display = "block"; aiToolsSettingsOverlay.style.display = "block"; } // Function to update the enabled/disabled state of reorder buttons function updateReorderButtonStates() { const toolOptions = document.querySelectorAll(".ai-tool-option"); toolOptions.forEach((option, index) => { const upButton = option.querySelector(".reorder-up"); const downButton = option.querySelector(".reorder-down"); if (upButton) { // Disable the first up button upButton.disabled = index === 0; } if (downButton) { // Disable the last down button downButton.disabled = index === toolOptions.length - 1; } }); } // Function to close settings modal function closeAIToolsSettings() { aiToolsSettingsModal.style.display = "none"; aiToolsSettingsOverlay.style.display = "none"; } // Function to toggle AI Tools panel let isAIToolsTransitioning = false; function toggleAITools(event) { if (isAIToolsTransitioning) return; isAIToolsTransitioning = true; const shortcutsCheckbox = document.getElementById("shortcutsCheckbox"); const isAIToolVisible = aiToolName.style.display === "flex"; // Prevent outside click handler from triggering if (event) event.stopPropagation(); if (isAIToolVisible) { // Hide AI Tool panel if (shortcutsCheckbox.checked) { shortcuts.style.display = "flex"; } else { shortcuts.style.display = "none"; } aiToolName.style.opacity = "0"; aiToolName.style.gap = "0"; aiToolName.style.transform = "translateX(-100%)"; setTimeout(() => { aiToolName.style.display = "none"; isAIToolsTransitioning = false; }, 500); } else { // Show AI Tool panel shortcuts.style.display = "none"; aiToolName.style.display = "flex"; requestAnimationFrame(() => { aiToolName.style.opacity = "1"; aiToolName.style.transform = "translateX(0)"; }); setTimeout(() => { aiToolName.style.gap = "12px"; isAIToolsTransitioning = false; }, 300); } } // Event Listeners document.addEventListener("DOMContentLoaded", function () { // Apply saved settings applyAIToolsSettings(); // Allow horizontal scrolling with the mouse wheel aiToolsCont.addEventListener("wheel", (event) => { // Check if the container is scrollable in x-axis if (aiToolsCont.scrollWidth > aiToolsCont.clientWidth) { if (event.deltaY !== 0) { event.preventDefault(); // Prevent vertical scrolling // Apply the deltaY from the wheel event to horizontal scroll aiToolsCont.scrollLeft += event.deltaY; } } }, { passive: false }); // AI Tools icon click handler aiToolsIcon.addEventListener("click", toggleAITools); // AI Tools edit button click handler aiToolsEditButton.addEventListener("click", function (e) { e.preventDefault(); e.stopPropagation(); showAIToolsSettings(); }); // Close button in settings modal closeAISettingsBtn.addEventListener("click", closeAIToolsSettings); // Reset button in settings modal resetAISettingsBtn.addEventListener("click", function () { // Create default settings const defaultSettings = aiTools.map(tool => { if (tool.visible) { return tool.id; } else { const hiddenTool = {}; hiddenTool[tool.id] = false; return hiddenTool; } }); // Generate the form with default settings generateAIToolsForm(defaultSettings); // Animate the list reset const toolsList = document.querySelector(".ai-tools-list"); const toolOptions = document.querySelectorAll(".ai-tool-option"); // Add shake animation to the entire list toolsList.style.animation = "resetShake 0.6s ease-in-out"; // Staggered fade effect for each option toolOptions.forEach((option, index) => { setTimeout(() => { option.style.animation = "resetFlash 0.4s ease-in-out"; // Update checkbox during animation const toolId = option.dataset.toolId; const checkbox = document.getElementById(`setting_${toolId}`); const defaultTool = aiTools.find(t => t.id === toolId); if (defaultTool && checkbox) { checkbox.checked = defaultTool.visible; } }, index * 50); // Stagger by 50ms }); // Briefly disable the reset button to prevent multiple clicks resetAISettingsBtn.disabled = true; // Clean up all animation properties and restore button setTimeout(() => { toolsList.style.animation = ""; toolOptions.forEach(option => { option.style.animation = ""; option.style.transform = ""; option.style.backgroundColor = ""; }); resetAISettingsBtn.disabled = false; }, 700); }); // Save button in settings modal saveAISettingsBtn.addEventListener("click", function () { const newSettings = []; const toolOptions = document.querySelectorAll(".ai-tool-option"); // Save each tool's visibility based on current order in the form toolOptions.forEach((option) => { const toolId = option.dataset.toolId; const isVisible = document.getElementById(`setting_${toolId}`).checked; // Add to array based on visibility if (isVisible) { // For visible tools, just add the ID string newSettings.push(toolId); } else { // For hidden tools, add an object with the ID as key and false as value const hiddenTool = {}; hiddenTool[toolId] = false; newSettings.push(hiddenTool); } }); // Save settings to localStorage localStorage.setItem("aiToolsSettings", JSON.stringify(newSettings)); // Apply new settings applyAIToolsSettings(); // Close modal closeAIToolsSettings(); }); // Settings overlay click handler aiToolsSettingsOverlay.addEventListener("click", closeAIToolsSettings); // Handle checkbox state for AI Tools visibility const aiToolsCheckbox = document.getElementById("aiToolsCheckbox"); aiToolsCheckbox.addEventListener("change", function () { saveCheckboxState("aiToolsCheckboxState", aiToolsCheckbox); if (aiToolsCheckbox.checked) { aiToolsCont.style.display = "flex"; saveDisplayStatus("aiToolsDisplayStatus", "flex"); aiToolsEditField.classList.remove("inactive"); } else { aiToolsCont.style.display = "none"; saveDisplayStatus("aiToolsDisplayStatus", "none"); aiToolsEditField.classList.add("inactive"); } }); // Load saved state loadCheckboxState("aiToolsCheckboxState", aiToolsCheckbox); loadDisplayStatus("aiToolsDisplayStatus", aiToolsCont); if (aiToolsCheckbox.checked) { aiToolsEditField.classList.remove("inactive"); } else { aiToolsEditField.classList.add("inactive"); } // Collapse when clicking outside toolsCont document.addEventListener("click", (event) => { if (!aiToolName.contains(event.target) && aiToolName.style.display === "flex") { toggleAITools(); } }); }); ================================================ FILE: scripts/alert-modal.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Create modal container if not already present (function setupCustomModal() { if (document.getElementById("prompt-modal-container")) return; const blurOverlay = document.createElement("div"); blurOverlay.id = "prompt-modal-blur"; const modalContainer = document.createElement("div"); modalContainer.id = "prompt-modal-container"; const modalBox = document.createElement("div"); modalBox.id = "prompt-modal-box"; const messageElement = document.createElement("p"); messageElement.id = "prompt-modal-message"; const buttonContainer = document.createElement("div"); buttonContainer.id = "prompt-modal-buttons"; modalBox.appendChild(messageElement); modalBox.appendChild(buttonContainer); modalContainer.appendChild(modalBox); document.body.appendChild(blurOverlay); document.body.appendChild(modalContainer); })(); // Function for alert and confirm function alertPrompt(message, isAlert = true, okText, cancelText) { return new Promise((resolve) => { const modalContainer = document.getElementById("prompt-modal-container"); const blurOverlay = document.getElementById("prompt-modal-blur"); const messageElement = document.getElementById("prompt-modal-message"); const buttonContainer = document.getElementById("prompt-modal-buttons"); const bookmarkContainer = document.getElementById("bookmarkSidebar"); // Clear previous message messageElement.innerHTML = ""; // Handle newlines by splitting & appending text nodes message.split("\n").forEach((line, index) => { if (index > 0) messageElement.appendChild(document.createElement("br")); messageElement.appendChild(document.createTextNode(line)); }); buttonContainer.innerHTML = ""; // Clear buttons // Default button text with translations if (isAlert) { okText = okText || translations[currentLanguage]?.okText || translations["en"].okText; } else { okText = okText || translations[currentLanguage]?.yesText || translations["en"].yesText; cancelText = cancelText || translations[currentLanguage]?.noText || translations["en"].noText; } // Create OK button const okButton = document.createElement("button"); okButton.textContent = okText; okButton.classList.add("prompt-modal-button", "prompt-modal-ok"); okButton.onclick = closeModal.bind(null, true); buttonContainer.appendChild(okButton); let cancelButton = null; // If it's a confirm modal, add Cancel button if (!isAlert) { cancelButton = document.createElement("button"); cancelButton.textContent = cancelText; cancelButton.classList.add("prompt-modal-button", "prompt-modal-cancel"); cancelButton.onclick = closeModal.bind(null, false); buttonContainer.appendChild(cancelButton); } modalContainer.style.display = "flex"; blurOverlay.style.display = "block"; // Disable background interaction document.body.style.pointerEvents = "none"; if (bookmarkContainer) bookmarkContainer.style.pointerEvents = "none"; modalContainer.style.pointerEvents = "auto"; // Focus OK button by default and track last focused button let lastFocusedButton = okButton; okButton.focus(); // Prevent focus loss when clicking outside or on non-buttons function preventFocusLoss(event) { const isInsideModal = modalContainer.contains(event.target); const isButton = event.target.classList.contains("prompt-modal-button"); if (!isInsideModal || !isButton) { event.preventDefault(); lastFocusedButton.focus(); // Restore focus to the last button } } document.addEventListener("mousedown", preventFocusLoss); // Handle keyboard events function handleKeydown(event) { if (event.key === "Enter") { if (document.activeElement === okButton) { closeModal(true); } else if (document.activeElement === cancelButton) { closeModal(false); } } else if (event.key === "Escape") { closeModal(isAlert ? undefined : false); } else if (event.key === "ArrowRight" || event.key === "ArrowLeft") { event.preventDefault(); const buttons = buttonContainer.querySelectorAll("button"); let index = [...buttons].indexOf(document.activeElement); if (event.key === "ArrowRight") { index = (index + 1) % buttons.length; } else if (event.key === "ArrowLeft") { index = (index - 1 + buttons.length) % buttons.length; } buttons[index].focus(); lastFocusedButton = buttons[index]; } } document.addEventListener("keydown", handleKeydown); function closeModal(result) { modalContainer.style.display = "none"; blurOverlay.style.display = "none"; document.removeEventListener("keydown", handleKeydown); document.removeEventListener("mousedown", preventFocusLoss); document.body.style.pointerEvents = "auto"; if (bookmarkContainer) bookmarkContainer.style.pointerEvents = "auto"; resolve(result); } }); } // Wrapper function for confirm function confirmPrompt(message, okText, cancelText) { return alertPrompt(message, false, okText, cancelText); } const agreeText = translations[currentLanguage]?.agreeText || translations["en"].agreeText; const cancelText = translations[currentLanguage]?.cancelText || translations["en"].cancelText; //const saveText = translations[currentLanguage]?.saveAPI || translations["en"].saveAPI; //const deleteText = translations[currentLanguage]?.deleteText || translations["en"].deleteText; ================================================ FILE: scripts/background.js ================================================ ================================================ FILE: scripts/backup-restore.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // -------------------- Backup-Restore Settings ---------------------- document.getElementById("backupBtn").addEventListener("click", backupData); document.getElementById("restoreBtn").addEventListener("click", () => document.getElementById("fileInput").click()); document.getElementById("fileInput").addEventListener("change", validateAndRestoreData); // Backup data from localStorage and IndexedDB async function backupData() { try { const backup = { localStorage: {}, indexedDB: {} }; // Backup localStorage for (let key in localStorage) { if (localStorage.hasOwnProperty(key)) { backup.localStorage[key] = localStorage.getItem(key); } } // Backup IndexedDB (ImageDB) backup.indexedDB = await backupIndexedDB(); // Generate filename with current date (format: DDMMYYYY) const date = new Date(); const formattedDate = `${String(date.getDate()).padStart(2, "0")}${String(date.getMonth() + 1).padStart(2, "0")}${date.getFullYear()}`; const fileName = `MYNT_Backup_${formattedDate}.json`; // Create and download the backup file const blob = new Blob([JSON.stringify(backup, null, 2)], { type: "application/json" }); const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); console.log("Backup completed successfully!"); } catch (error) { await alertPrompt((translations[currentLanguage]?.failedbackup || translations["en"].failedbackup) + error.message); } } // Validate and restore data from a backup file async function validateAndRestoreData(event) { const file = event.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = async (e) => { try { const backup = JSON.parse(e.target.result); // Validate the structure of the JSON file if (!isValidBackupFile(backup)) { await alertPrompt(translations[currentLanguage]?.invalidBackup || translations["en"].invalidBackup); return; } await restoreData(backup); await alertPrompt(translations[currentLanguage]?.restorecompleted || translations["en"].restorecompleted); location.reload(); } catch (error) { await alertPrompt(translations[currentLanguage]?.restorefailed || translations["en"].restorefailed + error.message); } }; reader.readAsText(file); } function isValidBackupFile(backup) { // Check if localStorage and indexedDB exist and are objects return !(typeof backup.localStorage !== "object" || typeof backup.indexedDB !== "object"); } // Backup IndexedDB: Extract data from ImageDB -> backgroundImages async function backupIndexedDB() { const db = await openDatabase(); return new Promise((resolve, reject) => { const transaction = db.transaction(storeName, "readonly"); const store = transaction.objectStore(storeName); const data = {}; store.getAllKeys().onsuccess = (keysEvent) => { const keys = keysEvent.target.result; if (!keys.length) { resolve({}); return; } let pending = keys.length; keys.forEach(key => { store.get(key).onsuccess = (getEvent) => { const value = getEvent.target.result; if (value instanceof Blob) { // Convert Blob to Base64 for JSON compatibility const reader = new FileReader(); reader.onload = () => { data[key] = { blob: reader.result, isBlob: true }; if (--pending === 0) resolve(data); }; reader.readAsDataURL(value); } else { data[key] = value; if (--pending === 0) resolve(data); } }; }); }; transaction.onerror = () => reject(transaction.error); }); } // Restore IndexedDB: Clear and repopulate ImageDB -> backgroundImages async function restoreIndexedDB(data) { const db = await openDatabase(); return new Promise((resolve, reject) => { const transaction = db.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); store.clear(); const entries = Object.entries(data); let pending = entries.length; if (pending === 0) { resolve(); // If no data to restore, resolve immediately return; } entries.forEach(([key, value]) => { if (value.isBlob) { // Convert Base64 back to Blob const blob = base64ToBlob(value.blob); store.put(blob, key); } else { store.put(value, key); } if (--pending === 0) resolve(); }); transaction.onerror = () => reject(transaction.error); }); } // Restore data for both localStorage and IndexedDB async function restoreData(backup) { // Clear localStorage before restoring localStorage.clear(); // Restore localStorage from backup if (backup.localStorage) { Object.keys(backup.localStorage).forEach(key => { localStorage.setItem(key, backup.localStorage[key]); }); } // Restore IndexedDB from backup if (backup.indexedDB) { await restoreIndexedDB(backup.indexedDB); } } // Helper: Convert Base64 string to Blob function base64ToBlob(base64) { const [metadata, data] = base64.split(","); const mime = metadata.match(/:(.*?);/)[1]; const binary = atob(data); const array = new Uint8Array(binary.length); for (let i = 0; i < binary.length; i++) { array[i] = binary.charCodeAt(i); } return new Blob([array], { type: mime }); } // ------------------- Reset Settings ---------------------------- const resetbtn = document.getElementById("resetsettings"); // Clear localStorage and reload the page resetbtn.addEventListener("click", async () => { const confirmationMessage = translations[currentLanguage]?.confirmRestore || translations["en"].confirmRestore; if (await confirmPrompt(confirmationMessage)) { localStorage.clear(); location.reload(); } }); ================================================ FILE: scripts/bookmarks.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // ------------------------ Bookmark System ----------------------------------- // DOM Variables const bookmarkButton = document.getElementById("bookmarkButton"); const bookmarkSidebar = document.getElementById("bookmarkSidebar"); const bookmarkList = document.getElementById("bookmarkList"); const bookmarkSearch = document.getElementById("bookmarkSearch"); const bookmarkSearchClearButton = document.getElementById("clearSearchButton"); const bookmarkViewGrid = document.getElementById("bookmarkViewGrid"); const bookmarkViewList = document.getElementById("bookmarkViewList"); const bookmarksCheckbox = document.getElementById("bookmarksCheckbox"); const editBookmarkModal = document.getElementById("editBookmarkModal"); const editBookmarkName = document.getElementById("editBookmarkName"); const editBookmarkURL = document.getElementById("editBookmarkURL"); const editBookmarkFavicon = document.getElementById("editBookmarkFavicon"); const saveBookmarkChanges = document.getElementById("saveBookmarkChanges"); const cancelBookmarkEdit = document.getElementById("cancelBookmarkEdit"); let currentBookmarkId = null; const sortAlphabetical = document.getElementById("sortAlphabetical"); const sortTimeAdded = document.getElementById("sortTimeAdded"); let currentSortMethod = localStorage.getItem("bookmarkSortMethod") || 'title'; var bookmarksAPI; if (isFirefox) { bookmarksAPI = browser.bookmarks; } else if (isChromiumBased) { bookmarksAPI = chrome.bookmarks; } // Initialize sort buttons updateSortButtons(); bookmarkButton.addEventListener("click", function () { toggleBookmarkSidebar(); bookmarkSearchClearButton.click(); bookmarkSearch.focus(); }); bookmarkViewGrid.addEventListener("click", function () { if (!bookmarkGridCheckbox.checked) bookmarkGridCheckbox.click(); }); bookmarkViewList.addEventListener("click", function () { if (bookmarkGridCheckbox.checked) bookmarkGridCheckbox.click(); }); document.addEventListener("click", function (event) { const modalContainer = document.getElementById("prompt-modal-container"); // If modal is open, don't close the sidebar if (modalContainer && modalContainer.style.display === "flex") { return; } if ( !bookmarkSidebar.contains(event.target) && !bookmarkButton.contains(event.target) && !editBookmarkModal.contains(event.target) && bookmarkSidebar.classList.contains("open") ) { toggleBookmarkSidebar(); if (editBookmarkModal.style.display !== "none") { editBookmarkModal.style.display = "none"; } } }); // Search Functionality bookmarkSearch.addEventListener("input", function () { const searchTerm = bookmarkSearch.value.toLowerCase(); const bookmarks = bookmarkList.querySelectorAll("li[data-url], li.folder"); // Include both bookmarks and folders Array.from(bookmarks).forEach(function (bookmark) { const text = bookmark.textContent.toLowerCase(); const url = bookmark.dataset.url ? bookmark.dataset.url.toLowerCase() : ""; const isFolder = bookmark.classList.contains("folder"); // Show bookmarks if the search term matches either the name or the URL if (!isFolder && (text.includes(searchTerm) || url.includes(searchTerm))) { bookmark.style.display = ""; // Show matching bookmarks } else if (isFolder) { // For folders, check if any child bookmarks match the search const childBookmarks = bookmark.querySelectorAll("li[data-url]"); let hasVisibleChild = false; Array.from(childBookmarks).forEach(function (childBookmark) { const childText = childBookmark.textContent.toLowerCase(); const childUrl = childBookmark.dataset.url ? childBookmark.dataset.url.toLowerCase() : ""; if (childText.includes(searchTerm) || childUrl.includes(searchTerm)) { hasVisibleChild = true; childBookmark.style.display = ""; // Show matching child bookmarks } else { childBookmark.style.display = "none"; // Hide non-matching child bookmarks } }); if (hasVisibleChild) { bookmark.style.display = ""; // Show folder if it has matching child bookmarks bookmark.classList.add("open"); // Open folder to show matching child bookmarks } else { bookmark.style.display = "none"; // Hide folder if no child matches bookmark.classList.remove("open"); } } else { bookmark.style.display = "none"; // Hide non-matching bookmarks } }); if (searchTerm === "") { // Reset display for all bookmarks and folders Array.from(bookmarks).forEach(function (bookmark) { bookmark.style.display = ""; if (bookmark.classList.contains("folder")) { bookmark.classList.remove("open"); const childList = bookmark.querySelector("ul"); if (childList) { childList.classList.add("hidden"); } } }); } // Show or hide the clear button based on the search term bookmarkSearchClearButton.style.display = searchTerm ? "inline" : "none"; }); // Sorting functionality sortAlphabetical.addEventListener("click", function () { if (!this.classList.contains("active")) { currentSortMethod = 'title'; localStorage.setItem("bookmarkSortMethod", "title"); updateSortButtons(); loadBookmarks(); } }); sortTimeAdded.addEventListener("click", function () { if (!this.classList.contains("active")) { currentSortMethod = 'date'; localStorage.setItem("bookmarkSortMethod", "date"); updateSortButtons(); loadBookmarks(); } }); function updateSortButtons() { sortAlphabetical.classList.toggle("active", currentSortMethod === 'title'); sortTimeAdded.classList.toggle("active", currentSortMethod === 'date'); } bookmarkSearchClearButton.addEventListener("click", function () { bookmarkSearch.value = ""; bookmarkSearch.dispatchEvent(new Event("input")); // Trigger input event to clear search results }); function updateBookmarkUI(enabled) { bookmarksCheckbox.checked = enabled; bookmarkButton.style.display = enabled ? "flex" : "none"; saveDisplayStatus("bookmarksDisplayStatus", enabled ? "flex" : "none"); saveCheckboxState("bookmarksCheckboxState", bookmarksCheckbox); } async function verifyBookmarkPermission() { // Early exit for unsupported browsers let bookmarksPermission; if (isFirefox) bookmarksPermission = browser.permissions; else if (isChromiumBased) bookmarksPermission = chrome.permissions; if (!bookmarksPermission) { await alertPrompt(translations[currentLanguage]?.UnsupportedBrowser || translations['en'].UnsupportedBrowser); updateBookmarkUI(false); return false; } // Firefox always has permission if (isFirefox) { updateBookmarkUI(true); return true; } // Chromium-based browsers // Opera doesn't have favicon permission yet const requiredPermissions = isOpera ? ["bookmarks"] : ["bookmarks", "favicon"]; const hasPermission = await new Promise(resolve => chrome.permissions.contains({ permissions: requiredPermissions }, resolve)); if (!hasPermission) { const granted = await new Promise(resolve => chrome.permissions.request({ permissions: requiredPermissions }, resolve)); if (!granted) { updateBookmarkUI(false); return false; } bookmarksAPI = chrome.bookmarks; // Initialize if just granted } // Success case updateBookmarkUI(true); return true; } async function toggleBookmarkSidebar() { const hasPermission = await verifyBookmarkPermission(); if (hasPermission) { bookmarkSidebar.classList.toggle("open"); bookmarkButton.classList.toggle("rotate"); if (bookmarkSidebar.classList.contains("open")) { loadBookmarks(); } } } // Function to load bookmarks function loadBookmarks() { if (!bookmarksAPI?.getTree) { console.error("Bookmarks API is unavailable. Please check permissions or context."); return; } bookmarksAPI.getTree().then(bookmarkTreeNodes => { // Clear the current list bookmarkList.innerHTML = ""; // Display the "Recently Added" folder if (bookmarksAPI.getRecent) { bookmarksAPI.getRecent(8).then(recentBookmarks => { if (recentBookmarks.length > 0) { const recentAddedFolder = { title: translations[currentLanguage]?.recentlyAddedBookmarks || translations["en"]?.recentlyAddedBookmarks, children: recentBookmarks }; bookmarkList.appendChild(displayBookmarks([recentAddedFolder])); } }); } // For Firefox: "Bookmarks Menu" and "Other Bookmarks" are distinct nodes if (isFirefox) { const toolbarNode = bookmarkTreeNodes[0]?.children?.find(node => node.title === "Bookmarks Toolbar"); const menuNode = bookmarkTreeNodes[0]?.children?.find(node => node.title === "Bookmarks Menu"); const otherNode = bookmarkTreeNodes[0]?.children?.find(node => node.title === "Other Bookmarks"); if (toolbarNode?.children) bookmarkList.appendChild(displayBookmarks(toolbarNode.children)); if (menuNode?.children) bookmarkList.appendChild(displayBookmarks(menuNode.children)); if (otherNode?.children) bookmarkList.appendChild(displayBookmarks(otherNode.children)); } else { let default_folder = "Bookmarks bar"; if (isEdge) default_folder = "Favorites bar"; if (isBrave) default_folder = "Bookmarks"; // Get the children of the root bookmark folder const rootChildren = bookmarkTreeNodes[0]?.children || []; // Find and process the default bookmarks folder const mainBookmarks = rootChildren.find(node => node.title === default_folder || node.folderType === "bookmarks-bar" ); // If the default folder has children, display its bookmarks if (mainBookmarks?.children) { bookmarkList.appendChild(displayBookmarks(mainBookmarks.children)); } // Process all other root-level folders rootChildren.forEach(node => { if (node !== mainBookmarks && node.id !== "1" && node.children) { bookmarkList.appendChild(displayBookmarks([node])); } }); } }).catch(err => { console.error("Error loading bookmarks:", err); }); } // Function to set the favicon for a bookmark function setBookmarkFavicon(faviconElement, pageUrl) { // Final fallback to local offline icon const offlineFallback = () => faviconElement.src = "./svgs/offline.svg"; // Google favicon api fallback const googleFallback = () => { faviconElement.src = `https://www.google.com/s2/favicons?domain=${new URL(pageUrl).hostname}&sz=32`; faviconElement.onerror = offlineFallback; }; // Try browser-specific favicon first (Chromium only) if (!isFirefox || !isOpera) { faviconElement.src = `chrome-extension://${chrome.runtime.id}/_favicon/?pageUrl=${encodeURIComponent(pageUrl)}&size=32`; faviconElement.onerror = googleFallback; } else { googleFallback(); } } function displayBookmarks(bookmarkNodes) { let list = document.createElement("ul"); // Separate folders and bookmarks const folders = bookmarkNodes.filter(node => node.children && node.children.length > 0); const bookmarks = bookmarkNodes.filter(node => node.url); // Sorting folders and bookmarks separately by title or dateAdded if (currentSortMethod === 'title') { folders.sort((a, b) => a.title.localeCompare(b.title)); bookmarks.sort((a, b) => a.title.localeCompare(b.title)); } else { folders.sort((a, b) => (a.dateAdded || 0) - (b.dateAdded || 0)); bookmarks.sort((a, b) => (a.dateAdded || 0) - (b.dateAdded || 0)); } // Combine folders and bookmarks const sortedNodes = [...bookmarks, ...folders]; for (let node of sortedNodes) { if (node.id === "1") continue; if (node.children && node.children.length > 0) { let folderItem = document.createElement("li"); folderItem.dataset.id = node.id; // Add ID as dataset for context menu // Use the SVG icon from HTML const folderIcon = document.getElementById("folderIconTemplate").cloneNode(true); folderIcon.removeAttribute("id"); // Remove the id to prevent duplicates folderItem.appendChild(folderIcon); folderItem.appendChild(document.createTextNode(node.title)); folderItem.classList.add("folder", "open"); // Add event listener for unfolding/folding folderItem.addEventListener("click", function (event) { event.stopPropagation(); folderItem.classList.toggle("open"); const subList = folderItem.querySelector("ul"); if (subList) { subList.classList.toggle("hidden"); } }); let subList = displayBookmarks(node.children); folderItem.appendChild(subList); list.appendChild(folderItem); } else if (node.url) { let item = document.createElement("li"); item.dataset.id = node.id; // Add ID as dataset for context menu item.dataset.url = node.url; // Add URL as dataset for search functionality let link = document.createElement("a"); link.href = node.url; let span = document.createElement("span"); span.textContent = node.title; const favicon = document.createElement("img"); setBookmarkFavicon(favicon, node.url); favicon.classList.add("favicon"); // Create the delete button let deleteButton = document.createElement("button"); deleteButton.textContent = "✖"; deleteButton.classList.add("bookmark-delete-button"); deleteButton.addEventListener("click", async function (event) { event.preventDefault(); event.stopPropagation(); const confirmMessage = (translations[currentLanguage]?.deleteBookmark || translations["en"].deleteBookmark) .replace("{title}", node.title || node.url); if (await confirmPrompt(confirmMessage)) { if (isFirefox) { // Firefox API (Promise-based) bookmarksAPI.remove(node.id).then(() => { item.remove(); // Remove the item from the DOM }).catch(err => { console.error("Error removing bookmark:", err); }); } else { // Chrome API (Callback-based) bookmarksAPI.remove(node.id, function () { item.remove(); // Remove the item from the DOM }); } } }); link.appendChild(favicon); link.appendChild(span); item.appendChild(link); item.appendChild(deleteButton); // Add delete button to the item // Open links in the current tab or new tab if ctrl pressed link.addEventListener("click", function (event) { if (event.ctrlKey || event.metaKey) { // Open in a new tab event.preventDefault(); if (isFirefox) { browser.tabs.create({ url: node.url, active: false }); } else if (isChromiumBased) { chrome.tabs.create({ url: node.url, active: false }); } else { window.open(node.url, "_blank"); } } else { // Open in the current tab event.preventDefault(); if (isFirefox) { browser.tabs.update({ url: node.url }); } else if (isChromiumBased) { chrome.tabs.update({ url: node.url }, function () { }); } else { window.location.href = node.url; } } }); list.appendChild(item); } } list.addEventListener("click", function (event) { event.stopPropagation(); }); return list; } // Right-click (context menu) event bookmarkList.addEventListener("contextmenu", function (event) { event.preventDefault(); // Prevent default right-click menu const bookmarkItem = event.target.closest("li[data-id]"); if (!bookmarkItem) return; currentBookmarkId = bookmarkItem.dataset.id; const bookmarkTitle = bookmarkItem.querySelector("a").textContent.trim(); const bookmarkURL = bookmarkItem.dataset.url; // Populate modal fields editBookmarkName.value = bookmarkTitle; editBookmarkURL.value = bookmarkURL; setBookmarkFavicon(editBookmarkFavicon, bookmarkURL); // Show modal editBookmarkModal.style.display = "block"; saveBookmarkChanges.disabled = false; }); // Disable save button if URL is empty editBookmarkURL.addEventListener("input", () => { saveBookmarkChanges.disabled = editBookmarkURL.value.trim() === ""; }); // Save button action saveBookmarkChanges.onclick = function () { if (!currentBookmarkId) return; const updatedTitle = editBookmarkName.value.trim(); const updatedURL = encodeURI(editBookmarkURL.value.trim()); const updatedData = { title: updatedTitle, url: updatedURL }; if (isFirefox) { bookmarksAPI.update(currentBookmarkId, updatedData).then(() => { updateBookmark(currentBookmarkId, updatedTitle, updatedURL); editBookmarkModal.style.display = "none"; }).catch(err => { console.error("Error updating bookmark:", err); }); } else { bookmarksAPI.update(currentBookmarkId, updatedData, function () { if (chrome.runtime.lastError) { console.error("Error updating bookmark:", chrome.runtime.lastError); return; } updateBookmark(currentBookmarkId, updatedTitle, updatedURL); editBookmarkModal.style.display = "none"; }); } loadBookmarks(); }; // Cancel button action cancelBookmarkEdit.onclick = function () { editBookmarkModal.style.display = "none"; }; // Function to update after edit function updateBookmark(bookmarkId, title, url) { const bookmarkItem = document.querySelector(`li[data-id="${bookmarkId}"]`); if (bookmarkItem) { const link = bookmarkItem.querySelector("a"); link.textContent = title; link.href = url; bookmarkItem.dataset.url = url; } } // Move focus to URL field when Enter is pressed in Name field editBookmarkName.addEventListener("keydown", (event) => { if (event.key === "Enter") { event.preventDefault(); editBookmarkURL.focus(); } }); // Trigger Save button when Enter is pressed in URL field editBookmarkURL.addEventListener("keydown", (event) => { if (event.key === "Enter") { event.preventDefault(); if (!saveBookmarkChanges.disabled) { saveBookmarkChanges.click(); } } }); // ------------------------ End of Bookmark System ----------------------------------- // Save and load the state of the bookmarks toggle document.addEventListener("DOMContentLoaded", function () { bookmarksCheckbox.addEventListener("change", async function () { if (!bookmarksCheckbox.checked) { updateBookmarkUI(false); return; } await verifyBookmarkPermission(); }); bookmarkGridCheckbox.addEventListener("change", function () { saveCheckboxState("bookmarkGridCheckboxState", bookmarkGridCheckbox); if (bookmarkGridCheckbox.checked) { bookmarkList.classList.add("grid-view"); } else { bookmarkList.classList.remove("grid-view"); } }); loadCheckboxState("bookmarksCheckboxState", bookmarksCheckbox); loadDisplayStatus("bookmarksDisplayStatus", bookmarkButton); loadCheckboxState("bookmarkGridCheckboxState", bookmarkGridCheckbox); }); // Keyboard shortcut for bookmarks document.addEventListener("keydown", function (event) { // Prevent shortcut if modal or menu is open const modalContainer = document.getElementById("prompt-modal-container"); if (modalContainer?.style.display === "flex" || menuBar.style.display !== "none") { return; } if (bookmarksCheckbox.checked && event.key === "ArrowRight" && !event.repeat && event.target.tagName !== "INPUT" && event.target.tagName !== "TEXTAREA" && event.target.isContentEditable !== true ) { bookmarkButton.click(); } }); ================================================ FILE: scripts/browser-utils.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Constants to detect the browser and platform details // Check if the browser is Firefox const isFirefox = typeof browser !== "undefined" && navigator.userAgent.toLowerCase().includes("firefox"); const isFirefoxAll = navigator.userAgent.toLowerCase().includes("firefox"); // For website and live preview // Check if the browser is Chromium-based const isChromiumBased = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime) && !isFirefox; // Check if the browser is Edge const isEdge = /Edg/.test(navigator.userAgent); // Check if the browser is Brave const isBrave = !!(navigator.brave && navigator.brave.isBrave()); // Check if the browser is Opera const isOpera = /OPR/.test(navigator.userAgent); // Check if the browser is Chrome const isChrome = (/Chrome|CriOS/.test(navigator.userAgent)) && /Google Inc/.test(navigator.vendor) && !isEdge && !isBrave && !isOpera; // Check if the browser is Safari const isSafari = /Safari/.test(navigator.userAgent) && !isChromiumBased && /Apple Computer/.test(navigator.vendor); // Check if the operating system is macOS const isMac = /Macintosh|MacIntel|MacPPC|Mac68K/.test(navigator.platform); // Check if the device is a desktop (not mobile) const isDesktop = !/Android|iPhone|iPad|iPod/.test(navigator.userAgent); ================================================ FILE: scripts/clock.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Global variables to track intervals and last date strings let analogIntervalId = null; let digitalIntervalId = null; let lastDateString = null; let lastDigitalDateString = null; let lastGreetingString = null; // ---------------------- Hiding clock func ---------------------- // Select elements const leftDiv = document.getElementById("leftDiv"); const rightDiv = document.getElementById("rightDiv"); const hideClockCheckbox = document.getElementById("hideClock"); const clockHidden = document.getElementById("clockHidden"); const clockOptions = document.querySelector(".clockOptions"); function toggleHideState(isHidden) { clockOptions.classList.toggle("not-applicable", isHidden); if (isHidden) setTimeout(() => clockHidden.style.borderBottom = "none", 120); else clockHidden.style.borderBottom = ""; } function applyClockState(isHidden) { leftDiv.classList.toggle("clock-hidden-left", isHidden); rightDiv.classList.toggle("clock-shifted-right", isHidden); rightDiv.classList.toggle("clock-shifted-right-wide", !isHidden); rightDiv.classList.toggle("clock-padding-adjusted", isHidden); } function handleClockVisibility() { if (window.matchMedia("(max-width: 500px)").matches) { initializeClock(); clockOptions.classList.remove("not-applicable"); rightDiv.classList.remove("clock-padding-adjusted"); } else { // Retrieve saved state from localStorage const isClockHidden = localStorage.getItem("hideClockVisible") === "true"; hideClockCheckbox.checked = isClockHidden; // Apply initial state applyClockState(isClockHidden); toggleHideState(isClockHidden); if (!isClockHidden) { initializeClock(); } hideClockCheckbox.addEventListener("change", function () { const isChecked = hideClockCheckbox.checked; localStorage.setItem("hideClockVisible", isChecked); applyClockState(isChecked); toggleHideState(isChecked); if (!isChecked) { initializeClock(); } }); } } handleClockVisibility(); // Update on window resize window.addEventListener("resize", handleClockVisibility); // ---------------------- Clock func ---------------------- async function initializeClock() { // Clear any existing intervals first if (analogIntervalId) { clearInterval(analogIntervalId); analogIntervalId = null; } if (digitalIntervalId) { clearInterval(digitalIntervalId); digitalIntervalId = null; } let clocktype; // Track cumulative rotations let cumulativeSecondRotation = 0; let cumulativeMinuteRotation = 0; let cumulativeHourRotation = 0; // Initialize on first load let isFirstLoad = true; // Retrieve current time and calculate initial angles var currentTime = new Date(); var initialSeconds = currentTime.getSeconds(); var initialMinutes = currentTime.getMinutes(); var initialHours = currentTime.getHours(); // Initialize cumulative rotations cumulativeSecondRotation = initialSeconds * 6; cumulativeMinuteRotation = initialMinutes * 6 + (initialSeconds / 10); cumulativeHourRotation = (30 * initialHours + initialMinutes / 2); // Apply initial rotations (no need to wait 1s now) document.getElementById("second").style.transform = `rotate(${cumulativeSecondRotation}deg)`; document.getElementById("minute").style.transform = `rotate(${cumulativeMinuteRotation}deg)`; document.getElementById("hour").style.transform = `rotate(${cumulativeHourRotation}deg)`; function initializeClockType() { const savedClockType = localStorage.getItem("clocktype"); clocktype = savedClockType ? savedClockType : "analog"; // Default to "analog" if nothing is saved localStorage.setItem("clocktype", clocktype); // Ensure it's set in local storage } // Call this function to initialize the clock type initializeClockType(); function updateDate() { if (clocktype === "analog") { var currentTime = new Date(); var dayOfWeek = currentTime.getDay(); var dayOfMonth = currentTime.getDate(); var month = currentTime.getMonth(); // Define the current language const currentLanguage = getLanguageStatus("selectedLanguage") || "en"; // Get the translated name of the day var dayName = translations[currentLanguage]?.days?.[dayOfWeek] ?? translations["en"].days[dayOfWeek]; // Get the translated name of the month var monthName = translations[currentLanguage]?.months?.[month] ?? translations["en"].months[month]; // Localize the day of the month var localizedDayOfMonth = localizeNumbers(dayOfMonth.toString(), currentLanguage); // DATE DISPLAY FOR ANALOG CLOCK const dateDisplay = { bn: `${dayName}, ${localizedDayOfMonth} ${monthName}`, mr: `${dayName}, ${localizedDayOfMonth} ${monthName}`, ne: `${dayName}, ${localizedDayOfMonth} ${monthName}`, zh: `${month + 1}月${dayOfMonth}日,${dayName}`, zh_TW: `${month + 1}月${dayOfMonth}日,${dayName}`, cs: `${dayName}, ${dayOfMonth}. ${monthName}`, hi: `${dayName}, ${dayOfMonth} ${monthName}`, it: `${dayName.substring(0, 3)} ${dayOfMonth} ${monthName.substring(0, 3)}`, ja: `${monthName} ${dayOfMonth}日(${dayName.substring(0, 1)})`, ko: `${monthName} ${dayOfMonth}일(${dayName.substring(0, 1)})`, pl: `${dayName}, ${dayOfMonth}. ${monthName}`, pt: `${dayName.substring(0, 3)}, ${dayOfMonth} ${monthName.substring(0, 3)}`, ru: `${dayName}, ${dayOfMonth} ${monthName}`, es: `${dayName.substring(0, 3)}, ${dayOfMonth} ${monthName.substring(0, 3)}`, tr: `${dayName.substring(0, 3)}, ${dayOfMonth} ${monthName}`, uz: `${dayName.substring(0, 3)}, ${dayOfMonth}-${monthName}`, vi: `${dayName}, ngày ${dayOfMonth} ${monthName}`, idn: `${dayName}, ${dayOfMonth} ${monthName}`, fr: `${dayName.substring(0, 3)}, ${dayOfMonth} ${monthName.substring(0, 3)}`, // Jeudi, 5 avril az: `${dayName.substring(0, 3)}, ${dayOfMonth} ${monthName.substring(0, 3)}`, sl: `${dayName}, ${dayOfMonth}. ${monthName.substring(0, 3)}.`, hu: `${monthName.substring(0, 3)} ${dayOfMonth}, ${dayName}`, // Dec 22, Kedd ta: `${monthName} ${localizedDayOfMonth}, ${dayName}`, // e.g.,மார்கழி 31, ஞாயிறு ur: `${dayName}، ${dayOfMonth} ${monthName}`, de: `${dayName}, ${dayOfMonth}. ${monthName}`, fa: `${dayName}، ${localizedDayOfMonth} ${monthName}`, // e.g., شنبه، ۲۵ اسفند ar_SA: `${dayName}, ${localizedDayOfMonth} ${monthName}`, // e.g., الجمعة, 31 مايو el: `${dayName.substring(0, 3)} ${dayOfMonth} ${monthName}`, // Κυρ 22 Δεκ th: `วัน${dayName}ที่ ${dayOfMonth} ${monthName}`, // วันอาทิตย์ที่ 22 ธันวาคม uk: `${dayName}, ${dayOfMonth} ${monthName.substring(0, 4)}`, sv: `${dayName.substring(0, 3)} ${dayOfMonth} ${monthName.substring(0, 3)}`, // Sön 19 Apr default: `${dayName.substring(0, 3)}, ${monthName.substring(0, 3)} ${dayOfMonth}` // Sun, Dec 22 }; const newDateString = dateDisplay[currentLanguage] || dateDisplay.default; // Update date if date actually changed or if it's the first time if (newDateString !== lastDateString) { document.getElementById("date").innerText = newDateString; lastDateString = newDateString; } } } // Helper function to update hand rotation smoothly function updateHandRotation(handId, newRotation, currentTotal, isResetCondition) { let newTotal; // Always calculate the shortest path for smooth transitions const diff = newRotation - (currentTotal % 360); if (isFirstLoad) { // On first load, just set the initial position newTotal = newRotation; } else if (isResetCondition && Math.abs(diff + 360) < Math.abs(diff)) { // When resetting (like 59s→0s), choose the forward path if it's shorter newTotal = newRotation + (Math.floor(currentTotal / 360) + 1) * 360; } else { // Normal case - maintain current rotation count newTotal = newRotation + Math.floor(currentTotal / 360) * 360; } // Apply the smooth transition document.getElementById(handId).style.transition = "transform 1s ease"; document.getElementById(handId).style.transform = `rotate(${newTotal}deg)`; return newTotal; } function updateanalogclock() { var currentTime = new Date(); var currentSeconds = currentTime.getSeconds(); var currentMinutes = currentTime.getMinutes(); var currentHours = currentTime.getHours(); // Calculate the new rotation values let newSecondRotation = currentSeconds * 6; // 6° per second let newMinuteRotation = currentMinutes * 6 + (currentSeconds / 10); // 6° per minute + adjustment for seconds let newHourRotation = (30 * (currentHours % 12) + currentMinutes / 2); // 30° per hour + adjustment for minutes, 12-hour cycle // Define reset conditions const secondReset = currentSeconds === 0; const minuteReset = currentMinutes === 0 && currentSeconds === 0; const hourReset = currentHours % 12 === 0 && currentMinutes === 0 && currentSeconds === 0; // Update each hand using the helper function cumulativeSecondRotation = updateHandRotation("second", newSecondRotation, cumulativeSecondRotation, secondReset); cumulativeMinuteRotation = updateHandRotation("minute", newMinuteRotation, cumulativeMinuteRotation, minuteReset); cumulativeHourRotation = updateHandRotation("hour", newHourRotation, cumulativeHourRotation, hourReset); // Mark that we're no longer on first load isFirstLoad = false; // Update date immediately updateDate(); } function getGreeting() { const currentHour = new Date().getHours(); let greetingKey; // Determine the greeting key based on the current hour if (currentHour < 12) { greetingKey = "morning"; } else if (currentHour < 17) { greetingKey = "afternoon"; } else { greetingKey = "evening"; } // Get the user's language setting const currentLanguage = getLanguageStatus("selectedLanguage") || "en"; // Default to English // Return the translated greeting is available return translations[currentLanguage]?.greeting?.[greetingKey] ?? translations["en"].greeting[greetingKey]; } function updatedigiClock() { const hourformatstored = localStorage.getItem("hourformat"); let hourformat = hourformatstored === "true"; // Default to false if null const greetingCheckbox = document.getElementById("greetingcheckbox"); const isGreetingEnabled = localStorage.getItem("greetingEnabled") === "true"; greetingCheckbox.checked = isGreetingEnabled; const now = new Date(); const dayOfWeek = now.getDay(); // Get day of the week (0-6) const dayOfMonth = now.getDate(); // Get current day of the month (1-31) const currentLanguage = getLanguageStatus("selectedLanguage") || "en"; // Get translated day name let dayName = translations[currentLanguage]?.days?.[dayOfWeek] ?? translations["en"].days[dayOfWeek]; // Localize the day of the month const localizedDayOfMonth = localizeNumbers(dayOfMonth.toString(), currentLanguage); // DATE DISPLAY FOR DIGITAL CLOCK const dateFormats = { az: `${dayName} ${dayOfMonth}`, bn: `${dayName}, ${localizedDayOfMonth}`, mr: `${dayName}, ${localizedDayOfMonth}`, ne: `${dayName}, ${localizedDayOfMonth}`, zh: `${dayOfMonth}日${dayName}`, zh_TW: `${dayOfMonth}日${dayName}`, cs: `${dayName}, ${dayOfMonth}.`, hi: `${dayName}, ${dayOfMonth}`, ja: `${dayOfMonth}日 (${dayName[0]})`, ko: `${dayOfMonth}일 (${dayName[0]})`, pl: `${dayName}, ${dayOfMonth}`, pt: `${dayName}, ${dayOfMonth}`, ru: `${dayOfMonth} ${dayName}`, ta: `${localizedDayOfMonth} ${dayName.substring(0, 2)}`, vi: `${dayOfMonth} ${dayName}`, idn: `${dayOfMonth} ${dayName}`, fr: `${dayName} ${dayOfMonth}`, // Mardi 11 hu: `${dayName} ${dayOfMonth}`, // Kedd 11 ur: `${dayName}، ${dayOfMonth}`, de: `${dayOfMonth}. ${dayName}`, fa: `${dayName} ${localizedDayOfMonth}`, // e.g. شنبه ۲۵ ar_SA: `${dayName}, ${localizedDayOfMonth}`, // e.g., الجمعة, 31 el: `${dayName.substring(0, 3)} ${dayOfMonth}`, // Κυρ 22 th: `${dayName}ที่ ${dayOfMonth}`, uk: `${dayOfMonth} ${dayName}`, default: `${dayOfMonth} ${dayName.substring(0, 3)}`, // 24 Thu }; const newDigitalDateString = dateFormats[currentLanguage] || dateFormats.default; // Update date if date actually changed or if it's the first time if (newDigitalDateString !== lastDigitalDateString) { document.getElementById("digidate").textContent = newDigitalDateString; lastDigitalDateString = newDigitalDateString; } // Handle time formatting based on the selected language let timeString; let period = ""; // For storing AM/PM equivalent // Array of languages to use "en-US" format const specialLanguages = ["tr", "zh", "zh_TW", "ja", "ko", "hu"]; // Languages with NaN in locale time format const localizedLanguages = Object.keys(numberMappings); // Force the "en-US" format for numeral-localized languages, otherwise, it will be localized twice, resulting in NaN // Set time options and determine locale based on the current language const timeOptions = { hour: "2-digit", minute: "2-digit", hour12: hourformat }; const locale = specialLanguages.includes(currentLanguage) || localizedLanguages.includes(currentLanguage) ? "en-US" : currentLanguage; timeString = now.toLocaleTimeString(locale, timeOptions); // Split the time and period (AM/PM) if in 12-hour format if (hourformat) { [timeString, period] = timeString.split(" "); // Split AM/PM if present } // Split the hours and minutes from the localized time string let [hours, minutes] = timeString.split(":"); // Remove leading zero from hours in 12-hour format if (hourformat) { hours = parseInt(hours, 10).toString(); // Remove leading zero } // Localize hours and minutes for the selected language const localizedHours = localizeNumbers(hours, currentLanguage); const localizedMinutes = localizeNumbers(minutes, currentLanguage); // Update the hour, colon, and minute text elements document.getElementById("digihours").textContent = localizedHours; document.getElementById("digicolon").textContent = ":"; document.getElementById("digiminutes").textContent = localizedMinutes; if (isFirefoxAll) document.getElementById("digicolon").classList.add("no-blink"); // Manually set the period for special languages if 12-hour format is enabled if (hourformat && (specialLanguages.includes(currentLanguage) || localizedLanguages.includes(currentLanguage))) { let realHours = new Date().getHours(); // LANGUAGE-SPECIFIC AM/PM if (currentLanguage === "fa") { period = realHours < 12 ? "ق.ظ" : "ب.ظ"; // قبل از ظهر / بعد از ظهر } else if (currentLanguage === "ar_SA") { period = realHours < 12 ? "ص" : "م"; // صباحاً / مساءً } else if (currentLanguage === "ta") { if (realHours < 2) { period = "யாமம்" } else if (realHours < 6) { period = "வைகறை" } else if (realHours < 10) { period = "காலை" } else if (realHours < 14) { period = "நண்பகல்" } else if (realHours < 18) { period = "எற்பாடு" } else if (realHours < 22) { period = "மாலை" } else { period = "யாமம்" } } else { period = realHours < 12 ? "AM" : "PM"; } } // Display AM/PM if in 12-hour format if (hourformat) { document.getElementById("amPm").textContent = period; // Show AM/PM based on calculated period } else { document.getElementById("amPm").textContent = ""; // Clear AM/PM for 24-hour format } const clocktype1 = localStorage.getItem("clocktype"); const dateElement = document.getElementById("date"); if (clocktype1 === "digital" && isGreetingEnabled) { const newGreeting = getGreeting(); if (newGreeting !== lastGreetingString) { dateElement.style.display = "block"; dateElement.innerText = newGreeting; lastGreetingString = newGreeting; } } else if (clocktype1 === "digital") { dateElement.style.display = "none"; // Hide the greeting } } // Function to start the analog clock function startAnalogClock() { if (!analogIntervalId) { // Only set interval if not already set analogIntervalId = setInterval(updateanalogclock, 500); } } // Function to stop the analog clock function stopAnalogClock() { if (analogIntervalId) { clearInterval(analogIntervalId); analogIntervalId = null; // Reset intervalId } } // Function to start the digital clock function startDigitalClock() { if (!digitalIntervalId) { digitalIntervalId = setInterval(updatedigiClock, 1000); } } // Function to stop the digital clock function stopDigitalClock() { if (digitalIntervalId) { clearInterval(digitalIntervalId); digitalIntervalId = null; } } // Initial clock display displayClock(); updateanalogclock(); // Start appropriate clock based on type if (clocktype === "digital") { updatedigiClock(); startDigitalClock(); stopAnalogClock(); } else if (clocktype === "analog") { if (document.visibilityState === "visible") { startAnalogClock(); updateDate(); // Immediately update date when clock is analog } stopDigitalClock(); } // Event listener for visibility change document.addEventListener("visibilitychange", function () { if (document.visibilityState === "visible") { if (clocktype === "analog") { startAnalogClock(); // Start the analog clock if the tab is focused updateDate(); // Update date when the tab becomes visible } else if (clocktype === "digital") { startDigitalClock(); // Start the digital clock if the tab is focused } } else { stopAnalogClock(); // Stop the analog clock if the tab is not focused stopDigitalClock(); // Stop the digital clock if the tab is not focused } }); function displayClock() { const analogClock = document.getElementById("analogClock"); const digitalClock = document.getElementById("digitalClock"); if (clocktype === "analog") { analogClock.style.display = "block"; // Show the analog clock digitalClock.style.display = "none"; // Hide the digital clock } else if (clocktype === "digital") { digitalClock.style.display = "block"; // Show the digital clock analogClock.style.display = "none"; // Hide the analog clock } } // ----------------------- End of clock display ------------------------- function resetDateDisplay() { const dateElement = document.getElementById("date"); dateElement.style.display = "block"; dateElement.innerText = ""; lastGreetingString = null; lastDateString = null; updateDate(); } // Save and load toggle state document.addEventListener("DOMContentLoaded", function () { const timeformatField = document.getElementById("timeformatField"); const hourcheckbox = document.getElementById("12hourcheckbox"); const digitalCheckbox = document.getElementById("digitalCheckbox"); const greetingCheckbox = document.getElementById("greetingcheckbox"); const greetingField = document.getElementById("greetingField"); if (localStorage.getItem("greetingEnabled") === null) { localStorage.setItem("greetingEnabled", "true"); } greetingCheckbox.checked = localStorage.getItem("greetingEnabled") === "true"; greetingCheckbox.disabled = localStorage.getItem("clocktype") !== "digital"; digitalCheckbox.addEventListener("change", function () { saveCheckboxState("digitalCheckboxState", digitalCheckbox); if (digitalCheckbox.checked) { timeformatField.classList.remove("inactive"); greetingField.classList.remove("inactive"); greetingCheckbox.disabled = false; // Enable greeting toggle localStorage.setItem("clocktype", "digital"); clocktype = localStorage.getItem("clocktype"); displayClock(); stopAnalogClock(); startDigitalClock(); updatedigiClock(); saveActiveStatus("timeformatField", "active"); saveActiveStatus("greetingField", "active"); } else { timeformatField.classList.add("inactive"); greetingField.classList.add("inactive"); greetingCheckbox.disabled = true; // Disable greeting toggle localStorage.setItem("clocktype", "analog"); clocktype = localStorage.getItem("clocktype"); stopDigitalClock(); startAnalogClock(); updateanalogclock(); displayClock(); resetDateDisplay(); saveActiveStatus("timeformatField", "inactive"); saveActiveStatus("greetingField", "inactive"); } }); hourcheckbox.addEventListener("change", function () { saveCheckboxState("hourcheckboxState", hourcheckbox); if (hourcheckbox.checked) { localStorage.setItem("hourformat", "true"); } else { localStorage.setItem("hourformat", "false"); } }); greetingCheckbox.addEventListener("change", () => { localStorage.setItem("greetingEnabled", greetingCheckbox.checked); updatedigiClock(); }); loadCheckboxState("digitalCheckboxState", digitalCheckbox); loadCheckboxState("hourcheckboxState", hourcheckbox); loadActiveStatus("timeformatField", timeformatField); loadActiveStatus("greetingField", greetingField); }); } ================================================ FILE: scripts/custom-text.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Custom text document.addEventListener("DOMContentLoaded", () => { const userTextDiv = document.getElementById("userText"); const userTextCheckbox = document.getElementById("userTextCheckbox"); // Load and apply the checkbox state const isUserTextVisible = localStorage.getItem("userTextVisible") !== "false"; userTextCheckbox.checked = isUserTextVisible; userTextDiv.style.display = isUserTextVisible ? "block" : "none"; // Toggle userText display based on checkbox state userTextCheckbox.addEventListener("change", () => { const isVisible = userTextCheckbox.checked; userTextDiv.style.display = isVisible ? "block" : "none"; localStorage.setItem("userTextVisible", isVisible); }); // Set the default language to English if no language is saved const savedLang = localStorage.getItem("selectedLanguage") || "en"; applyLanguage(savedLang); // Load the stored text if it exists const storedValue = localStorage.getItem("userText"); if (storedValue) { userTextDiv.textContent = storedValue; } else { // Fallback to the placeholder based on the selected language const placeholder = userTextDiv.dataset.placeholder || translations["en"].userText; // Fallback to English userTextDiv.textContent = placeholder; } // Handle input event userTextDiv.addEventListener("input", function () { localStorage.setItem("userText", userTextDiv.textContent); }); // Remove placeholder text when the user starts editing userTextDiv.addEventListener("click", function () { if (userTextDiv.textContent === userTextDiv.dataset.placeholder) { userTextDiv.textContent = ""; // Clear the placeholder when focused } }); // Restore placeholder if the user leaves the div empty after editing userTextDiv.addEventListener("blur", function () { if (userTextDiv.textContent === "") { userTextDiv.textContent = userTextDiv.dataset.placeholder; // Show the placeholder again if empty } }); }); ================================================ FILE: scripts/google-apps.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // ------------------------Google App Menu----------------------------------- const iconContainer = document.getElementById("iconContainer"); const googleAppsCont = document.getElementById("googleAppsCont"); // Toggle menu and tooltip visibility googleAppsCont.addEventListener("click", function (event) { const isMenuVisible = iconContainer.style.display === "grid"; // Toggle menu visibility iconContainer.style.display = isMenuVisible ? "none" : "grid"; // Add or remove the class to hide the tooltip if (!isMenuVisible) { iconContainer.style.animation = "panelScaleIn 200ms cubic-bezier(0.4, 0, 0.2, 1) forwards"; googleAppsCont.classList.add("menu-open"); // Hide tooltip } else { googleAppsCont.classList.remove("menu-open"); // Restore tooltip } event.stopPropagation(); }); // Close menu when clicking outside document.addEventListener("click", function (event) { const isClickInside = iconContainer.contains(event.target) || googleAppsCont.contains(event.target); if (!isClickInside && iconContainer.style.display === "grid") { iconContainer.style.display = "none"; // Hide menu googleAppsCont.classList.remove("menu-open"); // Restore tooltip } }); // ------------------------End of Google App Menu Setup----------------------------------- // Save and load toggle state document.addEventListener("DOMContentLoaded", function () { const googleAppsCont = document.getElementById("googleAppsCont"); const googleAppsCheckbox = document.getElementById("googleAppsCheckbox"); googleAppsCheckbox.addEventListener("change", function () { saveCheckboxState("googleAppsCheckboxState", googleAppsCheckbox); if (googleAppsCheckbox.checked) { googleAppsCont.style.display = "flex"; saveDisplayStatus("googleAppsDisplayStatus", "flex"); } else { googleAppsCont.style.display = "none"; saveDisplayStatus("googleAppsDisplayStatus", "none"); } }); loadCheckboxState("googleAppsCheckboxState", googleAppsCheckbox); loadDisplayStatus("googleAppsDisplayStatus", googleAppsCont); }); ================================================ FILE: scripts/languages.js ================================================ /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Translation data const translations = { en: en, // English pt: pt, // Portuguese-BR (Brazil) zh: zh, // Chinese (Simplified) zh_TW: zh_TW, // Chinese (Traditional) hi: hi, // Hindi hu: hu, // Hungarian cs: cs, // Czech it: it, // Italian tr: tr, // Turkish bn: bn, // Bengali vi: vi, // Vietnamese ru: ru, // Russian uz: uz, // Uzbek es: es, // Spanish ja: ja, // Japanese ko: ko, // Korean idn: idn, // Indonesian mr: mr, // Marathi fr: fr, // French az: az, // Azerbaijani sl: sl, // Slovenian ne: ne, // Nepali ur: ur, // Urdu de: de, // German fa: fa, // Farsi (Persian) ar_SA: ar_SA, // Arabic (Saudi Arabia) el: el, // Greek ta: ta, // தமிழ் th: th, // Thai pl: pl, // Polish uk: uk, // Ukrainian sv: sv, // Swedish }; // Define the width of the menu container for each language const menuWidths = { en: "443px", ta: "522px", pt: "512px", sv: "472px", bn: "458px", uz: "497px", vi: "487px", cs: "494px", es: "488px", hi: "450px", mr: "460px", hu: "487px", ja: "486px", ru: "442px", it: "479px", idn: "477px", tr: "472px", fr: "517px", az: "460px", sl: "512px", ne: "472px", de: "502px", fa: "502px", ar_SA: "482px", el: "497px", th: "497px", pl: "497px", uk: "497px", // Add more languages and widths as needed }; const numberMappings = { "bn": { "0": "০", "1": "১", "2": "২", "3": "৩", "4": "৪", "5": "৫", "6": "৬", "7": "৭", "8": "৮", "9": "৯" }, "ta": { "0": "௦", "1": "௧", "2": "௨", "3": "௩", "4": "௪", "5": "௫", "6": "௬", "7": "௭", "8": "௮", "9": "௯" }, "mr": { "0": "०", "1": "१", "2": "२", "3": "३", "4": "४", "5": "५", "6": "६", "7": "७", "8": "८", "9": "९" }, "ne": { "0": "०", "1": "१", "2": "२", "3": "३", "4": "४", "5": "५", "6": "६", "7": "७", "8": "८", "9": "९" }, "fa": { 0: "۰", 1: "۱", 2: "۲", 3: "۳", 4: "۴", 5: "۵", 6: "۶", 7: "۷", 8: "۸", 9: "۹" }, "ar_SA": { 0: "۰", 1: "۱", 2: "۲", 3: "۳", 4: "٤", 5: "٥", 6: "٦", 7: "۷", 8: "۸", 9: "۹" } // Add more languages as needed, Ensure it is supported in the fonts }; const LRM = "\u200E"; // Left-to-Right Mark function localizeNumbers(text, language) { const map = numberMappings[language]; // Get the numeral map for the current language // Define languages that use a comma as the decimal separator instead of a dot const specialDecimalLanguages = ["cs", "it", "pt", "ru", "tr", "vi", "uz", "es", "ko", "idn", "fr", "az", "sl", "hu", "de", "fa", "el", "uk", "sv"]; // Add more languages here as needed if (specialDecimalLanguages.includes(language)) { // Replace decimal point with a comma for specific languages text = text.replace(".", ","); } // Apply digit localization if the numeral map exists if (map) { text = text.replace(/\d/g, (digit) => map[digit] || digit); } // LRM marks, for RTL languages to ensure correct display const rtlFlipLanguages = ["ar_SA"]; if (rtlFlipLanguages.includes(language)) { text = `${LRM}${text}${LRM}`; } return text; // Return the localized text } // Right-to-left languages const rtlLanguages = ["ur", "fa", "ar_SA"]; // Function to apply the language to the page function applyLanguage(lang) { document.title = translations[lang]?.newTabTitle || translations["en"].newTabTitle; // Mapping of text elements and their translation keys const translationMap = [ "feedback", "resetsettings", "shortcutsText", "enableShortcutsText", "editShortcutsText", "shortcutsInfoText", "editShortcutsList", "editShortcutsListInfo", "adaptiveIconText", "adaptiveIconInfoText", "ai_tools_button", "enable_ai_tools", "aiToolsSettingsText", "aiToolsSettingsInfo", "googleAppsMenuText", "googleAppsMenuInfo", "todoListText", "todoListInfo", "fahrenheitCelsiusCheckbox", "fahrenheitCelsiusText", "minMaxTempText", "minMaxTempSubText", "hideWeatherTitle", "hideWeatherInfo", "hideWeatherBox", "hideWeatherBoxInfo", "micIconTitle", "micIconInfo", "hideSearchWith", "hideSearchWithInfo", "motivationalQuotesText", "motivationalQuotesInfo", "newQuoteOnRefreshText", "newQuoteOnRefreshInfo", "search_suggestions_button", "search_suggestions_text", "hideClockBox", "hideClockBoxInfo", "digitalclocktitle", "digitalclockinfo", "timeformattitle", "timeformatinfo", "greetingtitle", "greetinginfo", "userTextTitle", "userTextInfo", "useproxytitletext", "useproxyText", "ProxyText", "ProxySubtext", "HostproxyButton", "UserLocText", "UserLocSubtext", "useGPS", "useGPSInfo", "PrivacyPolicy", "WeatherApiText", "WeatherApiSubtext", "LearnMoreButton", "saveAPI", "enterBtn", "ai_tools", "defaultEngine", "googleEngine", "duckEngine", "bingEngine", "braveEngine", "youtubeEngine", "gImagesEngine", "redditEngine", "wikipediaEngine", "quoraEngine", "chatGPT", "gemini", "copilot", "claude", "grok", "qwen", "perplexity", "deepseek", "metaAI", 'firefly', "github", "googleAppsHover", "todoListHover", "uploadWallpaperText", "backupText", "restoreText", "rangColor", "bookmarksText", "bookmarksInfo", "bookmarksHeading", "bookmarkSortBy", "sortAlphabetical", "sortTimeAdded", "bookmarkViewAs", "bookmarkViewGrid", "bookmarkViewList", "editBookmarkHeading", "lightThemed", "darkThemed", "systemThemed", "switchSearchModes", "switchSearchModesInfo", "adjustZoom", "changeBrowserTheme", "updateFirefoxHomepage", "dontShowTips", "aiSettingsIntro", "resetAISettingsBtn", "opacityTitle", "adjustOpacityDesc", "footerToastTitle", "footerToastMessage", "personalizationSectionTitle", "clockSectionTitle", "searchSectionTitle", "weatherSectionTitle", "appearanceSectionTitle", "settingsSectionTitle", "iconFileTooLargeMessage", "iconStorageQuotaMessage" ]; // Specific mapping for placeholders const placeholderMap = [ { id: "userLoc", key: "userLoc" }, { id: "userAPI", key: "userAPI" }, { id: "searchQ", key: "searchPlaceholder" }, { id: "todoInput", key: "todoPlaceholder" }, { id: "bookmarkSearch", key: "bookmarkSearch" }, { id: "editBookmarkName", key: "editBookmarkName" }, { id: "editBookmarkURL", key: "editBookmarkURL" } ]; // Mapping of elements and their different translation keys const elementsMap = [ { id: "todoListHeading", key: "todoListText" }, { id: "defaultEngineDD", key: "defaultEngine" }, { id: "googleEngineDD", key: "googleEngine" }, { id: "duckEngineDD", key: "duckEngine" }, { id: "bingEngineDD", key: "bingEngine" }, { id: "braveEngineDD", key: "braveEngine" }, { id: "youtubeEngineDD", key: "youtubeEngine" }, { id: "gImagesEngineDD", key: "gImagesEngine" }, { id: "redditEngineDD", key: "redditEngine" }, { id: "wikipediaEngineDD", key: "wikipediaEngine" }, { id: "quoraEngineDD", key: "quoraEngine" }, { id: "bookmarksHover", key: "bookmarksHeading" }, { id: "saveproxy", key: "saveAPI" }, { id: "saveLoc", key: "saveAPI" }, { id: "saveBookmarkChanges", key: "saveAPI" }, { id: "cancelBookmarkEdit", key: "cancelText" }, { id: "aiSettingsHeader", key: "aiToolsSettingsText" }, { id: "saveAISettingsBtn", key: "saveAPI" }, { id: "editBookmarkNameLabel", key: "editBookmarkName" }, { id: "editBookmarkURLLabel", key: "editBookmarkURL" }, { id: "shortcutsSectionTitle", key: "shortcutsText" }, ]; // Function to apply translations function applyTranslations(items, isPlaceholder) { items.forEach(item => { // Get the element by its ID const element = document.getElementById(item.id || item); if (element) { // Use "key" if defined, otherwise use "id" as the translation key const key = item.key || item; // Get the translation, fallback to English if not found in the current language const translation = translations[lang]?.[key] || translations["en"]?.[key]; // Apply the translation to either placeholder or innerText if (isPlaceholder) { element.placeholder = translation; } else { element.innerText = translation; } } }); } // Apply the translations applyTranslations(placeholderMap, true); // For placeholders applyTranslations(elementsMap, false); // For innerTexts with different IDs and keys applyTranslations(translationMap, false); // For innerTexts with same ID and keys // For userText const userTextDiv = document.getElementById("userText"); if (translations[lang]) { const placeholder = translations[lang]?.userText || translations["en"].userText; userTextDiv.dataset.placeholder = placeholder; // Update the placeholder in data attribute // Only set the text content if there's nothing in localStorage if (!localStorage.getItem("userText")) { userTextDiv.innerText = placeholder; } } // Update placeholders on already-rendered shortcut inputs document.querySelectorAll(".shortcutSettingsEntry .shortcutName") .forEach(el => el.placeholder = translations[lang]?.shortcutInputName || translations["en"].shortcutInputName); document.querySelectorAll(".shortcutSettingsEntry .URL") .forEach(el => el.placeholder = translations[lang]?.shortcutInputUrl || translations["en"].shortcutInputUrl); document.querySelectorAll(".shortcutSettingsEntry .iconURL") .forEach(el => el.placeholder = translations[lang]?.shortcutInputIcon || translations["en"].shortcutInputIcon); // Update hover text for #menuCloseButton const menuCloseButton = document.getElementById("menuCloseButton"); if (menuCloseButton) { const hoverText = translations[lang]?.menuCloseText || translations["en"].menuCloseText; menuCloseButton.setAttribute("data-lang", hoverText); } // Update the width of the menu container based on the language const menuCont = document.querySelector(".menuBar .menuCont"); if (menuCont) { menuCont.style.width = menuWidths[lang] || menuWidths["en"]; let widthh = window.innerWidth / parseInt(menuWidths[lang] || menuWidths["en"]); if (window.innerWidth < 522) { let menuStyle = document.getElementById("menuStyle") || document.createElement("style"); menuStyle.id = "menuStyle"; menuStyle.innerHTML = ` .menuCont { scale: ${widthh} !important; height: ${(100 / widthh).toString()}dvh !important; transform-origin: top right !important; } `; document.head.append(menuStyle); } } // Function to dynamically load Google Fonts function loadFont(fontUrl) { if (!document.querySelector(`link[href="${fontUrl}"]`)) { const link = document.createElement("link"); link.rel = "stylesheet"; link.href = fontUrl; document.head.appendChild(link); } } // Dynamically update the font family based on the language const root = document.documentElement; const commonFontStack = "'poppins', 'Poppins', sans-serif"; if (lang === "vi") { loadFont("https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro&display=swap"); root.style.setProperty("--main-font-family", `"Be Vietnam Pro", ${commonFontStack}`); } else if (lang === "ur") { loadFont("https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic&display=swap"); root.style.setProperty("--main-font-family", `"Noto Sans Arabic", ${commonFontStack}`); } else if (lang === "fa") { loadFont("https://fonts.googleapis.com/css2?family=Vazirmatn&display=swap"); // Using Vazirmatn for Farsi root.style.setProperty("--main-font-family", `"Vazirmatn", ${commonFontStack}`); } else { root.style.setProperty("--main-font-family", commonFontStack); } // Apply the direction attribute to specific selectors for RTL languages const isRTL = rtlLanguages.includes(lang); const rtlSelectors = [".topDiv", ".searchbar", ".searchWithCont", ".resultBox", ".quotesCont", ".leftDiv", ".shortcutsContainer", ".page", "#prompt-modal-box", ".todo-container", ".bookmark-search-container", ".bookmark-controls-container", "#editBookmarkModal", ".liquidGlass-toast"]; rtlSelectors.forEach(selector => { document.querySelectorAll(selector).forEach(el => { el.setAttribute("dir", isRTL ? "rtl" : "ltr"); }); }); // Update feelsLike element styles for RTL languages const feelsLikeElement = document.getElementById("feelsLike"); feelsLikeElement.style.left = isRTL ? "12px" : ""; feelsLikeElement.style.paddingRight = isRTL ? "43px" : ""; feelsLikeElement.style.width = isRTL ? "calc(100% - 12px)" : ""; feelsLikeElement.style.textAlign = isRTL ? "right" : "left"; const quotesText = document.querySelector(".quotesContainer"); // quotesText.style.textAlign = isRTL ? "right" : "left"; quotesText.style.fontFamily = commonFontStack; // Save the selected language in localStorage document.documentElement.lang = currentLanguage; saveLanguageStatus("selectedLanguage", lang); } // Detect language from navigator.language document.getElementById("languageSelector").addEventListener("change", (event) => { applyLanguage(event.target.value); location.reload(); }); // Function to apply the language when the page loads window.onload = function () { const savedLanguage = getLanguageStatus("selectedLanguage") || "en"; // Default language is English document.getElementById("languageSelector").value = savedLanguage; applyLanguage(savedLanguage); }; // Function to save the language status in localStorage function saveLanguageStatus(key, languageStatus) { localStorage.setItem(key, languageStatus); } // Function to get the language status from localStorage function getLanguageStatus(key) { return localStorage.getItem(key); } ================================================ FILE: scripts/menu-shortcut-page.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Get the current language from localStorage const currentLanguage = localStorage.getItem("selectedLanguage") || "en"; const isRTL = rtlLanguages.includes(currentLanguage); // ------------Showing & Hiding Menu-bar --------------- const menuButton = document.getElementById("menuButton"); const menuBar = document.getElementById("menuBar"); const menuCont = document.getElementById("menuCont"); const optCont = document.getElementById("optCont"); const overviewPage = document.getElementById("overviewPage"); const shortcutEditPage = document.getElementById("shortcutEditPage"); const shortcutEditButton = document.getElementById("shortcutEditButton"); const backButton = document.getElementById("backButton"); function pageReset() { optCont.scrollTop = 0; overviewPage.style.transform = "translateX(0)"; overviewPage.style.opacity = "1"; overviewPage.style.display = "block"; shortcutEditPage.style.transform = "translateX(120%)"; shortcutEditPage.style.opacity = "0"; shortcutEditPage.style.display = "none"; } const closeMenuBar = () => { requestAnimationFrame(() => { optCont.style.opacity = "0" optCont.style.transform = "translateX(100%)" }); setTimeout(() => { requestAnimationFrame(() => { menuBar.style.opacity = "0" menuCont.style.transform = "translateX(100%)" }); }, 14); setTimeout(() => { // Disable smooth scroll temporarily menuCont.style.scrollBehavior = "auto"; menuCont.scrollTop = 0; // Restore smooth scroll requestAnimationFrame(() => { menuCont.style.scrollBehavior = "smooth"; }); menuBar.style.display = "none"; }, 555); } const openMenuBar = () => { setTimeout(() => { menuBar.style.display = "block"; pageReset(); }); setTimeout(() => { requestAnimationFrame(() => { menuBar.style.opacity = "1" menuCont.style.transform = "translateX(0px)" }); }, 7); setTimeout(() => { requestAnimationFrame(() => { optCont.style.opacity = "1" optCont.style.transform = "translateX(0px)" }); }, 11); } menuButton.addEventListener("click", () => { if (menuBar.style.display === "none" || menuBar.style.display === "") { openMenuBar(); } else { closeMenuBar(); } }); // ----------Hiding Menu Bar-------- menuBar.addEventListener("click", (event) => { if (event.target === menuBar) { closeMenuBar() } }); // Hiding Menu Bar when user click on close button document.getElementById("menuCloseButton").onclick = () => { closeMenuBar() } // Toggle expand/collapse sections document.querySelectorAll(".sectionHeader").forEach(header => { header.addEventListener("click", () => { header.closest(".section").classList.toggle("expanded"); }); }); /* ------ Shortcut Page Transitions & Animations ------ */ // When clicked, open new page by sliding it in from the right. shortcutEditButton.onclick = () => { setTimeout(() => { shortcutEditPage.style.display = "block" }); requestAnimationFrame(() => { overviewPage.style.transform = "translateX(-120%)" overviewPage.style.opacity = "0" }); setTimeout(() => { requestAnimationFrame(() => { shortcutEditPage.style.transform = "translateX(0)" shortcutEditPage.style.opacity = "1" }); }, 50); setTimeout(() => { overviewPage.style.display = "none"; }, 650); } // Close page by sliding it away to the right. backButton.onclick = () => { setTimeout(() => { overviewPage.style.display = "block" }); requestAnimationFrame(() => { shortcutEditPage.style.transform = "translateX(120%)"; shortcutEditPage.style.opacity = "0"; }); setTimeout(() => { requestAnimationFrame(() => { overviewPage.style.transform = "translateX(0)"; overviewPage.style.opacity = "1"; }); }, 50); setTimeout(() => { shortcutEditPage.style.display = "none"; }, 650); } ================================================ FILE: scripts/preload.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Set Loading Screen Color before Everything Loads document.documentElement.style.setProperty('--Loading-Screen-Color', localStorage.getItem('LoadingScreenColor') || "#bbd6fd"); ================================================ FILE: scripts/quotes.js ================================================ /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // Multilingual quotes API const metadataUrl = "https://prem-k-r.github.io/multilingual-quotes-api/minified/metadata.json"; const baseQuoteUrl = "https://prem-k-r.github.io/multilingual-quotes-api/minified/"; const quotesContainer = document.querySelector(".quotesContainer"); const authorName = document.querySelector(".authorName span"); const authorContainer = document.querySelector(".authorName"); const MAX_QUOTE_LENGTH = 140; const MIN_QUOTES_FOR_LANG = 100; const ONE_DAY = 24 * 60 * 60 * 1000; // Fallback quote for when everything fails const FALLBACK_QUOTE = { quote: "Don't watch the clock; do what it does. Keep going.", author: "Sam Levenson" }; let lastKnownLanguage = null; // Animate .authorName container width to hug its text content function fitAuthorWidth() { requestAnimationFrame(() => { const padding = 16; authorContainer.style.width = (authorName.scrollWidth + padding * 2) + "px"; }); } // Clear all quotes-related data from localStorage function clearQuotesStorage() { const keys = Object.keys(localStorage); keys.forEach(key => { if (key.startsWith("quotes_")) { localStorage.removeItem(key); } }); quotesContainer.textContent = ""; authorName.textContent = ""; } // Clear quotes for all languages except the specified one function clearOtherLanguageQuotes(exceptLang) { const keys = Object.keys(localStorage); keys.forEach(key => { if ( key.startsWith("quotes_") && key !== `quotes_${exceptLang}` && !key.startsWith(`quotes_${exceptLang}_`) && key !== "quotes_metadata_timestamp" ) { localStorage.removeItem(key); } }); } // Check if we need to fetch data for a language function needsDataFetch(lang) { // Skip fetch if offline if (!navigator.onLine) return false; // Check if language changed if (lastKnownLanguage !== null && lastKnownLanguage !== currentLanguage) { return true; } // Check if any required data is missing const requiredKeys = [ `quotes_${lang}`, `quotes_${lang}_timestamp`, `quotes_${lang}_count` ]; if (requiredKeys.some(key => !localStorage.getItem(key))) { return true; } // Check if data is stale based on quote count const storedCount = parseInt(localStorage.getItem(`quotes_${lang}_count`)) || 0; const storedTimestamp = localStorage.getItem(`quotes_${lang}_timestamp`); const timeDiff = Date.now() - new Date(storedTimestamp).getTime(); // If count is 0, it means no data available for this language // Only refresh after 1 day to check if quotes were added if (storedCount === 0) { return timeDiff > ONE_DAY; } // Time-based validation for languages with actual quotes const maxAge = storedCount < MIN_QUOTES_FOR_LANG ? ONE_DAY : 7 * ONE_DAY; return timeDiff > maxAge; } // Determine target language based on availability function getTargetLanguage(currentLang, metadata) { // If current language is English, use it if (currentLang === "en") { return "en"; } // Check if current language has enough quotes const langFile = metadata?.files?.[`${currentLang}.json`]; if (langFile && langFile.count >= MIN_QUOTES_FOR_LANG) { return currentLang; } // Fallback to English return "en"; } // Fetch metadata from the API async function fetchMetadata() { try { const response = await fetch(metadataUrl); return await response.json(); } catch (error) { console.error("Error fetching metadata:", error); throw error; } } // Fetch quotes for a specific language async function fetchQuotes(lang) { try { const url = `${baseQuoteUrl}${lang}.json`; const response = await fetch(url); return await response.json(); } catch (error) { console.error(`Error fetching quotes for ${lang}:`, error); throw error; } } // Store quotes and metadata in localStorage function storeQuotesData(lang, quotes, metadata) { const timestamp = new Date().toISOString(); localStorage.setItem(`quotes_${lang}`, JSON.stringify(quotes)); localStorage.setItem(`quotes_${lang}_timestamp`, timestamp); if (metadata) { localStorage.setItem("quotes_metadata_timestamp", metadata.lastUpdated); const quoteCount = metadata.files?.[`${lang}.json`]?.count || quotes.length; localStorage.setItem(`quotes_${lang}_count`, quoteCount.toString()); } } // Store "no data available" information for languages without quotes function storeNoDataInfo(lang, metadata) { const timestamp = new Date().toISOString(); localStorage.setItem(`quotes_${lang}`, JSON.stringify([])); // Empty array localStorage.setItem(`quotes_${lang}_timestamp`, timestamp); localStorage.setItem(`quotes_${lang}_count`, "0"); // 0 indicates no data available if (metadata) { localStorage.setItem("quotes_metadata_timestamp", metadata.lastUpdated); } } // Get stored quotes for a language function getStoredQuotes(lang) { const storedQuotes = localStorage.getItem(`quotes_${lang}`); return storedQuotes ? JSON.parse(storedQuotes) : null; } // Get today's date in YYYY-MM-DD format function getTodayDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // Get the storage key for today's daily quote function getDailyQuoteKey(lang) { return `daily_quote_${lang}_${getTodayDate()}`; } // Store the daily quote for today function storeDailyQuote(lang, quote) { const key = getDailyQuoteKey(lang); localStorage.setItem(key, JSON.stringify(quote)); } // Get the daily quote for today (if it exists) function getDailyQuote(lang) { const key = getDailyQuoteKey(lang); const stored = localStorage.getItem(key); return stored ? JSON.parse(stored) : null; } // Clear old daily quotes function clearOldDailyQuotes() { const keys = Object.keys(localStorage); const today = getTodayDate(); keys.forEach(key => { if (key.startsWith("daily_quote_") && !key.includes(today)) { localStorage.removeItem(key); } }); } // Display fallback quote function displayFallbackQuote() { quotesContainer.textContent = FALLBACK_QUOTE.quote; authorName.textContent = FALLBACK_QUOTE.author; fitAuthorWidth(); } // Get quotes for the current language async function getQuotesForLanguage(forceRefresh = false) { try { // Update last known language lastKnownLanguage = currentLanguage; // Check if we need to fetch new data const shouldFetch = forceRefresh || needsDataFetch(currentLanguage); if (shouldFetch) { // Fetch metadata first to determine availability const metadata = await fetchMetadata(); const targetLang = getTargetLanguage(currentLanguage, metadata); // Store info about current language availability const currentLangFile = metadata.files?.[`${currentLanguage}.json`]; const currentLangCount = currentLangFile?.count || 0; // If current language has no quotes, store that info if (currentLangCount === 0 && currentLanguage !== "en") { storeNoDataInfo(currentLanguage, metadata); } // Fetch quotes for target language const quotes = await fetchQuotes(targetLang); storeQuotesData(targetLang, quotes, metadata); clearOtherLanguageQuotes(currentLanguage || targetLang); return quotes; } else { // Use stored data const storedCount = parseInt(localStorage.getItem(`quotes_${currentLanguage}_count`)) || 0; // If current language has no quotes (count is 0), use English fallback if (storedCount === 0 && currentLanguage !== "en") { let englishQuotes = getStoredQuotes("en"); // If no English quotes stored, we need to fetch them if (!englishQuotes || englishQuotes.length === 0) { const metadata = await fetchMetadata(); englishQuotes = await fetchQuotes("en"); storeQuotesData("en", englishQuotes, metadata); } return englishQuotes; } // Return stored quotes for current language return getStoredQuotes(currentLanguage); } } catch (error) { console.error("Error getting quotes:", error); // Try to use any stored data as fallback let quotes = getStoredQuotes(currentLanguage) || getStoredQuotes("en"); if (!quotes || quotes.length === 0) { // Return hardcoded fallback quote if everything fails return [FALLBACK_QUOTE]; } return quotes; } } // Display a random quote that meets the length requirements function displayRandomQuote(quotes) { if (!quotes || quotes.length === 0) { displayFallbackQuote(); return; } // Check if "Daily Quote" is enabled (show one quote per day) const newQuoteOnRefresh = localStorage.getItem("dailyQuoteEnabled") !== "false"; // If new quote on refresh is disabled, try to use the daily quote if (!newQuoteOnRefresh) { const dailyQuote = getDailyQuote(currentLanguage); if (dailyQuote) { // Display the stored daily quote quotesContainer.textContent = dailyQuote.quote; authorName.textContent = dailyQuote.author; fitAuthorWidth(); return; } } let selectedQuote; const maxAttempts = 15; // Prevent infinite loop // Try to find a quote that fits within the character limit for (let attempts = 0; attempts < maxAttempts; attempts++) { const randomIndex = Math.floor(Math.random() * quotes.length); selectedQuote = quotes[randomIndex]; const totalLength = selectedQuote.quote.length + selectedQuote.author.length; if (totalLength <= MAX_QUOTE_LENGTH) { break; } } // Store as daily quote if new quote on refresh is disabled if (!newQuoteOnRefresh) { storeDailyQuote(currentLanguage, selectedQuote); } // Display the selected quote quotesContainer.textContent = selectedQuote.quote; authorName.textContent = selectedQuote.author; fitAuthorWidth(); } // Main function to load and display a quote async function loadAndDisplayQuote(forceRefresh = false) { try { const quotes = await getQuotesForLanguage(forceRefresh); displayRandomQuote(quotes); } catch (error) { console.error("Error loading quote:", error); displayFallbackQuote(); } } document.addEventListener("DOMContentLoaded", () => { const hideSearchWith = document.getElementById("shortcut_switchcheckbox"); const quotesToggle = document.getElementById("quotesToggle"); const motivationalQuotesCont = document.getElementById("motivationalQuotesCont"); const motivationalQuotesCheckbox = document.getElementById("motivationalQuotesCheckbox"); const searchWithContainer = document.getElementById("search-with-container"); const newQuoteOnRefreshCheckbox = document.getElementById("newQuoteOnRefreshCheckbox"); const quotesOptions = document.querySelector(".quotesOptions"); // Load states from localStorage hideSearchWith.checked = localStorage.getItem("showShortcutSwitch") === "true"; motivationalQuotesCheckbox.checked = localStorage.getItem("motivationalQuotesVisible") !== "false"; newQuoteOnRefreshCheckbox.checked = localStorage.getItem("dailyQuoteEnabled") === "false"; // Initialize language tracking lastKnownLanguage = currentLanguage; // Clean up old daily quotes on page load if (newQuoteOnRefreshCheckbox.checked) clearOldDailyQuotes(); // Function to update quotes visibility and handle state changes const updateMotivationalQuotesState = () => { const isHideSearchWithEnabled = hideSearchWith.checked; const isMotivationalQuotesEnabled = motivationalQuotesCheckbox.checked; // Save state to localStorage localStorage.setItem("motivationalQuotesVisible", isMotivationalQuotesEnabled); // Handle visibility based on settings if (!isHideSearchWithEnabled) { quotesToggle.classList.add("inactive"); quotesOptions.classList.add("not-applicable"); motivationalQuotesCont.style.display = "none"; clearQuotesStorage(); return; } // Update UI visibility quotesToggle.classList.remove("inactive"); searchWithContainer.style.display = isMotivationalQuotesEnabled ? "none" : "flex"; motivationalQuotesCont.style.display = isMotivationalQuotesEnabled ? "flex" : "none"; // Show/hide Daily Quote option based on whether quotes are enabled quotesOptions.classList.toggle("not-applicable", !isMotivationalQuotesEnabled); // Load quotes if motivational quotes are enabled if (isMotivationalQuotesEnabled) { loadAndDisplayQuote(false); } else { clearQuotesStorage(); } }; // Handle daily quote toggle changes newQuoteOnRefreshCheckbox.addEventListener("change", () => { const isDailyQuote = newQuoteOnRefreshCheckbox.checked; // Store as "newQuoteOnRefresh = false" when daily quote is ON (inverted) localStorage.setItem("dailyQuoteEnabled", !isDailyQuote); if (isDailyQuote) { // When switching to daily quote, store the current quote as the daily quote const currentQuote = quotesContainer.textContent; const currentAuthor = authorName.textContent; if (currentQuote && currentAuthor) { storeDailyQuote(currentLanguage, { quote: currentQuote, author: currentAuthor }); } } else { clearOldDailyQuotes(); localStorage.removeItem(getDailyQuoteKey(currentLanguage)); // When switching off daily quote, load a new quote loadAndDisplayQuote(false); } }); // Apply initial state updateMotivationalQuotesState(); // Event Listeners hideSearchWith.addEventListener("change", () => { searchWithContainer.style.display = "flex"; updateMotivationalQuotesState(); }); motivationalQuotesCheckbox.addEventListener("change", updateMotivationalQuotesState); }); ================================================ FILE: scripts/save-load-states.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ /* ------ Helper functions for saving and loading states ------ */ // Function to save checkbox state to localStorage function saveCheckboxState(key, checkbox) { localStorage.setItem(key, checkbox.checked ? "checked" : "unchecked"); } const bookmarkGridCheckbox = document.getElementById("bookmarkGridCheckbox"); // Function to load and apply checkbox state from localStorage function loadCheckboxState(key, checkbox) { const savedState = localStorage.getItem(key); checkbox.checked = savedState === "checked"; if (key === "bookmarkGridCheckboxState") { if (!savedState) { bookmarkGridCheckbox.click(); } else { bookmarkGridCheckbox.click(); bookmarkGridCheckbox.click(); } } } // Function to save display status to localStorage function saveDisplayStatus(key, displayStatus) { localStorage.setItem(key, displayStatus); } // Function to load and apply display status from localStorage function loadDisplayStatus(key, element) { const savedStatus = localStorage.getItem(key); if (savedStatus === "flex") { element.style.display = "flex"; } else { element.style.display = "none"; } } // Function to save activeness status to localStorage function saveActiveStatus(key, activeStatus) { localStorage.setItem(key, activeStatus); } // Function to load and apply activeness status from localStorage function loadActiveStatus(key, element) { const savedStatus = localStorage.getItem(key); if (savedStatus === "active") { element.classList.remove("inactive"); } else { element.classList.add("inactive"); } } ================================================ FILE: scripts/script.js ================================================ /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // ------------------------------------ Tips ------------------------------------ document.addEventListener("DOMContentLoaded", function () { // Hide tips that are not relevant to mobile if (!isDesktop) { document.querySelectorAll('.hideOnMobile').forEach(el => el.style.display = 'none'); } // Determine the correct key for adjustZoomInfo based on OS const adjustZoomInfo = document.getElementById("adjustZoomInfo"); let adjustZoomInfoText = translations[currentLanguage]?.adjustZoomInfo || translations["en"].adjustZoomInfo; if (isMac) { adjustZoomInfoText = adjustZoomInfoText.replace(/Ctrl/g, "⌘"); } adjustZoomInfo.textContent = adjustZoomInfoText; // Change browser theme info based on the user's browser const changeBrowserThemeInfo = document.getElementById("changeBrowserThemeInfo"); if (isFirefoxAll) { changeBrowserThemeInfo.innerHTML = translations[currentLanguage]?.firefoxThemeInfo || translations["en"].firefoxThemeInfo; } else if (isEdge) { changeBrowserThemeInfo.innerHTML = translations[currentLanguage]?.edgeThemeInfo || translations["en"].edgeThemeInfo; } else if (isBrave) { changeBrowserThemeInfo.innerHTML = translations[currentLanguage]?.braveThemeInfo || translations["en"].braveThemeInfo; } else { changeBrowserThemeInfo.innerHTML = translations[currentLanguage]?.chromeThemeInfo || translations["en"].chromeThemeInfo; } const firefoxHomepage = document.getElementById("firefoxHomepage"); const updateFirefoxHomepageInfo = document.getElementById("updateFirefoxHomepageInfo"); if (isFirefox) { firefoxHomepage.style.display = "block"; updateFirefoxHomepageInfo.innerHTML = translations[currentLanguage]?.updateFirefoxHomepageInfo || translations["en"].updateFirefoxHomepageInfo; } // Hide tips const tips = document.getElementById("tips"); const dontShowButton = document.getElementById("dontShowTips"); // Check if the user has previously disabled tips if (localStorage.getItem("hideTips") === "true") { tips.style.display = "none"; } // Hide tips and save preference when button is clicked dontShowButton.addEventListener("click", function () { tips.style.display = "none"; localStorage.setItem("hideTips", "true"); // Save preference }); }); // ------------------------------- Footer Toast ------------------------------- (function () { if (isFirefoxAll || !isDesktop) return; // Don't show on Firefox or mobile const TOAST_DURATION = 30 * 1000; // 30 seconds const STORAGE_KEY = 'chrome-footer-toast-shown'; const toast = document.getElementById('chromeFooterToast'); const progressBar = document.getElementById('toastProgressBar'); const closeBtn = document.getElementById('toastClose'); let progressInterval; let elapsedTime = 0; let lastTick = 0; let isPaused = false; function showToast() { // Check if toast has been shown before const hasShown = localStorage.getItem(STORAGE_KEY); if (hasShown) return; // Mark as shown localStorage.setItem(STORAGE_KEY, 'true'); // Show toast after brief delay setTimeout(() => { toast.classList.add('show'); startProgress(); }, 1500); } function hideToast() { toast.classList.remove('show'); clearInterval(progressInterval); } function startProgress() { lastTick = Date.now(); progressInterval = setInterval(() => { if (isPaused) return; const now = Date.now(); elapsedTime += now - lastTick; lastTick = now; const remaining = Math.max(0, 100 - (elapsedTime / TOAST_DURATION) * 100); progressBar.style.width = remaining + '%'; if (elapsedTime >= TOAST_DURATION) { hideToast(); } }, 50); } // Hover pause toast.addEventListener('mouseenter', () => { isPaused = true; }); toast.addEventListener('mouseleave', () => { isPaused = false; lastTick = Date.now(); }); closeBtn.addEventListener('click', hideToast); showToast(); })(); ================================================ FILE: scripts/search-suggestions.js ================================================ /* * Material You NewTab * Copyright (c) 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ // --------------------------------- Proxy --------------------------------- let proxyurl; document.addEventListener("DOMContentLoaded", () => { const userProxyInput = document.getElementById("userproxy"); const saveProxyButton = document.getElementById("saveproxy"); const savedProxy = localStorage.getItem("proxy"); const defaultProxyURL = "https://mynt-proxy.rhythmcorehq.com/proxy?url="; //Default proxy url if (savedProxy && savedProxy !== defaultProxyURL) { userProxyInput.value = savedProxy; } // Allow pressing Enter to save the proxy userProxyInput.addEventListener("keydown", (event) => { if (event.key === "Enter") { saveProxyButton.click(); } }); // Save the proxy to localStorage saveProxyButton.addEventListener("click", () => { proxyurl = userProxyInput.value.trim(); // If the input is empty, use the default proxy. if (proxyurl === "") { proxyurl = defaultProxyURL; } else { // Validate if input starts with "http://" or "https://" if (!(proxyurl.startsWith("http://") || proxyurl.startsWith("https://"))) { proxyurl = "https://" + proxyurl; } } // Set the proxy in localStorage, clear the input, and reload the page localStorage.setItem("proxy", proxyurl); userProxyInput.value = ""; location.reload(); }); // Determine which proxy URL to use proxyurl = savedProxy || defaultProxyURL; }); // ---------------------------- Search Suggestions ---------------------------- let lastInteractionBy = null; let originalSearchText = ""; // Store the original search text const resultBox = document.getElementById("resultBox"); // Show the result box function showResultBox() { resultBox.classList.add("show"); resultBox.style.display = "block"; } // Hide the result box function hideResultBox() { resultBox.classList.remove("show"); //resultBox.style.display = "none"; } showResultBox(); hideResultBox(); searchInput.addEventListener("input", async function () { const searchsuggestionscheckbox = document.getElementById("searchsuggestionscheckbox"); if (searchsuggestionscheckbox.checked) { const query = this.value; // Store original text when user starts typing originalSearchText = query; if (query.length > 0) { try { // Fetch autocomplete suggestions const suggestions = await getAutocompleteSuggestions(query); if (suggestions === "") { hideResultBox(); } else { // Clear the result box resultBox.innerHTML = ""; // Add suggestions to the result box suggestions.forEach((suggestion, index) => { const resultItem = document.createElement("div"); resultItem.classList.add("resultItem"); resultItem.textContent = suggestion; resultItem.setAttribute("data-index", index); resultItem.onclick = () => { performSearch(suggestion); }; resultItem.addEventListener("mouseenter", () => { // Remove existing highlight const currentlyActive = resultBox.querySelector(".active"); if (currentlyActive) currentlyActive.classList.remove("active"); // Mark this as active resultItem.classList.add("active"); lastInteractionBy = "mouse"; }); resultBox.appendChild(resultItem); }); // Check if the dropdown of search shortcut is open const dropdown = document.querySelector(".dropdown-content"); if (dropdown.style.display === "block") { dropdown.style.display = "none"; } showResultBox(); } } catch (error) { // Handle the error (if needed) } } else { hideResultBox(); } } }); searchInput.addEventListener("keydown", function (e) { const activeItem = resultBox.querySelector(".active"); let currentIndex = activeItem ? parseInt(activeItem.getAttribute("data-index")) : -1; if (resultBox.children.length > 0 && resultBox.classList.contains("show")) { if (e.key === "ArrowDown" || e.key === "ArrowUp") { e.preventDefault(); lastInteractionBy = "keyboard"; if (activeItem) { activeItem.classList.remove("active"); } // Calculate new index based on direction if (e.key === "ArrowDown") { currentIndex = (currentIndex + 1) % resultBox.children.length; } else { // ArrowUp currentIndex = (currentIndex - 1 + resultBox.children.length) % resultBox.children.length; } resultBox.children[currentIndex].classList.add("active"); // Ensure the active item is visible within the result box const activeElement = resultBox.children[currentIndex]; activeElement.scrollIntoView({ behavior: "smooth", block: "nearest" }); // Auto-complete the search input with selected suggestion const suggestionText = activeElement.textContent; this.value = suggestionText; } else if ((e.key === "ArrowRight" || e.key === "Tab") && activeItem && lastInteractionBy === "mouse") { // Check if cursor is at end const cursorAtEnd = this.selectionStart === this.value.length; if (cursorAtEnd) { e.preventDefault(); const suggestionText = activeItem.textContent; this.value = suggestionText; } } else if (e.key === "Enter") { e.preventDefault(); if (activeItem) { // Selected suggestion + Enter = search activeItem.click(); } else { // No selection, search with current input value performSearch(this.value); } } else if (e.key === "Escape") { e.preventDefault(); // Restore original search text this.value = originalSearchText; // Remove any active highlights if (activeItem) { activeItem.classList.remove("active"); } } } else if (e.key === "Enter") { // No suggestions available, search with current input e.preventDefault(); performSearch(this.value); } }); // Check for different browsers and return the corresponding client parameter function getClientParam() { if (isFirefox) return "firefox"; if (isOpera) return "opera"; if (isChromiumBased) return "chrome"; if (isSafari) return "safari"; return "firefox"; // Default to Firefox if the browser is not recognized } let lastRedditRequestTime = 0; async function getAutocompleteSuggestions(query) { const clientParam = getClientParam(); // Get the browser client parameter dynamically var selectedOption = document.querySelector('input[name="search-engine"]:checked').value; // 🔒 Throttle Reddit API calls const now = Date.now(); if (selectedOption === "engine7") { if (now - lastRedditRequestTime < 1000) { return []; // skip call if within 1 second } lastRedditRequestTime = now; } const searchSuggestionsAPI = { engine0: `https://duckduckgo.com/ac/?q=${encodeURIComponent(query)}&type=list`, engine1: `https://www.google.com/complete/search?client=${clientParam}&q=${encodeURIComponent(query)}`, engine2: `https://duckduckgo.com/ac/?q=${encodeURIComponent(query)}&type=list`, engine4: `https://search.brave.com/api/suggest?q=${encodeURIComponent(query)}&rich=true&source=web`, engine5: `https://www.google.com/complete/search?client=${clientParam}&ds=yt&q=${encodeURIComponent(query)}`, engine7: `https://www.reddit.com/search.json?q=${encodeURIComponent(query)}&sort=relevance&limit=15`, engine8: `https://${languageCode}.wikipedia.org/w/api.php?action=opensearch&search=${encodeURIComponent(query)}&format=json` }; const useproxyCheckbox = document.getElementById("useproxyCheckbox"); let apiUrl = searchSuggestionsAPI[selectedOption] || searchSuggestionsAPI["engine1"]; if (useproxyCheckbox.checked && selectedOption !== "engine7") { apiUrl = proxyurl + encodeURIComponent(apiUrl); } try { const response = await fetch(apiUrl); const data = await response.json(); if (selectedOption === "engine4") { const suggestions = data[1].map(item => { if (item.is_entity) { return `${item.q} - ${item.name} (${item.category ? item.category : "No category"})`; } else { return item.q; } }); return suggestions; } else if (selectedOption === "engine7") { const suggestions = []; if (data && data.data && data.data.children) { data.data.children.forEach(post => { if (post.data && post.data.title) { const subreddit = post.data.subreddit_name_prefixed; suggestions.push(`${post.data.title} (${subreddit})`); } }); } return suggestions; } else { return data[1]; } } catch (error) { console.error("Error fetching autocomplete suggestions:", error); return []; } } // Hide results when clicking outside document.addEventListener("click", function (event) { if (!searchbar.contains(event.target)) { hideResultBox(); } }); // ------------------------- Toggles -------------------------- document.addEventListener("DOMContentLoaded", function () { const searchsuggestionscheckbox = document.getElementById("searchsuggestionscheckbox"); const proxybypassField = document.getElementById("proxybypassField"); const proxyinputField = document.getElementById("proxyField"); const useproxyCheckbox = document.getElementById("useproxyCheckbox"); const searchSuggestionsHeader = document.getElementById("searchSuggestionsHeader"); const proxyOptions = document.querySelector(".proxyOptions"); // This function shows the proxy disclaimer. async function showProxyDisclaimer() { const message = translations[currentLanguage]?.ProxyDisclaimer || translations["en"].ProxyDisclaimer; return await confirmPrompt(message, agreeText, cancelText); } // Requests optional host permissions for suggestion APIs async function requestHostPermissions() { if (!chrome?.permissions?.request) return false; return new Promise((resolve) => { chrome.permissions.request({ origins: [ "https://www.google.com/complete/search?client=*", "https://duckduckgo.com/ac/?q=*", "https://search.brave.com/api/suggest?q=*", "https://*.wikipedia.org/w/api.php?action=opensearch&search=*" ] }, (granted) => { resolve(granted); }); }); } function applySearchSuggestionsState(enabled) { proxyOptions.classList.toggle("not-applicable", !enabled); proxybypassField.classList.toggle("inactive", !enabled); if (!enabled) { useproxyCheckbox.checked = false; saveCheckboxState("useproxyCheckboxState", useproxyCheckbox); proxyinputField.classList.add("inactive"); saveActiveStatus("proxyinputField", "inactive"); setTimeout(() => searchSuggestionsHeader.style.borderBottom = "none", 80); } else searchSuggestionsHeader.style.borderBottom = ""; } // Add change event listeners for the checkboxes searchsuggestionscheckbox.addEventListener("change", async function () { saveCheckboxState("searchsuggestionscheckboxState", searchsuggestionscheckbox); const enabled = searchsuggestionscheckbox.checked; applySearchSuggestionsState(enabled); if (enabled && !isFirefoxAll) { await requestHostPermissions(); } }); useproxyCheckbox.addEventListener("change", async function () { if (useproxyCheckbox.checked) { // Show the disclaimer and check the user's choice const userConfirmed = await showProxyDisclaimer(); if (userConfirmed) { // Only enable the proxy if the user confirmed saveCheckboxState("useproxyCheckboxState", useproxyCheckbox); proxyinputField.classList.remove("inactive"); saveActiveStatus("proxyinputField", "active"); } else { // Revert the checkbox state if the user did not confirm useproxyCheckbox.checked = false; } } else { // If the checkbox is unchecked, disable the proxy saveCheckboxState("useproxyCheckboxState", useproxyCheckbox); proxyinputField.classList.add("inactive"); saveActiveStatus("proxyinputField", "inactive"); } }); // Load and apply the saved checkbox states and display statuses loadCheckboxState("searchsuggestionscheckboxState", searchsuggestionscheckbox); loadCheckboxState("useproxyCheckboxState", useproxyCheckbox); loadActiveStatus("proxyinputField", proxyinputField); loadActiveStatus("proxybypassField", proxybypassField); applySearchSuggestionsState(searchsuggestionscheckbox.checked); }); ================================================ FILE: scripts/search.js ================================================ /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ const searchbar = document.getElementById("searchbar"); const searchInput = document.getElementById("searchQ"); const languageCode = (localStorage.getItem("selectedLanguage") || "en").slice(0, 2); const searchQueryURLs = { engine1: "https://www.google.com/search?q=", engine2: "https://duckduckgo.com/?q=", engine3: "https://bing.com/?q=", engine4: "https://search.brave.com/search?q=", engine5: "https://www.youtube.com/results?search_query=", engine6: "https://www.google.com/search?tbm=isch&q=", engine7: "https://www.reddit.com/search/?q=", engine8: `https://${languageCode}.wikipedia.org/wiki/Special:Search?search=`, engine9: "https://www.quora.com/search?q=" }; // Showing border or outline when you click on the searchbar searchbar.addEventListener("click", function (event) { event.stopPropagation(); searchbar.classList.add("active"); if (!event.target.closest(".dropdown-btn")) { searchInput.focus(); } }); document.addEventListener("click", function (event) { // Check if the clicked element is not the searchbar if (!searchbar.contains(event.target)) { searchbar.classList.remove("active"); } }); // Search mode function const searchWith = document.getElementById("searchWithHint"); const searchEngines = document.querySelectorAll(".searchEnginesContainer .search-engine"); const searchEnginesContainer = document.querySelector(".searchEnginesContainer"); let activeSearchMode = localStorage.getItem("activeSearchMode") || "search-with"; searchWith.addEventListener("click", function (event) { activeSearchMode = (activeSearchMode === "search-with") ? "search-on" : "search-with"; searchEnginesContainer.classList.toggle("show"); toggleSearchEngines(activeSearchMode); event.stopPropagation(); searchInput.focus(); searchbar.classList.add("active"); setTimeout(() => { searchEnginesContainer.classList.remove("show"); }, 300); }); function toggleSearchEngines(category) { const defaultItems = { "search-with": "engine0", "search-on": "engine5", }; const checkeditem = localStorage.getItem(`selectedSearchEngine-${category}`) || defaultItems[category]; const searchModeName = category === "search-with" ? "searchWithHint" : "searchOnHint"; searchWith.innerText = translations[currentLanguage]?.[searchModeName] || translations["en"][searchModeName]; searchEngines.forEach(engine => { if (engine.getAttribute("data-category") === category) { engine.style.display = "flex"; } else { engine.style.display = "none"; } if (engine.lastElementChild.value === checkeditem) { const radioBtn = engine.querySelector('input[type="radio"]'); radioBtn.checked = true; radioBtn.dispatchEvent(new Event("change")); } }); } // Search function const dropdown = document.querySelector(".dropdown-content"); dropdown.addEventListener("click", (event) => { if (dropdown.classList.contains("show")) { event.stopPropagation(); dropdown.classList.remove("show"); searchInput.focus(); } }); document.addEventListener("click", (event) => { if (dropdown.classList.contains("show")) { event.stopPropagation(); dropdown.classList.remove("show"); } }); document.querySelector(".dropdown-btn").addEventListener("click", function () { const resultBox = document.getElementById("resultBox"); if (resultBox.classList.toString().includes("show")) return; // Clear selected state and reset index when dropdown opens dropdownItems.forEach(item => item.classList.remove("selected")); selectedIndex = -1; dropdown.classList.toggle("show"); }); const enterBTN = document.getElementById("enterBtn"); const searchEngineRadio = document.getElementsByName("search-engine"); const searchDropdowns = document.querySelectorAll('[id$="-dropdown"]:not(*[data-default])'); const defaultEngine = document.querySelector('#default-dropdown-item div[id$="-dropdown"]'); const sortDropdown = () => { // Change the elements to the array const elements = Array.from(searchDropdowns); // Sort the dropdown const sortedDropdowns = elements.sort((a, b) => { const engineA = parseInt(a.getAttribute("data-engine"), 10); const engineB = parseInt(b.getAttribute("data-engine"), 10); return engineA - engineB; }) // get the parent const parent = sortedDropdowns[0]?.parentNode; // Append the items if parent exists. if (parent) { sortedDropdowns.forEach(item => parent.appendChild(item)); } } // This will add event listener for click in the search bar searchDropdowns.forEach(element => { element.addEventListener("click", () => { const engine = element.getAttribute("data-engine"); const radioButton = document.querySelector(`input[type="radio"][value="engine${engine}"]`); const selector = `*[data-engine-name=${element.getAttribute("data-engine-name")}]`; radioButton.checked = true; // Swap the dropdown and sort them swapDropdown(selector); sortDropdown() localStorage.setItem(`selectedSearchEngine-${radioButton.parentElement.dataset.category}`, radioButton.value); localStorage.setItem(`activeSearchMode`, radioButton.parentElement.dataset.category); }); }); // Make entire search-engine div clickable document.querySelectorAll(".search-engine").forEach((engineDiv) => { engineDiv.addEventListener("click", (event) => { event.stopPropagation(); const radioButton = engineDiv.querySelector('input[type="radio"]'); radioButton.checked = true; const radioButtonValue = radioButton.value.charAt(radioButton.value.length - 1); const selector = `[data-engine="${radioButtonValue}"]`; // Swap the dropdown swapDropdown(selector); sortDropdown(); localStorage.setItem(`selectedSearchEngine-${radioButton.parentElement.dataset.category}`, radioButton.value); localStorage.setItem(`activeSearchMode`, radioButton.parentElement.dataset.category); searchInput.focus(); searchbar.classList.add("active"); }); }); /** * Swap attributes and contents between the default engine and a selected element. * @param {HTMLElement} defaultEngine - The current default engine element. * @param {HTMLElement} selectedElement - The clicked or selected element. */ function swapDropdown(selectedElement) { // Swap innerHTML const element = document.querySelector(selectedElement); const tempHTML = defaultEngine.innerHTML; defaultEngine.innerHTML = element.innerHTML; element.innerHTML = tempHTML; // Swap attributes ["data-engine", "data-engine-name", "id"].forEach(attr => { const tempAttr = defaultEngine.getAttribute(attr); defaultEngine.setAttribute(attr, element.getAttribute(attr)); element.setAttribute(attr, tempAttr); }); } // Function to perform search function performSearch(query) { const selectedOption = document.querySelector('input[name="search-engine"]:checked').value; const searchTerm = query || searchInput.value; if (searchTerm !== "") { if (selectedOption === "engine0") { try { if (isFirefox) { browser.search.query({ text: searchTerm }); } else { chrome.search.query({ text: searchTerm }); } } catch (error) { // Fallback to Google if an error occurs var fallbackUrl = searchQueryURLs.engine1 + encodeURIComponent(searchTerm); window.location.href = fallbackUrl; } } else { var searchUrl = searchQueryURLs[selectedOption] + encodeURIComponent(searchTerm); window.location.href = searchUrl; } } } // Event listeners enterBTN.addEventListener("click", () => performSearch()); // Enter key handling is managed in the search suggestions keydown listener // Set selected search engine from local storage const storedSearchEngine = localStorage.getItem(`selectedSearchEngine-${activeSearchMode}`); toggleSearchEngines(activeSearchMode); if (storedSearchEngine) { // Find Serial Number - SN with the help of charAt. const storedSearchEngineSN = storedSearchEngine.charAt(storedSearchEngine.length - 1); const defaultDropdownSN = document.querySelector("*[data-default]").getAttribute("data-engine"); // check if the default selected search engine is same as the stored one. if (storedSearchEngineSN !== defaultDropdownSN) { // The following line will find out the appropriate dropdown for the selected search engine. const selector = `*[data-engine="${storedSearchEngineSN}"]`; swapDropdown(selector); sortDropdown(); } const selectedRadioButton = document.querySelector(`input[name="search-engine"][value="${storedSearchEngine}"]`); if (selectedRadioButton) { selectedRadioButton.checked = true; } } const dropdownItems = document.querySelectorAll(".dropdown-item:not(*[data-default])"); let selectedIndex = -1; // Function to update the selected item function updateSelection() { // let hasSelected = []; dropdownItems.forEach((item, index) => { item.addEventListener("mouseenter", () => { item.classList.add("selected"); }) item.addEventListener("mouseleave", () => { item.classList.remove("selected"); }) if (index === selectedIndex) { item.focus() item.classList.add("selected"); } else { item.focus() item.classList.remove("selected"); } }); } // Event listener for keydown events to navigate up/down document.querySelector(".dropdown").addEventListener("keydown", function (event) { if (dropdown.classList.contains("show")) { if (event.key === "ArrowDown") { event.preventDefault(); // Prevent the page from scrolling selectedIndex = (selectedIndex + 1) % dropdownItems.length; // Move down, loop around // Scroll the newly selected item into view const activeElement = dropdownItems[selectedIndex]; activeElement.scrollIntoView({ behavior: "smooth", block: "nearest" }); } else if (event.key === "ArrowUp") { event.preventDefault(); // Prevent the page from scrolling selectedIndex = (selectedIndex - 1 + dropdownItems.length) % dropdownItems.length; // Move up, loop around // Scroll the newly selected item into view const activeElement = dropdownItems[selectedIndex]; activeElement.scrollIntoView({ behavior: "smooth", block: "nearest" }); } else if (event.key === "Enter") { const selectedItem = document.querySelector(".dropdown-content .selected"); if (!selectedItem) return; const engine = selectedItem.getAttribute("data-engine"); const radioButton = document.querySelector(`input[type="radio"][value="engine${engine}"]`); radioButton.checked = true; // Swap the dropdown and sort them swapDropdown(`*[data-engine="${engine}"]`); sortDropdown(); localStorage.setItem("selectedSearchEngine", radioButton.value); // Close the dropdown after selection dropdown.classList.remove("show"); searchInput.focus(); } updateSelection(); } }); // Initial setup for highlighting updateSelection(); // Event listener for search engine radio buttons searchEngineRadio.forEach((radio) => { radio.addEventListener("change", () => { const selectedOption = document.querySelector('input[name="search-engine"]:checked'); localStorage.setItem(`selectedSearchEngine-${selectedOption.parentElement.dataset.category}`, selectedOption.value); localStorage.setItem(`activeSearchMode`, selectedOption.parentElement.dataset.category); }); }); /* ------ Event Listeners for Searchbar dropdown ------ */ const searchIconContainer = document.querySelectorAll(".searchIcon"); const showEngineContainer = () => { searchIconContainer[1].style.display = "none"; searchIconContainer[0].style.display = "block"; document.getElementById("search-with-container").style.visibility = "visible"; } const hideEngineContainer = () => { searchIconContainer[0].style.display = "none"; searchIconContainer[1].style.display = "block"; document.getElementById("search-with-container").style.visibility = "hidden"; } const initShortCutSwitch = (element) => { if (element.checked) { hideEngineContainer(); localStorage.setItem("showShortcutSwitch", true) } else { showEngineContainer(); localStorage.setItem("showShortcutSwitch", false) } } // Hiding Search Icon And Search With Options for Search switch shortcut const hideSearchWith = document.getElementById("shortcut_switchcheckbox"); hideSearchWith.addEventListener("change", (e) => { initShortCutSwitch(e.target); // Fetch active search mode from storage let activeSearchMode = localStorage.getItem("activeSearchMode") || "search-with"; toggleSearchEngines(activeSearchMode); // Get the selected search engine from localStorage const storedSearchEngine = localStorage.getItem(`selectedSearchEngine-${activeSearchMode}`); // Find the corresponding radio button const selectedRadioButton = document.querySelector(`input[name="search-engine"][value="${storedSearchEngine}"]`); selectedRadioButton.checked = true; // Ensure UI is updated properly const storedSearchEngineSN = storedSearchEngine.charAt(storedSearchEngine.length - 1); const selector = `*[data-engine="${storedSearchEngineSN}"]`; swapDropdown(selector); sortDropdown(); }); // Intialize shortcut switch if (localStorage.getItem("showShortcutSwitch")) { const isShortCutSwitchEnabled = localStorage.getItem("showShortcutSwitch").toString() === "true"; document.getElementById("shortcut_switchcheckbox").checked = isShortCutSwitchEnabled; if (isShortCutSwitchEnabled) { hideEngineContainer(); } else if (!isShortCutSwitchEnabled) { showEngineContainer() } } else { localStorage.setItem("showShortcutSwitch", false); } initShortCutSwitch(hideSearchWith); // Swipe/Scroll to change search engines let engineSwipeStartY = 0; let engineSwipeEndY = 0; let isEngineSwiping = false; let isEngineSwitching = false; let engineSwitchTimeout = null; let currentSearchEngineIndex = 0; const dropdownBtn = document.querySelector('.dropdown-btn'); // Get all search engines from both modes combined function getAllEngines() { return Array.from(searchEngines); } // Get current selected engine index from all engines function getCurrentSearchEngineIndex() { const allEngines = getAllEngines(); const selectedOption = document.querySelector('input[name="search-engine"]:checked'); return allEngines.findIndex(engine => engine.querySelector('input[type="radio"]').value === selectedOption.value ); } // Switch to next or previous engine function switchEngine(direction) { if (isEngineSwitching) return; const allEngines = getAllEngines(); if (allEngines.length <= 1) return; currentSearchEngineIndex = getCurrentSearchEngineIndex(); let newIndex; if (direction === 'next') { newIndex = (currentSearchEngineIndex + 1) % allEngines.length; } else { newIndex = (currentSearchEngineIndex - 1 + allEngines.length) % allEngines.length; } const newEngine = allEngines[newIndex]; const radioButton = newEngine.querySelector('input[type="radio"]'); // Store direction for CSS animation searchbar.setAttribute('data-switch-direction', direction); // Add transition class to searchbar searchbar.classList.add('engine-switching'); // Delay the actual swap until fade-out completes (45% of 400ms = 180ms) setTimeout(() => { radioButton.checked = true; const radioButtonValue = radioButton.value.charAt(radioButton.value.length - 1); const selector = `[data-engine="${radioButtonValue}"]`; swapDropdown(selector); sortDropdown(); localStorage.setItem(`selectedSearchEngine-${radioButton.parentElement.dataset.category}`, radioButton.value); localStorage.setItem(`activeSearchMode`, radioButton.parentElement.dataset.category); // Update the search mode hint text const newCategory = radioButton.parentElement.dataset.category; toggleSearchEngines(newCategory); }, 180); // Remove transition class after animation setTimeout(() => { searchbar.classList.remove('engine-switching'); searchbar.removeAttribute('data-switch-direction'); }, 400); // Prevent rapid scrolling isEngineSwitching = true; clearTimeout(engineSwitchTimeout); engineSwitchTimeout = setTimeout(() => { isEngineSwitching = false; }, 400); } // Touch event handlers for swipe dropdownBtn?.addEventListener('touchstart', (e) => { if (!hideSearchWith.checked || dropdown.classList.contains("show")) return; e.stopPropagation(); engineSwipeStartY = e.changedTouches[0].screenY; isEngineSwiping = false; }, { passive: true }); dropdownBtn?.addEventListener('touchmove', (e) => { if (!hideSearchWith.checked || dropdown.classList.contains("show")) return; e.preventDefault(); isEngineSwiping = true; }, { passive: false }); dropdownBtn?.addEventListener('touchend', (e) => { if (!hideSearchWith.checked || dropdown.classList.contains("show")) return; e.stopPropagation(); engineSwipeEndY = e.changedTouches[0].screenY; const swipeDistance = engineSwipeStartY - engineSwipeEndY; const swipeThreshold = 50; // Minimum distance for swipe if (isEngineSwiping && Math.abs(swipeDistance) >= swipeThreshold) { switchEngine(swipeDistance > 0 ? 'next' : 'prev'); } }, { passive: true }); // Mouse wheel event handler for scroll dropdownBtn?.addEventListener('wheel', (e) => { if (!hideSearchWith.checked || dropdown.classList.contains("show")) return; e.preventDefault(); e.stopPropagation(); switchEngine(e.deltaY > 0 ? 'next' : 'prev'); // Scroll down = next, Scroll up = previous }, { passive: false }); document.addEventListener("keydown", function (event) { // Prevent shortcut if modal, menu, or bookmarks sidebar is open const modalContainer = document.getElementById("prompt-modal-container"); if ( modalContainer?.style.display === "flex" || menuBar.style.display !== "none" || bookmarkSidebar.classList.contains("open") ) { return; } if (event.key === "/" && event.target.tagName !== "INPUT" && event.target.tagName !== "TEXTAREA" && event.target.isContentEditable !== true) { event.preventDefault(); searchInput.focus(); searchbar.classList.add("active"); } }); ================================================ FILE: scripts/shortcuts.js ================================================ /* * Material You New Tab * Copyright (c) 2024-2026 Prem, 2023-2025 XengShi * Licensed under the GNU General Public License v3.0 (GPL-3.0) */ document.addEventListener("DOMContentLoaded", function () { // Constants const MAX_SHORTCUTS = 50; const PLACEHOLDER = { get name() { return translations[currentLanguage]?.shortcutDefaultName || translations["en"].shortcutDefaultName; }, url: "https://github.com/prem-k-r/MaterialYouNewTab", get inputName() { return translations[currentLanguage]?.shortcutInputName || translations["en"].shortcutInputName; }, get inputUrl() { return translations[currentLanguage]?.shortcutInputUrl || translations["en"].shortcutInputUrl; }, get inputIcon() { return translations[currentLanguage]?.shortcutInputIcon || translations["en"].shortcutInputIcon; }, }; // DOM Elements const dom = { shortcuts: document.getElementById("shortcuts-section"), shortcutsCheckbox: document.getElementById("shortcutsCheckbox"), shortcutEditField: document.getElementById("shortcutEditField"), adaptiveIconField: document.getElementById("adaptiveIconField"), adaptiveIconToggle: document.getElementById("adaptiveIconToggle"), shortcutSettingsContainer: document.getElementById("shortcutList"), shortcutsContainer: document.getElementById("shortcutsContainer"), newShortcutButton: document.getElementById("newShortcutButton"), resetShortcutsButton: document.getElementById("resetButton"), }; // Preset Data const presets = [ { name: "YouTube", url: "youtube.com", domains: ["youtube.com", "m.youtube.com", "youtu.be"], svg: `` }, { name: "Gmail", url: "mail.google.com", domains: ["gmail.com", "mail.google.com"], svg: `` }, { name: "Telegram", url: "web.telegram.org", domains: ["telegram.org", "t.me", "web.telegram.org"], svg: `` }, { name: "WhatsApp", url: "web.whatsapp.com", domains: ["whatsapp.com", "web.whatsapp.com", "api.whatsapp.com"], svg: `` }, { name: "Twitter", url: "x.com", domains: ["twitter.com", "x.com"], svg: `` }, { name: "Discord", url: "discord.com/app", domains: ["discord.com", "discord.gg", "discordapp.com"], svg: `` } ]; // Cache for shortcuts data let shortcutsCache = []; // Initialization loadSettings(); setupEventListeners(); loadShortcuts(); // Loads all settings from localStorage and applies them function loadSettings() { loadCheckboxState("shortcutsCheckboxState", dom.shortcutsCheckbox); loadCheckboxState("adaptiveIconToggle", dom.adaptiveIconToggle); loadActiveStatus("shortcutEditField", dom.shortcutEditField); loadActiveStatus("adaptiveIconField", dom.adaptiveIconField); loadDisplayStatus("shortcutsDisplayStatus", dom.shortcuts); // Apply adaptive icon style if enabled if (dom.adaptiveIconToggle.checked) { dom.shortcutsContainer.classList.add("adaptive-icons"); } else { dom.shortcutsContainer.classList.remove("adaptive-icons"); } } // Sets up all event listeners function setupEventListeners() { // Checkbox events dom.shortcutsCheckbox.addEventListener("change", handleShortcutsToggle); dom.adaptiveIconToggle.addEventListener("change", handleAdaptiveIconToggle); // Button events dom.newShortcutButton.addEventListener("click", handleNewShortcutClick); dom.resetShortcutsButton.addEventListener("click", resetShortcuts); } // Handles the new shortcut button click with animation and focus let focusTimeoutId; function handleNewShortcutClick() { if (this.classList.contains("inactive")) return; const currentAmount = parseInt(localStorage.getItem("shortcutAmount")) || shortcutsCache.length; if (currentAmount >= MAX_SHORTCUTS) return; addNewShortcut(); // Scroll to the new shortcut and focus on the URL input const allEntries = document.querySelectorAll(".shortcutSettingsEntry"); const lastEntry = allEntries[allEntries.length - 1]; const urlInput = lastEntry.querySelector("input.URL"); urlInput.scrollIntoView({ behavior: "smooth", block: "center" }); clearTimeout(focusTimeoutId); const modalContainer = document.getElementById("prompt-modal-container"); focusTimeoutId = setTimeout(() => { if (modalContainer?.style.display !== "flex") urlInput.focus(); }, 800); } // Loads shortcuts from localStorage or uses presets if none exist function loadShortcuts() { const amount = localStorage.getItem("shortcutAmount") || presets.length; const deleteInactive = amount <= 1; shortcutsCache = []; for (let i = 0; i < amount; i++) { const name = localStorage.getItem(`shortcutName${i}`) || (presets[i] ? presets[i].name : PLACEHOLDER.name); const url = localStorage.getItem(`shortcutURL${i}`) || (presets[i] ? presets[i].url : PLACEHOLDER.url); const icon = localStorage.getItem(`shortcutIcon${i}`) || ""; shortcutsCache.push({ name, url, icon }); const entry = createShortcutEntry(name, url, icon, deleteInactive, i); dom.shortcutSettingsContainer.appendChild(entry); renderShortcut(name, url, icon, i); } // Disable new shortcut button if max reached if (amount >= MAX_SHORTCUTS) { dom.newShortcutButton.classList.add("inactive"); } setupDragAndDrop(); } // Creates a shortcut entry element for the settings panel function createShortcutEntry(name, url, iconUrl, deleteInactive, index) { const entry = document.createElement("div"); entry.className = "shortcutSettingsEntry"; entry.draggable = true; entry._index = index; entry.innerHTML = `
    `; const inputs = entry.querySelectorAll("input.shortcutName, input.URL, input.iconURL"); const uploadButton = entry.querySelector(".uploadCustomIconButton"); const fileInput = entry.querySelector(".iconFileInput"); const iconInput = entry.querySelector(".iconURL"); const deleteBtn = entry.querySelector(".shortcutDelete button"); attachInputListeners(inputs, entry); uploadButton.addEventListener("click", () => fileInput.click()); fileInput.addEventListener("change", async e => { const selectedFile = e.target.files?.[0]; if (!selectedFile) return; if (!selectedFile.type.startsWith("image/")) { const invalidFileTypeMessage = translations[currentLanguage]?.invalidFileTypeMessage || translations["en"]?.invalidFileTypeMessage; alertPrompt(invalidFileTypeMessage); fileInput.value = ""; return; } const maxIconBytes = 100 * 1024; if (selectedFile.size > maxIconBytes) { const iconFileTooLargeMessage = translations[currentLanguage]?.iconFileTooLargeMessage || translations["en"].iconFileTooLargeMessage; const fileSizeKB = localizeNumbers((selectedFile.size / 1024).toFixed(1), currentLanguage); const maxSizeKB = localizeNumbers((maxIconBytes / 1024).toFixed(0), currentLanguage); const message = iconFileTooLargeMessage .replace("{size}", fileSizeKB) .replace("{max}", maxSizeKB); alertPrompt(message); fileInput.value = ""; return; } function applyIcon(iconValue) { iconInput.value = iconValue; try { saveShortcut(entry); renderShortcut( entry.querySelector(".shortcutName").value, entry.querySelector(".URL").value, iconInput.value, entry._index ); } catch (err) { console.error("Failed to save icon:", err); iconInput.value = ""; } finally { fileInput.value = ""; } } const isSvgFile = selectedFile.type === "image/svg+xml"; if (isSvgFile) { const textReader = new FileReader(); textReader.onload = () => { const sanitized = sanitizeSvg(textReader.result); if (!sanitized) { alertPrompt(translations[currentLanguage]?.invalidSvgMessage || translations["en"]?.invalidSvgMessage); fileInput.value = ""; return; } applyIcon(sanitized); }; textReader.onerror = () => { console.error("Failed to read SVG file:", textReader.error); fileInput.value = ""; }; textReader.readAsText(selectedFile); } else { const reader = new FileReader(); reader.onload = () => applyIcon(reader.result); reader.onerror = () => { console.error("Failed to read selected file:", reader.error); fileInput.value = ""; }; reader.readAsDataURL(selectedFile); } }); deleteBtn.addEventListener("click", () => deleteShortcut(entry)); return entry; } function createShortcutElement(name, url, icon, index) { const normalizedUrl = normalizeUrl(url); const shortcut = document.createElement("div"); shortcut.className = "shortcuts"; shortcut._index = index; const link = document.createElement("a"); link.href = normalizedUrl; const logoContainer = document.createElement("div"); logoContainer.className = "shortcutLogoContainer"; const logo = getLogoHtml(name, normalizedUrl, icon); if (logo) logoContainer.appendChild(logo); const span = document.createElement("span"); span.className = "shortcut-name"; span.textContent = name; link.appendChild(logoContainer); link.appendChild(span); shortcut.appendChild(link); return shortcut; } // Renders a shortcut in the main view function renderShortcut(name, url, icon, index) { const shortcut = createShortcutElement(name, url, icon, index); if (index < dom.shortcutsContainer.children.length) { dom.shortcutsContainer.replaceChild(shortcut, dom.shortcutsContainer.children[index]); } else { dom.shortcutsContainer.appendChild(shortcut); } } // Escapes HTML to prevent XSS function escapeHtml(unsafe) { return unsafe.replace(/[&<>"']/g, match => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'", }[match])); } // Validates custom icon URL function isValidCustomIconUrl(url) { if (typeof url !== "string") return false; const trimmedUrl = url.trim(); if (trimmedUrl.includes(" ")) return false; const lowercaseUrl = trimmedUrl.toLowerCase(); return ( lowercaseUrl.startsWith("data:image/") || lowercaseUrl.startsWith("https://") || lowercaseUrl.startsWith("http://") ); } // Sanitizes raw SVG code, returns data URL or null if unsafe function sanitizeSvg(raw) { const trimmed = raw.trim(); const normalized = trimmed .replace(/^<\?xml[\s\S]*?\?>\s*/i, "") .replace(/^\s*/i, "") .replace(/^\s*/i, ""); if (!normalized.toLowerCase().startsWith("]/i, //
    MYNT

    MYNT Language Key Analysis Tool

    Compare translation keys against English

    Language Key Analysis Results

    This tool analyzes language keys across the MYNT project. Any language that has missing keys or contains keys not present in English is listed below.

    The following languages have keys that are missing compared to English.
    Some languages contain extra keys not present in English. Consider removing them for consistency.