Compare commits

...

274 Commits

Author SHA1 Message Date
Bernd Bestel
4c5fbffd25 Optimized date input shorthand handling (fixes #2806) 2025-09-14 13:48:01 +02:00
Bernd Bestel
8509645985 Optimized datetimepicker next input focus handling (fixes #2807) 2025-09-14 10:32:26 +02:00
Bernd Bestel
7de98db143 Added changelog for #2794 2025-08-15 16:59:23 +02:00
DeepCoreSystem
31185beac5 Enhance product card chart colors for better visibility (#2794)
* Enhance product card chart colors for better visibility

* Code style

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-08-15 16:55:50 +02:00
Bernd Bestel
c8ee47f935 Don't use double quoted string literals (in triggers / RAISE) 2025-08-03 23:22:38 +02:00
Bernd Bestel
4148f8e88e Don't use double quoted string literals (in triggers / RAISE) 2025-08-03 23:21:01 +02:00
Bernd Bestel
ba2cb6ce08 Don't use double quoted string literals (in triggers / RAISE) 2025-08-03 23:14:33 +02:00
Bernd Bestel
6b18b0a7be Allow German Umlauts in OOF plugin product names (fixes #2740) 2025-06-07 18:00:38 +02:00
Bernd Bestel
ad0447497c Pulled translations from Transifex 2025-06-07 17:33:46 +02:00
Bernd Bestel
3e4f200475 Updated dependencies 2025-06-07 17:27:22 +02:00
Bernd Bestel
8560becb83 Optimized product picker barcode clear handling (fixes #2745) 2025-05-26 20:20:40 +02:00
Bernd Bestel
d6f3595684 Fixed shoppinglistitemtostock flow purchase dialog close handling (fixes #2739) 2025-05-25 21:44:12 +02:00
Bernd Bestel
8de5700310 Allow 0 for shopping list item amounts (references #2712) 2025-04-02 20:50:40 +02:00
Bernd Bestel
21aa5eab21 Prepared next release 2025-03-28 19:54:16 +01:00
Bernd Bestel
b5c9cbccf5 Updated dependencies 2025-03-28 19:47:24 +01:00
Bernd Bestel
de7ad6b115 Pulled translations from Transifex 2025-03-28 19:38:48 +01:00
Bernd Bestel
a3f66b664b Change the default Grocycode type to DataMatrix 2025-03-21 17:49:31 +01:00
Bernd Bestel
4364f07899 Added changelog for #2706 / #2705 2025-03-21 17:47:39 +01:00
Bernd Bestel
d26f24a28b Updated dependencies 2025-03-21 17:42:58 +01:00
Fándly Gergő
e786433273 Replaced barcode scanning library with ZXing (#2706)
* Replaced barcode scanning library with ZXing

* Applied code formatting rules

* Delete now obsolete user settings

* Review

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-03-21 17:41:39 +01:00
Bernd Bestel
03ab765ccd Added changelog for #2704 / #2318 2025-03-21 16:41:34 +01:00
Bernd Bestel
b2ba1de9e3 Use JSON label printer webhooks by default 2025-03-21 16:40:56 +01:00
Fándly Gergő
89b8a9c1a9 Added option to include details in the webhook sent to label printers (#2704)
* Added option to include details in the webhook sent to label printers

* Removed LABEL_PRINTER_INCLUDE_DETAILS flag

* Make this actually work

* Care about all places where webhooks are used / don't forget recipes

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-03-21 16:34:33 +01:00
Bernd Bestel
541318e964 Include non-latin font variants / clean up font-weight (closes #2699) 2025-03-12 17:48:06 +01:00
Bernd Bestel
d1a8900f98 Also show the product's default store on /stockoverview (closes #2698) 2025-03-10 17:36:23 +01:00
Bertrand SIFRE
6ca87a9a49 fix(openapi): volatile is not an array, it's an object (#2694) 2025-03-10 17:22:56 +01:00
Bernd Bestel
2a3e23ded4 Handle image URLs with query parameters returned from an external barcode lookup plugin 2025-03-04 20:40:48 +01:00
Bernd Bestel
46253c455f Optimize product name special characters handling in OFF external barcode lookup plugin 2025-03-04 20:38:10 +01:00
Bernd Bestel
63dcfcde47 Prepared next release 2025-02-28 17:12:16 +01:00
Bernd Bestel
54cd5a004d Updated README / changelog 2025-02-28 16:14:26 +01:00
Bernd Bestel
c11bbba214 Updated changelog 2025-02-27 21:23:56 +01:00
Bernd Bestel
fdddc9295d Updated dependencies 2025-02-27 18:01:56 +01:00
Bernd Bestel
1d6e545710 Pulled translations from Transifex 2025-02-27 18:01:40 +01:00
Bernd Bestel
57438409c4 Reduce package size 2025-02-27 18:01:18 +01:00
Bernd Bestel
72453eac0a Transpose product column index when searching in it (fixes #2688) 2025-02-27 17:07:30 +01:00
Bernd Bestel
27b79841fc Scale up values on the shopping list when shopping_list_round_up is enabled (closes #2687) 2025-02-25 18:43:42 +01:00
Bernd Bestel
2b994fd2ee Handle window.top in embedded iframe situations (fixes #2686) 2025-02-24 19:52:43 +01:00
Bernd Bestel
ce5be6645e Optimized /locationcontentsheet only-in-stock checkbox page reload persistence (in Chrome) (references #2669) 2025-02-06 20:27:35 +01:00
Bernd Bestel
b7c4011e80 Fixed link userfield saving (fixes #2670) 2025-02-06 20:09:19 +01:00
Bernd Bestel
ebcc9a422e Use OFF localized product names if available (closes #2666) 2025-02-03 18:55:33 +01:00
Bernd Bestel
6a7436dbf0 Persist shopping list print settings (closes #2667) 2025-02-03 18:36:10 +01:00
Bernd Bestel
bf353d9622 API: Expose permission_hierarchy read only via generic entity interactions (closes #2662) 2025-02-01 09:34:16 +01:00
Pierre Penninckx
2690e535e3 Make labels on login form point to correct inputs (#2661)
Co-authored-by: ibizaman <ibizapeanut@gmail.com>
2025-02-01 09:31:54 +01:00
Bernd Bestel
98769aea11 grocy/grocy-docker has been retired 2025-01-31 18:18:40 +01:00
Bernd Bestel
9c60fdec5a Prepared next release 2025-01-31 16:42:05 +01:00
Bernd Bestel
d37c98e5f0 Pulled translations from Transifex 2025-01-31 16:38:59 +01:00
Bernd Bestel
a1dea994c9 Updated dependencies 2025-01-31 16:36:02 +01:00
Bernd Bestel
11fdf5929a Apply table filters on /tasks load (fixes #2660) 2025-01-31 16:33:55 +01:00
Bernd Bestel
56d8c2f13a Changed shopping_list_defaults default amount 2025-01-31 15:56:15 +01:00
Bernd Bestel
aa88046ca4 Added database version to system info 2025-01-31 15:44:57 +01:00
Bernd Bestel
a35db9f1d3 Optimized form input field navigation delay 2025-01-31 15:35:34 +01:00
Bernd Bestel
c8ac094bf4 Prevent non-number amounts for shopping list items on database level (closes #2657) 2025-01-30 19:42:56 +01:00
Bernd Bestel
a177e2a185 Fixed preset-checklist userfield saving (fixes #2655) 2025-01-29 23:27:17 +01:00
Bernd Bestel
1f5263ef22 Escape DataTable regex searches (fixes #2654) 2025-01-27 17:25:25 +01:00
Bernd Bestel
d747a6c86a Fixed OFF barcode lookup plugin API URL (fixes #2653) 2025-01-27 09:12:14 +01:00
Bernd Bestel
e3d0ddbce6 Prepared next release 2025-01-24 17:30:04 +01:00
Bernd Bestel
ab09ce219c Removed unnecessary localization strings 2025-01-24 17:20:46 +01:00
Bernd Bestel
646263ab2a Pulled translations from Transifex 2025-01-24 17:20:05 +01:00
Bernd Bestel
cccf1d430f Pulled translations from Transifex 2025-01-24 17:12:33 +01:00
Bernd Bestel
aad589eaca Optimized product picker focus handling 2025-01-24 16:46:42 +01:00
Bernd Bestel
f4226876c9 Set focus to input after canceled product picker workflow 2025-01-23 23:22:50 +01:00
Bernd Bestel
12a318c6f2 Updated changelog 2025-01-23 20:53:21 +01:00
Bernd Bestel
844d6279ae Optimized title 2025-01-23 20:20:14 +01:00
Bernd Bestel
de881eb78e Fixed missing en strings 2025-01-23 19:57:55 +01:00
Bernd Bestel
0d1a8bdfb6 Minor style refinements 2025-01-23 19:37:32 +01:00
Bernd Bestel
bbd5f5e7ae Minor style refinements 2025-01-23 18:08:50 +01:00
Bernd Bestel
262f3df3ab Only show the shopping list button on the product card if the feature is enabled 2025-01-23 17:56:01 +01:00
Bernd Bestel
f8e2e4ced7 Uppdated README 2025-01-22 21:08:46 +01:00
Bernd Bestel
c24679b799 Updated screenshots 2025-01-22 20:46:36 +01:00
Bernd Bestel
33ec1626e8 Fixed typo 2025-01-22 20:40:17 +01:00
Bernd Bestel
4468a6ac98 Updated screenshots 2025-01-22 20:36:35 +01:00
Bernd Bestel
4f964cb386 Pulled translations from Transifex 2025-01-22 20:24:20 +01:00
Bernd Bestel
9d92020a07 Updated dependencies 2025-01-22 20:19:41 +01:00
Bernd Bestel
3abf4865bc Added product card on /recipes 2025-01-22 19:39:14 +01:00
Bernd Bestel
69e21fd483 Streamlined inventory input field hints 2025-01-22 19:28:47 +01:00
Bernd Bestel
0bbc06a70c Remove unnecessary help tooltip 2025-01-22 19:25:28 +01:00
Bernd Bestel
8e1d9a4871 Improved mobile filter element spacing 2025-01-22 19:23:41 +01:00
Bernd Bestel
d76d5d2537 Optimized night mode sidebar colors 2025-01-21 21:28:26 +01:00
Bernd Bestel
38882c5ec6 Optimized night mode custom-select background color 2025-01-21 21:09:31 +01:00
Bernd Bestel
4f9e39edd7 Fixed HTML markup 2025-01-21 21:04:56 +01:00
Bernd Bestel
9c0e0c5870 Optimized big header button menus 2025-01-21 20:59:01 +01:00
Bernd Bestel
a4b3a5592e Updated changelog 2025-01-19 21:35:47 +01:00
Bernd Bestel
ef9413c5c1 Optimized recipe missing ingredients shopping list item handling (closes #1890, closes #2134) 2025-01-19 21:31:36 +01:00
Bernd Bestel
0ff5aee6f6 Optimized the recipe ingredient mark as done button layout 2025-01-19 20:45:56 +01:00
Bernd Bestel
61b6afa364 Optimized settings pages layout 2025-01-19 20:35:56 +01:00
Bernd Bestel
1946ff870e Make it possible to round up shopping list and recipe ingredient amounts (closes #902, closes #2644) 2025-01-19 20:16:37 +01:00
Bernd Bestel
e3965ed82c Added a new product option default_purchase_price_type (closes #566) 2025-01-19 16:35:45 +01:00
Bernd Bestel
f3effc5a60 Use qu_id_purchase when adding products to the shopping list (closes #1355) 2025-01-19 15:16:40 +01:00
Bernd Bestel
bc78359dba Make it possible to disable open per product (closes #1911) 2025-01-19 14:57:19 +01:00
Bernd Bestel
72e1a9aee7 Updated API endpoint description (references #386) 2025-01-18 10:38:56 +01:00
Bernd Bestel
83b8b95b73 Streamline in stock / out of stock wording 2025-01-18 10:33:26 +01:00
Bernd Bestel
23d7b6ad3c Allow partially in stock recipes to be consumed (closes #386) 2025-01-18 10:23:31 +01:00
Bernd Bestel
f9c7c67dc7 Indicate incomplete recipe costs information (closes #1941) 2025-01-17 20:37:43 +01:00
Bernd Bestel
c05181aa53 Updated changelog 2025-01-17 20:01:48 +01:00
Bernd Bestel
1daa15a303 Added an upper limit for stock_decimal_places_* settings (references #2508) 2025-01-17 19:48:14 +01:00
Bernd Bestel
4300da8f64 Optimized night mode mobile sidebar active page color 2025-01-17 19:37:02 +01:00
Bernd Bestel
abf109885a Show the amount in stock next to the ingredient hint "Enough in stock" (closes #2119) 2025-01-17 18:42:40 +01:00
Bernd Bestel
f142798a81 Clear /data/viewcache also when BASE_URL or BASE_PATH changed (references #2384) 2025-01-17 17:13:11 +01:00
Bernd Bestel
fe2a628f35 Right align the sidebar on mobile 2025-01-17 17:06:21 +01:00
Bernd Bestel
6605eeafd0 Optimized tooltip hide handling 2025-01-17 16:22:41 +01:00
Bernd Bestel
ded742a7c1 Various minor usability refinements 2025-01-16 21:34:01 +01:00
Bernd Bestel
b0dded1346 Added a new stock settings to always show all products on /stockoverview (closes #2398) 2025-01-15 21:44:45 +01:00
Bernd Bestel
113a9ecf39 Pulled translations from Transifex 2025-01-15 20:40:42 +01:00
Bernd Bestel
9e5ce48091 Updated dependencies 2025-01-15 20:36:41 +01:00
Bernd Bestel
dc05753a0f Added a new product preset for default_stock_label_type (closes #2445) 2025-01-15 20:34:53 +01:00
Bernd Bestel
49839d933b Upgraded some dependencies 2025-01-15 17:41:30 +01:00
Bernd Bestel
97dbd7bf08 Optimized chore on-time tracking (closes #2385) 2025-01-14 20:39:07 +01:00
Bernd Bestel
9cac3b2311 Make track now / next schedule buttons on /choresoverview swappable (closes #2424) 2025-01-14 19:43:12 +01:00
Bernd Bestel
11d28622e8 Squashed commit
Make it possible to actively not-check a mandatory checkbox Userfield (closes #2601)
Pluralize the "opened" localization string (closes #2280)
Added a trendline to the price history chart (closes #2237)
Various minor style/code refinements
2025-01-14 17:54:06 +01:00
Bernd Bestel
c99dd46007 Keep selected date range when navigating through different group by variants of the stockreport/spendings (closes #2532) 2025-01-13 23:13:24 +01:00
Bernd Bestel
645f9e2599 Optimized only_check_single_unit_in_stock recipe ingredient shopping list item handling related to QU conversions (closes #2545) 2025-01-13 23:01:42 +01:00
Bernd Bestel
caa28af0d2 Make product barcode matching case insensitive (closes #2609) 2025-01-13 22:29:33 +01:00
Bernd Bestel
cc40344845 Fixed recipes_nestings_resolved recursive serving calculation (fixes #2361) 2025-01-13 21:37:16 +01:00
Bernd Bestel
c8ccc0b529 Optimized Userfield save event handling (fixes #2458) 2025-01-13 21:00:06 +01:00
Bernd Bestel
a734d1c3ae data/viewcache is now cleared automatically (references #2384) 2025-01-13 18:08:20 +01:00
Bernd Bestel
f4d5f21832 Squashed commit
Fixed recipe ingredient costs/calories calculation when having different QUs and when only_check_single_unit_in_stock is set (fixes #2529)
Added a new column "Product picture" on /products (closes #2640)
Fixed partly opening stock entries stock_id handling (fixes #2391)
2025-01-13 17:41:08 +01:00
Bernd Bestel
e7cea3d949 Optimized camera barcode scanner component 2025-01-13 00:09:28 +01:00
Bernd Bestel
96059a1b32 Optimized camera barcode scanner component 2025-01-12 23:51:00 +01:00
Bernd Bestel
a06991f81b Added external barcode lookup demo videos 2025-01-12 21:05:42 +01:00
Bernd Bestel
245bdbe6e8 Optimized camera display/selection in barcodescanner.js 2025-01-12 19:21:40 +01:00
Bernd Bestel
4a674e3bfa Remove non-numeric characters when looking up OFF barcodes 2025-01-12 18:36:30 +01:00
Bernd Bestel
632162c1be More initial form field focus optimizations 2025-01-12 17:57:50 +01:00
Bernd Bestel
7d6b76effb Fixed Userfield initialization on /purchase and /inventory (fixes #2581) 2025-01-12 17:40:39 +01:00
Bernd Bestel
b706f0c65a Automate manual update steps (closes #2384) 2025-01-12 15:24:18 +01:00
Bernd Bestel
b6ce9eec30 Allow empty QU when editing product barcodes (fixes #2526) 2025-01-12 14:27:19 +01:00
Bernd Bestel
c73be7d18e Finalized frontend external barcode lookup implementation (references #158) 2025-01-12 13:58:47 +01:00
Bernd Bestel
c9ffe4885d Implemented frontend external barcode lookup workflow + a plugin for Open Food Facts (closes #158) 2025-01-11 20:04:32 +01:00
Bernd Bestel
a2c2049037 More modal iframe dialog handling improvements 2025-01-11 15:41:04 +01:00
Bernd Bestel
2c0b1a7be0 More modal iframe dialog handling improvements 2025-01-11 12:29:45 +01:00
Bernd Bestel
5721c4bd62 More modal iframe dialog handling improvements 2025-01-10 20:58:30 +01:00
Bernd Bestel
a373f8ae4b More modal iframe dialog handling improvements 2025-01-10 20:26:37 +01:00
Bernd Bestel
201bda93a2 Revamped modal iframe dialog handling 2025-01-10 17:15:09 +01:00
Bernd Bestel
1900a5b8a2 Visual refresh 2025-01-08 20:50:35 +01:00
Bernd Bestel
98fad559d4 Don't replace due date on freezing when default_best_before_days_after_freezing are set to 0 (closes #1880) 2025-01-06 19:55:18 +01:00
Bernd Bestel
bed18b1981 Show wget progress in update.sh (closes #2633) 2025-01-05 18:31:28 +01:00
Bernd Bestel
0270f6aa08 Improved API key delete confirmation dialog (references #2625) 2024-12-29 20:18:10 +01:00
Bernd Bestel
5f26e914a2 Improve delete confirmation wording details (references #2624) 2024-12-26 10:46:54 +01:00
Bernd Bestel
b2aa882abb Restored staged changes of 27f9d70b56 2024-12-23 18:01:29 +01:00
Bernd Bestel
e273158796 Prepared next release 2024-12-23 17:50:40 +01:00
Bernd Bestel
a1008eac30 Pulled translations from Transifex 2024-12-23 17:46:12 +01:00
Bernd Bestel
d7b5b8958a Stage changes of 27f9d70b56 (not ready yet) 2024-12-23 17:39:59 +01:00
Bernd Bestel
04c5928612 Allow underscores in Userfield names (closes #2611) 2024-12-23 17:35:49 +01:00
Bernd Bestel
9a319a6ee0 Fixed/optimized shopping list invalidation when removing table rows (fixes #2608) 2024-12-23 17:31:22 +01:00
Bernd Bestel
cd25284d35 Fixed DOMSubtreeModified deprecation notice 2024-12-23 17:20:23 +01:00
Bernd Bestel
58eda2f152 Upgraded iframe-resizer package 2024-12-23 17:11:35 +01:00
Bernd Bestel
ceb6774260 Updated dependencies 2024-12-23 16:46:33 +01:00
Bernd Bestel
7b7293e108 Updated footer 2024-12-23 16:43:31 +01:00
Bernd Bestel
11ea8f3716 Fixed shopping list print view table/list sorting (fixes #2602) 2024-11-08 16:40:30 +01:00
Bernd Bestel
1b8f4e6a4f Updated README 2024-11-01 10:44:16 +01:00
Bernd Bestel
3321deec70 Added changelog of #2596 2024-10-25 23:25:17 +02:00
Daniel Reinoso
5b48004449 Exclude self-produced product prices from spending reports (#2596)
* Exclude self-produced product prices from spending reports

* Fix SQL query

* Code style

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2024-10-25 23:19:00 +02:00
Bernd Bestel
9e1020b7f8 Round amount picker max by stock_decimal_places_amounts (closes #2578) 2024-09-10 21:55:31 +02:00
Stefan
185e6b20ad Make date in backup filename ISO 8601 compliant (#2574) 2024-09-01 17:23:06 +02:00
Bernd Bestel
2bc58e083d Fixed recipe edit button on recipes page gallery view (fixes #2541) 2024-08-24 20:01:01 +02:00
Bernd Bestel
1323fff3e2 Add table options also to userobjects view (closes #2573) 2024-08-24 19:42:41 +02:00
Bernd Bestel
d186e26898 Fixed products page table filter regex (references #2570) 2024-08-24 18:28:38 +02:00
Bernd Bestel
4f6075d8c5 Fixed product barcode scanning on the recipe ingredient edit page (fixes #2572) 2024-08-24 18:22:39 +02:00
Bernd Bestel
d5dacb1053 Optimized product Grocycode handling on consume page (and others / general) (fixes #2571) 2024-08-24 18:20:40 +02:00
Bernd Bestel
1246f402e5 Fixed product Grocycode handling on /purchase (references #2571) 2024-08-24 11:32:15 +02:00
Bernd Bestel
7080ec9a8f Pulled translations from Transifex 2024-08-24 11:01:37 +02:00
Bernd Bestel
df28026a80 Updated dependencies 2024-08-24 10:53:33 +02:00
Bernd Bestel
434525826e Fixed products page product group filter to use an exact search instead of contains (fixes #2570) 2024-08-24 10:49:19 +02:00
Bernd Bestel
c21090f522 Allow non-ASCII characters in file names of uploaded files (closes #2484) 2024-08-19 20:51:47 +02:00
Bernd Bestel
5a2600209f Fixed recipe shopping list button feature flag relation (fixes #2552) 2024-07-13 13:41:18 +02:00
Bernd Bestel
8ac8000f30 Updated dependencies 2024-05-10 17:45:29 +02:00
Bernd Bestel
8821280642 Pulled translations from Transifex 2024-05-10 17:42:13 +02:00
Bernd Bestel
2047d38c6e Updated about page 2024-04-14 19:24:32 +02:00
Bernd Bestel
a68c1087dd Update README 2024-04-13 17:43:57 +02:00
Bernd Bestel
2f7478bddb Update README 2024-04-13 13:20:35 +02:00
Bernd Bestel
af1f2aef96 Don't allow amounts <= 0 on purchase/consume
References https://github.com/grocy/grocy/issues/2156#issuecomment-2040336492
2024-04-05 20:12:11 +02:00
Bernd Bestel
6602c76005 Completed changelog for #2501 2024-03-17 21:26:06 +01:00
TheDodger
8f9b295e68 Also copy treat_opened_as_out_of_stock when copying a product (#2501) 2024-03-17 21:24:35 +01:00
Bernd Bestel
5167ba1154 Add recipe name to note of the created stock entry when self producing products (closes #2497) 2024-03-17 17:11:09 +01:00
Bernd Bestel
b26dfe3fb0 Restored staged changes of 27f9d70b56 2024-03-15 18:48:51 +01:00
Bernd Bestel
402d98757e Optimized iframe-resizer handling 2024-03-15 18:39:31 +01:00
Bernd Bestel
a7fc87c9bc Prepared next release 2024-03-15 18:12:58 +01:00
Bernd Bestel
5c1814989a Stage changes of 27f9d70b56 (not ready yet) 2024-03-15 18:06:46 +01:00
Bernd Bestel
e005c51b1a Pulled translations from Transifex 2024-03-15 18:04:16 +01:00
Bernd Bestel
f14110aa1e Updated dependencies 2024-03-15 18:01:05 +01:00
Bernd Bestel
affa7c41a1 Added missing DataTables option (fixes #2494) 2024-03-13 22:05:05 +01:00
Bernd Bestel
9c123bd92a Completed changelog for #2492 2024-03-10 18:59:16 +01:00
TheDodger
7f1dfd0496 Align settings (wrench) menu entries (#2492)
* Made settings menu (wrench) entries aligned by changing the icons to fixed width

* If, then take care of all those kind of menus

---------

Co-authored-by: Manuel Worschech <mw@abot.xyz>
Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2024-03-10 18:57:10 +01:00
Bernd Bestel
49ff780e3f Completed changelog for #2490 2024-03-10 18:16:43 +01:00
TheDodger
477f333466 Add userfields to battery charge cycle tracking (#2490)
Co-authored-by: Manuel Worschech <mw@abot.xyz>
2024-03-10 18:12:02 +01:00
Bernd Bestel
e01e0f3abe Revamped iframe modal handling (references #2480 and #2421) 2024-02-25 10:40:11 +01:00
Bernd Bestel
8ba3305a21 Default any add-to-shopping-list-actions to the default shopping list (closes #2472) 2024-02-24 20:15:23 +01:00
Bernd Bestel
24cac247f5 Don't resize invisible embedded iframes (references #2480 and #2421) 2024-02-24 20:13:39 +01:00
Bernd Bestel
6a68e410e4 Prefill specific stock entry information by a scanned stock entry Grocycode on /transfer (closes #2481) 2024-02-24 17:48:58 +01:00
Bernd Bestel
88d0d32ea0 Added changelog for #2480 2024-02-24 15:47:57 +01:00
Bernd Bestel
11ac985e57 Added a workaround for sporadically (not fully reproducible) empty modal iframes in Chrome based Browsers (references #2480 and #2421) 2024-02-24 15:36:43 +01:00
Bernd Bestel
ac26c5510b Prefill desired_servings by base_servings when creating a recipe (closes #2479) 2024-02-23 18:09:55 +01:00
Bernd Bestel
85bff136de Added changelog for #2477 2024-02-23 17:58:24 +01:00
bbx0
d2a878e98e Stream uploads to file (#2477)
* Stream uploads to file

* Adapt code style / use up to date reasonable chunk size

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2024-02-23 17:56:32 +01:00
Bernd Bestel
4d8f08eddd Also copy move_on_open when copying a product (fixes #2478) 2024-02-23 17:08:34 +01:00
Bernd Bestel
edf973df00 Improved meal plan item buttons (closes #2471) 2024-02-13 20:07:24 +01:00
Bernd Bestel
8497f37b24 Fixed product's last_price related to empty / 0 stock transactions (fixes #2470) 2024-02-13 13:12:56 +01:00
Bernd Bestel
40d1a9c3d0 Show the number of items per shopping list in the shopping lists dropdown (closes #2467) 2024-02-12 20:36:33 +01:00
Bernd Bestel
c7abed0d68 Restored staged changes (ref 27f9d70b56 and 7b1a864486) 2024-02-09 18:26:23 +01:00
Bernd Bestel
bf05434a5c Prepared next release 2024-02-09 17:32:35 +01:00
Bernd Bestel
18125d8989 Pulled translations from Transifex 2024-02-09 17:25:00 +01:00
Bernd Bestel
75f0af2bd3 Updated dependencies 2024-02-09 16:46:33 +01:00
Bernd Bestel
7b1a864486 Revert / disable 27f9d70b56 (not ready yet) 2024-02-09 16:38:55 +01:00
Bernd Bestel
f2f9a16e59 Fixed stock entry page consume amount handling (fixes #2397) 2024-02-09 16:29:19 +01:00
Bernd Bestel
9f94ba55a4 Improved API doc related to the /stock endpoint (closes #2456) 2024-02-03 09:28:18 +01:00
Bernd Bestel
15ab198af0 Enable night mode on /login if that's the system preferred color scheme (references #71) 2024-01-28 09:39:58 +01:00
Bernd Bestel
4659f51551 Fixed user create handling in embedded mode (closes grocy/grocy-desktop#51) 2024-01-15 17:10:36 +01:00
Bernd Bestel
33d5ec44d2 Again more iframe dialog handling optimizations (references #2421) 2024-01-13 20:27:35 +01:00
Bernd Bestel
fc072b13f2 More iframe dialog handling optimizations (references #2421) 2024-01-13 09:32:59 +01:00
Bernd Bestel
efae5fea5b Don't lazy load iframes (fixes #2421) 2024-01-10 21:52:54 +01:00
jan-karwowski
3aeecfa24d Fix data types in opeanapi description (#2433)
* In Openapi schema mark fields that return only date as date

next_due_data and last_uset were using date-time format instead of date

* In Openapi description fix type product_barcodes to be array

Openapi schema should say thatn product_barcodes field in
ProductDetailsResponse is an array of ProductBarcode not a single
object.

Make the value an array not a single field

* In openapi schema fix purchased date format in stock log entry

It should be just date not a date-time format.

---------

Co-authored-by: Jan Karwowski <jan_karwowski@wp.pl>
2024-01-09 18:49:38 +01:00
Bernd Bestel
bae83535dd Merge branch 'master' of https://github.com/grocy/grocy 2024-01-09 18:39:57 +01:00
Bernd Bestel
fb407a7fa7 Added changelog for #2432 2024-01-09 18:39:42 +01:00
Torqu3Wr3nch
151bd7f025 Fix blank/missing items in spending report (#2432)
* Fixes blank/missing items in spending report

Use left (outer) join when connecting product to optional product group

* Properly display ungrouped items in table and chart

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2024-01-09 18:36:09 +01:00
Bernd Bestel
99f448dd64 Strip spaces from uploaded file names (fixes #2415) 2023-12-30 19:49:21 +01:00
Bernd Bestel
7f7f1e8dce Added changelog for #2412 2023-12-25 08:49:29 +01:00
geoffwright240
6b69487bc5 Added 'category' filter to tasks view. (#2412)
* Added 'category' filter to tasks view.

* Remove extraneous css attributes.

* Applied code style rules

* Use correct column

* Task categories are not something that is translated...

* Added "Uncategorized" as additional filter option

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2023-12-25 08:47:21 +01:00
Bernd Bestel
ee01f41979 Support PHP 8.3, no longer support PHP 8.1 2023-12-16 15:08:59 +01:00
Bernd Bestel
97ecbd25b6 Pulled translations from Transifex 2023-12-16 15:07:59 +01:00
Bernd Bestel
9458eb8b90 Updated dependencies 2023-12-16 15:04:07 +01:00
Bernd Bestel
3c35a69c32 Optimized created API key table highlighting (closes #2403) 2023-12-11 22:03:00 +01:00
Bernd Bestel
c9bc10820d Fixed typo in localization string 2023-12-01 19:26:29 +01:00
Bernd Bestel
8f52aaeadc Handle stock userfields in generic entity interaction API endpoints (closes #2381) 2023-11-14 21:07:30 +01:00
Bernd Bestel
dc05476d09 Reload calendar after color config changed (references #2368) 2023-11-04 14:18:51 +01:00
Bernd Bestel
80d7284d72 Implemented calendar category colors (closes #2368) 2023-11-04 14:11:02 +01:00
Bernd Bestel
b3a5128dbd Pulled translations from Transifex 2023-11-04 13:26:58 +01:00
Bernd Bestel
7969145bbf Updated dependencies 2023-11-04 13:23:18 +01:00
Bernd Bestel
f01ca33c33 Optimized initial focus / workflow handling for recipeposform and shoppinglistitemform 2023-11-04 13:19:46 +01:00
Bernd Bestel
fdf5559c25 Fixed typo 2023-11-03 20:51:42 +01:00
Bernd Bestel
27f9d70b56 Implemented a way to use the external barcode lookup plugin also from within the frontend as a product picker workflow 2023-11-03 20:47:43 +01:00
Bernd Bestel
c9215a9a4e Added a workaround for the not working customRangeLabel option of the daterangepicker component (fixes #2353) 2023-10-04 16:46:24 +02:00
Bernd Bestel
69db4b558b Fixed typo 2023-10-01 21:43:28 +02:00
Bernd Bestel
35a4b75432 Added changelog for #2344 2023-09-19 18:08:36 +02:00
Chris Thorn
f36ad805b3 Optimize sidebar icon spacing (#2344)
* Update default.blade.php

Add `fa-fw` class to all side navigation icons to make them all fixed width

* Do this also for userentities

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2023-09-19 18:07:30 +02:00
Bernd Bestel
35766bf5b3 Optimized CurrentVolatileStock handling (fixes #2341) 2023-09-15 17:24:29 +02:00
Bernd Bestel
3308e79027 Use bind params when copying a recipe (fixes #2337) 2023-09-15 13:58:57 +02:00
Bernd Bestel
1e60f940e4 Properly handle empty select-multiple userfield (fixes #2339) 2023-09-15 13:43:58 +02:00
Bernd Bestel
c8891236e6 Optimized meal plan weekRecipe handling (fixes #2333) 2023-09-05 21:07:38 +02:00
Bernd Bestel
b0d6e24bd4 Fixed consume page location dropdown handling (fixes #2328) 2023-09-02 10:17:43 +02:00
Bernd Bestel
b2295ce6d2 Prepared next release 2023-09-02 09:28:19 +02:00
Bernd Bestel
32ce04a1b7 Pulled translations from Transifex 2023-09-02 09:25:43 +02:00
Bernd Bestel
dfa3262426 Updated dependencies 2023-09-02 09:15:11 +02:00
Bernd Bestel
1f7580af3f Fixed GetCurrentStock caching 2023-09-02 09:12:37 +02:00
Bernd Bestel
60adda2b42 Optimized performance of CurrentVolatileStock 2023-09-01 18:11:36 +02:00
Bernd Bestel
387a5f7dd3 Move GetParsedAndFilteredRequestBody into BaseApiController 2023-09-01 17:58:02 +02:00
Bernd Bestel
f6bdb6e836 Added new Userfield type "Number (currency)" (closes #2276) 2023-09-01 17:48:46 +02:00
Bernd Bestel
82d899d609 Optimized DataTables state save handling performance 2023-09-01 17:04:11 +02:00
Bernd Bestel
fdbb8a045a Optimized performance of GetProductDetails 2023-09-01 17:03:22 +02:00
Bernd Bestel
07db1f35bc Cache multiple single-key user setting queries (closes #2323) 2023-09-01 17:02:36 +02:00
Bernd Bestel
dde577b98b Updated README 2023-09-01 17:00:50 +02:00
Bernd Bestel
5080d776a7 Only accept application/json requests for (JSON) API requests 2023-09-01 00:53:25 +02:00
Bernd Bestel
8c21969b84 Added changelog for PR #2322 2023-08-22 19:43:43 +02:00
Aleksandar Kuzmanoski
13e99d3f07 stock_current view now uses cached QUCs -> Recipes consume 50% faster (#2322)
* stock_current view now uses cache__quantity_unit_conversions_resolved -> Recipes consume 50% faster

* Adapted code style

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2023-08-22 19:41:44 +02:00
Bernd Bestel
dedbee3181 Allow user editing in embedded (+ disabled authentication) mode (closes grocy/grocy-desktop#47) 2023-08-19 08:48:52 +02:00
Bernd Bestel
16f686deb8 Prepared next release 2023-08-19 08:24:52 +02:00
Bernd Bestel
973e4226b6 Pulled translations from Transifex 2023-08-19 08:18:36 +02:00
Bernd Bestel
6e22d3b100 Updated dependencies 2023-08-19 08:15:33 +02:00
Bernd Bestel
9b119da8e0 Merged the by @alkuzman contributed new quantity_unit_conversions_resolved view (closes #2297) 2023-08-19 08:13:34 +02:00
Bernd Bestel
03f9ba45ea Fixed initial product QU conversion handling (fixes #2312) 2023-08-16 17:05:18 +02:00
Bernd Bestel
a965d01fb9 Optimized server error display handling when consuming a recipe (closes #2310) 2023-08-15 18:51:40 +02:00
Bernd Bestel
a123535b0a Optimized locale number display handling (fixes #2309) 2023-08-15 09:35:40 +02:00
Bernd Bestel
3a2929c016 stockreports/spendings: Support grouping by store (closes #2308) 2023-08-14 18:12:40 +02:00
Bernd Bestel
106f25cc6b Fixed stock entry open button amount on /stockentries (fixes #2303) 2023-08-13 08:27:02 +02:00
Bernd Bestel
d6cc87ac86 More optimizations around edited stock entries handling (references #2292) 2023-08-13 00:27:37 +02:00
Bernd Bestel
a47bccab3f Added some comments to newest changed SQL views (references #2292) 2023-08-12 20:16:44 +02:00
Bernd Bestel
393a312186 More fixes regarding edited stock entries and calculating the products average price + price history (fixes #2292) 2023-08-12 18:08:12 +02:00
Bernd Bestel
7f21e2de34 Switched back to original gettext/gettext package
References https://github.com/php-gettext/Gettext/pull/289
2023-08-10 16:58:40 +02:00
Bernd Bestel
82ac996b3a Fixed typo 2023-08-09 22:36:50 +02:00
Bernd Bestel
827134c972 Changelog wording improvements 2023-08-09 22:34:30 +02:00
Bernd Bestel
787d5f11e0 Fixed dynamic manifest didn't work with enabled authentication 2023-08-09 21:00:35 +02:00
Bernd Bestel
2d2039f988 Fixed recipe cost/energy calculation (fixes #2301) 2023-08-08 17:59:10 +02:00
Bernd Bestel
268f0d8a50 Fixed typo 2023-08-08 09:43:17 +02:00
Bernd Bestel
9dde46d419 Changelog wording improvements 2023-08-07 22:13:47 +02:00
Bernd Bestel
162ba267a1 Changelog wording improvements 2023-08-07 22:12:00 +02:00
Bernd Bestel
4691b45510 Removed unnecessary calculation step in view uihelper_shopping_list (closes #2298) 2023-08-07 21:57:12 +02:00
455 changed files with 18529 additions and 10244 deletions

View File

@@ -10,7 +10,7 @@ for /f "tokens=*" %%a in ('jq .Version versiontemp.json --raw-output') do set ve
del versiontemp.json
del "%releasePath%\grocy_%version%.zip"
7za a -r "%releasePath%\grocy_%version%.zip" "%projectPath%\*" -xr!.* -xr!build.bat -xr!composer.json -xr!composer.lock -xr!package.json -xr!yarn.lock -xr!docs
7za a -r "%releasePath%\grocy_%version%.zip" "%projectPath%\*" -xr!.* -xr!build.bat -xr!composer.json -xr!composer.lock -xr!package.json -xr!yarn.lock -xr!docs -xr!test -x!public\packages\@fortawesome\fontawesome-free\js -x!public\packages\@fortawesome\fontawesome-free\less -x!public\packages\@fortawesome\fontawesome-free\metadata -x!public\packages\@fortawesome\fontawesome-free\scss -x!public\packages\@fortawesome\fontawesome-free\sprites -x!public\packages\@fortawesome\fontawesome-free\svgs
7za a "%releasePath%\grocy_%version%.zip" "%projectPath%\public\.htaccess"
7za rn "%releasePath%\grocy_%version%.zip" .htaccess public\.htaccess
7za d "%releasePath%\grocy_%version%.zip" data\*.* data\storage data\viewcache\* changelog\__TEMPLATE.md

View File

@@ -1,9 +1,11 @@
pushd ..
for /d %%d in (localization\*) do (
if %%~nxd neq en (
tx pull --languages %%~nxd --force
)
)
copy /Y localization\en\userfield_types.po localization\en_GB\userfield_types.po
copy /Y localization\en\stock_transaction_types.po localization\en_GB\stock_transaction_types.po
copy /Y localization\en\component_translations.po localization\en_GB\component_translations.po
@@ -11,4 +13,5 @@ copy /Y localization\en\chore_period_types.po localization\en_GB\chore_period_ty
copy /Y localization\en\chore_assignment_types.po localization\en_GB\chore_assignment_types.po
copy /Y localization\en\permissions.po localization\en_GB\permissions.po
copy /Y localization\en\locales.po localization\en_GB\locales.po
popd

View File

@@ -18,5 +18,5 @@ Please make sure to:
Please also try to reproduce the problem on the pre-release demo: => https://demo-prerelease.grocy.info
- Use a private demo instance to make your example persistent
- If the problem is not reproducible there, it's most likely not a bug - please use the r/grocy subreddit for general questions / help: => https://www.reddit.com/r/grocy
- If the problem is not reproducible there, it's most likely not a bug - please use the r/grocy subreddit for general help and usage questions: => https://www.reddit.com/r/grocy
-->

View File

@@ -2,4 +2,4 @@ blank_issues_enabled: false
contact_links:
- name: Questions / Help
url: https://www.reddit.com/r/grocy
about: Please use the r/grocy subreddit for general questions / help
about: Please use the r/grocy subreddit for general help and usage questions

View File

@@ -11,7 +11,7 @@ assignees: ''
<!--
Please make sure to:
- Describe what you would find useful
- Describe what you would find useful as detailed as possible
- Check if your idea was maybe already requested by searching open requests here
- Keep it to one topic per request
-->

4
.github/SECURITY.md vendored
View File

@@ -1,5 +1,5 @@
Grocy is not an enterprise application and neither one you (should) host publicly (means without authentication) on the internet.
So unless something really bad can be abused _unauthenticated_, please just open a regular issue on the [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose).
So unless something really bad can be abused _unauthenticated_, it's considered practically irrelevant for the target use case of Grocy and therefore not even worth reporting that.
You can also contact me directly, please see [berrnd.de](https://berrnd.de) for any contact information.
If you really think you've found something critical and valid for the target use case of Grocy and you feel the need to contact me privately on that, please see [berrnd.de](https://berrnd.de) for any contact information.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 212 KiB

View File

@@ -1,7 +1,10 @@
-----
<div align="center">
<img alt="Logo" height="60" src="https://raw.githubusercontent.com/grocy/grocy/master/public/img/logo.svg?sanitize=true" />
<h3>ERP beyond your fridge</h3>
<h4>Grocy is a web-based self-hosted groceries & household management solution for your home<br>Created by <a href="https://github.com/berrnd">@berrnd</a></h4>
<img alt="Logo" height="50" src="https://raw.githubusercontent.com/grocy/grocy/master/public/img/logo.svg?sanitize=true" />
<h2>ERP beyond your fridge</h2>
<h3>Grocy is a web-based self-hosted groceries & household management solution for your home</h3>
<em><h4>This is a hobby project by <a href="https://berrnd.de">Bernd Bestel</a></h4></em>
</div>
-----
@@ -13,14 +16,14 @@
## Features
See the website &rarr; <https://grocy.info>
See the website. &rarr; <https://grocy.info>
## Questions / Help / Bug Reports / Feature Requests
- General help and usage questions &rarr; [r/grocy subreddit](https://www.reddit.com/r/grocy)
- Bug Reports and Feature Requests &rarr; [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose)
_Please don't send me private messages or call me regarding Grocy help. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
_Please don't send me private messages or call me regarding anything Grocy. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
## Community contributions
@@ -32,8 +35,6 @@ See the website for a list of community contributed Add-ons / Tools. &rarr; [htt
>
> Directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next".
See the website for some installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links)
Grocy is technically a pretty simple PHP application, so the basic notes to get it running are:
- Unpack the [latest release](https://releases.grocy.info/latest)
- Copy `config-dist.php` to `data/config.php` + edit to your needs
@@ -45,23 +46,23 @@ Grocy is technically a pretty simple PHP application, so the basic notes to get
Alternatively clone this repository (the `release` branch always references the latest released version) and install Composer and Yarn dependencies manually.
See the website for more installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links)
### Platform support
- PHP 8.1 or 8.2 (with SQLite 3.34.0+)
- Required PHP extensions: `fileinfo`, `pdo_sqlite`, `gd`, `ctype`, `json`, `intl`, `zlib`, `mbstring`
- PHP 8.2 or 8.3 (with SQLite 3.34.0+)
- Required PHP extensions: `fileinfo`, `pdo_sqlite`, `gd`, `ctype`, `intl`, `zlib`, `mbstring`
- _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
- Recent Firefox, Chrome or Edge
## How to run using Docker
See [grocy/grocy-docker](https://github.com/grocy/grocy-docker) or [linuxserver/docker-grocy](https://github.com/linuxserver/docker-grocy) for instructions.
&rarr; https://hub.docker.com/r/linuxserver/grocy
## How to update
- Overwrite everything with the [latest release](https://releases.grocy.info/latest) 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)
- Empty the `data/viewcache` directory
- Visit the main route once to apply database migrations ([see below](https://github.com/grocy/grocy#database-migrations))
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).
@@ -69,19 +70,19 @@ If you run Grocy on Linux, there is also `update.sh` (remember to make the scrip
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 on [Transifex](https://www.transifex.com/grocy/grocy/dashboard/) if your language is incomplete or not available yet.
You can easily help translating Grocy on [Transifex](https://explore.transifex.com/grocy/grocy/) if your language is incomplete or not available yet.
The default language can be set in `data/config.php`, e. g. `Setting('DEFAULT_LOCALE', 'it');` and there is also a user setting (see the user settings page) to set a different language per user.
The default language can be set in `data/config.php`, e. g. `Setting('DEFAULT_LOCALE', 'de');` and there is also a user setting (see the user settings page) to set a different language per user.
The [pre-release demo](https://demo-prerelease.grocy.info) is available for any translation which is at least 70 % 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!
Also any translation which once reached a completion level of 70 % ([`strings` resource](https://www.transifex.com/grocy/grocy/strings/)) will be included in releases.
Also any translation which once reached a completion level of 70 % ([`strings` resource](https://app.transifex.com/grocy/grocy/strings/)) will be included in releases.
_RTL languages are unfortunately not yet supported._
## 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 was a pain to use at the end 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!
A household needs to be managed. Before Grocy I did this (for almost 10 years) using my first self written software (a C# Windows forms application) and with a bunch of Excel sheets. The software was a pain to use at the end 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!
## Things worth to know
@@ -89,25 +90,37 @@ A household needs to be managed. I did this so far (almost 10 years) with my fir
See the integrated Swagger UI instance on [/api](https://demo.grocy.info/api).
The web frontend uses exactly this API for pretty much everything. So everything you can do there is also possible via the API.
### Barcode readers & camera scanning
Some fields (with a barcode icon above) 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 [Quagga2](https://github.com/ericblade/quagga2), totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)). Quick video demo: <https://www.youtube.com/watch?v=Y5YH6IJFnfc>
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 input field (powered by [ZXing](https://github.com/zxing-js/library), totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)). [Here](https://www.youtube.com/watch?v=veezFX4X1JU) and [there](https://www.youtube.com/watch?v=Y5YH6IJFnfc) are quick video demos of that.
_My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000 % better, faster, under any lighting condition and from any angle._
### Barcode lookup via external services
Products can be directly added to the database via looking them up against external services by a barcode.
This can be done in-place using the product picker workflow "External barcode lookup" (the workflow dialog is displayed when entering something unknown in any product input field) Quick video demo: <https://www.youtube.com/watch?v=-moXPA-VvGc>
A plugin for [Open Food Facts](https://world.openfoodfacts.org/) is included and used by default (see the `data/config.php` option `STOCK_BARCODE_LOOKUP_PLUGIN`).
See that plugin or `plugins/DemoBarcodeLookupPlugin.php` for a commented example implementation if you want to build a plugin.
### Input shorthands for date fields
For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization.
The following shorthands are available:
- `MMDD` gets expanded to the given day on the current year, if > today, or to the given day next year, if < today, in proper notation
- Example: `0517` will be converted to `2021-05-17`
- Example: `0517` will be converted to `2025-05-17`
- `YYYYMMDD` gets expanded to the proper ISO-8601 notation
- Example: `20210417` will be converted to `2021-04-17`
- Example: `20250417` will be converted to `2025-04-17`
- `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation
- Example: `202107e` will be converted to `2021-07-31`
- `[+/-]n[d/m/y]` gets expanded to a date relative to today, while adding (**+**) or subtracting (**-**) the **n**umber of**d**ays/**m**onths/**y**ears, in proper notation
- Example: `202507e` will be converted to `2025-07-31`
- `[+/-]n[d/m/y]` gets expanded to a date relative to today, while adding (**+**) or subtracting (**-**) the **n**umber of **d**ays/**m**onths/**y**ears, in proper notation
- Example: `+1m` will be converted to the same day next month
- `x` gets expanded to `2999-12-31` (which is an alias for "never overdue")
- Down/up arrow keys will increase/decrease the date by 1 day
@@ -120,17 +133,18 @@ The following shorthands are available:
Wherever a button contains a bold highlighted letter, this is a shortcut key.
Example: Button "**P** Add as new product" can be "pressed" by using the `P` key on your keyboard.
### Barcode lookup via external services
### Installable web app (PWA)
Products can be directly added to the database via looking them up against external services by a barcode.
This is currently only possible through the REST API.
There is no plugin included for any service, see the reference implementation in `data/plugins/DemoBarcodeLookupPlugin.php`.
Grocy's web frontend is responsive and an "installable web app" ([PWA](https://en.wikipedia.org/wiki/Progressive_web_app), without providing any offline usage capabilities), that provides a pretty native mobile app-like experience without the need for additional tools.
- Quick video demo on Android/Firefox: <https://www.youtube.com/watch?v=L38drVZfwHs>
- Quick video demo on Android/Chrome: <https://www.youtube.com/watch?v=rjLdXUFDNuk>
### Database migrations
Database schema migration is automatically done when visiting the root (`/`) route (click on the logo in the left upper edge).
Database schema migration is done when visiting the root (`/`) route (click on the logo in the left upper edge) as needed and is also triggered automatically if the version has changed (so when an update has been made).
_Please note: Database migrations are supposed to work between releases, not between every commit. If you want to run the current `master` branch (which is the development version), you need to handle that (and maybe more) yourself._
_Please note: Database migrations are supposed to work between releases, not between every commit. If you want to run the current `master` branch (which is the development version), you need to handle that (and more) yourself._
### Disable certain features

25
app.php
View File

@@ -52,9 +52,30 @@ catch (EInvalidConfig $ex)
}
// Create data/viewcache folder if it doesn't exist
if (!file_exists(GROCY_DATAPATH . '/viewcache'))
$viewcachePath = GROCY_DATAPATH . '/viewcache';
if (!file_exists($viewcachePath))
{
mkdir(GROCY_DATAPATH . '/viewcache');
mkdir($viewcachePath);
}
// Empty data/viewcache when and trigger database migrations when:
// The version changed (so when an update was done)
// GROCY_BASE_URL OR GROCY_BASE_PATH changed
$hash = hash('sha256', file_get_contents(__DIR__ . '/version.json') . GROCY_BASE_URL . GROCY_BASE_PATH);
$hashCacheFile = $viewcachePath . "/$hash.txt";
if (!file_exists($hashCacheFile))
{
EmptyFolder($viewcachePath);
touch($hashCacheFile);
if (function_exists('opcache_reset'))
{
opcache_reset();
}
// Schema migration happens on the root route, so redirect to there
header('Location: ' . (new UrlManager(GROCY_BASE_URL))->ConstructUrl('/'));
exit();
}
// Setup base application

View File

@@ -1,4 +1,4 @@
- New related project: **grocy-desktop**
- New related project: **Grocy Desktop**
- => https://github.com/grocy/grocy-desktop
- Run Grocy without a webserver just like a normal (Windows) desktop application
- New "embedded mode" for Grocy to help running in "desktop application mode" [see README](https://github.com/grocy/grocy#embedded-mode)

View File

@@ -11,7 +11,5 @@
- Some other small CSS fixes (context menus were not fully displayed when the parent container was to small, improved padding for text inputs)
- As always: Updated translations (thanks all the translators)
### Self promotion
[grocy-desktop](https://github.com/grocy/grocy-desktop) is now also available through the Microsoft Store
<a href="//www.microsoft.com/store/apps/9nwb1trnnksf?cid=storebadge&ocid=badge"><img src="https://assets.windowsphone.com/85864462-9c82-451e-9355-a3d5f874397a/English_get-it-from-MS_InvariantCulture_Default.png" alt="Get it from Microsoft" width="150px" /></a>
### Other
- [Grocy Desktop](https://github.com/grocy/grocy-desktop) is now also available through the Microsoft Store: https://apps.microsoft.com/detail/9NWB1TRNNKSF

View File

@@ -29,6 +29,6 @@
- Also applies to quantity units, n-plural forms can be entered on the quantity unit edit page
- It's not required to install the PHP gettext extension, on both, server and client, managed implementations of gettext are used ([oscarotero/Gettext](https://github.com/oscarotero/Gettext) & [oscarotero/gettext-translator](https://github.com/oscarotero/gettext-translator))
- Some other small fixes and improvements
- The "Add as barcode to existing product" productpicker workflow failed to add the barcode to the given product
- The "Add as barcode to existing product" product picker workflow failed to add the barcode to the given product
- Recipes can now be filter by stock availability
- Added a feature flag (`config.php` setting) to also be able to hide all stock related UI elements and routes

View File

@@ -1,15 +1,15 @@
### New feature: Custom entities / objects / lists
### 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
### 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)
- If 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
@@ -67,7 +67,7 @@
### 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)
- 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)

View File

@@ -1,10 +1,10 @@
### New feature: Transfer products between locations and edit stock entries
### New Feature: Transfer products between locations and edit stock entries
- New menu entry in the sidebar to transfer products (or as a shortcut in the more/context menu per line on the stock overview page)
- New button "Stock entries" in the header of the stock overview page (or as a shortcut in the more/context menu per line) to show the detail stock entries behind each product
- From there you can also edit the stock entries
- (A huge THANK YOU goes to @kriddles for the work on this feature)
### New feature: Scan mode
### New Feature: Scan mode
- Just scan one product after another, no manual input required and audio feedback is provided
- New switch-button on the purchase and consume page
- When enabled
@@ -14,13 +14,13 @@
- Audio feedback is provided after scanning and on success/error of the transaction
- => Quick video demo: https://www.youtube.com/watch?v=83dm9iD718k
### New feature: Self produced products
### New Feature: Self produced products
- To a recipe a product can be attached
- This products needs a "Default best before date"
- On using "Consume all ingredients needed by this recipe" and when it has a product attached, one unit of that product (per serving in purchase quantity unit) will be added to stock (with the proper price based on the recipe ingredients)
- (Thanks @kriddles for the initial work on this)
### New feature: Freeze/Thaw products
### New Feature: Freeze/Thaw products
- New product options "Default best before days after freezing/thawing" to set how the best before date should be changed on freezing/thawing
- New location option "Is freezer" to indicate if the location is a freezer
- => When moving a product from/to a freezer location, the best before date is changed accordingly

View File

@@ -1,4 +1,4 @@
### New feature: Price history per store
### New Feature: Price history per store
- Define stores under master data
- New product option to set the default store
- Track on purchase/inventory in which store you bought the product (gets prefilled by the last store you purchased the product, or the default store of the product if you never bought it)

View File

@@ -8,18 +8,18 @@
> ❗ If some pages/tables doesn't load at all, please check that your `/data/config.php` setting `CURRENCY` is a valid ISO 4217 currency code - that's most probably the issue then.
### New feature: Use any product related quantity unit anywhere
### New Feature: Use any product related quantity unit anywhere
- Finally it's possible to use any product related quantity unit on any page
- Products still have one quantity unit stock and one (default) quantity unit purchase, but any QU, which has a direct or indirect conversion for that product, can be used to pick an amount
- Because the stock quantity unit is now the base for everything, it cannot be changed after the product was once added to stock (for now, maybe there will be a possibilty to change it in a future release)
### New feature: Prefill purchase data by barcodes
### New Feature: Prefill purchase data by barcodes
- Imagine you buy for example eggs in different pack sizes and they have different barcodes
- Each product barcode can be assigned an amount, quantity unit and store (on the product edit page), which is then automatically prefilled on the purchase page
- Additionally, the last price per barcode will be tracked and prefilled as a "Total price" on purchase
- (Thanks @kriddles for the initial work on this)
### New feature: User permissions
### New Feature: User permissions
- Users can now have permissions, can be configured per user on the "Manage users" page (lock icon)
- Default permissions for new users can be set via a new `config.php` setting `DEFAULT_PERMISSIONS` (defaults to `ADMIN`, so no changed behavior when not configured)
- All currently existing users will get all permissions (`ADMIN`) during the update/migration
@@ -27,7 +27,7 @@
- Other users only see their API keys on that page
- (Thanks @fipwmaqzufheoxq92ebc for the initial work on this)
### New feature: External authentication support
### New Feature: External authentication support
- New `config.php` setting `AUTH_CLASS` to change the used authentication provider
- Via LDAP
- New `config.php` settings `LDAP_DOMAIN`, `LDAP_ADDRESS` and `LDAP_BASE_DN`
@@ -56,14 +56,14 @@
- Products can now be duplicated (new dropdown menu item on the products list page, all fields will be preset from the copied product, except the name)
- Products can now be merged (new dropdown menu item on the products list page)
- Useful if you have two products which are basically the same and want to replace all occurrences of one with the other one
- When consuming or opening a parent product, which is currently not in stock, any in-stock sub product will now be consumed/opened (like already automatically done when consuming recipes)
- When consuming or opening a parent product, which is currently not in stock, any in stock sub product will now be consumed/opened (like already automatically done when consuming recipes)
- Opened stock entries get now consumed first by default when no specific stock entry is used/selected
- So the default consume rule is now "Opened first, then first due first, then first in first out"
- Optimized/clarified what the total/unit price on the purchase page is (thanks @kriddles)
- On the purchase page the amount field is now displayed above/before the due date for better `TAB` handling (thanks @kriddles)
- Changed that when `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING` is disabled, products now get internally a due date of "never overdue" (aka `2999-12-31`) instead of today (thanks @kriddles)
- Products can now be disabled to keep the history/journal, but hide it everywhere, without deleting it (new product option "Active", deleting a product now explicitly also deletes its journal and all other references) (thanks @kriddles for the initial work on this)
- Products can now be hidden from the stock overview page, even if they are in-stock (new product option "Never show on stock overview", disabled by default, so no changed behavior when not configured)
- Products can now be hidden from the stock overview page, even if they are in stock (new product option "Never show on stock overview", disabled by default, so no changed behavior when not configured)
- That's maybe useful for parent products you only use as a kind of "container"
- The due date is now also prefilled on the inventory page based on the products "Default due days" (was only done on the purchase page before)
- On the stock journal page, it's now visible if a consume-booking was spoiled
@@ -100,7 +100,7 @@
- Fixed that a "Total price" on purchase was not handled correctly for tare weight handling enabled products (the total price was wrongly related to the amount including the tare weight)
### Shopping list improvements
- Added a button to add all currently in-stock but overdue and expired products to the shopping list (thanks @m-byte)
- Added a button to add all currently in stock but overdue and expired products to the shopping list (thanks @m-byte)
- Improved that when `FEATURE_FLAG_STOCK` is disabled, all product/stock related inputs and buttons are now hidden on the shopping list page (thanks @fipwmaqzufheoxq92ebc)
- Shopping list items can now have their own Userfields (entity `shopping_list`), on the shopping list table those fields are rendered additionally to the product Userfields
- The print view is now configurable (new dialog before printing - option to hide header, group products by their product group, alternative list layout)
@@ -253,8 +253,8 @@
- `>=` greater or equal
- `§` regular expression
- `<value>` is the value to search for
- New endpoint `/stock/shoppinglist/add-overdue-products` to add all currently in-stock but overdue products to a shopping list (thanks @m-byte)
- New endpoint `/stock/shoppinglist/add-expired-products` to add all currently in-stock but expired products to a shopping list
- New endpoint `/stock/shoppinglist/add-overdue-products` to add all currently in stock but overdue products to a shopping list (thanks @m-byte)
- New endpoint `/stock/shoppinglist/add-expired-products` to add all currently in stock but expired products to a shopping list
- New endpoints GET/POST/PUT `/users/{userId}/permissions` for the new user permissions feature mentioned above
- New endpoint `/user` to get the currently authenticated user
- New endpoint DELETE `/user/settings/{settingKey}` to delete a user setting

View File

@@ -2,7 +2,7 @@
> ⚠️ PHP 8.0 (with SQLite 3.27.2+) is from now on the only supported runtime version.
### New feature: Grocycode / label printer support
### New Feature: Grocycode / label printer support
#### (Own) Product/stock entry/chores/batteries labels/barcodes
- Print own labels/barcodes for products/stock entries/chores/batteries and then scan that code on every place a product/stock entry/chore/battery can be selected
@@ -21,12 +21,12 @@
- https://github.com/grocy/grocy/tree/v3.1.0/docs/label-printing.md
- (Thanks a lot @mistressofjellyfish for the initial work on this)
### New feature: Meal plan sections
### New Feature: Meal plan sections
- Split the meal plan into sections like Breakfast/Lunch/Dinner
- => New button "Configure sections" on the meal plan page to configure the sections (top right corner)
- => Each meal plan entry can be assigned to a section
### New feature: Shopping list thermal printer support
### New Feature: Shopping list thermal printer support
- The shopping list can now be printed on a thermal printer
- The printer must be compatible to the `ESC/POS` protocol and needs to be locally attached or network reachable to/by the machine hosting Grocy (so the server)
- See the new `TPRINTER*` `config.php` options to configure the printer connection and other options
@@ -38,7 +38,7 @@
- Product barcodes are now enforced to be unique across products
- On the stock overview page it's now also possible to search/filter by product barcodes (via the general search field)
- The product picker on the consume and transfer page now only shows products which are currently in stock
- Added a filter option to only show currently in-stock products on the stock overview and products list (master data) page
- Added a filter option to only show currently in stock products on the stock overview and products list (master data) page
- Added new columns on the stock overview page (hidden by default): Product description, product default location, parent product, product picture
- Added a new product option "Should not be frozen" (defaults to disabled and only visible when `FEATURE_FLAG_STOCK_PRODUCT_FREEZING` is enabled)
- When enabled, on moving the product to a freezer location (so when freezing it), a corresponding warning will be shown
@@ -64,7 +64,7 @@
- Fixed the form validation on the shopping list item page (thanks @Forceu)
- Fixed that when adding products to the shopping list from the stock overview page, the used quantity unit was always the products default purchase QU (and not the selected one)
- Fixed that the displayed last unit/total price was wrong when the used quantity unit was not the products stock QU
- Fixed that the "Add as barcode to existing product" productpicker workflow did not work
- Fixed that the "Add as barcode to existing product" product picker workflow did not work
### Recipe improvements/fixes
- Recipe printing improvements (thanks @Ape)

View File

@@ -5,7 +5,7 @@
- When adding (purchase) a product with "Default due days after freezing" set directly to a freezer location, the due date is now prefilled by that (instead of the normal "Default due days") (thanks @grahamc for the initial work on this)
- Chores can now be merged (new item in the context-/more-menu on the chores list page)
- Fixed that "Label per unit" stock entry labels (on purchase) weren't unique per unit
- Fixed that the "Add as new product" productpicker workflow, started from the shopping list item form, always selected the default shopping list after finishing the flow
- Fixed that the "Add as new product" product picker workflow, started from the shopping list item form, always selected the default shopping list after finishing the flow
- Fixed that when undoing a product opened transaction and when the product has "Default due days after opened" set, the original due date wasn't restored
- Fixed that "Track date only"-chores were shown as overdue on the due day on the chores overview page
- Fixed that dropdown filters for tables maybe did not work after reordering columns

View File

@@ -1,4 +1,4 @@
### New feature: Notes and Userfields for stock entries
### New Feature: Notes and Userfields for stock entries
- Stock entries can now have notes
- For example to distinguish between same, yet different products (e.g. having only a generic product "Chocolate" and note in that field what special one it is exactly this time - as an alternative to have sub products)
@@ -10,7 +10,7 @@
- => Configure the desired Userfields for the entity `stock`
- => Those Userfields are then visible on the same places as mentioned above for the built-in "Note" field
### New feature: Recipes "Due score"
### New Feature: Recipes "Due score"
- A number (new column on the recipes page) which represents a score which is higher the more ingredients, of the corresponding recipe, currently in stock are due soon, overdue or already expired
- Or in other words: A score to see which recipes to cook to not waste already overdue/expired or due soon products
@@ -40,7 +40,7 @@
- => Instead the corresponding inverse conversion is now always created/updated/deleted automatically
- New product option "Disable own stock" (defaults to disabled)
- When enabled, the corresponding product can't have own stock, means it will not be selectable on purchase (useful for parent products which are just used as a summary/total view of the sub products)
- The location content sheet can now optionally list also out of stock products (at the products default location, new checkbox "Show only in-stock products" at the top of the page, defaults to enabled)
- The location content sheet can now optionally list also out of stock products (at the products default location, new checkbox "Show only in stock products" at the top of the page, defaults to enabled)
- Added a location filter to the stock entries page
- Added the product Grocycode as a (hidden by default) column to the products list (master data)
- The price entered on the inventory page is now related to the selected quantity unit (like on the purchase page, was always related to the products stock QU before)

View File

@@ -4,14 +4,16 @@
> _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
### New feature: Quantity unit conversions with unlimited hierarchy
### New Feature: Indirect quantity unit conversions with unlimited levels
- Quantity unit conversions now support transitive conversions, means the QU hierarchy has now unlimited levels (thanks a lot @esclear)
- Quantity unit conversions now support indirect conversions with unlimited levels (thanks a lot @esclear)
- _Explained by a practical example: When a conversion between Teaspoons and Milliliters and another one between Milliliters and Liters exists (and so forth; unlimited levels), Grocy can now calculate Teaspoons to Liters (before a direct conversion definition between Teaspoons and Liters was required)_
- **Heads up:** If you have such "each to each absolute conversion definitions" currently (for the example above the conversion between Teaspoons and Liters), you should clean them up, since they are no longer needed
- The product option "Factor purchase to stock quantity unit" was removed
- => Use normal product specific QU conversions instead, if needed
- An existing "Factor purchase to stock quantity unit" was automatically migrated to a product specific QU conversion
### New feature: Stock reports
### New Feature: Stock reports
- New button "Reports" on the stock overview page
- The first report (more to come) "Spendings" makes it possible to explore (pie chart and table data) the total value spend by product or product group in any time range
@@ -35,7 +37,7 @@
- This option will be automatically set on changing the entry's due date
- The product option "Quick consume amount" (the amount used for the "quick consume/open buttons" on the stock overview page) has been split into another option "Quick open amount", to be able to set different amounts for consume and open (defaults to the "Quick consume amount" per product, so no changed behavior when not configured)
- Changed that for the product's average and last price (and for the price history chart) stock transactions with an empty or `0` price are ignored
- Added a filter option to only show currently out-of-stock products on the products list (master data) page
- Added a filter option to only show currently out of stock products on the products list (master data) page
- When clicking a product name on the products list (master data) or on the stock journal page, the product card will now be displayed (like on the stock overview page)
- When using/scanning a product barcode and the purchase or inventory page, the barcode's note will now also be prefilled (if any)
- Each row on the stock journal now also has a context-/more menu for quick access to product related actions (the same as on the stock overview page)
@@ -43,7 +45,7 @@
- Fixed that hiding the "Purchased date" column (table options) on the stock entries page didn't work
- Fixed that sorting by the "Value" and "Min. stock amount" columns on the stock overview page didn't work
- Fixed that the consumed amount was wrong, when consuming multiple substituted subproducts at once and when multiple/different conversion factors were involved
- Fixed that for a product's average price, only currently in-stock items were considered, not already consumed ones
- Fixed that for a product's average price, only currently in stock items were considered, not already consumed ones
- Fixed that when copying a product, some fields (like "Default consume location" or "Disable own stock) weren't copied along
- Fixed that the total product count on the stock overview page also included products with "Never show on stock overview" enabled

View File

@@ -8,7 +8,7 @@
### Shopping list
- Changed that prices on the shopping list (table columns "Last price (Unit)" and "Last price (Total)") are now related to the there selected quantity unit (instead of to the product's QU stock as before)
- Changed that unit prices on the shopping list (table column "Last price (Unit)") are now related to the there selected quantity unit (instead of to the product's QU stock as before)
### Meal plan

View File

@@ -0,0 +1,13 @@
### Stock
- The stock report "Spendings" now also supports grouping by stores
- Fixed that the upgrade failed when having (a lot of) redundant ("each to each") default quantity unit conversion definitions (thanks a lot @alkuzman and @esclear)
- More on that by a practical example: When a conversion between Teaspoons and Milliliters and another one between Milliliters and Liters exists (and so forth; unlimited levels), Grocy can now (since v4.0.0) calculate the derived factor to convert Teaspoons to Liters on its own (before a direct conversion definition between Teaspoons and Liters was required)
- So you might have a lot of such "each to each absolute conversion definitions" currently, when you were affected by failed upgrades (timeout problems due to that resolving indirect conversion factors took very long)
- **Heads up:** This is now fixed, but you should clean up those redundant "each to each" definitions (in the example above the conversion between Teaspoons and Liters), since they are no longer needed
- Fixed that the "Mark this stock entry as open"-button on the stock entries page opened always one unit instead of the whole stock entry
- Fixed that edited stock entries were not considered in some cases (affecting the product's average price and the stock reports)
### Recipes
- Fixed that ingredient cost/energy values were wrong when unit conversions but _no_ product substitutions were involved

View File

@@ -0,0 +1,12 @@
### Stock
- Performance improvements related to the stock overview page / displaying a product card
- Performance improvements related to consuming products (thanks @alkuzman)
### Userfields
- New Userfield type "Number (currency)", just like the type "Number (decimal)", but it will render the value according to / with the configured currency
### General
- Performance improvements related to table (layout) loading handling

View File

@@ -0,0 +1,43 @@
> 💡 PHP 8.3 is from now on (additionally to PHP 8.2) supported.
>
> ⚠️ PHP 8.1 is no longer supported.
### Stock
- Fixed that the location dropdown on the consume page contained the same location multiple times if there are currently stock entries at multiple locations of the corresponding product
- Fixed that the status filter "_n_ products are overdue" on the stock overview page also counted/included stock entries due today or tomorrow
- Fixed that the stock report "Spendings" did not take products without an assigned product group into account (thanks @Torqu3Wr3nch for the initial work on this)
- Fixed that the success message after opening a stock entry on the stock entries page displayed always an amount of `1` instead of the actual amount opened
- Fixed that the "Consume this stock entry as spoiled" context menu action on the stock entries page consumed always an amount of `1` instead of the whole stock entry
### Recipes
- Fixed that copying recipes with special characters in the name was not possible
### Meal plan
- Fixed that the meal plan page was broken after deleting all meal plan items of a week
### Calendar
- The different event types (due products, chores, tasks and so on) can now have different colors
- => New button "Configure colors" on the calendar page to configure these colors (top right corner)
### Tasks
- Added a new table filter for categories (thanks @geoffwright240 for the initial work on this)
### Userfields
- Fixed that when having a userfield of type "Select list (multiple items can be selected)" and selecting no item, editing of the corresponding form was broken
### General
- Night mode is now also used on the login page if that's the system preferred color scheme (generally if night mode is on or not is based on user settings and before logging in no user context is available)
- Optimized sidebar icon spacing (thanks @chris-thorn)
- Fixed that file uploads (product pictures and so on) didn't work for files where the file name contains multiple spaces
- Fixed that some dialogs were not properly (too small) displayed (mostly affecting Firefox >= 121)
### API
- Optimized that the endpoints `GET /objects/{entity}` and `GET /objects/{entity}/{objectId}` now also return Userfields for the entity `stock`

View File

@@ -0,0 +1,26 @@
### Stock
- When using/scanning a stock entry Grocycode on the transfer page, the "Use specific stock item" dropdown (and "From location") is now also prefilled accordingly
- Fixed that for the product's last price stock transactions with an empty or `0` price weren't ignored
- Fixed that when copying a product, the field "Move on open" wasn't copied along
### Shopping list
- The shopping lists dropdown on the shopping list page now also shows the number of items on the corresponding shopping list
### Recipes
- Optimized that when creating a recipe, the desired serving amount is now initially prefilled by the recipe's base serving amount
### Batteries
- It's now possible to track any addtional info on a battery charge cycle by using Userfields (thanks @TheDodger)
- => Configure the desired Userfields for the entity `battery_charge_cycles`
- => The on a battery charge cycle tracking entered information is then visible on the corresponding battery charge cycle journal entry
### General
- Optimized that file uploads are no longer completely buffered in memory before writing them to disk (thanks @bbx0)
- Optimized top right corner menus icon spacing (thanks @TheDodger for the initial work on this)
- Fixed again that some dialogs were not properly (too small) displayed (this time mostly affecting Chrome/Edge)
- Fixed that table states (visible columns, sorting, column order and so on) could be reset to default after not accessing/using the corresponding page for a certain amount of time

View File

@@ -0,0 +1,28 @@
### Stock
- Optimized form validation (max amount checks) related to unit conversion with a lot of decimal places on the consume and transfer page
- Optimized that the stock report "Spendings" now excludes self produced products (thanks @danielr18 for the initial work on this)
- Fixed that when copying a product, the field "Treat opened as out of stock" wasn't copied along (thanks @TheDodger)
- Fixed that the product groups filter on the master data products page used a contains search instead of an exact search
- Fixed that Scan Mode on the purchase and consume page didn't work (not all fields were properly populated) when using/scanning a product Grocycode
### Shopping list
- Fixed that when printing a shoppping list, the table/list wasn't sorted (will now be sorted alphabetically by the product name of the corresponding list item)
- Fixed that when deleting a shopping list item and marking another one as done while not reloading the page in-between, the deleted item reappeared (was only a visual problem, there was no problem on deleting the item on the backend / in the database)
### Recipes
- When self producing a product ("Produces product" recipe option) the name of the recipe is now added to the note field of the created stock entry
- Fixed that when `FEATURE_FLAG_STOCK_STOCK` was set to `false`, the "Put missing products on shopping list"-button was not visible
- Fixed that scanning a product barcode on the recipe ingredient edit page didn't work
- Fixed that the recipe edit button on the recipes page gallery view didn't work
### Userfields
- Userentity tables (custom objects / lists) now also have the table options icon (top left corner eye icon, to e.g. add a grouping condition)
- Userfield names can now also contain underscores
### API
- Optimized that uploading files where the file name contains non-ASCII characters is now also possible

View File

@@ -0,0 +1,86 @@
### New Feature: External Barcode Lookups as a product picker workflow + a built-in Plugin for Open Food Facts
- Added a new product picker workflow "External barcode lookup"
- This executes the configured barcode lookup plugin with the given barcode
- If the lookup was successful, the product edit page of the created product is displayed where the product setup can be completed (if required)
- After that, the transaction is continued with that product as usual
- A plugin for [Open Food Facts](https://world.openfoodfacts.org/) is now included and used by default (see the `config.php` option `STOCK_BARCODE_LOOKUP_PLUGIN` and maybe change it as needed)
- The product name and image (and of course the barcode itself) are taken over from Open Food Facts to the product being looked up
- => Quick video demo (using a Barcode Laser Scanner): https://www.youtube.com/watch?v=-moXPA-VvGc
- => Quick video demo (using Browser Camera Barcode Scanning): https://www.youtube.com/watch?v=veezFX4X1JU
### Stock
- Added a new stock setting (top right corner settings menu) "Show all out of stock products" to optionally also show all out of stock products on the stock overview page (defaults to disabled, so no changed behavior when not configured)
- By default the stock overview page lists all products which are currently in stock or below their min. stock amount
- When this new setting is enabled, all (active) products are always shown
- Added a new product option "Can't be opened"
- When enabled the product open functionality for that product is disabled
- Defaults to disabled, so no changed behavior when not configured
- Added a new product option "Default purchase price type"
- Can be used to set the default price type (Unit price / Total price) on the purchase page per product
- Previously "Unit price" was the default on purchase and the selection was not saved and not reset when selecting another product, means the price type selection was retained when doing multiple purchase transactions in one go
- The default for the new product option is "Unspecified" which keeps the previous behavior
- When products are automatically added to the shopping list (e.g. by the "below defined min. stock amount"-functionality or when adding missing recipe ingredients) the product's "Default quantity unit purchase" is now used (instead of the product's "Quantity unit stock")
- Product barcode matching is now case-insensitive
- Added a new column "Product picture" on the products list (master data) page (hidden by default)
- Optimized that when navigation between the different "Group by"-variants on the stock report "Spendings", the selected date range now remains persistent
- Added a new "Presets for new products" stock setting for the "Default stock entry label" option of new products
- Added a trendline to the price history chart (product card)
- Added a "Add to shopping list"-button on the product card
- Optimized that when moving a product to a freezer location (so when freezing it) the due date will no longer be replaced when the product option "Default due days after freezing" is set to `0`
- The "Decimal places allowed" stock settings now have an upper limit of 10 (since such a high number makes not so much sense in reality and causes form validation problems)
- Fixed that a once set quantity unit on a product barcode could not be removed on edit
- Fixed that when consuming a specific stock entry which is opened, and which originated from a before partly opened stock entry, the unopened one was wrongly consumed instead
### Shopping list
- Added a new shopping list setting (top right corner settings menu) "Round up quantity amounts to the nearest whole number"
- When enabled, all quantity amounts on the shopping list are always displayed rounded up to the nearest whole number
- Defaults to disabled, so no changed behavior when not configured
### Recipes
- Consuming a recipe is now also possible when not all needed ingredients are currently in stock (the in stock amount, if any, of the corresponding ingredient will be consumed in that case)
- For in stock ingredients, the amount actually in stock is now displayed next to the hint "Enough in stock"
- Added a new recipe ingredient option "Round up quantity amounts to the nearest whole number"
- When enabled, resulting quantity amounts (after scaling according the desired serving amount) are always rounded up to the nearest whole number
- Defaults to disabled, so no changed behavior when not configured
- Optimizations/changes when adding missing recipe ingredients to the shopping list:
- When the ingredient option "Only check if any amount is in stock" is enabled and when no corresponding unit conversion exists, the amount/unit is now taken "as is" (as defined in the recipe ingredient) into the created shopping list item
- The shopping list item no longer gets a note "Added for recipe" set and the ingredient note is no longer appended
- When the corresponding product is already on the shopping list, the amount of the existing item is incremented instead of creating a new shopping list item
- When a new shopping list item is created, the product's "Default quantity unit purchase" is now used (instead of the product's "Quantity unit stock")
- When no price information is available for at least one ingredient, a red exclamation mark is now displayed next to the recipe total cost information
- When clicking a recipe ingredient / product name, the product card will now be opened like on many other places throughout Grocy
- Fixed that calories/costs of recipe ingredients were wrong when the ingredient option "Only check if any amount is in stock" was set and the on the ingredient used quantity unit was different from the product's QU stock
- Fixed that multi-nested recipes (at least 3 levels of "included recipes") resulted in wrong amounts/costs/calories calculated for the ingredients originating in those nested recipes (also affected the meal plan)
### Meal plan
- Fixed that amounts/costs/calories were wrong for recipes which had at least 2 levels of "included recipes"
### Chores
- Added a possibility to see if a scheduled chore was tracked/done on time or not:
- When tracking chores, the "Next estimated tracking date" (so the current scheduled time) is now also stored in the corresponding chore journal entry and displayed in a new column "Scheduled tracking time" on the chores journal page
- When the "Tracked time" is later than the "Scheduled tracking time", the corresponding chore journal entry is now highlighted in red on the chores journal page
- Added a new column "Time of tracking" on the chores journal page (displays the time when the tracking actually happened, hidden by default)
- Added a new option "Swap track next schedule / track now buttons" (chores settings / top right corner settings menu) to swap the "Track next chore schedule" / "Track chore execution now" buttons/menu items on the chores overview page (defaults to disabled, so no changed behavior when not configured)
### Userfields
- Optimized Userfields of type "Checkbox"
- When it's a mandatory Userfield, the initial state of the corresponding checkbox is now indeterminate, means it's now also possible to actively not check it (previously mandatory meant the checkbox has to be set)
- Fixed that Userfield default values were not initialized for the `stock` entity (so affecting the purchase and inventory page)
- Fixed that uploading bigger or multiple files (so when the upload usually takes a little longer) didn't work (Userfield type "File")
### General
- Optimized nested modal dialogs:
- Nested dialogs are now no longer displayed "in each other" and instead "on top of each other"
- Dialogs can now be closed with the `ESC` key on the keyboard
- There is no longer a close button at the bottom (outside of the displayed `iframe`) and instead one at the top right corner of the dialog
- Wide dialogs (e.g. all showing a table, like showing stock entries of a product from the stock overview more/context menu per line) now use the full screen width
- Improved the handling of the initial field focus on form pages
- The previously manually necessary update steps (e.g. emptying the `data/viewcache` directory) are now fully automated, so no need to do this manually after this and future updates

View File

@@ -0,0 +1,21 @@
### Stock
- Fixed that the built-in Open Food Facts external barcode lookup plugin used the staging environment of the Open Food Facts API instead of the production one
- Fixed that the product group filter on the products page (master data) didn't work when the selected product group contained special characters
- Fixed that the product filter on the stock journal summary page didn't work when the selected product contained special characters
### Shopping list
- Optimized that non-number amounts are now prevented on database level (was infamously a problem when using specific community contributed alternative clients)
### Tasks
- Fixed that set table filters were not applied after editing or adding a task
### Userfields
- Fixed that saving Userfields of type "Select list (multiple items can be selected)" did not work
### General
- Optimized that when navigating between form input fields via the keyboard (`TAB`) there was an unwanted delay at some places

View File

@@ -0,0 +1,28 @@
### Stock
- Optimized that the built-in Open Food Facts external barcode lookup plugin now uses the localized product name (if provided by the Open Food Facts API, based on the set Grocy language of the current user)
- Fixed that the product filter on the stock entires page didn't work when the product column was reordered / not the second one
### Shopping list
- When the shopping list setting (top right corner settings menu) "Round up quantity amounts to the nearest whole number" is enabled, the "Last price (Total)" of each shopping list item and the total value of the shopping list are now also scaled up accordingly
- The print options (show header, layout type etc.) are now saved (as user settings, so global defaults can also defined in `config.php` as usual)
### Userfields
- Fixed that saving Userfields of type "Link (with title)" did not work
### General
- Fixed that most dialogs didn't work when hosting Grocy "embedded" in an `iframe` (affecting e.g. the [Home Assistant Add-on](https://github.com/hassio-addons/addon-grocy))
### API
- Exposed the `permission_hierarchy` entity (read only, => `GET /objects/permission_hierarchy`) to provide a permission name / id mapping
### Other
- A quick reminder about official native Grocy app experiences:
- Grocy's web frontend is responsive and an "installable web app" ([PWA](https://en.wikipedia.org/wiki/Progressive_web_app), without providing any offline usage capabilities), that provides a pretty native mobile app-like experience without the need for additional tools
- => Quick video demo on Android/Firefox: https://www.youtube.com/watch?v=L38drVZfwHs
- => Quick video demo on Android/Chrome: https://www.youtube.com/watch?v=rjLdXUFDNuk
- [Grocy Desktop](https://github.com/grocy/grocy-desktop) is a way to run Grocy without having to manage a webserver, just like a normal (Windows) desktop application - available as a [classic `.msi` installation package](https://releases.grocy.info/latest-desktop) or as a [Microsoft Store App](https://apps.microsoft.com/detail/9NWB1TRNNKSF)

View File

@@ -0,0 +1,16 @@
### Stock
- Optimizations in the built-in Open Food Facts external barcode lookup plugin:
- A provided but empty localized product name is now ignored
- Non-ASCII characters in product names are now ignored (e.g. line breaks caused problems)
- Optimized that when an external barcode lookup plugin returned an image URL with query parameters, an invalid picture (file name) was added to the created product
- Added a new column "Default store" on the stock overview page (hidden by default)
### General
- Optimized that the default font of the web frontend is now also used for non-latin characters
- Label printer WebHooks now include a new property/field `details` (that's the full product/chore/battery/etc. object)
- And also `stock_entry` (containing the full stock entry object) when printing a stock entry label
- The component used (so far [Quagga2](https://github.com/ericblade/quagga2)) that powers the camera barcode scanner was replaced by [ZXing](https://github.com/zxing-js/library) which should perform overall better and it also supports 2D barcodes (QRCode/DataMatrix) (thanks @gergof)
- New translations: (thanks all the translators)
- Bulgarian (demo available at <https://bg.demo.grocy.info>)

View File

@@ -0,0 +1,61 @@
> ⚠️ xxxBREAKING CHANGESxxx
> ❗ xxxImportant upgrade informationXXX
> 💡 xxxMinor upgrade informationXXX
### New Feature: xxxx
- xxx
### Stock
- Optimized the line plot markers color of the price history chart (product card) (thanks @DeepCoreSystem)
- Fixed that German Umlauts were removed from product names when looking up a barcode via the built-in Open Food Facts external barcode lookup plugin
- Fixed that when using/scanning a barcode on the purchase page with a note attached (which prefills the note field) and when manually selecting another product afterwards, the note of the previously used barcode was incorrectly prefilled again
- Fixed that the "next input focus handling" (jumping to the next input after entering a value) didn't work at some places (e.g. after entering a purchased date on the purchase page)
### Shopping list
- An amount of `0` is now allowed for shopping list items (just a convenience optimization, it was already possible to leave the amount field empty which implicitly resulted in an amount of `0`)
- Fixed that the "Add all list items to stock" workflow closed the dialog after every item instead only after the last one was added
### Recipes
- xxx
### Meal plan
- xxx
### Chores
- xxx
### Calendar
- xxx
### Tasks
- xxx
### Batteries
- xxx
### Equipment
- xxx
### Userfields
- xxx
### General
- Fixed that the date input shorthand `[+/-]n[d/m/y]` didn't work when the value lenght was >= 4 (e.g. `+10d`)
### API
- xxx

View File

@@ -4,7 +4,7 @@
> 💡 xxxMinor upgrade informationXXX
### New feature: xxxx
### New Feature: xxxx
- xxx

View File

@@ -1,29 +1,25 @@
{
"require": {
"php": ">=8.1",
"php": ">=8.2",
"slim/slim": "^4.0",
"slim/psr7": "^1.0",
"slim/http": "^1.0",
"php-di/php-di": "^7.0.3",
"berrnd/slim-blade-view": "^1.0.0",
"morris/lessql": "dev-php82",
"gettext/gettext": "dev-php81",
"gettext/gettext": "^4.8.10",
"eluceo/ical": "^2.2.0",
"erusev/parsedown": "^1.7",
"gumlet/php-image-resize": "^2.0",
"ezyang/htmlpurifier": "^4.13",
"interficieis/php-barcode": "^2.0.2",
"guzzlehttp/guzzle": "^7.0",
"mike42/escpos-php": "^3.0"
"mike42/escpos-php": "^4.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/berrnd/lessql"
},
{
"type": "vcs",
"url": "https://github.com/berrnd/Gettext"
}
],
"autoload": {

1318
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -64,9 +64,10 @@ Setting('BASE_PATH', '');
Setting('BASE_URL', '/');
// The plugin to use for external barcode lookups,
// must be the filename (folder /data/plugins) without the .php extension,
// see /data/plugins/DemoBarcodeLookupPlugin.php for an example implementation
Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'DemoBarcodeLookupPlugin');
// must be the filename (folder "/plugins" for built-in plugins or "/data/plugins" for user plugins) without the .php extension,
// see /plugins/DemoBarcodeLookupPlugin.php for a commented example implementation
// Leave empty to disable external barcode lookups
Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'OpenFoodFactsBarcodeLookupPlugin');
// If, however, your webserver does not support URL rewriting, set this to true
Setting('DISABLE_URL_REWRITING', false);
@@ -102,14 +103,14 @@ Setting('LDAP_UID_ATTR', ''); // Windows AD: "sAMAccountName", OpenLDAP: "uid",
Setting('DEFAULT_PERMISSIONS', ['ADMIN']);
// "1D" (=> Code128) or "2D" (=> DataMatrix)
Setting('GROCYCODE_TYPE', '1D');
Setting('GROCYCODE_TYPE', '2D');
// Label printer settings
Setting('LABEL_PRINTER_WEBHOOK', ''); // The URI that Grocy will POST to when asked to print a label
Setting('LABEL_PRINTER_RUN_SERVER', true); // Whether the webhook will be called server- or client-side
Setting('LABEL_PRINTER_PARAMS', ['font_family' => 'Source Sans Pro (Regular)']); // Additional parameters supplied to the webhook
Setting('LABEL_PRINTER_HOOK_JSON', false); // TRUE to use JSON or FALSE to use normal POST request variables
Setting('LABEL_PRINTER_HOOK_JSON', true); // TRUE to use JSON or FALSE to use normal POST request variables
// Thermal printer options
@@ -179,6 +180,7 @@ DefaultUserSetting('product_presets_product_group_id', -1); // Default product g
DefaultUserSetting('product_presets_qu_id', -1); // Default quantity unit id for new products (-1 means no quantity unit is preset)
DefaultUserSetting('product_presets_default_due_days', 0); // Default due days for new products (-1 means that the product will be never overdue)
DefaultUserSetting('product_presets_treat_opened_as_out_of_stock', true); // Default "Treat opened as out of stock" option for new products
DefaultUserSetting('product_presets_default_stock_label_type', 0); // "Default stock entry label" option for new products (0 = No label, 1 = Single Label, 2 = Label per unit)
DefaultUserSetting('stock_decimal_places_amounts', 4); // Default decimal places allowed for amounts
DefaultUserSetting('stock_decimal_places_prices_input', 2); // Default decimal places allowed for prices (input)
DefaultUserSetting('stock_decimal_places_prices_display', 2); // Default decimal places allowed for prices (display)
@@ -190,14 +192,19 @@ DefaultUserSetting('stock_default_consume_amount_use_quick_consume_amount', fals
DefaultUserSetting('scan_mode_consume_enabled', false); // If scan mode on the consume page is enabled
DefaultUserSetting('scan_mode_purchase_enabled', false); // If scan mode on the purchase page is enabled
DefaultUserSetting('show_icon_on_stock_overview_page_when_product_is_on_shopping_list', true); // When enabled, an icon is shown on the stock overview page (next to the product name) when the prodcut is currently on a shopping list
DefaultUserSetting('stock_overview_show_all_out_of_stock_products', false); // By default the stock overview page lists all products which are currently in stock or below their min. stock amount - when this is enabled, all (active) products are always shown
DefaultUserSetting('show_purchased_date_on_purchase', false); // Whether the purchased date should be editable on purchase (defaults to today otherwise)
DefaultUserSetting('show_warning_on_purchase_when_due_date_is_earlier_than_next', true); // Show a warning on purchase when the due date of the purchased product is earlier than the next due date in stock
// Shopping list settings
DefaultUserSetting('shopping_list_to_stock_workflow_auto_submit_when_prefilled', false); // Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default due days" set
DefaultUserSetting('shopping_list_show_calendar', false); // When enabled, a small (month view) calendar will be shown on the shopping list page
DefaultUserSetting('shopping_list_round_up', false); // When enabled, all quantity amounts on the shopping list are always displayed rounded up to the nearest whole number
DefaultUserSetting('shopping_list_auto_add_below_min_stock_amount', false); // If products should be automatically added to the shopping list when they are below their min. stock amount
DefaultUserSetting('shopping_list_auto_add_below_min_stock_amount_list_id', 1); // When the above setting is enabled, the id of the shopping list to which the products will be added
DefaultUserSetting('shopping_list_print_show_header', true); // Default for the shopping list print option "Show header"
DefaultUserSetting('shopping_list_print_group_by_product_group', true); // Default for the shopping list print option "Group by product group"
DefaultUserSetting('shopping_list_print_layout_type', 'table'); // Default for the shopping list print option "Layout type" (table or list)
// Recipe settings
DefaultUserSetting('recipe_ingredients_group_by_product_group', false); // Group recipe ingredients by their product group
@@ -206,6 +213,7 @@ DefaultUserSetting('recipes_show_ingredient_checkbox', false); // When enabled,
// Chores settings
DefaultUserSetting('chores_due_soon_days', 5); // The "due soon" days
DefaultUserSetting('chores_overview_swap_tracking_buttons', false); // When enabled, the "Track next chore schedule" and "Track chore execution now" buttons/menu items are swapped
// Batteries settings
DefaultUserSetting('batteries_due_soon_days', 5); // The "due soon" days
@@ -213,11 +221,9 @@ DefaultUserSetting('batteries_due_soon_days', 5); // The "due soon" days
// Tasks settings
DefaultUserSetting('tasks_due_soon_days', 5); // The "due soon" days
// Component configuration for Quagga2 - read https://github.com/ericblade/quagga2#configobject for details
// Below is a generic good configuration,
// for an iPhone 7 Plus, halfsample = true, patchsize = small, frequency = 5 yields very good results
DefaultUserSetting('quagga2_numofworkers', 4);
DefaultUserSetting('quagga2_halfsample', false);
DefaultUserSetting('quagga2_patchsize', 'medium');
DefaultUserSetting('quagga2_frequency', 10);
DefaultUserSetting('quagga2_debug', true);
// Calendar settings
DefaultUserSetting('calendar_color_products', '#007bff'); // The event color (hex code) for due products
DefaultUserSetting('calendar_color_tasks', '#28a745'); // The event color (hex code) for due tasks
DefaultUserSetting('calendar_color_chores', '#ffc107'); // The event color (hex code) for due chores
DefaultUserSetting('calendar_color_batteries', '#17a2b8'); // The event color (hex code) for due battery charge cycles
DefaultUserSetting('calendar_color_meal_plan', '#6c757d'); // The event color (hex code) for meal plan items

View File

@@ -4,6 +4,7 @@ namespace Grocy\Controllers;
use LessQL\Result;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Exception\HttpException;
class BaseApiController extends BaseController
{
@@ -149,4 +150,47 @@ class BaseApiController extends BaseController
return $this->OpenApiSpec;
}
private static $htmlPurifierInstance = null;
protected function GetParsedAndFilteredRequestBody($request)
{
if ($request->getHeaderLine('Content-Type') != 'application/json')
{
throw new HttpException($request, 'Bad Content-Type', 400);
}
if (self::$htmlPurifierInstance == null)
{
$htmlPurifierConfig = \HTMLPurifier_Config::createDefault();
$htmlPurifierConfig->set('Cache.SerializerPath', GROCY_DATAPATH . '/viewcache');
$htmlPurifierConfig->set('HTML.Allowed', 'div,b,strong,i,em,u,a[href|title|target],iframe[src|width|height|frameborder],ul,ol,li,p[style],br,span[style],img[style|width|height|alt|src],table[border|width|style],tbody,tr,td,th,blockquote,*[style|class|id],h1,h2,h3,h4,h5,h6');
$htmlPurifierConfig->set('Attr.EnableID', true);
$htmlPurifierConfig->set('HTML.SafeIframe', true);
$htmlPurifierConfig->set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align,width,height');
$htmlPurifierConfig->set('URI.AllowedSchemes', ['data' => true, 'http' => true, 'https' => true]);
$htmlPurifierConfig->set('URI.SafeIframeRegexp', '%^.*%'); // Allow any iframe source
$htmlPurifierConfig->set('CSS.MaxImgLength', null);
self::$htmlPurifierInstance = new \HTMLPurifier($htmlPurifierConfig);
}
$requestBody = $request->getParsedBody();
foreach ($requestBody as $key => &$value)
{
// HTMLPurifier removes boolean values (true/false) and arrays, so explicitly keep them
// Maybe also possible through HTMLPurifier config (http://htmlpurifier.org/live/configdoc/plain.html)
if (!is_bool($value) && !is_array($value))
{
$value = self::$htmlPurifierInstance->purify($value);
// Allow some special chars
// Maybe also possible through HTMLPurifier config (http://htmlpurifier.org/live/configdoc/plain.html)
$value = str_replace('&amp;', '&', $value);
$value = str_replace('&gt;', '>', $value);
$value = str_replace('&lt;', '<', $value);
}
}
return $requestBody;
}
}

View File

@@ -29,7 +29,7 @@ class BaseController
}
protected $AppContainer;
private $View;
protected $View;
protected function getApiKeyService()
{
@@ -208,43 +208,4 @@ class BaseController
return $this->render($response, $viewName, $data);
}
private static $htmlPurifierInstance = null;
protected function GetParsedAndFilteredRequestBody($request)
{
if (self::$htmlPurifierInstance == null)
{
$htmlPurifierConfig = \HTMLPurifier_Config::createDefault();
$htmlPurifierConfig->set('Cache.SerializerPath', GROCY_DATAPATH . '/viewcache');
$htmlPurifierConfig->set('HTML.Allowed', 'div,b,strong,i,em,u,a[href|title|target],iframe[src|width|height|frameborder],ul,ol,li,p[style],br,span[style],img[style|width|height|alt|src],table[border|width|style],tbody,tr,td,th,blockquote,*[style|class|id],h1,h2,h3,h4,h5,h6');
$htmlPurifierConfig->set('Attr.EnableID', true);
$htmlPurifierConfig->set('HTML.SafeIframe', true);
$htmlPurifierConfig->set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align,width,height');
$htmlPurifierConfig->set('URI.AllowedSchemes', ['data' => true, 'http' => true, 'https' => true]);
$htmlPurifierConfig->set('URI.SafeIframeRegexp', '%^.*%'); // Allow any iframe source
$htmlPurifierConfig->set('CSS.MaxImgLength', null);
self::$htmlPurifierInstance = new \HTMLPurifier($htmlPurifierConfig);
}
$requestBody = $request->getParsedBody();
foreach ($requestBody as $key => &$value)
{
// HTMLPurifier removes boolean values (true/false) and arrays, so explicitly keep them
// Maybe also possible through HTMLPurifier config (http://htmlpurifier.org/live/configdoc/plain.html)
if (!is_bool($value) && !is_array($value))
{
$value = self::$htmlPurifierInstance->purify($value);
// Allow some special chars
// Maybe also possible through HTMLPurifier config (http://htmlpurifier.org/live/configdoc/plain.html)
$value = str_replace('&amp;', '&', $value);
$value = str_replace('&gt;', '>', $value);
$value = str_replace('&lt;', '<', $value);
}
}
return $requestBody;
}
}

View File

@@ -69,11 +69,12 @@ class BatteriesApiController extends BaseApiController
{
try
{
$battery = $this->getDatabase()->batteries()->where('id', $args['batteryId'])->fetch();
$batteryDetails = (object)$this->getBatteriesService()->GetBatteryDetails($args['batteryId']);
$webhookData = array_merge([
'battery' => $battery->name,
'battery' => $batteryDetails->battery->name,
'grocycode' => (string)(new Grocycode(Grocycode::BATTERY, $args['batteryId'])),
'details' => $batteryDetails,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_LABEL_PRINTER_RUN_SERVER)

View File

@@ -73,7 +73,9 @@ class BatteriesController extends BaseController
return $this->renderPage($response, 'batteriesjournal', [
'chargeCycles' => $this->getDatabase()->battery_charge_cycles()->where($where)->orderBy('tracked_time', 'DESC'),
'batteries' => $this->getDatabase()->batteries()->where('active = 1')->orderBy('name', 'COLLATE NOCASE')
'batteries' => $this->getDatabase()->batteries()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'userfields' => $this->getUserfieldsService()->GetFields('battery_charge_cycles'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('battery_charge_cycles')
]);
}
@@ -115,7 +117,8 @@ class BatteriesController extends BaseController
public function TrackChargeCycle(Request $request, Response $response, array $args)
{
return $this->renderPage($response, 'batterytracking', [
'batteries' => $this->getDatabase()->batteries()->where('active = 1')->orderBy('name', 'COLLATE NOCASE')
'batteries' => $this->getDatabase()->batteries()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'userfields' => $this->getUserfieldsService()->GetFields('battery_charge_cycles')
]);
}

View File

@@ -120,11 +120,12 @@ class ChoresApiController extends BaseApiController
{
try
{
$chore = $this->getDatabase()->chores()->where('id', $args['choreId'])->fetch();
$choreDetails = (object)$this->getChoresService()->GetChoreDetails($args['choreId']);
$webhookData = array_merge([
'chore' => $chore->name,
'chore' => $choreDetails->chore->name,
'grocycode' => (string)(new Grocycode(Grocycode::CHORE, $args['choreId'])),
'details' => $choreDetails,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_LABEL_PRINTER_RUN_SERVER)

View File

@@ -109,9 +109,27 @@ class FilesApiController extends BaseApiController
}
$fileName = $this->checkFileName($args['fileName']);
$data = $request->getBody()->getContents();
file_put_contents($this->getFilesService()->GetFilePath($args['group'], $fileName), $data);
$fileHandle = fopen($this->getFilesService()->GetFilePath($args['group'], $fileName), 'xb');
if($fileHandle === false)
{
throw new \Exception("Error while creating file $fileName");
}
// Save the file to disk in chunks of 1 MB
$requestBody = $request->getBody();
while ($data = $requestBody->read(1048576))
{
if (fwrite($fileHandle, $data) === false)
{
throw new \Exception("Error while writing file $fileName");
}
}
if (fclose($fileHandle) === false)
{
throw new \Exception("Error while closing file $fileName");
}
return $this->EmptyApiResponse($response);
}

View File

@@ -190,28 +190,31 @@ class GenericEntityApiController extends BaseApiController
public function GetObject(Request $request, Response $response, array $args)
{
if ($this->IsValidExposedEntity($args['entity']) && !$this->IsEntityWithNoListing($args['entity']))
{
$userfields = $this->getUserfieldsService()->GetValues($args['entity'], $args['objectId']);
if (count($userfields) === 0)
{
$userfields = null;
}
$object = $this->getDatabase()->{$args['entity']}($args['objectId']);
if ($object == null)
{
return $this->GenericErrorResponse($response, 'Object not found', 404);
}
$object['userfields'] = $userfields;
return $this->ApiResponse($response, $object);
}
else
if (!$this->IsValidExposedEntity($args['entity']) || $this->IsEntityWithNoListing($args['entity']))
{
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
}
$object = $this->getDatabase()->{$args['entity']}($args['objectId']);
if ($object == null)
{
return $this->GenericErrorResponse($response, 'Object not found', 404);
}
// TODO: Handle this somehow more generically
$referencingId = $args['objectId'];
if ($args['entity'] == 'stock')
{
$referencingId = $object->stock_id;
}
$userfields = $this->getUserfieldsService()->GetValues($args['entity'], $referencingId);
if (count($userfields) === 0)
{
$userfields = null;
}
$object['userfields'] = $userfields;
return $this->ApiResponse($response, $object);
}
public function GetObjects(Request $request, Response $response, array $args)
@@ -222,8 +225,8 @@ class GenericEntityApiController extends BaseApiController
}
$objects = $this->queryData($this->getDatabase()->{$args['entity']}(), $request->getQueryParams());
$userfields = $this->getUserfieldsService()->GetFields($args['entity']);
$userfields = $this->getUserfieldsService()->GetFields($args['entity']);
if (count($userfields) > 0)
{
$allUserfieldValues = $this->getUserfieldsService()->GetAllValues($args['entity']);
@@ -233,7 +236,14 @@ class GenericEntityApiController extends BaseApiController
$userfieldKeyValuePairs = null;
foreach ($userfields as $userfield)
{
$value = FindObjectInArrayByPropertyValue(FindAllObjectsInArrayByPropertyValue($allUserfieldValues, 'object_id', $object->id), 'name', $userfield->name);
// TODO: Handle this somehow more generically
$userfieldReference = 'id';
if ($args['entity'] == 'stock')
{
$userfieldReference = 'stock_id';
}
$value = FindObjectInArrayByPropertyValue(FindAllObjectsInArrayByPropertyValue($allUserfieldValues, 'object_id', $object->{$userfieldReference}), 'name', $userfield->name);
if ($value)
{
$userfieldKeyValuePairs[$userfield->name] = $value->value;

View File

@@ -22,7 +22,7 @@ class LoginController extends BaseController
public function ProcessLogin(Request $request, Response $response, array $args)
{
$authMiddlewareClass = GROCY_AUTH_CLASS;
if ($authMiddlewareClass::ProcessLogin($this->GetParsedAndFilteredRequestBody($request)))
if ($authMiddlewareClass::ProcessLogin($request->getParsedBody()))
{
return $response->withRedirect($this->AppContainer->get('UrlManager')->ConstructUrl('/'));
}

View File

@@ -90,6 +90,7 @@ class RecipesApiController extends BaseApiController
$webhookData = array_merge([
'recipe' => $recipe->name,
'grocycode' => (string)(new Grocycode(Grocycode::RECIPE, $args['recipeId'])),
'details' => $recipe
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_LABEL_PRINTER_RUN_SERVER)

View File

@@ -57,17 +57,24 @@ class RecipesController extends BaseController
];
}
$weekRecipe = $this->getDatabase()->recipes()->where("type = 'mealplan-week' AND name = LTRIM(STRFTIME('%Y-%W', DATE('$start')), '0')")->fetch();
$weekRecipeId = 0;
if ($weekRecipe != null)
{
$weekRecipeId = $weekRecipe->id;
}
return $this->renderPage($response, 'mealplan', [
'fullcalendarEventSources' => $events,
'recipes' => $recipes,
'internalRecipes' => $this->getDatabase()->recipes()->where("id IN (SELECT recipe_id FROM meal_plan_internal_recipe_relation WHERE $mealPlanWhereTimespan)")->fetchAll(),
'recipesResolved' => $this->getRecipesService()->GetRecipesResolved("recipe_id IN (SELECT recipe_id FROM meal_plan_internal_recipe_relation WHERE $mealPlanWhereTimespan)"),
'internalRecipes' => $this->getDatabase()->recipes()->where("id IN (SELECT recipe_id FROM meal_plan_internal_recipe_relation WHERE $mealPlanWhereTimespan) OR id = $weekRecipeId")->fetchAll(),
'recipesResolved' => $this->getRecipesService()->GetRecipesResolved("recipe_id IN (SELECT recipe_id FROM meal_plan_internal_recipe_relation WHERE $mealPlanWhereTimespan) OR recipe_id = $weekRecipeId"),
'products' => $this->getDatabase()->products()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'mealplanSections' => $this->getDatabase()->meal_plan_sections()->orderBy('sort_number'),
'usedMealplanSections' => $this->getDatabase()->meal_plan_sections()->where("id IN (SELECT section_id FROM meal_plan WHERE $mealPlanWhereTimespan)")->orderBy('sort_number'),
'weekRecipe' => $this->getDatabase()->recipes()->where("type = 'mealplan-week' AND name = LTRIM(STRFTIME('%Y-%W', DATE('$start')), '0')")->fetch()
'weekRecipe' => $weekRecipe
]);
}
@@ -175,6 +182,7 @@ class RecipesController extends BaseController
'recipe' => $this->getDatabase()->recipes($args['recipeId']),
'recipePos' => new \stdClass(),
'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'barcodes' => $this->getDatabase()->product_barcodes_comma_separated(),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
@@ -186,6 +194,7 @@ class RecipesController extends BaseController
'recipe' => $this->getDatabase()->recipes($args['recipeId']),
'recipePos' => $this->getDatabase()->recipes_pos($args['recipePosId']),
'products' => $this->getDatabase()->products()->orderBy('name', 'COLLATE NOCASE'),
'barcodes' => $this->getDatabase()->product_barcodes_comma_separated(),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);

View File

@@ -442,7 +442,6 @@ class StockApiController extends BaseApiController
try
{
$addFoundProduct = false;
if (isset($request->getQueryParams()['add']) && ($request->getQueryParams()['add'] === 'true' || $request->getQueryParams()['add'] === 1))
{
$addFoundProduct = true;
@@ -673,11 +672,12 @@ class StockApiController extends BaseApiController
{
try
{
$product = $this->getDatabase()->products()->where('id', $args['productId'])->fetch();
$productDetails = (object)$this->getStockService()->GetProductDetails($args['productId']);
$webhookData = array_merge([
'product' => $product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $product->id)),
'product' => $productDetails->product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $productDetails->product->id)),
'details' => $productDetails,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_LABEL_PRINTER_RUN_SERVER)
@@ -698,11 +698,13 @@ class StockApiController extends BaseApiController
try
{
$stockEntry = $this->getDatabase()->stock()->where('id', $args['entryId'])->fetch();
$product = $this->getDatabase()->products()->where('id', $stockEntry->product_id)->fetch();
$productDetails = (object)$this->getStockService()->GetProductDetails($stockEntry->product_id);
$webhookData = array_merge([
'product' => $product->name,
'product' => $productDetails->product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $stockEntry->product_id, [$stockEntry->stock_id])),
'details' => $productDetails,
'stock_entry' => $stockEntry,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING)

View File

@@ -4,6 +4,7 @@ namespace Grocy\Controllers;
use Grocy\Helpers\Grocycode;
use Grocy\Services\RecipesService;
use DI\Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@@ -11,6 +12,24 @@ class StockController extends BaseController
{
use GrocycodeTrait;
public function __construct(Container $container)
{
parent::__construct($container);
try
{
$externalBarcodeLookupPluginName = $this->getStockService()->GetExternalBarcodeLookupPluginName();
}
catch (\Exception)
{
$externalBarcodeLookupPluginName = '';
}
finally
{
$this->View->set('ExternalBarcodeLookupPluginName', $externalBarcodeLookupPluginName);
}
}
public function Consume(Request $request, Response $response, array $args)
{
return $this->renderPage($response, 'consume', [
@@ -118,10 +137,17 @@ class StockController extends BaseController
public function Overview(Request $request, Response $response, array $args)
{
$usersService = $this->getUsersService();
$nextXDays = $usersService->GetUserSettings(GROCY_USER_ID)['stock_due_soon_days'];
$userSettings = $usersService->GetUserSettings(GROCY_USER_ID);
$nextXDays = $userSettings['stock_due_soon_days'];
$where = 'is_in_stock_or_below_min_stock = 1';
if (boolval($userSettings['stock_overview_show_all_out_of_stock_products']))
{
$where = '1=1';
}
return $this->renderPage($response, 'stockoverview', [
'currentStock' => $this->getStockService()->GetCurrentStockOverview(),
'currentStock' => $this->getDatabase()->uihelper_stock_current_overview()->where($where),
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'currentStockLocations' => $this->getStockService()->GetCurrentStockLocations(),
'nextXDays' => $nextXDays,
@@ -393,11 +419,11 @@ class StockController extends BaseController
}
return $this->renderPage($response, 'shoppinglist', [
'listItems' => $this->getDatabase()->uihelper_shopping_list()->where('shopping_list_id = :1', $listId),
'listItems' => $this->getDatabase()->uihelper_shopping_list()->where('shopping_list_id = :1', $listId)->orderBy('product_name', 'COLLATE NOCASE'),
'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'missingProducts' => $this->getStockService()->GetMissingProducts(),
'shoppingLists' => $this->getDatabase()->shopping_lists()->orderBy('name', 'COLLATE NOCASE'),
'shoppingLists' => $this->getDatabase()->shopping_lists_view()->orderBy('name', 'COLLATE NOCASE'),
'selectedShoppingListId' => $listId,
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'productUserfields' => $this->getUserfieldsService()->GetFields('products'),

View File

@@ -9,41 +9,38 @@ class StockReportsController extends BaseController
{
public function Spendings(Request $request, Response $response, array $args)
{
$where = "pph.transaction_type != 'self-production'";
if (isset($request->getQueryParams()['start_date']) && isset($request->getQueryParams()['end_date']) && IsIsoDate($request->getQueryParams()['start_date']) && IsIsoDate($request->getQueryParams()['end_date']))
{
$startDate = $request->getQueryParams()['start_date'];
$endDate = $request->getQueryParams()['end_date'];
$where = "pph.purchased_date BETWEEN '$startDate' AND '$endDate'";
$where .= " AND pph.purchased_date BETWEEN '$startDate' AND '$endDate'";
}
else
{
// Default to this month
$where = "pph.purchased_date >= DATE(DATE('now', 'localtime'), 'start of month')";
$where .= " AND pph.purchased_date >= DATE(DATE('now', 'localtime'), 'start of month')";
}
if (isset($request->getQueryParams()['byGroup']))
$groupBy = 'product';
if (isset($request->getQueryParams()['group-by']) && in_array($request->getQueryParams()['group-by'], ['product', 'productgroup', 'store']))
{
$sql = "
SELECT
pg.id AS id,
pg.name AS name,
SUM(pph.amount * pph.price) AS total
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY pg.id
ORDER BY pg.NAME COLLATE NOCASE
";
$groupBy = $request->getQueryParams()['group-by'];
}
else
if ($groupBy == 'product')
{
if (isset($request->getQueryParams()['product_group']) and $request->getQueryParams()['product_group'] != 'all')
if (isset($request->getQueryParams()['product-group']))
{
$where .= ' AND pg.id = ' . $request->getQueryParams()['product_group'];
if ($request->getQueryParams()['product-group'] == 'ungrouped')
{
$where .= ' AND pg.id IS NULL';
}
elseif ($request->getQueryParams()['product-group'] != 'all')
{
$where .= ' AND pg.id = ' . $request->getQueryParams()['product-group'];
}
}
$sql = "
@@ -56,19 +53,53 @@ class StockReportsController extends BaseController
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
JOIN product_groups pg
LEFT JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY p.id
ORDER BY p.NAME COLLATE NOCASE
GROUP BY p.id, p.name, pg.id, pg.name
ORDER BY p.name COLLATE NOCASE
";
}
elseif ($groupBy == 'productgroup')
{
$sql = "
SELECT
pg.id AS id,
pg.name AS name,
SUM(pph.amount * pph.price) AS total
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
LEFT JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY pg.id, pg.name
ORDER BY pg.name COLLATE NOCASE
";
}
elseif ($groupBy == 'store')
{
$sql = "
SELECT
sl.id AS id,
sl.name AS name,
SUM(pph.amount * pph.price) AS total
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
LEFT JOIN shopping_locations sl
ON pph.shopping_location_id = sl.id
WHERE $where
GROUP BY sl.id, sl.name
ORDER BY sl.NAME COLLATE NOCASE
";
}
return $this->renderPage($response, 'stockreportspendings', [
'metrics' => $this->getDatabaseService()->ExecuteDbQuery($sql)->fetchAll(\PDO::FETCH_OBJ),
'productGroups' => $this->getDatabase()->product_groups()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'selectedGroup' => isset($request->getQueryParams()['product_group']) ? $request->getQueryParams()['product_group'] : null,
'byGroup' => isset($request->getQueryParams()['byGroup']) ? $request->getQueryParams()['byGroup'] : null
'selectedGroup' => isset($request->getQueryParams()['product-group']) ? $request->getQueryParams()['product-group'] : null,
'groupBy' => $groupBy
]);
}
}

View File

@@ -1,3 +1,2 @@
*
!.gitignore
!DemoBarcodeLookupPlugin.php

View File

@@ -1,78 +0,0 @@
<?php
use Grocy\Helpers\BaseBarcodeLookupPlugin;
/*
This class must extend BaseBarcodeLookupPlugin (in namespace \Grocy\Helpers)
*/
class DemoBarcodeLookupPlugin extends BaseBarcodeLookupPlugin
{
/*
To use this plugin, configure it in data/config.php like this:
Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'DemoBarcodeLookupPlugin');
*/
/*
To try it:
Call the API function at /api/stock/barcodes/external-lookup/{barcode}
When you also add ?add=true as a query parameter to the API call,
on a successful lookup the product is added to the database and in the output
the new product id is included (automatically, nothing to do here in the plugin)
*/
/*
Provided references:
$this->Locations contains all locations
$this->QuantityUnits contains all quantity units
*/
/*
Useful hints:
Get a quantity unit by name:
$quantityUnit = FindObjectInArrayByPropertyValue($this->QuantityUnits, 'name', 'Piece');
Get a location by name:
$location = FindObjectInArrayByPropertyValue($this->Locations, 'name', 'Fridge');
*/
/*
This class must implement the protected abstract function ExecuteLookup($barcode),
which is called with the barcode that needs to be looked up and must return an
associative array of the product model or null, when nothing was found for the barcode.
The returned array must contain at least these properties:
array(
'name' => '',
'location_id' => 1, // A valid id of a location object, check against $this->Locations
'qu_id_purchase' => 1, // A valid id of quantity unit object, check against $this->QuantityUnits
'qu_id_stock' => 1, // A valid id of quantity unit object, check against $this->QuantityUnits
'qu_factor_purchase_to_stock' => 1, // Normally 1 when quantity unit stock and purchase is the same
'barcode' => $barcode // The barcode of the product, maybe just pass through $barcode or manipulate it if necessary
)
*/
protected function ExecuteLookup($barcode)
{
if ($barcode === 'x')
{ // Demonstration when nothing is found
return null;
}
elseif ($barcode === 'e')
{ // Demonstration when an error occurred
throw new \Exception('This is the error message from the plugin...');
}
else
{
return [
'name' => 'LookedUpProduct_' . RandomString(5),
'location_id' => $this->Locations[0]->id,
'qu_id_purchase' => $this->QuantityUnits[0]->id,
'qu_id_stock' => $this->QuantityUnits[0]->id,
'qu_factor_purchase_to_stock' => 1,
'barcode' => $barcode
];
}
}
}

View File

@@ -1063,6 +1063,7 @@
"/users/{userId}/permissions": {
"get": {
"summary": "Returns the assigned permissions of the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@@ -1113,6 +1114,7 @@
},
"post": {
"summary": "Adds a permission to the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@@ -1161,6 +1163,7 @@
},
"put": {
"summary": "Replaces the assigned permissions of the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@@ -1614,10 +1617,7 @@
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CurrentVolatilStockResponse"
}
"$ref": "#/components/schemas/CurrentVolatilStockResponse"
}
}
}
@@ -2007,7 +2007,7 @@
},
"allow_subproduct_substitution": {
"type": "boolean",
"description": "`true` when any in-stock sub product should be used when the given product is a parent product and currently not in-stock"
"description": "`true` when any in stock sub product should be used when the given product is a parent product and currently not in stock"
}
},
"example": {
@@ -2242,7 +2242,7 @@
},
"allow_subproduct_substitution": {
"type": "boolean",
"description": "`true` when any in-stock sub product should be used when the given product is a parent product and currently not in-stock"
"description": "`true` when any in stock sub product should be used when the given product is a parent product and currently not in stock"
}
},
"example": {
@@ -2540,7 +2540,7 @@
},
"allow_subproduct_substitution": {
"type": "boolean",
"description": "`rue` when any in-stock sub product should be used when the given product is a parent product and currently not in-stock"
"description": "`rue` when any in stock sub product should be used when the given product is a parent product and currently not in stock"
}
},
"example": {
@@ -2763,7 +2763,7 @@
},
"allow_subproduct_substitution": {
"type": "boolean",
"description": "`rue` when any in-stock sub product should be used when the given product is a parent product and currently not in-stock"
"description": "`rue` when any in stock sub product should be used when the given product is a parent product and currently not in stock"
}
},
"example": {
@@ -3444,7 +3444,7 @@
},
"/recipes/{recipeId}/consume": {
"post": {
"summary": "Consumes all products of the given recipe",
"summary": "Consumes all in stock ingredients of the given recipe (for ingredients that are only partially in stock, the in stock amount will be consumed)",
"tags": [
"Recipes"
],
@@ -4511,6 +4511,106 @@
"move_on_open": "1"
}
},
"ProductWithoutUserfields": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"location_id": {
"type": "integer"
},
"qu_id_purchase": {
"type": "integer"
},
"qu_id_stock": {
"type": "integer"
},
"enable_tare_weight_handling": {
"type": "integer"
},
"not_check_stock_fulfillment_for_recipes": {
"type": "integer"
},
"product_group_id": {
"type": "integer"
},
"tare_weight": {
"type": "number"
},
"min_stock_amount": {
"type": "number",
"minimum": 0,
"default": 0
},
"default_best_before_days": {
"type": "integer",
"minimum": 0,
"default": 0
},
"default_best_before_days_after_open": {
"type": "integer",
"minimum": 0,
"default": 0
},
"picture_file_name": {
"type": "string"
},
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"shopping_location_id": {
"type": "integer"
},
"treat_opened_as_out_of_stock": {
"type": "integer"
},
"auto_reprint_stock_label": {
"type": "integer"
},
"no_own_stock": {
"type": "integer"
},
"should_not_be_frozen": {
"type": "integer"
},
"default_consume_location_id": {
"type": "integer"
},
"move_on_open": {
"type": "integer"
}
},
"example": {
"id": "1",
"name": "Cookies",
"description": null,
"location_id": "4",
"qu_id_purchase": "3",
"qu_id_stock": "3",
"min_stock_amount": "8",
"default_best_before_days": "0",
"row_created_timestamp": "2019-05-02 20:12:26",
"product_group_id": "1",
"picture_file_name": "cookies.jpg",
"default_best_before_days_after_open": "0",
"enable_tare_weight_handling": "0",
"tare_weight": "0.0",
"not_check_stock_fulfillment_for_recipes": "0",
"shopping_location_id": null,
"userfields": null,
"should_not_be_frozen": "1",
"default_consume_location_id": "5",
"move_on_open": "1"
}
},
"QuantityUnit": {
"type": "object",
"properties": {
@@ -4733,7 +4833,10 @@
"$ref": "#/components/schemas/Product"
},
"product_barcodes": {
"$ref": "#/components/schemas/ProductBarcode"
"type": "array",
"items": {
"$ref": "#/components/schemas/ProductBarcode"
}
},
"quantity_unit_stock": {
"$ref": "#/components/schemas/QuantityUnit"
@@ -4753,7 +4856,7 @@
},
"last_used": {
"type": "string",
"format": "date-time"
"format": "date"
},
"stock_amount": {
"type": "number"
@@ -4763,7 +4866,7 @@
},
"next_due_date": {
"type": "string",
"format": "date-time"
"format": "date"
},
"last_price": {
"type": "number",
@@ -5326,7 +5429,7 @@
},
"purchased_date": {
"type": "string",
"format": "date-time"
"format": "date"
},
"used_date": {
"type": "string",
@@ -5521,7 +5624,7 @@
"description": "Indicates wheter this product has sub-products or not / if the fields `amount_aggregated` and `amount_opened_aggregated` are filled"
},
"product": {
"$ref": "#/components/schemas/Product"
"$ref": "#/components/schemas/ProductWithoutUserfields"
}
}
},
@@ -5801,7 +5904,10 @@
"products_last_purchased",
"products_average_price",
"quantity_unit_conversions_resolved",
"recipes_pos_resolved"
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityNoListing": {
@@ -5821,7 +5927,10 @@
"products_last_purchased",
"products_average_price",
"quantity_unit_conversions_resolved",
"recipes_pos_resolved"
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityNoDelete": {
@@ -5834,7 +5943,10 @@
"products_last_purchased",
"products_average_price",
"quantity_unit_conversions_resolved",
"recipes_pos_resolved"
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityEditRequiresAdmin": {

View File

@@ -4,14 +4,19 @@ namespace Grocy\Helpers;
abstract class BaseBarcodeLookupPlugin
{
final public function __construct($locations, $quantityUnits)
// That's a "self-referencing constant" and forces the child class to define it
public const PLUGIN_NAME = self::PLUGIN_NAME;
final public function __construct($locations, $quantityUnits, $userSettings)
{
$this->Locations = $locations;
$this->QuantityUnits = $quantityUnits;
$this->UserSettings = $userSettings;
}
protected $Locations;
protected $QuantityUnits;
protected $UserSettings;
final public function Lookup($barcode)
{
@@ -29,7 +34,8 @@ abstract class BaseBarcodeLookupPlugin
}
if (!IsAssociativeArray($pluginOutput))
{ // $pluginOutput is at least an indexed array here
{
// $pluginOutput is at least an indexed array here
throw new \Exception('Plugin output must be an associative array');
}
@@ -39,8 +45,8 @@ abstract class BaseBarcodeLookupPlugin
'location_id',
'qu_id_purchase',
'qu_id_stock',
'qu_factor_purchase_to_stock',
'barcode'
'__qu_factor_purchase_to_stock',
'__barcode'
];
foreach ($minimunNeededProperties as $prop)
@@ -53,29 +59,29 @@ abstract class BaseBarcodeLookupPlugin
// $pluginOutput contains all needed properties here
// Check referenced entity ids are valid
// Check if referenced entity ids are valid
$locationId = $pluginOutput['location_id'];
if (FindObjectInArrayByPropertyValue($this->Locations, 'id', $locationId) === null)
{
throw new \Exception("Location $locationId is not a valid location id");
throw new \Exception("Provided location_id ($locationId) is not a valid location id");
}
$quIdPurchase = $pluginOutput['qu_id_purchase'];
if (FindObjectInArrayByPropertyValue($this->QuantityUnits, 'id', $quIdPurchase) === null)
{
throw new \Exception("Location $quIdPurchase is not a valid quantity unit id");
throw new \Exception("Provided qu_id_purchase ($quIdPurchase) is not a valid quantity unit id");
}
$quIdStock = $pluginOutput['qu_id_stock'];
if (FindObjectInArrayByPropertyValue($this->QuantityUnits, 'id', $quIdStock) === null)
{
throw new \Exception("Location $quIdStock is not a valid quantity unit id");
throw new \Exception("Provided qu_id_stock ($quIdStock) is not a valid quantity unit id");
}
$quFactor = $pluginOutput['qu_factor_purchase_to_stock'];
$quFactor = $pluginOutput['__qu_factor_purchase_to_stock'];
if (empty($quFactor) || !is_numeric($quFactor))
{
throw new \Exception('Quantity unit factor is empty or not a number');
throw new \Exception('Provided __qu_factor_purchase_to_stock is empty or not a number');
}
return $pluginOutput;

View File

@@ -4,12 +4,13 @@ class ERequirementNotMet extends Exception
{
}
const REQUIRED_PHP_EXTENSIONS = ['fileinfo', 'pdo_sqlite', 'gd', 'ctype', 'json', 'intl', 'zlib', 'mbstring',
const REQUIRED_PHP_EXTENSIONS = ['fileinfo', 'pdo_sqlite', 'gd', 'ctype', 'intl', 'zlib', 'mbstring',
// These are core extensions, so normally can't be missing, but seems to be the case, however, on FreeBSD
'filter', 'iconv', 'tokenizer'
'filter', 'iconv', 'tokenizer', 'json'
];
const REQUIRED_PHP_VERSION = '8.1.0';
const REQUIRED_PHP_VERSION = '8.2.0';
const REQUIRED_SQLITE_VERSION = '3.34.0';
class PrerequisiteChecker

View File

@@ -262,3 +262,19 @@ function require_frontend_packages(array $packages)
$GROCY_REQUIRED_FRONTEND_PACKAGES = array_unique(array_merge($GROCY_REQUIRED_FRONTEND_PACKAGES, $packages));
}
function EmptyFolder($folderPath)
{
foreach(glob("{$folderPath}/*") as $item)
{
if(is_dir($item))
{
EmptyFolder($item);
rmdir($item);
}
else
{
unlink($item);
}
}
}

View File

@@ -0,0 +1,32 @@
#
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Dwight Schrute <rvelitchkov@gmail.com>, 2020
# Mihail Andreev, 2020
#
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: Mihail Andreev, 2020\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\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

@@ -0,0 +1,40 @@
#
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Svetoslav Slavkov <contact@sslavkov.eu>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Svetoslav Slavkov <contact@sslavkov.eu>, 2023\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "Ръчно"
msgid "daily"
msgstr "Ежедневно"
msgid "weekly"
msgstr "Ежеседмично"
msgid "monthly"
msgstr "Ежемесечно"
msgid "yearly"
msgstr "Ежегодно"
msgid "hourly"
msgstr "почасово"
msgid "adaptive"
msgstr "адаптивен"

View File

@@ -0,0 +1,85 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2025
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/component_translations\n"
msgid "moment_locale"
msgstr "bg"
msgid "datatables_localization"
msgstr ""
"{\"processing\":\"Обработка на резултатите...\",\"lengthMenu\":\"Показване "
"на _MENU_ резултата\",\"zeroRecords\":\"Няма намерени "
"резултати\",\"info\":\"Показване на резултати от _START_ до _END_ от общо "
"_TOTAL_\",\"infoEmpty\":\"Показване на резултати от 0 до 0 от общо "
"0\",\"infoFiltered\":\"(филтрирани от общо _MAX_ "
"резултата)\",\"search\":\"Търсене:\",\"paginate\":{\"first\":\"Първа\",\"previous\":\"Предишна\",\"next\":\"Следваща\",\"last\":\"Последна\"},\"aria\":{\"sortAscending\":\"сортирай"
" възходящо\",\"sortDescending\":\"сортирай "
"низходящо\"},\"autoFill\":{\"cancel\":\"Oткажи\",\"fill\":\"Попълни всички "
"клетки с <i>%d<i></i></i>\",\"fillHorizontal\":\"Попълни хоризонтални "
"клетки\",\"fillVertical\":\"Попълни вертикални "
"клетки\"},\"searchBuilder\":{\"add\":\"Добави\",\"deleteTitle\":\"Изтрий "
"критериите за търсене\",\"clearAll\":\"Изчисти "
"всичко\",\"condition\":\"Правило\",\"conditions\":{\"array\":{\"contains\":\"Съдържа\",\"empty\":\"Празно\",\"equals\":\"Еднакво"
" с\",\"not\":\"Различно от\",\"notEmpty\":\"Не е "
"празно\",\"without\":\"Без\"},\"date\":{\"after\":\"След\",\"before\":\"Преди\",\"between\":\"Между\",\"empty\":\"Празно\",\"equals\":\"Равна"
" на\",\"not\":\"Различна от\",\"notBetween\":\"Не е "
"между\",\"notEmpty\":\"Не е "
"празно\"},\"number\":{\"between\":\"Между\",\"empty\":\"Празно\",\"equals\":\"Равно\",\"gt\":\"Над\",\"gte\":\"Над"
" или равно\",\"lt\":\"Под\",\"lte\":\"Под или равно\",\"not\":\"Различно "
"от\",\"notBetween\":\"Не е между\",\"notEmpty\":\"Не е "
"празно\"},\"string\":{\"contains\":\"Съдържа\",\"empty\":\"Празно\",\"endsWith\":\"Завършва"
" с\",\"equals\":\"Еднакво с\",\"not\":\"Различно от\",\"notEmpty\":\"Не е "
"празно\",\"startsWith\":\"Започва "
"с\"}},\"data\":\"Поле\",\"logicAnd\":\"И\",\"logicOr\":\"Или\",\"value\":\"Стойност\"},\"searchPanes\":{\"clearMessage\":\"Изтрий"
" всички\",\"emptyPanes\":\"Няма "
"SearchPanes\",\"loadMessage\":\"Зареждане...\",\"title\":\"Активни филтри - "
"%d\"},\"buttons\":{\"collection\":\"Колекция\",\"colvis\":\"Показване/Скриване"
" на колони\",\"colvisRestore\":\"Показване на всички "
"колони\",\"copy\":\"Копиране\",\"copyKeys\":\"Натисни <i>ctrl или u2318 + C "
"за да копираш данните от таблицата.<br /> За да отмените, щракнете върху "
"това съобщение или натиснете "
"<i>escape</i>.</i>\",\"copySuccess\":{\"1\":\"Копиран един "
"ред\",\"_\":\"Копирани %ds реда\"},\"copyTitle\":\"Копиране в "
"буфера\",\"pageLength\":{\"_\":\"Покажи %d реда\",\"-1\":\"Покажи всички "
"редове\"},\"print\":\"Принтиране\"},\"datetime\":{\"hours\":\"Часове\",\"minutes\":\"Минути\",\"months\":{\"0\":\"Януари\",\"1\":\"Февруари\",\"2\":\"Март\",\"3\":\"Април\",\"4\":\"Май\",\"5\":\"Юни\",\"6\":\"Юли\",\"7\":\"Август\",\"8\":\"Септември\",\"9\":\"Октомври\",\"10\":\"Ноември\",\"11\":\"Декември\"},\"next\":\"Напред\",\"previous\":\"Назад\",\"seconds\":\"Секунди\",\"weekdays\":[\"Нед\",\"Пон\",\"Вт\",\"Ср\",\"Четв\",\"Пет\",\"Съб\"]},\"editor\":{\"close\":\"Затвори\",\"create\":{\"button\":\"Нов"
" запис\",\"submit\":\"Създай\",\"title\":\"Създай нов "
"запис\"},\"edit\":{\"button\":\"Промени\",\"submit\":\"Промени\",\"title\":\"Промени"
" запис\"},\"error\":{\"system\":\"Грешка в "
"системата!\"},\"multi\":{\"info\":\"Избраните елементи съдържат различни "
"стойности за това поле. За да редактирате и зададете всички елементи за това"
" поле на една и съща стойност, щракнете или докоснете тук, в противен случай"
" те ще запазят своите индивидуални стойности.\",\"noMulti\":\"Това полеможе "
"да се редактира индивидуално, но не е част от група.\",\"restore\":\"Отмяна "
"на промените\",\"title\":\"Множество "
"стойности\"},\"remove\":{\"button\":\"Изтрий\",\"confirm\":{\"1\":\"Сигурни "
"ли сте, че искате да изтриете 1 ред?\",\"_\":\"Сигурни ли сте, че искате да "
"изтриете %d реда?\"},\"submit\":\"Изтрий\",\"title\":\"Изтрий "
"запис\"}},\"emptyTable\":\"Няма налични данни в "
"таблицата\",\"loadingRecords\":\"Зареждане...\",\"select\":{\"cells\":{\"1\":\"%d"
" избрана клетка\",\"_\":\"%d избрани клетки\"},\"columns\":{\"1\":\"%d "
"избрана колона\",\"_\":\"%d избрани колони\"},\"rows\":{\"1\":\"%d избран "
"ред\",\"_\":\"%d избрани реда\"}}}"
msgid "summernote_locale"
msgstr "bg-BG"
msgid "fullcalendar_locale"
msgstr "bg"
msgid "bootstrap-select_locale"
msgstr "bg_BG"

View File

@@ -0,0 +1,418 @@
#
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Mihail Andreev, 2020
# Steliyan Stoyanov, 2025
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Steliyan Stoyanov, 2025\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/demo_data\n"
msgid "Cookies"
msgstr "Бисквити"
msgid "Chocolate"
msgstr "Шоколад"
msgid "Pantry"
msgstr "Килер"
msgid "Candy cupboard"
msgstr "Шкаф за бонбони"
msgid "Tinned food cupboard"
msgstr "Шкаф за консерви"
msgid "Fridge"
msgstr "Хладилник"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] "Брой"
msgstr[1] "Броя"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] "Опаковка"
msgstr[1] "Опаковки"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] "Чаша"
msgstr[1] "Чаши"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] "Консерва"
msgstr[1] "Консерви"
msgid "Can"
msgid_plural "Cans"
msgstr[0] "Кен"
msgstr[1] "Кена"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] "Куп"
msgstr[1] "Куп"
msgid "Gummy bears"
msgstr "Гумени мечета"
msgid "Crisps"
msgstr "Чипс"
msgid "Eggs"
msgstr "Яйца"
msgid "Noodles"
msgstr "Юфка"
msgid "Pickles"
msgstr "Туршия"
msgid "Gulash soup"
msgstr "Супа гулаш"
msgid "Yogurt"
msgstr "Кисело мляко"
msgid "Cheese"
msgstr "Сирене"
msgid "Cold cuts"
msgstr "Сухи мезета"
msgid "Paprika"
msgstr "Пипер"
msgid "Cucumber"
msgstr "Краставица"
msgid "Radish"
msgstr "Ряпа"
msgid "Tomato"
msgstr "Домати"
msgid "Change towels in the bathroom"
msgstr "Смени кърпите в банята"
msgid "Mop the kitchen floor"
msgstr "Избършете пода в кухнята"
msgid "Warranty ends"
msgstr "Край на гаранцията"
msgid "TV remote control"
msgstr "Дистанционно за телевизор"
msgid "Alarm clock"
msgstr "Будилник"
msgid "Heat remote control"
msgstr "Дистанционно за термостат"
msgid "Take out the trash"
msgstr "Изхвърлете боклука"
msgid "Some good snacks"
msgstr "Хубави закуски"
msgid "Pizza dough"
msgstr "Тесто за пица"
msgid "Sieved tomatoes"
msgstr "Пасирани домати"
msgid "Salami"
msgstr "Салам"
msgid "Toast"
msgstr "Хляб за тост"
msgid "Minced meat"
msgstr "Кайма"
msgid "Pizza"
msgstr "Пица"
msgid "Spaghetti bolognese"
msgstr "Спагети болонезе"
msgid "Sandwiches"
msgstr "Сандвичи"
msgid "English"
msgstr "Английски"
msgid "German"
msgstr "Немски"
msgid "Italian"
msgstr "Италиански"
msgid "This is the note content of the recipe ingredient"
msgstr "Това е съдържанието на бележката за съставката на рецептата"
msgid "Demo User"
msgstr "Демо потребител"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] "Грам"
msgstr[1] "Грама"
msgid "Flour"
msgstr "Брашно"
msgid "Pancakes"
msgstr "Палачинки"
msgid "Sugar"
msgstr "Захар"
msgid "Sweets"
msgstr "Сладкиши"
msgid "Bakery products"
msgstr "Хлебни продукти"
msgid "Tinned food"
msgstr "Консерва"
msgid "Butchery products"
msgstr "Месни продукти"
msgid "Vegetables/Fruits"
msgstr "Зеленчуци/Плодове"
msgid "Refrigerated products"
msgstr "Охладени продукти"
msgid "Coffee machine"
msgstr "Кафе машина"
msgid "Dishwasher"
msgstr "Съдомиялна"
msgid "Liter"
msgstr "Литър"
msgid "Liters"
msgstr "Литри"
msgid "Bottle"
msgstr "Бутилка"
msgid "Bottles"
msgstr "Бутилки"
msgid "Milk"
msgstr "Мляко"
msgid "Chocolate sauce"
msgstr "Шоколадов сос"
msgid "Milliliters"
msgstr "Милилитри"
msgid "Milliliter"
msgstr "Милилитър"
msgid "Bottom"
msgstr "Дъно"
msgid "Topping"
msgstr "Топинг"
msgid "French"
msgstr "Френски"
msgid "Turkish"
msgstr "Турски"
msgid "Spanish"
msgstr "Испански"
msgid "Russian"
msgstr "Руски"
msgid "Vacuum the living room floor"
msgstr "Почистете пода с прахосмукачка в хола"
msgid "Clean the litter box"
msgstr "Почистете кутията за отпадъци"
msgid "Change the bed sheets"
msgstr "Смени чаршафите"
msgid "Swedish"
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 "още не издадено"
msgid "Portuguese (Brazil)"
msgstr "Португалски (Бразилия)"
msgid "This is a note"
msgstr "Това е бележка"
msgid "Freezer"
msgstr "Фризер"
msgid "Hungarian"
msgstr "Унгарски"
msgid "Slovak"
msgstr "Словашки"
msgid "Czech"
msgstr "Чехия"
msgid "Portuguese (Portugal)"
msgstr "Португалски (Португалия)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "ДемоСупермаркет1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "ТестовСупермаркет2"
msgid "Japanese"
msgstr "Японски"
msgid "Chinese (Taiwan)"
msgstr "Китайски (Тайван)"
msgid "Greek"
msgstr "гръцки"
msgid "Korean"
msgstr "корейски"
msgid "Chinese (China)"
msgstr "Китайски (China)"
msgid "Hebrew (Israel)"
msgstr "Иврит (Israel)"
msgid "Tamil"
msgstr "Тамилски"
msgid "Finnish"
msgstr "Финландски"
msgid "Breakfast"
msgstr "Закуска"
msgid "Lunch"
msgstr "Обяд"
msgid "Dinner"
msgstr "Вечеря"
msgid "Catalan"
msgstr "Каталонски"
msgid "Slovenian"
msgstr "Словенски"
msgid "Lithuanian"
msgstr "Литовски"
msgid "Ukrainian"
msgstr "Украински"
msgid "Kilogram"
msgid_plural "Kilograms"
msgstr[0] "килограм"
msgstr[1] "Килограми"
msgid "Romanian"
msgstr "Румънски"
msgid "Pint"
msgstr "Закачено"
msgid "Beverages"
msgstr "Напитки"
msgid "Ice Cream"
msgstr "Сладолед"
msgid "Soda"
msgstr "Газирана вода"
msgid "Beer"
msgstr "Бира"
msgid "Estonian"
msgstr "Естонски"
msgid "Bulgarian"
msgstr ""

View File

@@ -0,0 +1,151 @@
#
# Translators:
# Mihail Andreev, 2020
# N T, 2025
#
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: 2020-08-31 19:11+0000\n"
"Last-Translator: N T, 2025\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/locales\n"
# Czech
msgid "cs"
msgstr "cs"
# Danish
msgid "da"
msgstr "da"
# German
msgid "de"
msgstr "de"
# Greek
msgid "el_GR"
msgstr "el_GR"
# English
msgid "en"
msgstr "en"
# English (Great Britain)
msgid "en_GB"
msgstr "en_GB"
# Spanish
msgid "es"
msgstr "es"
# French
msgid "fr"
msgstr "fr"
# Hungarian
msgid "hu"
msgstr "hu"
# Italian
msgid "it"
msgstr "it"
# Japanese
msgid "ja"
msgstr "ja"
# Korean
msgid "ko_KR"
msgstr "ko_KR"
# Dutch
msgid "nl"
msgstr "nl"
# Norwegian
msgid "no"
msgstr "no"
# Polish
msgid "pl"
msgstr "pl"
# Portuguese (Brazil)
msgid "pt_BR"
msgstr "pt_BR"
# Portuguese (Portugal)
msgid "pt_PT"
msgstr "pt_PT"
# Russian
msgid "ru"
msgstr "ru"
# Slovak
msgid "sk_SK"
msgstr "sk_SK"
# Slovenian
msgid "sl"
msgstr "sl"
# Swedish
msgid "sv_SE"
msgstr "sv_SE"
# Turkish
msgid "tr"
msgstr "tr"
# Chinese (Taiwan)
msgid "zh_TW"
msgstr "zh_TW"
# Chinese (China)
msgid "zh_CN"
msgstr "zh_CN"
# Hebrew (Israel)
msgid "he_IL"
msgstr "he_IL"
# Tamil
msgid "ta"
msgstr "ta"
# Finnish
msgid "fi"
msgstr "fi"
# Catalan
msgid "ca"
msgstr "ca"
# Lithuanian
msgid "lt"
msgstr "lt"
# Ukrainian
msgid "uk"
msgstr "uk"
# Romanian
msgid "ro_RO"
msgstr "ro_RO"
# Estonian
msgid "et_EE"
msgstr "et_EE"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@@ -0,0 +1,138 @@
#
# Translators:
# Mihail Andreev, 2020
#
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: 2020-08-29 16:33+0000\n"
"Last-Translator: Mihail Andreev, 2020\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/permissions\n"
# All permissions
msgid "ADMIN"
msgstr "ADMIN"
# Create users
msgid "USERS_CREATE"
msgstr "USERS_CREATE"
# Edit users (including passwords)
msgid "USERS_EDIT"
msgstr "USERS_EDIT"
# Show users
msgid "USERS_READ"
msgstr "USERS_READ"
# Edit own user data / change own password
msgid "USERS_EDIT_SELF"
msgstr "USERS_EDIT_SELF"
# Undo charge cycle
msgid "BATTERIES_UNDO_CHARGE_CYCLE"
msgstr "BATTERIES_UNDO_CHARGE_CYCLE"
# Track charge cycle
msgid "BATTERIES_TRACK_CHARGE_CYCLE"
msgstr "BATTERIES_TRACK_CHARGE_CYCLE"
# Track execution
msgid "CHORE_TRACK_EXECUTION"
msgstr "CHORE_TRACK_EXECUTION"
# Undo execution
msgid "CHORE_UNDO_EXECUTION"
msgstr "CHORE_UNDO_EXECUTION"
# Edit master data
msgid "MASTER_DATA_EDIT"
msgstr "MASTER_DATA_EDIT"
# Undo execution
msgid "TASKS_UNDO_EXECUTION"
msgstr "TASKS_UNDO_EXECUTION"
# Mark completed
msgid "TASKS_MARK_COMPLETED"
msgstr "TASKS_MARK_COMPLETED"
# Edit stock entries
msgid "STOCK_EDIT"
msgstr "STOCK_EDIT"
# Transfer
msgid "STOCK_TRANSFER"
msgstr "STOCK_TRANSFER"
# Inventory
msgid "STOCK_INVENTORY"
msgstr "STOCK_INVENTORY"
# Consume
msgid "STOCK_CONSUME"
msgstr "STOCK_CONSUME"
# Open products
msgid "STOCK_OPEN"
msgstr "STOCK_OPEN"
# Purchase
msgid "STOCK_PURCHASE"
msgstr "STOCK_PURCHASE"
# Add items
msgid "SHOPPINGLIST_ITEMS_ADD"
msgstr "SHOPPINGLIST_ITEMS_ADD"
# Remove items
msgid "SHOPPINGLIST_ITEMS_DELETE"
msgstr "SHOPPINGLIST_ITEMS_DELETE"
# User management
msgid "USERS"
msgstr "USERS"
# Stock
msgid "STOCK"
msgstr "STOCK"
# Shopping list
msgid "SHOPPINGLIST"
msgstr "SHOPPINGLIST"
# Chores
msgid "CHORES"
msgstr "CHORES"
# Batteries
msgid "BATTERIES"
msgstr "BATTERIES"
# Tasks
msgid "TASKS"
msgstr "TASKS"
# Recipes
msgid "RECIPES"
msgstr "RECIPES"
# Equipment
msgid "EQUIPMENT"
msgstr "EQUIPMENT"
# Calendar
msgid "CALENDAR"
msgstr "CALENDAR"
# Meal plan
msgid "RECIPES_MEALPLAN"
msgstr "RECIPES_MEALPLAN"

View File

@@ -0,0 +1,46 @@
#
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Mihail Andreev, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Mihail Andreev, 2020\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/stock_transaction_types\n"
msgid "purchase"
msgstr "покупка"
msgid "transfer_from"
msgstr "прехвърли_от"
msgid "transfer_to"
msgstr "прехвъли_към"
msgid "consume"
msgstr "консумирай"
msgid "inventory-correction"
msgstr "корекция-инвентаризация"
msgid "product-opened"
msgstr "отворен-продукт"
msgid "stock-edit-old"
msgstr "наличност-промяна-стар"
msgid "stock-edit-new"
msgstr "наличност-промяна-нов"
msgid "self-production"
msgstr "домашна-продукция"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,76 @@
#
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Mihail Andreev, 2020
# Steliyan Stoyanov, 2025
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Steliyan Stoyanov, 2025\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/userfield_types\n"
# Text (single line)
msgid "text-single-line"
msgstr "текст-един-ред"
# Text (multi line)
msgid "text-multi-line"
msgstr "текст-няколко-реда"
# Number (integral)
msgid "number-integral"
msgstr "Число"
# Number (decimal)
msgid "number-decimal"
msgstr "число-цяло"
# Number (currency)
msgid "number-currency"
msgstr "Валута число"
# Date (without time)
msgid "date"
msgstr "дата"
# Date & time
msgid "datetime"
msgstr "момент"
# Checkbox
msgid "checkbox"
msgstr "чекбокс"
# Select list (a single item can be selected)
msgid "preset-list"
msgstr "предварително зададен списък"
# Select list (multiple items can be selected)
msgid "preset-checklist"
msgstr "предварително зададен избираем списък"
# Link
msgid "link"
msgstr "връзка"
# Link (with title)
msgid "link-with-title"
msgstr "Връзка със заглавие"
# File
msgid "file"
msgstr "файл"
# Image
msgid "image"
msgstr "изображение"

View File

@@ -2,6 +2,7 @@
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Carles Riera <blauigris@gmail.com>, 2022
# Auri, 2024
#
msgid ""
msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"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: Carles Riera <blauigris@gmail.com>, 2022\n"
"Last-Translator: Auri, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +20,7 @@ msgstr ""
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "sense actius"
msgstr "no assignat"
msgid "who-least-did-first"
msgstr "qui menys ha fet primer"

View File

@@ -1,8 +1,8 @@
#
# Translators:
# Joan Rodas <joanrc93@gmail.com>, 2020
# gimy16 <gimy16@hotmail.com>, 2021
# Martí Gombau, 2023
# Auri, 2024
#
msgid ""
msgstr ""
@@ -10,7 +10,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: Martí Gombau, 2023\n"
"Last-Translator: Auri, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,16 +23,16 @@ msgid "manually"
msgstr "manualment"
msgid "daily"
msgstr "diari"
msgstr "cada dia"
msgid "weekly"
msgstr "setmanalment"
msgstr "cada setmana"
msgid "monthly"
msgstr "mensual"
msgstr "cada mes"
msgid "yearly"
msgstr "anual"
msgstr "cada any"
msgid "hourly"
msgstr "cada hora"

View File

@@ -3,6 +3,7 @@
# Joan Rodas <joanrc93@gmail.com>, 2020
# gimy16 <gimy16@hotmail.com>, 2021
# Martí Gombau, 2023
# Auri, 2024
#
msgid ""
msgstr ""
@@ -10,7 +11,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: Martí Gombau, 2023\n"
"Last-Translator: Auri, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -397,19 +398,22 @@ msgid "Romanian"
msgstr "Romanès "
msgid "Pint"
msgstr ""
msgstr "Terrina/es"
msgid "Beverages"
msgstr ""
msgstr "Begudes"
msgid "Ice Cream"
msgstr ""
msgstr "Gelats"
msgid "Soda"
msgstr ""
msgstr "Refresc"
msgid "Beer"
msgstr ""
msgstr "Cervesa"
msgid "Estonian"
msgstr "Estonià"
msgid "Bulgarian"
msgstr ""

View File

@@ -1,6 +1,7 @@
#
# Translators:
# Martí Gombau, 2023
# Auri, 2024
#
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: 2020-08-31 19:11+0000\n"
"Last-Translator: Martí Gombau, 2023\n"
"Last-Translator: Auri, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -143,4 +144,8 @@ msgstr "ro_RO"
# Estonian
msgid "et_EE"
msgstr "et_EE"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@@ -1,6 +1,7 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Auri, 2024
#
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: gimy16 <gimy16@hotmail.com>, 2021\n"
"Last-Translator: Auri, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -36,10 +37,10 @@ msgid "product-opened"
msgstr "Producte_obert"
msgid "stock-edit-old"
msgstr "Edició_d'estoc_antic"
msgstr "edició-existència-antiga"
msgid "stock-edit-new"
msgstr "Edició_d'estoc_nou"
msgstr "edició-existència-nova"
msgid "self-production"
msgstr "Producció_pròpia"

View File

@@ -4,6 +4,9 @@
# Carles Riera <blauigris@gmail.com>, 2021
# jorclaret, 2022
# Martí Gombau, 2023
# Auri, 2024
# Pau Nofuentes Sendra, 2024
# Roger Solé Vilajuliu, 2024
#
msgid ""
msgstr ""
@@ -11,7 +14,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: Martí Gombau, 2023\n"
"Last-Translator: Roger Solé Vilajuliu, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -129,7 +132,7 @@ msgid "Product overview"
msgstr "Resum de productes"
msgid "Stock quantity unit"
msgstr "Unitat d'inventari"
msgstr "Unitat d'existències"
msgid "Stock amount"
msgstr "Existències"
@@ -213,7 +216,7 @@ msgid "Default quantity unit purchase"
msgstr "Unitat predeterminada"
msgid "Quantity unit stock"
msgstr "Unitat d'inventari"
msgstr "Unitat d'existències"
msgid "Create location"
msgstr "Afegir ubicació"
@@ -281,8 +284,8 @@ msgstr "Clau d'accés"
msgid "Invalid credentials, please try again"
msgstr "Credencials invàlides, sius-plau torna-ho a intentar"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Segur que vols eliminar la bateria \"%s\"?"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr ""
msgid "Yes"
msgstr "Sí"
@@ -290,8 +293,8 @@ msgstr "Sí"
msgid "No"
msgstr "No"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Segur que vols eliminar la feina de casa \"%s\"?"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr ""
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr "no s'ha pogut identificar com a producte, com vols procedir?"
@@ -311,17 +314,17 @@ msgstr "Afegir com a codi de barres a un producte existent"
msgid "Add as new product and prefill barcode"
msgstr "Afegir com a nou producte amb el codi de barres"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Segur que vols eliminar la unitat \"%s\"?"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr ""
msgid "Are you sure to delete product \"%s\"?"
msgstr "Segur que vols eliminar el producte \"%s\"?"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr ""
msgid "Are you sure to delete location \"%s\"?"
msgstr "Segur que vols eliminar la ubicació \"%s\"?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr ""
msgid "Are you sure to delete store \"%s\"?"
msgstr "Segur que vols eliminar l'establiment \"%s\"?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Gestiona les claus de l'API"
@@ -357,14 +360,11 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "%1$s de %2$s eliminats de l'inventari"
msgid "About Grocy"
msgstr ""
msgstr "Sobre Grocy"
msgid "Close"
msgstr "Tancar"
msgid "Released on"
msgstr "Publicat el"
msgid "Added %1$s of %2$s to stock"
msgstr "%1$s de %2$s afegits a l'inventari"
@@ -437,14 +437,14 @@ msgstr "Afegir ingredient a la recepta"
msgid "Edit recipe ingredient"
msgstr "Editar ingredient de la recepta"
msgid "Are you sure to delete recipe \"%s\"?"
msgstr "Segur que vols eliminar la recepta \"%s\"?"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr ""
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgstr "Segur que vols eliminar l'ingredient \"%s\" de la recepta?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr ""
msgid "Are you sure to empty shopping list \"%s\"?"
msgstr "Segur que vols buidar la llista de la compra \"%s\"?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr ""
msgid "Clear list"
msgstr "Buidar llista"
@@ -493,14 +493,9 @@ msgid "Put missing amount on shopping list"
msgstr "Afegeix els que falten a la llista de la compra"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Segur que vols afegir tots els ingredients que falten per a la recepta "
"\"%s\" a la llista de la compra?"
msgid "Added for recipe %s"
msgstr "Afegit per a la recepta %s"
msgid "Manage users"
msgstr "Gestiona els usuaris"
@@ -511,8 +506,8 @@ msgstr "Usuari"
msgid "Users"
msgstr "Usuaris"
msgid "Are you sure to delete user \"%s\"?"
msgstr "Segur que vols eliminar l'usuari \"%s\"?"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr ""
msgid "Create user"
msgstr "Afegir usuari"
@@ -608,15 +603,13 @@ msgid "Only check if any amount is in stock"
msgstr "Només comprovar si hi ha existències"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
"Segur que vols consumir tots els ingredients requerits per fer la recepta "
"\"%s\" (Els ingredients marcats amb \"només comprovar si hi ha "
"existències\") s'ignoraran?"
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr " Tots els ingredients de la recepta \"%s\" s'han eliminat de l'inventari"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr ""
msgid "Consume all ingredients needed by this recipe"
msgstr "Consumir tots els ingredients requerits per aquesta recepta"
@@ -666,8 +659,8 @@ msgstr "Categoria"
msgid "Edit task"
msgstr "Editar tasca"
msgid "Are you sure to delete task \"%s\"?"
msgstr "Segur que vols eliminar la tasca \"%s\"?"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr ""
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
@@ -700,8 +693,8 @@ msgstr "Editar grup de productes"
msgid "Product group"
msgstr "Grup de productes"
msgid "Are you sure to delete product group \"%s\"?"
msgstr "Estàs segur d'eliminar el grup de producte \"%s\"?"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr ""
msgid "Stay logged in permanently"
msgstr "Mantenir-se connectat permanentment"
@@ -855,6 +848,9 @@ msgid ""
"The first item in this list would be picked by the default rule consume rule"
" (Opened first, then first due first, then first in first out)"
msgstr ""
"El primer element d'aquesta llista serà utilitzat per la regla de consum per"
" defecte (Primer l'obert, després el que caduca primer, després el primer "
"que entra el primer que surt)"
msgid "Mark %1$s of %2$s as open"
msgstr "Marcar %1$s de %2$s com a obert"
@@ -869,7 +865,9 @@ msgid "Not opened"
msgstr "No obert"
msgid "Opened"
msgstr "Obert"
msgid_plural "Opened"
msgstr[0] ""
msgstr[1] ""
msgid "%s opened"
msgstr "%s obert"
@@ -953,6 +951,10 @@ msgid ""
"always weigh the whole jar, the amount to be posted is then automatically "
"calculated based on what is in stock and the tare weight defined below"
msgstr ""
"Això serà útil per exemple per a farina en pots - quan es "
"compra/consumeix/inventaria, sempre es pesa el pot sencer, la quantitat "
"final és calculada automàticament basat en la quantitat en existències i la "
"tara definida a continuació."
msgid "Tare weight"
msgstr "Tara"
@@ -1034,8 +1036,8 @@ msgstr "Configuració de tasques"
msgid "Create shopping list"
msgstr "Crear llista de la compra"
msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "Estàs segur d'eliminar la llista de la compra \"%s\"?"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr ""
msgid "Average shelf life"
msgstr "Temps de vida mitjà de l'inventari"
@@ -1156,6 +1158,9 @@ msgid ""
"When this is not empty, it will be shown instead of the amount entered above"
" while the amount there will still be used for stock fulfillment checking"
msgstr ""
"Quan no estigui buit, es mostrarà enlloc de la quantitat introduïda a dalt. "
"La quantitat de dalt seguirà sent la utilitzada en les comprovacions "
"d'existències a l'inventari. "
msgid "Track date only"
msgstr "Només seguiment de data"
@@ -1169,7 +1174,7 @@ msgid "Consume %1$s of %2$s"
msgstr "Consumir %1$s de %2$s"
msgid "Meal plan"
msgstr "Calendari de menús"
msgstr "Calendari d'àpats"
msgid "%s serving"
msgid_plural "%s servings"
@@ -1204,11 +1209,6 @@ msgstr "Mai"
msgid "Today"
msgstr "Avui"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"No tots els ingredients de la recepta \"%s\" tenen existències, no s'ha "
"eliminat res"
msgid "Undo task"
msgstr "Desfer tasca"
@@ -1219,6 +1219,8 @@ msgid ""
"When enabled the chore can never be overdue, the due date will shift forward"
" each day when due"
msgstr ""
"Quan s'activa, la tasca no pot vèncer mai, la dada de venciment és moure un "
"dia endavant cada dia després del venciment."
msgid "Location Content Sheet"
msgstr "Full de continguts d'ubicació"
@@ -1245,8 +1247,8 @@ msgstr "Quantitat consumida"
msgid "Time of printing"
msgstr "Hora d'impressi"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Estàs segur d'eliminar l'equipament \"%s\"?"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr ""
msgid "Parent product"
msgstr "Producte pare"
@@ -1310,7 +1312,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every %s days"
msgstr[0] ""
"Això vol dir que la pròxima execució de la tasca està programada a la "
"mateixa hora (basat en la data d'inici) cada dia"
msgstr[1] ""
"Això vol dir que la pròxima execució de la tasca està programada a la "
"mateixa hora (basat en la data d'inici) cada %s dies"
msgid ""
"This means the next execution of this chore is scheduled %s hour after the "
@@ -1319,7 +1325,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled %s hours after the "
"last execution"
msgstr[0] ""
"Això vol dir que la pròxima execució de la tasca està programada 1 hora "
"després de l'última execució"
msgstr[1] ""
"Això vol dir que la pròxima execució de la tasca està programada %s hores "
"després de l'última execució"
msgid ""
"This means the next execution of this chore is scheduled every week on the "
@@ -1328,7 +1338,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s weeks on "
"the selected weekdays"
msgstr[0] ""
"Això vol dir que la pròxima execució de la tasca està programada cada "
"setmana als dies seleccionats"
msgstr[1] ""
"Això vol dir que la pròxima execució de la tasca està programada cada %s "
"setmanes als dies seleccionats"
msgid ""
"This means the next execution of this chore is scheduled on the selected day"
@@ -1337,7 +1351,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled on the selected day"
" every %s months"
msgstr[0] ""
"Això vol dir que la pròxima execució de la tasca està programada al dia "
"seleccionat cada mes"
msgstr[1] ""
"Això vol dir que la pròxima execució de la tasca està programada al dia "
"seleccionat cada %s mesos"
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
@@ -1346,30 +1364,37 @@ msgstr ""
msgid ""
"This means the next execution of this chore will not be assigned to anyone"
msgstr ""
"Això vol dir que la pròxima execució de la tasca no serà assignada a ningú"
msgid ""
"This means the next execution of this chore will be assigned to the one who "
"executed it least"
msgstr ""
"Això vol dir que la pròxima execució de la tasca serà assignada a qui l'hagi"
" executat l'última vegada"
msgid "This means the next execution of this chore will be assigned randomly"
msgstr ""
"Això vol dir que la pròxima execució de la tasca serà assignada "
"aleatòriament a algú"
msgid ""
"This means the next execution of this chore will be assigned to the next one"
" in alphabetical order"
msgstr ""
"Això vol dir que la pròxima execució de la tasca serà assignada la següent "
"persona en ordre alfabètic"
msgid "Assign to"
msgstr ""
msgstr "Assigna a"
msgid "This assignment type requires that at least one is assigned"
msgstr ""
msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Tens assignada %s feina"
msgstr[1] "Tens assignades %s feines"
msgid "Assigned to me"
msgstr "Assignat a mi"
@@ -1383,8 +1408,8 @@ msgstr "Assignació"
msgid "Consume product on chore execution"
msgstr "Consumir producte al executar la tasca"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Segur que vols eliminar el camp d'usuari \"%s\"?"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr "Entitat d'usuari"
@@ -1404,8 +1429,8 @@ msgstr "Editar %s"
msgid "Create %s"
msgstr "Crear %s"
msgid "Are you sure to delete this userobject?"
msgstr "Segur que vols eliminar aquest objecte d'usuari?"
msgid "Are you sure you want to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr "Icona classe CSS"
@@ -1440,7 +1465,7 @@ msgid "Price factor"
msgstr "Factor de preu"
msgid "Do you find Grocy useful?"
msgstr ""
msgstr "Trobes que Grocy t'és d'utilitat?"
msgid "Say thanks"
msgstr "Dir gràcies"
@@ -1458,7 +1483,7 @@ msgid "Output"
msgstr "Resultat"
msgid "Energy"
msgstr ""
msgstr "Energia"
msgid "Per stock quantity unit"
msgstr "Per unitat d'existències"
@@ -1491,9 +1516,12 @@ 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 ""
"Si s'activa, el mínim d'existències dels subproductes seran acumulats en "
"aquest producte, volent dir que el subproducte mai podrà faltar, només "
"aquest producte."
msgid "Are you sure to remove this conversion?"
msgstr "Estas segur d'eliminar aquesta conversió?"
msgid "Are you sure you want to remove this conversion?"
msgstr ""
msgid "Unit price"
msgstr "Preu unitari"
@@ -1510,8 +1538,8 @@ msgstr "Il·limitat"
msgid "Clear"
msgstr "Neteja"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Segur que vols eliminar la recepta inclosa \"%s\"?"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr ""
msgid "Period interval"
msgstr "Interval"
@@ -1523,10 +1551,14 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s years on "
"the same day (based on the start date)"
msgstr[0] ""
"Això vol dir que la pròxima execució de la tasca està programada cada any al"
" mateix dia (basat en la data d'inici)"
msgstr[1] ""
"Això vol dir que la pròxima execució de la tasca està programada cada %s "
"anys al mateix dia (basat en la data d'inici)"
msgid "Transfer"
msgstr ""
msgstr "Transfereix"
msgid "From location"
msgstr "D'ubicació"
@@ -1559,10 +1591,10 @@ msgid "The amount cannot be lower than %1$s"
msgstr "La quantitat no pot ser inferior a %1$s"
msgid "Stock entry successfully updated"
msgstr ""
msgstr "Entrada d'existències actualitzada correctament"
msgid "Edit stock entry"
msgstr ""
msgstr "Edita l'entrada d'inventari"
msgid ""
"Camera access is only possible when supported and allowed by your browser "
@@ -1594,8 +1626,8 @@ msgstr ""
msgid "Booking does not exist or was already undone"
msgstr ""
msgid "Are you sure to delete API key \"%s\"?"
msgstr "Segur que vols eliminar la clau API \"%s\"?"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr ""
msgid "Add note"
msgstr "Afegir nota"
@@ -1648,8 +1680,8 @@ msgstr "Descongelat"
msgid "Frozen"
msgstr "Congelat"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Segur que vols eliminar l'entitat d'usuari \"%s\"?"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr ""
msgid "Shopping list settings"
msgstr "Configuració de la llista de la compra"
@@ -1660,9 +1692,6 @@ msgstr "Mostra la vista mensual de calendari"
msgid "Desired servings"
msgstr "Racions desitjades"
msgid "Base: %s"
msgstr "Base: %s"
msgid "Recipes settings"
msgstr "Configuració de receptes"
@@ -1746,7 +1775,7 @@ msgstr "Editar codi de barres"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
@@ -1874,7 +1903,7 @@ msgid "Transaction time"
msgstr "Hora de la transacció"
msgid "Chore journal"
msgstr ""
msgstr "Resum de tasques"
msgid "Track next chore schedule"
msgstr ""
@@ -1904,6 +1933,8 @@ msgid ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgstr ""
"Aquesta és la unitat per defecte que es farà servir en comprar i quan "
"s'afegeix el producte a la llista de la compra"
msgid ""
"Show a warning when the due date of the purchased product is earlier than "
@@ -1912,9 +1943,8 @@ msgstr ""
"Mostra una advertència quan la data de caducitat del producte comprat és més"
" propera que la de les existències"
msgid "This is due earlier than already in-stock items"
msgid "This is due earlier than already in stock items"
msgstr ""
"Aquesta data de caducitat és més propera que la que ja tens en existències"
msgid ""
"When enabled, after changing/scanning a product and if all fields could be "
@@ -1929,17 +1959,21 @@ msgid ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgstr ""
"Aquesta quantitat és utilitzada pel botó de \"consumir ràpidament\" en la "
"pàgina d'existències (en unitats d'existències)"
msgid ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgstr ""
"Aquesta quantitat és utilitzada pel botó de \"obrir ràpidament\" en la "
"pàgina d'existències (en unitats d'existències)"
msgid "Copy"
msgstr "Copiar"
msgid "Are you sure to remove this barcode?"
msgstr "Segur que vols eliminar aquest codi de barres?"
msgid "Are you sure you want to remove this barcode?"
msgstr ""
msgid "Due date type"
msgstr "Tipus de data de caducitat"
@@ -2062,11 +2096,15 @@ msgid ""
"This cannot be lower than %1$s and needs to be a valid number with max. %2$s"
" decimal places"
msgstr ""
"Això no pot ser més baix que %1$s i ha de ser un nombre vàlid amb un màxim "
"de %2$s decimals"
msgid ""
"This must between %1$s and %2$s and needs to be a valid number with max. "
"%3$s decimal places"
msgstr ""
"Aquest ha de ser entre %1$s i %2$s i ha de ser un nombre vàlid amb un màxim "
"de %3$s decimals"
msgid ""
"Automatically do the booking using the last price and the amount of the "
@@ -2123,13 +2161,13 @@ msgid "Ingredient group"
msgstr "Grup d'ingredients"
msgid "Reset"
msgstr "Reiniciar"
msgstr "Reinicia"
msgid "Are you sure to reset the table options?"
msgstr "Segur que vols reiniciar les opcions de la taula?"
msgid "Are you sure you want to reset the table options?"
msgstr ""
msgid "Hide/view columns"
msgstr "Ocultar/mostrar columnes"
msgstr "Oculta/mostra columnes"
msgid ""
"A different amount/unit can then be used below while for stock fulfillment "
@@ -2140,7 +2178,7 @@ msgid "Last price (Unit)"
msgstr "Últim preu (unitat)"
msgid "Last price (Total)"
msgstr "Últim preu (Total)"
msgstr "Últim preu (total)"
msgid "Show header"
msgstr "Mostrar capçalera"
@@ -2187,7 +2225,7 @@ msgid "Link"
msgstr "Enllaç"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
@@ -2199,7 +2237,7 @@ msgid "A product or a note is required"
msgstr "Es requereix un producte o nota"
msgid "Grocycode"
msgstr ""
msgstr "Grocycode"
msgid "Download"
msgstr "Descàrrega"
@@ -2215,7 +2253,7 @@ msgstr ""
# Abbreviation for "due date"
msgid "DD"
msgstr ""
msgstr "DC"
msgid "Print on label printer"
msgstr "Imprimir en una impressora d'etiquetes"
@@ -2260,8 +2298,8 @@ msgstr "No s'ha pogut imprimir"
msgid "Only done items"
msgstr "Només elements completats"
msgid "Show only in-stock products"
msgstr "Mostra només productes en existències"
msgid "Show only in stock products"
msgstr ""
msgid "Product description"
msgstr "Descripció de producte"
@@ -2282,8 +2320,8 @@ msgstr "Camp d'usuari obligatori"
msgid "When enabled, then this field must be filled on the destination form"
msgstr "Quan activat, aquest camp s'ha d'omplir en el formulari de dest"
msgid "In-stock products"
msgstr "Productes en existències"
msgid "In stock products"
msgstr ""
msgid "Timestamp"
msgstr "Marca de temps"
@@ -2348,30 +2386,30 @@ msgid ""
msgstr ""
msgid "Stock entry"
msgstr ""
msgstr "Entrada d'existències"
msgid "Configure sections"
msgstr "Configurar seccions"
msgid "Meal plan sections"
msgstr ""
msgstr "Seccions de planificador d'àpats"
msgid "Create meal plan section"
msgstr ""
msgstr "Crea una secció al planificador d'àpats"
msgid "Sections will be ordered by that number on the meal plan"
msgstr ""
msgstr "Les seccions seran ordenades pel número en el planificador d'àpats."
msgid "Edit meal plan section"
msgstr ""
msgid "Are you sure to delete meal plan section \"%s\"?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr ""
msgid "Section"
msgstr "Secció"
msgid "Are you sure to empty the shopping list?"
msgid "Are you sure you want to empty the shopping list?"
msgstr ""
msgid "This is the default which will be prefilled on purchase"
@@ -2404,8 +2442,8 @@ msgstr[1] ""
msgid "%s chore is due to be done today"
msgid_plural "%s chores are due to be done today"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%s tasca s'ha d'acabar avui"
msgstr[1] "%s tasques s'han d'acabar avui"
msgid "%s battery is due to be charged today"
msgid_plural "%s batteries are due to be charged today"
@@ -2416,18 +2454,20 @@ msgid "Set to 0 to hide due soon filters/highlighting"
msgstr ""
msgid "Save & close"
msgstr ""
msgstr "Desa i tanca"
msgid "Save & add another task"
msgstr ""
msgstr "Desa i afegeix una altra tasca"
msgid "Treat opened as out of stock"
msgstr ""
msgstr "Tracta obert com a esgotat"
msgid ""
"When enabled, opened items will be counted as missing for calculating if "
"this product is below its minimum stock amount"
msgstr ""
"Quan s'activa, els elements oberts seran comptats com a absents per calcular"
" si aquest producte es troba per sota els mínims d'existències."
msgid "Skipped"
msgstr ""
@@ -2436,16 +2476,18 @@ msgid "Skip next chore schedule"
msgstr ""
msgid "Time"
msgstr ""
msgstr "Hora"
msgid "A start date is required"
msgstr ""
msgstr "La data d'inici és necessària"
msgid "Start date"
msgstr ""
msgstr "Data d'inici"
msgid "The start date cannot be changed when the chore was once tracked"
msgstr ""
"La data d'inici no es pot canviar després de començar el seguiment de la "
"tasca"
msgid "Show the recipe list and the recipe side by side"
msgstr ""
@@ -2454,18 +2496,20 @@ msgid ""
"This means the next execution of this chore is scheduled dynamically based "
"on the past average execution frequency"
msgstr ""
"Això vol dir que la pròxima execució de la tasca està programada "
"dinàmicament basant-se en la freqüència mitjana d'execució "
msgid "Average execution frequency"
msgstr ""
msgstr "Freqüència mitjana de realització"
msgid "Reschedule next execution"
msgstr ""
msgstr "Re-programa la següent realització"
msgid "This can only be in the future"
msgstr ""
msgid "Rescheduled"
msgstr ""
msgstr "Re-programada"
msgid "Due score"
msgstr ""
@@ -2476,13 +2520,16 @@ msgid ""
msgstr ""
msgid "Disable own stock"
msgstr ""
msgstr "Deshabilitar inventari propi"
msgid ""
"When enabled, this product can't have own stock, means it will not be "
"selectable on purchase (useful for parent products which are just used as a "
"summary/total view of the child products)"
msgstr ""
"Quan s'habilita, aquest producte no pot tenir quantitat d'existències "
"pròpies, això vol dir que no es podrà seleccionar per comprar (útil per "
"productes para que són una vista resum/total dels subproductes)"
msgid "Out of stock items will be shown at the products default location"
msgstr ""
@@ -2502,45 +2549,47 @@ msgid ""
msgstr ""
msgid "Night mode"
msgstr ""
msgstr "Mode nocturn"
msgid "On"
msgstr ""
msgstr "ON"
msgid "Use system setting"
msgstr ""
msgstr "Utilitza la configuració del sistema"
msgid "Off"
msgstr ""
msgstr "OFF"
msgid ""
"Automatically add products that are below their defined min. stock amount to"
" the shopping list"
msgstr ""
"Afegeix automàticament els productes que estiguin per sota el seu valor "
"d'existències mínim definit a la llista de compra"
msgid "Reassigned"
msgstr ""
msgstr "Re-assignada"
msgid "Default value"
msgstr ""
msgstr "Valor predeterminat"
msgid "Now / today"
msgstr ""
msgstr "Ara / avui"
msgid "Add meal plan entry"
msgstr ""
msgstr "Afegeix entrada al menú"
msgid "Edit meal plan entry"
msgstr ""
msgstr "Edita entrada del menú"
msgid "Default consume location"
msgstr ""
msgstr "Ubicació de consum predeterminada"
msgid "Stock entries at this location will be consumed first"
msgstr ""
msgstr "Les existències en aquesta ubicació es consumiran primer"
msgid "Move on open"
msgstr ""
msgstr "Mou quan s'obri"
msgid ""
"When enabled, on marking this product as opened, the corresponding amount "
@@ -2548,13 +2597,13 @@ msgid ""
msgstr ""
msgid "Moved to %1$s"
msgstr ""
msgstr "S'ha mogut a %1$s"
msgid "Decimal places allowed for prices (input)"
msgstr ""
msgstr "Posicions decimals permeses pels preus (entrada)"
msgid "Decimal places allowed for prices (display)"
msgstr ""
msgstr "Posicions decimals permeses pels preus (visualització)"
msgid "Clear done items"
msgstr ""
@@ -2565,25 +2614,27 @@ msgid ""
msgstr ""
msgid "Show resolved conversions"
msgstr ""
msgstr "Mostra les conversions resoltes"
msgid "QU conversions resolved"
msgstr ""
msgstr "Conversions QU resoltes"
msgid "Product specifc QU conversions"
msgstr ""
msgid "Product specific QU conversions"
msgstr "Conversions QU específiques de producte"
msgid "Default quantity unit consume"
msgstr ""
msgstr "Unitat de consum predeterminada"
msgid "This is the default quantity unit used when consuming this product"
msgstr ""
"Aquesta és la unitat per defecte que es farà servir en consumir aquest "
"producte"
msgid "Add to meal plan"
msgstr ""
msgstr "Afegeix al menú"
msgid "Successfully added the recipe to the meal plan"
msgstr ""
msgstr "Recepta afegida al menú correctament"
msgid "Reprint stock entry label"
msgstr ""
@@ -2604,44 +2655,44 @@ msgid "Track chore execution now"
msgstr ""
msgid "Total"
msgstr ""
msgstr "Total"
msgid "Apply"
msgstr ""
msgstr "Aplica"
msgid "Custom range"
msgstr ""
msgstr "Interval personalitzat"
msgid "Yesterday"
msgstr ""
msgstr "Ahir"
msgid "Last %1$s day"
msgid_plural "Last %1$s days"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "L'últim %1$s dia"
msgstr[1] "Els últims %1$s dies"
msgid "This month"
msgstr ""
msgstr "Aquest mes"
msgid "Last month"
msgstr ""
msgstr "El mes passat"
msgid "This year"
msgstr ""
msgstr "Aquest any"
msgid "Last year"
msgstr ""
msgstr "L'any passat"
msgid "Reports"
msgstr ""
msgstr "Informes"
msgid "Spendings"
msgstr ""
msgstr "Despeses"
msgid "Stock report"
msgstr ""
msgstr "Informe d'existències"
msgid "Out-of-stock products"
msgid "Out of stock products"
msgstr ""
msgid "Quantity unit for prices"
@@ -2651,8 +2702,69 @@ msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr ""
"Quan es mostrin els preus per aquest producte, seran referits a aquesta "
"unitat"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""
msgid "External barcode lookup"
msgstr ""
msgid "Error while executing the barcode lookup plugin"
msgstr ""
msgid "Nothing was found for the given barcode"
msgstr ""
msgid "Configure colors"
msgstr "Configura els colors"
msgid "Swap track next schedule / track now buttons"
msgstr ""
msgid "Scheduled tracking time"
msgstr ""
msgid "Time of tracking"
msgstr ""
msgid "Show all out of stock products"
msgstr ""
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
msgid "No price information is available for at least one ingredient"
msgstr ""
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
msgid "Can't be opened"
msgstr ""
msgid "Default purchase price type"
msgstr ""
msgid "This will be used as the default price type selection on purchase"
msgstr ""
msgid "Unspecified"
msgstr ""
msgid "Round up quantity amounts to the nearest whole number"
msgstr ""
msgid "Stock actions"
msgstr ""
msgid "List actions"
msgstr ""

View File

@@ -1,6 +1,7 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Roger Solé Vilajuliu, 2024
#
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:43+0000\n"
"Last-Translator: gimy16 <gimy16@hotmail.com>, 2021\n"
"Last-Translator: Roger Solé Vilajuliu, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/grocy/teams/93189/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,6 +34,10 @@ msgstr "nombre-integral"
msgid "number-decimal"
msgstr "nombre-decimal"
# Number (currency)
msgid "number-currency"
msgstr "nombre-moneda"
# Date (without time)
msgid "date"
msgstr "data"

View File

@@ -432,3 +432,6 @@ msgstr "Pivo"
msgid "Estonian"
msgstr ""
msgid "Bulgarian"
msgstr ""

View File

@@ -146,3 +146,7 @@ msgstr "Rumunština"
# Estonian
msgid "et_EE"
msgstr ""
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@@ -8,7 +8,7 @@
# Radim Kabeláč <radim.ekk@gmail.com>, 2020
# Jaroslav Lichtblau <l10n@lichtblau.cz>, 2020
# Jarda Tesar <intossh@gmail.com>, 2021
# Pavel Paseka, 2023
# Pavel Paseka, 2025
#
msgid ""
msgstr ""
@@ -16,7 +16,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 Paseka, 2023\n"
"Last-Translator: Pavel Paseka, 2025\n"
"Language-Team: Czech (https://app.transifex.com/grocy/teams/93189/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -277,9 +277,7 @@ msgid "Manage master data"
msgstr "Spravovat základní data"
msgid "This will apply to added products"
msgstr ""
"Určuje, jak se změna množství balení produktu zapíše do Seznamu zásob a zda "
"se k této změně vytisknou nálepky na produkt"
msgstr "Tento údaj se zapíše jen pro přidané produkty do zásoby."
msgid "never"
msgstr "nikdy"
@@ -299,8 +297,8 @@ msgstr "Heslo"
msgid "Invalid credentials, please try again"
msgstr "Nesprávné jméno nebo heslo, zkuste to ještě jednou"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Opravdu chcete smazat baterii „%s“"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr "Odstranit baterii „%s“?"
msgid "Yes"
msgstr "Ano"
@@ -308,8 +306,8 @@ msgstr "Ano"
msgid "No"
msgstr "Ne"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Opravdu chcete smazat povinnost „%s“?"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr "Odstranit povinnost „%s“?"
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr "Žádný uložený produkt se nejmenuje „%s“. Jak chcete pokračovat?"
@@ -329,17 +327,17 @@ msgstr "Přidat jako čárový kód k existujícímu produktu"
msgid "Add as new product and prefill barcode"
msgstr "Přidat jako nový produkt a předvyplnit čárový kód"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Opravdu chcete smazat měrnou jednotku „%s“?"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr "Odstranit jednotku množství „%s“?"
msgid "Are you sure to delete product \"%s\"?"
msgstr "Opravdu chcete smazat produkt „%s“?"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr "Odstranit produkt „%s“?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Opravdu chcete smazat umístění „%s“?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr "Odstranit umístění „%s“?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Opravdu chcete smazat obchod „%s“?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr "Odstranit obchod „%s“?"
msgid "Manage API keys"
msgstr "Spravovat API klíče"
@@ -380,9 +378,6 @@ msgstr "Co je Grocy"
msgid "Close"
msgstr "Zavřít"
msgid "Released on"
msgstr "Vydaná"
msgid "Added %1$s of %2$s to stock"
msgstr "Zásoba se zvýšila o %1$s produktu %2$s"
@@ -455,14 +450,14 @@ msgstr "Přidat ingredienci"
msgid "Edit recipe ingredient"
msgstr "Upravit ingredienci"
msgid "Are you sure to delete recipe \"%s\"?"
msgstr "Opravdu chcete smazat recept „%s“?"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr "Odstranit recept „%s“?"
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgstr "Opravdu chcete smazat ingredienci „%s“?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr "Odstranit ingredienci „%s“?"
msgid "Are you sure to empty shopping list \"%s\"?"
msgstr "Opravdu chcete vyprázdnit nákupní seznam „%s“?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr "Vyprázdnit nákupní seznam „%s“?"
msgid "Clear list"
msgstr "Vyprázdnit seznam"
@@ -507,15 +502,12 @@ msgid "Put missing amount on shopping list"
msgstr "Přidat chybějící množství do nákupního seznamu"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Chcete přidat všechny chybějící ingredience z receptu „%s“ do nákupního "
"seznamu?"
msgid "Added for recipe %s"
msgstr "Ingredience pro recept „%s“"
msgid "Manage users"
msgstr "Spravovat uživatele"
@@ -525,8 +517,8 @@ msgstr "Uživatel"
msgid "Users"
msgstr "Uživatelé"
msgid "Are you sure to delete user \"%s\"?"
msgstr "Opravdu chcete smazat uživatele „%s“?"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr "Odstranit uživatele „%s“?"
msgid "Create user"
msgstr "Vytvořit uživatele"
@@ -630,14 +622,15 @@ msgid "Only check if any amount is in stock"
msgstr "Pouze zkontrolovat, zda je v zásobě jakékoliv množství"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
"Opravdu si přejete spotřebovat všechny ingredience receptu „%s“? Ingredience"
" označené „Zkontrolovat pouze zda je v zásobě jakékoliv množství“ budou "
"Přejete se spotřebovat všechny ingredience receptu „%s“? Ingredience "
"označené „Zkontrolovat pouze zda je v zásobě jakékoliv množství“ budou "
"ignorovány."
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr "Všechny ingredience z receptu „%s“ byly odebrány ze zásob"
msgid "Consume all ingredients needed by this recipe"
@@ -688,8 +681,8 @@ msgstr "Kategorie"
msgid "Edit task"
msgstr "Upravit úkol"
msgid "Are you sure to delete task \"%s\"?"
msgstr "Opravdu chcete smazat úkol „%s?"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr "Odstranit úkol „%s?"
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
@@ -726,8 +719,8 @@ msgstr "Upravit skupinu produktů"
msgid "Product group"
msgstr "Skupina produktů"
msgid "Are you sure to delete product group \"%s\"?"
msgstr "Opravdu chcete smazat skupinu produktů „%s“?"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr "Odstranit skupinu produktů „%s“?"
msgid "Stay logged in permanently"
msgstr "Zůstat přihlášen"
@@ -805,7 +798,7 @@ msgid "Create equipment"
msgstr "Vytvořit vybavení"
msgid "The current file will be deleted on save"
msgstr "Aktuální soubor bude smazán při uložení této položky vybavení"
msgstr "Soubor se smaže až po kliknutí na tlačítku Uložit"
msgid "No picture available"
msgstr "Obrázek není k dispozici"
@@ -898,7 +891,11 @@ msgid "Not opened"
msgstr "Neotevřené"
msgid "Opened"
msgstr "Otevřené"
msgid_plural "Opened"
msgstr[0] "Otevřeno"
msgstr[1] "Otevřené"
msgstr[2] "Otevřených"
msgstr[3] "Otevřených"
msgid "%s opened"
msgstr "%s otevřen"
@@ -1007,7 +1004,7 @@ msgid "Gallery"
msgstr "Galerie"
msgid "The current picture will be deleted on save"
msgstr "Aktuální obrázek bude smazán při uložení nového"
msgstr "Obrázek se smaže až po kliknutí na jedno z tlačítek Uložit"
msgid "Journal for this battery"
msgstr "Deník k této baterii"
@@ -1064,8 +1061,8 @@ msgstr "Nastavení úkolů"
msgid "Create shopping list"
msgstr "Vytvořit nákupní seznam"
msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "Opravdu chcete smazat nákupní seznam „%s?"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr "Smazat nákupní seznam „%s?"
msgid "Average shelf life"
msgstr "Průměrná doba uskladnění"
@@ -1107,10 +1104,10 @@ msgid "Sunday"
msgstr "Neděle"
msgid "Configure userfields"
msgstr "Upravit uživatelská pole"
msgstr "Upravit sloupce tabulky"
msgid "Userfields"
msgstr "Uživatelská pole"
msgstr "Vlastní sloupce tabulky"
msgid "Entity"
msgstr "Entita"
@@ -1122,7 +1119,7 @@ msgid "Type"
msgstr "Typ"
msgid "Create userfield"
msgstr "Vytvoř uživatelské pole"
msgstr "Vytvořit sloupec uživatelské tabulky"
msgid "A entity is required"
msgstr "Proměnná je povinný údaj"
@@ -1137,10 +1134,10 @@ msgid "Show as column in tables"
msgstr "Zobrazit jako řádek v tabulkách"
msgid "This is required and can only contain letters and numbers"
msgstr "Toto je povinné pole a může obsahovat pouze písmena a číslice"
msgstr "Toto je povinný údaj a může obsahovat pouze písmena a číslice"
msgid "Edit userfield"
msgstr "Upravit uživatelská pole"
msgstr "Upravit sloupec uživatelské tabulky"
msgid "Plural forms"
msgstr "Množné čislo"
@@ -1236,10 +1233,6 @@ msgstr "Nikdy"
msgid "Today"
msgstr "Dnes"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"V zásobě nejsou všechny ingredience receptu „%s“ nic nebude odebráno"
msgid "Undo task"
msgstr "Vrátit úkol"
@@ -1278,8 +1271,8 @@ msgstr "Spotřebované množství"
msgid "Time of printing"
msgstr "Čas tisku"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Opravdu chcete smazat vybavení „%s“?"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr "Odstranit zařízení „%s“?"
msgid "Parent product"
msgstr "Nadřazený produkt"
@@ -1458,8 +1451,8 @@ msgstr "Přiřazení"
msgid "Consume product on chore execution"
msgstr "Spotřebovat produkt při splnění povinnosti"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Opravdu si přejete smazat uživatelské pole „%s“?"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr "Odstranit sloupec „%s“?"
msgid "Userentities"
msgstr "Uživatelské tabulky"
@@ -1479,8 +1472,8 @@ msgstr "Upravit %s"
msgid "Create %s"
msgstr "Vytvořit %s"
msgid "Are you sure to delete this userobject?"
msgstr "Opravdu si přejete smazat položku definovanou uživatelem?"
msgid "Are you sure you want to delete this userobject?"
msgstr "Odstranit položku definovanou uživatelem?"
msgid "Icon CSS class"
msgstr "CSS třída ikony"
@@ -1546,7 +1539,7 @@ msgid "Expected barcode"
msgstr "Očekávaný čárový kód"
msgid "Scan field"
msgstr "Skenovací pole"
msgstr "Naskenováno"
msgid "Scanned barcodes"
msgstr "Naskenované čárové kódy"
@@ -1571,8 +1564,8 @@ msgstr ""
"přičteno do tohoto produktu. To znamená že podřízené produkty nikdy nebudou "
"chybět, ale pouze tento produkt."
msgid "Are you sure to remove this conversion?"
msgstr "Opravdu chcete odstranit tento převod?"
msgid "Are you sure you want to remove this conversion?"
msgstr "Odstranit tento převod?"
msgid "Unit price"
msgstr "Cena za jednotku"
@@ -1589,8 +1582,8 @@ msgstr "Neomezeně"
msgid "Clear"
msgstr "Vymazat"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Opravdu chcete odstranit dílčí recept „%s“?"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr "Odstranit dílčí recept „%s“?"
msgid "Period interval"
msgstr "Interval opakování"
@@ -1686,8 +1679,8 @@ msgstr "Tato akce nemůže být vrácena zpět"
msgid "Booking does not exist or was already undone"
msgstr "Tato akce neexistuje nebo již byla vrácena zpět"
msgid "Are you sure to delete API key \"%s\"?"
msgstr "Opravdu chcete smazat API klíč „%s“?"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr "Odstranit API klíč „%s“?"
msgid "Add note"
msgstr "Přidat poznámku"
@@ -1727,7 +1720,7 @@ msgstr "vypnut"
msgid ""
"Scan mode is on but not all required fields could be populated automatically"
msgstr ""
"Skenovací režim je zapnutý, ale ne všechna vyžadovaná pole mohou být "
"Skenovací režim je zapnutý, ale ne všechna vyžadovaná data mohou být "
"vyplněna automaticky"
msgid "Is freezer"
@@ -1742,8 +1735,8 @@ msgstr "Rozmraženo"
msgid "Frozen"
msgstr "Zmraženo"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Opravdu chcete smazat uživatelskou tabulku „%s“?"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr "Odstranit uživatelský sloupec tabulky „%s“?"
msgid "Shopping list settings"
msgstr "Nastavení nákupního seznamu"
@@ -1754,9 +1747,6 @@ msgstr "Zobrazit měsíční kalendář"
msgid "Desired servings"
msgstr "Počet porcí"
msgid "Base: %s"
msgstr "Základ: %s"
msgid "Recipes settings"
msgstr "Nastavení receptu"
@@ -1840,13 +1830,13 @@ msgstr "Upravit čárový kód"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
"Základem ceny je cena produktu v zásobě podle výchozího pořadí spotřeby "
"produktů. Tedy nejprve se spotřebují otevřené, pak ty s nejbližším datem "
"spotřeby a nakonec podle pravidla „dříve nakoupený, dříve spotřebovaný“. Pro"
" chybějící produkty je použita cena z posledního nákupu."
"spotřeby a nakonec podle pravidla „dříve nakoupený dříve spotřebovaný“. "
"Pro chybějící produkty je použita cena z posledního nákupu."
msgid "Clear filter"
msgstr "Smazat filtr"
@@ -1880,8 +1870,8 @@ msgstr "Výpis běžících funkcí stack trace"
msgid "Easy error info copy & paste (for reporting)"
msgstr ""
"Budete-li psát vývojářům, pošlete jim celý tento text. Stačí do něj kliknout"
" a celý se vybere (pro Ctrl-C)."
"Budete-li psát vývojářům, pošlete jim text níže. Stačí do něj kliknout a "
"celý se vybere (pro Ctrl-C)."
msgid "This page does not exist"
msgstr "Tato stránka neexistuje"
@@ -2016,7 +2006,7 @@ msgstr ""
"Upozorni, pokud je datum min. trvanlivosti (použitelnosti) nakoupeného "
"produktu dříve, než nejbližší datum spotřeby produktu v zásobě."
msgid "This is due earlier than already in-stock items"
msgid "This is due earlier than already in stock items"
msgstr "Datum min. trvanlivosti je dříve, než u produktů v zásobě"
msgid ""
@@ -2047,8 +2037,8 @@ msgstr ""
msgid "Copy"
msgstr "Kopírovat"
msgid "Are you sure to remove this barcode?"
msgstr "Opravdu chcete smazat tento čárový kód?"
msgid "Are you sure you want to remove this barcode?"
msgstr "Odstranit tento čárový kód?"
msgid "Due date type"
msgstr "Typ trvanlivosti produktu"
@@ -2203,7 +2193,7 @@ msgstr "Takto se položka databáze zobrazuje ve webové stránce"
msgid "Multiple Userfields will be ordered by that number on the input form"
msgstr ""
"Řada uživatelských položek bude uspořádána podle tohoto čísla při jejich "
"Řada uživatelských sloupců bude uspořádána podle tohoto čísla při jejich "
"zadávání"
msgid "Sort number"
@@ -2245,8 +2235,8 @@ msgstr "Skupina ingrediencí"
msgid "Reset"
msgstr "Resetovat"
msgid "Are you sure to reset the table options?"
msgstr "Opravdu chcete uvést sloupce tabulky do výchozího stavu?"
msgid "Are you sure you want to reset the table options?"
msgstr "Uvést sloupce tabulky do výchozího stavu?"
msgid "Hide/view columns"
msgstr "Zobrazit/skrýt sloupce"
@@ -2312,7 +2302,7 @@ msgid "Link"
msgstr "Odkaz"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
@@ -2390,7 +2380,7 @@ msgstr "Nedaří se tisknout"
msgid "Only done items"
msgstr "vybrané produkty"
msgid "Show only in-stock products"
msgid "Show only in stock products"
msgstr "Zobrazit produkty se zásobou"
msgid "Product description"
@@ -2407,12 +2397,12 @@ msgid "Mandatory"
msgstr "Povinné"
msgid "Mandatory Userfield"
msgstr "Povinné uživatelské pole"
msgstr "Povinný uživatelský údaj"
msgid "When enabled, then this field must be filled on the destination form"
msgstr "Použijete-li tento údaj ve formuláři, bude povinný"
msgid "In-stock products"
msgid "In stock products"
msgstr "produkty se zásobou"
msgid "Timestamp"
@@ -2503,14 +2493,14 @@ msgstr ""
msgid "Edit meal plan section"
msgstr "Upravit část dne v jídelníčku"
msgid "Are you sure to delete meal plan section \"%s\"?"
msgstr "Chcete odstranit rozdělení dne s názvem: %s?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr "Odstranit rozdělení dne s názvem: %s?"
msgid "Section"
msgstr "Část dne v jídelníčku"
msgid "Are you sure to empty the shopping list?"
msgstr "Opravdu chcete smazat nákupní seznam?"
msgid "Are you sure you want to empty the shopping list?"
msgstr "Vyprázdnit nákupní seznam?"
msgid "This is the default which will be prefilled on purchase"
msgstr ""
@@ -2728,7 +2718,7 @@ msgid "Decimal places allowed for prices (display)"
msgstr "Počet desetinných míst pro zobrazení ceny"
msgid "Clear done items"
msgstr "Smazat všechna zaškrtnutá"
msgstr "Odstranit všechna vybraná"
msgid ""
"This shows all to this product directly or indirectly related quantity units"
@@ -2743,7 +2733,7 @@ msgstr "Zobrazit všechny převody"
msgid "QU conversions resolved"
msgstr "Všechny převody měrných jednotek pro"
msgid "Product specifc QU conversions"
msgid "Product specific QU conversions"
msgstr "Převody měrných jednotek pro tento produkt"
msgid "Default quantity unit consume"
@@ -2780,7 +2770,7 @@ msgid "Track chore execution now"
msgstr "Splnění povinnosti s dnešním datem"
msgid "Total"
msgstr "Součet"
msgstr "Celkem"
msgid "Apply"
msgstr "Provést"
@@ -2819,16 +2809,16 @@ msgstr "Výdaje"
msgid "Stock report"
msgstr "Přehled zásob"
msgid "Out-of-stock products"
msgid "Out of stock products"
msgstr "Produkty bez zásoby"
msgid "Quantity unit for prices"
msgstr "Množstevní jednotka pro ceny"
msgstr "Měrná jednotka pro ceny"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr "Zobrazované ceny produktu budou odpovídat této množstevní jednotce"
msgstr "Zobrazované ceny produktu budou odpovídat této měrné jednotce"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
@@ -2836,3 +2826,69 @@ msgstr[0] "Vytiskne se 1nálepka"
msgstr[1] "Vytisknou se %1$s nálepky"
msgstr[2] "Vytiskne se %1$s nálepek"
msgstr[3] "Vytiskne se %1$s nálepek"
msgid "External barcode lookup"
msgstr "Čtení čárového kódu modulem aplikace"
msgid "Error while executing the barcode lookup plugin"
msgstr "Vyhodnocení doplňkovým modulem se nezdařilo"
msgid "Nothing was found for the given barcode"
msgstr "Pro tento čárový kód nebylo nic nalezeno"
msgid "Configure colors"
msgstr "Změnit barvy"
msgid "Swap track next schedule / track now buttons"
msgstr ""
"Změna funkce zeleného tlačítka: Zaznamenat splnění naplánované povinnosti "
"NEBO Zaznamenat splnění povinnosti právě teď."
msgid "Scheduled tracking time"
msgstr "Naplánované splnění povinnosti"
msgid "Time of tracking"
msgstr "Plnění povinností"
msgid "Show all out of stock products"
msgstr "Zobrazit produkty bez zásoby"
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
"Stránka Přehledu zásob zobrazuje všechny produkty, které jsou v zásobě nebo "
"pod jejich minimálním stavem. Zaškrtnutím se zobrazí všechny (aktivní) "
"produkty."
msgid "No price information is available for at least one ingredient"
msgstr "U nejméně jedné ingredience chybí informace o ceně"
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
"U ingrediencí, kde není v zásobě celé jejich množství se spotřebuje jejich "
"aktuální zásoba."
msgid "Can't be opened"
msgstr "Tento produkt nelze „otevřít“."
msgid "Default purchase price type"
msgstr "Výchozí druh ceny"
msgid "This will be used as the default price type selection on purchase"
msgstr "Toto bude použito jako výchozí druh ceny při nákupu"
msgid "Unspecified"
msgstr "Neurčené"
msgid "Round up quantity amounts to the nearest whole number"
msgstr "Zaokrouhlete množství na (nejbližší) celé číslo"
msgid "Stock actions"
msgstr "Operace se zásobami"
msgid "List actions"
msgstr "Operace se seznamem"

View File

@@ -35,6 +35,10 @@ msgstr "Celé číslo"
msgid "number-decimal"
msgstr "Desetinné číslo"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Datum"

View File

@@ -8,6 +8,7 @@
# Jesper Donnis, 2021
# Brian Moos Lindberg <brian@blueeel.dk>, 2022
# hskdk <henrik@skjaerbaek.net>, 2023
# G Momsen, 2024
#
msgid ""
msgstr ""
@@ -15,7 +16,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: hskdk <henrik@skjaerbaek.net>, 2023\n"
"Last-Translator: G Momsen, 2024\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -402,19 +403,22 @@ msgid "Romanian"
msgstr "Rumænsk"
msgid "Pint"
msgstr ""
msgstr "Pint"
msgid "Beverages"
msgstr ""
msgstr "Drikkevarer"
msgid "Ice Cream"
msgstr ""
msgstr "Is"
msgid "Soda"
msgstr ""
msgstr "Sodavand"
msgid "Beer"
msgstr ""
msgstr "Øl"
msgid "Estonian"
msgstr "Estisk"
msgid "Bulgarian"
msgstr ""

View File

@@ -3,6 +3,7 @@
# klavslund <klavslund@gmail.com>, 2021
# Brian Moos Lindberg <brian@blueeel.dk>, 2022
# hskdk <henrik@skjaerbaek.net>, 2023
# G Momsen, 2024
#
msgid ""
msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: hskdk <henrik@skjaerbaek.net>, 2023\n"
"Last-Translator: G Momsen, 2024\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -145,4 +146,8 @@ msgstr "ro_RO"
# Estonian
msgid "et_EE"
msgstr "et_EE"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@@ -2,7 +2,7 @@
# Translators:
# Mihai Marinescu <mihai@marinescu.dk>, 2020
# klavslund <klavslund@gmail.com>, 2021
# hskdk <henrik@skjaerbaek.net>, 2023
# Brian Moos Lindberg <brian@blueeel.dk>, 2024
#
msgid ""
msgstr ""
@@ -10,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-29 16:33+0000\n"
"Last-Translator: hskdk <henrik@skjaerbaek.net>, 2023\n"
"Last-Translator: Brian Moos Lindberg <brian@blueeel.dk>, 2024\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -113,7 +113,7 @@ msgstr "INDKØBSLISTE"
# Chores
msgid "CHORES"
msgstr "PLIGTER"
msgstr "GØREMÅL"
# Batteries
msgid "BATTERIES"

View File

@@ -1,16 +1,18 @@
#
# Translators:
# dark159123 <r.j.hansen@protonmail.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
# Troels Siggaard <troels@siggaard.com>, 2019
# Mihai Marinescu <mihai@marinescu.dk>, 2020
# Kim Bardrum <kim.bardrum@gmail.com>, 2021
# Michael Winkel <mbw@mbw.dk>, 2021
# klavslund <klavslund@gmail.com>, 2021
# dark159123 <r.j.hansen@protonmail.com>, 2021
# Jesper Donnis, 2021
# Brian Moos Lindberg <brian@blueeel.dk>, 2022
# Tobias Østergaard-Jørgensen, 2023
# hskdk <henrik@skjaerbaek.net>, 2023
# G Momsen, 2024
# Brian Moos Lindberg <brian@blueeel.dk>, 2024
# eurosite, 2025
#
msgid ""
msgstr ""
@@ -18,7 +20,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: hskdk <henrik@skjaerbaek.net>, 2023\n"
"Last-Translator: eurosite, 2025\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -28,7 +30,7 @@ msgstr ""
"X-Domain: grocy/strings\n"
msgid "Stock overview"
msgstr "Lagerbeholdning"
msgstr "Lageroversigt"
msgid "%s product expires"
msgid_plural "%s products expiring"
@@ -286,7 +288,7 @@ msgstr "Adgangskode"
msgid "Invalid credentials, please try again"
msgstr "Ugyldig brugernavn og/eller adgangskode, prøv igen"
msgid "Are you sure to delete battery \"%s\"?"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr "Er du sikker på du vil slette batteri \"%s\"?"
msgid "Yes"
@@ -295,8 +297,8 @@ msgstr "Ja"
msgid "No"
msgstr "Nej"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Er du sikker på du vil slette pligt \"%s\"?"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr ""
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr "\"%s\" kunne ikke findes som vare. Hvordan vil du fortsætte?"
@@ -316,16 +318,16 @@ msgstr "Tilføj som stregkode til en eksisterende vare"
msgid "Add as new product and prefill barcode"
msgstr "Tilføj som ny vare og udfyld stregkoden på forhånd"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Er du sikker på du vil slette måleenheden \"%s\"?"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr ""
msgid "Are you sure to delete product \"%s\"?"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr "Er du sikker på du vil slette varen \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr "Er du sikker på du vil slette placeringen \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr "Er du sikker på du vil slette butikken \"%s\"?"
msgid "Manage API keys"
@@ -362,14 +364,11 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "Fjerede %1$s af %2$s fra beholdningen"
msgid "About Grocy"
msgstr ""
msgstr "Om Grocy"
msgid "Close"
msgstr "Luk"
msgid "Released on"
msgstr "Udgivet den"
msgid "Added %1$s of %2$s to stock"
msgstr "Tilføjet %1$s af %2$s til beholdningen"
@@ -442,13 +441,13 @@ msgstr "Tilføj ingrediens til opskrift"
msgid "Edit recipe ingredient"
msgstr "Rediger ingrediens til opskrift"
msgid "Are you sure to delete recipe \"%s\"?"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr "Er du sikker på du vil slette opskriften \"%s\"?"
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr "Er du sikker på du vil slette ingrediensen \"%s\" fra opskriften?"
msgid "Are you sure to empty shopping list \"%s\"?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr "Er du sikker på at du vil tømme indkøbslisten \"%s\"?"
msgid "Clear list"
@@ -496,15 +495,12 @@ msgid "Put missing amount on shopping list"
msgstr "Put manglende mængde på indkøbsliste"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Er du sikker på du vil sætte alle manglende ingredienser til \"%s\" på "
"indkøbslisten?"
msgid "Added for recipe %s"
msgstr "Tilføjet til opskriften %s"
msgid "Manage users"
msgstr "Administrer brugere"
@@ -514,7 +510,7 @@ msgstr "Bruger"
msgid "Users"
msgstr "Brugere"
msgid "Are you sure to delete user \"%s\"?"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr "Er du sikker på du vil slette brugeren \"%s\"?"
msgid "Create user"
@@ -609,14 +605,12 @@ msgid "Only check if any amount is in stock"
msgstr "Marker kun hvis der er lagerbeholdning"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
"“Vil du nedskrive beholdning(er) på alle ingredienser der benyttes i "
"opskriften “ %s “(Ingredienser der er markeret som : Skal være i beholdning "
"- bliver ignoreret).”"
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr "Fjernede alle ingredienser til opskrift \"%s\" fra beholdningen"
msgid "Consume all ingredients needed by this recipe"
@@ -667,8 +661,8 @@ msgstr "Kategori"
msgid "Edit task"
msgstr "Rediger opgave"
msgid "Are you sure to delete task \"%s\"?"
msgstr "Er du sikker på at du vil slette opgaven \"%s\"?"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr ""
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
@@ -701,8 +695,8 @@ msgstr "Rediger varegruppe"
msgid "Product group"
msgstr "Varegruppe"
msgid "Are you sure to delete product group \"%s\"?"
msgstr "Er du sikker på at du vil slette varegruppen \"%s\"?"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr ""
msgid "Stay logged in permanently"
msgstr "Forbliv logget ind"
@@ -855,6 +849,8 @@ msgid ""
"The first item in this list would be picked by the default rule consume rule"
" (Opened first, then first due first, then first in first out)"
msgstr ""
"Den første varer på denne liste vil blive valgt efter standardreglen: (1. "
"Allerede åbnet, 2. Bedst før dato, 3. Først ind først ud.)"
msgid "Mark %1$s of %2$s as open"
msgstr "Marker %1$s %2$s som åben"
@@ -869,7 +865,9 @@ msgid "Not opened"
msgstr "Ikke åbnet"
msgid "Opened"
msgstr "Åbnet"
msgid_plural "Opened"
msgstr[0] ""
msgstr[1] ""
msgid "%s opened"
msgstr "%s åbnet"
@@ -1040,8 +1038,8 @@ msgstr "Opgave-indstillinger"
msgid "Create shopping list"
msgstr "Opret indkøbsliste"
msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "Er du sikker på at du vil slette indkøbslisten \"%s\"?"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr ""
msgid "Average shelf life"
msgstr "Gennemsnitlig holdbarhed"
@@ -1209,10 +1207,6 @@ msgstr "Aldrig"
msgid "Today"
msgstr "Idag"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Ikke alle ingredienser til opskrift \"%s\" er i beholdningen, intet fjernet"
msgid "Undo task"
msgstr "Fortryd opgave"
@@ -1251,8 +1245,8 @@ msgstr "Forbrugt mængde"
msgid "Time of printing"
msgstr "Tidspunkt for udskrift"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Er du sikker på du vil slette enheden \"%s\"?"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr ""
msgid "Parent product"
msgstr "Overordnet vare"
@@ -1316,7 +1310,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every %s days"
msgstr[0] ""
"Dette betyder at næste udførelse af denne pligt er planlagt til samme "
"tidspunkt (baseret på startdatoen) hver dag"
msgstr[1] ""
"Dette betyder at næste udførelse af denne pligt er planlagt til samme "
"tidspunkt (baseret på startdatoen) hver %s dage"
msgid ""
"This means the next execution of this chore is scheduled %s hour after the "
@@ -1325,7 +1323,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled %s hours after the "
"last execution"
msgstr[0] ""
"Dette betyder at næste udførelse af denne pligt er planlagt til %s time "
"efter den seneste udførelse"
msgstr[1] ""
"Dette betyder at næste udførelse af denne pligt er planlagt til %stimer "
"efter den seneste udførelse"
msgid ""
"This means the next execution of this chore is scheduled every week on the "
@@ -1334,7 +1336,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s weeks on "
"the selected weekdays"
msgstr[0] ""
"Dette betyder at næste udførelse af denne pligt er planlagt hver uge på de "
"valgte ugedage"
msgstr[1] ""
"Dette betyder at næste udførelse af denne pligt er planlagt hver %s uger på "
"de valgte ugedage"
msgid ""
"This means the next execution of this chore is scheduled on the selected day"
@@ -1400,8 +1406,8 @@ msgstr "Tildelt"
msgid "Consume product on chore execution"
msgstr "Forbrug vare ved udførsel af pligt"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Er du sikker på at du vil slette brugerfeltet \"%s\"?"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr "Brugerenheder"
@@ -1421,8 +1427,8 @@ msgstr "Rediger %s"
msgid "Create %s"
msgstr "Opret %s"
msgid "Are you sure to delete this userobject?"
msgstr "Er du sikker på at du vil slette denne brugerenhed?"
msgid "Are you sure you want to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr "Ikon CSS-klasse"
@@ -1456,7 +1462,7 @@ msgid "Price factor"
msgstr "Prisfaktor"
msgid "Do you find Grocy useful?"
msgstr ""
msgstr "Finder du grocy brugbart?"
msgid "Say thanks"
msgstr "Sig tak"
@@ -1507,9 +1513,12 @@ 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 ""
"Hvis aktiveret bliver minimumsbeholdning for underordnede varer akkumuleret "
"ind i denne vare så det kun er denne vare der mangler og ikke de "
"underordnede"
msgid "Are you sure to remove this conversion?"
msgstr "Er du sikker på at du vil fjerne denne konvertering"
msgid "Are you sure you want to remove this conversion?"
msgstr ""
msgid "Unit price"
msgstr "Enhedspris"
@@ -1526,8 +1535,8 @@ msgstr "Ubegrænset"
msgid "Clear"
msgstr "Ryd"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Er du sikker på du vil fjerne den inkluderede opskrift \"%s\"?"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr ""
msgid "Period interval"
msgstr "Periodeinterval"
@@ -1539,7 +1548,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s years on "
"the same day (based on the start date)"
msgstr[0] ""
"Dette betyder at næste udførelse af dette gøremål er planlagt hvert år på "
"den samme dag (baseret på startdatoen)"
msgstr[1] ""
"Dette betyder at næste udførelse af dette gøremål er planlagt hver %s år på "
"den samme dag (baseret på startdatoen)"
msgid "Transfer"
msgstr "Skift placering"
@@ -1584,6 +1597,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when Grocy is served via a secure (https://) connection"
msgstr ""
"Kameraadgang er kun muligt når det er understøttet og tilladt af din browser"
" og når Grocy tilgås gennem en sikker (https://) forbindelse"
msgid "Keep screen on"
msgstr "Hold skærmen tændt"
@@ -1610,8 +1625,8 @@ msgstr "Denne booking kan ikke fortrydes"
msgid "Booking does not exist or was already undone"
msgstr "Booking findes ikke eller blev allerede fortrudt"
msgid "Are you sure to delete API key \"%s\"?"
msgstr "Er du sikker på at du vil slette API nøglen \"%s\"?"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr ""
msgid "Add note"
msgstr "Tilføj note"
@@ -1664,8 +1679,8 @@ msgstr "Optøet"
msgid "Frozen"
msgstr "Frossen"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Vil du slette bruger-oplysninger for “%1s”?"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr ""
msgid "Shopping list settings"
msgstr "Indkøbsliste, opsætning"
@@ -1676,9 +1691,6 @@ msgstr "Vis kalender, månedsoversigt"
msgid "Desired servings"
msgstr "Antal portioner"
msgid "Base: %s"
msgstr "Basis: %s"
msgid "Recipes settings"
msgstr "Opskrifter, opsætning"
@@ -1762,7 +1774,7 @@ msgstr "Rediger stregkode"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
@@ -1894,7 +1906,7 @@ msgid "Chore journal"
msgstr "Historik over pligter"
msgid "Track next chore schedule"
msgstr ""
msgstr "Føl den næste planlagte pligt"
msgid "Mark task as completed"
msgstr "Marker opgave som afsluttet"
@@ -1921,6 +1933,7 @@ msgid ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgstr ""
"Dette er standard-indkøbsenheden når denne vare tilføjes til indkøbslisten"
msgid ""
"Show a warning when the due date of the purchased product is earlier than "
@@ -1929,8 +1942,8 @@ msgstr ""
"Vis en advarsel når bedst før datoen på den indkøbte vare er kortere end "
"allerede eksisterende vare i dit lager."
msgid "This is due earlier than already in-stock items"
msgstr "Bedst før er tidligere end samme vare på lager"
msgid "This is due earlier than already in stock items"
msgstr ""
msgid ""
"When enabled, after changing/scanning a product and if all fields could be "
@@ -1947,17 +1960,21 @@ msgid ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgstr ""
"Denne mængde anvendes af 'hurtig-forbrug-knappen' i lageroversigten (i "
"lagerenheden)"
msgid ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgstr ""
"Denne mængde anvendes af 'hurtig-åbn-knappen' i lageroversigten (i "
"lagerenheden)"
msgid "Copy"
msgstr "Kopier"
msgid "Are you sure to remove this barcode?"
msgstr "Vil du slette denne stregkode?"
msgid "Are you sure you want to remove this barcode?"
msgstr ""
msgid "Due date type"
msgstr "Type af udløbs-dato"
@@ -1996,6 +2013,9 @@ msgid ""
"today + this amount of days, but only if the resulting date is not after the"
" original due date (a value of 0 disables this)"
msgstr ""
"Når varen markeres åbnet, vil bedst før datoen bliver erstattet med dags "
"dato + dette antal dage, men kun hvis resultatet ikke er efter den originale"
" bedst før dato (en værdi på 0 deaktiverer dette)"
msgid "Default due days after opened"
msgstr "Bedst før dage efter åbning"
@@ -2143,8 +2163,8 @@ msgstr "Ingrediens-kategori"
msgid "Reset"
msgstr "Nulstil"
msgid "Are you sure to reset the table options?"
msgstr "Vil du nulstille tabel-valgmulighederne?"
msgid "Are you sure you want to reset the table options?"
msgstr ""
msgid "Hide/view columns"
msgstr "Gem/Vis kolonner"
@@ -2196,6 +2216,8 @@ msgid ""
"After merging, all occurences of this product will be replaced by the kept "
"product (means this product will not exist anymore)"
msgstr ""
"Efter sammenlægning vil alle instanser af denne vare blive erstattet med den"
" gemte vare (så denne vare vil ikke længere findes)"
msgid "Merge"
msgstr "Sammenlæg"
@@ -2207,13 +2229,10 @@ msgid "Link"
msgstr "Lænke"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
"Lager oversigten viser alle varer på lager eller under deres "
"minimumsbeholdning. Aktiver denne funktion for at skjule denne vare fra "
"listen."
msgid "Print options"
msgstr "Udskrifts-muligheder"
@@ -2222,19 +2241,21 @@ msgid "A product or a note is required"
msgstr "Der behøves en vare eller en note"
msgid "Grocycode"
msgstr ""
msgstr "Grocykode"
msgid "Download"
msgstr "Download"
# Example: Download *Product* Grocycode
msgid "Download %s Grocycode"
msgstr ""
msgstr "Hent %s grocykode"
msgid ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
msgstr ""
"Grocycode er en unik reference til denne %s i din Grocy-installation - print"
" den på en label og skan den som enhver anden stregkode"
# Abbreviation for "due date"
msgid "DD"
@@ -2247,13 +2268,13 @@ msgid "Default stock entry label"
msgstr ""
msgid "Stock entry label"
msgstr ""
msgstr "Lager indgangslabel"
msgid "No label"
msgstr "Ingen label"
msgid "Single label"
msgstr ""
msgstr "Enkelt label"
msgid "Label per unit"
msgstr "Label pr. enhed"
@@ -2263,7 +2284,7 @@ msgstr "Fejl ved afvikling af WebHook"
# Example: Print *Product* Grocycode on label printer
msgid "Print %s Grocycode on label printer"
msgstr ""
msgstr "Print %s grocykode på labelprinter"
msgid "Open stock entry label in new window"
msgstr ""
@@ -2283,8 +2304,8 @@ msgstr "Kan ikke printe"
msgid "Only done items"
msgstr "Kun færdige punkter"
msgid "Show only in-stock products"
msgstr "Vis kun varer på lager"
msgid "Show only in stock products"
msgstr ""
msgid "Product description"
msgstr "Produktbeskrivelse"
@@ -2306,8 +2327,8 @@ msgid "When enabled, then this field must be filled on the destination form"
msgstr ""
"Når dette felt er aktiveret, skal dette felt udfyldes i destinationsskemaet"
msgid "In-stock products"
msgstr "Varer på lager"
msgid "In stock products"
msgstr ""
msgid "Timestamp"
msgstr "Tidsstempel"
@@ -2391,14 +2412,14 @@ msgstr "Sektioner bliver sorteret efter dette nummer i madplanen"
msgid "Edit meal plan section"
msgstr "Rediger madplanssektion"
msgid "Are you sure to delete meal plan section \"%s\"?"
msgstr "Er du sikker på at du vil slette madplanssektionen \"%s\"?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr ""
msgid "Section"
msgstr "Sektion"
msgid "Are you sure to empty the shopping list?"
msgstr "Er du sikker på du vil tømme indkøbslisten?"
msgid "Are you sure you want to empty the shopping list?"
msgstr ""
msgid "This is the default which will be prefilled on purchase"
msgstr ""
@@ -2407,13 +2428,13 @@ msgid "Merge chores"
msgstr "Sammenlæg pligter"
msgid "Chore to keep"
msgstr "Pligt der beholdes"
msgstr "Gøremål der beholdes"
msgid "After merging, this chore will be kept"
msgstr "Efter sammenlægning, vil denne pligt blive gemt"
msgstr "Efter sammenlægning, vil dette gøremål blive gemt"
msgid "Chore to remove"
msgstr "Pligt der fjernes"
msgstr "Gøremål der fjernes"
msgid ""
"After merging, all occurences of this chore will be replaced by the kept "
@@ -2448,7 +2469,7 @@ msgid "Save & add another task"
msgstr "Gem & tilføj en anden opgave"
msgid "Treat opened as out of stock"
msgstr ""
msgstr "Håndter åbnet som ikke på lager"
msgid ""
"When enabled, opened items will be counted as missing for calculating if "
@@ -2474,7 +2495,7 @@ msgid "The start date cannot be changed when the chore was once tracked"
msgstr ""
msgid "Show the recipe list and the recipe side by side"
msgstr ""
msgstr "Vis opskrift listen og opskrifter side om side"
msgid ""
"This means the next execution of this chore is scheduled dynamically based "
@@ -2597,16 +2618,16 @@ msgid ""
msgstr ""
msgid "Show resolved conversions"
msgstr ""
msgstr "Vis løste samtaler"
msgid "QU conversions resolved"
msgstr "mængdeenhed konverteringsproblem løst"
msgid "Product specifc QU conversions"
msgstr "Vare specifikke mængdeenhed omregning"
msgid "Product specific QU conversions"
msgstr "Produktspecifikke QU-konverteringer"
msgid "Default quantity unit consume"
msgstr ""
msgstr "Standard mængdeenhed for forbrug"
msgid "This is the default quantity unit used when consuming this product"
msgstr ""
@@ -2630,61 +2651,122 @@ msgid ""
msgstr ""
msgid "Quick open amount"
msgstr ""
msgstr "Hurtig åbn mængde"
msgid "Track chore execution now"
msgstr ""
msgstr "Gem udførelse af gøremål nu"
msgid "Total"
msgstr ""
msgstr "Total"
msgid "Apply"
msgstr ""
msgstr "Anvend"
msgid "Custom range"
msgstr ""
msgstr "Tilpasset område"
msgid "Yesterday"
msgstr ""
msgstr "Igår"
msgid "Last %1$s day"
msgid_plural "Last %1$s days"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Sidste %1$s dag"
msgstr[1] "Sidste %1$s dage"
msgid "This month"
msgstr ""
msgstr "Denne måned"
msgid "Last month"
msgstr ""
msgstr "Sidste måned"
msgid "This year"
msgstr ""
msgstr "Dette år"
msgid "Last year"
msgstr ""
msgstr "Sidste år"
msgid "Reports"
msgstr ""
msgstr "Rapporter"
msgid "Spendings"
msgstr ""
msgstr "Brugt"
msgid "Stock report"
msgstr ""
msgstr "Lager rapport"
msgid "Out-of-stock products"
msgid "Out of stock products"
msgstr ""
msgid "Quantity unit for prices"
msgstr ""
msgstr "Mængdeenhed for priser"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr ""
"Når priserne for dette produkt vises, vil de være relateret til denne "
"mængdeenhed"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Dette betyder at 1 label vil blive printet"
msgstr[1] "Dette betyder at %1$s labels vil blive printet"
msgid "External barcode lookup"
msgstr ""
msgid "Error while executing the barcode lookup plugin"
msgstr "Fejl opstået under udførelse af stregkode opslag plugin"
msgid "Nothing was found for the given barcode"
msgstr "Intet fundet på denne stregkode"
msgid "Configure colors"
msgstr "Konfigurer farver"
msgid "Swap track next schedule / track now buttons"
msgstr ""
msgid "Scheduled tracking time"
msgstr ""
msgid "Time of tracking"
msgstr ""
msgid "Show all out of stock products"
msgstr ""
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
msgid "No price information is available for at least one ingredient"
msgstr ""
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
msgid "Can't be opened"
msgstr ""
msgid "Default purchase price type"
msgstr ""
msgid "This will be used as the default price type selection on purchase"
msgstr ""
msgid "Unspecified"
msgstr ""
msgid "Round up quantity amounts to the nearest whole number"
msgstr ""
msgid "Stock actions"
msgstr ""
msgid "List actions"
msgstr ""

View File

@@ -3,6 +3,7 @@
# Brian Moos Lindberg <brian@blueeel.dk>, 2019
# Mihai Marinescu <mihai@marinescu.dk>, 2020
# klavslund <klavslund@gmail.com>, 2021
# G Momsen, 2024
#
msgid ""
msgstr ""
@@ -10,7 +11,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: klavslund <klavslund@gmail.com>, 2021\n"
"Last-Translator: G Momsen, 2024\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -35,6 +36,10 @@ msgstr "tal-heltal"
msgid "number-decimal"
msgstr "tal-decimal"
# Number (currency)
msgid "number-currency"
msgstr "tal-valuta"
# Date (without time)
msgid "date"
msgstr "dato"

View File

@@ -1,6 +1,6 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2023
# Bernd Bestel <bernd@berrnd.de>, 2025
#
msgid ""
msgstr ""
@@ -8,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>, 2023\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -411,3 +411,6 @@ msgstr "Bier"
msgid "Estonian"
msgstr "Estnisch"
msgid "Bulgarian"
msgstr "Bulgarisch"

View File

@@ -1,6 +1,6 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2023
# Bernd Bestel <bernd@berrnd.de>, 2025
#
msgid ""
msgstr ""
@@ -8,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2023\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +27,7 @@ msgstr "Dänisch"
# German
msgid "de"
msgstr "de"
msgstr "Deutsch"
# Greek
msgid "el_GR"
@@ -35,7 +35,7 @@ msgstr "Griechisch"
# English
msgid "en"
msgstr "de"
msgstr "Englisch"
# English (Great Britain)
msgid "en_GB"
@@ -144,3 +144,7 @@ msgstr "Rumänisch"
# Estonian
msgid "et_EE"
msgstr "Estnisch"
# Bulgarian
msgid "bg_BG"
msgstr "Bulgarisch"

View File

@@ -3,7 +3,7 @@
# Luca RHK <luca@rhk-in.de>, 2020
# Tobias Wolter <mumpfpuffel@gmail.com>, 2020
# @RubenKelevra <ruben@freifunk-nrw.de>, 2021
# Bernd Bestel <bernd@berrnd.de>, 2023
# Bernd Bestel <bernd@berrnd.de>, 2025
#
msgid ""
msgstr ""
@@ -11,7 +11,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>, 2023\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,7 @@ msgstr ""
"X-Domain: grocy/strings\n"
msgid "Stock overview"
msgstr "Bestand"
msgstr "Bestandsübersicht"
msgid "%s product expires"
msgid_plural "%s products expiring"
@@ -63,10 +63,10 @@ msgid "Logout"
msgstr "Abmelden"
msgid "Chores overview"
msgstr "Hausarbeiten"
msgstr "Hausarbeitenübersicht"
msgid "Batteries overview"
msgstr "Batterien"
msgstr "Batterienübersicht"
msgid "Purchase"
msgstr "Einkauf"
@@ -162,7 +162,7 @@ msgid "Tracked time"
msgstr "Ausführungszeit"
msgid "Chore overview"
msgstr "Hausarbeitenübersicht"
msgstr "Hausarbeitübersicht"
msgid "Tracked count"
msgstr "Ausführungsanzahl"
@@ -281,8 +281,8 @@ msgstr "Passwort"
msgid "Invalid credentials, please try again"
msgstr "Ungültige Zugangsdaten, bitte versuche es erneut"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Battery \"%s\" wirklich löschen?"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr "Batterie \"%s\" wirklich löschen?"
msgid "Yes"
msgstr "Ja"
@@ -290,7 +290,7 @@ msgstr "Ja"
msgid "No"
msgstr "Nein"
msgid "Are you sure to delete chore \"%s\"?"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr "Hausarbeit \"%s\" wirklich löschen?"
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
@@ -313,16 +313,16 @@ msgstr "Barcode vorhandenem Produkt zuweisen"
msgid "Add as new product and prefill barcode"
msgstr "Neues Produkt erstellen und Barcode vorbelegen"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr "Mengeneinheit \"%s\" wirklich löschen?"
msgid "Are you sure to delete product \"%s\"?"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr "Produkt \"%s\" wirklich löschen?"
msgid "Are you sure to delete location \"%s\"?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr "Standort \"%s\" wirklich löschen?"
msgid "Are you sure to delete store \"%s\"?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr "Geschäft \"%s\" wirklich löschen?"
msgid "Manage API keys"
@@ -364,9 +364,6 @@ msgstr "Über Grocy"
msgid "Close"
msgstr "Schließen"
msgid "Released on"
msgstr "Veröffentlicht am"
msgid "Added %1$s of %2$s to stock"
msgstr "%1$s %2$s dem Bestand hinzugefügt"
@@ -439,13 +436,13 @@ msgstr "Rezeptzutat hinzufügen"
msgid "Edit recipe ingredient"
msgstr "Rezeptzutat bearbeiten"
msgid "Are you sure to delete recipe \"%s\"?"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr "Rezept \"%s\" wirklich löschen?"
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr "Rezeptzutat \"%s\" wirklich löschen?"
msgid "Are you sure to empty shopping list \"%s\"?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr "Einkaufszettel \"%s\" wirklich leeren? "
msgid "Clear list"
@@ -495,15 +492,12 @@ msgid "Put missing amount on shopping list"
msgstr "Fehlende Menge auf den Einkaufszettel setzen"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Alle fehlenden Zutaten für Rezept \"%s\" wirklich auf den Einkaufszettel "
"setzen?"
msgid "Added for recipe %s"
msgstr "Hinzugefügt für Rezept %s"
msgid "Manage users"
msgstr "Benutzer verwalten"
@@ -513,7 +507,7 @@ msgstr "Benutzer"
msgid "Users"
msgstr "Benutzer"
msgid "Are you sure to delete user \"%s\"?"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr "Benutzer \"%s\" wirklich löschen?"
msgid "Create user"
@@ -609,17 +603,18 @@ msgid "Only check if any amount is in stock"
msgstr "Nur prüfen, ob eine beliebige Menge im Bestand verfügbar ist"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
"Sicher, dass alle Zutaten, die vom Rezept \"%s\" benötigt werden, aus dem "
"Bestand entfernt werden sollen (Zutaten markiert mit \"Nur prüfen, ob eine "
"beliebige Menge im Bestand verfügbar ist\" werden ignoriert)?"
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr ""
"Alle Zutaten, die vom Rezept \"%s\" benötigt werden, wurden aus dem Bestand "
"entfernt"
"Alle vorrätigen Zutaten, die vom Rezept \"%s\" benötigt werden, wurden aus "
"dem Bestand entfernt"
msgid "Consume all ingredients needed by this recipe"
msgstr ""
@@ -671,7 +666,7 @@ msgstr "Kategorie"
msgid "Edit task"
msgstr "Aufgabe bearbeiten"
msgid "Are you sure to delete task \"%s\"?"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr "Aufgabe \"%s\" wirklich löschen?"
msgid "%s task is due to be done"
@@ -705,7 +700,7 @@ msgstr "Produktgruppe bearbeiten"
msgid "Product group"
msgstr "Produktgruppe"
msgid "Are you sure to delete product group \"%s\"?"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr "Produktgruppe \"%s\" wirklich löschen?"
msgid "Stay logged in permanently"
@@ -851,7 +846,7 @@ msgid "Add this item to stock"
msgstr "Diesen Eintrag zum Bestand hinzufügen"
msgid "Adding shopping list item %1$s of %2$s"
msgstr "Bearbeite Einkausfzetteleintrag %1$s von %2$s"
msgstr "Bearbeite Einkaufszetteleintrag %1$s von %2$s"
msgid "Use a specific stock item"
msgstr "Einen bestimmten Bestandseintrag verwenden"
@@ -877,7 +872,9 @@ msgid "Not opened"
msgstr "Nicht geöffnet"
msgid "Opened"
msgstr "Geöffnet"
msgid_plural "Opened"
msgstr[0] "Geöffnet"
msgstr[1] "Geöffnet"
msgid "%s opened"
msgstr "%s geöffnet"
@@ -946,7 +943,7 @@ msgid "You have to select a recipe"
msgstr "Ein Rezept muss ausgewählt werden"
msgid "Key type"
msgstr "Schlusseltyp"
msgstr "Schlüsseltyp"
msgid "Share/Integrate calendar (iCal)"
msgstr "Kalender teilen/integrieren (iCal)"
@@ -1051,7 +1048,7 @@ msgstr "Aufgabeneinstellungen"
msgid "Create shopping list"
msgstr "Einkaufszettel erstellen"
msgid "Are you sure to delete shopping list \"%s\"?"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr "Einkaufszettel \"%s\" wirklich löschen? "
msgid "Average shelf life"
@@ -1222,11 +1219,6 @@ msgstr "Nie"
msgid "Today"
msgstr "Heute"
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"
msgstr "Aufgabe rückgängig machen"
@@ -1266,7 +1258,7 @@ msgstr "Verbrauchte Menge"
msgid "Time of printing"
msgstr "Druckzeitpunkt"
msgid "Are you sure to delete equipment \"%s\"?"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr "Ausstattung \"%s\" wirklich löschen?"
msgid "Parent product"
@@ -1429,7 +1421,7 @@ msgstr "Zuweisung"
msgid "Consume product on chore execution"
msgstr "Ein Produkt bei der Ausführung verbrauchen"
msgid "Are you sure to delete user field \"%s\"?"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr "Benutzerfeld \"%s\" wirklich löschen?"
msgid "Userentities"
@@ -1450,7 +1442,7 @@ msgstr "%s bearbeiten"
msgid "Create %s"
msgstr "%s erstellen"
msgid "Are you sure to delete this userobject?"
msgid "Are you sure you want to delete this userobject?"
msgstr "Dieses Benutzerobjekt wirklich löschen?"
msgid "Icon CSS class"
@@ -1498,7 +1490,7 @@ 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"
msgstr "%1$s %2$s dem Einkaufszettel \"%3$s\" hinzugefügt"
msgid "Output"
msgstr "Ausgabe"
@@ -1540,7 +1532,7 @@ msgstr ""
"Wenn aktiviert, werden die Mindestbestände von untergeordneten Produkten "
"aufsummiert, heißt das untergeordnete Produkt kann nie fehlen, nur dieses"
msgid "Are you sure to remove this conversion?"
msgid "Are you sure you want to remove this conversion?"
msgstr "Diese Umrechnung wirklich löschen?"
msgid "Unit price"
@@ -1558,7 +1550,7 @@ msgstr "Unbegrenzt"
msgid "Clear"
msgstr "Löschen"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr "Das enthaltene Rezept \"%s\" wirklich löschen?"
msgid "Period interval"
@@ -1649,7 +1641,7 @@ msgstr "Die Buchung kann nicht rückgängig gemacht werden"
msgid "Booking does not exist or was already undone"
msgstr "Buchung existiert nicht oder wurde bereits rückgängig gemacht"
msgid "Are you sure to delete API key \"%s\"?"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr "API-Schlüssel \"%s\" wirklich löschen?"
msgid "Add note"
@@ -1705,7 +1697,7 @@ msgstr "Aufgetaut"
msgid "Frozen"
msgstr "Eingefroren"
msgid "Are you sure to delete userentity \"%s\"?"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr "Benutzerentität \"%s\" wirklich löschen?"
msgid "Shopping list settings"
@@ -1717,9 +1709,6 @@ msgstr "Einen Kalender (Monatsansicht) anzeigen"
msgid "Desired servings"
msgstr "Gewünschte Portionen"
msgid "Base: %s"
msgstr "Basis: %s"
msgid "Recipes settings"
msgstr "Rezepteinstellungen"
@@ -1804,7 +1793,7 @@ msgstr "Barcode bearbeiten"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
"Basierend auf den Preisen der Standardverbrauchsregel (Geöffnete zuerst, "
@@ -1978,7 +1967,7 @@ msgstr ""
"Eine Warnung anzeigen, wenn das Fälligkeitsdatum des gekauften Produkts vor "
"dem nächsten Fälligkeitsdatum von bereits vorrätigen Bestandseinträgen liegt"
msgid "This is due earlier than already in-stock items"
msgid "This is due earlier than already in stock items"
msgstr "Dies ist früher fällig als bereits vorhandene Bestandseinträge"
msgid ""
@@ -2011,7 +2000,7 @@ msgstr ""
msgid "Copy"
msgstr "Kopieren"
msgid "Are you sure to remove this barcode?"
msgid "Are you sure you want to remove this barcode?"
msgstr "Diesen Barcode wirklich löschen?"
msgid "Due date type"
@@ -2214,7 +2203,7 @@ msgstr "Zutatengruppe"
msgid "Reset"
msgstr "Zurücksetzen"
msgid "Are you sure to reset the table options?"
msgid "Are you sure you want to reset the table options?"
msgstr "Tabellenoptionen wirklich zurücksetzen?"
msgid "Hide/view columns"
@@ -2282,7 +2271,7 @@ msgid "Link"
msgstr "Link"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
@@ -2360,7 +2349,7 @@ msgstr "Drucken nicht möglich"
msgid "Only done items"
msgstr "Nur erledigte Einträge"
msgid "Show only in-stock products"
msgid "Show only in stock products"
msgstr "Nur vorrätige Produkte anzeigen"
msgid "Product description"
@@ -2382,7 +2371,7 @@ msgstr "Erforderliches Benutzerfeld"
msgid "When enabled, then this field must be filled on the destination form"
msgstr "Wenn aktiviert, dann muss dieses Feld ausgefüllt werden"
msgid "In-stock products"
msgid "In stock products"
msgstr "Vorrätige Produkte"
msgid "Timestamp"
@@ -2468,14 +2457,14 @@ msgstr "Die Abschnitte werden nach dieser Nummer auf dem Speiseplan sortiert"
msgid "Edit meal plan section"
msgstr "Speiseplanabschnitt bearbeiten"
msgid "Are you sure to delete meal plan section \"%s\"?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr "Speiseplanabschnitt \"%s\" wirklich löschen?"
msgid "Section"
msgstr "Abschnitt"
msgid "Are you sure to empty the shopping list?"
msgstr "Sicher, dass der Einkaufszettel geleert werden soll?"
msgid "Are you sure you want to empty the shopping list?"
msgstr "Den Einkaufszettel wirklich leeren? "
msgid "This is the default which will be prefilled on purchase"
msgstr "Dies ist die Standardeinstellung, die beim Einkauf vorbelegt wird"
@@ -2702,7 +2691,7 @@ msgstr "Aufgelöste ME-Umrechnungen anzeigen"
msgid "QU conversions resolved"
msgstr "Aufgelöste ME-Umrechnungen"
msgid "Product specifc QU conversions"
msgid "Product specific QU conversions"
msgstr "Produktspezifische ME-Umrechnungen"
msgid "Default quantity unit consume"
@@ -2778,7 +2767,7 @@ msgstr "Ausgaben"
msgid "Stock report"
msgstr "Bestandsbericht"
msgid "Out-of-stock products"
msgid "Out of stock products"
msgstr "Nicht vorrätige Produkte"
msgid "Quantity unit for prices"
@@ -2795,3 +2784,70 @@ msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] "Dies bedeutet 1 Bestandseintragsetikett wird gedruckt"
msgstr[1] "Dies bedeutet %1$s Bestandseintragsetiketten werden gedruckt"
msgid "External barcode lookup"
msgstr "Externe Barcode-Suche"
msgid "Error while executing the barcode lookup plugin"
msgstr "Fehler beim Ausführen des Barcode-Suche-Plugins"
msgid "Nothing was found for the given barcode"
msgstr "Für den angegebenen Barcode wurde nichts gefunden"
msgid "Configure colors"
msgstr "Farben konfigurieren"
msgid "Swap track next schedule / track now buttons"
msgstr ""
"Die Buttons \"Nächste geplante Ausführung erfassen\" / \"Ausführung jetzt "
"erfassen\" tauschen"
msgid "Scheduled tracking time"
msgstr "Geplante Ausführungszeit"
msgid "Time of tracking"
msgstr "Erfassungszeit"
msgid "Show all out of stock products"
msgstr "Alle nicht vorrätigen Produkte anzeigen"
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
"Standardmäßig listet die Bestandsübersicht alle Produkte auf, die derzeit im"
" Bestand oder unter ihrem Mindestbestand sind - aktiviere dies, um dort "
"immer alle (aktiven) Produkte anzuzeigen"
msgid "No price information is available for at least one ingredient"
msgstr "Für mindestens eine Zutat sind keine Preisinformationen verfügbar"
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
"Für Zutaten, die nur teilweise vorrätig sind, wird die vorrätige Menge "
"verbraucht."
msgid "Can't be opened"
msgstr "Kann nicht geöffnet werden"
msgid "Default purchase price type"
msgstr "Standard-Einkaufspreistyp"
msgid "This will be used as the default price type selection on purchase"
msgstr ""
"Dies wird als Standard für die Preistyp-Auswahl beim Einkauf verwendet"
msgid "Unspecified"
msgstr "Nicht spezifiziert"
msgid "Round up quantity amounts to the nearest whole number"
msgstr "Mengen auf die nächste ganze Zahl aufrunden"
msgid "Stock actions"
msgstr "Bestandsaktionen"
msgid "List actions"
msgstr "Listenaktionen"

View File

@@ -1,6 +1,6 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2020
# Bernd Bestel <bernd@berrnd.de>, 2023
#
msgid ""
msgstr ""
@@ -8,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>, 2020\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2023\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,6 +33,10 @@ msgstr "Zahl (Ganzzahl)"
msgid "number-decimal"
msgstr "Zahl (mit Dezimalstellen)"
# Number (currency)
msgid "number-currency"
msgstr "Zahl (Währung)"
# Date (without time)
msgid "date"
msgstr "Datum (ohne Zeitanteil)"

View File

@@ -406,3 +406,6 @@ msgstr ""
msgid "Estonian"
msgstr ""
msgid "Bulgarian"
msgstr ""

View File

@@ -2,6 +2,7 @@
# Translators:
# datablitz7 <plant7@gmail.com>, 2019
# emmker kats, 2022
# Vasilis Mourtzis, 2023
#
msgid ""
msgstr ""
@@ -9,7 +10,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: emmker kats, 2022\n"
"Last-Translator: Vasilis Mourtzis, 2023\n"
"Language-Team: Greek (Greece) (https://app.transifex.com/grocy/teams/93189/el_GR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,4 +38,4 @@ msgid "hourly"
msgstr "ωριαίο"
msgid "adaptive"
msgstr ""
msgstr "προσαρμοστικό"

View File

@@ -414,3 +414,6 @@ msgstr ""
msgid "Estonian"
msgstr ""
msgid "Bulgarian"
msgstr ""

View File

@@ -145,3 +145,7 @@ msgstr ""
# Estonian
msgid "et_EE"
msgstr ""
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@@ -8,6 +8,7 @@
# emmker kats, 2022
# Dimitris, 2022
# Lefteris Garyfalakis, 2022
# Vasilis Mourtzis, 2023
#
msgid ""
msgstr ""
@@ -15,7 +16,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: Lefteris Garyfalakis, 2022\n"
"Last-Translator: Vasilis Mourtzis, 2023\n"
"Language-Team: Greek (Greece) (https://app.transifex.com/grocy/teams/93189/el_GR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -287,8 +288,8 @@ msgstr "Κωδικός πρόσβασης"
msgid "Invalid credentials, please try again"
msgstr "Μη έγκυρα διαπιστευτήρια, δοκιμάστε ξανά"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε την μπαταρία \"%s\";"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr ""
msgid "Yes"
msgstr "Ναί"
@@ -296,8 +297,8 @@ msgstr "Ναί"
msgid "No"
msgstr "Οχι"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τη δουλειά \"%s\";"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr ""
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr ""
@@ -319,23 +320,23 @@ msgstr "Προσθέστε ως γραμμωτό κώδικα στο υπάρχ
msgid "Add as new product and prefill barcode"
msgstr "Προσθέστε ως νέο προϊόν και γραμμωτού κώδικα προσυμπλήρωσης"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τη μονάδα ποσότητας \"%s\";"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr ""
msgid "Are you sure to delete product \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το προϊόν \"%s\";"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr ""
msgid "Are you sure to delete location \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε την τοποθεσία \"%s\";"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr ""
msgid "Are you sure to delete store \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το κατάστημα \"%s\";"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Διαχείριση κλειδιών API"
msgid "REST API browser"
msgstr ""
msgstr "Περιηγητής REST API"
msgid "API keys"
msgstr "Κλειδιά API"
@@ -370,9 +371,6 @@ msgstr ""
msgid "Close"
msgstr "Κλείσε"
msgid "Released on"
msgstr "Κυκλοφόρησε στις"
msgid "Added %1$s of %2$s to stock"
msgstr "Προστέθηκε %1$s από %2$s στο απόθεμα"
@@ -445,14 +443,14 @@ msgstr "Προσθέστε συστατικό συνταγής"
msgid "Edit recipe ingredient"
msgstr "Επεξεργασία συστατικού συνταγής"
msgid "Are you sure to delete recipe \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τη συνταγή \"%s\";"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr ""
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το συστατικό συνταγής \"%s\";"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr ""
msgid "Are you sure to empty shopping list \"%s\"?"
msgstr "Είστε βέβαιοι ότι αδειάζετε τη λίστα αγορών \"%s\";"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr ""
msgid "Clear list"
msgstr "Σαφή κατάλογο"
@@ -499,14 +497,9 @@ msgid "Put missing amount on shopping list"
msgstr "Τοποθετήστε το ποσό που λείπει στη λίστα αγορών"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"ΠοσόΕίστε βέβαιοι ότι θα βάλετε όλα τα συστατικά που λείπουν για τη συνταγή "
"\"%s\" στη λίστα αγορών;"
msgid "Added for recipe %s"
msgstr "Προστέθηκε για τη συνταγή %s"
msgid "Manage users"
msgstr "Διαχείριση χρηστών"
@@ -517,8 +510,8 @@ msgstr "Χρήστης"
msgid "Users"
msgstr "Χρήστες"
msgid "Are you sure to delete user \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τον χρήστη \"%s\";"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr ""
msgid "Create user"
msgstr "Δημιουργία χρήστη"
@@ -614,12 +607,13 @@ msgid "Only check if any amount is in stock"
msgstr ""
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr "Καταργήθηκαν όλα τα συστατικά της συνταγής \"%s\" από το απόθεμα"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr ""
msgid "Consume all ingredients needed by this recipe"
msgstr "Καταναλώστε όλα τα συστατικά που απαιτούνται από αυτήν τη συνταγή"
@@ -669,8 +663,8 @@ msgstr "Κατηγορία"
msgid "Edit task"
msgstr "Επεξεργασία εργασίας"
msgid "Are you sure to delete task \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε την εργασία \"%s\";"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr ""
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
@@ -703,8 +697,8 @@ msgstr "Επεξεργασία ομάδας προϊόντων"
msgid "Product group"
msgstr "Ομάδα προϊόντων"
msgid "Are you sure to delete product group \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε την ομάδα προϊόντων \"%s\";"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr ""
msgid "Stay logged in permanently"
msgstr "Μείνετε μόνιμα συνδεδεμένοι"
@@ -873,7 +867,9 @@ msgid "Not opened"
msgstr "Δεν άνοιξε"
msgid "Opened"
msgstr "Άνοιξε"
msgid_plural "Opened"
msgstr[0] ""
msgstr[1] ""
msgid "%s opened"
msgstr "Το %s άνοιξε"
@@ -1046,8 +1042,8 @@ msgstr "Ρυθμίσεις εργασιών"
msgid "Create shopping list"
msgstr "Δημιουργία λίστας αγορών"
msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τη λίστα αγορών \"%s\";"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr ""
msgid "Average shelf life"
msgstr "Μέση διάρκεια ζωής"
@@ -1218,9 +1214,6 @@ msgstr "Ποτέ"
msgid "Today"
msgstr "Σήμερα"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Δεν υπάρχουν όλα τα συστατικά της συνταγής \"%s\", τίποτα δεν αφαιρείται"
msgid "Undo task"
msgstr ""
@@ -1258,8 +1251,8 @@ msgstr "Καταναλωμένο ποσό"
msgid "Time of printing"
msgstr "Ώρα εκτύπωσης"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε τον εξοπλισμό \"%s\";"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr ""
msgid "Parent product"
msgstr "Γονικό προϊόν"
@@ -1406,8 +1399,8 @@ msgstr "ΑΝΑΘΕΣΗ ΕΡΓΑΣΙΑΣ"
msgid "Consume product on chore execution"
msgstr "Καταναλώστε το προϊόν κατά την εκτέλεση της δουλειάς"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το πεδίο χρήστη \"%s\";"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr ""
msgid "Userentities"
msgstr "Χρήστες"
@@ -1427,8 +1420,8 @@ msgstr "Επεξεργασία %s"
msgid "Create %s"
msgstr "Δημιουργία %s"
msgid "Are you sure to delete this userobject?"
msgstr "Είστε βέβαιοι ότι διαγράψατε αυτό το αντικείμενο χρήστη;"
msgid "Are you sure you want to delete this userobject?"
msgstr ""
msgid "Icon CSS class"
msgstr "Εικονίδιο CSS τάξη"
@@ -1516,8 +1509,8 @@ msgid ""
"this product, means the sub product will never be missing, only this product"
msgstr ""
msgid "Are you sure to remove this conversion?"
msgstr "Είστε βέβαιοι ότι θα καταργήσετε αυτήν τη μετατροπή;"
msgid "Are you sure you want to remove this conversion?"
msgstr ""
msgid "Unit price"
msgstr "Τιμή μονάδας"
@@ -1534,8 +1527,8 @@ msgstr "Απεριόριστος"
msgid "Clear"
msgstr "Σαφή"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Είστε βέβαιοι ότι έχετε καταργήσει τη συνταγή \"%s\";"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr ""
msgid "Period interval"
msgstr "Διάστημα περιόδου"
@@ -1618,8 +1611,8 @@ msgstr "Δεν είναι δυνατή η αναίρεση αυτής της κ
msgid "Booking does not exist or was already undone"
msgstr "Η κράτηση δεν υπάρχει ή έχει ήδη αναιρεθεί"
msgid "Are you sure to delete API key \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το κλειδί API \"%s\";"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr ""
msgid "Add note"
msgstr "Προσθήκη σημείωσης"
@@ -1674,8 +1667,8 @@ msgstr "Αποψυχθεί"
msgid "Frozen"
msgstr "Παγωμένος"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Είστε βέβαιοι ότι θα διαγράψετε το userentity \"%s\";"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr ""
msgid "Shopping list settings"
msgstr "Ρυθμίσεις λίστας αγορών"
@@ -1686,9 +1679,6 @@ msgstr "Εμφάνιση ημερολογίου μηνιαίας προβολή
msgid "Desired servings"
msgstr "Επιθυμητές μερίδες"
msgid "Base: %s"
msgstr "Βάση: %s"
msgid "Recipes settings"
msgstr "Ρυθμίσεις συνταγών"
@@ -1772,7 +1762,7 @@ msgstr "Επεξεργασία Barcode"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
@@ -1935,7 +1925,7 @@ msgid ""
"the next due date in stock"
msgstr ""
msgid "This is due earlier than already in-stock items"
msgid "This is due earlier than already in stock items"
msgstr ""
msgid ""
@@ -1960,7 +1950,7 @@ msgstr ""
msgid "Copy"
msgstr "Αντιγραφή"
msgid "Are you sure to remove this barcode?"
msgid "Are you sure you want to remove this barcode?"
msgstr ""
msgid "Due date type"
@@ -2129,7 +2119,7 @@ msgstr ""
msgid "Reset"
msgstr "Επαναφορά"
msgid "Are you sure to reset the table options?"
msgid "Are you sure you want to reset the table options?"
msgstr ""
msgid "Hide/view columns"
@@ -2191,7 +2181,7 @@ msgid "Link"
msgstr "Σύνδεση"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
@@ -2264,7 +2254,7 @@ msgstr "Η εκτύπωση δεν είναι δυνατή"
msgid "Only done items"
msgstr ""
msgid "Show only in-stock products"
msgid "Show only in stock products"
msgstr ""
msgid "Product description"
@@ -2286,7 +2276,7 @@ msgstr ""
msgid "When enabled, then this field must be filled on the destination form"
msgstr ""
msgid "In-stock products"
msgid "In stock products"
msgstr ""
msgid "Timestamp"
@@ -2367,13 +2357,13 @@ msgstr ""
msgid "Edit meal plan section"
msgstr ""
msgid "Are you sure to delete meal plan section \"%s\"?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr ""
msgid "Section"
msgstr "Τμήμα"
msgid "Are you sure to empty the shopping list?"
msgid "Are you sure you want to empty the shopping list?"
msgstr ""
msgid "This is the default which will be prefilled on purchase"
@@ -2572,7 +2562,7 @@ msgstr ""
msgid "QU conversions resolved"
msgstr ""
msgid "Product specifc QU conversions"
msgid "Product specific QU conversions"
msgstr ""
msgid "Default quantity unit consume"
@@ -2643,7 +2633,7 @@ msgstr ""
msgid "Stock report"
msgstr ""
msgid "Out-of-stock products"
msgid "Out of stock products"
msgstr ""
msgid "Quantity unit for prices"
@@ -2658,3 +2648,62 @@ msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""
msgid "External barcode lookup"
msgstr ""
msgid "Error while executing the barcode lookup plugin"
msgstr ""
msgid "Nothing was found for the given barcode"
msgstr ""
msgid "Configure colors"
msgstr ""
msgid "Swap track next schedule / track now buttons"
msgstr ""
msgid "Scheduled tracking time"
msgstr ""
msgid "Time of tracking"
msgstr ""
msgid "Show all out of stock products"
msgstr ""
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
msgid "No price information is available for at least one ingredient"
msgstr ""
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
msgid "Can't be opened"
msgstr ""
msgid "Default purchase price type"
msgstr ""
msgid "This will be used as the default price type selection on purchase"
msgstr ""
msgid "Unspecified"
msgstr ""
msgid "Round up quantity amounts to the nearest whole number"
msgstr ""
msgid "Stock actions"
msgstr ""
msgid "List actions"
msgstr ""

View File

@@ -35,6 +35,10 @@ msgstr "αριθμός-ακέραιο"
msgid "number-decimal"
msgstr "αριθμός-δεκαδικός"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "ημερομηνία"

View File

@@ -1,292 +0,0 @@
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/demo_data\n"
msgid "Cookies"
msgstr "Cookies"
msgid "Chocolate"
msgstr "Chocolate"
msgid "Pantry"
msgstr "Pantry"
msgid "Candy cupboard"
msgstr "Candy cupboard"
msgid "Tinned food cupboard"
msgstr "Tinned food cupboard"
msgid "Fridge"
msgstr "Fridge"
msgid "Piece"
msgstr "Piece"
msgid "Pieces"
msgstr "Pieces"
msgid "Pack"
msgstr "Pack"
msgid "Packs"
msgstr "Packs"
msgid "Glass"
msgstr "Glass"
msgid "Glasses"
msgstr "Glasses"
msgid "Tin"
msgstr "Tin"
msgid "Tins"
msgstr "Tins"
msgid "Can"
msgstr "Can"
msgid "Cans"
msgstr "Cans"
msgid "Bunch"
msgstr "Bunch"
msgid "Bunches"
msgstr "Bunches"
msgid "Gummy bears"
msgstr "Gummy bears"
msgid "Crisps"
msgstr "Crisps"
msgid "Eggs"
msgstr "Eggs"
msgid "Noodles"
msgstr "Noodles"
msgid "Pickles"
msgstr "Pickles"
msgid "Gulash soup"
msgstr "Gulash soup"
msgid "Yogurt"
msgstr "Yogurt"
msgid "Cheese"
msgstr "Cheese"
msgid "Cold cuts"
msgstr "Cold cuts"
msgid "Paprika"
msgstr "Paprika"
msgid "Cucumber"
msgstr "Cucumber"
msgid "Radish"
msgstr "Radish"
msgid "Tomato"
msgstr "Tomato"
msgid "Changed towels in the bathroom"
msgstr "Changed towels in the bathroom"
msgid "Cleaned the kitchen floor"
msgstr "Cleaned the kitchen floor"
msgid "Warranty ends"
msgstr "Warranty ends"
msgid "TV remote control"
msgstr "TV remote control"
msgid "Alarm clock"
msgstr "Alarm clock"
msgid "Heat remote control"
msgstr "Heat remote control"
msgid "Lawn mowed in the garden"
msgstr "Lawn mowed in the garden"
msgid "Some good snacks"
msgstr "Some good snacks"
msgid "Pizza dough"
msgstr "Pizza dough"
msgid "Sieved tomatoes"
msgstr "Sieved tomatoes"
msgid "Salami"
msgstr "Salami"
msgid "Toast"
msgstr "Toast"
msgid "Minced meat"
msgstr "Minced meat"
msgid "Pizza"
msgstr "Pizza"
msgid "Spaghetti bolognese"
msgstr "Spaghetti bolognese"
msgid "Sandwiches"
msgstr "Sandwiches"
msgid "English"
msgstr "English"
msgid "German"
msgstr "German"
msgid "Italian"
msgstr "Italian"
msgid "Demo in different language"
msgstr "Demo in different language"
msgid "This is the note content of the recipe ingredient"
msgstr "This is the note content of the recipe ingredient"
msgid "Demo User"
msgstr "Demo User"
msgid "Gram"
msgstr "Gram"
msgid "Grams"
msgstr "Grams"
msgid "Flour"
msgstr "Flour"
msgid "Pancakes"
msgstr "Pancakes"
msgid "Sugar"
msgstr "Sugar"
msgid "Home"
msgstr "Home"
msgid "Life"
msgstr "Life"
msgid "Projects"
msgstr "Projects"
msgid "Repair the garage door"
msgstr "Repair the garage door"
msgid "Fork and improve grocy"
msgstr "Fork and improve grocy"
msgid "Find a solution for what to do when I forget the door keys"
msgstr "Find a solution for what to do when I forget the door keys"
msgid "Sweets"
msgstr "Sweets"
msgid "Bakery products"
msgstr "Bakery products"
msgid "Tinned food"
msgstr "Tinned food"
msgid "Butchery products"
msgstr "Butchery products"
msgid "Vegetables/Fruits"
msgstr "Vegetables/Fruits"
msgid "Refrigerated products"
msgstr "Refrigerated products"
msgid "Coffee machine"
msgstr "Coffee machine"
msgid "Dishwasher"
msgstr "Dishwasher"
msgid "Liter"
msgstr "Liter"
msgid "Liters"
msgstr "Liters"
msgid "Bottle"
msgstr "Bottle"
msgid "Bottles"
msgstr "Bottles"
msgid "Milk"
msgstr "Milk"
msgid "Chocolate sauce"
msgstr "Chocolate sauce"
msgid "Milliliters"
msgstr "Milliliters"
msgid "Milliliter"
msgstr "Milliliter"
msgid "Bottom"
msgstr "Bottom"
msgid "Topping"
msgstr "Topping"
msgid "French"
msgstr "French"
msgid "Turkish"
msgstr "Turkish"
msgid "Spanish"
msgstr "Spanish"
msgid "Russian"
msgstr "Russian"
msgid "The thing which happens on the 5th of every month"
msgstr "The thing which happens on the 5th of every month"
msgid "The thing which happens daily"
msgstr "The thing which happens daily"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr "The thing which happens on Mondays and Wednesdays"
msgid "Swedish"
msgstr "Swedish"
msgid "Polish"
msgstr "Polish"
msgid "DemoSupermarket1"
msgstr "Walmart"
msgid "DemoSupermarket2"
msgstr "Kroger"

View File

@@ -95,3 +95,18 @@ msgstr "Finnish"
msgid "ca"
msgstr "Catalan"
msgid "lt"
msgstr "Lithuanian"
msgid "uk"
msgstr "Ukrainian"
msgid "ro_RO"
msgstr "Romanian"
msgid "et_EE"
msgstr "Estonian"
msgid "bg_BG"
msgstr "Bulgarian"

File diff suppressed because it is too large Load Diff

View File

@@ -24,6 +24,9 @@ msgstr "Number (integral)"
msgid "number-decimal"
msgstr "Number (decimal)"
msgid "number-currency"
msgstr "Number (currency)"
msgid "date"
msgstr "Date (without time)"

View File

@@ -6,6 +6,7 @@
# Chris H <cjh861@outlook.com>, 2021
# David Knapman <dai.knapz@gmail.com>, 2021
# Johnnie Blows, 2022
# Andi Chandler <andi@gowling.com>, 2023
#
msgid ""
msgstr ""
@@ -13,7 +14,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: Johnnie Blows, 2022\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2023\n"
"Language-Team: English (United Kingdom) (https://app.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -386,33 +387,36 @@ msgid "Slovenian"
msgstr "Slovenian"
msgid "Lithuanian"
msgstr ""
msgstr "Lithuanian"
msgid "Ukrainian"
msgstr ""
msgstr "Ukrainian"
msgid "Kilogram"
msgid_plural "Kilograms"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Kilogram"
msgstr[1] "Kilograms"
msgid "Romanian"
msgstr ""
msgstr "Romanian"
msgid "Pint"
msgstr ""
msgstr "Pint"
msgid "Beverages"
msgstr ""
msgstr "Beverages"
msgid "Ice Cream"
msgstr ""
msgstr "Ice Cream"
msgid "Soda"
msgstr ""
msgstr "Soda"
msgid "Beer"
msgstr ""
msgstr "Beer"
msgid "Estonian"
msgstr "Estonian"
msgid "Bulgarian"
msgstr ""

View File

@@ -95,3 +95,18 @@ msgstr "Finnish"
msgid "ca"
msgstr "Catalan"
msgid "lt"
msgstr "Lithuanian"
msgid "uk"
msgstr "Ukrainian"
msgid "ro_RO"
msgstr "Romanian"
msgid "et_EE"
msgstr "Estonian"
msgid "bg_BG"
msgstr "Bulgarian"

View File

@@ -5,7 +5,8 @@
# duck. <me@duck.me.uk>, 2020
# John Coles <john@johncoles.com>, 2020
# w ralb <g.frcy.trnsfx@barlowhome.org>, 2021
# David Knapman <dai.knapz@gmail.com>, 2021
# George Aston, 2024
# Andi Chandler <andi@gowling.com>, 2025
#
msgid ""
msgstr ""
@@ -13,7 +14,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: David Knapman <dai.knapz@gmail.com>, 2021\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2025\n"
"Language-Team: English (United Kingdom) (https://app.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -38,7 +39,7 @@ msgstr[1] "within the next %s days"
msgid "%s product is already expired"
msgid_plural "%s products are already expired"
msgstr[0] "%s product is already expired"
msgstr[1] "%s products are already expired"
msgstr[1] "%s products have already expired"
msgid "%s product is overdue"
msgid_plural "%s products are overdue"
@@ -282,8 +283,8 @@ msgstr "Password"
msgid "Invalid credentials, please try again"
msgstr "Invalid credentials, please try again"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Are you sure to delete battery \"%s\"?"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr "Are you sure you want to delete battery \"%s\"?"
msgid "Yes"
msgstr "Yes"
@@ -291,8 +292,8 @@ msgstr "Yes"
msgid "No"
msgstr "No"
msgid "Are you sure to delete chore \"%s\"?"
msgstr "Are you sure to delete chore \"%s\"?"
msgid "Are you sure you want to delete chore \"%s\"?"
msgstr "Are you sure you want to delete chore \"%s\"?"
msgid "\"%s\" could not be resolved to a product, how do you want to proceed?"
msgstr "\"%s\" could not be resolved to a product, how do you want to proceed?"
@@ -312,17 +313,17 @@ msgstr "Add as barcode to existing product"
msgid "Add as new product and prefill barcode"
msgstr "Add as new product and prefill barcode"
msgid "Are you sure to delete quantity unit \"%s\"?"
msgstr "Are you sure to delete quantity unit \"%s\"?"
msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr "Are you sure you want to delete quantity unit \"%s\"?"
msgid "Are you sure to delete product \"%s\"?"
msgstr "Are you sure to delete product \"%s\"?"
msgid "Are you sure you want to delete product \"%s\"?"
msgstr "Are you sure you want to delete product \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Are you sure to delete location \"%s\"?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr "Are you sure you want to delete location \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Are you sure to delete shop \"%s\"?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr "Are you sure you want to delete store \"%s\"?"
msgid "Manage API keys"
msgstr "Manage API keys"
@@ -358,14 +359,11 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "Removed %1$s of %2$s from stock"
msgid "About Grocy"
msgstr ""
msgstr "About Grocy"
msgid "Close"
msgstr "Close"
msgid "Released on"
msgstr "Released on"
msgid "Added %1$s of %2$s to stock"
msgstr "Added %1$s of %2$s to stock"
@@ -438,14 +436,14 @@ msgstr "Add recipe ingredient"
msgid "Edit recipe ingredient"
msgstr "Edit recipe ingredient"
msgid "Are you sure to delete recipe \"%s\"?"
msgstr "Are you sure to delete recipe \"%s\"?"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr "Are you sure you want to delete recipe \"%s\"?"
msgid "Are you sure to delete recipe ingredient \"%s\"?"
msgstr "Are you sure to delete recipe ingredient \"%s\"?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr "Are you sure you want to delete ingredient \"%s\"?"
msgid "Are you sure to empty shopping list \"%s\"?"
msgstr "Are you sure to empty shopping list \"%s\"?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr "Are you sure you want to empty shopping list \"%s\"?"
msgid "Clear list"
msgstr "Clear list"
@@ -490,14 +488,11 @@ msgid "Put missing amount on shopping list"
msgstr "Put missing amount on shopping list"
msgid ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Are you sure to put all missing ingredients for recipe \"%s\" on the "
"shopping list?"
msgid "Added for recipe %s"
msgstr "Added for recipe %s"
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgid "Manage users"
msgstr "Manage users"
@@ -508,8 +503,8 @@ msgstr "User"
msgid "Users"
msgstr "Users"
msgid "Are you sure to delete user \"%s\"?"
msgstr "Are you sure to delete user \"%s\"?"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr "Are you sure you want to delete user \"%s\"?"
msgid "Create user"
msgstr "Create user"
@@ -603,14 +598,16 @@ msgid "Only check if any amount is in stock"
msgstr "Only check if any amount is in stock"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by recipe \"%s\" "
"(ingredients marked with \"only check if any amount is in stock\" will be "
"ignored)?"
msgstr ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
" marked with \"only check if any amount is in stock\" will be ignored)?"
"Are you sure you want to consume all ingredients needed by this recipe "
"\"%s\"? (Ingredients marked with \"only check if any amount is in stock\" "
"will be ignored)"
msgid "Removed all ingredients of recipe \"%s\" from stock"
msgstr "Removed all ingredients of recipe \"%s\" from stock"
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgid "Consume all ingredients needed by this recipe"
msgstr "Consume all ingredients needed by this recipe"
@@ -660,8 +657,8 @@ msgstr "Category"
msgid "Edit task"
msgstr "Edit task"
msgid "Are you sure to delete task \"%s\"?"
msgstr "Are you sure to delete task \"%s\"?"
msgid "Are you sure you want to delete task \"%s\"?"
msgstr "Are you sure you want to delete task \"%s\"?"
msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done"
@@ -694,8 +691,8 @@ msgstr "Edit product group"
msgid "Product group"
msgstr "Product group"
msgid "Are you sure to delete product group \"%s\"?"
msgstr "Are you sure to delete product group \"%s\"?"
msgid "Are you sure you want to delete product group \"%s\"?"
msgstr "Are you sure you want to delete product group \"%s\"?"
msgid "Stay logged in permanently"
msgstr "Stay logged in permanently"
@@ -848,6 +845,8 @@ msgid ""
"The first item in this list would be picked by the default rule consume rule"
" (Opened first, then first due first, then first in first out)"
msgstr ""
"The first item in this list would be picked by the default rule consume rule"
" (Opened first, then first due first, then first in first out)"
msgid "Mark %1$s of %2$s as open"
msgstr "Mark %1$s of %2$s as open"
@@ -862,7 +861,9 @@ msgid "Not opened"
msgstr "Not opened"
msgid "Opened"
msgstr "Opened"
msgid_plural "Opened"
msgstr[0] "Opened"
msgstr[1] "Opened"
msgid "%s opened"
msgstr "%s opened"
@@ -1031,8 +1032,8 @@ msgstr "Tasks settings"
msgid "Create shopping list"
msgstr "Create shopping list"
msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "Are you sure to delete shopping list \"%s\"?"
msgid "Are you sure you want to delete shopping list \"%s\"?"
msgstr "Are you sure you want to delete shopping list \"%s\"?"
msgid "Average shelf life"
msgstr "Average shelf life"
@@ -1198,9 +1199,6 @@ msgstr "Never"
msgid "Today"
msgstr "Today"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgid "Undo task"
msgstr "Undo task"
@@ -1239,8 +1237,8 @@ msgstr "Consumend amount"
msgid "Time of printing"
msgstr "Time of printing"
msgid "Are you sure to delete equipment \"%s\"?"
msgstr "Are you sure to delete equipment \"%s\"?"
msgid "Are you sure you want to delete equipment \"%s\"?"
msgstr "Are you sure you want to delete equipment \"%s\"?"
msgid "Parent product"
msgstr "Parent product"
@@ -1304,7 +1302,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every %s days"
msgstr[0] ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every day"
msgstr[1] ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every %s days"
msgid ""
"This means the next execution of this chore is scheduled %s hour after the "
@@ -1313,7 +1315,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled %s hours after the "
"last execution"
msgstr[0] ""
"This means the next execution of this chore is scheduled %s hour after the "
"last execution"
msgstr[1] ""
"This means the next execution of this chore is scheduled %s hours after the "
"last execution"
msgid ""
"This means the next execution of this chore is scheduled every week on the "
@@ -1322,7 +1328,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s weeks on "
"the selected weekdays"
msgstr[0] ""
"This means the next execution of this chore is scheduled every week on the "
"selected weekdays"
msgstr[1] ""
"This means the next execution of this chore is scheduled every %s weeks on "
"the selected weekdays"
msgid ""
"This means the next execution of this chore is scheduled on the selected day"
@@ -1331,7 +1341,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled on the selected day"
" every %s months"
msgstr[0] ""
"This means the next execution of this chore is scheduled on the selected day"
" every month"
msgstr[1] ""
"This means the next execution of this chore is scheduled on the selected day"
" every %s months"
msgid "This means the next execution of this chore is not scheduled"
msgstr "This means the next execution of this chore is not scheduled"
@@ -1381,8 +1395,8 @@ msgstr "Assignment"
msgid "Consume product on chore execution"
msgstr "Consume product on chore execution"
msgid "Are you sure to delete user field \"%s\"?"
msgstr "Are you sure to delete user field \"%s\"?"
msgid "Are you sure you want to delete user field \"%s\"?"
msgstr "Are you sure you want to delete user field \"%s\"?"
msgid "Userentities"
msgstr "Userentities"
@@ -1402,8 +1416,8 @@ msgstr "Edit %s"
msgid "Create %s"
msgstr "Create %s"
msgid "Are you sure to delete this userobject?"
msgstr "Are you sure to delete this userobject?"
msgid "Are you sure you want to delete this userobject?"
msgstr "Are you sure you want to delete this userobject?"
msgid "Icon CSS class"
msgstr "Icon CSS class"
@@ -1438,7 +1452,7 @@ msgid "Price factor"
msgstr "Price factor"
msgid "Do you find Grocy useful?"
msgstr ""
msgstr "Do you find Grocy useful?"
msgid "Say thanks"
msgstr "Say thanks"
@@ -1456,7 +1470,7 @@ msgid "Output"
msgstr "Output"
msgid "Energy"
msgstr ""
msgstr "Energy"
msgid "Per stock quantity unit"
msgstr "Per stock quantity unit"
@@ -1489,9 +1503,11 @@ 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 ""
"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"
msgid "Are you sure to remove this conversion?"
msgstr "Are you sure to remove this conversion?"
msgid "Are you sure you want to remove this conversion?"
msgstr "Are you sure you want to remove this conversion?"
msgid "Unit price"
msgstr "Unit price"
@@ -1508,8 +1524,8 @@ msgstr "Unlimited"
msgid "Clear"
msgstr "Clear"
msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Are you sure to remove the included recipe \"%s\"?"
msgid "Are you sure you want to remove the included recipe \"%s\"?"
msgstr "Are you sure you want to remove the included recipe \"%s\"?"
msgid "Period interval"
msgstr "Period interval"
@@ -1521,7 +1537,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s years on "
"the same day (based on the start date)"
msgstr[0] ""
"This means the next execution of this chore is scheduled every year on the "
"same day (based on the start date)"
msgstr[1] ""
"This means the next execution of this chore is scheduled every %s years on "
"the same day (based on the start date)"
msgid "Transfer"
msgstr "Transfer"
@@ -1566,6 +1586,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when Grocy is served via a secure (https://) connection"
msgstr ""
"Camera access is only possible when supported and allowed by your browser "
"and when Grocy is served via a secure (https://) connection"
msgid "Keep screen on"
msgstr "Keep screen on"
@@ -1592,8 +1614,8 @@ msgstr "This booking cannot be undone"
msgid "Booking does not exist or was already undone"
msgstr "Booking does not exist or was already undone"
msgid "Are you sure to delete API key \"%s\"?"
msgstr "Are you sure to delete API key \"%s\"?"
msgid "Are you sure you want to delete API key \"%s\"?"
msgstr "Are you sure you want to delete API key \"%s\"?"
msgid "Add note"
msgstr "Add note"
@@ -1645,8 +1667,8 @@ msgstr "Thawed"
msgid "Frozen"
msgstr "Frozen"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Are you sure to delete userentity \"%s\"?"
msgid "Are you sure you want to delete userentity \"%s\"?"
msgstr "Are you sure you want to delete userentity \"%s\"?"
msgid "Shopping list settings"
msgstr "Shopping list settings"
@@ -1657,9 +1679,6 @@ msgstr "Show a month-view calendar"
msgid "Desired servings"
msgstr "Desired servings"
msgid "Base: %s"
msgstr "Base: %s"
msgid "Recipes settings"
msgstr "Recipes settings"
@@ -1743,9 +1762,12 @@ msgstr "Edit Barcode"
msgid ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in-stock ingredients and on the last"
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgstr ""
"Based on the prices of the default consume rule (Opened first, then first "
"due first, then first in first out) for in stock ingredients and on the last"
" price for missing ones"
msgid "Clear filter"
msgstr "Clear filter"
@@ -1875,7 +1897,7 @@ msgid "Chore journal"
msgstr "Chore journal"
msgid "Track next chore schedule"
msgstr ""
msgstr "Track next chore schedule"
msgid "Mark task as completed"
msgstr "Mark task as completed"
@@ -1902,6 +1924,8 @@ msgid ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgstr ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgid ""
"Show a warning when the due date of the purchased product is earlier than "
@@ -1910,8 +1934,8 @@ msgstr ""
"Show a warning when the due date of the purchased product is earlier than "
"the next due date in stock"
msgid "This is due earlier than already in-stock items"
msgstr "This is due earlier than already in-stock items"
msgid "This is due earlier than already in stock items"
msgstr "This is due earlier than already in stock items"
msgid ""
"When enabled, after changing/scanning a product and if all fields could be "
@@ -1929,17 +1953,21 @@ msgid ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgstr ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgid ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgstr ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgid "Copy"
msgstr "Copy"
msgid "Are you sure to remove this barcode?"
msgstr "Are you sure to remove this barcode?"
msgid "Are you sure you want to remove this barcode?"
msgstr "Are you sure you want to remove this barcode?"
msgid "Due date type"
msgstr "Due date type"
@@ -2136,8 +2164,8 @@ msgstr "Ingredient group"
msgid "Reset"
msgstr "Reset"
msgid "Are you sure to reset the table options?"
msgstr "Are you sure to reset the table options?"
msgid "Are you sure you want to reset the table options?"
msgstr "Are you sure you want to reset the table options?"
msgid "Hide/view columns"
msgstr "Hide/view columns"
@@ -2180,7 +2208,7 @@ msgid "Product to remove"
msgstr "Product to remove"
msgid "Error while merging"
msgstr ""
msgstr "Error while merging"
msgid "After merging, this product will be kept"
msgstr "After merging, this product will be kept"
@@ -2189,6 +2217,8 @@ msgid ""
"After merging, all occurences of this product will be replaced by the kept "
"product (means this product will not exist anymore)"
msgstr ""
"After merging, all occurences of this product will be replaced by the kept "
"product (means this product will not exist anymore)"
msgid "Merge"
msgstr "Merge"
@@ -2200,11 +2230,11 @@ msgid "Link"
msgstr "Link"
msgid ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
msgstr ""
"The stock overview page lists all products which are currently in-stock or "
"The stock overview page lists all products which are currently in stock or "
"below their min. stock amount - enable this to hide this product there "
"always"
@@ -2215,19 +2245,21 @@ msgid "A product or a note is required"
msgstr "A product or a note is required"
msgid "Grocycode"
msgstr ""
msgstr "Grocycode"
msgid "Download"
msgstr "Download"
# Example: Download *Product* Grocycode
msgid "Download %s Grocycode"
msgstr ""
msgstr "Download %s Grocycode"
msgid ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
msgstr ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
# Abbreviation for "due date"
msgid "DD"
@@ -2237,7 +2269,7 @@ msgid "Print on label printer"
msgstr "Print on label printer"
msgid "Default stock entry label"
msgstr ""
msgstr "Default stock entry label"
msgid "Stock entry label"
msgstr "Stock entry label"
@@ -2256,7 +2288,7 @@ msgstr "Error while executing WebHook"
# Example: Print *Product* Grocycode on label printer
msgid "Print %s Grocycode on label printer"
msgstr ""
msgstr "Print %s Grocycode on label printer"
msgid "Open stock entry label in new window"
msgstr "Open stock entry label in new window"
@@ -2276,8 +2308,8 @@ msgstr "Unable to print"
msgid "Only done items"
msgstr "Only done items"
msgid "Show only in-stock products"
msgstr "Show only in-stock products"
msgid "Show only in stock products"
msgstr "Show only in stock products"
msgid "Product description"
msgstr "Product description"
@@ -2298,8 +2330,8 @@ msgstr "Mandatory Userfield"
msgid "When enabled, then this field must be filled on the destination form"
msgstr "When enabled, then this field must be filled on the destination form"
msgid "In-stock products"
msgstr "In-stock products"
msgid "In stock products"
msgstr "In stock products"
msgid "Timestamp"
msgstr "Timestamp"
@@ -2384,294 +2416,385 @@ msgstr "Sections will be ordered by that number on the meal plan"
msgid "Edit meal plan section"
msgstr "Edit meal plan section"
msgid "Are you sure to delete meal plan section \"%s\"?"
msgstr "Are you sure to delete meal plan section \"%s\"?"
msgid "Are you sure you want to delete meal plan section \"%s\"?"
msgstr "Are you sure you want to delete meal plan section \"%s\"?"
msgid "Section"
msgstr "Section"
msgid "Are you sure to empty the shopping list?"
msgstr "Are you sure to empty the shopping list?"
msgid "Are you sure you want to empty the shopping list?"
msgstr "Are you sure you want to empty the shopping list?"
msgid "This is the default which will be prefilled on purchase"
msgstr ""
msgstr "This is the default which will be prefilled on purchase"
msgid "Merge chores"
msgstr ""
msgstr "Merge chores"
msgid "Chore to keep"
msgstr ""
msgstr "Chore to keep"
msgid "After merging, this chore will be kept"
msgstr ""
msgstr "After merging, this chore will be kept"
msgid "Chore to remove"
msgstr ""
msgstr "Chore to remove"
msgid ""
"After merging, all occurences of this chore will be replaced by the kept "
"chore (means this chore will not exist anymore)"
msgstr ""
"After merging, all occurences of this chore will be replaced by the kept "
"chore (means this chore will not exist anymore)"
msgid "Due today"
msgstr ""
msgstr "Due today"
msgid "%s task is due to be done today"
msgid_plural "%s tasks are due to be done today"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%s task is due to be done today"
msgstr[1] "%s tasks are due to be done today"
msgid "%s chore is due to be done today"
msgid_plural "%s chores are due to be done today"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%s chore is due to be done today"
msgstr[1] "%s chores are due to be done today"
msgid "%s battery is due to be charged today"
msgid_plural "%s batteries are due to be charged today"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%s battery is due to be charged today"
msgstr[1] "%s batteries are due to be charged today"
msgid "Set to 0 to hide due soon filters/highlighting"
msgstr ""
msgstr "Set to 0 to hide due soon filters/highlighting"
msgid "Save & close"
msgstr ""
msgstr "Save & close"
msgid "Save & add another task"
msgstr ""
msgstr "Save & add another task"
msgid "Treat opened as out of stock"
msgstr ""
msgstr "Treat opened as out of stock"
msgid ""
"When enabled, opened items will be counted as missing for calculating if "
"this product is below its minimum stock amount"
msgstr ""
"When enabled, opened items will be counted as missing for calculating if "
"this product is below its minimum stock amount"
msgid "Skipped"
msgstr ""
msgstr "Skipped"
msgid "Skip next chore schedule"
msgstr ""
msgstr "Skip next chore schedule"
msgid "Time"
msgstr ""
msgstr "Time"
msgid "A start date is required"
msgstr ""
msgstr "A start date is required"
msgid "Start date"
msgstr ""
msgstr "Start date"
msgid "The start date cannot be changed when the chore was once tracked"
msgstr ""
msgstr "The start date cannot be changed when the chore was once tracked"
msgid "Show the recipe list and the recipe side by side"
msgstr ""
msgstr "Show the recipe list and the recipe side by side"
msgid ""
"This means the next execution of this chore is scheduled dynamically based "
"on the past average execution frequency"
msgstr ""
"This means the next execution of this chore is scheduled dynamically based "
"on the past average execution frequency"
msgid "Average execution frequency"
msgstr ""
msgstr "Average execution frequency"
msgid "Reschedule next execution"
msgstr ""
msgstr "Reschedule next execution"
msgid "This can only be in the future"
msgstr ""
msgstr "This can only be in the future"
msgid "Rescheduled"
msgstr ""
msgstr "Rescheduled"
msgid "Due score"
msgstr ""
msgstr "Due score"
msgid ""
"The higher this number is, the more ingredients currently in stock are due "
"soon, overdue or already expired"
msgstr ""
"The higher this number is, the more ingredients currently in stock are due "
"soon, overdue or already expired"
msgid "Disable own stock"
msgstr ""
msgstr "Disable own stock"
msgid ""
"When enabled, this product can't have own stock, means it will not be "
"selectable on purchase (useful for parent products which are just used as a "
"summary/total view of the child products)"
msgstr ""
"When enabled, this product can't have own stock, means it will not be "
"selectable on purchase (useful for parent products which are just used as a "
"summary/total view of the child products)"
msgid "Out of stock items will be shown at the products default location"
msgstr ""
msgstr "Out of stock items will be shown at the products default location"
msgid "Show a little checkbox next to each ingredient to mark it as done"
msgstr ""
msgstr "Show a little checkbox next to each ingredient to mark it as done"
msgid ""
"The ingredient is crossed out when clicked, the status is not saved, means "
"reset when the page is reloaded"
msgstr ""
"The ingredient is crossed out when clicked, the status is not saved, means "
"reset when the page is reloaded"
msgid ""
"The parent product %1$s is currently not in stock, %2$s is the current next "
"sub product based on the default consume rule (Opened first, then first due "
"first, then first in first out)"
msgstr ""
"The parent product %1$s is currently not in stock, %2$s is the current next "
"sub product based on the default consume rule (Opened first, then first due "
"first, then first in first out)"
msgid "Night mode"
msgstr ""
msgstr "Night mode"
msgid "On"
msgstr ""
msgstr "On"
msgid "Use system setting"
msgstr ""
msgstr "Use system setting"
msgid "Off"
msgstr ""
msgstr "Off"
msgid ""
"Automatically add products that are below their defined min. stock amount to"
" the shopping list"
msgstr ""
"Automatically add products that are below their defined min. stock amount to"
" the shopping list"
msgid "Reassigned"
msgstr ""
msgstr "Reassigned"
msgid "Default value"
msgstr ""
msgstr "Default value"
msgid "Now / today"
msgstr ""
msgstr "Now / today"
msgid "Add meal plan entry"
msgstr ""
msgstr "Add meal plan entry"
msgid "Edit meal plan entry"
msgstr ""
msgstr "Edit meal plan entry"
msgid "Default consume location"
msgstr ""
msgstr "Default consume location"
msgid "Stock entries at this location will be consumed first"
msgstr ""
msgstr "Stock entries at this location will be consumed first"
msgid "Move on open"
msgstr ""
msgstr "Move on open"
msgid ""
"When enabled, on marking this product as opened, the corresponding amount "
"will be moved to the default consume location"
msgstr ""
"When enabled, on marking this product as opened, the corresponding amount "
"will be moved to the default consume location"
msgid "Moved to %1$s"
msgstr ""
msgstr "Moved to %1$s"
msgid "Decimal places allowed for prices (input)"
msgstr ""
msgstr "Decimal places allowed for prices (input)"
msgid "Decimal places allowed for prices (display)"
msgstr ""
msgstr "Decimal places allowed for prices (display)"
msgid "Clear done items"
msgstr ""
msgstr "Clear done items"
msgid ""
"This shows all to this product directly or indirectly related quantity units"
" and their derived conversion factors"
msgstr ""
"This shows all to this product directly or indirectly related quantity units"
" and their derived conversion factors"
msgid "Show resolved conversions"
msgstr ""
msgstr "Show resolved conversions"
msgid "QU conversions resolved"
msgstr ""
msgstr "QU conversions resolved"
msgid "Product specifc QU conversions"
msgstr ""
msgid "Product specific QU conversions"
msgstr "Product specific QU conversions"
msgid "Default quantity unit consume"
msgstr ""
msgstr "Default quantity unit consume"
msgid "This is the default quantity unit used when consuming this product"
msgstr ""
msgstr "This is the default quantity unit used when consuming this product"
msgid "Add to meal plan"
msgstr ""
msgstr "Add to meal plan"
msgid "Successfully added the recipe to the meal plan"
msgstr ""
msgstr "Successfully added the recipe to the meal plan"
msgid "Reprint stock entry label"
msgstr ""
msgstr "Reprint stock entry label"
msgid "Auto reprint stock entry label"
msgstr ""
msgstr "Auto reprint stock entry label"
msgid ""
"When enabled, auto-changing the due date of a stock entry (by "
"opening/freezing/thawing and having corresponding default due days set) will"
" reprint its label"
msgstr ""
"When enabled, auto-changing the due date of a stock entry (by "
"opening/freezing/thawing and having corresponding default due days set) will"
" reprint its label"
msgid "Quick open amount"
msgstr ""
msgstr "Quick open amount"
msgid "Track chore execution now"
msgstr ""
msgstr "Track chore execution now"
msgid "Total"
msgstr ""
msgstr "Total"
msgid "Apply"
msgstr ""
msgstr "Apply"
msgid "Custom range"
msgstr ""
msgstr "Custom range"
msgid "Yesterday"
msgstr ""
msgstr "Yesterday"
msgid "Last %1$s day"
msgid_plural "Last %1$s days"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Last %1$s day"
msgstr[1] "Last %1$s days"
msgid "This month"
msgstr ""
msgstr "This month"
msgid "Last month"
msgstr ""
msgstr "Last month"
msgid "This year"
msgstr ""
msgstr "This year"
msgid "Last year"
msgstr ""
msgstr "Last year"
msgid "Reports"
msgstr ""
msgstr "Reports"
msgid "Spendings"
msgstr ""
msgstr "Spendings"
msgid "Stock report"
msgstr ""
msgstr "Stock report"
msgid "Out-of-stock products"
msgstr ""
msgid "Out of stock products"
msgstr "Out of stock products"
msgid "Quantity unit for prices"
msgstr ""
msgstr "Quantity unit for prices"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "This means 1 label will be printed"
msgstr[1] "This means %1$s labels will be printed"
msgid "External barcode lookup"
msgstr "External barcode lookup"
msgid "Error while executing the barcode lookup plugin"
msgstr "Error while executing the barcode lookup plugin"
msgid "Nothing was found for the given barcode"
msgstr "Nothing was found for the given barcode"
msgid "Configure colors"
msgstr "Configure colours"
msgid "Swap track next schedule / track now buttons"
msgstr "Swap track next schedule / track now buttons"
msgid "Scheduled tracking time"
msgstr "Scheduled tracking time"
msgid "Time of tracking"
msgstr "Time of tracking"
msgid "Show all out of stock products"
msgstr "Show all out of stock products"
msgid ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgstr ""
"By default the stock overview page lists all products which are currently in"
" stock or below their min. stock amount - when this is enabled, all (active)"
" products are always shown"
msgid "No price information is available for at least one ingredient"
msgstr "No price information is available for at least one ingredient"
msgid ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgstr ""
"For ingredients that are only partially in stock, the in stock amount will "
"be consumed."
msgid "Can't be opened"
msgstr "Can't be opened"
msgid "Default purchase price type"
msgstr "Default purchase price type"
msgid "This will be used as the default price type selection on purchase"
msgstr "This will be used as the default price type selection on purchase"
msgid "Unspecified"
msgstr "Unspecified"
msgid "Round up quantity amounts to the nearest whole number"
msgstr "Round up quantity amounts to the nearest whole number"
msgid "Stock actions"
msgstr "Stock actions"
msgid "List actions"
msgstr "List actions"

View File

@@ -24,6 +24,9 @@ msgstr "Number (integral)"
msgid "number-decimal"
msgstr "Number (decimal)"
msgid "number-currency"
msgstr "Number (currency)"
msgid "date"
msgstr "Date (without time)"

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