Compare commits

...

132 Commits

Author SHA1 Message Date
Bernd Bestel
66571f662f Hotfix (will be included in v2.5.0 release): Don't break image loading when php-gd extension is not installed 2019-09-22 14:48:50 +02:00
Bernd Bestel
e5aebad5d9 Small night mode fix 2019-09-22 13:32:18 +02:00
Bernd Bestel
f3a1489abf Little night mode improvements 2019-09-22 10:26:43 +02:00
Bernd Bestel
6ca694226b Pulled translations from Transifex 2019-09-22 09:49:09 +02:00
Bernd Bestel
5d5cfb1548 Prepared next release 2019-09-22 09:47:58 +02:00
Bernd Bestel
1a7be05e3f Added linuxserver/docker-grocy to README 2019-09-22 09:46:19 +02:00
Bernd Bestel
f7c4662e2b Prevent error message spam when navigating away before the page has completely loaded 2019-09-22 09:36:28 +02:00
Bernd Bestel
4c57bf8b9d Always navigate back to the previous page after saving a product (closes #364) 2019-09-22 09:03:59 +02:00
Bernd Bestel
e5530e2058 Trigger input event after SetValue of datetimepicker (fixes #363) 2019-09-22 08:53:05 +02:00
Bernd Bestel
363dcf448e Give the main page content section an id 2019-09-22 08:35:03 +02:00
Bernd Bestel
d16f3c2daf Optimized demo instance localization & data handling 2019-09-22 08:21:15 +02:00
Bernd Bestel
51e0154101 Try to improve QuaggaJS barcode scanning recognition accuracy (this now closes #362) 2019-09-21 20:46:23 +02:00
Bernd Bestel
fc2a37d3fc Typo... 2019-09-21 20:20:32 +02:00
Bernd Bestel
c32ea087df Added a little barcode scanner testing page (references #362) 2019-09-21 20:01:49 +02:00
Bernd Bestel
4eabee3db7 Typo... 2019-09-21 17:30:33 +02:00
Bernd Bestel
95478cbb18 Updated README.md 2019-09-21 17:26:53 +02:00
Bernd Bestel
d8360993cc Internal change that the demo instances (stable and pre-release) can be served through a single instance for all localizations (references #241) 2019-09-21 15:07:29 +02:00
Bernd Bestel
6e4117526b Improved productcard "never" date display 2019-09-21 13:40:31 +02:00
Bernd Bestel
e4437f5db1 Fixed that "Spoil rate" and "Average shelf life" on the product card was wrong in most cases 2019-09-21 13:30:44 +02:00
Bernd Bestel
b57fd83cb8 Fixed various smaller problems after some testing 2019-09-21 13:08:42 +02:00
Bernd Bestel
327c1f4fb3 Fixed meal plan did not load when a containing recipe was deleted (closes #361) 2019-09-21 09:18:40 +02:00
Bernd Bestel
ab44566890 Small style refinements 2019-09-21 08:38:28 +02:00
Bernd Bestel
d2a841143e Don't show the sidebar on other menus on the login page 2019-09-21 08:28:08 +02:00
Bernd Bestel
d580990b25 Fixed JS errors on the login page 2019-09-21 08:25:32 +02:00
Bernd Bestel
78b658e86e Also the product calories field is not required 2019-09-20 20:19:12 +02:00
Bernd Bestel
051cb816fe Disabled CSS class was applied to calories product field by mistake 2019-09-20 20:17:54 +02:00
Bernd Bestel
91c275e66b Slightly reordered the header of the shopping list page 2019-09-20 20:14:47 +02:00
Bernd Bestel
653098a81e Improved product picture display on the productcard 2019-09-20 20:10:03 +02:00
Bernd Bestel
c228126c3a Added a new field calories for products (closes #268) 2019-09-20 20:06:24 +02:00
Bernd Bestel
1ae5f552d1 Inventory is always possible, also when the produc is not in stock currently (references #327) 2019-09-20 18:26:32 +02:00
Bernd Bestel
63d7f8f36d Typo... 2019-09-20 18:18:43 +02:00
Bernd Bestel
4754cc306a Currently there are no multiple shopping lists output options, so no dropdown button needed (this now closes #245) 2019-09-20 18:13:38 +02:00
Bernd Bestel
339a25d1e3 Added a notes field to shopping lists (references #245) 2019-09-20 18:08:38 +02:00
Bernd Bestel
5a91c86b81 Added an option to print a shopping list (references #245) 2019-09-20 17:40:45 +02:00
Bernd Bestel
292b652437 Updated localizations & improved some special and demo translation string data handling 2019-09-20 16:26:50 +02:00
Bernd Bestel
399ebbe14a Updated dependencies 2019-09-20 14:47:42 +02:00
Bernd Bestel
a95d6be4f4 Added more product actions on the stock overview page (closes #327) 2019-09-20 13:37:53 +02:00
Bernd Bestel
ca9b8d068a Reuse existing routes for the by-barcode API routes and complete them (references #331) 2019-09-20 10:45:58 +02:00
Bernd Bestel
58890f6bec Typo... 2019-09-20 10:35:30 +02:00
Bernd Bestel
9f8216378e Only show the "Test plural forms"-button on the qu edit page when the current language requires more than 2 plural forms (references #261) 2019-09-20 10:33:44 +02:00
Bernd Bestel
d4c76aaa76 Properly show qu plural forms on the product or qu conversion edit page 2019-09-20 10:30:46 +02:00
Bernd Bestel
6ce4e6cb37 An icon is not needed when not showing an userentity in the sidebar menu (references #242) 2019-09-20 10:22:59 +02:00
Bernd Bestel
aa670adefc Added a say-thanks-button on the about page 2019-09-20 10:08:10 +02:00
Bernd Bestel
1d92e6a4ab Updated changelog 2019-09-19 21:44:59 +02:00
Bernd Bestel
e720311572 Fixed hidden price_factor field in recipeposform.blade.php 2019-09-19 21:31:37 +02:00
Bernd Bestel
7c114cfec3 Implemented a price factor option for recipe ingredients (closes #295) 2019-09-19 21:30:24 +02:00
Bernd Bestel
35a409f462 Fixed/refined some things regarding purchase/consume/inventory of products with enabled tare weight handling 2019-09-19 21:10:36 +02:00
Bernd Bestel
412653d67d Small Swagger UI refinements 2019-09-19 19:59:17 +02:00
Bernd Bestel
58a69d650f Added an API endpoint to add/remove products to stock by its barcode (closes #331) 2019-09-19 18:36:46 +02:00
Bernd Bestel
a4d479d047 Also consider opened products for minimum stock amounts (optionally, but by default) (closes #353) 2019-09-19 18:11:03 +02:00
Bernd Bestel
cbf1d1ca40 Implemented stock sub-feature-flags (closes #314) 2019-09-19 17:46:52 +02:00
Bernd Bestel
5e9a7fb7ca Implemented browser barcode scanning (closes #102) 2019-09-19 12:48:02 +02:00
Bernd Bestel
9f18b75526 Auto focus the amount field on the qu plural form testing page (references #261) 2019-09-18 20:27:35 +02:00
Bernd Bestel
346b589534 Make it possible to test quantity unit plural forms (closes #261) 2019-09-18 20:21:09 +02:00
Bernd Bestel
8f798a94d1 Only allow night mode enabled manually or automatically, but not both at the same time (again fixes #71) 2019-09-18 19:43:33 +02:00
Bernd Bestel
991706920f Fixed that datetimepickers not considered the config.php setting CALENDAR_FIRST_DAY_OF_WEEK (closes #334) 2019-09-18 18:46:07 +02:00
Bernd Bestel
ce12202c86 Make it configurable if calendars shows week numbers or not (closes #333) 2019-09-18 18:30:25 +02:00
Bernd Bestel
ca470ed4ee Fixed version display in prerelease mode 2019-09-18 17:27:47 +02:00
Bernd Bestel
2237e2f8f4 Hide userfields form border for custom objects because all fields are userfields... (references #242) 2019-09-18 16:31:00 +02:00
Bernd Bestel
2522b3748c Just name it "fields" not "userfields" for custom objects (references #242) 2019-09-18 16:25:38 +02:00
Bernd Bestel
096fb7a116 Implement custom entities / objects (closes #242) 2019-09-18 16:18:15 +02:00
Bernd Bestel
918f84f568 Lazy load all images to increase page load times (references #275) 2019-09-18 13:59:37 +02:00
Bernd Bestel
d209c0bd22 Automatically downscale pictures to reduce page loading times (closes #275) 2019-09-18 11:04:59 +02:00
Bernd Bestel
ba089a3d79 Also show the stock QU (as on all other places) after a product is selected on the chore edit page (references #279) 2019-09-18 10:08:59 +02:00
Bernd Bestel
3df44697bf Implemented the option to automatically consume a product on tracking a chore execution (closes #279) 2019-09-18 10:02:52 +02:00
Bernd Bestel
e326e69d49 Allow decimal numbers in "Factor purchase to stock quantity unit" when "Allow partial units in stock" is enabled (closes #351) 2019-09-17 20:02:27 +02:00
Bernd Bestel
bbd8e8c1fa Typo... 2019-09-17 19:42:01 +02:00
Bernd Bestel
9b5f3ba7b8 Render product Userfields also on the shopping list (this now closes #258) 2019-09-17 19:39:55 +02:00
Bernd Bestel
0fa0138972 Implemented new Userfield type "Link" (references #258) 2019-09-17 19:33:06 +02:00
Bernd Bestel
6aa278c19c Updated changelog 2019-09-17 19:20:32 +02:00
Bernd Bestel
3fd0f44fe4 Merge pull request #360 from mduret/master
Parse settings provided via environment variables as boolean if needed
2019-09-17 19:15:50 +02:00
Bernd Bestel
0c27157db6 Implemented new Userfield type "Select list" (closes #325) 2019-09-17 19:11:06 +02:00
Bernd Bestel
bbd5ce1dc4 Typo... 2019-09-17 17:54:09 +02:00
Bernd Bestel
0771d58fe7 Fixed that /api/system/db-changed-time always returned the current time 2019-09-17 17:49:58 +02:00
Bernd Bestel
db0c4f78bd Fix some missing OpenAPI documentation (closes #359) 2019-09-17 17:35:13 +02:00
Bernd Bestel
ef8f6b6d42 Updated changelog 2019-09-17 17:24:19 +02:00
Bernd Bestel
4dd804003b Re-apply filter after chore execution on the chores overview page 2019-09-17 17:17:33 +02:00
Bernd Bestel
182d063886 Fixed user filter button on chores overview page (references #253) 2019-09-17 16:58:42 +02:00
Bernd Bestel
bc487b4867 Make it possible to also filter by chore assignments on the chore overview page (references #253) 2019-09-17 16:50:29 +02:00
Mathieu Duret
b5b2f9c5b9 Parse settings provided via environment variables as boolean if needed (https://github.com/grocy/grocy/issues/346) 2019-09-17 16:45:11 +02:00
Bernd Bestel
b5761ae544 Show to whom the chore execution is assigned in calendar events (references #253) 2019-09-17 16:28:11 +02:00
Bernd Bestel
597a9e3d21 Show aggregated product amounts also on the productcard (references #196) 2019-09-17 16:18:00 +02:00
Bernd Bestel
1b19940aba Only cascade changes of stock QU to recipe ingredients which uses the same QU (references #177) 2019-09-17 16:01:30 +02:00
Bernd Bestel
74f9470769 Implemented that chores can be assigned to users (closes #253) 2019-09-17 13:13:26 +02:00
Bernd Bestel
3dcd513094 Fixed new translation strings 2019-09-16 11:02:03 +02:00
Bernd Bestel
a799f2b43f Finished qu unit conversion handling (closes #177) 2019-09-16 09:35:20 +02:00
Bernd Bestel
c532a67884 Started working on qu unit conversion handling (references #177) 2019-09-15 17:06:52 +02:00
Bernd Bestel
6094096675 Started working on qu unit conversion handling (references #177) 2019-09-15 16:40:54 +02:00
Bernd Bestel
30d89f4529 Typo... 2019-09-14 17:38:58 +02:00
Bernd Bestel
a0a0e104b0 Implemented product variations (closes #196) 2019-09-14 17:34:36 +02:00
Bernd Bestel
26ebeec74f Improved date display of "Track date only"-chores (never show the time part for them) 2019-09-14 13:05:36 +02:00
Bernd Bestel
a4454f825a Fixes/changes for pull request #349 2019-08-31 14:08:15 +02:00
Bernd Bestel
6ec3872518 Merge pull request #349 from Forceu/master
Add API call for adding products to shoppinglist
2019-08-31 13:58:10 +02:00
Marc Ole Bulling
d4eb767f1b Add API call for adding products to shoppinglist 2019-08-30 09:21:11 +02:00
Bernd Bestel
afa4165d1c Updated changelog 2019-08-15 14:39:11 +02:00
Bernd Bestel
f9036f0248 Use the summernote editor for product description (closes #288) 2019-08-15 14:35:28 +02:00
Bernd Bestel
257dd644aa Render checkbox Userfields in tables as checkmark (closes #326) 2019-08-15 14:05:33 +02:00
Bernd Bestel
be4b5c81b2 ixed that the delete button not always deleted the currently selected equipment item (fixes #307) 2019-08-15 13:53:30 +02:00
Bernd Bestel
f88ed1ee8a Merge pull request #343 from Forceu/master
API: Return stock amount of 0 instead of null, if product is not in stock
2019-08-13 14:23:27 +02:00
Forceu
411aad2398 Set stock amount to 0 instead of null if product not in stock
Without this the API returns null instead of 0 when queried for product stock amount
2019-08-13 12:20:14 +02:00
Bernd Bestel
7004cf4400 Finished the implementation of "Location Content Sheet" (closes #341) 2019-08-11 09:24:47 +02:00
Bernd Bestel
28716ed96c First draft for printable location content sheets (references #341) 2019-08-10 16:34:29 +02:00
Bernd Bestel
d6e9dc1b59 Allow providing the API key also via a query parameter (closes #329) 2019-08-10 13:30:50 +02:00
Bernd Bestel
19935276e9 Typo... 2019-08-10 13:11:02 +02:00
Bernd Bestel
fa326fdfda Added an API endpoint to search for objects by name (closes #337) 2019-08-10 13:07:08 +02:00
Bernd Bestel
e6020432c6 Add chores due date rollover (closes #340) 2019-08-10 12:44:09 +02:00
Bernd Bestel
12a2c0945e Added the changelog for the next release 2019-08-10 08:33:54 +02:00
Bernd Bestel
cc1c6a6442 Little changes for pull request #338 2019-08-10 08:33:30 +02:00
Bernd Bestel
c757ee3874 Merge pull request #338 from Forceu/master
Add API call to remove an item from the shopping list by productid
2019-08-10 08:04:00 +02:00
Marc Ole Bulling
1e33975a96 Use default best before date when adding product through API 2019-08-04 20:58:11 +02:00
Forceu
1a23eaabf1 Add API call to remove an item from the shopping list by productid
This adds an API call, so a shopping list item can easily be removed

Please note: This is UNTESTED, as I was unable to run the current grocy master commit on my server.
2019-08-04 20:31:47 +02:00
Bernd Bestel
3dbce7547f Fixed "datatables_localization" localization JSON-string (fixes #323) 2019-07-20 15:48:58 +02:00
Bernd Bestel
0bb3e0ae28 Merge pull request #317 from skevas/fix-typo
Fixes typo in update.sh
2019-07-14 15:16:22 +02:00
skevas
8d4a2d0ff9 Fixes typo in update.sh 2019-07-14 13:02:21 +02:00
Bernd Bestel
3234a97b3c Merge pull request #315 from oncleben31/patch-1
Use list title when display a user field form
2019-07-13 08:26:51 +02:00
Oncleben31
b61d569247 Use list title when display a used filed form
To replace the default string `Product group`
2019-07-13 01:34:57 +02:00
Bernd Bestel
0daf0aeb61 Added a hint to the new community contributions section on the website 2019-07-12 13:45:35 +02:00
Bernd Bestel
889f520afb grocy-desktop is not really "NEW" anymore... 2019-07-12 13:42:35 +02:00
Bernd Bestel
c6420a74ba Merge pull request #290 from nielstholenaar/master
Allow possibility to choose custom homepage
2019-07-10 22:14:19 +02:00
Niels Tholenaar
e3f53aaebd Added possible values to entry page config setting 2019-07-10 17:14:25 +02:00
Niels
94e2ec5e15 Merge branch 'master' into master 2019-07-10 15:11:36 +02:00
Niels Tholenaar
0a61ea0fcf Improved entry page resolving to handle disabled features 2019-07-10 15:10:39 +02:00
Bernd Bestel
091145c62c Minor typos... 2019-07-07 20:00:05 +02:00
Bernd Bestel
197b83fee8 Prepared next release 2019-07-07 19:51:40 +02:00
Bernd Bestel
430286ae9e Don't consider a chores executed when the execution was undone 2019-07-07 19:47:05 +02:00
Bernd Bestel
6e3407b157 Always show "Track date only" shore execution times without the time part 2019-07-07 19:38:57 +02:00
Bernd Bestel
13c432b0cf Fixed weekly chores were scheduled on the same day (fixes #304) 2019-07-07 19:19:54 +02:00
Bernd Bestel
4822d9a4b8 Fixed date-only-datetimepicker width 2019-07-07 10:10:20 +02:00
Bernd Bestel
52dd01f313 Fixed that a string was never translated 2019-07-07 09:29:04 +02:00
Bernd Bestel
87976b86d9 Also display price data from inventory corrections, not only purchases (fixes #303) 2019-07-07 09:25:13 +02:00
Bernd Bestel
84e6e253ea Fixed date "never" display on stock overview page (again closes #296) 2019-07-07 09:04:40 +02:00
Niels Tholenaar
86f5667039 Allow possibility to choose custom homepage 2019-06-22 16:02:52 +02:00
226 changed files with 9824 additions and 3239 deletions

View File

@@ -1,9 +1,15 @@
[main]
host = https://www.transifex.com
[grocy.chore_types]
file_filter = localization/<lang>/chore_types.po
source_file = localization/chore_types.pot
[grocy.chore_period_types]
file_filter = localization/<lang>/chore_period_types.po
source_file = localization/chore_period_types.pot
source_lang = en
type = PO
[grocy.chore_assignment_types]
file_filter = localization/<lang>/chore_assignment_types.po
source_file = localization/chore_assignment_types.pot
source_lang = en
type = PO

View File

@@ -8,17 +8,18 @@ ERP beyond your fridge
## Getting in touch
There is the [r/grocy subreddit](https://www.reddit.com/r/grocy) to connect with other grocy users. If you've found something that does not work or if you have an idea for an improvement or new things which you would find useful, feel free to open an issue in the [issue tracker](https://github.com/grocy/grocy/issues) here.
## Community contributions
See the website for a list of community contributed Add-ons / Tools: [https://grocy.info/#addons](https://grocy.info/#addons)
## Motivation
A household needs to be managed. I did this so far (almost 10 years) with my first self written software (a C# windows forms application) and with a bunch of Excel sheets. The software is a pain to use and Excel is Excel. So I searched for and tried different things for a (very) long time, nothing 100 % fitted, so this is my aim for a "complete household management"-thing. ERP your fridge!
## How to install
> **NEW**
>
> There is now grocy-desktop if you want to run grocy without a webserver just like a normal (windows) desktop application.
> Checkout grocy-desktop, if you want to run grocy without a webserver just like a normal (windows) desktop application.
>
> See https://github.com/grocy/grocy-desktop or directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next"...
Just unpack the [latest release](https://releases.grocy.info/latest) on your PHP (SQLite (3.8.3 or higher) extension required, currently only tested with PHP 7.2) enabled webserver (webservers root should point to the `public` directory), copy `config-dist.php` to `data/config.php`, edit it to your needs, ensure that the `data` directory is writable and you're ready to go, (to make writable `chown -R www-data:www-data data/`). Default login is user `admin` with password `admin`, please change the password immediately (see user menu).
Just unpack the [latest release](https://releases.grocy.info/latest) on your PHP (SQLite (3.8.3 or higher) extension required, currently only tested with PHP 7.3) enabled webserver (webservers root should point to the `public` directory), copy `config-dist.php` to `data/config.php`, edit it to your needs, ensure that the `data` directory is writable and you're ready to go, (to make it writable, maybe use `chown -R www-data:www-data data/`). Default login is user `admin` with password `admin`, please change the password immediately (see user menu).
Alternatively clone this repository and install Composer and Yarn dependencies manually.
@@ -26,31 +27,34 @@ If you use nginx as your webserver, please include `try_files $uri /index.php;`
If, however, your webserver does not support URL rewriting, set `DISABLE_URL_REWRITING` in `data/config.php` (`Setting('DISABLE_URL_REWRITING', true);`).
See the website for further installation guides and troubleshooting help: https://grocy.info/links
## How to run using Docker
See [grocy/grocy-docker](https://github.com/grocy/grocy-docker) for instructions.
See [grocy/grocy-docker](https://github.com/grocy/grocy-docker) or [linuxserver/docker-grocy](https://github.com/linuxserver/docker-grocy) for instructions.
## How to update
Just overwrite everything with the latest release while keeping the `data` directory, check `config-dist.php` for new configuration options and add them to your `data/config.php` (the default from values `config-dist.php` will be used for not in `data/config.php` defined settings). Just to be sure, please empty `data/viewcache`.
Just overwrite everything with the latest release while keeping the `data` directory, check `config-dist.php` for new configuration options and add them to your `data/config.php` where appropriate (the default values from `config-dist.php` will be used for not in `data/config.php` defined settings). Just to be sure, please empty `data/viewcache`.
If you run grocy on Linux, there is also `update.sh` (remember to make the script executable, `chmod +x update.sh` and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update).
If you run grocy on Linux, there is also `update.sh` (remember to make the script executable (`chmod +x update.sh`) and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update).
## Localization
grocy is fully localizable - the default language is English (integrated into code), a German localization is always maintained by me.
You can easily help translating grocy at https://www.transifex.com/grocy/grocy, if your language is incomplete or not available yet.
(Language can be changed in `data/config.php`, e. g. `Setting('CULTURE', 'it');`)
### Maintaining your own localization
As the German translation will always be the most complete one, for maintaining your localization it would be easiest when you compare your localization with the German one with a diff tool of your choice.
The [pre-release demo](https://demo-prerelease.grocy.info) is available for any translation which is at least 80 % complete and will pull the translations from Transifex 10 minutes past every hour, so you can have a kind of instant preview of your contributed translations. Thank you!
## Things worth to know
### REST API & data model documentation
See the integrated Swagger UI instance on [/api](https://demo-en.grocy.info/api).
See the integrated Swagger UI instance on [/api](https://demo.grocy.info/api).
### Barcode readers
### Barcode readers & camera scanning
Some fields also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a `$`) and sends a `TAB` after a scan.
Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding field (powered by [QuaggaJS](https://github.com/serratus/quaggaJS), totally offline / client-side camera stream processing). Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc
### Input shorthands for date fields
For (productivity) reasons all date (and time) input fields use the ISO-8601 format regardless of localization.
The following shorthands are available:
@@ -91,10 +95,10 @@ When the file `embedded.txt` exists, it must contain a valid and writable path w
In embedded mode, settings can be overridden by text files in `data/settingoverrides`, the file name must be `<SettingName>.txt` (e. g. `BASE_URL.txt`) and the content must be the setting value (normally one single line).
## Contributing
## Contributing / Say thanks
Any help is more than appreciated. Feel free to pick any open unassigned issue and submit a pull request, but please leave a short comment or assign the issue yourself, to avoid working on the same thing.
New ideas are also very welcome, feel free to open an issue to discuss them.
See https://grocy.info/#say-thanks for more ideas if you just want to say thanks.
## Screenshots
#### Dashboard

View File

@@ -38,7 +38,7 @@ require_once __DIR__ . '/vendor/autoload.php';
// Load config files
require_once GROCY_DATAPATH . '/config.php';
require_once __DIR__ . '/config-dist.php'; //For not in own config defined values we use the default ones
require_once __DIR__ . '/config-dist.php'; // For not in own config defined values we use the default ones
// Definitions for disabled authentication mode
if (GROCY_DISABLE_AUTH === true)

View File

@@ -1 +1 @@
- Documented the REST API and data model, see the integrated instance of Swagger UI at [/api](https://demo-en.grocy.info/api)
- Documented the REST API and data model, see the integrated instance of Swagger UI at [/api](https://demo.grocy.info/api)

View File

@@ -1,3 +1,3 @@
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!)
- Added Italian translation (thanks @davidoskky)
- => Demo for this language available at: https://demo-it.grocy.info
- => Demo for this language available at: https://it.demo.grocy.info

View File

@@ -2,4 +2,4 @@ This was released shortly after the last release to fix a small regression bug,
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!)
- Added Italian translation (thanks @davidoskky)
- => Demo for this language available at: https://demo-it.grocy.info
- => Demo for this language available at: https://it.demo.grocy.info

View File

@@ -1,8 +1,8 @@
- New feature: **Recipes**
- Organize a list of products, amounts and a description into recipes and see at a glance if everything needed is in stock or put the missing things with one click on the shopping list
- Try it live on the demo page: => https://demo-en.grocy.info/recipes
- Try it live on the demo page: => https://demo.grocy.info/recipes
- Added norwegian translation (thanks @BlizzWave)
- Demo available at: => https://demo-no.grocy.info
- Demo available at: => https://no.demo.grocy.info
- A lot of small UI improvements
- Columns in tables can now be reordered
- Show a calendar on the shopping list page (useful, at least for me)

View File

@@ -9,7 +9,7 @@
- New feature: Calendar
- Shows all upcoming product expirations, due chores, due tasks and due battery charge cycles
- New translation: French (thanks all the translators)
- As for all languages, a demo is available at: https://demo-fr.grocy.info
- As for all languages, a demo is available at: https://fr.demo.grocy.info
- Small other improvements
- Allow fraction numbers for recipe ingredients when not checked against stock and add an option to not check stock for a recipe position
- The current time can now be shown in the header (see the settings menu next to the user icon)

View File

@@ -1,4 +1,4 @@
- Breaking change: The API has been completely reworked, please review [the documentation](https://demo-en.grocy.info/api) before updating when you are using the API
- Breaking change: The API has been completely reworked, please review [the documentation](https://demo.grocy.info/api) before updating when you are using the API
- New feature: Tare weight handling
- An option per product
- Imagine this: You have flour in jars, the jar weighs 500 grams, currently there are 1000 grams in stock, the new weight including the jar is 1100 grams - grocy can now calculate the used amount on consume/purchase/inventory automatically, you only have to enter the weighed amount including the jar (demo product to showcase this "Flour")
@@ -9,13 +9,13 @@
- A new option per recipe to not check against the amount already on the shopping list when putting all missing ingredients on it (by default, only the amount not already on the shopping list is added, when this is enabled, always the whole missing amount will be put on the shopping list)
- On consume, there can now be tracked for which recipe it was, this is also tracked automatically when using the "Consume all ingredients needed by this recipe" button (for future statistical purposes)
- Recipes can now have pictures
- New "gallery view" for recipes (demo available at https://demo-en.grocy.info/recipes?tab=gallery)
- New "gallery view" for recipes (demo available at https://demo.grocy.info/recipes?tab=gallery)
- Stock improvements
- It is now optionally possible to have partial units in stock (option per product)
- On purchase, a different location can now be assigned (imagine you have two freezers, by default you store your pizza there, but sometimes there)
- New translations: (thanks all the translators)
- Spanish (demo available at https://demo-es.grocy.info)
- Turkish (demo available at https://demo-tr.grocy.info)
- Spanish (demo available at https://es.demo.grocy.info)
- Turkish (demo available at https://tr.demo.grocy.info)
- Other improvements
- The calendar can now be shared/integrated in iCal format (button in the header on the calendar page)
- Added feature flags to hide/disable certain parts of grocy when you don't use them (for example hide "Chores" and all related UI elements, when you don't use it, see `config-dist.php`)

View File

@@ -7,4 +7,4 @@
- The changelog is now included as markdown files (in `/changelog` directory, one file per release with a filename in format `<ReleaseNumber>_<Version>_<ReleaseDateIso>.md`) and shown in the about dialog
- Please review your `CURRENCY` setting in `data/config.php`, see also `config-dist.php` - this should be the ISO 4217 code of the currency to properly work with the JS `toLocaleString` function
- New translation: (thanks all the translators)
- Russian (demo available at https://demo-ru.grocy.info)
- Russian (demo available at https://ru.demo.grocy.info)

View File

@@ -21,8 +21,8 @@
- Recipe improvements
- It's now possible to enter a "variable amount" (e. g. if a recipe needs "1 - 2 cups"), the original amount is still used for stock fulfillment checking (if enabled for that recipe ingredient)
- New translations: (thanks all the translators)
- Swedish (demo available at https://demo-sv.grocy.info)
- Polish (demo available at https://demo-pl.grocy.info)
- Swedish (demo available at https://sv.demo.grocy.info)
- Polish (demo available at https://pl.demo.grocy.info)
- Internal improvement: Localizations are now handled via gettext, both on server and client side
- Mainly to properly handle languages with more than 2 plural forms
- This involved some string changes which results in a needed (re)translation of about 20 strings (excluding demo data)

View File

@@ -0,0 +1,6 @@
- Fixed that price data (last price & chart) was not taken from inventory correction bookings, only purchases
- Fixed weekly chores were scheduled on the same day after execution
- Fixed that undone chores were also included in "Last tracked"
- Fixed the date-time-picker width was too narrow sometimes
- Improved that execution dates of "Track date only" chores will never display the time part
- Improved date display for products that never expire (again, there was a display problem after consuming an item on the stock overview page)

View File

@@ -0,0 +1,107 @@
### New feature: Custom entities / objects / lists
- Custom entities are based on Userfields and can be used to add any custom lists you want to have in grocy
- They can have an own menu entry in the sidebar
- => See "Manage master data" -> "Userentities" or try it on the demo: https://demo.grocy.info/userobjects/exampleuserentity
### New feature: Use the device camera for barcode scanning
- Available on any barcode-enabled field (so currently only for picking products) - a new camera button at the right of side the text field
- Implemented using [QuaggaJS](https://github.com/serratus/quaggaJS) - camera stream processing happens totally offline / client-side
- Please note due to browser security restrictions, this only works when serving grocy via a secure connection (`https://`)
- There is also a `config.php` setting `DISABLE_BROWSER_BARCODE_CAMERA_SCANNING` to disable this, if you don't need it at all (defaults to `false`)
- I you have problems that barcocdes are not recognized properly, there is a little "barcode scanner testing page" at [/barcodescannertesting](https://demo.grocy.info/barcodescannertesting)
- => Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc
### Stock improvements/fixes
- Products can now have variations (nested products)
- Define the parent product for a product on the product edit page (only one level is possible, means a product which is used as a parent product in another product, cannot have a parent product itself)
- Parent and sub products can have stock (both are regular products, no difference from that side)
- On the stock overview page the aggregated amount is displayed next to the amount (sigma sign)
- When a recipe needs a parent product, the need is also fulfilled when enough sub product(s) are in stock
- Quantity units can now be linked (related measurements / unit conversion)
- On the quantity unit edit page default conversion can be defined for each unit
- Products "inherit" the default conversion and additionally can have their own / override the default ones
- It's now possible to print a "Location Content Sheet" with the current stock per location - new button at the top of the stock overview page (thought to hang it at the location, note used amounts on paper and track it in grocy later)
- Stock overview page improvements
- Options in the more/context-menu to directly open the purchase/consume/inventory pages prefilled with the current product in an popup/dialog
- Option in the more/context-menu to add the current product directly to a shopping list
- Option in the more/context-menu to search for recipes containing the current product
- It's now possible to undo stock bookings ("Undo"-button in the success message, like it was already possible on the purchase/consume/inventory pages)
- Improved that on any stock changes the corresponding product table row is properly refreshed
- New `config.php` setting `FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT` to configure if opened products should be considered for minimum stock amounts (defaults to `true`, so opened products will now be considered missing by default - please change this setting if you want the old behaviour)
- The product description now can have formattings (HTML/WYSIWYG editor like for recipes)
- Products now have a new field for calories (kcal, per stock quantity unit)
- "Factor purchase to stock quantity unit" (product option) can now also be a decimal number when "Allow partial units in stock" is enabled
- New "Sub feature flags" in `config.php` to disable some sub-features (hide the corresponding UI elements) if you don't need them (all new feature flags default to `true`, so no changed behaviour when not configured)
- `FEATURE_FLAG_STOCK_PRICE_TRACKING` to disable product price tracking
- `FEATURE_FLAG_STOCK_LOCATION_TRACKING` to disable product location tracking
- `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING` to disable product best before date tracking
- `FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING` to disable product opened tracking
- Fixed/refined some things regarding purchase/consume/inventory of products with enabled tare weight handling (nothing was broken, but the success popups may not displayed the correct amount that was posted)
- Fixed that "Spoil rate" and "Average shelf life" on the product card was wrong in most cases
- When going to the product edit page, after saving the product, it will now always return to the previous page
### Shopping list improvements
- Shopping lists now have a notes field (HTML/WYSIWYG editor, just to save some notes per shopping list)
- Shopping lists can now be printed (new button next to the add/delete shopping list button)
### Recipe improvements
- Based on the new linked quantity units, recipe ingredients can now use any product related unit, the amount is calculated according to the cnoversion factor of the unit relation
- Based on the new calories field per product, the calories per recipe are now shown based on the selected servings (in the header, next to the costs)
- New option "price factor" per recipe ingredient (defaults to `1`) - the resulting costs of the recipe ingredient will be multiplied by that factor
- Use this for example for spices in combination with "Only check if a single unit is in stock" to not take the full price of a pack of pepper into account for a recipe
- The search field on the recipe overview page now also searches for product names of recipe ingredients (means it's possible to search an recipe by a product name)
- Fixed a problem where the meal plan did not load when a recipe, which was already added to a the meal plan, was deleted
### Chores improvements
- Chores can now be assigned to users
- Option per chore, different "assignment types" like "Random", "Who least did first", etc.
- On the chores overview page the list can be filterd to only show chores assigned to the currently logged in user (or to any other user)
- New option "Due date rollover" per chore which means the chore can never be overdue, the due date will shift forward each day when due
- New option "Consume product on chore execution" per chore to automatically consume a product when a chore execution is tracked
- When tracking an execution from the chores overview page, filters are re-applied afterwards (means when you have filtered the page to only show overdue chores and after the execution the chore is not overdue anymore, it will now be immediately hidden)
### Equipment improvements/fixes
- Fixed that the delete button not always deleted the currently selected equipment item
### Userfield improvements/fixes
- New Userfield type "Select list" for a list of predefined values where a single or also multiple values can then be selected on the entity object
- New Userfield type "Link" - a single-line-textbox where the content will be rendered as a clickable link
- Userfields of type "checkbox" are rendered as a checkmark in tables when checked (instead of "1" as till now)
- Product Userfields are now also rendered on the shopping list (for items which have a product referenced)
- Fixed that the Userfield type "Preset list" had always the caption "Product group" instead of the configured one (thanks @oncleben31)
### General & other improvements/fixes
- Added a new `config.php` setting `CALENDAR_SHOW_WEEK_OF_YEAR` to configure if calendars should show week numbers (defaults to `true`)
- Fixed that date/time pickers not considered the `config.php` setting `CALENDAR_FIRST_DAY_OF_WEEK`
- Improved the handling which entry page to use with disabled feature flags (thanks @nielstholenaar)
- Boolean settings provided via environment variables (so the strings `true` and `false`) are now parsed correctly (thanks @mduret)
- All uploaded pictures (currently for products and recipes) are now automatically downscaled to the appropriate size when serving them to improve page load times (this requires the `php-gd` extension, if not installed, images will not be downscaled)
- It's now possible to test plural forms of quantity units (button on the quantity unit edit page, only visible if the current language requires more than 2 plural forms)
- On the login page no menus and the sidebar is now hidden
- New translations: (thanks all the translators)
- Danish (demo available at https://da.demo.grocy.info)
- Dutch (demo available at https://nl.demo.grocy.info)
- Internal change for how the localizations for the demo instances are handled
- For the pre-release demo now all currently supported languages are available (was already the case for the stable demo)
- Additionally all language files which reached the completion limit of 80 % will now be automatically pulled from Transifex 10 minutes past every hour (to have a kind of instant preview of changed tranlsations)
- The URLs have changed, I'll try to keep all existing URLs redirecting properly for a long time
- If you want to link to the demo, please only use https://demo.grocy.info (stable demo) or https://demo-prerelease.grocy.info (current master branch demo)
### API improvements & non-breaking changes
- New endpoint `/objects/{entity}/search/{searchString}` to search for objects by name (contains search)
- New endpoint `/stock/shoppinglist/add-product` to add a product to a shopping list (thanks @Forceu)
- New endpoint `/stock/shoppinglist/remove-product` to remove a product from a shopping list (thanks @Forceu)
- New endpoint `/chores/executions/calculate-next-assignments` to (re)calculate next user assignments for a single or all chores
- New endpoint `/stock/products/by-barcode/{barcode}/add` to add a product to stock by its barcode
- New endpoint `/stock/products/by-barcode/{barcode}/consume` to remove a product to stock by its barcode
- New endpoint `/stock/products/by-barcode/{barcode}/inventory` to inventory a product by its barcode
- New endpoint `/stock/products/by-barcode/{barcode}/open` to mark a product as opened by its barcode
- New endpoint `/stock/bookings/{bookingId}` to retrieve a single stock booking
- Endpoint `GET /files/{group}/{fileName}` can now also downscale pictures (see API documentation on [/api](https://demo.grocy.info/api))
- When adding a product (through `stock/product/{productId}/add` or `stock/product/{productId}/inventory`) with omitted best before date and if the given product has "Default best before days" set, the best before date is calculated based on that (so far always today was used which is still the case when no date is supplied and also the product has no "Default best before days set) (thanks @Forceu)
- Field `stock_amount` of endpoint `/stock/products/{productId}` now returns `0` instead of `null` when the given product is not in stock (thanks @Forceu)
- Fixed that `/system/db-changed-time` always returned the current time (more or less) due to that that time is the database file modification time and the database is effectively changed on each request because of session information tracking - which now explicitly does not change the database file modification time, so this should work again to determine if any data changes happened
- It's now also possible to provide the API key via a query parameter (same name as the header, so `GROCY-API-KEY`)
#### Say thanks
Because there were some questions about that in the past: If grocy is useful for you, [say thanks](https://grocy.info/#say-thanks)!

View File

@@ -1,13 +1,14 @@
{
"require": {
"php": ">=7.2",
"slim/slim": "^3.12.1",
"slim/slim": "^3.12.2",
"morris/lessql": "^0.4.1",
"rubellum/slim-blade-view": "^0.1.1",
"tuupola/cors-middleware": "^0.9.4",
"eluceo/ical": "^0.15.0",
"tuupola/cors-middleware": "^1.0.0",
"eluceo/ical": "^0.15.1",
"erusev/parsedown": "^1.7.3",
"gettext/gettext": "^4.6.2"
"gettext/gettext": "^4.6.3",
"gumlet/php-image-resize": "^1.9.2"
},
"autoload": {
"psr-4": {

394
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "613590bc6e46e2b4542023617bd56778",
"content-hash": "eff0f8f394573d15e26d8abd3788ed72",
"packages": [
{
"name": "container-interop/container-interop",
@@ -106,16 +106,16 @@
},
{
"name": "eluceo/ical",
"version": "0.15.0",
"version": "0.15.1",
"source": {
"type": "git",
"url": "https://github.com/markuspoerschke/iCal.git",
"reference": "add0ca99aa1f77f134a2e8b071f2ebc22b115139"
"reference": "bdd24747587f6f9b10770a7b873a13e273f85f39"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/markuspoerschke/iCal/zipball/add0ca99aa1f77f134a2e8b071f2ebc22b115139",
"reference": "add0ca99aa1f77f134a2e8b071f2ebc22b115139",
"url": "https://api.github.com/repos/markuspoerschke/iCal/zipball/bdd24747587f6f9b10770a7b873a13e273f85f39",
"reference": "bdd24747587f6f9b10770a7b873a13e273f85f39",
"shasum": ""
},
"require": {
@@ -153,7 +153,7 @@
"ics",
"php calendar"
],
"time": "2019-01-13T22:00:58+00:00"
"time": "2019-08-06T20:33:43+00:00"
},
{
"name": "erusev/parsedown",
@@ -203,16 +203,16 @@
},
{
"name": "gettext/gettext",
"version": "v4.6.2",
"version": "v4.6.3",
"source": {
"type": "git",
"url": "https://github.com/oscarotero/Gettext.git",
"reference": "93176b272d61fb58a9767be71c50d19149cb1e48"
"reference": "70c6ff2fecd275e6ef9cdd542f55939a3d1904d6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/oscarotero/Gettext/zipball/93176b272d61fb58a9767be71c50d19149cb1e48",
"reference": "93176b272d61fb58a9767be71c50d19149cb1e48",
"url": "https://api.github.com/repos/oscarotero/Gettext/zipball/70c6ff2fecd275e6ef9cdd542f55939a3d1904d6",
"reference": "70c6ff2fecd275e6ef9cdd542f55939a3d1904d6",
"shasum": ""
},
"require": {
@@ -261,7 +261,7 @@
"po",
"translation"
],
"time": "2019-01-12T18:40:56+00:00"
"time": "2019-07-15T12:56:31+00:00"
},
{
"name": "gettext/languages",
@@ -325,17 +325,72 @@
"time": "2018-11-13T22:06:07+00:00"
},
{
"name": "illuminate/container",
"version": "v5.8.15",
"name": "gumlet/php-image-resize",
"version": "1.9.2",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
"reference": "9405989993a48c2cd50ad1e5b2b08a33383c3807"
"url": "https://github.com/gumlet/php-image-resize.git",
"reference": "06339a9c1b167acd58173db226f57957a6617547"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/container/zipball/9405989993a48c2cd50ad1e5b2b08a33383c3807",
"reference": "9405989993a48c2cd50ad1e5b2b08a33383c3807",
"url": "https://api.github.com/repos/gumlet/php-image-resize/zipball/06339a9c1b167acd58173db226f57957a6617547",
"reference": "06339a9c1b167acd58173db226f57957a6617547",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"ext-gd": "*",
"php": ">=5.5.0"
},
"require-dev": {
"apigen/apigen": "^4.1",
"ext-exif": "*",
"ext-gd": "*",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^4.8"
},
"suggest": {
"ext-exif": "Auto-rotate jpeg files"
},
"type": "library",
"autoload": {
"psr-4": {
"Gumlet\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Aditya Patadia",
"homepage": "http://aditya.patadia.org/"
}
],
"description": "PHP class to re-size and scale images",
"homepage": "https://github.com/gumlet/php-image-resize",
"keywords": [
"image",
"php",
"resize",
"scale"
],
"time": "2019-01-01T13:53:00+00:00"
},
{
"name": "illuminate/container",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
"reference": "b42e5ef939144b77f78130918da0ce2d9ee16574"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/container/zipball/b42e5ef939144b77f78130918da0ce2d9ee16574",
"reference": "b42e5ef939144b77f78130918da0ce2d9ee16574",
"shasum": ""
},
"require": {
@@ -367,20 +422,20 @@
],
"description": "The Illuminate Container package.",
"homepage": "https://laravel.com",
"time": "2019-04-22T13:12:35+00:00"
"time": "2019-08-20T02:00:23+00:00"
},
{
"name": "illuminate/contracts",
"version": "v5.8.15",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
"reference": "0b3cbe19051c9a8c247091cc0867d3b65250d093"
"reference": "00fc6afee788fa07c311b0650ad276585f8aef96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/0b3cbe19051c9a8c247091cc0867d3b65250d093",
"reference": "0b3cbe19051c9a8c247091cc0867d3b65250d093",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/00fc6afee788fa07c311b0650ad276585f8aef96",
"reference": "00fc6afee788fa07c311b0650ad276585f8aef96",
"shasum": ""
},
"require": {
@@ -411,11 +466,11 @@
],
"description": "The Illuminate Contracts package.",
"homepage": "https://laravel.com",
"time": "2019-04-21T18:51:09+00:00"
"time": "2019-07-30T13:57:21+00:00"
},
{
"name": "illuminate/events",
"version": "v5.8.15",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/events.git",
@@ -460,16 +515,16 @@
},
{
"name": "illuminate/filesystem",
"version": "v5.8.15",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/filesystem.git",
"reference": "e3c7302b147704420041c07aac538b9de67ebb8f"
"reference": "494ba903402d64ec49c8d869ab61791db34b2288"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/filesystem/zipball/e3c7302b147704420041c07aac538b9de67ebb8f",
"reference": "e3c7302b147704420041c07aac538b9de67ebb8f",
"url": "https://api.github.com/repos/illuminate/filesystem/zipball/494ba903402d64ec49c8d869ab61791db34b2288",
"reference": "494ba903402d64ec49c8d869ab61791db34b2288",
"shasum": ""
},
"require": {
@@ -508,20 +563,20 @@
],
"description": "The Illuminate Filesystem package.",
"homepage": "https://laravel.com",
"time": "2019-04-08T12:56:11+00:00"
"time": "2019-08-14T13:38:15+00:00"
},
{
"name": "illuminate/support",
"version": "v5.8.15",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
"reference": "7fbf8d76946ee53587955b670bd8a47e3d48e854"
"reference": "e63a495d3bf01654f70def1046fb925c4bb56506"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/7fbf8d76946ee53587955b670bd8a47e3d48e854",
"reference": "7fbf8d76946ee53587955b670bd8a47e3d48e854",
"url": "https://api.github.com/repos/illuminate/support/zipball/e63a495d3bf01654f70def1046fb925c4bb56506",
"reference": "e63a495d3bf01654f70def1046fb925c4bb56506",
"shasum": ""
},
"require": {
@@ -569,20 +624,20 @@
],
"description": "The Illuminate Support package.",
"homepage": "https://laravel.com",
"time": "2019-04-25T14:06:24+00:00"
"time": "2019-09-03T16:36:47+00:00"
},
{
"name": "illuminate/view",
"version": "v5.8.15",
"version": "v5.8.35",
"source": {
"type": "git",
"url": "https://github.com/illuminate/view.git",
"reference": "a62ef6b6c4392a8bb5cf3af5f5076459525286c5"
"reference": "c859919bc3be97a3f114377d5d812f047b8ea90d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/view/zipball/a62ef6b6c4392a8bb5cf3af5f5076459525286c5",
"reference": "a62ef6b6c4392a8bb5cf3af5f5076459525286c5",
"url": "https://api.github.com/repos/illuminate/view/zipball/c859919bc3be97a3f114377d5d812f047b8ea90d",
"reference": "c859919bc3be97a3f114377d5d812f047b8ea90d",
"shasum": ""
},
"require": {
@@ -618,7 +673,7 @@
],
"description": "The Illuminate View package.",
"homepage": "https://laravel.com",
"time": "2019-04-17T14:14:38+00:00"
"time": "2019-06-20T13:13:59+00:00"
},
{
"name": "morris/lessql",
@@ -726,16 +781,16 @@
},
{
"name": "nesbot/carbon",
"version": "2.17.1",
"version": "2.24.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "96acbc0c03782e8115156dd4dd8b736267155066"
"reference": "934459c5ac0658bc765ad1e53512c7c77adcac29"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/96acbc0c03782e8115156dd4dd8b736267155066",
"reference": "96acbc0c03782e8115156dd4dd8b736267155066",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/934459c5ac0658bc765ad1e53512c7c77adcac29",
"reference": "934459c5ac0658bc765ad1e53512c7c77adcac29",
"shasum": ""
},
"require": {
@@ -746,11 +801,14 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
"kylekatarnls/multi-tester": "^1.1",
"phpmd/phpmd": "^2.6",
"phpmd/phpmd": "dev-php-7.1-compatibility",
"phpstan/phpstan": "^0.11",
"phpunit/phpunit": "^7.5 || ^8.0",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
"bin/carbon"
],
"type": "library",
"extra": {
"laravel": {
@@ -773,16 +831,20 @@
"name": "Brian Nesbitt",
"email": "brian@nesbot.com",
"homepage": "http://nesbot.com"
},
{
"name": "kylekatarnls",
"homepage": "http://github.com/kylekatarnls"
}
],
"description": "A simple API extension for DateTime.",
"description": "A API extension for DateTime that supports 281 different languages.",
"homepage": "http://carbon.nesbot.com",
"keywords": [
"date",
"datetime",
"time"
],
"time": "2019-04-27T18:04:27+00:00"
"time": "2019-08-31T16:37:55+00:00"
},
{
"name": "nikic/fast-route",
@@ -1325,20 +1387,23 @@
},
{
"name": "slim/slim",
"version": "3.12.1",
"version": "3.12.2",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
"reference": "eaee12ef8d0750db62b8c548016d82fb33addb6b"
"reference": "200c6143f15baa477601879b64ab2326847aac0b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/eaee12ef8d0750db62b8c548016d82fb33addb6b",
"reference": "eaee12ef8d0750db62b8c548016d82fb33addb6b",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/200c6143f15baa477601879b64ab2326847aac0b",
"reference": "200c6143f15baa477601879b64ab2326847aac0b",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.2",
"ext-json": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
"nikic/fast-route": "^1.0",
"php": ">=5.5.0",
"pimple/pimple": "^3.0",
@@ -1363,25 +1428,25 @@
"MIT"
],
"authors": [
{
"name": "Rob Allen",
"email": "rob@akrabat.com",
"homepage": "http://akrabat.com"
},
{
"name": "Josh Lockhart",
"email": "hello@joshlockhart.com",
"homepage": "https://joshlockhart.com"
},
{
"name": "Gabriel Manricks",
"email": "gmanricks@me.com",
"homepage": "http://gabrielmanricks.com"
},
{
"name": "Andrew Smith",
"email": "a.smith@silentworks.co.uk",
"homepage": "http://silentworks.co.uk"
},
{
"name": "Rob Allen",
"email": "rob@akrabat.com",
"homepage": "http://akrabat.com"
},
{
"name": "Gabriel Manricks",
"email": "gmanricks@me.com",
"homepage": "http://gabrielmanricks.com"
}
],
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
@@ -1392,91 +1457,20 @@
"micro",
"router"
],
"time": "2019-04-16T16:47:29+00:00"
},
{
"name": "symfony/contracts",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/contracts.git",
"reference": "d3636025e8253c6144358ec0a62773cae588395b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/contracts/zipball/d3636025e8253c6144358ec0a62773cae588395b",
"reference": "d3636025e8253c6144358ec0a62773cae588395b",
"shasum": ""
},
"require": {
"php": "^7.1.3"
},
"require-dev": {
"psr/cache": "^1.0",
"psr/container": "^1.0",
"symfony/polyfill-intl-idn": "^1.10"
},
"suggest": {
"psr/cache": "When using the Cache contracts",
"psr/container": "When using the Service contracts",
"symfony/cache-contracts-implementation": "",
"symfony/event-dispatcher-implementation": "",
"symfony/http-client-contracts-implementation": "",
"symfony/service-contracts-implementation": "",
"symfony/translation-contracts-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\": ""
},
"exclude-from-classmap": [
"**/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "A set of abstractions extracted out of the Symfony components",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"time": "2019-04-27T14:29:50+00:00"
"time": "2019-08-20T18:46:05+00:00"
},
{
"name": "symfony/debug",
"version": "v4.2.8",
"version": "v4.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
"reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37"
"reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/2d279b6bb1d582dd5740d4d3251ae8c18812ed37",
"reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37",
"url": "https://api.github.com/repos/symfony/debug/zipball/afcdea44a2e399c1e4b52246ec8d54c715393ced",
"reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced",
"shasum": ""
},
"require": {
@@ -1492,7 +1486,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.2-dev"
"dev-master": "4.3-dev"
}
},
"autoload": {
@@ -1519,20 +1513,20 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
"time": "2019-04-11T11:27:41+00:00"
"time": "2019-08-20T14:27:59+00:00"
},
{
"name": "symfony/finder",
"version": "v4.2.8",
"version": "v4.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "e45135658bd6c14b61850bf131c4f09a55133f69"
"reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/e45135658bd6c14b61850bf131c4f09a55133f69",
"reference": "e45135658bd6c14b61850bf131c4f09a55133f69",
"url": "https://api.github.com/repos/symfony/finder/zipball/86c1c929f0a4b24812e1eb109262fc3372c8e9f2",
"reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2",
"shasum": ""
},
"require": {
@@ -1541,7 +1535,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.2-dev"
"dev-master": "4.3-dev"
}
},
"autoload": {
@@ -1568,20 +1562,20 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
"time": "2019-04-06T13:51:08+00:00"
"time": "2019-08-14T12:26:46+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.11.0",
"version": "v1.12.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
"reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
"reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17",
"reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17",
"shasum": ""
},
"require": {
@@ -1593,7 +1587,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.11-dev"
"dev-master": "1.12-dev"
}
},
"autoload": {
@@ -1627,26 +1621,26 @@
"portable",
"shim"
],
"time": "2019-02-06T07:57:58+00:00"
"time": "2019-08-06T08:03:45+00:00"
},
{
"name": "symfony/translation",
"version": "v4.2.8",
"version": "v4.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "181a426dd129cb496f12d7e7555f6d0b37a7615b"
"reference": "28498169dd334095fa981827992f3a24d50fed0f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/181a426dd129cb496f12d7e7555f6d0b37a7615b",
"reference": "181a426dd129cb496f12d7e7555f6d0b37a7615b",
"url": "https://api.github.com/repos/symfony/translation/zipball/28498169dd334095fa981827992f3a24d50fed0f",
"reference": "28498169dd334095fa981827992f3a24d50fed0f",
"shasum": ""
},
"require": {
"php": "^7.1.3",
"symfony/contracts": "^1.0.2",
"symfony/polyfill-mbstring": "~1.0"
"symfony/polyfill-mbstring": "~1.0",
"symfony/translation-contracts": "^1.1.6"
},
"conflict": {
"symfony/config": "<3.4",
@@ -1654,7 +1648,7 @@
"symfony/yaml": "<3.4"
},
"provide": {
"symfony/translation-contracts-implementation": "1.0"
"symfony/translation-implementation": "1.0"
},
"require-dev": {
"psr/log": "~1.0",
@@ -1664,6 +1658,7 @@
"symfony/finder": "~2.8|~3.0|~4.0",
"symfony/http-kernel": "~3.4|~4.0",
"symfony/intl": "~3.4|~4.0",
"symfony/service-contracts": "^1.1.2",
"symfony/var-dumper": "~3.4|~4.0",
"symfony/yaml": "~3.4|~4.0"
},
@@ -1675,7 +1670,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.2-dev"
"dev-master": "4.3-dev"
}
},
"autoload": {
@@ -1702,7 +1697,64 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
"time": "2019-05-01T12:55:36+00:00"
"time": "2019-08-26T08:55:16+00:00"
},
{
"name": "symfony/translation-contracts",
"version": "v1.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
"reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/325b17c24f3ee23cbecfa63ba809c6d89b5fa04a",
"reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a",
"shasum": ""
},
"require": {
"php": "^7.1.3"
},
"suggest": {
"symfony/translation-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Translation\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Generic abstractions related to translation",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"time": "2019-08-02T12:15:04+00:00"
},
{
"name": "tuupola/callable-handler",
@@ -1759,16 +1811,16 @@
},
{
"name": "tuupola/cors-middleware",
"version": "0.9.4",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/tuupola/cors-middleware.git",
"reference": "1b6d9927d7a643659cd0eb7ebeb8675b26df0a05"
"reference": "f8bee9b47729a36892c680c457ff824c04cfae70"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tuupola/cors-middleware/zipball/1b6d9927d7a643659cd0eb7ebeb8675b26df0a05",
"reference": "1b6d9927d7a643659cd0eb7ebeb8675b26df0a05",
"url": "https://api.github.com/repos/tuupola/cors-middleware/zipball/f8bee9b47729a36892c680c457ff824c04cfae70",
"reference": "f8bee9b47729a36892c680c457ff824c04cfae70",
"shasum": ""
},
"require": {
@@ -1776,8 +1828,8 @@
"php": "^7.1",
"psr/http-message": "^1.0.1",
"psr/http-server-middleware": "^1.0",
"tuupola/callable-handler": "^0.3.0|^0.4.0|^1.0",
"tuupola/http-factory": "^0.4.0|^1.0"
"tuupola/callable-handler": "^1.0",
"tuupola/http-factory": "^1.0"
},
"require-dev": {
"codedungeon/phpunit-result-printer": "^0.23.2",
@@ -1814,20 +1866,20 @@
"psr-15",
"psr-7"
],
"time": "2019-03-24T08:53:13+00:00"
"time": "2019-06-04T06:54:19+00:00"
},
{
"name": "tuupola/http-factory",
"version": "1.0.3",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/tuupola/http-factory.git",
"reference": "1fd4eaafe3a6e0c26d288e3b3e17d777ea1991bf"
"reference": "5fbde4c65a10d09a85652684a6e569542265a749"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tuupola/http-factory/zipball/1fd4eaafe3a6e0c26d288e3b3e17d777ea1991bf",
"reference": "1fd4eaafe3a6e0c26d288e3b3e17d777ea1991bf",
"url": "https://api.github.com/repos/tuupola/http-factory/zipball/5fbde4c65a10d09a85652684a6e569542265a749",
"reference": "5fbde4c65a10d09a85652684a6e569542265a749",
"shasum": ""
},
"require": {
@@ -1871,7 +1923,7 @@
"psr-17",
"psr-7"
],
"time": "2019-01-11T15:13:01+00:00"
"time": "2019-08-07T07:10:58+00:00"
}
],
"packages-dev": [],

View File

@@ -14,11 +14,12 @@
# The settings defined here below
# Either "production", "dev" or "prerelease"
# Either "production", "dev", "demo" or "prerelease"
# ("demo" and "prerelease" is reserved to be used only on the offical demo instances)
Setting('MODE', 'production');
# Either "en" or "de" or the filename (without extension) of
# one of the other available localization files in the "/localization" directory
# Either "en" or "de" or the directory name of
# one of the other available localization folders in the "/localization" directory
Setting('CULTURE', 'en');
# This is used to define the first day of a week for calendar views in the frontend,
@@ -26,6 +27,9 @@ Setting('CULTURE', 'en');
# Needs to be a number where Sunday = 0, Monday = 1 and so forth
Setting('CALENDAR_FIRST_DAY_OF_WEEK', '');
# If calendars should show week numbers
Setting('CALENDAR_SHOW_WEEK_OF_YEAR', true);
# To keep it simple: grocy does not handle any currency conversions,
# this here is used to format all money values,
# so doesn't matter really matter, but should be the
@@ -42,15 +46,20 @@ Setting('BASE_URL', '/');
# see /data/plugins/DemoBarcodeLookupPlugin.php for an example implementation
Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'DemoBarcodeLookupPlugin');
# If, however, your webserver does not support URL rewriting,
# set this to true
# If, however, your webserver does not support URL rewriting, set this to true
Setting('DISABLE_URL_REWRITING', false);
# Specify an custom homepage if desired - by default the homepage will be set to the stock overview,
# this needs to be one of the following values:
# stock, shoppinglist, recipes, chores, tasks, batteries, equipment, calendar
Setting('ENTRY_PAGE', 'stock');
# Set this to true if you want to disable authentication / the login screen,
# places where user context is needed will then use the default (first existing) user
Setting('DISABLE_AUTH', false);
# Set this to true if you want to disable the ability to scan a barcode via the device camera (Browser API)
Setting('DISABLE_BROWSER_BARCODE_CAMERA_SCANNING', false);
# Default user settings
@@ -95,8 +104,6 @@ DefaultUserSetting('show_clock_in_header', false);
DefaultUserSetting('shopping_list_to_stock_workflow_auto_submit_when_prefilled', false);
# Feature flags
# grocy was initially about "stock management for your household", many other things
# came and still come by, because they are useful - here you can disable the parts
@@ -110,3 +117,14 @@ Setting('FEATURE_FLAG_TASKS', true);
Setting('FEATURE_FLAG_BATTERIES', true);
Setting('FEATURE_FLAG_EQUIPMENT', true);
Setting('FEATURE_FLAG_CALENDAR', true);
# Sub feature flags
Setting('FEATURE_FLAG_STOCK_PRICE_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_LOCATION_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING', true);
# Feature settings
Setting('FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT', true); // When set to false, opened products will not be considered for minimum stock amounts

View File

@@ -16,21 +16,10 @@ class BaseController
$localizationService = new LocalizationService(GROCY_CULTURE);
$this->LocalizationService = $localizationService;
if (GROCY_MODE === 'prerelease')
{
$commitHash = trim(exec('git log --pretty="%h" -n1 HEAD'));
$commitDate = trim(exec('git log --date=iso --pretty="%cd" -n1 HEAD'));
$container->view->set('version', "pre-release-$commitHash");
$container->view->set('releaseDate', \substr($commitDate, 0, 19));
}
else
{
$applicationService = new ApplicationService();
$versionInfo = $applicationService->GetInstalledVersion();
$container->view->set('version', $versionInfo->Version);
$container->view->set('releaseDate', $versionInfo->ReleaseDate);
}
$container->view->set('__t', function(string $text, ...$placeholderValues) use($localizationService)
{
@@ -64,6 +53,8 @@ class BaseController
}
$container->view->set('featureFlags', $constants);
$container->view->set('userentitiesForSidebar', $this->Database->userentities()->where('show_in_sidebar_menu = 1')->orderBy('name'));
try
{
$usersService = new UsersService();

View File

@@ -70,4 +70,37 @@ class ChoresApiController extends BaseApiController
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function CalculateNextExecutionAssignments(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$requestBody = $request->getParsedBody();
$choreId = null;
if (array_key_exists('chore_id', $requestBody) && !empty($requestBody['chore_id']) && is_numeric($requestBody['chore_id']))
{
$choreId = intval($requestBody['chore_id']);
}
if ($choreId === null)
{
$chores = $this->Database->chores();
foreach ($chores as $chore)
{
$this->ChoresService->CalculateNextExecutionAssignment($chore->id);
}
}
else
{
$this->ChoresService->CalculateNextExecutionAssignment($choreId);
}
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
}

View File

@@ -28,7 +28,8 @@ class ChoresController extends BaseController
'currentChores' => $this->ChoresService->GetCurrent(),
'nextXDays' => $nextXDays,
'userfields' => $this->UserfieldsService->GetFields('chores'),
'userfieldValues' => $this->UserfieldsService->GetAllValues('chores')
'userfieldValues' => $this->UserfieldsService->GetAllValues('chores'),
'users' => $usersService->GetUsersAsDto()
]);
}
@@ -60,21 +61,30 @@ class ChoresController extends BaseController
public function ChoreEditForm(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$usersService = new UsersService();
$users = $usersService->GetUsersAsDto();
if ($args['choreId'] == 'new')
{
return $this->AppContainer->view->render($response, 'choreform', [
'periodTypes' => GetClassConstants('\Grocy\Services\ChoresService'),
'periodTypes' => GetClassConstants('\Grocy\Services\ChoresService', 'CHORE_PERIOD_TYPE_'),
'mode' => 'create',
'userfields' => $this->UserfieldsService->GetFields('chores')
'userfields' => $this->UserfieldsService->GetFields('chores'),
'assignmentTypes' => GetClassConstants('\Grocy\Services\ChoresService', 'CHORE_ASSIGNMENT_TYPE_'),
'users' => $users,
'products' => $this->Database->products()->orderBy('name')
]);
}
else
{
return $this->AppContainer->view->render($response, 'choreform', [
'chore' => $this->Database->chores($args['choreId']),
'periodTypes' => GetClassConstants('\Grocy\Services\ChoresService'),
'periodTypes' => GetClassConstants('\Grocy\Services\ChoresService', 'CHORE_PERIOD_TYPE_'),
'mode' => 'edit',
'userfields' => $this->UserfieldsService->GetFields('chores')
'userfields' => $this->UserfieldsService->GetFields('chores'),
'assignmentTypes' => GetClassConstants('\Grocy\Services\ChoresService', 'CHORE_ASSIGNMENT_TYPE_'),
'users' => $users,
'products' => $this->Database->products()->orderBy('name')
]);
}
}

View File

@@ -51,7 +51,32 @@ class FilesApiController extends BaseApiController
throw new \Exception('Invalid filename');
}
$forceServeAs = null;
if (isset($request->getQueryParams()['force_serve_as']) && !empty($request->getQueryParams()['force_serve_as']))
{
$forceServeAs = $request->getQueryParams()['force_serve_as'];
}
if ($forceServeAs == FilesService::FILE_SERVE_TYPE_PICTURE)
{
$bestFitHeight = null;
if (isset($request->getQueryParams()['best_fit_height']) && !empty($request->getQueryParams()['best_fit_height']) && is_numeric($request->getQueryParams()['best_fit_height']))
{
$bestFitHeight = $request->getQueryParams()['best_fit_height'];
}
$bestFitWidth = null;
if (isset($request->getQueryParams()['best_fit_width']) && !empty($request->getQueryParams()['best_fit_width']) && is_numeric($request->getQueryParams()['best_fit_width']))
{
$bestFitWidth = $request->getQueryParams()['best_fit_width'];
}
$filePath = $this->FilesService->DownscaleImage($args['group'], $fileName, $bestFitHeight, $bestFitWidth);
}
else
{
$filePath = $this->FilesService->GetFilePath($args['group'], $fileName);
}
if (file_exists($filePath))
{

View File

@@ -113,6 +113,25 @@ class GenericEntityApiController extends BaseApiController
}
}
public function SearchObjects(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
if ($this->IsValidEntity($args['entity']) && !$this->IsEntityWithPreventedListing($args['entity']))
{
try
{
return $this->ApiResponse($this->Database->{$args['entity']}()->where('name LIKE ?', '%' . $args['searchString'] . '%'));
}
catch (\PDOException $ex)
{
return $this->GenericErrorResponse($response, 'The given entity has no field "name"');
}
}
else
{
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
}
}
public function GetUserfields(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try

View File

@@ -22,6 +22,25 @@ class GenericEntityController extends BaseController
]);
}
public function UserentitiesList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->AppContainer->view->render($response, 'userentities', [
'userentities' => $this->Database->userentities()->orderBy('name')
]);
}
public function UserobjectsList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$userentity = $this->Database->userentities()->where('name = :1', $args['userentityName'])->fetch();
return $this->AppContainer->view->render($response, 'userobjects', [
'userentity' => $userentity,
'userobjects' => $this->Database->userobjects()->where('userentity_id = :1', $userentity->id),
'userfields' => $this->UserfieldsService->GetFields('userentity-' . $args['userentityName']),
'userfieldValues' => $this->UserfieldsService->GetAllValues('userentity-' . $args['userentityName'])
]);
}
public function UserfieldEditForm(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
if ($args['userfieldId'] == 'new')
@@ -42,4 +61,44 @@ class GenericEntityController extends BaseController
]);
}
}
public function UserentityEditForm(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
if ($args['userentityId'] == 'new')
{
return $this->AppContainer->view->render($response, 'userentityform', [
'mode' => 'create'
]);
}
else
{
return $this->AppContainer->view->render($response, 'userentityform', [
'mode' => 'edit',
'userentity' => $this->Database->userentities($args['userentityId'])
]);
}
}
public function UserobjectEditForm(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$userentity = $this->Database->userentities()->where('name = :1', $args['userentityName'])->fetch();
if ($args['userobjectId'] == 'new')
{
return $this->AppContainer->view->render($response, 'userobjectform', [
'userentity' => $userentity,
'mode' => 'create',
'userfields' => $this->UserfieldsService->GetFields('userentity-' . $args['userentityName'])
]);
}
else
{
return $this->AppContainer->view->render($response, 'userobjectform', [
'userentity' => $userentity,
'mode' => 'edit',
'userobject' => $this->Database->userobjects($args['userobjectId']),
'userfields' => $this->UserfieldsService->GetFields('userentity-' . $args['userentityName'])
]);
}
}
}

View File

@@ -63,13 +63,15 @@ class RecipesController extends BaseController
'selectedRecipe' => $selectedRecipe,
'selectedRecipePositionsResolved' => $selectedRecipePositionsResolved,
'products' => $this->Database->products(),
'quantityunits' => $this->Database->quantity_units(),
'quantityUnits' => $this->Database->quantity_units(),
'selectedRecipeSubRecipes' => $selectedRecipeSubRecipes,
'selectedRecipeSubRecipesPositions' => $selectedRecipeSubRecipesPositions,
'includedRecipeIdsAbsolute' => $includedRecipeIdsAbsolute,
'selectedRecipeTotalCosts' => FindObjectInArrayByPropertyValue($recipesResolved, 'recipe_id', $selectedRecipe->id)->costs,
'selectedRecipeTotalCalories' => FindObjectInArrayByPropertyValue($recipesResolved, 'recipe_id', $selectedRecipe->id)->calories,
'userfields' => $this->UserfieldsService->GetFields('recipes'),
'userfieldValues' => $this->UserfieldsService->GetAllValues('recipes')
'userfieldValues' => $this->UserfieldsService->GetAllValues('recipes'),
'quantityUnitConversionsResolved' => $this->Database->quantity_unit_conversions_resolved()
]);
}
@@ -96,7 +98,8 @@ class RecipesController extends BaseController
'recipesResolved' => $this->RecipesService->GetRecipesResolved(),
'recipes' => $this->Database->recipes()->where('type', RecipesService::RECIPE_TYPE_NORMAL)->orderBy('name'),
'recipeNestings' => $this->Database->recipes_nestings()->where('recipe_id', $recipeId),
'userfields' => $this->UserfieldsService->GetFields('recipes')
'userfields' => $this->UserfieldsService->GetFields('recipes'),
'quantityUnitConversionsResolved' => $this->Database->quantity_unit_conversions_resolved()
]);
}
@@ -107,8 +110,10 @@ class RecipesController extends BaseController
return $this->AppContainer->view->render($response, 'recipeposform', [
'mode' => 'create',
'recipe' => $this->Database->recipes($args['recipeId']),
'recipePos' => new \stdClass(),
'products' => $this->Database->products()->orderBy('name'),
'quantityUnits' => $this->Database->quantity_units()->orderBy('name')
'quantityUnits' => $this->Database->quantity_units()->orderBy('name'),
'quantityUnitConversionsResolved' => $this->Database->quantity_unit_conversions_resolved()
]);
}
else
@@ -118,7 +123,8 @@ class RecipesController extends BaseController
'recipe' => $this->Database->recipes($args['recipeId']),
'recipePos' => $this->Database->recipes_pos($args['recipePosId']),
'products' => $this->Database->products()->orderBy('name'),
'quantityUnits' => $this->Database->quantity_units()->orderBy('name')
'quantityUnits' => $this->Database->quantity_units()->orderBy('name'),
'quantityUnitConversionsResolved' => $this->Database->quantity_unit_conversions_resolved()
]);
}
}
@@ -130,12 +136,19 @@ class RecipesController extends BaseController
$events = array();
foreach($this->Database->meal_plan() as $mealPlanEntry)
{
$recipe = FindObjectInArrayByPropertyValue($recipes, 'id', $mealPlanEntry['recipe_id']);
$title = '';
if ($recipe !== null)
{
$title = $recipe->name;
}
$events[] = array(
'id' => $mealPlanEntry['id'],
'title' => FindObjectInArrayByPropertyValue($recipes, 'id', $mealPlanEntry['recipe_id'])->name,
'title' => $title,
'start' => $mealPlanEntry['day'],
'date_format' => 'date',
'recipe' => json_encode(FindObjectInArrayByPropertyValue($recipes, 'id', $mealPlanEntry['recipe_id'])),
'recipe' => json_encode($recipe),
'mealPlanEntry' => json_encode($mealPlanEntry)
);
}

View File

@@ -67,7 +67,7 @@ class StockApiController extends BaseApiController
throw new \Exception('An amount is required');
}
$bestBeforeDate = date('Y-m-d');
$bestBeforeDate = null;
if (array_key_exists('best_before_date', $requestBody) && IsIsoDate($requestBody['best_before_date']))
{
$bestBeforeDate = $requestBody['best_before_date'];
@@ -100,6 +100,19 @@ class StockApiController extends BaseApiController
}
}
public function AddProductByBarcode(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$args['productId'] = $this->StockService->GetProductIdFromBarcode($args['barcode']);
return $this->AddProduct($request, $response, $args);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function ConsumeProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$requestBody = $request->getParsedBody();
@@ -149,6 +162,19 @@ class StockApiController extends BaseApiController
}
}
public function ConsumeProductByBarcode(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$args['productId'] = $this->StockService->GetProductIdFromBarcode($args['barcode']);
return $this->ConsumeProduct($request, $response, $args);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function InventoryProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$requestBody = $request->getParsedBody();
@@ -165,7 +191,7 @@ class StockApiController extends BaseApiController
throw new \Exception('An new amount is required');
}
$bestBeforeDate = date('Y-m-d');
$bestBeforeDate = null;
if (array_key_exists('best_before_date', $requestBody) && IsIsoDate($requestBody['best_before_date']))
{
$bestBeforeDate = $requestBody['best_before_date'];
@@ -192,6 +218,19 @@ class StockApiController extends BaseApiController
}
}
public function InventoryProductByBarcode(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$args['productId'] = $this->StockService->GetProductIdFromBarcode($args['barcode']);
return $this->InventoryProduct($request, $response, $args);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function OpenProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$requestBody = $request->getParsedBody();
@@ -223,6 +262,19 @@ class StockApiController extends BaseApiController
}
}
public function OpenProductByBarcode(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$args['productId'] = $this->StockService->GetProductIdFromBarcode($args['barcode']);
return $this->OpenProduct($request, $response, $args);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function CurrentStock(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->ApiResponse($this->StockService->GetCurrentStock());
@@ -288,6 +340,79 @@ class StockApiController extends BaseApiController
}
}
public function AddItemToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$requestBody = $request->getParsedBody();
$listId = 1;
$amount = 1;
$productId = null;
if (array_key_exists('list_id', $requestBody) && !empty($requestBody['list_id']) && is_numeric($requestBody['list_id']))
{
$listId = intval($requestBody['list_id']);
}
if (array_key_exists('product_amount', $requestBody) && !empty($requestBody['product_amount']) && is_numeric($requestBody['product_amount']))
{
$amount = intval($requestBody['product_amount']);
}
if (array_key_exists('product_id', $requestBody) && !empty($requestBody['product_id']) && is_numeric($requestBody['product_id']))
{
$productId = intval($requestBody['product_id']);
}
if ($productId == null)
{
throw new \Exception("No product id was supplied");
}
$this->StockService->AddProductToShoppingList($productId, $amount, $listId);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function RemoveItemFromShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$requestBody = $request->getParsedBody();
$listId = 1;
$amount = 1;
$productId = null;
if (array_key_exists('list_id', $requestBody) && !empty($requestBody['list_id']) && is_numeric($requestBody['list_id']))
{
$listId = intval($requestBody['list_id']);
}
if (array_key_exists('product_amount', $requestBody) && !empty($requestBody['product_amount']) && is_numeric($requestBody['product_amount']))
{
$amount = intval($requestBody['product_amount']);
}
if (array_key_exists('product_id', $requestBody) && !empty($requestBody['product_id']) && is_numeric($requestBody['product_id']))
{
$productId = intval($requestBody['product_id']);
}
if ($productId == null)
{
throw new \Exception("No product id was supplied");
}
$this->StockService->RemoveProductFromShoppingList($productId, $amount, $listId);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function ExternalBarcodeLookup(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
@@ -323,4 +448,23 @@ class StockApiController extends BaseApiController
{
return $this->ApiResponse($this->StockService->GetProductStockEntries($args['productId']));
}
public function StockBooking(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$stockLogRow = $this->Database->stock_log($args['bookingId']);
if ($stockLogRow === null)
{
throw new \Exception('Stock booking does not exist');
}
return $this->ApiResponse($stockLogRow);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
}

View File

@@ -77,7 +77,9 @@ class StockController extends BaseController
'missingProducts' => $this->StockService->GetMissingProducts(),
'productGroups' => $this->Database->product_groups()->orderBy('name'),
'shoppingLists' => $this->Database->shopping_lists()->orderBy('name'),
'selectedShoppingListId' => $listId
'selectedShoppingListId' => $listId,
'userfields' => $this->UserfieldsService->GetFields('products'),
'userfieldValues' => $this->UserfieldsService->GetAllValues('products')
]);
}
@@ -139,18 +141,25 @@ class StockController extends BaseController
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'productgroups' => $this->Database->product_groups()->orderBy('name'),
'userfields' => $this->UserfieldsService->GetFields('products'),
'products' => $this->Database->products()->where('parent_product_id IS NULL')->orderBy('name'),
'isSubProductOfOthers' => false,
'mode' => 'create'
]);
}
else
{
$product = $this->Database->products($args['productId']);
return $this->AppContainer->view->render($response, 'productform', [
'product' => $this->Database->products($args['productId']),
'product' => $product,
'locations' => $this->Database->locations()->orderBy('name'),
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'productgroups' => $this->Database->product_groups()->orderBy('name'),
'userfields' => $this->UserfieldsService->GetFields('products'),
'mode' => 'edit'
'products' => $this->Database->products()->where('id != :1 AND parent_product_id IS NULL', $product->id)->orderBy('name'),
'isSubProductOfOthers' => $this->Database->products()->where('parent_product_id = :1', $product->id)->count() !== 0,
'mode' => 'edit',
'quConversions' => $this->Database->quantity_unit_conversions()
]);
}
}
@@ -206,12 +215,16 @@ class StockController extends BaseController
}
else
{
$quantityUnit = $this->Database->quantity_units($args['quantityunitId']);
return $this->AppContainer->view->render($response, 'quantityunitform', [
'quantityunit' => $this->Database->quantity_units($args['quantityunitId']),
'quantityUnit' => $quantityUnit,
'mode' => 'edit',
'userfields' => $this->UserfieldsService->GetFields('quantity_units'),
'pluralCount' => $this->LocalizationService->GetPluralCount(),
'pluralRule' => $this->LocalizationService->GetPluralDefinition()
'pluralRule' => $this->LocalizationService->GetPluralDefinition(),
'defaultQuConversions' => $this->Database->quantity_unit_conversions()->where('from_qu_id = :1 AND product_id IS NULL', $quantityUnit->id),
'quantityUnits' => $this->Database->quantity_units()
]);
}
}
@@ -262,4 +275,58 @@ class StockController extends BaseController
'quantityunits' => $this->Database->quantity_units()->orderBy('name')
]);
}
public function LocationContentSheet(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->AppContainer->view->render($response, 'locationcontentsheet', [
'products' => $this->Database->products()->orderBy('name'),
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'locations' => $this->Database->locations()->orderBy('name'),
'currentStockLocationContent' => $this->StockService->GetCurrentStockLocationContent()
]);
}
public function QuantityUnitConversionEditForm(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$product = null;
if (isset($request->getQueryParams()['product']))
{
$product = $this->Database->products($request->getQueryParams()['product']);
}
$defaultQuUnit = null;
if (isset($request->getQueryParams()['qu-unit']))
{
$defaultQuUnit = $this->Database->quantity_units($request->getQueryParams()['qu-unit']);
}
if ($args['quConversionId'] == 'new')
{
return $this->AppContainer->view->render($response, 'quantityunitconversionform', [
'mode' => 'create',
'userfields' => $this->UserfieldsService->GetFields('quantity_unit_conversions'),
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'product' => $product,
'defaultQuUnit' => $defaultQuUnit
]);
}
else
{
return $this->AppContainer->view->render($response, 'quantityunitconversionform', [
'quConversion' => $this->Database->quantity_unit_conversions($args['quConversionId']),
'mode' => 'edit',
'userfields' => $this->UserfieldsService->GetFields('quantity_unit_conversions'),
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'product' => $product,
'defaultQuUnit' => $defaultQuUnit
]);
}
}
public function QuantityUnitPluralFormTesting(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->AppContainer->view->render($response, 'quantityunitpluraltesting', [
'quantityUnits' => $this->Database->quantity_units()->orderBy('name')
]);
}
}

View File

@@ -8,14 +8,14 @@ use \Grocy\Services\DemoDataGeneratorService;
class SystemController extends BaseController
{
protected $ApplicationService;
public function __construct(\Slim\Container $container)
{
parent::__construct($container);
$this->ApplicationService = new ApplicationService();
}
protected $ApplicationService;
public function Root(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
// Schema migration is done here
@@ -31,6 +31,64 @@ class SystemController extends BaseController
return $response->withRedirect($this->AppContainer->UrlManager->ConstructUrl($this->GetEntryPageRelative()));
}
/**
* Get the entry page of the application based on the value of the entry page setting.
*
* We fallback to the about page when no entry page is specified or
* when the specified entry page has been disabled.
*
* @return string
*/
private function GetEntryPageRelative()
{
if (defined('GROCY_ENTRY_PAGE')) {
$entryPage = constant('GROCY_ENTRY_PAGE');
} else {
$entryPage = 'stock';
}
// Stock
if ($entryPage === 'stock' && constant('GROCY_FEATURE_FLAG_STOCK')) {
return '/stockoverview';
}
// Shoppinglist
if ($entryPage === 'shoppinglist' && constant('GROCY_FEATURE_FLAG_SHOPPINGLIST')) {
return '/shoppinglist';
}
// Recipes
if ($entryPage === 'recipes' && constant('GROCY_FEATURE_FLAG_RECIPES')) {
return '/recipes';
}
// Chores
if ($entryPage === 'chores' && constant('GROCY_FEATURE_FLAG_CHORES')) {
return '/choresoverview';
}
// Tasks
if ($entryPage === 'tasks' && constant('GROCY_FEATURE_FLAG_TASKS')) {
return '/tasks';
}
// Batteries
if ($entryPage === 'batteries' && constant('GROCY_FEATURE_FLAG_BATTERIES')) {
return '/batteriesoverview';
}
if ($entryPage === 'equipment' && constant('GROCY_FEATURE_FLAG_EQUIPMENT')) {
return '/equipment';
}
// Calendar
if ($entryPage === 'calendar' && constant('GROCY_FEATURE_FLAG_CALENDAR')) {
return '/calendar';
}
return '/about';
}
public function About(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->AppContainer->view->render($response, 'about', [
@@ -39,23 +97,8 @@ class SystemController extends BaseController
]);
}
private function GetEntryPageRelative()
public function BarcodeScannerTesting(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$entryPage = '/stockoverview';
if (!GROCY_FEATURE_FLAG_STOCK)
{
$entryPage = '/choresoverview';
}
if (!GROCY_FEATURE_FLAG_CHORES)
{
$entryPage = '/batteriesoverview';
}
if (!GROCY_FEATURE_FLAG_BATTERIES)
{
$entryPage = '/equipment';
}
return $entryPage;
return $this->AppContainer->view->render($response, 'barcodescannertesting');
}
}

View File

@@ -2,11 +2,8 @@
"openapi": "3.0.0",
"info": {
"title": "grocy REST API",
"description": "Authentication is done via API keys (header *GROCY-API-KEY*), which you can manage [here](PlaceHolderManageApiKeysUrl).<br>Additionally requests from within the frontend are also valid (via session cookie).",
"description": "Authentication is done via API keys (header *GROCY-API-KEY* or same named query parameter), which you can manage [here](PlaceHolderManageApiKeysUrl).<br>Additionally requests from within the frontend are also valid (via session cookie).",
"version": "xxx",
"contact": {
"email": "bernd@berrnd.de"
},
"license": {
"name": "grocy.info",
"url": "https://grocy.info"
@@ -452,6 +449,81 @@
}
}
},
"/objects/{entity}/search/{searchString}": {
"get": {
"summary": "Returns all objects of the given entity where the field \"name\" contains the search string (so only works for entities which have that field)",
"tags": [
"Generic entity interactions"
],
"parameters": [
{
"in": "path",
"name": "entity",
"required": true,
"description": "A valid entity name",
"schema": {
"$ref": "#/components/internalSchemas/ExposedEntity"
}
},
{
"in": "path",
"name": "searchString",
"required": true,
"description": "The search string",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "An entity object",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"oneOf": [
{
"$ref": "#/components/schemas/Product"
},
{
"$ref": "#/components/schemas/Chore"
},
{
"$ref": "#/components/schemas/Battery"
},
{
"$ref": "#/components/schemas/Location"
},
{
"$ref": "#/components/schemas/QuantityUnit"
},
{
"$ref": "#/components/schemas/ShoppingListItem"
},
{
"$ref": "#/components/schemas/StockEntry"
}
]
}
}
}
}
},
"400": {
"description": "The operation was not successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/userfields/{entity}/{objectId}": {
"get": {
"summary": "Returns all userfields with their values of the given object of the given entity",
@@ -580,6 +652,37 @@
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "force_serve_as",
"required": false,
"description": "Force the file to be served as the given type",
"schema": {
"type": "string",
"enum": [
"picture"
]
}
},
{
"in": "query",
"name": "best_fit_height",
"required": false,
"description": "Only when using `force_serve_as` = `picture`: Downscale the picture to the given height while maintaining the aspect ratio",
"schema": {
"type": "integer"
}
}
,
{
"in": "query",
"name": "best_fit_width",
"required": false,
"description": "Only when using `force_serve_as` = `picture`: Downscale the picture to the given width while maintaining the aspect ratio",
"schema": {
"type": "integer"
}
}
],
"responses": {
@@ -957,7 +1060,7 @@
],
"parameters": [
{
"in": "path",
"in": "query",
"name": "expiring_days",
"required": false,
"description": "The number of days in which products are considered expiring soon",
@@ -1025,47 +1128,6 @@
}
}
},
"/stock/products/by-barcode/{barcode}": {
"get": {
"summary": "Returns details of the given product by its barcode",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "A ProductDetailsResponse object",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProductDetailsResponse"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Unknown barcode)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/{productId}/entries": {
"get": {
"summary": "Returns all stock entries of the given product in order of next use (first expiring first, then first in first out)",
@@ -1180,7 +1242,7 @@
"properties": {
"amount": {
"type": "number",
"format": "double",
"format": "number",
"description": "The amount to add - please note that when tare weight handling for the product is enabled, this needs to be the amount including the container weight (gross), the amount to be posted will be automatically calculated based on what is in stock and the defined tare weight"
},
"best_before_date": {
@@ -1193,7 +1255,7 @@
},
"price": {
"type": "number",
"format": "double",
"format": "number",
"description": "The price per purchase quantity unit in configured currency"
},
"location_id": {
@@ -1261,7 +1323,7 @@
"type": "object",
"properties": {
"amount": {
"type": "double",
"type": "number",
"description": "The amount to remove - please note that when tare weight handling for the product is enabled, this needs to be the amount including the container weight (gross), the amount to be posted will be automatically calculated based on what is in stock and the defined tare weight"
},
"transaction_type": {
@@ -1354,7 +1416,7 @@
},
"price": {
"type": "number",
"format": "double",
"format": "number",
"description": "If omitted, the last price of the product is used (only applies to added products)"
}
}
@@ -1411,7 +1473,344 @@
"type": "object",
"properties": {
"amount": {
"type": "double",
"type": "number",
"description": "The amount to mark as opened"
},
"stock_entry_id": {
"type": "string",
"description": "A specific stock entry id to open, if used, the amount has to be 1"
}
},
"example": {
"amount": 1
}
}
}
}
},
"responses": {
"200": {
"description": "The operation was successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StockLogEntry"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing product, given amount > current unopened stock amount)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/by-barcode/{barcode}": {
"get": {
"summary": "Returns details of the given product by its barcode",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "A ProductDetailsResponse object",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProductDetailsResponse"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Unknown barcode)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/by-barcode/{barcode}/add": {
"post": {
"summary": "Adds the given amount of the by its barcode given product to stock",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"format": "number",
"description": "The amount to add - please note that when tare weight handling for the product is enabled, this needs to be the amount including the container weight (gross), the amount to be posted will be automatically calculated based on what is in stock and the defined tare weight"
},
"best_before_date": {
"type": "string",
"format": "date",
"description": "The best before date of the product to add, when omitted, the current date is used"
},
"transaction_type": {
"$ref": "#/components/internalSchemas/StockTransactionType"
},
"price": {
"type": "number",
"format": "number",
"description": "The price per purchase quantity unit in configured currency"
},
"location_id": {
"type": "number",
"format": "integer",
"description": "If omitted, the default location of the product is used"
}
},
"example": {
"amount": 1,
"best_before_date": "2019-01-19",
"transaction_type": "purchase",
"price": "1.99"
}
}
}
}
},
"responses": {
"200": {
"description": "The operation was successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StockLogEntry"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing product, invalid transaction type)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/by-barcode/{barcode}/consume": {
"post": {
"summary": "Removes the given amount of the by its barcode given product from stock",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The amount to remove - please note that when tare weight handling for the product is enabled, this needs to be the amount including the container weight (gross), the amount to be posted will be automatically calculated based on what is in stock and the defined tare weight"
},
"transaction_type": {
"$ref": "#/components/internalSchemas/StockTransactionType"
},
"spoiled": {
"type": "boolean",
"description": "True when the given product was spoiled, defaults to false"
},
"stock_entry_id": {
"type": "string",
"description": "A specific stock entry id to consume, if used, the amount has to be 1"
},
"recipe_id": {
"type": "number",
"format": "integer",
"description": "A valid recipe id for which this product was used (for statistical purposes only)"
}
},
"example": {
"amount": 1,
"transaction_type": "consume",
"spoiled": false
}
}
}
}
},
"responses": {
"200": {
"description": "The operation was successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StockLogEntry"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing product, invalid transaction type, given amount > current stock amount)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/by-barcode/{barcode}/inventory": {
"post": {
"summary": "Inventories the by its barcode given product (adds/removes based on the given new amount)",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"new_amount": {
"type": "integer",
"description": "The new current amount for the given product - please note that when tare weight handling for the product is enabled, this needs to be the amount including the container weight (gross), the amount to be posted will be automatically calculated based on what is in stock and the defined tare weight"
},
"best_before_date": {
"type": "string",
"format": "date",
"description": "The best before date which applies to added products"
},
"location_id": {
"type": "number",
"format": "integer",
"description": "If omitted, the default location of the product is used (only applies to added products)"
},
"price": {
"type": "number",
"format": "number",
"description": "If omitted, the last price of the product is used (only applies to added products)"
}
}
}
}
}
},
"responses": {
"200": {
"description": "The operation was successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StockLogEntry"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing product)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/products/by-barcode/{barcode}/open": {
"post": {
"summary": "Marks the given amount of the by its barcode given product as opened",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "barcode",
"required": true,
"description": "Barcode",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The amount to mark as opened"
},
"stock_entry_id": {
@@ -1534,6 +1933,151 @@
}
}
},
"/stock/shoppinglist/add-product": {
"post": {
"summary": "Adds the given product to the given shopping list",
"tags": [
"Stock"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"product_id": {
"type": "integer",
"description": "A valid product id of the item on the shopping list"
},
"list_id": {
"type": "integer",
"description": "A valid shopping list id, when omitted, the default shopping list (with id 1) is used"
},
"product_amount": {
"type": "integer",
"description": "The amount of product units to add, when omitted, the default amount of 1 is used"
}
},
"example": {
"product_id": 3,
"list_id": 2,
"product_amount": 5
}
}
}
}
},
"responses": {
"204": {
"description": "The operation was successful"
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing shopping list, Invalid product id supplied)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/shoppinglist/remove-product": {
"post": {
"summary": "Removes the given product from the given shopping list, if it is on it",
"tags": [
"Stock"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"product_id": {
"type": "integer",
"description": "A valid product id of the item on the shopping list"
},
"list_id": {
"type": "integer",
"description": "A valid shopping list id, when omitted, the default shopping list (with id 1) is used"
},
"product_amount": {
"type": "integer",
"description": "The amount of product units to remove, when omitted, the default amount of 1 is used"
}
},
"example": {
"product_id": 3,
"list_id": 2,
"product_amount": 5
}
}
}
}
},
"responses": {
"204": {
"description": "The operation was successful"
},
"400": {
"description": "The operation was not successful (possible errors are: Not existing shopping list, Invalid product id supplied)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/bookings/{bookingId}": {
"get": {
"summary": "Returns the given stock booking",
"tags": [
"Stock"
],
"parameters": [
{
"in": "path",
"name": "bookingId",
"required": true,
"description": "A valid stock booking id",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "A StockLogEntry object",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StockLogEntry"
}
}
}
},
"400": {
"description": "The operation was not successful (possible errors are: Invalid stock booking id)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/stock/bookings/{bookingId}/undo": {
"post": {
"summary": "Undoes a booking",
@@ -1921,6 +2465,48 @@
}
}
},
"/chores/executions/calculate-next-assignments": {
"post": {
"summary": "(Re)calculates all next user assignments of all chores",
"tags": [
"Chores"
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"chore_id": {
"type": "integer",
"description": "The chore id of the chore which next user assignment should be (re)calculated, when omitted, the next user assignments of all chores will (re)caluclated"
}
},
"example": {
"chore_id": 1
}
}
}
}
},
"responses": {
"204": {
"description": "The operation was successful"
},
"400": {
"description": "The operation was not successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/batteries": {
"get": {
"summary": "Returns all batteries incl. the next estimated charge time per battery",
@@ -2251,6 +2837,7 @@
"batteries",
"locations",
"quantity_units",
"quantity_unit_conversions",
"shopping_list",
"shopping_lists",
"recipes",
@@ -2262,6 +2849,8 @@
"equipment",
"api_keys",
"userfields",
"userentities",
"userobjects",
"meal_plan"
]
},
@@ -2314,11 +2903,11 @@
},
"qu_factor_purchase_to_stock": {
"type": "number",
"format": "double"
"format": "number"
},
"tare_weight": {
"type": "number",
"format": "double"
"format": "number"
},
"barcode": {
"type": "string",
@@ -2440,7 +3029,7 @@
"type": "integer"
},
"amount": {
"type": "double"
"type": "number"
},
"best_before_date": {
"type": "string",
@@ -2455,7 +3044,7 @@
"description": "A unique id which references this stock entry during its lifetime"
},
"price": {
"type": "double"
"type": "number"
},
"open": {
"type": "integer"
@@ -2500,7 +3089,7 @@
},
"costs": {
"type": "number",
"format": "double"
"format": "number"
}
},
"example": {
@@ -2543,7 +3132,7 @@
},
"last_price": {
"type": "number",
"format": "double"
"format": "number"
},
"location": {
"$ref": "#/components/schemas/Location"
@@ -2554,7 +3143,7 @@
},
"spoil_rate_percent": {
"type": "number",
"format": "double"
"format": "number"
}
},
"example": {
@@ -2619,7 +3208,7 @@
},
"price": {
"type": "number",
"format": "double"
"format": "number"
}
}
},
@@ -2640,7 +3229,7 @@
},
"qu_factor_purchase_to_stock": {
"type": "number",
"format": "double"
"format": "number"
},
"barcode": {
"type": "string",
@@ -2673,6 +3262,9 @@
"next_estimated_execution_time": {
"type": "string",
"format": "date-time"
},
"next_execution_assigned_user": {
"$ref": "#/components/schemas/UserDto"
}
},
"example": {
@@ -2839,7 +3431,7 @@
"type": "string"
},
"amount": {
"type": "double",
"type": "number",
"minimum": 0,
"default": 0,
"description": "The manual entered amount"
@@ -2911,15 +3503,39 @@
"type": "string",
"enum": [
"manually",
"dynamic-regular"
"dynamic-regular",
"daily",
"weekly",
"monthly"
]
},
"period_config": {
"type": "string"
},
"period_days": {
"type": "integer"
},
"track_date_only": {
"type": "boolean"
},
"rollover": {
"type": "boolean"
},
"assignment_type": {
"type": "string",
"enum": [
"no-assignment",
"who-least-did-first",
"random",
"in-alphabetical-order"
]
},
"assignment_config": {
"type": "string"
},
"next_execution_assigned_to_user_id": {
"type": "integer"
},
"row_created_timestamp": {
"type": "string",
"format": "date-time"
@@ -2955,7 +3571,7 @@
"type": "integer"
},
"amount": {
"type": "double"
"type": "number"
},
"best_before_date": {
"type": "string",
@@ -3003,12 +3619,25 @@
"type": "integer"
},
"amount": {
"type": "double"
"type": "number"
},
"amount_aggregated": {
"type": "number"
},
"amount_opened": {
"type": "number"
},
"amount_opened_aggregated": {
"type": "number"
},
"best_before_date": {
"type": "string",
"format": "date",
"description": "The next best before date for this product"
},
"is_aggregated_amount": {
"type": "boolean",
"description": "Indicates wheter this product has sub-products or not / if the fields `amount_aggregated` and `amount_opened_aggregated` are filled"
}
}
},
@@ -3052,19 +3681,19 @@
"expiring_products": {
"type": "array",
"items":{
"$ref": "#/components/schemas/Product"
"$ref": "#/components/schemas/CurrentStockResponse"
}
},
"expired_products": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Product"
"$ref": "#/components/schemas/CurrentStockResponse"
}
},
"missing_products": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Product"
"$ref": "#/components/schemas/CurrentStockResponse"
}
}
}

View File

@@ -88,10 +88,20 @@ function SumArrayValue($array, $propertyName)
return $sum;
}
function GetClassConstants($className)
function GetClassConstants($className, $prefix = null)
{
$r = new ReflectionClass($className);
return $r->getConstants();
$constants = $r->getConstants();
if ($prefix === null)
{
return $constants;
}
else
{
$matchingKeys = preg_grep('!^' . $prefix . '!', array_keys($constants));
return array_intersect_key($constants, array_flip($matchingKeys));
}
}
function RandomString($length, $allowedChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
@@ -139,9 +149,20 @@ function Setting(string $name, $value)
define('GROCY_' . $name, file_get_contents($settingOverrideFile));
}
elseif (getenv('GROCY_' . $name) !== false) // An environment variable with the same name and prefix GROCY_ overwrites the given setting
{
if (strtolower(getenv('GROCY_' . $name)) === "true")
{
define('GROCY_' . $name, true);
}
elseif (strtolower(getenv('GROCY_' . $name)) === "false")
{
define('GROCY_' . $name, false);
}
else
{
define('GROCY_' . $name, getenv('GROCY_' . $name));
}
}
else
{
define('GROCY_' . $name, $value);
@@ -193,3 +214,25 @@ function IsValidFileName($fileName)
return false;
}
function IsJsonString($text)
{
json_decode($text);
return (json_last_error() == JSON_ERROR_NONE);
}
function string_starts_with($haystack, $needle)
{
return (substr($haystack, 0, strlen($needle)) === $needle);
}
function string_ends_with($haystack, $needle)
{
$length = strlen($needle);
if ($length == 0)
{
return true;
}
return (substr($haystack, -$length) === $needle);
}

View File

@@ -0,0 +1,25 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -29,3 +29,6 @@ msgstr ""
msgid "fullcalendar_locale"
msgstr ""
msgid "bootstrap-select_locale"
msgstr ""

View File

@@ -0,0 +1,29 @@
# Translators:
# Troels Siggaard <troels@siggaard.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Troels Siggaard <troels@siggaard.com>, 2019\n"
"Language-Team: Danish (https://www.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "ingen-tildeling"
msgid "who-least-did-first"
msgstr "hvem-mindst-gjorde-først"
msgid "random"
msgstr "tilfældig"
msgid "in-alphabetical-order"
msgstr "i-alfabetisk-rækkefølge"

View File

@@ -1,5 +1,5 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Troels Siggaard <troels@siggaard.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Troels Siggaard <troels@siggaard.com>, 2019\n"
"Language-Team: Danish (https://www.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,16 +17,16 @@ msgstr ""
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "Manuelt"
msgstr "manuelt"
msgid "dynamic-regular"
msgstr ""
msgstr "gentagende-dynamisk"
msgid "daily"
msgstr ""
msgstr "daglig"
msgid "weekly"
msgstr ""
msgstr "ugentlig"
msgid "monthly"
msgstr ""
msgstr "månedlig"

View File

@@ -1,3 +1,5 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
#
msgid ""
msgstr ""
@@ -5,6 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Language-Team: Danish (https://www.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -14,19 +17,39 @@ msgstr ""
"X-Domain: grocy/component_translations\n"
msgid "timeago_locale"
msgstr ""
msgstr "da"
msgid "timeago_nan"
msgstr ""
msgstr "for NaN år"
msgid "moment_locale"
msgstr ""
msgstr "da"
msgid "datatables_localization"
msgstr ""
"{\n"
"\"sProcessing\": \"Henter...\",\n"
"\"sLengthMenu\": \"Vis _MENU_ linjer\",\n"
"\"sZeroRecords\": \"Ingen linjer matcher s&oslash;gningen\",\n"
"\"sInfo\": \"Viser _START_ til _END_ af _TOTAL_ linjer\",\n"
"\"sInfoEmpty\": \"Viser 0 til 0 af 0 linjer\",\n"
"\"sInfoFiltered\": \"(filtreret fra _MAX_ linjer)\",\n"
"\"sInfoPostFix\": \"\",\n"
"\"sSearch\": \"S&oslash;g:\",\n"
"\"sUrl\": \"\",\n"
"\"oPaginate\": {\n"
"\"sFirst\": \"F&oslash;rste\",\n"
"\"sPrevious\": \"Forrige\",\n"
"\"sNext\": \"N&aelig;ste\",\n"
"\"sLast\": \"Sidste\"\n"
"}\n"
"}"
msgid "summernote_locale"
msgstr ""
msgstr "da-DK"
msgid "fullcalendar_locale"
msgstr ""
msgstr "da"
msgid "bootstrap-select_locale"
msgstr "da_DK"

View File

@@ -1,5 +1,6 @@
# Translators:
# dark159123 <r.j.hansen@protonmail.com>, 2019
# Troels Siggaard <troels@siggaard.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: dark159123 <r.j.hansen@protonmail.com>, 2019\n"
"Last-Translator: Troels Siggaard <troels@siggaard.com>, 2019\n"
"Language-Team: Danish (https://www.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,13 +21,13 @@ msgid "Cookies"
msgstr "Småkager"
msgid "Chocolate"
msgstr "chokolade"
msgstr "Chokolade"
msgid "Pantry"
msgstr "Spisekammer"
msgid "Candy cupboard"
msgstr "Slik skuffe"
msgstr "Slikskuffe"
msgid "Tinned food cupboard"
msgstr "Dåsemadsskab"
@@ -36,36 +37,36 @@ msgstr "Køleskab"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Styk"
msgstr[1] "Stykker"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Pakke"
msgstr[1] "Pakker"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Glas"
msgstr[1] "Glas"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Dåse"
msgstr[1] "Dåser"
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Dåse"
msgstr[1] "Dåser"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Klase"
msgstr[1] "Klaser"
msgid "Gummy bears"
msgstr "Vingummi bamser"
msgstr "Vingummibamser"
msgid "Crisps"
msgstr "Chips"
@@ -113,22 +114,22 @@ msgid "Warranty ends"
msgstr "Reklamationsret udløber"
msgid "TV remote control"
msgstr "Fjernbetjening"
msgstr "Fjernbetjening til TV'et"
msgid "Alarm clock"
msgstr "Vægge ur"
msgstr "Væggeur"
msgid "Heat remote control"
msgstr "Varmefjernbetjening"
msgstr "Fjernbetjening til varme"
msgid "Lawn mowed in the garden"
msgstr "Græs slået"
msgstr "Græsset blev slået i haven"
msgid "Some good snacks"
msgstr "Nogle gode snacks"
msgid "Pizza dough"
msgstr "Pizza dej"
msgstr "Pizzadej"
msgid "Sieved tomatoes"
msgstr "Sigtede tomater"
@@ -149,7 +150,7 @@ msgid "Spaghetti bolognese"
msgstr "Spaghetti bolognese"
msgid "Sandwiches"
msgstr "Sandwiches"
msgstr "Sandwich"
msgid "English"
msgstr "Engelsk"
@@ -158,21 +159,21 @@ msgid "German"
msgstr "Tysk"
msgid "Italian"
msgstr "Italiænsk"
msgstr "Italiensk"
msgid "Demo in different language"
msgstr "Demo i et andet sprog"
msgstr "Demo et andet sprog"
msgid "This is the note content of the recipe ingredient"
msgstr "Dette er indholdet af opskrift ingrediensens notefelt"
msgstr "Dette er indholdet af opskrift-ingrediensens notefeltet"
msgid "Demo User"
msgstr "Demo Bruger"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Gram"
msgstr[1] "Gram"
msgid "Flour"
msgstr "Mel"
@@ -187,25 +188,25 @@ msgid "Home"
msgstr "Hjem"
msgid "Life"
msgstr "Liv"
msgstr "Livet"
msgid "Projects"
msgstr "Projekter"
msgid "Repair the garage door"
msgstr "Reparér garagedøren"
msgstr "Reparer garagedøren"
msgid "Fork and improve grocy"
msgstr "Fork og forbedre grocy"
msgid "Find a solution for what to do when I forget the door keys"
msgstr "Find en løsning for når jeg glemmer husnøglen"
msgstr "Find en løsning på hvad jeg gør, når jeg glemmer nøglen til huset"
msgid "Sweets"
msgstr "Slik"
msgid "Bakery products"
msgstr "Bageriprodukter"
msgstr "Bagværk"
msgid "Tinned food"
msgstr "Dåsemad"
@@ -217,13 +218,13 @@ msgid "Vegetables/Fruits"
msgstr "Frugt og grønt"
msgid "Refrigerated products"
msgstr "Nedkølede produkter"
msgstr "Køleskabsprodukter"
msgid "Coffee machine"
msgstr "Kaffemaskine"
msgid "Dishwasher"
msgstr "Opvasker"
msgstr "Opvaskemaskine"
msgid "Liter"
msgstr "Liter"
@@ -259,25 +260,51 @@ msgid "French"
msgstr "Fransk"
msgid "Turkish"
msgstr ""
msgstr "Tyrkisk"
msgid "Spanish"
msgstr ""
msgstr "Spansk"
msgid "Russian"
msgstr ""
msgstr "Russisk"
msgid "The thing which happens on the 5th of every month"
msgstr ""
msgstr "Det der sker hver den 5. i måneden"
msgid "The thing which happens daily"
msgstr ""
msgstr "Det der sker dagligt"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr ""
msgstr "Det der sker på mandage og onsdage"
msgid "Swedish"
msgstr ""
msgstr "Svensk"
msgid "Polish"
msgstr "Polsk"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -1,5 +1,5 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Troels Siggaard <troels@siggaard.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Troels Siggaard <troels@siggaard.com>, 2019\n"
"Language-Team: Danish (https://www.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,13 +17,13 @@ msgstr ""
"X-Domain: grocy/stock_transaction_types\n"
msgid "purchase"
msgstr "Køb"
msgstr "køb"
msgid "consume"
msgstr "Brug"
msgstr "forbrug"
msgid "inventory-correction"
msgstr "Beholdningsrettelse"
msgstr "beholdningsrettelse"
msgid "product-opened"
msgstr "Produkt åbnet"
msgstr "produkt-åbnet"

View File

@@ -0,0 +1,29 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Language-Team: German (https://www.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "Niemandem zuweisen"
msgid "who-least-did-first"
msgstr "Wer es am seltensten gemacht hat zuerst"
msgid "random"
msgstr "Zufällig"
msgid "in-alphabetical-order"
msgstr "In alphabetischer Reihenfolge"

View File

@@ -52,3 +52,6 @@ msgstr "de-DE"
msgid "fullcalendar_locale"
msgstr "de"
msgid "bootstrap-select_locale"
msgstr "de_DE"

View File

@@ -281,3 +281,35 @@ msgstr "Schwedisch"
msgid "Polish"
msgstr "Polnisch"
msgid "Milk Chocolate"
msgstr "Milchschokolade"
msgid "Dark Chocolate"
msgstr "Zartbitterschokolade"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Scheibe"
msgstr[1] "Scheiben"
msgid "Example userentity"
msgstr "Beispiel Benutzerentität"
msgid "This is an example user entity..."
msgstr "Dies ist eine Beispiel-Benutzerentität"
msgid "Custom field"
msgstr "Benutzerdefiniertes Feld"
msgid "Example field value..."
msgstr "Beispiel Feldwert..."
msgid "Waffle rolls"
msgstr "Waffelröllchen"
msgid "Danish"
msgstr "Dänisch"
msgid "Dutch"
msgstr "Niederländisch"

View File

@@ -361,8 +361,8 @@ msgid "This means %s will be removed from stock"
msgstr "Das bedeutet %s wird aus dem Bestand entfernt"
msgid ""
"This means it is estimated that a new execution of this chore is tracked %s "
"days after the last was tracked"
"This means the next execution of this chore is scheduled %s days after the "
"last execution"
msgstr ""
"Das bedeutet, dass eine erneute Ausführung der Hausarbeit %s Tage nach der "
"letzten Ausführung geplant wird"
@@ -1394,3 +1394,279 @@ msgstr ""
msgid "Undo task \"%s\""
msgstr "Aufgabe \"%s\" rückgängig machen"
msgid "Due date rollover"
msgstr "Fälligkeit hinausschieben"
msgid ""
"When enabled the chore can never be overdue, the due date will shift forward"
" each day when due"
msgstr ""
"Wenn gewählt, kann die Hausarbeit nie überfällig werden - das "
"Fälligkeitsdatum wird jeden Tag ab Fälligkeit einen Tag vorgeschoben"
msgid "Location Content Sheet"
msgstr "Standort-Inhaltsblatt"
msgid "Print"
msgstr "Drucken"
msgid "all locations"
msgstr "alle Standorte"
msgid ""
"Here you can print a page per location with the current stock, maybe to hang"
" it there and note the consumed things on it."
msgstr ""
"Hier kannst du eine Seite pro Standort mit dem aktuellen Bestand drucken, "
"gedacht um diese am entsprechenden Platz aufzuhängen, damit die verbauchten "
"Dinge darauf vermerkt werden können."
msgid "this location"
msgstr "diesen Standort"
msgid "Consumend amount"
msgstr "Verbrauchte Menge"
msgid "Time of printing"
msgstr "Druckzeitpunkt"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Ausstattung \"%s\" wirklich löschen?"
msgid "Parent product"
msgstr "Übergeordnetes Produkt"
msgid ""
"Not possible because this product is already used as a parent product in "
"another product"
msgstr ""
"Nicht möglich, da dieses Produkt bereits als übergeordnetes Produkt eines "
"anderen Produkts verwendet wird"
msgid "Default conversions"
msgstr "Standardumrechnungen"
msgid "Factor"
msgstr "Faktor"
msgid "1 %s is the same as..."
msgstr "1 %s ist identisch mit..."
msgid "Create QU conversion"
msgstr "ME-Umrechnung erstellen"
msgid "Default for QU"
msgstr "Standard für ME"
msgid "Quantity unit from"
msgstr "ME von"
msgid "Quantity unit to"
msgstr "ME nach"
msgid ""
"This cannot be lower than %1$s and must be a valid number with max. %2$s "
"decimal places"
msgstr ""
"Diese darf nicht niedriger sein als %1$s und muss eine gültige Zahl mit max."
" %2$s Nachkommastellen sein"
msgid "This cannot be equal to %s"
msgstr "Dies darf nicht gleich sein wie %s"
msgid "This means 1 %1$s is the same as %2$s %3$s"
msgstr "Das bedeutet 1 %1$s entsprechen %2$s %3$s"
msgid "QU conversions"
msgstr "ME-Umrechnungen"
msgid "Product overrides"
msgstr "Produktübersteuerung"
msgid "Override for product"
msgstr "Übersteuerung für Produkt"
msgid "This equals %1$s %2$s in stock"
msgstr "Dies entspricht %1$s %2$s im Bestand"
msgid "Edit QU conversion"
msgstr "ME-Umrechnung bearbeiten"
msgid "An assignment type is required"
msgstr "Ein Zuweisungstyp ist erforderlich"
msgid "Assignment type"
msgstr "Zuweisungstyp"
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution"
msgstr ""
"Das bedeutet, dass eine erneute Ausführung der Hausarbeit 1 Tage nach der "
"letzten Ausführung geplant wird"
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution, but only for the weekdays selected below"
msgstr ""
"Das bedeutet, dass eine erneute Ausführung der Hausarbeit 1 Tage nach der "
"letzten Ausführung geplant wird, aber nur für unten ausgewählten Wochentage"
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
"Das bedeutet, dass eine erneute Ausführung der Hausarbeit nicht geplant wird"
msgid ""
"This means the next execution of this chore is scheduled on the below "
"selected day of each month"
msgstr ""
"Das bedeutet, dass eine erneute Ausführung der Hausarbeit jeden Monat an dem"
" unten ausgewählt Tag geplant wird"
msgid ""
"This means the next execution of this chore will not be assigned to anyone"
msgstr ""
"Das bedeutet, dass die nächste Ausführung der Hausarbeit niemandem "
"zugewiesen wird"
msgid ""
"This means the next execution of this chore will be assigned to the one who "
"executed it least"
msgstr ""
"Das bedeutet, dass die nächste Ausführung der Hausarbeit demjenigen "
"zugewiesen wird, der diese am wenigsten häufig ausgeführt hat"
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
"Das bedeutet, dass die nächste Ausführung der Hausarbeit zufällig jemanden "
"zugewiesen wird"
msgid ""
"This means the next execution of this chore will be assigned to the next one"
" in alphabetical order"
msgstr ""
"Das bedeutet, dass die nächste Ausführung der Hausarbeit dem nächsten in "
"alphabetischer Reihenfolge zugewiesen wird"
msgid "Assign to"
msgstr "Zuweisen an"
msgid "This assignment type requires that at least one is assigned"
msgstr ""
"Diese Zuordnungsart setzt voraus, dass mindestens eine Person zugeordnet ist"
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] "%s ist mir zugewiesen"
msgstr[1] "%s Hausarbeiten sind mir zugewiesen"
msgid "Assigned to me"
msgstr "Mir zugewiesen"
msgid "assigned to %s"
msgstr "zugewiesen an %s"
msgid "Filter by assignment"
msgstr "Nach Zuweisung filtern"
msgid "Consume product on chore execution"
msgstr "Ein Produkt bei Hausarbeit-Ausführung verbrauchen"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Benutzerfeld \"%s\" wirklich löschen?"
msgid "Userentities"
msgstr "Benutzerentitäten"
msgid "Create userentity"
msgstr "Benutzerentität erstellen"
msgid "Show in sidebar menu"
msgstr "Im Seitenleisten-Menü anzeigen"
msgid "Edit userentity"
msgstr "Benutzerentität bearbeiten"
msgid "Edit %s"
msgstr "%s bearbeiten"
msgid "Create %s"
msgstr "%s erstellen"
msgid "Are you sure to delete this userobject?"
msgstr "Dieses Benutzerobject wirklich löschen?"
msgid "Icon CSS class"
msgstr "Icon CSS-Klasse"
msgid "For example"
msgstr "Zum Beispiel"
msgid "Configure fields"
msgstr "Felder konfigurieren"
msgid "Quantity unit plural form testing"
msgstr "ME Pluralformen testen"
msgid "Result"
msgstr "Ergebnis"
msgid "Test plural forms"
msgstr "Pluralformen testen"
msgid "Scan a barcode"
msgstr "Scanne einen Barcode"
msgid "Error while initializing the barcode scanning library"
msgstr "Fehler beim Initialisieren der Barcode-Scan-Komponenten"
msgid ""
"The resulting price of this ingredient will be multiplied by this factor"
msgstr ""
"Der resultierende Preis dieser Zutat wird mit diesem Faktor multipliziert"
msgid "Price factor"
msgstr "Preisfaktor"
msgid "Do you find grocy useful?"
msgstr "Findest du grocy nützlich?"
msgid "Say thanks"
msgstr "Sag Danke"
msgid "Search for recipes containing this product"
msgstr "Suche nach Rezepten, die dieses Produkt enthalten"
msgid "Add to shopping list"
msgstr "Zum Einkaufszettel hinzufügen"
msgid "Added %1$s of %2$s to the shopping list \"%3$s\""
msgstr "%1$s %2$s dem Einkauszettel \"%3$s\" hinzugefügt"
msgid "Output"
msgstr "Ausgabe"
msgid "Energy (kcal)"
msgstr "Energie (kcal)"
msgid "Per stock quantity unit"
msgstr "Pro Bestandsmengeneinheit"
msgid "Barcode scanner testing"
msgstr "Barcodescanner testen"
msgid "Expected barcode"
msgstr "Erwarteter Barcode"
msgid "Scan field"
msgstr "Scanfeld"
msgid "Scanned barcodes"
msgstr "Gescannte Barcodes"
msgid "Hit"
msgstr "Erfolgreich"
msgid "Miss"
msgstr "Fehler"

View File

@@ -38,4 +38,10 @@ msgid "checkbox"
msgstr "Kontrollkästchen"
msgid "preset-list"
msgstr "Auswahlliste (feste Werte)"
msgstr "Auswahlliste (feste Werte, einzelner Wert kann ausgewählt werden)"
msgid "preset-checklist"
msgstr "Auswahlliste (feste Werte, mehrere Werte können ausgewählt werden)"
msgid "link"
msgstr "Link"

View File

@@ -277,3 +277,36 @@ msgstr ""
msgid "Polish"
msgstr ""
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""
msgid "Danish"
msgstr ""
msgid "Dutch"
msgstr ""

View File

@@ -0,0 +1,25 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "No assignment"
msgid "who-least-did-first"
msgstr "Who least did first"
msgid "random"
msgstr "Random"
msgid "in-alphabetical-order"
msgstr "In alphabetical order"

View File

@@ -1,14 +1,15 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/chore_types\n"

View File

@@ -29,3 +29,6 @@ msgstr "x"
msgid "fullcalendar_locale"
msgstr "x"
msgid "bootstrap-select_locale"
msgstr "x"

View File

@@ -32,3 +32,12 @@ msgstr "Date & time"
msgid "checkbox"
msgstr "Checkbox"
msgid "preset-list"
msgstr "Select list (a single item can be selected)"
msgid "preset-checklist"
msgstr "Select list (multiple items can be selected)"
msgid "link"
msgstr "Link"

View File

@@ -0,0 +1,26 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -17,19 +17,32 @@ msgstr ""
"X-Domain: grocy/component_translations\n"
msgid "timeago_locale"
msgstr ""
msgstr "en"
msgid "timeago_nan"
msgstr ""
msgstr "NaN years ago"
msgid "moment_locale"
msgstr "en-gb"
msgid "datatables_localization"
msgstr ""
"{\"sEmptyTable\":\"No data available in table\",\"sInfo\":\"Showing _START_ "
"to _END_ of _TOTAL_ entries\",\"sInfoEmpty\":\"Showing 0 to 0 of 0 "
"entries\",\"sInfoFiltered\":\"(filtered from _MAX_ total "
"entries)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"Show"
" _MENU_ "
"entries\",\"sLoadingRecords\":\"Loading...\",\"sProcessing\":\"Processing...\",\"sSearch\":\"Search:\",\"sZeroRecords\":\"No"
" matching records "
"found\",\"oPaginate\":{\"sFirst\":\"First\",\"sLast\":\"Last\",\"sNext\":\"Next\",\"sPrevious\":\"Previous\"},\"oAria\":{\"sSortAscending\":\":"
" activate to sort column ascending\",\"sSortDescending\":\": activate to "
"sort column descending\"}}"
msgid "summernote_locale"
msgstr "en-gb"
msgid "fullcalendar_locale"
msgstr "en-gb"
msgid "bootstrap-select_locale"
msgstr "x"

View File

@@ -278,3 +278,35 @@ msgstr ""
msgid "Polish"
msgstr ""
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""
msgid "Danish"
msgstr ""
msgid "Dutch"
msgstr ""

View File

@@ -354,8 +354,8 @@ msgid "This means %s will be removed from stock"
msgstr ""
msgid ""
"This means it is estimated that a new execution of this chore is tracked %s "
"days after the last was tracked"
"This means the next execution of this chore is scheduled %s days after the "
"last execution"
msgstr ""
msgid "Removed %1$s of %2$s from stock"
@@ -1326,3 +1326,253 @@ msgstr ""
msgid "Undo task \"%s\""
msgstr ""
msgid "Due date rollover"
msgstr ""
msgid ""
"When enabled the chore can never be overdue, the due date will shift forward"
" each day when due"
msgstr ""
msgid "Location Content Sheet"
msgstr ""
msgid "Print"
msgstr ""
msgid "all locations"
msgstr ""
msgid ""
"Here you can print a page per location with the current stock, maybe to hang"
" it there and note the consumed things on it."
msgstr ""
msgid "this location"
msgstr ""
msgid "Consumend amount"
msgstr ""
msgid "Time of printing"
msgstr ""
msgid "Are you sure to delete equipment \"%s\"?"
msgstr ""
msgid "Parent product"
msgstr ""
msgid ""
"Not possible because this product is already used as a parent product in "
"another product"
msgstr ""
msgid "Default conversions"
msgstr ""
msgid "Factor"
msgstr ""
msgid "1 %s is the same as..."
msgstr ""
msgid "Create QU conversion"
msgstr ""
msgid "Default for QU"
msgstr ""
msgid "Quantity unit from"
msgstr ""
msgid "Quantity unit to"
msgstr ""
msgid ""
"This cannot be lower than %1$s and must be a valid number with max. %2$s "
"decimal places"
msgstr ""
msgid "This cannot be equal to %s"
msgstr ""
msgid "This means 1 %1$s is the same as %2$s %3$s"
msgstr ""
msgid "QU conversions"
msgstr ""
msgid "Product overrides"
msgstr ""
msgid "Override for product"
msgstr ""
msgid "This equals %1$s %2$s in stock"
msgstr ""
msgid "Edit QU conversion"
msgstr ""
msgid "An assignment type is required"
msgstr ""
msgid "Assignment type"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution, but only for the weekdays selected below"
msgstr ""
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled on the below "
"selected day of each month"
msgstr ""
msgid ""
"This means the next execution of this chore will not be assigned to anyone"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the one who "
"executed it least"
msgstr ""
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the next one"
" in alphabetical order"
msgstr ""
msgid "Assign to"
msgstr ""
msgid "This assignment type requires that at least one is assigned"
msgstr ""
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] ""
msgstr[1] ""
msgid "Assigned to me"
msgstr ""
msgid "assigned to %s"
msgstr ""
msgid "Filter by assignment"
msgstr ""
msgid "Consume product on chore execution"
msgstr ""
msgid "Are you sure to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr ""
msgid "Create userentity"
msgstr ""
msgid "Show in sidebar menu"
msgstr ""
msgid "Edit userentity"
msgstr ""
msgid "Edit %s"
msgstr ""
msgid "Create %s"
msgstr ""
msgid "Are you sure to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr ""
msgid "For example"
msgstr ""
msgid "Configure fields"
msgstr ""
msgid "Quantity unit plural form testing"
msgstr ""
msgid "Result"
msgstr ""
msgid "Test plural forms"
msgstr ""
msgid "Scan a barcode"
msgstr ""
msgid "Error while initializing the barcode scanning library"
msgstr ""
msgid ""
"The resulting price of this ingredient will be multiplied by this factor"
msgstr ""
msgid "Price factor"
msgstr ""
msgid "Do you find grocy useful?"
msgstr ""
msgid "Say thanks"
msgstr ""
msgid "Search for recipes containing this product"
msgstr ""
msgid "Add to shopping list"
msgstr ""
msgid "Added %1$s of %2$s to the shopping list \"%3$s\""
msgstr ""
msgid "Output"
msgstr ""
msgid "Energy (kcal)"
msgstr ""
msgid "Per stock quantity unit"
msgstr ""
msgid "Barcode scanner testing"
msgstr ""
msgid "Expected barcode"
msgstr ""
msgid "Scan field"
msgstr ""
msgid "Scanned barcodes"
msgstr ""
msgid "Hit"
msgstr ""
msgid "Miss"
msgstr ""

View File

@@ -36,3 +36,9 @@ msgstr ""
msgid "preset-list"
msgstr ""
msgid "preset-checklist"
msgstr ""
msgid "link"
msgstr ""

View File

@@ -0,0 +1,29 @@
# Translators:
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "sin-asignar"
msgid "who-least-did-first"
msgstr "quien-menos-primero"
msgid "random"
msgstr "al-azar"
msgid "in-alphabetical-order"
msgstr "orden-alfabético"

View File

@@ -43,3 +43,6 @@ msgstr "es-ES"
msgid "fullcalendar_locale"
msgstr "es"
msgid "bootstrap-select_locale"
msgstr "es_ES"

View File

@@ -1,7 +1,7 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
# Ankue <ankue.spam@gmail.com>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
#
msgid ""
msgstr ""
@@ -9,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Ankue <ankue.spam@gmail.com>, 2019\n"
"Last-Translator: Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -43,8 +43,8 @@ msgstr[1] "Piezas"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Paquetes"
msgstr[1] "Paquetes"
msgid "Glass"
msgid_plural "Glasses"
@@ -53,8 +53,8 @@ msgstr[1] "Vasos"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Envases"
msgstr[1] "Envases"
msgid "Can"
msgid_plural "Cans"
@@ -63,8 +63,8 @@ msgstr[1] "Latas"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Puñados"
msgstr[1] "Puñados"
msgid "Gummy bears"
msgstr "Ositos"
@@ -283,3 +283,35 @@ msgstr "Sueco"
msgid "Polish"
msgstr "Polaco"
msgid "Milk Chocolate"
msgstr "Chocolate con leche"
msgid "Dark Chocolate"
msgstr "Chocolate negro"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Lonchas"
msgstr[1] "Lonchas"
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""
msgid "Danish"
msgstr ""
msgid "Dutch"
msgstr ""

View File

@@ -1,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -36,3 +37,12 @@ msgstr "Fecha y hora"
msgid "checkbox"
msgstr "Casilla de verificación"
msgid "preset-list"
msgstr "lista-predefinida"
msgid "preset-checklist"
msgstr "casillas-predefinidas"
msgid "link"
msgstr "enlace"

View File

@@ -0,0 +1,29 @@
# Translators:
# Mathieu Fortin <mathieugfortin@gmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Mathieu Fortin <mathieugfortin@gmail.com>, 2019\n"
"Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "pas-assigné"
msgid "who-least-did-first"
msgstr "moins-fait-fait-le-suivant"
msgid "random"
msgstr "aléatoire"
msgid "in-alphabetical-order"
msgstr "ordre-alphabétique"

View File

@@ -27,23 +27,22 @@ msgstr "fr"
msgid "datatables_localization"
msgstr ""
"{\"sProcessing\":\"Traitement en "
"cours...\",\"sSearch\":\"Rechercher&nbsp;:\",\"sLengthMenu\":\"Afficher "
"_MENU_ &eacute;l&eacute;ments\",\"sInfo\":\"Affichage de "
"l'&eacute;l&eacute;ment _START_ &agrave; _END_ sur _TOTAL_ "
"&eacute;l&eacute;ments\",\"sInfoEmpty\":\"Affichage de "
"l'&eacute;l&eacute;ment 0 &agrave; 0 sur 0 "
"&eacute;l&eacute;ment\",\"sInfoFiltered\":\"(filtr&eacute; de _MAX_ "
"&eacute;l&eacute;ments au "
"total)\",\"sInfoPostFix\":\"\",\"sLoadingRecords\":\"Chargement en "
"cours...\",\"sZeroRecords\":\"Aucun &eacute;l&eacute;ment &agrave; "
"afficher\",\"sEmptyTable\":\"Aucune donn&eacute;e disponible dans le "
"tableau\",\"oPaginate\":{\"sFirst\":\"Premier\",\"sPrevious\":\"Pr&eacute;c&eacute;dent\",\"sNext\":\"Suivant\",\"sLast\":\"Dernier\"},\"oAria\":{\"sSortAscending\":\":"
"{\"sProcessing\":\"Traitement en cours...\",\"sSearch\":\"Rechercher "
":\",\"sLengthMenu\":\"Afficher _MENU_ éléments\",\"sInfo\":\"Affichage de "
"l'élément _START_ à _END_ sur _TOTAL_ éléments\",\"sInfoEmpty\":\"Affichage "
"de l'élément 0 à 0 sur 0 élément\",\"sInfoFiltered\":\"(filtré de _MAX_ "
"éléments au total)\",\"sInfoPostFix\":\"\",\"sLoadingRecords\":\"Chargement "
"en cours...\",\"sZeroRecords\":\"Aucun élément à "
"afficher\",\"sEmptyTable\":\"Aucune donnée disponible dans le "
"tableau\",\"oPaginate\":{\"sFirst\":\"Premier\",\"sPrevious\":\"Précédent\",\"sNext\":\"Suivant\",\"sLast\":\"Dernier\"},\"oAria\":{\"sSortAscending\":\":"
" activer pour trier la colonne par ordre croissant\",\"sSortDescending\":\":"
" activer pour trier la colonne par ordre d&eacute;croissant\"}}"
" activer pour trier la colonne par ordre décroissant\"}}"
msgid "summernote_locale"
msgstr "fr-FR"
msgid "fullcalendar_locale"
msgstr "fr"
msgid "bootstrap-select_locale"
msgstr "fr_FR"

View File

@@ -285,3 +285,29 @@ msgstr "Suèdois"
msgid "Polish"
msgstr "Polonais"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -0,0 +1,29 @@
# Translators:
# Antonino Ursino <ninus_@libero.it>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Antonino Ursino <ninus_@libero.it>, 2019\n"
"Language-Team: Italian (https://www.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "nessun-incarico"
msgid "who-least-did-first"
msgstr "Gli-ultimi-saranno-i-primi"
msgid "random"
msgstr "casuale"
msgid "in-alphabetical-order"
msgstr "in-ordine-alfabetico"

View File

@@ -20,25 +20,48 @@ msgid "timeago_locale"
msgstr "it"
msgid "timeago_nan"
msgstr "NaN anni fa"
msgstr "NaN anni"
msgid "moment_locale"
msgstr "it"
msgid "datatables_localization"
msgstr ""
"{\"sEmptyTable\":\"Nessun dato disponibile\",\"sInfo\":\"Mostrando da "
"_START_ a _END_ di _TOTAL_ voci\",\"sInfoEmpty\":\"Mostrando da 0 a 0 di 0 "
"voci\",\"sInfoFiltered\":\"(Filtrato da _MAX_ voci "
"totali)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"Mostra"
" _MENU_ "
"voci\",\"sLoadingRecords\":\"Caricando...\",\"sProcessing\":\"Calcolando...\",\"sSearch\":\"Cerca:\",\"sZeroRecords\":\"Nessun"
" risultato "
"trovato\",\"oPaginate\":{\"sFirst\":\"Prima\",\"sLast\":\"Ultima\",\"sNext\":\"Prossima\",\"sPrevious\":\"Precedente\"},\"oAria\":{\"sSortAscending\":\":"
" ordine crescente\",\"sSortDescending\":\": ordine decrescente\"}}"
"{\n"
"\"sProcessing\": \"Traitement en cours...\",\n"
"\"sSearch\": \"Rechercher&nbsp;:\",\n"
"\"sLengthMenu\": \"Afficher _MENU_ &eacute;l&eacute;ments\",\n"
"\"sInfo\": \"Affichage de l'&eacute;l&eacute;ment _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments\",\n"
"\"sInfoEmpty\": \"Affichage de l'&eacute;l&eacute;ment 0 &agrave; 0 sur 0 &eacute;l&eacute;ment\",\n"
"\"sInfoFiltered\": \"(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)\",\n"
"\"sInfoPostFix\": \"\",\n"
"\"sLoadingRecords\": \"Chargement en cours...\",\n"
"\"sZeroRecords\": \"Aucun &eacute;l&eacute;ment &agrave; afficher\",\n"
"\"sEmptyTable\": \"Aucune donn&eacute;e disponible dans le tableau\",\n"
"\"oPaginate\": {\n"
"\"sFirst\": \"Premier\",\n"
"\"sPrevious\": \"Pr&eacute;c&eacute;dent\",\n"
"\"sNext\": \"Suivant\",\n"
"\"sLast\": \"Dernier\"\n"
"},\n"
"\"oAria\": {\n"
"\"sSortAscending\": \": activer pour trier la colonne par ordre croissant\",\n"
"\"sSortDescending\": \": activer pour trier la colonne par ordre d&eacute;croissant\"\n"
"},\n"
"\"select\": {\n"
"\"rows\": {\n"
"_: \"%d lignes séléctionnées\",\n"
"0: \"Aucune ligne séléctionnée\",\n"
"1: \"1 ligne séléctionnée\"\n"
"} \n"
"}\n"
"}"
msgid "summernote_locale"
msgstr "it-IT"
msgid "fullcalendar_locale"
msgstr "fr"
msgstr "it"
msgid "bootstrap-select_locale"
msgstr "it_IT"

View File

@@ -1,6 +1,7 @@
# Translators:
# Sergio Zampello <seriotv88@gmail.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
# Antonino Ursino <ninus_@libero.it>, 2019
#
msgid ""
msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Antonino Ursino <ninus_@libero.it>, 2019\n"
"Language-Team: Italian (https://www.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,49 +25,49 @@ msgid "Chocolate"
msgstr "Cioccolato"
msgid "Pantry"
msgstr "Vorratskammer"
msgstr "Dispensa"
msgid "Candy cupboard"
msgstr "Süßigkeitenschrank"
msgstr "Credenza delle caramelle"
msgid "Tinned food cupboard"
msgstr "Konservenschrank"
msgstr "Credenza del cibo in scatola"
msgid "Fridge"
msgstr "Kühlschrank"
msgstr "Frigorifero"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Pezzo"
msgstr[1] "Pezzi"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Pacco"
msgstr[1] "Pacchi"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Bicchiere"
msgstr[1] "Bicchieri"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Lattina"
msgstr[1] "Lattine"
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Barattolo"
msgstr[1] "Barattoli"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Grappolo"
msgstr[1] "Grappoli"
msgid "Gummy bears"
msgstr "Caramelle"
msgstr "Orsetti gommosi"
msgid "Crisps"
msgstr "Patatine"
@@ -75,46 +76,46 @@ msgid "Eggs"
msgstr "Uova"
msgid "Noodles"
msgstr "Spaghetti"
msgstr "Tagliatelle"
msgid "Pickles"
msgstr "Marmellata"
msgstr "Sottaceti"
msgid "Gulash soup"
msgstr "Dado"
msgstr "Zuppa di Gulash"
msgid "Yogurt"
msgstr "Yogurt"
msgid "Cheese"
msgstr "Parmigiano"
msgstr "Formaggio"
msgid "Cold cuts"
msgstr "Pancetta"
msgstr "Salumi"
msgid "Paprika"
msgstr "Pepe"
msgstr "Paprica"
msgid "Cucumber"
msgstr "Zucchine"
msgstr "Cetriolo"
msgid "Radish"
msgstr "Radicchio"
msgstr "Ravanello"
msgid "Tomato"
msgstr "Pomodori"
msgstr "Pomodoro"
msgid "Changed towels in the bathroom"
msgstr "Cambiare asciugamani in bagno"
msgstr "Cambiati asciugamani in bagno"
msgid "Cleaned the kitchen floor"
msgstr "Pulire la cucina"
msgstr "Pulito il pavimento della cucina"
msgid "Warranty ends"
msgstr "Scadenza dalla garanzia"
msgid "TV remote control"
msgstr "Telecomando"
msgstr "Telecomando TV"
msgid "Alarm clock"
msgstr "Sveglia"
@@ -150,7 +151,7 @@ msgid "Spaghetti bolognese"
msgstr "Spaghetti alla bolognese"
msgid "Sandwiches"
msgstr "Sandwiches"
msgstr "Panini"
msgid "English"
msgstr "Inglese"
@@ -162,7 +163,7 @@ msgid "Italian"
msgstr "Italiano"
msgid "Demo in different language"
msgstr "Demo in lingue diverse"
msgstr "Demo in lingua diversa"
msgid "This is the note content of the recipe ingredient"
msgstr "Questo è il contenuto della nota dell'ingrediente della ricetta"
@@ -172,14 +173,14 @@ msgstr "Utente Demo"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Grammo"
msgstr[1] "Grammi"
msgid "Flour"
msgstr "Farina"
msgid "Pancakes"
msgstr "Pancakes"
msgstr "Frittella"
msgid "Sugar"
msgstr "Zucchero"
@@ -197,14 +198,14 @@ msgid "Repair the garage door"
msgstr "Riparare la porta del garage"
msgid "Fork and improve grocy"
msgstr "Forka e migliora grocy"
msgstr "Modifica e migliora grocy"
msgid "Find a solution for what to do when I forget the door keys"
msgstr ""
"Trova una soluzione per cosa fare quando dimentico le chiavi della porta"
msgid "Sweets"
msgstr "Dolci"
msgstr "Dolciumi"
msgid "Bakery products"
msgstr "Prodotti da forno"
@@ -213,10 +214,10 @@ msgid "Tinned food"
msgstr "Cibo in scatola"
msgid "Butchery products"
msgstr "Prodotti della macelleria"
msgstr "Prodotti di macelleria"
msgid "Vegetables/Fruits"
msgstr "Verdura/Frutta"
msgstr "Verdure/Frutti"
msgid "Refrigerated products"
msgstr "Prodotti refrigerati"
@@ -261,25 +262,57 @@ msgid "French"
msgstr "Francese"
msgid "Turkish"
msgstr ""
msgstr "Turco"
msgid "Spanish"
msgstr ""
msgstr "Spagnolo"
msgid "Russian"
msgstr ""
msgstr "Russo"
msgid "The thing which happens on the 5th of every month"
msgstr ""
msgstr "Quello che accade il 5 di ogni mese"
msgid "The thing which happens daily"
msgstr ""
msgstr "Quello che accade ogni giorno"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr ""
msgstr "Quello che accade il lunedì e il mercoledì"
msgid "Swedish"
msgstr ""
msgstr "Svedese"
msgid "Polish"
msgstr ""
msgstr "Polacco"
msgid "Milk Chocolate"
msgstr "Cioccolato al latte"
msgid "Dark Chocolate"
msgstr "Cioccolato fondente"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Fetta"
msgstr[1] "Fette"
msgid "Example userentity"
msgstr "Esempio di entità utente"
msgid "This is an example user entity..."
msgstr "Questo è un esempio di entità utente"
msgid "Custom field"
msgstr "Campo personalizzato"
msgid "Example field value..."
msgstr "Esempio di valore del campo ..."
msgid "Waffle rolls"
msgstr "Rotoli di cialde"
msgid "Danish"
msgstr "Danese"
msgid "Dutch"
msgstr "Olandese"

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,5 @@
# Translators:
# Antonino Ursino <ninus_@libero.it>, 2019
#
msgid ""
msgstr ""
@@ -5,6 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Antonino Ursino <ninus_@libero.it>, 2019\n"
"Language-Team: Italian (https://www.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -14,22 +17,31 @@ msgstr ""
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr ""
msgstr "Testo singola riga"
msgid "text-multi-line"
msgstr ""
msgstr "Testo multi riga"
msgid "number-integral"
msgstr ""
msgstr "Numero intero"
msgid "number-decimal"
msgstr ""
msgstr "Numero decimale"
msgid "date"
msgstr ""
msgstr "Data"
msgid "datetime"
msgstr ""
msgstr "Ora"
msgid "checkbox"
msgstr ""
msgstr "Casella di controllo"
msgid "preset-list"
msgstr "Lista predefinita"
msgid "preset-checklist"
msgstr "Lista di controllo predefinita"
msgid "link"
msgstr "collegamento"

View File

@@ -4,23 +4,23 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Language-Team: Tamil (https://www.transifex.com/grocy/teams/93189/ta/)\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/stock_transaction_types\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "purchase"
msgid "no-assignment"
msgstr ""
msgid "consume"
msgid "who-least-did-first"
msgstr ""
msgid "inventory-correction"
msgid "random"
msgstr ""
msgid "product-opened"
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -1,6 +1,5 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Giel Janssens <gieljnssns@me.com>, 2019
#
msgid ""
msgstr ""
@@ -8,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Giel Janssens <gieljnssns@me.com>, 2019\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,10 +26,25 @@ msgid "moment_locale"
msgstr "nl"
msgid "datatables_localization"
msgstr "nl-NL"
msgstr ""
"{\"sProcessing\":\"Bezig...\",\"sLengthMenu\":\"_MENU_ resultaten "
"weergeven\",\"sZeroRecords\":\"Geen resultaten "
"gevonden\",\"sInfo\":\"_START_ tot _END_ van _TOTAL_ "
"resultaten\",\"sInfoEmpty\":\"Geen resultaten om weer te "
"geven\",\"sInfoFiltered\":\" (gefilterd uit _MAX_ "
"resultaten)\",\"sInfoPostFix\":\"\",\"sSearch\":\"Zoeken:\",\"sEmptyTable\":\"Geen"
" resultaten aanwezig in de "
"tabel\",\"sInfoThousands\":\".\",\"sLoadingRecords\":\"Een moment geduld aub"
" - bezig met "
"laden...\",\"oPaginate\":{\"sFirst\":\"Eerste\",\"sLast\":\"Laatste\",\"sNext\":\"Volgende\",\"sPrevious\":\"Vorige\"},\"oAria\":{\"sSortAscending\":\":"
" activeer om kolom oplopend te sorteren\",\"sSortDescending\":\": activeer "
"om kolom aflopend te sorteren\"}}"
msgid "summernote_locale"
msgstr "nl-NL"
msgid "fullcalendar_locale"
msgstr "nl"
msgid "bootstrap-select_locale"
msgstr "nl_NL"

View File

@@ -3,6 +3,9 @@
# Adriaan Peeters <apeeters@lashout.net>, 2019
# Grocy NL, 2019
# Seppe <van.winkel.seppe@me.com>, 2019
# Engelbert Mercelis <engelbertmercelis@gmail.com>, 2019
# Niels Tholenaar <info@123quality.nl>, 2019
# Frank Klaassen <frank@frankklaassen.nl>, 2019
#
msgid ""
msgstr ""
@@ -10,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Seppe <van.winkel.seppe@me.com>, 2019\n"
"Last-Translator: Frank Klaassen <frank@frankklaassen.nl>, 2019\n"
"Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -39,33 +42,33 @@ msgstr "Koelkast"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Stuk"
msgstr[1] "Stuks"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "pak"
msgstr[1] "pakken"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Glas"
msgstr[1] "Glazen"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Blikje"
msgstr[1] "Blikjes"
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Blik"
msgstr[1] "Blikken"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Bos"
msgstr[1] "Bossen"
msgid "Gummy bears"
msgstr "Gombeertjes"
@@ -110,37 +113,37 @@ msgid "Changed towels in the bathroom"
msgstr "Handdoeken verwisseld in badkamer"
msgid "Cleaned the kitchen floor"
msgstr ""
msgstr "De keukenvloer schoongemaakt"
msgid "Warranty ends"
msgstr "Garantie eindigt"
msgid "TV remote control"
msgstr ""
msgstr "Afstandsbediening"
msgid "Alarm clock"
msgstr ""
msgstr "Wekker"
msgid "Heat remote control"
msgstr ""
msgstr "Afstandsbediening verwarming"
msgid "Lawn mowed in the garden"
msgstr ""
msgstr "Gazon gemaaid in de tuin"
msgid "Some good snacks"
msgstr ""
msgstr "Enkele goede hapjes"
msgid "Pizza dough"
msgstr "Pizzadeeg"
msgid "Sieved tomatoes"
msgstr ""
msgstr "Gezeefde tomaten"
msgid "Salami"
msgstr "Salami"
msgid "Toast"
msgstr ""
msgstr "Geroosterd brood"
msgid "Minced meat"
msgstr "Gehakt"
@@ -167,15 +170,15 @@ msgid "Demo in different language"
msgstr "Demo in een andere taal"
msgid "This is the note content of the recipe ingredient"
msgstr ""
msgstr "Dit is de inhoud van de opmerking van het recept-ingrediënt"
msgid "Demo User"
msgstr "Demo Gebruiker"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Gram"
msgstr[1] "Grams"
msgid "Flour"
msgstr "Bloem"
@@ -187,40 +190,40 @@ msgid "Sugar"
msgstr "Suiker"
msgid "Home"
msgstr ""
msgstr "Thuis"
msgid "Life"
msgstr ""
msgstr "Leven"
msgid "Projects"
msgstr ""
msgstr "Projecten"
msgid "Repair the garage door"
msgstr "Herstel de garagepoort"
msgid "Fork and improve grocy"
msgstr ""
msgstr "Fork en verbeter grocy"
msgid "Find a solution for what to do when I forget the door keys"
msgstr ""
msgstr "Zoek een oplossing voor wat te doen als ik de deursleutels vergeet"
msgid "Sweets"
msgstr "Snoep"
msgid "Bakery products"
msgstr ""
msgstr "Bakkerijproducten"
msgid "Tinned food"
msgstr ""
msgstr "Ingeblikt voedsel"
msgid "Butchery products"
msgstr ""
msgstr "Slagerij producten"
msgid "Vegetables/Fruits"
msgstr "Groenten/Fruit"
msgid "Refrigerated products"
msgstr ""
msgstr "Gekoelde producten"
msgid "Coffee machine"
msgstr "Koffiemachine"
@@ -232,7 +235,7 @@ msgid "Liter"
msgstr "Liter"
msgid "Liters"
msgstr ""
msgstr "Liters"
msgid "Bottle"
msgstr "Fles"
@@ -253,10 +256,10 @@ msgid "Milliliter"
msgstr "Milliliter"
msgid "Bottom"
msgstr ""
msgstr "Onderkant"
msgid "Topping"
msgstr ""
msgstr "Beleg"
msgid "French"
msgstr "Frans"
@@ -268,19 +271,45 @@ msgid "Spanish"
msgstr "Spaans"
msgid "Russian"
msgstr ""
msgstr "Russisch"
msgid "The thing which happens on the 5th of every month"
msgstr ""
msgstr "Het ding dat op de 5e van elke maand gebeurt"
msgid "The thing which happens daily"
msgstr ""
msgstr "Het ding dat dagelijks gebeurt"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr ""
msgstr "Het ding dat op maandag en woensdag gebeurt"
msgid "Swedish"
msgstr ""
msgstr "Zweeds"
msgid "Polish"
msgstr "Pools"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -4,26 +4,23 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Language-Team: Tamil (https://www.transifex.com/grocy/teams/93189/ta/)\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: Norwegian (https://www.transifex.com/grocy/teams/93189/no/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Language: no\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_types\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "manually"
msgid "no-assignment"
msgstr ""
msgid "dynamic-regular"
msgid "who-least-did-first"
msgstr ""
msgid "daily"
msgid "random"
msgstr ""
msgid "weekly"
msgstr ""
msgid "monthly"
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -1,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Andreas Henden <chairman2s.ah@gmail.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Andreas Henden <chairman2s.ah@gmail.com>, 2019\n"
"Language-Team: Norwegian (https://www.transifex.com/grocy/teams/93189/no/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,7 +18,7 @@ msgstr ""
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "Manuel"
msgstr "manuelt"
msgid "dynamic-regular"
msgstr "Automatisk"

View File

@@ -48,3 +48,6 @@ msgstr "nb-NO"
msgid "fullcalendar_locale"
msgstr "nb"
msgid "bootstrap-select_locale"
msgstr "nb_NO"

View File

@@ -282,3 +282,29 @@ msgstr "Svensk"
msgid "Polish"
msgstr "Polsk"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -1,5 +1,5 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Marius Borø <blizzwave@gmail.com>, 2019
#
msgid ""
msgstr ""
@@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Marius Borø <blizzwave@gmail.com>, 2019\n"
"Language-Team: Norwegian (https://www.transifex.com/grocy/teams/93189/no/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,13 +17,13 @@ msgstr ""
"X-Domain: grocy/stock_transaction_types\n"
msgid "purchase"
msgstr "Innkjøp"
msgstr "innkjøp"
msgid "consume"
msgstr "Forbruk produkt"
msgstr "forbruk"
msgid "inventory-correction"
msgstr "Korreksjon av husholdningsantall "
msgstr "beholdningsantall korreksjon"
msgid "product-opened"
msgstr "Produkt åpnet"
msgstr "produkt åpnet"

View File

@@ -1,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Andreas Henden <chairman2s.ah@gmail.com>, 2019
# Marius Borø <blizzwave@gmail.com>, 2019
#
msgid ""
@@ -18,17 +19,17 @@ msgstr ""
"X-Domain: grocy/strings\n"
msgid "Stock overview"
msgstr "Husholdning"
msgstr "Beholdningsoversikt"
msgid "%s product expires"
msgid_plural "%s products expiring"
msgstr[0] "%s går ut på dato"
msgstr[0] "%s produkt går ut på dato"
msgstr[1] "%s produkter går ut på dato"
msgid "within the next day"
msgid_plural "within the next %s days"
msgstr[0] "innen neste dag"
msgstr[1] "innen de %s dagene"
msgstr[0] "i løpet av neste dag"
msgstr[1] "i løpet av de %s neste dagene"
msgid "%s product is already expired"
msgid_plural "%s products are already expired"
@@ -37,8 +38,8 @@ msgstr[1] "%s produkter har gått ut på dato"
msgid "%s product is below defined min. stock amount"
msgid_plural "%s products are below defined min. stock amount"
msgstr[0] "%s produkt er under definert min. for husholdningen"
msgstr[1] "%s produkter er under definert min. for husholdningen"
msgstr[0] "%s produkt er under satt minimum for beholdningen"
msgstr[1] "%s produkter er under satt minimum for beholdningen"
msgid "Product"
msgstr "Produkt"
@@ -49,19 +50,19 @@ msgstr[0] "%s Produkt"
msgstr[1] "%s Produkter"
msgid "Amount"
msgstr "Antall"
msgstr "Mengde"
msgid "Next best before date"
msgstr "Kommende best før dato"
msgstr "Neste best før dato"
msgid "Logout"
msgstr "Logg ut"
msgid "Chores overview"
msgstr "Oversikt husarbeid"
msgstr "Husarbeidsoversikt"
msgid "Batteries overview"
msgstr "Oversikt batteri"
msgstr "Batterioversikt"
msgid "Purchase"
msgstr "Innkjøp"
@@ -70,16 +71,16 @@ msgid "Consume"
msgstr "Forbruk produkt"
msgid "Inventory"
msgstr "Endre husholdning"
msgstr "Beholdning"
msgid "Shopping list"
msgstr "Handleliste"
msgid "Chore tracking"
msgstr "Logge husarbeid"
msgstr "Husarbeidsregistrering"
msgid "Battery tracking"
msgstr "Batteri ladesyklus"
msgstr "Batteriregistrering"
msgid "Locations"
msgstr "Lokasjoner"
@@ -97,10 +98,10 @@ msgid "Chore"
msgstr "Husarbeid"
msgid "Next estimated tracking"
msgstr "Neste handling"
msgstr "Neste estimterte registrering"
msgid "Last tracked"
msgstr "Sist logget"
msgstr "Sist registert"
msgid "Battery"
msgstr "Batteri"
@@ -109,7 +110,7 @@ msgid "Last charged"
msgstr "Sist ladet"
msgid "Next planned charge cycle"
msgstr "Neste planlagte ladesyklus"
msgstr "Neste planlagte oppladning"
msgid "Best before"
msgstr "Best før"
@@ -118,13 +119,13 @@ msgid "OK"
msgstr "OK"
msgid "Product overview"
msgstr "Produkt oversikt"
msgstr "Produktoversikt"
msgid "Stock quantity unit"
msgstr "Forpakningstype i husholdningen"
msgstr "Forpakningstype i beholdningen"
msgid "Stock amount"
msgstr "Husholdning"
msgstr "Standardmengde"
msgid "Last purchased"
msgstr "Sist kjøpt"
@@ -140,34 +141,34 @@ msgstr "Strekkodesøk deaktivert"
msgid ""
"will be added to the list of barcodes for the selected product on submit"
msgstr "Blir lagt til liste over strekkoder når produkt blir lagt inn."
msgstr "Blir lagt til liste over strekkoder når produkt blir lagt inn"
msgid "New amount"
msgstr "Nytt antall"
msgstr "Ny mengde"
msgid "Note"
msgstr "Info"
msgid "Tracked time"
msgstr "Tid utført/ ladet"
msgstr "Tid registrert"
msgid "Chore overview"
msgstr "Oversikt husarbeid"
msgstr "Husarbeidsoversikt"
msgid "Tracked count"
msgstr "Antall utførelser/ ladninger"
msgstr "Antall registrerte"
msgid "Battery overview"
msgstr "Batteri oversikt"
msgstr "Batterioversikt"
msgid "Charge cycles count"
msgstr "Antall ladesykluser"
msgstr "Antall oppladninger"
msgid "Create shopping list item"
msgstr "Opprett handelisteoppføring"
msgstr "Opprett punkt i handeliste"
msgid "Edit shopping list item"
msgstr "Endre på handlelistoppføring"
msgstr "Endre punkt i handleliste"
msgid "Save"
msgstr "Lagre"
@@ -182,13 +183,13 @@ msgid "Location"
msgstr "Lokasjon"
msgid "Min. stock amount"
msgstr "Minimumsantall for husholdningen"
msgstr "Min. beholdning"
msgid "QU purchase"
msgstr "Forpakingsfaktor innkjøp"
msgid "QU stock"
msgstr "Forpakingsfaktor husholdning"
msgstr "Forpakingsfaktor beholdning"
msgid "QU factor"
msgstr "Forpakingsfaktor"
@@ -203,7 +204,7 @@ msgid "Barcode(s)"
msgstr "Strekkode(r)"
msgid "Minimum stock amount"
msgstr "Minimumsantall for husholdningen"
msgstr "Minimumsbeholdning"
msgid "Default best before days"
msgstr "Standard for antall dager best før"
@@ -212,7 +213,7 @@ msgid "Quantity unit purchase"
msgstr "Forpakning kjøpt"
msgid "Quantity unit stock"
msgstr "Forpakning husholdning"
msgstr "Forpakning beholdning"
msgid "Factor purchase to stock quantity unit"
msgstr "Innkjøpsfaktor for forpakning"
@@ -230,7 +231,7 @@ msgid "Period days"
msgstr "Antall dager for gjentakelse"
msgid "Create chore"
msgstr "Opprett husarbeid oppgave"
msgstr "Opprett husarbeidsoppgave"
msgid "Used in"
msgstr "Brukt"
@@ -242,7 +243,7 @@ msgid "Edit battery"
msgstr "Endre batteri"
msgid "Edit chore"
msgstr "Endre husarbeid oppgave"
msgstr "Endre husarbeidsoppgave"
msgid "Edit quantity unit"
msgstr "Endre forpakning"
@@ -266,7 +267,7 @@ msgid "never"
msgstr "aldri"
msgid "Add products that are below defined min. stock amount"
msgstr "Legg til produkt som er under minimumsnivå for husholdningen"
msgstr "Legg til produkt som er under minimumsbeholdningen"
msgid ""
"For purchases this amount of days will be added to today for the best before"
@@ -275,7 +276,7 @@ msgstr "Når innkjøp gjøres vil dette bli brukt som antall dager \"best før\"
msgid "This means 1 %1$s purchased will be converted into %2$s %3$s in stock"
msgstr ""
"Dette betyr at %1$s innkjøp vil bli gjort om til %2$s %3$s i husholdningen"
"Dette betyr at %1$s innkjøp vil bli gjort om til %2$s %3$s i beholdningen"
msgid "Login"
msgstr "Logg inn"
@@ -299,7 +300,7 @@ msgid "No"
msgstr "Nei"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Er du sikker på du ønsker å slette husarbeid oppgave \"%s\"?"
msgstr "Er du sikker på du ønsker å slette husarbeidsoppgave \"%s\"?"
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr "\"%s\" kunne ikke bli tildelt et produkt, hvordan ønsker du å fortsette?"
@@ -314,7 +315,7 @@ msgid "Add as new product"
msgstr "Legg til som nytt produkt"
msgid "Add as barcode to existing product"
msgstr "Legg til strekkode til allerede eksisterende produkt"
msgstr "Legg til strekkode til eksisterende produkt"
msgid "Add as new product and prefill barcode"
msgstr "Legg til som nytt produkt med forhåndsfylt strekkode"
@@ -332,7 +333,7 @@ msgid "Manage API keys"
msgstr "Administrer API-Keys"
msgid "REST API & data model documentation"
msgstr "REST-API & Datamodell Dokumentasjon"
msgstr "REST-API & datamodell-dokumentasjon"
msgid "API keys"
msgstr "API-Keys"
@@ -350,23 +351,21 @@ msgid "Created"
msgstr "Opprettet"
msgid "This product is not in stock"
msgstr "Dette produktet er ikke i husholdningen"
msgstr "Dette produktet er ikke i beholdningen"
msgid "This means %s will be added to stock"
msgstr "Dette betyr at %s vil bli lagt til i husholdningen"
msgstr "Dette betyr at %s vil bli lagt til i beholdningen"
msgid "This means %s will be removed from stock"
msgstr "Dette betyr at %s vil bli fjernet fra husholdningen"
msgstr "Dette betyr at %s vil bli fjernet fra beholdningen"
msgid ""
"This means it is estimated that a new execution of this chore is tracked %s "
"days after the last was tracked"
"This means the next execution of this chore is scheduled %s days after the "
"last execution"
msgstr ""
"Dette betyr at det er estimert at den nye utførelsen av denne husarbeid "
"oppgaven er logget %s dag etter den sist var logget"
msgid "Removed %1$s of %2$s from stock"
msgstr "Fjernet %1$s %2$s fra husholdnigen"
msgstr "Fjernet %1$s %2$s fra beholdningen"
msgid "About grocy"
msgstr "Om Grocy"
@@ -378,19 +377,19 @@ msgid "Released on"
msgstr "Utgitt"
msgid "Added %1$s of %2$s to stock"
msgstr "Lagt til %1$s %2$s i husholdningen"
msgstr "Lagt til %1$s %2$s i beholdningen"
msgid "Stock amount of %1$s is now %2$s"
msgstr "Husholdning av %1$s er nå %2$s"
msgstr "Beholdning av %1$s er nå %2$s"
msgid "Tracked execution of chore %1$s on %2$s"
msgstr "Utførte husarbeid oppgave \"%1$s\" den %2$s"
msgstr "Registrerte husarbeidsoppgave \"%1$s\" den %2$s"
msgid "Tracked charge cycle of battery %1$s on %2$s"
msgstr "Logget lading av batteri %1$s den %2$s"
msgstr "Registrert lading av batteri %1$s den %2$s"
msgid "Consume all %s which are currently in stock"
msgstr "Forbruk alle %s som er i husholdningen"
msgstr "Forbruk alle %s i beholdningen"
msgid "All"
msgstr "Alle"
@@ -399,7 +398,7 @@ msgid "Track charge cycle of battery %s"
msgstr "%s ladet"
msgid "Track execution of chore %s"
msgstr "Utfør husarbeidsoppgave \"%s\""
msgstr "Registrerte husarbeidsoppgave \"%s\""
msgid "Filter by location"
msgstr "Filtrér etter lokasjon"
@@ -426,13 +425,13 @@ msgid "A location is required"
msgstr "En lokasjon kreves"
msgid "The amount cannot be lower than %s"
msgstr "Antallet kan ikke være lavere enn %s"
msgstr "Mengden kan ikke være lavere enn %s"
msgid "This cannot be negative"
msgstr "Dette kan ikke være negativt"
msgid "A quantity unit is required"
msgstr "Forpakning antall/størrelse kreves"
msgstr "Forpakning mengde/størrelse kreves"
msgid "A period type is required"
msgstr "En periodetype kreves"
@@ -444,7 +443,7 @@ msgid "Settings"
msgstr "Innstillinger"
msgid "This can only be before now"
msgstr "Dette kan kun være før nå"
msgstr "Dette kan kun være før nå tid"
msgid "Calendar"
msgstr "Kalender"
@@ -462,7 +461,7 @@ msgid "Ingredients list"
msgstr "Liste over ingredienser"
msgid "Add recipe ingredient"
msgstr "Legg ingrediens til oppskrift"
msgstr "Legg til ingrediens i oppskrift"
msgid "Edit recipe ingredient"
msgstr "Endre ingrediens i oppskrift"
@@ -486,17 +485,16 @@ msgid "Put missing products on shopping list"
msgstr "Legg manglende produkter til handlelisten"
msgid "Enough in stock"
msgstr "Nok i husholdningen"
msgstr "Nok i beholdningen"
msgid ""
"Not enough in stock, %s ingredient missing but already on the shopping list"
msgid_plural ""
"Not enough in stock, %s ingredients missing but already on the shopping list"
msgstr[0] ""
"Ikke nok i husholdningen, %s ingrediens mangler, men den er på handlelisten."
"Ikke nok i beholdningen, %s ingrediens mangler, men den er på handlelisten."
msgstr[1] ""
"Ikke nok i husholdningen, %s ingredienser mangler, men de er på "
"handlelisten."
"Ikke nok i beholdningen, %s ingredienser mangler, men de er på handlelisten."
msgid "Expand to fullscreen"
msgstr "Full skjerm"
@@ -511,7 +509,7 @@ msgid "Recipe"
msgstr "Oppskrift"
msgid "Not enough in stock, %1$s missing, %2$s already on shopping list"
msgstr "Ikke nok i husholdningen, mangler %1$s, er %2$s på handlelisten"
msgstr "Ikke nok i beholdningen, mangler %1$s, er %2$s på handlelisten"
msgid "Show notes"
msgstr "Vis notater"
@@ -560,7 +558,7 @@ msgid "Confirm password"
msgstr "Bekreft passord"
msgid "Passwords do not match"
msgstr "Passord er ikke like"
msgstr "Passordene er ikke like"
msgid "Change password"
msgstr "Endre passord"
@@ -614,23 +612,23 @@ msgstr[1] "%s Enheter"
msgid "%s chore is due to be done"
msgid_plural "%s chores are due to be done"
msgstr[0] "%s husarbeidsoppgave som må gjøre nå"
msgstr[1] "%s husarbeidsoppgaver som må gjøre nå"
msgstr[0] "%s husarbeidsoppgave som må gjøres nå"
msgstr[1] "%s husarbeidsoppgaver som må gjøres nå"
msgid "%s chore is overdue to be done"
msgid_plural "%s chores are overdue to be done"
msgstr[0] "%s husarbeidsoppgave har gått over fristen"
msgstr[1] "%s husarbeidsoppgaver har gått over fristen"
msgstr[0] "%s husarbeidsoppgave har gått over fristen for utførelse"
msgstr[1] "%s husarbeidsoppgaver har gått over fristen for utførelse"
msgid "%s battery is due to be charged"
msgid_plural "%s batteries are due to be charged"
msgstr[0] "%s batteri må lades"
msgstr[1] "%s batterier må lades"
msgstr[0] "%s batteri må lades"
msgstr[1] "%s batterier må lades"
msgid "%s battery is overdue to be charged"
msgid_plural "%s batteries are overdue to be charged"
msgstr[0] "%s batteri er over fristen for å bli ladet"
msgstr[1] "%s batterier er over fristen for å bli ladet"
msgstr[0] "%s batteri har forfalt frist for å bli ladet"
msgstr[1] "%s batterier har forfalt frist for å bli ladet"
msgid "in singular form"
msgstr "I entall"
@@ -642,7 +640,7 @@ msgid "This cannot be lower than %s"
msgstr "Dette kan ikke være lavere enn %s"
msgid "-1 means that this product never expires"
msgstr "Ved å skrive -1 vil produktet ikke gå ut på dato"
msgstr "Ved å skrive \"-1\" vil produktet ikke gå ut på dato"
msgid "Quantity unit"
msgstr "Forpakning"
@@ -658,10 +656,10 @@ msgid ""
msgstr ""
"Er du sikker du ønsker å forbruke alle ingredienser for \"%s\" oppskriften? "
"(Ingredienser merket med \"Ønsker du å bruke mindre/større enn normal "
"forpakningsstørrelse??\" blir ignorert"
"forpakningsstørrelse?\") blir ignorert"
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr "Fjern alle ingredienser for \"%s\" oppskriften fra husholdningen."
msgstr "Fjern alle ingredienser for \"%s\" oppskriften fra beholdningen."
msgid "Consume all ingredients needed by this recipe"
msgstr "Forbruk alle ingredienser for denne oppskriften"
@@ -688,7 +686,7 @@ msgid "Due"
msgstr "Forfall"
msgid "Assigned to"
msgstr "Tildelt"
msgstr " Tildelt til"
msgid "Mark task \"%s\" as completed"
msgstr "Merk oppgave \"%s\" som ferdig"
@@ -697,7 +695,7 @@ msgid "Uncategorized"
msgstr "Mangler kategori"
msgid "Task categories"
msgstr "Oppgave kategorier"
msgstr "Oppgavekategorier"
msgid "Create task"
msgstr "Opprett en oppgave"
@@ -716,19 +714,19 @@ msgstr "Er du sikker du ønsker slette oppgave \"%s\"?"
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
msgstr[0] "%s oppgave må gjøres"
msgstr[1] "%s oppgaver må gjøres"
msgstr[0] "%s oppgave må gjøres"
msgstr[1] "%s oppgaver må gjøres"
msgid "%s task is overdue to be done"
msgid_plural "%s tasks are overdue to be done"
msgstr[0] "%s oppgave har gått over fristen"
msgstr[1] "%s oppgaver har gått over fristen"
msgstr[0] "%s oppgave har forfalt frist for å bli utført"
msgstr[1] "%s oppgaver har forfalt frist for å bli utført"
msgid "Edit task category"
msgstr "Endre oppgave kategori"
msgstr "Endre oppgavekategori"
msgid "Create task category"
msgstr "Opprett oppgave kategori"
msgstr "Opprett oppgavekategori"
msgid "Product groups"
msgstr "Produktgrupper"
@@ -737,10 +735,10 @@ msgid "Ungrouped"
msgstr "Mangler gruppe"
msgid "Create product group"
msgstr "Opprett produkt gruppe"
msgstr "Opprett produktgruppe"
msgid "Edit product group"
msgstr "Endre produkt gruppe"
msgstr "Endre produktgruppe"
msgid "Product group"
msgstr "Produktgruppe"
@@ -760,7 +758,7 @@ msgid "Filter by status"
msgstr "Filtrér etter status"
msgid "Below min. stock amount"
msgstr "Under under minimum husholdningsnivå"
msgstr "Under under min. beholdningsmengde"
msgid "Expiring soon"
msgstr "Går snart ut på dato"
@@ -775,7 +773,7 @@ msgid "Overdue"
msgstr "Forfalt"
msgid "View settings"
msgstr "Se instillinger"
msgstr "Se innstillinger"
msgid "Auto reload on external changes"
msgstr "Automatisk fornying ved ekstern endring"
@@ -824,7 +822,7 @@ msgid ""
"stock amount first."
msgstr ""
"Dette produktet kan ikke slettes fordi det er gjenværende produkter i "
"husholdningen"
"beholdningen"
msgid "Delete not possible"
msgstr "Ikke mulig å slette"
@@ -892,19 +890,19 @@ msgid "Journal"
msgstr "Logg"
msgid "Stock journal"
msgstr "Husholdningslogg"
msgstr "Beholdningslogg"
msgid "Filter by product"
msgstr "Filtrér etter produkt"
msgid "Booking time"
msgstr "Tid logget"
msgstr "Tid registrert"
msgid "Booking type"
msgstr "Booking type"
msgstr "Registreringstype"
msgid "Undo booking"
msgstr "Angre booking"
msgstr "Angre registrering"
msgid "Undone on"
msgstr "Angret den"
@@ -928,7 +926,7 @@ msgid "Undo"
msgstr "Angre"
msgid "Booking successfully undone"
msgstr "Booking fjernet"
msgstr "Registrering fjernet"
msgid "Charge cycle successfully undone"
msgstr "Ladesyklus fjernet"
@@ -937,16 +935,16 @@ msgid "This cannot be negative and must be an integral number"
msgstr "Tallet kan ikke være negativ og må være et helt tall"
msgid "Disable stock fulfillment checking for this ingredient"
msgstr "Ikke bruk husholdningsjekk for denne ingrediensen "
msgstr "Ikke bruk beholdningsjekk for denne ingrediensen "
msgid "Add all list items to stock"
msgstr "Legg alle produktene i listen til husholdningen"
msgstr "Legg alle produktene i listen til beholdningen"
msgid "Add %1$s of %2$s to stock"
msgstr "Legg til %1$s %2$s i husholdningen"
msgstr "Legg til %1$s %2$s i beholdningen"
msgid "Adding shopping list item %1$s of %2$s"
msgstr "Legger til handlelisteenhet %1$s av %2$s"
msgstr "Legger til handleliste ting %1$s av %2$s"
msgid "Use a specific stock item"
msgstr "Velg et bestemt produkt"
@@ -955,8 +953,8 @@ msgid ""
"The first item in this list would be picked by the default rule which is "
"\"First expiring first, then first in first out\""
msgstr ""
"Første produkt på listen vil bli konsumert først i henhold til standard "
"regelen. \"Går ut på dato først. Deretter først inn, først ut\"."
"Første produkt på listen vil bli konsumert først i henhold til regel: \"Går "
"ut på dato først. Deretter først inn, først ut\"."
msgid "Mark %1$s of %2$s as open"
msgstr "Merk %1$s av %2$s som åpen"
@@ -1005,17 +1003,17 @@ msgid "Show clock in header"
msgstr "Vis klokken på toppen av siden"
msgid "Stock settings"
msgstr "Husholdningsinnstillinger"
msgstr "Beholdningsinnstillinger"
msgid "Shopping list to stock workflow"
msgstr "Arbeidsflyt fra handleliste til husholding"
msgstr "Arbeidsflyt fra handleliste til beholding"
msgid ""
"Automatically do the booking using the last price and the amount of the "
"shopping list item, if the product has \"Default best before days\" set"
msgstr ""
"Legg produkter automatisk til fra handlelisten. Dette vil bruke sist "
"innkjøpspris og forutsetter at \"Standard for antall dager best før\" er "
"Legg produkter automatisk til fra handlelisten. Dette vil bruke siste brukte"
" innkjøpspris og forutsetter at \"Standard for antall dager best før\" er "
"satt"
msgid "Skip"
@@ -1044,9 +1042,9 @@ msgid ""
"shopping list"
msgstr ""
"Som standard vil antallet som skal legges til handlelisten være slik "
"\"nødvendig antall - husholdningsantall - handleliste antall\". Men når "
"denne funksjonen er aktivert vil det være slik \"nødvendig antall - "
"husholdningsantall\""
"\"nødvendig antall - beholdningsantall - handleliste antall\". Men når denne"
" funksjonen er aktivert vil det være slik \"nødvendig antall - "
"beholdningsantall\""
msgid "Picture"
msgstr "Bilde"
@@ -1074,7 +1072,7 @@ msgstr ""
"format"
msgid "Allow partial units in stock"
msgstr "Tillat oppdelte enheter i husholdningen"
msgstr "Tillat oppdelte enheter i beholdningen"
msgid "Enable tare weight handling"
msgstr "Aktiver tara vekt funksjon"
@@ -1085,9 +1083,9 @@ msgid ""
"calculated based on what is in stock and the tare weight defined below"
msgstr ""
"Dette er nyttig f.eks med mel i en beholder. Ved innkjøp/ forbruk/ endring "
"av husholdning veier du alltid hele beholderen. Gjenværende mengde vil så "
"bli kalkulert i forhold til hva som er i husholdningen og tara vekten "
"definert under"
"av beholdning veier du alltid hele beholderen. Gjenværende mengde vil så bli"
" kalkulert i forhold til hva som er i beholdningen og tara vekten definert "
"under"
msgid "Tare weight"
msgstr "Tara vekt"
@@ -1112,10 +1110,10 @@ msgid "The current picture will be deleted when you save the recipe"
msgstr "Nåværende bilde vil bli slettet når du larer oppskriften"
msgid "Show product details"
msgstr "Vis produkt detaljer"
msgstr "Vis produktdetaljer"
msgid "Stock journal for this product"
msgstr "Husholdningslogg for dette produktet"
msgstr "Beholdningslogg for dette produktet"
msgid "Show chore details"
msgstr "Vis husarbeidarbeid detaljer"
@@ -1144,11 +1142,11 @@ msgstr ""
"denne?"
msgid "Product count"
msgstr "Produkt telling"
msgstr "Produkttelling"
msgid "Type a new product name or barcode and hit TAB to start a workflow"
msgstr ""
"Skriv inn et nytt produkt eller strekkode, og så trykk TAB for å starte "
"Skriv inn et nytt produkt eller strekkode, trykk TAB for å starte "
"prosessen"
msgid ""
@@ -1198,7 +1196,7 @@ msgid "Show less"
msgstr "Vis mindre"
msgid "The amount must be between %1$s and %2$s"
msgstr "Antallet må være mellom %1$s og %2$s"
msgstr "Mengden må være mellom %1$s og %2$s"
msgid "Day of month"
msgstr "Dag i måned"
@@ -1280,42 +1278,42 @@ msgstr "I flertall"
msgid "Not enough in stock, %s ingredient missing"
msgid_plural "Not enough in stock, %s ingredients missing"
msgstr[0] "Ikke nok i husholdningen, %s ingrediens mangler"
msgstr[1] "Ikke nok i husholdningen, %s ingredienser mangler"
msgstr[0] "Ikke nok i beholdningen, %s ingrediens mangler"
msgstr[1] "Ikke nok i beholdningen, %s ingredienser mangler"
msgid "The amount cannot be lower than %1$s or equal %2$s"
msgstr "Antallet kan ikke være lavere enn %1$s eller lik %2$s"
msgstr "Mengden kan ikke være lavere enn %1$s eller lik %2$s"
msgid "Not enough in stock, but already on the shopping list"
msgstr "Ikke nok i husholdningen, men er på handelisten"
msgstr "Ikke nok i beholdningen, men er på handelisten"
msgid "Not enough in stock"
msgstr "Ikke nok i husholdningen"
msgstr "Ikke nok i beholdningen"
msgid "Expiring soon days"
msgstr "Går ut på dato snart dager"
msgid "Default amount for purchase"
msgstr "Standard antall for innkjøp"
msgstr "Standard mengde for innkjøp"
msgid "Default amount for consume"
msgstr "Standard antall for forbruk"
msgstr "Standard mengde for forbruk"
msgid "Variable amount"
msgstr "Variabelt antall"
msgstr "Variabel mengde"
msgid ""
"When this is not empty, it will be shown instead of the amount entered above"
" while the amount there will still be used for stock fulfillment checking"
msgstr ""
"Når denne ikke er tom, vil denne bli vist i stedet for antallet skrevet inn "
"over, mens antallet der vil bli brukt for å sjekke husholdnigsantall."
"over, mens antallet der vil bli brukt for å sjekke beholdnigsmengde."
msgid "Track date only"
msgstr "Logg kun dato"
msgstr "Registrer kun dato"
msgid "When enabled only the day of an execution is tracked, not the time"
msgstr "Når dette er aktivert vil kun dagen og ikke tiden bli logget"
msgstr "Når aktivert vil kun dagen og ikke tiden bli registrert"
msgid "Consume %1$s of %2$s"
msgstr "Forbruk %1$s av %2$s"
@@ -1353,25 +1351,284 @@ msgid "Products"
msgstr "Produkter"
msgid "Marked task %s as completed on %s"
msgstr ""
msgstr "Merket oppgave %s som ferdig på %s"
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr ""
msgstr "Registrering har flere registreringer under seg, angre er ikke mulig"
msgid "per serving"
msgstr ""
msgstr "pr. servering"
msgid "Never"
msgstr ""
msgstr "Aldri"
msgid "Today"
msgstr ""
msgstr "I dag"
msgid "Consume %1$s of %2$s as spoiled"
msgstr ""
msgstr "Forbruk %1$s av %2$s som har gått ut på dato"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Ikke alle ingrediensene i oppskriften \"%s\" er på lager, så ingenting er "
"fjernet!"
msgid "Undo task \"%s\""
msgstr "Angre oppgave \"%s\""
msgid "Due date rollover"
msgstr "Forfallsdato rollover"
msgid ""
"When enabled the chore can never be overdue, the due date will shift forward"
" each day when due"
msgstr ""
"Når aktiveret kan husoppgaven aldri forfalle, forfallsdatoen flyttes frem "
"hver dag husoppgaven ikke utføres"
msgid "Location Content Sheet"
msgstr "Lokasjonsinnholdsark"
msgid "Print"
msgstr "Skriv ut"
msgid "all locations"
msgstr "Alle lokasjoner"
msgid ""
"Here you can print a page per location with the current stock, maybe to hang"
" it there and note the consumed things on it."
msgstr ""
"Her kan du printe en side per lokasjon med nåværende beholding, for eksempel"
" for å henge opp og notere forbruk av diverse produkt"
msgid "this location"
msgstr "denne lokasjonen"
msgid "Consumend amount"
msgstr "Forbrukt mengde"
msgid "Time of printing"
msgstr "Tidspunkt for utskrift"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Er du sikker du ønsker å slette utstyr \"%s\"?"
msgid "Parent product"
msgstr "Hovedprodukt"
msgid ""
"Not possible because this product is already used as a parent product in "
"another product"
msgstr ""
"Ikke mulig da dette produktet brukes som hovedprodukt av et annet produkt"
msgid "Default conversions"
msgstr "Standard konvertering"
msgid "Factor"
msgstr "Faktor"
msgid "1 %s is the same as..."
msgstr "1 %s er det samme som..."
msgid "Create QU conversion"
msgstr "Opprett konvertering"
msgid "Default for QU"
msgstr "Standard for forpakning"
msgid "Quantity unit from"
msgstr "Konvertere fra"
msgid "Quantity unit to"
msgstr "Konvertere til"
msgid ""
"This cannot be lower than %1$s and must be a valid number with max. %2$s "
"decimal places"
msgstr ""
"Dette kan ikke være lavere enn %1$s og må være et gyldig nummer med %2$s "
"desimaler "
msgid "This cannot be equal to %s"
msgstr "Dette kan ikke være samme som %s"
msgid "This means 1 %1$s is the same as %2$s %3$s"
msgstr "Dette betyr at 1 %1$s er det samme som %2$s%3$s"
msgid "QU conversions"
msgstr "Forpakningskonvertering"
msgid "Product overrides"
msgstr "Produktoverstyring"
msgid "Override for product"
msgstr "Overstyr for product"
msgid "This equals %1$s %2$s in stock"
msgstr ""
msgid "Edit QU conversion"
msgstr ""
msgid "An assignment type is required"
msgstr ""
msgid "Assignment type"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution, but only for the weekdays selected below"
msgstr ""
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled on the below "
"selected day of each month"
msgstr ""
msgid ""
"This means the next execution of this chore will not be assigned to anyone"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the one who "
"executed it least"
msgstr ""
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the next one"
" in alphabetical order"
msgstr ""
msgid "Assign to"
msgstr ""
msgid "This assignment type requires that at least one is assigned"
msgstr ""
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] ""
msgstr[1] ""
msgid "Assigned to me"
msgstr "Tildelt meg"
msgid "assigned to %s"
msgstr "tildelt %s"
msgid "Filter by assignment"
msgstr "Filtrér etter oppgave"
msgid "Consume product on chore execution"
msgstr ""
msgid "Are you sure to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr ""
msgid "Create userentity"
msgstr ""
msgid "Show in sidebar menu"
msgstr ""
msgid "Edit userentity"
msgstr ""
msgid "Edit %s"
msgstr "Endre %s"
msgid "Create %s"
msgstr "Opprett %s"
msgid "Are you sure to delete this userobject?"
msgstr "Er du sikker på du ønsker å slette dette objektet?"
msgid "Icon CSS class"
msgstr "Icon CSS class"
msgid "For example"
msgstr "For eksempel"
msgid "Configure fields"
msgstr ""
msgid "Quantity unit plural form testing"
msgstr ""
msgid "Result"
msgstr "Resultat"
msgid "Test plural forms"
msgstr "Test flertallsform"
msgid "Scan a barcode"
msgstr "Skann strekkode"
msgid "Error while initializing the barcode scanning library"
msgstr "Feil under oppstart av strekkodeleser "
msgid ""
"The resulting price of this ingredient will be multiplied by this factor"
msgstr ""
msgid "Price factor"
msgstr ""
msgid "Do you find grocy useful?"
msgstr ""
msgid "Say thanks"
msgstr ""
msgid "Search for recipes containing this product"
msgstr ""
msgid "Add to shopping list"
msgstr ""
msgid "Added %1$s of %2$s to the shopping list \"%3$s\""
msgstr ""
msgid "Output"
msgstr ""
msgid "Energy (kcal)"
msgstr ""
msgid "Per stock quantity unit"
msgstr ""
msgid "Barcode scanner testing"
msgstr ""
msgid "Expected barcode"
msgstr ""
msgid "Scan field"
msgstr ""
msgid "Scanned barcodes"
msgstr ""
msgid "Hit"
msgstr ""
msgid "Miss"
msgstr ""

View File

@@ -0,0 +1,26 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: Polish (https://www.transifex.com/grocy/teams/93189/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -43,3 +43,6 @@ msgstr "pl-PL"
msgid "fullcalendar_locale"
msgstr "pl"
msgid "bootstrap-select_locale"
msgstr "pl_PL"

View File

@@ -296,3 +296,31 @@ msgstr "Szwedzki"
msgid "Polish"
msgstr "Polski"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -0,0 +1,29 @@
# Translators:
# Pavel Pletenev <cpp.create@gmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Pavel Pletenev <cpp.create@gmail.com>, 2019\n"
"Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "без-назначения"
msgid "who-least-did-first"
msgstr "кто-меньше-сделал-сначала"
msgid "random"
msgstr "случайно"
msgid "in-alphabetical-order"
msgstr "по-алфавиту"

View File

@@ -26,10 +26,35 @@ msgid "moment_locale"
msgstr "ru"
msgid "datatables_localization"
msgstr "{}"
msgstr ""
"{\n"
"\"processing\": \"Подождите...\",\n"
"\"search\": \"Поиск:\",\n"
"\"lengthMenu\": \"Показать _MENU_ записей\",\n"
"\"info\": \"Записи с _START_ до _END_ из _TOTAL_ записей\",\n"
"\"infoEmpty\": \"Записи с 0 до 0 из 0 записей\",\n"
"\"infoFiltered\": \"(отфильтровано из _MAX_ записей)\",\n"
"\"infoPostFix\": \"\",\n"
"\"loadingRecords\": \"Загрузка записей...\",\n"
"\"zeroRecords\": \"Записи отсутствуют.\",\n"
"\"emptyTable\": \"В таблице отсутствуют данные\",\n"
"\"paginate\": {\n"
"\"first\": \"Первая\",\n"
"\"previous\": \"Предыдущая\",\n"
"\"next\": \"Следующая\",\n"
"\"last\": \"Последняя\"\n"
"},\n"
"\"aria\": {\n"
"\"sortAscending\": \": активировать для сортировки столбца по возрастанию\",\n"
"\"sortDescending\": \": активировать для сортировки столбца по убыванию\"\n"
"}\n"
"}"
msgid "summernote_locale"
msgstr "ru-RU"
msgid "fullcalendar_locale"
msgstr "ru"
msgid "bootstrap-select_locale"
msgstr "ru_RU"

View File

@@ -295,3 +295,37 @@ msgstr "Шведский"
msgid "Polish"
msgstr "Польский"
msgid "Milk Chocolate"
msgstr "Молочный шоколад"
msgid "Dark Chocolate"
msgstr "Тёмный шоколад"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Срез (Slice)"
msgstr[1] "Среза (Slices)"
msgstr[2] "Срезы (Slices)"
msgstr[3] "Срезы (Slices)"
msgid "Example userentity"
msgstr "Пример пользовательской сущности"
msgid "This is an example user entity..."
msgstr "Это пример пользовательской сущности..."
msgid "Custom field"
msgstr "Пользовательское поле"
msgid "Example field value..."
msgstr "Пример значения поля..."
msgid "Waffle rolls"
msgstr "Сладкие трубочки"
msgid "Danish"
msgstr ""
msgid "Dutch"
msgstr ""

View File

@@ -374,11 +374,9 @@ msgid "This means %s will be removed from stock"
msgstr "Означает, что %s будет убран из запаса"
msgid ""
"This means it is estimated that a new execution of this chore is tracked %s "
"days after the last was tracked"
"This means the next execution of this chore is scheduled %s days after the "
"last execution"
msgstr ""
"Это означает, что следующее выполнение данной работы по дому будет назначено"
" спустя %s дней после самого недавнего выполнения"
msgid "Removed %1$s of %2$s from stock"
msgstr "Убрано %1$s из %2$s из запаса"
@@ -1414,4 +1412,236 @@ msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Не все ингредиенты рецепта \"%s\" есть в запасе, ничего не изъято"
msgid "Undo task \"%s\""
msgstr "Отменить задачу \"%s\""
msgid "Due date rollover"
msgstr "Переносить срок выполнения"
msgid ""
"When enabled the chore can never be overdue, the due date will shift forward"
" each day when due"
msgstr ""
"Когда данная опция включена, срок выполнения работы по дому никогда не будет"
" проходить - срок будет сдвигаться вперёд каждый день при его окончании"
msgid "Location Content Sheet"
msgstr "Лист содержимого места хранения"
msgid "Print"
msgstr "Печать"
msgid "all locations"
msgstr "все места хранения"
msgid ""
"Here you can print a page per location with the current stock, maybe to hang"
" it there and note the consumed things on it."
msgstr ""
"Здесь вы можете напечатать список запасов для мест хранения на отдельных "
"страницах, чтобы, например, повесить его где-то и отмечать употреблённые "
"продукты на нём."
msgid "this location"
msgstr "это место хранения"
msgid "Consumend amount"
msgstr "Употреблённое количество"
msgid "Time of printing"
msgstr "Время печати"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Вы уверены, что нужно удалить оборудование \"%s\"?"
msgid "Parent product"
msgstr "Родительский продукт"
msgid ""
"Not possible because this product is already used as a parent product in "
"another product"
msgstr ""
"Невозможно, так как этот продукт уже является родительским продуктом у "
"другого продукта"
msgid "Default conversions"
msgstr "Преобразование по умолчанию"
msgid "Factor"
msgstr "Коэффициент"
msgid "1 %s is the same as..."
msgstr "1 %s - то же, что ..."
msgid "Create QU conversion"
msgstr "Создать преобразования ЕИ"
msgid "Default for QU"
msgstr "Умолчание для ЕИ"
msgid "Quantity unit from"
msgstr "Начальная единица измерения"
msgid "Quantity unit to"
msgstr "Конечная единица измерения"
msgid ""
"This cannot be lower than %1$s and must be a valid number with max. %2$s "
"decimal places"
msgstr ""
msgid "This cannot be equal to %s"
msgstr ""
msgid "This means 1 %1$s is the same as %2$s %3$s"
msgstr "Означает, что 1 %1$s - это то же, что %2$s%3$s"
msgid "QU conversions"
msgstr "Преобразование ЕИ"
msgid "Product overrides"
msgstr ""
msgid "Override for product"
msgstr ""
msgid "This equals %1$s %2$s in stock"
msgstr ""
msgid "Edit QU conversion"
msgstr ""
msgid "An assignment type is required"
msgstr ""
msgid "Assignment type"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled 1 day after the "
"last execution, but only for the weekdays selected below"
msgstr ""
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
msgid ""
"This means the next execution of this chore is scheduled on the below "
"selected day of each month"
msgstr ""
msgid ""
"This means the next execution of this chore will not be assigned to anyone"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the one who "
"executed it least"
msgstr ""
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
msgid ""
"This means the next execution of this chore will be assigned to the next one"
" in alphabetical order"
msgstr ""
msgid "Assign to"
msgstr ""
msgid "This assignment type requires that at least one is assigned"
msgstr ""
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgid "Assigned to me"
msgstr "Назначено мне"
msgid "assigned to %s"
msgstr "назначено %s"
msgid "Filter by assignment"
msgstr ""
msgid "Consume product on chore execution"
msgstr ""
msgid "Are you sure to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr ""
msgid "Create userentity"
msgstr ""
msgid "Show in sidebar menu"
msgstr ""
msgid "Edit userentity"
msgstr ""
msgid "Edit %s"
msgstr ""
msgid "Create %s"
msgstr ""
msgid "Are you sure to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr ""
msgid "For example"
msgstr ""
msgid "Configure fields"
msgstr ""
msgid "Quantity unit plural form testing"
msgstr ""
msgid "Result"
msgstr "Результат"
msgid "Test plural forms"
msgstr "Проба форм множественного числа"
msgid "Scan a barcode"
msgstr ""
msgid "Error while initializing the barcode scanning library"
msgstr ""
msgid ""
"The resulting price of this ingredient will be multiplied by this factor"
msgstr ""
msgid "Price factor"
msgstr ""
msgid "Do you find grocy useful?"
msgstr ""
msgid "Say thanks"
msgstr ""
msgid "Search for recipes containing this product"
msgstr ""
msgid "Add to shopping list"
msgstr ""
msgid "Added %1$s of %2$s to the shopping list \"%3$s\""
msgstr ""

View File

@@ -40,3 +40,9 @@ msgstr "Флажок"
msgid "preset-list"
msgstr "предопределённый-список"
msgid "preset-checklist"
msgstr "предопределённый-список-галочек"
msgid "link"
msgstr "ссылка"

View File

@@ -349,7 +349,7 @@ msgstr ""
msgid "This means %s will be removed from stock"
msgstr ""
msgid "This means it is estimated that a new execution of this chore is tracked %s days after the last was tracked"
msgid "This means the next execution of this chore is scheduled %s days after the last execution"
msgstr ""
msgid "Removed %1$s of %2$s from stock"
@@ -1286,3 +1286,233 @@ msgstr ""
msgid "Undo task \"%s\""
msgstr ""
msgid "Due date rollover"
msgstr ""
msgid "When enabled the chore can never be overdue, the due date will shift forward each day when due"
msgstr ""
msgid "Location Content Sheet"
msgstr ""
msgid "Print"
msgstr ""
msgid "all locations"
msgstr ""
msgid "Here you can print a page per location with the current stock, maybe to hang it there and note the consumed things on it."
msgstr ""
msgid "this location"
msgstr ""
msgid "Consumend amount"
msgstr ""
msgid "Time of printing"
msgstr ""
msgid "Are you sure to delete equipment \"%s\"?"
msgstr ""
msgid "Parent product"
msgstr ""
msgid "Not possible because this product is already used as a parent product in another product"
msgstr ""
msgid "Default conversions"
msgstr ""
msgid "Factor"
msgstr ""
msgid "1 %s is the same as..."
msgstr ""
msgid "Create QU conversion"
msgstr ""
msgid "Default for QU"
msgstr ""
msgid "Quantity unit from"
msgstr ""
msgid "Quantity unit to"
msgstr ""
msgid "This cannot be lower than %1$s and must be a valid number with max. %2$s decimal places"
msgstr ""
msgid "This cannot be equal to %s"
msgstr ""
msgid "This means 1 %1$s is the same as %2$s %3$s"
msgstr ""
msgid "QU conversions"
msgstr ""
msgid "Product overrides"
msgstr ""
msgid "Override for product"
msgstr ""
msgid "This equals %1$s %2$s in stock"
msgstr ""
msgid "Edit QU conversion"
msgstr ""
msgid "An assignment type is required"
msgstr ""
msgid "Assignment type"
msgstr ""
msgid "This means the next execution of this chore is scheduled 1 day after the last execution"
msgstr ""
msgid "This means the next execution of this chore is scheduled 1 day after the last execution, but only for the weekdays selected below"
msgstr ""
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
msgid "This means the next execution of this chore is scheduled on the below selected day of each month"
msgstr ""
msgid "This means the next execution of this chore will not be assigned to anyone"
msgstr ""
msgid "This means the next execution of this chore will be assigned to the one who executed it least"
msgstr ""
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
msgid "This means the next execution of this chore will be assigned to the next one in alphabetical order"
msgstr ""
msgid "Assign to"
msgstr ""
msgid "This assignment type requires that at least one is assigned"
msgstr ""
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] ""
msgstr[1] ""
msgid "Assigned to me"
msgstr ""
msgid "assigned to %s"
msgstr ""
msgid "Filter by assignment"
msgstr ""
msgid "Consume product on chore execution"
msgstr ""
msgid "Are you sure to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr ""
msgid "Create userentity"
msgstr ""
msgid "Show in sidebar menu"
msgstr ""
msgid "Edit userentity"
msgstr ""
msgid "Edit %s"
msgstr ""
msgid "Create %s"
msgstr ""
msgid "Are you sure to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr ""
msgid "For example"
msgstr ""
msgid "Configure fields"
msgstr ""
msgid "Quantity unit plural form testing"
msgstr ""
msgid "Result"
msgstr ""
msgid "Test plural forms"
msgstr ""
msgid "Scan a barcode"
msgstr ""
msgid "Error while initializing the barcode scanning library"
msgstr ""
msgid "The resulting price of this ingredient will be multiplied by this factor"
msgstr ""
msgid "Price factor"
msgstr ""
msgid "Do you find grocy useful?"
msgstr ""
msgid "Say thanks"
msgstr ""
msgid "Search for recipes containing this product"
msgstr ""
msgid "Add to shopping list"
msgstr ""
msgid "Added %1$s of %2$s to the shopping list \"%3$s\""
msgstr ""
msgid "Output"
msgstr ""
msgid "Energy (kcal)"
msgstr ""
msgid "Per stock quantity unit"
msgstr ""
msgid "Barcode scanner testing"
msgstr ""
msgid "Expected barcode"
msgstr ""
msgid "Scan field"
msgstr ""
msgid "Scanned barcodes"
msgstr ""
msgid "Hit"
msgstr ""
msgid "Miss"
msgstr ""

View File

@@ -0,0 +1,26 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv_SE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -43,3 +43,6 @@ msgstr "sv-SE"
msgid "fullcalendar_locale"
msgstr "sv"
msgid "bootstrap-select_locale"
msgstr "sv_SE"

View File

@@ -1,6 +1,7 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Mathias Fröjd <info@mcfrojd.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fredrik Hendeberg <fredrik@hendeberg.com>, 2019
#
msgid ""
msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Mathias Fröjd <info@mcfrojd.com>, 2019\n"
"Last-Translator: Fredrik Hendeberg <fredrik@hendeberg.com>, 2019\n"
"Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,33 +38,33 @@ msgstr "Kylskåp"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Bit"
msgstr[1] "Bitar"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Förpackning"
msgstr[1] "Förpackningar"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Glas"
msgstr[1] "Glas"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Burk"
msgstr[1] "Burkar"
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Burk"
msgstr[1] "Burkar"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Knippa"
msgstr[1] "Knippor"
msgid "Gummy bears"
msgstr "Gummibjörnar"
@@ -172,8 +173,8 @@ msgstr "Demo-användare"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Gram"
msgstr[1] "Gram"
msgid "Flour"
msgstr "Mjöl"
@@ -263,22 +264,48 @@ msgid "Turkish"
msgstr "Turkiska"
msgid "Spanish"
msgstr "Spansk"
msgstr "Spanska"
msgid "Russian"
msgstr "Ryska"
msgid "The thing which happens on the 5th of every month"
msgstr "Det som händer den 5: e varje månad"
msgstr "Saken som händer den 5:e varje månad"
msgid "The thing which happens daily"
msgstr "Saker som händer dagligen"
msgstr "Saken som händer dagligen"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr "Saker som händer på måndagar och onsdagar"
msgstr "Saken som händer på måndagar och onsdagar"
msgid "Swedish"
msgstr "Swedish"
msgstr "Svenska"
msgid "Polish"
msgstr "Polermedel"
msgstr "Polska"
msgid "Milk Chocolate"
msgstr ""
msgid "Dark Chocolate"
msgstr ""
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgid "Example userentity"
msgstr ""
msgid "This is an example user entity..."
msgstr ""
msgid "Custom field"
msgstr ""
msgid "Example field value..."
msgstr ""
msgid "Waffle rolls"
msgstr ""

View File

@@ -1,32 +0,0 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Language-Team: Tamil (https://www.transifex.com/grocy/teams/93189/ta/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/component_translations\n"
msgid "timeago_locale"
msgstr ""
msgid "timeago_nan"
msgstr ""
msgid "moment_locale"
msgstr ""
msgid "datatables_localization"
msgstr ""
msgid "summernote_locale"
msgstr ""
msgid "fullcalendar_locale"
msgstr ""

View File

@@ -1,280 +0,0 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Language-Team: Tamil (https://www.transifex.com/grocy/teams/93189/ta/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/demo_data\n"
msgid "Cookies"
msgstr ""
msgid "Chocolate"
msgstr ""
msgid "Pantry"
msgstr ""
msgid "Candy cupboard"
msgstr ""
msgid "Tinned food cupboard"
msgstr ""
msgid "Fridge"
msgstr ""
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] ""
msgstr[1] ""
msgid "Gummy bears"
msgstr ""
msgid "Crisps"
msgstr ""
msgid "Eggs"
msgstr ""
msgid "Noodles"
msgstr ""
msgid "Pickles"
msgstr ""
msgid "Gulash soup"
msgstr ""
msgid "Yogurt"
msgstr ""
msgid "Cheese"
msgstr ""
msgid "Cold cuts"
msgstr ""
msgid "Paprika"
msgstr ""
msgid "Cucumber"
msgstr ""
msgid "Radish"
msgstr ""
msgid "Tomato"
msgstr ""
msgid "Changed towels in the bathroom"
msgstr ""
msgid "Cleaned the kitchen floor"
msgstr ""
msgid "Warranty ends"
msgstr ""
msgid "TV remote control"
msgstr ""
msgid "Alarm clock"
msgstr ""
msgid "Heat remote control"
msgstr ""
msgid "Lawn mowed in the garden"
msgstr ""
msgid "Some good snacks"
msgstr ""
msgid "Pizza dough"
msgstr ""
msgid "Sieved tomatoes"
msgstr ""
msgid "Salami"
msgstr ""
msgid "Toast"
msgstr ""
msgid "Minced meat"
msgstr ""
msgid "Pizza"
msgstr ""
msgid "Spaghetti bolognese"
msgstr ""
msgid "Sandwiches"
msgstr ""
msgid "English"
msgstr ""
msgid "German"
msgstr ""
msgid "Italian"
msgstr ""
msgid "Demo in different language"
msgstr ""
msgid "This is the note content of the recipe ingredient"
msgstr ""
msgid "Demo User"
msgstr ""
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgid "Flour"
msgstr ""
msgid "Pancakes"
msgstr ""
msgid "Sugar"
msgstr ""
msgid "Home"
msgstr ""
msgid "Life"
msgstr ""
msgid "Projects"
msgstr ""
msgid "Repair the garage door"
msgstr ""
msgid "Fork and improve grocy"
msgstr ""
msgid "Find a solution for what to do when I forget the door keys"
msgstr ""
msgid "Sweets"
msgstr ""
msgid "Bakery products"
msgstr ""
msgid "Tinned food"
msgstr ""
msgid "Butchery products"
msgstr ""
msgid "Vegetables/Fruits"
msgstr ""
msgid "Refrigerated products"
msgstr ""
msgid "Coffee machine"
msgstr ""
msgid "Dishwasher"
msgstr ""
msgid "Liter"
msgstr ""
msgid "Liters"
msgstr ""
msgid "Bottle"
msgstr ""
msgid "Bottles"
msgstr ""
msgid "Milk"
msgstr ""
msgid "Chocolate sauce"
msgstr ""
msgid "Milliliters"
msgstr ""
msgid "Milliliter"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Topping"
msgstr ""
msgid "French"
msgstr ""
msgid "Turkish"
msgstr ""
msgid "Spanish"
msgstr ""
msgid "Russian"
msgstr ""
msgid "The thing which happens on the 5th of every month"
msgstr ""
msgid "The thing which happens daily"
msgstr ""
msgid "The thing which happens on Mondays and Wednesdays"
msgstr ""
msgid "Swedish"
msgstr ""
msgid "Polish"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -1,35 +0,0 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Language-Team: Tamil (https://www.transifex.com/grocy/teams/93189/ta/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr ""
msgid "text-multi-line"
msgstr ""
msgid "number-integral"
msgstr ""
msgid "number-decimal"
msgstr ""
msgid "date"
msgstr ""
msgid "datetime"
msgstr ""
msgid "checkbox"
msgstr ""

View File

@@ -0,0 +1,26 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Language-Team: Turkish (https://www.transifex.com/grocy/teams/93189/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgid "in-alphabetical-order"
msgstr ""

View File

@@ -44,3 +44,6 @@ msgstr "tr-TR"
msgid "fullcalendar_locale"
msgstr "tr"
msgid "bootstrap-select_locale"
msgstr "tr_TR"

Some files were not shown because too many files have changed in this diff Show More