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 ..
tx pull --all --minimum-perc=80
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

View File

@@ -2,11 +2,13 @@
ERP beyond your fridge
## 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 pre-release version (current master branch) &rarr; [https://demo-prerelease.grocy.info](https://demo-prerelease.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 (`master` branch) &rarr; [https://demo-prerelease.grocy.info](https://demo-prerelease.grocy.info)
## Getting in touch
There is the [r/grocy subreddit](https://www.reddit.com/r/grocy) to connect with other grocy users. If you've found something that does not work or if you have an idea for an improvement or new things which you would find useful, feel free to open an issue in the [issue tracker](https://github.com/grocy/grocy/issues) here.
## Questions / Help / Bug reporting / Feature requests
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
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"...
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.
@@ -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
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
For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization.
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.
## 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
#### 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
- New translations: (thanks all the translators)
- 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",
"php-di/php-di": "^6.0",
"rubellum/slim-blade-view": "^0.1.1",
"tuupola/cors-middleware": "^1.1",
"morris/lessql": "^0.4.1",
"gettext/gettext": "^4.8",
"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",
"This file is @generated automatically"
],
"content-hash": "9c7420e77a3f1afb59e00560d5b9081c",
"content-hash": "70c5b65f78f4eb43dac8df8dc144e56c",
"packages": [
{
"name": "doctrine/inflector",
@@ -752,6 +752,7 @@
"serialize",
"tokenizer"
],
"abandoned": "opis/closure",
"time": "2018-03-21T22:21:57+00:00"
},
{
@@ -803,73 +804,18 @@
],
"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",
"version": "2.31.0",
"version": "2.32.2",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d"
"reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
"reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
"shasum": ""
},
"require": {
@@ -878,6 +824,7 @@
"symfony/translation": "^3.4 || ^4.0 || ^5.0"
},
"require-dev": {
"doctrine/orm": "^2.7",
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
"kylekatarnls/multi-tester": "^1.1",
"phpmd/phpmd": "^2.8",
@@ -926,7 +873,7 @@
"datetime",
"time"
],
"time": "2020-03-01T11:11:58+00:00"
"time": "2020-03-31T13:43:19+00:00"
},
{
"name": "nikic/fast-route",
@@ -976,16 +923,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.3.0",
"version": "v4.4.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc"
"reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc",
"reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120",
"reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120",
"shasum": ""
},
"require": {
@@ -1024,7 +971,7 @@
"parser",
"php"
],
"time": "2019-11-08T13:50:10+00:00"
"time": "2020-04-10T16:34:50+00:00"
},
{
"name": "philo/laravel-blade",
@@ -1112,22 +1059,22 @@
},
{
"name": "php-di/php-di",
"version": "6.0.11",
"version": "6.1.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-DI/PHP-DI.git",
"reference": "9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620"
"reference": "69238bd49acc0eb6a967029311eeadc3f7c5d538"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620",
"reference": "9bdcc2f41f5fb700ddd01bc4fa8d5bd7b3f94620",
"url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/69238bd49acc0eb6a967029311eeadc3f7c5d538",
"reference": "69238bd49acc0eb6a967029311eeadc3f7c5d538",
"shasum": ""
},
"require": {
"jeremeamia/superclosure": "^2.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/phpdoc-reader": "^2.0.1",
"psr/container": "^1.0"
@@ -1138,10 +1085,10 @@
"require-dev": {
"doctrine/annotations": "~1.2",
"friendsofphp/php-cs-fixer": "^2.4",
"mnapoli/phpunit-easymock": "~1.0",
"mnapoli/phpunit-easymock": "^1.2",
"ocramius/proxy-manager": "~2.0.2",
"phpstan/phpstan": "^0.9.2",
"phpunit/phpunit": "~6.4"
"phpstan/phpstan": "^0.12",
"phpunit/phpunit": "^8.5"
},
"suggest": {
"doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
@@ -1171,7 +1118,17 @@
"ioc",
"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",
@@ -1469,16 +1426,16 @@
},
{
"name": "psr/log",
"version": "1.1.2",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
"reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
"url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
"reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
"shasum": ""
},
"require": {
@@ -1512,7 +1469,7 @@
"psr",
"psr-3"
],
"time": "2019-11-01T11:05:21+00:00"
"time": "2020-03-23T09:12:05+00:00"
},
{
"name": "psr/simple-cache",
@@ -1804,16 +1761,16 @@
},
{
"name": "slim/slim",
"version": "4.4.0",
"version": "4.5.0",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
"reference": "207acac048652a35d4762a737d59e317aedc02df"
"reference": "5613cbb521081ed676d5d7eb3e44f2b80a818c24"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/207acac048652a35d4762a737d59e317aedc02df",
"reference": "207acac048652a35d4762a737d59e317aedc02df",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/5613cbb521081ed676d5d7eb3e44f2b80a818c24",
"reference": "5613cbb521081ed676d5d7eb3e44f2b80a818c24",
"shasum": ""
},
"require": {
@@ -1824,7 +1781,8 @@
"psr/http-factory": "^1.0",
"psr/http-message": "^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": {
"adriansuter/php-autoload-override": "^1.0",
@@ -1837,8 +1795,8 @@
"phpspec/prophecy": "^1.10",
"phpstan/phpstan": "^0.11.5",
"phpunit/phpunit": "^8.5",
"slim/http": "^0.7",
"slim/psr7": "^0.3",
"slim/http": "^1.0",
"slim/psr7": "^1.0",
"squizlabs/php_codesniffer": "^3.5"
},
"suggest": {
@@ -1892,20 +1850,20 @@
"micro",
"router"
],
"time": "2020-01-05T03:51:47+00:00"
"time": "2020-04-14T20:49:48+00:00"
},
{
"name": "symfony/debug",
"version": "v4.4.5",
"version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
"reference": "a980d87a659648980d89193fd8b7a7ca89d97d21"
"reference": "346636d2cae417992ecfd761979b2ab98b339a45"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21",
"reference": "a980d87a659648980d89193fd8b7a7ca89d97d21",
"url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45",
"reference": "346636d2cae417992ecfd761979b2ab98b339a45",
"shasum": ""
},
"require": {
@@ -1948,20 +1906,34 @@
],
"description": "Symfony Debug Component",
"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",
"version": "v4.4.5",
"version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357"
"reference": "5729f943f9854c5781984ed4907bbb817735776b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
"url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
"reference": "5729f943f9854c5781984ed4907bbb817735776b",
"shasum": ""
},
"require": {
@@ -1997,20 +1969,34 @@
],
"description": "Symfony Finder Component",
"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",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2"
"reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2",
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"shasum": ""
},
"require": {
@@ -2022,7 +2008,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@@ -2056,20 +2042,34 @@
"portable",
"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",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php56.git",
"reference": "16ec91cb06998b609501b55b7177b7d7c02badb3"
"reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/16ec91cb06998b609501b55b7177b7d7c02badb3",
"reference": "16ec91cb06998b609501b55b7177b7d7c02badb3",
"url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/d51ec491c8ddceae7dca8dd6c7e30428f543f37d",
"reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d",
"shasum": ""
},
"require": {
@@ -2079,7 +2079,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@@ -2112,20 +2112,34 @@
"portable",
"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",
"version": "v1.14.0",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-util.git",
"reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3"
"reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ba3cfcea6d0192cae46c62041f61cbb704b526d3",
"reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3",
"url": "https://api.github.com/repos/symfony/polyfill-util/zipball/d8e76c104127675d0ea3df3be0f2ae24a8619027",
"reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027",
"shasum": ""
},
"require": {
@@ -2134,7 +2148,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.14-dev"
"dev-master": "1.15-dev"
}
},
"autoload": {
@@ -2164,20 +2178,34 @@
"polyfill",
"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",
"version": "v5.0.5",
"version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b"
"reference": "99b831770e10807dca0979518e2c89edffef5978"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b",
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b",
"url": "https://api.github.com/repos/symfony/translation/zipball/99b831770e10807dca0979518e2c89edffef5978",
"reference": "99b831770e10807dca0979518e2c89edffef5978",
"shasum": ""
},
"require": {
@@ -2241,7 +2269,7 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
"time": "2020-02-04T07:41:34+00:00"
"time": "2020-03-27T16:56:45+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -2299,175 +2327,6 @@
"standards"
],
"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": [],
@@ -2479,5 +2338,6 @@
"platform": {
"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('scan_mode_consume_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
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
DefaultUserSetting('show_clock_in_header', false);
# Component configuration
DefaultUserSetting('quagga2_numofworkers', 4);
# Feature flags
# 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_PRODUCT_OPENED_TRACKING', 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_CHORES_ASSIGNMENTS', true);
# Feature settings
Setting('FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT', true); // When set to false, opened products will not be considered for minimum stock amounts
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
{
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)

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)
{
$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']))
{
return $this->ApiResponse($response, $this->getDatabase()->{$args['entity']}());
return $this->ApiResponse($response, $objects);
}
else
{
@@ -25,7 +43,16 @@ class GenericEntityApiController extends BaseApiController
{
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
{

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();
$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;
}
return $this->renderPage($response, 'recipes', [
$renderArray = [
'recipes' => $recipes,
'recipesResolved' => $recipesResolved,
'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'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('recipes'),
'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)

View File

@@ -82,13 +82,19 @@ class StockApiController extends BaseApiController
$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;
if (array_key_exists('transaction_type', $requestBody) && !empty($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));
}
catch (\Exception $ex)
@@ -144,7 +150,13 @@ class StockApiController extends BaseApiController
$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));
}
catch (\Exception $ex)
@@ -312,7 +324,13 @@ class StockApiController extends BaseApiController
$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));
}
catch (\Exception $ex)

View File

@@ -25,7 +25,8 @@ class StockController extends BaseController
'nextXDays' => $nextXDays,
'productGroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'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'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'stockEntries' => $this->getDatabase()->stock()->orderBy('product_id'),
'currentStockLocations' => $this->getStockService()->GetCurrentStockLocations(),
'nextXDays' => $nextXDays,
@@ -50,6 +52,7 @@ class StockController extends BaseController
{
return $this->renderPage($response, 'purchase', [
'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name')
]);
}
@@ -76,6 +79,7 @@ class StockController extends BaseController
{
return $this->renderPage($response, 'inventory', [
'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'locations' => $this->getDatabase()->locations()->orderBy('name')
]);
}
@@ -85,6 +89,7 @@ class StockController extends BaseController
return $this->renderPage($response, 'stockentryform', [
'stockEntry' => $this->getDatabase()->stock()->where('id', $args['entryId'])->fetch(),
'products' => $this->getDatabase()->products()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_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)
{
return $this->renderPage($response, 'productgroups', [
@@ -166,6 +180,7 @@ class StockController extends BaseController
return $this->renderPage($response, 'productform', [
'locations' => $this->getDatabase()->locations()->orderBy('name'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('products'),
'products' => $this->getDatabase()->products()->where('parent_product_id IS NULL')->orderBy('name'),
@@ -181,6 +196,7 @@ class StockController extends BaseController
'product' => $product,
'locations' => $this->getDatabase()->locations()->orderBy('name'),
'quantityunits' => $this->getDatabase()->quantity_units()->orderBy('name'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'),
'productgroups' => $this->getDatabase()->product_groups()->orderBy('name'),
'userfields' => $this->getUserfieldsService()->GetFields('products'),
'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)
{
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)
{
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)
{
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:
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,
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": {
"post": {
"summary": "Logs a missing localization string",
@@ -586,12 +617,12 @@
],
"responses": {
"200": {
"description": "An entity object",
"description": "Key/value pairs of userfields",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Just key/value pairs of userfields"
"description": "Key/value pairs of userfields"
}
}
}
@@ -639,7 +670,7 @@
"content": {
"application/json": {
"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}": {
"get": {
"summary": "Gets the given setting of the currently logged in user",
"summary": "Returns the given setting of the currently logged in user",
"tags": [
"User settings"
],
@@ -1172,6 +1234,11 @@
"format": "integer",
"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": {
"type": "string",
"format": "date",
@@ -1478,6 +1545,11 @@
"type": "number",
"format": "integer",
"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": {
@@ -1706,6 +1778,11 @@
"format": "date",
"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": {
"type": "number",
"format": "integer",
@@ -3303,6 +3380,7 @@
"quantity_unit_conversions",
"shopping_list",
"shopping_lists",
"shopping_locations",
"recipes",
"recipes_pos",
"recipes_nestings",
@@ -3328,6 +3406,7 @@
"quantity_unit_conversions",
"shopping_list",
"shopping_lists",
"shopping_locations",
"recipes",
"recipes_pos",
"recipes_nestings",
@@ -3418,6 +3497,13 @@
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"shopping_location_id": {
"type": "integer"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
},
"example": {
@@ -3438,7 +3524,9 @@
"allow_partial_units_in_stock": "0",
"enable_tare_weight_handling": "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": {
@@ -3462,6 +3550,10 @@
},
"plural_forms": {
"type": "string"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
},
"example": {
@@ -3470,7 +3562,8 @@
"description": null,
"row_created_timestamp": "2019-05-02 20:12:25",
"name_plural": "Pieces",
"plural_forms": null
"plural_forms": null,
"userfields": null
}
},
"Location": {
@@ -3488,13 +3581,47 @@
"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"
"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": {
@@ -3506,6 +3633,9 @@
"product_id": {
"type": "integer"
},
"amount": {
"type": "integer"
},
"location_id": {
"type": "integer"
},
@@ -3519,6 +3649,7 @@
"example": {
"id": "1",
"product_id": "3",
"amount": "2",
"location_id": "1",
"name": "Fridge"
}
@@ -3535,6 +3666,9 @@
"location_id": {
"type": "integer"
},
"shopping_location_id": {
"type": "integer"
},
"amount": {
"type": "number"
},
@@ -3576,7 +3710,8 @@
"open": "0",
"opened_date": null,
"row_created_timestamp": "2019-05-03 18:24:04",
"location_id": "4"
"location_id": "4",
"shopping_location_id": null
}
},
"RecipeFulfillmentResponse": {
@@ -3641,6 +3776,9 @@
"type": "number",
"format": "number"
},
"last_shopping_location_id": {
"type": "integer"
},
"location": {
"$ref": "#/components/schemas/Location"
},
@@ -3672,7 +3810,8 @@
"allow_partial_units_in_stock": "0",
"enable_tare_weight_handling": "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_used": null,
@@ -3695,6 +3834,7 @@
"plural_forms": null
},
"last_price": null,
"last_shopping_location_id": null,
"next_best_before_date": "2019-07-07",
"location": {
"id": "4",
@@ -3716,6 +3856,9 @@
"price": {
"type": "number",
"format": "number"
},
"shopping_location": {
"$ref": "#/components/schemas/ShoppingLocation"
}
}
},
@@ -3946,6 +4089,10 @@
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
}
},
@@ -3972,6 +4119,10 @@
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
}
},
@@ -4046,6 +4197,10 @@
"row_created_timestamp": {
"type": "string",
"format": "date-time"
},
"userfields": {
"type": "object",
"description": "Key/value pairs of userfields"
}
}
},
@@ -4253,6 +4408,10 @@
"row_created_timestamp": {
"type": "string",
"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';
}
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)
{
if (!defined('GROCY_' . $name))
@@ -146,22 +160,11 @@ function Setting(string $name, $value)
$settingOverrideFile = GROCY_DATAPATH . '/settingoverrides/' . $name . '.txt';
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
{
if (strtolower(getenv('GROCY_' . $name)) === "true")
{
define('GROCY_' . $name, true);
}
elseif (strtolower(getenv('GROCY_' . $name)) === "false")
{
define('GROCY_' . $name, false);
}
else
{
define('GROCY_' . $name, getenv('GROCY_' . $name));
}
define('GROCY_' . $name, ExternalSettingValue(getenv('GROCY_'. $name)));
}
else
{

View File

@@ -367,3 +367,17 @@ msgstr ""
msgid "Portuguese (Portugal)"
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"
msgstr "Umístění"
msgid "Stores"
msgstr ""
msgid "Quantity units"
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"
msgstr "Vytvořit umístění"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Vytvořit měrnou jednotku"
@@ -267,6 +273,9 @@ msgstr "Upravit produkt"
msgid "Edit location"
msgstr "Upravit umístění"
msgid "Edit store"
msgstr ""
msgid "Record data"
msgstr "Zaznamenat data"
@@ -343,6 +352,9 @@ msgstr "Opravdu chcete smazat produkt \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Opravdu chcete smazat umístění \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Spravovat API klíče"
@@ -1122,6 +1134,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Musí být vybráno umístění"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Seznam"
@@ -1155,8 +1170,8 @@ msgstr "Systémové informace"
msgid "Changelog"
msgstr "Seznam změn"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "bude vynásobené faktorem %1$s aby se získalo%2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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"
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"
msgstr "Nedostatečná zásoba"
@@ -1461,7 +1476,7 @@ msgid "Create QU conversion"
msgstr "Vytvořit převod měrné jednotky"
msgid "Default for QU"
msgstr ""
msgstr "Výchozí pro Měrné Jednotky"
msgid "Quantity unit from"
msgstr "Měrná jednotka z"
@@ -1498,10 +1513,10 @@ msgid "Edit QU conversion"
msgstr "Upravit převod měrné jednotky"
msgid "An assignment type is required"
msgstr ""
msgstr "Typ přiřazení je vyžadován"
msgid "Assignment type"
msgstr ""
msgstr "Typ přiřazení"
msgid ""
"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"
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_plural "%s chores are assigned to me"
@@ -1935,3 +1950,33 @@ msgstr "Karta receptu"
msgid "Group ingredients by their product group"
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)"
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"
msgstr "Steder"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Mængdeenheder"
@@ -222,6 +225,9 @@ msgstr "Konverteringfaktor ved køb til beholdningstypen"
msgid "Create location"
msgstr "Opret placering"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Opret mængdeenhed"
@@ -255,6 +261,9 @@ msgstr "Rediger vare"
msgid "Edit location"
msgstr "Rediger placering"
msgid "Edit store"
msgstr ""
msgid "Record 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\"?"
msgstr "Er du sikker på du vil slette placeringen \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Administrer API nøgler"
@@ -1102,6 +1114,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Du skal vælge en placering"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Liste"
@@ -1135,8 +1150,8 @@ msgstr "Systeminformation"
msgid "Changelog"
msgstr "Ændringslog"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "vil blive ganget med en faktor af %1$s for at få %2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
msgstr "Den angivne dato er før i dag, er du sikker?"
@@ -1915,3 +1930,33 @@ msgstr ""
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 ""

View File

@@ -349,3 +349,17 @@ msgstr "Tschechisch"
msgid "Portuguese (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:
# H T <github@fvbor.de>, 2020
# Hagen Tasche <github@fvbor.de>, 2020
# Bernd Bestel <bernd@berrnd.de>, 2020
#
msgid ""
@@ -84,6 +84,9 @@ msgstr "Batterie-Ladezyklus"
msgid "Locations"
msgstr "Standorte"
msgid "Stores"
msgstr "Geschäfte"
msgid "Quantity units"
msgstr "Mengeneinheiten"
@@ -222,6 +225,9 @@ msgstr "Faktor Mengeneinheit Einkauf zu Mengeneinheit Bestand"
msgid "Create location"
msgstr "Standort erstellen"
msgid "Create store"
msgstr "Geschäft erstellen"
msgid "Create quantity unit"
msgstr "Mengeneinheit erstellen"
@@ -255,6 +261,9 @@ msgstr "Produkt bearbeiten"
msgid "Edit location"
msgstr "Standort bearbeiten"
msgid "Edit store"
msgstr "Geschäft bearbeiten"
msgid "Record data"
msgstr "Daten erfassen"
@@ -331,6 +340,9 @@ msgstr "Produkt \"%s\" wirklich löschen?"
msgid "Are you sure to delete location \"%s\"?"
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"
msgstr "API-Keys verwalten"
@@ -1116,6 +1128,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Ein Standort muss ausgewählt werden"
msgid "You have to select a store"
msgstr "Ein Geschäft muss ausgewählt werden"
msgid "List"
msgstr "Liste"
@@ -1149,7 +1164,7 @@ msgstr "Systeminformationen"
msgid "Changelog"
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"
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"
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)"
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"
msgstr "Polish"
msgid "DemoSupermarket1"
msgstr "Walmart"
msgid "DemoSupermarket2"
msgstr "Kroger"

View File

@@ -66,6 +66,9 @@ msgstr "Products"
msgid "Locations"
msgstr "Locations"
msgid "Shopping locations"
msgstr "Shopping locations"
msgid "Quantity units"
msgstr "Quantity units"
@@ -162,6 +165,9 @@ msgstr "Name"
msgid "Location"
msgstr "Location"
msgid "Shopping location"
msgstr "Shopping location"
msgid "Min. stock amount"
msgstr "Min. stock amount"
@@ -201,6 +207,9 @@ msgstr "Factor purchase to stock quantity unit"
msgid "Create location"
msgstr "Create location"
msgid "Create shopping location"
msgstr "Create shopping location"
msgid "Create quantity unit"
msgstr "Create quantity unit"
@@ -234,6 +243,9 @@ msgstr "Edit product"
msgid "Edit location"
msgstr "Edit location"
msgid "Edit shopping location"
msgstr "Edit shopping location"
msgid "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\"?"
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"
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"
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"
msgstr "List"

View File

@@ -1,29 +1,25 @@
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 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: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "no-assignment"
msgstr "No assignment"
msgid "who-least-did-first"
msgstr "who-least-did-first"
msgstr "Who least did first"
msgid "random"
msgstr "random"
msgstr "Random"
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 ""
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: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en\n"
"X-Domain: grocy/chore_types\n"
msgid "manually"
msgstr "manually"
msgstr "Manually"
msgid "dynamic-regular"
msgstr "dynamic-regular"
msgstr "Dynamic regular"
msgid "daily"
msgstr "daily"
msgstr "Daily"
msgid "weekly"
msgstr "weekly"
msgstr "Weekly"
msgid "monthly"
msgstr "monthly"
msgstr "Monthly"
msgid "yearly"
msgstr "yearly"
msgstr "Yearly"

View File

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

View File

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

View File

@@ -83,6 +83,9 @@ msgstr "Battery tracking"
msgid "Locations"
msgstr "Locations"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Quantity units"
@@ -220,6 +223,9 @@ msgstr "Factor purchase to stock quantity unit"
msgid "Create location"
msgstr "Create location"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Create quantity unit"
@@ -253,6 +259,9 @@ msgstr "Edit product"
msgid "Edit location"
msgstr "Edit location"
msgid "Edit store"
msgstr ""
msgid "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\"?"
msgstr "Are you sure to delete location \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Manage API keys"
@@ -1095,6 +1107,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "You have to select a location"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "List"
@@ -1128,8 +1143,8 @@ msgstr "System info"
msgid "Changelog"
msgstr "Changelog"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "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 ""
msgid "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"
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 ""
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: Jonathan Adams <jonathan@connockadams.uk>, 2020\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n"
"Last-Translator: Translation migration from old PHP array files\n"
"Language-Team: http://www.transifex.com/grocy/grocy/language/en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01T17:59:17+00:00\n"
"Language: en\n"
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr "text-single-line"
msgstr "Text (single line)"
msgid "text-multi-line"
msgstr "text-multi-line"
msgstr "Text (multi line)"
msgid "number-integral"
msgstr "number-integral"
msgstr "Number (integral)"
msgid "number-decimal"
msgstr "number-decimal"
msgstr "Number (decimal)"
msgid "date"
msgstr "date"
msgstr "Date (without time)"
msgid "datetime"
msgstr "datetime"
msgstr "Date & time"
msgid "checkbox"
msgstr "checkbox"
msgstr "Checkbox"
msgid "preset-list"
msgstr "preset-list"
msgstr "Select list (a single item can be selected)"
msgid "preset-checklist"
msgstr "preset-checklist"
msgstr "Select list (multiple items can be selected)"
msgid "link"
msgstr "link"
msgstr "Link"

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
# Ankue <ankue.spam@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 ""
msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -34,7 +35,7 @@ msgid "Tinned food cupboard"
msgstr "Estante de las latas"
msgid "Fridge"
msgstr "Frigorífico"
msgstr "Refrigerador"
msgid "Piece"
msgid_plural "Pieces"
@@ -54,12 +55,12 @@ msgstr[1] "Vasos"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] "Envases"
msgstr[1] "Envases"
msgstr[1] "Latas"
msgid "Can"
msgid_plural "Cans"
msgstr[0] "Lata"
msgstr[1] "Latas"
msgstr[1] "Envases"
msgid "Bunch"
msgid_plural "Bunches"
@@ -67,7 +68,7 @@ msgstr[0] "Puñados"
msgstr[1] "Puñados"
msgid "Gummy bears"
msgstr "Ositos"
msgstr "Ositos de goma"
msgid "Crisps"
msgstr "Patatas fritas"
@@ -82,7 +83,7 @@ msgid "Pickles"
msgstr "Pepinillos"
msgid "Gulash soup"
msgstr "Sopa"
msgstr "Sopa Gulash"
msgid "Yogurt"
msgstr "Yogurt"
@@ -115,13 +116,13 @@ msgid "Warranty ends"
msgstr "Final de la garantía"
msgid "TV remote control"
msgstr "Mando de la TV"
msgstr "Control remoto del televisor"
msgid "Alarm clock"
msgstr "Despertador"
msgid "Heat remote control"
msgstr "Mando de la calefacción"
msgstr "Control remoto de la calefacción"
msgid "Lawn mowed in the garden"
msgstr "Cortar el césped del jardín"
@@ -133,10 +134,10 @@ msgid "Pizza dough"
msgstr "Masa de pizza"
msgid "Sieved tomatoes"
msgstr "Tomate triturado"
msgstr "Tomates triturados"
msgid "Salami"
msgstr "Salami"
msgstr "Salame"
msgid "Toast"
msgstr "Tostada"
@@ -148,10 +149,10 @@ msgid "Pizza"
msgstr "Pizza"
msgid "Spaghetti bolognese"
msgstr "Spaghetti boloñesa"
msgstr "Spaghetti a la boloñesa"
msgid "Sandwiches"
msgstr "Bocadillos"
msgstr "Sándwiches"
msgid "English"
msgstr "Inglés"
@@ -177,7 +178,7 @@ msgid "Flour"
msgstr "Harina"
msgid "Pancakes"
msgstr "Tortitas"
msgstr "Panqueques"
msgid "Sugar"
msgstr "Azúcar"
@@ -273,7 +274,7 @@ msgid "The thing which happens daily"
msgstr "Lo que ocurre diariamente"
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"
msgstr "Sueco"
@@ -290,19 +291,19 @@ msgstr "Chocolate negro"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Lonchas"
msgstr[1] "Lonchas"
msgstr[1] "Rebanadas"
msgid "Example userentity"
msgstr "Entidad de usuario de ejemplo"
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"
msgstr "Campo personalizado"
msgid "Example field value..."
msgstr "Ejemplo de valor de campo..."
msgstr "Valor del campo de ejemplo ..."
msgid "Waffle rolls"
msgstr "Canutillos"
@@ -326,10 +327,10 @@ msgid "Preview version"
msgstr "Versión previa"
msgid "current release"
msgstr "Release actual"
msgstr "Elaboración actual"
msgid "not yet released"
msgstr "Todavía no liberado"
msgstr "Todavía no elaborado"
msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
@@ -347,7 +348,21 @@ msgid "Slovak"
msgstr "Eslovaco"
msgid "Czech"
msgstr ""
msgstr "Checo"
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:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Jose Rugel <joserugel@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2019\n"
"Last-Translator: Jose Rugel <joserugel@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,13 +17,28 @@ msgstr ""
"X-Domain: grocy/stock_transaction_types\n"
msgid "purchase"
msgstr "Compra"
msgstr "compra"
msgid "transfer_from"
msgstr "trasladar_desde"
msgid "transfer_to"
msgstr "trasladar_a"
msgid "consume"
msgstr "Consumo"
msgstr "consumo"
msgid "inventory-correction"
msgstr "Corrección de inventario"
msgstr "inventario-correccion"
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:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
# Igor Perez <igordiablo@hotmail.com>, 2020
# Jose Rugel <joserugel@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -9,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,25 +18,25 @@ msgstr ""
"X-Domain: grocy/userfield_types\n"
msgid "text-single-line"
msgstr "Texto (una línea)"
msgstr "texto-unica-linea"
msgid "text-multi-line"
msgstr "Texto (múltiples líneas)"
msgstr "texto-multi-linea"
msgid "number-integral"
msgstr "mero (entero)"
msgstr "numero-entero"
msgid "number-decimal"
msgstr "mero (decimal)"
msgstr "numero-decimal"
msgid "date"
msgstr "Fecha"
msgstr "fecha"
msgid "datetime"
msgstr "Fecha y hora"
msgstr "fecha-hora"
msgid "checkbox"
msgstr "Casilla de verificación"
msgstr "casilla-verificacion"
msgid "preset-list"
msgstr "lista-predefinida"

View File

@@ -5,6 +5,8 @@
# Antonin DESFONTAINES <antonin.desfontaines@outlook.com>, 2019
# Zkryvix <angelo.frangione@gmail.com>, 2020
# Laurent Mox <laurent@laurent.sh>, 2020
# Nicolas Moisson <nicolas.moisson@protonmail.com>, 2020
# Nikola Kotur <nikola.kotur@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -12,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -352,7 +354,21 @@ msgid "Slovak"
msgstr "Slovaque"
msgid "Czech"
msgstr ""
msgstr "Tchèque"
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
# Bruno D'agen <iamlionem@gmail.com>, 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 ""
msgstr ""
@@ -23,7 +26,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -99,6 +102,9 @@ msgstr "Suivi des piles"
msgid "Locations"
msgstr "Emplacements"
msgid "Stores"
msgstr "Magasins"
msgid "Quantity units"
msgstr "Formats"
@@ -237,6 +243,9 @@ msgstr "Facteur entre la quantité à l'achat et la quantité en stock"
msgid "Create location"
msgstr "Créer un emplacement"
msgid "Create store"
msgstr "Créer magasin"
msgid "Create quantity unit"
msgstr "Créer un format"
@@ -270,6 +279,9 @@ msgstr "Modifier le produit"
msgid "Edit location"
msgstr "Modifier l'emplacement"
msgid "Edit store"
msgstr "Mettre à jour magasin"
msgid "Record data"
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\"?"
msgstr "Voulez-vous vraiment supprimer l'emplacement \"%s\" ?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
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 "
"used above)"
msgstr ""
"Vérifier uniquement si une unité est en stock (une quantité différente peut "
"alors être utilisée au dessus)"
"Vérifier uniquement si le stock contient au moins une unité (une quantité "
"supérieure pourra alors être utilisée)"
msgid ""
"Are you sure to consume all ingredients needed by recipe \"%s\" (ingredients"
@@ -1124,6 +1139,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Vous devez sélectionner un endroit"
msgid "You have to select a store"
msgstr "Vous devez sélectionner un magasin"
msgid "List"
msgstr "Liste"
@@ -1157,8 +1175,8 @@ msgstr "Informations système"
msgid "Changelog"
msgstr "Journalisation"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "sera multiplié par %1$s pour obtenir %2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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 "
msgid "Spoil rate"
msgstr "Taux de gâte"
msgstr "Taux de péremption"
msgid "Show more"
msgstr "Afficher plus"
@@ -1348,7 +1366,7 @@ msgid "Meal plan"
msgstr "Prévisions des menus"
msgid "Add recipe on %s"
msgstr ""
msgstr "Ajouter une recette dans %s"
msgid "%s serving"
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"
msgid "Show stock entries"
msgstr ""
msgstr "Afficher les entrées du stock"
msgid "Stock entries"
msgstr ""
msgstr "Entrées du stock"
msgid "Best before date"
msgstr "A consommer de préférence avant le"
@@ -1780,27 +1798,30 @@ msgid "Purchased date"
msgstr "Date d'achat"
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"
msgstr "La quantité ne peut être inférieure à %s"
msgid "Stock entry successfully updated"
msgstr ""
msgstr "Entrée du stock mise à jour avec succès"
msgid "Edit stock entry"
msgstr ""
msgstr "Modifier l'entrée du stock"
msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection"
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"
msgstr "Garder l'écran allumé"
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"
msgstr "Date d'achat obligatoire"
@@ -1809,24 +1830,27 @@ msgid ""
"When a product is selected, one unit (per serving in purchase quantity unit)"
" will be added to stock on consuming this recipe"
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"
msgstr ""
msgstr "Génère un produit"
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"
msgstr ""
msgstr "La réservation n'existe pas ou a déjà été annulée"
msgid "Are you sure to delete API key \"%s\"?"
msgstr ""
msgstr "Voulez-vous vraiment supprimer la clé API \"%s\" ?"
msgid "Add note"
msgstr "Ajouter une remarque"
msgid "Add note on %s"
msgstr ""
msgstr "Ajouter une remarque dans %s"
msgid "per day"
msgstr "par jour"
@@ -1838,16 +1862,18 @@ msgid "Normal view"
msgstr "Vue normale"
msgid "Only undone items"
msgstr ""
msgstr "Uniquement les éléments annulés"
msgid "Add product"
msgstr "Ajouter un produit"
msgid "Add product on %s"
msgstr ""
msgstr "Ajouter le produit à %s"
msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr ""
"Consommer tous les ingrédients requis pour les recettes ou produits de cette"
" semaine"
msgid "Meal plan recipe"
msgstr "Recette des prévisions de repas"
@@ -1870,72 +1896,112 @@ msgstr "Éteint"
msgid ""
"Scan mode is on but not all required fields could be populated automatically"
msgstr ""
"Le mode \"scan\" est activé mais tous les champs obligatoires n'ont pas pu "
"être automatiquement remplis"
msgid "Is freezer"
msgstr ""
msgstr "Est un congélateur"
msgid ""
"When moving products from/to a freezer location, the products best before "
"date is automatically adjusted according to the product settings"
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 ""
"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"
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"
msgstr ""
msgstr "Date de durabilité minimale après congélation par défaut en jours"
msgid ""
"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"
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"
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"
msgstr ""
msgstr "Ce ne peut pas être le même endroit d'origine"
msgid "Thawed"
msgstr ""
msgstr "Décongelé"
msgid "Frozen"
msgstr "Congelé"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr ""
msgstr "Voulez-vous vraiment supprimer l'entité utilisateur \"%s\" ?"
msgid "Shopping list settings"
msgstr "Paramètres de la liste de courses"
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"
msgstr ""
"Ne pas basculer automatiquement en vue compacte sur les appareils mobiles"
msgid "Edit note on %s"
msgstr ""
msgstr "Modifier la remarque dans %s"
msgid "Edit product on %s"
msgstr ""
msgstr "Modifier le produit dans %s"
msgid "Edit recipe on %s"
msgstr ""
msgstr "Modifier la recette dans %s"
msgid "Desired servings"
msgstr "portions souhaitées"
msgid "Base: %s"
msgstr ""
msgstr "Base: %s"
msgid "Recipes settings"
msgstr ""
msgstr "Paramètres des recettes"
msgid "Recipe card"
msgstr ""
msgstr "Fiche de recette"
msgid "Group ingredients by their product group"
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
# Bernd Bestel <bernd@berrnd.de>, 2020
# Gábor Szellő <gabor.szello@gmail.com>, 2020
# Gabor Pilsits <gabor.pilsits@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -348,7 +349,21 @@ msgid "Slovak"
msgstr "Szlovák"
msgid "Czech"
msgstr ""
msgstr "Cseh"
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 ""

View File

@@ -3,8 +3,8 @@
# Ádám Kovács <kovacsadam07@outlook.hu>, 2019
# Peter Gyetvai <gyetpet@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
# Gabor Pilsits <gabor.pilsits@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -12,7 +12,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -88,6 +88,9 @@ msgstr "Elemek követése"
msgid "Locations"
msgstr "Helyek"
msgid "Stores"
msgstr "Boltok"
msgid "Quantity units"
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"
msgstr "Hely létrehozása"
msgid "Create store"
msgstr "Áruház hozzáadása"
msgid "Create quantity unit"
msgstr "Mennyiségi egység létrehozása"
@@ -259,6 +265,9 @@ msgstr "Termék szerkesztése"
msgid "Edit location"
msgstr "Hely szerkesztése"
msgid "Edit store"
msgstr "Áruház szerkesztése"
msgid "Record data"
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\"?"
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"
msgstr "API kulcsok kezelése"
@@ -625,8 +637,8 @@ msgstr[1] "%s Egység"
msgid "%s chore is due to be done"
msgid_plural "%s chores are due to be done"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%sházimunkát(kat) kell elvégezni"
msgstr[1] "%sházimunkát(kat) kell elvégezni"
msgid "%s chore is 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_plural "%s tasks are due to be done"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%s feladatot(okat) kell elvégezni"
msgstr[1] "%sfeladatot(okat) kell elvégezni"
msgid "%s task is 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"
msgstr ""
"Készlet rendelkezésre állás ellenőrzés kikapcsolása ehhez a hozzávalóhoz"
msgid "Add all list items to stock"
msgstr "Összes listaelem hozzáadása készlethez"
@@ -1093,6 +1106,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Ki kell választanod egy helyet"
msgid "You have to select a store"
msgstr "Ki kell választanod egy áruházat"
msgid "List"
msgstr "Lista"
@@ -1126,7 +1142,7 @@ msgstr "Rendszerinformáció"
msgid "Changelog"
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 ""
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"
msgid "Day of month"
msgstr ""
msgstr "Hónap napja"
msgid "Monday"
msgstr "Hétfő"
@@ -1754,7 +1770,7 @@ msgid "Add note"
msgstr "Jegyzet hozzáadása"
msgid "Add note on %s"
msgstr ""
msgstr "Megjegyzés hozzáadása %s-hoz/hez"
msgid "per day"
msgstr "per nap"
@@ -1858,7 +1874,7 @@ msgid "Edit recipe on %s"
msgstr ""
msgid "Desired servings"
msgstr ""
msgstr "Kívánt adagok"
msgid "Base: %s"
msgstr "Alap:%s"
@@ -1871,3 +1887,33 @@ msgstr "Receptkártya"
msgid "Group ingredients by their product group"
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"
msgid "Hungarian"
msgstr ""
msgstr "Ungherese"
msgid "Slovak"
msgstr ""
msgstr "Slovacco"
msgid "Czech"
msgstr ""
msgstr "Ceco"
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"
msgstr "Posizioni"
msgid "Stores"
msgstr "Negozi"
msgid "Quantity units"
msgstr "Unità di misura"
@@ -226,6 +229,9 @@ msgstr "Fattore di conversione tra unità di acquisto e di dispensa"
msgid "Create location"
msgstr "Aggiungi posizione"
msgid "Create store"
msgstr "Crea negozio"
msgid "Create quantity unit"
msgstr "Aggiungi unità di misura"
@@ -259,6 +265,9 @@ msgstr "Modifica prodotto"
msgid "Edit location"
msgstr "Modifica posizione"
msgid "Edit store"
msgstr "Modifica negozio"
msgid "Record data"
msgstr "Registra dati"
@@ -336,6 +345,9 @@ msgstr "Sei sicuro di voler eliminare il prodotto \"%s\"?"
msgid "Are you sure to delete location \"%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"
msgstr "Gestisci le chiavi API"
@@ -1118,6 +1130,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Devi selezionare una posizione"
msgid "You have to select a store"
msgstr "Devi selezionare un negozio"
msgid "List"
msgstr "Elenco"
@@ -1151,7 +1166,7 @@ msgstr "Informazioni di sistema"
msgid "Changelog"
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"
msgid "The given date is earlier than today, are you sure?"
@@ -1344,7 +1359,7 @@ msgid "Meal plan"
msgstr "Piano dei pasti"
msgid "Add recipe on %s"
msgstr ""
msgstr "Aggiungi ricetta a %s"
msgid "%s serving"
msgid_plural "%s servings"
@@ -1799,6 +1814,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection"
msgstr ""
"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"
msgstr "Mantieni lo schermo acceso"
@@ -1834,7 +1851,7 @@ msgid "Add note"
msgstr "Aggiungi nota"
msgid "Add note on %s"
msgstr ""
msgstr "Aggiungi nota a %s"
msgid "per day"
msgstr "al giorno"
@@ -1852,7 +1869,7 @@ msgid "Add product"
msgstr "Aggiungi prodotto"
msgid "Add product on %s"
msgstr ""
msgstr "Aggiungi prodotto a %s"
msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr ""
@@ -1926,37 +1943,69 @@ msgid "Frozen"
msgstr "Congelato"
msgid "Are you sure to delete userentity \"%s\"?"
msgstr ""
msgstr "Sei sicuro di voler eliminare l'entità utente \"%s\"?"
msgid "Shopping list settings"
msgstr ""
msgstr "Impostazioni Lista della Spesa"
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"
msgstr ""
"Non passare automaticamente alla visualizzazione compatta sui dispositivi "
"mobili"
msgid "Edit note on %s"
msgstr ""
msgstr "Modifica nota a %s"
msgid "Edit product on %s"
msgstr ""
msgstr "Modifica prodotto a %s"
msgid "Edit recipe on %s"
msgstr ""
msgstr "Modifica ricetta a %s"
msgid "Desired servings"
msgstr ""
msgstr "Porzioni desiderate"
msgid "Base: %s"
msgstr ""
msgstr "Base: %s"
msgid "Recipes settings"
msgstr ""
msgstr "Impostazioni Ricette"
msgid "Recipe card"
msgstr ""
msgstr "Scheda ricetta"
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"
msgid "Czech"
msgstr ""
msgstr "Tsjechisch"
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 ""

View File

@@ -11,9 +11,9 @@
# Frank Klaassen <frank@frankklaassen.nl>, 2019
# Kees van Nieuwenhuijzen <kees@vannieuwenhuijzen.com>, 2019
# 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
# Bastien Van Houdt <bastienvanhoudt@gmail.com>, 2020
# D. Polders <zigurana@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -21,7 +21,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -41,7 +41,7 @@ msgstr[1] "%s producten verlopen"
msgid "within the next day"
msgid_plural "within the next %s days"
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_plural "%s products are already expired"
@@ -97,6 +97,9 @@ msgstr "Batterij volgen"
msgid "Locations"
msgstr "Locaties"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Hoeveelheidseenheden"
@@ -235,6 +238,9 @@ msgstr "Factor van aankoop- naar voorraadeenheid"
msgid "Create location"
msgstr "Maak een locatie"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Maak hoeveelheidseenheid"
@@ -268,6 +274,9 @@ msgstr "Bewerk product"
msgid "Edit location"
msgstr "Wijzig locatie"
msgid "Edit store"
msgstr ""
msgid "Record data"
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\"?"
msgstr "Weet u zeker dat u locatie \"%s\" wilt verwijderen?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Beheer API sleutels"
@@ -634,12 +646,12 @@ msgstr[1] "%seenheden"
msgid "%s chore is due to be done"
msgid_plural "%s chores are due to be done"
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_plural "%s chores are overdue to be done"
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_plural "%s batteries are due to be charged"
@@ -712,7 +724,7 @@ msgid "Assigned to"
msgstr "Toegewezen aan"
msgid "Mark task \"%s\" as completed"
msgstr "Klusje \"%s\" als afgewerkt aanduiden"
msgstr "Taak \"%s\" als voltooid aanduiden"
msgid "Uncategorized"
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_plural "%s tasks are due to be done"
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_plural "%s tasks are overdue to be done"
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"
msgstr "Bewerk taakcategorie"
@@ -782,16 +794,16 @@ msgid "Below min. stock amount"
msgstr "Onder min. voorraadhoeveelheid"
msgid "Expiring soon"
msgstr "Vervalt binnenkort"
msgstr "Verloopt binnenkort"
msgid "Already expired"
msgstr "Al verlopen"
msgid "Due soon"
msgstr "Bij over tijd"
msgstr "Bijna gepland"
msgid "Overdue"
msgstr "Over tijd"
msgstr "Achterstallig"
msgid "View settings"
msgstr "Beeld instellingen"
@@ -1013,7 +1025,7 @@ msgid "Product expires"
msgstr "Product vervalt"
msgid "Task due"
msgstr "Klusje open"
msgstr "Taak te doen"
msgid "Chore due"
msgstr "Klus tegen"
@@ -1125,6 +1137,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Je moet een locatie selecteren"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Lijst"
@@ -1159,8 +1174,8 @@ msgstr "Systeeminfo"
msgid "Changelog"
msgstr "Changelog"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "wordt vermenigvuldigd met een factor %1$s om er %2$s van te krijgen"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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_plural "%s chores are assigned to me"
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"
msgstr "Toegewezen aan mij"
@@ -1803,6 +1818,8 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when grocy is served via a secure (https://) connection"
msgstr ""
"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"
msgstr "Houd scherm aan"
@@ -1963,3 +1980,33 @@ msgstr "Receptfiche"
msgid "Group ingredients by their product group"
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"
msgid "Czech"
msgstr ""
msgstr "Tjekkisk"
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 ""

View File

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

View File

@@ -85,6 +85,9 @@ msgstr "Batteriregistrering"
msgid "Locations"
msgstr "Lokasjoner"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Forpakning"
@@ -207,7 +210,7 @@ msgid "Minimum stock amount"
msgstr "Minimumsbeholdning"
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"
msgstr "Forpakning kjøpt"
@@ -221,6 +224,9 @@ msgstr "Innkjøpsfaktor for forpakning"
msgid "Create location"
msgstr "Opprett lokasjon"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Opprett forpakning"
@@ -254,6 +260,9 @@ msgstr "Endre produkt"
msgid "Edit location"
msgstr "Endre lokasjon"
msgid "Edit store"
msgstr ""
msgid "Record data"
msgstr "Logg handlinger"
@@ -329,6 +338,9 @@ msgstr "Er du sikker du ønsker å slette produkt \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Er du sikker du ønsker å slette lokasjon \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Administrer API-Keys"
@@ -867,7 +879,7 @@ msgid "Filter by product group"
msgstr "Filtrér etter produktgruppe"
msgid "Presets for new products"
msgstr "Standard for nye produkter"
msgstr "Forhåndsatt for nye produkter"
msgid "Included recipes"
msgstr "Inkludert oppskrift"
@@ -968,7 +980,7 @@ msgstr ""
"dato + antall dager under"
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"
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"
msgstr ""
"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"
msgid "Skip"
@@ -1098,6 +1110,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Du må velge en lokasjon"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Liste"
@@ -1131,8 +1146,8 @@ msgstr "System info"
msgid "Changelog"
msgstr "Change Log"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "Vil bli ganget med %1$s for å få %2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
msgstr ""
@@ -1151,7 +1166,7 @@ msgid ""
"This will be used as the default setting when adding this product as a "
"recipe ingredient"
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"
msgid "Add item"
@@ -1323,7 +1338,7 @@ msgid "Meal plan"
msgstr "Middagsplanlegger"
msgid "Add recipe on %s"
msgstr ""
msgstr "Legg oppskrift til %s"
msgid "%s serving"
msgid_plural "%s servings"
@@ -1653,7 +1668,7 @@ msgid "Display recipe"
msgstr "Vis oppskrift"
msgid "Accumulate sub products min. stock amount"
msgstr "Akkumulert underprodukter minimum beholdningsnivå"
msgstr "Akkumuler underordnede produkter i minimum beholdningsnivå"
msgid ""
"If enabled, the min. stock amount of sub products will be accumulated into "
@@ -1661,8 +1676,8 @@ msgid ""
"product"
msgstr ""
"Hvis aktivert vil minimum beholdningsnivå av under produkter bli akkumulert "
"inn i dette produktet. Dette betyr at under produktet aldri vil \"mangle\", "
"kunne dette produktet."
"inn i dette produktet. Dette betyr at underordnede produktet aldri vil "
"\"mangle\", kunne dette produktet."
msgid "Are you sure to remove this conversion?"
msgstr "Er du sikker på at du ønsker å fjerne denne konverteringen?"
@@ -1680,7 +1695,7 @@ msgid "Unlimited"
msgstr "Evig"
msgid "Clear"
msgstr "Tøm"
msgstr "Slett"
msgid "Are you sure to remove the included recipe \"%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 "
"and when grocy is served via a secure (https://) connection"
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"
msgstr "Skjerm alltid på"
@@ -1802,7 +1819,7 @@ msgid "Add note"
msgstr "Legg til notat"
msgid "Add note on %s"
msgstr ""
msgstr "Legg notat til %s"
msgid "per day"
msgstr "per dag"
@@ -1820,7 +1837,7 @@ msgid "Add product"
msgstr "Legg til produkt"
msgid "Add product on %s"
msgstr ""
msgstr "Legg produkt til %s"
msgid "Consume all ingredients needed by this weeks recipes or products"
msgstr ""
@@ -1867,7 +1884,7 @@ msgstr ""
"fryses), endres best før datoen fra i dag + antall dager under"
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 ""
"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"
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"
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\"?"
msgid "Shopping list settings"
msgstr ""
msgstr "Handleliste - innstillinger"
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"
msgstr ""
msgstr "Ikke bytt til kompakt visning automatisk når du er på en mobil enhet"
msgid "Edit note on %s"
msgstr ""
msgstr "Endre notat for den %s"
msgid "Edit product on %s"
msgstr ""
msgstr "Endre produkt for den %s"
msgid "Edit recipe on %s"
msgstr ""
msgstr "Endre produkt for den %s"
msgid "Desired servings"
msgstr ""
msgstr "Ønskede porsjoner"
msgid "Base: %s"
msgstr ""
msgstr "Base: %s"
msgid "Recipes settings"
msgstr ""
msgstr "Opprkifter - innstillinger"
msgid "Recipe card"
msgstr ""
msgstr "Oppskrift kort"
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 ""

View File

@@ -350,3 +350,17 @@ msgstr ""
msgid "Portuguese (Portugal)"
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"
msgstr "Localizações"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Unidades de medida"
@@ -224,6 +227,9 @@ msgstr "Fator de unidade de compra e estoque"
msgid "Create location"
msgstr "Criar Localização"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Criar unidade de medida"
@@ -257,6 +263,9 @@ msgstr "Editar produto"
msgid "Edit location"
msgstr "Editar localização"
msgid "Edit store"
msgstr ""
msgid "Record data"
msgstr "Gravar dados"
@@ -335,6 +344,9 @@ msgstr "Tem certeza que quer apagar este produto \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Tem certeza que quer apagar este local \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Organizar Chaves do API"
@@ -1107,6 +1119,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Você precisa selecionar uma localização"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Lista"
@@ -1140,8 +1155,8 @@ msgstr "Informações do sistema"
msgid "Changelog"
msgstr "Log de alterações"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "será multiplicado um fator de %1$s para obter %2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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"
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:
# Joao Santos <joaocpdsantos@gmail.com>, 2019
# Ricardo Rodrigues <fenix999@gmail.com>, 2020
# Miguel Pereira <miguelpereira.pro@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -347,7 +348,21 @@ msgid "Slovak"
msgstr "Eslovaco"
msgid "Czech"
msgstr ""
msgstr "Checo"
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 ""

View File

@@ -85,6 +85,9 @@ msgstr "Tracking de Pilhas"
msgid "Locations"
msgstr "Localizações"
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr "Unidades de medida"
@@ -223,6 +226,9 @@ msgstr "Unidade de medida do stock por compra"
msgid "Create location"
msgstr "Criar localização"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Criar unidade de medida"
@@ -256,6 +262,9 @@ msgstr "Editar Produto"
msgid "Edit location"
msgstr "Editar Localização"
msgid "Edit store"
msgstr ""
msgid "Record data"
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\"?"
msgstr "Tem a certeza que pretende eliminar o local \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Gerir chaves da API"
@@ -1099,6 +1111,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Precisa de seleccionar uma localização"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Lista"
@@ -1132,8 +1147,8 @@ msgstr "Informação do sistema"
msgid "Changelog"
msgstr "histórico de modificações"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "será multiplicado pelo factor de %1$s para ter%2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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"
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:
# Pavel Pletenev <cpp.create@gmail.com>, 2019
# First Name Second Name <greentail@protonmail.ch>, 2019
# Maksim Moiseikin <m.moiseikin@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,4 +34,4 @@ msgid "monthly"
msgstr "ежемесячно"
msgid "yearly"
msgstr ""
msgstr "ежегодно"

View File

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

View File

@@ -365,3 +365,17 @@ msgstr ""
msgid "Portuguese (Portugal)"
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"
msgstr "Umiestnenia"
msgid "Stores"
msgstr ""
msgid "Quantity units"
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"
msgstr "Vytvoriť umiestnenie"
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr "Vytvoriť mernú jednotku"
@@ -263,6 +269,9 @@ msgstr "Upraviť výrobok"
msgid "Edit location"
msgstr "Upraviť umiestnenie"
msgid "Edit store"
msgstr ""
msgid "Record data"
msgstr "Zaznamenať údaje"
@@ -339,6 +348,9 @@ msgstr "Naozaj si prajete odstrániť výrobok \"%s\"?"
msgid "Are you sure to delete location \"%s\"?"
msgstr "Naozaj si prajete odstrániť umiestnenie \"%s\"?"
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr "Spravovať API kľúče"
@@ -1127,6 +1139,9 @@ msgstr ""
msgid "You have to select a location"
msgstr "Musíte vybrať umiestnenie"
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr "Zoznam"
@@ -1160,8 +1175,8 @@ msgstr "Systémové informácie"
msgid "Changelog"
msgstr "Zoznam zmien"
msgid "will be multiplied a factor of %1$s to get %2$s"
msgstr "bude vynásobený faktorom %1$s, aby bolo dosiahnuté %2$s"
msgid "will be multiplied by a factor of %1$s to get %2$s"
msgstr ""
msgid "The given date is earlier than today, are you sure?"
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"
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"
msgstr ""
msgid "Stores"
msgstr ""
msgid "Quantity units"
msgstr ""
@@ -214,6 +217,9 @@ msgstr ""
msgid "Create location"
msgstr ""
msgid "Create store"
msgstr ""
msgid "Create quantity unit"
msgstr ""
@@ -247,6 +253,9 @@ msgstr ""
msgid "Edit location"
msgstr ""
msgid "Edit store"
msgstr ""
msgid "Record data"
msgstr ""
@@ -319,6 +328,9 @@ msgstr ""
msgid "Are you sure to delete location \"%s\"?"
msgstr ""
msgid "Are you sure to delete store \"%s\"?"
msgstr ""
msgid "Manage API keys"
msgstr ""
@@ -1022,6 +1034,9 @@ msgstr ""
msgid "You have to select a location"
msgstr ""
msgid "You have to select a store"
msgstr ""
msgid "List"
msgstr ""
@@ -1055,7 +1070,7 @@ msgstr ""
msgid "Changelog"
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 ""
msgid "The given date is earlier than today, are you sure?"
@@ -1744,3 +1759,33 @@ msgstr ""
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 ""

View File

@@ -1,6 +1,5 @@
# Translators:
# Benjamin Tayehanpour <transifex@benjamin.tayehanpour.se>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2020
#
msgid ""
msgstr ""
@@ -8,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,13 +17,13 @@ msgstr ""
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "Ingen uppgift"
msgstr "ingen-tilldelning"
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"
msgstr "Slumpmässig"
msgstr "slumpmässig"
msgid "in-alphabetical-order"
msgstr "I alfabetisk ordning"
msgstr "i-alfabetisk-ordning"

View File

@@ -1,8 +1,9 @@
# Translators:
# Mathias Fröjd <info@mcfrojd.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
# Fredrik Hendeberg <fredrik@hendeberg.com>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2019
# Sebastian Backman <valtkor@hotmail.com>, 2020
# Per Bäckman <fotodille@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +33,7 @@ msgid "Candy cupboard"
msgstr "Godisskåp"
msgid "Tinned food cupboard"
msgstr "Konservburk för konserverad mat"
msgstr "Konservskafferi"
msgid "Fridge"
msgstr "Kylskåp"
@@ -40,32 +41,32 @@ msgstr "Kylskåp"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] "Bit"
msgstr[1] "Bitar"
msgstr[1] "bitar"
msgid "Pack"
msgid_plural "Packs"
msgstr[0] "Förpackning"
msgstr[1] "Förpackningar"
msgstr[1] "förpackningar"
msgid "Glass"
msgid_plural "Glasses"
msgstr[0] "Glas"
msgstr[1] "Glas"
msgstr[1] "glas"
msgid "Tin"
msgid_plural "Tins"
msgstr[0] "Burk"
msgstr[1] "Burkar"
msgstr[1] "konservburk"
msgid "Can"
msgid_plural "Cans"
msgstr[0] "Burk"
msgstr[1] "Burkar"
msgstr[1] "burkar"
msgid "Bunch"
msgid_plural "Bunches"
msgstr[0] "Knippa"
msgstr[1] "Knippor"
msgstr[1] "knippor"
msgid "Gummy bears"
msgstr "Gummibjörnar"
@@ -80,10 +81,10 @@ msgid "Noodles"
msgstr "Spaghetti"
msgid "Pickles"
msgstr "Ättiksgurka"
msgstr "Inlagda grönsaker"
msgid "Gulash soup"
msgstr "Gulashoppa"
msgstr "Gulashsoppa"
msgid "Yogurt"
msgstr "Yoghurt"
@@ -134,7 +135,7 @@ msgid "Pizza dough"
msgstr "Pizzadeg"
msgid "Sieved tomatoes"
msgstr "Siktade tomater"
msgstr "Passerade tomater"
msgid "Salami"
msgstr "Salami"
@@ -155,16 +156,16 @@ msgid "Sandwiches"
msgstr "Smörgåsar"
msgid "English"
msgstr "Engelsk"
msgstr "Engelska"
msgid "German"
msgstr "Tysk"
msgstr "Tyska"
msgid "Italian"
msgstr "Italienska"
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"
msgstr "Demo-användare"
@@ -172,13 +173,13 @@ msgstr "Demo-användare"
msgid "Gram"
msgid_plural "Grams"
msgstr[0] "Gram"
msgstr[1] "Gram"
msgstr[1] "gram"
msgid "Flour"
msgstr "Mjöl"
msgid "Pancakes"
msgstr "pannkakor"
msgstr "Pannkakor"
msgid "Sugar"
msgstr "Socker"
@@ -196,7 +197,7 @@ msgid "Repair the garage door"
msgstr "Reparera garagedörren"
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"
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"
msgid "Liter"
msgstr "Liter"
msgstr "liter"
msgid "Liters"
msgstr "Liter"
msgstr "liter"
msgid "Bottle"
msgstr "Flaska"
msgstr "flaska"
msgid "Bottles"
msgstr "Flaskor"
msgstr "flaskor"
msgid "Milk"
msgstr "Mjölk"
@@ -244,10 +245,10 @@ msgid "Chocolate sauce"
msgstr "Chokladsås"
msgid "Milliliters"
msgstr "Milliliter"
msgstr "ml"
msgid "Milliliter"
msgstr "Milliliter"
msgstr "ml"
msgid "Bottom"
msgstr "Botten"
@@ -291,7 +292,7 @@ msgstr "Mörk chocklad"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] "Skiva"
msgstr[1] "Skivor"
msgstr[1] "skivor"
msgid "Example userentity"
msgstr "Exempel användarenhet"
@@ -336,19 +337,33 @@ msgid "Portuguese (Brazil)"
msgstr "Portugisiska (Brasilien)"
msgid "This is a note"
msgstr ""
msgstr "Detta är en anteckning"
msgid "Freezer"
msgstr ""
msgstr "Frys"
msgid "Hungarian"
msgstr ""
msgstr "Ungerska"
msgid "Slovak"
msgstr ""
msgstr "Slovakiska"
msgid "Czech"
msgstr ""
msgstr "Tjeckiska"
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 ""

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,7 @@
# Fredrik Hendeberg <fredrik@hendeberg.com>, 2019
# Jesper Sandström <jesper@languageconsulting.se>, 2019
# Peter Wickenberg <peter@wickenberg.nu>, 2019
# Per Bäckman <fotodille@gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: 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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -44,7 +45,7 @@ msgid "preset-list"
msgstr "mall-lista"
msgid "preset-checklist"
msgstr "förchecklista"
msgstr "mallchecklista"
msgid "link"
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,
"dependencies": {
"@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",
"animate.css": "^3.7.2",
"bootbox": "^5.3.2",
@@ -14,6 +15,7 @@
"datatables.net-bs4": "^1.10.19",
"datatables.net-colreorder": "^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-bs4": "^2.2.3",
"datatables.net-rowgroup": "^1.1.0",
@@ -22,15 +24,14 @@
"datatables.net-select-bs4": "^1.3.0",
"fullcalendar": "^3.10.1",
"gettext-translator": "2.1.0",
"jquery": "^3.4.1",
"jquery": "3.4.1",
"jquery-lazy": "^1.7.10",
"jquery-serializejson": "^2.9.0",
"moment": "^2.24.0",
"nosleep.js": "^0.9.0",
"quagga": "^0.12.1",
"sprintf-js": "^1.1.2",
"startbootstrap-sb-admin": "4.0.0",
"summernote": "^0.8.12",
"summernote": "^0.8.16",
"swagger-ui-dist": "^3.23.10",
"tempusdominus-bootstrap-4": "https://github.com/berrnd/tempusdominus-bootstrap-4.git#master",
"timeago": "^1.6.7",

View File

@@ -225,6 +225,55 @@ input::-webkit-inner-spin-button {
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 */
/* 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;
}
/* Always show modals over everything else */
.modal {
z-index: 99999;
}
/* Third party component customizations - DataTables */
.dataTable td {
vertical-align: middle !important;

View File

@@ -1,3 +1,14 @@
<?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';

View File

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

View File

@@ -1,5 +1,58 @@
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.DecodedCodesCount = 0;
@@ -11,9 +64,8 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
type: "LiveStream",
target: document.querySelector("#barcodescanner-livestream"),
constraints: {
width: 436,
height: 327,
facingMode: "environment"
facingMode: "environment",
...(window.localStorage.getItem('cameraId') && {deviceId : window.localStorage.getItem('cameraId')}) // If preferred cameraId is set, request to use that specific camera
}
},
locator: {
@@ -34,7 +86,7 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
}
}
},
numOfWorkers: 2,
numOfWorkers: Grocy.UserSettings.quagga2_numofworkers,
frequency: 10,
decoder: {
readers: [
@@ -64,12 +116,16 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
{
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"));
window.localStorage.removeItem("cameraId");
setTimeout(function()
{
bootbox.hideAll();
}, 500);
return;
}
Grocy.Components.BarcodeScanner.CheckCapabilities();
Quagga.start();
});
}
@@ -84,6 +140,19 @@ Grocy.Components.BarcodeScanner.StopScanning = function()
bootbox.hideAll();
}
Grocy.Components.BarcodeScanner.TorchOn = function(track)
{
if (track) {
track.applyConstraints({
advanced: [
{
torch: true
}
]
});
}
}
Quagga.onDetected(function(result)
{
$.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)
{
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();
var inputElement = $(e.currentTarget).prev();
@@ -144,7 +213,9 @@ $(document).on("click", "#barcodescanner-start-button", function(e)
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>',
title: __t('Scan a barcode'),
onEscape: function()
@@ -157,10 +228,10 @@ $(document).on("click", "#barcodescanner-start-button", function(e)
buttons: {
torch: {
label: '<i class="far fa-lightbulb"></i>',
className: 'btn-warning responsive-button',
className: 'btn-warning responsive-button torch',
callback: function()
{
Quagga.CameraAccess.getActiveTrack().applyConstraints({ advanced: [{ torch: true }] });
Grocy.Components.BarcodeScanner.TorchOn(Quagga.CameraAccess.getActiveTrack());
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();
});
@@ -183,11 +276,11 @@ setTimeout(function()
{
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
{
$(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);

View File

@@ -276,6 +276,7 @@ $('.datetimepicker').on('update.datetimepicker', function(e)
Grocy.Components.DateTimePicker.GetInputElement().trigger('input');
Grocy.Components.DateTimePicker.GetInputElement().trigger('change');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keyup');
});
$('.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('change');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker.GetInputElement().trigger('keyup');
});
$("#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('change');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keyup');
});
$('.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('change');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keypress');
Grocy.Components.DateTimePicker2.GetInputElement().trigger('keyup');
});
$("#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));
}
$("#amount").val(destinationAmount);
$("#amount").val(destinationAmount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
});
$("#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");
Grocy.Components.ProductCard.ReInitPriceHistoryChart();
var datasets = {};
var chart = Grocy.Components.ProductCard.PriceHistoryChart.data;
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];
dataset.data.push(dataPoint.price);
if (!datasets[key]) {
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();
}
@@ -155,13 +173,9 @@ Grocy.Components.ProductCard.ReInitPriceHistoryChart = function()
labels: [ //Date objects
// Will be populated in Grocy.Components.ProductCard.Refresh
],
datasets: [{
data: [
datasets: [ //Datasets
// Will be populated in Grocy.Components.ProductCard.Refresh
],
fill: false,
borderColor: '%s7a2b8'
}]
]
},
options: {
scales: {
@@ -189,7 +203,7 @@ Grocy.Components.ProductCard.ReInitPriceHistoryChart = function()
}]
},
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...
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("step", "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("");
$("#tare-weight-handling-info").addClass("d-none");
Grocy.Components.ProductPicker.Clear();
@@ -162,7 +162,7 @@ $('#save-mark-as-open-button').on('click', function(e)
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>');
$('#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.GetInputElement().focus();
Grocy.FrontendHelpers.ValidateForm('consume-form');
@@ -219,6 +219,7 @@ $("#location_id").on('change', function(e)
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
}));
sumValue = sumValue + parseFloat(stockEntry.amount);
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)
{
$("#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)
@@ -242,6 +269,12 @@ $("#location_id").on('change', function(e)
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');
$('#amount').on('focus', function(e)

View File

@@ -17,6 +17,9 @@
var jsonData = { };
jsonData.new_amount = jsonForm.new_amount;
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)
{
jsonData.location_id = Grocy.Components.LocationPicker.GetValue();
@@ -84,6 +87,9 @@
$('#price').val('');
Grocy.Components.DateTimePicker.Clear();
Grocy.Components.ProductPicker.SetValue('');
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
Grocy.Components.ShoppingLocationPicker.SetValue('');
}
Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.Components.ProductCard.Refresh(jsonForm.product_id);
Grocy.FrontendHelpers.ValidateForm('inventory-form');
@@ -149,7 +155,10 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
$("#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)
{
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");
$('#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")
{
price = price / amount;
price = price / jsonForm.amount;
}
}
@@ -29,6 +29,9 @@
var jsonData = {};
jsonData.amount = amount;
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;
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)
{
@@ -89,7 +92,7 @@
$("#amount").attr("min", "1");
$("#amount").attr("step", "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('');
$('#amount_qu_unit').text("");
$("#tare-weight-handling-info").addClass("d-none");
@@ -99,6 +102,9 @@
}
Grocy.Components.DateTimePicker.Clear();
Grocy.Components.ProductPicker.SetValue('');
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) {
Grocy.Components.ShoppingLocationPicker.SetValue('');
}
Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.Components.ProductCard.Refresh(jsonForm.product_id);
Grocy.FrontendHelpers.ValidateForm('purchase-form');
@@ -137,7 +143,19 @@ if (Grocy.Components.ProductPicker !== undefined)
Grocy.Api.Get('stock/products/' + productId,
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)
{
Grocy.Components.LocationPicker.SetId(productDetails.location.id);
@@ -149,7 +167,7 @@ if (Grocy.Components.ProductPicker !== undefined)
}
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)
@@ -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');
if (Grocy.Components.ProductPicker)
@@ -309,7 +327,7 @@ $('#amount').on('change', function(e)
if (GetUriParam("flow") === "shoppinglistitemtostock")
{
$('#amount').val(GetUriParam("amount"));
$('#amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }));
}
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);
if (!$("#only_check_single_unit_in_stock").prop("checked"))
{
Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_stock.id);
}
$('#display_amount').focus();
Grocy.FrontendHelpers.ValidateForm('recipe-pos-form');

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