forked from wallabag/wallabag
Compare commits
282 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 055d304bc9 | |||
| 812d6ac376 | |||
| 268372dbbd | |||
| 4e023bddc3 | |||
| acd285dcbb | |||
| f1b3d5cdd7 | |||
| 242e3feac9 | |||
| bd4c71682e | |||
| 784bc1393c | |||
| 42b03d2834 | |||
| 8954100779 | |||
| b795622f06 | |||
| 5ac6b6bff9 | |||
| 0f7460dbab | |||
| 3ed7f2b751 | |||
| 0fdd9aa991 | |||
| 9e9aedee94 | |||
| ea189503de | |||
| b50197664e | |||
| 63b7b1c18f | |||
| 7b2107d3bb | |||
| 14801e36d0 | |||
| 08ce432cea | |||
| 809e41fe6b | |||
| ce79140426 | |||
| dc28d7ea0f | |||
| 3340262707 | |||
| d4b0b62bb5 | |||
| 7b150dcd26 | |||
| 24ae1dbc95 | |||
| 3ddfe3315a | |||
| 4d318ff559 | |||
| ee715e8b81 | |||
| 1d9137a343 | |||
| 7f31603203 | |||
| f994ab8b5d | |||
| e67e557721 | |||
| 6f750a3b66 | |||
| 3589aafbff | |||
| 6569d15297 | |||
| a4ea04c9db | |||
| 53574f05d5 | |||
| cb8f50307c | |||
| 4f16640d90 | |||
| a34750b5ee | |||
| 3b1e4e027b | |||
| 1dc6e88cd2 | |||
| 4c79004d84 | |||
| 639bba031f | |||
| 6da76ffaae | |||
| ed777871c0 | |||
| f2f542d093 | |||
| a5dd42958f | |||
| 46dec2de03 | |||
| a272abf9cd | |||
| 6e2b9dc9e0 | |||
| 7ca3b15359 | |||
| 0c80ff1054 | |||
| b30914b847 | |||
| ad93db45ef | |||
| 4ce1b50aeb | |||
| 6c84f6c04e | |||
| 9c5feb64f3 | |||
| d7829ff5fd | |||
| 36c9a5ec45 | |||
| 2aff236941 | |||
| ed4022e8fb | |||
| 254399bd38 | |||
| dedaa29c8d | |||
| b695b4c40f | |||
| 792363e695 | |||
| 1a49567d0c | |||
| 812b4a906f | |||
| a452bb6204 | |||
| b768371a13 | |||
| 3095d0f178 | |||
| 4783b01355 | |||
| 8111a55b79 | |||
| fab2e7d196 | |||
| badc02d6b8 | |||
| 03763e7753 | |||
| c94d981083 | |||
| db25a7f5d8 | |||
| 1baf6eeafd | |||
| f1dde1ac80 | |||
| 52312ed9f5 | |||
| 210eca58ed | |||
| b8a9ba8063 | |||
| e3a6133046 | |||
| 7459ed1459 | |||
| 21b6121726 | |||
| bac0da8f36 | |||
| d729fe8583 | |||
| 94a710c578 | |||
| d80126c19f | |||
| a4f4c5902f | |||
| 1e042a2d60 | |||
| e90a2dce4d | |||
| 1423c667b2 | |||
| 24f6f253f6 | |||
| 8620aac6b6 | |||
| 669e6f44dc | |||
| 101a2e14e5 | |||
| c7e04eb294 | |||
| cedb0fe342 | |||
| 5514932979 | |||
| 5554414d79 | |||
| 63ece0e41c | |||
| 03900a54c0 | |||
| ed6b0fbd9f | |||
| 86b136f65f | |||
| d73b9275f2 | |||
| ff3a670e19 | |||
| dab677fbc3 | |||
| 94a84d3d1d | |||
| fe4864f50f | |||
| d300c3efc1 | |||
| b30b460ba1 | |||
| 58572d8005 | |||
| ea8623d899 | |||
| 4a3d767202 | |||
| 8fb6a91d56 | |||
| cbe77537b1 | |||
| 873f1358b0 | |||
| b73491e822 | |||
| 3e7494bef6 | |||
| 3b9b1fd611 | |||
| 47ce4182d9 | |||
| 1d490f7712 | |||
| e81f8043b3 | |||
| 7f05c5e583 | |||
| 32428194cc | |||
| 44b9cb5fff | |||
| fd5fbaaefc | |||
| e7b43150b3 | |||
| e03cf56757 | |||
| ad4ea3abcc | |||
| 12ac1597cb | |||
| 2872dbc876 | |||
| ee1b2af5b7 | |||
| 6e4b650c04 | |||
| abcbbc9043 | |||
| cd4105bbe9 | |||
| c1dd6bab0b | |||
| 51c9c2285f | |||
| 2e2cefc92f | |||
| 6d3450357b | |||
| e58a801c4a | |||
| e4a58711f9 | |||
| 1da1458e3d | |||
| bc4e9aa908 | |||
| 0d90358d07 | |||
| 14c05e275e | |||
| 90920553eb | |||
| a5d1efd4d6 | |||
| a45c2ff658 | |||
| 57d018248c | |||
| d1463d1073 | |||
| ef60e561f4 | |||
| 496fdd44f7 | |||
| e93c0b08c6 | |||
| 5b491799c1 | |||
| c513147c94 | |||
| 51f9c1d96e | |||
| 1c6bc9ab3f | |||
| 67caee2e2c | |||
| c92622ff5e | |||
| b7a7936db2 | |||
| 55ee9b88eb | |||
| f6e0a9de33 | |||
| 4d0d64579c | |||
| 787c569193 | |||
| 395c2de900 | |||
| ff7f89e593 | |||
| f55865ba21 | |||
| b8630964d5 | |||
| 2560950780 | |||
| 7130f4ea1b | |||
| 25db404dd3 | |||
| 3f6faa1ef6 | |||
| 62a0590ea8 | |||
| 66a8002c14 | |||
| 7e79a69fa2 | |||
| 04139ca45e | |||
| f22e98c65f | |||
| 7af78ae542 | |||
| 84746674ea | |||
| bbebba3f92 | |||
| 91d7533f90 | |||
| 37f13a2275 | |||
| 83e6fb11ea | |||
| 1d324f368d | |||
| 0952142785 | |||
| b7b61a40a1 | |||
| 0e8bbfdbab | |||
| cfb60af0c2 | |||
| d787d3cdd2 | |||
| 075c44552f | |||
| 9e0c57c349 | |||
| 7f4eedd833 | |||
| 3801f14c0a | |||
| 3c70c00e40 | |||
| 2f7e2cf6b2 | |||
| a84ca8a525 | |||
| 821093c033 | |||
| 10f96ec555 | |||
| a177bccdbf | |||
| dda2190e1b | |||
| e50f2daf76 | |||
| 274d6d325c | |||
| 1f4de1bc51 | |||
| 519af0781c | |||
| 8ddafbf5a4 | |||
| 31da1c6a05 | |||
| 5edc1625c3 | |||
| ddb367cdcc | |||
| 4ce4cc94ea | |||
| 805d40d658 | |||
| 437f2c5909 | |||
| aa029ea73e | |||
| 53ce0b91b5 | |||
| 14a1755445 | |||
| 652e0e63bc | |||
| c2ef197726 | |||
| a505e9a1b5 | |||
| b9e25a8810 | |||
| 1d1c2a3311 | |||
| 88a92dd734 | |||
| d66a320d4f | |||
| 9d804b9386 | |||
| 850cb539fd | |||
| 18f57c58a9 | |||
| d523fbb024 | |||
| 901a320cb3 | |||
| d57694bfc9 | |||
| 932a1cb422 | |||
| e934516b28 | |||
| 6999f32020 | |||
| 9a5821eb09 | |||
| 67e1bb06b7 | |||
| a56c5d07ba | |||
| 338d8b25e2 | |||
| 024cae54e9 | |||
| ed45f594d9 | |||
| 9c32732f2a | |||
| eee16a9a4f | |||
| 9a8f298f8c | |||
| 1bd1a6f6a0 | |||
| d1bafed5ce | |||
| 8376fc4c08 | |||
| 031f5d27d8 | |||
| 96b7b7b831 | |||
| 212c96fd7d | |||
| 9a4df92333 | |||
| 76fb37c538 | |||
| 3036a4f6ba | |||
| 8a425e1008 | |||
| bca556edff | |||
| edf4e11301 | |||
| 7ecee6bae3 | |||
| 1d0343b595 | |||
| b6955fe278 | |||
| f26231066e | |||
| 753417747c | |||
| bfaf4f7bfd | |||
| f265accfc6 | |||
| ce8369ce2d | |||
| 7efaaa40c5 | |||
| f004cd3df0 | |||
| faac317563 | |||
| f52ef455bf | |||
| 9bfccb795c | |||
| 8fcbdf59fb | |||
| 172ebeadb7 | |||
| 80e4571569 | |||
| be092d22ea | |||
| e710ae923c | |||
| dccec39efd | |||
| 4ec104106a | |||
| 01986825c8 | |||
| 5eccfbd6e5 | |||
| d254cfaa6f |
7
.gitattributes
vendored
Normal file
7
.gitattributes
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
/.editorconfig export-ignore
|
||||
/.gitattributes export-ignore
|
||||
/.github export-ignore
|
||||
/.gitignore export-ignore
|
||||
/phpstan.neon export-ignore
|
||||
/phpunit.xml.dist export-ignore
|
||||
/tests export-ignore
|
||||
2
.github/workflows/assets.yml
vendored
2
.github/workflows/assets.yml
vendored
@ -22,7 +22,7 @@ jobs:
|
||||
- name: "Install Node"
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "12"
|
||||
node-version: "16"
|
||||
|
||||
- name: "Install dependencies with Yarn"
|
||||
run: "yarn install"
|
||||
|
||||
25
.github/workflows/dependabot-automerge-js.yml
vendored
Normal file
25
.github/workflows/dependabot-automerge-js.yml
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
name: Auto-merge Dependabot JS
|
||||
on: pull_request_target
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
dependabot:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- name: Dependabot metadata
|
||||
id: metadata
|
||||
uses: dependabot/fetch-metadata@v1.3.4
|
||||
with:
|
||||
github-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
- name: Approve and merge minor updates
|
||||
if: ${{ steps.metadata.outputs.package-ecosystem == 'npm_and_yarn' && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }}
|
||||
run: |
|
||||
gh pr review --approve "$PR_URL"
|
||||
gh pr merge --auto --merge "$PR_URL"
|
||||
env:
|
||||
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
39
.github/workflows/upload-release-package.yml
vendored
Normal file
39
.github/workflows/upload-release-package.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
name: "Upload release package"
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php:
|
||||
- "7.4"
|
||||
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v3"
|
||||
|
||||
- name: "Install PHP"
|
||||
uses: "shivammathur/setup-php@v2"
|
||||
with:
|
||||
coverage: "none"
|
||||
php-version: "${{ matrix.php }}"
|
||||
tools: pecl, composer:2.2
|
||||
extensions: pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
|
||||
ini-values: "date.timezone=Europe/Paris"
|
||||
env:
|
||||
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Create the package
|
||||
run: make release VERSION=${{ github.event.release.tag_name }}
|
||||
|
||||
- name: Upload the package to the release
|
||||
uses: shogo82148/actions-upload-release-asset@v1
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: /tmp/wllbg-release/wallabag-${{ github.event.release.tag_name }}.tar.gz
|
||||
@ -1,47 +0,0 @@
|
||||
filter:
|
||||
paths:
|
||||
- src/*
|
||||
excluded_paths:
|
||||
- 'vendor/*'
|
||||
- 'app/*'
|
||||
- 'var/*'
|
||||
- 'web/*'
|
||||
- 'src/Wallabag/*Bundle/Tests/*'
|
||||
- '*Test.php'
|
||||
|
||||
tools:
|
||||
php_cs_fixer: true
|
||||
php_analyzer: true
|
||||
php_mess_detector: true
|
||||
php_changetracking: true
|
||||
php_code_sniffer: true
|
||||
php_pdepend: true
|
||||
sensiolabs_security_checker: true
|
||||
#external_code_coverage:
|
||||
# timeout: 3600
|
||||
php_code_coverage: true
|
||||
php_sim: false
|
||||
php_cpd: false
|
||||
|
||||
checks:
|
||||
php:
|
||||
code_rating: true
|
||||
|
||||
# use the new PHP analysis engine
|
||||
# https://scrutinizer-ci.com/docs/tools/php/php-analyzer/guides/migrate_to_new_php_analysis
|
||||
build:
|
||||
environment:
|
||||
php:
|
||||
version: 7.4
|
||||
|
||||
nodes:
|
||||
analysis:
|
||||
tests:
|
||||
override:
|
||||
- php-scrutinizer-run
|
||||
|
||||
dependencies:
|
||||
override:
|
||||
- npm install -g 'yarn'
|
||||
- yarn install --force
|
||||
- COMPOSER_MEMORY_LIMIT=-1 composer install -o --no-interaction --no-progress --prefer-dist
|
||||
46
CHANGELOG.md
46
CHANGELOG.md
@ -1,5 +1,51 @@
|
||||
# Changelog
|
||||
|
||||
## [2.5.4](https://github.com/wallabag/wallabag/tree/2.5.4)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.5.3...2.5.4)
|
||||
|
||||
### Security fixes
|
||||
* Fix adding tag to entries from other people by @j0k3r in https://github.com/wallabag/wallabag/pull/6290
|
||||
* Fix XSS on username on share page by @j0k3r in https://github.com/wallabag/wallabag/pull/6288
|
||||
* Fix CSRF on user deletion by @j0k3r in https://github.com/wallabag/wallabag/pull/6289
|
||||
|
||||
### Meta
|
||||
* Fix release script by @j0k3r in https://github.com/wallabag/wallabag/pull/6275
|
||||
|
||||
## [2.5.3](https://github.com/wallabag/wallabag/tree/2.5.3)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.5.2...2.5.3)
|
||||
|
||||
### Security fixes
|
||||
* Fix GHSA-qwx8-mxxx-mg96 https://github.com/wallabag/wallabag/commit/0f7460dbab9e29f4f7d2944aca20210f828b6abb by @Kdecherf, thanks to @bAuh0lz
|
||||
* Fix GHSA-mrqx-mjc4-vfh3 https://github.com/wallabag/wallabag/commit/5ac6b6bff9e2e3a87fd88c2904ff3c6aac40722e by @Kdecherf, thanks to @bAuh0lz
|
||||
|
||||
### Meta
|
||||
* Update deps before 2.5.3 by @j0k3r in https://github.com/wallabag/wallabag/pull/6241
|
||||
|
||||
## [2.5.2](https://github.com/wallabag/wallabag/tree/2.5.2)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.5.1...2.5.2)
|
||||
|
||||
### Fixes
|
||||
* Add `nbEntries` to the API tags list response by @j0k3r in https://github.com/wallabag/wallabag/pull/5984
|
||||
* Typofixes by @nexxai in https://github.com/wallabag/wallabag/pull/6004
|
||||
* Add `domain_name` to entries api endpoint by @yotamN in https://github.com/wallabag/wallabag/pull/6019
|
||||
* Add support to download SVG locally by @j0k3r in https://github.com/wallabag/wallabag/pull/5992
|
||||
|
||||
### Meta
|
||||
* Automatically create the package after a release by @j0k3r in https://github.com/wallabag/wallabag/pull/5851
|
||||
* Add .gitattributes, exclude tests from archive by @iamvar in https://github.com/wallabag/wallabag/pull/5910
|
||||
* Allow auto merging of Dependabot JS minor or patch by @j0k3r in https://github.com/wallabag/wallabag/pull/6003
|
||||
* Fix random failing tests by @j0k3r in https://github.com/wallabag/wallabag/pull/6013
|
||||
|
||||
## [2.5.1](https://github.com/wallabag/wallabag/tree/2.5.1)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.5.0...2.5.1)
|
||||
|
||||
### Fixes
|
||||
- Jump to Node 16 to build assets by @j0k3r in https://github.com/wallabag/wallabag/pull/5822
|
||||
- Update some deps by @j0k3r in https://github.com/wallabag/wallabag/pull/5834
|
||||
- Fix error about template not found in 2fa form by @j0k3r in https://github.com/wallabag/wallabag/pull/5833
|
||||
- Translations update from Hosted Weblate by @weblate in https://github.com/wallabag/wallabag/pull/5846
|
||||
- material: fix "untagged entries" chip style by @Kdecherf in https://github.com/wallabag/wallabag/pull/5840
|
||||
|
||||
## [2.5.0](https://github.com/wallabag/wallabag/tree/2.5.0)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.4.3...2.5.0)
|
||||
|
||||
|
||||
@ -16,13 +16,7 @@ During this documentation, we assume the release is `$LAST_WALLABAG_RELEASE` (li
|
||||
|
||||
#### Create a new release on GitHub
|
||||
|
||||
- Run this command to create the package:
|
||||
|
||||
```
|
||||
make release VERSION=$LAST_WALLABAG_RELEASE
|
||||
```
|
||||
|
||||
- [Create the new release on GitHub](https://github.com/wallabag/wallabag/releases/new) by targetting the `master` branch or any appropriate branch (for instance backports). You have to upload the package (generated previously).
|
||||
- [Create the new release on GitHub](https://github.com/wallabag/wallabag/releases/new) by targetting the `master` branch or any appropriate branch (for instance backports).
|
||||
- Update nginx config to change the redirect rule for `https://wllbg.org/latest-v2-package` & `http://wllbg.org/latest-v2` (they both redirect to the asset of the GitHub release)
|
||||
- Update Dockerfile https://github.com/wallabag/docker (and create a new tag)
|
||||
- Update wallabag.org website (downloads, MD5 sum, releases and new blog post)
|
||||
|
||||
@ -18,7 +18,7 @@ export_pdf: Aktiviraj PDF izvoz
|
||||
matomo_enabled: Aktiviraj Matomo
|
||||
import_with_redis: Aktiviraj Redis za asinkroni uvoz podataka
|
||||
restricted_access: Aktiviraj autentifikaciju za naplatne web-stranice
|
||||
export_mobi: Aktiviraj .mobi izvoz
|
||||
export_mobi: Aktiviraj .mobi izvoz (zastarjelo, uskoro će se ukloniti)
|
||||
demo_mode_enabled: Aktivirati demo modus? (Koristi se samo za javnu wallabag demonstraciju)
|
||||
carrot: Aktiviraj dijeljenje na Carrot
|
||||
diaspora_url: diaspora* URL, ako je usluga aktivirana
|
||||
|
||||
@ -1,18 +1,18 @@
|
||||
download_pictures: Scarica le immagini sul tuo server
|
||||
carrot: Abilita la condivisione con Carrot
|
||||
carrot: Abilita condivisione con Carrot
|
||||
diaspora_url: URL di diaspora*, se il servizio è abilitato
|
||||
export_epub: Abilita esportazione ePub
|
||||
export_mobi: Abilita esportazione .mobi
|
||||
export_mobi: Abilita esportazione .mobi (deprecato, verrà rimosso presto)
|
||||
export_pdf: Abilita esportazione PDF
|
||||
export_csv: Abilita esportazione CSV
|
||||
export_json: Abilita esportazione JSON
|
||||
export_txt: Abilita esportazione TXT
|
||||
export_xml: Abilita esportazione XML
|
||||
shaarli_url: Shaarli URL, se il servizio è abilitato
|
||||
scuttle_url: Scuttle URL, se il servizio è abilitato
|
||||
unmark_url: Unmark URL, se il servizio è abilitato
|
||||
shaarli_url: URL Shaarli, se il servizio è abilitato
|
||||
scuttle_url: URL Scuttle, se il servizio è abilitato
|
||||
unmark_url: URL Unmark, se il servizio è abilitato
|
||||
share_diaspora: Abilita la condivisione con diaspora*
|
||||
share_mail: Abilita la condivisione per e-mail
|
||||
share_mail: Abilita la condivisione via e-mail
|
||||
share_shaarli: Abilita la condivisione con Shaarli
|
||||
share_scuttle: Abilita la condivisione con Scuttle
|
||||
share_twitter: Abilita la condivisione con Twitter
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: サーバー上の画像をダウンロード
|
||||
carrot: Carrot への共有を有効にする
|
||||
diaspora_url: diaspora* URL、サービスが有効になっている場合
|
||||
export_epub: ePub のエクスポートを有効にする
|
||||
export_mobi: .mobi のエクスポートを有効にする
|
||||
export_mobi: .mobi のエクスポートを有効にする(非推奨、近日中に削除されます)
|
||||
export_pdf: PDF のエクスポートを有効にする
|
||||
export_csv: CSV のエクスポートを有効にする
|
||||
export_json: JSON のエクスポートを有効にする
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: Pobierz obrazy na swój serwer
|
||||
carrot: Włącz udostępnianie dla Carrot
|
||||
diaspora_url: Adres URL Diaspora, jeżeli usługa jest włączona
|
||||
export_epub: Włącz eksport do ePub
|
||||
export_mobi: Włącz eksport do .mobi
|
||||
export_mobi: Włącz eksport do plików .mobi (przestarzałe, zostanie wkrótce usunięte)
|
||||
export_pdf: Włącz eksport do PDF
|
||||
export_csv: Włącz eksport do CSV
|
||||
export_json: Włącz eksport do JSON
|
||||
@ -29,13 +29,12 @@ modify_settings: zatwierdź
|
||||
matomo_host: Host twojej strony Matomo (bez http:// lub https://)
|
||||
matomo_site_id: ID twojej strony Matomo
|
||||
matomo_enabled: Włacz Matomo
|
||||
demo_mode_enabled: Włącz tryb demo? (używany wyłącznie dla publicznej demonstracji
|
||||
Wallabag)
|
||||
demo_mode_username: Użytkownik Demonstracyjny
|
||||
share_public: Zezwalaj na publiczne adresy url dla wpisów
|
||||
demo_mode_enabled: Włączyć tryb demonstracyjny? (Używany wyłącznie do publicznej demonstracji wallabag)
|
||||
demo_mode_username: Użytkownik demonstracyjny
|
||||
share_public: Zezwalaj na publiczne adresy URL dla wpisów
|
||||
download_images_enabled: Pobierz obrazy lokalnie
|
||||
restricted_access: Włącz autoryzację dla stron za paywallem
|
||||
api_user_registration: Włącz rejestrację użytkownika przy użyciu API
|
||||
unmark_url: Odznacz URL, jeżeli usługa jest włączona
|
||||
store_article_headers: Włącz, jeżeli Wallabag zapisuje nagłówki HTTP dla każdego artykułu
|
||||
shaarli_share_origin_url: Włącz udostępnianie URL Shaarli, jeżeli usługa jest włączona
|
||||
store_article_headers: Włącz, jeżeli wallabag zapisuje nagłówki HTTP dla każdego artykułu
|
||||
shaarli_share_origin_url: Włącz udostępnianie oryginalnego adresu URL do Shaarli, jeśli usługa jest włączona
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: Resimleri sunucuya indir
|
||||
carrot: Carrot'a paylaşımı etkinleştir
|
||||
diaspora_url: hizmet etkinse diaspora* URL'si
|
||||
export_epub: ePub dışa aktarımını etkinleştir
|
||||
export_mobi: .mobi dışa aktarımını etkinleştir
|
||||
export_mobi: .mobi dışa aktarımını etkinleştir (kullanım dışı, yakında kaldırılacak)
|
||||
export_pdf: PDF dışa aktarımını etkinleştir
|
||||
export_csv: CSV dışa aktarımını etkinleştir
|
||||
export_json: JSON dışa aktarımını etkinleştir
|
||||
|
||||
@ -1 +1,5 @@
|
||||
{}
|
||||
download_pictures: 下載圖片至你的服務器上
|
||||
diaspora_url: diaspora* URL(如果該服務已啟用)
|
||||
settings_changed: 已更新設定
|
||||
export_epub: 啟用 ePub 輸出
|
||||
carrot: 啟用分享至 Carrot
|
||||
|
||||
@ -164,6 +164,7 @@ a.original:not(.waves-effect) {
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
cursor: default;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.card-entry-labels li {
|
||||
@ -188,7 +189,7 @@ a.original:not(.waves-effect) {
|
||||
}
|
||||
|
||||
.card-tag-link {
|
||||
width: calc(100% - 48px);
|
||||
width: calc(100% - 24px);
|
||||
line-height: 1.3;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
@ -212,7 +213,7 @@ a.original:not(.waves-effect) {
|
||||
|
||||
.card-tag-labels {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
|
||||
}
|
||||
|
||||
.card-tag-labels li {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
wallabag_core:
|
||||
version: 2.5.0
|
||||
version: 2.5.4
|
||||
paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
|
||||
languages:
|
||||
en: 'English'
|
||||
|
||||
@ -34,7 +34,6 @@
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.4",
|
||||
"composer": "< 2.3",
|
||||
"ext-ctype": "*",
|
||||
"ext-curl": "*",
|
||||
"ext-dom": "*",
|
||||
@ -51,6 +50,7 @@
|
||||
"ext-tidy": "*",
|
||||
"ext-tokenizer": "*",
|
||||
"ext-xml": "*",
|
||||
"composer": "< 2.3",
|
||||
"babdev/pagerfanta-bundle": "^2.5",
|
||||
"bdunogier/guzzle-site-authenticator": "^1.0.0",
|
||||
"craue/config-bundle": "^2.3.0",
|
||||
@ -59,6 +59,7 @@
|
||||
"doctrine/doctrine-cache-bundle": "^1.3",
|
||||
"doctrine/doctrine-migrations-bundle": "^1.3",
|
||||
"doctrine/orm": "^2.6",
|
||||
"enshrined/svg-sanitize": "^0.15.4",
|
||||
"friendsofsymfony/jsrouting-bundle": "^2.2",
|
||||
"friendsofsymfony/oauth-server-bundle": "^1.5",
|
||||
"friendsofsymfony/rest-bundle": "~2.1",
|
||||
|
||||
771
composer.lock
generated
771
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
FROM php:7.4-fpm AS rootless
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG NODE_VERSION=14
|
||||
ARG NODE_VERSION=16
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y \
|
||||
|
||||
58
package.json
58
package.json
@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "wallabag",
|
||||
"version": "2.3.3",
|
||||
"version": "2.5.0",
|
||||
"description": "wallabag is a self hostable application for saving web pages",
|
||||
"private": true,
|
||||
"directories": {
|
||||
"doc": "docs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
"node": ">=16"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -36,35 +36,35 @@
|
||||
"url": "https://github.com/wallabag/wallabag/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.17.10",
|
||||
"@babel/eslint-parser": "^7.17.0",
|
||||
"@babel/preset-env": "^7.17.10",
|
||||
"autoprefixer": "^10.4.7",
|
||||
"babel-loader": "^8.2.5",
|
||||
"css-loader": "^6.7.1",
|
||||
"eslint": "^8.15.0",
|
||||
"@babel/core": "^7.20.12",
|
||||
"@babel/eslint-parser": "^7.19.1",
|
||||
"@babel/preset-env": "^7.20.2",
|
||||
"autoprefixer": "^10.4.13",
|
||||
"babel-loader": "^9.1.2",
|
||||
"css-loader": "^6.7.3",
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-webpack-plugin": "^3.1.1",
|
||||
"eslint-plugin-import": "^2.27.4",
|
||||
"eslint-webpack-plugin": "^3.2.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"lato-font": "^3.0.0",
|
||||
"mini-css-extract-plugin": "^2.6.0",
|
||||
"node-sass": "^7.0.1",
|
||||
"postcss": "^8.4.13",
|
||||
"postcss-loader": "^6.2.1",
|
||||
"postcss-scss": "^4.0.4",
|
||||
"sass": "^1.51.0",
|
||||
"sass-loader": "^12.6.0",
|
||||
"mini-css-extract-plugin": "^2.7.2",
|
||||
"node-sass": "^8.0.0",
|
||||
"postcss": "^8.4.21",
|
||||
"postcss-loader": "^7.0.2",
|
||||
"postcss-scss": "^4.0.6",
|
||||
"sass": "^1.57.1",
|
||||
"sass-loader": "^13.2.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"stylelint": "^14.8.2",
|
||||
"stylelint-config-standard": "^25.0.0",
|
||||
"stylelint-scss": "^4.2.0",
|
||||
"stylelint-webpack-plugin": "^3.2.0",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"stylelint": "^14.16.1",
|
||||
"stylelint-config-standard": "^29.0.0",
|
||||
"stylelint-scss": "^4.3.0",
|
||||
"stylelint-webpack-plugin": "^3.3.0",
|
||||
"terser-webpack-plugin": "^5.3.6",
|
||||
"url-loader": "^4.1.1",
|
||||
"webpack": "^5.72.1",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.9.0",
|
||||
"webpack": "^5.75.0",
|
||||
"webpack-cli": "^5.0.1",
|
||||
"webpack-dev-server": "^4.11.1",
|
||||
"webpack-manifest-plugin": "^5.0.0",
|
||||
"webpack-merge": "^5.7.3"
|
||||
},
|
||||
@ -72,14 +72,14 @@
|
||||
"annotator": "wallabag/annotator#master",
|
||||
"clipboard": "^2.0.11",
|
||||
"hammerjs": "^2.0.8",
|
||||
"highlight.js": "^11.5.1",
|
||||
"highlight.js": "^11.7.0",
|
||||
"icomoon-free-npm": "^0.0.0",
|
||||
"jquery": "^3.6.0",
|
||||
"jquery": "^3.6.3",
|
||||
"jquery.cookie": "^1.4.1",
|
||||
"jr-qrcode": "^1.0.7",
|
||||
"material-design-icons-iconfont": "^6.7.0",
|
||||
"materialize-css": "^0.98.1",
|
||||
"mathjax": "^3.1.2",
|
||||
"mathjax": "^3.2.2",
|
||||
"mousetrap": "^1.6.0",
|
||||
"ptsans-npm-webfont": "^0.0.4",
|
||||
"roboto-fontface": "^0.10.0",
|
||||
|
||||
@ -9,12 +9,12 @@ ENV=$4
|
||||
|
||||
rm -rf "${TMP_FOLDER:?}"/"$RELEASE_FOLDER"
|
||||
mkdir "$TMP_FOLDER"/"$RELEASE_FOLDER"
|
||||
git clone git@github.com:wallabag/wallabag.git "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION"
|
||||
git clone https://github.com/wallabag/wallabag.git --single-branch --depth 1 --branch $1 "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION"
|
||||
cd "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION" && SYMFONY_ENV="$ENV" COMPOSER_MEMORY_LIMIT=-1 composer install -n --no-dev
|
||||
cd "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION" && php bin/console wallabag:install --env="$ENV" -n
|
||||
cd "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION" && php bin/console assets:install --env="$ENV" --symlink --relative
|
||||
cd "$TMP_FOLDER"/"$RELEASE_FOLDER" && tar czf "$VERSION".tar.gz --exclude="var/cache/*" --exclude="var/logs/*" --exclude="var/sessions/*" --exclude=".git" "$VERSION"
|
||||
echo "MD5 checksum of the package for wallabag $VERSION"
|
||||
md5 "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION".tar.gz
|
||||
md5sum "$VERSION".tar.gz
|
||||
echo "Package to upload to the release server:"
|
||||
echo "$TMP_FOLDER"/"$RELEASE_FOLDER"/"$VERSION".tar.gz
|
||||
|
||||
@ -3,9 +3,9 @@
|
||||
namespace Wallabag\AnnotationBundle\Controller;
|
||||
|
||||
use FOS\RestBundle\Controller\FOSRestController;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Wallabag\AnnotationBundle\Entity\Annotation;
|
||||
use Wallabag\AnnotationBundle\Form\EditAnnotationType;
|
||||
use Wallabag\AnnotationBundle\Form\NewAnnotationType;
|
||||
@ -25,7 +25,7 @@ class WallabagAnnotationController extends FOSRestController
|
||||
$annotationRows = $this
|
||||
->getDoctrine()
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findAnnotationsByPageId($entry->getId(), $this->getUser()->getId());
|
||||
->findByEntryIdAndUserId($entry->getId(), $this->getUser()->getId());
|
||||
$total = \count($annotationRows);
|
||||
$annotations = ['total' => $total, 'rows' => $annotationRows];
|
||||
|
||||
@ -72,31 +72,35 @@ class WallabagAnnotationController extends FOSRestController
|
||||
*
|
||||
* @see Wallabag\ApiBundle\Controller\WallabagRestController
|
||||
*
|
||||
* @ParamConverter("annotation", class="WallabagAnnotationBundle:Annotation")
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function putAnnotationAction(Annotation $annotation, Request $request)
|
||||
public function putAnnotationAction(Request $request, int $annotation)
|
||||
{
|
||||
$data = json_decode($request->getContent(), true);
|
||||
try {
|
||||
$annotation = $this->validateAnnotation($annotation, $this->getUser()->getId());
|
||||
|
||||
$form = $this->get('form.factory')->createNamed('', EditAnnotationType::class, $annotation, [
|
||||
'csrf_protection' => false,
|
||||
'allow_extra_fields' => true,
|
||||
]);
|
||||
$form->submit($data);
|
||||
$data = json_decode($request->getContent(), true, 512, \JSON_THROW_ON_ERROR);
|
||||
|
||||
if ($form->isValid()) {
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->persist($annotation);
|
||||
$em->flush();
|
||||
$form = $this->get('form.factory')->createNamed('', EditAnnotationType::class, $annotation, [
|
||||
'csrf_protection' => false,
|
||||
'allow_extra_fields' => true,
|
||||
]);
|
||||
$form->submit($data);
|
||||
|
||||
$json = $this->get('jms_serializer')->serialize($annotation, 'json');
|
||||
if ($form->isValid()) {
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->persist($annotation);
|
||||
$em->flush();
|
||||
|
||||
return JsonResponse::fromJsonString($json);
|
||||
$json = $this->get('jms_serializer')->serialize($annotation, 'json');
|
||||
|
||||
return JsonResponse::fromJsonString($json);
|
||||
}
|
||||
|
||||
return $form;
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
throw new NotFoundHttpException($e);
|
||||
}
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -104,18 +108,35 @@ class WallabagAnnotationController extends FOSRestController
|
||||
*
|
||||
* @see Wallabag\ApiBundle\Controller\WallabagRestController
|
||||
*
|
||||
* @ParamConverter("annotation", class="WallabagAnnotationBundle:Annotation")
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function deleteAnnotationAction(Annotation $annotation)
|
||||
public function deleteAnnotationAction(int $annotation)
|
||||
{
|
||||
try {
|
||||
$annotation = $this->validateAnnotation($annotation, $this->getUser()->getId());
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->remove($annotation);
|
||||
$em->flush();
|
||||
|
||||
$json = $this->get('jms_serializer')->serialize($annotation, 'json');
|
||||
|
||||
return (new JsonResponse())->setJson($json);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
throw new NotFoundHttpException($e);
|
||||
}
|
||||
}
|
||||
|
||||
private function validateAnnotation(int $annotationId, int $userId)
|
||||
{
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->remove($annotation);
|
||||
$em->flush();
|
||||
|
||||
$json = $this->get('jms_serializer')->serialize($annotation, 'json');
|
||||
$annotation = $em->getRepository('WallabagAnnotationBundle:Annotation')->findOneByIdAndUserId($annotationId, $userId);
|
||||
|
||||
return (new JsonResponse())->setJson($json);
|
||||
if (null === $annotation) {
|
||||
throw new NotFoundHttpException();
|
||||
}
|
||||
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,6 +34,15 @@ class AnnotationFixtures extends Fixture implements DependentFixtureInterface
|
||||
|
||||
$this->addReference('annotation2', $annotation2);
|
||||
|
||||
$annotation3 = new Annotation($this->getReference('bob-user'));
|
||||
$annotation3->setEntry($this->getReference('entry3'));
|
||||
$annotation3->setText('This is my first annotation !');
|
||||
$annotation3->setQuote('content');
|
||||
|
||||
$manager->persist($annotation3);
|
||||
|
||||
$this->addReference('annotation3', $annotation3);
|
||||
|
||||
$manager->flush();
|
||||
}
|
||||
|
||||
|
||||
@ -41,6 +41,24 @@ class AnnotationRepository extends EntityRepository
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find annotation by id and user.
|
||||
*
|
||||
* @param int $annotationId
|
||||
* @param int $userId
|
||||
*
|
||||
* @return Annotation
|
||||
*/
|
||||
public function findOneByIdAndUserId($annotationId, $userId)
|
||||
{
|
||||
return $this->createQueryBuilder('a')
|
||||
->where('a.id = :annotationId')->setParameter('annotationId', $annotationId)
|
||||
->andWhere('a.user = :userId')->setParameter('userId', $userId)
|
||||
->setMaxResults(1)
|
||||
->getQuery()
|
||||
->getOneOrNullResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Find annotations for entry id.
|
||||
*
|
||||
@ -49,7 +67,7 @@ class AnnotationRepository extends EntityRepository
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function findAnnotationsByPageId($entryId, $userId)
|
||||
public function findByEntryIdAndUserId($entryId, $userId)
|
||||
{
|
||||
return $this->createQueryBuilder('a')
|
||||
->where('a.entry = :entryId')->setParameter('entryId', $entryId)
|
||||
@ -66,7 +84,7 @@ class AnnotationRepository extends EntityRepository
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function findLastAnnotationByPageId($entryId, $userId)
|
||||
public function findLastAnnotationByUserId($entryId, $userId)
|
||||
{
|
||||
return $this->createQueryBuilder('a')
|
||||
->where('a.entry = :entryId')->setParameter('entryId', $entryId)
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
namespace Wallabag\ApiBundle\Controller;
|
||||
|
||||
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Wallabag\AnnotationBundle\Entity\Annotation;
|
||||
@ -63,11 +62,9 @@ class AnnotationRestController extends WallabagRestController
|
||||
* }
|
||||
* )
|
||||
*
|
||||
* @ParamConverter("annotation", class="WallabagAnnotationBundle:Annotation")
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function putAnnotationAction(Annotation $annotation, Request $request)
|
||||
public function putAnnotationAction(int $annotation, Request $request)
|
||||
{
|
||||
$this->validateAuthentication();
|
||||
|
||||
@ -86,11 +83,9 @@ class AnnotationRestController extends WallabagRestController
|
||||
* }
|
||||
* )
|
||||
*
|
||||
* @ParamConverter("annotation", class="WallabagAnnotationBundle:Annotation")
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function deleteAnnotationAction(Annotation $annotation)
|
||||
public function deleteAnnotationAction(int $annotation)
|
||||
{
|
||||
$this->validateAuthentication();
|
||||
|
||||
|
||||
@ -113,6 +113,7 @@ class EntryRestController extends WallabagRestController
|
||||
* {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."},
|
||||
* {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"},
|
||||
* {"name"="detail", "dataType"="string", "required"=false, "format"="metadata or full, metadata by default", "description"="include content field if 'full'. 'full' by default for backward compatibility."},
|
||||
* {"name"="domain_name", "dataType"="string", "required"=false, "format"="example.com", "description"="filter entries with the given domain name"},
|
||||
* }
|
||||
* )
|
||||
*
|
||||
@ -132,6 +133,7 @@ class EntryRestController extends WallabagRestController
|
||||
$tags = \is_array($request->query->get('tags')) ? '' : (string) $request->query->get('tags', '');
|
||||
$since = $request->query->get('since', 0);
|
||||
$detail = strtolower($request->query->get('detail', 'full'));
|
||||
$domainName = (null === $request->query->get('domain_name')) ? '' : (string) $request->query->get('domain_name');
|
||||
|
||||
try {
|
||||
/** @var \Pagerfanta\Pagerfanta $pager */
|
||||
@ -144,7 +146,8 @@ class EntryRestController extends WallabagRestController
|
||||
$order,
|
||||
$since,
|
||||
$tags,
|
||||
$detail
|
||||
$detail,
|
||||
$domainName
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
throw new BadRequestHttpException($e->getMessage());
|
||||
|
||||
@ -23,7 +23,7 @@ class TagRestController extends WallabagRestController
|
||||
|
||||
$tags = $this->getDoctrine()
|
||||
->getRepository('WallabagCoreBundle:Tag')
|
||||
->findAllTags($this->getUser()->getId());
|
||||
->findAllFlatTagsWithNbEntries($this->getUser()->getId());
|
||||
|
||||
$json = $this->get('jms_serializer')->serialize($tags, 'json');
|
||||
|
||||
|
||||
@ -586,7 +586,7 @@ class ConfigController extends Controller
|
||||
/**
|
||||
* Delete account for current user.
|
||||
*
|
||||
* @Route("/account/delete", name="delete_account")
|
||||
* @Route("/account/delete", name="delete_account", methods={"POST"})
|
||||
*
|
||||
* @throws AccessDeniedHttpException
|
||||
*
|
||||
@ -594,6 +594,10 @@ class ConfigController extends Controller
|
||||
*/
|
||||
public function deleteAccountAction(Request $request)
|
||||
{
|
||||
if (!$this->isCsrfTokenValid('delete-account', $request->request->get('token'))) {
|
||||
throw $this->createAccessDeniedException('Bad CSRF token.');
|
||||
}
|
||||
|
||||
$enabledUsers = $this->get('wallabag_user.user_repository')
|
||||
->getSumEnabledUsers();
|
||||
|
||||
|
||||
@ -6,7 +6,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Wallabag\CoreBundle\Entity\Entry;
|
||||
|
||||
/**
|
||||
* The try/catch can be removed once all formats will be implemented.
|
||||
@ -26,9 +25,21 @@ class ExportController extends Controller
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function downloadEntryAction(Entry $entry, $format)
|
||||
public function downloadEntryAction(Request $request, $format, $id)
|
||||
{
|
||||
try {
|
||||
$entry = $this->get('wallabag_core.entry_repository')
|
||||
->find((int) $id);
|
||||
|
||||
/*
|
||||
* We duplicate EntryController::checkUserAction here as a quick fix for an improper authorization vulnerability
|
||||
*
|
||||
* This should be eventually rewritten
|
||||
*/
|
||||
if (null === $entry || null === $this->getUser() || $this->getUser()->getId() !== $entry->getUser()->getId()) {
|
||||
throw new NotFoundHttpException();
|
||||
}
|
||||
|
||||
return $this->get('wallabag_core.helper.entries_export')
|
||||
->setEntries($entry)
|
||||
->updateTitle('entry')
|
||||
|
||||
@ -17,7 +17,7 @@ use Wallabag\CoreBundle\Form\Type\RenameTagType;
|
||||
class TagController extends Controller
|
||||
{
|
||||
/**
|
||||
* @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag")
|
||||
* @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag", methods={"POST"})
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
@ -26,7 +26,17 @@ class TagController extends Controller
|
||||
$form = $this->createForm(NewTagType::class, new Tag());
|
||||
$form->handleRequest($request);
|
||||
|
||||
$tags = $form->get('label')->getData();
|
||||
$tagsExploded = explode(',', $tags);
|
||||
|
||||
// avoid too much tag to be added
|
||||
if (\count($tagsExploded) >= 5 || \strlen($tags) >= NewTagType::MAX_LENGTH) {
|
||||
return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
|
||||
}
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$this->checkUserAction($entry);
|
||||
|
||||
$this->get('wallabag_core.tags_assigner')->assignTagsToEntry(
|
||||
$entry,
|
||||
$form->get('label')->getData()
|
||||
@ -59,6 +69,8 @@ class TagController extends Controller
|
||||
*/
|
||||
public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag)
|
||||
{
|
||||
$this->checkUserAction($entry);
|
||||
|
||||
$entry->removeTag($tag);
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->flush();
|
||||
@ -222,4 +234,14 @@ class TagController extends Controller
|
||||
|
||||
return $this->redirect($this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the logged user can manage the given entry.
|
||||
*/
|
||||
private function checkUserAction(Entry $entry)
|
||||
{
|
||||
if (null === $this->getUser() || $this->getUser()->getId() !== $entry->getUser()->getId()) {
|
||||
throw $this->createAccessDeniedException('You can not access this entry.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class NewTagType extends AbstractType
|
||||
{
|
||||
public const MAX_LENGTH = 40;
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder
|
||||
@ -17,6 +19,7 @@ class NewTagType extends AbstractType
|
||||
'required' => true,
|
||||
'attr' => [
|
||||
'placeholder' => 'tag.new.placeholder',
|
||||
'max_length' => self::MAX_LENGTH,
|
||||
],
|
||||
])
|
||||
->add('add', SubmitType::class, [
|
||||
|
||||
@ -346,7 +346,7 @@ class ContentProxy
|
||||
* parse_url arrays.
|
||||
*
|
||||
* As array_diff_assoc only computes changes to go from the left array
|
||||
* to the right one, we make two differents arrays to have both
|
||||
* to the right one, we make two different arrays to have both
|
||||
* directions. We merge these two arrays and sort keys before passing
|
||||
* the result to the switch.
|
||||
*
|
||||
|
||||
@ -33,7 +33,7 @@ class CryptoProxy
|
||||
/**
|
||||
* Ensure the given value will be crypted.
|
||||
*
|
||||
* @param string $secretValue Secret valye to crypt
|
||||
* @param string $secretValue Secret value to crypt
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
@ -10,7 +10,7 @@ use Wallabag\UserBundle\Entity\User;
|
||||
* This class intend to detect the active theme for the logged in user.
|
||||
* It will retrieve the configured theme of the user.
|
||||
*
|
||||
* If no user where logged in, it will returne the default theme
|
||||
* If no user where logged in, it will return the default theme
|
||||
*/
|
||||
class DetectActiveTheme implements DeviceDetectionInterface
|
||||
{
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
namespace Wallabag\CoreBundle\Helper;
|
||||
|
||||
use enshrined\svgSanitize\Sanitizer;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use GuzzleHttp\Psr7\UriResolver;
|
||||
use Http\Client\Common\HttpMethodsClient;
|
||||
@ -146,6 +147,32 @@ class DownloadImages
|
||||
|
||||
$hashImage = hash('crc32', $absolutePath);
|
||||
$localPath = $folderPath . '/' . $hashImage . '.' . $ext;
|
||||
$urlPath = $this->wallabagUrl . '/assets/images/' . $relativePath . '/' . $hashImage . '.' . $ext;
|
||||
|
||||
// custom case for SVG (because GD doesn't support SVG)
|
||||
if ('svg' === $ext) {
|
||||
try {
|
||||
$sanitizer = new Sanitizer();
|
||||
$sanitizer->minify(true);
|
||||
$sanitizer->removeRemoteReferences(true);
|
||||
$cleanSVG = $sanitizer->sanitize((string) $res->getBody());
|
||||
|
||||
// add an extra validation by checking about `<svg `
|
||||
if (false === $cleanSVG || false === strpos($cleanSVG, '<svg ')) {
|
||||
$this->logger->error('DownloadImages: Bad SVG given', ['path' => $imagePath]);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
file_put_contents($localPath, $cleanSVG);
|
||||
|
||||
return $urlPath;
|
||||
} catch (\Exception $e) {
|
||||
$this->logger->error('DownloadImages: Error while sanitize SVG', ['path' => $imagePath, 'message' => $e->getMessage()]);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$im = imagecreatefromstring((string) $res->getBody());
|
||||
@ -196,7 +223,7 @@ class DownloadImages
|
||||
|
||||
imagedestroy($im);
|
||||
|
||||
return $this->wallabagUrl . '/assets/images/' . $relativePath . '/' . $hashImage . '.' . $ext;
|
||||
return $urlPath;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -351,7 +378,7 @@ class DownloadImages
|
||||
$this->logger->debug('DownloadImages: Checking extension (alternative)', ['ext' => $ext]);
|
||||
}
|
||||
|
||||
if (!\in_array($ext, ['jpeg', 'jpg', 'gif', 'png', 'webp'], true)) {
|
||||
if (!\in_array($ext, ['jpeg', 'jpg', 'gif', 'png', 'webp', 'svg'], true)) {
|
||||
$this->logger->error('DownloadImages: Processed image with not allowed extension. Skipping: ' . $imagePath);
|
||||
|
||||
return false;
|
||||
|
||||
@ -167,7 +167,7 @@ class EntriesExport
|
||||
|
||||
$book->setAuthor($this->author, $this->author);
|
||||
|
||||
// I hope this is a non existant address :)
|
||||
// I hope this is a non-existent address :)
|
||||
$book->setPublisher('wallabag', 'wallabag');
|
||||
// Strictly not needed as the book date defaults to time().
|
||||
$book->setDate(time());
|
||||
|
||||
@ -198,12 +198,13 @@ class EntryRepository extends EntityRepository
|
||||
* @param int $since
|
||||
* @param string $tags
|
||||
* @param string $detail 'metadata' or 'full'. Include content field if 'full'
|
||||
* @param string $domainName
|
||||
*
|
||||
* @todo Breaking change: replace default detail=full by detail=metadata in a future version
|
||||
*
|
||||
* @return Pagerfanta
|
||||
*/
|
||||
public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '', $detail = 'full')
|
||||
public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '', $detail = 'full', $domainName = '')
|
||||
{
|
||||
if (!\in_array(strtolower($detail), ['full', 'metadata'], true)) {
|
||||
throw new \Exception('Detail "' . $detail . '" parameter is wrong, allowed: full or metadata');
|
||||
@ -242,7 +243,7 @@ class EntryRepository extends EntityRepository
|
||||
$entryAlias = 'e' . $i;
|
||||
$tagAlias = 't' . $i;
|
||||
|
||||
// Complexe queries to ensure multiple tags are associated to an entry
|
||||
// Complex queries to ensure multiple tags are associated to an entry
|
||||
// https://stackoverflow.com/a/6638146/569101
|
||||
$qb->andWhere($qb->expr()->in(
|
||||
'e.id',
|
||||
@ -258,6 +259,10 @@ class EntryRepository extends EntityRepository
|
||||
}
|
||||
}
|
||||
|
||||
if (\is_string($domainName) && '' !== $domainName) {
|
||||
$qb->andWhere('e.domainName = :domainName')->setParameter('domainName', $domainName);
|
||||
}
|
||||
|
||||
if (!\in_array(strtolower($order), ['asc', 'desc'], true)) {
|
||||
throw new \Exception('Order "' . $order . '" parameter is wrong, allowed: asc or desc');
|
||||
}
|
||||
|
||||
@ -37,6 +37,7 @@ menu:
|
||||
theme_toggle_auto: Automatisches Design
|
||||
theme_toggle_dark: Dunkles Design
|
||||
theme_toggle_light: Helles Design
|
||||
with_annotations: Mit Anmerkungen
|
||||
top:
|
||||
add_new_entry: Neuen Artikel hinzufügen
|
||||
search: Suche
|
||||
@ -240,6 +241,8 @@ entry:
|
||||
filtered_search: 'Gefiltert nach Suche:'
|
||||
untagged: Nicht markierte Einträge
|
||||
all: Alle Einträge
|
||||
with_annotations: Einträge mit Anmerkungen
|
||||
same_domain: Gleiche Domain
|
||||
list:
|
||||
number_on_the_page: '{0} Es gibt keine Einträge.|{1} Es gibt einen Eintrag.|]1,Inf[ Es gibt %count% Einträge.'
|
||||
reading_time: geschätzte Lesezeit
|
||||
@ -253,6 +256,8 @@ entry:
|
||||
toogle_as_star: Favoriten-Status ändern
|
||||
delete: Löschen
|
||||
export_title: Exportieren
|
||||
assign_search_tag: Weise diese Suche als einen Tag zu jedem Ergebnis hinzu
|
||||
show_same_domain: Zeigt Artikel mit der gleichen Domain
|
||||
filters:
|
||||
title: Filter
|
||||
status_label: Status
|
||||
@ -277,6 +282,7 @@ entry:
|
||||
action:
|
||||
clear: Zurücksetzen
|
||||
filter: Filtern
|
||||
annotated_label: Angemerkt
|
||||
view:
|
||||
left_menu:
|
||||
back_to_top: Nach oben
|
||||
@ -502,14 +508,14 @@ import:
|
||||
wallabag_v1:
|
||||
page_title: Aus wallabag v1 importieren
|
||||
description: Dieser Import wird all deine Artikel aus wallabag v1 importieren. Klicke in der Konfigurationsseite auf "JSON-Export" im "wallabag-Daten exportieren"-Abschnitt. Du erhältst eine "wallabag-export-1-xxxx-xx-xx.json"-Datei.
|
||||
how_to: Wähle die exportierte Datei aus und klicke den nachfolgenden Button, um diese hochzuladen und zu importieren.
|
||||
how_to: Wähle die exportierte Datei aus und klicke auf den nachfolgenden Button, um diese hochzuladen und zu importieren.
|
||||
wallabag_v2:
|
||||
page_title: Aus wallabag v2 importieren
|
||||
description: Dieser Import wird all deine Artikel aus wallabag v2 importieren. Gehe auf "Alle Artikel" und dann, in der Exportieren-Seitenleiste auf "JSON". Dabei erhältst du eine "All articles.json"-Datei.
|
||||
readability:
|
||||
page_title: Aus Readability importieren
|
||||
description: Dieser Importer wird all deine Artikel aus Readability importieren. Auf der Werkzeugseite (https://www.readability.com/tools/) klickst du auf „Exportiere deine Daten“ in dem Abschnitt „Datenexport“. Du wirst eine E-Mail mit einem Herunterladenlink zu einer json Datei, die aber nicht auf .json endet, erhalten.
|
||||
how_to: Bitte wähle deinen Readability Export aus und klicke den unteren Button für das Hochladen und Importieren dessen.
|
||||
how_to: Bitte wähl deinen Readability-Export aus und klick den unteren Button für das Hochladen und Importieren dessen an.
|
||||
worker:
|
||||
enabled: 'Der Import erfolgt asynchron. Sobald der Import gestartet ist, wird diese Aufgabe extern abgearbeitet. Der aktuelle Service dafür ist:'
|
||||
download_images_warning: Du hast das Herunterladen von Bildern für deine Artikel aktiviert. Verbunden mit dem klassischen Import kann es ewig dauern fortzufahren (oder sogar fehlschlagen). Wir <strong>empfehlen</strong> den asynchronen Import zu aktivieren, um Fehler zu vermeiden.
|
||||
@ -524,14 +530,18 @@ import:
|
||||
instapaper:
|
||||
page_title: Aus Instapaper importieren
|
||||
description: Dieser Import wird all deine Instapaper Artikel importieren. Auf der Einstellungsseite (https://www.instapaper.com/user) klickst du auf "Download .CSV Datei" in dem Abschnitt "Export". Eine CSV Datei wird heruntergeladen (z.B. "instapaper-export.csv").
|
||||
how_to: Bitte wähle deine Instapaper Sicherungsdatei aus und klicke den nachfolgenden Button zum Importieren.
|
||||
how_to: Bitte wähle deine Instapaper-Sicherungsdatei aus und klicke auf den nachfolgenden Button zum Importieren.
|
||||
pinboard:
|
||||
page_title: Aus Pinboard importieren
|
||||
description: Dieser Import wird all deine Pinboard Artikel importieren. Auf der Seite Backup (https://pinboard.in/settings/backup) klickst du auf "JSON" in dem Abschnitt "Lesezeichen". Eine JSON Datei wird dann heruntergeladen (z.B. "pinboard_export").
|
||||
how_to: Bitte wähle deinen Pinboard Export aus und klicke den nachfolgenden Button zum Importieren.
|
||||
how_to: Bitte wähle deinen Pinboard-Export aus und klicke auf den nachfolgenden Button zum Importieren.
|
||||
elcurator:
|
||||
page_title: Importieren > elCurator
|
||||
description: Dieses Tool wird all deine ElCurator-Artikel importieren. Öffne die Einstellungen in deinem ElCurator-Konto und exportiere dort den Inhalt; du wirst eine JSON-Datei erhalten.
|
||||
delicious:
|
||||
page_title: Import > del.icio.us
|
||||
how_to: Bitte wählen deinen Delicious-Export aus und klicke den u.s. Button zum Importieren.
|
||||
description: Dieser Importer wird alle deine Delicious-Lesezeichen importieren. Seit 2021 kannst du deine Daten wieder von der Exportseite (https://del.icio.us/export) bekommen. Wähle das "JSON"-Format aus und lade es herunter (z.B. "delicious_export.2021.02.06_21.10.json").
|
||||
developer:
|
||||
page_title: API-Client-Verwaltung
|
||||
welcome_message: Willkomen zur wallabag API
|
||||
|
||||
@ -226,6 +226,7 @@ entry:
|
||||
filtered_search: 'Articles filtrés par recherche :'
|
||||
untagged: Article sans étiquette
|
||||
all: Tous les articles
|
||||
same_domain: Même site
|
||||
list:
|
||||
number_on_the_page: '{0} Il n’y a pas d’article.|{1} Il y a un article.|]1,Inf[ Il y a %count% articles.'
|
||||
reading_time: durée de lecture
|
||||
@ -239,6 +240,8 @@ entry:
|
||||
toogle_as_star: Marquer comme favori
|
||||
delete: Supprimer
|
||||
export_title: Exporter
|
||||
show_same_domain: Afficher les articles du même site
|
||||
assign_search_tag: Ajouter cette recherche comme un tag à chaque résultat
|
||||
filters:
|
||||
title: Filtres
|
||||
status_label: Status
|
||||
@ -519,6 +522,10 @@ import:
|
||||
elcurator:
|
||||
description: Cet outil va importer tous vos articles depuis elCurator. Allez dans vos préférences sur elCurator et exportez vos contenus. Vous allez récupérer un fichier JSON.
|
||||
page_title: Importer > elCurator
|
||||
delicious:
|
||||
page_title: Importer > del.icio.us
|
||||
how_to: Choisissez le fichier de votre export Delicious et cliquez sur le bouton ci-dessous pour l'importer.
|
||||
description: Depuis 2021, vous pouvez à nouveau exporter vos données depuis Delicious (https://del.icio.us/export). Choisissez le format "JSON" et téléchargez le (un fichier du genre "delicious_export.2021.02.06_21.10.json").
|
||||
developer:
|
||||
page_title: Gestion des clients API
|
||||
welcome_message: Bienvenue sur l’API de wallabag
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
howto:
|
||||
shortcuts:
|
||||
list_title: Atallos dispoñibles nas páxinas con listaxes
|
||||
go_logout: Desconectar
|
||||
go_logout: Saír
|
||||
go_howto: Ir ós titoriais (esta páxina!)
|
||||
go_developers: Ir a desenvolvedoras
|
||||
go_import: Ir a importar
|
||||
@ -359,7 +359,7 @@ menu:
|
||||
input_label: Escribe aquí a túa busca
|
||||
top:
|
||||
account: A miña conta
|
||||
random_entry: Ir a unha entrada ó chou desa listaxe
|
||||
random_entry: Ir a unha entrada ao chou dos da lista
|
||||
export: Exportar
|
||||
filter_entries: Filtrar entradas
|
||||
search: Buscar
|
||||
@ -376,7 +376,7 @@ menu:
|
||||
save_link: Gardar ligazón
|
||||
search: Buscar
|
||||
about: Acerca de
|
||||
logout: Desconectar
|
||||
logout: Saír
|
||||
developer: Xestión dos clientes API
|
||||
howto: Titoriais
|
||||
import: Importar
|
||||
|
||||
@ -62,7 +62,7 @@ import:
|
||||
how_to: 'Odaberi datoteku sigurnosne kopije zabilježaka i pritisni donji gumb za uvoz datoteke. Napomena: uvoz može potrajati, jer se moraju dohvatiti svi članci.'
|
||||
description: 'Ovaj uvoznik uvozi sve tvoje zabilješke iz Chromea. Mjesto datoteke ovisi o tvom operacijskom sustavu: Na Linuxu sustavu idi u mapu <code>~/.config/chromium/Default/</code></li><li>Na Windows sustavu mapa bi se trebala nalziti u <code>%LOCALAPPDATA%\Google\Chrome\User Data\Default</code></li><li>Na OS X sustavu trebala bi biti u <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Kad stigneš tamo, kopiraj datoteku <code>Bookmarks</code> na neko mjesto gdje ćeš je pronaći.<em><br>Ako koristiš Chromium umjesto Chromea, morat ćeš u skladu s time ispraviti staze.</em></p>'
|
||||
readability:
|
||||
how_to: Odaberi Readability izvoz i pritisni donji gumb za preuzimanje i uvoz datoteke.
|
||||
how_to: Odaberi Readability izvoz i pritisni donji gumb za slanje i uvoz datoteke.
|
||||
page_title: Uvoz > Readability
|
||||
description: Ovaj uvoznik uvozi sve tvoje Readability članke. Na stranici alata (https://www.readability.com/tools/), pritisni „Izvezi svoje podatke” u odjeljku „Izvoz podataka”. Primit ćeš e-mail za preuzimanje json-a (što zapravo ne završava s .json).
|
||||
worker:
|
||||
@ -70,11 +70,11 @@ import:
|
||||
download_images_warning: Aktivirao(la) si preuzimanje slika za članke. U kombinaciji s klasičnim uvozom, postupak može potrajati godinama (ili možda ne uspije). <strong>Preporučujemo</strong> aktivirati asinkroniziran uvoz za izbjegavanje grešaka.
|
||||
pinboard:
|
||||
page_title: Uvoz > Pinboard
|
||||
how_to: Odaberi Pinboard izvoz i pritisni donji gumb za preuzimanje i uvoz datoteke.
|
||||
how_to: Odaberi Pinboard izvoz i pritisni donji gumb za slanje i uvoz datoteke.
|
||||
description: Ovaj uvoznik uvozi sve tvoje Pinboard članke. Na stranici sigurnosne kopije (https://pinboard.in/settings/backup), pritisni „JSON” u odjeljku „Zabilješke”. Preuzet će se JSON datoteka (poput „pinboard_export”).
|
||||
instapaper:
|
||||
page_title: Uvoz > Instapaper
|
||||
how_to: Odaberi Instapaper izvoz i pritisni donji gumb za preuzimanje i uvoz datoteke.
|
||||
how_to: Odaberi Instapaper izvoz i pritisni donji gumb za slanje i uvoz datoteke.
|
||||
description: Ovaj uvoznik uvozi sve tvoje Instapaper članke. Na stranici postavki (https://www.instapaper.com/user) pritisni „Preuzmi .CSV datoteku” u odjeljku „Izvoz”. Preuzet će se CSV datoteka (poput „instapaper-export.csv”).
|
||||
pocket:
|
||||
config_missing:
|
||||
@ -82,7 +82,7 @@ import:
|
||||
description: Uvoz iz Pocketa nije konfiguriran.
|
||||
user_message: Administrator tvog poslužitelja mora definirati ključ za sučelje za Pocket.
|
||||
description: Ovaj uvoznik uvozi sve tvoje Pocket podatke. Pocket nam ne dopušta dohvaćanje sadržaja iz njihove usluge, stoga će se čitljiv sadržaj svakog članka ponovno dohvatiti pomoću wallabaga.
|
||||
authorize_message: Tvoje podatke možeš uvesti s tvog Pocket računa. Jednostavno pritisni donji gumb i autoriziraj program, da se poveže s getpocket.com.
|
||||
authorize_message: Tvoje podatke možeš uvesti s tvog Pocket računa. Jednostavno pritisni donji gumb i autoriziraj program da se poveže na getpocket.com.
|
||||
connect_to_pocket: Spoji se na Pocket i uvezi podatke
|
||||
page_title: Uvoz > Pocket
|
||||
form:
|
||||
@ -92,7 +92,7 @@ import:
|
||||
save_label: Prenesi datoteku
|
||||
wallabag_v1:
|
||||
page_title: Uvoz > Wallabag v1
|
||||
how_to: Odaberi wallabag izvoz i pritisni donji gumb za preuzimanje i uvoz datoteke.
|
||||
how_to: Odaberi wallabag izvoz i pritisni donji gumb za slanje i uvoz datoteke.
|
||||
description: Ovaj uvoznik uvozi sve tvoje članke wallabaga verzije 1. Na tvojoj stranici konfiguracije, pritisni „JSON izvoz” u odjeljku „Izvezi svoje wallabag podatke”. Dobit ćeš datoteku „wallabag-export-1-xxxx-xx-xx.json”.
|
||||
page_description: Dobro došao/dobro došla u uvoznik wallabaga. Odaberi prethodnu uslugu s koje želiš premjestiti podatke.
|
||||
action:
|
||||
@ -100,6 +100,10 @@ import:
|
||||
elcurator:
|
||||
description: Ovaj će uvoznik uvesti sve tvoje elCurator članke. Prijeđi na postavke na tvom elCurator računu, a zatim izvezi sadržaj. Dobit ćete JSON datoteku.
|
||||
page_title: Uvezi > elCurator
|
||||
delicious:
|
||||
page_title: Uvoz > del.icio.us
|
||||
description: Ovaj će uvoznik uvesti sve tvoje „Delicious” zabilješke. Od 2021. godine nadalje, iz njega možeš ponovo izvesti podatke pomoću stranice za izvoz (https://del.icio.us/export). Odaberi format „JSON” i preuzmi ga (npr. „delicious_export.2021.02.06_21.10.json”).
|
||||
how_to: Odaberi Delicious izvoz i pritisni donji gumb za slanje i uvoz datoteke.
|
||||
about:
|
||||
helping:
|
||||
by_contributing: 'doprinošenjem projektu:'
|
||||
@ -478,6 +482,7 @@ entry:
|
||||
http_status_label: Stanje HTTP-a
|
||||
title: Filtri
|
||||
unread_label: Nepročitani
|
||||
annotated_label: S napomenom
|
||||
list:
|
||||
delete: Izbriši
|
||||
reading_time_less_one_minute: 'procijenjeno vrijeme čitanja: < 1 min'
|
||||
@ -491,6 +496,8 @@ entry:
|
||||
toogle_as_read: Uklj/Isklj oznaku kao pročitano
|
||||
number_of_tags: '{1}i još jedna druga oznaka|]1,Inf[i %count% druge oznake'
|
||||
reading_time_less_one_minute_short: '< 1 min'
|
||||
show_same_domain: Prikaži članke s istom domenom
|
||||
assign_search_tag: Dodijeli ovo pretraživanje kao oznaku svakom rezultatu
|
||||
view:
|
||||
left_menu:
|
||||
set_as_starred: Uklj/Isklj omiljene
|
||||
@ -531,6 +538,8 @@ entry:
|
||||
untagged: Zapisi bez oznaka
|
||||
filtered_tags: 'Filtrirano po oznakama:'
|
||||
filtered_search: 'Filtrirano po pretrazi:'
|
||||
with_annotations: Unosi s napomenama
|
||||
same_domain: Ista domena
|
||||
metadata:
|
||||
reading_time_minutes_short: '%readingTime% min'
|
||||
added_on: Dodano
|
||||
@ -663,6 +672,7 @@ menu:
|
||||
theme_toggle_auto: Automatska tema
|
||||
theme_toggle_dark: Tamna tema
|
||||
theme_toggle_light: Svijetla tema
|
||||
with_annotations: S napomenama
|
||||
top:
|
||||
add_new_entry: Dodaj novi zapis
|
||||
filter_entries: Filtriraj zapise
|
||||
|
||||
@ -393,6 +393,7 @@ tag:
|
||||
list:
|
||||
number_on_the_page: '{0} Nincsenek címkék.|{1} Egy címke.|]1,Inf[ %count% címke.'
|
||||
see_untagged_entries: Címkézetlen bejegyzések megtekintése
|
||||
untagged: Címkézetlen bejegyzések
|
||||
new:
|
||||
add: Hozzáad
|
||||
placeholder: Több címkét is hozzáadhat, vesszővel elválasztva.
|
||||
|
||||
@ -26,7 +26,7 @@ menu:
|
||||
howto: Come fare
|
||||
developer: Gestione client API
|
||||
logout: Esci
|
||||
about: A proposito
|
||||
about: Informazioni
|
||||
search: Cerca
|
||||
save_link: Salva collegamento
|
||||
back_to_unread: Torna ai contenuti non letti
|
||||
@ -37,6 +37,7 @@ menu:
|
||||
theme_toggle_auto: Tema automatico
|
||||
theme_toggle_dark: Tema scuro
|
||||
theme_toggle_light: Tema chiaro
|
||||
with_annotations: Con annotazioni
|
||||
top:
|
||||
add_new_entry: Aggiungi un nuovo contenuto
|
||||
search: Cerca
|
||||
@ -409,6 +410,7 @@ tag:
|
||||
list:
|
||||
number_on_the_page: "{0} Non ci sono etichette.|{1} C'è un'etichetta.|]1,Inf[ ci sono %count% etichette."
|
||||
see_untagged_entries: Vedi articoli non etichettati
|
||||
untagged: Articoli non etichettati
|
||||
new:
|
||||
add: Aggiungi
|
||||
placeholder: Puoi aggiungere varie etichette, separate da una virgola.
|
||||
|
||||
@ -37,6 +37,7 @@ menu:
|
||||
theme_toggle_auto: テーマを自動切換
|
||||
theme_toggle_dark: ダークテーマ
|
||||
theme_toggle_light: ライトテーマ
|
||||
with_annotations: 注釈付きのアイテム
|
||||
top:
|
||||
add_new_entry: 新しい記事を追加
|
||||
search: 検索
|
||||
|
||||
@ -405,6 +405,7 @@ tag:
|
||||
list:
|
||||
number_on_the_page: "{0} I a pas cap d'etiquetas.|{1} I a una etiqueta.|]1,Inf[ I a %count% etiquetas."
|
||||
see_untagged_entries: Afichar las entradas sens etiquetas
|
||||
untagged: Articles sens etiqueta
|
||||
new:
|
||||
add: Ajustar
|
||||
placeholder: Podètz ajustar mai qu'una etiqueta, separadas per de virgula.
|
||||
|
||||
@ -16,14 +16,14 @@ security:
|
||||
menu:
|
||||
left:
|
||||
unread: Nieprzeczytane
|
||||
starred: Oznaczone gwiazdką
|
||||
starred: Wyróżnione
|
||||
archive: Archiwum
|
||||
all_articles: Wszystkie
|
||||
config: Konfiguracja
|
||||
tags: Tagi
|
||||
internal_settings: Wewnętrzne ustawienia
|
||||
import: Importuj
|
||||
howto: How to
|
||||
howto: Jak to zrobić
|
||||
developer: Zarządzanie klientami API
|
||||
logout: Wyloguj
|
||||
about: O nas
|
||||
@ -33,10 +33,11 @@ menu:
|
||||
users_management: Zarządzanie użytkownikami
|
||||
site_credentials: Poświadczenia strony
|
||||
quickstart: Szybki start
|
||||
ignore_origin_instance_rules: Ignoruj globalne zasady pochodzenia
|
||||
ignore_origin_instance_rules: Globalne zasady ignorowania pochodzenia
|
||||
theme_toggle_auto: Automatyczny motyw
|
||||
theme_toggle_dark: Ciemny motyw
|
||||
theme_toggle_light: Jasny motyw
|
||||
with_annotations: Z adnotacjami
|
||||
top:
|
||||
add_new_entry: Dodaj nowy wpis
|
||||
search: Szukaj
|
||||
@ -63,13 +64,13 @@ config:
|
||||
rules: Zasady tagowania
|
||||
new_user: Dodaj użytkownika
|
||||
reset: Zresetuj obszar
|
||||
ignore_origin: Ignoruj zasady pochodzenia
|
||||
ignore_origin: Zasady ignorowania pochodzenia
|
||||
feed: Źródła
|
||||
form:
|
||||
save: Zapisz
|
||||
form_settings:
|
||||
theme_label: Temat
|
||||
items_per_page_label: Ilość elementów na stronie
|
||||
items_per_page_label: Liczba elementów na stronie
|
||||
language_label: Język
|
||||
reading_speed:
|
||||
label: Prędkość czytania
|
||||
@ -86,8 +87,8 @@ config:
|
||||
android_configuration: Skonfiguruj swoją androidową aplikację
|
||||
android_instruction: Dotknij tutaj, aby wstępnie uzupełnij androidową aplikację
|
||||
help_theme: Dopasuj wallabag do swoich potrzeb. Tutaj możesz wybrać preferowany przez ciebie motyw.
|
||||
help_items_per_page: Możesz zmienić ilość artykułów wyświetlanych na każdej stronie.
|
||||
help_reading_speed: wallabag oblicza czas czytania każdego artykułu. Dzięki tej liście możesz określić swoje tempo. Wallabag przeliczy ponownie czas potrzebny, na przeczytanie każdego z artykułów.
|
||||
help_items_per_page: Możesz zmienić liczbę artykułów wyświetlanych na każdej stronie.
|
||||
help_reading_speed: wallabag oblicza czas czytania każdego artykułu. Możesz tutaj określić, dzięki tej liście, czy jesteś szybkim czy powolnym czytelnikiem. wallabag przeliczy czas czytania każdego artykułu.
|
||||
help_language: Możesz zmienić język interfejsu wallabag.
|
||||
help_pocket_consumer_key: Wymagane dla importu z Pocket. Możesz go stworzyć na swoim koncie Pocket.
|
||||
form_rss:
|
||||
@ -106,32 +107,32 @@ config:
|
||||
form_user:
|
||||
two_factor_description: Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanym połączeniu.
|
||||
name_label: Nazwa
|
||||
email_label: Adres email
|
||||
email_label: Adres e-mail
|
||||
twoFactorAuthentication_label: Autoryzacja dwuetapowa
|
||||
help_twoFactorAuthentication: Jeżeli włączysz autoryzację dwuetapową. Za każdym razem, kiedy będziesz chciał się zalogować, dostaniesz kod na swój e-mail.
|
||||
delete:
|
||||
title: Usuń moje konto (niebezpieczna strefa !)
|
||||
title: Usuń moje konto (niebezpieczna strefa!)
|
||||
description: Jeżeli usuniesz swoje konto, wszystkie twoje artykuły, tagi, adnotacje, oraz konto zostaną trwale usunięte (operacja jest NIEODWRACALNA). Następnie zostaniesz wylogowany.
|
||||
confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć)
|
||||
button: Usuń moje konto
|
||||
two_factor:
|
||||
action_app: Użyj aplikacji do jednorazowych kodów
|
||||
action_email: Użyj e-mail’a
|
||||
action_email: Użyj e-maila
|
||||
state_disabled: Wyłączone
|
||||
state_enabled: Włączone
|
||||
table_action: Akcja
|
||||
table_state: Stan
|
||||
table_method: Metoda
|
||||
googleTwoFactor_label: Używając aplikacji do jednorazowych kodów logowania (uruchom aplikacje w stylu Google Authenticator, Authy lub FreeOTP by uzyskać kod)
|
||||
emailTwoFactor_label: Używając email’a (otrzymasz kod na podany adres)
|
||||
emailTwoFactor_label: Używając e-maila (otrzymasz kod na podany adres)
|
||||
login_label: Login (nie może zostać później zmieniony)
|
||||
reset:
|
||||
title: Reset (niebezpieczna strefa)
|
||||
description: Poniższe przyciski pozwalają usunąć pewne informacje z twojego konta. Uważaj te operacje są NIEODWRACALNE.
|
||||
annotations: Usuń WSZYSTKIE adnotacje
|
||||
tags: Usuń WSZYSTKIE tagi
|
||||
entries: usuń WSZYTSTKIE wpisy
|
||||
archived: usuń WSZYSTKIE zarchiwizowane wpisy
|
||||
entries: Usuń WSZYTSTKIE wpisy
|
||||
archived: Usuń WSZYSTKIE zarchiwizowane wpisy
|
||||
confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć)
|
||||
form_password:
|
||||
description: Tutaj możesz zmienić swoje hasło. Twoje nowe hasło powinno mieć conajmniej 8 znaków.
|
||||
@ -143,7 +144,7 @@ config:
|
||||
then_tag_as_label: wtedy otaguj jako
|
||||
delete_rule_label: usuń
|
||||
edit_rule_label: edytuj
|
||||
rule_label: Reguła
|
||||
rule_label: Zasada
|
||||
tags_label: Tagi
|
||||
faq:
|
||||
title: FAQ
|
||||
@ -162,7 +163,7 @@ config:
|
||||
isStarred: Czy wpis został oznaczony gwiazdką czy nie
|
||||
content: Zawartość wpisu
|
||||
language: Język wpisu
|
||||
mimetype: Mime-type wpisu
|
||||
mimetype: Typ mediów wpisu
|
||||
readingTime: Szacunkowy czas czytania wpisu w minutach
|
||||
domainName: Nazwa domeny wpisu
|
||||
operator_description:
|
||||
@ -179,7 +180,7 @@ config:
|
||||
notmatches: 'Sprawdź czy <i>temat</i> nie zawiera <i>szukaj</i> (duże lub małe litery).<br />Przykład: <code>tytuł nie zawiera "piłka nożna"</code>'
|
||||
card:
|
||||
export_tagging_rules_detail: Pobierz plik JSON z ustawieniami tagowania.
|
||||
import_tagging_rules_detail: Musisz zaznaczyć plik z rozszerzeniem JSON który wcześniej zapisałeś.
|
||||
import_tagging_rules_detail: Musisz wybrać wcześniej wyeksportowany plik JSON.
|
||||
export_tagging_rules: Eksportuj/zapisz plik z zasadami tagowania
|
||||
import_tagging_rules: Importuj zasady tagowania
|
||||
new_tagging_rule: Utwórz zasadę oznaczania tagami
|
||||
@ -187,33 +188,61 @@ config:
|
||||
file_label: Plik JSON
|
||||
export: Eksportuj
|
||||
form_feed:
|
||||
description: Lista artykułów Atom pozwala czytać zapisane artykuły w twoim ulubionym programie. Musisz najpierw wygenerować token Atom’a.
|
||||
description: Kanały Atom dostarczane przez wallabag umożliwiają czytanie zapisanych artykułów za pomocą ulubionego czytnika Atom. Musisz najpierw wygenerować token.
|
||||
feed_limit: Liczba artykułów w aktualnościach
|
||||
feed_link:
|
||||
all: Wszystko
|
||||
archive: Zarchiwizowane
|
||||
starred: Wyróżnione
|
||||
unread: Nieodczytane
|
||||
unread: Nieprzeczytane
|
||||
feed_links: Linki do aktualności
|
||||
token_revoke: Anuluj token
|
||||
token_reset: Stwórz ponownie token
|
||||
token_create: Stwórz swój token
|
||||
no_token: Brak token’a
|
||||
no_token: Brak tokena
|
||||
token_label: Token listy
|
||||
form_ignore_origin_rules:
|
||||
faq:
|
||||
title: FAQ
|
||||
meaning: Znaczenie
|
||||
variable_description:
|
||||
label: Zmienna
|
||||
host: Host adresu
|
||||
_all: Pełny adres, głównie do dopasowywania wzorów
|
||||
ignore_origin_rules_definition_title: Co oznacza "Ignoruj zasady pochodzenia"?
|
||||
how_to_use_them_description: Załóżmy, że chcesz zignorować pochodzenie wpisu pochodzącego z « <i>rss.example.com</i> » (<i>wiedząc, że po przekierowaniu faktyczny adres to example.com</i>).<br />W takim przypadku należy umieścić « host = "rss.example.com" » w polu <i>Reguła</i>.
|
||||
variables_available_title: Jakich zmiennych i operatorów mogę użyć przy pisaniu reguł?
|
||||
operator_description:
|
||||
matches: 'Sprawdza, czy <i>temat</i> pasuje do <i>wyszukiwania</i> (wielkość liter nie ma znaczenia).<br />Przykład: <code>_all ~ "https?://rss.example.com/foobar/.*"</code>'
|
||||
label: Operator
|
||||
equal_to: Równe…
|
||||
ignore_origin_rules_definition_description: Są one używane przez wallabag do automatycznego ignorowania adresu źródłowego po przekierowaniu.<br />Jeśli przekierowanie nastąpi podczas pobierania nowego wpisu, wszystkie reguły ignorowania pochodzenia (<i>zdefiniowane przez użytkownika i zdefiniowane przez instancję</i>) zostaną użyte do zignorowania adresu pochodzenia.
|
||||
how_to_use_them_title: Jak ich użyć?
|
||||
variables_available_description: 'Następujące zmienne i operatory mogą być użyte do tworzenia reguł ignorowania pochodzenia:'
|
||||
otp:
|
||||
app:
|
||||
enable: Włącz
|
||||
two_factor_code_description_5: 'Jeśli nie widzisz kodu QR lub nie możesz go zeskanować, wprowadź następujący sekret w swojej aplikacji:'
|
||||
two_factor_code_description_4: 'Przetestuj kod OTP ze skonfigurowanej aplikacji:'
|
||||
cancel: Anuluj
|
||||
qrcode_label: Kod QR
|
||||
two_factor_code_description_1: Właśnie włączono uwierzytelnianie dwuskładnikowe OTP, otwórz aplikację OTP i użyj tego kodu, aby uzyskać jednorazowe hasło. Zniknie po przeładowaniu strony.
|
||||
two_factor_code_description_2: 'Możesz zeskanować ten kod QR za pomocą swojej aplikacji:'
|
||||
two_factor_code_description_3: 'Zapisz też te kody zapasowe w bezpiecznym miejscu, możesz ich użyć w przypadku utraty dostępu do aplikacji OTP:'
|
||||
page_title: Uwierzytelnianie dwuskładnikowe
|
||||
entry:
|
||||
default_title: Tytuł wpisu
|
||||
page_titles:
|
||||
unread: Nieprzeczytane wpisy
|
||||
starred: Wpisy oznaczone gwiazdką
|
||||
starred: Wpisy wyróżnione
|
||||
archived: Zarchiwizowane wpisy
|
||||
filtered: Odfiltrowane wpisy
|
||||
filtered_tags: 'Filtrowane po tagach:'
|
||||
filtered_search: 'Filtrowanie po wyszukiwaniu:'
|
||||
untagged: Odtaguj wpisy
|
||||
all: Wszystkie przedmioty
|
||||
with_annotations: Wpisy z adnotacjami
|
||||
same_domain: Ta sama domena
|
||||
list:
|
||||
number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.'
|
||||
reading_time: szacunkowy czas czytania
|
||||
@ -224,14 +253,16 @@ entry:
|
||||
reading_time_less_one_minute_short: '< 1 min'
|
||||
original_article: oryginał
|
||||
toogle_as_read: Oznacz jako przeczytane
|
||||
toogle_as_star: Oznacz jako ulubione
|
||||
toogle_as_star: Przełącz wyróżnienie
|
||||
delete: Usuń
|
||||
export_title: Export
|
||||
export_title: Eksportuj
|
||||
show_same_domain: Pokaż artykuły z tej samej domeny
|
||||
assign_search_tag: Przypisz to wyszukiwanie jako tag do każdego wyniku
|
||||
filters:
|
||||
title: Filtry
|
||||
status_label: Status
|
||||
archived_label: Zarchiwizowane
|
||||
starred_label: Oznaczone gwiazdką
|
||||
starred_label: Wyróżnione
|
||||
unread_label: Nieprzeczytane
|
||||
preview_picture_label: Posiada podgląd obrazu
|
||||
preview_picture_help: Podgląd obrazu
|
||||
@ -251,26 +282,31 @@ entry:
|
||||
action:
|
||||
clear: Wyczyść
|
||||
filter: Filtruj
|
||||
annotated_label: Z adnotacjami
|
||||
view:
|
||||
left_menu:
|
||||
back_to_top: Wróć na górę
|
||||
back_to_homepage: Cofnij
|
||||
set_as_read: Oznacz jako przeczytane
|
||||
set_as_unread: Oznacz jako nieprzeczytane
|
||||
set_as_starred: Ulubione
|
||||
set_as_starred: Przełącz wyróżnienie
|
||||
view_original_article: Oryginalny artykuł
|
||||
re_fetch_content: Pobierz ponownie treść
|
||||
delete: Usuń
|
||||
add_a_tag: Dodaj tag
|
||||
share_content: Udostępnij
|
||||
share_email_label: Adres email
|
||||
share_email_label: Adres e-mail
|
||||
public_link: Publiczny link
|
||||
delete_public_link: Usuń publiczny link
|
||||
export: Export
|
||||
export: Eksportuj
|
||||
print: Drukuj
|
||||
problem:
|
||||
label: Problemy?
|
||||
description: Czy ten artykuł wygląda źle?
|
||||
theme_toggle: Przełącznik motywu
|
||||
theme_toggle_light: Jasny
|
||||
theme_toggle_dark: Ciemny
|
||||
theme_toggle_auto: Automatyczny
|
||||
edit_title: Edytuj tytuł
|
||||
original_article: oryginalny
|
||||
annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %count% adnotacji'
|
||||
@ -282,25 +318,26 @@ entry:
|
||||
page_title: Zapisz nowy wpis
|
||||
placeholder: http://website.com
|
||||
form_new:
|
||||
url_label: Url
|
||||
url_label: Adres URL
|
||||
search:
|
||||
placeholder: Czego szukasz?
|
||||
edit:
|
||||
page_title: Edytuj wpis
|
||||
title_label: Tytuł
|
||||
url_label: Adres URL
|
||||
origin_url_label: Oryginalny url (gdzie znalazłeś ten wpis)
|
||||
origin_url_label: Oryginalny adres URL (gdzie znaleziono ten wpis)
|
||||
save_label: Zapisz
|
||||
public:
|
||||
shared_by_wallabag: Ten artykuł został udostępniony przez <a href='%wallabag_instance%'>wallabag</a>
|
||||
confirm:
|
||||
delete: Czy jesteś pewien, że chcesz usunąć ten artykuł?
|
||||
delete_tag: Czy jesteś pewien, że chcesz usunąć ten tag, z tego artykułu?
|
||||
delete_tag: Czy jesteś pewien, że chcesz usunąć ten tag z tego artykułu?
|
||||
metadata:
|
||||
reading_time: Szacowany czas czytania
|
||||
reading_time_minutes_short: '%readingTime% min'
|
||||
address: Adres
|
||||
added_on: Dodano
|
||||
published_on: Opublikowano dnia
|
||||
about:
|
||||
page_title: O nas
|
||||
top_menu:
|
||||
@ -308,7 +345,7 @@ about:
|
||||
getting_help: Pomoc
|
||||
helping: Pomóż wallabagowi
|
||||
contributors: Osoby, które pomogły przy projekcie
|
||||
third_party: Biblioteki Third-party
|
||||
third_party: Biblioteki zewnętrzne
|
||||
who_behind_wallabag:
|
||||
developped_by: Stworzony przez
|
||||
website: strona internetowa
|
||||
@ -328,11 +365,11 @@ about:
|
||||
contributors:
|
||||
description: Podziękuj osobą, które przyczyniły się do projektu przez aplikację webową
|
||||
third_party:
|
||||
description: 'Tutaj znajduje się lista Third-party bibliotek użytych w wallabag (z ich licencjami):'
|
||||
description: 'Tutaj znajduje się lista bibliotek zewnętrznych użytych w wallabag (z ich licencjami):'
|
||||
package: Paczka
|
||||
license: Licencja
|
||||
howto:
|
||||
page_title: How to
|
||||
page_title: Jak to zrobić
|
||||
page_description: 'Sposoby zapisania artykułu:'
|
||||
tab_menu:
|
||||
add_link: Dodaj link
|
||||
@ -361,14 +398,14 @@ howto:
|
||||
action: Akcja
|
||||
all_pages_title: Skróty dostępne na wszystkich stronach
|
||||
go_unread: Idź do nieprzeczytanych
|
||||
go_starred: Idź do oznaczonych gwiazdką
|
||||
go_starred: Idź do wyróżnionych
|
||||
go_archive: Idź do archiwum
|
||||
go_all: Idź do wszystkich wpisów
|
||||
go_tags: Idź do tagów
|
||||
go_config: Idź do konfiguracji
|
||||
go_import: Idź do importu
|
||||
go_developers: Idź do deweloperów
|
||||
go_howto: Idź do howto (tej strony!)
|
||||
go_howto: Idź do jak to zrobić (tej strony!)
|
||||
go_logout: Wyloguj
|
||||
list_title: Skróty dostępne w spisie stron
|
||||
search: Pokaż formularz wyszukiwania
|
||||
@ -395,9 +432,10 @@ quickstart:
|
||||
language: Zmień język i wygląd
|
||||
rss: Włącz kanały RSS
|
||||
tagging_rules: Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów
|
||||
feed: Włącz kanały
|
||||
admin:
|
||||
title: Administracja
|
||||
description: 'Jako administrator wallabag, możesz:'
|
||||
description: 'Jako administrator masz uprawnienia w wallabag. Możesz:'
|
||||
new_user: Tworzyć nowego użytkownika
|
||||
analytics: Konfigurować analityki
|
||||
sharing: Włączyć pewne parametry dotyczące udostępniania artykułów
|
||||
@ -405,11 +443,11 @@ quickstart:
|
||||
import: Skonfigurować import
|
||||
first_steps:
|
||||
title: Pierwsze kroki
|
||||
description: Teraz wallabag jest poprawnie skonfigurowany, więc czas zarchiwizować Internet. Kliknij w prawym górnym rogu na znak +, aby dodać link.
|
||||
description: Teraz wallabag jest poprawnie skonfigurowany, więc czas zarchiwizować Internet. Kliknij w prawym górnym rogu znak +, aby dodać link.
|
||||
new_article: Zapisz swój pierwszy artukuł
|
||||
unread_articles: I sklasyfikuj go!
|
||||
migrate:
|
||||
title: Migruj w istniejącej usługi
|
||||
title: Migruj z istniejącej usługi
|
||||
description: Używasz innej usługi? Pomożemy ci pobrać twoje dane do wallabag.
|
||||
pocket: Migruj z Pocket
|
||||
wallabag_v1: Migruj z wallabag v1
|
||||
@ -422,8 +460,8 @@ quickstart:
|
||||
create_application: Stwórz swoją aplikację
|
||||
use_docker: Użyj Dockera aby zainstalować wallabag
|
||||
docs:
|
||||
title: Pełna Dokumentacja
|
||||
description: Wallabag powiada wiele funkcji. Nie wahaj się przeczytać instrukcji, aby je poznać i nauczyć się jak ich używać.
|
||||
title: Pełna dokumentacja
|
||||
description: wallabag ma wiele funkcji. Nie wahaj się przeczytać instrukcji, aby je poznać i nauczyć się z nich korzystać.
|
||||
annotate: Dadaj adnotację do swojego artykułu
|
||||
export: Konwertuj swoje artykuły do ePUB lub PDF
|
||||
search_filters: Zabacz jak możesz znaleźć artykuł dzięku użyciu silnika wyszukiwarki i filtrów
|
||||
@ -433,13 +471,15 @@ quickstart:
|
||||
title: Wsparcie
|
||||
description: Jeżeli potrzebujesz pomocy, jesteśmy tutaj dla ciebie.
|
||||
github: na GitHubie
|
||||
email: przez email
|
||||
email: przez e-mail
|
||||
gitter: na Gitterze
|
||||
tag:
|
||||
page_title: Tagi
|
||||
list:
|
||||
number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ Są %count% tagi.'
|
||||
see_untagged_entries: Zobacz nieotagowane wpisy
|
||||
untagged: Odtaguj wpisy
|
||||
no_untagged_entries: Nie ma nieoznaczonych wpisów.
|
||||
new:
|
||||
add: Dodaj
|
||||
placeholder: Możesz dodać kilka tagów, oddzielając je przecinkami.
|
||||
@ -447,35 +487,35 @@ export:
|
||||
footer_template: <div style="text-align:center;"><p>Stworzone przez wallabag z %method%</p><p>Proszę zgłoś <a href="https://github.com/wallabag/wallabag/issues">sprawę</a>, jeżeli masz problem z wyświetleniem tego e-booka na swoim urządzeniu.</p></div>
|
||||
unknown: Nieznany
|
||||
import:
|
||||
page_title: Import
|
||||
page_description: Witaj w importerze Wallabag. Wybierz swoją poprzednią usługę, z której chcesz migrować.
|
||||
page_title: Importuj
|
||||
page_description: Witaj w importerze wallabag. Wybierz swoją poprzednią usługę, z której chcesz migrować.
|
||||
action:
|
||||
import_contents: Import zawartości
|
||||
form:
|
||||
mark_as_read_title: Oznaczyć wszystkie jako przeczytane?
|
||||
mark_as_read_label: Oznacz wszystkie zaimportowane wpisy jako przeczytane
|
||||
file_label: Plik
|
||||
save_label: Właduj plik
|
||||
save_label: Prześlij plik
|
||||
pocket:
|
||||
page_title: Importuj > Pocket
|
||||
description: Ten importer, zaimportuje dane z usługi Pocket. Pocket nie pozwala na nam na pobranie zawartości ze swojej usługi, więc kontent każdego artykułu zostanie ponownie pobrany przez wallabag.
|
||||
config_missing:
|
||||
description: Import z Pocket nie jest skonfigurowany.
|
||||
admin_message: Musisz zdefiniować %keyurls%a pocket_consumer_key%keyurle%.
|
||||
user_message: Admin twojego servera musi zdefiniować API Key dla Pocket.
|
||||
authorize_message: Możesz zaimportować dane ze swojego konta Pocket. Kliknij poniższy przycisk i autoryzuj aplikacje aby połączyć się z getpocket.com.
|
||||
user_message: Administrator serwera musi zdefiniować klucz API dla Pocket.
|
||||
authorize_message: Możesz zaimportować swoje dane z konta Pocket. Wystarczy, że klikniesz w poniższy przycisk i autoryzujesz aplikację do połączenia z getpocket.com.
|
||||
connect_to_pocket: Połącz z Pocket i importuj dane
|
||||
wallabag_v1:
|
||||
page_title: Importuj > Wallabag v1
|
||||
description: Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v1. Na swojej stronie konfiguracyjnej kliknij "JSON eksport" w sekcji "Eksportuj swoje dane wallabag". Otrzymasz plik "wallabag-export-1-xxxx-xx-xx.json".
|
||||
how_to: Wybierz swój plik eksportu z wallabag i kliknij poniższy przycisk, aby go załadować.
|
||||
how_to: Wybierz swój plik eksportu z wallabag i kliknij przycisk poniżej, aby go przesłać i zaimportować.
|
||||
wallabag_v2:
|
||||
page_title: Importuj > Wallabag v2
|
||||
description: Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v2. Idź do wszystkich artykułów, a następnie na panelu exportu kliknij na "JSON". Otrzymasz plik "All articles.json".
|
||||
readability:
|
||||
page_title: Importuj > Readability
|
||||
description: Ten importer, zaimportuje wszystkie twoje artykuły z Readability. Na stronie narzędzi (https://www.readability.com/tools/), kliknij na "Export your data" w sekcji "Data Export". Otrzymach email z plikiem JSON (plik nie będzie zawierał rozszerzenia .json).
|
||||
how_to: Wybierz swój plik eksportu z Readability i kliknij poniższy przycisk, aby go załadować.
|
||||
how_to: Wybierz swój plik eksportu z Readability i kliknij przycisk poniżej, aby go przesłać i zaimportować.
|
||||
worker:
|
||||
enabled: 'Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:'
|
||||
download_images_warning: Włączyłeś pobieranie obrazów dla swoich artykułów. W połączeniu z klasycznym importem, może to zająć dużo czasu (lub zakończyć się niepowodzeniem).<strong>Zdecydowanie zalecamy</strong> włączenie asynchronicznego importu, w celu uniknięcia błędów.
|
||||
@ -490,11 +530,18 @@ import:
|
||||
instapaper:
|
||||
page_title: Importuj > Instapaper
|
||||
description: Ten importer, zaimportuje wszystkie twoje artykuły z Instapaper. W ustawieniach (https://www.instapaper.com/user), kliknij na "Download .CSV file" w sekcji "Export". Otrzymasz plik CSV.
|
||||
how_to: Wybierz swój plik eksportu z Instapaper i kliknij poniższy przycisk, aby go załadować.
|
||||
how_to: Wybierz swój plik eksportu z Instapaper i kliknij przycisk poniżej, aby go przesłać i zaimportować.
|
||||
pinboard:
|
||||
page_title: Importuj > Pinboard
|
||||
description: Ten importer, zaimportuje wszystkie twoje artykuły z Pinboard. W ustawieniach kopii zapasowej (https://pinboard.in/settings/backup), kliknij na "JSON" w sekcji "Bookmarks". Otrzymasz plik "pinboard_export".
|
||||
how_to: Wybierz swój plik eksportu z Pinboard i kliknij poniższy przycisk, aby go załadować.
|
||||
how_to: Wybierz swój plik eksportu z Pinboard i kliknij przycisk poniżej, aby go przesłać i zaimportować.
|
||||
elcurator:
|
||||
page_title: Importuj > elCurator
|
||||
description: Ten importer zaimportuje wszystkie artykuły elCurator. Przejdź do swoich preferencji na koncie elCurator, a następnie wyeksportuj treści. Otrzymasz plik JSON.
|
||||
delicious:
|
||||
page_title: Importuj > del.icio.us
|
||||
description: Ten importer zaimportuje wszystkie zakładki Delicious. Od 2021 r. możesz ponownie wyeksportować z niego swoje dane za pomocą strony eksportu (https://del.icio.us/export). Wybierz format "JSON" i pobierz go (np. "delicious_export.2021.02.06_21.10.json").
|
||||
how_to: Wybierz plik eksportu Delicious i kliknij przycisk poniżej, aby go przesłać i zaimportować.
|
||||
developer:
|
||||
page_title: Zarządzanie klientami API
|
||||
welcome_message: Witaj w API wallabag
|
||||
@ -509,7 +556,7 @@ developer:
|
||||
title: Istniejący klienci
|
||||
field_id: ID klienta
|
||||
field_secret: Sekret klienta
|
||||
field_uris: Przekieruj URIs
|
||||
field_uris: Przekieruj identyfikatory URI
|
||||
field_grant_types: Przyznaj pozwolenie
|
||||
no_client: Nie ma jeszcze klienta.
|
||||
remove:
|
||||
@ -524,11 +571,12 @@ developer:
|
||||
redirect_uris_label: Przekieruj adresy URI
|
||||
save_label: Stwórz nowego klienta
|
||||
action_back: Cofnij
|
||||
copy_to_clipboard: Kopiuj
|
||||
client_parameter:
|
||||
page_title: Zarządzanie klientami API > Parametry klienta
|
||||
page_description: Tutaj znajdują się parametry klienta.
|
||||
field_name: Nazwa klienta
|
||||
field_id: Client ID
|
||||
field_id: ID klienta
|
||||
field_secret: Sekret klienta
|
||||
back: Cofnij
|
||||
read_howto: Przeczytaj jak "Stworzyć moją pierwszą aplikację"
|
||||
@ -561,14 +609,16 @@ user:
|
||||
password_label: Hasło
|
||||
repeat_new_password_label: Powtórz nowe hasło
|
||||
plain_password_label: Jawne hasło
|
||||
email_label: Adres email
|
||||
email_label: Adres e-mail
|
||||
enabled_label: Włączony
|
||||
last_login_label: Ostatnie logowanie
|
||||
twofactor_label: Autoryzacja dwuetapowa
|
||||
save: Zapisz
|
||||
delete: Usuń
|
||||
delete_confirm: Jesteś pewien?
|
||||
delete_confirm: Czy na pewno?
|
||||
back_to_list: Powrót do listy
|
||||
twofactor_google_label: Uwierzytelnianie dwuskładnikowe przez aplikację OTP
|
||||
twofactor_email_label: Uwierzytelnianie dwuskładnikowe przez e-mail
|
||||
search:
|
||||
placeholder: Filtruj po nazwie użytkownika lub adresie e-mail
|
||||
site_credential:
|
||||
@ -588,7 +638,7 @@ site_credential:
|
||||
password_label: Hasło
|
||||
save: Zapisz
|
||||
delete: Usuń
|
||||
delete_confirm: Jesteś pewien?
|
||||
delete_confirm: Czy na pewno?
|
||||
back_to_list: Powrót do listy
|
||||
error:
|
||||
page_title: Wystąpił błąd
|
||||
@ -607,6 +657,15 @@ flashes:
|
||||
tags_reset: Zresetuj tagi
|
||||
entries_reset: Zresetuj wpisy
|
||||
archived_reset: Zarchiwizowane wpisy usunięte
|
||||
feed_updated: Zaktualizowano informacje o kanale
|
||||
feed_token_updated: Zaktualizowano token kanału
|
||||
ignore_origin_rules_updated: Zaktualizowano zasadę ignorowania pochodzenia
|
||||
otp_enabled: Włączono uwierzytelnianie dwuskładnikowe
|
||||
tagging_rules_imported: Zaimportowano zasady tagowania
|
||||
feed_token_revoked: Unieważniono token kanału
|
||||
otp_disabled: Wyłączono uwierzytelnianie dwuskładnikowe
|
||||
tagging_rules_not_imported: Błąd podczas importowania zasad tagowania
|
||||
ignore_origin_rules_deleted: Usunięto zasadę ignorowania pochodzenia
|
||||
entry:
|
||||
notice:
|
||||
entry_already_saved: Wpis już został dodany %date%
|
||||
@ -617,12 +676,14 @@ flashes:
|
||||
entry_reloaded_failed: Wpis ponownie załadowany, ale wystąpił bład pobierania treści
|
||||
entry_archived: Wpis dodany do archiwum
|
||||
entry_unarchived: Wpis usunięty z archiwum
|
||||
entry_starred: Wpis oznaczony gwiazdką
|
||||
entry_unstarred: Wpis odznaczony gwiazdką
|
||||
entry_starred: Wpis wyróżniony
|
||||
entry_unstarred: Wpis bez wyróżnienia
|
||||
entry_deleted: Wpis usunięty
|
||||
no_random_entry: Nie znaleziono artykułu spełniającego te kryteria
|
||||
tag:
|
||||
notice:
|
||||
tag_added: Tag dodany
|
||||
tag_renamed: Zmieniono nazwę tagu
|
||||
import:
|
||||
notice:
|
||||
failed: Nieudany import, prosimy spróbować ponownie.
|
||||
@ -646,3 +707,25 @@ flashes:
|
||||
added: Poświadczenie dla "%host%" dodane
|
||||
updated: Poświadczenie dla "%host%" zaktualizowane
|
||||
deleted: Poświadczenie dla "%host%" usuniętę
|
||||
ignore_origin_instance_rule:
|
||||
notice:
|
||||
added: Dodano globalną zasadę ignorowania pochodzenia
|
||||
updated: Zaktualizowano globalną zasadę ignorowania pochodzenia
|
||||
deleted: Usunięto globalną zasadę ignorowania pochodzenia
|
||||
ignore_origin_instance_rule:
|
||||
page_title: Globalne zasady ignorowania pochodzenia
|
||||
new_ignore_origin_instance_rule: Utwórz globalną zasadę ignorowania pochodzenia
|
||||
edit_ignore_origin_instance_rule: Edytuj globalną zasadę ignorowania pochodzenia
|
||||
form:
|
||||
delete: Usuń
|
||||
rule_label: Zasada
|
||||
delete_confirm: Czy na pewno?
|
||||
back_to_list: Powrót do listy
|
||||
save: Zapisz
|
||||
list:
|
||||
create_new_one: Utwórz nową globalną zasadę ignorowania pochodzenia
|
||||
yes: Tak
|
||||
no: Nie
|
||||
actions: Akcje
|
||||
edit_action: Edytuj
|
||||
description: Tutaj możesz zarządzać globalnymi zasadami ignorowania pochodzenia, używanymi do ignorowania niektórych wzorców oryginalnych adresów URL.
|
||||
|
||||
@ -141,6 +141,9 @@ config:
|
||||
feed_link:
|
||||
all: Todos
|
||||
feed_limit: Número de itens no feed
|
||||
otp:
|
||||
app:
|
||||
cancel: Cancelar
|
||||
entry:
|
||||
default_title: 'Título da entrada'
|
||||
page_titles:
|
||||
@ -329,6 +332,7 @@ tag:
|
||||
list:
|
||||
number_on_the_page: '{0} Não existem tags.|{1} Uma tag.|]1,Inf[ Existem %count% tags.'
|
||||
see_untagged_entries: 'Ver entradas sem tags'
|
||||
untagged: Entradas sem tags
|
||||
import:
|
||||
page_title: 'Importar'
|
||||
page_description: 'Bem-vindo ao importador do wallabag. Por favo selecione o serviço do qual deseja migrar.'
|
||||
|
||||
@ -381,6 +381,7 @@ tag:
|
||||
list:
|
||||
number_on_the_page: '{0} ไม่มีการแท็ก|{1} มีหนึ่งแท็ก|]1,Inf[ มี %count% แท็ก'
|
||||
see_untagged_entries: 'พบรายการที่ไม่ได้แท็ก'
|
||||
untagged: รายการที่ไม่ได้แท็ก
|
||||
new:
|
||||
add: 'เพิ่ม'
|
||||
placeholder: 'คุณสามารถเพิ่มได้หลายแท็ก, จากการแบ่งโดย comma'
|
||||
|
||||
@ -37,6 +37,7 @@ menu:
|
||||
theme_toggle_auto: Otomatik tema
|
||||
theme_toggle_dark: Koyu renk tema
|
||||
theme_toggle_light: Açık renk tema
|
||||
with_annotations: Açıklama metinleriyle
|
||||
top:
|
||||
add_new_entry: Yeni bir makale ekle
|
||||
search: Ara
|
||||
@ -244,6 +245,8 @@ entry:
|
||||
delete: Sil
|
||||
export_title: Dışa Aktar
|
||||
number_of_tags: '{1}ve başka etiket|]1,Inf[ve %count% başka etiket'
|
||||
show_same_domain: Aynı etki alanına sahip makaleleri göster
|
||||
assign_search_tag: Bu aramayı her sonuca bir etiket olarak ata
|
||||
filters:
|
||||
title: Filtreler
|
||||
status_label: Durum
|
||||
@ -268,6 +271,7 @@ entry:
|
||||
is_public_label: Herkese açık bağlantısı var
|
||||
is_public_help: Herkese açık bağlantı
|
||||
http_status_label: HTTP durumu
|
||||
annotated_label: Açıklamalı
|
||||
view:
|
||||
left_menu:
|
||||
back_to_homepage: Geri
|
||||
@ -319,6 +323,8 @@ entry:
|
||||
filtered_search: 'Arama kriteri ile filtrele:'
|
||||
untagged: Etiketlenmemiş makaleler
|
||||
all: Tüm makaleler
|
||||
with_annotations: Açıklama metinleri olan makaleler
|
||||
same_domain: Aynı etki alanı
|
||||
search:
|
||||
placeholder: Neye bakıyordunuz?
|
||||
public:
|
||||
@ -529,6 +535,10 @@ import:
|
||||
elcurator:
|
||||
description: Bu içe aktarıcı tüm elCurator makalelerinizi içe aktaracak. elCurator hesabınızda tercihlerinize gidin ve ardından içeriğinizi dışa aktarın. Bir JSON dosyanız olacak.
|
||||
page_title: İçe Aktar > elCurator
|
||||
delicious:
|
||||
page_title: İçe aktar > del.icio.us
|
||||
description: Bu içe aktarıcı tüm Delicious yer imlerinizi içe aktaracaktır. 2021'den beri, dışa aktarma sayfasını kullanarak verilerinizi tekrar dışa aktarabilirsiniz (https://del.icio.us/export). "JSON" biçimini seçin ve indirin ("delicious_export.2021.02.06_21.10.json" gibi).
|
||||
how_to: Lütfen Delicious dışa aktarım dosyanızı seçin ve aşağıdaki düğmeye tıklayarak içe aktarın.
|
||||
user:
|
||||
form:
|
||||
username_label: Kullanıcı adı
|
||||
|
||||
@ -1 +1,107 @@
|
||||
{}
|
||||
config:
|
||||
tab_menu:
|
||||
feed: 訂閱源
|
||||
settings: 設定
|
||||
password: 密碼
|
||||
rules: 標籤規則
|
||||
ignore_origin: 忽略原始規則
|
||||
reset: 重設區域
|
||||
new_user: 新增使用者
|
||||
user_info: 使用者資訊
|
||||
page_title: 設定
|
||||
form_settings:
|
||||
theme_label: 主題
|
||||
reading_speed:
|
||||
300_word: 我每分鐘約可讀 300 個字
|
||||
label: 閱讀速度
|
||||
help_message: 你可以使用線上工具來預估你的閱讀速度:
|
||||
100_word: 我每分鐘約可讀 100 個字
|
||||
200_word: 我每分鐘約可讀 200 個字
|
||||
400_word: 我每分鐘約可讀 400 個字
|
||||
action_mark_as_read:
|
||||
redirect_homepage: 回到首頁
|
||||
redirect_current_page: 停留在本頁
|
||||
label: 將一個項目刪除、收藏或標記為已讀後該做什麼呢?
|
||||
help_items_per_page: 你可以調整每頁呈現的項目數量。
|
||||
items_per_page_label: 每頁項目數量
|
||||
language_label: 語言
|
||||
form_feed:
|
||||
description: 你可以使用你喜愛的 Atom 閱讀器來閱讀由 wallabag 提供的 Atom 訂閱源。為此你需要先產生一組 token。
|
||||
form_user:
|
||||
delete:
|
||||
description: 如果你移除了你自己的帳號,你所有的項目、標籤、註釋包含你的帳號本身都會被 "用久" 的移除(無法復原)。然後你將會被自動登出。
|
||||
form:
|
||||
save: 儲存
|
||||
menu:
|
||||
left:
|
||||
quickstart: 快速開始
|
||||
ignore_origin_instance_rules: 全域忽略原始規則
|
||||
howto: 指南
|
||||
with_annotations: 附有註釋的
|
||||
tags: 標籤
|
||||
internal_settings: 內部設定
|
||||
import: 匯入
|
||||
logout: 登出
|
||||
search: 搜尋
|
||||
back_to_unread: 回到未讀項目
|
||||
users_management: 使用者管理
|
||||
site_credentials: 網站憑證
|
||||
theme_toggle_light: 淺色主題
|
||||
theme_toggle_dark: 深色主題
|
||||
theme_toggle_auto: 根據系統設定自動設定主題
|
||||
developer: 客戶端 API 管理
|
||||
config: 設定
|
||||
unread: 未讀
|
||||
starred: 收藏
|
||||
about: 關於
|
||||
save_link: 儲存連結
|
||||
all_articles: 所有項目
|
||||
archive: 歸檔
|
||||
top:
|
||||
random_entry: 由列表中隨機選擇項目
|
||||
account: 我的帳號
|
||||
export: 匯出
|
||||
filter_entries: 項目篩選
|
||||
search: 搜尋
|
||||
add_new_entry: 新增項目
|
||||
search_form:
|
||||
input_label: 請在此輸入搜尋字串
|
||||
security:
|
||||
login:
|
||||
submit: 登入
|
||||
register: 註冊
|
||||
page_title: 歡迎使用 wallabag!
|
||||
keep_logged_in: 保持登入狀態
|
||||
forgot_password: 忘記密碼了嗎?
|
||||
cancel: 取消
|
||||
username: 使用者名稱
|
||||
password: 密碼
|
||||
register:
|
||||
page_title: 建立一個新帳號
|
||||
go_to_account: 前往你的帳號
|
||||
resetting:
|
||||
description: 請輸入您的電子郵件地址,我們將會寄送密碼重製操作指示。
|
||||
footer:
|
||||
wallabag:
|
||||
elsewhere: 將 wallabag 隨身攜帶
|
||||
social: 社群
|
||||
powered_by: 運行於
|
||||
about: 關於
|
||||
stats: 自從 %user_creation% 以來,你已閱讀 %nb_archives% 篇項目. 這大約是 %per_day% 篇一天!
|
||||
entry:
|
||||
list:
|
||||
show_same_domain: 顯示同一域名的項目
|
||||
howto:
|
||||
shortcuts:
|
||||
arrows_navigation: 在項目間導覽
|
||||
quickstart:
|
||||
first_steps:
|
||||
unread_articles: 然後將他分類!
|
||||
docs:
|
||||
all_docs: 還有另外許多的項目!
|
||||
export: 將你的項目轉換為 ePUB 或 PDF 版本
|
||||
configure:
|
||||
tagging_rules: 撰寫規則來自動化標籤你的項目
|
||||
import:
|
||||
wallabag_v1:
|
||||
description: 這個匯入器將會匯入 wallabag v1 中你所有的項目。在設定頁面的 "匯出 wallabag 資料" 頁簽中,點選 "匯出 JSON 檔",你將會得到檔名為 "wallabag-export-1-xxxx-xx-xx.json" 檔案。
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
<header class="block">
|
||||
<h1>{{ entry.title|e|raw }}</h1>
|
||||
<a href="{{ entry.url|e }}" target="_blank" rel="noopener" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e|raw }}" class="tool">{{ entry.domainName|removeWww }}</a>
|
||||
<p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username})|raw }}.</p>
|
||||
<p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username|escape})|raw }}.</p>
|
||||
</header>
|
||||
<article class="block">
|
||||
{{ entry.content | raw }}
|
||||
|
||||
@ -548,7 +548,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="set7" class="col s12">
|
||||
<div class="row">
|
||||
<h5>{{ 'config.reset.title'|trans }}</h5>
|
||||
@ -573,9 +573,11 @@
|
||||
<div class="row">
|
||||
<h5>{{ 'config.form_user.delete.title'|trans }}</h5>
|
||||
<p>{{ 'config.form_user.delete.description'|trans }}</p>
|
||||
<a href="{{ path('delete_account') }}" onclick="return confirm('{{ 'config.form_user.delete.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red delete-account">
|
||||
{{ 'config.form_user.delete.button'|trans }}
|
||||
</a>
|
||||
<form action="{{ path('delete_account') }}" method="post" onsubmit="return confirm('{{ 'config.form_user.delete.confirm'|trans|escape('js') }}')" name="delete-account">
|
||||
<input type="hidden" name="token" value="{{ csrf_token('delete-account') }}" />
|
||||
|
||||
<button class="waves-effect waves-light btn red" type="submit">{{ 'config.form_user.delete.button'|trans }}</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@ -33,8 +33,4 @@
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@ -18,7 +18,7 @@ class RedisWorkerCommand extends ContainerAwareCommand
|
||||
->setName('wallabag:import:redis-worker')
|
||||
->setDescription('Launch Redis worker')
|
||||
->addArgument('serviceName', InputArgument::REQUIRED, 'Service to use: wallabag_v1, wallabag_v2, pocket, readability, pinboard, delicious, firefox, chrome or instapaper')
|
||||
->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stoping', false)
|
||||
->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stopping', false)
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
auth_code:
|
||||
on: an
|
||||
mailer:
|
||||
subject: wallabag-Authentifizierungcode
|
||||
subject: wallabag-Authentifizierungscode
|
||||
body:
|
||||
hello: Hallo %user%,
|
||||
first_para: Da du die Zwei-Faktor-Authentifizierung in deinem wallabag-Konto aktiviert hast und du dich gerade von einem neuen Gerät (Computer, Handy, etc.) anmeldest, senden wir dir einen Code, um deinen Zugriff zu prüfen.
|
||||
|
||||
@ -1,12 +1,10 @@
|
||||
auth_code:
|
||||
on: włączony
|
||||
mailer:
|
||||
subject: Kod autoryzacyjny Wallabag
|
||||
body:
|
||||
hello: Cześć %user%,
|
||||
first_para: Od momentu włączenia na swoim koncie autoryzacji dwuetapowej i zalogowaniu
|
||||
się na nowym urządzeniu (komputer, telefon, etc.), wyślemy do ciebie kod potwierdzający
|
||||
twoje połączenie.
|
||||
second_para: 'Tutaj jest twój kod:'
|
||||
support: 'Nie wahaj się skontaktować z nami, jeżeli masz jakiekolwiek problemy:'
|
||||
signature: Zespół wallabag
|
||||
on: włączony
|
||||
mailer:
|
||||
subject: Kod uwierzytelniający wallabag
|
||||
body:
|
||||
hello: Cześć, %user%,
|
||||
first_para: Ponieważ do zalogowania się na konto wallabag wymagane jest uwierzytelnianie dwuskładnikowe, a nowe urządzenie właśnie z niego korzystało, wyślemy Ci kod, aby zweryfikować jego połączenie.
|
||||
second_para: 'Oto kod:'
|
||||
support: 'Nie wahaj się skontaktować z nami, jeżeli masz jakiekolwiek problemy:'
|
||||
signature: Zespół wallabag
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{# Override `vendor/scheb/two-factor-bundle/Resources/views/Authentication/form.html.twig` #}
|
||||
{% extends "WallabagUserBundle::layout.html.twig" %}
|
||||
{% extends "FOSUserBundle::layout.html.twig" %}
|
||||
|
||||
{% block fos_user_content %}
|
||||
<form class="form" action="{{ path("2fa_login_check") }}" method="post">
|
||||
|
||||
@ -22,8 +22,6 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Test fetching annotations for an entry.
|
||||
*
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testGetAnnotations($prefixUrl)
|
||||
@ -35,15 +33,7 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
->findOneByUserName('admin');
|
||||
$entry = $em
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findOneByUsernameAndNotArchived('admin');
|
||||
|
||||
$annotation = new Annotation($user);
|
||||
$annotation->setEntry($entry);
|
||||
$annotation->setText('This is my annotation /o/');
|
||||
$annotation->setQuote('content');
|
||||
|
||||
$em->persist($annotation);
|
||||
$em->flush();
|
||||
->findByUrlAndUserId('http://0.0.0.0/entry1', $user->getId());
|
||||
|
||||
if ('annotations' === $prefixUrl) {
|
||||
$this->logInAs('admin');
|
||||
@ -54,23 +44,44 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
|
||||
$content = json_decode($this->client->getResponse()->getContent(), true);
|
||||
$this->assertGreaterThanOrEqual(1, $content['total']);
|
||||
$this->assertSame($annotation->getText(), $content['rows'][0]['text']);
|
||||
|
||||
// we need to re-fetch the annotation becase after the flush, it has been "detached" from the entity manager
|
||||
$annotation = $em->getRepository('WallabagAnnotationBundle:Annotation')->findAnnotationById($annotation->getId());
|
||||
$em->remove($annotation);
|
||||
$em->flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test creating an annotation for an entry.
|
||||
*
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testGetAnnotationsFromAnOtherUser($prefixUrl)
|
||||
{
|
||||
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
|
||||
$otherUser = $em
|
||||
->getRepository('WallabagUserBundle:User')
|
||||
->findOneByUserName('bob');
|
||||
$entry = $em
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findByUrlAndUserId('http://0.0.0.0/entry3', $otherUser->getId());
|
||||
|
||||
if ('annotations' === $prefixUrl) {
|
||||
$this->logInAs('admin');
|
||||
}
|
||||
|
||||
$this->client->request('GET', $prefixUrl . '/' . $entry->getId() . '.json');
|
||||
$this->assertSame(200, $this->client->getResponse()->getStatusCode());
|
||||
|
||||
$content = json_decode($this->client->getResponse()->getContent(), true);
|
||||
$this->assertGreaterThanOrEqual(0, $content['total']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testSetAnnotation($prefixUrl)
|
||||
{
|
||||
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
|
||||
$user = $em
|
||||
->getRepository('WallabagUserBundle:User')
|
||||
->findOneByUserName('admin');
|
||||
|
||||
if ('annotations' === $prefixUrl) {
|
||||
$this->logInAs('admin');
|
||||
}
|
||||
@ -102,7 +113,7 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
/** @var Annotation $annotation */
|
||||
$annotation = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findLastAnnotationByPageId($entry->getId(), 1);
|
||||
->findLastAnnotationByUserId($entry->getId(), $user->getId());
|
||||
|
||||
$this->assertSame('my annotation', $annotation->getText());
|
||||
}
|
||||
@ -195,8 +206,6 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Test editing an existing annotation.
|
||||
*
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testEditAnnotation($prefixUrl)
|
||||
@ -243,8 +252,31 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Test deleting an annotation.
|
||||
*
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testEditAnnotationFromAnOtherUser($prefixUrl)
|
||||
{
|
||||
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
|
||||
$otherUser = $em
|
||||
->getRepository('WallabagUserBundle:User')
|
||||
->findOneByUserName('bob');
|
||||
$entry = $em
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findByUrlAndUserId('http://0.0.0.0/entry3', $otherUser->getId());
|
||||
$annotation = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findLastAnnotationByUserId($entry->getId(), $otherUser->getId());
|
||||
|
||||
$headers = ['CONTENT_TYPE' => 'application/json'];
|
||||
$content = json_encode([
|
||||
'text' => 'a modified annotation',
|
||||
]);
|
||||
$this->client->request('PUT', $prefixUrl . '/' . $annotation->getId() . '.json', [], [], $headers, $content);
|
||||
$this->assertSame(404, $this->client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testDeleteAnnotation($prefixUrl)
|
||||
@ -287,4 +319,40 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
||||
|
||||
$this->assertNull($annotationDeleted);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataForEachAnnotations
|
||||
*/
|
||||
public function testDeleteAnnotationFromAnOtherUser($prefixUrl)
|
||||
{
|
||||
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
|
||||
$otherUser = $em
|
||||
->getRepository('WallabagUserBundle:User')
|
||||
->findOneByUserName('bob');
|
||||
$entry = $em
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findByUrlAndUserId('http://0.0.0.0/entry3', $otherUser->getId());
|
||||
$annotation = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findLastAnnotationByUserId($entry->getId(), $otherUser->getId());
|
||||
|
||||
$user = $em
|
||||
->getRepository('WallabagUserBundle:User')
|
||||
->findOneByUserName('admin');
|
||||
$entry = $em
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findOneByUsernameAndNotArchived('admin');
|
||||
|
||||
if ('annotations' === $prefixUrl) {
|
||||
$this->logInAs('admin');
|
||||
}
|
||||
|
||||
$headers = ['CONTENT_TYPE' => 'application/json'];
|
||||
$content = json_encode([
|
||||
'text' => 'a modified annotation',
|
||||
]);
|
||||
$this->client->request('DELETE', $prefixUrl . '/' . $annotation->getId() . '.json', [], [], $headers, $content);
|
||||
$this->assertSame(404, $this->client->getResponse()->getStatusCode());
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,6 +157,25 @@ class EntryRestControllerTest extends WallabagApiTestCase
|
||||
$this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
|
||||
}
|
||||
|
||||
public function testGetEntriesByDomainName()
|
||||
{
|
||||
$this->client->request('GET', '/api/entries?domain_name=domain.io');
|
||||
|
||||
$this->assertSame(200, $this->client->getResponse()->getStatusCode());
|
||||
|
||||
$content = json_decode($this->client->getResponse()->getContent(), true);
|
||||
|
||||
$this->assertGreaterThanOrEqual(1, \count($content));
|
||||
$this->assertNotEmpty($content['_embedded']['items']);
|
||||
$this->assertGreaterThanOrEqual(1, $content['total']);
|
||||
$this->assertSame(1, $content['page']);
|
||||
$this->assertGreaterThanOrEqual(1, $content['pages']);
|
||||
|
||||
$this->assertSame('test title entry6', $content['_embedded']['items'][0]['title']);
|
||||
|
||||
$this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
|
||||
}
|
||||
|
||||
public function testGetEntriesWithFullOptions()
|
||||
{
|
||||
$this->client->request('GET', '/api/entries', [
|
||||
|
||||
@ -20,14 +20,13 @@ class TagRestControllerTest extends WallabagApiTestCase
|
||||
$this->assertGreaterThan(0, $content);
|
||||
$this->assertArrayHasKey('id', $content[0]);
|
||||
$this->assertArrayHasKey('label', $content[0]);
|
||||
$this->assertArrayHasKey('nbEntries', $content[0]);
|
||||
|
||||
$tagLabels = array_map(function ($i) {
|
||||
return $i['label'];
|
||||
}, $content);
|
||||
|
||||
$this->assertNotContains($this->otherUserTagLabel, $tagLabels, 'There is a possible tag leak');
|
||||
|
||||
return end($content);
|
||||
}
|
||||
|
||||
public function testDeleteUserTag()
|
||||
|
||||
@ -794,7 +794,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
|
||||
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
||||
$this->assertStringNotContainsString('config.form_user.delete.button', $body[0]);
|
||||
|
||||
$client->request('GET', '/account/delete');
|
||||
$client->request('POST', '/account/delete');
|
||||
$this->assertSame(403, $client->getResponse()->getStatusCode());
|
||||
|
||||
$user = $em
|
||||
@ -860,9 +860,9 @@ class ConfigControllerTest extends WallabagCoreTestCase
|
||||
|
||||
$crawler = $client->request('GET', '/config');
|
||||
|
||||
$deleteLink = $crawler->filter('.delete-account')->last()->link();
|
||||
$deleteForm = $crawler->filter('form[name=delete-account]')->form();
|
||||
|
||||
$client->click($deleteLink);
|
||||
$client->submit($deleteForm);
|
||||
$this->assertSame(302, $client->getResponse()->getStatusCode());
|
||||
|
||||
$em = $client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
@ -932,7 +932,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
|
||||
|
||||
$annotationsReset = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findAnnotationsByPageId($entry->getId(), $user->getId());
|
||||
->findByEntryIdAndUserId($entry->getId(), $user->getId());
|
||||
|
||||
$this->assertEmpty($annotationsReset, 'Annotations were reset');
|
||||
|
||||
@ -1040,7 +1040,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
|
||||
|
||||
$annotationsReset = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findAnnotationsByPageId($annotationArchived->getId(), $user->getId());
|
||||
->findByEntryIdAndUserId($annotationArchived->getId(), $user->getId());
|
||||
|
||||
$this->assertEmpty($annotationsReset, 'Annotations were reset');
|
||||
}
|
||||
@ -1097,7 +1097,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
|
||||
|
||||
$annotationsReset = $em
|
||||
->getRepository('WallabagAnnotationBundle:Annotation')
|
||||
->findAnnotationsByPageId($entry->getId(), $user->getId());
|
||||
->findByEntryIdAndUserId($entry->getId(), $user->getId());
|
||||
|
||||
$this->assertEmpty($annotationsReset, 'Annotations were reset');
|
||||
}
|
||||
|
||||
@ -1489,16 +1489,16 @@ class EntryControllerTest extends WallabagCoreTestCase
|
||||
'it',
|
||||
],
|
||||
'zh_CN' => [
|
||||
'http://www.hao123.com/shequ?__noscript__-=1',
|
||||
'http://tuijian.hao123.com/tuijian/?__noscript__-=1',
|
||||
'zh_CN',
|
||||
],
|
||||
'pt_BR' => [
|
||||
'https://politica.estadao.com.br/noticias/eleicoes,campanha-catatonica,70002491983',
|
||||
'https://esportes.r7.com/lance/futebol/victor-hugo-e-matheus-franca-devem-desfalcar-flamengo-no-carioca-22112022',
|
||||
'pt_BR',
|
||||
],
|
||||
'es-ES' => [
|
||||
'https://www.20minutos.es/noticia/3360685/0/gobierno-sanchez-primero-historia-mas-mujeres-que-hombres/',
|
||||
'es_ES',
|
||||
'https://elpais.com/internacional/2022-11-03/ultima-hora-de-la-guerra-entre-rusia-y-ucrania-hoy-en-directo.html',
|
||||
'es',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ class ExportControllerTest extends WallabagCoreTestCase
|
||||
$this->assertSame(404, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function testBadEntryId()
|
||||
public function testNonExistingEntryId()
|
||||
{
|
||||
$this->logInAs('admin');
|
||||
$client = $this->getClient();
|
||||
@ -67,6 +67,21 @@ class ExportControllerTest extends WallabagCoreTestCase
|
||||
$this->assertSame(404, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function testForbiddenEntryId()
|
||||
{
|
||||
$this->logInAs('admin');
|
||||
$client = $this->getClient();
|
||||
|
||||
$content = $client->getContainer()
|
||||
->get('doctrine.orm.entity_manager')
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findOneByUsernameAndNotArchived('bob');
|
||||
|
||||
$client->request('GET', '/export/' . $content->getId() . '.mobi');
|
||||
|
||||
$this->assertSame(404, $client->getResponse()->getStatusCode());
|
||||
}
|
||||
|
||||
public function testEpubExport()
|
||||
{
|
||||
$this->logInAs('admin');
|
||||
|
||||
@ -202,7 +202,7 @@ class DownloadImagesTest extends TestCase
|
||||
$this->assertFalse($res);
|
||||
}
|
||||
|
||||
public function testEnsureOnlyFirstOccurenceIsReplaced()
|
||||
public function testEnsureOnlyFirstOccurrenceIsReplaced()
|
||||
{
|
||||
$httpMockClient = new HttpMockClient();
|
||||
$httpMockClient->addResponse(new Response(200, ['content-type' => 'image/png'], file_get_contents(__DIR__ . '/../fixtures/unnamed.png')));
|
||||
@ -220,4 +220,32 @@ class DownloadImagesTest extends TestCase
|
||||
|
||||
$this->assertSame('<img src="http://wallabag.io/assets/images/9/b/9b0ead26/6bef06fe.png" srcset="http://wallabag.io/assets/images/9/b/9b0ead26/43cc0123.png 1290w" height="573" width="860" alt="" referrerpolicy="no-referrer">', $res);
|
||||
}
|
||||
|
||||
public function testProcessSingleImageWithSvg()
|
||||
{
|
||||
$httpMockClient = new HttpMockClient();
|
||||
$httpMockClient->addResponse(new Response(200, ['content-type' => 'image/svg+xml'], file_get_contents(__DIR__ . '/../fixtures/modal-content.svg')));
|
||||
|
||||
$logHandler = new TestHandler();
|
||||
$logger = new Logger('test', [$logHandler]);
|
||||
|
||||
$download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
|
||||
$res = $download->processSingleImage(123, 'modal-content.svg', 'http://imgur.com/gallery/WxtWY');
|
||||
|
||||
$this->assertStringContainsString('/assets/images/9/b/9b0ead26/400e29f9.svg', $res);
|
||||
}
|
||||
|
||||
public function testProcessSingleImageWithBadSvg()
|
||||
{
|
||||
$httpMockClient = new HttpMockClient();
|
||||
$httpMockClient->addResponse(new Response(200, ['content-type' => 'image/svg+xml'], file_get_contents(__DIR__ . '/../fixtures/unnamed.png')));
|
||||
|
||||
$logHandler = new TestHandler();
|
||||
$logger = new Logger('test', [$logHandler]);
|
||||
|
||||
$download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
|
||||
$res = $download->processSingleImage(123, 'modal-content.svg', 'http://imgur.com/gallery/WxtWY');
|
||||
|
||||
$this->assertFalse($res);
|
||||
}
|
||||
}
|
||||
|
||||
237
tests/Wallabag/CoreBundle/fixtures/modal-content.svg
Normal file
237
tests/Wallabag/CoreBundle/fixtures/modal-content.svg
Normal file
@ -0,0 +1,237 @@
|
||||
<svg width="120" height="125" viewBox="0 0 120 125" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<g filter="url(#filter0_d)">
|
||||
<path d="M82.7311 12.7383H26.7744C23.5022 12.7383 20.8496 15.4119 20.8496 18.7099V105.63C20.8496 108.928 23.5022 111.601 26.7744 111.601H82.7311C86.0033 111.601 88.6559 108.928 88.6559 105.63V18.7099C88.6559 15.4119 86.0033 12.7383 82.7311 12.7383Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M82.7311 12.7383H26.7744C23.5022 12.7383 20.8496 15.4119 20.8496 18.7099V105.63C20.8496 108.928 23.5022 111.601 26.7744 111.601H82.7311C86.0033 111.601 88.6559 108.928 88.6559 105.63V18.7099C88.6559 15.4119 86.0033 12.7383 82.7311 12.7383Z" fill="white"/>
|
||||
<path d="M80.8066 28.9941H26.9237C25.8329 28.9941 24.9487 29.8853 24.9487 30.9847V64.492C24.9487 65.5913 25.8329 66.4825 26.9237 66.4825H80.8066C81.8974 66.4825 82.7816 65.5913 82.7816 64.492V30.9847C82.7816 29.8853 81.8974 28.9941 80.8066 28.9941Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M80.9927 69.3936H27.1097C26.019 69.3936 25.1348 70.2847 25.1348 71.3841V86.479C25.1348 87.5783 26.019 88.4695 27.1097 88.4695H80.9927C82.0834 88.4695 82.9676 87.5783 82.9676 86.479V71.3841C82.9676 70.2847 82.0834 69.3936 80.9927 69.3936Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M80.9927 91.3809H27.1097C26.019 91.3809 25.1348 92.2721 25.1348 93.3714V95.0302C25.1348 96.1295 26.019 97.0207 27.1097 97.0207H80.9927C82.0834 97.0207 82.9676 96.1295 82.9676 95.0302V93.3714C82.9676 92.2721 82.0834 91.3809 80.9927 91.3809Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M75.6812 99.9316H27.6995C26.6088 99.9316 25.7246 100.823 25.7246 101.922V103.581C25.7246 104.68 26.6088 105.571 27.6995 105.571H75.6812C76.7719 105.571 77.6561 104.68 77.6561 103.581V101.922C77.6561 100.823 76.7719 99.9316 75.6812 99.9316Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M26.5945 23.5549C27.5035 23.5549 28.2403 22.8122 28.2403 21.8961C28.2403 20.98 27.5035 20.2373 26.5945 20.2373C25.6856 20.2373 24.9487 20.98 24.9487 21.8961C24.9487 22.8122 25.6856 23.5549 26.5945 23.5549Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M36.469 23.5549C37.378 23.5549 38.1148 22.8122 38.1148 21.8961C38.1148 20.98 37.378 20.2373 36.469 20.2373C35.5601 20.2373 34.8232 20.98 34.8232 21.8961C34.8232 22.8122 35.5601 23.5549 36.469 23.5549Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<path d="M31.532 23.5549C32.441 23.5549 33.1778 22.8122 33.1778 21.8961C33.1778 20.98 32.441 20.2373 31.532 20.2373C30.6231 20.2373 29.8862 20.98 29.8862 21.8961C29.8862 22.8122 30.6231 23.5549 31.532 23.5549Z" fill="#ECF1F5" fill-opacity="0.49"/>
|
||||
<g opacity="0.541969">
|
||||
<g opacity="0.541969" filter="url(#filter1_f)">
|
||||
<path d="M33.9366 58.0879H30.0588C29.5134 58.0879 29.0713 58.5335 29.0713 59.0832V62.9916C29.0713 63.5412 29.5134 63.9868 30.0588 63.9868H33.9366C34.4819 63.9868 34.924 63.5412 34.924 62.9916V59.0832C34.924 58.5335 34.4819 58.0879 33.9366 58.0879Z" fill="#C0C0C0"/>
|
||||
<path d="M33.9366 58.0879H30.0588C29.5134 58.0879 29.0713 58.5335 29.0713 59.0832V62.9916C29.0713 63.5412 29.5134 63.9868 30.0588 63.9868H33.9366C34.4819 63.9868 34.924 63.5412 34.924 62.9916V59.0832C34.924 58.5335 34.4819 58.0879 33.9366 58.0879Z" stroke="white" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<path opacity="0.541969" d="M34.3017 56.5303H29.6935C29.1482 56.5303 28.7061 56.9759 28.7061 57.5255V62.1701C28.7061 62.7198 29.1482 63.1654 29.6935 63.1654H34.3017C34.8471 63.1654 35.2892 62.7198 35.2892 62.1701V57.5255C35.2892 56.9759 34.8471 56.5303 34.3017 56.5303Z" fill="#E4EBF1" stroke="white" stroke-opacity="0.695558" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<g opacity="0.541969">
|
||||
<g opacity="0.541969" filter="url(#filter2_f)">
|
||||
<path d="M33.9366 69.9834H30.0588C29.5134 69.9834 29.0713 70.429 29.0713 70.9787V74.8871C29.0713 75.4368 29.5134 75.8824 30.0588 75.8824H33.9366C34.4819 75.8824 34.924 75.4368 34.924 74.8871V70.9787C34.924 70.429 34.4819 69.9834 33.9366 69.9834Z" fill="#C0C0C0"/>
|
||||
<path d="M33.9366 69.9834H30.0588C29.5134 69.9834 29.0713 70.429 29.0713 70.9787V74.8871C29.0713 75.4368 29.5134 75.8824 30.0588 75.8824H33.9366C34.4819 75.8824 34.924 75.4368 34.924 74.8871V70.9787C34.924 70.429 34.4819 69.9834 33.9366 69.9834Z" stroke="white" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<path opacity="0.541969" d="M34.3017 68.4258H29.6935C29.1482 68.4258 28.7061 68.8714 28.7061 69.4211V74.0656C28.7061 74.6153 29.1482 75.0609 29.6935 75.0609H34.3017C34.8471 75.0609 35.2892 74.6153 35.2892 74.0656V69.4211C35.2892 68.8714 34.8471 68.4258 34.3017 68.4258Z" fill="#E4EBF1" stroke="white" stroke-opacity="0.695558" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<g opacity="0.541969">
|
||||
<g opacity="0.541969" filter="url(#filter3_f)">
|
||||
<path d="M33.9366 81.6152H30.0588C29.5134 81.6152 29.0713 82.0608 29.0713 82.6105V86.5189C29.0713 87.0686 29.5134 87.5142 30.0588 87.5142H33.9366C34.4819 87.5142 34.924 87.0686 34.924 86.5189V82.6105C34.924 82.0608 34.4819 81.6152 33.9366 81.6152Z" fill="#C0C0C0"/>
|
||||
<path d="M33.9366 81.6152H30.0588C29.5134 81.6152 29.0713 82.0608 29.0713 82.6105V86.5189C29.0713 87.0686 29.5134 87.5142 30.0588 87.5142H33.9366C34.4819 87.5142 34.924 87.0686 34.924 86.5189V82.6105C34.924 82.0608 34.4819 81.6152 33.9366 81.6152Z" stroke="white" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<path opacity="0.541969" d="M34.3017 80.0576H29.6935C29.1482 80.0576 28.7061 80.5032 28.7061 81.0529V85.6975C28.7061 86.2471 29.1482 86.6927 29.6935 86.6927H34.3017C34.8471 86.6927 35.2892 86.2471 35.2892 85.6975V81.0529C35.2892 80.5032 34.8471 80.0576 34.3017 80.0576Z" fill="#E4EBF1" stroke="white" stroke-opacity="0.695558" stroke-width="0.588656"/>
|
||||
</g>
|
||||
<g filter="url(#filter4_d)">
|
||||
<path d="M109.293 61.5762H71.5871C69.9611 61.5762 68.6431 62.3515 68.6431 63.3079V69.369C68.6431 70.3254 69.9611 71.1008 71.5871 71.1008H109.293C110.919 71.1008 112.237 70.3254 112.237 69.369V63.3079C112.237 62.3515 110.919 61.5762 109.293 61.5762Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M110.098 59.3086H71.1762C69.4978 59.3086 68.1372 60.4162 68.1372 61.7825V70.4413C68.1372 71.8076 69.4978 72.9152 71.1762 72.9152H110.098C111.777 72.9152 113.137 71.8076 113.137 70.4413V61.7825C113.137 60.4162 111.777 59.3086 110.098 59.3086Z" fill="white"/>
|
||||
<path d="M105.265 63.0889H81.5132V65.4828H105.265V63.0889Z" fill="#8AEBE3" fill-opacity="0.3"/>
|
||||
<path d="M93.389 67.2783H81.5132V69.6722H93.389V67.2783Z" fill="#8AEBE3" fill-opacity="0.3"/>
|
||||
<g filter="url(#filter5_d)">
|
||||
<path d="M56.7928 89.21H19.0871C17.4611 89.21 16.1431 89.9853 16.1431 90.9417V97.0028C16.1431 97.9593 17.4611 98.7346 19.0871 98.7346H56.7928C58.4188 98.7346 59.7368 97.9593 59.7368 97.0028V90.9417C59.7368 89.9853 58.4188 89.21 56.7928 89.21Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M56.9302 87.2783H17.5552C16.0019 87.2783 14.7427 88.4967 14.7427 89.9996V98.1636C14.7427 99.6665 16.0019 100.885 17.5552 100.885H56.9302C58.4835 100.885 59.7427 99.6665 59.7427 98.1636V89.9996C59.7427 88.4967 58.4835 87.2783 56.9302 87.2783Z" fill="white"/>
|
||||
<path d="M51.75 91.0576H29.25V93.5178H51.75V91.0576Z" fill="#1DB868" fill-opacity="0.16226"/>
|
||||
<path d="M39.75 95.5928H29.25V97.8605H39.75V95.5928Z" fill="#1DB868" fill-opacity="0.16226"/>
|
||||
<g filter="url(#filter6_d)">
|
||||
<path d="M70.6744 74.8701C74.9376 74.8701 78.3937 71.3867 78.3937 67.0898C78.3937 62.7929 74.9376 59.3096 70.6744 59.3096C66.4111 59.3096 62.9551 62.7929 62.9551 67.0898C62.9551 71.3867 66.4111 74.8701 70.6744 74.8701Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M70.6744 74.8701C74.9376 74.8701 78.3937 71.3867 78.3937 67.0898C78.3937 62.7929 74.9376 59.3096 70.6744 59.3096C66.4111 59.3096 62.9551 62.7929 62.9551 67.0898C62.9551 71.3867 66.4111 74.8701 70.6744 74.8701Z" fill="#0CA090"/>
|
||||
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="55" y="50" width="20" height="24">
|
||||
<path d="M74.25 54.7431V72.3759C74.25 73.0916 73.6711 73.6718 72.9569 73.6718H56.7931C56.0789 73.6718 55.5 73.0916 55.5 72.3759V52.29C55.5 51.5743 56.0789 50.9941 56.7931 50.9941H71.0322L74.25 54.7431Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0)">
|
||||
<g filter="url(#filter7_d)">
|
||||
<path d="M74.25 54.7431V72.3759C74.25 73.0916 73.6711 73.6718 72.9569 73.6718H56.7931C56.0789 73.6718 55.5 73.0916 55.5 72.3759V52.29C55.5 51.5743 56.0789 50.9941 56.7931 50.9941H71.0322L74.25 54.7431Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M74.25 54.7431V72.3759C74.25 73.0916 73.6711 73.6718 72.9569 73.6718H56.7931C56.0789 73.6718 55.5 73.0916 55.5 72.3759V52.29C55.5 51.5743 56.0789 50.9941 56.7931 50.9941H71.0322L74.25 54.7431Z" fill="url(#paint0_linear)"/>
|
||||
<g filter="url(#filter8_d)">
|
||||
<path d="M74.7579 54.3307H71.9518C71.5642 54.3307 71.25 54.014 71.25 53.6234V50.2383L74.7579 54.3307Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M74.4313 54.774H71.6251C71.2375 54.774 70.9233 54.4574 70.9233 54.0667V50.6816L74.4313 54.774Z" fill="#D0FFFA"/>
|
||||
</g>
|
||||
<g filter="url(#filter9_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M66.2193 67.6725L63.7757 65.0544L69.5705 57.2429L66.2193 67.6725Z" fill="url(#paint1_linear)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M63.7756 65.0539L63.6674 62.8067L69.5703 57.2424L63.7756 65.0539Z" fill="#9BE6BF"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.25 60.6495L61.7872 62.8084L69.5704 57.2441L59.25 60.6495Z" fill="url(#paint2_linear)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M61.7871 62.8084H63.6674L69.5704 57.2441L61.7871 62.8084Z" fill="url(#paint3_linear)"/>
|
||||
</g>
|
||||
<g filter="url(#filter10_d)">
|
||||
<path d="M14.0331 104.067C19.459 104.067 23.8576 99.6336 23.8576 94.1648C23.8576 88.696 19.459 84.2627 14.0331 84.2627C8.6071 84.2627 4.2085 88.696 4.2085 94.1648C4.2085 99.6336 8.6071 104.067 14.0331 104.067Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M14.0331 104.059C19.459 104.059 23.8576 99.6258 23.8576 94.157C23.8576 88.6882 19.459 84.2549 14.0331 84.2549C8.6071 84.2549 4.2085 88.6882 4.2085 94.157C4.2085 99.6258 8.6071 104.059 14.0331 104.059Z" fill="url(#paint4_linear)"/>
|
||||
<g filter="url(#filter11_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1968 89.873C16.6837 89.873 18.6997 91.7203 18.6997 93.9989C18.6997 96.2776 16.6837 98.1248 14.1968 98.1248C13.4439 98.1248 12.7343 97.9555 12.1106 97.6563L10.4774 98.8638L10.4769 96.3247C9.98281 95.6625 9.69385 94.8616 9.69385 93.9989C9.69385 91.7203 11.7099 89.873 14.1968 89.873Z" fill="#EFFFF7"/>
|
||||
</g>
|
||||
<g filter="url(#filter12_d)">
|
||||
<path d="M23.737 35.876H10.763C10.2035 35.876 9.75 37.1067 9.75 38.6248V48.2456C9.75 49.7637 10.2035 50.9944 10.763 50.9944H23.737C24.2965 50.9944 24.75 49.7637 24.75 48.2456V38.6248C24.75 37.1067 24.2965 35.876 23.737 35.876Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M18.534 55.6747C24.9289 55.6747 30.113 50.4497 30.113 44.0043C30.113 37.559 24.9289 32.334 18.534 32.334C12.1391 32.334 6.95508 37.559 6.95508 44.0043C6.95508 50.4497 12.1391 55.6747 18.534 55.6747Z" fill="url(#paint5_linear)"/>
|
||||
<path d="M35.9351 41.249H21.4126C20.8873 41.249 20.4614 41.6782 20.4614 42.2077C20.4614 42.7371 20.8873 43.1663 21.4126 43.1663H35.9351C36.4604 43.1663 36.8862 42.7371 36.8862 42.2077C36.8862 41.6782 36.4604 41.249 35.9351 41.249Z" fill="#FFE9CC"/>
|
||||
<path d="M29.5593 45.29H21.4126C20.8873 45.29 20.4614 45.7192 20.4614 46.2487C20.4614 46.7781 20.8873 47.2073 21.4126 47.2073H29.5593C30.0846 47.2073 30.5105 46.7781 30.5105 46.2487C30.5105 45.7192 30.0846 45.29 29.5593 45.29Z" fill="#FFE9CC"/>
|
||||
<g filter="url(#filter13_d)">
|
||||
<path d="M17.2503 51.8505C16.0075 51.8505 15 50.8351 15 49.5825V40.3627C15 39.1102 16.0075 38.0947 17.2503 38.0947H35.2497C36.4925 38.0947 37.5 39.1102 37.5 40.3627V49.5825C37.5 50.8351 36.4925 51.8505 35.2497 51.8505H21.6485L19.991 53.3851C19.7758 53.5844 19.445 53.5844 19.2298 53.3851L17.5723 51.8505H17.2503Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M17.2503 51.8505C16.0075 51.8505 15 50.8351 15 49.5825V40.3627C15 39.1102 16.0075 38.0947 17.2503 38.0947H35.2497C36.4925 38.0947 37.5 39.1102 37.5 40.3627V49.5825C37.5 50.8351 36.4925 51.8505 35.2497 51.8505H21.6485L19.991 53.3851C19.7758 53.5844 19.445 53.5844 19.2298 53.3851L17.5723 51.8505H17.2503Z" fill="url(#paint6_linear)"/>
|
||||
<path d="M31.031 42.8271H19.3889C18.9678 42.8271 18.6265 43.1712 18.6265 43.5956C18.6265 44.0201 18.9678 44.3641 19.3889 44.3641H31.031C31.4521 44.3641 31.7935 44.0201 31.7935 43.5956C31.7935 43.1712 31.4521 42.8271 31.031 42.8271Z" fill="#FFE9CC"/>
|
||||
<path d="M25.9198 46.0674H19.3889C18.9678 46.0674 18.6265 46.4115 18.6265 46.8359C18.6265 47.2603 18.9678 47.6044 19.3889 47.6044H25.9198C26.3409 47.6044 26.6823 47.2603 26.6823 46.8359C26.6823 46.4115 26.3409 46.0674 25.9198 46.0674Z" fill="#FFE9CC"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d" x="8.84961" y="2.73828" width="91.8063" height="122.863" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="6"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.832587 0 0 0 0 0.899956 0 0 0 0 0.904167 0 0 0 0.7 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter1_f" x="27.9359" y="56.953" width="8.12326" height="8.16946" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="0.420468" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<filter id="filter2_f" x="27.9359" y="68.8485" width="8.12326" height="8.16949" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="0.420468" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<filter id="filter3_f" x="27.9359" y="80.4804" width="8.12326" height="8.16948" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="0.420468" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<filter id="filter4_d" x="56.6431" y="51.5762" width="67.5938" height="33.5246" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="6"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter5_d" x="4.14307" y="79.21" width="67.5938" height="33.5246" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="6"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter6_d" x="58.9551" y="57.3096" width="23.4386" height="23.5605" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="2"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0470588 0 0 0 0 0.627451 0 0 0 0 0.564706 0 0 0 0.406441 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter7_d" x="50.5" y="45.9941" width="28.75" height="32.6776" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset/>
|
||||
<feGaussianBlur stdDeviation="2.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0509804 0 0 0 0 0.768627 0 0 0 0 0.705882 0 0 0 0.8 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter8_d" x="69.25" y="49.2383" width="7.50792" height="8.09238" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="1"/>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0735419 0 0 0 0 0.599298 0 0 0 0 0.544595 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter9_d" x="57.25" y="57.2422" width="14.3206" height="14.4305" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0693481 0 0 0 0 0.648154 0 0 0 0 0.595253 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter10_d" x="-0.791504" y="79.2627" width="29.6491" height="29.8042" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset/>
|
||||
<feGaussianBlur stdDeviation="2.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0117647 0 0 0 0 0.866667 0 0 0 0 0.423529 0 0 0 0.447279 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter11_d" x="7.69385" y="89.873" width="13.0058" height="12.9907" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.0693481 0 0 0 0 0.648154 0 0 0 0 0.595253 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter12_d" x="-2.25" y="25.876" width="39" height="39.1184" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="2"/>
|
||||
<feGaussianBlur stdDeviation="6"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 0 0.891304 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter13_d" x="10" y="33.0947" width="32.5" height="25.4398" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset/>
|
||||
<feGaussianBlur stdDeviation="2.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.589163 0 0 0 0 0.0862745 0 0 0 0.4 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear" x1="64.875" y1="50.9941" x2="72.615" y2="72.8737" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#21C3B0"/>
|
||||
<stop offset="1" stop-color="#07C7B7" stop-opacity="0.951568"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="67.5909" y1="57.2777" x2="64.0443" y2="65.877" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#8EFAD9"/>
|
||||
<stop offset="1" stop-color="#E8FFF4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear" x1="62.1065" y1="58.6431" x2="63.8688" y2="62.3316" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#CFFFE6"/>
|
||||
<stop offset="0.4914" stop-color="#EDFFF6"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear" x1="69.2728" y1="58.6265" x2="64.4964" y2="62.9103" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#DDFFD0"/>
|
||||
<stop offset="1" stop-color="#BBFCDF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear" x1="14.0331" y1="84.2549" x2="14.0331" y2="104.059" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#02E26E"/>
|
||||
<stop offset="1" stop-color="#08C362"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear" x1="18.534" y1="55.6747" x2="12.201" y2="32.359" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFC000"/>
|
||||
<stop offset="1" stop-color="#FE6E00"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear" x1="18.7983" y1="55.4826" x2="20.2852" y2="36.758" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFDB78"/>
|
||||
<stop offset="1" stop-color="#FDAC43"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0">
|
||||
<rect width="120" height="123.971" fill="white" transform="translate(0 0.347656)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 22 KiB |
@ -114,14 +114,14 @@ class FirefoxControllerTest extends WallabagCoreTestCase
|
||||
->get('doctrine.orm.entity_manager')
|
||||
->getRepository('WallabagCoreBundle:Entry')
|
||||
->findByUrlAndUserId(
|
||||
'https://lexpansion.lexpress.fr/high-tech/orange-offre-un-meilleur-reseau-mobile-que-bouygues-et-sfr-free-derriere_1811554.html',
|
||||
'https://www.20minutes.fr/sport/4002755-20220928-tarn-lapins-ravagent-terrain-match-rugby-doit-etre-annule',
|
||||
$this->getLoggedInUserId()
|
||||
);
|
||||
|
||||
$this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
|
||||
$this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://lexpansion.lexpress.fr is ok');
|
||||
$this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://lexpansion.lexpress.fr is ok');
|
||||
$this->assertNotEmpty($content->getLanguage(), 'Language for http://lexpansion.lexpress.fr is ok');
|
||||
$this->assertNotEmpty($content->getMimetype(), 'Mimetype for https://www.20minutes.fr is ok');
|
||||
$this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for https://www.20minutes.fr is ok');
|
||||
$this->assertNotEmpty($content->getLanguage(), 'Language for https://www.20minutes.fr is ok');
|
||||
$this->assertCount(3, $content->getTags());
|
||||
|
||||
$content = $client->getContainer()
|
||||
|
||||
@ -28,14 +28,14 @@
|
||||
"children": [
|
||||
{
|
||||
"guid": "tard77lzbC5H",
|
||||
"title": "Orange offre un meilleur réseau mobile que Bouygues et SFR, Free derrière - L'Express L'Expansion",
|
||||
"title": "Tarn : Des lapins ravagent le terrain, le match de rugby doit être annulé",
|
||||
"index": 1,
|
||||
"dateAdded": 1388166091644000,
|
||||
"lastModified": 1388166091644000,
|
||||
"tags": "test,tag",
|
||||
"id": 4,
|
||||
"type": "text/x-moz-place",
|
||||
"uri": "http://lexpansion.lexpress.fr/high-tech/orange-offre-un-meilleur-reseau-mobile-que-bouygues-et-sfr-free-derriere_1811554.html"
|
||||
"uri": "https://www.20minutes.fr/sport/4002755-20220928-tarn-lapins-ravagent-terrain-match-rugby-doit-etre-annule"
|
||||
},
|
||||
{
|
||||
"guid": "E385l9vZ_LVn",
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user