forked from wallabag/wallabag
Compare commits
248 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 84c026081b | |||
| db3e0dd175 | |||
| 67ead77375 | |||
| 83f8ddccf0 | |||
| e0f234e568 | |||
| eed182c591 | |||
| 4649745a6f | |||
| 1a5348a8b8 | |||
| 96340e633d | |||
| 40e906e69d | |||
| c713d5bf60 | |||
| 8d3c5ebada | |||
| 5ef97e63c3 | |||
| 5809d7b072 | |||
| 6e39c92ead | |||
| 37019b5ad5 | |||
| 4947ea6758 | |||
| c87c91d3df | |||
| 6824914eb5 | |||
| e1957c08e4 | |||
| 249b8134b1 | |||
| 8e8f19720f | |||
| 1bd86e156e | |||
| 9a045b87ab | |||
| 788cb7c4c3 | |||
| ebfbdb4519 | |||
| 3818cfe15f | |||
| f1ed14b8f8 | |||
| d988065148 | |||
| 2ae3ef12af | |||
| dce48a1d6a | |||
| 33ac3e6e21 | |||
| 234bc56240 | |||
| 9289efa277 | |||
| 1f5d165cf9 | |||
| cde41d4ed0 | |||
| 657742976e | |||
| fd086330e8 | |||
| c8004d0778 | |||
| 09126c2c8e | |||
| 5ccfc98b47 | |||
| 4f96305db7 | |||
| 984a0d13f9 | |||
| a7bf62c70d | |||
| 0d0baf467c | |||
| 99f61b6807 | |||
| c711cae494 | |||
| 49b812961a | |||
| b06f669759 | |||
| 483bcba973 | |||
| aa1374cf9d | |||
| f104f7f870 | |||
| a14efd975d | |||
| 2f8e10da9c | |||
| 29984497f1 | |||
| 05b1f56c56 | |||
| 1efe54859f | |||
| ff8f4079ea | |||
| 28fe2d3c08 | |||
| 1844752125 | |||
| fd409f402c | |||
| d4a331af4a | |||
| e90a7c20e2 | |||
| e778aeacf7 | |||
| 1044c2ec38 | |||
| 3ddf8be1b8 | |||
| 711f8928a7 | |||
| 20183a47a0 | |||
| 965d9f28cf | |||
| 27929bc99b | |||
| 2fba8815f4 | |||
| acb849e1a4 | |||
| d28ffbd2d4 | |||
| 89e2ad80d7 | |||
| dcddd4bdae | |||
| 7e6d0d61db | |||
| 82fc828442 | |||
| 0396e15098 | |||
| 9f6414785c | |||
| 5077c46e4e | |||
| d86f296870 | |||
| a885f5043a | |||
| 33b1c252a7 | |||
| aaa03cc395 | |||
| bb12538fab | |||
| 88fd7afeb5 | |||
| baebc3cdbb | |||
| 590d4a1ede | |||
| a5d883a55d | |||
| 96a83ecb02 | |||
| d52f00132a | |||
| dfb43c21fd | |||
| 9f3b1b3b2c | |||
| 0ee895da84 | |||
| e3a5d66afc | |||
| 69f1e6ecca | |||
| 8446cda519 | |||
| 5a14755be9 | |||
| 88113289d7 | |||
| cdbdf7de1f | |||
| c6ebd9cd25 | |||
| 82b79e6ebc | |||
| c341cffe0c | |||
| 934f63efba | |||
| b57815a089 | |||
| d8d5f180b1 | |||
| 54c2440edc | |||
| cc49b0516a | |||
| b5555514bd | |||
| 9e73a166a7 | |||
| a07c4e2506 | |||
| fc581b0320 | |||
| baf470ea3f | |||
| aa88671211 | |||
| a6b428c207 | |||
| 23f12f853d | |||
| 0ac8089eee | |||
| 17f87affdb | |||
| 31337b0a0a | |||
| d0cfc547ba | |||
| c946372180 | |||
| 3ea74bd4b2 | |||
| f51008aef0 | |||
| 71ffcdc710 | |||
| 52752cd0d9 | |||
| 8a92a7a569 | |||
| 56a5625ce7 | |||
| 2b736cb32b | |||
| f8c5817251 | |||
| 4ff43814bc | |||
| fea2b46496 | |||
| 287eba084a | |||
| d50288a951 | |||
| e096d66667 | |||
| 971b690d75 | |||
| 2a70090a11 | |||
| 527719f8a8 | |||
| 77bdaf3e17 | |||
| ba6eb8e424 | |||
| 61ee19a7a1 | |||
| a21bdfc2e5 | |||
| b075eb4c38 | |||
| 6fa74891c8 | |||
| 073e413e1f | |||
| 78ad422486 | |||
| 59502d281a | |||
| 2f0cc2ef84 | |||
| 7a85206aba | |||
| bef57e4fb8 | |||
| 974062f749 | |||
| 8f2fefe233 | |||
| b7ed531c31 | |||
| 1608bf5a4e | |||
| 0049ef390b | |||
| 1b9e1d4886 | |||
| 20b450916e | |||
| 879dd60b9a | |||
| 6ab4088582 | |||
| 6bd4f98b78 | |||
| 2c870423c4 | |||
| 5e377b8925 | |||
| 3a918cf30e | |||
| 194c87e363 | |||
| edc9e8410d | |||
| 746e6c06b9 | |||
| 2b371a7d33 | |||
| 4b32192178 | |||
| d0cfdaf10e | |||
| eb99cacf43 | |||
| 33a7b1e105 | |||
| 02a88d01a6 | |||
| 3036579ac5 | |||
| 29df8ed590 | |||
| 201a9930f9 | |||
| 016ceb6829 | |||
| e700cadae3 | |||
| 85e91f9e67 | |||
| f6bc76a8ce | |||
| 34a8f36a42 | |||
| 4f3da43416 | |||
| 3382e15ee2 | |||
| be36db24ea | |||
| 49d5f27cd0 | |||
| b2226686ff | |||
| 2a0e5b4d31 | |||
| f24ab9e5b5 | |||
| 68208e899a | |||
| 7b22893806 | |||
| 3ec38b515e | |||
| 8f46e12579 | |||
| 6bd257a711 | |||
| 9a9d8840bb | |||
| 7fbbbb40f8 | |||
| 48222ed5af | |||
| d1e7666d27 | |||
| 5713402ffb | |||
| db2ff7c856 | |||
| d1cb8f4e8a | |||
| 9093b884c7 | |||
| 73f4b9b54d | |||
| 67ea13f0fa | |||
| 14092b8fb3 | |||
| f2f62eb35c | |||
| b422209634 | |||
| 7def677ba1 | |||
| 7ec0c9f844 | |||
| 9160c4e713 | |||
| 0feee8ba9a | |||
| 9992017fb7 | |||
| cd975c5f13 | |||
| 6dfc031839 | |||
| 0aeaf0e8c2 | |||
| dce50ddb79 | |||
| 9a6146d2ef | |||
| 10d071a4f2 | |||
| 5c4993832e | |||
| 32aa8e8fd6 | |||
| 35774dbac8 | |||
| ef970311b0 | |||
| 5286b97b10 | |||
| 60218ad175 | |||
| 75ba895d72 | |||
| be4e74558f | |||
| 55eeae3fef | |||
| daa0ff2fb0 | |||
| 9d54674c4f | |||
| 62b085c16d | |||
| 798fae040f | |||
| 48a70c8071 | |||
| 3a8e2d18b7 | |||
| 9f59b176b5 | |||
| d738cae6b8 | |||
| e13f321686 | |||
| e84e685199 | |||
| 5a76d86dea | |||
| d55ba3f1bd | |||
| 601572e7b6 | |||
| a894fa5f4f | |||
| fcd8f63c92 | |||
| 89e94c551b | |||
| 5d4ca12155 | |||
| 3920ece418 | |||
| 17ed80d044 | |||
| 52cd346617 | |||
| 38902a2f04 | |||
| a962a3ab13 | |||
| dd9d6a4c64 | |||
| 890c7d0bfa |
12
.github/CONTRIBUTING.md
vendored
12
.github/CONTRIBUTING.md
vendored
@ -6,11 +6,15 @@
|
||||
|
||||
- Clone the repository
|
||||
- Ensure your Docker daemon is running
|
||||
- Launch `docker-compose up`
|
||||
- Copy `docker/php/env.example` to `docker/php/env` and customize
|
||||
- Launch `docker-compose run --rm php composer install` to bootstrap php dependencies
|
||||
- Launch `docker-compose run --rm php bin/console wallabag:install` to bootstrap your installation
|
||||
- Launch `docker-compose run --rm php yarn install` to bootstrap dependencies for the frontend
|
||||
- Launch `docker-compose run --rm php yarn build:dev` to build assets for the frontend
|
||||
- Launch `docker-compose up -d` to start the stack
|
||||
|
||||
You'll then have:
|
||||
- a web server (nginx)
|
||||
- a PHP daemon (using FPM)
|
||||
- a PHP daemon with standalone web server
|
||||
- a Redis database (to handle imports)
|
||||
- a SQLite database to store articles
|
||||
|
||||
@ -20,7 +24,7 @@ If you want to test using an other database than SQLite, uncomment the `postgres
|
||||
|
||||
### Using your own PHP server
|
||||
|
||||
- Ensure you are running PHP > 7.1.
|
||||
- Ensure you are running PHP >= 7.4.
|
||||
- Clone the repository
|
||||
- Launch `composer install`
|
||||
- If you got some errors, fix them (they might be related to some missing PHP extension from your machine)
|
||||
|
||||
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@ -34,3 +34,10 @@ updates:
|
||||
- dependency-name: nelmio/api-doc-bundle
|
||||
versions:
|
||||
- "> 2.13.4"
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
time: "04:00"
|
||||
timezone: Europe/Paris
|
||||
open-pull-requests-limit: 10
|
||||
|
||||
BIN
.github/images/screenshot.png
vendored
Normal file
BIN
.github/images/screenshot.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 837 KiB |
7
.github/workflows/assets.yml
vendored
7
.github/workflows/assets.yml
vendored
@ -7,6 +7,9 @@ on:
|
||||
- master
|
||||
- 2.*
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
js:
|
||||
name: "Building assets"
|
||||
@ -14,10 +17,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v2"
|
||||
uses: "actions/checkout@v3"
|
||||
|
||||
- name: "Install Node"
|
||||
uses: actions/setup-node@v2
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "12"
|
||||
|
||||
|
||||
7
.github/workflows/coding-standards.yml
vendored
7
.github/workflows/coding-standards.yml
vendored
@ -7,6 +7,9 @@ on:
|
||||
- master
|
||||
- 2.*
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
coding-standards:
|
||||
name: "CS Fixer & PHPStan"
|
||||
@ -14,14 +17,14 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v2"
|
||||
uses: "actions/checkout@v3"
|
||||
|
||||
- name: "Install PHP"
|
||||
uses: "shivammathur/setup-php@v2"
|
||||
with:
|
||||
coverage: "none"
|
||||
php-version: "7.4"
|
||||
tools: cs2pr, pecl, composer:v2
|
||||
tools: cs2pr, pecl, composer:2.2
|
||||
extensions: pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
|
||||
ini-values: "date.timezone=Europe/Paris"
|
||||
env:
|
||||
|
||||
8
.github/workflows/continuous-integration.yml
vendored
8
.github/workflows/continuous-integration.yml
vendored
@ -29,8 +29,6 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php:
|
||||
- "7.2"
|
||||
- "7.3"
|
||||
- "7.4"
|
||||
- "8.0"
|
||||
- "8.1"
|
||||
@ -41,7 +39,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v2"
|
||||
uses: "actions/checkout@v3"
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
@ -50,7 +48,7 @@ jobs:
|
||||
with:
|
||||
php-version: "${{ matrix.php }}"
|
||||
coverage: none
|
||||
tools: pecl, composer:v2
|
||||
tools: pecl, composer:2.2
|
||||
extensions: json, pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
|
||||
ini-values: "date.timezone=Europe/Paris"
|
||||
|
||||
@ -58,7 +56,7 @@ jobs:
|
||||
if: "${{ matrix.database == 'mysql' }}"
|
||||
run: |
|
||||
sudo systemctl start mysql.service
|
||||
sudo mysql -u root -proot -e "CREATE DATABASE wallabag_test"
|
||||
sudo mysql -u root -proot -h 127.0.0.1 -e "CREATE DATABASE wallabag_test"
|
||||
|
||||
- name: "Setup PostgreSQL"
|
||||
if: "${{ matrix.database == 'pgsql' }}"
|
||||
|
||||
7
.github/workflows/translations.yml
vendored
7
.github/workflows/translations.yml
vendored
@ -7,6 +7,9 @@ on:
|
||||
- master
|
||||
- 2.*
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
translations:
|
||||
name: "Translations"
|
||||
@ -19,14 +22,14 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v2"
|
||||
uses: "actions/checkout@v3"
|
||||
|
||||
- name: "Install PHP"
|
||||
uses: "shivammathur/setup-php@v2"
|
||||
with:
|
||||
coverage: "none"
|
||||
php-version: "${{ matrix.php }}"
|
||||
tools: pecl, composer:v2
|
||||
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:
|
||||
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@ -15,6 +15,7 @@
|
||||
!/bin/symfony_requirements
|
||||
.php_cs.cache
|
||||
.phpunit.result.cache
|
||||
phpunit.xml
|
||||
|
||||
# Parameters
|
||||
/app/config/parameters.yml
|
||||
@ -35,16 +36,15 @@ web/uploads/
|
||||
/build
|
||||
/coverage
|
||||
|
||||
# Development
|
||||
docker/php/env
|
||||
|
||||
# Composer PHAR
|
||||
/composer.phar
|
||||
|
||||
# Data for wallabag
|
||||
data/db/wallabag*.sqlite
|
||||
|
||||
# Docker container logs and data
|
||||
docker/logs/
|
||||
docker/data/
|
||||
|
||||
# assets stuff
|
||||
node_modules/
|
||||
bin
|
||||
|
||||
51
CHANGELOG.md
51
CHANGELOG.md
@ -1,5 +1,56 @@
|
||||
# Changelog
|
||||
|
||||
## [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)
|
||||
|
||||
### Features
|
||||
|
||||
- Add Delicious import by @j0k3r in https://github.com/wallabag/wallabag/pull/5022
|
||||
- Add route to list entries with annotations by @nicosomb in https://github.com/wallabag/wallabag/pull/4341
|
||||
- Add an option to sort the feed entries by `updated_at` by @agallou in https://github.com/wallabag/wallabag/pull/5659
|
||||
- Add support to download webp image locally by @j0k3r in https://github.com/wallabag/wallabag/pull/5687
|
||||
- Update readme and docker development env by @Kdecherf in https://github.com/wallabag/wallabag/pull/5662
|
||||
- Add action to assign a search as a tag to each result by @nicosomb in https://github.com/wallabag/wallabag/pull/5381
|
||||
- Drop PHP prior to 7.4 by @yguedidi in https://github.com/wallabag/wallabag/pull/5791
|
||||
|
||||
### Deprecated features
|
||||
- Deprecate Baggy theme by @j0k3r in https://github.com/wallabag/wallabag/pull/5742
|
||||
- Deprecate mobi export by @Kdecherf in https://github.com/wallabag/wallabag/pull/5775
|
||||
|
||||
### API
|
||||
|
||||
- Add new endpoint for API: config by @nicosomb in https://github.com/wallabag/wallabag/pull/5673
|
||||
|
||||
### Technical stuff
|
||||
|
||||
- Fix test with `usinenouvelle.com` being flaky these times by @j0k3r in https://github.com/wallabag/wallabag/pull/5686
|
||||
- Replace `iconv()` calls with Transliterator by @Kdecherf in https://github.com/wallabag/wallabag/pull/5680
|
||||
- Composer 2.3 isn't compatible with wallabag by @j0k3r in https://github.com/wallabag/wallabag/pull/5708
|
||||
- CI workaround for PHP < 7.4 & MySQL 8 by @j0k3r in https://github.com/wallabag/wallabag/pull/5729
|
||||
- Set permissions for GitHub actions by @naveensrinivasan in https://github.com/wallabag/wallabag/pull/5732
|
||||
- Included githubactions in the dependabot config by @naveensrinivasan in https://github.com/wallabag/wallabag/pull/5737
|
||||
- Remove bundle inheritance by @yguedidi in https://github.com/wallabag/wallabag/pull/5746
|
||||
- Fix SQLite database location by @yguedidi in https://github.com/wallabag/wallabag/pull/5771
|
||||
- Disable XDebug in test make recipe by @yguedidi in https://github.com/wallabag/wallabag/pull/5770
|
||||
- Exclude local phpunit.xml by @yguedidi in https://github.com/wallabag/wallabag/pull/5757
|
||||
- Upgrade PHP dependencies by @yguedidi in https://github.com/wallabag/wallabag/pull/5778
|
||||
|
||||
### Translations
|
||||
|
||||
- Enabled greek translation by @nicosomb in https://github.com/wallabag/wallabag/pull/5656
|
||||
- Translations update from Hosted Weblate by @weblate see https://github.com/wallabag/wallabag/pulls?q=is%3Apr+author%3Aweblate+milestone%3A2.5.0+is%3Amerged
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix tagging rule match when user has a custom reading speed by @j0k3r in https://github.com/wallabag/wallabag/pull/5646
|
||||
- Feat/home entries updated by @Simounet in https://github.com/wallabag/wallabag/pull/5664
|
||||
- Fix row and card style regressions by @Simounet in https://github.com/wallabag/wallabag/pull/5676
|
||||
- Fix epub language by @j0k3r in https://github.com/wallabag/wallabag/pull/5647
|
||||
- material: improve mass buttons style, mostly for smartphone screens by @Kdecherf in https://github.com/wallabag/wallabag/pull/5695
|
||||
- Fix composer version in docker dev configuration by @nicosomb in https://github.com/wallabag/wallabag/pull/5715
|
||||
- Use site with subdomain as tagging rule example by @jonas-hagen in https://github.com/wallabag/wallabag/pull/5744
|
||||
- Fix PHP Docker image by @yguedidi in https://github.com/wallabag/wallabag/pull/5772
|
||||
|
||||
## [2.4.3](https://github.com/wallabag/wallabag/tree/2.4.3)
|
||||
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.4.2...2.4.3)
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
wallabag is mainly developed by [Nicolas Lœuillet](https://github.com/nicosomb), [@j0k3r](https://github.com/j0k3r) and [@tcitworld](https://github.com/tcitworld) under the MIT License.
|
||||
wallabag is mainly developed by [Nicolas Lœuillet](https://github.com/nicosomb), [@j0k3r](https://github.com/j0k3r), [@tcitworld](https://github.com/tcitworld) and [@Kdecherf](https://github.com/Kdecherf) under the MIT License.
|
||||
|
||||
Thank you [to others contributors](https://github.com/wallabag/wallabag/graphs/contributors).
|
||||
|
||||
@ -46,7 +46,7 @@ fixtures: ## Load fixtures into database
|
||||
php bin/console doctrine:fixtures:load --no-interaction --env=test
|
||||
|
||||
test: prepare fixtures ## Launch wallabag testsuite
|
||||
bin/simple-phpunit -v
|
||||
XDEBUG_MODE=off bin/simple-phpunit -v
|
||||
|
||||
release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`).
|
||||
ifndef VERSION
|
||||
|
||||
48
README.md
48
README.md
@ -1,20 +1,32 @@
|
||||
<img src="https://raw.githubusercontent.com/wallabag/logo/master/_default/typo-horizontal/png/sm/logo-typo-horizontal-black-no-bg-no-border-sm.png" align="right" />
|
||||
# wallabag
|
||||
|
||||

|
||||
[](https://scrutinizer-ci.com/g/wallabag/wallabag/?branch=master)
|
||||
[](https://gitter.im/wallabag/wallabag)
|
||||
[](https://liberapay.com/wallabag/donate)
|
||||
[](https://hosted.weblate.org/engage/wallabag/?utm_source=widget)
|
||||

|
||||
|
||||
# What is wallabag?
|
||||
wallabag is a self-hostable PHP application allowing you to not miss any content anymore.
|
||||
Click, save and read it when you can. It extracts content so that you can read it when you have time.
|
||||
wallabag is a web application allowing you to save web pages for later reading.
|
||||
Click, save and read it when you want. It extracts content so that you won't be distracted by pop-ups and cie.
|
||||
|
||||
More information on our website: [wallabag.org](https://wallabag.org).
|
||||
You can install it on your own server, or you can create an account on [wallabag.it](https://wallabag.it).
|
||||
|
||||
If you do not have your own server, consider [the wallabag.it hosting solution](https://wallabag.it).
|
||||

|
||||
|
||||
* Website: [wallabag.org](https://wallabag.org)
|
||||
* Android app: [wallabag/android-app](https://github.com/wallabag/android-app)
|
||||
* iOS app: [wallabag/ios-app](https://github.com/wallabag/ios-app)
|
||||
* Browser extension: [wallabag/wallabagger](https://github.com/wallabag/wallabagger)
|
||||
|
||||
## Documentation
|
||||
|
||||
The documentation is available at https://doc.wallabag.org.
|
||||
|
||||
You can contribute to it through its dedicated repository, available here: https://github.com/wallabag/doc.
|
||||
|
||||
## Installation
|
||||
|
||||
# Install wallabag
|
||||
Please read [the documentation to see the wallabag requirements](https://doc.wallabag.org/en/admin/installation/requirements.html).
|
||||
|
||||
Then you can install wallabag by executing the following commands:
|
||||
@ -26,16 +38,24 @@ cd wallabag && make install
|
||||
|
||||
Now, [configure a virtual host](https://doc.wallabag.org/en/admin/installation/virtualhosts.html) to use your wallabag.
|
||||
|
||||
# Run on YunoHost
|
||||
[](https://install-app.yunohost.org/?app=wallabag2)
|
||||
### Other methods
|
||||
|
||||
Wallabag app for [YunoHost](https://yunohost.org). See [here](https://github.com/YunoHost-Apps/wallabag2_ynh)
|
||||
Refer to the [installation documentation](https://doc.wallabag.org/en/admin/installation/installation.html) for other installation methods.
|
||||
|
||||
# Translate wallabag
|
||||
## Translation
|
||||
|
||||
[wallabag](https://hosted.weblate.org/projects/wallabag/) is being translated using [Weblate](https://weblate.org/), a web tool designed to ease translating for both developers and translators. Feel free to help us [translate wallabag](https://hosted.weblate.org/projects/wallabag/)!
|
||||
This project uses [Weblate](https://weblate.org/) for translation.
|
||||
|
||||
# License
|
||||
Feel free to help us [translating wallabag](https://hosted.weblate.org/projects/wallabag/).
|
||||
|
||||
## Contributing
|
||||
|
||||
To learn more about developing wallabag, please refer to the [contribution guide](./.github/CONTRIBUTING.md).
|
||||
|
||||
Content extraction relies on [Graby](https://github.com/j0k3r/graby), [php-readability](https://github.com/j0k3r/php-readability) and [ftr-site-config](https://github.com/fivefilters/ftr-site-config).
|
||||
|
||||
## License
|
||||
Copyright © 2013-current Nicolas Lœuillet <nicolas@loeuillet.org>
|
||||
|
||||
This work is free. You can redistribute it and/or modify it under the
|
||||
terms of the MIT License. See the COPYING file for more details.
|
||||
terms of the MIT License. See the [COPYING.md](./COPYING.md) file for more details.
|
||||
|
||||
@ -38,7 +38,7 @@ be locally specified in `composer.lock`:
|
||||
```json
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "7.1.3",
|
||||
"php": "7.4.29",
|
||||
"ext-something": "4.0"
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: Download pictures onto your server
|
||||
carrot: Enable share to Carrot
|
||||
diaspora_url: diaspora* URL, if the service is enabled
|
||||
export_epub: Enable ePub export
|
||||
export_mobi: Enable .mobi export
|
||||
export_mobi: Enable .mobi export (deprecated, will be removed soon)
|
||||
export_pdf: Enable PDF export
|
||||
export_csv: Enable CSV export
|
||||
export_json: Enable JSON export
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: Télécharger les images sur le serveur
|
||||
carrot: Activer le partage vers Carrot
|
||||
diaspora_url: URL de diaspora*, si le service est activé
|
||||
export_epub: Activer l'export ePub
|
||||
export_mobi: Activer l'export .mobi
|
||||
export_mobi: Activer l'export .mobi (déprécié, sera supprimé prochainement)
|
||||
export_pdf: Activer l'export PDF
|
||||
export_csv: Activer l'export CSV
|
||||
export_json: Activer l'export JSON
|
||||
|
||||
@ -32,7 +32,7 @@ export_txt: Activar exportación TXT
|
||||
export_json: Activar exportación JSON
|
||||
export_csv: Activar exportación CSV
|
||||
export_pdf: Activar exportación PDF
|
||||
export_mobi: Activar exportación .mobi
|
||||
export_mobi: Activar exportación .mobi (xa non se usa, vai ser eliminada)
|
||||
export_epub: Activar exportación ePub
|
||||
diaspora_url: URL de diaspora*, se o servizo está activo
|
||||
carrot: Activar compartir en Carrot
|
||||
|
||||
@ -3,7 +3,7 @@ download_pictures: 在你的服务器上缓存图片
|
||||
carrot: 启用分享到 Carrot
|
||||
diaspora_url: diaspora* 链接,如果该服务已被启用
|
||||
export_epub: 启用 ePub 导出
|
||||
export_mobi: 启用 .mobi 导出
|
||||
export_mobi: 启用 .mobi 导出(已废弃,不久后将移除)
|
||||
export_pdf: 启用 PDF 导出
|
||||
export_csv: 启用 CSV 导出
|
||||
export_json: 启用 JSON 导出
|
||||
|
||||
@ -6,16 +6,6 @@ main {
|
||||
#content {
|
||||
padding: 0 0.5rem;
|
||||
}
|
||||
|
||||
ul.row {
|
||||
margin: 0.4rem 0 0;
|
||||
padding: 0 0.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
.data .card .card-body {
|
||||
height: 19em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@mixin mixin-reading-time {
|
||||
@ -37,6 +27,11 @@ main {
|
||||
}
|
||||
|
||||
.card {
|
||||
.card-content {
|
||||
padding-bottom: 12px;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.card-content .card-title,
|
||||
.card-reveal .card-title {
|
||||
line-height: 22.8px;
|
||||
@ -95,7 +90,7 @@ main {
|
||||
}
|
||||
|
||||
.card-action {
|
||||
padding: 10px 5px 10px 15px;
|
||||
padding: 10px 10px 10px 15px;
|
||||
|
||||
ul.links {
|
||||
margin: 0;
|
||||
@ -112,8 +107,9 @@ main {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
ul.tools li a.tool {
|
||||
margin-right: 5px !important;
|
||||
.tool {
|
||||
display: flex;
|
||||
margin-right: 0 !important;
|
||||
}
|
||||
|
||||
@include mixin-reading-time;
|
||||
@ -134,6 +130,12 @@ main {
|
||||
}
|
||||
}
|
||||
|
||||
.card-body {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
a.original:not(.waves-effect) {
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
@ -285,7 +287,7 @@ a.original:not(.waves-effect) {
|
||||
flex-basis: 5em;
|
||||
align-self: flex-end;
|
||||
float: right;
|
||||
max-width: 6em;
|
||||
max-width: 8em;
|
||||
}
|
||||
|
||||
.tags {
|
||||
@ -311,3 +313,23 @@ a.original:not(.waves-effect) {
|
||||
.settings .div_tabs {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.entries-row {
|
||||
display: grid;
|
||||
margin: 0.4rem 0 0;
|
||||
padding: 0 0.75rem;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.entry-card {
|
||||
display: flex;
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
|
||||
.tools {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* ========================================================================== */
|
||||
|
||||
.mass-buttons {
|
||||
margin: 5px;
|
||||
margin: 10px 5px 10px 20px;
|
||||
|
||||
#selectAll {
|
||||
position: relative;
|
||||
@ -17,12 +17,13 @@
|
||||
|
||||
button {
|
||||
i {
|
||||
font-size: 12px;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
padding: 0 0.5rem;
|
||||
margin-right: 0.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,8 +39,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
.entries {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.collection {
|
||||
margin: 15px 15px 0;
|
||||
margin: 5px 15px 0;
|
||||
padding: 0;
|
||||
|
||||
.collection-item {
|
||||
padding: 7px;
|
||||
|
||||
@ -2,6 +2,12 @@
|
||||
Media queries
|
||||
========================================================================== */
|
||||
|
||||
@media only screen and (min-width: 450px) {
|
||||
.entries-row {
|
||||
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 992px) {
|
||||
nav,
|
||||
body:not(.entry):not(.login) main,
|
||||
@ -180,15 +186,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 310px),
|
||||
screen and (min-width: 601px) and (max-width: 660px),
|
||||
screen and (min-width: 993px) and (max-width: 1050px),
|
||||
screen and (min-width: 1201px) and (max-width: 1250px) {
|
||||
.card .card-action .reading-time .card-created-at {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media only print {
|
||||
body {
|
||||
display: block;
|
||||
|
||||
@ -248,6 +248,11 @@ old_sound_rabbit_mq:
|
||||
exchange_options:
|
||||
name: 'wallabag.import.pinboard'
|
||||
type: topic
|
||||
import_delicious:
|
||||
connection: default
|
||||
exchange_options:
|
||||
name: 'wallabag.import.delicious'
|
||||
type: topic
|
||||
import_instapaper:
|
||||
connection: default
|
||||
exchange_options:
|
||||
@ -315,6 +320,15 @@ old_sound_rabbit_mq:
|
||||
name: 'wallabag.import.pinboard'
|
||||
callback: wallabag_import.consumer.amqp.pinboard
|
||||
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
|
||||
import_delicious:
|
||||
connection: default
|
||||
exchange_options:
|
||||
name: 'wallabag.import.delicious'
|
||||
type: topic
|
||||
queue_options:
|
||||
name: 'wallabag.import.delicious'
|
||||
callback: wallabag_import.consumer.amqp.delicious
|
||||
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
|
||||
import_wallabag_v1:
|
||||
connection: default
|
||||
exchange_options:
|
||||
|
||||
@ -41,6 +41,18 @@ homepage:
|
||||
fos_user:
|
||||
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
|
||||
|
||||
fos_user_security_login:
|
||||
path: /login
|
||||
defaults:
|
||||
_controller: Wallabag\UserBundle\Controller\SecurityController::loginAction
|
||||
methods: [GET, POST]
|
||||
|
||||
fos_user_registration_register:
|
||||
path: /register
|
||||
defaults:
|
||||
_controller: Wallabag\UserBundle\Controller\RegistrationController::registerAction
|
||||
methods: [GET, POST]
|
||||
|
||||
fos_oauth_server_token:
|
||||
resource: "@FOSOAuthServerBundle/Resources/config/routing/token.xml"
|
||||
|
||||
|
||||
@ -69,11 +69,11 @@ security:
|
||||
- { path: ^/logout, roles: [IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_2FA_IN_PROGRESS] }
|
||||
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: /(unread|starred|archive|all).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: /(unread|starred|archive|annotated|all).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/locale, role: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: /tags/(.*).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/feed, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: /(unread|starred|archive).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY } # For backwards compatibility
|
||||
- { path: /(unread|starred|archive|annotated).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY } # For backwards compatibility
|
||||
- { path: ^/share, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/settings, roles: ROLE_SUPER_ADMIN }
|
||||
- { path: ^/annotations, roles: ROLE_USER }
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
parameters:
|
||||
test_database_driver: pdo_mysql
|
||||
test_database_host: localhost
|
||||
test_database_host: 127.0.0.1
|
||||
test_database_port: 3306
|
||||
test_database_name: wallabag_test
|
||||
test_database_user: root
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
wallabag_core:
|
||||
version: 2.4.3
|
||||
version: 2.5.0
|
||||
paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
|
||||
languages:
|
||||
en: 'English'
|
||||
@ -22,6 +22,7 @@ wallabag_core:
|
||||
uk: 'Українська'
|
||||
hr: 'Hrvatski'
|
||||
cs: 'Čeština'
|
||||
el: 'Ελληνικά'
|
||||
items_on_page: 12
|
||||
theme: material
|
||||
language: '%locale%'
|
||||
@ -98,7 +99,7 @@ wallabag_core:
|
||||
section: export
|
||||
-
|
||||
name: export_mobi
|
||||
value: 1
|
||||
value: 0
|
||||
section: export
|
||||
-
|
||||
name: export_pdf
|
||||
|
||||
@ -33,13 +33,15 @@
|
||||
"issues": "https://github.com/wallabag/wallabag/issues"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2.5",
|
||||
"php": ">=7.4",
|
||||
"composer": "< 2.3",
|
||||
"ext-ctype": "*",
|
||||
"ext-curl": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-gd": "*",
|
||||
"ext-hash": "*",
|
||||
"ext-iconv": "*",
|
||||
"ext-intl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-pcre": "*",
|
||||
@ -95,7 +97,7 @@
|
||||
"tecnickcom/tcpdf": "^6.3.0",
|
||||
"twig/extensions": "^1.5",
|
||||
"wallabag/php-mobi": "~1.0",
|
||||
"wallabag/phpepub": "^4.0.7.2",
|
||||
"wallabag/phpepub": "^4.0.10",
|
||||
"willdurand/hateoas-bundle": "~2.1"
|
||||
},
|
||||
"require-dev": {
|
||||
@ -162,7 +164,7 @@
|
||||
"config": {
|
||||
"bin-dir": "bin",
|
||||
"platform": {
|
||||
"php": "7.2.5"
|
||||
"php": "7.4.29"
|
||||
},
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
|
||||
1188
composer.lock
generated
1188
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,52 +1,64 @@
|
||||
version: '2'
|
||||
version: '3.8'
|
||||
services:
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "8000:80"
|
||||
volumes:
|
||||
- ./docker/nginx/nginx.conf:/nginx.conf
|
||||
- ./docker/logs/nginx:/var/log/nginx
|
||||
- .:/var/www/html
|
||||
links:
|
||||
- php:php
|
||||
command: nginx -c /nginx.conf
|
||||
|
||||
php:
|
||||
build:
|
||||
context: docker/php
|
||||
args:
|
||||
# Set here your timezone using one of this: https://php.net/manual/en/timezones.php
|
||||
timezone: 'Europe/Monaco'
|
||||
ports:
|
||||
- "9000:9000"
|
||||
# Use target 'rootless' if you run rootless Docker
|
||||
target: default
|
||||
volumes:
|
||||
- .:/var/www/html
|
||||
#links:
|
||||
# - "postgres:rdbms"
|
||||
# - "mariadb:rdbms"
|
||||
# Volumes for data-related folders
|
||||
- assets:/var/www/html/web/assets
|
||||
- data:/var/www/html/data
|
||||
- cache:/var/www/.cache
|
||||
# Uncomment the following volume if you run rootless Docker
|
||||
# A limitation blocks permissions on root docker, see
|
||||
# https://github.com/moby/moby/issues/40881
|
||||
# - type: tmpfs
|
||||
# target: /var/www/html/var/cache
|
||||
# Override third-party libraries for dev
|
||||
# - ../graby-site-config:/var/www/html/vendor/j0k3r/graby-site-config
|
||||
# - ../php-readability:/var/www/html/vendor/j0k3r/php-readability
|
||||
# - ../graby:/var/www/html/vendor/j0k3r/graby
|
||||
# - ../HTMLawed:/var/www/html/vendor/fossar/htmlawed
|
||||
# - ../PHPePub:/var/www/html/vendor/wallabag/phpepub
|
||||
# - ../guzzle-site-authenticator:/var/www/html/vendor/bdunogier/guzzle-site-authenticator
|
||||
env_file:
|
||||
# Copy docker/php/env.example to docker/php/env and customize
|
||||
- ./docker/php/env
|
||||
# Comment non-used DBMS lines
|
||||
# If all DBMS are commented out, sqlite will be used as default
|
||||
# - ./docker/postgres/env
|
||||
# Uncomment the database engine you want, it will use sqlite if both are commented
|
||||
# - ./docker/mariadb/env
|
||||
# - ./docker/postgres/env
|
||||
# Uncomment to enable Xdebug
|
||||
# - ./docker/php/xdebug
|
||||
ports:
|
||||
- 8000:8000
|
||||
# Uncomment to permit Xdebug remote session
|
||||
# - 9000:9000
|
||||
depends_on:
|
||||
# - mariadb
|
||||
# - postgres
|
||||
- redis
|
||||
|
||||
# postgres:
|
||||
# image: postgres:11-alpine
|
||||
# ports:
|
||||
# - "5432:5432"
|
||||
# volumes:
|
||||
# - ./docker/data/pgsql:/var/lib/postgresql/data
|
||||
# env_file:
|
||||
# - ./docker/postgres/env
|
||||
# image: postgres:11-alpine
|
||||
# volumes:
|
||||
# - db-data:/var/lib/postgresql/data
|
||||
# env_file:
|
||||
# - ./docker/postgres/env
|
||||
# healthcheck:
|
||||
# test: ["CMD-SHELL", "pg_isready -q || exit 1"]
|
||||
# interval: 10s
|
||||
# timeout: 3s
|
||||
# retries: 3
|
||||
|
||||
# mariadb:
|
||||
# image: mariadb:10
|
||||
# ports:
|
||||
# - "3306:3306"
|
||||
# volumes:
|
||||
# - ./docker/data/mariadb:/var/lib/mysql
|
||||
# - db-data:/var/lib/mysql
|
||||
# env_file:
|
||||
# - ./docker/mariadb/env
|
||||
|
||||
@ -56,6 +68,19 @@ services:
|
||||
# - "15672:15672"
|
||||
|
||||
redis:
|
||||
image: redis:4-alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
image: redis:6-alpine
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
db-data:
|
||||
driver: local
|
||||
assets:
|
||||
driver: local
|
||||
data:
|
||||
driver: local
|
||||
cache:
|
||||
driver: local
|
||||
|
||||
@ -2,9 +2,9 @@ MYSQL_ROOT_PASSWORD=wallaroot
|
||||
MYSQL_USER=wallabag
|
||||
MYSQL_PASSWORD=wallapass
|
||||
MYSQL_DATABASE=wallabag
|
||||
SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
|
||||
SYMFONY__ENV__DATABASE_HOST=rdbms
|
||||
SYMFONY__ENV__DATABASE_PORT=3306
|
||||
SYMFONY__ENV__DATABASE_NAME=wallabag
|
||||
SYMFONY__ENV__DATABASE_USER=wallabag
|
||||
SYMFONY__ENV__DATABASE_PASSWORD=wallapass
|
||||
DATABASE_DRIVER=pdo_mysql
|
||||
DATABASE_HOST=mysql
|
||||
DATABASE_PORT=3306
|
||||
DATABASE_NAME=wallabag
|
||||
DATABASE_USER=wallabag
|
||||
DATABASE_PASSWORD=wallapass
|
||||
|
||||
@ -1,89 +0,0 @@
|
||||
user nginx;
|
||||
worker_processes 1;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 2048;
|
||||
multi_accept on;
|
||||
use epoll;
|
||||
}
|
||||
|
||||
http {
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
server_tokens off;
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 15;
|
||||
types_hash_max_size 2048;
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
access_log off;
|
||||
error_log off;
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
open_file_cache max=100;
|
||||
|
||||
|
||||
upstream php-upstream {
|
||||
server php:9000;
|
||||
}
|
||||
|
||||
server {
|
||||
#server_name domain.tld www.domain.tld;
|
||||
root /var/www/html/web;
|
||||
|
||||
location / {
|
||||
# try to serve file directly, fallback to app.php
|
||||
try_files $uri /app.php$is_args$args;
|
||||
}
|
||||
# DEV
|
||||
# This rule should only be placed on your development environment
|
||||
# In production, don't include this and don't deploy app_dev.php or config.php
|
||||
location ~ ^/(app_dev|config)\.php(/|$) {
|
||||
fastcgi_pass php-upstream;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
include fastcgi_params;
|
||||
# When you are using symlinks to link the document root to the
|
||||
# current version of your application, you should pass the real
|
||||
# application path instead of the path to the symlink to PHP
|
||||
# FPM.
|
||||
# Otherwise, PHP's OPcache may not properly detect changes to
|
||||
# your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
|
||||
# for more information).
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
}
|
||||
# PROD
|
||||
location ~ ^/app\.php(/|$) {
|
||||
fastcgi_pass php-upstream;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
include fastcgi_params;
|
||||
# When you are using symlinks to link the document root to the
|
||||
# current version of your application, you should pass the real
|
||||
# application path instead of the path to the symlink to PHP
|
||||
# FPM.
|
||||
# Otherwise, PHP's OPcache may not properly detect changes to
|
||||
# your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
|
||||
# for more information).
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
# Prevents URIs that include the front controller. This will 404:
|
||||
# http://domain.tld/app.php/some-path
|
||||
# Remove the internal directive to allow URIs like this
|
||||
internal;
|
||||
}
|
||||
|
||||
error_log /var/log/nginx/project_error.log;
|
||||
access_log /var/log/nginx/project_access.log;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
daemon off;
|
||||
@ -1,8 +1,19 @@
|
||||
FROM php:7.2-fpm
|
||||
FROM php:7.4-fpm AS rootless
|
||||
|
||||
# Default timezone. To change it, use the argument in the docker-compose.yml file
|
||||
ARG timezone='Europe/Paris'
|
||||
ARG memorylimit='512M'
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG NODE_VERSION=14
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y \
|
||||
ca-certificates \
|
||||
curl \
|
||||
gnupg \
|
||||
lsb-release \
|
||||
openssl \
|
||||
software-properties-common
|
||||
|
||||
RUN curl 'https://deb.nodesource.com/gpgkey/nodesource.gpg.key' | apt-key add - \
|
||||
&& echo "deb https://deb.nodesource.com/node_${NODE_VERSION}.x $(lsb_release -cs) main" > /etc/apt/sources.list.d/nodesource.list
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
libmcrypt-dev \
|
||||
@ -11,30 +22,77 @@ RUN apt-get update && apt-get install -y \
|
||||
libxml2-dev \
|
||||
libpng-dev \
|
||||
libjpeg-dev \
|
||||
libwebp-dev \
|
||||
libsqlite3-dev \
|
||||
imagemagick \
|
||||
libmagickwand-dev \
|
||||
libtidy-dev \
|
||||
git
|
||||
RUN docker-php-ext-install \
|
||||
iconv \
|
||||
mbstring \
|
||||
libonig-dev \
|
||||
libzip-dev \
|
||||
libfreetype6-dev \
|
||||
zlib1g-dev \
|
||||
git \
|
||||
build-essential \
|
||||
nodejs
|
||||
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp
|
||||
RUN docker-php-ext-install -j "$(nproc)" \
|
||||
bcmath \
|
||||
gd \
|
||||
gettext \
|
||||
iconv \
|
||||
intl \
|
||||
mbstring \
|
||||
opcache \
|
||||
pdo \
|
||||
pdo_mysql \
|
||||
pdo_pgsql \
|
||||
pdo_sqlite \
|
||||
sockets \
|
||||
tidy \
|
||||
bcmath \
|
||||
zip
|
||||
|
||||
RUN printf "\n" | pecl install imagick && docker-php-ext-enable imagick
|
||||
RUN pecl install redis; \
|
||||
pecl install imagick; \
|
||||
pecl install xdebug; \
|
||||
docker-php-ext-enable \
|
||||
redis \
|
||||
imagick \
|
||||
xdebug \
|
||||
;
|
||||
|
||||
RUN echo "date.timezone="$timezone > /usr/local/etc/php/conf.d/date_timezone.ini
|
||||
RUN echo "memory_limit ="$memorylimit > /usr/local/etc/php/conf.d/memory_limit.ini
|
||||
RUN npm install -g yarn
|
||||
|
||||
RUN usermod -u 1000 www-data
|
||||
RUN curl -L -o /usr/local/bin/envsubst https://github.com/a8m/envsubst/releases/download/v1.1.0/envsubst-`uname -s`-`uname -m`; \
|
||||
chmod +x /usr/local/bin/envsubst
|
||||
|
||||
CMD ["php-fpm"]
|
||||
COPY --from=composer:2.2.12 /usr/bin/composer /usr/local/bin/composer
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
COPY config/ /opt/wallabag/config/
|
||||
|
||||
RUN mkdir -p \
|
||||
/var/www/html/app/config/ \
|
||||
/var/www/html/var/cache \
|
||||
/var/www/html/web/assets \
|
||||
/var/www/html/data \
|
||||
/var/www/html/data/db \
|
||||
/var/www/.cache
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["php", "bin/console", "--env=dev", "server:run", "0.0.0.0:8000"]
|
||||
|
||||
FROM rootless AS default
|
||||
|
||||
ARG USER_UID=1000
|
||||
ARG USER_GID=1000
|
||||
|
||||
RUN groupmod -g 1000 www-data ; \
|
||||
usermod -u ${USER_UID} -g www-data www-data ; \
|
||||
touch /usr/local/etc/php/conf.d/wallabag-php.ini \
|
||||
/var/www/.yarnrc ; \
|
||||
chown -R www-data: /var/www/html \
|
||||
/usr/local/etc/php/conf.d/wallabag-php.ini \
|
||||
/var/www/.cache \
|
||||
/var/www/.yarnrc
|
||||
|
||||
USER www-data
|
||||
|
||||
62
docker/php/config/parameters.yml
Normal file
62
docker/php/config/parameters.yml
Normal file
@ -0,0 +1,62 @@
|
||||
parameters:
|
||||
database_driver: ${DATABASE_DRIVER:-pdo_sqlite}
|
||||
database_driver_class: ${DATABASE_DRIVER_CLASS:-~}
|
||||
database_host: ${DATABASE_HOST:-127.0.0.1}
|
||||
database_port: ${DATABASE_PORT:-~}
|
||||
database_name: ${DATABASE_NAME:-symfony}
|
||||
database_user: ${DATABASE_USER:-root}
|
||||
database_password: ${DATABASE_PASSWORD:-~}
|
||||
database_path: ${DATABASE_PATH:-"%kernel.root_dir%/data/db/wallabag.sqlite"}
|
||||
database_table_prefix: wallabag_
|
||||
database_socket: null
|
||||
database_charset: ${DATABASE_CHARSET:-utf8}
|
||||
|
||||
domain_name: ${DOMAIN_NAME:-https://www.example.com}
|
||||
server_name: ${SERVER_NAME:-"Your wallabag instance"}
|
||||
|
||||
mailer_transport: ${MAILER_TRANSPORT:-smtp}
|
||||
mailer_user: ${MAILER_USER:-~}
|
||||
mailer_password: ${MAILER_PASSWORD:-~}
|
||||
mailer_host: ${MAILER_HOST:-127.0.0.1}
|
||||
mailer_port: ${MAILER_PORT:-25}
|
||||
mailer_encryption: ${MAILER_ENCRYPTION:-~}
|
||||
mailer_auth_mode: ${MAILER_AUTH_MODE:-~}
|
||||
|
||||
locale: ${LOCALE:-en}
|
||||
|
||||
# A secret key that's used to generate certain security-related tokens
|
||||
secret: ${SECRET:-~}
|
||||
|
||||
# two factor stuff
|
||||
twofactor_auth: ${TWOFACTOR_AUTH:-true}
|
||||
twofactor_sender: ${TWOFACTOR_SENDER:-no-reply@wallabag.org}
|
||||
|
||||
# fosuser stuff
|
||||
fosuser_registration: ${FOSUSER_REGISTRATION:-true}
|
||||
fosuser_confirmation: ${FOSUSER_CONFIRMATION:-true}
|
||||
|
||||
fos_oauth_server_access_token_lifetime: 3600
|
||||
fos_oauth_server_refresh_token_lifetime: 1209600
|
||||
|
||||
from_email: ${FROM_EMAIL:-wallabag@example.com}
|
||||
|
||||
rss_limit: 50
|
||||
|
||||
# RabbitMQ processing
|
||||
rabbitmq_host: localhost
|
||||
rabbitmq_port: 5672
|
||||
rabbitmq_user: guest
|
||||
rabbitmq_password: guest
|
||||
rabbitmq_prefetch_count: 10
|
||||
|
||||
# Redis processing
|
||||
redis_scheme: ${REDIS_SCHEME:-tcp}
|
||||
redis_host: ${REDIS_HOST:-redis}
|
||||
redis_port: ${REDIS_PORT:-6379}
|
||||
redis_path: ${REDIS_PATH:-~}
|
||||
redis_password: ${REDIS_PASSWORD:-~}
|
||||
|
||||
# Sentry
|
||||
sentry_dsn: ${SENTRY_DSN:-~}
|
||||
|
||||
session_handler: ${SESSION_HANDLER:-session.handler.native_file}
|
||||
10
docker/php/config/wallabag-php.ini
Normal file
10
docker/php/config/wallabag-php.ini
Normal file
@ -0,0 +1,10 @@
|
||||
memory_limit = ${PHP_MEMORY_LIMIT:-512M}
|
||||
|
||||
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-60}
|
||||
|
||||
date.time = ${PHP_TIMEZONE:-Europe/Paris}
|
||||
|
||||
session.save_handler = ${PHP_SESSION_HANDLER:-files}
|
||||
session.save_path = "${PHP_SESSION_SAVE_PATH:-}"
|
||||
|
||||
upload_max_filesize = 10M
|
||||
6
docker/php/entrypoint.sh
Executable file
6
docker/php/entrypoint.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
envsubst < /opt/wallabag/config/wallabag-php.ini > /usr/local/etc/php/conf.d/wallabag-php.ini
|
||||
envsubst < /opt/wallabag/config/parameters.yml > /var/www/html/app/config/parameters.yml
|
||||
|
||||
exec "$@"
|
||||
@ -1,6 +0,0 @@
|
||||
SYMFONY__ENV__DATABASE_DRIVER=pdo_sqlite
|
||||
SYMFONY__ENV__DATABASE_HOST=127.0.0.1
|
||||
SYMFONY__ENV__DATABASE_PORT=~
|
||||
SYMFONY__ENV__DATABASE_NAME=symfony
|
||||
SYMFONY__ENV__DATABASE_USER=root
|
||||
SYMFONY__ENV__DATABASE_PASSWORD=~
|
||||
13
docker/php/env.example
Normal file
13
docker/php/env.example
Normal file
@ -0,0 +1,13 @@
|
||||
DATABASE_DRIVER=pdo_sqlite
|
||||
DATABASE_HOST=127.0.0.1
|
||||
DATABASE_PORT=~
|
||||
DATABASE_NAME=symfony
|
||||
DATABASE_USER=root
|
||||
DATABASE_PASSWORD=~
|
||||
DATABASE_PATH="%kernel.project_dir%/data/db/wallabag.sqlite"
|
||||
DOMAIN_NAME=http://localhost:8000
|
||||
SECRET=ch4n63m31fy0uc4n
|
||||
PHP_SESSION_SAVE_PATH=tcp://redis:6379?database=2
|
||||
PHP_SESSION_HANDLER=redis
|
||||
SESSION_HANDLER=~
|
||||
TRUSTED_PROXIES=0.0.0.0/0
|
||||
2
docker/php/xdebug
Normal file
2
docker/php/xdebug
Normal file
@ -0,0 +1,2 @@
|
||||
XDEBUG_MODE=debug
|
||||
XDEBUG_TRIGGER=yes
|
||||
@ -1,9 +1,10 @@
|
||||
POSTGRES_USER=wallabag
|
||||
POSTGRES_PASSWORD=wallapass
|
||||
POSTGRES_DB=wallabag
|
||||
SYMFONY__ENV__DATABASE_HOST=rdbms
|
||||
SYMFONY__ENV__DATABASE_PORT=5432
|
||||
SYMFONY__ENV__DATABASE_NAME=wallabag
|
||||
SYMFONY__ENV__DATABASE_USER=wallabag
|
||||
SYMFONY__ENV__DATABASE_PASSWORD=wallapass
|
||||
SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql
|
||||
DATABASE_HOST=postgres
|
||||
DATABASE_PORT=5432
|
||||
DATABASE_NAME=wallabag
|
||||
DATABASE_USER=wallabag
|
||||
DATABASE_PASSWORD=wallapass
|
||||
DATABASE_DRIVER=pdo_pgsql
|
||||
DATABASE_PATH=null
|
||||
|
||||
42
package.json
42
package.json
@ -36,48 +36,48 @@
|
||||
"url": "https://github.com/wallabag/wallabag/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.17.2",
|
||||
"@babel/core": "^7.17.10",
|
||||
"@babel/eslint-parser": "^7.17.0",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"autoprefixer": "^10.4.2",
|
||||
"babel-loader": "^8.2.3",
|
||||
"css-loader": "^6.6.0",
|
||||
"eslint": "^8.9.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",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-webpack-plugin": "^3.1.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"lato-font": "^3.0.0",
|
||||
"mini-css-extract-plugin": "^2.5.3",
|
||||
"mini-css-extract-plugin": "^2.6.0",
|
||||
"node-sass": "^7.0.1",
|
||||
"postcss": "^8.4.6",
|
||||
"postcss": "^8.4.13",
|
||||
"postcss-loader": "^6.2.1",
|
||||
"postcss-scss": "^4.0.3",
|
||||
"sass": "^1.49.7",
|
||||
"sass-loader": "^12.4.0",
|
||||
"postcss-scss": "^4.0.4",
|
||||
"sass": "^1.51.0",
|
||||
"sass-loader": "^12.6.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"stylelint": "^14.5.0",
|
||||
"stylelint": "^14.8.2",
|
||||
"stylelint-config-standard": "^25.0.0",
|
||||
"stylelint-scss": "^4.1.0",
|
||||
"stylelint-webpack-plugin": "^3.1.1",
|
||||
"stylelint-scss": "^4.2.0",
|
||||
"stylelint-webpack-plugin": "^3.2.0",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"url-loader": "^4.1.1",
|
||||
"webpack": "^5.68.0",
|
||||
"webpack": "^5.72.1",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.7.4",
|
||||
"webpack-manifest-plugin": "^4.1.1",
|
||||
"webpack-dev-server": "^4.9.0",
|
||||
"webpack-manifest-plugin": "^5.0.0",
|
||||
"webpack-merge": "^5.7.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"annotator": "wallabag/annotator#master",
|
||||
"clipboard": "^2.0.10",
|
||||
"clipboard": "^2.0.11",
|
||||
"hammerjs": "^2.0.8",
|
||||
"highlight.js": "^11.4.0",
|
||||
"highlight.js": "^11.5.1",
|
||||
"icomoon-free-npm": "^0.0.0",
|
||||
"jquery": "^3.6.0",
|
||||
"jquery.cookie": "^1.4.1",
|
||||
"jr-qrcode": "^1.0.7",
|
||||
"material-design-icons-iconfont": "^6.1.1",
|
||||
"material-design-icons-iconfont": "^6.7.0",
|
||||
"materialize-css": "^0.98.1",
|
||||
"mathjax": "^3.1.2",
|
||||
"mousetrap": "^1.6.0",
|
||||
|
||||
32
src/Wallabag/ApiBundle/Controller/ConfigRestController.php
Normal file
32
src/Wallabag/ApiBundle/Controller/ConfigRestController.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace Wallabag\ApiBundle\Controller;
|
||||
|
||||
use JMS\Serializer\SerializationContext;
|
||||
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
class ConfigRestController extends WallabagRestController
|
||||
{
|
||||
/**
|
||||
* Retrieve configuration for current user.
|
||||
*
|
||||
* @ApiDoc()
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getConfigAction()
|
||||
{
|
||||
$this->validateAuthentication();
|
||||
|
||||
$json = $this->get('jms_serializer')->serialize(
|
||||
$this->getUser()->getConfig(),
|
||||
'json',
|
||||
SerializationContext::create()->setGroups(['config_api'])
|
||||
);
|
||||
|
||||
return (new JsonResponse())
|
||||
->setJson($json)
|
||||
->setStatusCode(JsonResponse::HTTP_OK);
|
||||
}
|
||||
}
|
||||
@ -32,3 +32,8 @@ user:
|
||||
type: rest
|
||||
resource: "WallabagApiBundle:UserRest"
|
||||
name_prefix: api_
|
||||
|
||||
config:
|
||||
type: rest
|
||||
resource: "WallabagApiBundle:ConfigRest"
|
||||
name_prefix: api_
|
||||
|
||||
@ -41,7 +41,7 @@ class TagAllCommand extends ContainerAwareCommand
|
||||
|
||||
$entries = $tagger->tagAllForUser($user);
|
||||
|
||||
$io->text('Persist entries... ');
|
||||
$io->text('Persist ' . \count($entries) . ' entries... ');
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
foreach ($entries as $entry) {
|
||||
|
||||
@ -43,6 +43,16 @@ class ConfigController extends Controller
|
||||
$configForm->handleRequest($request);
|
||||
|
||||
if ($configForm->isSubmitted() && $configForm->isValid()) {
|
||||
// force theme to material to avoid using baggy
|
||||
if ('baggy' === $config->getTheme()) {
|
||||
$config->setTheme('material');
|
||||
|
||||
$this->addFlash(
|
||||
'notice',
|
||||
'Baggy is deprecated, forced to Material theme.'
|
||||
);
|
||||
}
|
||||
|
||||
$em->persist($config);
|
||||
$em->flush();
|
||||
|
||||
|
||||
@ -277,12 +277,26 @@ class EntryController extends Controller
|
||||
return $this->showEntries('untagged', $request, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows entries with annotations for current user.
|
||||
*
|
||||
* @param int $page
|
||||
*
|
||||
* @Route("/annotated/list/{page}", name="annotated", defaults={"page" = "1"})
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function showWithAnnotationsEntriesAction(Request $request, $page)
|
||||
{
|
||||
return $this->showEntries('annotated', $request, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows random entry depending on the given type.
|
||||
*
|
||||
* @param string $type
|
||||
*
|
||||
* @Route("/{type}/random", name="random_entry", requirements={"type": "unread|starred|archive|untagged|all"})
|
||||
* @Route("/{type}/random", name="random_entry", requirements={"type": "unread|starred|archive|untagged|annotated|all"})
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\RedirectResponse
|
||||
*/
|
||||
@ -517,6 +531,20 @@ class EntryController extends Controller
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* List the entries with the same domain as the current one.
|
||||
*
|
||||
* @param int $page
|
||||
*
|
||||
* @Route("/domain/{id}/{page}", requirements={"id" = ".+"}, defaults={"page" = 1}, name="same_domain")
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function getSameDomainEntries(Request $request, $page = 1)
|
||||
{
|
||||
return $this->showEntries('same-domain', $request, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Global method to retrieve entries depending on the given type
|
||||
* It returns the response to be send.
|
||||
@ -549,10 +577,16 @@ class EntryController extends Controller
|
||||
$qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId());
|
||||
$formOptions['filter_archived'] = true;
|
||||
break;
|
||||
case 'annotated':
|
||||
$qb = $repository->getBuilderForAnnotationsByUser($this->getUser()->getId());
|
||||
break;
|
||||
case 'unread':
|
||||
$qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId());
|
||||
$formOptions['filter_unread'] = true;
|
||||
break;
|
||||
case 'same-domain':
|
||||
$qb = $repository->getBuilderForSameDomainByUser($this->getUser()->getId(), $request->get('id'));
|
||||
break;
|
||||
case 'all':
|
||||
$qb = $repository->getBuilderForAllByUser($this->getUser()->getId());
|
||||
break;
|
||||
|
||||
@ -47,7 +47,7 @@ class ExportController extends Controller
|
||||
*
|
||||
* @Route("/export/{category}.{format}", name="export_entries", requirements={
|
||||
* "format": "epub|mobi|pdf|json|xml|txt|csv",
|
||||
* "category": "all|unread|starred|archive|tag_entries|untagged|search"
|
||||
* "category": "all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain"
|
||||
* })
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
@ -80,6 +80,13 @@ class ExportController extends Controller
|
||||
->getResult();
|
||||
|
||||
$title = 'Search ' . $searchTerm;
|
||||
} elseif ('annotated' === $category) {
|
||||
$entries = $repository->getBuilderForAnnotationsByUser(
|
||||
$this->getUser()->getId()
|
||||
)->getQuery()
|
||||
->getResult();
|
||||
|
||||
$title = 'With annotations';
|
||||
} else {
|
||||
$entries = $repository
|
||||
->$methodBuilder($this->getUser()->getId())
|
||||
|
||||
@ -8,7 +8,9 @@ use Pagerfanta\Exception\OutOfRangeCurrentPageException;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use Wallabag\CoreBundle\Entity\Tag;
|
||||
@ -88,8 +90,19 @@ class FeedController extends Controller
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function showTagsFeedAction(User $user, Tag $tag, $page)
|
||||
public function showTagsFeedAction(Request $request, User $user, Tag $tag, $page)
|
||||
{
|
||||
$sort = $request->query->get('sort', 'created');
|
||||
|
||||
$sorts = [
|
||||
'created' => 'createdAt',
|
||||
'updated' => 'updatedAt',
|
||||
];
|
||||
|
||||
if (!isset($sorts[$sort])) {
|
||||
throw new BadRequestHttpException(sprintf('Sort "%s" is not available.', $sort));
|
||||
}
|
||||
|
||||
$url = $this->generateUrl(
|
||||
'tag_feed',
|
||||
[
|
||||
@ -102,7 +115,8 @@ class FeedController extends Controller
|
||||
|
||||
$entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId(
|
||||
$user->getId(),
|
||||
$tag->getId()
|
||||
$tag->getId(),
|
||||
$sorts[$sort]
|
||||
);
|
||||
|
||||
$pagerAdapter = new ArrayAdapter($entriesByTag);
|
||||
@ -137,11 +151,28 @@ class FeedController extends Controller
|
||||
'domainName' => $this->getParameter('domain_name'),
|
||||
'version' => $this->getParameter('wallabag_core.version'),
|
||||
'tag' => $tag->getSlug(),
|
||||
'updated' => $this->prepareFeedUpdatedDate($entries, $sort),
|
||||
],
|
||||
new Response('', 200, ['Content-Type' => 'application/atom+xml'])
|
||||
);
|
||||
}
|
||||
|
||||
private function prepareFeedUpdatedDate(Pagerfanta $entries, $sort = 'created')
|
||||
{
|
||||
$currentPageResults = $entries->getCurrentPageResults();
|
||||
|
||||
if (isset($currentPageResults[0])) {
|
||||
$firstEntry = $currentPageResults[0];
|
||||
if ('created' === $sort) {
|
||||
return $firstEntry->getCreatedAt();
|
||||
}
|
||||
|
||||
return $firstEntry->getUpdatedAt();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Global method to retrieve entries depending on the given type
|
||||
* It returns the response to be send.
|
||||
@ -202,6 +233,7 @@ class FeedController extends Controller
|
||||
'user' => $user->getUsername(),
|
||||
'domainName' => $this->getParameter('domain_name'),
|
||||
'version' => $this->getParameter('wallabag_core.version'),
|
||||
'updated' => $this->prepareFeedUpdatedDate($entries),
|
||||
],
|
||||
new Response('', 200, ['Content-Type' => 'application/atom+xml'])
|
||||
);
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
namespace Wallabag\CoreBundle\Controller;
|
||||
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Pagerfanta\Adapter\ArrayAdapter;
|
||||
use Pagerfanta\Exception\OutOfRangeCurrentPageException;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
@ -190,4 +191,35 @@ class TagController extends Controller
|
||||
|
||||
return $this->redirect($redirectUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag search results with the current search term.
|
||||
*
|
||||
* @Route("/tag/search/{filter}", name="tag_this_search")
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function tagThisSearchAction($filter, Request $request)
|
||||
{
|
||||
$currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : '';
|
||||
|
||||
/** @var QueryBuilder $qb */
|
||||
$qb = $this->get('wallabag_core.entry_repository')->getBuilderForSearchByUser($this->getUser()->getId(), $filter, $currentRoute);
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
|
||||
$entries = $qb->getQuery()->getResult();
|
||||
|
||||
foreach ($entries as $entry) {
|
||||
$this->get('wallabag_core.tags_assigner')->assignTagsToEntry(
|
||||
$entry,
|
||||
$filter
|
||||
);
|
||||
|
||||
$em->persist($entry);
|
||||
}
|
||||
|
||||
$em->flush();
|
||||
|
||||
return $this->redirect($this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true));
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,7 +45,7 @@ class ConfigFixtures extends Fixture implements DependentFixtureInterface
|
||||
$emptyConfig = new Config($this->getReference('empty-user'));
|
||||
$emptyConfig->setTheme('material');
|
||||
$emptyConfig->setItemsPerPage(10);
|
||||
$emptyConfig->setReadingSpeed(200);
|
||||
$emptyConfig->setReadingSpeed(100);
|
||||
$emptyConfig->setLanguage('en');
|
||||
$emptyConfig->setPocketConsumerKey(null);
|
||||
$emptyConfig->setActionMarkAsRead(0);
|
||||
|
||||
@ -43,6 +43,20 @@ class TaggingRuleFixtures extends Fixture implements DependentFixtureInterface
|
||||
|
||||
$manager->persist($tr4);
|
||||
|
||||
$tr5 = new TaggingRule();
|
||||
$tr5->setRule('readingTime <= 5');
|
||||
$tr5->setTags(['shortread']);
|
||||
$tr5->setConfig($this->getReference('empty-config'));
|
||||
|
||||
$manager->persist($tr5);
|
||||
|
||||
$tr6 = new TaggingRule();
|
||||
$tr6->setRule('readingTime > 5');
|
||||
$tr6->setTags(['longread']);
|
||||
$tr6->setConfig($this->getReference('empty-config'));
|
||||
|
||||
$manager->persist($tr6);
|
||||
|
||||
$manager->flush();
|
||||
}
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@ namespace Wallabag\CoreBundle\Entity;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
use Wallabag\UserBundle\Entity\User;
|
||||
|
||||
@ -29,6 +30,8 @@ class Config
|
||||
* @ORM\Column(name="id", type="integer")
|
||||
* @ORM\Id
|
||||
* @ORM\GeneratedValue(strategy="AUTO")
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $id;
|
||||
|
||||
@ -50,6 +53,8 @@ class Config
|
||||
* maxMessage = "validator.item_per_page_too_high"
|
||||
* )
|
||||
* @ORM\Column(name="items_per_page", type="integer", nullable=false)
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $itemsPerPage;
|
||||
|
||||
@ -58,6 +63,8 @@ class Config
|
||||
*
|
||||
* @Assert\NotBlank()
|
||||
* @ORM\Column(name="language", type="string", nullable=false)
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $language;
|
||||
|
||||
@ -65,6 +72,8 @@ class Config
|
||||
* @var string
|
||||
*
|
||||
* @ORM\Column(name="feed_token", type="string", nullable=true)
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $feedToken;
|
||||
|
||||
@ -77,6 +86,8 @@ class Config
|
||||
* max = 100000,
|
||||
* maxMessage = "validator.feed_limit_too_high"
|
||||
* )
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $feedLimit;
|
||||
|
||||
@ -84,6 +95,8 @@ class Config
|
||||
* @var float
|
||||
*
|
||||
* @ORM\Column(name="reading_speed", type="float", nullable=true)
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $readingSpeed;
|
||||
|
||||
@ -98,6 +111,8 @@ class Config
|
||||
* @var int
|
||||
*
|
||||
* @ORM\Column(name="action_mark_as_read", type="integer", nullable=true, options={"default" = 0})
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $actionMarkAsRead;
|
||||
|
||||
@ -105,6 +120,8 @@ class Config
|
||||
* @var int
|
||||
*
|
||||
* @ORM\Column(name="list_mode", type="integer", nullable=true)
|
||||
*
|
||||
* @Groups({"config_api"})
|
||||
*/
|
||||
private $listMode;
|
||||
|
||||
|
||||
@ -24,7 +24,13 @@ class ConfigType extends AbstractType
|
||||
$this->themes = array_combine(
|
||||
$themes,
|
||||
array_map(function ($s) {
|
||||
return ucwords(strtolower(str_replace('-', ' ', $s)));
|
||||
$cleanTheme = ucwords(strtolower(str_replace('-', ' ', $s)));
|
||||
|
||||
if ('Baggy' === $cleanTheme) {
|
||||
$cleanTheme = 'Baggy (DEPRECATED)';
|
||||
}
|
||||
|
||||
return $cleanTheme;
|
||||
}, $themes)
|
||||
);
|
||||
|
||||
|
||||
@ -93,7 +93,7 @@ class EntryFilterType extends AbstractType
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
$value = $values['value'];
|
||||
if (\strlen($value) <= 2 || empty($value)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
$expression = $filterQuery->getExpr()->like($field, $filterQuery->getExpr()->lower($filterQuery->getExpr()->literal('%' . $value . '%')));
|
||||
|
||||
@ -105,7 +105,7 @@ class EntryFilterType extends AbstractType
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
$value = $values['value'];
|
||||
if (false === \array_key_exists($value, Response::$statusTexts)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
$paramName = sprintf('%s', str_replace('.', '_', $field));
|
||||
@ -129,7 +129,7 @@ class EntryFilterType extends AbstractType
|
||||
'data' => $options['filter_unread'],
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
if (false === $values['value']) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
$expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
|
||||
@ -137,10 +137,22 @@ class EntryFilterType extends AbstractType
|
||||
return $filterQuery->createCondition($expression);
|
||||
},
|
||||
])
|
||||
->add('isAnnotated', CheckboxFilterType::class, [
|
||||
'label' => 'entry.filters.annotated_label',
|
||||
'data' => $options['filter_annotated'],
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
if (false === $values['value']) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$qb = $filterQuery->getQueryBuilder();
|
||||
$qb->innerJoin('e.annotations', 'a');
|
||||
},
|
||||
])
|
||||
->add('previewPicture', CheckboxFilterType::class, [
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
if (false === $values['value']) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
$expression = $filterQuery->getExpr()->isNotNull($field);
|
||||
@ -152,7 +164,7 @@ class EntryFilterType extends AbstractType
|
||||
->add('isPublic', CheckboxFilterType::class, [
|
||||
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
|
||||
if (false === $values['value']) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
// is_public isn't a real field
|
||||
@ -183,6 +195,7 @@ class EntryFilterType extends AbstractType
|
||||
'filter_archived' => false,
|
||||
'filter_starred' => false,
|
||||
'filter_unread' => false,
|
||||
'filter_annotated' => false,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,7 +236,9 @@ class ContentProxy
|
||||
return $rawText;
|
||||
}
|
||||
|
||||
return iconv('UTF-8', 'UTF-8//IGNORE', $rawText);
|
||||
mb_substitute_character('none');
|
||||
|
||||
return mb_convert_encoding($rawText, 'UTF-8', 'UTF-8');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -188,6 +188,10 @@ class DownloadImages
|
||||
imagesavealpha($im, true);
|
||||
imagepng($im, $localPath, ceil(self::REGENERATE_PICTURES_QUALITY / 100 * 9));
|
||||
$this->logger->debug('DownloadImages: Re-creating png');
|
||||
break;
|
||||
case 'webp':
|
||||
imagewebp($im, $localPath, self::REGENERATE_PICTURES_QUALITY);
|
||||
$this->logger->debug('DownloadImages: Re-creating webp');
|
||||
}
|
||||
|
||||
imagedestroy($im);
|
||||
@ -333,6 +337,7 @@ class DownloadImages
|
||||
'jpeg' => "\xFF\xD8\xFF",
|
||||
'gif' => 'GIF',
|
||||
'png' => "\x89\x50\x4e\x47\x0d\x0a",
|
||||
'webp' => "\x52\x49\x46\x46",
|
||||
];
|
||||
$bytes = substr((string) $res->getBody(), 0, 8);
|
||||
|
||||
@ -346,7 +351,7 @@ class DownloadImages
|
||||
$this->logger->debug('DownloadImages: Checking extension (alternative)', ['ext' => $ext]);
|
||||
}
|
||||
|
||||
if (!\in_array($ext, ['jpeg', 'jpg', 'gif', 'png'], true)) {
|
||||
if (!\in_array($ext, ['jpeg', 'jpg', 'gif', 'png', 'webp'], true)) {
|
||||
$this->logger->error('DownloadImages: Processed image with not allowed extension. Skipping: ' . $imagePath);
|
||||
|
||||
return false;
|
||||
|
||||
@ -161,8 +161,8 @@ class EntriesExport
|
||||
*/
|
||||
|
||||
$book->setTitle($this->title);
|
||||
// Not needed, but included for the example, Language is mandatory, but EPub defaults to "en". Use RFC3066 Language codes, such as "en", "da", "fr" etc.
|
||||
$book->setLanguage($this->language);
|
||||
// EPub specification requires BCP47-compliant languages, thus we replace _ with -
|
||||
$book->setLanguage(str_replace('_', '-', $this->language));
|
||||
$book->setDescription('Some articles saved on my wallabag');
|
||||
|
||||
$book->setAuthor($this->author, $this->author);
|
||||
@ -527,6 +527,8 @@ class EntriesExport
|
||||
*/
|
||||
private function getSanitizedFilename()
|
||||
{
|
||||
return preg_replace('/[^A-Za-z0-9\- \']/', '', iconv('utf-8', 'us-ascii//TRANSLIT', $this->title));
|
||||
$transliterator = \Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', \Transliterator::FORWARD);
|
||||
|
||||
return preg_replace('/[^A-Za-z0-9\- \']/', '', $transliterator->transliterate($this->title));
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,8 +35,10 @@ class RuleBasedTagger
|
||||
{
|
||||
$rules = $this->getRulesForUser($entry->getUser());
|
||||
|
||||
$clonedEntry = $this->fixEntry($entry);
|
||||
|
||||
foreach ($rules as $rule) {
|
||||
if (!$this->rulerz->satisfies($entry, $rule->getRule())) {
|
||||
if (!$this->rulerz->satisfies($clonedEntry, $rule->getRule())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -61,14 +63,22 @@ class RuleBasedTagger
|
||||
public function tagAllForUser(User $user)
|
||||
{
|
||||
$rules = $this->getRulesForUser($user);
|
||||
$entries = [];
|
||||
$entriesToUpdate = [];
|
||||
$tagsCache = [];
|
||||
|
||||
foreach ($rules as $rule) {
|
||||
$qb = $this->entryRepository->getBuilderForAllByUser($user->getId());
|
||||
$entries = $this->rulerz->filter($qb, $rule->getRule());
|
||||
$entries = $this->entryRepository
|
||||
->getBuilderForAllByUser($user->getId())
|
||||
->getQuery()
|
||||
->getResult();
|
||||
|
||||
foreach ($entries as $entry) {
|
||||
$clonedEntry = $this->fixEntry($entry);
|
||||
|
||||
foreach ($rules as $rule) {
|
||||
if (!$this->rulerz->satisfies($clonedEntry, $rule->getRule())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($entries as $entry) {
|
||||
foreach ($rule->getTags() as $label) {
|
||||
// avoid new tag duplicate by manually caching them
|
||||
if (!isset($tagsCache[$label])) {
|
||||
@ -78,11 +88,13 @@ class RuleBasedTagger
|
||||
$tag = $tagsCache[$label];
|
||||
|
||||
$entry->addTag($tag);
|
||||
|
||||
$entriesToUpdate[] = $entry;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $entries;
|
||||
return $entriesToUpdate;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -114,4 +126,15 @@ class RuleBasedTagger
|
||||
{
|
||||
return $user->getConfig()->getTaggingRules();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update reading time on the fly to match the proper words per minute from the user.
|
||||
*/
|
||||
private function fixEntry(Entry $entry)
|
||||
{
|
||||
$clonedEntry = clone $entry;
|
||||
$clonedEntry->setReadingTime($entry->getReadingTime() / $entry->getUser()->getConfig()->getReadingSpeed() * 200);
|
||||
|
||||
return $clonedEntry;
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,7 +39,34 @@ class EntryRepository extends EntityRepository
|
||||
return $this
|
||||
->getSortedQueryBuilderByUser($userId)
|
||||
->andWhere('e.isArchived = false')
|
||||
;
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves entries with the same domain.
|
||||
*
|
||||
* @param int $userId
|
||||
* @param int $entryId
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public function getBuilderForSameDomainByUser($userId, $entryId)
|
||||
{
|
||||
$queryBuilder = $this->createQueryBuilder('e');
|
||||
|
||||
return $this
|
||||
->getSortedQueryBuilderByUser($userId)
|
||||
->andWhere('e.id <> :entryId')->setParameter('entryId', $entryId)
|
||||
->andWhere(
|
||||
$queryBuilder->expr()->in(
|
||||
'e.domainName',
|
||||
$this
|
||||
->createQueryBuilder('e2')
|
||||
->select('e2.domainName')
|
||||
->where('e2.id = :entryId')->setParameter('entryId', $entryId)
|
||||
->getDQL()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,6 +142,21 @@ class EntryRepository extends EntityRepository
|
||||
return $this->sortQueryBuilder($this->getRawBuilderForUntaggedByUser($userId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve entries with annotations for a user.
|
||||
*
|
||||
* @param int $userId
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public function getBuilderForAnnotationsByUser($userId)
|
||||
{
|
||||
return $this
|
||||
->getSortedQueryBuilderByUser($userId)
|
||||
->innerJoin('e.annotations', 'a')
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve untagged entries for a user.
|
||||
*
|
||||
@ -343,9 +385,9 @@ class EntryRepository extends EntityRepository
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function findAllByTagId($userId, $tagId)
|
||||
public function findAllByTagId($userId, $tagId, $sort = 'createdAt')
|
||||
{
|
||||
return $this->getSortedQueryBuilderByUser($userId)
|
||||
return $this->getSortedQueryBuilderByUser($userId, $sort)
|
||||
->innerJoin('e.tags', 't')
|
||||
->andWhere('t.id = :tagId')->setParameter('tagId', $tagId)
|
||||
->getQuery()
|
||||
@ -552,6 +594,10 @@ class EntryRepository extends EntityRepository
|
||||
$qb->leftJoin('e.tags', 't');
|
||||
$qb->andWhere('t.id is null');
|
||||
break;
|
||||
case 'annotated':
|
||||
$qb->leftJoin('e.annotations', 'a');
|
||||
$qb->andWhere('a.id is not null');
|
||||
break;
|
||||
}
|
||||
|
||||
$ids = $qb->getQuery()->getArrayResult();
|
||||
|
||||
@ -163,7 +163,7 @@ config:
|
||||
meaning: Význam
|
||||
variables_available_description: 'Pro vytvoření pravidel štítkování mohou být použity následující proměnné a operátory:'
|
||||
variables_available_title: Které proměnné a operátory mohu pro psaní pravidel použít?
|
||||
how_to_use_them_description: 'Předpokládejme, že chcete označit nové položky štítkem jako je « <i>krátké čtení</i> », pokud je doba čtení kratší než 3 minuty.<br />V takovém případě byste měli do pole <i>Pravidlo</i> zadat « readingTime <= 3 » a do pole <i>Štítky</i> zadat « <i>krátké čtení</i> ».<br />Několik štítků současně lze přidat jejich oddělením čárkou: « <i>krátké čtení, musím přečíst</i> »<br />Složitá pravidla lze zapsat pomocí předdefinovaných operátorů: if « <i>readingTime >= 5 AND domainName = "github.com"</i> » pak označit štítkem jako « <i>dlouhé čtení, GitHub</i> »'
|
||||
how_to_use_them_description: 'Předpokládejme, že chcete označit nové položky štítkem jako je « <i>krátké čtení</i> », pokud je doba čtení kratší než 3 minuty.<br />V takovém případě byste měli do pole <i>Pravidlo</i> zadat « readingTime <= 3 » a do pole <i>Štítky</i> zadat « <i>krátké čtení</i> ».<br />Několik štítků současně lze přidat jejich oddělením čárkou: « <i>krátké čtení, musím přečíst</i> »<br />Složitá pravidla lze zapsat pomocí předdefinovaných operátorů: if « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » pak označit štítkem jako « <i>dlouhé čtení, php</i> »'
|
||||
how_to_use_them_title: Jak je použiji?
|
||||
tagging_rules_definition_description: Jsou to pravidla používaná programem wallabag k automatickému označování nových položek štítkem. <br />Pokaždé, když je přidána nová položky, všechna pravidla štítkování budou použita k přidání štítků, které jste nakonfigurovali, čímž vám ušetří potíže s ručním označováním vašich položek.
|
||||
tagging_rules_definition_title: Co znamenají „pravidla štítkování“?
|
||||
|
||||
@ -150,7 +150,7 @@ config:
|
||||
tagging_rules_definition_title: Was bedeuten die „Tagging-Regeln“?
|
||||
tagging_rules_definition_description: Dies sind Regeln von wallabag, um neu hinzugefügte Einträge automatisch zu taggen.<br />Jedes Mal, wenn ein neuer Eintrag hinzugefügt wird, werden die Tagging-Regeln angewandt. Dies erleichtert dir die Arbeit, deine Einträge manuell zu kategorisieren.
|
||||
how_to_use_them_title: Wie nutze ich sie?
|
||||
how_to_use_them_description: 'Nehmen wir an, du möchtest deine Einträge als „<i>schnell lesbar</i>“ markiert, wenn die Lesezeit kürzer als drei Minuten ist.<br />In diesem Fall solltest du „readingTime <= 3“ in das Feld <i>Regel</i> und „<i>schnell lesbar</i>“ in das Feld <i>Tags</i> schreiben.<br />Mehrere Tags können gleichzeitig hinzugefügt werden, indem sie durch ein Komma getrennt werden: „<i>schnell lesbar, interessant</i>“.<br />Komplexe Regeln können durch vordefinierte Operatoren geschrieben werden: wenn „<i>readingTime >= 5 AND domainName = "github.com"</i>“ dann tagge als „<i>länger lesen, GitHub</i>“'
|
||||
how_to_use_them_description: 'Nehmen wir an, du möchtest deine Einträge als „<i>schnell lesbar</i>“ markiert, wenn die Lesezeit kürzer als drei Minuten ist.<br />In diesem Fall solltest du „readingTime <= 3“ in das Feld <i>Regel</i> und „<i>schnell lesbar</i>“ in das Feld <i>Tags</i> schreiben.<br />Mehrere Tags können gleichzeitig hinzugefügt werden, indem sie durch ein Komma getrennt werden: „<i>schnell lesbar, interessant</i>“.<br />Komplexe Regeln können durch vordefinierte Operatoren geschrieben werden: wenn „<i>readingTime >= 5 AND domainName = "www.php.net"</i>“ dann tagge als „<i>länger lesen, php</i>“'
|
||||
variables_available_title: Welche Variablen und Operatoren kann ich benutzen, um Regeln zu schreiben?
|
||||
variables_available_description: 'Die folgenden Variablen und Operatoren können genutzt werden, um Tagging-Regeln zu erstellen:'
|
||||
meaning: Bedeutung
|
||||
|
||||
@ -19,6 +19,7 @@ menu:
|
||||
starred: Starred
|
||||
archive: Archive
|
||||
all_articles: All entries
|
||||
with_annotations: With annotations
|
||||
config: Config
|
||||
tags: Tags
|
||||
internal_settings: Internal Settings
|
||||
@ -157,7 +158,7 @@ config:
|
||||
tagging_rules_definition_title: What does “tagging rules” mean?
|
||||
tagging_rules_definition_description: They are rules used by wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble of manually classifying your entries.
|
||||
how_to_use_them_title: How do I use them?
|
||||
how_to_use_them_description: 'Let us assume you want to tag new entries as « <i>short reading</i> » when the reading time is under 3 minutes.<br />In that case, you should put « readingTime <= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them with a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime >= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, GitHub </i> »'
|
||||
how_to_use_them_description: 'Let us assume you want to tag new entries as « <i>short reading</i> » when the reading time is under 3 minutes.<br />In that case, you should put « readingTime <= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them with a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » then tag as « <i>long reading, php</i> »'
|
||||
variables_available_title: Which variables and operators can I use to write rules?
|
||||
variables_available_description: 'The following variables and operators can be used to create tagging rules:'
|
||||
meaning: Meaning
|
||||
@ -220,10 +221,12 @@ entry:
|
||||
starred: Starred entries
|
||||
archived: Archived entries
|
||||
filtered: Filtered entries
|
||||
with_annotations: Entries with annotations
|
||||
filtered_tags: 'Filtered by tags:'
|
||||
filtered_search: 'Filtered by search:'
|
||||
untagged: Untagged entries
|
||||
all: All entries
|
||||
same_domain: Same domain
|
||||
list:
|
||||
number_on_the_page: '{0} There are no entries.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
|
||||
reading_time: estimated reading time
|
||||
@ -237,12 +240,15 @@ entry:
|
||||
toogle_as_star: Toggle starred
|
||||
delete: Delete
|
||||
export_title: Export
|
||||
show_same_domain: Show articles with the same domain
|
||||
assign_search_tag: Assign this search as a tag to each result
|
||||
filters:
|
||||
title: Filters
|
||||
status_label: Status
|
||||
archived_label: Archived
|
||||
starred_label: Starred
|
||||
unread_label: Unread
|
||||
annotated_label: Annotated
|
||||
preview_picture_label: Has a preview picture
|
||||
preview_picture_help: Preview picture
|
||||
is_public_label: Has a public link
|
||||
@ -480,12 +486,12 @@ import:
|
||||
description: Pocket import isn't configured.
|
||||
admin_message: You need to define %keyurls%a pocket_consumer_key%keyurle%.
|
||||
user_message: Your server admin needs to define an API Key for Pocket.
|
||||
authorize_message: You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.
|
||||
authorize_message: You can import your data from your Pocket account. You just have to click on the button below and authorize the application to connect to getpocket.com.
|
||||
connect_to_pocket: Connect to Pocket and import data
|
||||
wallabag_v1:
|
||||
page_title: Import > Wallabag v1
|
||||
description: This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.
|
||||
how_to: Please select your wallabag export and click on the below button to upload and import it.
|
||||
how_to: Please select your wallabag export and click on the button below to upload and import it.
|
||||
wallabag_v2:
|
||||
page_title: Import > Wallabag v2
|
||||
description: This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.
|
||||
@ -495,7 +501,7 @@ import:
|
||||
readability:
|
||||
page_title: Import > Readability
|
||||
description: This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).
|
||||
how_to: Please select your Readability export and click on the below button to upload and import it.
|
||||
how_to: Please select your Readability export and click on the button below to upload and import it.
|
||||
worker:
|
||||
enabled: 'Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:'
|
||||
download_images_warning: You enabled downloading images for your articles. Combined with classic import it can take ages to proceed (or maybe failed). We <strong>strongly recommend</strong> to enable asynchronous import to avoid errors.
|
||||
@ -510,11 +516,15 @@ import:
|
||||
instapaper:
|
||||
page_title: Import > Instapaper
|
||||
description: This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").
|
||||
how_to: Please select your Instapaper export and click on the below button to upload and import it.
|
||||
how_to: Please select your Instapaper export and click on the button below to upload and import it.
|
||||
pinboard:
|
||||
page_title: Import > Pinboard
|
||||
description: This importer will import all your Pinboard articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").
|
||||
how_to: Please select your Pinboard export and click on the below button to upload and import it.
|
||||
how_to: Please select your Pinboard export and click on the button below to upload and import it.
|
||||
delicious:
|
||||
page_title: Import > del.icio.us
|
||||
description: This importer will import all your Delicious bookmarks. Since 2021, you can export again your data from it using the export page (https://del.icio.us/export). Choose the "JSON" format and download it (like "delicious_export.2021.02.06_21.10.json").
|
||||
how_to: Please select your Delicious export and click on the button below to upload and import it.
|
||||
developer:
|
||||
page_title: API clients management
|
||||
welcome_message: Welcome to the wallabag API
|
||||
|
||||
@ -157,7 +157,7 @@ config:
|
||||
tagging_rules_definition_title: '¿Qué significa «reglas de etiquetado»?'
|
||||
tagging_rules_definition_description: 'Son las reglas usadas por wallabag para etiquetar automáticamente los nuevos artículos.<br />Cada vez que un artículo es añadido, todas las reglas de etiquetado automático serán usadas para etiquetarlo, ayudándote a clasificar automáticamente tus artículos.'
|
||||
how_to_use_them_title: '¿Cómo se utilizan?'
|
||||
how_to_use_them_description: 'Supongamos que quiere etiquetar los artículos nuevos como « <i>lectura corta</i> » cuando el tiempo de lectura sea menos de 3 minutos.<br /> En este caso, debe poner « readingTime <= 3 » en el campo <i>Regla</i> y « <i>lectura corta</i> » en el campo <i>Etiquetas</i>.<br />Se pueden añadir varias etiquetas al mismo tiempo separadas por comas: « <i>lectura corta, lectura obligada</i> »<br />Se pueden escribir reglas complejas utilizando los operadores predefinidos: si « <i>readingTime >= 5 AND domainName = "github.com"</i> » entonces etiqueta como « <i>lectura larga, GitHub </i> »'
|
||||
how_to_use_them_description: 'Supongamos que quiere etiquetar los artículos nuevos como « <i>lectura corta</i> » cuando el tiempo de lectura sea menos de 3 minutos.<br /> En este caso, debe poner « readingTime <= 3 » en el campo <i>Regla</i> y « <i>lectura corta</i> » en el campo <i>Etiquetas</i>.<br />Se pueden añadir varias etiquetas al mismo tiempo separadas por comas: « <i>lectura corta, lectura obligada</i> »<br />Se pueden escribir reglas complejas utilizando los operadores predefinidos: si « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » entonces etiqueta como « <i>lectura larga, php</i> »'
|
||||
variables_available_title: '¿Qué variables y operadores se pueden utilizar para escribir las reglas?'
|
||||
variables_available_description: 'Las siguientes variables y operadores se pueden utilizar para crear reglas de etiquetado:'
|
||||
meaning: 'Significado'
|
||||
|
||||
@ -32,6 +32,7 @@ menu:
|
||||
site_credentials: اعتبارنامههای وبگاه
|
||||
users_management: مدیریت کاربران
|
||||
developer: مدیریت کارخواههای API
|
||||
quickstart: "Quickstart"
|
||||
top:
|
||||
add_new_entry: افزودن مقالهٔ تازه
|
||||
search: جستجو
|
||||
|
||||
@ -19,6 +19,7 @@ menu:
|
||||
starred: Favoris
|
||||
archive: Lus
|
||||
all_articles: Tous les articles
|
||||
with_annotations: Avec annotations
|
||||
config: Configuration
|
||||
tags: Étiquettes
|
||||
internal_settings: Configuration interne
|
||||
@ -157,7 +158,7 @@ config:
|
||||
tagging_rules_definition_title: Que signifient les règles d'étiquetage automatiques ?
|
||||
tagging_rules_definition_description: Ce sont des règles utilisées par wallabag pour classer automatiquement vos nouveaux articles.<br />À chaque fois qu’un nouvel article est ajouté, toutes les règles d'étiquetage automatiques seront utilisées afin d’ajouter les tags que vous avez configurés, vous épargnant ainsi l’effort de classifier vos articles manuellement.
|
||||
how_to_use_them_title: Comment les utiliser ?
|
||||
how_to_use_them_description: 'Imaginons que voulez attribuer aux nouveaux articles l''étiquette « <i>lecture courte</i> » lorsque le temps de lecture est inférieur à 3 minutes.<br />Dans ce cas, vous devriez mettre « readingTime <= 3 » dans le champ <i>Règle</i> et « <i>lecture courte</i> » dans le champ <i>Tag</i>.<br />Plusieurs tags peuvent être ajoutés simultanément en les séparant par des virgules : « <i>lecture courte, à lire</i> »<br />Des règles complexes peuvent être créées en utilisant des opérateurs prédéfinis: si « <i>readingTime >= 5 AND domainName = "github.com"</i> » alors attribuer les étiquettes « <i>lecture longue, GitHub</i> »'
|
||||
how_to_use_them_description: 'Imaginons que voulez attribuer aux nouveaux articles l''étiquette « <i>lecture courte</i> » lorsque le temps de lecture est inférieur à 3 minutes.<br />Dans ce cas, vous devriez mettre « readingTime <= 3 » dans le champ <i>Règle</i> et « <i>lecture courte</i> » dans le champ <i>Tag</i>.<br />Plusieurs tags peuvent être ajoutés simultanément en les séparant par des virgules : « <i>lecture courte, à lire</i> »<br />Des règles complexes peuvent être créées en utilisant des opérateurs prédéfinis: si « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » alors attribuer les étiquettes « <i>lecture longue, php</i> »'
|
||||
variables_available_title: Quelles variables et opérateurs puis-je utiliser pour écrire des règles ?
|
||||
variables_available_description: 'Les variables et opérateurs suivants peuvent être utilisés pour écrire des règles d''étiquetage automatiques :'
|
||||
meaning: Signification
|
||||
@ -220,6 +221,7 @@ entry:
|
||||
starred: Articles favoris
|
||||
archived: Articles lus
|
||||
filtered: Articles filtrés
|
||||
with_annotations: Articles avec annotations
|
||||
filtered_tags: 'Articles filtrés par étiquettes :'
|
||||
filtered_search: 'Articles filtrés par recherche :'
|
||||
untagged: Article sans étiquette
|
||||
@ -243,6 +245,7 @@ entry:
|
||||
archived_label: Lus
|
||||
starred_label: Favoris
|
||||
unread_label: Non lus
|
||||
annotated_label: Annotés
|
||||
preview_picture_label: A une photo
|
||||
preview_picture_help: Photo
|
||||
is_public_label: A un lien public
|
||||
|
||||
@ -159,6 +159,7 @@ entry:
|
||||
archived_label: Arquivado
|
||||
status_label: Estado
|
||||
title: Filtros
|
||||
annotated_label: Anotado
|
||||
list:
|
||||
export_title: Exportar
|
||||
delete: Eliminar
|
||||
@ -172,6 +173,8 @@ entry:
|
||||
reading_time_minutes: 'tempo estimado de lectura: %readingTime% min'
|
||||
reading_time: tempo estimado de lectura
|
||||
number_on_the_page: '{0} Non hai entradas.|{1} Só hai unha entrada.|]1,Inf[ Hai %count% entradas.'
|
||||
show_same_domain: Mostrar artigos do mesmo dominio
|
||||
assign_search_tag: Asignar esta busca como etiqueta a cada resultado
|
||||
page_titles:
|
||||
all: Todas as entradas
|
||||
untagged: Entradas sen etiqueta
|
||||
@ -181,6 +184,8 @@ entry:
|
||||
archived: Artigos arquivados
|
||||
starred: Artigos con estrela
|
||||
unread: Artigos sen ler
|
||||
with_annotations: Entradas con anotacións
|
||||
same_domain: O mesmo dominio
|
||||
default_title: Título da entrada
|
||||
config:
|
||||
form_ignore_origin_rules:
|
||||
@ -203,7 +208,7 @@ config:
|
||||
title: PMF
|
||||
form_rules:
|
||||
faq:
|
||||
how_to_use_them_description: 'Demos por feito que queres etiquetar as novas entradas con « <i>lectura rápida</i> » cando o tempo de lectura non supera os 3 minutos.<br />Neste caso, tes que poñer « TempodeLectura <= 3 » no campo da <i>Regra</i> e « <i>lectura rápida</i> » no campo da <i>Etiqueta</i> .<br />Podes engadir varias etiquetas ó mesmo tempo separándoas cunha vírgula: « <i>lectura rápida, teño que ler</i> »<br />Pódense establecer regras complexas usando os operadores predefinidos: se o « <i>readingTime >= 5 AND domainName = "github.com"</i> » entón etiquetar como « <i>lectura longa, GitHub </i> »'
|
||||
how_to_use_them_description: 'Demos por feito que queres etiquetar as novas entradas con « <i>lectura rápida</i> » cando o tempo de lectura non supera os 3 minutos.<br />Neste caso, tes que poñer « TempodeLectura <= 3 » no campo da <i>Regra</i> e « <i>lectura rápida</i> » no campo da <i>Etiqueta</i> .<br />Podes engadir varias etiquetas ó mesmo tempo separándoas cunha vírgula: « <i>lectura rápida, teño que ler</i> »<br />Pódense establecer regras complexas usando os operadores predefinidos: se o « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » entón etiquetar como « <i>lectura longa, php</i> »'
|
||||
operator_description:
|
||||
notmatches: 'Comproba que o <i>obxecto</i> non contén a <i>busca</i> (non dif. maiúsculas).<br />Exemplo: <code>título non contén "saúde"</code>'
|
||||
matches: 'Comproba que un <i>obxecto</i> concorda coa <i>busca</i> (dif. maius.-minus.).<br />Exemplo: <code>título contén "saúde"</code>'
|
||||
@ -312,7 +317,7 @@ config:
|
||||
table_method: Método
|
||||
googleTwoFactor_label: Usando app OTP (usa unha app como andOTP, FreeOTP, Authy ou Google Authenticator, para obter o código único)
|
||||
emailTwoFactor_label: Utilizando email (recibirás código por email)
|
||||
login_label: Conexión (non se pode cambiar
|
||||
login_label: Identificador (non se pode cambiar)
|
||||
email_label: Email
|
||||
name_label: Nome
|
||||
two_factor_description: Se activas o segundo factor de autenticación recibirás un email cun código en cada nova conexión que aínda non verificases.
|
||||
@ -382,6 +387,7 @@ menu:
|
||||
archive: Arquivo
|
||||
starred: Con estrela
|
||||
unread: Sen ler
|
||||
with_annotations: Con notas
|
||||
security:
|
||||
register:
|
||||
go_to_account: Vai á túa conta
|
||||
@ -391,11 +397,11 @@ security:
|
||||
login:
|
||||
cancel: Cancelar
|
||||
password: Contrasinal
|
||||
username: Nome de usuaria
|
||||
register: Abre unha conta
|
||||
submit: Conectar
|
||||
username: Identificador
|
||||
register: Crea unha conta
|
||||
submit: Acceder
|
||||
forgot_password: Esqueceches o contrasinal?
|
||||
keep_logged_in: Manterme conectada
|
||||
keep_logged_in: Manter a sesión
|
||||
page_title: Benvida a wallabag!
|
||||
import:
|
||||
wallabag_v2:
|
||||
@ -449,6 +455,10 @@ import:
|
||||
elcurator:
|
||||
description: Este importador traerá todos os teus ficheiros de elCurator. Vai ós axustes na túa conta elCurator e após exporta o teu contido. Obterás un ficheiro JSON.
|
||||
page_title: Importar > elCurator
|
||||
delicious:
|
||||
page_title: Importar > del.icio.us
|
||||
how_to: Elixe a exportación de Delicious e preme no botón inferior para subilo e importalo.
|
||||
description: Este importador traerá tódolos teus marcadores Delicious. Desde 2021, podes exportar outra vez os teus datos usando a páxina de exportación (https://del.icio.us/export). Elixe o formato "JSON" e descárgao (de tipo "delicious_export.2021.02.06_21.10.json").
|
||||
export:
|
||||
unknown: Descoñecido
|
||||
footer_template: <div style="text-align:center;"><p>Producido por wallabag con %method%</p><p>Abre <a href="https://github.com/wallabag/wallabag/issues">un issue</a> se tes problemas para visualizar este E-Book no teu dispositivo.</p></div>
|
||||
@ -530,7 +540,7 @@ developer:
|
||||
paragraph_7: Esta chamada devolverá todas as entradas do teu usuario.
|
||||
paragraph_6: 'O access_token é útil para chamar ao punto de acceso da API. Por exemplo:'
|
||||
paragraph_5: 'A API responderá con algo semellante a:'
|
||||
paragraph_4: 'Agora, crea o token (substitúe client_id, client_secret, username e password cos valores axeitados):'
|
||||
paragraph_4: 'Agora, crea o token (substitúe client_id, client_secret, identificador e contrasinal cos valores axeitados):'
|
||||
paragraph_3: Para crear este token, tes que <a href="%link%">crear un novo cliente</a>.
|
||||
paragraph_2: Precisas un token para comunicarte entre a túa app de terceiros e a API de wallabag.
|
||||
paragraph_1: As seguintes ordes fan uso da <a href="https://github.com/jkbrzt/httpie">biblioteca HTTPie</a>. Comproba que está instalada no teu sistema antes de utilizala.
|
||||
@ -660,7 +670,7 @@ site_credential:
|
||||
save: Gardar
|
||||
password_label: Contrasinal
|
||||
host_label: Servidor (subdominio.exemplo.org, .exemplo.org, etc.)
|
||||
username_label: Conectar
|
||||
username_label: Identificador
|
||||
list:
|
||||
create_new_one: Crear unha nova credencial
|
||||
no: Non
|
||||
@ -673,7 +683,7 @@ site_credential:
|
||||
page_title: Xestión das credenciais do sitio
|
||||
user:
|
||||
search:
|
||||
placeholder: Filtrar por nome de usuaria ou email
|
||||
placeholder: Filtrar por identificador ou email
|
||||
form:
|
||||
back_to_list: Volver á lista
|
||||
delete_confirm: Tes a certeza?
|
||||
@ -681,14 +691,14 @@ user:
|
||||
save: Gardar
|
||||
twofactor_google_label: Segundo factor de autenticación por app OTP
|
||||
twofactor_email_label: Segundo factor de autenticación por email
|
||||
last_login_label: Última conexión
|
||||
last_login_label: Último acceso
|
||||
enabled_label: Activado
|
||||
email_label: Email
|
||||
plain_password_label: ????
|
||||
repeat_new_password_label: Repetir o novo contrasinal
|
||||
password_label: Contrasinal
|
||||
name_label: Nome
|
||||
username_label: Nome de usuaria
|
||||
username_label: Identificador
|
||||
list:
|
||||
create_new_one: Crear nova usuaria
|
||||
no: Non
|
||||
|
||||
@ -176,7 +176,7 @@ config:
|
||||
title: ČPP
|
||||
meaning: Značenje
|
||||
variables_available_title: Koje varijable i operateri mogu koristiti za pisanje pravila?
|
||||
how_to_use_them_description: 'Pretpostavimo da želiš označiti nove zapise kao <i>kratko čitanje</i> kad je vrijeme čitanja manje od 3 minute.<br />U tom slučaju, postavi „readingTime <= 3” u polju <i>Pravilo</i> i <i>kratko čitanje</i> u polju <i>Oznake</i>.<br />Moguće je dodati više oznaka istovremeno, odvajajući ih zarezom: „<i>kratko čitanje, moram čitati</i>”<br />Složena pravila mogu se napisati pomoću unaprijed definiranih operatora: ako „<i>readingTime >= 5 AND domainName = "github.com"</i>”, onda označi kao „<i>dugo čitanje, GitHub </i>”'
|
||||
how_to_use_them_description: 'Pretpostavimo da želiš označiti nove zapise kao <i>kratko čitanje</i> kad je vrijeme čitanja manje od 3 minute.<br />U tom slučaju, postavi „readingTime <= 3” u polju <i>Pravilo</i> i <i>kratko čitanje</i> u polju <i>Oznake</i>.<br />Moguće je dodati više oznaka istovremeno, odvajajući ih zarezom: „<i>kratko čitanje, moram čitati</i>”<br />Složena pravila mogu se napisati pomoću unaprijed definiranih operatora: ako „<i>readingTime >= 5 AND domainName = "www.php.net"</i>”, onda označi kao „<i>dugo čitanje, php</i>”'
|
||||
delete_rule_label: ukloni
|
||||
edit_rule_label: uredi
|
||||
if_label: ako
|
||||
|
||||
@ -129,7 +129,7 @@ config:
|
||||
tagging_rules_definition_title: A „címkézési szabályok” mit jelent?
|
||||
tagging_rules_definition_description: Ezek olyan szabályok amiket a Wallabag használ arra, hogy automatikusan felcímkézze az új bejegyzéseket.<br />Minden egyes alkalommal, amikor egy újabb bejegyzés hozzáadásra kerül, minden címkézési szabály fel lesz használva a beállított címkék hozzáadására, így mentve meg attól a problémától, hogy kézzel osztályozza a bejegyzéseit.
|
||||
how_to_use_them_title: Hogyan használhatom ezeket?
|
||||
how_to_use_them_description: 'Tételezzük fel, hogy szeretné az új bejegyzéseket úgy címkézni mint « <i>rövid olvasnivaló</i> », ha az elolvasási idejük 3 perc alatt van.<br />Ebben az esetben ezt írja be a <i>Szabály</i> mezőbe: « readingTime <= 3 », a <i>Címkék</i> mezőbe pedig: « <i>rövid olvasnivaló</i> ».<br />Több címke is hozzáadható egyszerre, ha vesszővel elválasztja őket: « <i>rövid olvasnivaló, el kell olvasni</i> »<br />Összetett szabályok írhatók előre definiált operátorok használatával: ha « <i>readingTime >= 5 AND domainName = "github.com"</i> » akkor címkézd meg mint « <i>hosszú olvasnivaló, GitHub</i> »'
|
||||
how_to_use_them_description: 'Tételezzük fel, hogy szeretné az új bejegyzéseket úgy címkézni mint « <i>rövid olvasnivaló</i> », ha az elolvasási idejük 3 perc alatt van.<br />Ebben az esetben ezt írja be a <i>Szabály</i> mezőbe: « readingTime <= 3 », a <i>Címkék</i> mezőbe pedig: « <i>rövid olvasnivaló</i> ».<br />Több címke is hozzáadható egyszerre, ha vesszővel elválasztja őket: « <i>rövid olvasnivaló, el kell olvasni</i> »<br />Összetett szabályok írhatók előre definiált operátorok használatával: ha « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » akkor címkézd meg mint « <i>hosszú olvasnivaló, php</i> »'
|
||||
variables_available_title: Milyen változókat és operátorokat használhatok a szabályok írásához?
|
||||
variables_available_description: 'A következő változók és operátorok használhatók címkézési szabályok létrehozásához:'
|
||||
meaning: Jelentés
|
||||
|
||||
@ -1,3 +1,10 @@
|
||||
security:
|
||||
login:
|
||||
page_title: Selamat datang di wallabag!
|
||||
keep_logged_in: Biarkan saya tetap masuk
|
||||
forgot_password: Lupa password?
|
||||
submit: Masuk
|
||||
register: Daftar
|
||||
username: Nama pengguna
|
||||
password: Password
|
||||
cancel: Batal
|
||||
|
||||
@ -140,7 +140,7 @@ config:
|
||||
tagging_rules_definition_title: Cosa significa «regole di etichettatura»?
|
||||
tagging_rules_definition_description: Sono regole utilizzate da wallabag per etichettare automaticamente i contenuti.<br />Ogni volta che viene aggiunto un contenuto, tutte le regole di etichettatura vengono utilizzate per aggiungere le etichette configurate, risparmiandoti il lavoro di classificare i contenuti manualmente.
|
||||
how_to_use_them_title: Come si usano?
|
||||
how_to_use_them_description: 'Diciamo che vuoi etichettare un contenuto come « <i>lettura veloce</i> » quando il tempo di lettura è inferiore ai 3 minuti.<br />In questo case, devi mettere « readingTime <= 3 » nel campo <i>Regola</i> e « <i>lettura veloce</i> » nel campo <i>Etichette</i>.<br />Molte etichette si possono aggiungere contemporanemente separandole con una virgola: « <i>lettura veloce, da leggere</i> »<br />Regole complesse possono essere scritte utilizzando gli operatori predefiniti: se « <i>readingTime >= 5 AND domainName = "github.com"</i> » allora etichetta « <i>lettura lunga, GitHub </i> »'
|
||||
how_to_use_them_description: 'Diciamo che vuoi etichettare un contenuto come « <i>lettura veloce</i> » quando il tempo di lettura è inferiore ai 3 minuti.<br />In questo case, devi mettere « readingTime <= 3 » nel campo <i>Regola</i> e « <i>lettura veloce</i> » nel campo <i>Etichette</i>.<br />Molte etichette si possono aggiungere contemporanemente separandole con una virgola: « <i>lettura veloce, da leggere</i> »<br />Regole complesse possono essere scritte utilizzando gli operatori predefiniti: se « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » allora etichetta « <i>lettura lunga, php</i> »'
|
||||
variables_available_title: Quali operatori e variabili posso utilizzare per scrivere delle regole?
|
||||
variables_available_description: 'I seguenti operatori e variabili posso essere utilizzati per scrivere regole di etichettatura:'
|
||||
meaning: Significato
|
||||
|
||||
@ -165,7 +165,7 @@ config:
|
||||
notmatches: <i>対象</i>が<i>検索</i>と一致しないことをテストする(大文字小文字の区別なし)。<br />例:<code>title notmatches "football"</code>
|
||||
matches: <i>対象</i>が<i>検索</i>と一致するかテストする(大文字小文字の区別なし)。<br />例:<code>title matches "football"</code>
|
||||
tagging_rules_definition_description: wallabag ではルールを使用することで新しい記事へ自動的にタグ付けする事ができます。<br />新しい記事が追加されるたびに、あなたが設定したすべてのタグ付けルールを使用してタグが追加されるので、記事を手動で分類する手間が省けます。
|
||||
how_to_use_them_description: 'あなたは読了時間が3分以下の時に新しい記事へ « <i>短い文章</i> » のタグ付けをしたいとします。<br />この場合、<i>ルール</i>に « readingTime <= 3 »と<i>タグ</i>に « <i>短い文章</i> » を設定します。<br />コンマで区切ることにより複数のタグを追加することができます: « <i>短い文章, 必読</i> »<br />演算子を使用することにより複雑なルールを書くことができます: もし « <i>readingTime >= 5 AND domainName = "github.com"</i> »ならばタグ付け « <i>長い文章, GitHub </i> »'
|
||||
how_to_use_them_description: 'あなたは読了時間が3分以下の時に新しい記事へ « <i>短い文章</i> » のタグ付けをしたいとします。<br />この場合、<i>ルール</i>に « readingTime <= 3 »と<i>タグ</i>に « <i>短い文章</i> » を設定します。<br />コンマで区切ることにより複数のタグを追加することができます: « <i>短い文章, 必読</i> »<br />演算子を使用することにより複雑なルールを書くことができます: もし « <i>readingTime >= 5 AND domainName = "www.php.net"</i> »ならばタグ付け « <i>長い文章, php</i> »'
|
||||
delete_rule_label: 削除
|
||||
export: エクスポート
|
||||
import_submit: インポート
|
||||
|
||||
@ -400,7 +400,7 @@ config:
|
||||
title: 문서 제목
|
||||
label: 변수
|
||||
tagging_rules_definition_description: wallabag 에서 자동으로 새 문서에 태그를 지정하는 데 사용하는 규칙입니다. <br /> 태그 지정 규칙이 새 문서가 추가 될 때마다 태그를 구성하는 데 사용되므로, 수동으로 분류하는 수고를 덜 수 있습니다.
|
||||
how_to_use_them_description: '읽기 시간이 3 분 미만인 경우 «<i> 짧은 읽기 </i>» 와 같은 새 기사에 태그를 지정한다고 가정합니다. <br />이 경우 <i> 규칙</i> 을 입력해야합니다. <i>태그</i> 필드에 « readingTime <= 3 » 을 입력하고 « <i>짧은 읽기</i>» 를 입력하십시오. <br /> 여러 태그를 쉼표로구분하여 한 번에 추가 할 수 있습니다: « <i> 짧은 읽기, 반드시 읽기</i> » <br /> 사전 정의 된 연산자를 사용하여 복잡한 규칙을 작성할 수 있습니다: 만약 « <i>readingTime >= 5 AND domainName = "github .com"</i> » 다음으로 태그 «<i> 긴 읽기, GitHub </i>»'
|
||||
how_to_use_them_description: '읽기 시간이 3 분 미만인 경우 «<i> 짧은 읽기 </i>» 와 같은 새 기사에 태그를 지정한다고 가정합니다. <br />이 경우 <i> 규칙</i> 을 입력해야합니다. <i>태그</i> 필드에 « readingTime <= 3 » 을 입력하고 « <i>짧은 읽기</i>» 를 입력하십시오. <br /> 여러 태그를 쉼표로구분하여 한 번에 추가 할 수 있습니다: « <i> 짧은 읽기, 반드시 읽기</i> » <br /> 사전 정의 된 연산자를 사용하여 복잡한 규칙을 작성할 수 있습니다: 만약 « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » 다음으로 태그 «<i> 긴 읽기, php</i>»'
|
||||
operator_description:
|
||||
and: 하나의 규칙 그리고 다른 규칙
|
||||
or: 하나의 규칙 또는 다른 규칙
|
||||
|
||||
@ -102,7 +102,7 @@ config:
|
||||
how_to_use_them_title: Hoe gebruik is ze?
|
||||
tagging_rules_definition_title: Wat betekend "label regels"?
|
||||
title: FAQ
|
||||
how_to_use_them_description: 'Laten we aannemen dat u nieuwe vermeldingen wilt labelen als « <i>korte lezing</i> » wanneer de leestijd minder dan 3 minuten bedraagt.<br />In dat geval moet u « readingTime <= 3 » in het <i>Regelveld</i> en « <i>korte lezing</i> » in het <i>Labels</i> veld.<br />Meerdere labels kunnen tegelijkertijd worden toegevoegd door ze te scheiden met een komma:« <i>korte lezing, belangrijk</i> »<br />Complexe regels kunnen worden geschreven met behulp van vooraf gedefinieerde operators: if « <i>readingTime >= 5 AND domainName = "github.com"</i> » label dan als« <i>lange lezing, GitHub </i> »'
|
||||
how_to_use_them_description: 'Laten we aannemen dat u nieuwe vermeldingen wilt labelen als « <i>korte lezing</i> » wanneer de leestijd minder dan 3 minuten bedraagt.<br />In dat geval moet u « readingTime <= 3 » in het <i>Regelveld</i> en « <i>korte lezing</i> » in het <i>Labels</i> veld.<br />Meerdere labels kunnen tegelijkertijd worden toegevoegd door ze te scheiden met een komma:« <i>korte lezing, belangrijk</i> »<br />Complexe regels kunnen worden geschreven met behulp van vooraf gedefinieerde operators: if « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » label dan als« <i>lange lezing, php</i> »'
|
||||
tags_label: Labels
|
||||
rule_label: Regel
|
||||
edit_rule_label: wijzig
|
||||
|
||||
@ -136,7 +136,7 @@ config:
|
||||
tagging_rules_definition_title: Qué significa las règlas d'etiquetas automaticas ?
|
||||
tagging_rules_definition_description: Son de règlas utilizadas per wallabag per classar automaticament vòstres novèls articles.<br />Cada còp qu'un novèl article es apondut, totas las règlas d'etiquetas automaticas seràn utilizadas per ajustar d'etiquetas qu'avètz configuradas, en vos esparnhant l'esfòrç de classificar vòstres articles manualament.
|
||||
how_to_use_them_title: Cossí las utilizar ?
|
||||
how_to_use_them_description: Imaginem que volètz atribuir als novèls article l'etiqueta « <i>lectura corta</i> » quand lo temps per legir es inferior a 3 minutas.<br />Dins aquel cas, deuriatz metre « readingTime <= 3 » dins lo camp <i>Règla</i> e « <i>lectura corta</i> » dins lo camp <i>Etiqueta</i>.<br />Mai d'una etiquetas pòdon èsser apondudas simultanèament ne las separant amb de virgulas : « <i>lectura corta, per ligir</i> »<br />De règlas complèxas pòdon èsser creadas n'emplegant d'operators predefinits : se « <i>readingTime >= 5 AND domainName = "github.com"</i> » alara atribuir las etiquetas « <i>lectura longa, github </i> »
|
||||
how_to_use_them_description: Imaginem que volètz atribuir als novèls article l'etiqueta « <i>lectura corta</i> » quand lo temps per legir es inferior a 3 minutas.<br />Dins aquel cas, deuriatz metre « readingTime <= 3 » dins lo camp <i>Règla</i> e « <i>lectura corta</i> » dins lo camp <i>Etiqueta</i>.<br />Mai d'una etiquetas pòdon èsser apondudas simultanèament ne las separant amb de virgulas : « <i>lectura corta, per ligir</i> »<br />De règlas complèxas pòdon èsser creadas n'emplegant d'operators predefinits : se « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » alara atribuir las etiquetas « <i>lectura longa, php</i> »
|
||||
variables_available_title: Quinas variablas e operators pòdi utilizar per escriure de règlas ?
|
||||
variables_available_description: "Las variablas e operators seguents pòdon èsser utilizats per escriure de règlas d'etiquetas automaticas :"
|
||||
meaning: Significacion
|
||||
|
||||
@ -150,7 +150,7 @@ config:
|
||||
tagging_rules_definition_title: Co oznaczają « reguły tagowania » ?
|
||||
tagging_rules_definition_description: Istnieją reguły używane przez wallabag służące do automatycznego tagowania nowych wpisów.<br />Za każdym razem kiedy dodasz nowy wpis, zostaną użyte wszystkie skonfigurowane przez ciebie reguły. Dzięki temu unikniesz konieczności ręcznego ich klasyfikowania.
|
||||
how_to_use_them_title: Jak ich użyć?
|
||||
how_to_use_them_description: 'Załóżmy, że chcesz otagować nowe wpisy jako « <i>krótki tekst</i> » jeżeli czas czytania wynosi mniej niż 3 minuty.<br />W tym przypadku powinieneś umieścić « czasCzytania <= 3 » w polu <i>Reguła</i> i « <i>krótki tekst</i> » w polu <i>Tags</i> .<br />Wiele tagów może zostać dodanych jednocześnie rozdzielając je przecinkami: « <i>do szybkiego przeczytania, koniecznie przeczytać</i> »<br />Kompleksowe reguły mogą być napisane przy użyciu operatorów: jeżeli « <i>czasCzytania >= 5 I nazwaDomeny = "github.com"</i> » wtedy otaguj jako « <i>dłuższy tekst, GitHub </i> »'
|
||||
how_to_use_them_description: 'Załóżmy, że chcesz otagować nowe wpisy jako « <i>krótki tekst</i> » jeżeli czas czytania wynosi mniej niż 3 minuty.<br />W tym przypadku powinieneś umieścić « czasCzytania <= 3 » w polu <i>Reguła</i> i « <i>krótki tekst</i> » w polu <i>Tags</i> .<br />Wiele tagów może zostać dodanych jednocześnie rozdzielając je przecinkami: « <i>do szybkiego przeczytania, koniecznie przeczytać</i> »<br />Kompleksowe reguły mogą być napisane przy użyciu operatorów: jeżeli « <i>czasCzytania >= 5 I nazwaDomeny = "www.php.net"</i> » wtedy otaguj jako « <i>dłuższy tekst, php</i> »'
|
||||
variables_available_title: Jakich zmiennych i operatorów mogę użyć przy pisaniu reguł?
|
||||
variables_available_description: 'Następujące zmienne i operatory mogą być użyte przy tworzeniu reguł tagowania:'
|
||||
meaning: Znaczenie
|
||||
|
||||
@ -24,17 +24,23 @@ menu:
|
||||
internal_settings: 'Configurações Internas'
|
||||
import: 'Importar'
|
||||
howto: 'How to'
|
||||
logout: 'Sair'
|
||||
logout: 'Encerrar sessão'
|
||||
about: 'Sobre'
|
||||
search: 'Pesquisa'
|
||||
save_link: 'Salvar um link'
|
||||
back_to_unread: 'Voltar para os artigos não lidos'
|
||||
users_management: 'Gestão de Utilizadores'
|
||||
theme_toggle_light: Tema claro
|
||||
theme_toggle_dark: Tema escuro
|
||||
theme_toggle_auto: Tema automático
|
||||
developer: Gestão de clientes da API
|
||||
top:
|
||||
add_new_entry: 'Adicionar uma nova entrada'
|
||||
search: 'Pesquisa'
|
||||
filter_entries: 'Filtrar entradas'
|
||||
export: 'Exportar'
|
||||
random_entry: Saltar para uma entrada aleatória dessa lista
|
||||
account: Conta
|
||||
search_form:
|
||||
input_label: 'Digite aqui sua pesquisa'
|
||||
footer:
|
||||
@ -49,12 +55,15 @@ config:
|
||||
tab_menu:
|
||||
settings: 'Configurações'
|
||||
rss: 'RSS'
|
||||
user_info: 'Informação do Utilizador'
|
||||
user_info: 'Informação do utilizador'
|
||||
password: 'Palavra-passe'
|
||||
rules: 'Regras de tags'
|
||||
new_user: 'Adicionar um utilizador'
|
||||
ignore_origin: Ignorar regras da origem
|
||||
reset: Área de reinicialização
|
||||
feed: Feeds
|
||||
form:
|
||||
save: 'Salvar'
|
||||
save: 'Guardar'
|
||||
form_settings:
|
||||
theme_label: 'Tema'
|
||||
items_per_page_label: 'Itens por página'
|
||||
@ -67,6 +76,8 @@ config:
|
||||
300_word: 'Posso ler ~300 palavras por minuto'
|
||||
400_word: 'Posso ler ~400 palavras por minuto'
|
||||
pocket_consumer_key_label: 'Chave do consumidor do Pocket para importar conteúdo'
|
||||
help_theme: o wallabag é personalizável. Pode escolher o tema que pretender aqui.
|
||||
help_pocket_consumer_key: Necessário para importar do Pocket. Pode criá-lo na sua conta do Pocket.
|
||||
form_rss:
|
||||
description: 'Feeds RSS providos pelo wallabag permitem que você leia seus artigos salvos em seu leitor de RSS favorito. Você precisa gerar um token primeiro.'
|
||||
token_label: 'Token RSS'
|
||||
@ -100,7 +111,7 @@ config:
|
||||
tagging_rules_definition_title: 'O que as « regras de tags » significam?'
|
||||
tagging_rules_definition_description: 'São regras usadas pelo Wallabag para automaticamente adicionar tags em novos artigos.<br />Cada vez que um novo artigo é adicionado, todas as regras de tags podem ser usadas para adicionar as tags que você configurou, ajudando-o com o problema de classificar manualmente seus artigos.'
|
||||
how_to_use_them_title: 'Como eu as utilizo?'
|
||||
how_to_use_them_description: 'Vamos dizer que você deseja adicionar a tag « <i>leitura rápida</i> » quando o tempo de leitura for menor que 3 minutos.<br />Neste caso, você deve « readingTime <= 3 » no campo <i>Regra</i> e « <i>leitura rápida</i> » no campo <i>Tags</i>.<br />Diversas tags podem ser adicionadas simultâneamente separando-as com vírgula: « <i>leitura rápida, precisa ser lido</i> »<br />Regras complexas podem ser escritas usando os seguintes operadores pré-definidos: if « <i>readingTime >= 5 AND domainName = "github.com"</i> » então adicione a tag « <i>leitura longa, github </i> »'
|
||||
how_to_use_them_description: 'Vamos dizer que você deseja adicionar a tag « <i>leitura rápida</i> » quando o tempo de leitura for menor que 3 minutos.<br />Neste caso, você deve « readingTime <= 3 » no campo <i>Regra</i> e « <i>leitura rápida</i> » no campo <i>Tags</i>.<br />Diversas tags podem ser adicionadas simultâneamente separando-as com vírgula: « <i>leitura rápida, precisa ser lido</i> »<br />Regras complexas podem ser escritas usando os seguintes operadores pré-definidos: if « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » então adicione a tag « <i>leitura longa, php</i> »'
|
||||
variables_available_title: 'Quais variáveis e operadores eu posso usar para escrever regras?'
|
||||
variables_available_description: 'As seguintes variáveis e operadores podem ser usados para criar regras de tags:'
|
||||
meaning: ''
|
||||
@ -126,6 +137,10 @@ config:
|
||||
or: 'Uma regra OU outra'
|
||||
and: 'Uma regra E outra'
|
||||
matches: 'Testa que um <i>assunto</i> corresponde a uma <i>pesquisa</i> (maiúscula ou minúscula).<br />Exemplo: <code>título corresponde a "futebol"</code>'
|
||||
form_feed:
|
||||
feed_link:
|
||||
all: Todos
|
||||
feed_limit: Número de itens no feed
|
||||
entry:
|
||||
default_title: 'Título da entrada'
|
||||
page_titles:
|
||||
|
||||
@ -150,7 +150,7 @@ config:
|
||||
tagging_rules_definition_title: 'Что значит "правила тегирования"?'
|
||||
tagging_rules_definition_description: 'Правила, по которым wallabag автоматически добавит теги для новых записей.<br />Каждый раз, при добавлении новых записей, будут проставляться теги к записям, согласно настроенным правилам тегирования, это избавит Вас от необходимости проставлять теги для каждой записи вручную.'
|
||||
how_to_use_them_title: 'Как мне их использовать?'
|
||||
how_to_use_them_description: 'Предположим, вы хотите пометить новые записи как "<i>короткая</i>", когда на чтение уйдет меньше 3 минут.<br />В этом случае, установите " readingTime <= 3 " в поле <i>Правила</i> и "<i>короткая</i>" в поле <i>Теги</i>.<br />Несколько тегов могут добавляться одновременно, разделяя их запятой: "<i>короткая, прочитать обязательно</i>" <br />Сложные правила могут быть записаны с использованием предопределенных операторов: если "<i>readingTime >= 5 AND domainName = \"github.com\"</i> " тогда тег будет "<i>долго читать, GitHub </i>"'
|
||||
how_to_use_them_description: 'Предположим, вы хотите пометить новые записи как "<i>короткая</i>", когда на чтение уйдет меньше 3 минут.<br />В этом случае, установите " readingTime <= 3 " в поле <i>Правила</i> и "<i>короткая</i>" в поле <i>Теги</i>.<br />Несколько тегов могут добавляться одновременно, разделяя их запятой: "<i>короткая, прочитать обязательно</i>" <br />Сложные правила могут быть записаны с использованием предопределенных операторов: если "<i>readingTime >= 5 AND domainName = \"www.php.net\"</i> " тогда тег будет "<i>долго читать, php</i>"'
|
||||
variables_available_title: 'Какие переменные и операторы я могу использовать для написания правил?'
|
||||
variables_available_description: 'Следующие переменные и операторы могут использоваться для создания правил тегов:'
|
||||
meaning: 'Смысл'
|
||||
|
||||
@ -124,7 +124,7 @@ config:
|
||||
tagging_rules_definition_title: 'ข้อบังคับการแท็กคืออะไร?'
|
||||
tagging_rules_definition_description: 'การใช้ข้อบังคับโดย Wallabag ไปแท็กรายการใหม่อัตโนมัติ <br />แต่ละช่วงรายการใหม่จะเป็นการเพิ่ม, การแท็กข้อบังคับทั้งหมดจะใช้การเพิ่มแท็กที่คุณกำหนดค่า, ดังนั้นการบันทึกของคุณจะเป็นปัญหาในการจัดหมวดหมู่ของรายการของคุณ'
|
||||
how_to_use_them_title: 'ฉันจะใช้ได้อย่างไร?'
|
||||
how_to_use_them_description: 'การสมมติที่คุณต้องการแท็กรายการใหม่ไปยัง « <i>การอ่านแบบสั้น</i> » เมื่ออ่านในช่วง 3 นาที <br />ในกรณีนี้, คุณควรใส่ « readingTime <= 3 » ภายใน <i>ข้อบังคับ</i> ของพื่นที่และ « <i>การอ่านแบบสั้น</i> » ภายใน <i>แท็ก</i> ของพื้นที่<br />ในหลายแท็กสามารถเพิ่มได้พร้อมกันโดยแบ่งกับ comma: « <i>การอ่านแบบสั้น, ต้องอ่าน</i> »<br />ข้อบังคับที่ซับซ้อนสามารถเขียนโดยการใช้การดำเนินการที่กำหนดไว้ก่อน: ถ้า « <i>readingTime >= 5 AND domainName = "github.com"</i> » ดังนั้นแท็กไปยัง « <i>การอ่านแบบยาว, github </i> »'
|
||||
how_to_use_them_description: 'การสมมติที่คุณต้องการแท็กรายการใหม่ไปยัง « <i>การอ่านแบบสั้น</i> » เมื่ออ่านในช่วง 3 นาที <br />ในกรณีนี้, คุณควรใส่ « readingTime <= 3 » ภายใน <i>ข้อบังคับ</i> ของพื่นที่และ « <i>การอ่านแบบสั้น</i> » ภายใน <i>แท็ก</i> ของพื้นที่<br />ในหลายแท็กสามารถเพิ่มได้พร้อมกันโดยแบ่งกับ comma: « <i>การอ่านแบบสั้น, ต้องอ่าน</i> »<br />ข้อบังคับที่ซับซ้อนสามารถเขียนโดยการใช้การดำเนินการที่กำหนดไว้ก่อน: ถ้า « <i>readingTime >= 5 AND domainName = "www.php.net"</i> » ดังนั้นแท็กไปยัง « <i>การอ่านแบบยาว, php</i> »'
|
||||
variables_available_title: 'ตัวแปรและตัวดำเนินการสามารถให้ใช้การเขียนข้อบังคับได้ที่ไหน?'
|
||||
variables_available_description: 'การติดตามตัวแปรและตัวดำเนินการสามารถใช้การสร้างข้อบังคับแท็ก:'
|
||||
meaning: 'ความหมาย'
|
||||
|
||||
@ -164,7 +164,7 @@ config:
|
||||
matches: '<i>konu</i>nun <i>arama</i> kriterine (büyük küçük harf duyarsız) eşleştiğini test eder.<br />Örnek: <code>title matches "futbol"</code>'
|
||||
notmatches: '<i>konu</i>nun <i>arama</i> kriterine (büyük küçük harf duyarsız) eşleşmediğini test eder.<br />Örnek: <code>title nonmatches "futbol"</code>'
|
||||
tagging_rules_definition_description: Bunlar wallabag'in yeni makaleleri otomatik olarak etiketleyebilmesi için tanımlanmış kurallardır.<br />Her yeni makale eklendiğinde, ayarladığınız tüm etiket kuralları kullanılarak makaleniz etiketlenecektir. Bu sayede her bir makaleyi tek tek etiketlemekle uğraşmanız gerekmeyecek.
|
||||
how_to_use_them_description: 'Örneğin, 3 dakikadan kısa okuma süresi olan yeni makaleleri « <i>kısa okumalar</i>» etiketi ile etiketlemek istiyorsunuz diyelim.<br />Bu durumda, <i>Kural</i> alanına « readingTime < = 3 » değeri, ve de <i>Etiketler</i> alanına da <i>kısa okumalar</i> değerini girmelisiniz.<br /> Eğer birden fazla etiket tanımlamak istiyorsanız arasına virgül koyabilirsiniz: « <i>kısa okumalar, mutlaka oku</i> »<br />Daha kompleks kurallar önden tanımlanmış operatörlerle girilebilir: Eğer « <i> readingTime > = AND domainName = "github.com"</i> » ise, o zaman « <i>uzun okumalar, GitHub</i> » gibi girebilirsiniz'
|
||||
how_to_use_them_description: 'Örneğin, 3 dakikadan kısa okuma süresi olan yeni makaleleri « <i>kısa okumalar</i>» etiketi ile etiketlemek istiyorsunuz diyelim.<br />Bu durumda, <i>Kural</i> alanına « readingTime < = 3 » değeri, ve de <i>Etiketler</i> alanına da <i>kısa okumalar</i> değerini girmelisiniz.<br /> Eğer birden fazla etiket tanımlamak istiyorsanız arasına virgül koyabilirsiniz: « <i>kısa okumalar, mutlaka oku</i> »<br />Daha kompleks kurallar önden tanımlanmış operatörlerle girilebilir: Eğer « <i> readingTime > = AND domainName = "www.php.net"</i> » ise, o zaman « <i>uzun okumalar, php</i> » gibi girebilirsiniz'
|
||||
if_label: eğer
|
||||
then_tag_as_label: ise, şu şekilde etiketle
|
||||
delete_rule_label: sil
|
||||
|
||||
@ -37,6 +37,7 @@ menu:
|
||||
theme_toggle_auto: 自动根据系统设置应用主题
|
||||
theme_toggle_dark: 深色主题
|
||||
theme_toggle_light: 浅色主题
|
||||
with_annotations: 带注释
|
||||
top:
|
||||
add_new_entry: '添加新项目'
|
||||
search: '搜索'
|
||||
@ -160,7 +161,7 @@ config:
|
||||
tagging_rules_definition_title: '“标签规则”是什么意思?'
|
||||
tagging_rules_definition_description: '它们是 wallabag 用来给新项目自动打上标签的规则。<br />每当一个新项目被添加进来,所有标签规则都会作用于这个项目,为它打上你配置好的标签,免去你手动分类的麻烦。'
|
||||
how_to_use_them_title: '我该怎么使用它们?'
|
||||
how_to_use_them_description: '假设你想要将一个阅读时间短于 3 分钟的新项目标记为“ <i>短阅读</i> ”。<br /> 你应该在 <i>规则</i> 区域输入“readingTime <= 3”,并在 <i>标签</i> 区域输入“<i>短阅读</i>”。<br /> 可以同时添加数个标签,只需要用半角逗号来隔开它们,如:“<i>短阅读, 必读</i>”<br /> 可以使用预定义的操作符来编写复杂的规则,如:如果“ <i>readingTime >= 5 AND domainName ="github.com"</i>”则标记为“<i>长阅读, github</i>”'
|
||||
how_to_use_them_description: '假设你想要将一个阅读时间短于 3 分钟的新项目标记为“ <i>短阅读</i> ”。<br /> 你应该在 <i>规则</i> 区域输入“readingTime <= 3”,并在 <i>标签</i> 区域输入“<i>短阅读</i>”。<br /> 可以同时添加数个标签,只需要用半角逗号来隔开它们,如:“<i>短阅读, 必读</i>”<br /> 可以使用预定义的操作符来编写复杂的规则,如:如果“ <i>readingTime >= 5 AND domainName ="www.php.net"</i>”则标记为“<i>长阅读, php</i>”'
|
||||
variables_available_title: '我可以使用哪些变量和操作符来编写规则?'
|
||||
variables_available_description: '可以使用以下变量和操作符来编写标签规则:'
|
||||
meaning: '含义'
|
||||
@ -240,6 +241,8 @@ entry:
|
||||
filtered_search: '根据搜索筛选:'
|
||||
untagged: '无标签项目'
|
||||
all: '所有项目'
|
||||
with_annotations: 带注释的条目
|
||||
same_domain: 同一域名
|
||||
list:
|
||||
number_on_the_page: '{0} 没有对应项目。|{1} 有 1 个项目。|]1,Inf[ 有 %count% 个项目。'
|
||||
reading_time: '预计阅读时间'
|
||||
@ -253,6 +256,8 @@ entry:
|
||||
toogle_as_star: '添加到收藏'
|
||||
delete: '删除'
|
||||
export_title: '导出'
|
||||
assign_search_tag: 将此搜索作为标签分配给每个结果
|
||||
show_same_domain: 显示同一域名的文章
|
||||
filters:
|
||||
title: '筛选器'
|
||||
status_label: '状态'
|
||||
@ -277,6 +282,7 @@ entry:
|
||||
action:
|
||||
clear: '清除'
|
||||
filter: '筛选'
|
||||
annotated_label: 已注释
|
||||
view:
|
||||
left_menu:
|
||||
back_to_top: '返回顶部'
|
||||
@ -534,6 +540,10 @@ import:
|
||||
page_title: "导入 > Pinboard"
|
||||
description: '这个导入器会导入你 Pinboard 账户中的所有内容。 在 backup 页面(https://pinboard.in/settings/backup),点击 "Bookmarks" 一栏下的 "JSON"。你将会下载得到一个 JSON 文件(比如"pinboard_export")。'
|
||||
how_to: '请选择你的 Pinboard 导出文件并点击下方按钮来上传和导入它。'
|
||||
delicious:
|
||||
how_to: 请选择你的 Delicious 导出,点击下面的按钮上传并导入。
|
||||
page_title: 导入 > del.icio.us
|
||||
description: 此导入器将导入你所有的 Delicious 书签。 自 2021 年起,你可以使用导出页面 (https://del.icio.us/export) 再次从中导出数据。 选择“JSON”格式并下载(如“delicious_export.2021.02.06_21.10.json”)。
|
||||
developer:
|
||||
page_title: 'API 客户端管理'
|
||||
welcome_message: '欢迎来到 wallabag API'
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
<a href="javascript: void(null);" id="download-form-close" class="close-button--popup close-button">×</a>
|
||||
<ul>
|
||||
{% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">EPUB</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI (deprecated)</a></li>{% endif %}
|
||||
{% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">PDF</a></li>{% endif %}
|
||||
{% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">JSON</a></li>{% endif %}
|
||||
{% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">CSV</a></li>{% endif %}
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
{% if craue_setting('carrot') %}<li><a href="https://secure.carrot.org/GiveAndGetBack.do?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}" class="tool carrot icon-image icon-image--carrot" target="_blank" rel="noopener" title="carrot"><span>Carrot</span></a></li>{% endif %}
|
||||
{% if craue_setting('show_printlink') %}<li><a title="{{ 'entry.view.left_menu.print'|trans }}" class="tool icon icon-print" href="javascript: window.print();"><span>{{ 'entry.view.left_menu.print'|trans }}</span></a></li>{% endif %}
|
||||
{% if craue_setting('export_epub') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'epub' }) }}" title="Generate ePub file">EPUB</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'mobi' }) }}" title="Generate Mobi file">MOBI</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'mobi' }) }}" title="Generate Mobi file">MOBI (deprecated)</a></li>{% endif %}
|
||||
{% if craue_setting('export_pdf') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'pdf' }) }}" title="Generate PDF file">PDF</a></li>{% endif %}
|
||||
<li><a href="mailto:siteconfig@wallabag.org?subject=Wrong%20display%20in%20wallabag&body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.label'|trans }}" class="tool bad-display icon icon-delete"><span>{{ 'entry.view.left_menu.problem.label'|trans }}</span></a></li>
|
||||
</ul>
|
||||
|
||||
@ -57,6 +57,11 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block messages %}
|
||||
<div style="margin-top: 10px; color: #e01a15; border-left: 20px #e01a15 solid; padding-left: 10px; border-bottom: 6px #e01a15 solid; border-bottom-left-radius: 10px;">
|
||||
<h3>⚠️ You are using the Baggy theme which is now deprecated.</h3>
|
||||
<p>It will be removed in the next version. You can use the Material theme by <a href="{{ path('config') }}">updating the theme config</a>.</p>
|
||||
</div>
|
||||
|
||||
{% for flashMessage in app.session.flashbag.get('notice') %}
|
||||
<div class="messages success">
|
||||
<a href="#" class="closeMessage">×</a>
|
||||
|
||||
@ -12,6 +12,10 @@
|
||||
{{ 'entry.page_titles.filtered_tags'|trans }} {{ filter }}
|
||||
{% elseif currentRoute == 'untagged' %}
|
||||
{{ 'entry.page_titles.untagged'|trans }}
|
||||
{% elseif currentRoute == 'same_domain' %}
|
||||
{{ 'entry.page_titles.same_domain'|trans }}
|
||||
{% elseif currentRoute == 'annotated' %}
|
||||
{{ 'entry.page_titles.with_annotations'|trans }}
|
||||
{% else %}
|
||||
{{ 'entry.page_titles.unread'|trans }}
|
||||
{% endif %}
|
||||
|
||||
@ -11,8 +11,8 @@
|
||||
<title>wallabag — {{type}} {{ tag }} feed</title>
|
||||
<subtitle type="html">Atom feed for entries tagged with {{ tag }}</subtitle>
|
||||
{% endif %}
|
||||
{% if entries | length > 0 %}
|
||||
<updated>{{ (entries | first).createdAt | date('c') }}</updated> {# Indicates the last time the feed was modified in a significant way. #}
|
||||
{% if updated %}
|
||||
<updated>{{ updated | date('c') }}</updated> {# Indicates the last time the feed was modified in a significant way. #}
|
||||
{% endif %}
|
||||
<link rel="self" type="application/atom+xml" href="{{ app.request.uri }}"/>
|
||||
{% if entries.hasPreviousPage %}
|
||||
|
||||
@ -9,9 +9,16 @@
|
||||
|
||||
<ul class="tools right">
|
||||
<li>
|
||||
<a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a>
|
||||
<a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
|
||||
<a title="{{ 'entry.list.delete'|trans }}" onclick="return confirm('{{ 'entry.confirm.delete'|trans|escape('js') }}')" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a>
|
||||
<a title="{{ 'entry.list.show_same_domain'|trans }}" class="tool grey-text" href="{{ path('same_domain', { 'id': entry.id }) }}" data-action="same_domain" data-entry-id="{{ entry.id }}"><i class="material-icons">language</i></a>
|
||||
</li>
|
||||
<li>
|
||||
<a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}" data-action="archived" data-entry-id="{{ entry.id }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a>
|
||||
</li>
|
||||
<li>
|
||||
<a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}" data-action="star" data-entry-id="{{ entry.id }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
|
||||
</li>
|
||||
<li>
|
||||
<a title="{{ 'entry.list.delete'|trans }}" data-action-confirm="{{ 'entry.confirm.delete'|trans }}" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}" data-action="delete" data-entry-id="{{ entry.id }}"><i class="material-icons">delete</i></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<div class="card{% if currentRoute in routes and entry.isArchived %} archived{% endif %}">
|
||||
<div class="card entry-card{% if currentRoute in routes and entry.isArchived %} archived{% endif %}">
|
||||
<div class="card-body">
|
||||
<div class="card-fullimage">
|
||||
<ul class="card-entry-labels">
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
{% include "@WallabagCore/themes/material/Entry/Card/_content.html.twig" with {'entry': entry, 'withMetadata': true, 'subClass': 'metadata'} only %}
|
||||
<ul class="tools-list hide-on-small-only">
|
||||
<li>
|
||||
<a title="{{ 'entry.list.show_same_domain'|trans }}" class="tool grey-text" href="{{ path('same_domain', { 'id': entry.id }) }}"><i class="material-icons">language</i></a>
|
||||
<a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a>
|
||||
<a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
|
||||
<a title="{{ 'entry.list.delete'|trans }}" onclick="return confirm('{{ 'entry.confirm.delete'|trans|escape('js') }}')" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<div class="card{% if currentRoute in routes and entry.isArchived %} archived{% endif %}">
|
||||
<div class="card entry-card{% if currentRoute in routes and entry.isArchived %} archived{% endif %}">
|
||||
<div class="card-body">
|
||||
<div class="card-image waves-effect waves-block waves-light">
|
||||
<ul class="card-entry-labels">
|
||||
|
||||
@ -34,14 +34,14 @@
|
||||
{% include "@WallabagCore/themes/common/Entry/_feed_link.html.twig" %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if currentRoute == 'search' %}<div><a href="{{ path('tag_this_search', {'filter': searchTerm, 'currentRoute': app.request.get('currentRoute') }) }}" title="{{ 'entry.list.assign_search_tag'|trans }}">{{ 'entry.list.assign_search_tag'|trans }}</a></div>{% endif %}
|
||||
{% if entries.getNbPages > 1 %}
|
||||
{{ pagerfanta(entries, 'twitter_bootstrap_translated', {'proximity': 1}) }}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<ul class="{% if listMode == 1 %}collection{% else %}row data{% endif %}">
|
||||
|
||||
<li class="mass-buttons">
|
||||
{% if listMode == 1 %}
|
||||
<div class="mass-buttons">
|
||||
{% if entries.count > 0 and listMode == 1 %}
|
||||
<span>
|
||||
<input id="selectAll" type="checkbox" data-toggle="[data-js='entry-checkbox']" data-js="checkboxes-toggle" />
|
||||
@ -53,10 +53,13 @@
|
||||
<button class="btn cyan darken-1" type="submit" name="delete" onclick="return confirm('{{ 'entry.confirm.delete_entries'|trans|escape('js') }}')" title="{{ 'entry.list.delete'|trans }}"><i class="material-icons">delete</i></button>
|
||||
</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<ol class="entries {% if listMode == 1 %}collection{% else %}row entries-row data{% endif %}">
|
||||
|
||||
{% for entry in entries %}
|
||||
<li id="entry-{{ entry.id|e }}" class="entry col {% if listMode == 0 %}l3 m6{% else %}collection-item{% endif %} s12">
|
||||
<li id="entry-{{ entry.id|e }}" class="{% if listMode != 0 %}col collection-item{% endif %} s12" data-entry-id="{{ entry.id|e }}" data-test="entry">
|
||||
{% if listMode == 1 %}
|
||||
{% include "@WallabagCore/themes/material/Entry/_card_list.html.twig" with {'entry': entry, 'currentRoute': currentRoute, 'routes': entriesWithArchivedClassRoutes} only %}
|
||||
{% elseif not entry.previewPicture is null and entry.mimetype starts with 'image/' %}
|
||||
@ -66,7 +69,7 @@
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</ol>
|
||||
</form>
|
||||
|
||||
{% if entries.getNbPages > 1 %}
|
||||
@ -89,7 +92,7 @@
|
||||
<h4 class="center">{{ 'entry.list.export_title'|trans }}</h4>
|
||||
<ul>
|
||||
{% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">EPUB</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI (deprecated)</a></li>{% endif %}
|
||||
{% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">PDF</a></li>{% endif %}
|
||||
{% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">JSON</a></li>{% endif %}
|
||||
{% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">CSV</a></li>{% endif %}
|
||||
@ -131,6 +134,11 @@
|
||||
{{ form_label(form.isUnread) }}
|
||||
</div>
|
||||
|
||||
<div class="input-field col s12 with-checkbox">
|
||||
{{ form_widget(form.isAnnotated) }}
|
||||
{{ form_label(form.isAnnotated) }}
|
||||
</div>
|
||||
|
||||
<div class="col s12">
|
||||
<label>{{ 'entry.filters.preview_picture_help'|trans }}</label>
|
||||
</div>
|
||||
|
||||
@ -231,7 +231,7 @@
|
||||
<div class="collapsible-body">
|
||||
<ul>
|
||||
{% if craue_setting('export_epub') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'epub' }) }}" title="Generate ePub file">EPUB</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'mobi' }) }}" title="Generate Mobi file">MOBI</a></li>{% endif %}
|
||||
{% if craue_setting('export_mobi') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'mobi' }) }}" title="Generate Mobi file">MOBI (deprecated)</a></li>{% endif %}
|
||||
{% if craue_setting('export_pdf') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'pdf' }) }}" title="Generate PDF file">PDF</a></li>{% endif %}
|
||||
{% if craue_setting('export_csv') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'csv' }) }}" title="Generate CSV file">CSV</a></li>{% endif %}
|
||||
{% if craue_setting('export_json') %}<li><a href="{{ path('export_entry', { 'id': entry.id, 'format': 'json' }) }}" title="Generate JSON file">JSON</a></li>{% endif %}
|
||||
|
||||
@ -40,6 +40,8 @@
|
||||
{% set activeRoute = null %}
|
||||
{% if currentRoute == 'all' or currentRouteFromQueryParams == 'all' %}
|
||||
{% set activeRoute = 'all' %}
|
||||
{% elseif currentRoute == 'annotated' or currentRouteFromQueryParams == 'annotated' %}
|
||||
{% set activeRoute = 'annotated' %}
|
||||
{% elseif currentRoute == 'archive' or currentRouteFromQueryParams == 'archive' %}
|
||||
{% set activeRoute = 'archive' %}
|
||||
{% elseif currentRoute == 'starred' or currentRouteFromQueryParams == 'starred' %}
|
||||
@ -59,6 +61,9 @@
|
||||
<li class="bold {% if activeRoute == 'archive' %}active{% endif %}">
|
||||
<a class="waves-effect" href="{{ path('archive') }}">{{ 'menu.left.archive'|trans }} <span class="numberItems grey-text">{{ count_entries('archive') }}</span></a>
|
||||
</li>
|
||||
<li class="bold {% if activeRoute == 'annotated' %}active{% endif %}">
|
||||
<a class="waves-effect" href="{{ path('annotated') }}">{{ 'menu.left.with_annotations'|trans }} <span class="numberItems grey-text">{{ count_entries('annotated') }}</span></a>
|
||||
</li>
|
||||
<li class="bold {% if activeRoute == 'all' %}active{% endif %}">
|
||||
<a class="waves-effect" href="{{ path('all') }}">{{ 'menu.left.all_articles'|trans }} <span class="numberItems grey-text">{{ count_entries('all') }}</span></a>
|
||||
</li>
|
||||
|
||||
@ -95,6 +95,9 @@ class WallabagExtension extends AbstractExtension implements GlobalsInterface
|
||||
case 'unread':
|
||||
$qb = $this->entryRepository->getBuilderForUnreadByUser($user->getId());
|
||||
break;
|
||||
case 'annotated':
|
||||
$qb = $this->entryRepository->getBuilderForAnnotationsByUser($user->getId());
|
||||
break;
|
||||
case 'all':
|
||||
$qb = $this->entryRepository->getBuilderForAllByUser($user->getId());
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user