Compare commits

...

207 Commits

Author SHA1 Message Date
Bernd Bestel
35b569c832 Pulled translations from Transifex 2019-09-28 13:27:20 +02:00
Bernd Bestel
d81fe4777c Prepared next release 2019-09-28 13:23:50 +02:00
Bernd Bestel
95208f5582 Updated unmanaged dependencies (font) 2019-09-28 08:53:59 +02:00
Bernd Bestel
dea2ffeaaf Added a "clear" button above the new notes field on the shopping list page 2019-09-28 08:48:58 +02:00
Bernd Bestel
e548caabb1 Formatting... 2019-09-27 17:32:52 +02:00
Bernd Bestel
2b0f5d8d84 Only do a product by barcode lookup if there is actually any input 2019-09-27 17:27:45 +02:00
Bernd Bestel
e9f2edea75 Optimize the initial state of the barcode scanner start button if the input element is disabled and make sure it does nothing, if the button is enabled however but the input element is disabled 2019-09-27 17:24:44 +02:00
Bernd Bestel
1b9a3c7f57 Fix that the barcode scanner start button overlaps everything 2019-09-27 17:03:50 +02:00
Bernd Bestel
2636456461 Show the journal of the product/chore/battery cards in a dialog 2019-09-27 16:54:40 +02:00
Bernd Bestel
81f6b58fe4 Added a button to jump to the journal on the product/chore/battery card 2019-09-27 14:19:06 +02:00
Bernd Bestel
9ba4585143 Reduce console.log spam 2019-09-27 14:08:24 +02:00
Bernd Bestel
4aa575e0e8 Display just "unlimited" on the product card for the average shelf life if it is > 200 years 2019-09-27 14:04:44 +02:00
Bernd Bestel
765f908966 Make it possible to provide the purchase price also as a total price (closes #390) 2019-09-27 13:50:16 +02:00
Bernd Bestel
9527305311 Userobjects list page print optimizations (closes #396) 2019-09-27 13:23:10 +02:00
Bernd Bestel
9d52f82bc2 Updated changelog for pull request #397 2019-09-27 08:35:15 +02:00
DeeeeLAN
6522aca30e Fixed navigation menu and full screen recipe smooth scrolling on iOS (#397)
* fixed barcode button on iOS and made nicer on the desktop

* fixed indentation

* fixed indentation

* fixed recipe ingredient layout issue in safari

* fixed navigation menu and full screen recipe smooth scrolling on iOS
2019-09-27 08:33:08 +02:00
Bernd Bestel
e59a35c6d1 Also refresh the parent product on sub product actions on the stock overview page (closes #394) 2019-09-27 08:30:08 +02:00
Bernd Bestel
cc2bf68f31 Fixed row highlighting after product actions on the stock overview page 2019-09-27 08:12:37 +02:00
Bernd Bestel
654d00dd67 Again corrections for #384) 2019-09-26 20:56:19 +02:00
Bernd Bestel
cf2e6f1039 Added a sub feature flag to disable chore assignments when not needed 2019-09-26 17:20:25 +02:00
Bernd Bestel
cf3217ada4 Fixed expired products count on stock overview page (fixes #392) 2019-09-26 16:42:59 +02:00
Bernd Bestel
21503c26d2 Use properly formatted numbers "everywhere" (partly references #389) 2019-09-26 15:25:30 +02:00
Bernd Bestel
7369603d78 Added missing localization string 2019-09-26 14:55:31 +02:00
Bernd Bestel
41e93d2c50 Little night mode improvements 2019-09-26 14:13:30 +02:00
Bernd Bestel
b39866bda2 Immediately refresh the QU conversion hint on key presses on the product edit page 2019-09-26 13:59:41 +02:00
Bernd Bestel
b8f9d09afc Don't remove products from stock overview on consuming all and the product has a min. stock amount & show it again on undo 2019-09-26 13:55:42 +02:00
Bernd Bestel
a2b6d9ae39 Various small UI refinements 2019-09-26 13:14:24 +02:00
Bernd Bestel
45d3c25b21 Again optimizations for #384 2019-09-26 13:13:49 +02:00
Bernd Bestel
2809cc1454 Typo... 2019-09-26 12:45:35 +02:00
Bernd Bestel
02f30d141e Reviewed/optimized last changes (references #384) 2019-09-26 12:43:00 +02:00
DeeeeLAN
c5927a10f3 fixed recipe ingredient layout issue in safari (#387)
* fixed barcode button on iOS and made nicer on the desktop

* fixed indentation

* fixed indentation

* fixed recipe ingredient layout issue in safari
2019-09-26 11:42:30 +02:00
Bernd Bestel
828ab8eba0 Allow accumulating min. stock amounts on parent product level (closes #384) 2019-09-26 10:36:49 +02:00
Bernd Bestel
75f8ecfad2 Updated the changelog and config-dist.php for #383) 2019-09-25 13:11:20 +02:00
Lewis Juggins
fd14083443 Support meal plan as default page (#383)
* Support meal plan as default page

* Update SystemController.php
2019-09-25 13:08:41 +02:00
Bernd Bestel
04808eaa66 Include the server timezone in iCal calendar export (closes #379) 2019-09-25 09:52:32 +02:00
Bernd Bestel
53f0893f55 Fix unit conversion handling (factor of destination qu is always 1) (fixes #382) 2019-09-25 09:32:06 +02:00
Bernd Bestel
2eb3d8fe47 Updated changelog for #378 / #380 2019-09-25 09:16:43 +02:00
DeeeeLAN
c0d79b1518 Fixed #378 (#380)
* fixed barcode button on iOS and made nicer on the desktop

* fixed indentation

* fixed indentation
2019-09-25 09:00:36 +02:00
Bernd Bestel
5351828e79 Reuse existing shopping list items when adding products from the stock overview page (closes #375) 2019-09-24 18:27:50 +02:00
Bernd Bestel
b0c7958891 Updated the changelog for #376 2019-09-24 15:53:48 +02:00
Marc Ole Bulling
f444d3e095 Fixed API call AddProductToShoppingList (#376)
$productId->id was undefined, therefore all items added to the shopping list with the API call had a null entry for "product_id"
2019-09-24 15:50:35 +02:00
Bernd Bestel
d8be254ff3 Link /barcodescannertesting page in settings menu 2019-09-24 10:43:10 +02:00
Bernd Bestel
49b26bd375 Return a Cache-Control header for files served via the API 2019-09-24 10:38:41 +02:00
Bernd Bestel
50e829f270 Hide the recipe interaction buttons when displayed as a fullscreen card (as the dialogs would be behind the fullscreen card) 2019-09-24 10:28:42 +02:00
Bernd Bestel
3b29110500 Never show close buttons in modal dialogs, this is not needed 2019-09-24 10:24:47 +02:00
Bernd Bestel
e727a38071 Improved the responsiveness of the "Create or assign product" dialog 2019-09-24 10:19:23 +02:00
Bernd Bestel
099ac7e75a Use exact matches for product barcode lookups (closes #366) 2019-09-24 09:52:05 +02:00
Bernd Bestel
53c56cc1cb Include meal plan recipes in the calendar (closes #368) 2019-09-24 09:40:56 +02:00
Bernd Bestel
2a9f927a13 Improved responsiveness of /mealplan and /calendar (closes #372 and closes #373) 2019-09-24 09:21:57 +02:00
Bernd Bestel
6bb9d2c51d Some little changes for pull request #369 (also references #367) 2019-09-24 08:35:30 +02:00
Bernd Bestel
ca719072c9 Merge branch 'master' of https://github.com/grocy/grocy 2019-09-24 08:14:07 +02:00
kriddles
66f61ec1ad public mealplan: add fullscreen recipe in popup (#369) 2019-09-24 08:13:42 +02:00
Bernd Bestel
cc500c50ff Fixed some types in the last changelog 2019-09-24 08:08:52 +02:00
Bernd Bestel
eef844d42e Optimized dropdown caret position a little bit 2019-09-23 20:19:53 +02:00
Bernd Bestel
e92843a9bf Added new demo strings 2019-09-23 13:21:02 +02:00
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
Bernd Bestel
001d5c5d1d Prepared next release 2019-07-06 20:43:30 +02:00
Bernd Bestel
b4d2e2a20a Added the possibility to undo a task (closes #252) 2019-07-06 20:34:01 +02:00
Bernd Bestel
914dde4609 Added a new config.php setting CALENDAR_FIRST_DAY_OF_WEEK to be able to change the first day of a week used for calendar views (closes #256) 2019-07-06 20:19:21 +02:00
Bernd Bestel
1eb1aa8b11 Added a "consume this recipe"-button to the meal plan (and also a button to consume all recipes for a whole week) (closes #283) 2019-07-06 20:02:40 +02:00
Bernd Bestel
09b23847b5 Added a new config.php setting DISABLE_AUTH to be able to disable authentication / the login screen (closes #246) 2019-07-06 18:29:18 +02:00
Bernd Bestel
8c205941c7 Added that products can now also be consumed as spoiled from the stock overview page (option in the more/context menu per line) (closes #251) 2019-07-06 18:15:53 +02:00
Bernd Bestel
b24683f954 Added the possibility to mark a shopping list item as "done" (closes #257) 2019-07-06 17:56:59 +02:00
Bernd Bestel
e4d26bb8fd Make it possible to switch shopping list items between shopping lists (closes #284) 2019-07-06 17:31:17 +02:00
Bernd Bestel
c6c10c87e4 Improved date display for dates of today and no time
Instead of the hours since midnight now just "Today" will be shown
2019-07-06 17:19:28 +02:00
Bernd Bestel
df529c3c0b Show 2999-12-31 as "Never" everywhere (closes #296) 2019-07-06 15:43:54 +02:00
Bernd Bestel
482a520062 Slightly modified new recipe stock fulfillment API endpoints (references #289) 2019-07-06 15:28:49 +02:00
Bernd Bestel
ddef58e2a9 Merge pull request #289 from Aerex/add-resolved-recipes-endpoint
Add requirement fulfillment recipes endpoint
2019-07-06 15:02:20 +02:00
Bernd Bestel
d34c7b0a87 Created the changelog for the next version 2019-07-06 14:56:56 +02:00
Bernd Bestel
b76e51ba41 Fixed nested recipes costs calculation (fixes #299) 2019-07-06 14:48:46 +02:00
Bernd Bestel
67cfd0ba5f Remove the internal meal plan recipe when removing a meal plan entry (fixes #298) 2019-07-06 13:57:49 +02:00
Bernd Bestel
3fcede0b7c Fix that "Track date only" cannot be tracked <> today (fixes #300) 2019-07-06 13:32:40 +02:00
Bernd Bestel
0c0e8c6957 Fixed the consume success message on stock overview page (fixes #302) 2019-07-06 13:13:38 +02:00
Niels Tholenaar
86f5667039 Allow possibility to choose custom homepage 2019-06-22 16:02:52 +02:00
Aerex
a01a80578c Merge branch 'master' into add-resolved-recipes-endpoint 2019-06-20 23:40:55 -05:00
grocy
7a51fb77b0 feat: Added recipes/requirements route
- feat: Added requirements route to allow clients to access the requirements fulfilments of recipes
2019-06-20 23:11:57 -05:00
Bernd Bestel
511c95070e Minor typos... 2019-06-09 09:34:21 +02:00
289 changed files with 12015 additions and 3584 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

11
app.php
View File

@@ -38,7 +38,16 @@ 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)
{
if (!defined('GROCY_USER_ID'))
{
define('GROCY_USER_ID', 1);
}
}
// Setup base application
$appContainer = new \Slim\Container([

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

@@ -2,8 +2,8 @@
- Fixed a problem that the user settings were not properly initialized for the frontend JS part when not logged only (so potentially affected only the login page)
- Fixed an issue that the shopping list did not load when a plural translation for a quantity unit was missing
- Fixed that tooltips were visible forever when consuming all products on the stock overview page
- Fixed that login did not work when "Stay logged in permanently" was set on grocy runs on a 32-bit system (thanks @matejdro)
- Fixed page reloads when "Auto reload on external changes" is enabled and there is unsaved form data (the detection did not work on forms in modal dialogs, e. g. when adding a entry to the meal plan)
- Fixed that login did not work when "Stay logged in permanently" was set and grocy runs on a 32-bit system (thanks @matejdro)
- Fixed page reloads when "Auto reload on external changes" is enabled and there is unsaved form data (the detection did not work for forms in modal dialogs, e. g. when adding a entry to the meal plan)
- Fixed (again) that the product picker did not work properly when the product name contains single quotes
- Fixed that a entered barcode on the product edit page was only saved when "adding" it to the barcodes list by pressing `TAB` (is now automatically added to the list also when just leaving the field)
- Improved that errors/messages from the API are shown properly when undoing a stock booking is not possible (stock journal page)

View File

@@ -0,0 +1,16 @@
- Fixed the messed up message/toast after consuming a product from the stock overview page
- Fixed that "Track date only" chores were always tracked today, regardless of the given date
- Fixed that the "week costs" were wrong after removing a meal plan entry
- Fixed wrong recipes costs calculation with nested recipes when the base recipe servings are > 1 (also affected the meal plan when adding such a recipe there)
- Fixed consuming recipes did not consume ingredients of the nested recipes
- Improved recipes API - added new endpoints to get stock fulfillment information (thanks @Aerex)
- Improved date display for products that never expires (instead of "2999-12-31" now just "Never" will be shown)
- Improved date display for dates of today and no time (instead of the hours since midnight now just "Today" will be shown)
- Improved shopping list handling
- Items can now be switched between lists (there is a shopping list dropdown on the item edit page)
- Items can now be marked as "done" (new check mark button per item, when clicked, the item will be displayed greyed out, when clicked again the item will be displayed normally again)
- Improved that products can now also be consumed as spoiled from the stock overview page (option in the more/context menu per line)
- Added a "consume this recipe"-button to the meal plan (and also a button to consume all recipes for a whole week)
- Added the possibility to undo a task (new button per task, only visible when task is already completed) and also a corresponding API endpoint
- Added a new `config.php` setting `DISABLE_AUTH` to be able to disable authentication / the login screen, defaults to `false`
- Added a new `config.php` setting `CALENDAR_FIRST_DAY_OF_WEEK` to be able to change the first day of a week used for calendar views (meal plan for example) in the frontend, defaults to locale default

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 barcodes 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 a 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 behavior)
- 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 behavior 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 conversion 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 a recipe by a product name)
- Fixed a problem where the meal plan did not load when a recipe, which was already added to 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 filtered 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 the sidebar an all top-navbar menus 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 translations)
- 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

@@ -0,0 +1,37 @@
### Stock improvements/fixes
- Fixed that barcode lookups now compare the whole barcode, not parts of it (e. g. when you have two products with the barcodes `$1` and `$10` and scan `$1` maybe the product of `$10` was found till now)
- Fixed that the "X products are already expired" count on the stock overview page was wrong
- Fixed that after product actions (consume/purchase/etc.) on the stock overview page the highlighting of the row was maybe wrong
- After product actions (consume/purchase/etc.) on the stock overview page on a sub product, now also the parent product (row) is refreshed
- It's now possible to accumulate min. stock amounts on parent product level (new option per product, means the sub product will never be "missing" then, only the parent product)
- On the purchase page there is now an option to select that the price is the total price (for the whole amount) - below the price field, defaults to "Unit price" (as it was until now), when set to "Total price", the entered price will be divided by the amount before posting
- "Average shelf life" on the product card now displays just "Unlimited" when the resulting value would be > 200 years (for products which never expire, as they have a best before date of 2999-12-31)
### Shopping list improvements
- When adding a product to the shopping list from the new context/more menu from the stock overview page and if the product is already on the shopping list, the amount of that entry will be updated acccordingly instead of adding a new (double) shopping list item
- Added a "clear" button above the new notes field on the shopping list page to quickly clear the notes field with one click
### Recipe improvements/fixes
- Fixed a problem regarding quantity unit conversion handling for recipe ingredients of products with no unit relations, but only a different purchase/stock quantity unit
- It's now possible to display a recipe directly from the meal plan (new "eye button") (thanks @kriddles)
- Improved the responsiveness of the meal plan and calendar page by automatically switching to a day calendar view on smaller screens (thanks for the idea @kriddles)
### Chores improvements
- There is now a new sub feature flag `FEATURE_FLAG_CHORES_ASSIGNMENTS` to disable chore assignments if you don't need them (defaults to `true`, so no changed behavior when not configured)
### Calendar improvements
- The calendar now also contains all planned recipes from the meal plan on the corresponding day
- Improved that dates in the iCal calendar export now include the server timezone
### Custom lists/fields improvements
- Optimized the custom lists page that it can be printed properly (search field etc. is hidden when printing the page)
### General & other improvements/fixes
- Fixed that the browser barcode scanner button was not clickable on iOS Safari & other small styles fixes/improvements for iOS Safari (thanks @DeeeeLAN)
- It's now also possible to set the meal plan page as the default/entry page (`config.php` setting `ENTRY_PAGE`) (thanks @lwis)
- Some UI detail-refinements
- In the header of the product-/chore-/battery-card there is now also a button to directly jump to the journal of the current product/chore/battery
### API improvements/fixes
- The API Endpoint `GET /files/{group}/{fileName}` now also returns a `Cache-Control` header (defaults fixed to 30 days) to further increase page load times
- Fixed that the API endpoint `/stock/shoppinglist/add-product` failed when a product should be added which was not already on the shopping list (thanks @Forceu)

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,13 +14,22 @@
# 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,
# leave empty to use the locale default
# 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
@@ -37,11 +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, mealplan
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
@@ -86,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
@@ -101,3 +117,15 @@ 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);
Setting('FEATURE_FLAG_CHORES_ASSIGNMENTS', 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);
}
$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

@@ -26,12 +26,20 @@ class CalendarApiController extends BaseApiController
$events = $this->CalendarService->GetEvents();
foreach($events as $event)
{
$date = new \DateTime($event['start']);
$date->setTimezone(date_default_timezone_get());
if ($event['date_format'] === 'date')
{
$date->setTime(23, 59, 59);
}
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent->setDtStart(new \DateTime($event['start']))
->setDtEnd(new \DateTime($event['start']))
$vEvent->setDtStart($date)
->setDtEnd($date)
->setSummary($event['title'])
->setNoTime($event['date_format'] === 'date')
->setUseUtc(false);
->setUseTimezone(true);
$vCalendar->addComponent($vEvent);
}

View File

@@ -21,7 +21,7 @@ class ChoresApiController extends BaseApiController
try
{
$trackedTime = date('Y-m-d H:i:s');
if (array_key_exists('tracked_time', $requestBody) && IsIsoDateTime($requestBody['tracked_time']))
if (array_key_exists('tracked_time', $requestBody) && (IsIsoDateTime($requestBody['tracked_time']) || IsIsoDate($requestBody['tracked_time'])))
{
$trackedTime = $requestBody['tracked_time'];
}
@@ -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,11 +51,37 @@ class FilesApiController extends BaseApiController
throw new \Exception('Invalid filename');
}
$filePath = $this->FilesService->GetFilePath($args['group'], $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))
{
$response->write(file_get_contents($filePath));
$response = $response->withHeader('Cache-Control', 'max-age=2592000');
$response = $response->withHeader('Content-Type', mime_content_type($filePath));
return $response->withHeader('Content-Disposition', 'inline; filename="' . $fileName . '"');
}

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

@@ -1,43 +1,68 @@
<?php
namespace Grocy\Controllers;
use \Grocy\Services\RecipesService;
class RecipesApiController extends BaseApiController
{
public function __construct(\Slim\Container $container)
{
parent::__construct($container);
$this->RecipesService = new RecipesService();
}
protected $RecipesService;
public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$requestBody = $request->getParsedBody();
$excludedProductIds = null;
if ($requestBody !== null && array_key_exists('excludedProductIds', $requestBody))
{
$excludedProductIds = $requestBody['excludedProductIds'];
}
$this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId'], $excludedProductIds);
return $this->EmptyApiResponse($response);
}
public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$this->RecipesService->ConsumeRecipe($args['recipeId']);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
}
<?php
namespace Grocy\Controllers;
use \Grocy\Services\RecipesService;
class RecipesApiController extends BaseApiController
{
public function __construct(\Slim\Container $container)
{
parent::__construct($container);
$this->RecipesService = new RecipesService();
}
protected $RecipesService;
public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
$requestBody = $request->getParsedBody();
$excludedProductIds = null;
if ($requestBody !== null && array_key_exists('excludedProductIds', $requestBody))
{
$excludedProductIds = $requestBody['excludedProductIds'];
}
$this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId'], $excludedProductIds);
return $this->EmptyApiResponse($response);
}
public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$this->RecipesService->ConsumeRecipe($args['recipeId']);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function GetRecipeFulfillment(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
if(!isset($args['recipeId']))
{
return $this->ApiResponse($this->RecipesService->GetRecipesResolved());
}
$recipeResolved = FindObjectInArrayByPropertyValue($this->RecipesService->GetRecipesResolved(), 'recipe_id', $args['recipeId']);
if(!$recipeResolved)
{
throw new \Exception('Recipe does not exist');
}
else
{
return $this->ApiResponse($recipeResolved);
}
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
}

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,84 @@ class StockApiController extends BaseApiController
}
}
public function AddProductToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$requestBody = $request->getParsedBody();
$listId = 1;
$amount = 1;
$productId = null;
$note = 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 (array_key_exists('note', $requestBody) && !empty($requestBody['note']))
{
$note = $requestBody['note'];
}
if ($productId == null)
{
throw new \Exception("No product id was supplied");
}
$this->StockService->AddProductToShoppingList($productId, $amount, $note, $listId);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function RemoveProductFromShoppingList(\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 +453,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

@@ -28,7 +28,7 @@ class StockController extends BaseController
'products' => $this->Database->products()->orderBy('name'),
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
'locations' => $this->Database->locations()->orderBy('name'),
'currentStock' => $this->StockService->GetCurrentStock(),
'currentStock' => $this->StockService->GetCurrentStock(true),
'currentStockLocations' => $this->StockService->GetCurrentStockLocations(),
'missingProducts' => $this->StockService->GetMissingProducts(),
'nextXDays' => $nextXDays,
@@ -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()
]);
}
}
@@ -222,6 +235,7 @@ class StockController extends BaseController
{
return $this->AppContainer->view->render($response, 'shoppinglistitemform', [
'products' => $this->Database->products()->orderBy('name'),
'shoppingLists' => $this->Database->shopping_lists()->orderBy('name'),
'mode' => 'create'
]);
}
@@ -230,6 +244,7 @@ class StockController extends BaseController
return $this->AppContainer->view->render($response, 'shoppinglistitemform', [
'listItem' => $this->Database->shopping_list($args['itemId']),
'products' => $this->Database->products()->orderBy('name'),
'shoppingLists' => $this->Database->shopping_lists()->orderBy('name'),
'mode' => 'edit'
]);
}
@@ -260,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,69 @@ 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';
}
// Meal Plan
if ($entryPage === 'mealplan' && constant('GROCY_FEATURE_FLAG_RECIPES')) {
return '/mealplan';
}
return '/about';
}
public function About(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
return $this->AppContainer->view->render($response, 'about', [
@@ -39,23 +102,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

@@ -39,4 +39,17 @@ class TasksApiController extends BaseApiController
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function UndoTask(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
{
try
{
$this->TasksService->UndoTask($args['taskId']);
return $this->EmptyApiResponse($response);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
}

File diff suppressed because it is too large Load Diff

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')
@@ -140,7 +150,18 @@ function Setting(string $name, $value)
}
elseif (getenv('GROCY_' . $name) !== false) // An environment variable with the same name and prefix GROCY_ overwrites the given setting
{
define('GROCY_' . $name, getenv('GROCY_' . $name));
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
{
@@ -163,7 +184,7 @@ function DefaultUserSetting(string $name, $value)
function GetUserDisplayName($user)
{
$displayName = '';
if (empty($user->first_name) && !empty($user->last_name))
{
$displayName = $user->last_name;
@@ -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

@@ -160,9 +160,6 @@ msgstr "Deutsch"
msgid "Italian"
msgstr "Italienisch"
msgid "Demo in different language"
msgstr "Demo in anderer Sprache"
msgid "This is the note content of the recipe ingredient"
msgstr "Dies ist der Inhalt der Notiz der Zutat"
@@ -281,3 +278,53 @@ 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"
msgid "Norwegian"
msgstr "Norwegisch"
msgid "Demo"
msgstr "Demo"
msgid "Stable version"
msgstr "Stabile Version"
msgid "Preview version"
msgstr "Vorschauversion"
msgid "current release"
msgstr "aktuelles Release"
msgid "not yet released"
msgstr "noch nicht freigegeben"

View File

@@ -129,7 +129,7 @@ msgid "Last purchased"
msgstr "Zuletzt gekauft"
msgid "Last used"
msgstr "Zuletzt benutzt"
msgstr "Zuletzt verbraucht"
msgid "Spoiled"
msgstr "Verdorben"
@@ -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"
@@ -670,7 +670,7 @@ msgstr ""
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr ""
"Alle Zutaten, die vom Rezept \"%s\" benötigt werden, wurdem aus dem Bestand "
"Alle Zutaten, die vom Rezept \"%s\" benötigt werden, wurden aus dem Bestand "
"entfernt"
msgid "Consume all ingredients needed by this recipe"
@@ -847,16 +847,16 @@ msgid "Instruction manual"
msgstr "Bedienungsanleitung"
msgid "The selected equipment has no instruction manual"
msgstr "Das ausgewählte Gerät hat keine Bedienungsanleitung"
msgstr "Die ausgewählte Ausstattung hat keine Bedienungsanleitung"
msgid "Notes"
msgstr "Notizen"
msgid "Edit equipment"
msgstr "Geräte bearbeiten"
msgstr "Ausstattung bearbeiten"
msgid "Create equipment"
msgstr "Geräte erstellen"
msgstr "Ausstattung erstellen"
msgid ""
"If you don't select a file, the current instruction manual will not be "
@@ -871,7 +871,8 @@ msgstr "Keine Bedienungsanleitung vorhanden"
msgid ""
"The current instruction manual will be deleted when you save the equipment"
msgstr ""
"Die aktuelle Bedienungsanleitung wird beim Speichern des Geräts gelöscht"
"Die aktuelle Bedienungsanleitung wird beim Speichern der Ausstattung "
"gelöscht"
msgid "No picture available"
msgstr "Kein Bild vorhanden"
@@ -1374,3 +1375,332 @@ msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr ""
"Die Buchung hat nachfolgende abhängige Buchungen, rückgängig machen nicht "
"möglich"
msgid "per serving"
msgstr "pro Portion"
msgid "Never"
msgstr "Nie"
msgid "Today"
msgstr "Heute"
msgid "Consume %1$s of %2$s as spoiled"
msgstr "Verbrauche %1$s %2$s als verdorben"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nicht alle Zutaten, die vom Rezept \"%s\" benötigt werden, sind vorrätig, es"
" wurde nichts aus dem Bestand entfernt"
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"
msgid "Display recipe"
msgstr "Rezept anzeigen"
msgid "Accumulate sub products min. stock amount"
msgstr "Mindestbestände von untergeordneten Produkten aufsummieren"
msgid ""
"If enabled, the min. stock amount of sub products will be accumulated into "
"this product, means the sub product will never be \"missing\", only this "
"product"
msgstr ""
"Wenn aktiviert, werden die Mindestbestände von untergeordneten Produkten "
"aufsummiert, heißt das untergeordnete Produkt wird nie \"fehlen\", nur "
"dieses"
msgid "Are you sure to remove this conversion?"
msgstr "Diese Umrechnung wirklich löschen?"
msgid "Unit price"
msgstr "Einzelpreis"
msgid "Total price"
msgstr "Gesamtpreis"
msgid "in %s and based on the purchase quantity unit"
msgstr "In %s und bezogen auf die Einkaufsmengeneinheit"
msgid "Unlimited"
msgstr "Unbegrenzt"
msgid "Clear"
msgstr "Löschen"

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

@@ -156,9 +156,6 @@ msgstr ""
msgid "Italian"
msgstr ""
msgid "Demo in different language"
msgstr ""
msgid "This is the note content of the recipe ingredient"
msgstr ""
@@ -277,3 +274,54 @@ 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 ""
msgid "Norwegian"
msgstr ""
msgid "Demo"
msgstr ""
msgid "Stable version"
msgstr ""
msgid "Preview version"
msgstr ""
msgid "current release"
msgstr ""
msgid "not yet released"
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

@@ -157,9 +157,6 @@ msgstr ""
msgid "Italian"
msgstr ""
msgid "Demo in different language"
msgstr ""
msgid "This is the note content of the recipe ingredient"
msgstr ""
@@ -278,3 +275,53 @@ 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 ""
msgid "Norwegian"
msgstr ""
msgid "Demo"
msgstr ""
msgid "Stable version"
msgstr ""
msgid "Preview version"
msgstr ""
msgid "current release"
msgstr ""
msgid "not yet released"
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"
@@ -1308,3 +1308,301 @@ msgstr ""
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr ""
msgid "per serving"
msgstr ""
msgid "Never"
msgstr ""
msgid "Today"
msgstr ""
msgid "Consume %1$s of %2$s as spoiled"
msgstr ""
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
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 ""
msgid "Display recipe"
msgstr ""
msgid "Accumulate sub products min. stock amount"
msgstr ""
msgid ""
"If enabled, the min. stock amount of sub products will be accumulated into "
"this product, means the sub product will never be \"missing\", only this "
"product"
msgstr ""
msgid "Are you sure to remove this conversion?"
msgstr ""
msgid "Unit price"
msgstr ""
msgid "Total price"
msgstr ""
msgid "in %s and based on the purchase quantity unit"
msgstr ""
msgid "Unlimited"
msgstr ""
msgid "Clear"
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,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Ankue <ankue.spam@gmail.com>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
#
msgid ""
@@ -37,33 +38,33 @@ msgstr "Nevera"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Pieza"
msgstr[1] "Piezas"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Paquetes"
msgstr[1] "Paquetes"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Vaso"
msgstr[1] "Vasos"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Envases"
msgstr[1] "Envases"
msgid "Can"
msgid_plural "Cans"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Lata"
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"
@@ -172,8 +173,8 @@ msgstr "Usuario de demostración"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Gramo"
msgstr[1] "Gramos"
msgid "Flour"
msgstr "Harina"
@@ -281,4 +282,36 @@ msgid "Swedish"
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

@@ -5,6 +5,7 @@
# Cedric Octave <transifex@octvcdrc.fr>, 2019
# Hydreliox Hydreliox <hydreliox@gmail.com>, 2019
# Matthieu K, 2019
# Mathieu Fortin <mathieugfortin@gmail.com>, 2019
#
msgid ""
msgstr ""
@@ -12,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: Matthieu K, 2019\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"
@@ -1369,4 +1370,22 @@ msgid "Marked task %s as completed on %s"
msgstr ""
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr "La réservation a des dépendances, impossible de revenir en arrière"
msgid "per serving"
msgstr ""
msgid "Never"
msgstr ""
msgid "Today"
msgstr ""
msgid "Consume %1$s of %2$s as spoiled"
msgstr ""
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
msgid "Undo task \"%s\""
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

@@ -1,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Matteo Piotto <matteo.piotto@welaika.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: Matteo Piotto <matteo.piotto@welaika.com>, 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"
@@ -23,10 +24,10 @@ msgid "dynamic-regular"
msgstr "Regolatore dinamico"
msgid "daily"
msgstr ""
msgstr "Giornalmente"
msgid "weekly"
msgstr ""
msgstr "Settimanalmente"
msgid "monthly"
msgstr ""
msgstr "Mensilmente"

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"
@@ -161,9 +162,6 @@ msgstr "Tedesco"
msgid "Italian"
msgstr "Italiano"
msgid "Demo in different language"
msgstr "Demo in lingue diverse"
msgid "This is the note content of the recipe ingredient"
msgstr "Questo è il contenuto della nota dell'ingrediente della ricetta"
@@ -172,14 +170,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 +195,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 +211,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 +259,75 @@ 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"
msgid "Norwegian"
msgstr "Norvegese"
msgid "Demo"
msgstr "Dimostrazione"
msgid "Stable version"
msgstr "Versione stabile"
msgid "Preview version"
msgstr "Versione di anteprima"
msgid "current release"
msgstr "versione attuale"
msgid "not yet released"
msgstr "non ancora pubblicata"

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,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: 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/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

@@ -27,9 +27,24 @@ msgstr "nl"
msgid "datatables_localization"
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

@@ -0,0 +1,29 @@
# Translators:
# Marius Borø <blizzwave@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: 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"
"Content-Transfer-Encoding: 8bit\n"
"Language: no\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 gjorde minst først"
msgid "random"
msgstr "Tilfeldig"
msgid "in-alphabetical-order"
msgstr "I alfabetisk rekkefølge"

View File

@@ -1,5 +1,6 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Marius Borø <blizzwave@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: 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,7 +18,7 @@ msgstr ""
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "Manuel"
msgstr "Manuell"
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

@@ -161,9 +161,6 @@ msgstr "Tysk"
msgid "Italian"
msgstr "Italiensk"
msgid "Demo in different language"
msgstr "Demo i annet språk"
msgid "This is the note content of the recipe ingredient"
msgstr "Dette er notisen for ingrediensen i oppskriften"
@@ -282,3 +279,53 @@ msgstr "Svensk"
msgid "Polish"
msgstr "Polsk"
msgid "Milk Chocolate"
msgstr "Melkesjokolade"
msgid "Dark Chocolate"
msgstr "Mørk sjokolade"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Skrive"
msgstr[1] "Skriver"
msgid "Example userentity"
msgstr "Example userentity"
msgid "This is an example user entity..."
msgstr "This is an example user entity..."
msgid "Custom field"
msgstr "Custom field"
msgid "Example field value..."
msgstr "Example field value..."
msgid "Waffle rolls"
msgstr "Vaffelrull"
msgid "Danish"
msgstr "Dansk"
msgid "Dutch"
msgstr "Nederlandsk"
msgid "Norwegian"
msgstr "Norsk"
msgid "Demo"
msgstr "Demo"
msgid "Stable version"
msgstr "Stabil versjon"
msgid "Preview version"
msgstr "Under utvikling versjon"
msgid "current release"
msgstr "Nåværende versjon"
msgid "not yet released"
msgstr "enda ikke gitt ut"

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"

File diff suppressed because it is too large Load Diff

View File

@@ -39,3 +39,9 @@ msgstr "checkbox"
msgid "preset-list"
msgstr "preset-list"
msgid "preset-checklist"
msgstr "preset-checklist"
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: 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

@@ -1387,3 +1387,27 @@ msgstr "Dni \"blisko terminu wykonania zadania\""
msgid "Products"
msgstr "Produkty"
msgid "Marked task %s as completed on %s"
msgstr "Oznaczono zadanie %s jako wykonane dnia %s "
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr "Rezerwacja ma kolejne zależne rezerwacje, nie można jej cofnąć"
msgid "per serving"
msgstr ""
msgid "Never"
msgstr ""
msgid "Today"
msgstr ""
msgid "Consume %1$s of %2$s as spoiled"
msgstr ""
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
msgid "Undo task \"%s\""
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

@@ -1,5 +1,6 @@
# Translators:
# Pavel Pletenev <cpp.create@gmail.com>, 2019
# cool guy <eut53770@bcaoo.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: Pavel Pletenev <cpp.create@gmail.com>, 2019\n"
"Last-Translator: cool guy <eut53770@bcaoo.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"
@@ -89,7 +90,7 @@ msgid "Noodles"
msgstr "Макароны"
msgid "Pickles"
msgstr "Огурцы"
msgstr "Соленья"
msgid "Gulash soup"
msgstr "Суп-гуляш"
@@ -116,16 +117,16 @@ msgid "Tomato"
msgstr "Помидор"
msgid "Changed towels in the bathroom"
msgstr "Сменены полотенца в ванной"
msgstr "Полотенца в ванной поменяны"
msgid "Cleaned the kitchen floor"
msgstr "Очищен пол на кухне"
msgstr "Пол на кухне чист"
msgid "Warranty ends"
msgstr "Гарантия заканчивается"
msgid "TV remote control"
msgstr "Пульт ДУ"
msgstr "Пульт для телевизора"
msgid "Alarm clock"
msgstr "Часы с будильником"
@@ -134,10 +135,10 @@ msgid "Heat remote control"
msgstr "Пульт ДУ для печки"
msgid "Lawn mowed in the garden"
msgstr "Пострижен газон в саду"
msgstr "Газон в саду пострижен"
msgid "Some good snacks"
msgstr "Немного хорошего перекуса"
msgstr "Вкусные закуски"
msgid "Pizza dough"
msgstr "Тесто для пиццы"
@@ -161,7 +162,7 @@ msgid "Spaghetti bolognese"
msgstr "Спагетти болоньезе"
msgid "Sandwiches"
msgstr "Сендвичи"
msgstr "Сэндвичи"
msgid "English"
msgstr "Английски"
@@ -172,9 +173,6 @@ msgstr "Немецкий"
msgid "Italian"
msgstr "Итальянский"
msgid "Demo in different language"
msgstr "Демо на другом языке"
msgid "This is the note content of the recipe ingredient"
msgstr "Это тело заметки по игредиенту рецепта"
@@ -204,19 +202,19 @@ msgid "Life"
msgstr "Жизнь"
msgid "Projects"
msgstr "Проект"
msgstr "Проекты"
msgid "Repair the garage door"
msgstr "Починить дверь гаража"
msgid "Fork and improve grocy"
msgstr "Отфоркнуть и улучшить grocy"
msgstr "Форкнуть и сделать grocy лучше"
msgid "Find a solution for what to do when I forget the door keys"
msgstr "Найти решение, что делать, когда я забываю ключи от двери"
msgstr "Придумать что делать, когда я забываю ключи от двери"
msgid "Sweets"
msgstr "Конфеты"
msgstr "Сладости"
msgid "Bakery products"
msgstr "Хлебобулочные изделия"
@@ -228,7 +226,7 @@ msgid "Butchery products"
msgstr "Мясные изделия"
msgid "Vegetables/Fruits"
msgstr "Фрукт/овощи"
msgstr "Фрукты/овощи"
msgid "Refrigerated products"
msgstr "Замороженные продукты"
@@ -258,10 +256,10 @@ msgid "Chocolate sauce"
msgstr "Шоколадный соус"
msgid "Milliliters"
msgstr "Милилитры"
msgstr "Миллилитры"
msgid "Milliliter"
msgstr "Милилитр"
msgstr "Миллилитр"
msgid "Bottom"
msgstr "Низ"
@@ -282,16 +280,68 @@ msgid "Russian"
msgstr "Русский"
msgid "The thing which happens on the 5th of every month"
msgstr "Штука, которая происходит каждое 5 число каждого месяца"
msgstr "Что-то, что происходит 5 числа каждого месяца"
msgid "The thing which happens daily"
msgstr "Штука, происходящая едедневно"
msgstr "Что-то, что происходит каждый день"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr "Штука, которая происходит по понедельникам и средам"
msgstr "Что-то, что происходит по понедельникам и средам"
msgid "Swedish"
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 "Голландский"
msgid "Norwegian"
msgstr "Норвежский"
msgid "Demo"
msgstr "Демо"
msgid "Stable version"
msgstr "Стабильная версия"
msgid "Preview version"
msgstr "Версия предпросмотра"
msgid "current release"
msgstr "текущий релиз"
msgid "not yet released"
msgstr "Пока не выпущено"

View File

@@ -1,6 +1,7 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Pavel Pletenev <cpp.create@gmail.com>, 2019
# cool guy <eut53770@bcaoo.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: Pavel Pletenev <cpp.create@gmail.com>, 2019\n"
"Last-Translator: cool guy <eut53770@bcaoo.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"
@@ -89,10 +90,10 @@ msgid "Chore tracking"
msgstr "Выполнить работу по дому"
msgid "Battery tracking"
msgstr "Отслеживание батарей"
msgstr "Отслеживание аккумуляторов"
msgid "Locations"
msgstr "Места хранения"
msgstr "Места"
msgid "Quantity units"
msgstr "Единицы измерения"
@@ -157,7 +158,7 @@ msgid "New amount"
msgstr "Новое количество"
msgid "Note"
msgstr "Заметки"
msgstr "Заметка"
msgid "Tracked time"
msgstr "Время выполнения"
@@ -338,7 +339,7 @@ msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Вы уверены, что нужно удалить единицу измерения \"%s\"?"
msgid "Are you sure to delete product \"%s\"?"
msgstr "Вы уверены, что нужно удалить продукт \"%s\"?"
msgstr "Вы уверены, что хотите удалить продукт %s?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Вы уверены, что нужно удалить место хранения \"%s\"?"
@@ -374,11 +375,11 @@ 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 дней после самого недавнего выполнения"
"Это означает, что следующее выполнение этой работы будет назначено через %s "
"дней от последнего выполнения"
msgid "Removed %1$s of %2$s from stock"
msgstr "Убрано %1$s из %2$s из запаса"
@@ -423,7 +424,7 @@ msgid "Search"
msgstr "Поиск"
msgid "Not logged in"
msgstr "Нет входа в систему"
msgstr "Вы не авторизованы"
msgid "You have to select a product"
msgstr "Вам нужно выбрать продукт"
@@ -611,7 +612,7 @@ msgid "Charge cycle interval (days)"
msgstr "Цикл работы от 1 заряда (дней)"
msgid "Last price"
msgstr "Последняя цена покупки"
msgstr "Последняя цена"
msgid "Price history"
msgstr "История цен"
@@ -700,7 +701,7 @@ msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr "Все ингредиенты рецепта \"%s\" убраны из запаса"
msgid "Consume all ingredients needed by this recipe"
msgstr "Употребить все ингредиенты, необходимые данному рецепту"
msgstr "Употребить все ингредиенты из этого рецепта"
msgid "Click to show technical details"
msgstr "Нажмите, чтобы посмотреть технические детали"
@@ -715,7 +716,7 @@ msgid "Tasks"
msgstr "Задачи"
msgid "Show done tasks"
msgstr "Показать законченные задачи"
msgstr "Показать завершённые задачи"
msgid "Task"
msgstr "Задача"
@@ -1005,7 +1006,7 @@ msgstr ""
"сегодня + это количество дней (значение 0 отключает этот функционал)"
msgid "Default best before days after opened"
msgstr "Срок годности по умолчанию после открытия в днях"
msgstr "Срок годности в днях по умолчанию после открытия"
msgid "Marked %1$s of %2$s as opened"
msgstr "%2$s %1$s помечено открытым"
@@ -1391,3 +1392,333 @@ msgstr "Критерий для \"подходит срок задач\" в дн
msgid "Products"
msgstr "Продукты"
msgid "Marked task %s as completed on %s"
msgstr "Пометить задачу \"%s\" как выполненную %s"
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr "У данного действия есть зависимые действия, отмена невозможна"
msgid "per serving"
msgstr "на порцию"
msgid "Never"
msgstr "Никогда"
msgid "Today"
msgstr "Сегодня"
msgid "Consume %1$s of %2$s as spoiled"
msgstr "Употребить %1$s %2$s как испорченное"
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 ""
"Не может быть ниже %1$s и должно быть числом с максимально %2$sзнаками после"
" запятой"
msgid "This cannot be equal to %s"
msgstr "Не может быть равно %s"
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 "Равно %1$s%2$s в запасе"
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] "%s работа назначена мне"
msgstr[1] "%s работы назначены мне"
msgstr[2] "%sработ назначены мне"
msgstr[3] "%s работ назначены мне"
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 "Вы уверены, что нужно удалить пользовательское поле \"%s\"?"
msgid "Userentities"
msgstr "Пользовательские сущности"
msgid "Create userentity"
msgstr "Создать пользовательскую сущность"
msgid "Show in sidebar menu"
msgstr "Показывать в меню слева"
msgid "Edit userentity"
msgstr "Изменить пользовательскую сущность"
msgid "Edit %s"
msgstr "Изменить %s"
msgid "Create %s"
msgstr "Создать %s"
msgid "Are you sure to delete this userobject?"
msgstr "Вы уверены, что нужно удалить эту пользовательский объект?"
msgid "Icon CSS class"
msgstr "CSS класс иконок"
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 "Вы находите grocy полезным?"
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 "Добавлено %1$s из %2$s в список покупок \"%3$s\""
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 "Неправильно"
msgid "Display recipe"
msgstr "Отобразить рецепт"
msgid "Accumulate sub products min. stock amount"
msgstr "Собирать мин. заданные количества подпродуктов"
msgid ""
"If enabled, the min. stock amount of sub products will be accumulated into "
"this product, means the sub product will never be \"missing\", only this "
"product"
msgstr ""
"Если включено, то мин. заданные кол-ва подпродуктов будут соединятся и "
"отслеживаться в этом продукте. Это означает, что подпродукты никогда не "
"будут \"отсутсвующими\", только этот продукт будет"
msgid "Are you sure to remove this conversion?"
msgstr "Вы уверены, что нужно удалить это преобразование?"
msgid "Unit price"
msgstr ""
msgid "Total price"
msgstr ""
msgid "in %s and based on the purchase quantity unit"
msgstr ""
msgid "Unlimited"
msgstr ""
msgid "Clear"
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"
@@ -1268,3 +1268,278 @@ msgstr ""
msgid "Booking has subsequent dependent bookings, undo not possible"
msgstr ""
msgid "per serving"
msgstr ""
msgid "Never"
msgstr ""
msgid "Today"
msgstr ""
msgid "Consume %1$s of %2$s as spoiled"
msgstr ""
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
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 ""
msgid "Display recipe"
msgstr ""
msgid "Accumulate sub products min. stock amount"
msgstr ""
msgid "If enabled, the min. stock amount of sub products will be accumulated into this product, means the sub product will never be \"missing\", only this product"
msgstr ""
msgid "Are you sure to remove this conversion?"
msgstr ""
msgid "Unit price"
msgstr ""
msgid "Total price"
msgstr ""
msgid "in %s and based on the purchase quantity unit"
msgstr ""
msgid "Unlimited"
msgstr ""
msgid "Clear"
msgstr ""

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: 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: ta\n"
"Language: sv_SE\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 ""

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