├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── CODEOWNERS ├── contributing.md ├── dependabot.yml ├── issue_template.md └── workflows │ ├── block-merge-eol.yml │ ├── block-merge-freeze.yml │ ├── block-unconventional-commits.yml │ ├── command-compile.yml │ ├── dependabot-approve-merge.yml │ ├── fixup.yml │ ├── lint-eslint.yml │ ├── lint-info-xml.yml │ ├── lint-php-cs.yml │ ├── lint-php.yml │ ├── lint-stylelint.yml │ ├── node.yml │ ├── npm-audit-fix.yml │ ├── openapi.yml │ ├── performance.yml │ ├── phpunit-mysql.yml │ ├── phpunit-oci.yml │ ├── phpunit-pgsql.yml │ ├── phpunit-sqlite.yml │ ├── pr-feedback.yml │ ├── psalm.yml │ ├── reuse.yml │ ├── update-nextcloud-ocp-approve-merge.yml │ └── update-nextcloud-ocp.yml ├── .gitignore ├── .l10nignore ├── .php-cs-fixer.dist.php ├── .tx └── config ├── AUTHORS.md ├── COPYING ├── LICENSES ├── AGPL-3.0-only.txt ├── AGPL-3.0-or-later.txt ├── Apache-2.0.txt ├── BSD-2-Clause.txt ├── BSD-3-Clause.txt ├── CC0-1.0.txt ├── GPL-3.0-or-later.txt ├── ISC.txt ├── MIT.txt └── MPL-2.0.txt ├── Makefile ├── README.md ├── REUSE.toml ├── appinfo ├── info.xml └── routes.php ├── composer.json ├── composer.lock ├── css ├── BrowserStorage-CUymxkzr.chunk.css ├── NcSettingsSection-C76Kqeew-DH5FZz7o.chunk.css ├── NotificationsApp-r3hOqE_D.chunk.css ├── _plugin-vue2_normalizer-D9peD3JJ.chunk.css ├── main-D1MVrAjl.chunk.css ├── notifications-admin-settings.css ├── notifications-main.css ├── notifications-settings.css ├── settings-CZnvTP7p.chunk.css └── style-DmAX-VC0.chunk.css ├── docs ├── admin-notifications.md ├── notification-workflow.md ├── ocs-endpoint-v1.md ├── ocs-endpoint-v2.md ├── push-v2.md ├── screenshot.png └── screenshot.png.license ├── img ├── notification.ogg ├── notifications-dark.svg ├── notifications.png ├── notifications.svg └── talk.ogg ├── js ├── BrowserStorage-CSvx5SzD.chunk.mjs ├── BrowserStorage-CSvx5SzD.chunk.mjs.license ├── BrowserStorage-CSvx5SzD.chunk.mjs.map ├── BrowserStorage-CSvx5SzD.chunk.mjs.map.license ├── NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs ├── NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.license ├── NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.map ├── NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.map.license ├── NotificationsApp-CTKORUrM.chunk.mjs ├── NotificationsApp-CTKORUrM.chunk.mjs.license ├── NotificationsApp-CTKORUrM.chunk.mjs.map ├── NotificationsApp-CTKORUrM.chunk.mjs.map.license ├── _plugin-vue2_normalizer-DJtB2XH9.chunk.mjs ├── _plugin-vue2_normalizer-DJtB2XH9.chunk.mjs.license ├── _plugin-vue2_normalizer-DJtB2XH9.chunk.mjs.map ├── _plugin-vue2_normalizer-DJtB2XH9.chunk.mjs.map.license ├── index-BEiTiEVI.chunk.mjs ├── index-BEiTiEVI.chunk.mjs.license ├── index-BEiTiEVI.chunk.mjs.map ├── index-BEiTiEVI.chunk.mjs.map.license ├── notifications-admin-settings.mjs ├── notifications-admin-settings.mjs.license ├── notifications-admin-settings.mjs.map ├── notifications-admin-settings.mjs.map.license ├── notifications-main.mjs ├── notifications-main.mjs.license ├── notifications-main.mjs.map ├── notifications-main.mjs.map.license ├── notifications-settings.mjs ├── notifications-settings.mjs.license ├── notifications-settings.mjs.map ├── notifications-settings.mjs.map.license ├── style-Cs268SVN.chunk.mjs ├── style-Cs268SVN.chunk.mjs.license ├── style-Cs268SVN.chunk.mjs.map ├── style-Cs268SVN.chunk.mjs.map.license ├── vendor.LICENSE.txt ├── vite-preload-helper-CpjhnH87.chunk.mjs ├── vite-preload-helper-CpjhnH87.chunk.mjs.license ├── vite-preload-helper-CpjhnH87.chunk.mjs.map └── vite-preload-helper-CpjhnH87.chunk.mjs.map.license ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── an.js ├── an.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── be.js ├── be.json ├── bg.js ├── bg.json ├── bn_BD.js ├── bn_BD.json ├── br.js ├── br.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── cy_GB.js ├── cy_GB.json ├── da.js ├── da.json ├── de.js ├── de.json ├── de_DE.js ├── de_DE.json ├── el.js ├── el.json ├── en_GB.js ├── en_GB.json ├── eo.js ├── eo.json ├── es.js ├── es.json ├── es_419.js ├── es_419.json ├── es_AR.js ├── es_AR.json ├── es_CL.js ├── es_CL.json ├── es_CO.js ├── es_CO.json ├── es_CR.js ├── es_CR.json ├── es_DO.js ├── es_DO.json ├── es_EC.js ├── es_EC.json ├── es_GT.js ├── es_GT.json ├── es_HN.js ├── es_HN.json ├── es_MX.js ├── es_MX.json ├── es_NI.js ├── es_NI.json ├── es_PA.js ├── es_PA.json ├── es_PE.js ├── es_PE.json ├── es_PR.js ├── es_PR.json ├── es_PY.js ├── es_PY.json ├── es_SV.js ├── es_SV.json ├── es_UY.js ├── es_UY.json ├── et_EE.js ├── et_EE.json ├── eu.js ├── eu.json ├── fa.js ├── fa.json ├── fi.js ├── fi.json ├── fo.js ├── fo.json ├── fr.js ├── fr.json ├── ga.js ├── ga.json ├── gd.js ├── gd.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hi_IN.js ├── hi_IN.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── hy.js ├── hy.json ├── ia.js ├── ia.json ├── id.js ├── id.json ├── ig.js ├── ig.json ├── is.js ├── is.json ├── it.js ├── it.json ├── ja.js ├── ja.json ├── ka.js ├── ka.json ├── ka_GE.js ├── ka_GE.json ├── kab.js ├── kab.json ├── km.js ├── km.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lo.js ├── lo.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── mr.js ├── mr.json ├── ms_MY.js ├── ms_MY.json ├── my.js ├── my.json ├── nb.js ├── nb.json ├── ne.js ├── ne.json ├── nl.js ├── nl.json ├── nn_NO.js ├── nn_NO.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── ps.js ├── ps.json ├── pt_BR.js ├── pt_BR.json ├── pt_PT.js ├── pt_PT.json ├── ro.js ├── ro.json ├── ru.js ├── ru.json ├── sc.js ├── sc.json ├── si.js ├── si.json ├── sk.js ├── sk.json ├── sl.js ├── sl.json ├── sq.js ├── sq.json ├── sr.js ├── sr.json ├── sr@latin.js ├── sr@latin.json ├── sv.js ├── sv.json ├── ta.js ├── ta.json ├── th.js ├── th.json ├── tk.js ├── tk.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── uz.js ├── uz.json ├── vi.js ├── vi.json ├── zh_CN.js ├── zh_CN.json ├── zh_HK.js ├── zh_HK.json ├── zh_TW.js └── zh_TW.json ├── lib ├── App.php ├── AppInfo │ └── Application.php ├── BackgroundJob │ ├── GenerateUserSettings.php │ └── SendNotificationMails.php ├── Capabilities.php ├── Command │ ├── Delete.php │ ├── Generate.php │ └── TestPush.php ├── Controller │ ├── APIController.php │ ├── EndpointController.php │ ├── PushController.php │ └── SettingsController.php ├── Exceptions │ └── NotificationNotFoundException.php ├── FakeUser.php ├── Handler.php ├── Listener │ ├── AddMissingIndicesListener.php │ ├── BeforeTemplateRenderedListener.php │ ├── PostLoginListener.php │ ├── UserCreatedListener.php │ └── UserDeletedListener.php ├── MailNotifications.php ├── Migration │ ├── Version2004Date20190107135757.php │ ├── Version2010Date20210218082811.php │ ├── Version2010Date20210218082855.php │ ├── Version2011Date20210930134607.php │ └── Version2011Date20220826074907.php ├── Model │ ├── Settings.php │ └── SettingsMapper.php ├── Notifier │ └── AdminNotifications.php ├── Push.php ├── ResponseDefinitions.php ├── Service │ └── ClientService.php └── Settings │ ├── Admin.php │ ├── AdminSection.php │ ├── Personal.php │ ├── PersonalSection.php │ └── SetupWarningOnRateLimitReached.php ├── openapi-administration.json ├── openapi-full.json ├── openapi-push.json ├── openapi.json ├── package-lock.json ├── package.json ├── psalm.xml ├── rector.php ├── src ├── Components │ ├── Action.vue │ ├── IconNotification.vue │ ├── Notification.vue │ └── Parameters │ │ ├── DefaultParameter.vue │ │ ├── File.vue │ │ └── User.vue ├── NotificationsApp.vue ├── adminSettings.js ├── main.js ├── services │ ├── BrowserStorage.js │ ├── notificationsService.js │ └── webNotificationsService.js ├── settings.js ├── styles │ └── styles.scss ├── utils │ └── datetime.js └── views │ ├── AdminSettings.vue │ └── UserSettings.vue ├── stylelint.config.js ├── templates └── settings │ ├── admin.php │ └── personal.php ├── tests ├── Integration │ ├── app │ │ ├── appinfo │ │ │ ├── info.xml │ │ │ └── routes.php │ │ └── lib │ │ │ ├── AppInfo │ │ │ └── Application.php │ │ │ ├── Controller │ │ │ └── EndpointController.php │ │ │ └── Notifier.php │ ├── base-query-count.txt │ ├── base-query-list.txt │ ├── composer.json │ ├── composer.lock │ ├── config │ │ └── behat.yml │ ├── features │ │ ├── admin-notification-v2.feature │ │ ├── bootstrap │ │ │ ├── CommandLineTrait.php │ │ │ └── FeatureContext.php │ │ ├── cli-notification.feature │ │ ├── delete-notifications-v1.feature │ │ ├── delete-notifications-v2.feature │ │ ├── exists-notifications-v2.feature │ │ ├── notifications-content-v1.feature │ │ ├── notifications-content-v2.feature │ │ ├── push-registration.feature │ │ ├── statuscodes-v1.feature │ │ └── statuscodes-v2.feature │ └── run.sh ├── Unit │ ├── AppInfo │ │ ├── ApplicationTest.php │ │ └── RoutesTest.php │ ├── AppTest.php │ ├── CapabilitiesTest.php │ ├── Command │ │ └── GenerateTest.php │ ├── Controller │ │ ├── APIControllerTest.php │ │ ├── EndpointControllerTest.php │ │ └── PushControllerTest.php │ ├── HandlerTest.php │ ├── Notifier │ │ └── NotifierTest.php │ ├── PushTest.php │ ├── bootstrap.php │ └── phpunit.xml ├── psalm-baseline.xml └── stubs │ └── oc_hooks_emitter.php ├── vendor-bin ├── csfixer │ ├── composer.json │ └── composer.lock ├── openapi-extractor │ ├── composer.json │ └── composer.lock ├── phpunit │ ├── composer.json │ └── composer.lock ├── psalm │ ├── composer.json │ └── composer.lock └── rector │ ├── composer.json │ └── composer.lock └── vite.config.mjs /.eslintignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | /js/* 4 | /tests/* 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | module.exports = { 6 | extends: [ 7 | '@nextcloud', 8 | ], 9 | globals: { 10 | }, 11 | rules: { 12 | 'no-control-regex': 'warn', 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | /js/*.js binary 4 | /js/*.js.map binary 5 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | /appinfo/info.xml @Antreesy @nickvergessen 2 | * @nickvergessen 3 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | ## Submitting issues 2 | 3 | If you have questions about how to install or use Nextcloud, please direct these to our [forum][forum]. We are also available on [IRC][irc]. 4 | 5 | ### Short version 6 | 7 | * The [**issue template can be found here**][template]. Please always use the issue template when reporting issues. 8 | 9 | ### Guidelines 10 | * Please search the existing issues first, it's likely that your issue was already reported or even fixed. 11 | - Go to one of the repositories, click "issues" and type any word in the top search/command bar. 12 | - You can also filter by appending e. g. "state:open" to the search string. 13 | - More info on [search syntax within github](https://help.github.com/articles/searching-issues) 14 | * This repository ([Notifications](https://github.com/nextcloud/notifications/issues)) is *only* for issues within the Nextcloud Notifications code. 15 | * __SECURITY__: Report any potential security bug to us via [our HackerOne page](https://hackerone.com/nextcloud) or security@nextcloud.com following our [security policy](https://nextcloud.com/security/) instead of filing an issue in our bug tracker. 16 | * Report the issue using our [template][template], it includes all the information we need to track down the issue. 17 | 18 | Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. 19 | 20 | [template]: https://raw.github.com/nextcloud/server/master/issue_template.md 21 | [forum]: https://help.nextcloud.com/ 22 | [irc]: https://webchat.freenode.net/?channels=nextcloud 23 | 24 | ### Contribute Code and translations 25 | Please check [server's contribution guidelines](https://github.com/nextcloud/server/blob/master/CONTRIBUTING.md#contributing-to-source-code) for further information about contributing code and translations. 26 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 8 | ### Steps to reproduce 9 | 1. 10 | 2. 11 | 3. 12 | 13 | ### Expected behaviour 14 | Tell us what should happen 15 | 16 | ### Actual behaviour 17 | Tell us what happens instead 18 | 19 | ### Server configuration 20 | 23 | 24 | **Operating system**: 25 | 26 | **Web server:** 27 | 28 | **Database:** 29 | 30 | **PHP version:** 31 | 32 | **Nextcloud version:** (see Nextcloud admin page) 33 | 34 | **Where did you install Nextcloud from:** 35 | 36 | **Signing status:** 37 | 38 | ``` 39 | Login as admin user into your Nextcloud and access 40 | http://example.com/index.php/settings/integrity/failed 41 | paste the results here. 42 | ``` 43 | 44 | **List of activated apps:** 45 | 46 | ``` 47 | If you have access to your command line run e.g.: 48 | sudo -u www-data php occ app:list 49 | from within your Nextcloud installation folder 50 | ``` 51 | 52 | **Nextcloud configuration:** 53 | 54 | ``` 55 | If you have access to your command line run e.g.: 56 | sudo -u www-data php occ config:list system 57 | from within your Nextcloud installation folder 58 | 59 | or 60 | 61 | Insert your config.php content here 62 | Make sure to remove all sensitive content such as passwords. (e.g. database password, passwordsalt, secret, smtp password, …) 63 | ``` 64 | 65 | **Are you using an external user-backend, if yes which one:** LDAP/ActiveDirectory/Webdav/... 66 | 67 | ### Client configuration 68 | **Browser:** 69 | 70 | **Operating system:** 71 | 72 | ### Logs 73 | 74 | #### Nextcloud log (data/nextcloud.log) 75 | ``` 76 | Insert your Nextcloud log here 77 | ``` 78 | 79 | #### Browser log 80 | ``` 81 | Insert your browser log here, this could for example include: 82 | 83 | a) The javascript console log 84 | b) The network log 85 | c) ... 86 | ``` 87 | -------------------------------------------------------------------------------- /.github/workflows/block-merge-eol.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block merges for EOL 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: block-merge-eol-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | block-merges-eol: 22 | name: Block merges for EOL branches 23 | 24 | # Only run on stableXX branches 25 | if: startsWith( github.base_ref, 'stable') 26 | runs-on: ubuntu-latest-low 27 | 28 | steps: 29 | - name: Set server major version environment 30 | uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 31 | with: 32 | github-token: ${{secrets.GITHUB_TOKEN}} 33 | script: | 34 | const regex = /^stable(\d+)$/ 35 | const baseRef = context.payload.pull_request.base.ref 36 | const match = baseRef.match(regex) 37 | if (match) { 38 | console.log('Setting server_major to ' + match[1]); 39 | core.exportVariable('server_major', match[1]); 40 | console.log('Setting current_month to ' + (new Date()).toISOString().substr(0, 7)); 41 | core.exportVariable('current_month', (new Date()).toISOString().substr(0, 7)); 42 | } 43 | 44 | - name: Checking if server ${{ env.server_major }} is EOL 45 | if: ${{ env.server_major != '' }} 46 | run: | 47 | curl -s https://raw.githubusercontent.com/nextcloud-releases/updater_server/production/config/major_versions.json \ 48 | | jq '.["${{ env.server_major }}"]["eol"] // "9999-99" | . >= "${{ env.current_month }}"' \ 49 | | grep -q true 50 | -------------------------------------------------------------------------------- /.github/workflows/block-merge-freeze.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block merges during freezes 10 | 11 | on: 12 | pull_request: 13 | types: [opened, ready_for_review, reopened, synchronize] 14 | 15 | permissions: 16 | contents: read 17 | 18 | concurrency: 19 | group: block-merge-freeze-${{ github.head_ref || github.run_id }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | block-merges-during-freeze: 24 | name: Block merges during freezes 25 | 26 | if: github.event.pull_request.draft == false 27 | 28 | runs-on: ubuntu-latest-low 29 | 30 | steps: 31 | - name: Register server reference to fallback to master branch 32 | uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 33 | with: 34 | github-token: ${{secrets.GITHUB_TOKEN}} 35 | script: | 36 | const baseRef = context.payload.pull_request.base.ref 37 | if (baseRef === 'main' || baseRef === 'master') { 38 | core.exportVariable('server_ref', 'master'); 39 | console.log('Setting server_ref to master'); 40 | } else { 41 | const regex = /^stable(\d+)$/ 42 | const match = baseRef.match(regex) 43 | if (match) { 44 | core.exportVariable('server_ref', match[0]); 45 | console.log('Setting server_ref to ' + match[0]); 46 | } else { 47 | console.log('Not based on master/main/stable*, so skipping freeze check'); 48 | } 49 | } 50 | 51 | - name: Download version.php from ${{ env.server_ref }} 52 | if: ${{ env.server_ref != '' }} 53 | run: curl 'https://raw.githubusercontent.com/nextcloud/server/${{ env.server_ref }}/version.php' --output version.php 54 | 55 | - name: Run check 56 | if: ${{ env.server_ref != '' }} 57 | run: cat version.php | grep 'OC_VersionString' | grep -i -v 'RC' 58 | -------------------------------------------------------------------------------- /.github/workflows/block-unconventional-commits.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block unconventional commits 10 | 11 | on: 12 | pull_request: 13 | types: [opened, ready_for_review, reopened, synchronize] 14 | 15 | permissions: 16 | contents: read 17 | 18 | concurrency: 19 | group: block-unconventional-commits-${{ github.head_ref || github.run_id }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | block-unconventional-commits: 24 | name: Block unconventional commits 25 | 26 | runs-on: ubuntu-latest-low 27 | 28 | steps: 29 | - name: Checkout 30 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 31 | with: 32 | persist-credentials: false 33 | 34 | - uses: webiny/action-conventional-commits@8bc41ff4e7d423d56fa4905f6ff79209a78776c7 # v1.3.0 35 | with: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | -------------------------------------------------------------------------------- /.github/workflows/dependabot-approve-merge.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Dependabot 10 | 11 | on: 12 | pull_request_target: # zizmor: ignore[dangerous-triggers] 13 | branches: 14 | - main 15 | - master 16 | - stable* 17 | 18 | permissions: 19 | contents: read 20 | 21 | concurrency: 22 | group: dependabot-approve-merge-${{ github.head_ref || github.run_id }} 23 | cancel-in-progress: true 24 | 25 | jobs: 26 | auto-approve-merge: 27 | if: github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'renovate[bot]' 28 | runs-on: ubuntu-latest-low 29 | permissions: 30 | # for hmarr/auto-approve-action to approve PRs 31 | pull-requests: write 32 | 33 | steps: 34 | - name: Disabled on forks 35 | if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} 36 | run: | 37 | echo 'Can not approve PRs from forks' 38 | exit 1 39 | 40 | # GitHub actions bot approve 41 | - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 42 | with: 43 | github-token: ${{ secrets.GITHUB_TOKEN }} 44 | 45 | # Nextcloud bot approve and merge request 46 | - uses: ahmadnassri/action-dependabot-auto-merge@45fc124d949b19b6b8bf6645b6c9d55f4f9ac61a # v2 47 | with: 48 | target: minor 49 | github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }} 50 | -------------------------------------------------------------------------------- /.github/workflows/fixup.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block fixup and squash commits 10 | 11 | on: 12 | pull_request: 13 | types: [opened, ready_for_review, reopened, synchronize] 14 | 15 | permissions: 16 | contents: read 17 | 18 | concurrency: 19 | group: fixup-${{ github.head_ref || github.run_id }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | commit-message-check: 24 | if: github.event.pull_request.draft == false 25 | 26 | permissions: 27 | pull-requests: write 28 | name: Block fixup and squash commits 29 | 30 | runs-on: ubuntu-latest-low 31 | 32 | steps: 33 | - name: Run check 34 | uses: skjnldsv/block-fixup-merge-action@c138ea99e45e186567b64cf065ce90f7158c236a # v2 35 | with: 36 | repo-token: ${{ secrets.GITHUB_TOKEN }} 37 | -------------------------------------------------------------------------------- /.github/workflows/lint-info-xml.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint info.xml 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-info-xml-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | xml-linters: 22 | runs-on: ubuntu-latest-low 23 | 24 | name: info.xml lint 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Download schema 32 | run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd 33 | 34 | - name: Lint info.xml 35 | uses: ChristophWurst/xmllint-action@36f2a302f84f8c83fceea0b9c59e1eb4a616d3c1 # v1.2 36 | with: 37 | xml-file: ./appinfo/info.xml 38 | xml-schema-file: ./info.xsd 39 | -------------------------------------------------------------------------------- /.github/workflows/lint-php-cs.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint php-cs 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-php-cs-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | lint: 22 | runs-on: ubuntu-latest 23 | 24 | name: php-cs 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 29 | with: 30 | persist-credentials: false 31 | 32 | - name: Get php version 33 | id: versions 34 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 35 | 36 | - name: Set up php${{ steps.versions.outputs.php-min }} 37 | uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 38 | with: 39 | php-version: ${{ steps.versions.outputs.php-min }} 40 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 41 | coverage: none 42 | ini-file: development 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | 46 | - name: Install dependencies 47 | run: | 48 | composer remove nextcloud/ocp --dev --no-scripts 49 | composer i 50 | 51 | - name: Lint 52 | run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 ) 53 | -------------------------------------------------------------------------------- /.github/workflows/lint-stylelint.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint stylelint 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-stylelint-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | lint: 22 | runs-on: ubuntu-latest 23 | 24 | name: stylelint 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 29 | with: 30 | persist-credentials: false 31 | 32 | - name: Read package.json node and npm engines version 33 | uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 34 | id: versions 35 | with: 36 | fallbackNode: '^20' 37 | fallbackNpm: '^10' 38 | 39 | - name: Set up node ${{ steps.versions.outputs.nodeVersion }} 40 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 41 | with: 42 | node-version: ${{ steps.versions.outputs.nodeVersion }} 43 | 44 | - name: Set up npm ${{ steps.versions.outputs.npmVersion }} 45 | run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' 46 | 47 | - name: Install dependencies 48 | env: 49 | CYPRESS_INSTALL_BINARY: 0 50 | run: npm ci 51 | 52 | - name: Lint 53 | run: npm run stylelint 54 | -------------------------------------------------------------------------------- /.github/workflows/psalm.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Static analysis 10 | 11 | on: pull_request 12 | 13 | concurrency: 14 | group: psalm-${{ github.head_ref || github.run_id }} 15 | cancel-in-progress: true 16 | 17 | permissions: 18 | contents: read 19 | 20 | jobs: 21 | static-analysis: 22 | runs-on: ubuntu-latest 23 | 24 | name: static-psalm-analysis 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Get php version 32 | id: versions 33 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 34 | 35 | - name: Check enforcement of minimum PHP version ${{ steps.versions.outputs.php-min }} in psalm.xml 36 | run: grep 'phpVersion="${{ steps.versions.outputs.php-min }}' psalm.xml 37 | 38 | - name: Set up php${{ steps.versions.outputs.php-available }} 39 | uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 40 | with: 41 | php-version: ${{ steps.versions.outputs.php-available }} 42 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 43 | coverage: none 44 | ini-file: development 45 | # Temporary workaround for missing pcntl_* in PHP 8.3 46 | ini-values: disable_functions= 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | 50 | - name: Install dependencies 51 | run: | 52 | composer remove nextcloud/ocp --dev --no-scripts 53 | composer i 54 | 55 | - name: Install nextcloud/ocp 56 | run: composer require --dev nextcloud/ocp:dev-${{ steps.versions.outputs.branches-max }} --ignore-platform-reqs --with-dependencies 57 | 58 | - name: Run coding standards check 59 | run: composer run psalm -- --threads=1 --monochrome --no-progress --output-format=github 60 | -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | 6 | # SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. 7 | # 8 | # SPDX-License-Identifier: CC0-1.0 9 | 10 | name: REUSE Compliance Check 11 | 12 | on: [pull_request] 13 | 14 | permissions: 15 | contents: read 16 | 17 | jobs: 18 | reuse-compliance-check: 19 | runs-on: ubuntu-latest-low 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 23 | with: 24 | persist-credentials: false 25 | 26 | - name: REUSE Compliance Check 27 | uses: fsfe/reuse-action@bb774aa972c2a89ff34781233d275075cbddf542 # v5.0.0 28 | -------------------------------------------------------------------------------- /.github/workflows/update-nextcloud-ocp-approve-merge.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Auto approve nextcloud/ocp 10 | 11 | on: 12 | pull_request_target: # zizmor: ignore[dangerous-triggers] 13 | branches: 14 | - main 15 | - master 16 | - stable* 17 | 18 | permissions: 19 | contents: read 20 | 21 | concurrency: 22 | group: update-nextcloud-ocp-approve-merge-${{ github.head_ref || github.run_id }} 23 | cancel-in-progress: true 24 | 25 | jobs: 26 | auto-approve-merge: 27 | if: github.actor == 'nextcloud-command' 28 | runs-on: ubuntu-latest-low 29 | permissions: 30 | # for hmarr/auto-approve-action to approve PRs 31 | pull-requests: write 32 | # for alexwilson/enable-github-automerge-action to approve PRs 33 | contents: write 34 | 35 | steps: 36 | - name: Disabled on forks 37 | if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} 38 | run: | 39 | echo 'Can not approve PRs from forks' 40 | exit 1 41 | 42 | - uses: mdecoleman/pr-branch-name@55795d86b4566d300d237883103f052125cc7508 # v3.0.0 43 | id: branchname 44 | with: 45 | repo-token: ${{ secrets.GITHUB_TOKEN }} 46 | 47 | # GitHub actions bot approve 48 | - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 49 | if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') 50 | with: 51 | github-token: ${{ secrets.GITHUB_TOKEN }} 52 | 53 | # Enable GitHub auto merge 54 | - name: Auto merge 55 | uses: alexwilson/enable-github-automerge-action@56e3117d1ae1540309dc8f7a9f2825bc3c5f06ff # v2.0.0 56 | if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') 57 | with: 58 | github-token: ${{ secrets.GITHUB_TOKEN }} 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: none 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | # just sane ignores 5 | .*.sw[po] 6 | *.bak 7 | *.BAK 8 | *~ 9 | *.orig 10 | *.class 11 | .cvsignore 12 | Thumbs.db 13 | *.py[co] 14 | _darcs/* 15 | CVS/* 16 | .svn/* 17 | RCS/* 18 | *.backup* 19 | 20 | # kdevelop 21 | .kdev 22 | *.kdev4 23 | *.kate-swp 24 | 25 | # Lokalize 26 | *lokalize* 27 | 28 | # eclipse 29 | .project 30 | .settings 31 | 32 | # netbeans 33 | nbproject 34 | 35 | # phpStorm 36 | .idea 37 | *.iml 38 | 39 | # geany 40 | *.geany 41 | 42 | # Cloud9IDE 43 | .settings.xml 44 | .c9revisions 45 | 46 | # vim ex mode 47 | .vimrc 48 | 49 | # Mac OS 50 | .DS_Store 51 | 52 | # WebFinger 53 | .well-known 54 | /.buildpath 55 | 56 | # WebPack 57 | /node_modules 58 | 59 | # Tests - auto-generated files 60 | /tests/Unit/coverage* 61 | /tests/Unit/clover.xml 62 | /tests/Unit/js/node_modules 63 | /tests/Unit/.phpunit.cache 64 | /tests/Unit/.phpunit.result.cache 65 | /.php-cs-fixer.cache 66 | 67 | /tests/Integration/output 68 | /tests/Integration/vendor 69 | 70 | # Build related files 71 | /npm-debug.log 72 | /build 73 | /vendor 74 | /vendor-bin/*/vendor 75 | -------------------------------------------------------------------------------- /.l10nignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | # compiled vue templates 4 | js/ 5 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 16 | ->notPath('build') 17 | ->notPath('l10n') 18 | ->notPath('node_modules') 19 | ->notPath('src') 20 | ->notPath('vendor') 21 | ->in(__DIR__); 22 | return $config; 23 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk 4 | 5 | [o:nextcloud:p:nextcloud:r:notifications] 6 | file_filter = translationfiles//notifications.po 7 | source_file = translationfiles/templates/notifications.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | 5 | # Authors 6 | 7 | - Daniel Kesselberg 8 | - Joas Schilling 9 | - Julien Barnoin 10 | - Kate Döen 11 | - Nikita Toponen 12 | - Thomas Müller 13 | - Nextcloud GmbH 14 | - ownCloud, Inc. 15 | -------------------------------------------------------------------------------- /LICENSES/BSD-2-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /LICENSES/BSD-3-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) . 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 10 | 11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 12 | -------------------------------------------------------------------------------- /LICENSES/ISC.txt: -------------------------------------------------------------------------------- 1 | ISC License: 2 | 3 | Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") 4 | Copyright (c) 1995-2003 by Internet Software Consortium 5 | 6 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 9 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | app_name=notifications 5 | 6 | project_dir=$(CURDIR)/../$(app_name) 7 | build_dir=$(CURDIR)/build 8 | source_dir=$(build_dir)/$(app_name) 9 | sign_dir=$(build_dir)/sign 10 | composer=$(shell which composer 2> /dev/null) 11 | 12 | all: dev-setup build-js-production 13 | 14 | dev-setup: clean clean-dev npm-init 15 | 16 | # Installs and updates the composer dependencies. If composer is not installed 17 | # a copy is fetched from the web 18 | composer: 19 | ifeq (, $(composer)) 20 | @echo "No composer command available, downloading a copy from the web" 21 | mkdir -p $(build_tools_directory) 22 | curl -sS https://getcomposer.org/installer | php 23 | mv composer.phar $(build_tools_directory) 24 | php $(build_tools_directory)/composer.phar install --prefer-dist 25 | php $(build_tools_directory)/composer.phar update --prefer-dist 26 | else 27 | composer install --prefer-dist 28 | composer update --prefer-dist 29 | endif 30 | 31 | npm-init: 32 | npm ci 33 | 34 | npm-update: 35 | npm update 36 | 37 | dependabot: dev-setup npm-update build-js-production 38 | 39 | build-js: 40 | npm run dev 41 | 42 | build-js-production: 43 | npm run build 44 | 45 | lint: 46 | npm run lint 47 | 48 | lint-fix: 49 | npm run lint:fix 50 | 51 | watch-js: 52 | npm run watch 53 | 54 | clean: 55 | rm -f js/notifications.js 56 | rm -f js/notifications.js.map 57 | rm -rf $(build_dir) 58 | 59 | clean-dev: 60 | rm -rf node_modules 61 | 62 | package: dev-setup build-js-production 63 | mkdir -p $(source_dir) 64 | rsync -a \ 65 | --exclude=/build \ 66 | --exclude=/docs \ 67 | --exclude=/js-src \ 68 | --exclude=/.tx \ 69 | --exclude=/tests \ 70 | --exclude=/.git \ 71 | --exclude=/.github \ 72 | --exclude=/CONTRIBUTING.md \ 73 | --exclude=/issue_template.md \ 74 | --exclude=/README.md \ 75 | --exclude=/.gitignore \ 76 | --exclude=/.scrutinizer.yml \ 77 | --exclude=/.travis.yml \ 78 | --exclude=/.drone.yml \ 79 | --exclude=.l10nignore \ 80 | --exclude=/node_modules \ 81 | --exclude=/npm-debug.log \ 82 | --exclude=/package.json \ 83 | --exclude=/package-lock.json \ 84 | --exclude=/Makefile \ 85 | $(project_dir)/ $(source_dir) 86 | -------------------------------------------------------------------------------- /appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 9 | notifications 10 | Notifications 11 | 12 | 22 | 23 | 5.0.0-dev.0 24 | agpl 25 | Joas Schilling 26 | 27 | 28 | 29 | 30 | 31 | tools 32 | 33 | https://github.com/nextcloud/notifications 34 | https://github.com/nextcloud/notifications/issues 35 | https://github.com/nextcloud/notifications.git 36 | 37 | 38 | 39 | 40 | 41 | 42 | OCA\Notifications\BackgroundJob\GenerateUserSettings 43 | OCA\Notifications\BackgroundJob\SendNotificationMails 44 | 45 | 46 | 47 | OCA\Notifications\Command\Delete 48 | OCA\Notifications\Command\Generate 49 | OCA\Notifications\Command\TestPush 50 | 51 | 52 | 53 | OCA\Notifications\Settings\Admin 54 | OCA\Notifications\Settings\AdminSection 55 | OCA\Notifications\Settings\Personal 56 | OCA\Notifications\Settings\PersonalSection 57 | 58 | 59 | -------------------------------------------------------------------------------- /appinfo/routes.php: -------------------------------------------------------------------------------- 1 | [ 13 | ['name' => 'Endpoint#listNotifications', 'url' => '/api/{apiVersion}/notifications', 'verb' => 'GET', 'requirements' => ['apiVersion' => '(v1|v2)']], 14 | ['name' => 'Endpoint#getNotification', 'url' => '/api/{apiVersion}/notifications/{id}', 'verb' => 'GET', 'requirements' => ['apiVersion' => '(v1|v2)', 'id' => '\d+']], 15 | ['name' => 'Endpoint#confirmIdsForUser', 'url' => '/api/{apiVersion}/notifications/exists', 'verb' => 'POST', 'requirements' => ['apiVersion' => '(v1|v2)']], 16 | ['name' => 'Endpoint#deleteNotification', 'url' => '/api/{apiVersion}/notifications/{id}', 'verb' => 'DELETE', 'requirements' => ['apiVersion' => '(v1|v2)', 'id' => '\d+']], 17 | ['name' => 'Endpoint#deleteAllNotifications', 'url' => '/api/{apiVersion}/notifications', 'verb' => 'DELETE', 'requirements' => ['apiVersion' => '(v1|v2)']], 18 | 19 | ['name' => 'API#generateNotification', 'url' => '/api/{apiVersion}/admin_notifications/{userId}', 'verb' => 'POST', 'requirements' => ['apiVersion' => '(v1|v2)']], 20 | ['name' => 'API#generateNotificationV3', 'url' => '/api/{apiVersion3}/admin_notifications/{userId}', 'verb' => 'POST', 'requirements' => ['apiVersion3' => '(v3)']], 21 | ['name' => 'API#selfTestPush', 'url' => '/api/{apiVersion3}/test/self', 'verb' => 'POST', 'requirements' => ['apiVersion3' => '(v3)']], 22 | 23 | ['name' => 'Settings#personal', 'url' => '/api/{apiVersion}/settings', 'verb' => 'POST', 'requirements' => ['apiVersion' => '(v2)']], 24 | ['name' => 'Settings#admin', 'url' => '/api/{apiVersion}/settings/admin', 'verb' => 'POST', 'requirements' => ['apiVersion' => '(v2)']], 25 | ], 26 | ]; 27 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoload": { 3 | "psr-4": { 4 | "OCA\\Notifications\\": "lib/" 5 | } 6 | }, 7 | "name": "nextcloud/notifications", 8 | "description": "notifications", 9 | "license": "AGPL", 10 | "require-dev": { 11 | "bamarni/composer-bin-plugin": "^1.8", 12 | "nextcloud/ocp": "dev-master" 13 | }, 14 | "config": { 15 | "optimize-autoloader": true, 16 | "classmap-authoritative": true, 17 | "platform": { 18 | "php": "8.1" 19 | }, 20 | "sort-packages": true, 21 | "allow-plugins": { 22 | "bamarni/composer-bin-plugin": true 23 | } 24 | }, 25 | "scripts": { 26 | "post-install-cmd": [ 27 | "[ $COMPOSER_DEV_MODE -eq 0 ] || composer bin all install", 28 | "composer dump-autoload" 29 | ], 30 | "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './build/*' -print0 | xargs -0 -n1 php -l", 31 | "cs:check": "php-cs-fixer fix --dry-run --diff", 32 | "cs:fix": "php-cs-fixer fix", 33 | "openapi": "generate-spec --verbose", 34 | "psalm": "psalm --no-cache --threads=$(nproc)", 35 | "psalm:dev": "@psalm", 36 | "psalm:update-baseline": "psalm --threads=1 --update-baseline", 37 | "rector:check": "rector --dry-run --clear-cache", 38 | "rector:fix": "rector", 39 | "test:unit": "phpunit --color -c tests/Unit/phpunit.xml", 40 | "test:integration": "cd tests/Integration && ./run.sh" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /css/NcSettingsSection-C76Kqeew-DH5FZz7o.chunk.css: -------------------------------------------------------------------------------- 1 | .material-design-icon[data-v-6f6953b5]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.settings-section[data-v-6f6953b5]{display:block;margin-bottom:auto;padding:30px}.settings-section[data-v-6f6953b5]:not(:last-child){border-bottom:1px solid var(--color-border)}.settings-section--limit-width>*[data-v-6f6953b5]{max-width:900px}.settings-section__name[data-v-6f6953b5]{display:inline-flex;align-items:center;justify-content:center;font-size:20px;font-weight:700;max-width:900px;margin-top:0}.settings-section__info[data-v-6f6953b5]{display:flex;align-items:center;justify-content:center;width:var(--default-clickable-area);height:var(--default-clickable-area);margin:calc((var(--default-clickable-area) - 16px) / 2 * -1);margin-inline-start:0;color:var(--color-text-maxcontrast)}.settings-section__info[data-v-6f6953b5]:hover,.settings-section__info[data-v-6f6953b5]:focus,.settings-section__info[data-v-6f6953b5]:active{color:var(--color-main-text)}.settings-section__desc[data-v-6f6953b5]{margin-top:-.2em;margin-bottom:1em;color:var(--color-text-maxcontrast);max-width:900px} 2 | -------------------------------------------------------------------------------- /css/main-D1MVrAjl.chunk.css: -------------------------------------------------------------------------------- 1 | .notifications-button .notifications-button__icon{height:20px}.notifications-button .notification__dot{fill:#ff4402}.notifications-button .notification__dot--warning{fill:var(--color-warning)}.notifications-button .notification__dot--white{fill:var(--color-primary-text)}.notifications-button.hasNotifications{animation-name:pulse;animation-duration:1.6s;animation-iteration-count:4}.notifications-button.hasNotifications svg{opacity:1}@keyframes pulse{0%{opacity:1}60%{opacity:.85}to{opacity:1}}.notification{padding-bottom:12px}.notification:not(:last-child){border-bottom:1px solid var(--color-border)}.notification .notification-heading{display:flex;align-items:center;min-height:26px}.notification .notification-heading .notification-time{color:var(--color-text-maxcontrast);margin:13px 0 13px auto}.notification .notification-heading .notification-dismiss-button{margin:6px}.notification .notification-subject,.notification .notification-message,.notification .notification-full-message,.notification .notification-actions{margin:0 12px 12px}.notification .notification-subject{display:flex;align-items:center}.notification .notification-subject>.image{align-self:flex-start}.notification .notification-subject>span.subject,.notification .notification-subject>a>span.subject,.notification .notification-subject>.rich-text--wrapper,.notification .notification-subject>a>.rich-text--wrapper{padding-left:10px;word-wrap:anywhere}.notification .notification-message,.notification .notification-full-message{padding-left:42px;color:var(--color-text-maxcontrast)}.notification .notification-message>.collapsed,.notification .notification-full-message>.collapsed{overflow:hidden;max-height:70px}.notification .notification-message>.notification-overflow,.notification .notification-full-message>.notification-overflow{box-shadow:0 0 20px 20px var(--color-main-background);position:relative}.notification strong{font-weight:700;opacity:1}.notification .notification-actions{overflow:hidden}.notification .notification-actions .button-vue{line-height:normal;margin:2px 8px}.notification .notification-actions:first-child{margin-left:auto} 2 | -------------------------------------------------------------------------------- /css/notifications-admin-settings.css: -------------------------------------------------------------------------------- 1 | /* extracted by css-entry-points-plugin */ 2 | @import './style-DmAX-VC0.chunk.css'; 3 | @import './_plugin-vue2_normalizer-D9peD3JJ.chunk.css'; 4 | @import './NcSettingsSection-C76Kqeew-DH5FZz7o.chunk.css'; -------------------------------------------------------------------------------- /css/notifications-main.css: -------------------------------------------------------------------------------- 1 | /* extracted by css-entry-points-plugin */ 2 | @import './main-D1MVrAjl.chunk.css'; 3 | @import './style-DmAX-VC0.chunk.css'; -------------------------------------------------------------------------------- /css/notifications-settings.css: -------------------------------------------------------------------------------- 1 | /* extracted by css-entry-points-plugin */ 2 | @import './settings-CZnvTP7p.chunk.css'; 3 | @import './style-DmAX-VC0.chunk.css'; 4 | @import './_plugin-vue2_normalizer-D9peD3JJ.chunk.css'; 5 | @import './BrowserStorage-CUymxkzr.chunk.css'; 6 | @import './NcSettingsSection-C76Kqeew-DH5FZz7o.chunk.css'; -------------------------------------------------------------------------------- /css/settings-CZnvTP7p.chunk.css: -------------------------------------------------------------------------------- 1 | .additional-margin-top[data-v-ec4573a7]{margin-top:12px} 2 | -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/notifications/7cdcbdc2cedb56152c36b85bf202a37a141e0cdb/docs/screenshot.png -------------------------------------------------------------------------------- /docs/screenshot.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /img/notification.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/notifications/7cdcbdc2cedb56152c36b85bf202a37a141e0cdb/img/notification.ogg -------------------------------------------------------------------------------- /img/notifications-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/notifications/7cdcbdc2cedb56152c36b85bf202a37a141e0cdb/img/notifications.png -------------------------------------------------------------------------------- /img/notifications.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/talk.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/notifications/7cdcbdc2cedb56152c36b85bf202a37a141e0cdb/img/talk.ogg -------------------------------------------------------------------------------- /js/NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs: -------------------------------------------------------------------------------- 1 | /*! third party licenses: js/vendor.LICENSE.txt */ 2 | import{r as n,b as r,d as i,e as a}from"./_plugin-vue2_normalizer-DJtB2XH9.chunk.mjs";n(r);const l={name:"HelpCircleIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}};var o=function(){var t=this,e=t._self._c;return e("span",t._b({staticClass:"material-design-icon help-circle-icon",attrs:{"aria-hidden":t.title?null:"true","aria-label":t.title,role:"img"},on:{click:function(s){return t.$emit("click",s)}}},"span",t.$attrs,!1),[e("svg",{staticClass:"material-design-icon__svg",attrs:{fill:t.fillColor,width:t.size,height:t.size,viewBox:"0 0 24 24"}},[e("path",{attrs:{d:"M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"}},[t.title?e("title",[t._v(t._s(t.title))]):t._e()])])])},c=[],d=i(l,o,c,!1,null,null);const p=d.exports,m={name:"NcSettingsSection",components:{HelpCircle:p},props:{name:{type:String,required:!0},description:{type:String,default:""},docUrl:{type:String,default:""},limitWidth:{type:Boolean,default:!0}},data(){return{docNameTranslated:a("External documentation for {name}",{name:this.name})}},computed:{forceLimitWidth(){if(this.limitWidth)return!0;const[t]=window._oc_config?.version.split(".",2)??[];return t&&Number.parseInt(t)>=30},hasDescription(){return this.description.length>0},hasDocUrl(){return this.docUrl.length>0}}};var u=function(){var t=this,e=t._self._c;return e("div",{staticClass:"settings-section",class:{"settings-section--limit-width":t.forceLimitWidth}},[e("h2",{staticClass:"settings-section__name"},[t._v(" "+t._s(t.name)+" "),t.hasDocUrl?e("a",{staticClass:"settings-section__info",attrs:{href:t.docUrl,title:t.docNameTranslated,"aria-label":t.docNameTranslated,target:"_blank",rel:"noreferrer nofollow"}},[e("HelpCircle",{attrs:{size:20}})],1):t._e()]),t.hasDescription?e("p",{staticClass:"settings-section__desc"},[t._v(" "+t._s(t.description)+" ")]):t._e(),t._t("default")],2)},f=[],_=i(m,u,f,!1,null,"6f6953b5");const g=_.exports;export{g as N}; 3 | //# sourceMappingURL=NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.map 4 | -------------------------------------------------------------------------------- /js/NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-or-later 2 | SPDX-FileCopyrightText: John Molakvoæ (skjnldsv) 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - @nextcloud/vue 6 | - version: 8.27.0 7 | - license: AGPL-3.0-or-later 8 | -------------------------------------------------------------------------------- /js/NcSettingsSection-C76Kqeew-CmEU9BUX.chunk.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-or-later 2 | SPDX-FileCopyrightText: John Molakvoæ (skjnldsv) 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - @nextcloud/vue 6 | - version: 8.27.0 7 | - license: AGPL-3.0-or-later 8 | -------------------------------------------------------------------------------- /js/index-BEiTiEVI.chunk.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: BSD-3-Clause 2 | SPDX-License-Identifier: MIT 3 | SPDX-FileCopyrightText: Josh Goebel 4 | SPDX-FileCopyrightText: Titus Wormer (https://wooorm.com) 5 | 6 | This file is generated from multiple sources. Included packages: 7 | - hast-util-to-text 8 | - version: 4.0.2 9 | - license: MIT 10 | - highlight.js 11 | - version: 11.11.1 12 | - license: BSD-3-Clause 13 | - lowlight 14 | - version: 3.3.0 15 | - license: MIT 16 | - rehype-highlight 17 | - version: 7.0.2 18 | - license: MIT 19 | - unist-util-find-after 20 | - version: 5.0.0 21 | - license: MIT 22 | -------------------------------------------------------------------------------- /js/index-BEiTiEVI.chunk.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: BSD-3-Clause 2 | SPDX-License-Identifier: MIT 3 | SPDX-FileCopyrightText: Josh Goebel 4 | SPDX-FileCopyrightText: Titus Wormer (https://wooorm.com) 5 | 6 | This file is generated from multiple sources. Included packages: 7 | - hast-util-to-text 8 | - version: 4.0.2 9 | - license: MIT 10 | - highlight.js 11 | - version: 11.11.1 12 | - license: BSD-3-Clause 13 | - lowlight 14 | - version: 3.3.0 15 | - license: MIT 16 | - rehype-highlight 17 | - version: 7.0.2 18 | - license: MIT 19 | - unist-util-find-after 20 | - version: 5.0.0 21 | - license: MIT 22 | -------------------------------------------------------------------------------- /js/notifications-admin-settings.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-FileCopyrightText: Joas Schilling 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - notifications 6 | - version: 5.0.0-dev.0 7 | - license: AGPL-3.0-only 8 | -------------------------------------------------------------------------------- /js/notifications-admin-settings.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-FileCopyrightText: Joas Schilling 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - notifications 6 | - version: 5.0.0-dev.0 7 | - license: AGPL-3.0-only 8 | -------------------------------------------------------------------------------- /js/notifications-main.mjs: -------------------------------------------------------------------------------- 1 | const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=[window.OC.filePath('notifications', '', 'js/NotificationsApp-CTKORUrM.chunk.mjs'),window.OC.filePath('notifications', '', 'js/_plugin-vue2_normalizer-DJtB2XH9.chunk.mjs'),window.OC.filePath('notifications', '', 'js/style-Cs268SVN.chunk.mjs'),window.OC.filePath('notifications', '', 'css/style-DmAX-VC0.chunk.css'),window.OC.filePath('notifications', '', 'css/_plugin-vue2_normalizer-D9peD3JJ.chunk.css'),window.OC.filePath('notifications', '', 'js/BrowserStorage-CSvx5SzD.chunk.mjs'),window.OC.filePath('notifications', '', 'css/BrowserStorage-CUymxkzr.chunk.css'),window.OC.filePath('notifications', '', 'js/vite-preload-helper-CpjhnH87.chunk.mjs'),window.OC.filePath('notifications', '', 'css/NotificationsApp-r3hOqE_D.chunk.css')])))=>i.map(i=>d[i]); 2 | /*! third party licenses: js/vendor.LICENSE.txt */ 3 | import{_ as p}from"./vite-preload-helper-CpjhnH87.chunk.mjs";import{V as o}from"./style-Cs268SVN.chunk.mjs";o.prototype.t=t,o.prototype.n=n,o.prototype.OC=OC,o.prototype.OCA=OCA,new o({el:"#notifications",name:"NotificationsApp",components:{NotificationsApp:()=>p(()=>import("./NotificationsApp-CTKORUrM.chunk.mjs").then(i=>i.N),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url)},render:i=>i("NotificationsApp")}); 4 | //# sourceMappingURL=notifications-main.mjs.map 5 | -------------------------------------------------------------------------------- /js/notifications-main.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-FileCopyrightText: Joas Schilling 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - notifications 6 | - version: 5.0.0-dev.0 7 | - license: AGPL-3.0-only 8 | -------------------------------------------------------------------------------- /js/notifications-main.mjs.map: -------------------------------------------------------------------------------- 1 | {"version":3,"mappings":";;4GAWAA,EAAI,UAAU,EAAI,EAClBA,EAAI,UAAU,EAAI,EAClBA,EAAI,UAAU,GAAK,GACnBA,EAAI,UAAU,IAAM,IAEL,IAAIA,EAAI,CACtB,GAAI,iBAEJ,KAAM,mBACN,WAAY,CACX,iBAAkB,IAAKC,EAAA,IAAC,OAAiC,uCAAwB,EAAC,KAAAC,KAAA,wDAClF,EACD,OAAQC,GAAKA,EAAE,kBAAkB,CAClC,CAAC","names":["Vue","__vitePreload","n","h"],"ignoreList":[],"sources":["../src/main.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport Vue from 'vue'\n\n// Styles\nimport './styles/styles.scss'\nimport '@nextcloud/dialogs/style.css'\n\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n\nexport default new Vue({\n\tel: '#notifications',\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'NotificationsApp',\n\tcomponents: {\n\t\tNotificationsApp: () => import(/* webpackPreload: true */'./NotificationsApp.vue'),\n\t},\n\trender: h => h('NotificationsApp'),\n})\n"],"file":"js/notifications-main.mjs"} -------------------------------------------------------------------------------- /js/notifications-main.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-FileCopyrightText: Joas Schilling 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - notifications 6 | - version: 5.0.0-dev.0 7 | - license: AGPL-3.0-only 8 | -------------------------------------------------------------------------------- /js/notifications-settings.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | SPDX-FileCopyrightText: Faisal Salman (http://faisalman.com) 4 | SPDX-FileCopyrightText: Joas Schilling 5 | 6 | This file is generated from multiple sources. Included packages: 7 | - notifications 8 | - version: 5.0.0-dev.0 9 | - license: AGPL-3.0-only 10 | - ua-parser-js 11 | - version: 2.0.3 12 | - license: AGPL-3.0-or-later 13 | -------------------------------------------------------------------------------- /js/notifications-settings.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: AGPL-3.0-only 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | SPDX-FileCopyrightText: Faisal Salman (http://faisalman.com) 4 | SPDX-FileCopyrightText: Joas Schilling 5 | 6 | This file is generated from multiple sources. Included packages: 7 | - notifications 8 | - version: 5.0.0-dev.0 9 | - license: AGPL-3.0-only 10 | - ua-parser-js 11 | - version: 2.0.3 12 | - license: AGPL-3.0-or-later 13 | -------------------------------------------------------------------------------- /js/style-Cs268SVN.chunk.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-FileCopyrightText: David Myers 3 | SPDX-FileCopyrightText: Evan You 4 | 5 | This file is generated from multiple sources. Included packages: 6 | - vite-plugin-node-polyfills 7 | - version: 0.23.0 8 | - license: MIT 9 | - vue 10 | - version: 2.7.16 11 | - license: MIT 12 | -------------------------------------------------------------------------------- /js/style-Cs268SVN.chunk.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-FileCopyrightText: David Myers 3 | SPDX-FileCopyrightText: Evan You 4 | 5 | This file is generated from multiple sources. Included packages: 6 | - vite-plugin-node-polyfills 7 | - version: 0.23.0 8 | - license: MIT 9 | - vue 10 | - version: 2.7.16 11 | - license: MIT 12 | -------------------------------------------------------------------------------- /js/vite-preload-helper-CpjhnH87.chunk.mjs: -------------------------------------------------------------------------------- 1 | /*! third party licenses: js/vendor.LICENSE.txt */ 2 | const v="modulepreload",y=function(a,s){return new URL(a,s).href},p={},E=function(a,s,u){let d=Promise.resolve();if(s&&s.length>0){let o=function(e){return Promise.all(e.map(r=>Promise.resolve(r).then(l=>({status:"fulfilled",value:l}),l=>({status:"rejected",reason:l}))))};const t=document.getElementsByTagName("link"),h=document.querySelector("meta[property=csp-nonce]"),m=h?.nonce||h?.getAttribute("nonce");d=o(s.map(e=>{if(e=y(e,u),e in p)return;p[e]=!0;const r=e.endsWith(".css"),l=r?'[rel="stylesheet"]':"";if(u)for(let c=t.length-1;c>=0;c--){const i=t[c];if(i.href===e&&(!r||i.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${e}"]${l}`))return;const n=document.createElement("link");if(n.rel=r?"stylesheet":v,r||(n.as="script"),n.crossOrigin="",n.href=e,m&&n.setAttribute("nonce",m),document.head.appendChild(n),r)return new Promise((c,i)=>{n.addEventListener("load",c),n.addEventListener("error",()=>i(new Error(`Unable to preload CSS for ${e}`)))})}))}function f(o){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=o,window.dispatchEvent(t),!t.defaultPrevented)throw o}return d.then(o=>{for(const t of o||[])t.status==="rejected"&&f(t.reason);return a().catch(f)})};export{E as _}; 3 | //# sourceMappingURL=vite-preload-helper-CpjhnH87.chunk.mjs.map 4 | -------------------------------------------------------------------------------- /js/vite-preload-helper-CpjhnH87.chunk.mjs.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-FileCopyrightText: Evan You 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - vite 6 | - version: 6.3.4 7 | - license: MIT 8 | -------------------------------------------------------------------------------- /js/vite-preload-helper-CpjhnH87.chunk.mjs.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"vite-preload-helper-CpjhnH87.chunk.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"} -------------------------------------------------------------------------------- /js/vite-preload-helper-CpjhnH87.chunk.mjs.map.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-FileCopyrightText: Evan You 3 | 4 | This file is generated from multiple sources. Included packages: 5 | - vite 6 | - version: 6.3.4 7 | - license: MIT 8 | -------------------------------------------------------------------------------- /l10n/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/notifications/7cdcbdc2cedb56152c36b85bf202a37a141e0cdb/l10n/.gitkeep -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Dag %s", 5 | "Hello %s," : "Dag %s,", 6 | "Admin notifications" : "Admin kennisgewings", 7 | "Notifications" : "Kennisgewings", 8 | "Failed to perform action" : "Kon nie aksie voltooi nie", 9 | "seconds ago" : "sekondes gelede", 10 | "Failed to dismiss notification" : "Kon nie kennisgewing afwys nie", 11 | "Dismiss" : "Wys Af", 12 | "in {path}" : "in {path}", 13 | "No notifications" : "Geen kennisgewings", 14 | "Failed to dismiss all notifications" : "Kon nie alle kennisgewings afwys nie ", 15 | "Never" : "Nooit", 16 | "1 hour" : "1 uur", 17 | "1 day" : "1 dag", 18 | "1 week" : "1 week", 19 | "Your settings have been updated." : "U instellings is bygewerk.", 20 | "None" : "Geen", 21 | "You need to set up your email address before you can receive notification emails." : "U moet u e-posadres opstel alvorens u kennisgewings per e-pos kan ontvang." 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Dag %s", 3 | "Hello %s," : "Dag %s,", 4 | "Admin notifications" : "Admin kennisgewings", 5 | "Notifications" : "Kennisgewings", 6 | "Failed to perform action" : "Kon nie aksie voltooi nie", 7 | "seconds ago" : "sekondes gelede", 8 | "Failed to dismiss notification" : "Kon nie kennisgewing afwys nie", 9 | "Dismiss" : "Wys Af", 10 | "in {path}" : "in {path}", 11 | "No notifications" : "Geen kennisgewings", 12 | "Failed to dismiss all notifications" : "Kon nie alle kennisgewings afwys nie ", 13 | "Never" : "Nooit", 14 | "1 hour" : "1 uur", 15 | "1 day" : "1 dag", 16 | "1 week" : "1 week", 17 | "Your settings have been updated." : "U instellings is bygewerk.", 18 | "None" : "Geen", 19 | "You need to set up your email address before you can receive notification emails." : "U moet u e-posadres opstel alvorens u kennisgewings per e-pos kan ontvang." 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/an.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificacions", 7 | "in {path}" : "en {path}", 8 | "Never" : "Nunca", 9 | "Your settings have been updated." : "A suya configuración ha estau actualizada.", 10 | "None" : "Denguno", 11 | "You need to set up your email address before you can receive notification emails." : "Ye necesario que configures a tuya direción de correu electronico pa poder recibir os correus de notificación." 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/an.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificacions", 5 | "in {path}" : "en {path}", 6 | "Never" : "Nunca", 7 | "Your settings have been updated." : "A suya configuración ha estau actualizada.", 8 | "None" : "Denguno", 9 | "You need to set up your email address before you can receive notification emails." : "Ye necesario que configures a tuya direción de correu electronico pa poder recibir os correus de notificación." 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Salam %s", 5 | "Hello %s," : "Salam %s,", 6 | "Notifications" : "Xəbərdarlıqlar", 7 | "seconds ago" : "saniyələr öncə", 8 | "Dismiss" : "Rədd et", 9 | "in {path}" : "{path} daxilində", 10 | "Never" : "Heç vaxt", 11 | "Your settings have been updated." : "Sizin configləriniz yenilendi.", 12 | "None" : "Heç bir", 13 | "You need to set up your email address before you can receive notification emails." : "Xəbərdarlıq məktubları almazdan öncə, siz mail ünvanınızı təyin etməlisiniz." 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Salam %s", 3 | "Hello %s," : "Salam %s,", 4 | "Notifications" : "Xəbərdarlıqlar", 5 | "seconds ago" : "saniyələr öncə", 6 | "Dismiss" : "Rədd et", 7 | "in {path}" : "{path} daxilində", 8 | "Never" : "Heç vaxt", 9 | "Your settings have been updated." : "Sizin configləriniz yenilendi.", 10 | "None" : "Heç bir", 11 | "You need to set up your email address before you can receive notification emails." : "Xəbərdarlıq məktubları almazdan öncə, siz mail ünvanınızı təyin etməlisiniz." 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/be.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Прывітанне %s", 5 | "Hello %s," : "Прывітанне %s,", 6 | "Notifications" : "Апавяшчэнні", 7 | "in {path}" : "у {path}", 8 | "Your settings have been updated." : "Вашы налады былі абноўлены. ", 9 | "You need to set up your email address before you can receive notification emails." : "Табе патрэбна наладзіць твой адрас імэйлу, перад тым як ты зможаш атрымліваць імэйлы-абвесткі" 10 | }, 11 | "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); 12 | -------------------------------------------------------------------------------- /l10n/be.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Прывітанне %s", 3 | "Hello %s," : "Прывітанне %s,", 4 | "Notifications" : "Апавяшчэнні", 5 | "in {path}" : "у {path}", 6 | "Your settings have been updated." : "Вашы налады былі абноўлены. ", 7 | "You need to set up your email address before you can receive notification emails." : "Табе патрэбна наладзіць твой адрас імэйлу, перад тым як ты зможаш атрымліваць імэйлы-абвесткі" 8 | },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" 9 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "হ্যালো %s", 5 | "Hello %s," : "হেলো %s,", 6 | "Notifications" : "বার্তাসমূহ", 7 | "seconds ago" : "সেকেন্ড পূর্বে", 8 | "in {path}" : "{পথে}", 9 | "Your settings have been updated." : "আপনার সেটিং নবায়ন করা হয়েছে৷", 10 | "None" : "কোনটিই নয়", 11 | "You need to set up your email address before you can receive notification emails." : "ইমেইল বারতা পাওয়ার আগে আপনাকে নিজের ইমেইল ঠিকানা নিরধারন করতে হবে৷" 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "হ্যালো %s", 3 | "Hello %s," : "হেলো %s,", 4 | "Notifications" : "বার্তাসমূহ", 5 | "seconds ago" : "সেকেন্ড পূর্বে", 6 | "in {path}" : "{পথে}", 7 | "Your settings have been updated." : "আপনার সেটিং নবায়ন করা হয়েছে৷", 8 | "None" : "কোনটিই নয়", 9 | "You need to set up your email address before you can receive notification emails." : "ইমেইল বারতা পাওয়ার আগে আপনাকে নিজের ইমেইল ঠিকানা নিরধারন করতে হবে৷" 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/cy_GB.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "Defnyddiwr heb ei ganfod", 5 | "Hello %s" : "Helo %s", 6 | "Hello %s," : "Helo %s,", 7 | "Notifications" : "Hysbysiadau", 8 | "seconds ago" : "eiliad yn ôl", 9 | "in {path}" : "yn {path}", 10 | "Your settings have been updated." : "Mae eich gosodiadau wedi'u diweddaru.", 11 | "None" : "Dim", 12 | "You need to set up your email address before you can receive notification emails." : "Mae angen i chi osod eich cyfeiriad e-bost cyn y gallwch dderbyn negeseuon e-bost hysbysu." 13 | }, 14 | "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); 15 | -------------------------------------------------------------------------------- /l10n/cy_GB.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "Defnyddiwr heb ei ganfod", 3 | "Hello %s" : "Helo %s", 4 | "Hello %s," : "Helo %s,", 5 | "Notifications" : "Hysbysiadau", 6 | "seconds ago" : "eiliad yn ôl", 7 | "in {path}" : "yn {path}", 8 | "Your settings have been updated." : "Mae eich gosodiadau wedi'u diweddaru.", 9 | "None" : "Dim", 10 | "You need to set up your email address before you can receive notification emails." : "Mae angen i chi osod eich cyfeiriad e-bost cyn y gallwch dderbyn negeseuon e-bost hysbysu." 11 | },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" 12 | } -------------------------------------------------------------------------------- /l10n/eo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "Netrovita uzanto", 5 | "Hello %s" : "Saluton %s", 6 | "Hello %s," : "Saluton %s,", 7 | "Admin notifications" : "Administraj sciigoj", 8 | "Notifications" : "Sciigoj", 9 | "This app provides a backend and frontend for the notification API available in Nextcloud." : "Tiu aplikaĵo provizas internan kaj eksteran servojn por la sciiga API de Nextcloud.", 10 | "This app provides a backend and frontend for the notification API available in Nextcloud.\n\t\tThe API is used by other apps to notify users in the web UI and sync clients about various things. Some examples are:\n\n📬 Federated file sharing: You received a new remote share\n\n📑 Comments: Another user mentioned you in a comment on a file\n\n🚢 Update notification: Available update for an app or nextcloud itself\n\n📣 Announcement center: An announcement was posted by an admin" : "Tiu aplikaĵo provizas internan kaj eksteran servojn por la sciiga API de Nextcloud.\n\t\tLa API-on uzas aliaj aplikaĵoj por sciigi al uzanto per la retumila fasado kaj la sinkronigaj klientoj. Ekzemple:\n\n📬 Federa dosierkunhavigo: vi ricevis novan foran kunhavon\n\n📑 Komentoj: alia uzanto menciis vin en komento pri dosiero\n\n🚢 Nova ĝisdatigo: disponebla ĝisdatigo por aplikaĵo aŭ Nextcloud mem\n\n📣 Anoncejo: anonco sendiĝis de administranto", 11 | "Failed to perform action" : "Malsukcesis fari agon", 12 | "seconds ago" : "antaŭ kelkaj sekundoj", 13 | "Failed to dismiss notification" : "Malsukcesis forsendi sciigo", 14 | "Dismiss" : "Forsendi", 15 | "in {path}" : "en {path}", 16 | "No notifications" : "Neniu sciigoj", 17 | "Failed to dismiss all notifications" : "Malsukcesis forsendi ĉiujn sciigojn", 18 | "Dismiss all notifications" : "Forsendi ĉiujn sciigojn", 19 | "Never" : "Neniam", 20 | "1 hour" : "1 horo", 21 | "Your settings have been updated." : "Viaj agordoj ĝisdatiĝis.", 22 | "None" : "Nenio", 23 | "You need to set up your email address before you can receive notification emails." : "Vi bezonas agordi vian retpoŝtadreson, por povi ricevi sciigojn retmesaĝe." 24 | }, 25 | "nplurals=2; plural=(n != 1);"); 26 | -------------------------------------------------------------------------------- /l10n/eo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "Netrovita uzanto", 3 | "Hello %s" : "Saluton %s", 4 | "Hello %s," : "Saluton %s,", 5 | "Admin notifications" : "Administraj sciigoj", 6 | "Notifications" : "Sciigoj", 7 | "This app provides a backend and frontend for the notification API available in Nextcloud." : "Tiu aplikaĵo provizas internan kaj eksteran servojn por la sciiga API de Nextcloud.", 8 | "This app provides a backend and frontend for the notification API available in Nextcloud.\n\t\tThe API is used by other apps to notify users in the web UI and sync clients about various things. Some examples are:\n\n📬 Federated file sharing: You received a new remote share\n\n📑 Comments: Another user mentioned you in a comment on a file\n\n🚢 Update notification: Available update for an app or nextcloud itself\n\n📣 Announcement center: An announcement was posted by an admin" : "Tiu aplikaĵo provizas internan kaj eksteran servojn por la sciiga API de Nextcloud.\n\t\tLa API-on uzas aliaj aplikaĵoj por sciigi al uzanto per la retumila fasado kaj la sinkronigaj klientoj. Ekzemple:\n\n📬 Federa dosierkunhavigo: vi ricevis novan foran kunhavon\n\n📑 Komentoj: alia uzanto menciis vin en komento pri dosiero\n\n🚢 Nova ĝisdatigo: disponebla ĝisdatigo por aplikaĵo aŭ Nextcloud mem\n\n📣 Anoncejo: anonco sendiĝis de administranto", 9 | "Failed to perform action" : "Malsukcesis fari agon", 10 | "seconds ago" : "antaŭ kelkaj sekundoj", 11 | "Failed to dismiss notification" : "Malsukcesis forsendi sciigo", 12 | "Dismiss" : "Forsendi", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "Neniu sciigoj", 15 | "Failed to dismiss all notifications" : "Malsukcesis forsendi ĉiujn sciigojn", 16 | "Dismiss all notifications" : "Forsendi ĉiujn sciigojn", 17 | "Never" : "Neniam", 18 | "1 hour" : "1 horo", 19 | "Your settings have been updated." : "Viaj agordoj ĝisdatiĝis.", 20 | "None" : "Nenio", 21 | "You need to set up your email address before you can receive notification emails." : "Vi bezonas agordi vian retpoŝtadreson, por povi ricevi sciigojn retmesaĝe." 22 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 23 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_AR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s:", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Su configuración ha sido actualizada", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de poder recibir las notificaciones en tu correo electrónico." 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_AR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s:", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Su configuración ha sido actualizada", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de poder recibir las notificaciones en tu correo electrónico." 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_CL.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Admin notifications" : "Notificaciones del administrador", 7 | "Notifications" : "Notificaciones", 8 | "seconds ago" : "hace segundos", 9 | "Dismiss" : "Descartar", 10 | "in {path}" : "en {path}", 11 | "Requesting browser permissions to show notifications" : "Solicitando permisos del navegador para mostrar notificaciones", 12 | "No notifications" : "No hay notificaciones", 13 | "Dismiss all notifications" : "Descartar todos los permisos", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | }, 21 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 22 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Admin notifications" : "Notificaciones del administrador", 5 | "Notifications" : "Notificaciones", 6 | "seconds ago" : "hace segundos", 7 | "Dismiss" : "Descartar", 8 | "in {path}" : "en {path}", 9 | "Requesting browser permissions to show notifications" : "Solicitando permisos del navegador para mostrar notificaciones", 10 | "No notifications" : "No hay notificaciones", 11 | "Dismiss all notifications" : "Descartar todos los permisos", 12 | "Never" : "Nunca", 13 | "1 hour" : "1 hora", 14 | "3 hours" : "3 horas", 15 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 16 | "None" : "Ninguno", 17 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 18 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 19 | } -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "No se encontró el usuario", 5 | "Hello %s" : "Hola %s", 6 | "Hello %s," : "Hola %s,", 7 | "Admin notifications" : "Notificaciones adminsitrativas", 8 | "Notifications" : "Notificaciones", 9 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 10 | "seconds ago" : "hace segundos", 11 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 12 | "Dismiss" : "Descartar", 13 | "in {path}" : "en {path}", 14 | "No notifications" : "No hay notificaciones", 15 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 16 | "Never" : "Nunca", 17 | "1 hour" : "1 hora", 18 | "3 hours" : "3 horas", 19 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 20 | "None" : "Ninguno", 21 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 22 | }, 23 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "No se encontró el usuario", 3 | "Hello %s" : "Hola %s", 4 | "Hello %s," : "Hola %s,", 5 | "Admin notifications" : "Notificaciones adminsitrativas", 6 | "Notifications" : "Notificaciones", 7 | "Failed to perform action" : "Se presentó una falla al ejeuctar la acción", 8 | "seconds ago" : "hace segundos", 9 | "Failed to dismiss notification" : "Se presentó una falla al descartar la notificación", 10 | "Dismiss" : "Descartar", 11 | "in {path}" : "en {path}", 12 | "No notifications" : "No hay notificaciones", 13 | "Failed to dismiss all notifications" : "Se presentó una falla al descartar todas las notificaciones", 14 | "Never" : "Nunca", 15 | "1 hour" : "1 hora", 16 | "3 hours" : "3 horas", 17 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 18 | "None" : "Ninguno", 19 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 20 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hola %s", 5 | "Hello %s," : "Hola %s,", 6 | "Notifications" : "Notificaciones", 7 | "seconds ago" : "hace segundos", 8 | "Dismiss" : "Descartar", 9 | "in {path}" : "en {path}", 10 | "No notifications" : "No hay notificaciones", 11 | "Never" : "Nunca", 12 | "1 hour" : "1 hora", 13 | "3 hours" : "3 horas", 14 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 15 | "None" : "Ninguno", 16 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 17 | }, 18 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 19 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hola %s", 3 | "Hello %s," : "Hola %s,", 4 | "Notifications" : "Notificaciones", 5 | "seconds ago" : "hace segundos", 6 | "Dismiss" : "Descartar", 7 | "in {path}" : "en {path}", 8 | "No notifications" : "No hay notificaciones", 9 | "Never" : "Nunca", 10 | "1 hour" : "1 hora", 11 | "3 hours" : "3 horas", 12 | "Your settings have been updated." : "Tus configuraciones se han actualizado.", 13 | "None" : "Ninguno", 14 | "You need to set up your email address before you can receive notification emails." : "Necesitas configurar tu dirección de correo electrónico antes de que puedas recibir correos de notificación" 15 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 16 | } -------------------------------------------------------------------------------- /l10n/fo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hey %s", 5 | "Hello %s," : "Hey %s,", 6 | "in {path}" : "í {path}", 7 | "Never" : "ongantíð" 8 | }, 9 | "nplurals=2; plural=(n != 1);"); 10 | -------------------------------------------------------------------------------- /l10n/fo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hey %s", 3 | "Hello %s," : "Hey %s,", 4 | "in {path}" : "í {path}", 5 | "Never" : "ongantíð" 6 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 7 | } -------------------------------------------------------------------------------- /l10n/gd.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Notifications" : "Brathan", 5 | "seconds ago" : "diog air ais", 6 | "Dismiss" : "Leig seachad", 7 | "No notifications" : "Gun bhrath", 8 | "1 hour" : "Uair a thìde", 9 | "None" : "Chan eil gin" 10 | }, 11 | "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); 12 | -------------------------------------------------------------------------------- /l10n/gd.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Notifications" : "Brathan", 3 | "seconds ago" : "diog air ais", 4 | "Dismiss" : "Leig seachad", 5 | "No notifications" : "Gun bhrath", 6 | "1 hour" : "Uair a thìde", 7 | "None" : "Chan eil gin" 8 | },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" 9 | } -------------------------------------------------------------------------------- /l10n/hi_IN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Notifications" : "नोटिफ़िकेशन", 5 | "in {path}" : "in {path}", 6 | "Your settings have been updated." : "आपकी सेटिंग अपडेट हो गई हैं", 7 | "You need to set up your email address before you can receive notification emails." : "अधिसूचना ईमेल प्राप्त करने से पहले आपको अपना ईमेल पता सेट करना होगा।" 8 | }, 9 | "nplurals=2; plural=(n != 1);"); 10 | -------------------------------------------------------------------------------- /l10n/hi_IN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Notifications" : "नोटिफ़िकेशन", 3 | "in {path}" : "in {path}", 4 | "Your settings have been updated." : "आपकी सेटिंग अपडेट हो गई हैं", 5 | "You need to set up your email address before you can receive notification emails." : "अधिसूचना ईमेल प्राप्त करने से पहले आपको अपना ईमेल पता सेट करना होगा।" 6 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 7 | } -------------------------------------------------------------------------------- /l10n/hy.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Բարև %s", 5 | "Hello %s," : "Բարև %s,", 6 | "Notifications" : "Ծանուցում", 7 | "seconds ago" : "վրկ. առաջ", 8 | "in {path}" : "դեպի {ուղի}", 9 | "Never" : "Երբեք", 10 | "Your settings have been updated." : "Ձեր կարգավորումներն թարմացվել են։", 11 | "You need to set up your email address before you can receive notification emails." : "Փոստի վրա ծանուցումն ստանալու համար անհրաժեշտ է կարգավորել էլ․հասցեն։" 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/hy.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Բարև %s", 3 | "Hello %s," : "Բարև %s,", 4 | "Notifications" : "Ծանուցում", 5 | "seconds ago" : "վրկ. առաջ", 6 | "in {path}" : "դեպի {ուղի}", 7 | "Never" : "Երբեք", 8 | "Your settings have been updated." : "Ձեր կարգավորումներն թարմացվել են։", 9 | "You need to set up your email address before you can receive notification emails." : "Փոստի վրա ծանուցումն ստանալու համար անհրաժեշտ է կարգավորել էլ․հասցեն։" 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s," : "Salute %s,", 5 | "Notifications" : "Notificationes", 6 | "seconds ago" : "secundas passate", 7 | "Dismiss" : "Dimitter", 8 | "in {path}" : "in {path}", 9 | "No notifications" : "Nulle notificationes", 10 | "Never" : "Nunquam", 11 | "Your settings have been updated." : "Tu configurationes ha essite actualisate.", 12 | "None" : "Nulle", 13 | "You need to set up your email address before you can receive notification emails." : "Tu necessita configurar tu adresse de e-posta ante que tu pote reciper messages de e-posta de notification." 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s," : "Salute %s,", 3 | "Notifications" : "Notificationes", 4 | "seconds ago" : "secundas passate", 5 | "Dismiss" : "Dimitter", 6 | "in {path}" : "in {path}", 7 | "No notifications" : "Nulle notificationes", 8 | "Never" : "Nunquam", 9 | "Your settings have been updated." : "Tu configurationes ha essite actualisate.", 10 | "None" : "Nulle", 11 | "You need to set up your email address before you can receive notification emails." : "Tu necessita configurar tu adresse de e-posta ante que tu pote reciper messages de e-posta de notification." 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/id.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Halo %s", 5 | "Hello %s," : "Halo %s,", 6 | "Notifications" : "Pemberitahuan", 7 | "seconds ago" : "beberapa detik yang lalu", 8 | "Dismiss" : "Abaikan", 9 | "in {path}" : "di {path}", 10 | "No notifications" : "Tidak ada pemberitahuan", 11 | "Never" : "Tidak pernah", 12 | "1 hour" : "1 jam", 13 | "3 hours" : "3 jam", 14 | "1 day" : "1 hari", 15 | "1 week" : "1 minggu", 16 | "Your settings have been updated." : "Pengaturan Anda telah diperbarui.", 17 | "Send email reminders about unhandled notifications after:" : "Kirim surel pengingat tentang pemberitahuan yang tidak tertangani setelah:", 18 | "None" : "Tidak ada", 19 | "You need to set up your email address before you can receive notification emails." : "Anda perlu menyetel alamat surel sebelum Anda dapat menerima surel pemberitahuan." 20 | }, 21 | "nplurals=1; plural=0;"); 22 | -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Halo %s", 3 | "Hello %s," : "Halo %s,", 4 | "Notifications" : "Pemberitahuan", 5 | "seconds ago" : "beberapa detik yang lalu", 6 | "Dismiss" : "Abaikan", 7 | "in {path}" : "di {path}", 8 | "No notifications" : "Tidak ada pemberitahuan", 9 | "Never" : "Tidak pernah", 10 | "1 hour" : "1 jam", 11 | "3 hours" : "3 jam", 12 | "1 day" : "1 hari", 13 | "1 week" : "1 minggu", 14 | "Your settings have been updated." : "Pengaturan Anda telah diperbarui.", 15 | "Send email reminders about unhandled notifications after:" : "Kirim surel pengingat tentang pemberitahuan yang tidak tertangani setelah:", 16 | "None" : "Tidak ada", 17 | "You need to set up your email address before you can receive notification emails." : "Anda perlu menyetel alamat surel sebelum Anda dapat menerima surel pemberitahuan." 18 | },"pluralForm" :"nplurals=1; plural=0;" 19 | } -------------------------------------------------------------------------------- /l10n/ig.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Ndeewo %s", 5 | "Hello %s," : "Ndeewo %s", 6 | "Notifications" : "Nziọkwà" 7 | }, 8 | "nplurals=1; plural=0;"); 9 | -------------------------------------------------------------------------------- /l10n/ig.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Ndeewo %s", 3 | "Hello %s," : "Ndeewo %s", 4 | "Notifications" : "Nziọkwà" 5 | },"pluralForm" :"nplurals=1; plural=0;" 6 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "გამარჯობა, %s", 5 | "Hello %s," : "გამარჯობა %s,", 6 | "Admin notifications" : "ადმინისტრაციული შეტყობინებები", 7 | "Notifications" : "შეტყობინებები", 8 | "Failed to perform action" : "მოქმედების შესრულება ვერ მოხერხდა", 9 | "seconds ago" : "წამის წინ", 10 | "Failed to dismiss notification" : "შეტყობინების გათავისუფლება ვერ მოხერხდა", 11 | "Dismiss" : "უარყოფა", 12 | "in {path}" : "{path}-ში", 13 | "No notifications" : "შეტყობინებები არაა", 14 | "Failed to dismiss all notifications" : "ყველა შეტყობინების გათავისუფლება ვერ მოხერხდა", 15 | "Never" : "არასდროს", 16 | "1 hour" : "1 საათი", 17 | "3 hours" : "3 საათი", 18 | "Your settings have been updated." : "თქვენი პარამეტრები განახლდა.", 19 | "None" : "არც ერთი", 20 | "You need to set up your email address before you can receive notification emails." : "ელ-ფოსტაზე შეტყობინების მიღებამდე, საჭიროა მიუთითოთ თქვენი მისამართი." 21 | }, 22 | "nplurals=2; plural=(n!=1);"); 23 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "გამარჯობა, %s", 3 | "Hello %s," : "გამარჯობა %s,", 4 | "Admin notifications" : "ადმინისტრაციული შეტყობინებები", 5 | "Notifications" : "შეტყობინებები", 6 | "Failed to perform action" : "მოქმედების შესრულება ვერ მოხერხდა", 7 | "seconds ago" : "წამის წინ", 8 | "Failed to dismiss notification" : "შეტყობინების გათავისუფლება ვერ მოხერხდა", 9 | "Dismiss" : "უარყოფა", 10 | "in {path}" : "{path}-ში", 11 | "No notifications" : "შეტყობინებები არაა", 12 | "Failed to dismiss all notifications" : "ყველა შეტყობინების გათავისუფლება ვერ მოხერხდა", 13 | "Never" : "არასდროს", 14 | "1 hour" : "1 საათი", 15 | "3 hours" : "3 საათი", 16 | "Your settings have been updated." : "თქვენი პარამეტრები განახლდა.", 17 | "None" : "არც ერთი", 18 | "You need to set up your email address before you can receive notification emails." : "ელ-ფოსტაზე შეტყობინების მიღებამდე, საჭიროა მიუთითოთ თქვენი მისამართი." 19 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 20 | } -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Azul %s", 5 | "Hello %s," : "Azul %s,", 6 | "Notifications" : "Ilɣa", 7 | "Dismiss" : "Agi", 8 | "in {path}" : "deg {ubrid}", 9 | "No notifications" : "Ulac tisezmal", 10 | "1 hour" : "1 n usrag", 11 | "1 day" : "1 n wass", 12 | "Your settings have been updated." : "Iɣewwaren-innek ttwaleqqmen", 13 | "None" : "Ula d yiwen", 14 | "You need to set up your email address before you can receive notification emails." : "Ilaq ad tesɣewreḍ tansa imayl iwakken ad tizmireḍ ad teṭṭfeḍ talɣut s imayl." 15 | }, 16 | "nplurals=2; plural=(n != 1);"); 17 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Azul %s", 3 | "Hello %s," : "Azul %s,", 4 | "Notifications" : "Ilɣa", 5 | "Dismiss" : "Agi", 6 | "in {path}" : "deg {ubrid}", 7 | "No notifications" : "Ulac tisezmal", 8 | "1 hour" : "1 n usrag", 9 | "1 day" : "1 n wass", 10 | "Your settings have been updated." : "Iɣewwaren-innek ttwaleqqmen", 11 | "None" : "Ula d yiwen", 12 | "You need to set up your email address before you can receive notification emails." : "Ilaq ad tesɣewreḍ tansa imayl iwakken ad tizmireḍ ad teṭṭfeḍ talɣut s imayl." 13 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 14 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "សួស្ដី %s", 5 | "Hello %s," : "សួស្ដី %s,", 6 | "Notifications" : "ការ​ជូន​ដំណឹង", 7 | "seconds ago" : "វិនាទី​មុន", 8 | "in {path}" : "ក្នុង {path}", 9 | "Your settings have been updated." : "ការ​កំណត់​របស់​អ្នក​ត្រូវ​បាន​ធ្វើ​បច្ចុប្បន្នភាព។", 10 | "None" : "គ្មាន", 11 | "You need to set up your email address before you can receive notification emails." : "អ្នក​ចាំបាច់​ត្រូវតែដំឡើង​អាសយដ្ឋាន​អ៊ីមែលរបស់អ្នកមុនពេល​ដែលអ្នកអាចទទួលបានការជូន​ដំណឹង​ទៅកាន់​អ៊ីមែល ។" 12 | }, 13 | "nplurals=1; plural=0;"); 14 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "សួស្ដី %s", 3 | "Hello %s," : "សួស្ដី %s,", 4 | "Notifications" : "ការ​ជូន​ដំណឹង", 5 | "seconds ago" : "វិនាទី​មុន", 6 | "in {path}" : "ក្នុង {path}", 7 | "Your settings have been updated." : "ការ​កំណត់​របស់​អ្នក​ត្រូវ​បាន​ធ្វើ​បច្ចុប្បន្នភាព។", 8 | "None" : "គ្មាន", 9 | "You need to set up your email address before you can receive notification emails." : "អ្នក​ចាំបាច់​ត្រូវតែដំឡើង​អាសយដ្ឋាន​អ៊ីមែលរបស់អ្នកមុនពេល​ដែលអ្នកអាចទទួលបានការជូន​ដំណឹង​ទៅកាន់​អ៊ីមែល ។" 10 | },"pluralForm" :"nplurals=1; plural=0;" 11 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s," : "Hallo %s,", 5 | "Notifications" : "Notifikatiounen", 6 | "seconds ago" : "Sekonnen hier", 7 | "Dismiss" : "Ofbriechen", 8 | "in {path}" : "am [Pad]", 9 | "Your settings have been updated." : "Deng Astellunge goufen aktualiséiert.", 10 | "None" : "Keng", 11 | "You need to set up your email address before you can receive notification emails." : "Du muss deng E-Mail-Adress konfiguréieren ier s de Notifikatiouns-Maile kanns emfänken." 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s," : "Hallo %s,", 3 | "Notifications" : "Notifikatiounen", 4 | "seconds ago" : "Sekonnen hier", 5 | "Dismiss" : "Ofbriechen", 6 | "in {path}" : "am [Pad]", 7 | "Your settings have been updated." : "Deng Astellunge goufen aktualiséiert.", 8 | "None" : "Keng", 9 | "You need to set up your email address before you can receive notification emails." : "Du muss deng E-Mail-Adress konfiguréieren ier s de Notifikatiouns-Maile kanns emfänken." 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/lo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "ສະບາຍດີ 1%s", 5 | "Hello %s," : "ສະບາຍດີ 1%s ,", 6 | "Notifications" : "ການເເຈ້ງເຕືອນ", 7 | "seconds ago" : "ວິນາທີຜ່ານມາ", 8 | "Dismiss" : "ຍົກເລີກ", 9 | "No notifications" : "ບໍ່ມີການແຈ້ງເຕືອນ", 10 | "1 hour" : "1 ຊົ່ວໂມງ", 11 | "Your settings have been updated." : "ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຮັບການອັບເດດ", 12 | "None" : "ບໍ່ມີ" 13 | }, 14 | "nplurals=1; plural=0;"); 15 | -------------------------------------------------------------------------------- /l10n/lo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "ສະບາຍດີ 1%s", 3 | "Hello %s," : "ສະບາຍດີ 1%s ,", 4 | "Notifications" : "ການເເຈ້ງເຕືອນ", 5 | "seconds ago" : "ວິນາທີຜ່ານມາ", 6 | "Dismiss" : "ຍົກເລີກ", 7 | "No notifications" : "ບໍ່ມີການແຈ້ງເຕືອນ", 8 | "1 hour" : "1 ຊົ່ວໂມງ", 9 | "Your settings have been updated." : "ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຮັບການອັບເດດ", 10 | "None" : "ບໍ່ມີ" 11 | },"pluralForm" :"nplurals=1; plural=0;" 12 | } -------------------------------------------------------------------------------- /l10n/lv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "Lietotājs nav atrasts", 5 | "Hello %s" : "Sveiciens, %s!", 6 | "Hello %s," : "Sveiciens, %s!", 7 | "Admin notifications" : "Pārvaldītāju paziņojumi", 8 | "Notifications" : "Paziņojumi", 9 | "seconds ago" : "pirms vairākām sekundēm", 10 | "Failed to dismiss notification" : "Neizdevās atmest paziņojumu", 11 | "Dismiss" : "Atmest", 12 | "in {path}" : "{path}", 13 | "No notifications" : "Nav paziņojumu", 14 | "Never" : "Nekad", 15 | "1 hour" : "1 stunda", 16 | "3 hours" : "3 stundas", 17 | "1 day" : "1 diena", 18 | "1 week" : "1 nedēļa", 19 | "Your settings have been updated." : "Iestatījumi tika atjaunināti.", 20 | "None" : "Nav", 21 | "You need to set up your email address before you can receive notification emails." : "Lai saņemtu paziņojumus e-pastā, jūsu profilā ir nepieciešams uzstādīt e-pasta adresi." 22 | }, 23 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); 24 | -------------------------------------------------------------------------------- /l10n/lv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "Lietotājs nav atrasts", 3 | "Hello %s" : "Sveiciens, %s!", 4 | "Hello %s," : "Sveiciens, %s!", 5 | "Admin notifications" : "Pārvaldītāju paziņojumi", 6 | "Notifications" : "Paziņojumi", 7 | "seconds ago" : "pirms vairākām sekundēm", 8 | "Failed to dismiss notification" : "Neizdevās atmest paziņojumu", 9 | "Dismiss" : "Atmest", 10 | "in {path}" : "{path}", 11 | "No notifications" : "Nav paziņojumu", 12 | "Never" : "Nekad", 13 | "1 hour" : "1 stunda", 14 | "3 hours" : "3 stundas", 15 | "1 day" : "1 diena", 16 | "1 week" : "1 nedēļa", 17 | "Your settings have been updated." : "Iestatījumi tika atjaunināti.", 18 | "None" : "Nav", 19 | "You need to set up your email address before you can receive notification emails." : "Lai saņemtu paziņojumus e-pastā, jūsu profilā ir nepieciešams uzstādīt e-pasta adresi." 20 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" 21 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Сайн байна уу, %s", 5 | "Hello %s," : "Сайн байна уу, %s,", 6 | "Notifications" : "Мэдэгдэл", 7 | "seconds ago" : "хоёрдахь өмнө", 8 | "Dismiss" : "Арилгах", 9 | "in {path}" : "{path}-д", 10 | "No notifications" : "Мэдэгдэл байхгүй", 11 | "Never" : "хэзээч", 12 | "1 hour" : "1 цаг", 13 | "3 hours" : "3 цаг", 14 | "Your settings have been updated." : "Таны тохиргоог шинэчлэв", 15 | "None" : "юу ч үгүй", 16 | "You need to set up your email address before you can receive notification emails." : "Та цахим шуудангаар мэдэгдэл хүлээн авахын тулд цахим шуудангаа тохируулна уу?" 17 | }, 18 | "nplurals=2; plural=(n != 1);"); 19 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Сайн байна уу, %s", 3 | "Hello %s," : "Сайн байна уу, %s,", 4 | "Notifications" : "Мэдэгдэл", 5 | "seconds ago" : "хоёрдахь өмнө", 6 | "Dismiss" : "Арилгах", 7 | "in {path}" : "{path}-д", 8 | "No notifications" : "Мэдэгдэл байхгүй", 9 | "Never" : "хэзээч", 10 | "1 hour" : "1 цаг", 11 | "3 hours" : "3 цаг", 12 | "Your settings have been updated." : "Таны тохиргоог шинэчлэв", 13 | "None" : "юу ч үгүй", 14 | "You need to set up your email address before you can receive notification emails." : "Та цахим шуудангаар мэдэгдэл хүлээн авахын тулд цахим шуудангаа тохируулна уу?" 15 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 16 | } -------------------------------------------------------------------------------- /l10n/mr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "नमस्कार %s", 5 | "Hello %s," : "नमस्कार %s,", 6 | "Notifications" : "अधिसूचना", 7 | "in {path}" : " {path} मध्ये", 8 | "Your settings have been updated." : "तुमच्या सेटिंग अद्ययावत करण्यात आल्या." 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/mr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "नमस्कार %s", 3 | "Hello %s," : "नमस्कार %s,", 4 | "Notifications" : "अधिसूचना", 5 | "in {path}" : " {path} मध्ये", 6 | "Your settings have been updated." : "तुमच्या सेटिंग अद्ययावत करण्यात आल्या." 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/ms_MY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hai %s", 5 | "Hello %s," : "Hai %s,", 6 | "Notifications" : "Pemberitahuan", 7 | "in {path}" : "dalam {haluan}", 8 | "Your settings have been updated." : "Tetapan anda sudah dikemaskini.", 9 | "You need to set up your email address before you can receive notification emails." : "Anda perlu menyediakan alamat e-mel anda sebelum anda boleh menerima e-mel pemberitahuan." 10 | }, 11 | "nplurals=1; plural=0;"); 12 | -------------------------------------------------------------------------------- /l10n/ms_MY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hai %s", 3 | "Hello %s," : "Hai %s,", 4 | "Notifications" : "Pemberitahuan", 5 | "in {path}" : "dalam {haluan}", 6 | "Your settings have been updated." : "Tetapan anda sudah dikemaskini.", 7 | "You need to set up your email address before you can receive notification emails." : "Anda perlu menyediakan alamat e-mel anda sebelum anda boleh menerima e-mel pemberitahuan." 8 | },"pluralForm" :"nplurals=1; plural=0;" 9 | } -------------------------------------------------------------------------------- /l10n/my.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "မင်္ဂလာပါ %s", 5 | "Hello %s," : "မင်္ဂလာပါ %s၊", 6 | "in {path}" : "{path} တွင်", 7 | "Your settings have been updated." : "သင်၏ ပြင်ဆင်ချက်များကို မွမ်းမံပြီးဖြစ်သည်။" 8 | }, 9 | "nplurals=1; plural=0;"); 10 | -------------------------------------------------------------------------------- /l10n/my.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "မင်္ဂလာပါ %s", 3 | "Hello %s," : "မင်္ဂလာပါ %s၊", 4 | "in {path}" : "{path} တွင်", 5 | "Your settings have been updated." : "သင်၏ ပြင်ဆင်ချက်များကို မွမ်းမံပြီးဖြစ်သည်။" 6 | },"pluralForm" :"nplurals=1; plural=0;" 7 | } -------------------------------------------------------------------------------- /l10n/ne.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "नमस्ते %s", 5 | "Hello %s," : "नमस्ते %s,", 6 | "in {path}" : "{path} मा", 7 | "Your settings have been updated." : "तपाईंको सेटिङहरू अद्यावधिक गरिएको छ।", 8 | "You need to set up your email address before you can receive notification emails." : "अग्रसूचना ईमेलहरू प्राप्त गर्नु अघि तपाईंले आफ्नो ईमेल ठेगाना सेट अप गर्न आवश्यक छ।" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/ne.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "नमस्ते %s", 3 | "Hello %s," : "नमस्ते %s,", 4 | "in {path}" : "{path} मा", 5 | "Your settings have been updated." : "तपाईंको सेटिङहरू अद्यावधिक गरिएको छ।", 6 | "You need to set up your email address before you can receive notification emails." : "अग्रसूचना ईमेलहरू प्राप्त गर्नु अघि तपाईंले आफ्नो ईमेल ठेगाना सेट अप गर्न आवश्यक छ।" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Hei %s", 5 | "Hello %s," : "Hei %s,", 6 | "Notifications" : "Meldingar", 7 | "seconds ago" : "sekund sidan", 8 | "Dismiss" : "Forkast", 9 | "in {path}" : "i {spor}", 10 | "Never" : "Aldri", 11 | "Your settings have been updated." : "Innstillingane dine har blitt oppdaterte.", 12 | "None" : "Ingen", 13 | "You need to set up your email address before you can receive notification emails." : "Du må skriva inn e-postadressa di før du kan få e-postvarsel." 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Hei %s", 3 | "Hello %s," : "Hei %s,", 4 | "Notifications" : "Meldingar", 5 | "seconds ago" : "sekund sidan", 6 | "Dismiss" : "Forkast", 7 | "in {path}" : "i {spor}", 8 | "Never" : "Aldri", 9 | "Your settings have been updated." : "Innstillingane dine har blitt oppdaterte.", 10 | "None" : "Ingen", 11 | "You need to set up your email address before you can receive notification emails." : "Du må skriva inn e-postadressa di før du kan få e-postvarsel." 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "Utilizaire pas trobat", 5 | "Hello %s" : "Adieu %s", 6 | "Hello %s," : "Adieu %s,", 7 | "_New notification for %s_::_%n new notifications for %s_" : ["Notificacion novèla per %s","%n notificacions novèlas per %s"], 8 | "_You have a new notification for %s_::_You have %n new notifications for %s_" : ["Avètz una notificacion novèla per %s","Avètz %n notificacions novèlas per %s"], 9 | "Admin notifications" : "Notificacions admin", 10 | "Notifications" : "Notificacions", 11 | "seconds ago" : "fa qualques segondas", 12 | "Dismiss" : "Ignorar", 13 | "in {path}" : "dins {path}", 14 | "No notifications" : "Cap de notificacion", 15 | "Dismiss all notifications" : "Tancar totas las notificacions", 16 | "Never" : "Jamai", 17 | "1 hour" : " 1 ora", 18 | "3 hours" : "3 oras", 19 | "1 day" : "1 jorn", 20 | "1 week" : "1 setmana", 21 | "Your settings have been updated." : "Paramètres actualizats.", 22 | "An error occurred while updating your settings." : "Una error s’es producha pendent l’actualizacion dels paramètres.", 23 | "None" : "Cap" 24 | }, 25 | "nplurals=2; plural=(n > 1);"); 26 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "Utilizaire pas trobat", 3 | "Hello %s" : "Adieu %s", 4 | "Hello %s," : "Adieu %s,", 5 | "_New notification for %s_::_%n new notifications for %s_" : ["Notificacion novèla per %s","%n notificacions novèlas per %s"], 6 | "_You have a new notification for %s_::_You have %n new notifications for %s_" : ["Avètz una notificacion novèla per %s","Avètz %n notificacions novèlas per %s"], 7 | "Admin notifications" : "Notificacions admin", 8 | "Notifications" : "Notificacions", 9 | "seconds ago" : "fa qualques segondas", 10 | "Dismiss" : "Ignorar", 11 | "in {path}" : "dins {path}", 12 | "No notifications" : "Cap de notificacion", 13 | "Dismiss all notifications" : "Tancar totas las notificacions", 14 | "Never" : "Jamai", 15 | "1 hour" : " 1 ora", 16 | "3 hours" : "3 oras", 17 | "1 day" : "1 jorn", 18 | "1 week" : "1 setmana", 19 | "Your settings have been updated." : "Paramètres actualizats.", 20 | "An error occurred while updating your settings." : "Una error s’es producha pendent l’actualizacion dels paramètres.", 21 | "None" : "Cap" 22 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 23 | } -------------------------------------------------------------------------------- /l10n/ps.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "سلامونه %s", 5 | "Hello %s," : "سلامونه %s،", 6 | "in {path}" : "په {path} کې", 7 | "Your settings have been updated." : "په سمونو کې بدلون ثبت شو", 8 | "You need to set up your email address before you can receive notification emails." : "د خبرتياوو ترلاسه کولو نه مخکې بايد خپل ايمېل ادرس ترتيب کړئ." 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/ps.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "سلامونه %s", 3 | "Hello %s," : "سلامونه %s،", 4 | "in {path}" : "په {path} کې", 5 | "Your settings have been updated." : "په سمونو کې بدلون ثبت شو", 6 | "You need to set up your email address before you can receive notification emails." : "د خبرتياوو ترلاسه کولو نه مخکې بايد خپل ايمېل ادرس ترتيب کړئ." 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/pt_PT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "User not found" : "Utilizador não encontrado", 5 | "Hello %s" : "Olá %s", 6 | "Hello %s," : "Olá %s,", 7 | "Admin notifications" : "Notificações de administrador", 8 | "Notifications" : "Notificações", 9 | "Failed to perform action" : "Falhou a executar ação", 10 | "seconds ago" : "segundos atrás", 11 | "Failed to dismiss notification" : "Falhou a dispensar notificação", 12 | "Dismiss" : "Dispensar", 13 | "in {path}" : "em {path}", 14 | "No notifications" : "Sem notificações", 15 | "Failed to dismiss all notifications" : "Falhou a dispensar todas as notificações", 16 | "Dismiss all notifications" : "Dispensar todas as notificações", 17 | "Never" : "Nunca", 18 | "1 hour" : "1 hora", 19 | "3 hours" : "3 horas", 20 | "1 day" : "1 dia", 21 | "1 week" : "1 semana", 22 | "Your settings have been updated." : "As suas definições foram atualizadas.", 23 | "An error occurred while updating your settings." : "Ocorreu um erro ao atualizar as suas definições.", 24 | "None" : "Nenhum", 25 | "You need to set up your email address before you can receive notification emails." : "Precisa de configurar o seu endereço de e-mail antes de poder receber mensagens de notificação." 26 | }, 27 | "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/pt_PT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "User not found" : "Utilizador não encontrado", 3 | "Hello %s" : "Olá %s", 4 | "Hello %s," : "Olá %s,", 5 | "Admin notifications" : "Notificações de administrador", 6 | "Notifications" : "Notificações", 7 | "Failed to perform action" : "Falhou a executar ação", 8 | "seconds ago" : "segundos atrás", 9 | "Failed to dismiss notification" : "Falhou a dispensar notificação", 10 | "Dismiss" : "Dispensar", 11 | "in {path}" : "em {path}", 12 | "No notifications" : "Sem notificações", 13 | "Failed to dismiss all notifications" : "Falhou a dispensar todas as notificações", 14 | "Dismiss all notifications" : "Dispensar todas as notificações", 15 | "Never" : "Nunca", 16 | "1 hour" : "1 hora", 17 | "3 hours" : "3 horas", 18 | "1 day" : "1 dia", 19 | "1 week" : "1 semana", 20 | "Your settings have been updated." : "As suas definições foram atualizadas.", 21 | "An error occurred while updating your settings." : "Ocorreu um erro ao atualizar as suas definições.", 22 | "None" : "Nenhum", 23 | "You need to set up your email address before you can receive notification emails." : "Precisa de configurar o seu endereço de e-mail antes de poder receber mensagens de notificação." 24 | },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "ආයුබෝවන් %s", 5 | "Hello %s," : "ආයුබෝවන් %s,", 6 | "Notifications" : "දැනුම්දීම්", 7 | "seconds ago" : "තත්පර කිහිපයකට පෙර", 8 | "in {path}" : "{path} තුළ", 9 | "1 hour" : "හෝරා 1 යි", 10 | "3 hours" : "හෝරා 3 යි", 11 | "Your settings have been updated." : "ඔබගේ සැකසුම් යාවත්කාලීන කර ඇත." 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "ආයුබෝවන් %s", 3 | "Hello %s," : "ආයුබෝවන් %s,", 4 | "Notifications" : "දැනුම්දීම්", 5 | "seconds ago" : "තත්පර කිහිපයකට පෙර", 6 | "in {path}" : "{path} තුළ", 7 | "1 hour" : "හෝරා 1 යි", 8 | "3 hours" : "හෝරා 3 යි", 9 | "Your settings have been updated." : "ඔබගේ සැකසුම් යාවත්කාලීන කර ඇත." 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/sq.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Përshëndetje %s", 5 | "Hello %s," : "Përshëndetje %s,", 6 | "Notifications" : "Njoftimet", 7 | "seconds ago" : "sekonda më parë", 8 | "Dismiss" : "Hiq", 9 | "in {path}" : "në {path}", 10 | "No notifications" : "Asnjë njoftim", 11 | "Never" : "Kurrë", 12 | "1 hour" : "1 Orë", 13 | "3 hours" : "3 orë", 14 | "1 day" : "1 ditë ", 15 | "Your settings have been updated." : "Rregullimet tuaja u përditësuan", 16 | "None" : "Asnjë", 17 | "You need to set up your email address before you can receive notification emails." : "Kërkohet të caktoni adresën tuaj email, përpara se të mund të merrni email-e njoftimesh." 18 | }, 19 | "nplurals=2; plural=(n != 1);"); 20 | -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Përshëndetje %s", 3 | "Hello %s," : "Përshëndetje %s,", 4 | "Notifications" : "Njoftimet", 5 | "seconds ago" : "sekonda më parë", 6 | "Dismiss" : "Hiq", 7 | "in {path}" : "në {path}", 8 | "No notifications" : "Asnjë njoftim", 9 | "Never" : "Kurrë", 10 | "1 hour" : "1 Orë", 11 | "3 hours" : "3 orë", 12 | "1 day" : "1 ditë ", 13 | "Your settings have been updated." : "Rregullimet tuaja u përditësuan", 14 | "None" : "Asnjë", 15 | "You need to set up your email address before you can receive notification emails." : "Kërkohet të caktoni adresën tuaj email, përpara se të mund të merrni email-e njoftimesh." 16 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 17 | } -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Здраво %s", 5 | "Hello %s," : "Здраво %s,", 6 | "Notifications" : "Obaveštenja", 7 | "seconds ago" : "pre nekoliko sekundi", 8 | "Dismiss" : "Odbaci", 9 | "in {path}" : "у {path}", 10 | "No notifications" : "Nema obaveštenja", 11 | "Never" : "Nikad", 12 | "1 hour" : "1 sat", 13 | "3 hours" : "3 sata", 14 | "Your settings have been updated." : "Ваше поставке су ажуриране.", 15 | "None" : "Ništa", 16 | "You need to set up your email address before you can receive notification emails." : "Морате поставити адресу е-поште пре почетка пријема обавештења." 17 | }, 18 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 19 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Здраво %s", 3 | "Hello %s," : "Здраво %s,", 4 | "Notifications" : "Obaveštenja", 5 | "seconds ago" : "pre nekoliko sekundi", 6 | "Dismiss" : "Odbaci", 7 | "in {path}" : "у {path}", 8 | "No notifications" : "Nema obaveštenja", 9 | "Never" : "Nikad", 10 | "1 hour" : "1 sat", 11 | "3 hours" : "3 sata", 12 | "Your settings have been updated." : "Ваше поставке су ажуриране.", 13 | "None" : "Ništa", 14 | "You need to set up your email address before you can receive notification emails." : "Морате поставити адресу е-поште пре почетка пријема обавештења." 15 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 16 | } -------------------------------------------------------------------------------- /l10n/ta.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "வணக்கம் %s", 5 | "Hello %s," : "வணக்கம் %s,", 6 | "seconds ago" : "செக்கன்களுக்கு முன்", 7 | "Your settings have been updated." : "உங்களின் அமைப்புகள் சேமிக்கப்பட்டன", 8 | "None" : "ஒன்றுமில்லை" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/ta.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "வணக்கம் %s", 3 | "Hello %s," : "வணக்கம் %s,", 4 | "seconds ago" : "செக்கன்களுக்கு முன்", 5 | "Your settings have been updated." : "உங்களின் அமைப்புகள் சேமிக்கப்பட்டன", 6 | "None" : "ஒன்றுமில்லை" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "สวัสดี %s", 5 | "Hello %s," : "สวัสดี %s", 6 | "Notifications" : "การแจ้งเตือน", 7 | "This app provides a backend and frontend for the notification API available in Nextcloud.\n\t\tThe API is used by other apps to notify users in the web UI and sync clients about various things. Some examples are:\n\n📬 Federated file sharing: You received a new remote share\n\n📑 Comments: Another user mentioned you in a comment on a file\n\n🚢 Update notification: Available update for an app or nextcloud itself\n\n📣 Announcement center: An announcement was posted by an admin" : "แอปนี้ให้บริการแบ็กเอนด์และฟรอนต์เอนด์สำหรับ API การแจ้งเตือนที่มีอยู่ใน Nextcloud\nAPI นี้ถูกใช้โดยแอปอื่นเพื่อแจ้งเตือนผู้ใช้ใน UI เว็บและไคลเอ็นต์ซิงค์เกี่ยวกับเรื่องต่าง ๆ บางตัวอย่างเช่น:\n\n📬 การแชร์ไฟล์ที่ติดต่อกับภายนอก: คุณได้รับการแชร์ระยะไกลใหม่\n\n📑 ความคิดเห็น: ผู้ใช้อื่นกล่าวถึงคุณในความคิดเห็นเกี่ยวกับไฟล์\n\n🚢 การแจ้งเตือนการอัปเดต: มีอัปเดตที่พร้อมใช้งานสำหรับแอปหรือ Nextcloud เอง\n\n📣 ศูนย์ประกาศ: มีประกาศที่โพสต์โดยผู้ดูแลระบบ", 8 | "seconds ago" : "วินาทีที่ผ่านมา", 9 | "Dismiss" : "ปิดทิ้ง", 10 | "in {path}" : "ใน {path}", 11 | "No notifications" : "ไม่มีการแจ้งเตือน", 12 | "Never" : "ไม่เคย", 13 | "1 hour" : "1 ชั่วโมง", 14 | "Your settings have been updated." : "อัปเดตการตั้งค่าของคุณแล้ว", 15 | "None" : "ไม่มี", 16 | "You need to set up your email address before you can receive notification emails." : "คุณต้องตั้งค่าที่อยู่อีเมลของคุณก่อนที่จะสามารถรับอีเมลแจ้งเตือน" 17 | }, 18 | "nplurals=1; plural=0;"); 19 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "สวัสดี %s", 3 | "Hello %s," : "สวัสดี %s", 4 | "Notifications" : "การแจ้งเตือน", 5 | "This app provides a backend and frontend for the notification API available in Nextcloud.\n\t\tThe API is used by other apps to notify users in the web UI and sync clients about various things. Some examples are:\n\n📬 Federated file sharing: You received a new remote share\n\n📑 Comments: Another user mentioned you in a comment on a file\n\n🚢 Update notification: Available update for an app or nextcloud itself\n\n📣 Announcement center: An announcement was posted by an admin" : "แอปนี้ให้บริการแบ็กเอนด์และฟรอนต์เอนด์สำหรับ API การแจ้งเตือนที่มีอยู่ใน Nextcloud\nAPI นี้ถูกใช้โดยแอปอื่นเพื่อแจ้งเตือนผู้ใช้ใน UI เว็บและไคลเอ็นต์ซิงค์เกี่ยวกับเรื่องต่าง ๆ บางตัวอย่างเช่น:\n\n📬 การแชร์ไฟล์ที่ติดต่อกับภายนอก: คุณได้รับการแชร์ระยะไกลใหม่\n\n📑 ความคิดเห็น: ผู้ใช้อื่นกล่าวถึงคุณในความคิดเห็นเกี่ยวกับไฟล์\n\n🚢 การแจ้งเตือนการอัปเดต: มีอัปเดตที่พร้อมใช้งานสำหรับแอปหรือ Nextcloud เอง\n\n📣 ศูนย์ประกาศ: มีประกาศที่โพสต์โดยผู้ดูแลระบบ", 6 | "seconds ago" : "วินาทีที่ผ่านมา", 7 | "Dismiss" : "ปิดทิ้ง", 8 | "in {path}" : "ใน {path}", 9 | "No notifications" : "ไม่มีการแจ้งเตือน", 10 | "Never" : "ไม่เคย", 11 | "1 hour" : "1 ชั่วโมง", 12 | "Your settings have been updated." : "อัปเดตการตั้งค่าของคุณแล้ว", 13 | "None" : "ไม่มี", 14 | "You need to set up your email address before you can receive notification emails." : "คุณต้องตั้งค่าที่อยู่อีเมลของคุณก่อนที่จะสามารถรับอีเมลแจ้งเตือน" 15 | },"pluralForm" :"nplurals=1; plural=0;" 16 | } -------------------------------------------------------------------------------- /l10n/tk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "notifications", 3 | { 4 | "Hello %s" : "Salam%s", 5 | "Notifications" : "Duýduryşlar", 6 | "seconds ago" : "Sekunt öň", 7 | "Dismiss" : "Ýapmak.", 8 | "No notifications" : "Duýduryş ýok", 9 | "1 hour" : "1 sagat", 10 | "None" : "Hiç" 11 | }, 12 | "nplurals=2; plural=(n != 1);"); 13 | -------------------------------------------------------------------------------- /l10n/tk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Hello %s" : "Salam%s", 3 | "Notifications" : "Duýduryşlar", 4 | "seconds ago" : "Sekunt öň", 5 | "Dismiss" : "Ýapmak.", 6 | "No notifications" : "Duýduryş ýok", 7 | "1 hour" : "1 sagat", 8 | "None" : "Hiç" 9 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 10 | } -------------------------------------------------------------------------------- /lib/BackgroundJob/GenerateUserSettings.php: -------------------------------------------------------------------------------- 1 | setInterval(24 * 60 * 60); 31 | } 32 | 33 | protected function run($argument): void { 34 | $query = $this->connection->getQueryBuilder(); 35 | $query->select('notification_id') 36 | ->from('notifications') 37 | ->orderBy('notification_id', 'DESC') 38 | ->setMaxResults(1); 39 | 40 | $result = $query->executeQuery(); 41 | $maxId = (int)$result->fetchOne(); 42 | $result->closeCursor(); 43 | 44 | $this->userManager->callForSeenUsers(function (IUser $user) use ($maxId): void { 45 | if ($user->isEnabled()) { 46 | return; 47 | } 48 | 49 | try { 50 | $this->settingsMapper->getSettingsByUser($user->getUID()); 51 | } catch (DoesNotExistException) { 52 | $settings = new Settings(); 53 | $settings->setUserId($user->getUID()); 54 | $settings->setNextSendTime(1); 55 | $settings->setBatchTime(Settings::EMAIL_SEND_3HOURLY); 56 | $settings->setLastSendId($maxId); 57 | $this->settingsMapper->insert($settings); 58 | } 59 | }); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/BackgroundJob/SendNotificationMails.php: -------------------------------------------------------------------------------- 1 | time->getTime(); 26 | $batchSize = $this->isCLI ? MailNotifications::BATCH_SIZE_CLI : MailNotifications::BATCH_SIZE_WEB; 27 | $this->mailNotifications->sendEmails($batchSize, $time); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/Capabilities.php: -------------------------------------------------------------------------------- 1 | , 27 | * push: list, 28 | * admin-notifications: list, 29 | * }, 30 | * } 31 | */ 32 | public function getCapabilities(): array { 33 | return [ 34 | 'notifications' => [ 35 | 'ocs-endpoints' => [ 36 | 'list', 37 | 'get', 38 | 'delete', 39 | 'delete-all', 40 | 'icons', 41 | 'rich-strings', 42 | 'action-web', 43 | 'user-status', 44 | 'exists', 45 | 'test-push', 46 | ], 47 | 'push' => [ 48 | 'devices', 49 | 'object-data', 50 | 'delete', 51 | ], 52 | 'admin-notifications' => [ 53 | 'ocs', 54 | 'cli', 55 | ], 56 | ], 57 | ]; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/Command/Delete.php: -------------------------------------------------------------------------------- 1 | setName('notification:delete') 31 | ->setDescription('Delete a generated admin notification for the given user') 32 | ->addArgument( 33 | 'user-id', 34 | InputArgument::REQUIRED, 35 | 'User ID of the user to notify' 36 | ) 37 | ->addArgument( 38 | 'notification-id', 39 | InputArgument::REQUIRED, 40 | 'The notification ID returned by the "notification:generate" command' 41 | ) 42 | ; 43 | } 44 | 45 | /** 46 | * @param InputInterface $input 47 | * @param OutputInterface $output 48 | * @return int 49 | */ 50 | protected function execute(InputInterface $input, OutputInterface $output): int { 51 | 52 | $userId = (string)$input->getArgument('user-id'); 53 | $notificationId = (int)$input->getArgument('notification-id'); 54 | 55 | try { 56 | $notification = $this->notificationHandler->getById($notificationId, $userId); 57 | } catch (NotificationNotFoundException) { 58 | $output->writeln('Notification not found for user'); 59 | return 1; 60 | } 61 | 62 | $this->notificationManager->markProcessed($notification); 63 | $output->writeln('Notification deleted successfully'); 64 | return 0; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lib/Exceptions/NotificationNotFoundException.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | class AddMissingIndicesListener implements IEventListener { 20 | public function handle(Event $event): void { 21 | if (!($event instanceof AddMissingIndicesEvent)) { 22 | // Unrelated 23 | return; 24 | } 25 | 26 | $event->addMissingIndex( 27 | 'notifications_pushhash', 28 | 'oc_npushhash_di', 29 | ['deviceidentifier'], 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/Listener/PostLoginListener.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class PostLoginListener implements IEventListener { 25 | public function __construct( 26 | private SettingsMapper $settingsMapper, 27 | private IConfig $config, 28 | ) { 29 | } 30 | 31 | public function handle(Event $event): void { 32 | if (!($event instanceof PostLoginEvent)) { 33 | // Unrelated 34 | return; 35 | } 36 | 37 | $userId = $event->getUser()->getUID(); 38 | 39 | try { 40 | $this->settingsMapper->getSettingsByUser($userId); 41 | } catch (DoesNotExistException) { 42 | $defaultSoundNotification = $this->config->getAppValue(Application::APP_ID, 'sound_notification') === 'yes' ? 'yes' : 'no'; 43 | $defaultSoundTalk = $this->config->getAppValue(Application::APP_ID, 'sound_talk') === 'yes' ? 'yes' : 'no'; 44 | $defaultBatchtime = (int)$this->config->getAppValue(Application::APP_ID, 'setting_batchtime'); 45 | 46 | if ($defaultBatchtime !== Settings::EMAIL_SEND_WEEKLY 47 | && $defaultBatchtime !== Settings::EMAIL_SEND_DAILY 48 | && $defaultBatchtime !== Settings::EMAIL_SEND_3HOURLY 49 | && $defaultBatchtime !== Settings::EMAIL_SEND_HOURLY 50 | && $defaultBatchtime !== Settings::EMAIL_SEND_OFF) { 51 | $defaultBatchtime = Settings::EMAIL_SEND_3HOURLY; 52 | } 53 | 54 | $this->config->setUserValue($userId, Application::APP_ID, 'sound_notification', $defaultSoundNotification); 55 | $this->config->setUserValue($userId, Application::APP_ID, 'sound_talk', $defaultSoundTalk); 56 | $this->settingsMapper->setBatchSettingForUser($userId, $defaultBatchtime); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/Listener/UserCreatedListener.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class UserCreatedListener implements IEventListener { 23 | public function __construct( 24 | private SettingsMapper $settingsMapper, 25 | private IConfig $config, 26 | ) { 27 | } 28 | 29 | public function handle(Event $event): void { 30 | if (!($event instanceof UserCreatedEvent)) { 31 | // Unrelated 32 | return; 33 | } 34 | 35 | $userId = $event->getUser()->getUID(); 36 | 37 | $defaultSoundNotification = $this->config->getAppValue(Application::APP_ID, 'sound_notification') === 'yes' ? 'yes' : 'no'; 38 | $defaultSoundTalk = $this->config->getAppValue(Application::APP_ID, 'sound_talk') === 'yes' ? 'yes' : 'no'; 39 | $defaultBatchtime = (int)$this->config->getAppValue(Application::APP_ID, 'setting_batchtime'); 40 | 41 | if ($defaultBatchtime !== Settings::EMAIL_SEND_WEEKLY 42 | && $defaultBatchtime !== Settings::EMAIL_SEND_DAILY 43 | && $defaultBatchtime !== Settings::EMAIL_SEND_3HOURLY 44 | && $defaultBatchtime !== Settings::EMAIL_SEND_HOURLY 45 | && $defaultBatchtime !== Settings::EMAIL_SEND_OFF) { 46 | $defaultBatchtime = Settings::EMAIL_SEND_3HOURLY; 47 | } 48 | 49 | $this->config->setUserValue($userId, Application::APP_ID, 'sound_notification', $defaultSoundNotification); 50 | $this->config->setUserValue($userId, Application::APP_ID, 'sound_talk', $defaultSoundTalk); 51 | $this->settingsMapper->setBatchSettingForUser($userId, $defaultBatchtime); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/Listener/UserDeletedListener.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class UserDeletedListener implements IEventListener { 22 | public function __construct( 23 | private Handler $handler, 24 | private SettingsMapper $settingsMapper, 25 | ) { 26 | } 27 | 28 | public function handle(Event $event): void { 29 | if (!($event instanceof UserDeletedEvent)) { 30 | // Unrelated 31 | return; 32 | } 33 | 34 | $user = $event->getUser(); 35 | $this->handler->deleteByUser($user->getUID()); 36 | $this->settingsMapper->deleteSettingsByUser($user->getUID()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/Migration/Version2010Date20210218082855.php: -------------------------------------------------------------------------------- 1 | hasTable('notifications_pushtokens')) { 31 | $schema->dropTable('notifications_pushtokens'); 32 | return $schema; 33 | } 34 | 35 | return null; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/Migration/Version2011Date20210930134607.php: -------------------------------------------------------------------------------- 1 | hasTable('notifications_settings')) { 30 | $table = $schema->createTable('notifications_settings'); 31 | $table->addColumn('id', Types::BIGINT, [ 32 | 'autoincrement' => true, 33 | 'notnull' => true, 34 | 'length' => 4, 35 | ]); 36 | $table->addColumn('user_id', Types::STRING, [ 37 | 'notnull' => true, 38 | 'length' => 64, 39 | ]); 40 | $table->addColumn('batch_time', Types::INTEGER, [ 41 | 'default' => 0, 42 | 'length' => 4, 43 | ]); 44 | $table->addColumn('last_send_id', Types::BIGINT, [ 45 | 'default' => 0, 46 | ]); 47 | $table->addColumn('next_send_time', Types::INTEGER, [ 48 | 'default' => 0, 49 | 'length' => 11, 50 | ]); 51 | 52 | $table->setPrimaryKey(['id']); 53 | $table->addUniqueIndex(['user_id'], 'notset_user'); 54 | $table->addIndex(['next_send_time'], 'notset_nextsend'); 55 | 56 | return $schema; 57 | } 58 | 59 | return null; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/Migration/Version2011Date20220826074907.php: -------------------------------------------------------------------------------- 1 | connection->getQueryBuilder(); 25 | 26 | // The maximum valid value is NOW + 7 days, but since updating is fixed 27 | // and you only run into the bug at the year 2038, we can also count up 8 days. 28 | $time = time() + 3600 * 24 * 8; 29 | 30 | $query->update('notifications_settings') 31 | ->set('next_send_time', $query->createNamedParameter(1, IQueryBuilder::PARAM_INT)) 32 | ->where($query->expr()->gt('next_send_time', $query->createNamedParameter($time, IQueryBuilder::PARAM_INT))); 33 | $count = $query->executeStatement(); 34 | 35 | if ($count > 0) { 36 | $output->info('Fixed next send of ' . $count . ' disabled users'); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/Model/Settings.php: -------------------------------------------------------------------------------- 1 | addType('userId', Types::STRING); 43 | $this->addType('batchTime', Types::INTEGER); 44 | $this->addType('lastSendId', Types::BIGINT); 45 | $this->addType('nextSendTime', Types::INTEGER); 46 | } 47 | 48 | public function asArray(): array { 49 | return [ 50 | 'id' => $this->getId(), 51 | 'user_id' => $this->getUserId(), 52 | 'batch_time' => $this->getBatchTime(), 53 | 'last_send_id' => $this->getLastSendId(), 54 | 'next_send_time' => $this->getNextSendTime(), 55 | ]; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/ResponseDefinitions.php: -------------------------------------------------------------------------------- 1 | 44 | * 45 | * @psalm-type NotificationsNotificationAction = array{ 46 | * label: string, 47 | * link: string, 48 | * type: string, 49 | * primary: bool, 50 | * } 51 | * 52 | * @psalm-type NotificationsNotification = array{ 53 | * notification_id: int, 54 | * app: string, 55 | * user: string, 56 | * datetime: string, 57 | * object_type: string, 58 | * object_id: string, 59 | * subject: string, 60 | * message: string, 61 | * link: string, 62 | * actions: list, 63 | * subjectRich?: string, 64 | * subjectRichParameters?: NotificationsRichObjectParameters, 65 | * messageRich?: string, 66 | * messageRichParameters?: NotificationsRichObjectParameters, 67 | * icon?: string, 68 | * shouldNotify?: bool, 69 | * } 70 | * 71 | * @psalm-type NotificationsPushDevice = array{ 72 | * publicKey: string, 73 | * deviceIdentifier: string, 74 | * signature: string, 75 | * } 76 | */ 77 | class ResponseDefinitions { 78 | } 79 | -------------------------------------------------------------------------------- /lib/Service/ClientService.php: -------------------------------------------------------------------------------- 1 | connection->getQueryBuilder(); 26 | $query->select('name') 27 | ->from('authtoken') 28 | ->where($query->expr()->eq('uid', $query->createNamedParameter($userId))); 29 | 30 | if ($maxAge !== 0) { 31 | $query->andWhere($query->expr()->gte( 32 | 'last_activity', 33 | $query->createNamedParameter($maxAge, IQueryBuilder::PARAM_INT) 34 | )); 35 | } 36 | 37 | $result = $query->executeQuery(); 38 | while ($row = $result->fetch()) { 39 | if (preg_match('/ \(Talk Desktop Client - [A-Za-z ]+\)$/', $row['name'])) { 40 | $result->closeCursor(); 41 | return true; 42 | } 43 | } 44 | $result->closeCursor(); 45 | 46 | return false; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/Settings/AdminSection.php: -------------------------------------------------------------------------------- 1 | url->imagePath('notifications', 'notifications-dark.svg'); 32 | } 33 | 34 | /** 35 | * returns the ID of the section. It is supposed to be a lower case string, 36 | * e.g. 'ldap' 37 | * 38 | * @returns string 39 | * @since 9.1 40 | */ 41 | public function getID(): string { 42 | return 'notifications'; 43 | } 44 | 45 | /** 46 | * returns the translated name as it should be displayed, e.g. 'LDAP / AD 47 | * integration'. Use the L10N service to translate it. 48 | * 49 | * @return string 50 | * @since 9.1 51 | */ 52 | public function getName(): string { 53 | return $this->l->t('Notifications'); 54 | } 55 | 56 | /** 57 | * @return int whether the form should be rather on the top or bottom of 58 | * the settings navigation. The sections are arranged in ascending order of 59 | * the priority values. It is required to return a value between 0 and 99. 60 | * 61 | * E.g.: 70 62 | * @since 9.1 63 | */ 64 | public function getPriority(): int { 65 | return 55; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /lib/Settings/PersonalSection.php: -------------------------------------------------------------------------------- 1 | url->imagePath('notifications', 'notifications-dark.svg'); 32 | } 33 | 34 | /** 35 | * returns the ID of the section. It is supposed to be a lower case string, 36 | * e.g. 'ldap' 37 | * 38 | * @returns string 39 | * @since 9.1 40 | */ 41 | public function getID(): string { 42 | return 'notifications'; 43 | } 44 | 45 | /** 46 | * returns the translated name as it should be displayed, e.g. 'LDAP / AD 47 | * integration'. Use the L10N service to translate it. 48 | * 49 | * @return string 50 | * @since 9.1 51 | */ 52 | public function getName(): string { 53 | return $this->l->t('Notifications'); 54 | } 55 | 56 | /** 57 | * @return int whether the form should be rather on the top or bottom of 58 | * the settings navigation. The sections are arranged in ascending order of 59 | * the priority values. It is required to return a value between 0 and 99. 60 | * 61 | * E.g.: 70 62 | * @since 9.1 63 | */ 64 | public function getPriority(): int { 65 | return 10; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /lib/Settings/SetupWarningOnRateLimitReached.php: -------------------------------------------------------------------------------- 1 | l->t('Push notifications - Fair use policy'); 39 | } 40 | 41 | /** 42 | * @inheritDoc 43 | */ 44 | public function run(): SetupResult { 45 | $lastReached = (int)$this->config->getAppValue(Application::APP_ID, 'rate_limit_reached', '0'); 46 | if ($lastReached < ($this->timeFactory->getTime() - 7 * 24 * 3600)) { 47 | return SetupResult::success(); 48 | } 49 | 50 | return SetupResult::error( 51 | $this->l->t('Nextcloud GmbH sponsors a free push notification gateway for private users. To ensure good service, the gateway limits the number of push notifications per server and the limit was reached for this server. For enterprise users, a more scalable gateway is available.'), 52 | 'https://nextcloud.com/fairusepolicy' 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "notifications", 3 | "description": "This app provides a backend and frontend for the notification API available in Nextcloud.", 4 | "version": "5.0.0-dev.0", 5 | "author": "Joas Schilling ", 6 | "license": "AGPL-3.0-only", 7 | "private": true, 8 | "scripts": { 9 | "build": "vite build", 10 | "dev": "vite build --mode development", 11 | "watch": "vite build --mode development --watch", 12 | "lint": "eslint --ext .js,.vue src", 13 | "lint:fix": "eslint --ext .js,.vue src --fix", 14 | "stylelint": "stylelint src/**/*.scss src/**/*.vue", 15 | "stylelint:fix": "stylelint src/**/*.scss src/**/*.vue --fix" 16 | }, 17 | "dependencies": { 18 | "@nextcloud/auth": "^2.4.0", 19 | "@nextcloud/axios": "^2.5.1", 20 | "@nextcloud/browser-storage": "^0.4.0", 21 | "@nextcloud/capabilities": "^1.2.0", 22 | "@nextcloud/dialogs": "^6.3.0", 23 | "@nextcloud/event-bus": "^3.3.2", 24 | "@nextcloud/initial-state": "^2.2.0", 25 | "@nextcloud/l10n": "^3.2.0", 26 | "@nextcloud/notify_push": "^1.3.0", 27 | "@nextcloud/router": "^3.0.1", 28 | "@nextcloud/vue": "^8.27.0", 29 | "howler": "^2.2.4", 30 | "ua-parser-js": "^2.0.3", 31 | "v-click-outside": "^3.2.0", 32 | "vue": "^2.7.16", 33 | "vue-material-design-icons": "^5.3.1" 34 | }, 35 | "engines": { 36 | "node": "^20.0.0", 37 | "npm": "^10.0.0" 38 | }, 39 | "browserslist": [ 40 | "extends @nextcloud/browserslist-config" 41 | ], 42 | "devDependencies": { 43 | "@nextcloud/browserslist-config": "^3.0.1", 44 | "@nextcloud/eslint-config": "^8.4.2", 45 | "@nextcloud/stylelint-config": "^3.0.1", 46 | "@nextcloud/vite-config": "^1.5.6", 47 | "babel-loader-exclude-node-modules-except": "^1.2.1", 48 | "vue-template-compiler": "^2.7.16" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /psalm.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /rector.php: -------------------------------------------------------------------------------- 1 | withPaths([ 13 | __DIR__ . '/appinfo', 14 | __DIR__ . '/lib', 15 | __DIR__ . '/templates', 16 | __DIR__ . '/tests/Integration', 17 | __DIR__ . '/tests/Unit', 18 | ]) 19 | ->withPhpSets(php81: true) 20 | ->withTypeCoverageLevel(0); 21 | -------------------------------------------------------------------------------- /src/Components/Parameters/DefaultParameter.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 20 | 21 | 53 | 54 | 59 | -------------------------------------------------------------------------------- /src/Components/Parameters/File.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 58 | -------------------------------------------------------------------------------- /src/Components/Parameters/User.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 17 | 18 | 55 | 56 | 62 | -------------------------------------------------------------------------------- /src/adminSettings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import Vue from 'vue' 7 | import AdminSettings from './views/AdminSettings.vue' 8 | 9 | // Styles 10 | import '@nextcloud/dialogs/style.css' 11 | 12 | Vue.prototype.t = t 13 | Vue.prototype.n = n 14 | 15 | export default new Vue({ 16 | el: '#notifications-admin-settings', 17 | render: h => h(AdminSettings), 18 | }) 19 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import Vue from 'vue' 7 | 8 | // Styles 9 | import './styles/styles.scss' 10 | import '@nextcloud/dialogs/style.css' 11 | 12 | Vue.prototype.t = t 13 | Vue.prototype.n = n 14 | Vue.prototype.OC = OC 15 | Vue.prototype.OCA = OCA 16 | 17 | export default new Vue({ 18 | el: '#notifications', 19 | // eslint-disable-next-line vue/match-component-file-name 20 | name: 'NotificationsApp', 21 | components: { 22 | NotificationsApp: () => import(/* webpackPreload: true */'./NotificationsApp.vue'), 23 | }, 24 | render: h => h('NotificationsApp'), 25 | }) 26 | -------------------------------------------------------------------------------- /src/services/BrowserStorage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { getBuilder } from '@nextcloud/browser-storage' 7 | 8 | export default getBuilder('notifications').clearOnLogout().persist().build() 9 | -------------------------------------------------------------------------------- /src/settings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import Vue from 'vue' 7 | import UserSettings from './views/UserSettings.vue' 8 | 9 | // Styles 10 | import '@nextcloud/dialogs/style.css' 11 | 12 | Vue.prototype.t = t 13 | Vue.prototype.n = n 14 | 15 | export default new Vue({ 16 | el: '#notifications-user-settings', 17 | render: h => h(UserSettings), 18 | }) 19 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | const stylelintConfig = require('@nextcloud/stylelint-config') 6 | 7 | module.exports = stylelintConfig 8 | -------------------------------------------------------------------------------- /templates/settings/admin.php: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /templates/settings/personal.php: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /tests/Integration/app/appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 9 | notificationsintegrationtesting 10 | Notifications Integration Testing 11 | 12 | 13 | 14 | 0.3.0 15 | agpl 16 | Joas Schilling 17 | NotificationsIntegrationTesting 18 | 19 | 20 | 21 | 22 | 23 | tools 24 | 25 | https://github.com/nextcloud/notifications 26 | https://github.com/nextcloud/notifications/issues 27 | https://github.com/nextcloud/notifications.git 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /tests/Integration/app/appinfo/routes.php: -------------------------------------------------------------------------------- 1 | [ 9 | ['name' => 'Endpoint#deleteNotifications', 'url' => '', 'verb' => 'DELETE'], 10 | ['name' => 'Endpoint#addNotification', 'url' => '/notifications', 'verb' => 'POST'], 11 | ], 12 | ]; 13 | -------------------------------------------------------------------------------- /tests/Integration/app/lib/AppInfo/Application.php: -------------------------------------------------------------------------------- 1 | registerNotifierService(Notifier::class); 26 | } 27 | 28 | public function boot(IBootContext $context): void { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Integration/app/lib/Controller/EndpointController.php: -------------------------------------------------------------------------------- 1 | manager = $manager; 26 | } 27 | 28 | /** 29 | * @NoCSRFRequired 30 | * 31 | * @param string $userId 32 | * @return DataResponse 33 | */ 34 | public function addNotification(string $userId = 'test1') { 35 | $notification = $this->manager->createNotification(); 36 | $notification->setApp($this->request->getParam('app', 'notificationsintegrationtesting')) 37 | ->setDateTime(\DateTime::createFromFormat('U', $this->request->getParam('timestamp', 1449585176))) // 2015-12-08T14:32:56+00:00 38 | ->setUser($this->request->getParam('user', $userId)) 39 | ->setSubject($this->request->getParam('subject', 'testing')) 40 | ->setLink($this->request->getParam('link', 'https://example.tld/')) 41 | ->setMessage($this->request->getParam('message', 'message')) 42 | ->setObject($this->request->getParam('object_type', 'object'), $this->request->getParam('object_id', 23)); 43 | 44 | $this->manager->notify($notification); 45 | 46 | return new DataResponse(); 47 | } 48 | 49 | /** 50 | * @NoCSRFRequired 51 | * 52 | * @return DataResponse 53 | */ 54 | public function deleteNotifications() { 55 | $notification = $this->manager->createNotification(); 56 | $this->manager->markProcessed($notification); 57 | 58 | return new DataResponse(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /tests/Integration/app/lib/Notifier.php: -------------------------------------------------------------------------------- 1 | getApp() === 'notificationsintegrationtesting') { 41 | $notification->setParsedSubject($notification->getSubject()); 42 | $notification->setParsedMessage($notification->getMessage()); 43 | return $notification; 44 | } 45 | 46 | throw new \InvalidArgumentException(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/Integration/base-query-count.txt: -------------------------------------------------------------------------------- 1 | 8600 2 | -------------------------------------------------------------------------------- /tests/Integration/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "platform": { 4 | "php": "8.1" 5 | }, 6 | "sort-packages": true 7 | }, 8 | "require-dev": { 9 | "behat/behat": "^3.22", 10 | "guzzlehttp/guzzle": "^7.9", 11 | "phpunit/phpunit": "^10.5" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/Integration/config/behat.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-FileCopyrightText: 2015 ownCloud, Inc. 3 | # SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | default: 6 | formatters: 7 | junit: 8 | output_path: '%paths.base%/../output' 9 | pretty: 10 | output_styles: 11 | comment: [ 'bright-blue' ] 12 | autoload: 13 | '': '%paths.base%/../features/bootstrap' 14 | suites: 15 | default: 16 | paths: 17 | - '%paths.base%/../features' 18 | contexts: 19 | - FeatureContext 20 | -------------------------------------------------------------------------------- /tests/Integration/features/admin-notification-v2.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | Feature: admin-notification 4 | Background: 5 | Given user "test1" exists 6 | Given as user "test1" 7 | 8 | Scenario: Create notification 9 | Given user "admin" sends admin notification to "test1" with 10 | | shortMessage | without long message | 11 | Then user "test1" has 1 notifications on v2 12 | And last notification on v2 matches 13 | | app | admin_notifications | 14 | | subject | without long message | 15 | | link | | 16 | | message | | 17 | | object_type | admin_notifications | 18 | 19 | Scenario: Create different notification 20 | Given user "admin" sends admin notification to "test1" with 21 | | shortMessage | with long message | 22 | | longMessage | this is long message | 23 | Then user "test1" has 1 notifications on v2 24 | And last notification on v2 matches 25 | | app | admin_notifications | 26 | | subject | with long message | 27 | | link | | 28 | | message | this is long message | 29 | | object_type | admin_notifications | 30 | -------------------------------------------------------------------------------- /tests/Integration/features/delete-notifications-v1.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. 3 | # SPDX-License-Identifier: CC0-1.0 4 | Feature: delete-notifications 5 | Background: 6 | Given user "test1" exists 7 | Given as user "test1" 8 | 9 | Scenario: Delete first notification 10 | Given user "test1" has notifications 11 | Given user "test1" has notifications 12 | Given user "test1" has notifications 13 | Then user "test1" has 3 notifications on v1 14 | And delete first notification on v1 15 | And status code is 200 16 | And user "test1" has 2 notifications on v1 missing the first one 17 | 18 | Scenario: Delete same notification twice 19 | Given user "test1" has notifications 20 | Given user "test1" has notifications 21 | Given user "test1" has notifications 22 | When user "test1" has 3 notifications on v1 23 | And delete first notification on v1 24 | And status code is 200 25 | And delete same notification on v1 26 | And status code is 200 27 | And user "test1" has 2 notifications on v1 missing the first one 28 | 29 | Scenario: Delete faulty notification 30 | Given user "test1" has notifications 31 | Given user "test1" has notifications 32 | Given user "test1" has notifications 33 | When user "test1" has 3 notifications on v1 34 | And delete faulty notification on v1 35 | And status code is 404 36 | And user "test1" has 3 notifications on v1 37 | 38 | Scenario: Delete last notification 39 | Given user "test1" has notifications 40 | Given user "test1" has notifications 41 | Given user "test1" has notifications 42 | Then user "test1" has 3 notifications on v1 43 | And delete last notification on v1 44 | And status code is 200 45 | And user "test1" has 2 notifications on v1 missing the last one 46 | 47 | Scenario: Delete all notifications 48 | Given user "test1" has notifications 49 | Given user "test1" has notifications 50 | Given user "test1" has notifications 51 | Then user "test1" has 3 notifications on v1 52 | And delete all notifications on v1 53 | And status code is 200 54 | And user "test1" has 0 notifications on v1 55 | -------------------------------------------------------------------------------- /tests/Integration/features/exists-notifications-v2.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | Feature: exists-notifications-v2 4 | Background: 5 | Given user "test1" exists 6 | Given as user "test1" 7 | 8 | Scenario: Check the notification ID is returned on exists-check 9 | Given user "test1" has notifications 10 | And user "test1" has 1 notifications on v2 11 | Then confirms previously fetched notification ids exist on v2 12 | -------------------------------------------------------------------------------- /tests/Integration/features/notifications-content-v1.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-FileCopyrightText: 2016 ownCloud, Inc. 3 | # SPDX-License-Identifier: CC0-1.0 4 | Feature: notifications-content 5 | Background: 6 | Given user "test1" exists 7 | Given as user "test1" 8 | 9 | Scenario: Create notification 10 | Given user "test1" receives notification with 11 | | app | notificationsintegrationtesting | 12 | | timestamp | 144958517 | 13 | | subject | Integration testing | 14 | | link | https://example.tld/blog/about-notifications/ | 15 | | message | About Activities and Notifications in ownCloud | 16 | | object_type | blog | 17 | | object_id | 9483 | 18 | Then user "test1" has 1 notifications on v1 19 | And last notification on v1 matches 20 | | app | notificationsintegrationtesting | 21 | | datetime | 1974-08-05T18:15:17+00:00 | 22 | | subject | Integration testing | 23 | | link | https://example.tld/blog/about-notifications/ | 24 | | message | About Activities and Notifications in ownCloud | 25 | | object_type | blog | 26 | | object_id | 9483 | 27 | 28 | Scenario: Create different notification 29 | Given user "test1" receives notification with 30 | | app | notificationsintegrationtesting | 31 | | timestamp | 144958515 | 32 | | subject | Testing integration | 33 | | link | https://github.com/nextcloud/notifications/blob/master/docs/ocs-endpoint-v1.md | 34 | | message | Reading and deleting notifications as a Client | 35 | | object_type | repo | 36 | | object_id | notifications | 37 | Then user "test1" has 1 notifications on v1 38 | And last notification on v1 matches 39 | | app | notificationsintegrationtesting | 40 | | datetime | 1974-08-05T18:15:15+00:00 | 41 | | subject | Testing integration | 42 | | link | https://github.com/nextcloud/notifications/blob/master/docs/ocs-endpoint-v1.md | 43 | | message | Reading and deleting notifications as a Client | 44 | | object_type | repo | 45 | | object_id | notifications | 46 | -------------------------------------------------------------------------------- /tests/Integration/features/notifications-content-v2.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | Feature: notifications-content 4 | Background: 5 | Given user "test1" exists 6 | Given as user "test1" 7 | 8 | Scenario: Create notification 9 | Given user "test1" receives notification with 10 | | app | notificationsintegrationtesting | 11 | | timestamp | 144958517 | 12 | | subject | Integration testing | 13 | | link | https://example.tld/blog/about-notifications/ | 14 | | message | About Activities and Notifications in ownCloud | 15 | | object_type | blog | 16 | | object_id | 9483 | 17 | Then user "test1" has 1 notifications on v2 18 | And last notification on v2 matches 19 | | app | notificationsintegrationtesting | 20 | | datetime | 1974-08-05T18:15:17+00:00 | 21 | | subject | Integration testing | 22 | | link | https://example.tld/blog/about-notifications/ | 23 | | message | About Activities and Notifications in ownCloud | 24 | | object_type | blog | 25 | | object_id | 9483 | 26 | 27 | Scenario: Create different notification 28 | Given user "test1" receives notification with 29 | | app | notificationsintegrationtesting | 30 | | timestamp | 144958515 | 31 | | subject | Testing integration | 32 | | link | https://github.com/nextcloud/notifications/blob/master/docs/ocs-endpoint-v1.md | 33 | | message | Reading and deleting notifications as a Client | 34 | | object_type | repo | 35 | | object_id | notifications | 36 | Then user "test1" has 1 notifications on v2 37 | And last notification on v2 matches 38 | | app | notificationsintegrationtesting | 39 | | datetime | 1974-08-05T18:15:15+00:00 | 40 | | subject | Testing integration | 41 | | link | https://github.com/nextcloud/notifications/blob/master/docs/ocs-endpoint-v1.md | 42 | | message | Reading and deleting notifications as a Client | 43 | | object_type | repo | 44 | | object_id | notifications | 45 | -------------------------------------------------------------------------------- /tests/Integration/features/statuscodes-v1.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. 3 | # SPDX-License-Identifier: CC0-1.0 4 | Feature: statuscodes 5 | Background: 6 | Given user "test1" exists 7 | Given as user "test1" 8 | 9 | Scenario: Status code when reading notifications with notifiers and without notifications 10 | When getting notifications on v1 11 | Then status code is 200 12 | And list of notifications has 0 entries 13 | 14 | Scenario: Status code when reading notifications with notifiers and notification 15 | Given user "test1" has notifications 16 | When getting notifications on v1 17 | Then status code is 200 18 | And list of notifications has 1 entries 19 | 20 | Scenario: Status code when reading notifications with notifiers and notifications 21 | Given user "test1" has notifications 22 | Given user "test1" has notifications 23 | Given user "test1" has notifications 24 | When getting notifications on v1 25 | Then status code is 200 26 | And list of notifications has 3 entries 27 | 28 | Scenario: Status code when reading notifications with different etag 29 | Given user "test1" has notifications 30 | Given user "test1" has notifications 31 | Given user "test1" has notifications 32 | When getting notifications on v1 33 | Then status code is 200 34 | And list of notifications has 3 entries 35 | When getting notifications on v1 with different etag 36 | Then status code is 200 37 | And list of notifications has 3 entries 38 | 39 | Scenario: Status code when reading notifications with matching etag 40 | Given user "test1" has notifications 41 | Given user "test1" has notifications 42 | Given user "test1" has notifications 43 | When getting notifications on v1 44 | Then status code is 200 45 | And list of notifications has 3 entries 46 | When getting notifications on v1 with matching etag 47 | # Then status code is 304 - Disabled because it's not listed in the API specs 48 | Then status code is 200 49 | # And response body is empty - Disabled because it's not listed in the API specs 50 | And list of notifications has 3 entries 51 | -------------------------------------------------------------------------------- /tests/Integration/features/statuscodes-v2.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | Feature: statuscodes 4 | Background: 5 | Given user "test1" exists 6 | Given as user "test1" 7 | 8 | Scenario: Status code when reading notifications with notifiers and without notifications 9 | When getting notifications on v2 10 | Then status code is 200 11 | And list of notifications has 0 entries 12 | 13 | Scenario: Status code when reading notifications with notifiers and notification 14 | Given user "test1" has notifications 15 | When getting notifications on v2 16 | Then status code is 200 17 | And list of notifications has 1 entries 18 | 19 | Scenario: Status code when reading notifications with notifiers and notifications 20 | Given user "test1" has notifications 21 | Given user "test1" has notifications 22 | Given user "test1" has notifications 23 | When getting notifications on v2 24 | Then status code is 200 25 | And list of notifications has 3 entries 26 | 27 | Scenario: Status code when reading notifications with different etag 28 | Given user "test1" has notifications 29 | Given user "test1" has notifications 30 | Given user "test1" has notifications 31 | When getting notifications on v2 32 | Then status code is 200 33 | And list of notifications has 3 entries 34 | When getting notifications on v2 with different etag 35 | Then status code is 200 36 | And list of notifications has 3 entries 37 | 38 | Scenario: Status code when reading notifications with matching etag 39 | Given user "test1" has notifications 40 | Given user "test1" has notifications 41 | Given user "test1" has notifications 42 | When getting notifications on v2 43 | Then status code is 200 44 | And list of notifications has 3 entries 45 | When getting notifications on v2 with matching etag 46 | Then status code is 304 47 | And response body is empty 48 | -------------------------------------------------------------------------------- /tests/Integration/run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors 4 | # SPDX-FileCopyrightText: 2015 ownCloud, Inc. 5 | # SPDX-License-Identifier: AGPL-3.0-or-later 6 | 7 | APP_NAME=notifications 8 | 9 | APP_INTEGRATION_DIR=$PWD 10 | ROOT_DIR=${APP_INTEGRATION_DIR}/../../../.. 11 | composer install 12 | 13 | #php -S localhost:8080 -t ${ROOT_DIR} & 14 | #PHPPID=$! 15 | #echo $PHPPID 16 | 17 | cp -R ./app ../../../notificationsintegrationtesting 18 | ${ROOT_DIR}/occ app:enable notifications 19 | ${ROOT_DIR}/occ app:enable --force notificationsintegrationtesting 20 | ${ROOT_DIR}/occ app:enable provisioning_api 21 | ${ROOT_DIR}/occ app:list | grep notifications 22 | ${ROOT_DIR}/occ app:list | grep provisioning_api 23 | 24 | export TEST_SERVER_URL="http://localhost:8080/" 25 | ${APP_INTEGRATION_DIR}/vendor/bin/behat --colors -f junit -f pretty $1 $2 26 | RESULT=$? 27 | 28 | #kill $PHPPID 29 | 30 | ${ROOT_DIR}/occ app:disable notificationsintegrationtesting 31 | rm -rf ../../../notificationsintegrationtesting 32 | 33 | exit $RESULT 34 | -------------------------------------------------------------------------------- /tests/Unit/AppInfo/ApplicationTest.php: -------------------------------------------------------------------------------- 1 | app = new Application(); 38 | $this->container = $this->app->getContainer(); 39 | } 40 | 41 | public function testContainerAppName(): void { 42 | $this->app = new Application(); 43 | $this->assertEquals('notifications', $this->container->getAppName()); 44 | } 45 | 46 | public static function dataContainerQuery(): array { 47 | return [ 48 | // lib/ 49 | [App::class], 50 | [App::class, IApp::class], 51 | [Capabilities::class], 52 | [Handler::class], 53 | [Push::class], 54 | 55 | // Controller/ 56 | [EndpointController::class], 57 | [EndpointController::class, OCSController::class], 58 | [PushController::class], 59 | [PushController::class, OCSController::class], 60 | ]; 61 | } 62 | 63 | /** 64 | * @dataProvider dataContainerQuery 65 | */ 66 | public function testContainerQuery(string $service, ?string $expected = null): void { 67 | if ($expected === null) { 68 | $expected = $service; 69 | } 70 | $this->assertTrue($this->container->query($service) instanceof $expected); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /tests/Unit/AppInfo/RoutesTest.php: -------------------------------------------------------------------------------- 1 | assertIsArray($routes); 24 | $this->assertCount(1, $routes); 25 | $this->assertArrayHasKey('ocs', $routes); 26 | $this->assertIsArray($routes['ocs']); 27 | $this->assertCount(10, $routes['ocs']); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Unit/CapabilitiesTest.php: -------------------------------------------------------------------------------- 1 | assertSame([ 20 | 'notifications' => [ 21 | 'ocs-endpoints' => [ 22 | 'list', 23 | 'get', 24 | 'delete', 25 | 'delete-all', 26 | 'icons', 27 | 'rich-strings', 28 | 'action-web', 29 | 'user-status', 30 | 'exists', 31 | 'test-push', 32 | ], 33 | 'push' => [ 34 | 'devices', 35 | 'object-data', 36 | 'delete', 37 | ], 38 | 'admin-notifications' => [ 39 | 'ocs', 40 | 'cli', 41 | ], 42 | ], 43 | ], $capabilities->getCapabilities()); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/Unit/bootstrap.php: -------------------------------------------------------------------------------- 1 | loadApp('notifications'); 22 | -------------------------------------------------------------------------------- /tests/Unit/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | . 11 | 12 | 13 | 14 | ../../../notifications/lib 15 | ../../../notifications/appinfo 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/psalm-baseline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | identityProof]]> 6 | tokenProvider]]> 7 | tokenProvider]]> 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ]]> 21 | ]]> 22 | 23 | 24 | 25 | 26 | keyManager]]> 27 | keyManager]]> 28 | tokenProvider]]> 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /tests/stubs/oc_hooks_emitter.php: -------------------------------------------------------------------------------- 1 | { 30 | // By default, Vite stores __vitePreload in the entrypoint 31 | // Then chunks import entrypoint to get the _vitePreload function 32 | // Which results not only in cyclic import but also duplicated module in production 33 | // Because in production entrypoints must be imported with ?v=hash cache busting 34 | // See: https://github.com/nextcloud/notifications/issues/2164 35 | // 36 | // To avoid it - explicitly exclude the preload helper to a separate chunk 37 | // 38 | // TODO: add to @nextcloud/vite-config 39 | if (id.startsWith('\0vite/preload-helper')) { 40 | return 'vite-preload-helper' 41 | } 42 | }, 43 | }, 44 | }, 45 | }, 46 | }, 47 | }) 48 | --------------------------------------------------------------------------------