Compare commits

..

96 Commits

Author SHA1 Message Date
Bernd Bestel
1cb0ba5e68 Pulled translations from Transifex 2020-04-16 19:21:20 +02:00
Bernd Bestel
d4fefa846b Hotfix (will be included in the v2.7.0 release): Downgraded jQuery (fixes #743) 2020-04-16 19:14:26 +02:00
Bernd Bestel
7121e814b0 Updated dependencies 2020-04-16 18:22:38 +02:00
Bernd Bestel
70a1704bc2 Pulled translations from Transifex 2020-04-16 18:12:50 +02:00
Bernd Bestel
629b3c0706 Prepared next release 2020-04-16 18:05:45 +02:00
Bernd Bestel
db3021e475 Revert "Use a route cache file (speed optimization)"
This reverts commit 59cd4dbac4.
2020-04-14 09:02:48 +02:00
Bernd Bestel
e897570968 Only adjust the camera barcode scanning live stream picture size once (fixes #734) 2020-04-13 22:34:52 +02:00
Bernd Bestel
2e625f330d Little style changes and changelog for #733 2020-04-13 22:30:35 +02:00
Michael Frikke Madsen
a6030798c7 Add camera picker button (#733)
* Add camera picker button

* Remove button and nested dialog - make it a select
- Also make Cancel button gray again
2020-04-13 22:07:38 +02:00
Bernd Bestel
71770540f6 Fixed stock overview page did not load when GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING is disabled (references #673) 2020-04-13 21:56:24 +02:00
Bernd Bestel
59cd4dbac4 Use a route cache file (speed optimization) 2020-04-13 21:26:34 +02:00
Bernd Bestel
6f4769a7b3 Make product groups on the shopping list collapsible (closes #604) 2020-04-13 19:11:13 +02:00
Bernd Bestel
1390c65864 Show optionally an icon on the stock overview page if the product is already on the shopping list (closes #708) 2020-04-13 18:47:41 +02:00
Bernd Bestel
840b35b30d Add tooltips to shopping list item buttons (closes #572) 2020-04-13 18:26:53 +02:00
Bernd Bestel
886721e972 Fixed consuming tare weight handling enabled products from the stock overview page (fixes #731) 2020-04-13 17:29:00 +02:00
Bernd Bestel
1686fcca8e Fixed that product-opened-actions had no transaction_id in stock_log (fixes #732) 2020-04-13 17:04:59 +02:00
Bernd Bestel
7d9bad58b5 Added changes of #601 to grocy.openapi.json 2020-04-13 16:57:06 +02:00
Bernd Bestel
25be604b31 Also return userfields in generic object(s) GET API routes (closes #601) 2020-04-13 16:52:34 +02:00
Bernd Bestel
87e68523e5 Typo... 2020-04-13 16:27:36 +02:00
Bernd Bestel
858315ed3f Added DataTables accent neutralise plugin (closes #654) 2020-04-13 16:27:02 +02:00
Bernd Bestel
f36d9c46ed Make Quagga2 setting "numOfWorkers" adjustable (closes #713) 2020-04-13 16:14:43 +02:00
Bernd Bestel
45d96cb60f Use Quagga2 instead of QuaggaJS (closes #579) 2020-04-13 16:08:46 +02:00
Bernd Bestel
10f890ef89 Added a camera-barcode-scanner-button to the barcodes field on the product edit page (closes #723) 2020-04-13 15:55:27 +02:00
Bernd Bestel
c6e06ab07c Fix weekday order for next chore execution calculation for weekly chores (fixes #570) 2020-04-13 15:16:38 +02:00
Bernd Bestel
9a93c32d3c Fix total price amount relation on purchase (fixes #722) 2020-04-13 14:52:13 +02:00
Bernd Bestel
1fc802c30e Typo/duplicated function (references #718) 2020-04-13 10:41:37 +02:00
Bernd Bestel
42e6a8ef94 Added new API endpoints to get all user and config settings (closes #718) 2020-04-13 10:35:20 +02:00
Bernd Bestel
b971375881 Reimplemented CORS handling (fixes #681) 2020-04-13 10:00:29 +02:00
Bernd Bestel
855b24c515 Fix consume page form validation limits for the amount input when tare weight handling is enabled (fixes #727) 2020-04-12 21:41:04 +02:00
Bernd Bestel
b62d3b02e6 Only add not empty translation strings to POT in DEV mode 2020-04-12 20:31:30 +02:00
Bernd Bestel
0327188125 Optimize datetimepicker form validation events (fixes #726) 2020-04-12 18:41:23 +02:00
Bernd Bestel
73b3ad3b4c Unify wording 2020-04-12 18:32:32 +02:00
Bernd Bestel
152d3b7005 Respect QU conversions when aggregating parent product stock amounts (fixes #615) 2020-04-12 18:29:44 +02:00
Bernd Bestel
5b314351dd Don't show disabled product options (fixes #724) 2020-04-12 15:59:08 +02:00
Bernd Bestel
7b39bc995c Fixed update.sh line endings (fixes #705) 2020-04-12 15:42:25 +02:00
Bernd Bestel
c562e09073 Dummy change to fix line endings (references #705) 2020-04-12 15:40:11 +02:00
Bernd Bestel
8cfd3e19ba Typo... 2020-04-12 15:34:27 +02:00
Bernd Bestel
81e6530ddc Always set number inputs in browser locale format (fixes #610) 2020-04-12 15:33:36 +02:00
Bernd Bestel
86ef36d76a Don't ignore the decimal part when editing a stock entry (fixes #616) 2020-04-12 15:22:36 +02:00
Bernd Bestel
1d4b6a0a24 Updated README.md 2020-04-12 14:49:53 +02:00
Bernd Bestel
d907bca3cb Include userfields when printing a shopping list (fixes #719) 2020-04-12 14:39:11 +02:00
Bernd Bestel
3356b07342 Always show models / overlay everything else (fixes #628) 2020-04-12 14:34:50 +02:00
Bernd Bestel
615de378ba Don't load demo_data strings in production setups 2020-04-12 14:22:18 +02:00
Bernd Bestel
0f3a3887a2 Fixed that best before dates were displayed on the stock overview and stock entries page even with disabled GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING (fixes #673) 2020-04-12 14:17:52 +02:00
Bernd Bestel
390af436ab Fixed that the stock entries page was broken when there were product userfields defined with enabled "Show as column in tables" (fixes #677) 2020-04-12 14:13:28 +02:00
Bernd Bestel
4e5e191b22 Fixed the conversion factor hint on the purchase page (fixes #625) 2020-04-12 14:09:38 +02:00
Bernd Bestel
6867057b6e Clarify button tooltips on the stock entries page (closes #621) 2020-04-12 14:02:24 +02:00
Bernd Bestel
9dbd6a68c4 Don't change the displayed QU to the products stock QU when "Only check if a single unit is in stock" is set when editing a recipe ingredient (fixes #606) 2020-04-12 13:55:26 +02:00
James Addison
4f8ef2859e Fixup: paths for localization file existence checks (#710) 2020-04-09 08:29:44 +02:00
Mik-
a6dd794ce8 Add missing form validation on presetting QU id stock (#704) 2020-04-07 16:37:30 +02:00
Bernd Bestel
6b75decd4a Added roadmap section 2020-04-07 13:54:10 +02:00
Bernd Bestel
2334b010fd Added roadmap section 2020-04-07 13:48:55 +02:00
Bernd Bestel
1cb3128042 Added changelog for #703 2020-04-07 11:46:07 +02:00
Shane Kerr
cc012c7348 Create the backup tarball explicitly before invoking tar (#703)
When grocy is installed on a btrfs file system, the tar command
fails if the tarball is not created first.
2020-04-07 11:43:54 +02:00
Bernd Bestel
bfb46494cf Added new at least 80 % complete localizations 2020-04-05 08:41:08 +02:00
Bernd Bestel
4072dfd26f Use default strings if any of the minor translation files is not available 2020-04-05 08:40:42 +02:00
Bernd Bestel
769a13aa31 Added a default .htaccess file for the data directory 2020-04-05 08:39:57 +02:00
Bernd Bestel
2924502878 Added info about the new release branch 2020-04-04 20:42:12 +02:00
Bernd Bestel
30908f5ba9 Fixed typo (references #697) 2020-04-03 18:55:48 +02:00
James Addison
ca9354064d PSR7-decoupled rework of authentication fixup (#697) 2020-04-03 18:45:40 +02:00
Bernd Bestel
9a9b4d1000 Updated version.json 2020-04-03 18:35:46 +02:00
Bernd Bestel
808745dbfa Added v2.6.2 changelog (hotfix, will be included/changed in the last 5 releases also) 2020-04-03 18:34:00 +02:00
Bernd Bestel
2778d2ad56 Don't return anything in the response body when unauthenticated (fixes #696) 2020-04-03 18:22:05 +02:00
Bernd Bestel
11bf89e13a Added changelog for #688 2020-04-02 08:39:25 +02:00
Mik-
1aa788b6c2 Preset the stock qu with the purchase qu on new products. (#688) 2020-04-02 08:36:20 +02:00
Mik-
7200f2c17f Fix errors with disabled feature flag STOCK_PRICE_TRACKING (#687)
fixes #685
2020-04-02 08:34:43 +02:00
Bernd Bestel
746203b82d Allow any used HTTP request method for CORS (references #681) 2020-03-31 17:53:34 +02:00
tsia
8e82525732 fix api endpoint url in comment (#676) 2020-03-29 18:15:27 +02:00
Bernd Bestel
f092c8b10d Added changelog for #675 2020-03-29 14:29:38 +02:00
Mik-
f66a4c9631 Camera barcode scanner enhancements (#675)
* Disable torch button, if not supported

* Allow toggling torch

* Don't exceed the screen width with camera window

* Disable torch button, if not supported

* Allow toggling torch

* Don't exceed the screen width with camera window

* Allow toggling torch

* Disable torch button, if not supported

* Allow toggling torch

* Don't exceed the screen width with camera window

* Allow toggling torch

* Allow toggling torch

* Don't exceed the screen width with camera window

* Remove toggling of torch, as it's not working
and add resize of video to fit in viewport hieght

* Add feature to always turn on the torch in camera scanner.

* Fix feature flag name

Co-authored-by: Michael Neuendorf <neuendorf@gonicus.de>
2020-03-29 14:25:04 +02:00
Bernd Bestel
caf7127c13 Added changelog for #672 2020-03-27 19:32:25 +01:00
kriddles
2fee4b45ff set default store for product, purchase set last store purchased if available or use product default (#672) 2020-03-27 19:27:40 +01:00
Bernd Bestel
d509f9add0 Added changelog for #669 2020-03-27 17:46:08 +01:00
tsia
81d84d93e2 fixed missing class error in CalendarApiController (#669) 2020-03-27 17:44:29 +01:00
Bernd Bestel
646f638111 Added changelog for #668 2020-03-27 14:32:30 +01:00
Marc Ole Bulling
9a27b8e3a5 Added amount value for locations api (#668) 2020-03-27 14:29:26 +01:00
Bernd Bestel
d7738aa1ec Added some demo data to showcase the new price tracking per store feature (references #658) 2020-03-25 20:56:33 +01:00
Bernd Bestel
4f40b40fe0 Fixed migration (references #658) 2020-03-25 20:39:19 +01:00
Bernd Bestel
7b737590ea Added changelog for #657 2020-03-25 20:32:37 +01:00
Mik-
f3b504b7de Optionally use number pad input in best-before-date fields on mobile Chrome (#657)
* Add missing translation for de

* Add option to set best-before-date field input-type to number
This allows faster input in mobile devices

* Fix datetimepicker with inputmode

* Fix datatimepicker with numeric input

* Add missing translation for de

* Add option to set best-before-date field input-type to number
This allows faster input in mobile devices

* Fix datetimepicker with inputmode

* Fix datatimepicker with numeric input

* Use more precise name for number pad option

* Update localization/de/strings.po

Co-Authored-By: Bernd Bestel <bernd@berrnd.de>

* Fix merge conflict

* Fix merge conflict try 2

Co-authored-by: Michael Neuendorf <neuendorf@gonicus.de>
Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2020-03-25 20:26:54 +01:00
Bernd Bestel
2619d03cc0 Added changelog for #658 2020-03-25 20:12:38 +01:00
Bernd Bestel
305f5b67e4 Name shopping locations "Stores" on the frontend (references #658) 2020-03-25 20:09:28 +01:00
Bernd Bestel
5214a775ed Fix stock entries page rendering problem when FEATURE_FLAG_STOCK_PRICE_TRACKING is set to false (references #658) 2020-03-25 20:02:59 +01:00
Bernd Bestel
2d00f6f84a Immediately show the changed shopping location after edit on the stock entries page (references #658) 2020-03-25 20:00:52 +01:00
Bernd Bestel
06f65594de Fix stock entries page error when there is no shopping location (references #658) 2020-03-25 19:53:00 +01:00
Bernd Bestel
c3d4be352d Fix product card chart rendering error when there is no shopping location (references #658) 2020-03-25 19:49:10 +01:00
Immae
a45317aea1 Add shopping location for price tracking (#658) 2020-03-25 19:34:56 +01:00
dacto
573b6ece89 Process Settings from environment and settingoverrides values the same: (#660)
* fixes handling strings representing bools from settingoverrides .txt files
  * trailing newline characters are now stripped
2020-03-25 19:30:16 +01:00
Bernd Bestel
22eaeee572 Added changelog for #660 2020-03-25 19:29:30 +01:00
Bernd Bestel
375865d80e Changelog and some small changes for #639 2020-03-22 18:02:19 +01:00
Marc Ole Bulling
3fc14db5d5 Check if all dependencies are installed (#639)
* Added check if all dependencies are installed and config.php/config-dist.php exists

* Also check for php modules

* Uncomment code that was accidentally disabled for debug purposes
2020-03-22 17:55:23 +01:00
Bernd Bestel
dcfd9d848d Added changelog for #637 / #638 2020-03-22 09:27:49 +01:00
Marc Runkel
03eee1329c Fix recipes page (#638)
* My config

* Add check to see if any recipe is selected

* Add check to see if a recipe is actually selected

Co-authored-by: Marc Runkel <marc.runkel@plusforta.de>
2020-03-22 09:24:49 +01:00
Bernd Bestel
03566d0644 Added changelog for #633 / #629 2020-03-21 15:56:59 +01:00
Mik-
71b62d5708 629 Make ellipsis menu in stock overview more responsive (#633)
* Make popup menues in table rows responsive

* Move "consum all" button to ellipsis menu on small devices
2020-03-21 15:52:51 +01:00
Bernd Bestel
eb3c0f9397 Typo... 2020-03-06 21:46:14 +01:00
134 changed files with 12059 additions and 1444 deletions

View File

@@ -1,4 +1,9 @@
pushd .. pushd ..
tx pull --all --minimum-perc=80 tx pull --all --minimum-perc=80
tx pull --language en_GB tx pull --language en_GB
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
copy /Y localization\en\chore_period_types.po localization\en_GB\chore_period_types.po
copy /Y localization\en\chore_assignment_types.po localization\en_GB\chore_assignment_types.po
popd popd

View File

@@ -2,11 +2,13 @@
ERP beyond your fridge ERP beyond your fridge
## Give it a try ## Give it a try
- Public demo of the latest stable version &rarr; [https://demo.grocy.info](https://demo.grocy.info) - Public demo of the latest stable version (`release` branch) &rarr; [https://demo.grocy.info](https://demo.grocy.info)
- Public demo of the latest pre-release version (current master branch) &rarr; [https://demo-prerelease.grocy.info](https://demo-prerelease.grocy.info) - Public demo of the latest pre-release version (`master` branch) &rarr; [https://demo-prerelease.grocy.info](https://demo-prerelease.grocy.info)
## Getting in touch ## Questions / Help / Bug reporting / Feature requests
There is the [r/grocy subreddit](https://www.reddit.com/r/grocy) to connect with other grocy users. If you've found something that does not work or if you have an idea for an improvement or new things which you would find useful, feel free to open an issue in the [issue tracker](https://github.com/grocy/grocy/issues) here. There is the [r/grocy subreddit](https://www.reddit.com/r/grocy) to connect with other grocy users and getting help.
If you've found something that does not work or if you have an idea for an improvement or new things which you would find useful, feel free to open an issue in the [issue tracker](https://github.com/grocy/grocy/issues) here.
## Community contributions ## Community contributions
See the website for a list of community contributed Add-ons / Tools: [https://grocy.info/#addons](https://grocy.info/#addons) See the website for a list of community contributed Add-ons / Tools: [https://grocy.info/#addons](https://grocy.info/#addons)
@@ -19,9 +21,9 @@ A household needs to be managed. I did this so far (almost 10 years) with my fir
> >
> See https://github.com/grocy/grocy-desktop or directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next"... > See https://github.com/grocy/grocy-desktop or directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next"...
Just unpack the [latest release](https://releases.grocy.info/latest) on your PHP (SQLite (3.8.3 or higher) extension required, currently only tested with PHP 7.3) enabled webserver (webservers root should point to the `public` directory), copy `config-dist.php` to `data/config.php`, edit it to your needs, ensure that the `data` directory is writable and you're ready to go, (to make it writable, maybe use `chown -R www-data:www-data data/`). Default login is user `admin` with password `admin`, please change the password immediately (see user menu). Just unpack the [latest release](https://releases.grocy.info/latest) on your PHP (SQLite (3.8.3 or higher) extension required, currently only tested with PHP 7.4) enabled webserver (webservers root should point to the `public` directory), copy `config-dist.php` to `data/config.php`, edit it to your needs, ensure that the `data` directory is writable and you're ready to go, (to make it writable, maybe use `chown -R www-data:www-data data/`). Default login is user `admin` with password `admin`, please change the password immediately (see user menu).
Alternatively clone this repository and install Composer and Yarn dependencies manually. Alternatively clone this repository (the `release` branch always references the latest released version, or checkout the latest tagged revision) and install Composer and Yarn dependencies manually.
If you use nginx as your webserver, please include `try_files $uri /index.php$is_args$query_string;` in your location block. If you use nginx as your webserver, please include `try_files $uri /index.php$is_args$query_string;` in your location block.
@@ -57,6 +59,8 @@ Some fields (with a barcode icon above) also allow to select a value by scanning
Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding field (powered by [QuaggaJS](https://github.com/serratus/quaggaJS), totally offline / client-side camera stream processing, 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 field (powered by [QuaggaJS](https://github.com/serratus/quaggaJS), 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
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.
### Input shorthands for date fields ### Input shorthands for date fields
For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization. For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization.
The following shorthands are available: The following shorthands are available:
@@ -104,6 +108,9 @@ Any help is more than appreciated. Feel free to pick any open unassigned issue a
See https://grocy.info/#say-thanks for more ideas if you just want to say thanks. See https://grocy.info/#say-thanks for more ideas if you just want to say thanks.
## Roadmap
There is none. grocy is only my hobby, one I like, but not the only one, and because of that, there are no release dates, no schedules for when anything is ready, it's done when it's done, maybe tomorrow, maybe tomorrow next year, everyone is invited to contribute - I appreciate all ideas and contributions. The progress of a specific bug/enhancement is always tracked in the corresponding issue, at least by commit comment references.
## Screenshots ## Screenshots
#### Dashboard #### Dashboard
![Dashboard](https://github.com/grocy/grocy/raw/master/publication_assets/dashboard.png "Dashboard") ![Dashboard](https://github.com/grocy/grocy/raw/master/publication_assets/dashboard.png "Dashboard")

View File

@@ -46,4 +46,4 @@ If you run grocy in a subdirectory, you need to set a new `config.php` setting (
- Fixed that the "contextual time ago" of date/time pickers was not displayed - Fixed that the "contextual time ago" of date/time pickers was not displayed
- New translations: (thanks all the translators) - New translations: (thanks all the translators)
- Czech (demo available at https://cs.demo.grocy.info) - Czech (demo available at https://cs.demo.grocy.info)
- Portuguese (Brazil) (demo available at https://pt-pt.demo.grocy.info) - Portuguese (Portugal) (demo available at https://pt-pt.demo.grocy.info)

View File

@@ -0,0 +1,66 @@
### 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)
- => The price history chart on the product card shows a line per store
- (Thanks @immae and @kriddles)
### Stock improvements/fixes
- When creating a new product, the "QU id stock" is now preset by the "QU id purchase" (because most of the time that's most probably the same) (thanks @Mik-)
- Clarified the row-button colors and toolips on the stock entries page
- Added a camera-barcode-scanning-button to the barcode(s) field on the product edit page to be able to also scan barcodes by the device camera there
- Added a new option (stock settings / top right corner settings menu) to show an icon on the stock overview if the product is already on the shopping list (next to the amount) (defaults to enabled)
- Fixed that the aggregated parent product amount (displayed on the stock overview page and on the product card) did not respect quantity unit conversions when the parent/sub products had different stock quantity units (the unit conversion needs to be globally defined, or as an override on the sub product)
- Fixed the conversion factor hint to display also decimal places on the purchase page (only displayed when the product has a different purchase/stock quantity unit)
- Fixed that the stock entries page was broken when there were product userfields defined with enabled "Show as column in tables"
- Fixed that best before dates were displayed on the stock overview and stock entries page even with disabled `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING`
- Fixed that when editing a stock entry and setting a decimal amount, the decimal part was ignored (only possible when the product option "Allow partial units in stock" is enabled)
- Fixed that "Default best before days" and "Default best before days after opened" on the product edit page were always shown regardless of the feature flags `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING` and `FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING`
- Fixed that the form validation limits for the amount input and products with enabled tare weight handling were wrong
- Fixed that the price was saved wrong for products with a different purchase/stock quantity unit when using "Total price" on purchase (resulted for example in wrong recipe costs)
- Fixed that undoing "product-opened"-actions was not possible
- Fixed/improved consuming from the stock overview page for products with enabled tare weight handling ("consume 1" button is now disabled for such products, "consume all" works again)
### Shopping list improvements/fixes
- It's now possible to collapse/expand the product group sections (by clicking on the grey group header)
- Fixed that the "shopping list to stock workflow"-dialog was not visible in compact view
- Fixed that when printing the shopping list, configured userfields were not included
### Recipe fixes
- Fixed that when editing an ingredient with "Only check if a single unit is in stock" set, the quantity unit was always set to the products stock quantity unit regardless if a different one was selected for that ingredient
- Fixed a PHP notice on the recipes page when there are no recipes (thanks @mrunkel)
### Chores fixes
- Fixed that weekly chores, where the next execution should be in the same week, were scheduled always for the next week only
### Calendar fixes
- Fixed that the "Share/Integrate calendar (iCal)" button did not work (thanks @tsia)
### API improvements/fixes
- New endpoint `/user/settings` to get all user settings of the currently logged in user (key/value pairs)
- New endpoint `/system/config` to get all config settings (`config.php`) (key/value pairs)
- The endpoint `/stock/products/{productId}/locations` now also returns the current stock amount of the product in that loctation (new field/property `amount`) (thanks @Forceu)
- The endpoints `/objects/{entity}` and `/objects/{entity}/{objectId}` now also include/return userfields of the object(s) (new field/property `userfields` per object, key/value pairs or `null`, when the object has no userfields)
- Fixed that CORS was broken (there was no response to preflight OPTIONS requests)
### General & other improvements/fixes
- Optimized that sometimes the corresponding form was not validated when selecting a date from the datetimepicker
- New `config.php` setting `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_FIELD_NUMBER_PAD` which activates the number pad for best-before-date fields on (supported) mobile browsers (useful because of [shorthands](https://github.com/grocy/grocy#input-shorthands-for-date-fields)) (defaults to `true`) (thanks @Mik-)
- Enhancements for the camera barcode scanner
- Torch / light improvements (thanks @Mik-)
- The light button is only displayed when the device has a flash light
- New `config.php` setting `FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA` to always enable the flash light automatically
- It's now possible to change the camera when the device has more than one (dropdown in the camera scanning dialog, only visible if there is more than one camera available) (thanks @MichaelMadsen)
- Replaced [QuaggaJS](https://github.com/serratus/quaggaJS) (seems to be unmaintained) by [Quagga2](https://github.com/ericblade/quagga2)
- New user setting `quagga2_numofworkers` (`config.php`) to make the Quagga2 setting "numOfWorkers" adjustable (defaults to `4`)
- Various display/CSS improvements (thanks @Mik-)
- Prerequisites (PHP extensions, critical files/folders) will now be checked and properly reported if there are problems (thanks @Forceu)
- Improved the the overview pages on mobile devices (main column was hidden) (thanks @Mik-)
- The general search field now searches accent insensitive
- Fixed that all number inputs are always prefilled in the browser locale number format
- Optimized the handling of settings provided by `data/settingoverrides` files (thanks @dacto)
- Optimized the update script (`update.sh`) to create the backup tar archive before writing to it (was a problem on Btrfs file systems) (thanks @shane-kerr)
- Fixed (again) that the `update.sh` file had wrong line endings (DOS instead of Unix)
- New translations: (thanks all the translators)
- Japanese (demo available at https://ja.demo.grocy.info)
- Chinese (Taiwan) (demo available at https://zh-tw.demo.grocy.info)

View File

@@ -1,28 +0,0 @@
### 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)
- => The price history chart on the product card shows a line per store
- (Thanks @immae and @kriddles)
### Stock improvements
- When creating a new product, the "QU id stock" is now preset by the "QU id purchase" (because most of the time that's most probably the same) (thanks @Mik-)
### Recipe fixes
- Fixed a PHP notice on the recipes page when there are no recipes (thanks @mrunkel)
### Calendar fixes
- Fixed that the "Share/Integrate calendar (iCal)" button did not work (thanks @tsia)
### API improvements
- The endpoint `/stock/products/{productId}/locations` now also returns the current stock amount of the product in that loctation (new field/property `amount`) (thanks @Forceu)
### General & other improvements
- New `config.php` setting `FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_FIELD_NUMBER_PAD` which activates the number pad for best-before-date fields on (supported) mobile browsers (useful because of [shorthands](https://github.com/grocy/grocy#input-shorthands-for-date-fields)) (defaults to `true`) (thanks @Mik-)
- Enhancements for the camera barcode scanner (thanks @Mik-)
- The light button only displayed when the device has a flash light
- New `config.php` setting `FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA` to always enable the flash light automatically
- Various display/CSS improvements
- Prerequisites (PHP extensions, critical files/folders) will now be checked and properly reported if there are problems (thanks @Forceu)
- Improved the the overview pages on mobile devices (main column was hidden) (thanks @Mik-)
- Optimized the handling of settings provided by `data/settingoverrides` files (thanks @dacto)

View File

@@ -6,7 +6,6 @@
"slim/http": "^1.0", "slim/http": "^1.0",
"php-di/php-di": "^6.0", "php-di/php-di": "^6.0",
"rubellum/slim-blade-view": "^0.1.1", "rubellum/slim-blade-view": "^0.1.1",
"tuupola/cors-middleware": "^1.1",
"morris/lessql": "^0.4.1", "morris/lessql": "^0.4.1",
"gettext/gettext": "^4.8", "gettext/gettext": "^4.8",
"eluceo/ical": "^0.16.0", "eluceo/ical": "^0.16.0",

442
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "9c7420e77a3f1afb59e00560d5b9081c", "content-hash": "70c5b65f78f4eb43dac8df8dc144e56c",
"packages": [ "packages": [
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
@@ -752,6 +752,7 @@
"serialize", "serialize",
"tokenizer" "tokenizer"
], ],
"abandoned": "opis/closure",
"time": "2018-03-21T22:21:57+00:00" "time": "2018-03-21T22:21:57+00:00"
}, },
{ {
@@ -803,73 +804,18 @@
], ],
"time": "2019-05-03T23:46:26+00:00" "time": "2019-05-03T23:46:26+00:00"
}, },
{
"name": "neomerx/cors-psr7",
"version": "v1.0.13",
"source": {
"type": "git",
"url": "https://github.com/neomerx/cors-psr7.git",
"reference": "2556e2013f16a55532c95928455257d5b6bbc6e2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/neomerx/cors-psr7/zipball/2556e2013f16a55532c95928455257d5b6bbc6e2",
"reference": "2556e2013f16a55532c95928455257d5b6bbc6e2",
"shasum": ""
},
"require": {
"php": ">=5.6.0",
"psr/http-message": "^1.0",
"psr/log": "^1.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^5.7",
"scrutinizer/ocular": "^1.1",
"squizlabs/php_codesniffer": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Neomerx\\Cors\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "neomerx",
"email": "info@neomerx.com"
}
],
"description": "Framework agnostic (PSR-7) CORS implementation (www.w3.org/TR/cors/)",
"homepage": "https://github.com/neomerx/cors-psr7",
"keywords": [
"Cross Origin Resource Sharing",
"Cross-Origin Resource Sharing",
"cors",
"neomerx",
"psr-7",
"psr7",
"w3.org",
"www.w3.org"
],
"time": "2018-05-23T16:10:11+00:00"
},
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.31.0", "version": "2.32.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d" "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d", "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -878,6 +824,7 @@
"symfony/translation": "^3.4 || ^4.0 || ^5.0" "symfony/translation": "^3.4 || ^4.0 || ^5.0"
}, },
"require-dev": { "require-dev": {
"doctrine/orm": "^2.7",
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0", "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
"kylekatarnls/multi-tester": "^1.1", "kylekatarnls/multi-tester": "^1.1",
"phpmd/phpmd": "^2.8", "phpmd/phpmd": "^2.8",
@@ -926,7 +873,7 @@
"datetime", "datetime",
"time" "time"
], ],
"time": "2020-03-01T11:11:58+00:00" "time": "2020-03-31T13:43:19+00:00"
}, },
{ {
"name": "nikic/fast-route", "name": "nikic/fast-route",
@@ -976,16 +923,16 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.3.0", "version": "v4.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120",
"reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1024,7 +971,7 @@
"parser", "parser",
"php" "php"
], ],
"time": "2019-11-08T13:50:10+00:00" "time": "2020-04-10T16:34:50+00:00"
}, },
{ {
"name": "philo/laravel-blade", "name": "philo/laravel-blade",
@@ -1112,22 +1059,22 @@
}, },
{ {
"name": "php-di/php-di", "name": "php-di/php-di",
"version": "6.0.11", "version": "6.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-DI/PHP-DI.git", "url": "https://github.com/PHP-DI/PHP-DI.git",
"reference": "9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620" "reference": "69238bd49acc0eb6a967029311eeadc3f7c5d538"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620", "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/69238bd49acc0eb6a967029311eeadc3f7c5d538",
"reference": "9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620", "reference": "69238bd49acc0eb6a967029311eeadc3f7c5d538",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"jeremeamia/superclosure": "^2.0", "jeremeamia/superclosure": "^2.0",
"nikic/php-parser": "^2.0|^3.0|^4.0", "nikic/php-parser": "^2.0|^3.0|^4.0",
"php": ">=7.0.0", "php": ">=7.2.0",
"php-di/invoker": "^2.0", "php-di/invoker": "^2.0",
"php-di/phpdoc-reader": "^2.0.1", "php-di/phpdoc-reader": "^2.0.1",
"psr/container": "^1.0" "psr/container": "^1.0"
@@ -1138,10 +1085,10 @@
"require-dev": { "require-dev": {
"doctrine/annotations": "~1.2", "doctrine/annotations": "~1.2",
"friendsofphp/php-cs-fixer": "^2.4", "friendsofphp/php-cs-fixer": "^2.4",
"mnapoli/phpunit-easymock": "~1.0", "mnapoli/phpunit-easymock": "^1.2",
"ocramius/proxy-manager": "~2.0.2", "ocramius/proxy-manager": "~2.0.2",
"phpstan/phpstan": "^0.9.2", "phpstan/phpstan": "^0.12",
"phpunit/phpunit": "~6.4" "phpunit/phpunit": "^8.5"
}, },
"suggest": { "suggest": {
"doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
@@ -1171,7 +1118,17 @@
"ioc", "ioc",
"psr11" "psr11"
], ],
"time": "2019-12-12T07:58:02+00:00" "funding": [
{
"url": "https://github.com/mnapoli",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/php-di/php-di",
"type": "tidelift"
}
],
"time": "2020-04-06T09:54:49+00:00"
}, },
{ {
"name": "php-di/phpdoc-reader", "name": "php-di/phpdoc-reader",
@@ -1469,16 +1426,16 @@
}, },
{ {
"name": "psr/log", "name": "psr/log",
"version": "1.1.2", "version": "1.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/log.git", "url": "https://github.com/php-fig/log.git",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1512,7 +1469,7 @@
"psr", "psr",
"psr-3" "psr-3"
], ],
"time": "2019-11-01T11:05:21+00:00" "time": "2020-03-23T09:12:05+00:00"
}, },
{ {
"name": "psr/simple-cache", "name": "psr/simple-cache",
@@ -1804,16 +1761,16 @@
}, },
{ {
"name": "slim/slim", "name": "slim/slim",
"version": "4.4.0", "version": "4.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/slimphp/Slim.git", "url": "https://github.com/slimphp/Slim.git",
"reference": "207acac048652a35d4762a737d59e317aedc02df" "reference": "5613cbb521081ed676d5d7eb3e44f2b80a818c24"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/207acac048652a35d4762a737d59e317aedc02df", "url": "https://api.github.com/repos/slimphp/Slim/zipball/5613cbb521081ed676d5d7eb3e44f2b80a818c24",
"reference": "207acac048652a35d4762a737d59e317aedc02df", "reference": "5613cbb521081ed676d5d7eb3e44f2b80a818c24",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1824,7 +1781,8 @@
"psr/http-factory": "^1.0", "psr/http-factory": "^1.0",
"psr/http-message": "^1.0", "psr/http-message": "^1.0",
"psr/http-server-handler": "^1.0", "psr/http-server-handler": "^1.0",
"psr/http-server-middleware": "^1.0" "psr/http-server-middleware": "^1.0",
"psr/log": "^1.1"
}, },
"require-dev": { "require-dev": {
"adriansuter/php-autoload-override": "^1.0", "adriansuter/php-autoload-override": "^1.0",
@@ -1837,8 +1795,8 @@
"phpspec/prophecy": "^1.10", "phpspec/prophecy": "^1.10",
"phpstan/phpstan": "^0.11.5", "phpstan/phpstan": "^0.11.5",
"phpunit/phpunit": "^8.5", "phpunit/phpunit": "^8.5",
"slim/http": "^0.7", "slim/http": "^1.0",
"slim/psr7": "^0.3", "slim/psr7": "^1.0",
"squizlabs/php_codesniffer": "^3.5" "squizlabs/php_codesniffer": "^3.5"
}, },
"suggest": { "suggest": {
@@ -1892,20 +1850,20 @@
"micro", "micro",
"router" "router"
], ],
"time": "2020-01-05T03:51:47+00:00" "time": "2020-04-14T20:49:48+00:00"
}, },
{ {
"name": "symfony/debug", "name": "symfony/debug",
"version": "v4.4.5", "version": "v4.4.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/debug.git", "url": "https://github.com/symfony/debug.git",
"reference": "a980d87a659648980d89193fd8b7a7ca89d97d21" "reference": "346636d2cae417992ecfd761979b2ab98b339a45"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21", "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45",
"reference": "a980d87a659648980d89193fd8b7a7ca89d97d21", "reference": "346636d2cae417992ecfd761979b2ab98b339a45",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1948,20 +1906,34 @@
], ],
"description": "Symfony Debug Component", "description": "Symfony Debug Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2020-02-23T14:41:43+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-27T16:54:36+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v4.4.5", "version": "v4.4.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" "reference": "5729f943f9854c5781984ed4907bbb817735776b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", "reference": "5729f943f9854c5781984ed4907bbb817735776b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1997,20 +1969,34 @@
], ],
"description": "Symfony Finder Component", "description": "Symfony Finder Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2020-02-14T07:42:58+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-27T16:54:36+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.14.0", "version": "v1.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2022,7 +2008,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.14-dev" "dev-master": "1.15-dev"
} }
}, },
"autoload": { "autoload": {
@@ -2056,20 +2042,34 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2020-01-13T11:15:53+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-09T19:04:49+00:00"
}, },
{ {
"name": "symfony/polyfill-php56", "name": "symfony/polyfill-php56",
"version": "v1.14.0", "version": "v1.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php56.git", "url": "https://github.com/symfony/polyfill-php56.git",
"reference": "16ec91cb06998b609501b55b7177b7d7c02badb3" "reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/16ec91cb06998b609501b55b7177b7d7c02badb3", "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/d51ec491c8ddceae7dca8dd6c7e30428f543f37d",
"reference": "16ec91cb06998b609501b55b7177b7d7c02badb3", "reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2079,7 +2079,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.14-dev" "dev-master": "1.15-dev"
} }
}, },
"autoload": { "autoload": {
@@ -2112,20 +2112,34 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2020-01-13T11:15:53+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-09T19:04:49+00:00"
}, },
{ {
"name": "symfony/polyfill-util", "name": "symfony/polyfill-util",
"version": "v1.14.0", "version": "v1.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-util.git", "url": "https://github.com/symfony/polyfill-util.git",
"reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3" "reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ba3cfcea6d0192cae46c62041f61cbb704b526d3", "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/d8e76c104127675d0ea3df3be0f2ae24a8619027",
"reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3", "reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2134,7 +2148,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.14-dev" "dev-master": "1.15-dev"
} }
}, },
"autoload": { "autoload": {
@@ -2164,20 +2178,34 @@
"polyfill", "polyfill",
"shim" "shim"
], ],
"time": "2020-01-13T11:15:53+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-02T11:55:35+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v5.0.5", "version": "v5.0.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b" "reference": "99b831770e10807dca0979518e2c89edffef5978"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b", "url": "https://api.github.com/repos/symfony/translation/zipball/99b831770e10807dca0979518e2c89edffef5978",
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b", "reference": "99b831770e10807dca0979518e2c89edffef5978",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2241,7 +2269,7 @@
], ],
"description": "Symfony Translation Component", "description": "Symfony Translation Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2020-02-04T07:41:34+00:00" "time": "2020-03-27T16:56:45+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
@@ -2299,175 +2327,6 @@
"standards" "standards"
], ],
"time": "2019-11-18T17:27:11+00:00" "time": "2019-11-18T17:27:11+00:00"
},
{
"name": "tuupola/callable-handler",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/tuupola/callable-handler.git",
"reference": "8b9d87f88056d4234af317d65612d7b6307a747a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tuupola/callable-handler/zipball/8b9d87f88056d4234af317d65612d7b6307a747a",
"reference": "8b9d87f88056d4234af317d65612d7b6307a747a",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/http-server-middleware": "^1.0"
},
"require-dev": {
"codedungeon/phpunit-result-printer": "^0.4.4",
"overtrue/phplint": "^1.0",
"phpunit/phpunit": "^6.5",
"squizlabs/php_codesniffer": "^3.2",
"tuupola/http-factory": "^0.4.0|^1.0",
"zendframework/zend-diactoros": "^1.6.0|^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Tuupola\\Middleware\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mika Tuupola",
"email": "tuupola@appelsiini.net",
"homepage": "https://appelsiini.net/",
"role": "Developer"
}
],
"description": "Compatibility layer for PSR-7 double pass and PSR-15 middlewares.",
"homepage": "https://github.com/tuupola/callable-handler",
"keywords": [
"middleware",
"psr-15",
"psr-7"
],
"time": "2018-10-12T09:59:35+00:00"
},
{
"name": "tuupola/cors-middleware",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/tuupola/cors-middleware.git",
"reference": "a043f4f52b902ee8902f95d28aae05013a7180fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tuupola/cors-middleware/zipball/a043f4f52b902ee8902f95d28aae05013a7180fc",
"reference": "a043f4f52b902ee8902f95d28aae05013a7180fc",
"shasum": ""
},
"require": {
"neomerx/cors-psr7": "^1.0.4",
"php": "^7.1",
"psr/http-message": "^1.0.1",
"psr/http-server-middleware": "^1.0",
"tuupola/callable-handler": "^1.0",
"tuupola/http-factory": "^1.0"
},
"require-dev": {
"codedungeon/phpunit-result-printer": "^0.23.2",
"equip/dispatch": "^2.0",
"overtrue/phplint": "^1.0",
"phpstan/phpstan": "^0.11.15",
"phpunit/phpunit": "^7.4",
"squizlabs/php_codesniffer": "^3.3.1",
"zendframework/zend-diactoros": "^1.0|^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Tuupola\\Middleware\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mika Tuupola",
"email": "tuupola@appelsiini.net",
"homepage": "https://appelsiini.net/",
"role": "Developer"
}
],
"description": "PSR-7 and PSR-15 CORS middleware",
"homepage": "https://github.com/tuupola/cors-middleware",
"keywords": [
"cors",
"middleware",
"psr-15",
"psr-7"
],
"time": "2019-10-30T11:18:16+00:00"
},
{
"name": "tuupola/http-factory",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/tuupola/http-factory.git",
"reference": "5fbde4c65a10d09a85652684a6e569542265a749"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tuupola/http-factory/zipball/5fbde4c65a10d09a85652684a6e569542265a749",
"reference": "5fbde4c65a10d09a85652684a6e569542265a749",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/http-factory": "^1.0"
},
"conflict": {
"nyholm/psr7": "<1.0"
},
"provide": {
"psr/http-factory-implementation": "^1.0"
},
"require-dev": {
"http-interop/http-factory-tests": "^0.5.0",
"overtrue/phplint": "^1.0",
"phpunit/phpunit": "^6.0|^7.0",
"squizlabs/php_codesniffer": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Tuupola\\Http\\Factory\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mika Tuupola",
"email": "tuupola@appelsiini.net",
"homepage": "https://appelsiini.net/",
"role": "Developer"
}
],
"description": "Lightweight autodiscovering PSR-17 HTTP factories",
"homepage": "https://github.com/tuupola/http-factory",
"keywords": [
"http",
"psr-17",
"psr-7"
],
"time": "2019-08-07T07:10:58+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
@@ -2479,5 +2338,6 @@
"platform": { "platform": {
"php": ">=7.2" "php": ">=7.2"
}, },
"platform-dev": [] "platform-dev": [],
"plugin-api-version": "1.1.0"
} }

View File

@@ -100,6 +100,7 @@ DefaultUserSetting('stock_default_purchase_amount', 0);
DefaultUserSetting('stock_default_consume_amount', 1); DefaultUserSetting('stock_default_consume_amount', 1);
DefaultUserSetting('scan_mode_consume_enabled', false); DefaultUserSetting('scan_mode_consume_enabled', false);
DefaultUserSetting('scan_mode_purchase_enabled', false); DefaultUserSetting('scan_mode_purchase_enabled', false);
DefaultUserSetting('show_icon_on_stock_overview_page_when_product_is_on_shopping_list', true);
# Shopping list settings # 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 best before days" set 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 best before days" set
@@ -125,6 +126,9 @@ DefaultUserSetting('auto_reload_on_db_change', true);
# Show a clock in the header next to the logo or not # Show a clock in the header next to the logo or not
DefaultUserSetting('show_clock_in_header', false); DefaultUserSetting('show_clock_in_header', false);
# Component configuration
DefaultUserSetting('quagga2_numofworkers', 4);
# Feature flags # Feature flags
# grocy was initially about "stock management for your household", many other things # grocy was initially about "stock management for your household", many other things
@@ -147,9 +151,11 @@ Setting('FEATURE_FLAG_STOCK_LOCATION_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING', true); Setting('FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING', true); Setting('FEATURE_FLAG_STOCK_PRODUCT_OPENED_TRACKING', true);
Setting('FEATURE_FLAG_STOCK_PRODUCT_FREEZING', true); Setting('FEATURE_FLAG_STOCK_PRODUCT_FREEZING', true);
Setting('FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_FIELD_NUMBER_PAD', true); // Activate the number pad in best-before-date fields on (supported) mobile browsers
Setting('FEATURE_FLAG_SHOPPINGLIST_MULTIPLE_LISTS', true); Setting('FEATURE_FLAG_SHOPPINGLIST_MULTIPLE_LISTS', true);
Setting('FEATURE_FLAG_CHORES_ASSIGNMENTS', true); Setting('FEATURE_FLAG_CHORES_ASSIGNMENTS', true);
# Feature settings # Feature settings
Setting('FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT', true); // When set to false, opened products will not be considered for minimum stock amounts Setting('FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT', true); // When set to false, opened products will not be considered for minimum stock amounts
Setting('FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA', true); // Enables the torch automaticaly in every camera barcode scanner.

View File

@@ -52,7 +52,7 @@ class CalendarApiController extends BaseApiController
try try
{ {
return $this->ApiResponse($response, array( return $this->ApiResponse($response, array(
'url' => $this->AppContainer->get('UrlManager')->ConstructUrl('/api/calendar/ical?secret=' . $this->getApiKeyService()->GetOrCreateApiKey(ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL)) 'url' => $this->AppContainer->get('UrlManager')->ConstructUrl('/api/calendar/ical?secret=' . $this->getApiKeyService()->GetOrCreateApiKey(\Grocy\Services\ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL))
)); ));
} }
catch (\Exception $ex) catch (\Exception $ex)

View File

@@ -11,9 +11,27 @@ class GenericEntityApiController extends BaseApiController
public function GetObjects(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function GetObjects(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
$objects = $this->getDatabase()->{$args['entity']}();
$allUserfields = $this->getUserfieldsService()->GetAllValues($args['entity']);
foreach ($objects as $object)
{
$userfields = FindAllObjectsInArrayByPropertyValue($allUserfields, 'object_id', $object->id);
$userfieldKeyValuePairs = null;
if (count($userfields) > 0)
{
foreach ($userfields as $userfield)
{
$userfieldKeyValuePairs[$userfield->name] = $userfield->value;
}
}
$object->userfields = $userfieldKeyValuePairs;
}
if ($this->IsValidEntity($args['entity']) && !$this->IsEntityWithPreventedListing($args['entity'])) if ($this->IsValidEntity($args['entity']) && !$this->IsEntityWithPreventedListing($args['entity']))
{ {
return $this->ApiResponse($response, $this->getDatabase()->{$args['entity']}()); return $this->ApiResponse($response, $objects);
} }
else else
{ {
@@ -25,7 +43,16 @@ class GenericEntityApiController extends BaseApiController
{ {
if ($this->IsValidEntity($args['entity']) && !$this->IsEntityWithPreventedListing($args['entity'])) if ($this->IsValidEntity($args['entity']) && !$this->IsEntityWithPreventedListing($args['entity']))
{ {
return $this->ApiResponse($response, $this->getDatabase()->{$args['entity']}($args['objectId'])); $userfields = $this->getUserfieldsService()->GetValues($args['entity'], $args['objectId']);
if (count($userfields) === 0)
{
$userfields = null;
}
$object = $this->getDatabase()->{$args['entity']}($args['objectId']);
$object['userfields'] = $userfields;
return $this->ApiResponse($response, $object);
} }
else else
{ {

View File

@@ -33,6 +33,8 @@ class RecipesController extends BaseController
} }
} }
if ($selectedRecipe)
{
$selectedRecipeSubRecipes = $this->getDatabase()->recipes()->where('id IN (SELECT includes_recipe_id FROM recipes_nestings_resolved WHERE recipe_id = :1 AND includes_recipe_id != :1)', $selectedRecipe->id)->orderBy('name')->fetchAll(); $selectedRecipeSubRecipes = $this->getDatabase()->recipes()->where('id IN (SELECT includes_recipe_id FROM recipes_nestings_resolved WHERE recipe_id = :1 AND includes_recipe_id != :1)', $selectedRecipe->id)->orderBy('name')->fetchAll();
$selectedRecipeSubRecipesPositions = $this->getDatabase()->recipes_pos_resolved()->where('recipe_id = :1', $selectedRecipe->id)->orderBy('ingredient_group', 'ASC', 'product_group', 'ASC')->fetchAll(); $selectedRecipeSubRecipesPositions = $this->getDatabase()->recipes_pos_resolved()->where('recipe_id = :1', $selectedRecipe->id)->orderBy('ingredient_group', 'ASC', 'product_group', 'ASC')->fetchAll();
@@ -43,7 +45,7 @@ class RecipesController extends BaseController
$includedRecipeIdsAbsolute[] = $subRecipe->id; $includedRecipeIdsAbsolute[] = $subRecipe->id;
} }
return $this->renderPage($response, 'recipes', [ $renderArray = [
'recipes' => $recipes, 'recipes' => $recipes,
'recipesResolved' => $recipesResolved, 'recipesResolved' => $recipesResolved,
'recipePositionsResolved' => $this->getDatabase()->recipes_pos_resolved()->where('recipe_type', RecipesService::RECIPE_TYPE_NORMAL), 'recipePositionsResolved' => $this->getDatabase()->recipes_pos_resolved()->where('recipe_type', RecipesService::RECIPE_TYPE_NORMAL),
@@ -59,7 +61,25 @@ class RecipesController extends BaseController
'userfields' => $this->getUserfieldsService()->GetFields('recipes'), 'userfields' => $this->getUserfieldsService()->GetFields('recipes'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('recipes'), 'userfieldValues' => $this->getUserfieldsService()->GetAllValues('recipes'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved() 'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
]); ];
}
else
{
$renderArray = [
'recipes' => $recipes,
'recipesResolved' => $recipesResolved,
'recipePositionsResolved' => $this->getDatabase()->recipes_pos_resolved()->where('recipe_type', RecipesService::RECIPE_TYPE_NORMAL),
'selectedRecipe' => $selectedRecipe,
'selectedRecipePositionsResolved' => $selectedRecipePositionsResolved,
'products' => $this->getDatabase()->products(),
'quantityUnits' => $this->getDatabase()->quantity_units(),
'userfields' => $this->getUserfieldsService()->GetFields('recipes'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('recipes'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
];
}
return $this->renderPage($response, 'recipes', $renderArray);
} }
public function RecipeEditForm(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function RecipeEditForm(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)

View File

@@ -82,13 +82,19 @@ class StockApiController extends BaseApiController
$locationId = $requestBody['location_id']; $locationId = $requestBody['location_id'];
} }
$shoppingLocationId = null;
if (array_key_exists('shopping_location_id', $requestBody) && is_numeric($requestBody['shopping_location_id']))
{
$shoppingLocationId = $requestBody['shopping_location_id'];
}
$transactionType = StockService::TRANSACTION_TYPE_PURCHASE; $transactionType = StockService::TRANSACTION_TYPE_PURCHASE;
if (array_key_exists('transaction_type', $requestBody) && !empty($requestBody['transactiontype'])) if (array_key_exists('transaction_type', $requestBody) && !empty($requestBody['transactiontype']))
{ {
$transactionType = $requestBody['transactiontype']; $transactionType = $requestBody['transactiontype'];
} }
$bookingId = $this->getStockService()->AddProduct($args['productId'], $requestBody['amount'], $bestBeforeDate, $transactionType, date('Y-m-d'), $price, $locationId); $bookingId = $this->getStockService()->AddProduct($args['productId'], $requestBody['amount'], $bestBeforeDate, $transactionType, date('Y-m-d'), $price, $locationId, $shoppingLocationId);
return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId)); return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId));
} }
catch (\Exception $ex) catch (\Exception $ex)
@@ -144,7 +150,13 @@ class StockApiController extends BaseApiController
$locationId = $requestBody['location_id']; $locationId = $requestBody['location_id'];
} }
$bookingId = $this->getStockService()->EditStockEntry($args['entryId'], $requestBody['amount'], $bestBeforeDate, $locationId, $price, $requestBody['open'], $requestBody['purchased_date']); $shoppingLocationId = null;
if (array_key_exists('shopping_location_id', $requestBody) && is_numeric($requestBody['shopping_location_id']))
{
$shoppingLocationId = $requestBody['shopping_location_id'];
}
$bookingId = $this->getStockService()->EditStockEntry($args['entryId'], $requestBody['amount'], $bestBeforeDate, $locationId, $shoppingLocationId, $price, $requestBody['open'], $requestBody['purchased_date']);
return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId)); return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId));
} }
catch (\Exception $ex) catch (\Exception $ex)
@@ -312,7 +324,13 @@ class StockApiController extends BaseApiController
$price = $requestBody['price']; $price = $requestBody['price'];
} }
$bookingId = $this->getStockService()->InventoryProduct($args['productId'], $requestBody['new_amount'], $bestBeforeDate, $locationId, $price); $shoppingLocationId = null;
if (array_key_exists('shopping_location_id', $requestBody) && is_numeric($requestBody['shopping_location_id']))
{
$shoppingLocationId = $requestBody['shopping_location_id'];
}
$bookingId = $this->getStockService()->InventoryProduct($args['productId'], $requestBody['new_amount'], $bestBeforeDate, $locationId, $price, $shoppingLocationId);
return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId)); return $this->ApiResponse($response, $this->getDatabase()->stock_log($bookingId));
} }
catch (\Exception $ex) catch (\Exception $ex)

View File

@@ -25,7 +25,8 @@ class StockController extends BaseController
'nextXDays' => $nextXDays, 'nextXDays' => $nextXDays,
'productGroups' => $this->getDatabase()->product_groups()->orderBy('name'), 'productGroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('products'), 'userfields' => $this->getUserfieldsService()->GetFields('products'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('products') 'userfieldValues' => $this->getUserfieldsService()->GetAllValues('products'),
'shoppingListItems' => $this->getDatabase()->shopping_list(),
]); ]);
} }
@@ -38,6 +39,7 @@ class StockController extends BaseController
'products' => $this->getDatabase()->products()->orderBy('name'), 'products' => $this->getDatabase()->products()->orderBy('name'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'), 'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name'), 'locations' => $this->getDatabase()->locations()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'stockEntries' => $this->getDatabase()->stock()->orderBy('product_id'), 'stockEntries' => $this->getDatabase()->stock()->orderBy('product_id'),
'currentStockLocations' => $this->getStockService()->GetCurrentStockLocations(), 'currentStockLocations' => $this->getStockService()->GetCurrentStockLocations(),
'nextXDays' => $nextXDays, 'nextXDays' => $nextXDays,
@@ -50,6 +52,7 @@ class StockController extends BaseController
{ {
return $this->renderPage($response, 'purchase', [ return $this->renderPage($response, 'purchase', [
'products' => $this->getDatabase()->products()->orderBy('name'), 'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name') 'locations' => $this->getDatabase()->locations()->orderBy('name')
]); ]);
} }
@@ -76,6 +79,7 @@ class StockController extends BaseController
{ {
return $this->renderPage($response, 'inventory', [ return $this->renderPage($response, 'inventory', [
'products' => $this->getDatabase()->products()->orderBy('name'), 'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name') 'locations' => $this->getDatabase()->locations()->orderBy('name')
]); ]);
} }
@@ -85,6 +89,7 @@ class StockController extends BaseController
return $this->renderPage($response, 'stockentryform', [ return $this->renderPage($response, 'stockentryform', [
'stockEntry' => $this->getDatabase()->stock()->where('id', $args['entryId'])->fetch(), 'stockEntry' => $this->getDatabase()->stock()->where('id', $args['entryId'])->fetch(),
'products' => $this->getDatabase()->products()->orderBy('name'), 'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name') 'locations' => $this->getDatabase()->locations()->orderBy('name')
]); ]);
} }
@@ -140,6 +145,15 @@ class StockController extends BaseController
]); ]);
} }
public function ShoppingLocationsList(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{
return $this->renderPage($response, 'shoppinglocations', [
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('shopping_locations'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('shopping_locations')
]);
}
public function ProductGroupsList(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function ProductGroupsList(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
return $this->renderPage($response, 'productgroups', [ return $this->renderPage($response, 'productgroups', [
@@ -166,6 +180,7 @@ class StockController extends BaseController
return $this->renderPage($response, 'productform', [ return $this->renderPage($response, 'productform', [
'locations' => $this->getDatabase()->locations()->orderBy('name'), 'locations' => $this->getDatabase()->locations()->orderBy('name'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'), 'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'), 'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('products'), 'userfields' => $this->getUserfieldsService()->GetFields('products'),
'products' => $this->getDatabase()->products()->where('parent_product_id IS NULL')->orderBy('name'), 'products' => $this->getDatabase()->products()->where('parent_product_id IS NULL')->orderBy('name'),
@@ -181,6 +196,7 @@ class StockController extends BaseController
'product' => $product, 'product' => $product,
'locations' => $this->getDatabase()->locations()->orderBy('name'), 'locations' => $this->getDatabase()->locations()->orderBy('name'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'), 'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'), 'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('products'), 'userfields' => $this->getUserfieldsService()->GetFields('products'),
'products' => $this->getDatabase()->products()->where('id != :1 AND parent_product_id IS NULL', $product->id)->orderBy('name'), 'products' => $this->getDatabase()->products()->where('id != :1 AND parent_product_id IS NULL', $product->id)->orderBy('name'),
@@ -210,6 +226,25 @@ class StockController extends BaseController
} }
} }
public function ShoppingLocationEditForm(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{
if ($args['shoppingLocationId'] == 'new')
{
return $this->renderPage($response, 'shoppinglocationform', [
'mode' => 'create',
'userfields' => $this->getUserfieldsService()->GetFields('shopping_locations')
]);
}
else
{
return $this->renderPage($response, 'shoppinglocationform', [
'shoppinglocation' => $this->getDatabase()->shopping_locations($args['shoppingLocationId']),
'mode' => 'edit',
'userfields' => $this->getUserfieldsService()->GetFields('shopping_locations')
]);
}
}
public function ProductGroupEditForm(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function ProductGroupEditForm(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
if ($args['productGroupId'] == 'new') if ($args['productGroupId'] == 'new')

View File

@@ -16,6 +16,35 @@ class SystemApiController extends BaseApiController
)); ));
} }
public function GetConfig(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{
try
{
$constants = get_defined_constants();
// Some GROCY_* constants are not really config settings and therefore should not be exposed
unset($constants['GROCY_AUTHENTICATED']);
unset($constants['GROCY_DATAPATH']);
unset($constants['GROCY_IS_EMBEDDED_INSTALL']);
unset($constants['GROCY_USER_ID']);
$returnArray = array();
foreach ($constants as $constant => $value)
{
if (substr($constant, 0, 6) === 'GROCY_')
{
$returnArray[substr($constant, 6)] = $value;
}
}
return $this->ApiResponse($response, $returnArray);
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function LogMissingLocalization(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function LogMissingLocalization(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
if (GROCY_MODE === 'dev') if (GROCY_MODE === 'dev')

View File

@@ -69,6 +69,18 @@ class UsersApiController extends BaseApiController
} }
} }
public function GetUserSettings(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{
try
{
return $this->ApiResponse($response, $this->getUsersService()->GetUserSettings(GROCY_USER_ID));
}
catch (\Exception $ex)
{
return $this->GenericErrorResponse($response, $ex->getMessage());
}
}
public function GetUserSetting(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function GetUserSetting(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
try try

1
data/.htaccess Normal file
View File

@@ -0,0 +1 @@
Deny from all

View File

@@ -14,7 +14,7 @@ class DemoBarcodeLookupPlugin extends BaseBarcodeLookupPlugin
/* /*
To try it: To try it:
Call the API function at /api/stock/external-barcode-lookup/{barcode} 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, 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 on a successful lookup the product is added to the database and in the output

View File

@@ -115,6 +115,37 @@
} }
} }
}, },
"/system/config": {
"get": {
"summary": "Returns all config settings",
"tags": [
"System"
],
"responses": {
"200": {
"description": "Key/value pairs of config settings",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Key/value pairs of config settings"
}
}
}
},
"400": {
"description": "The operation was not successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/system/log-missing-localization": { "/system/log-missing-localization": {
"post": { "post": {
"summary": "Logs a missing localization string", "summary": "Logs a missing localization string",
@@ -586,12 +617,12 @@
], ],
"responses": { "responses": {
"200": { "200": {
"description": "An entity object", "description": "Key/value pairs of userfields",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object", "type": "object",
"description": "Just key/value pairs of userfields" "description": "Key/value pairs of userfields"
} }
} }
} }
@@ -639,7 +670,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"description": "Just key/value pairs of userfields" "description": "Key/value pairs of userfields"
} }
} }
} }
@@ -978,9 +1009,40 @@
} }
} }
}, },
"/user/settings": {
"get": {
"summary": "Returns all settings of the currently logged in user",
"tags": [
"User settings"
],
"responses": {
"200": {
"description": "Key/value pairs of user settings",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Key/value pairs of user settings"
}
}
}
},
"400": {
"description": "The operation was not successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericErrorResponse"
}
}
}
}
}
}
},
"/user/settings/{settingKey}": { "/user/settings/{settingKey}": {
"get": { "get": {
"summary": "Gets the given setting of the currently logged in user", "summary": "Returns the given setting of the currently logged in user",
"tags": [ "tags": [
"User settings" "User settings"
], ],
@@ -1172,6 +1234,11 @@
"format": "integer", "format": "integer",
"description": "If omitted, the default location of the product is used" "description": "If omitted, the default location of the product is used"
}, },
"shopping_location_id": {
"type": "number",
"format": "integer",
"description": "If omitted, no store will be affected"
},
"purchased_date": { "purchased_date": {
"type": "string", "type": "string",
"format": "date", "format": "date",
@@ -1478,6 +1545,11 @@
"type": "number", "type": "number",
"format": "integer", "format": "integer",
"description": "If omitted, the default location of the product is used" "description": "If omitted, the default location of the product is used"
},
"shopping_location_id": {
"type": "number",
"format": "integer",
"description": "If omitted, no store will be affected"
} }
}, },
"example": { "example": {
@@ -1706,6 +1778,11 @@
"format": "date", "format": "date",
"description": "The best before date which applies to added products" "description": "The best before date which applies to added products"
}, },
"shopping_location_id": {
"type": "number",
"format": "integer",
"description": "If omitted, no store will be affected"
},
"location_id": { "location_id": {
"type": "number", "type": "number",
"format": "integer", "format": "integer",
@@ -3303,6 +3380,7 @@
"quantity_unit_conversions", "quantity_unit_conversions",
"shopping_list", "shopping_list",
"shopping_lists", "shopping_lists",
"shopping_locations",
"recipes", "recipes",
"recipes_pos", "recipes_pos",
"recipes_nestings", "recipes_nestings",
@@ -3328,6 +3406,7 @@
"quantity_unit_conversions", "quantity_unit_conversions",
"shopping_list", "shopping_list",
"shopping_lists", "shopping_lists",
"shopping_locations",
"recipes", "recipes",
"recipes_pos", "recipes_pos",
"recipes_nestings", "recipes_nestings",
@@ -3418,6 +3497,13 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"shopping_location_id": {
"type": "integer"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
}, },
"example": { "example": {
@@ -3438,7 +3524,9 @@
"allow_partial_units_in_stock": "0", "allow_partial_units_in_stock": "0",
"enable_tare_weight_handling": "0", "enable_tare_weight_handling": "0",
"tare_weight": "0.0", "tare_weight": "0.0",
"not_check_stock_fulfillment_for_recipes": "0" "not_check_stock_fulfillment_for_recipes": "0",
"shopping_location_id": null,
"userfields": null
} }
}, },
"QuantityUnit": { "QuantityUnit": {
@@ -3462,6 +3550,10 @@
}, },
"plural_forms": { "plural_forms": {
"type": "string" "type": "string"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
}, },
"example": { "example": {
@@ -3470,7 +3562,8 @@
"description": null, "description": null,
"row_created_timestamp": "2019-05-02 20:12:25", "row_created_timestamp": "2019-05-02 20:12:25",
"name_plural": "Pieces", "name_plural": "Pieces",
"plural_forms": null "plural_forms": null,
"userfields": null
} }
}, },
"Location": { "Location": {
@@ -3488,13 +3581,47 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
}, },
"example": { "example": {
"id": "2", "id": "2",
"name": "0", "name": "0",
"description": null, "description": null,
"row_created_timestamp": "2019-05-02 20:12:25" "row_created_timestamp": "2019-05-02 20:12:25",
"userfields": null
}
},
"ShoppingLocation": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
},
"example": {
"id": "2",
"name": "0",
"description": null,
"row_created_timestamp": "2019-05-02 20:12:25",
"userfields": null
} }
}, },
"StockLocation": { "StockLocation": {
@@ -3506,6 +3633,9 @@
"product_id": { "product_id": {
"type": "integer" "type": "integer"
}, },
"amount": {
"type": "integer"
},
"location_id": { "location_id": {
"type": "integer" "type": "integer"
}, },
@@ -3519,6 +3649,7 @@
"example": { "example": {
"id": "1", "id": "1",
"product_id": "3", "product_id": "3",
"amount": "2",
"location_id": "1", "location_id": "1",
"name": "Fridge" "name": "Fridge"
} }
@@ -3535,6 +3666,9 @@
"location_id": { "location_id": {
"type": "integer" "type": "integer"
}, },
"shopping_location_id": {
"type": "integer"
},
"amount": { "amount": {
"type": "number" "type": "number"
}, },
@@ -3576,7 +3710,8 @@
"open": "0", "open": "0",
"opened_date": null, "opened_date": null,
"row_created_timestamp": "2019-05-03 18:24:04", "row_created_timestamp": "2019-05-03 18:24:04",
"location_id": "4" "location_id": "4",
"shopping_location_id": null
} }
}, },
"RecipeFulfillmentResponse": { "RecipeFulfillmentResponse": {
@@ -3641,6 +3776,9 @@
"type": "number", "type": "number",
"format": "number" "format": "number"
}, },
"last_shopping_location_id": {
"type": "integer"
},
"location": { "location": {
"$ref": "#/components/schemas/Location" "$ref": "#/components/schemas/Location"
}, },
@@ -3672,7 +3810,8 @@
"allow_partial_units_in_stock": "0", "allow_partial_units_in_stock": "0",
"enable_tare_weight_handling": "0", "enable_tare_weight_handling": "0",
"tare_weight": "0.0", "tare_weight": "0.0",
"not_check_stock_fulfillment_for_recipes": "0" "not_check_stock_fulfillment_for_recipes": "0",
"last_shopping_location_id": null
}, },
"last_purchased": null, "last_purchased": null,
"last_used": null, "last_used": null,
@@ -3695,6 +3834,7 @@
"plural_forms": null "plural_forms": null
}, },
"last_price": null, "last_price": null,
"last_shopping_location_id": null,
"next_best_before_date": "2019-07-07", "next_best_before_date": "2019-07-07",
"location": { "location": {
"id": "4", "id": "4",
@@ -3716,6 +3856,9 @@
"price": { "price": {
"type": "number", "type": "number",
"format": "number" "format": "number"
},
"shopping_location": {
"$ref": "#/components/schemas/ShoppingLocation"
} }
} }
}, },
@@ -3946,6 +4089,10 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
} }
}, },
@@ -3972,6 +4119,10 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
} }
}, },
@@ -4046,6 +4197,10 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
} }
}, },
@@ -4253,6 +4408,10 @@
"row_created_timestamp": { "row_created_timestamp": {
"type": "string", "type": "string",
"format": "date-time" "format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
} }
} }
}, },

View File

@@ -0,0 +1,62 @@
<?php
class ERequirementNotMet extends Exception { }
const REQUIRED_PHP_EXTENSIONS = array('fileinfo', 'pdo_sqlite', 'gd');
class PrerequisiteChecker
{
public function checkRequirements()
{
self::checkForConfigFile();
self::checkForConfigDistFile();
self::checkForComposer();
self::checkForYarn();
self::checkForPhpExtensions();
}
private function checkForConfigFile()
{
if (!file_exists(__DIR__ . '/../data/config.php'))
{
throw new ERequirementNotMet('/data/config.php not found. Have you copied config-dist.php to the data directory and renamed it to config.php?');
}
}
private function checkForConfigDistFile()
{
if (!file_exists(__DIR__ . '/../config-dist.php'))
{
throw new ERequirementNotMet('config-dist.php not found. Please do not remove this file.');
}
}
private function checkForComposer()
{
if (!file_exists(__DIR__ . '/../vendor/autoload.php'))
{
throw new ERequirementNotMet('/vendor/autoload.php not found. Have you run Composer?');
}
}
private function checkForYarn()
{
if (!file_exists(__DIR__ . '/../public/node_modules'))
{
throw new ERequirementNotMet('/public/node_modules not found. Have you run Yarn?');
}
}
private function checkForPhpExtensions()
{
$loadedExtensions = get_loaded_extensions();
foreach (REQUIRED_PHP_EXTENSIONS as $extension)
{
if (!in_array($extension, $loadedExtensions))
{
throw new ERequirementNotMet("PHP module '{$extension}' not installed, but required.");
}
}
}
}

View File

@@ -138,6 +138,20 @@ function BoolToString(bool $bool)
return $bool ? 'true' : 'false'; return $bool ? 'true' : 'false';
} }
function ExternalSettingValue(string $value)
{
$tvalue = rtrim($value, "\r\n");
$lvalue = strtolower($tvalue);
if ($lvalue === "true"){
return true;
}
elseif ($lvalue === "false")
{
return false;
}
return $tvalue;
}
function Setting(string $name, $value) function Setting(string $name, $value)
{ {
if (!defined('GROCY_' . $name)) if (!defined('GROCY_' . $name))
@@ -146,22 +160,11 @@ function Setting(string $name, $value)
$settingOverrideFile = GROCY_DATAPATH . '/settingoverrides/' . $name . '.txt'; $settingOverrideFile = GROCY_DATAPATH . '/settingoverrides/' . $name . '.txt';
if (file_exists($settingOverrideFile)) if (file_exists($settingOverrideFile))
{ {
define('GROCY_' . $name, file_get_contents($settingOverrideFile)); define('GROCY_' . $name, ExternalSettingValue(file_get_contents($settingOverrideFile)));
} }
elseif (getenv('GROCY_' . $name) !== false) // An environment variable with the same name and prefix GROCY_ overwrites the given setting elseif (getenv('GROCY_' . $name) !== false) // An environment variable with the same name and prefix GROCY_ overwrites the given setting
{ {
if (strtolower(getenv('GROCY_' . $name)) === "true") define('GROCY_' . $name, ExternalSettingValue(getenv('GROCY_'. $name)));
{
define('GROCY_' . $name, true);
}
elseif (strtolower(getenv('GROCY_' . $name)) === "false")
{
define('GROCY_' . $name, false);
}
else
{
define('GROCY_' . $name, getenv('GROCY_' . $name));
}
} }
else else
{ {

View File

@@ -367,3 +367,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -97,6 +97,9 @@ msgstr "Sledování baterií"
msgid "Locations" msgid "Locations"
msgstr "Umístění" msgstr "Umístění"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Měrné jednotky" msgstr "Měrné jednotky"
@@ -234,6 +237,9 @@ msgstr "Faktor množství jednotek zásoby při nákupu jednoho kusu produktu"
msgid "Create location" msgid "Create location"
msgstr "Vytvořit umístění" msgstr "Vytvořit umístění"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Vytvořit měrnou jednotku" msgstr "Vytvořit měrnou jednotku"
@@ -267,6 +273,9 @@ msgstr "Upravit produkt"
msgid "Edit location" msgid "Edit location"
msgstr "Upravit umístění" msgstr "Upravit umístění"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Zaznamenat data" msgstr "Zaznamenat data"
@@ -343,6 +352,9 @@ msgstr "Opravdu chcete smazat produkt \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Opravdu chcete smazat umístění \"%s\"?" msgstr "Opravdu chcete smazat umístění \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Spravovat API klíče" msgstr "Spravovat API klíče"
@@ -1122,6 +1134,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Musí být vybráno umístění" msgstr "Musí být vybráno umístění"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Seznam" msgstr "Seznam"
@@ -1155,8 +1170,8 @@ msgstr "Systémové informace"
msgid "Changelog" msgid "Changelog"
msgstr "Seznam změn" msgstr "Seznam změn"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "bude vynásobené faktorem %1$s aby se získalo%2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "Zadaná datum je v minulosti, jste si jistí?" msgstr "Zadaná datum je v minulosti, jste si jistí?"
@@ -1306,7 +1321,7 @@ msgid "The amount cannot be lower than %1$s or equal %2$s"
msgstr "Počet nemůže být menší než %1$s nebo rovno %2$s" msgstr "Počet nemůže být menší než %1$s nebo rovno %2$s"
msgid "Not enough in stock, but already on the shopping list" msgid "Not enough in stock, but already on the shopping list"
msgstr "" msgstr "Nedostatečná zásoba, ale již na nákupním seznamu"
msgid "Not enough in stock" msgid "Not enough in stock"
msgstr "Nedostatečná zásoba" msgstr "Nedostatečná zásoba"
@@ -1461,7 +1476,7 @@ msgid "Create QU conversion"
msgstr "Vytvořit převod měrné jednotky" msgstr "Vytvořit převod měrné jednotky"
msgid "Default for QU" msgid "Default for QU"
msgstr "" msgstr "Výchozí pro Měrné Jednotky"
msgid "Quantity unit from" msgid "Quantity unit from"
msgstr "Měrná jednotka z" msgstr "Měrná jednotka z"
@@ -1498,10 +1513,10 @@ msgid "Edit QU conversion"
msgstr "Upravit převod měrné jednotky" msgstr "Upravit převod měrné jednotky"
msgid "An assignment type is required" msgid "An assignment type is required"
msgstr "" msgstr "Typ přiřazení je vyžadován"
msgid "Assignment type" msgid "Assignment type"
msgstr "" msgstr "Typ přiřazení"
msgid "" msgid ""
"This means the next execution of this chore is scheduled 1 day after the " "This means the next execution of this chore is scheduled 1 day after the "
@@ -1550,7 +1565,7 @@ msgid "Assign to"
msgstr "Přiřadit k" msgstr "Přiřadit k"
msgid "This assignment type requires that at least one is assigned" msgid "This assignment type requires that at least one is assigned"
msgstr "" msgstr "Typ přiřazení vyžaduje nejméně jednoho přiřazeného"
msgid "%s chore is assigned to me" msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me" msgid_plural "%s chores are assigned to me"
@@ -1935,3 +1950,33 @@ msgstr "Karta receptu"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Seskupit suroviny podle skupiny produktů" msgstr "Seskupit suroviny podle skupiny produktů"
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -352,3 +352,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -86,6 +86,9 @@ msgstr "Batteriregistrering"
msgid "Locations" msgid "Locations"
msgstr "Steder" msgstr "Steder"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Mængdeenheder" msgstr "Mængdeenheder"
@@ -222,6 +225,9 @@ msgstr "Konverteringfaktor ved køb til beholdningstypen"
msgid "Create location" msgid "Create location"
msgstr "Opret placering" msgstr "Opret placering"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Opret mængdeenhed" msgstr "Opret mængdeenhed"
@@ -255,6 +261,9 @@ msgstr "Rediger vare"
msgid "Edit location" msgid "Edit location"
msgstr "Rediger placering" msgstr "Rediger placering"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Optag data" msgstr "Optag data"
@@ -331,6 +340,9 @@ msgstr "Er du sikker på du vil slette varen \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Er du sikker på du vil slette placeringen \"%s\"?" msgstr "Er du sikker på du vil slette placeringen \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Administrer API nøgler" msgstr "Administrer API nøgler"
@@ -1102,6 +1114,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Du skal vælge en placering" msgstr "Du skal vælge en placering"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Liste" msgstr "Liste"
@@ -1135,8 +1150,8 @@ msgstr "Systeminformation"
msgid "Changelog" msgid "Changelog"
msgstr "Ændringslog" msgstr "Ændringslog"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "vil blive ganget med en faktor af %1$s for at få %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "Den angivne dato er før i dag, er du sikker?" msgstr "Den angivne dato er før i dag, er du sikker?"
@@ -1915,3 +1930,33 @@ msgstr ""
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr ""
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -349,3 +349,17 @@ msgstr "Tschechisch"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Portugiesisch (Portugal)" msgstr "Portugiesisch (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "Aldi"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "Rewe"
msgid "Japanese"
msgstr "Japanisch"
msgid "Chinese (Taiwan)"
msgstr "Chinesisch (Taiwan)"

View File

@@ -1,5 +1,5 @@
# Translators: # Translators:
# H T <github@fvbor.de>, 2020 # Hagen Tasche <github@fvbor.de>, 2020
# Bernd Bestel <bernd@berrnd.de>, 2020 # Bernd Bestel <bernd@berrnd.de>, 2020
# #
msgid "" msgid ""
@@ -84,6 +84,9 @@ msgstr "Batterie-Ladezyklus"
msgid "Locations" msgid "Locations"
msgstr "Standorte" msgstr "Standorte"
msgid "Stores"
msgstr "Geschäfte"
msgid "Quantity units" msgid "Quantity units"
msgstr "Mengeneinheiten" msgstr "Mengeneinheiten"
@@ -222,6 +225,9 @@ msgstr "Faktor Mengeneinheit Einkauf zu Mengeneinheit Bestand"
msgid "Create location" msgid "Create location"
msgstr "Standort erstellen" msgstr "Standort erstellen"
msgid "Create store"
msgstr "Geschäft erstellen"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Mengeneinheit erstellen" msgstr "Mengeneinheit erstellen"
@@ -255,6 +261,9 @@ msgstr "Produkt bearbeiten"
msgid "Edit location" msgid "Edit location"
msgstr "Standort bearbeiten" msgstr "Standort bearbeiten"
msgid "Edit store"
msgstr "Geschäft bearbeiten"
msgid "Record data" msgid "Record data"
msgstr "Daten erfassen" msgstr "Daten erfassen"
@@ -331,6 +340,9 @@ msgstr "Produkt \"%s\" wirklich löschen?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Standort \"%s\" wirklich löschen?" msgstr "Standort \"%s\" wirklich löschen?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Geschäft \"%s\" wirklich löschen?"
msgid "Manage API keys" msgid "Manage API keys"
msgstr "API-Keys verwalten" msgstr "API-Keys verwalten"
@@ -1116,6 +1128,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Ein Standort muss ausgewählt werden" msgstr "Ein Standort muss ausgewählt werden"
msgid "You have to select a store"
msgstr "Ein Geschäft muss ausgewählt werden"
msgid "List" msgid "List"
msgstr "Liste" msgstr "Liste"
@@ -1149,7 +1164,7 @@ msgstr "Systeminformationen"
msgid "Changelog" msgid "Changelog"
msgstr "Änderungsprotokoll" msgstr "Änderungsprotokoll"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "wird mit dem Faktor %1$s multipliziert um %2$s zu erhalten" msgstr "wird mit dem Faktor %1$s multipliziert um %2$s zu erhalten"
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
@@ -1957,3 +1972,34 @@ msgstr "Rezept-Karte"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Zutaten nach Produktgruppen gruppieren" msgstr "Zutaten nach Produktgruppen gruppieren"
msgid "Unknown store"
msgstr "Unbekanntes Geschäft"
msgid "Store"
msgstr "Geschäft"
msgid "Transaction successfully undone"
msgstr "Transaktion erfolgreich rückgängig gemacht"
msgid "Default store"
msgstr "Standard Geschäft"
msgid "Consume this stock entry"
msgstr "Verbrauche diesen Bestandseintrag"
msgid "Mark this stock entry as open"
msgstr "Diesen Bestandseintrag als geöffnet markieren"
msgid "Mark this item as done"
msgstr "Diesen Eintrag als erledigt markieren"
msgid "Edit this item"
msgstr "Diesen Eintrag löschen"
msgid "Delete this item"
msgstr "Diesen Eintrag bearbeiten"
msgid "Show an icon if the product is already on the shopping list"
msgstr ""
"Ein Symbol anzeigen, wenn das Produkt bereits auf dem Einkaufszettel steht"

View File

@@ -345,3 +345,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -284,3 +284,9 @@ msgstr "Swedish"
msgid "Polish" msgid "Polish"
msgstr "Polish" msgstr "Polish"
msgid "DemoSupermarket1"
msgstr "Walmart"
msgid "DemoSupermarket2"
msgstr "Kroger"

View File

@@ -66,6 +66,9 @@ msgstr "Products"
msgid "Locations" msgid "Locations"
msgstr "Locations" msgstr "Locations"
msgid "Shopping locations"
msgstr "Shopping locations"
msgid "Quantity units" msgid "Quantity units"
msgstr "Quantity units" msgstr "Quantity units"
@@ -162,6 +165,9 @@ msgstr "Name"
msgid "Location" msgid "Location"
msgstr "Location" msgstr "Location"
msgid "Shopping location"
msgstr "Shopping location"
msgid "Min. stock amount" msgid "Min. stock amount"
msgstr "Min. stock amount" msgstr "Min. stock amount"
@@ -201,6 +207,9 @@ msgstr "Factor purchase to stock quantity unit"
msgid "Create location" msgid "Create location"
msgstr "Create location" msgstr "Create location"
msgid "Create shopping location"
msgstr "Create shopping location"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Create quantity unit" msgstr "Create quantity unit"
@@ -234,6 +243,9 @@ msgstr "Edit product"
msgid "Edit location" msgid "Edit location"
msgstr "Edit location" msgstr "Edit location"
msgid "Edit shopping location"
msgstr "Edit shopping location"
msgid "Record data" msgid "Record data"
msgstr "Record data" msgstr "Record data"
@@ -306,6 +318,9 @@ msgstr "Are you sure to delete product \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Are you sure to delete location \"%s\"?" msgstr "Are you sure to delete location \"%s\"?"
msgid "Are you sure to delete shopping location \"%s\"?"
msgstr "Are you sure to delete shopping location \"%s\"?"
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Manage API keys" msgstr "Manage API keys"
@@ -1035,6 +1050,9 @@ msgstr "Tare weight handling enabled - please weigh the whole container, the amo
msgid "You have to select a location" msgid "You have to select a location"
msgstr "You have to select a location" msgstr "You have to select a location"
msgid "You have to select a shopping location"
msgstr "You have to select a shopping location"
msgid "List" msgid "List"
msgstr "List" msgstr "List"

View File

@@ -1,29 +1,25 @@
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "Last-Translator: Translation migration from old PHP array files\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n" "Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"Last-Translator: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/chore_assignment_types\n" "X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment" msgid "no-assignment"
msgstr "no-assignment" msgstr "No assignment"
msgid "who-least-did-first" msgid "who-least-did-first"
msgstr "who-least-did-first" msgstr "Who least did first"
msgid "random" msgid "random"
msgstr "random" msgstr "Random"
msgid "in-alphabetical-order" msgid "in-alphabetical-order"
msgstr "in-alphabetical-order" msgstr "In alphabetical order"

View File

@@ -1,35 +1,32 @@
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Last-Translator: Jonathan Adams <jonathan@connockadams.uk>, 2020\n" "Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n" "Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n" "Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_types\n" "X-Domain: grocy/chore_types\n"
msgid "manually" msgid "manually"
msgstr "manually" msgstr "Manually"
msgid "dynamic-regular" msgid "dynamic-regular"
msgstr "dynamic-regular" msgstr "Dynamic regular"
msgid "daily" msgid "daily"
msgstr "daily" msgstr "Daily"
msgid "weekly" msgid "weekly"
msgstr "weekly" msgstr "Weekly"
msgid "monthly" msgid "monthly"
msgstr "monthly" msgstr "Monthly"
msgid "yearly" msgid "yearly"
msgstr "yearly" msgstr "Yearly"

View File

@@ -1,19 +1,15 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "Last-Translator: Translation migration from old PHP array files\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/component_translations\n" "X-Domain: grocy/component_translations\n"
msgid "timeago_locale" msgid "timeago_locale"
@@ -23,26 +19,16 @@ msgid "timeago_nan"
msgstr "NaN years ago" msgstr "NaN years ago"
msgid "moment_locale" msgid "moment_locale"
msgstr "en-gb" msgstr "x"
msgid "datatables_localization" msgid "datatables_localization"
msgstr "" msgstr "{\"sEmptyTable\":\"No data available in table\",\"sInfo\":\"Showing _START_ to _END_ of _TOTAL_ entries\",\"sInfoEmpty\":\"Showing 0 to 0 of 0 entries\",\"sInfoFiltered\":\"(filtered from _MAX_ total entries)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"Show _MENU_ entries\",\"sLoadingRecords\":\"Loading...\",\"sProcessing\":\"Processing...\",\"sSearch\":\"Search:\",\"sZeroRecords\":\"No matching records found\",\"oPaginate\":{\"sFirst\":\"First\",\"sLast\":\"Last\",\"sNext\":\"Next\",\"sPrevious\":\"Previous\"},\"oAria\":{\"sSortAscending\":\": activate to sort column ascending\",\"sSortDescending\":\": activate to sort column descending\"}}"
"{\"sEmptyTable\":\"No data available in table\",\"sInfo\":\"Showing _START_ "
"to _END_ of _TOTAL_ entries\",\"sInfoEmpty\":\"Showing 0 to 0 of 0 "
"entries\",\"sInfoFiltered\":\"(filtered from _MAX_ total "
"entries)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"Show"
" _MENU_ "
"entries\",\"sLoadingRecords\":\"Loading...\",\"sProcessing\":\"Processing...\",\"sSearch\":\"Search:\",\"sZeroRecords\":\"No"
" matching records "
"found\",\"oPaginate\":{\"sFirst\":\"First\",\"sLast\":\"Last\",\"sNext\":\"Next\",\"sPrevious\":\"Previous\"},\"oAria\":{\"sSortAscending\":\":"
" activate to sort column ascending\",\"sSortDescending\":\": activate to "
"sort column descending\"}}"
msgid "summernote_locale" msgid "summernote_locale"
msgstr "en-gb" msgstr "x"
msgid "fullcalendar_locale" msgid "fullcalendar_locale"
msgstr "en-gb" msgstr "x"
msgid "bootstrap-select_locale" msgid "bootstrap-select_locale"
msgstr "x" msgstr "x"

View File

@@ -349,3 +349,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -1,44 +1,40 @@
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "Last-Translator: Translation migration from old PHP array files\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"Last-Translator: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/stock_transaction_types\n" "X-Domain: grocy/stock_transaction_types\n"
msgid "purchase" msgid "purchase"
msgstr "purchase" msgstr "Purchase"
msgid "transfer_from"
msgstr "transfer_from"
msgid "transfer_to" msgid "transfer_to"
msgstr "transfer_to" msgstr "Transfer To"
msgid "transfer_from"
msgstr "Transfer From"
msgid "consume" msgid "consume"
msgstr "consume" msgstr "Consume"
msgid "inventory-correction" msgid "inventory-correction"
msgstr "inventory-correction" msgstr "Inventory correction"
msgid "product-opened" msgid "product-opened"
msgstr "product-opened" msgstr "Product opened"
msgid "stock-edit-old" msgid "stock-edit-old"
msgstr "stock-edit-old" msgstr "Stock entry edited (old values)"
msgid "stock-edit-new" msgid "stock-edit-new"
msgstr "stock-edit-new" msgstr "Stock entry edited (new values)"
msgid "self-production" msgid "self-production"
msgstr "" msgstr "Self-production"

View File

@@ -83,6 +83,9 @@ msgstr "Battery tracking"
msgid "Locations" msgid "Locations"
msgstr "Locations" msgstr "Locations"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Quantity units" msgstr "Quantity units"
@@ -220,6 +223,9 @@ msgstr "Factor purchase to stock quantity unit"
msgid "Create location" msgid "Create location"
msgstr "Create location" msgstr "Create location"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Create quantity unit" msgstr "Create quantity unit"
@@ -253,6 +259,9 @@ msgstr "Edit product"
msgid "Edit location" msgid "Edit location"
msgstr "Edit location" msgstr "Edit location"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Record data" msgstr "Record data"
@@ -329,6 +338,9 @@ msgstr "Are you sure to delete product \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Are you sure to delete location \"%s\"?" msgstr "Are you sure to delete location \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Manage API keys" msgstr "Manage API keys"
@@ -1095,6 +1107,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "You have to select a location" msgstr "You have to select a location"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "List" msgstr "List"
@@ -1128,8 +1143,8 @@ msgstr "System info"
msgid "Changelog" msgid "Changelog"
msgstr "Changelog" msgstr "Changelog"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "will be multiplied a factor of %1$s to get %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "The given date is earlier than today, are you sure?" msgstr "The given date is earlier than today, are you sure?"
@@ -1902,3 +1917,33 @@ msgstr ""
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr ""
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -1,47 +1,43 @@
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "Last-Translator: Translation migration from old PHP array files\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n" "Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"Last-Translator: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/userfield_types\n" "X-Domain: grocy/userfield_types\n"
msgid "text-single-line" msgid "text-single-line"
msgstr "text-single-line" msgstr "Text (single line)"
msgid "text-multi-line" msgid "text-multi-line"
msgstr "text-multi-line" msgstr "Text (multi line)"
msgid "number-integral" msgid "number-integral"
msgstr "number-integral" msgstr "Number (integral)"
msgid "number-decimal" msgid "number-decimal"
msgstr "number-decimal" msgstr "Number (decimal)"
msgid "date" msgid "date"
msgstr "date" msgstr "Date (without time)"
msgid "datetime" msgid "datetime"
msgstr "datetime" msgstr "Date & time"
msgid "checkbox" msgid "checkbox"
msgstr "checkbox" msgstr "Checkbox"
msgid "preset-list" msgid "preset-list"
msgstr "preset-list" msgstr "Select list (a single item can be selected)"
msgid "preset-checklist" msgid "preset-checklist"
msgstr "preset-checklist" msgstr "Select list (multiple items can be selected)"
msgid "link" msgid "link"
msgstr "link" msgstr "Link"

View File

@@ -1,6 +1,5 @@
# Translators: # Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019 # Jose Rugel <joserugel@gmail.com>, 2020
# Igor Perez <igordiablo@hotmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -8,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Igor Perez <igordiablo@hotmail.com>, 2020\n" "Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n" "Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,19 +17,19 @@ msgstr ""
"X-Domain: grocy/chore_types\n" "X-Domain: grocy/chore_types\n"
msgid "manually" msgid "manually"
msgstr "Manualmente" msgstr "manualmente"
msgid "dynamic-regular" msgid "dynamic-regular"
msgstr "Dinámico regular" msgstr "dinamico-regular"
msgid "daily" msgid "daily"
msgstr "Diario" msgstr "diariamente"
msgid "weekly" msgid "weekly"
msgstr "Semanal" msgstr "semanalmente"
msgid "monthly" msgid "monthly"
msgstr "Mensual" msgstr "mensualmente"
msgid "yearly" msgid "yearly"
msgstr "Anual" msgstr "Anualmente"

View File

@@ -1,5 +1,6 @@
# Translators: # Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019 # Bernd Bestel <bernd@berrnd.de>, 2019
# Jose Rugel <joserugel@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -7,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n" "Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n" "Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,16 +28,31 @@ msgstr "es"
msgid "datatables_localization" msgid "datatables_localization"
msgstr "" msgstr ""
"{\"sEmptyTable\":\"Sin datos en la tabla\",\"sInfo\":\"Mostrando de _START_" "{\n"
" a _END_ de _TOTAL_ entradas\",\"sInfoEmpty\":\"Mostrando de 0 a 0 de 0 " "\"sEmptyTable\":\"Sin datos en la tabla\"\n"
"entradas\",\"sInfoFiltered\":\"(filtrando a _MAX_ entradas " ",\"sInfo\":\"Mostrando de _START_ a _END_ de _TOTAL_ entradas\"\n"
"máximas)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"Mostrar" ",\"sInfoEmpty\":\"Mostrando de 0 a 0 de 0 entradas\"\n"
" _MENU_ " ",\"sInfoFiltered\":\"(filtrando a _MAX_ entradas máximas)\"\n"
"entradas\",\"sLoadingRecords\":\"Cargando...\",\"sProcessing\":\"Procesando...\",\"sSearch\":\"Buscar:\",\"sZeroRecords\":\"No" ",\"sInfoPostFix\":\"\"\n"
" se han encontrado resultados " ",\"sInfoThousands\":\",\"\n"
"coincidentes\",\"oPaginate\":{\"sFirst\":\"Primero\",\"sLast\":\"Último\",\"sNext\":\"Siguiente\",\"sPrevious\":\"Anterior\"},\"oAria\":{\"sSortAscending\":\":" ",\"sLengthMenu\":\"Mostrar _MENU_ entradas\"\n"
" activar para ordenar ascendentemente\",\"sSortDescending\":\": activar para" ",\"sLoadingRecords\":\"Cargando ...\"\n"
" ordenar descendentemente\"}}" ",\"sProcessing\":\"Procesando ...\"\n"
",\"sSearch\":\"Buscar\"\n"
",\"sZeroRecords\":\"No se han encontrado resultados coincidentes\"\n"
",\"oPaginate\":\n"
"{\n"
"\"sFirst\":\"Primero\"\n"
",\"sLast\":\"Último\"\n"
",\"sNext\":\"Siguiente\"\n"
",\"sPrevious\":\"Anterior\"\n"
"}\n"
",\"oAria\":\n"
"{\n"
"\"sSortAscending\":\"orden ascendente\"\n"
",\"sSortDescending\":\"orden descendente\"\n"
"}\n"
"}"
msgid "summernote_locale" msgid "summernote_locale"
msgstr "es-ES" msgstr "es-ES"

View File

@@ -2,6 +2,7 @@
# Ankue <ankue.spam@gmail.com>, 2019 # Ankue <ankue.spam@gmail.com>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019 # Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
# Igor Perez <igordiablo@hotmail.com>, 2020 # Igor Perez <igordiablo@hotmail.com>, 2020
# Jose Rugel <joserugel@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Igor Perez <igordiablo@hotmail.com>, 2020\n" "Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n" "Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -34,7 +35,7 @@ msgid "Tinned food cupboard"
msgstr "Estante de las latas" msgstr "Estante de las latas"
msgid "Fridge" msgid "Fridge"
msgstr "Frigorífico" msgstr "Refrigerador"
msgid "Piece" msgid "Piece"
msgid_plural "Pieces" msgid_plural "Pieces"
@@ -54,12 +55,12 @@ msgstr[1] "Vasos"
msgid "Tin" msgid "Tin"
msgid_plural "Tins" msgid_plural "Tins"
msgstr[0] "Envases" msgstr[0] "Envases"
msgstr[1] "Envases" msgstr[1] "Latas"
msgid "Can" msgid "Can"
msgid_plural "Cans" msgid_plural "Cans"
msgstr[0] "Lata" msgstr[0] "Lata"
msgstr[1] "Latas" msgstr[1] "Envases"
msgid "Bunch" msgid "Bunch"
msgid_plural "Bunches" msgid_plural "Bunches"
@@ -67,7 +68,7 @@ msgstr[0] "Puñados"
msgstr[1] "Puñados" msgstr[1] "Puñados"
msgid "Gummy bears" msgid "Gummy bears"
msgstr "Ositos" msgstr "Ositos de goma"
msgid "Crisps" msgid "Crisps"
msgstr "Patatas fritas" msgstr "Patatas fritas"
@@ -82,7 +83,7 @@ msgid "Pickles"
msgstr "Pepinillos" msgstr "Pepinillos"
msgid "Gulash soup" msgid "Gulash soup"
msgstr "Sopa" msgstr "Sopa Gulash"
msgid "Yogurt" msgid "Yogurt"
msgstr "Yogurt" msgstr "Yogurt"
@@ -115,13 +116,13 @@ msgid "Warranty ends"
msgstr "Final de la garantía" msgstr "Final de la garantía"
msgid "TV remote control" msgid "TV remote control"
msgstr "Mando de la TV" msgstr "Control remoto del televisor"
msgid "Alarm clock" msgid "Alarm clock"
msgstr "Despertador" msgstr "Despertador"
msgid "Heat remote control" msgid "Heat remote control"
msgstr "Mando de la calefacción" msgstr "Control remoto de la calefacción"
msgid "Lawn mowed in the garden" msgid "Lawn mowed in the garden"
msgstr "Cortar el césped del jardín" msgstr "Cortar el césped del jardín"
@@ -133,10 +134,10 @@ msgid "Pizza dough"
msgstr "Masa de pizza" msgstr "Masa de pizza"
msgid "Sieved tomatoes" msgid "Sieved tomatoes"
msgstr "Tomate triturado" msgstr "Tomates triturados"
msgid "Salami" msgid "Salami"
msgstr "Salami" msgstr "Salame"
msgid "Toast" msgid "Toast"
msgstr "Tostada" msgstr "Tostada"
@@ -148,10 +149,10 @@ msgid "Pizza"
msgstr "Pizza" msgstr "Pizza"
msgid "Spaghetti bolognese" msgid "Spaghetti bolognese"
msgstr "Spaghetti boloñesa" msgstr "Spaghetti a la boloñesa"
msgid "Sandwiches" msgid "Sandwiches"
msgstr "Bocadillos" msgstr "Sándwiches"
msgid "English" msgid "English"
msgstr "Inglés" msgstr "Inglés"
@@ -177,7 +178,7 @@ msgid "Flour"
msgstr "Harina" msgstr "Harina"
msgid "Pancakes" msgid "Pancakes"
msgstr "Tortitas" msgstr "Panqueques"
msgid "Sugar" msgid "Sugar"
msgstr "Azúcar" msgstr "Azúcar"
@@ -273,7 +274,7 @@ msgid "The thing which happens daily"
msgstr "Lo que ocurre diariamente" msgstr "Lo que ocurre diariamente"
msgid "The thing which happens on Mondays and Wednesdays" msgid "The thing which happens on Mondays and Wednesdays"
msgstr "Lo que ocurre los lunes y los miércoles" msgstr "Lo que ocurre los Lunes y los Miércoles"
msgid "Swedish" msgid "Swedish"
msgstr "Sueco" msgstr "Sueco"
@@ -290,19 +291,19 @@ msgstr "Chocolate negro"
msgid "Slice" msgid "Slice"
msgid_plural "Slices" msgid_plural "Slices"
msgstr[0] "Lonchas" msgstr[0] "Lonchas"
msgstr[1] "Lonchas" msgstr[1] "Rebanadas"
msgid "Example userentity" msgid "Example userentity"
msgstr "Entidad de usuario de ejemplo" msgstr "Entidad de usuario de ejemplo"
msgid "This is an example user entity..." msgid "This is an example user entity..."
msgstr "Esto es un ejemplo de entidad de usuario..." msgstr "Esto es un ejemplo de una entidad personalizada ..."
msgid "Custom field" msgid "Custom field"
msgstr "Campo personalizado" msgstr "Campo personalizado"
msgid "Example field value..." msgid "Example field value..."
msgstr "Ejemplo de valor de campo..." msgstr "Valor del campo de ejemplo ..."
msgid "Waffle rolls" msgid "Waffle rolls"
msgstr "Canutillos" msgstr "Canutillos"
@@ -326,10 +327,10 @@ msgid "Preview version"
msgstr "Versión previa" msgstr "Versión previa"
msgid "current release" msgid "current release"
msgstr "Release actual" msgstr "Elaboración actual"
msgid "not yet released" msgid "not yet released"
msgstr "Todavía no liberado" msgstr "Todavía no elaborado"
msgid "Portuguese (Brazil)" msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)" msgstr "Portugués (Brasil)"
@@ -347,7 +348,21 @@ msgid "Slovak"
msgstr "Eslovaco" msgstr "Eslovaco"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Checo"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr "Portugués (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "DemoSupermercado1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "DemoSupermercado2"
msgid "Japanese"
msgstr "Japonés"
msgid "Chinese (Taiwan)"
msgstr "Chino (Taiwan)"

View File

@@ -1,5 +1,5 @@
# Translators: # Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019 # Jose Rugel <joserugel@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n" "Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n" "Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -17,13 +17,28 @@ msgstr ""
"X-Domain: grocy/stock_transaction_types\n" "X-Domain: grocy/stock_transaction_types\n"
msgid "purchase" msgid "purchase"
msgstr "Compra" msgstr "compra"
msgid "transfer_from"
msgstr "trasladar_desde"
msgid "transfer_to"
msgstr "trasladar_a"
msgid "consume" msgid "consume"
msgstr "Consumo" msgstr "consumo"
msgid "inventory-correction" msgid "inventory-correction"
msgstr "Corrección de inventario" msgstr "inventario-correccion"
msgid "product-opened" msgid "product-opened"
msgstr "Producto abierto" msgstr "producto-abierto"
msgid "stock-edit-old"
msgstr "existencia-editar-viejo"
msgid "stock-edit-new"
msgstr "existencia-editar-nuevo"
msgid "self-production"
msgstr "produccion-propia"

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
# Translators: # Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019 # Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
# Igor Perez <igordiablo@hotmail.com>, 2020 # Jose Rugel <joserugel@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -9,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n" "PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Igor Perez <igordiablo@hotmail.com>, 2020\n" "Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n" "Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,25 +18,25 @@ msgstr ""
"X-Domain: grocy/userfield_types\n" "X-Domain: grocy/userfield_types\n"
msgid "text-single-line" msgid "text-single-line"
msgstr "Texto (una línea)" msgstr "texto-unica-linea"
msgid "text-multi-line" msgid "text-multi-line"
msgstr "Texto (múltiples líneas)" msgstr "texto-multi-linea"
msgid "number-integral" msgid "number-integral"
msgstr "mero (entero)" msgstr "numero-entero"
msgid "number-decimal" msgid "number-decimal"
msgstr "mero (decimal)" msgstr "numero-decimal"
msgid "date" msgid "date"
msgstr "Fecha" msgstr "fecha"
msgid "datetime" msgid "datetime"
msgstr "Fecha y hora" msgstr "fecha-hora"
msgid "checkbox" msgid "checkbox"
msgstr "Casilla de verificación" msgstr "casilla-verificacion"
msgid "preset-list" msgid "preset-list"
msgstr "lista-predefinida" msgstr "lista-predefinida"

View File

@@ -5,6 +5,8 @@
# Antonin DESFONTAINES <antonin.desfontaines@outlook.com>, 2019 # Antonin DESFONTAINES <antonin.desfontaines@outlook.com>, 2019
# Zkryvix <angelo.frangione@gmail.com>, 2020 # Zkryvix <angelo.frangione@gmail.com>, 2020
# Laurent Mox <laurent@laurent.sh>, 2020 # Laurent Mox <laurent@laurent.sh>, 2020
# Nicolas Moisson <nicolas.moisson@protonmail.com>, 2020
# Nikola Kotur <nikola.kotur@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -12,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Laurent Mox <laurent@laurent.sh>, 2020\n" "Last-Translator: Nikola Kotur <nikola.kotur@gmail.com>, 2020\n"
"Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -352,7 +354,21 @@ msgid "Slovak"
msgstr "Slovaque" msgstr "Slovaque"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Tchèque"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr "Portugais (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "DemoSupermarché1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "DemoSupermarché2"
msgid "Japanese"
msgstr "Japonais"
msgid "Chinese (Taiwan)"
msgstr "Chinois (Taïwan)"

View File

@@ -16,6 +16,9 @@
# Bastien SOL <agentcobra57@gmail.com>, 2020 # Bastien SOL <agentcobra57@gmail.com>, 2020
# Bruno D'agen <iamlionem@gmail.com>, 2020 # Bruno D'agen <iamlionem@gmail.com>, 2020
# Laurent Mox <laurent@laurent.sh>, 2020 # Laurent Mox <laurent@laurent.sh>, 2020
# Nicolas Moisson <nicolas.moisson@protonmail.com>, 2020
# Gregory Pelletier <gpelletier@ip512.com>, 2020
# nerdinator <florian.dupret@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -23,7 +26,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Laurent Mox <laurent@laurent.sh>, 2020\n" "Last-Translator: nerdinator <florian.dupret@gmail.com>, 2020\n"
"Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -99,6 +102,9 @@ msgstr "Suivi des piles"
msgid "Locations" msgid "Locations"
msgstr "Emplacements" msgstr "Emplacements"
msgid "Stores"
msgstr "Magasins"
msgid "Quantity units" msgid "Quantity units"
msgstr "Formats" msgstr "Formats"
@@ -237,6 +243,9 @@ msgstr "Facteur entre la quantité à l'achat et la quantité en stock"
msgid "Create location" msgid "Create location"
msgstr "Créer un emplacement" msgstr "Créer un emplacement"
msgid "Create store"
msgstr "Créer magasin"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Créer un format" msgstr "Créer un format"
@@ -270,6 +279,9 @@ msgstr "Modifier le produit"
msgid "Edit location" msgid "Edit location"
msgstr "Modifier l'emplacement" msgstr "Modifier l'emplacement"
msgid "Edit store"
msgstr "Mettre à jour magasin"
msgid "Record data" msgid "Record data"
msgstr "Enregistrer les données" msgstr "Enregistrer les données"
@@ -347,6 +359,9 @@ msgstr "Voulez-vous vraiment supprimer le produit \"%s\" ?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Voulez-vous vraiment supprimer l'emplacement \"%s\" ?" msgstr "Voulez-vous vraiment supprimer l'emplacement \"%s\" ?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Gérer les clefs API" msgstr "Gérer les clefs API"
@@ -673,8 +688,8 @@ msgid ""
"Only check if a single unit is in stock (a different quantity can then be " "Only check if a single unit is in stock (a different quantity can then be "
"used above)" "used above)"
msgstr "" msgstr ""
"Vérifier uniquement si une unité est en stock (une quantité différente peut " "Vérifier uniquement si le stock contient au moins une unité (une quantité "
"alors être utilisée au dessus)" "supérieure pourra alors être utilisée)"
msgid "" msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients" "Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
@@ -1124,6 +1139,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Vous devez sélectionner un endroit" msgstr "Vous devez sélectionner un endroit"
msgid "You have to select a store"
msgstr "Vous devez sélectionner un magasin"
msgid "List" msgid "List"
msgstr "Liste" msgstr "Liste"
@@ -1157,8 +1175,8 @@ msgstr "Informations système"
msgid "Changelog" msgid "Changelog"
msgstr "Journalisation" msgstr "Journalisation"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "sera multiplié par %1$s pour obtenir %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "La date saisie est antérieure à aujourd'hui, êtes-vous sûr?" msgstr "La date saisie est antérieure à aujourd'hui, êtes-vous sûr?"
@@ -1209,7 +1227,7 @@ msgid "Average shelf life"
msgstr "Durée moyenne de conservation " msgstr "Durée moyenne de conservation "
msgid "Spoil rate" msgid "Spoil rate"
msgstr "Taux de gâte" msgstr "Taux de péremption"
msgid "Show more" msgid "Show more"
msgstr "Afficher plus" msgstr "Afficher plus"
@@ -1348,7 +1366,7 @@ msgid "Meal plan"
msgstr "Prévisions des menus" msgstr "Prévisions des menus"
msgid "Add recipe on %s" msgid "Add recipe on %s"
msgstr "" msgstr "Ajouter une recette dans %s"
msgid "%s serving" msgid "%s serving"
msgid_plural "%s servings" msgid_plural "%s servings"
@@ -1768,10 +1786,10 @@ msgid "Transfered %1$s of %2$s from %3$s to %4$s"
msgstr "A transferé%1$sde %2$svenant de %3$s à %4$s" msgstr "A transferé%1$sde %2$svenant de %3$s à %4$s"
msgid "Show stock entries" msgid "Show stock entries"
msgstr "" msgstr "Afficher les entrées du stock"
msgid "Stock entries" msgid "Stock entries"
msgstr "" msgstr "Entrées du stock"
msgid "Best before date" msgid "Best before date"
msgstr "A consommer de préférence avant le" msgstr "A consommer de préférence avant le"
@@ -1780,27 +1798,30 @@ msgid "Purchased date"
msgstr "Date d'achat" msgstr "Date d'achat"
msgid "Consume all %s for this stock entry" msgid "Consume all %s for this stock entry"
msgstr "" msgstr "Consommer tous les %s pour cette entrée du stock"
msgid "The amount cannot be lower than %1$s" msgid "The amount cannot be lower than %1$s"
msgstr "La quantité ne peut être inférieure à %s" msgstr "La quantité ne peut être inférieure à %s"
msgid "Stock entry successfully updated" msgid "Stock entry successfully updated"
msgstr "" msgstr "Entrée du stock mise à jour avec succès"
msgid "Edit stock entry" msgid "Edit stock entry"
msgstr "" msgstr "Modifier l'entrée du stock"
msgid "" msgid ""
"Camera access is only possible when supported and allowed by your browser " "Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection" "and when grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
"L'accès à la caméra n'est possible que s'il est pris en charge et autorisé "
"par votre navigateur et lorsque grocy utilise une connexion sécurisée "
"(HTTPS)"
msgid "Keep screen on" msgid "Keep screen on"
msgstr "Garder l'écran allumé" msgstr "Garder l'écran allumé"
msgid "Keep screen on while displaying a \"fullscreen-card\"" msgid "Keep screen on while displaying a \"fullscreen-card\""
msgstr "" msgstr "Garder l'écran allumé lorsqu'une fiche est affichée en plein écran"
msgid "A purchased date is required" msgid "A purchased date is required"
msgstr "Date d'achat obligatoire" msgstr "Date d'achat obligatoire"
@@ -1809,24 +1830,27 @@ msgid ""
"When a product is selected, one unit (per serving in purchase quantity unit)" "When a product is selected, one unit (per serving in purchase quantity unit)"
" will be added to stock on consuming this recipe" " will be added to stock on consuming this recipe"
msgstr "" msgstr ""
"Lorsqu'un produit est sélectionné, une unité (par portion dans l'unité de "
"quantité d'achat) sera ajoutée au stock lors de la consommation de cette "
"recette"
msgid "Produces product" msgid "Produces product"
msgstr "" msgstr "Génère un produit"
msgid "This booking cannot be undone" msgid "This booking cannot be undone"
msgstr "" msgstr "Cette réservation ne peut pas être annulée"
msgid "Booking does not exist or was already undone" msgid "Booking does not exist or was already undone"
msgstr "" msgstr "La réservation n'existe pas ou a déjà été annulée"
msgid "Are you sure to delete API key \"%s\"?" msgid "Are you sure to delete API key \"%s\"?"
msgstr "" msgstr "Voulez-vous vraiment supprimer la clé API \"%s\" ?"
msgid "Add note" msgid "Add note"
msgstr "Ajouter une remarque" msgstr "Ajouter une remarque"
msgid "Add note on %s" msgid "Add note on %s"
msgstr "" msgstr "Ajouter une remarque dans %s"
msgid "per day" msgid "per day"
msgstr "par jour" msgstr "par jour"
@@ -1838,16 +1862,18 @@ msgid "Normal view"
msgstr "Vue normale" msgstr "Vue normale"
msgid "Only undone items" msgid "Only undone items"
msgstr "" msgstr "Uniquement les éléments annulés"
msgid "Add product" msgid "Add product"
msgstr "Ajouter un produit" msgstr "Ajouter un produit"
msgid "Add product on %s" msgid "Add product on %s"
msgstr "" msgstr "Ajouter le produit à %s"
msgid "Consume all ingredients needed by this weeks recipes or products" msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr "" msgstr ""
"Consommer tous les ingrédients requis pour les recettes ou produits de cette"
" semaine"
msgid "Meal plan recipe" msgid "Meal plan recipe"
msgstr "Recette des prévisions de repas" msgstr "Recette des prévisions de repas"
@@ -1870,72 +1896,112 @@ msgstr "Éteint"
msgid "" msgid ""
"Scan mode is on but not all required fields could be populated automatically" "Scan mode is on but not all required fields could be populated automatically"
msgstr "" msgstr ""
"Le mode \"scan\" est activé mais tous les champs obligatoires n'ont pas pu "
"être automatiquement remplis"
msgid "Is freezer" msgid "Is freezer"
msgstr "" msgstr "Est un congélateur"
msgid "" msgid ""
"When moving products from/to a freezer location, the products best before " "When moving products from/to a freezer location, the products best before "
"date is automatically adjusted according to the product settings" "date is automatically adjusted according to the product settings"
msgstr "" msgstr ""
"Lorsque les produits entrent/sortent du congélateur, la date de durabilité "
"minimale est mise à jour automatiquement en fonction des paramètres des "
"produits"
msgid "" msgid ""
"On moving this product to a freezer location (so when freezing it), the best" "On moving this product to a freezer location (so when freezing it), the best"
" before date will be replaced by today + this amount of days" " before date will be replaced by today + this amount of days"
msgstr "" msgstr ""
"Lorsque ce produit est placé dans le congélateur (congélation), la date de "
"durabilité minimale sera remplacée par la date du jour + ce nombre de jours"
msgid "Default best before days after freezing" msgid "Default best before days after freezing"
msgstr "" msgstr "Date de durabilité minimale après congélation par défaut en jours"
msgid "" msgid ""
"On moving this product from a freezer location (so when thawing it), the " "On moving this product from a freezer location (so when thawing it), the "
"best before date will be replaced by today + this amount of days" "best before date will be replaced by today + this amount of days"
msgstr "" msgstr ""
"Lorsque ce produit est sorti du congélateur (décongélation), la date de "
"durabilité minimale sera remplacée par la date du jour + ce nombre de jours"
msgid "Default best before days after thawing" msgid "Default best before days after thawing"
msgstr "" msgstr "Date de durabilité minimale après décongélation par défaut en jours"
msgid "This cannot be the same as the \"From\" location" msgid "This cannot be the same as the \"From\" location"
msgstr "" msgstr "Ce ne peut pas être le même endroit d'origine"
msgid "Thawed" msgid "Thawed"
msgstr "" msgstr "Décongelé"
msgid "Frozen" msgid "Frozen"
msgstr "Congelé" msgstr "Congelé"
msgid "Are you sure to delete userentity \"%s\"?" msgid "Are you sure to delete userentity \"%s\"?"
msgstr "" msgstr "Voulez-vous vraiment supprimer l'entité utilisateur \"%s\" ?"
msgid "Shopping list settings" msgid "Shopping list settings"
msgstr "Paramètres de la liste de courses" msgstr "Paramètres de la liste de courses"
msgid "Show a month-view calendar" msgid "Show a month-view calendar"
msgstr "" msgstr "Afficher le calendrier en vue mensuelle"
msgid "Don't automatically switch to the compact view on mobile devices" msgid "Don't automatically switch to the compact view on mobile devices"
msgstr "" msgstr ""
"Ne pas basculer automatiquement en vue compacte sur les appareils mobiles"
msgid "Edit note on %s" msgid "Edit note on %s"
msgstr "" msgstr "Modifier la remarque dans %s"
msgid "Edit product on %s" msgid "Edit product on %s"
msgstr "" msgstr "Modifier le produit dans %s"
msgid "Edit recipe on %s" msgid "Edit recipe on %s"
msgstr "" msgstr "Modifier la recette dans %s"
msgid "Desired servings" msgid "Desired servings"
msgstr "portions souhaitées" msgstr "portions souhaitées"
msgid "Base: %s" msgid "Base: %s"
msgstr "" msgstr "Base: %s"
msgid "Recipes settings" msgid "Recipes settings"
msgstr "" msgstr "Paramètres des recettes"
msgid "Recipe card" msgid "Recipe card"
msgstr "" msgstr "Fiche de recette"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Regrouper les ingrédients par groupe de produits" msgstr "Regrouper les ingrédients par groupe de produits"
msgid "Unknown store"
msgstr "Magasin inconnu"
msgid "Store"
msgstr "Magasin"
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -3,6 +3,7 @@
# Márk Kökény <oregapamgroup@gmail.com>, 2019 # Márk Kökény <oregapamgroup@gmail.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2020 # Bernd Bestel <bernd@berrnd.de>, 2020
# Gábor Szellő <gabor.szello@gmail.com>, 2020 # Gábor Szellő <gabor.szello@gmail.com>, 2020
# Gabor Pilsits <gabor.pilsits@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Gábor Szellő <gabor.szello@gmail.com>, 2020\n" "Last-Translator: Gabor Pilsits <gabor.pilsits@gmail.com>, 2020\n"
"Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n" "Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -348,7 +349,21 @@ msgid "Slovak"
msgstr "Szlovák" msgstr "Szlovák"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Cseh"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Portugál"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "DemoSupermarket1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "DemoSupermarket2"
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr "" msgstr ""

View File

@@ -3,8 +3,8 @@
# Ádám Kovács <kovacsadam07@outlook.hu>, 2019 # Ádám Kovács <kovacsadam07@outlook.hu>, 2019
# Peter Gyetvai <gyetpet@gmail.com>, 2020 # Peter Gyetvai <gyetpet@gmail.com>, 2020
# Gábor Szellő <gabor.szello@gmail.com>, 2020 # Gábor Szellő <gabor.szello@gmail.com>, 2020
# Gabor Pilsits <gabor.pilsits@gmail.com>, 2020
# b i <balazs.izso@gesundheitscloud.de>, 2020 # b i <balazs.izso@gesundheitscloud.de>, 2020
# Gabor Pilsits <gabor.pilsits@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -12,7 +12,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: b i <balazs.izso@gesundheitscloud.de>, 2020\n" "Last-Translator: Gabor Pilsits <gabor.pilsits@gmail.com>, 2020\n"
"Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n" "Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -88,6 +88,9 @@ msgstr "Elemek követése"
msgid "Locations" msgid "Locations"
msgstr "Helyek" msgstr "Helyek"
msgid "Stores"
msgstr "Boltok"
msgid "Quantity units" msgid "Quantity units"
msgstr "Mennyiségi egységek" msgstr "Mennyiségi egységek"
@@ -226,6 +229,9 @@ msgstr "Vásárlás beszámítása a készlet mennyiségi egységbe"
msgid "Create location" msgid "Create location"
msgstr "Hely létrehozása" msgstr "Hely létrehozása"
msgid "Create store"
msgstr "Áruház hozzáadása"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Mennyiségi egység létrehozása" msgstr "Mennyiségi egység létrehozása"
@@ -259,6 +265,9 @@ msgstr "Termék szerkesztése"
msgid "Edit location" msgid "Edit location"
msgstr "Hely szerkesztése" msgstr "Hely szerkesztése"
msgid "Edit store"
msgstr "Áruház szerkesztése"
msgid "Record data" msgid "Record data"
msgstr "Adat rögzítése" msgstr "Adat rögzítése"
@@ -335,6 +344,9 @@ msgstr "Biztosan törölni szeretnéd a következő terméket: \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Biztosan törölni szeretnéd a következő helyet: \"%s\"?" msgstr "Biztosan törölni szeretnéd a következő helyet: \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Biztos benne, hogy törli a \"%s\" áruházat? "
msgid "Manage API keys" msgid "Manage API keys"
msgstr "API kulcsok kezelése" msgstr "API kulcsok kezelése"
@@ -625,8 +637,8 @@ msgstr[1] "%s Egység"
msgid "%s chore is due to be done" msgid "%s chore is due to be done"
msgid_plural "%s chores are due to be done" msgid_plural "%s chores are due to be done"
msgstr[0] "" msgstr[0] "%sházimunkát(kat) kell elvégezni"
msgstr[1] "" msgstr[1] "%sházimunkát(kat) kell elvégezni"
msgid "%s chore is overdue to be done" msgid "%s chore is overdue to be done"
msgid_plural "%s chores are overdue to be done" msgid_plural "%s chores are overdue to be done"
@@ -724,8 +736,8 @@ msgstr "Biztosan törölni szeretnéd a következő feladatot: \"%s\"?"
msgid "%s task is due to be done" msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done" msgid_plural "%s tasks are due to be done"
msgstr[0] "" msgstr[0] "%s feladatot(okat) kell elvégezni"
msgstr[1] "" msgstr[1] "%sfeladatot(okat) kell elvégezni"
msgid "%s task is overdue to be done" msgid "%s task is overdue to be done"
msgid_plural "%s tasks are overdue to be done" msgid_plural "%s tasks are overdue to be done"
@@ -947,6 +959,7 @@ msgstr "Nem lehet negatív, és egész szám megadása szükséges"
msgid "Disable stock fulfillment checking for this ingredient" msgid "Disable stock fulfillment checking for this ingredient"
msgstr "" msgstr ""
"Készlet rendelkezésre állás ellenőrzés kikapcsolása ehhez a hozzávalóhoz"
msgid "Add all list items to stock" msgid "Add all list items to stock"
msgstr "Összes listaelem hozzáadása készlethez" msgstr "Összes listaelem hozzáadása készlethez"
@@ -1093,6 +1106,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Ki kell választanod egy helyet" msgstr "Ki kell választanod egy helyet"
msgid "You have to select a store"
msgstr "Ki kell választanod egy áruházat"
msgid "List" msgid "List"
msgstr "Lista" msgstr "Lista"
@@ -1126,7 +1142,7 @@ msgstr "Rendszerinformáció"
msgid "Changelog" msgid "Changelog"
msgstr "Változásnapló" msgstr "Változásnapló"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
@@ -1188,7 +1204,7 @@ msgid "The amount must be between %1$s and %2$s"
msgstr "A mennyiség %1$s és %2$s között kell lennie" msgstr "A mennyiség %1$s és %2$s között kell lennie"
msgid "Day of month" msgid "Day of month"
msgstr "" msgstr "Hónap napja"
msgid "Monday" msgid "Monday"
msgstr "Hétfő" msgstr "Hétfő"
@@ -1754,7 +1770,7 @@ msgid "Add note"
msgstr "Jegyzet hozzáadása" msgstr "Jegyzet hozzáadása"
msgid "Add note on %s" msgid "Add note on %s"
msgstr "" msgstr "Megjegyzés hozzáadása %s-hoz/hez"
msgid "per day" msgid "per day"
msgstr "per nap" msgstr "per nap"
@@ -1858,7 +1874,7 @@ msgid "Edit recipe on %s"
msgstr "" msgstr ""
msgid "Desired servings" msgid "Desired servings"
msgstr "" msgstr "Kívánt adagok"
msgid "Base: %s" msgid "Base: %s"
msgstr "Alap:%s" msgstr "Alap:%s"
@@ -1871,3 +1887,33 @@ msgstr "Receptkártya"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr ""
msgid "Unknown store"
msgstr "Ismeretlen áruház"
msgid "Store"
msgstr "Áruház"
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr "Alapértelmezett áruház"
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -342,13 +342,27 @@ msgid "Freezer"
msgstr "Congelatore" msgstr "Congelatore"
msgid "Hungarian" msgid "Hungarian"
msgstr "" msgstr "Ungherese"
msgid "Slovak" msgid "Slovak"
msgstr "" msgstr "Slovacco"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Ceco"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr "Portoghese (Portogallo)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr "DemoSupermercato1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr "DemoSupermercato2"
msgid "Japanese"
msgstr "Giapponese"
msgid "Chinese (Taiwan)"
msgstr "Cinese (Taiwan)"

View File

@@ -88,6 +88,9 @@ msgstr "Dati batterie"
msgid "Locations" msgid "Locations"
msgstr "Posizioni" msgstr "Posizioni"
msgid "Stores"
msgstr "Negozi"
msgid "Quantity units" msgid "Quantity units"
msgstr "Unità di misura" msgstr "Unità di misura"
@@ -226,6 +229,9 @@ msgstr "Fattore di conversione tra unità di acquisto e di dispensa"
msgid "Create location" msgid "Create location"
msgstr "Aggiungi posizione" msgstr "Aggiungi posizione"
msgid "Create store"
msgstr "Crea negozio"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Aggiungi unità di misura" msgstr "Aggiungi unità di misura"
@@ -259,6 +265,9 @@ msgstr "Modifica prodotto"
msgid "Edit location" msgid "Edit location"
msgstr "Modifica posizione" msgstr "Modifica posizione"
msgid "Edit store"
msgstr "Modifica negozio"
msgid "Record data" msgid "Record data"
msgstr "Registra dati" msgstr "Registra dati"
@@ -336,6 +345,9 @@ msgstr "Sei sicuro di voler eliminare il prodotto \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Sei sicuro di voler eliminare la posizione \"%s\"?" msgstr "Sei sicuro di voler eliminare la posizione \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Sei sicuro di voler eliminare il negozio \"%s\"?"
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Gestisci le chiavi API" msgstr "Gestisci le chiavi API"
@@ -1118,6 +1130,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Devi selezionare una posizione" msgstr "Devi selezionare una posizione"
msgid "You have to select a store"
msgstr "Devi selezionare un negozio"
msgid "List" msgid "List"
msgstr "Elenco" msgstr "Elenco"
@@ -1151,7 +1166,7 @@ msgstr "Informazioni di sistema"
msgid "Changelog" msgid "Changelog"
msgstr "Registro delle modifiche" msgstr "Registro delle modifiche"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "verrà moltiplicato per un fattore di %1$s per ottenere %2$s" msgstr "verrà moltiplicato per un fattore di %1$s per ottenere %2$s"
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
@@ -1344,7 +1359,7 @@ msgid "Meal plan"
msgstr "Piano dei pasti" msgstr "Piano dei pasti"
msgid "Add recipe on %s" msgid "Add recipe on %s"
msgstr "" msgstr "Aggiungi ricetta a %s"
msgid "%s serving" msgid "%s serving"
msgid_plural "%s servings" msgid_plural "%s servings"
@@ -1799,6 +1814,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser " "Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection" "and when grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
"L'accesso alla videocamera è possibile solo se supportato e consentito dal "
"browser e quando grocy è connesso tramite una connessione sicura (https://)"
msgid "Keep screen on" msgid "Keep screen on"
msgstr "Mantieni lo schermo acceso" msgstr "Mantieni lo schermo acceso"
@@ -1834,7 +1851,7 @@ msgid "Add note"
msgstr "Aggiungi nota" msgstr "Aggiungi nota"
msgid "Add note on %s" msgid "Add note on %s"
msgstr "" msgstr "Aggiungi nota a %s"
msgid "per day" msgid "per day"
msgstr "al giorno" msgstr "al giorno"
@@ -1852,7 +1869,7 @@ msgid "Add product"
msgstr "Aggiungi prodotto" msgstr "Aggiungi prodotto"
msgid "Add product on %s" msgid "Add product on %s"
msgstr "" msgstr "Aggiungi prodotto a %s"
msgid "Consume all ingredients needed by this weeks recipes or products" msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr "" msgstr ""
@@ -1926,37 +1943,69 @@ msgid "Frozen"
msgstr "Congelato" msgstr "Congelato"
msgid "Are you sure to delete userentity \"%s\"?" msgid "Are you sure to delete userentity \"%s\"?"
msgstr "" msgstr "Sei sicuro di voler eliminare l'entità utente \"%s\"?"
msgid "Shopping list settings" msgid "Shopping list settings"
msgstr "" msgstr "Impostazioni Lista della Spesa"
msgid "Show a month-view calendar" msgid "Show a month-view calendar"
msgstr "" msgstr "Mostra un calendario con vista mensile"
msgid "Don't automatically switch to the compact view on mobile devices" msgid "Don't automatically switch to the compact view on mobile devices"
msgstr "" msgstr ""
"Non passare automaticamente alla visualizzazione compatta sui dispositivi "
"mobili"
msgid "Edit note on %s" msgid "Edit note on %s"
msgstr "" msgstr "Modifica nota a %s"
msgid "Edit product on %s" msgid "Edit product on %s"
msgstr "" msgstr "Modifica prodotto a %s"
msgid "Edit recipe on %s" msgid "Edit recipe on %s"
msgstr "" msgstr "Modifica ricetta a %s"
msgid "Desired servings" msgid "Desired servings"
msgstr "" msgstr "Porzioni desiderate"
msgid "Base: %s" msgid "Base: %s"
msgstr "" msgstr "Base: %s"
msgid "Recipes settings" msgid "Recipes settings"
msgstr "" msgstr "Impostazioni Ricette"
msgid "Recipe card" msgid "Recipe card"
msgstr "" msgstr "Scheda ricetta"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr "Raggruppa gli ingredienti per il loro gruppo di prodotti"
msgid "Unknown store"
msgstr "Negozio sconosciuto"
msgid "Store"
msgstr "Negozio"
msgid "Transaction successfully undone"
msgstr "Transazione annullata correttamente"
msgid "Default store"
msgstr "Negozio predefinito"
msgid "Consume this stock entry"
msgstr "Consuma questa voce di dispensa"
msgid "Mark this stock entry as open"
msgstr "Segna questa voce di dispensa come aperta"
msgid "Mark this item as done"
msgstr "Segna questo elemento come fatto"
msgid "Edit this item"
msgstr "Modifica questo elemento"
msgid "Delete this item"
msgstr "Elimina questo elemento"
msgid "Show an icon if the product is already on the shopping list"
msgstr "Mostra un'icona se il prodotto è già nella lista della spesa"

View File

@@ -0,0 +1,29 @@
# Translators:
# EbXpJ6bp <ebxpj6bp@outlook.jp>, 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: EbXpJ6bp <ebxpj6bp@outlook.jp>, 2020\n"
"Language-Team: Japanese (https://www.transifex.com/grocy/teams/93189/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\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,35 @@
# Translators:
# EbXpJ6bp <ebxpj6bp@outlook.jp>, 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: EbXpJ6bp <ebxpj6bp@outlook.jp>, 2020\n"
"Language-Team: Japanese (https://www.transifex.com/grocy/teams/93189/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "手動"
msgid "dynamic-regular"
msgstr "ダイナミックレギュラー"
msgid "daily"
msgstr "毎日"
msgid "weekly"
msgstr "毎週"
msgid "monthly"
msgstr "毎月"
msgid "yearly"
msgstr "毎年"

View File

@@ -0,0 +1,45 @@
# Translators:
# EbXpJ6bp <ebxpj6bp@outlook.jp>, 2020
# Bernd Bestel <bernd@berrnd.de>, 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: Bernd Bestel <bernd@berrnd.de>, 2020\n"
"Language-Team: Japanese (https://www.transifex.com/grocy/teams/93189/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/component_translations\n"
msgid "timeago_locale"
msgstr "ja"
msgid "timeago_nan"
msgstr "約 NaN 年"
msgid "moment_locale"
msgstr "ja"
msgid "datatables_localization"
msgstr ""
"{\"sEmptyTable\":\"テーブルにデータがありません\",\"sInfo\":\" _TOTAL_ 件中 _START_ から _END_"
" まで表示\",\"sInfoEmpty\":\" 0 件中 0 から 0 まで表示\",\"sInfoFiltered\":\"(全 _MAX_ "
"件より抽出)\",\"sInfoPostFix\":\"\",\"sInfoThousands\":\",\",\"sLengthMenu\":\"_MENU_"
" "
"件表示\",\"sLoadingRecords\":\"読み込み中...\",\"sProcessing\":\"処理中...\",\"sSearch\":\"検索:\",\"sZeroRecords\":\"一致するレコードがありません\",\"oPaginate\":{\"sFirst\":\"先頭\",\"sLast\":\"最終\",\"sNext\":\"次\",\"sPrevious\":\"前\"},\"oAria\":{\"sSortAscending\":\":"
" 列を昇順に並べ替えるにはアクティブにする\",\"sSortDescending\":\": 列を降順に並べ替えるにはアクティブにする\"}}"
msgid "summernote_locale"
msgstr "ja-JP"
msgid "fullcalendar_locale"
msgstr "ja"
msgid "bootstrap-select_locale"
msgstr "ja_JP"

View File

@@ -0,0 +1,352 @@
# Translators:
# EbXpJ6bp <ebxpj6bp@outlook.jp>, 2020
# 鳥山 陽平 <kagemomiji@gmail.com>, 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: 鳥山 陽平 <kagemomiji@gmail.com>, 2020\n"
"Language-Team: Japanese (https://www.transifex.com/grocy/teams/93189/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\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] "ピース"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] "パック"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] "眼鏡"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] "小缶"
msgid "Can"
msgid_plural "Cans"
msgstr[0] "カン"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] "房"
msgid "Gummy bears"
msgstr "グミベア"
msgid "Crisps"
msgstr "チップス"
msgid "Eggs"
msgstr "卵"
msgid "Noodles"
msgstr "麺類"
msgid "Pickles"
msgstr "ピクルス"
msgid "Gulash soup"
msgstr "グヤーシュ"
msgid "Yogurt"
msgstr "ヨーグルト"
msgid "Cheese"
msgstr "チーズ"
msgid "Cold cuts"
msgstr "コールドカット"
msgid "Paprika"
msgstr "パプリカ"
msgid "Cucumber"
msgstr "きゅうり"
msgid "Radish"
msgstr "だいこん"
msgid "Tomato"
msgstr "トマト"
msgid "Changed towels in the bathroom"
msgstr "浴室のタオルを変更"
msgid "Cleaned the kitchen floor"
msgstr "キッチンの床掃除"
msgid "Warranty ends"
msgstr "保証終了"
msgid "TV remote control"
msgstr "TV リモコン"
msgid "Alarm clock"
msgstr "時計のアラーム"
msgid "Heat remote control"
msgstr "ヒータのリモコン"
msgid "Lawn mowed in the garden"
msgstr "庭の芝刈り"
msgid "Some good snacks"
msgstr "おやつ"
msgid "Pizza dough"
msgstr "ピザ生地"
msgid "Sieved tomatoes"
msgstr "トマトペースト"
msgid "Salami"
msgstr "サラミ"
msgid "Toast"
msgstr "トースト"
msgid "Minced meat"
msgstr "ひき肉"
msgid "Pizza"
msgstr "ピザ"
msgid "Spaghetti bolognese"
msgstr "ボロネーゼスパゲッティ"
msgid "Sandwiches"
msgstr "サンドイッチ"
msgid "English"
msgstr "英語"
msgid "German"
msgstr "ドイツ語"
msgid "Italian"
msgstr "イタリア語"
msgid "This is the note content of the recipe ingredient"
msgstr "レシピの材料のノート"
msgid "Demo User"
msgstr "デモユーザー"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] "グラム"
msgid "Flour"
msgstr "小麦粉"
msgid "Pancakes"
msgstr "パンケーキ"
msgid "Sugar"
msgstr "砂糖"
msgid "Home"
msgstr "家"
msgid "Life"
msgstr "生活"
msgid "Projects"
msgstr "プロジェクト"
msgid "Repair the garage door"
msgstr "ガレージのドアを修復"
msgid "Fork and improve grocy"
msgstr "grocy をフォークして改善"
msgid "Find a solution for what to do when I forget the door keys"
msgstr "ドアの鍵を忘れたときの解決策を見つける"
msgid "Sweets"
msgstr "お菓子"
msgid "Bakery products"
msgstr "パン食品"
msgid "Tinned food"
msgstr "缶詰"
msgid "Butchery products"
msgstr "肉食品"
msgid "Vegetables/Fruits"
msgstr "野菜/フルーツ"
msgid "Refrigerated products"
msgstr "冷凍食品"
msgid "Coffee machine"
msgstr "コーヒー マシーン"
msgid "Dishwasher"
msgstr "食器洗い機"
msgid "Liter"
msgstr "リットル"
msgid "Liters"
msgstr "リットル"
msgid "Bottle"
msgstr "本"
msgid "Bottles"
msgstr "本"
msgid "Milk"
msgstr "ミルク"
msgid "Chocolate sauce"
msgstr "チョコレート ソース"
msgid "Milliliters"
msgstr "ミリリットル"
msgid "Milliliter"
msgstr "ミリリットル"
msgid "Bottom"
msgstr "底"
msgid "Topping"
msgstr "トッピング"
msgid "French"
msgstr "フランス語"
msgid "Turkish"
msgstr "トルコ語"
msgid "Spanish"
msgstr "スペイン語"
msgid "Russian"
msgstr "ロシア語"
msgid "The thing which happens on the 5th of every month"
msgstr "毎月5日に起こること"
msgid "The thing which happens daily"
msgstr "毎日起こること"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr "月曜日と水曜日に起こること"
msgid "Swedish"
msgstr "スウェーデン語"
msgid "Polish"
msgstr "ポーランド語"
msgid "Milk Chocolate"
msgstr "ミルク チョコレート"
msgid "Dark Chocolate"
msgstr "ダーク チョコレート"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "枚"
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"

1863
localization/ja/strings.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
# Translators:
# 鳥山 陽平 <kagemomiji@gmail.com>, 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:43+0000\n"
"Last-Translator: 鳥山 陽平 <kagemomiji@gmail.com>, 2020\n"
"Language-Team: Japanese (https://www.transifex.com/grocy/teams/93189/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr "1行のテキスト"
msgid "text-multi-line"
msgstr "複数行のテキスト"
msgid "number-integral"
msgstr "整数"
msgid "number-decimal"
msgstr "小数"
msgid "date"
msgstr "日付"
msgid "datetime"
msgstr "日時"
msgid "checkbox"
msgstr "チェックボックス"
msgid "preset-list"
msgstr "既定のリスト"
msgid "preset-checklist"
msgstr "既定のチェックリスト"
msgid "link"
msgstr "リンク"

View File

@@ -354,7 +354,21 @@ msgid "Slovak"
msgstr "Slovaaks" msgstr "Slovaaks"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Tsjechisch"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Portugees (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr "" msgstr ""

View File

@@ -11,9 +11,9 @@
# Frank Klaassen <frank@frankklaassen.nl>, 2019 # Frank Klaassen <frank@frankklaassen.nl>, 2019
# Kees van Nieuwenhuijzen <kees@vannieuwenhuijzen.com>, 2019 # Kees van Nieuwenhuijzen <kees@vannieuwenhuijzen.com>, 2019
# Boding Clockchain <joost_nl@live.nl>, 2020 # Boding Clockchain <joost_nl@live.nl>, 2020
# Daniel Polders <zigurana@gmail.com>, 2020
# Bastien Van Houdt <bastienvanhoudt@gmail.com>, 2020
# gggg <bashankamp@gmail.com>, 2020 # gggg <bashankamp@gmail.com>, 2020
# Bastien Van Houdt <bastienvanhoudt@gmail.com>, 2020
# D. Polders <zigurana@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -21,7 +21,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: gggg <bashankamp@gmail.com>, 2020\n" "Last-Translator: D. Polders <zigurana@gmail.com>, 2020\n"
"Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n" "Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,7 +41,7 @@ msgstr[1] "%s producten verlopen"
msgid "within the next day" msgid "within the next day"
msgid_plural "within the next %s days" msgid_plural "within the next %s days"
msgstr[0] "tussen nu en morgen" msgstr[0] "tussen nu en morgen"
msgstr[1] "in de komende %s dagen" msgstr[1] "binnen %s dagen"
msgid "%s product is already expired" msgid "%s product is already expired"
msgid_plural "%s products are already expired" msgid_plural "%s products are already expired"
@@ -97,6 +97,9 @@ msgstr "Batterij volgen"
msgid "Locations" msgid "Locations"
msgstr "Locaties" msgstr "Locaties"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Hoeveelheidseenheden" msgstr "Hoeveelheidseenheden"
@@ -235,6 +238,9 @@ msgstr "Factor van aankoop- naar voorraadeenheid"
msgid "Create location" msgid "Create location"
msgstr "Maak een locatie" msgstr "Maak een locatie"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Maak hoeveelheidseenheid" msgstr "Maak hoeveelheidseenheid"
@@ -268,6 +274,9 @@ msgstr "Bewerk product"
msgid "Edit location" msgid "Edit location"
msgstr "Wijzig locatie" msgstr "Wijzig locatie"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Gegevens opslaan" msgstr "Gegevens opslaan"
@@ -346,6 +355,9 @@ msgstr "Weet u zeker dat u product \"%s\" wilt verwijderen?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Weet u zeker dat u locatie \"%s\" wilt verwijderen?" msgstr "Weet u zeker dat u locatie \"%s\" wilt verwijderen?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Beheer API sleutels" msgstr "Beheer API sleutels"
@@ -634,12 +646,12 @@ msgstr[1] "%seenheden"
msgid "%s chore is due to be done" msgid "%s chore is due to be done"
msgid_plural "%s chores are due to be done" msgid_plural "%s chores are due to be done"
msgstr[0] "%sklusje is om uitgevoerd te worden" msgstr[0] "%sklusje is om uitgevoerd te worden"
msgstr[1] "%sklussen moeten worden gedaan" msgstr[1] "%s klussen om te doen"
msgid "%s chore is overdue to be done" msgid "%s chore is overdue to be done"
msgid_plural "%s chores are overdue to be done" msgid_plural "%s chores are overdue to be done"
msgstr[0] "%sklus moet nog gedaan worden" msgstr[0] "%sklus moet nog gedaan worden"
msgstr[1] "%sklussen moeten nog steeds gedaan worden" msgstr[1] "%s achterstallige klussen te doen"
msgid "%s battery is due to be charged" msgid "%s battery is due to be charged"
msgid_plural "%s batteries are due to be charged" msgid_plural "%s batteries are due to be charged"
@@ -712,7 +724,7 @@ msgid "Assigned to"
msgstr "Toegewezen aan" msgstr "Toegewezen aan"
msgid "Mark task \"%s\" as completed" msgid "Mark task \"%s\" as completed"
msgstr "Klusje \"%s\" als afgewerkt aanduiden" msgstr "Taak \"%s\" als voltooid aanduiden"
msgid "Uncategorized" msgid "Uncategorized"
msgstr "Ongecategoriseerd" msgstr "Ongecategoriseerd"
@@ -738,12 +750,12 @@ msgstr "Weet u zeker dat u taak \"%s\" wilt verwijderen?"
msgid "%s task is due to be done" msgid "%s task is due to be done"
msgid_plural "%s tasks are due to be done" msgid_plural "%s tasks are due to be done"
msgstr[0] "%staak moet uitgevoerd worden" msgstr[0] "%staak moet uitgevoerd worden"
msgstr[1] "%staken moeten uitgevoerd worden" msgstr[1] "%s taken te doen"
msgid "%s task is overdue to be done" msgid "%s task is overdue to be done"
msgid_plural "%s tasks are overdue to be done" msgid_plural "%s tasks are overdue to be done"
msgstr[0] "%staak moet nog uitgevoerd worden" msgstr[0] "%staak moet nog uitgevoerd worden"
msgstr[1] "%staken moeten nog uitgevoerd worden" msgstr[1] "%s achterstallige taken te doen"
msgid "Edit task category" msgid "Edit task category"
msgstr "Bewerk taakcategorie" msgstr "Bewerk taakcategorie"
@@ -782,16 +794,16 @@ msgid "Below min. stock amount"
msgstr "Onder min. voorraadhoeveelheid" msgstr "Onder min. voorraadhoeveelheid"
msgid "Expiring soon" msgid "Expiring soon"
msgstr "Vervalt binnenkort" msgstr "Verloopt binnenkort"
msgid "Already expired" msgid "Already expired"
msgstr "Al verlopen" msgstr "Al verlopen"
msgid "Due soon" msgid "Due soon"
msgstr "Bij over tijd" msgstr "Bijna gepland"
msgid "Overdue" msgid "Overdue"
msgstr "Over tijd" msgstr "Achterstallig"
msgid "View settings" msgid "View settings"
msgstr "Beeld instellingen" msgstr "Beeld instellingen"
@@ -1013,7 +1025,7 @@ msgid "Product expires"
msgstr "Product vervalt" msgstr "Product vervalt"
msgid "Task due" msgid "Task due"
msgstr "Klusje open" msgstr "Taak te doen"
msgid "Chore due" msgid "Chore due"
msgstr "Klus tegen" msgstr "Klus tegen"
@@ -1125,6 +1137,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Je moet een locatie selecteren" msgstr "Je moet een locatie selecteren"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Lijst" msgstr "Lijst"
@@ -1159,8 +1174,8 @@ msgstr "Systeeminfo"
msgid "Changelog" msgid "Changelog"
msgstr "Changelog" msgstr "Changelog"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "wordt vermenigvuldigd met een factor %1$s om er %2$s van te krijgen" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "De opgegeven datum is eerder dan vandaag; weet je het zeker?" msgstr "De opgegeven datum is eerder dan vandaag; weet je het zeker?"
@@ -1570,7 +1585,7 @@ msgstr "Voor dit toewijzingstype moet er minstens één worden toegewezen"
msgid "%s chore is assigned to me" msgid "%s chore is assigned to me"
msgid_plural "%s chores are assigned to me" msgid_plural "%s chores are assigned to me"
msgstr[0] "%s klusje is toegewezen aan mij" msgstr[0] "%s klusje is toegewezen aan mij"
msgstr[1] "%sklussen zijn toegewezen aan mij" msgstr[1] "%s klussen toegewezen aan mij"
msgid "Assigned to me" msgid "Assigned to me"
msgstr "Toegewezen aan mij" msgstr "Toegewezen aan mij"
@@ -1803,6 +1818,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser " "Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection" "and when grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
"Cameratoegang is alleen mogelijk als uw browser dit ondersteunt en toelaat "
"en wanneer u verbindt met grocy via een beveiligde verbinding (https://)."
msgid "Keep screen on" msgid "Keep screen on"
msgstr "Houd scherm aan" msgstr "Houd scherm aan"
@@ -1963,3 +1980,33 @@ msgstr "Receptfiche"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Groepeer ingrediënten per productcategorie" msgstr "Groepeer ingrediënten per productcategorie"
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -346,7 +346,21 @@ msgid "Slovak"
msgstr "Slovakisk" msgstr "Slovakisk"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Tjekkisk"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Portugisisk (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr "" msgstr ""

View File

@@ -29,10 +29,10 @@ msgid "consume"
msgstr "forbruk" msgstr "forbruk"
msgid "inventory-correction" msgid "inventory-correction"
msgstr "beholdningsantall korreksjon" msgstr "beholdningsantall_korreksjon"
msgid "product-opened" msgid "product-opened"
msgstr "produkt åpnet" msgstr "produkt_åpnet"
msgid "stock-edit-old" msgid "stock-edit-old"
msgstr "beholdning_endre_gammel" msgstr "beholdning_endre_gammel"

View File

@@ -85,6 +85,9 @@ msgstr "Batteriregistrering"
msgid "Locations" msgid "Locations"
msgstr "Lokasjoner" msgstr "Lokasjoner"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Forpakning" msgstr "Forpakning"
@@ -207,7 +210,7 @@ msgid "Minimum stock amount"
msgstr "Minimumsbeholdning" msgstr "Minimumsbeholdning"
msgid "Default best before days" msgid "Default best before days"
msgstr "Standard for antall dager best før" msgstr "Forhåndsatt antall dager best før"
msgid "Quantity unit purchase" msgid "Quantity unit purchase"
msgstr "Forpakning kjøpt" msgstr "Forpakning kjøpt"
@@ -221,6 +224,9 @@ msgstr "Innkjøpsfaktor for forpakning"
msgid "Create location" msgid "Create location"
msgstr "Opprett lokasjon" msgstr "Opprett lokasjon"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Opprett forpakning" msgstr "Opprett forpakning"
@@ -254,6 +260,9 @@ msgstr "Endre produkt"
msgid "Edit location" msgid "Edit location"
msgstr "Endre lokasjon" msgstr "Endre lokasjon"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Logg handlinger" msgstr "Logg handlinger"
@@ -329,6 +338,9 @@ msgstr "Er du sikker du ønsker å slette produkt \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Er du sikker du ønsker å slette lokasjon \"%s\"?" msgstr "Er du sikker du ønsker å slette lokasjon \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Administrer API-Keys" msgstr "Administrer API-Keys"
@@ -867,7 +879,7 @@ msgid "Filter by product group"
msgstr "Filtrér etter produktgruppe" msgstr "Filtrér etter produktgruppe"
msgid "Presets for new products" msgid "Presets for new products"
msgstr "Standard for nye produkter" msgstr "Forhåndsatt for nye produkter"
msgid "Included recipes" msgid "Included recipes"
msgstr "Inkludert oppskrift" msgstr "Inkludert oppskrift"
@@ -968,7 +980,7 @@ msgstr ""
"dato + antall dager under" "dato + antall dager under"
msgid "Default best before days after opened" msgid "Default best before days after opened"
msgstr "Standard best før dager etter åpnet" msgstr "Forhåndsatt best før dager etter åpnet"
msgid "Marked %1$s of %2$s as opened" msgid "Marked %1$s of %2$s as opened"
msgstr "Merket %1$s av %2$s som åpnet" msgstr "Merket %1$s av %2$s som åpnet"
@@ -1011,7 +1023,7 @@ msgid ""
"shopping list item, if the product has \"Default best before days\" set" "shopping list item, if the product has \"Default best before days\" set"
msgstr "" msgstr ""
"Legg produkter automatisk til fra handlelisten. Dette vil bruke siste brukte" "Legg produkter automatisk til fra handlelisten. Dette vil bruke siste brukte"
" innkjøpspris og forutsetter at \"Standard for antall dager best før\" er " " innkjøpspris og forutsetter at \"Forhåndsatt antall dager best før\" er "
"satt" "satt"
msgid "Skip" msgid "Skip"
@@ -1098,6 +1110,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Du må velge en lokasjon" msgstr "Du må velge en lokasjon"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Liste" msgstr "Liste"
@@ -1131,8 +1146,8 @@ msgstr "System info"
msgid "Changelog" msgid "Changelog"
msgstr "Change Log" msgstr "Change Log"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "Vil bli ganget med %1$s for å få %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "" msgstr ""
@@ -1151,7 +1166,7 @@ msgid ""
"This will be used as the default setting when adding this product as a " "This will be used as the default setting when adding this product as a "
"recipe ingredient" "recipe ingredient"
msgstr "" msgstr ""
"Dette vil bli brukt som standard innstilling når dette produktet blir brukt " "Dette vil bli brukt som forhåndsinnstilling når dette produktet blir brukt "
"som ingrediens i en oppskrift" "som ingrediens i en oppskrift"
msgid "Add item" msgid "Add item"
@@ -1323,7 +1338,7 @@ msgid "Meal plan"
msgstr "Middagsplanlegger" msgstr "Middagsplanlegger"
msgid "Add recipe on %s" msgid "Add recipe on %s"
msgstr "" msgstr "Legg oppskrift til %s"
msgid "%s serving" msgid "%s serving"
msgid_plural "%s servings" msgid_plural "%s servings"
@@ -1653,7 +1668,7 @@ msgid "Display recipe"
msgstr "Vis oppskrift" msgstr "Vis oppskrift"
msgid "Accumulate sub products min. stock amount" msgid "Accumulate sub products min. stock amount"
msgstr "Akkumulert underprodukter minimum beholdningsnivå" msgstr "Akkumuler underordnede produkter i minimum beholdningsnivå"
msgid "" msgid ""
"If enabled, the min. stock amount of sub products will be accumulated into " "If enabled, the min. stock amount of sub products will be accumulated into "
@@ -1661,8 +1676,8 @@ msgid ""
"product" "product"
msgstr "" msgstr ""
"Hvis aktivert vil minimum beholdningsnivå av under produkter bli akkumulert " "Hvis aktivert vil minimum beholdningsnivå av under produkter bli akkumulert "
"inn i dette produktet. Dette betyr at under produktet aldri vil \"mangle\", " "inn i dette produktet. Dette betyr at underordnede produktet aldri vil "
"kunne dette produktet." "\"mangle\", kunne dette produktet."
msgid "Are you sure to remove this conversion?" msgid "Are you sure to remove this conversion?"
msgstr "Er du sikker på at du ønsker å fjerne denne konverteringen?" msgstr "Er du sikker på at du ønsker å fjerne denne konverteringen?"
@@ -1680,7 +1695,7 @@ msgid "Unlimited"
msgstr "Evig" msgstr "Evig"
msgid "Clear" msgid "Clear"
msgstr "Tøm" msgstr "Slett"
msgid "Are you sure to remove the included recipe \"%s\"?" msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "Er du sikker du ønsker å slette den inkluderte oppskriften \"%s\"?" msgstr "Er du sikker du ønsker å slette den inkluderte oppskriften \"%s\"?"
@@ -1769,6 +1784,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser " "Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection" "and when grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
"Tilgang til kamera er kun mulig når det er støttet og når nettleseren din "
"tillater det og når grocy kjøres gjennom en sikker tilkobling (https://)"
msgid "Keep screen on" msgid "Keep screen on"
msgstr "Skjerm alltid på" msgstr "Skjerm alltid på"
@@ -1802,7 +1819,7 @@ msgid "Add note"
msgstr "Legg til notat" msgstr "Legg til notat"
msgid "Add note on %s" msgid "Add note on %s"
msgstr "" msgstr "Legg notat til %s"
msgid "per day" msgid "per day"
msgstr "per dag" msgstr "per dag"
@@ -1820,7 +1837,7 @@ msgid "Add product"
msgstr "Legg til produkt" msgstr "Legg til produkt"
msgid "Add product on %s" msgid "Add product on %s"
msgstr "" msgstr "Legg produkt til %s"
msgid "Consume all ingredients needed by this weeks recipes or products" msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr "" msgstr ""
@@ -1867,7 +1884,7 @@ msgstr ""
"fryses), endres best før datoen fra i dag + antall dager under" "fryses), endres best før datoen fra i dag + antall dager under"
msgid "Default best before days after freezing" msgid "Default best before days after freezing"
msgstr "Standard best før dager etter frysing" msgstr "Forhåndssatt best før dager etter frysing"
msgid "" msgid ""
"On moving this product from a freezer location (so when thawing it), the " "On moving this product from a freezer location (so when thawing it), the "
@@ -1877,7 +1894,7 @@ msgstr ""
"tines), endres best før datoen fra i dag + antall dager under" "tines), endres best før datoen fra i dag + antall dager under"
msgid "Default best before days after thawing" msgid "Default best before days after thawing"
msgstr "Standard best før dager etter tining" msgstr "Forhåndsatt best før dager etter tining"
msgid "This cannot be the same as the \"From\" location" msgid "This cannot be the same as the \"From\" location"
msgstr "Dette kan ikke være det som \"Fra\" lokasjonen" msgstr "Dette kan ikke være det som \"Fra\" lokasjonen"
@@ -1892,34 +1909,64 @@ msgid "Are you sure to delete userentity \"%s\"?"
msgstr "Er du sikker på at du ønsker slette userentity \"%s\"?" msgstr "Er du sikker på at du ønsker slette userentity \"%s\"?"
msgid "Shopping list settings" msgid "Shopping list settings"
msgstr "" msgstr "Handleliste - innstillinger"
msgid "Show a month-view calendar" msgid "Show a month-view calendar"
msgstr "" msgstr "Vis månedsoverblikk for kalenderen "
msgid "Don't automatically switch to the compact view on mobile devices" msgid "Don't automatically switch to the compact view on mobile devices"
msgstr "" msgstr "Ikke bytt til kompakt visning automatisk når du er på en mobil enhet"
msgid "Edit note on %s" msgid "Edit note on %s"
msgstr "" msgstr "Endre notat for den %s"
msgid "Edit product on %s" msgid "Edit product on %s"
msgstr "" msgstr "Endre produkt for den %s"
msgid "Edit recipe on %s" msgid "Edit recipe on %s"
msgstr "" msgstr "Endre produkt for den %s"
msgid "Desired servings" msgid "Desired servings"
msgstr "" msgstr "Ønskede porsjoner"
msgid "Base: %s" msgid "Base: %s"
msgstr "" msgstr "Base: %s"
msgid "Recipes settings" msgid "Recipes settings"
msgstr "" msgstr "Opprkifter - innstillinger"
msgid "Recipe card" msgid "Recipe card"
msgstr "" msgstr "Oppskrift kort"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Gruppér ingredienser ut fra deres produktgruppe"
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr "" msgstr ""

View File

@@ -350,3 +350,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -87,6 +87,9 @@ msgstr "Monitoramento de Bateria"
msgid "Locations" msgid "Locations"
msgstr "Localizações" msgstr "Localizações"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Unidades de medida" msgstr "Unidades de medida"
@@ -224,6 +227,9 @@ msgstr "Fator de unidade de compra e estoque"
msgid "Create location" msgid "Create location"
msgstr "Criar Localização" msgstr "Criar Localização"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Criar unidade de medida" msgstr "Criar unidade de medida"
@@ -257,6 +263,9 @@ msgstr "Editar produto"
msgid "Edit location" msgid "Edit location"
msgstr "Editar localização" msgstr "Editar localização"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Gravar dados" msgstr "Gravar dados"
@@ -335,6 +344,9 @@ msgstr "Tem certeza que quer apagar este produto \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Tem certeza que quer apagar este local \"%s\"?" msgstr "Tem certeza que quer apagar este local \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Organizar Chaves do API" msgstr "Organizar Chaves do API"
@@ -1107,6 +1119,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Você precisa selecionar uma localização" msgstr "Você precisa selecionar uma localização"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Lista" msgstr "Lista"
@@ -1140,8 +1155,8 @@ msgstr "Informações do sistema"
msgid "Changelog" msgid "Changelog"
msgstr "Log de alterações" msgstr "Log de alterações"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "será multiplicado um fator de %1$s para obter %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "Você tem certeza que a data especificada é anterior a data de hoje?" msgstr "Você tem certeza que a data especificada é anterior a data de hoje?"
@@ -1927,3 +1942,33 @@ msgstr ""
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr ""
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -1,6 +1,7 @@
# Translators: # Translators:
# Joao Santos <joaocpdsantos@gmail.com>, 2019 # Joao Santos <joaocpdsantos@gmail.com>, 2019
# Ricardo Rodrigues <fenix999@gmail.com>, 2020 # Ricardo Rodrigues <fenix999@gmail.com>, 2020
# Miguel Pereira <miguelpereira.pro@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Ricardo Rodrigues <fenix999@gmail.com>, 2020\n" "Last-Translator: Miguel Pereira <miguelpereira.pro@gmail.com>, 2020\n"
"Language-Team: Portuguese (Portugal) (https://www.transifex.com/grocy/teams/93189/pt_PT/)\n" "Language-Team: Portuguese (Portugal) (https://www.transifex.com/grocy/teams/93189/pt_PT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -347,7 +348,21 @@ msgid "Slovak"
msgstr "Eslovaco" msgstr "Eslovaco"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Checo"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Português (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr "" msgstr ""

View File

@@ -85,6 +85,9 @@ msgstr "Tracking de Pilhas"
msgid "Locations" msgid "Locations"
msgstr "Localizações" msgstr "Localizações"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Unidades de medida" msgstr "Unidades de medida"
@@ -223,6 +226,9 @@ msgstr "Unidade de medida do stock por compra"
msgid "Create location" msgid "Create location"
msgstr "Criar localização" msgstr "Criar localização"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Criar unidade de medida" msgstr "Criar unidade de medida"
@@ -256,6 +262,9 @@ msgstr "Editar Produto"
msgid "Edit location" msgid "Edit location"
msgstr "Editar Localização" msgstr "Editar Localização"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Gravar dados" msgstr "Gravar dados"
@@ -336,6 +345,9 @@ msgstr "Tem a certeza que pretende eliminar o produto \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Tem a certeza que pretende eliminar o local \"%s\"?" msgstr "Tem a certeza que pretende eliminar o local \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Gerir chaves da API" msgstr "Gerir chaves da API"
@@ -1099,6 +1111,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Precisa de seleccionar uma localização" msgstr "Precisa de seleccionar uma localização"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Lista" msgstr "Lista"
@@ -1132,8 +1147,8 @@ msgstr "Informação do sistema"
msgid "Changelog" msgid "Changelog"
msgstr "histórico de modificações" msgstr "histórico de modificações"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "será multiplicado pelo factor de %1$s para ter%2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "A data é anterior a hoje, tem a certeza?" msgstr "A data é anterior a hoje, tem a certeza?"
@@ -1886,3 +1901,33 @@ msgstr "Cartão da receita"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Agrupar ingredientes pelo respectivo grupo de produto" msgstr "Agrupar ingredientes pelo respectivo grupo de produto"
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -1,6 +1,7 @@
# Translators: # Translators:
# Pavel Pletenev <cpp.create@gmail.com>, 2019 # Pavel Pletenev <cpp.create@gmail.com>, 2019
# First Name Second Name <greentail@protonmail.ch>, 2019 # First Name Second Name <greentail@protonmail.ch>, 2019
# Maksim Moiseikin <m.moiseikin@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: First Name Second Name <greentail@protonmail.ch>, 2019\n" "Last-Translator: Maksim Moiseikin <m.moiseikin@gmail.com>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n" "Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -33,4 +34,4 @@ msgid "monthly"
msgstr "ежемесячно" msgstr "ежемесячно"
msgid "yearly" msgid "yearly"
msgstr "" msgstr "ежегодно"

View File

@@ -1,6 +1,7 @@
# Translators: # Translators:
# Pavel Pletenev <cpp.create@gmail.com>, 2019
# cool guy <eut53770@bcaoo.com>, 2019 # cool guy <eut53770@bcaoo.com>, 2019
# Maksim Moiseikin <m.moiseikin@gmail.com>, 2020
# Pavel Pletenev <cpp.create@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: cool guy <eut53770@bcaoo.com>, 2019\n" "Last-Translator: Pavel Pletenev <cpp.create@gmail.com>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n" "Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -165,7 +166,7 @@ msgid "Sandwiches"
msgstr "Сэндвичи" msgstr "Сэндвичи"
msgid "English" msgid "English"
msgstr "Английски" msgstr "Английский"
msgid "German" msgid "German"
msgstr "Немецкий" msgstr "Немецкий"
@@ -347,22 +348,36 @@ msgid "not yet released"
msgstr "Пока не выпущено" msgstr "Пока не выпущено"
msgid "Portuguese (Brazil)" msgid "Portuguese (Brazil)"
msgstr "" msgstr "Португальский (Бразилия)"
msgid "This is a note" msgid "This is a note"
msgstr "" msgstr "Это заметка"
msgid "Freezer" msgid "Freezer"
msgstr "" msgstr "Морозилка"
msgid "Hungarian" msgid "Hungarian"
msgstr "" msgstr "Венгерский"
msgid "Slovak" msgid "Slovak"
msgstr "" msgstr "Словацкий"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Чешский"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" 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 "Китайский (Тайвань)"

View File

@@ -3,6 +3,7 @@
# Pavel Pletenev <cpp.create@gmail.com>, 2019 # Pavel Pletenev <cpp.create@gmail.com>, 2019
# cool guy <eut53770@bcaoo.com>, 2019 # cool guy <eut53770@bcaoo.com>, 2019
# First Name Second Name <greentail@protonmail.ch>, 2019 # First Name Second Name <greentail@protonmail.ch>, 2019
# Maksim Moiseikin <m.moiseikin@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: First Name Second Name <greentail@protonmail.ch>, 2019\n" "Last-Translator: Maksim Moiseikin <m.moiseikin@gmail.com>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n" "Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -96,6 +97,9 @@ msgstr "Отслеживание батареек"
msgid "Locations" msgid "Locations"
msgstr "Места" msgstr "Места"
msgid "Stores"
msgstr "Магазины"
msgid "Quantity units" msgid "Quantity units"
msgstr "Единицы измерения" msgstr "Единицы измерения"
@@ -233,6 +237,9 @@ msgstr "Коэффициент пересчёта единиц измерени
msgid "Create location" msgid "Create location"
msgstr "Создать место хранения" msgstr "Создать место хранения"
msgid "Create store"
msgstr "Добавить магазин"
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Создать единицу измерения" msgstr "Создать единицу измерения"
@@ -266,6 +273,9 @@ msgstr "Изменить продукт"
msgid "Edit location" msgid "Edit location"
msgstr "Изменить место хранения" msgstr "Изменить место хранения"
msgid "Edit store"
msgstr "Редактировать магазин"
msgid "Record data" msgid "Record data"
msgstr "Записать данные" msgstr "Записать данные"
@@ -345,6 +355,9 @@ msgstr "Вы уверены, что хотите удалить продукт %
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Вы уверены, что нужно удалить место хранения \"%s\"?" msgstr "Вы уверены, что нужно удалить место хранения \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr "Вы уверены, что хотите удалить магазин \"%s\"?"
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Управление ключами доступа к API" msgstr "Управление ключами доступа к API"
@@ -1003,6 +1016,8 @@ msgid ""
"When this product was marked as opened, the best before date will be " "When this product was marked as opened, the best before date will be "
"replaced by today + this amount of days (a value of 0 disables this)" "replaced by today + this amount of days (a value of 0 disables this)"
msgstr "" msgstr ""
"Когда продукт помечается как открытый, срок годности заменится по формуле: "
"сегодня + это количество дней (значение 0 отключает этот функционал)"
msgid "Default best before days after opened" msgid "Default best before days after opened"
msgstr "Срок годности в днях по умолчанию после открытия" msgstr "Срок годности в днях по умолчанию после открытия"
@@ -1138,6 +1153,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Вам нужно выбрать место хранения" msgstr "Вам нужно выбрать место хранения"
msgid "You have to select a store"
msgstr "Вам нужно выбрать магазин"
msgid "List" msgid "List"
msgstr "Список" msgstr "Список"
@@ -1171,8 +1189,8 @@ msgstr "Системная информация"
msgid "Changelog" msgid "Changelog"
msgstr "Список изменений" msgstr "Список изменений"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "будет умножено на коэфф. %1$s, т.е. %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "Введённая дата в прошлом, вы уверены?" msgstr "Введённая дата в прошлом, вы уверены?"
@@ -1330,7 +1348,7 @@ msgid "Expiring soon days"
msgstr "Дней до окончания срока годности" msgstr "Дней до окончания срока годности"
msgid "Default location" msgid "Default location"
msgstr "" msgstr "Место хранения по умолчанию"
msgid "Default amount for purchase" msgid "Default amount for purchase"
msgstr "Количество покупки по умолчанию" msgstr "Количество покупки по умолчанию"
@@ -1362,7 +1380,7 @@ msgid "Meal plan"
msgstr "План питания" msgstr "План питания"
msgid "Add recipe on %s" msgid "Add recipe on %s"
msgstr "" msgstr "Добавить рецепт в %s"
msgid "%s serving" msgid "%s serving"
msgid_plural "%s servings" msgid_plural "%s servings"
@@ -1708,106 +1726,115 @@ msgid "Are you sure to remove this conversion?"
msgstr "Вы уверены, что нужно удалить это преобразование?" msgstr "Вы уверены, что нужно удалить это преобразование?"
msgid "Unit price" msgid "Unit price"
msgstr "" msgstr "Цена за единицу"
msgid "Total price" msgid "Total price"
msgstr "" msgstr "Общая цена"
msgid "in %s and based on the purchase quantity unit" msgid "in %s and based on the purchase quantity unit"
msgstr "" msgstr "в %s исходя из количества купленных единиц"
msgid "Unlimited" msgid "Unlimited"
msgstr "" msgstr "Неограниченно"
msgid "Clear" msgid "Clear"
msgstr "" msgstr "Очистить"
msgid "Are you sure to remove the included recipe \"%s\"?" msgid "Are you sure to remove the included recipe \"%s\"?"
msgstr "" msgstr "Вы уверены, что хотите удалить включённый рецепт \"%s\"?"
msgid "Period interval" msgid "Period interval"
msgstr "" msgstr "Временной интервал"
msgid "" msgid ""
"This means the next execution of this chore should only be scheduled every " "This means the next execution of this chore should only be scheduled every "
"%s days" "%s days"
msgstr "" msgstr ""
"Это означает, что выполнение этой работы будет назначаться каждые %s дней"
msgid "" msgid ""
"This means the next execution of this chore should only be scheduled every " "This means the next execution of this chore should only be scheduled every "
"%s weeks" "%s weeks"
msgstr "" msgstr ""
"Это означает, что выполнение этой работы будет назначаться каждые %s недель"
msgid "" msgid ""
"This means the next execution of this chore should only be scheduled every " "This means the next execution of this chore should only be scheduled every "
"%s months" "%s months"
msgstr "" msgstr ""
"Это означает, что выполнение этой работы будет назначаться каждые %s месяцев"
msgid "" msgid ""
"This means the next execution of this chore is scheduled 1 year after the " "This means the next execution of this chore is scheduled 1 year after the "
"last execution" "last execution"
msgstr "" msgstr ""
"Это означает, что выполнение этой работы будет назначено через год после "
"последнего выполнения"
msgid "" msgid ""
"This means the next execution of this chore should only be scheduled every " "This means the next execution of this chore should only be scheduled every "
"%s years" "%s years"
msgstr "" msgstr ""
"Это означает, что выполнение этой работы будет назначаться каждые %s лет"
msgid "Transfer" msgid "Transfer"
msgstr "" msgstr "Переместить"
msgid "From location" msgid "From location"
msgstr "" msgstr "Из места хранения"
msgid "To location" msgid "To location"
msgstr "" msgstr "В место хранения"
msgid "There are no units available at this location" msgid "There are no units available at this location"
msgstr "" msgstr "Нет объектов доступных в этом месте хранения"
msgid "Amount: %1$s; Expires on %2$s; Bought on %3$s" msgid "Amount: %1$s; Expires on %2$s; Bought on %3$s"
msgstr "" msgstr "Количество: %1$s; Срок годности: %2$s; Куплено: %3$s"
msgid "Transfered %1$s of %2$s from %3$s to %4$s" msgid "Transfered %1$s of %2$s from %3$s to %4$s"
msgstr "" msgstr "Перемещено %1$s из %2$s из %3$s в %4$s"
msgid "Show stock entries" msgid "Show stock entries"
msgstr "" msgstr "Показать запасы"
msgid "Stock entries" msgid "Stock entries"
msgstr "" msgstr "Запасы"
msgid "Best before date" msgid "Best before date"
msgstr "" msgstr "Годен до"
msgid "Purchased date" msgid "Purchased date"
msgstr "" msgstr "Дата покупки"
msgid "Consume all %s for this stock entry" msgid "Consume all %s for this stock entry"
msgstr "" msgstr "Употребить все %s этого запаса"
msgid "The amount cannot be lower than %1$s" msgid "The amount cannot be lower than %1$s"
msgstr "" msgstr "Количество не может быть меньше %s"
msgid "Stock entry successfully updated" msgid "Stock entry successfully updated"
msgstr "" msgstr "Данные по запасу успешно обновлены"
msgid "Edit stock entry" msgid "Edit stock entry"
msgstr "" msgstr "Редактировать запас"
msgid "" msgid ""
"Camera access is only possible when supported and allowed by your browser " "Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection" "and when grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
"Доступ к камере возможен только тогда, когда это поддерживается и разрешено "
"вашим браузером и когда grocy обслуживается через безопасное (https://) "
"соединение."
msgid "Keep screen on" msgid "Keep screen on"
msgstr "" msgstr "Держать экран включенным"
msgid "Keep screen on while displaying a \"fullscreen-card\"" msgid "Keep screen on while displaying a \"fullscreen-card\""
msgstr "" msgstr "Держать экран включенным при отображении \"полноэкранной карточки\""
msgid "A purchased date is required" msgid "A purchased date is required"
msgstr "" msgstr "Укажите дату покупки"
msgid "" msgid ""
"When a product is selected, one unit (per serving in purchase quantity unit)" "When a product is selected, one unit (per serving in purchase quantity unit)"
@@ -1824,101 +1851,115 @@ msgid "Booking does not exist or was already undone"
msgstr "" msgstr ""
msgid "Are you sure to delete API key \"%s\"?" msgid "Are you sure to delete API key \"%s\"?"
msgstr "" msgstr "Вы уверены, что хотите удалить ключ API \"%s\"?"
msgid "Add note" msgid "Add note"
msgstr "" msgstr "Добавить заметку"
msgid "Add note on %s" msgid "Add note on %s"
msgstr "" msgstr ""
msgid "per day" msgid "per day"
msgstr "" msgstr "в день"
msgid "Compact view" msgid "Compact view"
msgstr "" msgstr "Компактный режим"
msgid "Normal view" msgid "Normal view"
msgstr "" msgstr "Нормальный режим"
msgid "Only undone items" msgid "Only undone items"
msgstr "" msgstr ""
msgid "Add product" msgid "Add product"
msgstr "" msgstr "Добавить продукт"
msgid "Add product on %s" msgid "Add product on %s"
msgstr "" msgstr ""
msgid "Consume all ingredients needed by this weeks recipes or products" msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr "" msgstr ""
"Употребить все ингредиенты, необходимые для рецептов или продуктов этой "
"недели"
msgid "Meal plan recipe" msgid "Meal plan recipe"
msgstr "" msgstr "Рецепт плана питания"
msgid "Meal plan note" msgid "Meal plan note"
msgstr "" msgstr "Заметка плана питания"
msgid "Meal plan product" msgid "Meal plan product"
msgstr "" msgstr "Продукт плана питания"
msgid "Scan mode" msgid "Scan mode"
msgstr "" msgstr "Режим сканирования"
msgid "on" msgid "on"
msgstr "" msgstr "вкл"
msgid "off" msgid "off"
msgstr "" msgstr "выкл"
msgid "" msgid ""
"Scan mode is on but not all required fields could be populated automatically" "Scan mode is on but not all required fields could be populated automatically"
msgstr "" msgstr ""
"Режим сканирования включен, но не все обязательные поля могут быть заполнены"
" автоматически"
msgid "Is freezer" msgid "Is freezer"
msgstr "" msgstr "В морозилке"
msgid "" msgid ""
"When moving products from/to a freezer location, the products best before " "When moving products from/to a freezer location, the products best before "
"date is automatically adjusted according to the product settings" "date is automatically adjusted according to the product settings"
msgstr "" msgstr ""
"При перемещении продуктов в морозильную камеру или из неё, срок годности "
"продукта будет автоматически обновлен в соответствии с настройками этого "
"продукта"
msgid "" msgid ""
"On moving this product to a freezer location (so when freezing it), the best" "On moving this product to a freezer location (so when freezing it), the best"
" before date will be replaced by today + this amount of days" " before date will be replaced by today + this amount of days"
msgstr "" msgstr ""
"При перемещении данного продукта в морозильную камеру (т. е. при его "
"заморозке), срок годности заменится по формуле: сегодня + это количество "
"дней"
msgid "Default best before days after freezing" msgid "Default best before days after freezing"
msgstr "" msgstr "Срок годности по умолчанию после заморозки"
msgid "" msgid ""
"On moving this product from a freezer location (so when thawing it), the " "On moving this product from a freezer location (so when thawing it), the "
"best before date will be replaced by today + this amount of days" "best before date will be replaced by today + this amount of days"
msgstr "" msgstr ""
"При перемещении данного продукта из морозильной камеры (т. е. при его "
"разморозке), срок годности заменится по формуле: сегодня + это количество "
"дней"
msgid "Default best before days after thawing" msgid "Default best before days after thawing"
msgstr "" msgstr "Срок годности по умолчанию после разморозки"
msgid "This cannot be the same as the \"From\" location" msgid "This cannot be the same as the \"From\" location"
msgstr "" msgstr "Это не может быть тем же местом хранения, что и \"из\""
msgid "Thawed" msgid "Thawed"
msgstr "" msgstr "Разморожен"
msgid "Frozen" msgid "Frozen"
msgstr "" msgstr "Заморожен"
msgid "Are you sure to delete userentity \"%s\"?" msgid "Are you sure to delete userentity \"%s\"?"
msgstr "" msgstr "Вы уверены, что нужно удалить пользовательскую запись \"%s\"?"
msgid "Shopping list settings" msgid "Shopping list settings"
msgstr "" msgstr "Настройки списка покупок"
msgid "Show a month-view calendar" msgid "Show a month-view calendar"
msgstr "" msgstr "Показать календарь на месяц"
msgid "Don't automatically switch to the compact view on mobile devices" msgid "Don't automatically switch to the compact view on mobile devices"
msgstr "" msgstr ""
"Не переключаться автоматически на компактный режим на мобильных устройствах"
msgid "Edit note on %s" msgid "Edit note on %s"
msgstr "" msgstr ""
@@ -1930,16 +1971,46 @@ msgid "Edit recipe on %s"
msgstr "" msgstr ""
msgid "Desired servings" msgid "Desired servings"
msgstr "" msgstr "Количество порций"
msgid "Base: %s" msgid "Base: %s"
msgstr "" msgstr "База: %s"
msgid "Recipes settings" msgid "Recipes settings"
msgstr "" msgstr "Настройки рецептов"
msgid "Recipe card" msgid "Recipe card"
msgstr "" msgstr "Карточка рецепта"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Сгруппировать ингредиенты по группам продуктов"
msgid "Unknown store"
msgstr "Неизвестный магазин"
msgid "Store"
msgstr "Магазин"
msgid "Transaction successfully undone"
msgstr "Транзакция успешно отменена"
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr "" msgstr ""

View File

@@ -365,3 +365,17 @@ msgstr ""
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "" msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr ""

View File

@@ -94,6 +94,9 @@ msgstr "Záznam stavu batérií"
msgid "Locations" msgid "Locations"
msgstr "Umiestnenia" msgstr "Umiestnenia"
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "Merné jednotky" msgstr "Merné jednotky"
@@ -230,6 +233,9 @@ msgstr "Faktor množstva jednotiek zásoby pri nákupe jedného kusu výrobku"
msgid "Create location" msgid "Create location"
msgstr "Vytvoriť umiestnenie" msgstr "Vytvoriť umiestnenie"
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "Vytvoriť mernú jednotku" msgstr "Vytvoriť mernú jednotku"
@@ -263,6 +269,9 @@ msgstr "Upraviť výrobok"
msgid "Edit location" msgid "Edit location"
msgstr "Upraviť umiestnenie" msgstr "Upraviť umiestnenie"
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "Zaznamenať údaje" msgstr "Zaznamenať údaje"
@@ -339,6 +348,9 @@ msgstr "Naozaj si prajete odstrániť výrobok \"%s\"?"
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "Naozaj si prajete odstrániť umiestnenie \"%s\"?" msgstr "Naozaj si prajete odstrániť umiestnenie \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "Spravovať API kľúče" msgstr "Spravovať API kľúče"
@@ -1127,6 +1139,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "Musíte vybrať umiestnenie" msgstr "Musíte vybrať umiestnenie"
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "Zoznam" msgstr "Zoznam"
@@ -1160,8 +1175,8 @@ msgstr "Systémové informácie"
msgid "Changelog" msgid "Changelog"
msgstr "Zoznam zmien" msgstr "Zoznam zmien"
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "bude vynásobený faktorom %1$s, aby bolo dosiahnuté %2$s" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
msgstr "Zadaný dátum je v minulosti, ste si istý?" msgstr "Zadaný dátum je v minulosti, ste si istý?"
@@ -1962,3 +1977,33 @@ msgstr "Karta s receptom"
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "Zoskupiť ingrediencie podľa skupiny výrobkov" msgstr "Zoskupiť ingrediencie podľa skupiny výrobkov"
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -79,6 +79,9 @@ msgstr ""
msgid "Locations" msgid "Locations"
msgstr "" msgstr ""
msgid "Stores"
msgstr ""
msgid "Quantity units" msgid "Quantity units"
msgstr "" msgstr ""
@@ -214,6 +217,9 @@ msgstr ""
msgid "Create location" msgid "Create location"
msgstr "" msgstr ""
msgid "Create store"
msgstr ""
msgid "Create quantity unit" msgid "Create quantity unit"
msgstr "" msgstr ""
@@ -247,6 +253,9 @@ msgstr ""
msgid "Edit location" msgid "Edit location"
msgstr "" msgstr ""
msgid "Edit store"
msgstr ""
msgid "Record data" msgid "Record data"
msgstr "" msgstr ""
@@ -319,6 +328,9 @@ msgstr ""
msgid "Are you sure to delete location \"%s\"?" msgid "Are you sure to delete location \"%s\"?"
msgstr "" msgstr ""
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys" msgid "Manage API keys"
msgstr "" msgstr ""
@@ -1022,6 +1034,9 @@ msgstr ""
msgid "You have to select a location" msgid "You have to select a location"
msgstr "" msgstr ""
msgid "You have to select a store"
msgstr ""
msgid "List" msgid "List"
msgstr "" msgstr ""
@@ -1055,7 +1070,7 @@ msgstr ""
msgid "Changelog" msgid "Changelog"
msgstr "" msgstr ""
msgid "will be multiplied a factor of %1$s to get %2$s" msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr "" msgstr ""
msgid "The given date is earlier than today, are you sure?" msgid "The given date is earlier than today, are you sure?"
@@ -1744,3 +1759,33 @@ msgstr ""
msgid "Group ingredients by their product group" msgid "Group ingredients by their product group"
msgstr "" msgstr ""
msgid "Unknown store"
msgstr ""
msgid "Store"
msgstr ""
msgid "Transaction successfully undone"
msgstr ""
msgid "Default store"
msgstr ""
msgid "Consume this stock entry"
msgstr ""
msgid "Mark this stock entry as open"
msgstr ""
msgid "Mark this item as done"
msgstr ""
msgid "Edit this item"
msgstr ""
msgid "Delete this item"
msgstr ""
msgid "Show an icon if the product is already on the shopping list"
msgstr ""

View File

@@ -1,6 +1,5 @@
# Translators: # Translators:
# Benjamin Tayehanpour <transifex@benjamin.tayehanpour.se>, 2019 # Peter Wickenberg <peter@wickenberg.nu>, 2020
# Peter Wickenberg <peter@wickenberg.nu>, 2019
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -8,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n" "PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Peter Wickenberg <peter@wickenberg.nu>, 2019\n" "Last-Translator: Peter Wickenberg <peter@wickenberg.nu>, 2020\n"
"Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n" "Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,13 +17,13 @@ msgstr ""
"X-Domain: grocy/chore_assignment_types\n" "X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment" msgid "no-assignment"
msgstr "Ingen uppgift" msgstr "ingen-tilldelning"
msgid "who-least-did-first" msgid "who-least-did-first"
msgstr "Den som gjorde minst går först" msgstr "den-som-gjorde-minst-går-först"
msgid "random" msgid "random"
msgstr "Slumpmässig" msgstr "slumpmässig"
msgid "in-alphabetical-order" msgid "in-alphabetical-order"
msgstr "I alfabetisk ordning" msgstr "i-alfabetisk-ordning"

View File

@@ -1,8 +1,9 @@
# Translators: # Translators:
# Mathias Fröjd <info@mcfrojd.com>, 2019 # Mathias Fröjd <info@mcfrojd.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fredrik Hendeberg <fredrik@hendeberg.com>, 2019 # Fredrik Hendeberg <fredrik@hendeberg.com>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2019 # Peter Wickenberg <peter@wickenberg.nu>, 2019
# Sebastian Backman <valtkor@hotmail.com>, 2020
# Per Bäckman <fotodille@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n" "PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Peter Wickenberg <peter@wickenberg.nu>, 2019\n" "Last-Translator: Per Bäckman <fotodille@gmail.com>, 2020\n"
"Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n" "Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +33,7 @@ msgid "Candy cupboard"
msgstr "Godisskåp" msgstr "Godisskåp"
msgid "Tinned food cupboard" msgid "Tinned food cupboard"
msgstr "Konservburk för konserverad mat" msgstr "Konservskafferi"
msgid "Fridge" msgid "Fridge"
msgstr "Kylskåp" msgstr "Kylskåp"
@@ -40,32 +41,32 @@ msgstr "Kylskåp"
msgid "Piece" msgid "Piece"
msgid_plural "Pieces" msgid_plural "Pieces"
msgstr[0] "Bit" msgstr[0] "Bit"
msgstr[1] "Bitar" msgstr[1] "bitar"
msgid "Pack" msgid "Pack"
msgid_plural "Packs" msgid_plural "Packs"
msgstr[0] "Förpackning" msgstr[0] "Förpackning"
msgstr[1] "Förpackningar" msgstr[1] "förpackningar"
msgid "Glass" msgid "Glass"
msgid_plural "Glasses" msgid_plural "Glasses"
msgstr[0] "Glas" msgstr[0] "Glas"
msgstr[1] "Glas" msgstr[1] "glas"
msgid "Tin" msgid "Tin"
msgid_plural "Tins" msgid_plural "Tins"
msgstr[0] "Burk" msgstr[0] "Burk"
msgstr[1] "Burkar" msgstr[1] "konservburk"
msgid "Can" msgid "Can"
msgid_plural "Cans" msgid_plural "Cans"
msgstr[0] "Burk" msgstr[0] "Burk"
msgstr[1] "Burkar" msgstr[1] "burkar"
msgid "Bunch" msgid "Bunch"
msgid_plural "Bunches" msgid_plural "Bunches"
msgstr[0] "Knippa" msgstr[0] "Knippa"
msgstr[1] "Knippor" msgstr[1] "knippor"
msgid "Gummy bears" msgid "Gummy bears"
msgstr "Gummibjörnar" msgstr "Gummibjörnar"
@@ -80,10 +81,10 @@ msgid "Noodles"
msgstr "Spaghetti" msgstr "Spaghetti"
msgid "Pickles" msgid "Pickles"
msgstr "Ättiksgurka" msgstr "Inlagda grönsaker"
msgid "Gulash soup" msgid "Gulash soup"
msgstr "Gulashoppa" msgstr "Gulashsoppa"
msgid "Yogurt" msgid "Yogurt"
msgstr "Yoghurt" msgstr "Yoghurt"
@@ -134,7 +135,7 @@ msgid "Pizza dough"
msgstr "Pizzadeg" msgstr "Pizzadeg"
msgid "Sieved tomatoes" msgid "Sieved tomatoes"
msgstr "Siktade tomater" msgstr "Passerade tomater"
msgid "Salami" msgid "Salami"
msgstr "Salami" msgstr "Salami"
@@ -155,16 +156,16 @@ msgid "Sandwiches"
msgstr "Smörgåsar" msgstr "Smörgåsar"
msgid "English" msgid "English"
msgstr "Engelsk" msgstr "Engelska"
msgid "German" msgid "German"
msgstr "Tysk" msgstr "Tyska"
msgid "Italian" msgid "Italian"
msgstr "Italienska" msgstr "Italienska"
msgid "This is the note content of the recipe ingredient" msgid "This is the note content of the recipe ingredient"
msgstr "Detta är anteckningsinnehållet i receptens ingrediens" msgstr "Detta är anteckningen för receptets ingrediens"
msgid "Demo User" msgid "Demo User"
msgstr "Demo-användare" msgstr "Demo-användare"
@@ -172,13 +173,13 @@ msgstr "Demo-användare"
msgid "Gram" msgid "Gram"
msgid_plural "Grams" msgid_plural "Grams"
msgstr[0] "Gram" msgstr[0] "Gram"
msgstr[1] "Gram" msgstr[1] "gram"
msgid "Flour" msgid "Flour"
msgstr "Mjöl" msgstr "Mjöl"
msgid "Pancakes" msgid "Pancakes"
msgstr "pannkakor" msgstr "Pannkakor"
msgid "Sugar" msgid "Sugar"
msgstr "Socker" msgstr "Socker"
@@ -196,7 +197,7 @@ msgid "Repair the garage door"
msgstr "Reparera garagedörren" msgstr "Reparera garagedörren"
msgid "Fork and improve grocy" msgid "Fork and improve grocy"
msgstr "Gaffel och förbättra grocy" msgstr "Starta ny gren och förbättra grocy"
msgid "Find a solution for what to do when I forget the door keys" msgid "Find a solution for what to do when I forget the door keys"
msgstr "Hitta en lösning för vad man ska göra när jag glömmer dörrnycklarna" msgstr "Hitta en lösning för vad man ska göra när jag glömmer dörrnycklarna"
@@ -226,16 +227,16 @@ msgid "Dishwasher"
msgstr "Diskmaskin" msgstr "Diskmaskin"
msgid "Liter" msgid "Liter"
msgstr "Liter" msgstr "liter"
msgid "Liters" msgid "Liters"
msgstr "Liter" msgstr "liter"
msgid "Bottle" msgid "Bottle"
msgstr "Flaska" msgstr "flaska"
msgid "Bottles" msgid "Bottles"
msgstr "Flaskor" msgstr "flaskor"
msgid "Milk" msgid "Milk"
msgstr "Mjölk" msgstr "Mjölk"
@@ -244,10 +245,10 @@ msgid "Chocolate sauce"
msgstr "Chokladsås" msgstr "Chokladsås"
msgid "Milliliters" msgid "Milliliters"
msgstr "Milliliter" msgstr "ml"
msgid "Milliliter" msgid "Milliliter"
msgstr "Milliliter" msgstr "ml"
msgid "Bottom" msgid "Bottom"
msgstr "Botten" msgstr "Botten"
@@ -291,7 +292,7 @@ msgstr "Mörk chocklad"
msgid "Slice" msgid "Slice"
msgid_plural "Slices" msgid_plural "Slices"
msgstr[0] "Skiva" msgstr[0] "Skiva"
msgstr[1] "Skivor" msgstr[1] "skivor"
msgid "Example userentity" msgid "Example userentity"
msgstr "Exempel användarenhet" msgstr "Exempel användarenhet"
@@ -336,19 +337,33 @@ msgid "Portuguese (Brazil)"
msgstr "Portugisiska (Brasilien)" msgstr "Portugisiska (Brasilien)"
msgid "This is a note" msgid "This is a note"
msgstr "" msgstr "Detta är en anteckning"
msgid "Freezer" msgid "Freezer"
msgstr "" msgstr "Frys"
msgid "Hungarian" msgid "Hungarian"
msgstr "" msgstr "Ungerska"
msgid "Slovak" msgid "Slovak"
msgstr "" msgstr "Slovakiska"
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Tjeckiska"
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"
msgstr "Portugisiska (Portugal)"
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgid "Japanese"
msgstr ""
msgid "Chinese (Taiwan)"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,7 @@
# Fredrik Hendeberg <fredrik@hendeberg.com>, 2019 # Fredrik Hendeberg <fredrik@hendeberg.com>, 2019
# Jesper Sandström <jesper@languageconsulting.se>, 2019 # Jesper Sandström <jesper@languageconsulting.se>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2019 # Peter Wickenberg <peter@wickenberg.nu>, 2019
# Per Bäckman <fotodille@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n" "PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Peter Wickenberg <peter@wickenberg.nu>, 2019\n" "Last-Translator: Per Bäckman <fotodille@gmail.com>, 2020\n"
"Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n" "Language-Team: Swedish (Sweden) (https://www.transifex.com/grocy/teams/93189/sv_SE/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,7 +45,7 @@ msgid "preset-list"
msgstr "mall-lista" msgstr "mall-lista"
msgid "preset-checklist" msgid "preset-checklist"
msgstr "förchecklista" msgstr "mallchecklista"
msgid "link" msgid "link"
msgstr "länk" msgstr "länk"

View File

@@ -0,0 +1,29 @@
# Translators:
# jd615645 <jd615645@gmail.com>, 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: jd615645 <jd615645@gmail.com>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\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,35 @@
# Translators:
# jd615645 <jd615645@gmail.com>, 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: jd615645 <jd615645@gmail.com>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "手動"
msgid "dynamic-regular"
msgstr "動態有序"
msgid "daily"
msgstr "每日"
msgid "weekly"
msgstr "每周"
msgid "monthly"
msgstr "每日"
msgid "yearly"
msgstr "每天"

View File

@@ -0,0 +1,44 @@
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 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: Bernd Bestel <bernd@berrnd.de>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/component_translations\n"
msgid "timeago_locale"
msgstr "zh-TW"
msgid "timeago_nan"
msgstr "NaN年"
msgid "moment_locale"
msgstr "zh-tw"
msgid "datatables_localization"
msgstr ""
"{\"sProcessing\":\"处理中...\",\"sLengthMenu\":\"显示 _MENU_ "
"项结果\",\"sZeroRecords\":\"没有匹配结果\",\"sInfo\":\"显示第 _START_ 至 _END_ 项结果,共 "
"_TOTAL_ 项\",\"sInfoEmpty\":\"显示第 0 至 0 项结果,共 0 项\",\"sInfoFiltered\":\"(由 "
"_MAX_ "
"项结果过滤)\",\"sInfoPostFix\":\"\",\"sSearch\":\"搜索:\",\"sUrl\":\"\",\"sEmptyTable\":\"表中数据为空\",\"sLoadingRecords\":\"载入中...\",\"sInfoThousands\":\",\",\"oPaginate\":{\"sFirst\":\"首页\",\"sPrevious\":\"上页\",\"sNext\":\"下页\",\"sLast\":\"末页\"},\"oAria\":{\"sSortAscending\":\":"
" 以升序排列此列\",\"sSortDescending\":\": 以降序排列此列\"}}"
msgid "summernote_locale"
msgstr "zh-TW"
msgid "fullcalendar_locale"
msgstr "zh-tw"
msgid "bootstrap-select_locale"
msgstr "zh_TW"

View File

@@ -0,0 +1,358 @@
# Translators:
# jd615645 <jd615645@gmail.com>, 2020
# Bernd Bestel <bernd@berrnd.de>, 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: Bernd Bestel <bernd@berrnd.de>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\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] "件"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] "包"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] "杯"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] "罐"
msgid "Can"
msgid_plural "Cans"
msgstr[0] "罐"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] "綑"
msgid "Gummy bears"
msgstr "小熊軟糖"
msgid "Crisps"
msgstr "洋芋片"
msgid "Eggs"
msgstr "雞蛋"
msgid "Noodles"
msgstr "麵條"
msgid "Pickles"
msgstr "醃黃瓜"
msgid "Gulash soup"
msgstr "匈牙利湯"
msgid "Yogurt"
msgstr "優格"
msgid "Cheese"
msgstr "起司"
msgid "Cold cuts"
msgstr "午餐肉"
msgid "Paprika"
msgstr "辣椒"
msgid "Cucumber"
msgstr "黃瓜"
msgid "Radish"
msgstr "蘿蔔"
msgid "Tomato"
msgstr "番茄"
msgid "Changed towels in the bathroom"
msgstr "浴室毛巾"
msgid "Cleaned the kitchen floor"
msgstr "清理廚房地板"
msgid "Warranty ends"
msgstr "保存期限結束"
msgid "TV remote control"
msgstr "電視遙控器"
msgid "Alarm clock"
msgstr "鬧鐘"
msgid "Heat remote control"
msgstr "加熱器遙控器"
msgid "Lawn mowed in the garden"
msgstr "清理花園草坪"
msgid "Some good snacks"
msgstr "美味零食"
msgid "Pizza dough"
msgstr "披薩麵團"
msgid "Sieved tomatoes"
msgstr "精選番茄"
msgid "Salami"
msgstr "義大利香腸"
msgid "Toast"
msgstr "吐司"
msgid "Minced meat"
msgstr "絞肉"
msgid "Pizza"
msgstr "披薩"
msgid "Spaghetti bolognese"
msgstr "番茄肉醬意大利麵"
msgid "Sandwiches"
msgstr "三明治"
msgid "English"
msgstr "英文"
msgid "German"
msgstr "德文"
msgid "Italian"
msgstr "義大利文"
msgid "This is the note content of the recipe ingredient"
msgstr "這是配方表中的標示內容"
msgid "Demo User"
msgstr "測試用戶"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] "克"
msgid "Flour"
msgstr "麵粉"
msgid "Pancakes"
msgstr "烤餅"
msgid "Sugar"
msgstr "糖"
msgid "Home"
msgstr "首頁"
msgid "Life"
msgstr "生命"
msgid "Projects"
msgstr "專案"
msgid "Repair the garage door"
msgstr "修理車庫門"
msgid "Fork and improve grocy"
msgstr "建立 Fork 並且改善 grocy"
msgid "Find a solution for what to do when I forget the door keys"
msgstr "當我忘記鑰匙時去想辦法解決"
msgid "Sweets"
msgstr "甜食"
msgid "Bakery products"
msgstr "烘焙用品"
msgid "Tinned food"
msgstr "罐裝食品"
msgid "Butchery products"
msgstr "肉類食品"
msgid "Vegetables/Fruits"
msgstr "蔬果"
msgid "Refrigerated products"
msgstr "冷藏食品"
msgid "Coffee machine"
msgstr "咖啡機"
msgid "Dishwasher"
msgstr "洗碗機"
msgid "Liter"
msgstr "公升"
msgid "Liters"
msgstr "公升"
msgid "Bottle"
msgstr "瓶"
msgid "Bottles"
msgstr "瓶"
msgid "Milk"
msgstr "牛奶"
msgid "Chocolate sauce"
msgstr "巧克力醬"
msgid "Milliliters"
msgstr "毫升"
msgid "Milliliter"
msgstr "毫升"
msgid "Bottom"
msgstr "底部"
msgid "Topping"
msgstr "配料"
msgid "French"
msgstr "法文"
msgid "Turkish"
msgstr "土耳其文"
msgid "Spanish"
msgstr "西班牙文"
msgid "Russian"
msgstr "俄語"
msgid "The thing which happens on the 5th of every month"
msgstr "每月5號發生的事情"
msgid "The thing which happens daily"
msgstr "每天發生的事情"
msgid "The thing which happens on Mondays and Wednesdays"
msgstr "每周一與每周三會發生的事情"
msgid "Swedish"
msgstr "瑞典文"
msgid "Polish"
msgstr "波蘭文"
msgid "Milk Chocolate"
msgstr "牛奶巧克力"
msgid "Dark Chocolate"
msgstr "黑巧克力"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "切片"
msgid "Example userentity"
msgstr "Example userentity"
msgid "This is an example user entity..."
msgstr "這是一個 user entity..."
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 ""

View File

@@ -0,0 +1,44 @@
# Translators:
# jd615645 <jd615645@gmail.com>, 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: jd615645 <jd615645@gmail.com>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\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,47 @@
# Translators:
# jd615645 <jd615645@gmail.com>, 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:43+0000\n"
"Last-Translator: jd615645 <jd615645@gmail.com>, 2020\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/grocy/teams/93189/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr "單行"
msgid "text-multi-line"
msgstr "多行"
msgid "number-integral"
msgstr "數量(整數)"
msgid "number-decimal"
msgstr "數量(有小數)"
msgid "date"
msgstr "日期"
msgid "datetime"
msgstr "日期與時間"
msgid "checkbox"
msgstr "多選"
msgid "preset-list"
msgstr "巢狀列表"
msgid "preset-checklist"
msgstr "巢狀勾選"
msgid "link"
msgstr "連結"

View File

@@ -0,0 +1,30 @@
<?php
namespace Grocy\Middleware;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Routing\RouteContext;
class CorsMiddleware extends BaseMiddleware
{
public function __invoke(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
$routeContext = RouteContext::fromRequest($request);
$routingResults = $routeContext->getRoutingResults();
$methods = $routingResults->getAllowedMethods();
//$requestHeaders = $request->getHeaderLine('Access-Control-Request-Headers');
$origin = $request->getHeaderLine('Origin');
$response = $handler->handle($request);
$response = $response->withHeader('Access-Control-Allow-Origin', $origin);
$response = $response->withHeader('Access-Control-Allow-Methods', implode(',', $methods));
$response = $response->withHeader('Access-Control-Allow-Headers', 'Content-Type,GROCY-API-KEY');
return $response;
}
}

30
migrations/0099.sql Normal file
View File

@@ -0,0 +1,30 @@
CREATE TABLE shopping_locations (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT NOT NULL UNIQUE,
description TEXT,
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
);
ALTER TABLE stock_log
ADD shopping_location_id INTEGER;
ALTER TABLE stock
ADD shopping_location_id INTEGER;
ALTER TABLE products
ADD shopping_location_id INTEGER;
DROP VIEW stock_current_locations;
CREATE VIEW stock_current_locations
AS
SELECT
1 AS id, -- Dummy, LessQL needs an id column
s.product_id,
SUM(s.amount) as amount,
s.location_id AS location_id,
l.name AS location_name,
l.is_freezer AS location_is_freezer
FROM stock s
JOIN locations l
ON s.location_id = l.id
GROUP BY s.product_id, s.location_id, l.name;

42
migrations/0100.sql Normal file
View File

@@ -0,0 +1,42 @@
DROP VIEW stock_current;
CREATE VIEW stock_current
AS
SELECT
pr.parent_product_id AS product_id,
IFNULL((SELECT SUM(amount) FROM stock WHERE product_id = pr.parent_product_id), 0) AS amount,
SUM(s.amount) * IFNULL(qucr.factor, 1) AS amount_aggregated,
MIN(s.best_before_date) AS best_before_date,
IFNULL((SELECT SUM(amount) FROM stock WHERE product_id = pr.parent_product_id AND open = 1), 0) AS amount_opened,
IFNULL((SELECT SUM(amount) FROM stock WHERE product_id IN (SELECT sub_product_id FROM products_resolved WHERE parent_product_id = pr.parent_product_id) AND open = 1), 0) * IFNULL(qucr.factor, 1) AS amount_opened_aggregated,
CASE WHEN p_sub.parent_product_id IS NOT NULL THEN 1 ELSE 0 END AS is_aggregated_amount
FROM products_resolved pr
JOIN stock s
ON pr.sub_product_id = s.product_id
JOIN products p_parent
ON pr.parent_product_id = p_parent.id
JOIN products p_sub
ON pr.sub_product_id = p_sub.id
LEFT JOIN quantity_unit_conversions_resolved qucr
ON pr.sub_product_id = qucr.product_id
AND p_sub.qu_id_stock = qucr.from_qu_id
AND p_parent.qu_id_stock = qucr.to_qu_id
GROUP BY pr.parent_product_id
HAVING SUM(s.amount) > 0
UNION
-- This is the same as above but sub products not rolled up (no QU conversion and column is_aggregated_amount = 0 here)
SELECT
pr.sub_product_id AS product_id,
SUM(s.amount) AS amount,
SUM(s.amount) AS amount_aggregated,
MIN(s.best_before_date) AS best_before_date,
IFNULL((SELECT SUM(amount) FROM stock WHERE product_id = s.product_id AND open = 1), 0) AS amount_opened,
IFNULL((SELECT SUM(amount) FROM stock WHERE product_id = s.product_id AND open = 1), 0) AS amount_opened_aggregated,
0 AS is_aggregated_amount
FROM products_resolved pr
JOIN stock s
ON pr.sub_product_id = s.product_id
WHERE pr.parent_product_id != pr.sub_product_id
GROUP BY pr.sub_product_id
HAVING SUM(s.amount) > 0;

45
migrations/0101.sql Normal file
View File

@@ -0,0 +1,45 @@
DROP VIEW chores_current;
CREATE VIEW chores_current
AS
SELECT
x.chore_id,
x.last_tracked_time,
CASE WHEN x.rollover = 1 AND DATETIME('now', 'localtime') > x.next_estimated_execution_time THEN
DATETIME(STRFTIME('%Y-%m-%d', DATETIME('now', 'localtime')) || ' ' || STRFTIME('%H:%M:%S', x.next_estimated_execution_time))
ELSE
x.next_estimated_execution_time
END AS next_estimated_execution_time,
x.track_date_only,
x.next_execution_assigned_to_user_id
FROM (
SELECT
h.id AS chore_id,
MAX(l.tracked_time) AS last_tracked_time,
CASE h.period_type
WHEN 'manually' THEN '2999-12-31 23:59:59'
WHEN 'dynamic-regular' THEN DATETIME(MAX(l.tracked_time), '+' || CAST(h.period_days AS TEXT) || ' day')
WHEN 'daily' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' day')
WHEN 'weekly' THEN
CASE
WHEN period_config LIKE '%saturday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 6')
WHEN period_config LIKE '%friday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 5')
WHEN period_config LIKE '%thursday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 4')
WHEN period_config LIKE '%wednesday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 3')
WHEN period_config LIKE '%tuesday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 2')
WHEN period_config LIKE '%monday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 1')
WHEN period_config LIKE '%sunday%' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 0')
END
WHEN 'monthly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' month', 'start of month', '+' || CAST(h.period_days - 1 AS TEXT) || ' day')
WHEN 'yearly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' years')
END AS next_estimated_execution_time,
h.track_date_only,
h.rollover,
h.next_execution_assigned_to_user_id
FROM chores h
LEFT JOIN chores_log l
ON h.id = l.chore_id
AND l.undone = 0
GROUP BY h.id, h.period_days
) x;

View File

@@ -3,7 +3,8 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@danielfarrell/bootstrap-combobox": "https://github.com/berrnd/bootstrap-combobox.git#master", "@danielfarrell/bootstrap-combobox": "https://github.com/berrnd/bootstrap-combobox.git#master",
"@fortawesome/fontawesome-free": "^5.12.1", "@ericblade/quagga2": "^0.0.20",
"@fortawesome/fontawesome-free": "^5.13.0",
"TagManager": "https://github.com/max-favilli/tagmanager.git#master", "TagManager": "https://github.com/max-favilli/tagmanager.git#master",
"animate.css": "^3.7.2", "animate.css": "^3.7.2",
"bootbox": "^5.3.2", "bootbox": "^5.3.2",
@@ -14,6 +15,7 @@
"datatables.net-bs4": "^1.10.19", "datatables.net-bs4": "^1.10.19",
"datatables.net-colreorder": "^1.5.1", "datatables.net-colreorder": "^1.5.1",
"datatables.net-colreorder-bs4": "^1.5.1", "datatables.net-colreorder-bs4": "^1.5.1",
"datatables.net-plugins": "^1.10.20",
"datatables.net-responsive": "^2.2.3", "datatables.net-responsive": "^2.2.3",
"datatables.net-responsive-bs4": "^2.2.3", "datatables.net-responsive-bs4": "^2.2.3",
"datatables.net-rowgroup": "^1.1.0", "datatables.net-rowgroup": "^1.1.0",
@@ -22,15 +24,14 @@
"datatables.net-select-bs4": "^1.3.0", "datatables.net-select-bs4": "^1.3.0",
"fullcalendar": "^3.10.1", "fullcalendar": "^3.10.1",
"gettext-translator": "2.1.0", "gettext-translator": "2.1.0",
"jquery": "^3.4.1", "jquery": "3.4.1",
"jquery-lazy": "^1.7.10", "jquery-lazy": "^1.7.10",
"jquery-serializejson": "^2.9.0", "jquery-serializejson": "^2.9.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"nosleep.js": "^0.9.0", "nosleep.js": "^0.9.0",
"quagga": "^0.12.1",
"sprintf-js": "^1.1.2", "sprintf-js": "^1.1.2",
"startbootstrap-sb-admin": "4.0.0", "startbootstrap-sb-admin": "4.0.0",
"summernote": "^0.8.12", "summernote": "^0.8.16",
"swagger-ui-dist": "^3.23.10", "swagger-ui-dist": "^3.23.10",
"tempusdominus-bootstrap-4": "https://github.com/berrnd/tempusdominus-bootstrap-4.git#master", "tempusdominus-bootstrap-4": "https://github.com/berrnd/tempusdominus-bootstrap-4.git#master",
"timeago": "^1.6.7", "timeago": "^1.6.7",

View File

@@ -225,6 +225,55 @@ input::-webkit-inner-spin-button {
display: none; display: none;
} }
.table-inline-menu.dropdown-menu {
padding-left: 12px;
padding-right: 12px;
width: 96vw; /* Set width of popup menu to screen size */
}
/* Set width of popup menu to fixed value on larger devices */
@media (min-width: 400px) {
.table-inline-menu.dropdown-menu {
width: 400px;
}
}
.table-inline-menu .dropdown-item {
width: auto;
text-indent: -24px;
}
.table-inline-menu .dropdown-item .dropdown-item-icon {
min-width: 24px;
padding-left:20px;
text-align: center;
display: inline;
}
.table-inline-menu .dropdown-item .dropdown-item-text {
display: inline;
padding: 0;
word-wrap: break-word;
white-space: pre-wrap;
color: inherit;
}
/* Barcodescanner Quagga */
#barcodescanner-container {
max-height: 90vw;
}
#livestream-container {
max-height: 100%;
}
#barcodescanner-livestream video {
width: 100%;
}
#barcodescanner-livestream canvas {
width: 100%;
}
/* Third party component customizations - Bootstrap */ /* Third party component customizations - Bootstrap */
/* Hide the form validation feedback icons introduced in Bootstrap 4.2.0 - a colored border is enough */ /* Hide the form validation feedback icons introduced in Bootstrap 4.2.0 - a colored border is enough */
@@ -259,6 +308,11 @@ input::-webkit-inner-spin-button {
flex-shrink: 0; flex-shrink: 0;
} }
/* Always show modals over everything else */
.modal {
z-index: 99999;
}
/* Third party component customizations - DataTables */ /* Third party component customizations - DataTables */
.dataTable td { .dataTable td {
vertical-align: middle !important; vertical-align: middle !important;

View File

@@ -1,3 +1,14 @@
<?php <?php
require_once __DIR__ . '/../helpers/PrerequisiteChecker.php';
try
{
(new PrerequisiteChecker)->checkRequirements();
}
catch (ERequirementNotMet $ex)
{
die('Unable to run grocy: ' . $ex->getMessage());
}
require_once __DIR__ . '/../app.php'; require_once __DIR__ . '/../app.php';

View File

@@ -85,7 +85,12 @@ function OnBarcodeScanned(barcode)
}, 200); }, 200);
} }
$(document).on("Grocy.BarcodeScanned", function(e, barcode) $(document).on("Grocy.BarcodeScanned", function(e, barcode, target)
{ {
if (target !== "#scanned_barcod")
{
return;
}
OnBarcodeScanned(barcode); OnBarcodeScanned(barcode);
}); });

View File

@@ -1,5 +1,58 @@
Grocy.Components.BarcodeScanner = { }; Grocy.Components.BarcodeScanner = { };
Grocy.Components.BarcodeScanner.LiveVideoSizeAdjusted = false;
Grocy.Components.BarcodeScanner.CheckCapabilities = async function()
{
var track = Quagga.CameraAccess.getActiveTrack();
var capabilities = {};
if (typeof track.getCapabilities === 'function') {
capabilities = track.getCapabilities();
}
// If there is more than 1 camera, show the camera selection
var cameras = await Quagga.CameraAccess.enumerateVideoDevices();
var cameraSelect = document.querySelector('.cameraSelect-wrapper');
if (cameraSelect) {
cameraSelect.style.display = cameras.length > 1 ? 'inline-block' : 'none';
}
// Check if the camera is capable to turn on a torch.
var canTorch = typeof capabilities.torch === 'boolean' && capabilities.torch
// Remove the torch button, if either the device can not torch or AutoTorchOn is set.
var node = document.querySelector('.torch');
if (node) {
node.style.display = canTorch && !Grocy.FeatureFlags.GROCY_FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA ? 'inline-block' : 'none';
}
// If AutoTorchOn is set, turn on the torch.
if (canTorch && Grocy.FeatureFlags.GROCY_FEATURE_FLAG_AUTO_TORCH_ON_WITH_CAMERA) {
Grocy.Components.BarcodeScanner.TorchOn(track);
}
// Reduce the height of the video, if it's heigher than then the viewport
if (!Grocy.Components.BarcodeScanner.LiveVideoSizeAdjusted)
{
var bc = document.getElementById('barcodescanner-container');
if (bc)
{
var bcAspectRatio = bc.offsetWidth / bc.offsetHeight;
var settings = track.getSettings();
if (bcAspectRatio > settings.aspectRatio)
{
var v = document.querySelector('#barcodescanner-livestream video')
if (v)
{
var c = document.querySelector('#barcodescanner-livestream canvas')
var newWidth = v.clientWidth / bcAspectRatio * settings.aspectRatio + 'px';
v.style.width = newWidth;
c.style.width = newWidth;
}
}
Grocy.Components.BarcodeScanner.LiveVideoSizeAdjusted = true;
}
}
}
Grocy.Components.BarcodeScanner.StartScanning = function() Grocy.Components.BarcodeScanner.StartScanning = function()
{ {
Grocy.Components.BarcodeScanner.DecodedCodesCount = 0; Grocy.Components.BarcodeScanner.DecodedCodesCount = 0;
@@ -11,9 +64,8 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
type: "LiveStream", type: "LiveStream",
target: document.querySelector("#barcodescanner-livestream"), target: document.querySelector("#barcodescanner-livestream"),
constraints: { constraints: {
width: 436, facingMode: "environment",
height: 327, ...(window.localStorage.getItem('cameraId') && {deviceId : window.localStorage.getItem('cameraId')}) // If preferred cameraId is set, request to use that specific camera
facingMode: "environment"
} }
}, },
locator: { locator: {
@@ -34,7 +86,7 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
} }
} }
}, },
numOfWorkers: 2, numOfWorkers: Grocy.UserSettings.quagga2_numofworkers,
frequency: 10, frequency: 10,
decoder: { decoder: {
readers: [ readers: [
@@ -64,12 +116,16 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
{ {
Grocy.FrontendHelpers.ShowGenericError("Error while initializing the barcode scanning library", error.message); Grocy.FrontendHelpers.ShowGenericError("Error while initializing the barcode scanning library", error.message);
toastr.info(__t("Camera access is only possible when supported and allowed by your browser and when grocy is served via a secure (https://) connection")); toastr.info(__t("Camera access is only possible when supported and allowed by your browser and when grocy is served via a secure (https://) connection"));
window.localStorage.removeItem("cameraId");
setTimeout(function() setTimeout(function()
{ {
bootbox.hideAll(); bootbox.hideAll();
}, 500); }, 500);
return; return;
} }
Grocy.Components.BarcodeScanner.CheckCapabilities();
Quagga.start(); Quagga.start();
}); });
} }
@@ -84,6 +140,19 @@ Grocy.Components.BarcodeScanner.StopScanning = function()
bootbox.hideAll(); bootbox.hideAll();
} }
Grocy.Components.BarcodeScanner.TorchOn = function(track)
{
if (track) {
track.applyConstraints({
advanced: [
{
torch: true
}
]
});
}
}
Quagga.onDetected(function(result) Quagga.onDetected(function(result)
{ {
$.each(result.codeResult.decodedCodes, function(id, error) $.each(result.codeResult.decodedCodes, function(id, error)
@@ -98,7 +167,7 @@ Quagga.onDetected(function(result)
if (Grocy.Components.BarcodeScanner.DecodedCodesErrorCount / Grocy.Components.BarcodeScanner.DecodedCodesCount < 0.15) if (Grocy.Components.BarcodeScanner.DecodedCodesErrorCount / Grocy.Components.BarcodeScanner.DecodedCodesCount < 0.15)
{ {
Grocy.Components.BarcodeScanner.StopScanning(); Grocy.Components.BarcodeScanner.StopScanning();
$(document).trigger("Grocy.BarcodeScanned", [result.codeResult.code]); $(document).trigger("Grocy.BarcodeScanned", [result.codeResult.code, Grocy.Components.BarcodeScanner.CurrentTarget]);
} }
}); });
@@ -133,7 +202,7 @@ Quagga.onProcessed(function(result)
} }
}); });
$(document).on("click", "#barcodescanner-start-button", function(e) $(document).on("click", "#barcodescanner-start-button", async function(e)
{ {
e.preventDefault(); e.preventDefault();
var inputElement = $(e.currentTarget).prev(); var inputElement = $(e.currentTarget).prev();
@@ -144,7 +213,9 @@ $(document).on("click", "#barcodescanner-start-button", function(e)
return; return;
} }
bootbox.dialog({ Grocy.Components.BarcodeScanner.CurrentTarget = inputElement.attr("data-target");
var dialog = bootbox.dialog({
message: '<div id="barcodescanner-container" class="col"><div id="barcodescanner-livestream"></div></div>', message: '<div id="barcodescanner-container" class="col"><div id="barcodescanner-livestream"></div></div>',
title: __t('Scan a barcode'), title: __t('Scan a barcode'),
onEscape: function() onEscape: function()
@@ -157,10 +228,10 @@ $(document).on("click", "#barcodescanner-start-button", function(e)
buttons: { buttons: {
torch: { torch: {
label: '<i class="far fa-lightbulb"></i>', label: '<i class="far fa-lightbulb"></i>',
className: 'btn-warning responsive-button', className: 'btn-warning responsive-button torch',
callback: function() callback: function()
{ {
Quagga.CameraAccess.getActiveTrack().applyConstraints({ advanced: [{ torch: true }] }); Grocy.Components.BarcodeScanner.TorchOn(Quagga.CameraAccess.getActiveTrack());
return false; return false;
} }
}, },
@@ -174,6 +245,28 @@ $(document).on("click", "#barcodescanner-start-button", function(e)
} }
} }
}); });
// Add camera select to existing dialog
dialog.find('.bootbox-body').append('<div class="form-group py-0 my-1 cameraSelect-wrapper"><select class="form-control cameraSelect"><select class="form-control cameraSelect" style="display: none"></select></div>');
var cameraSelect = document.querySelector('.cameraSelect');
var cameras = await Quagga.CameraAccess.enumerateVideoDevices();
cameras.forEach(camera => {
var option = document.createElement("option");
option.text = camera.label ? camera.label : camera.deviceId; // Use camera label if it exists, else show device id
option.value = camera.deviceId;
cameraSelect.appendChild(option);
});
// Set initial value to preferred camera if one exists - and if not, start out empty
cameraSelect.value = window.localStorage.getItem('cameraId');
cameraSelect.onchange = function(){
window.localStorage.setItem('cameraId', cameraSelect.value);
Quagga.stop();
Grocy.Components.BarcodeScanner.StartScanning();
};
Grocy.Components.BarcodeScanner.StartScanning(); Grocy.Components.BarcodeScanner.StartScanning();
}); });
@@ -183,11 +276,11 @@ setTimeout(function()
{ {
if ($(this).hasAttr("disabled")) if ($(this).hasAttr("disabled"))
{ {
$(this).after('<a id="barcodescanner-start-button" class="btn btn-sm btn-primary text-white disabled"><i class="fas fa-camera"></i></a>'); $(this).after('<a id="barcodescanner-start-button" class="btn btn-sm btn-primary text-white disabled" data-target="' + $(this).attr("data-target") + '"><i class="fas fa-camera"></i></a>');
} }
else else
{ {
$(this).after('<a id="barcodescanner-start-button" class="btn btn-sm btn-primary text-white"><i class="fas fa-camera"></i></a>'); $(this).after('<a id="barcodescanner-start-button" class="btn btn-sm btn-primary text-white" data-target="' + $(this).attr("data-target") + '"><i class="fas fa-camera"></i></a>');
} }
}); });
}, 50); }, 50);

View File

@@ -276,6 +276,7 @@ $('.datetimepicker').on('update.datetimepicker', function(e)
Grocy.Components.DateTimePicker.GetInputElement().trigger('input'); Grocy.Components.DateTimePicker.GetInputElement().trigger('input');
Grocy.Components.DateTimePicker.GetInputElement().trigger('change'); Grocy.Components.DateTimePicker.GetInputElement().trigger('change');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress'); Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keyup');
}); });
$('.datetimepicker').on('hide.datetimepicker', function(e) $('.datetimepicker').on('hide.datetimepicker', function(e)
@@ -283,6 +284,7 @@ $('.datetimepicker').on('hide.datetimepicker', function(e)
Grocy.Components.DateTimePicker.GetInputElement().trigger('input'); Grocy.Components.DateTimePicker.GetInputElement().trigger('input');
Grocy.Components.DateTimePicker.GetInputElement().trigger('change'); Grocy.Components.DateTimePicker.GetInputElement().trigger('change');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress'); Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keyup');
}); });
$("#datetimepicker-shortcut").on("click", function() $("#datetimepicker-shortcut").on("click", function()

View File

@@ -276,6 +276,7 @@ $('.datetimepicker2').on('update.datetimepicker', function(e)
Grocy.Components.DateTimePicker2.GetInputElement().trigger('input'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('input');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('change'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('change');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keyup');
}); });
$('.datetimepicker2').on('hide.datetimepicker', function(e) $('.datetimepicker2').on('hide.datetimepicker', function(e)
@@ -283,6 +284,7 @@ $('.datetimepicker2').on('hide.datetimepicker', function(e)
Grocy.Components.DateTimePicker2.GetInputElement().trigger('input'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('input');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('change'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('change');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress'); Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keyup');
}); });
$("#datetimepicker2-shortcut").on("click", function() $("#datetimepicker2-shortcut").on("click", function()

View File

@@ -83,7 +83,7 @@ $(".input-group-productamountpicker").on("change", function()
$("#qu-conversion-info").text(__t("This equals %1$s %2$s in stock", destinationAmount.toLocaleString(), destinationQuName)); $("#qu-conversion-info").text(__t("This equals %1$s %2$s in stock", destinationAmount.toLocaleString(), destinationQuName));
} }
$("#amount").val(destinationAmount); $("#amount").val(destinationAmount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
}); });
$("#display_amount").on("keyup", function() $("#display_amount").on("keyup", function()

View File

@@ -118,12 +118,30 @@ Grocy.Components.ProductCard.Refresh = function(productId)
$("#productcard-no-price-data-hint").addClass("d-none"); $("#productcard-no-price-data-hint").addClass("d-none");
Grocy.Components.ProductCard.ReInitPriceHistoryChart(); Grocy.Components.ProductCard.ReInitPriceHistoryChart();
var datasets = {};
var chart = Grocy.Components.ProductCard.PriceHistoryChart.data;
priceHistoryDataPoints.forEach((dataPoint) => priceHistoryDataPoints.forEach((dataPoint) =>
{ {
Grocy.Components.ProductCard.PriceHistoryChart.data.labels.push(moment(dataPoint.date).toDate()); var key = __t("Unknown store");
if (dataPoint.shopping_location)
{
key = dataPoint.shopping_location.name
}
var dataset = Grocy.Components.ProductCard.PriceHistoryChart.data.datasets[0]; if (!datasets[key]) {
dataset.data.push(dataPoint.price); datasets[key] = []
}
chart.labels.push(moment(dataPoint.date).toDate());
datasets[key].push(dataPoint.price);
});
Object.keys(datasets).forEach((key) => {
chart.datasets.push({
data: datasets[key],
fill: false,
borderColor: "HSL(" + (129 * chart.datasets.length) + ",100%,50%)",
label: key,
});
}); });
Grocy.Components.ProductCard.PriceHistoryChart.update(); Grocy.Components.ProductCard.PriceHistoryChart.update();
} }
@@ -155,13 +173,9 @@ Grocy.Components.ProductCard.ReInitPriceHistoryChart = function()
labels: [ //Date objects labels: [ //Date objects
// Will be populated in Grocy.Components.ProductCard.Refresh // Will be populated in Grocy.Components.ProductCard.Refresh
], ],
datasets: [{ datasets: [ //Datasets
data: [
// Will be populated in Grocy.Components.ProductCard.Refresh // Will be populated in Grocy.Components.ProductCard.Refresh
], ]
fill: false,
borderColor: '%s7a2b8'
}]
}, },
options: { options: {
scales: { scales: {
@@ -189,7 +203,7 @@ Grocy.Components.ProductCard.ReInitPriceHistoryChart = function()
}] }]
}, },
legend: { legend: {
display: false display: true
} }
} }
}); });

View File

@@ -227,8 +227,13 @@ $('#product_id_text_input').on('blur', function(e)
} }
}); });
$(document).on("Grocy.BarcodeScanned", function(e, barcode) $(document).on("Grocy.BarcodeScanned", function(e, barcode, target)
{ {
if (!(target == "@productpicker" || target == "undefined" || target == undefined)) // Default target
{
return;
}
// Don't know why the blur event does not fire immediately ... this works... // Don't know why the blur event does not fire immediately ... this works...
Grocy.Components.ProductPicker.GetInputElement().focusout(); Grocy.Components.ProductPicker.GetInputElement().focusout();

View File

@@ -0,0 +1,68 @@
Grocy.Components.ShoppingLocationPicker = { };
Grocy.Components.ShoppingLocationPicker.GetPicker = function()
{
return $('#shopping_location_id');
}
Grocy.Components.ShoppingLocationPicker.GetInputElement = function()
{
return $('#shopping_location_id_text_input');
}
Grocy.Components.ShoppingLocationPicker.GetValue = function()
{
return $('#shopping_location_id').val();
}
Grocy.Components.ShoppingLocationPicker.SetValue = function(value)
{
Grocy.Components.ShoppingLocationPicker.GetInputElement().val(value);
Grocy.Components.ShoppingLocationPicker.GetInputElement().trigger('change');
}
Grocy.Components.ShoppingLocationPicker.SetId = function(value)
{
Grocy.Components.ShoppingLocationPicker.GetPicker().val(value);
Grocy.Components.ShoppingLocationPicker.GetPicker().data('combobox').refresh();
Grocy.Components.ShoppingLocationPicker.GetInputElement().trigger('change');
}
Grocy.Components.ShoppingLocationPicker.Clear = function()
{
Grocy.Components.ShoppingLocationPicker.SetValue('');
Grocy.Components.ShoppingLocationPicker.SetId(null);
}
$('.shopping-location-combobox').combobox({
appendId: '_text_input',
bsVersion: '4',
clearIfNoMatch: false
});
var prefillByName = Grocy.Components.ShoppingLocationPicker.GetPicker().parent().data('prefill-by-name').toString();
if (typeof prefillByName !== "undefined")
{
possibleOptionElement = $("#shopping_location_id option:contains(\"" + prefillByName + "\")").first();
if (possibleOptionElement.length > 0)
{
$('#shopping_location_id').val(possibleOptionElement.val());
$('#shopping_location_id').data('combobox').refresh();
$('#shopping_location_id').trigger('change');
var nextInputElement = $(Grocy.Components.ShoppingLocationPicker.GetPicker().parent().data('next-input-selector').toString());
nextInputElement.focus();
}
}
var prefillById = Grocy.Components.ShoppingLocationPicker.GetPicker().parent().data('prefill-by-id').toString();
if (typeof prefillById !== "undefined")
{
$('#shopping_location_id').val(prefillById);
$('#shopping_location_id').data('combobox').refresh();
$('#shopping_location_id').trigger('change');
var nextInputElement = $(Grocy.Components.ShoppingLocationPicker.GetPicker().parent().data('next-input-selector').toString());
nextInputElement.focus();
}

View File

@@ -98,7 +98,7 @@
$("#amount").attr("max", "999999"); $("#amount").attr("max", "999999");
$("#amount").attr("step", "1"); $("#amount").attr("step", "1");
$("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1'));
$('#amount').val(Grocy.UserSettings.stock_default_consume_amount); $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
$('#amount_qu_unit').text(""); $('#amount_qu_unit').text("");
$("#tare-weight-handling-info").addClass("d-none"); $("#tare-weight-handling-info").addClass("d-none");
Grocy.Components.ProductPicker.Clear(); Grocy.Components.ProductPicker.Clear();
@@ -162,7 +162,7 @@ $('#save-mark-as-open-button').on('click', function(e)
Grocy.FrontendHelpers.EndUiBusy("consume-form"); Grocy.FrontendHelpers.EndUiBusy("consume-form");
toastr.success(__t('Marked %1$s of %2$s as opened', jsonForm.amount + " " + __n(jsonForm.amount, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural), productDetails.product.name) + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockTransaction(\'' + result.transaction_id + '\')"><i class="fas fa-undo"></i> ' + __t("Undo") + '</a>'); toastr.success(__t('Marked %1$s of %2$s as opened', jsonForm.amount + " " + __n(jsonForm.amount, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural), productDetails.product.name) + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockTransaction(\'' + result.transaction_id + '\')"><i class="fas fa-undo"></i> ' + __t("Undo") + '</a>');
$('#amount').val(Grocy.UserSettings.stock_default_consume_amount); $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
Grocy.Components.ProductPicker.Clear(); Grocy.Components.ProductPicker.Clear();
Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.FrontendHelpers.ValidateForm('consume-form'); Grocy.FrontendHelpers.ValidateForm('consume-form');
@@ -219,6 +219,7 @@ $("#location_id").on('change', function(e)
amount: stockEntry.amount, amount: stockEntry.amount,
text: __t("Amount: %1$s; Expires on %2$s; Bought on %3$s", stockEntry.amount, moment(stockEntry.best_before_date).format("YYYY-MM-DD"), moment(stockEntry.purchased_date).format("YYYY-MM-DD")) + "; " + openTxt text: __t("Amount: %1$s; Expires on %2$s; Bought on %3$s", stockEntry.amount, moment(stockEntry.best_before_date).format("YYYY-MM-DD"), moment(stockEntry.purchased_date).format("YYYY-MM-DD")) + "; " + openTxt
})); }));
sumValue = sumValue + parseFloat(stockEntry.amount); sumValue = sumValue + parseFloat(stockEntry.amount);
if (stockEntry.stock_id == stockId) if (stockEntry.stock_id == stockId)
@@ -227,14 +228,40 @@ $("#location_id").on('change', function(e)
} }
} }
}); });
$("#amount").attr("max", sumValue);
Grocy.Api.Get('stock/products/' + Grocy.Components.ProductPicker.GetValue(),
function(productDetails)
{
if (productDetails.product.enable_tare_weight_handling == 1)
{
$("#amount").attr("min", productDetails.product.tare_weight);
$('#amount').attr('max', sumValue + parseFloat(productDetails.product.tare_weight));
$("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString(), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString()));
$("#tare-weight-handling-info").removeClass("d-none");
}
else
{
$("#tare-weight-handling-info").addClass("d-none");
if (productDetails.product.allow_partial_units_in_stock == 1)
{
$("#amount").attr("min", "0.01");
$("#amount").attr("step", "0.01");
$("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', 0.01.toLocaleString(), parseFloat(productDetails.stock_amount).toLocaleString()));
}
else
{
$("#amount").attr("min", "1");
$("#amount").attr("step", "1");
$("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", parseFloat(productDetails.stock_amount).toLocaleString()));
}
$('#amount').attr('max', sumValue);
if (sumValue == 0) if (sumValue == 0)
{ {
$("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); $("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location'));
} }
else
{
$("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue));
} }
}, },
function (xhr) function (xhr)
@@ -242,6 +269,12 @@ $("#location_id").on('change', function(e)
console.error(xhr); console.error(xhr);
} }
); );
},
function(xhr)
{
console.error(xhr);
}
);
} }
}); });
@@ -379,7 +412,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
} }
}); });
$('#amount').val(Grocy.UserSettings.stock_default_consume_amount); $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
Grocy.FrontendHelpers.ValidateForm('consume-form'); Grocy.FrontendHelpers.ValidateForm('consume-form');
$('#amount').on('focus', function(e) $('#amount').on('focus', function(e)

View File

@@ -17,6 +17,9 @@
var jsonData = { }; var jsonData = { };
jsonData.new_amount = jsonForm.new_amount; jsonData.new_amount = jsonForm.new_amount;
jsonData.best_before_date = Grocy.Components.DateTimePicker.GetValue(); jsonData.best_before_date = Grocy.Components.DateTimePicker.GetValue();
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
jsonData.shopping_location_id = Grocy.Components.ShoppingLocationPicker.GetValue();
}
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)
{ {
jsonData.location_id = Grocy.Components.LocationPicker.GetValue(); jsonData.location_id = Grocy.Components.LocationPicker.GetValue();
@@ -84,6 +87,9 @@
$('#price').val(''); $('#price').val('');
Grocy.Components.DateTimePicker.Clear(); Grocy.Components.DateTimePicker.Clear();
Grocy.Components.ProductPicker.SetValue(''); Grocy.Components.ProductPicker.SetValue('');
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
Grocy.Components.ShoppingLocationPicker.SetValue('');
}
Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.Components.ProductCard.Refresh(jsonForm.product_id); Grocy.Components.ProductCard.Refresh(jsonForm.product_id);
Grocy.FrontendHelpers.ValidateForm('inventory-form'); Grocy.FrontendHelpers.ValidateForm('inventory-form');
@@ -149,7 +155,10 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
$("#tare-weight-handling-info").addClass("d-none"); $("#tare-weight-handling-info").addClass("d-none");
} }
$('#price').val(productDetails.last_price); $('#price').val(parseFloat(productDetails.last_price).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }));
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
Grocy.Components.ShoppingLocationPicker.SetId(productDetails.last_shopping_location_id);
}
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)
{ {
Grocy.Components.LocationPicker.SetId(productDetails.location.id); Grocy.Components.LocationPicker.SetId(productDetails.location.id);

View File

@@ -423,3 +423,24 @@ $("#qu-conversion-add-button").on("click", function(e)
Grocy.ProductEditFormRedirectUri = U("/quantityunitconversion/new?product=editobjectid"); Grocy.ProductEditFormRedirectUri = U("/quantityunitconversion/new?product=editobjectid");
$('#save-product-button').click(); $('#save-product-button').click();
}); });
$('#qu_id_purchase').blur(function(e)
{
// Preset the stock quantity unit with the purchase quantity unit, if the stock quantity unit is unset.
var QuIdStock = $('#qu_id_stock');
var QuIdPurchase = $('#qu_id_purchase');
if (QuIdStock[0].selectedIndex === 0 && QuIdPurchase[0].selectedIndex !== 0) {
QuIdStock[0].selectedIndex = QuIdPurchase[0].selectedIndex;
Grocy.FrontendHelpers.ValidateForm('product-form');
}
});
$(document).on("Grocy.BarcodeScanned", function(e, barcode, target)
{
if (target != "#barcode-taginput")
{
return;
}
$("#barcode-taginput").tagsManager("pushTag", barcode);
});

View File

@@ -17,7 +17,7 @@
if ($("input[name='price-type']:checked").val() == "total-price") if ($("input[name='price-type']:checked").val() == "total-price")
{ {
price = price / amount; price = price / jsonForm.amount;
} }
} }
@@ -29,6 +29,9 @@
var jsonData = {}; var jsonData = {};
jsonData.amount = amount; jsonData.amount = amount;
jsonData.best_before_date = Grocy.Components.DateTimePicker.GetValue(); jsonData.best_before_date = Grocy.Components.DateTimePicker.GetValue();
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
jsonData.shopping_location_id = Grocy.Components.ShoppingLocationPicker.GetValue();
}
jsonData.price = price; jsonData.price = price;
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)
{ {
@@ -89,7 +92,7 @@
$("#amount").attr("min", "1"); $("#amount").attr("min", "1");
$("#amount").attr("step", "1"); $("#amount").attr("step", "1");
$("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1'));
$('#amount').val(Grocy.UserSettings.stock_default_purchase_amount); $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
$('#price').val(''); $('#price').val('');
$('#amount_qu_unit').text(""); $('#amount_qu_unit').text("");
$("#tare-weight-handling-info").addClass("d-none"); $("#tare-weight-handling-info").addClass("d-none");
@@ -99,6 +102,9 @@
} }
Grocy.Components.DateTimePicker.Clear(); Grocy.Components.DateTimePicker.Clear();
Grocy.Components.ProductPicker.SetValue(''); Grocy.Components.ProductPicker.SetValue('');
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
Grocy.Components.ShoppingLocationPicker.SetValue('');
}
Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.Components.ProductCard.Refresh(jsonForm.product_id); Grocy.Components.ProductCard.Refresh(jsonForm.product_id);
Grocy.FrontendHelpers.ValidateForm('purchase-form'); Grocy.FrontendHelpers.ValidateForm('purchase-form');
@@ -137,7 +143,19 @@ if (Grocy.Components.ProductPicker !== undefined)
Grocy.Api.Get('stock/products/' + productId, Grocy.Api.Get('stock/products/' + productId,
function(productDetails) function(productDetails)
{ {
$('#price').val(productDetails.last_price); $('#price').val(parseFloat(productDetails.last_price).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }));
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
if (productDetails.last_shopping_location_id != null)
{
Grocy.Components.ShoppingLocationPicker.SetId(productDetails.last_shopping_location_id);
}
else
{
Grocy.Components.ShoppingLocationPicker.SetId(productDetails.default_shopping_location_id);
}
}
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)
{ {
Grocy.Components.LocationPicker.SetId(productDetails.location.id); Grocy.Components.LocationPicker.SetId(productDetails.location.id);
@@ -149,7 +167,7 @@ if (Grocy.Components.ProductPicker !== undefined)
} }
else else
{ {
$('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + __t("will be multiplied a factor of %1$s to get %2$s", parseInt(productDetails.product.qu_factor_purchase_to_stock).toString(), __n(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")"); $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(productDetails.product.qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }), __n(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")");
} }
if (productDetails.product.allow_partial_units_in_stock == 1) if (productDetails.product.allow_partial_units_in_stock == 1)
@@ -240,7 +258,7 @@ if (Grocy.Components.ProductPicker !== undefined)
}); });
} }
$('#amount').val(Grocy.UserSettings.stock_default_purchase_amount); $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
Grocy.FrontendHelpers.ValidateForm('purchase-form'); Grocy.FrontendHelpers.ValidateForm('purchase-form');
if (Grocy.Components.ProductPicker) if (Grocy.Components.ProductPicker)
@@ -309,7 +327,7 @@ $('#amount').on('change', function(e)
if (GetUriParam("flow") === "shoppinglistitemtostock") if (GetUriParam("flow") === "shoppinglistitemtostock")
{ {
$('#amount').val(GetUriParam("amount")); $('#amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
} }
function UndoStockBooking(bookingId) function UndoStockBooking(bookingId)

View File

@@ -79,7 +79,10 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
$("#not_check_stock_fulfillment").prop("checked", productDetails.product.not_check_stock_fulfillment_for_recipes == 1); $("#not_check_stock_fulfillment").prop("checked", productDetails.product.not_check_stock_fulfillment_for_recipes == 1);
if (!$("#only_check_single_unit_in_stock").prop("checked"))
{
Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_stock.id); Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_stock.id);
}
$('#display_amount').focus(); $('#display_amount').focus();
Grocy.FrontendHelpers.ValidateForm('recipe-pos-form'); Grocy.FrontendHelpers.ValidateForm('recipe-pos-form');

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