Compare commits

...

63 Commits

Author SHA1 Message Date
Bernd Bestel
b2295ce6d2 Prepared next release 2023-09-02 09:28:19 +02:00
Bernd Bestel
32ce04a1b7 Pulled translations from Transifex 2023-09-02 09:25:43 +02:00
Bernd Bestel
dfa3262426 Updated dependencies 2023-09-02 09:15:11 +02:00
Bernd Bestel
1f7580af3f Fixed GetCurrentStock caching 2023-09-02 09:12:37 +02:00
Bernd Bestel
60adda2b42 Optimized performance of CurrentVolatileStock 2023-09-01 18:11:36 +02:00
Bernd Bestel
387a5f7dd3 Move GetParsedAndFilteredRequestBody into BaseApiController 2023-09-01 17:58:02 +02:00
Bernd Bestel
f6bdb6e836 Added new Userfield type "Number (currency)" (closes #2276) 2023-09-01 17:48:46 +02:00
Bernd Bestel
82d899d609 Optimized DataTables state save handling performance 2023-09-01 17:04:11 +02:00
Bernd Bestel
fdbb8a045a Optimized performance of GetProductDetails 2023-09-01 17:03:22 +02:00
Bernd Bestel
07db1f35bc Cache multiple single-key user setting queries (closes #2323) 2023-09-01 17:02:36 +02:00
Bernd Bestel
dde577b98b Updated README 2023-09-01 17:00:50 +02:00
Bernd Bestel
5080d776a7 Only accept application/json requests for (JSON) API requests 2023-09-01 00:53:25 +02:00
Bernd Bestel
8c21969b84 Added changelog for PR #2322 2023-08-22 19:43:43 +02:00
Aleksandar Kuzmanoski
13e99d3f07 stock_current view now uses cached QUCs -> Recipes consume 50% faster (#2322)
* stock_current view now uses cache__quantity_unit_conversions_resolved -> Recipes consume 50% faster

* Adapted code style

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2023-08-22 19:41:44 +02:00
Bernd Bestel
dedbee3181 Allow user editing in embedded (+ disabled authentication) mode (closes grocy/grocy-desktop#47) 2023-08-19 08:48:52 +02:00
Bernd Bestel
16f686deb8 Prepared next release 2023-08-19 08:24:52 +02:00
Bernd Bestel
973e4226b6 Pulled translations from Transifex 2023-08-19 08:18:36 +02:00
Bernd Bestel
6e22d3b100 Updated dependencies 2023-08-19 08:15:33 +02:00
Bernd Bestel
9b119da8e0 Merged the by @alkuzman contributed new quantity_unit_conversions_resolved view (closes #2297) 2023-08-19 08:13:34 +02:00
Bernd Bestel
03f9ba45ea Fixed initial product QU conversion handling (fixes #2312) 2023-08-16 17:05:18 +02:00
Bernd Bestel
a965d01fb9 Optimized server error display handling when consuming a recipe (closes #2310) 2023-08-15 18:51:40 +02:00
Bernd Bestel
a123535b0a Optimized locale number display handling (fixes #2309) 2023-08-15 09:35:40 +02:00
Bernd Bestel
3a2929c016 stockreports/spendings: Support grouping by store (closes #2308) 2023-08-14 18:12:40 +02:00
Bernd Bestel
106f25cc6b Fixed stock entry open button amount on /stockentries (fixes #2303) 2023-08-13 08:27:02 +02:00
Bernd Bestel
d6cc87ac86 More optimizations around edited stock entries handling (references #2292) 2023-08-13 00:27:37 +02:00
Bernd Bestel
a47bccab3f Added some comments to newest changed SQL views (references #2292) 2023-08-12 20:16:44 +02:00
Bernd Bestel
393a312186 More fixes regarding edited stock entries and calculating the products average price + price history (fixes #2292) 2023-08-12 18:08:12 +02:00
Bernd Bestel
7f21e2de34 Switched back to original gettext/gettext package
References https://github.com/php-gettext/Gettext/pull/289
2023-08-10 16:58:40 +02:00
Bernd Bestel
82ac996b3a Fixed typo 2023-08-09 22:36:50 +02:00
Bernd Bestel
827134c972 Changelog wording improvements 2023-08-09 22:34:30 +02:00
Bernd Bestel
787d5f11e0 Fixed dynamic manifest didn't work with enabled authentication 2023-08-09 21:00:35 +02:00
Bernd Bestel
2d2039f988 Fixed recipe cost/energy calculation (fixes #2301) 2023-08-08 17:59:10 +02:00
Bernd Bestel
268f0d8a50 Fixed typo 2023-08-08 09:43:17 +02:00
Bernd Bestel
9dde46d419 Changelog wording improvements 2023-08-07 22:13:47 +02:00
Bernd Bestel
162ba267a1 Changelog wording improvements 2023-08-07 22:12:00 +02:00
Bernd Bestel
4691b45510 Removed unnecessary calculation step in view uihelper_shopping_list (closes #2298) 2023-08-07 21:57:12 +02:00
Bernd Bestel
e2ebc037f2 Prepared next release 2023-08-06 15:29:28 +02:00
Bernd Bestel
550aa5565b Pulled translations from Transifex 2023-08-06 15:17:38 +02:00
Bernd Bestel
c105ebc979 Enabled Composer optimize-autoloader 2023-08-06 15:11:27 +02:00
Bernd Bestel
7ef744a995 Relate prices on the shopping to the there selected QU (closes #2294) 2023-08-06 14:31:38 +02:00
Bernd Bestel
ee4a082c74 Fixed handling of edited stock entries when calculating a product's average price (references #2292) 2023-08-06 14:05:35 +02:00
Bernd Bestel
1d7f7b2992 Cache expensive stock data calculations 2023-08-06 13:28:14 +02:00
Bernd Bestel
7689356a57 Changed manifest title 2023-08-06 09:28:41 +02:00
Bernd Bestel
1401ed5c00 Updated dependencies 2023-08-06 09:27:41 +02:00
Bernd Bestel
bae4a7f04c Added missing semicolon 2023-08-05 21:51:13 +02:00
Bernd Bestel
a44d746176 Fixed stock_edited_entries view (references #2292) 2023-08-05 21:44:22 +02:00
Bernd Bestel
3afb9643c4 Fix handling when there are no single edited stock entries at all (references #2292) 2023-08-05 18:28:49 +02:00
Bernd Bestel
61a3a4329b Unified edited stock transactions handling (fixes #2292) 2023-08-05 09:58:21 +02:00
Bernd Bestel
491ad8c791 Optimized indentation 2023-08-04 15:44:14 +02:00
Bernd Bestel
339a1ebffc Mention supported browsers in README 2023-08-04 15:41:44 +02:00
Bernd Bestel
1c35fecc85 Added the possibility to skip demo data generation in dev/demo/prerelease mode 2023-08-02 21:10:03 +02:00
Bernd Bestel
d006436d49 Upgraded PHP-CS-Fixer / applied optimized rules 2023-08-02 18:44:30 +02:00
Bernd Bestel
6c4cc00fd5 Added PHP 8.2 support 2023-08-01 21:23:59 +02:00
Bernd Bestel
847337443d Optimized /shoppinglist performance 2023-08-01 20:47:47 +02:00
Bernd Bestel
b74fbddd94 Use a dynamic (title / URL) manifest 2023-08-01 17:12:35 +02:00
Bernd Bestel
8b444a03e5 Simplified initial /mealplan start date handling (fixes #2286) 2023-07-31 21:29:28 +02:00
Bernd Bestel
e946ec79d5 Fixed typo 2023-07-31 18:27:53 +02:00
Bernd Bestel
ca740e8cee Improved product average shelf life calculation (references #2283) 2023-07-31 17:41:36 +02:00
Bernd Bestel
5d48b02b37 Added the possibility to log executed SQL statements (DEV mode only) 2023-07-31 17:08:55 +02:00
Bernd Bestel
73ad9d39ab Workaround for crap product specific QU conversions for migration 0207 (fixes #2285) 2023-07-31 16:58:41 +02:00
Bernd Bestel
fd7e24b7d1 Optimized StockService->GetProductDetails performance (fixes #2283) 2023-07-31 16:54:58 +02:00
Bernd Bestel
57ccb8645e Updated screenshots 2023-07-30 17:18:59 +02:00
Bernd Bestel
e8d6d455f4 grocy-desktop => Grocy Desktop 2023-07-29 21:17:59 +02:00
163 changed files with 3509 additions and 1813 deletions

View File

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

4
.github/SECURITY.md vendored
View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 KiB

After

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -4,8 +4,7 @@ $finder = PhpCsFixer\Finder::create()
->exclude(['packages'])
->ignoreVCSIgnored(true)
->files()->name('*.php')
->in(__DIR__)
;
->in(__DIR__);
$cfg = new PhpCsFixer\Config();
return $cfg
@@ -15,81 +14,41 @@ return $cfg
'array_syntax' => ['syntax' => 'short'],
'combine_consecutive_unsets' => true,
'class_attributes_separation' => true,
'class_attributes_separation' => ['elements' => ['const' => 'none', 'property' => 'none']],
'multiline_whitespace_before_semicolons' => false,
'single_quote' => true,
// 'blank_line_after_opening_tag' => true,
// 'blank_line_before_return' => true,
'braces' => [
'allow_single_line_closure' => true,
'position_after_anonymous_constructs' => 'same',
'position_after_control_structures' => 'next',
'position_after_functions_and_oop_constructs' => 'next',
'blank_line_after_opening_tag' => true,
'curly_braces_position' => [
'control_structures_opening_brace' => 'next_line_unless_newline_at_signature_end',
'anonymous_functions_opening_brace' => 'next_line_unless_newline_at_signature_end'
],
'control_structure_continuation_position' => [
'position' => 'next_line'
],
'cast_spaces' => [
'space' => 'none'
],
// 'cast_spaces' => true,
// 'class_definition' => array('singleLine' => true),
'concat_space' => ['spacing' => 'one'],
'declare_equal_normalize' => true,
'function_typehint_space' => true,
'type_declaration_spaces' => true,
'single_line_comment_style' => ['comment_types' => ['hash']],
'include' => true,
'lowercase_cast' => true,
// 'native_function_casing' => true,
// 'new_with_braces' => true,
// 'no_blank_lines_after_class_opening' => true,
// 'no_blank_lines_after_phpdoc' => true,
// 'no_empty_comment' => true,
// 'no_empty_phpdoc' => true,
// 'no_empty_statement' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
// 'no_mixed_echo_print' => array('use' => 'echo'),
'no_multiline_whitespace_around_double_arrow' => true,
// 'no_short_bool_cast' => true,
// 'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_around_offset' => true,
// 'no_trailing_comma_in_list_call' => true,
// 'no_trailing_comma_in_singleline_array' => true,
// 'no_unneeded_control_parentheses' => true,
// 'no_unused_imports' => true,
'no_whitespace_before_comma_in_array' => true,
'no_whitespace_in_blank_line' => true,
// 'normalize_index_brace' => true,
'object_operator_without_whitespace' => true,
// 'php_unit_fqcn_annotation' => true,
// 'phpdoc_align' => true,
// 'phpdoc_annotation_without_dot' => true,
// 'phpdoc_indent' => true,
// 'phpdoc_inline_tag' => true,
// 'phpdoc_no_access' => true,
// 'phpdoc_no_alias_tag' => true,
// 'phpdoc_no_empty_return' => true,
// 'phpdoc_no_package' => true,
// 'phpdoc_no_useless_inheritdoc' => true,
// 'phpdoc_return_self_reference' => true,
// 'phpdoc_scalar' => true,
// 'phpdoc_separation' => true,
// 'phpdoc_single_line_var_spacing' => true,
// 'phpdoc_summary' => true,
// 'phpdoc_to_comment' => true,
// 'phpdoc_trim' => true,
// 'phpdoc_types' => true,
// 'phpdoc_var_without_name' => true,
// 'pre_increment' => true,
// 'return_type_declaration' => true,
// 'self_accessor' => true,
// 'short_scalar_cast' => true,
'single_blank_line_before_namespace' => true,
// 'single_class_element_per_statement' => true,
// 'space_after_semicolon' => true,
// 'standardize_not_equals' => true,
'blank_lines_before_namespace' => true,
'ternary_operator_spaces' => true,
// 'trailing_comma_in_multiline_array' => true,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'whitespace_after_comma_in_array' => true,
'no_trailing_comma_in_singleline' => true
])
->setIndent("\t")
->setLineEnding("\n")
->setUsingCache(false)
->setFinder($finder)
;
->setFinder($finder);

View File

@@ -20,7 +20,7 @@ See the website &rarr; <https://grocy.info>
- General help and usage questions &rarr; [r/grocy subreddit](https://www.reddit.com/r/grocy)
- Bug Reports and Feature Requests &rarr; [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose)
_Please don't send me private messages or call me regarding Grocy help. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
_Please don't send me private messages or call me regarding anything Grocy. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
## Community contributions
@@ -28,12 +28,10 @@ See the website for a list of community contributed Add-ons / Tools. &rarr; [htt
## How to install
> Checkout [grocy-desktop](https://github.com/grocy/grocy-desktop), if you want to run Grocy without having to manage a webserver just like a normal (Windows) desktop application.
> Checkout [Grocy Desktop](https://github.com/grocy/grocy-desktop), if you want to run Grocy without having to manage a webserver just like a normal (Windows) desktop application.
>
> Directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next".
See the website for some installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links)
Grocy is technically a pretty simple PHP application, so the basic notes to get it running are:
- Unpack the [latest release](https://releases.grocy.info/latest)
- Copy `config-dist.php` to `data/config.php` + edit to your needs
@@ -45,11 +43,14 @@ Grocy is technically a pretty simple PHP application, so the basic notes to get
Alternatively clone this repository (the `release` branch always references the latest released version) and install Composer and Yarn dependencies manually.
See the website for more installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links)
### Platform support
- PHP 8.1 (with SQLite 3.34.0+)
- Required PHP extensions: `fileinfo`, `pdo_sqlite`, `gd`, `ctype`, `json`, `intl`, `zlib`, `mbstring`
- _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
- PHP 8.1 or 8.2 (with SQLite 3.34.0+)
- Required PHP extensions: `fileinfo`, `pdo_sqlite`, `gd`, `ctype`, `json`, `intl`, `zlib`, `mbstring`
- _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
- Recent Firefox, Chrome or Edge
## How to run using Docker
@@ -101,11 +102,11 @@ _My personal recommendation: Use a USB barcode laser scanner. They are cheap and
For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization.
The following shorthands are available:
- `MMDD` gets expanded to the given day on the current year, if > today, or to the given day next year, if < today, in proper notation
- Example: `0517` will be converted to `2021-05-17`
- Example: `0517` will be converted to `2023-05-17`
- `YYYYMMDD` gets expanded to the proper ISO-8601 notation
- Example: `20210417` will be converted to `2021-04-17`
- Example: `20230417` will be converted to `2023-04-17`
- `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation
- Example: `202107e` will be converted to `2021-07-31`
- Example: `202307e` will be converted to `2023-07-31`
- `[+/-]n[d/m/y]` gets expanded to a date relative to today, while adding (**+**) or subtracting (**-**) the **n**umber of**d**ays/**m**onths/**y**ears, in proper notation
- Example: `+1m` will be converted to the same day next month
- `x` gets expanded to `2999-12-31` (which is an alias for "never overdue")
@@ -142,11 +143,11 @@ If you don't use certain feature sets of Grocy (for example if you don't need "C
### Demo mode
When the `MODE` setting is set to `dev`, `demo` or `prerelease`, the application will work in a demo mode which means authentication is disabled and some demo data will be generated during the database schema migration.
When the `MODE` setting is set to `dev`, `demo` or `prerelease`, the application will work in a demo mode which means authentication is disabled and some demo data will be generated during the database schema migration (pass the query parameter `nodemodata`, e.g. `https://grocy.example.com/?nodemodata` to skip that).
### Embedded mode
When the file `embedded.txt` exists, it must contain a valid and writable path which will be used as the data directory instead of `data` and authentication will be disabled (used in [grocy-desktop](https://github.com/grocy/grocy-desktop)).
When the file `embedded.txt` exists, it must contain a valid and writable path which will be used as the data directory instead of `data` and authentication will be disabled (used in [Grocy Desktop](https://github.com/grocy/grocy-desktop)).
In embedded mode, settings can be overridden by text files in `data/settingoverrides`, the file name must be `<SettingName>.txt` (e. g. `BASE_URL.txt`) and the content must be the setting value (normally one single line).
@@ -156,7 +157,7 @@ Any help is welcome, feel free to contribute anything which comes to your mind o
## Roadmap
There is none. The progress of a specific bug/enhancement is always tracked in the corresponding issue, at least by commit comment references.
There is none, this is a hobby project. The progress of a specific bug/enhancement is always tracked in the corresponding issue, at least by commit comment references.
[Milestones](https://github.com/grocy/grocy/milestones) are used to indicate in which version the corresponding request was done (`vNEXT` means it's currently planned to do that for the next release).

View File

@@ -62,15 +62,18 @@ AppFactory::setContainer(new DI\Container());
$app = AppFactory::create();
$container = $app->getContainer();
$container->set('view', function (Container $container) {
$container->set('view', function (Container $container)
{
return new Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');
});
$container->set('UrlManager', function (Container $container) {
$container->set('UrlManager', function (Container $container)
{
return new UrlManager(GROCY_BASE_URL);
});
$container->set('ApiKeyHeaderName', function (Container $container) {
$container->set('ApiKeyHeaderName', function (Container $container)
{
return 'GROCY-API-KEY';
});

View File

@@ -4,9 +4,11 @@
> _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
### New feature: Quantity unit conversions with unlimited hierarchy
### New feature: Indirect quantity unit conversions with unlimited levels
- Quantity unit conversions now support transitive conversions, means the QU hierarchy has now unlimited levels (thanks a lot @esclear)
- Quantity unit conversions now support indirect conversions with unlimited levels (thanks a lot @esclear)
- _Explained by a practical example: When a conversion between Teaspoons and Milliliters and another one between Milliliters and Liters exists (and so forth; unlimited levels), Grocy can now calculate Teaspoons to Liters (before a direct conversion definition between Teaspoons and Liters was required)_
- **Heads up:** If you have such "each to each absolute conversion definitions" currently (for the example above the conversion between Teaspoons and Liters), you should clean them up, since they are no longer needed
- The product option "Factor purchase to stock quantity unit" was removed
- => Use normal product specific QU conversions instead, if needed
- An existing "Factor purchase to stock quantity unit" was automatically migrated to a product specific QU conversion

View File

@@ -0,0 +1,19 @@
> 💡 PHP 8.2 is from now on (additionally to PHP 8.1) supported.
### Stock
- Fixed performance issues affecting all places where quantity unit conversions / prices are involved
- Fixed that the upgrade failed when having improperly defined product specific quantity unit conversions
- Fixed that edited stock entries were not considered in some cases (affecting the product's last price, average price, the price history and the stock reports)
### Shopping list
- Changed that unit prices on the shopping list (table column "Last price (Unit)") are now related to the there selected quantity unit (instead of to the product's QU stock as before)
### Meal plan
- Fixed that the meal plan did initially not display the current week when the settings `MEAL_PLAN_FIRST_DAY_OF_WEEK` and `CALENDAR_FIRST_DAY_OF_WEEK` were set to different values
### API
- Fixed performance issues on the endpoint `/stock/products/{productId}`

View File

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

View File

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

View File

@@ -2,6 +2,8 @@
> ❗ xxxImportant upgrade informationXXX
> 💡 xxxMinor upgrade informationXXX
### New feature: xxxx
- xxx

View File

@@ -6,8 +6,8 @@
"slim/http": "^1.0",
"php-di/php-di": "^7.0.3",
"berrnd/slim-blade-view": "^1.0.0",
"morris/lessql": "dev-php81",
"gettext/gettext": "dev-php81",
"morris/lessql": "dev-php82",
"gettext/gettext": "^4.8.10",
"eluceo/ical": "^2.2.0",
"erusev/parsedown": "^1.7",
"gumlet/php-image-resize": "^2.0",
@@ -20,10 +20,6 @@
{
"type": "vcs",
"url": "https://github.com/berrnd/lessql"
},
{
"type": "vcs",
"url": "https://github.com/berrnd/Gettext"
}
],
"autoload": {
@@ -39,6 +35,7 @@
},
"config": {
"vendor-dir": "packages",
"platform-check": false
"platform-check": false,
"optimize-autoloader": true
}
}

725
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,9 @@
// The settings defined here below
// Either "production", "dev", "demo" or "prerelease"
// When not "production", authentication will be disabled and
// demo data will be populated during database migrations
// When not "production", the application will work in a demo mode which means
// authentication is disabled and some demo data will be generated during the database schema migration
// (pass the query parameter "nodemodata", e.g. https://grocy.example.com/?nodemodata to skip that)
Setting('MODE', 'production');
// The directory name of one of the available localization folders

View File

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

View File

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

View File

@@ -16,11 +16,11 @@ trait GrocycodeTrait
if (GROCY_GROCYCODE_TYPE == '2D')
{
$png = (new DatamatrixFactory())->setCode((string) $grocycode)->setSize($size)->getDatamatrixPngData();
$png = (new DatamatrixFactory())->setCode((string)$grocycode)->setSize($size)->getDatamatrixPngData();
}
else
{
$png = (new BarcodeFactory())->setType('C128')->setCode((string) $grocycode)->setHeight($size)->getBarcodePngData();
$png = (new BarcodeFactory())->setType('C128')->setCode((string)$grocycode)->setHeight($size)->getBarcodePngData();
}
$isDownload = $request->getQueryParam('download', false);

View File

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

View File

@@ -64,7 +64,7 @@ class RecipesController extends BaseController
'recipesResolved' => $this->getRecipesService()->GetRecipesResolved("recipe_id IN (SELECT recipe_id FROM meal_plan_internal_recipe_relation WHERE $mealPlanWhereTimespan)"),
'products' => $this->getDatabase()->products()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'mealplanSections' => $this->getDatabase()->meal_plan_sections()->orderBy('sort_number'),
'usedMealplanSections' => $this->getDatabase()->meal_plan_sections()->where("id IN (SELECT section_id FROM meal_plan WHERE $mealPlanWhereTimespan)")->orderBy('sort_number'),
'weekRecipe' => $this->getDatabase()->recipes()->where("type = 'mealplan-week' AND name = LTRIM(STRFTIME('%Y-%W', DATE('$start')), '0')")->fetch()
@@ -107,7 +107,7 @@ class RecipesController extends BaseController
'quantityUnits' => $this->getDatabase()->quantity_units(),
'userfields' => $this->getUserfieldsService()->GetFields('recipes'),
'userfieldValues' => $this->getUserfieldsService()->GetAllValues('recipes'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'selectedRecipeTotalCosts' => $totalCosts,
'selectedRecipeTotalCalories' => $totalCalories,
'mealplanSections' => $this->getDatabase()->meal_plan_sections()->orderBy('sort_number')
@@ -162,7 +162,7 @@ class RecipesController extends BaseController
'recipes' => $this->getDatabase()->recipes()->where('type', RecipesService::RECIPE_TYPE_NORMAL)->orderBy('name', 'COLLATE NOCASE'),
'recipeNestings' => $this->getDatabase()->recipes_nestings()->where('recipe_id', $recipeId),
'userfields' => $this->getUserfieldsService()->GetFields('recipes'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
}
@@ -176,7 +176,7 @@ class RecipesController extends BaseController
'recipePos' => new \stdClass(),
'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
}
else
@@ -187,7 +187,7 @@ class RecipesController extends BaseController
'recipePos' => $this->getDatabase()->recipes_pos($args['recipePosId']),
'products' => $this->getDatabase()->products()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
}
}

View File

@@ -19,7 +19,7 @@ class StockController extends BaseController
'recipes' => $this->getDatabase()->recipes()->where('type', RecipesService::RECIPE_TYPE_NORMAL)->orderBy('name', 'COLLATE NOCASE'),
'locations' => $this->getDatabase()->locations()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
}
@@ -31,7 +31,7 @@ class StockController extends BaseController
'shoppinglocations' => $this->getDatabase()->shopping_locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('stock')
]);
}
@@ -147,7 +147,7 @@ class StockController extends BaseController
'product' => $product,
'shoppinglocations' => $this->getDatabase()->shopping_locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('product_barcodes')
]);
}
@@ -159,7 +159,7 @@ class StockController extends BaseController
'product' => $product,
'shoppinglocations' => $this->getDatabase()->shopping_locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('product_barcodes')
]);
}
@@ -192,8 +192,8 @@ class StockController extends BaseController
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'barcodes' => $this->getDatabase()->product_barcodes()->orderBy('barcode'),
'quantityunits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityunitsStock' => $this->getDatabase()->quantity_units()->where('id IN (SELECT to_qu_id FROM quantity_unit_conversions_resolved WHERE product_id = :1) OR NOT EXISTS(SELECT 1 FROM stock_log WHERE product_id = :1)', $product->id)->orderBy('name', 'COLLATE NOCASE'),
'referencedQuantityunits' => $this->getDatabase()->quantity_units()->where('active = 1')->where('id IN (SELECT to_qu_id FROM quantity_unit_conversions_resolved WHERE product_id = :1)', $product->id)->orderBy('name', 'COLLATE NOCASE'),
'quantityunitsStock' => $this->getDatabase()->quantity_units()->where('id IN (SELECT to_qu_id FROM cache__quantity_unit_conversions_resolved WHERE product_id = :1) OR NOT EXISTS(SELECT 1 FROM stock_log WHERE product_id = :1)', $product->id)->orderBy('name', 'COLLATE NOCASE'),
'referencedQuantityunits' => $this->getDatabase()->quantity_units()->where('active = 1')->where('id IN (SELECT to_qu_id FROM cache__quantity_unit_conversions_resolved WHERE product_id = :1)', $product->id)->orderBy('name', 'COLLATE NOCASE'),
'shoppinglocations' => $this->getDatabase()->shopping_locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'productgroups' => $this->getDatabase()->product_groups()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'userfields' => $this->getUserfieldsService()->GetFields('products'),
@@ -289,7 +289,7 @@ class StockController extends BaseController
'shoppinglocations' => $this->getDatabase()->shopping_locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('stock')
]);
}
@@ -399,7 +399,7 @@ class StockController extends BaseController
'missingProducts' => $this->getStockService()->GetMissingProducts(),
'shoppingLists' => $this->getDatabase()->shopping_lists()->orderBy('name', 'COLLATE NOCASE'),
'selectedShoppingListId' => $listId,
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'productUserfields' => $this->getUserfieldsService()->GetFields('products'),
'productUserfieldValues' => $this->getUserfieldsService()->GetAllValues('products'),
'productGroupUserfields' => $this->getUserfieldsService()->GetFields('product_groups'),
@@ -438,7 +438,7 @@ class StockController extends BaseController
'shoppingLists' => $this->getDatabase()->shopping_lists()->orderBy('name', 'COLLATE NOCASE'),
'mode' => 'create',
'quantityUnits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('shopping_list')
]);
}
@@ -451,7 +451,7 @@ class StockController extends BaseController
'shoppingLists' => $this->getDatabase()->shopping_lists()->orderBy('name', 'COLLATE NOCASE'),
'mode' => 'edit',
'quantityUnits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved(),
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved(),
'userfields' => $this->getUserfieldsService()->GetFields('shopping_list')
]);
}
@@ -564,7 +564,7 @@ class StockController extends BaseController
'barcodes' => $this->getDatabase()->product_barcodes_comma_separated(),
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved()
'quantityUnitConversionsResolved' => $this->getDatabase()->cache__quantity_unit_conversions_resolved()
]);
}
@@ -599,11 +599,11 @@ class StockController extends BaseController
if (isset($request->getQueryParams()['product']))
{
$product = $this->getDatabase()->products($request->getQueryParams()['product']);
$quantityUnitConversionsResolved = $this->getDatabase()->quantity_unit_conversions_resolved()->where('product_id', $product->id);
$quantityUnitConversionsResolved = $this->getDatabase()->cache__quantity_unit_conversions_resolved()->where('product_id', $product->id);
}
else
{
$quantityUnitConversionsResolved = $this->getDatabase()->quantity_unit_conversions_resolved()->where('product_id IS NULL');
$quantityUnitConversionsResolved = $this->getDatabase()->cache__quantity_unit_conversions_resolved()->where('product_id IS NULL');
}
return $this->renderPage($response, 'quantityunitconversionsresolved', [

View File

@@ -21,29 +21,17 @@ class StockReportsController extends BaseController
$where = "pph.purchased_date >= DATE(DATE('now', 'localtime'), 'start of month')";
}
if (isset($request->getQueryParams()['byGroup']))
$groupBy = 'product';
if (isset($request->getQueryParams()['group-by']) && in_array($request->getQueryParams()['group-by'], ['product', 'productgroup', 'store']))
{
$sql = "
SELECT
pg.id AS id,
pg.name AS name,
SUM(pph.amount * pph.price) AS total
FROM product_price_history pph
JOIN products p
ON pph.product_id = p.id
JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY pg.id
ORDER BY pg.NAME COLLATE NOCASE
";
$groupBy = $request->getQueryParams()['group-by'];
}
else
if ($groupBy == 'product')
{
if (isset($request->getQueryParams()['product_group']) and $request->getQueryParams()['product_group'] != 'all')
if (isset($request->getQueryParams()['product-group']) and $request->getQueryParams()['product-group'] != 'all')
{
$where .= ' AND pg.id = ' . $request->getQueryParams()['product_group'];
$where .= ' AND pg.id = ' . $request->getQueryParams()['product-group'];
}
$sql = "
@@ -53,22 +41,56 @@ class StockReportsController extends BaseController
pg.id AS group_id,
pg.name AS group_name,
SUM(pph.amount * pph.price) AS total
FROM product_price_history pph
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY p.id
ORDER BY p.NAME COLLATE NOCASE
GROUP BY p.id, p.name, pg.id, pg.name
ORDER BY p.name COLLATE NOCASE
";
}
elseif ($groupBy == 'productgroup')
{
$sql = "
SELECT
pg.id AS id,
pg.name AS name,
SUM(pph.amount * pph.price) AS total
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
JOIN product_groups pg
ON p.product_group_id = pg.id
WHERE $where
GROUP BY pg.id, pg.name
ORDER BY pg.name COLLATE NOCASE
";
}
elseif ($groupBy == 'store')
{
$sql = "
SELECT
sl.id AS id,
sl.name AS name,
SUM(pph.amount * pph.price) AS total
FROM products_price_history pph
JOIN products p
ON pph.product_id = p.id
LEFT JOIN shopping_locations sl
ON pph.shopping_location_id = sl.id
WHERE $where
GROUP BY sl.id, sl.name
ORDER BY sl.NAME COLLATE NOCASE
";
}
return $this->renderPage($response, 'stockreportspendings', [
'metrics' => $this->getDatabaseService()->ExecuteDbQuery($sql)->fetchAll(\PDO::FETCH_OBJ),
'productGroups' => $this->getDatabase()->product_groups()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'selectedGroup' => isset($request->getQueryParams()['product_group']) ? $request->getQueryParams()['product_group'] : null,
'byGroup' => isset($request->getQueryParams()['byGroup']) ? $request->getQueryParams()['byGroup'] : null
'selectedGroup' => isset($request->getQueryParams()['product-group']) ? $request->getQueryParams()['product-group'] : null,
'groupBy' => $groupBy
]);
}
}

View File

@@ -32,12 +32,34 @@ class SystemController extends BaseController
if (GROCY_MODE === 'dev' || GROCY_MODE === 'demo' || GROCY_MODE === 'prerelease')
{
$demoDataGeneratorService = DemoDataGeneratorService::getInstance();
$demoDataGeneratorService->PopulateDemoData();
$demoDataGeneratorService->PopulateDemoData(isset($request->getQueryParams()['nodemodata']));
}
return $response->withRedirect($this->AppContainer->get('UrlManager')->ConstructUrl($this->GetEntryPageRelative()));
}
public function Manifest(Request $request, Response $response, array $args)
{
$data = explode('#', base64_decode($request->getQueryParams()['data']));
$manifest = [
'name' => 'Grocy ' . $data[0],
'short_name' => 'Grocy ' . $data[0],
'icons' => [[
'src' => './img/icon-1024.png',
'sizes'=> '1024x1024',
'type' => 'image/png'
]],
'start_url' => $data[1],
'background_color' => '#333131',
'theme_color' => '#333131',
'display' => 'standalone'
];
$response->getBody()->write(json_encode($manifest));
return $response->withHeader('Content-Type', 'application/json');
}
private function GetEntryPageRelative()
{
if (defined('GROCY_ENTRY_PAGE'))

View File

@@ -8,63 +8,34 @@ use LessQL\Result;
class User
{
const PERMISSION_ADMIN = 'ADMIN';
const PERMISSION_BATTERIES = 'BATTERIES';
const PERMISSION_BATTERIES_TRACK_CHARGE_CYCLE = 'BATTERIES_TRACK_CHARGE_CYCLE';
const PERMISSION_BATTERIES_UNDO_CHARGE_CYCLE = 'BATTERIES_UNDO_CHARGE_CYCLE';
const PERMISSION_CALENDAR = 'CALENDAR';
const PERMISSION_CHORES = 'CHORES';
const PERMISSION_CHORE_TRACK_EXECUTION = 'CHORE_TRACK_EXECUTION';
const PERMISSION_CHORE_UNDO_EXECUTION = 'CHORE_UNDO_EXECUTION';
const PERMISSION_EQUIPMENT = 'EQUIPMENT';
const PERMISSION_MASTER_DATA_EDIT = 'MASTER_DATA_EDIT';
const PERMISSION_RECIPES = 'RECIPES';
const PERMISSION_RECIPES_MEALPLAN = 'RECIPES_MEALPLAN';
const PERMISSION_SHOPPINGLIST = 'SHOPPINGLIST';
const PERMISSION_SHOPPINGLIST_ITEMS_ADD = 'SHOPPINGLIST_ITEMS_ADD';
const PERMISSION_SHOPPINGLIST_ITEMS_DELETE = 'SHOPPINGLIST_ITEMS_DELETE';
const PERMISSION_STOCK = 'STOCK';
const PERMISSION_STOCK_CONSUME = 'STOCK_CONSUME';
const PERMISSION_STOCK_EDIT = 'STOCK_EDIT';
const PERMISSION_STOCK_INVENTORY = 'STOCK_INVENTORY';
const PERMISSION_STOCK_OPEN = 'STOCK_OPEN';
const PERMISSION_STOCK_PURCHASE = 'STOCK_PURCHASE';
const PERMISSION_STOCK_TRANSFER = 'STOCK_TRANSFER';
const PERMISSION_TASKS = 'TASKS';
const PERMISSION_TASKS_MARK_COMPLETED = 'TASKS_MARK_COMPLETED';
const PERMISSION_TASKS_UNDO_EXECUTION = 'TASKS_UNDO_EXECUTION';
const PERMISSION_USERS = 'USERS';
const PERMISSION_USERS_CREATE = 'USERS_CREATE';
const PERMISSION_USERS_EDIT = 'USERS_EDIT';
const PERMISSION_USERS_EDIT_SELF = 'USERS_EDIT_SELF';
const PERMISSION_USERS_READ = 'USERS_READ';
public function __construct()

View File

@@ -51,7 +51,8 @@ class UsersController extends BaseController
public function UserSettings(Request $request, Response $response, array $args)
{
return $this->renderPage($response, 'usersettings', [
'languages' => array_filter(scandir(__DIR__ . '/../localization'), function ($item) {
'languages' => array_filter(scandir(__DIR__ . '/../localization'), function ($item)
{
if ($item == '.' || $item == '..')
{
return false;

View File

@@ -11,7 +11,6 @@ abstract class BaseBarcodeLookupPlugin
}
protected $Locations;
protected $QuantityUnits;
final public function Lookup($barcode)

View File

@@ -18,13 +18,9 @@ namespace Grocy\Helpers;
class Grocycode
{
public const PRODUCT = 'p';
public const BATTERY = 'b';
public const CHORE = 'c';
public const RECIPE = 'r';
public const MAGIC = 'grcy';
public function __construct(...$args)
@@ -49,11 +45,8 @@ class Grocycode
}
public static $Items = [self::PRODUCT, self::BATTERY, self::CHORE, self::RECIPE];
private $type;
private $id;
private $extra_data = [];
public static function Validate(string $code)

View File

@@ -1204,11 +1204,6 @@ msgstr "Mai"
msgid "Today"
msgstr "Avui"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"No tots els ingredients de la recepta \"%s\" tenen existències, no s'ha "
"eliminat res"
msgid "Undo task"
msgstr "Desfer tasca"

View File

@@ -33,6 +33,10 @@ msgstr "nombre-integral"
msgid "number-decimal"
msgstr "nombre-decimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "data"

View File

@@ -277,9 +277,7 @@ msgid "Manage master data"
msgstr "Spravovat základní data"
msgid "This will apply to added products"
msgstr ""
"Určuje, jak se změna množství balení produktu zapíše do Seznamu zásob a zda "
"se k této změně vytisknou nálepky na produkt"
msgstr "Tento údaj se zapíše jen pro přidané produkty do zásoby."
msgid "never"
msgstr "nikdy"
@@ -1236,10 +1234,6 @@ msgstr "Nikdy"
msgid "Today"
msgstr "Dnes"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"V zásobě nejsou všechny ingredience receptu „%s“ nic nebude odebráno"
msgid "Undo task"
msgstr "Vrátit úkol"
@@ -2728,7 +2722,7 @@ msgid "Decimal places allowed for prices (display)"
msgstr "Počet desetinných míst pro zobrazení ceny"
msgid "Clear done items"
msgstr "Smazat všechna zaškrtnutá"
msgstr "Odstranit všechna vybraná"
msgid ""
"This shows all to this product directly or indirectly related quantity units"
@@ -2780,7 +2774,7 @@ msgid "Track chore execution now"
msgstr "Splnění povinnosti s dnešním datem"
msgid "Total"
msgstr "Součet"
msgstr "Celkem"
msgid "Apply"
msgstr "Provést"
@@ -2823,12 +2817,12 @@ msgid "Out-of-stock products"
msgstr "Produkty bez zásoby"
msgid "Quantity unit for prices"
msgstr "Množstevní jednotka pro ceny"
msgstr "Měrná jednotka pro ceny"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr "Zobrazované ceny produktu budou odpovídat této množstevní jednotce"
msgstr "Zobrazované ceny produktu budou odpovídat této měrné jednotce"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"

View File

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

View File

@@ -1209,10 +1209,6 @@ msgstr "Aldrig"
msgid "Today"
msgstr "Idag"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Ikke alle ingredienser til opskrift \"%s\" er i beholdningen, intet fjernet"
msgid "Undo task"
msgstr "Fortryd opgave"

View File

@@ -35,6 +35,10 @@ msgstr "tal-heltal"
msgid "number-decimal"
msgstr "tal-decimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "dato"

View File

@@ -1222,11 +1222,6 @@ msgstr "Nie"
msgid "Today"
msgstr "Heute"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nicht alle Zutaten, die vom Rezept \"%s\" benötigt werden, sind vorrätig, es"
" wurde nichts aus dem Bestand entfernt"
msgid "Undo task"
msgstr "Aufgabe rückgängig machen"

View File

@@ -1,6 +1,6 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2020
# Bernd Bestel <bernd@berrnd.de>, 2023
#
msgid ""
msgstr ""
@@ -8,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:43+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2020\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2023\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,6 +33,10 @@ msgstr "Zahl (Ganzzahl)"
msgid "number-decimal"
msgstr "Zahl (mit Dezimalstellen)"
# Number (currency)
msgid "number-currency"
msgstr "Zahl (Währung)"
# Date (without time)
msgid "date"
msgstr "Datum (ohne Zeitanteil)"

View File

@@ -1218,9 +1218,6 @@ msgstr "Ποτέ"
msgid "Today"
msgstr "Σήμερα"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Δεν υπάρχουν όλα τα συστατικά της συνταγής \"%s\", τίποτα δεν αφαιρείται"
msgid "Undo task"
msgstr ""

View File

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

View File

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

View File

@@ -1198,9 +1198,6 @@ msgstr "Never"
msgid "Today"
msgstr "Today"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgid "Undo task"
msgstr "Undo task"

View File

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

View File

@@ -1,6 +1,6 @@
#
# Translators:
# GRBaset, 2022
# GRBaset, 2023
#
msgid ""
msgstr ""
@@ -8,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: GRBaset, 2022\n"
"Last-Translator: GRBaset, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -36,4 +36,4 @@ msgid "hourly"
msgstr "cada hora"
msgid "adaptive"
msgstr "adaptivo"
msgstr "adaptativo"

View File

@@ -7,9 +7,9 @@
# Alan Pucheta <apucheta@protonmail.com>, 2020
# Alberto Martin <ami232@gmail.com>, 2021
# victormce <victormce@gmail.com>, 2021
# GRBaset, 2022
# Matt Sawyers, 2022
# Ricardo Verduguez, 2023
# GRBaset, 2023
#
msgid ""
msgstr ""
@@ -17,7 +17,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 Verduguez, 2023\n"
"Last-Translator: GRBaset, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -120,13 +120,13 @@ msgid "Tomato"
msgstr "Tomate"
msgid "Change towels in the bathroom"
msgstr "Cambiar toallas en el baño"
msgstr "Cambiar las toallas del baño"
msgid "Mop the kitchen floor"
msgstr "Trapear el piso de la cocina."
msgid "Warranty ends"
msgstr "Final de la garantía"
msgstr "La garantía se acaba en"
msgid "TV remote control"
msgstr "Mando a distancia de la televisión"
@@ -138,7 +138,7 @@ msgid "Heat remote control"
msgstr "Mando a distancia de la calefacción"
msgid "Take out the trash"
msgstr "Sacar la basura."
msgstr "Sacar la basura"
msgid "Some good snacks"
msgstr "Cosas de picar"
@@ -405,27 +405,27 @@ msgstr "Ukrainian"
msgid "Kilogram"
msgid_plural "Kilograms"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "Kilogramo"
msgstr[1] "Kilogramos"
msgstr[2] "Kilogramos"
msgid "Romanian"
msgstr ""
msgstr "Rumano"
msgid "Pint"
msgstr ""
msgstr "Pinta"
msgid "Beverages"
msgstr ""
msgstr "Bebidas"
msgid "Ice Cream"
msgstr ""
msgstr "Helado"
msgid "Soda"
msgstr ""
msgstr "Refresco"
msgid "Beer"
msgstr ""
msgstr "Cerveza"
msgid "Estonian"
msgstr ""
msgstr "Estonio"

View File

@@ -2,6 +2,7 @@
# Translators:
# Alberto Martin <ami232@gmail.com>, 2021
# Jose Manuel Ruiz, 2023
# GRBaset, 2023
#
msgid ""
msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: Jose Manuel Ruiz, 2023\n"
"Last-Translator: GRBaset, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -144,4 +145,4 @@ msgstr "Rumano (Rumanía)"
# Estonian
msgid "et_EE"
msgstr ""
msgstr "Estonio"

View File

@@ -2,6 +2,7 @@
# Translators:
# Enrique Lapenta <enriquelap20@gmail.com>, 2020
# Alberto Martin <ami232@gmail.com>, 2021
# GRBaset, 2023
#
msgid ""
msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-29 16:33+0000\n"
"Last-Translator: Alberto Martin <ami232@gmail.com>, 2021\n"
"Last-Translator: GRBaset, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -68,7 +69,7 @@ msgstr "Marcar completadas"
# Edit stock entries
msgid "STOCK_EDIT"
msgstr "STOCK_EDIT"
msgstr "Editar entradas de inventario"
# Transfer
msgid "STOCK_TRANSFER"

View File

@@ -13,9 +13,9 @@
# victormce <victormce@gmail.com>, 2021
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2021
# Juan José González-Abril, 2021
# GRBaset, 2022
# Ricardo Verduguez, 2023
# Jose Manuel Ruiz, 2023
# GRBaset, 2023
#
msgid ""
msgstr ""
@@ -23,7 +23,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: Jose Manuel Ruiz, 2023\n"
"Last-Translator: GRBaset, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/grocy/teams/93189/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -907,7 +907,7 @@ msgid "%s opened"
msgstr "%s abierto"
msgid "Product due"
msgstr "Producto fecha límite"
msgstr "Producto con fecha límite"
msgid "Task due"
msgstr "Tarea pendiente"
@@ -1035,7 +1035,7 @@ msgid "The given date is earlier than today, are you sure?"
msgstr "La fecha introducida es anterior a hoy, ¿está seguro?"
msgid "Product count"
msgstr "Cuenta de producto"
msgstr "Número de productos"
msgid ""
"Type a new product name or barcode and hit TAB or ENTER to start a workflow"
@@ -1078,7 +1078,7 @@ msgid "Are you sure to delete shopping list \"%s\"?"
msgstr "¿Está seguro de querer eliminar la lista de la compra \"%s\"?"
msgid "Average shelf life"
msgstr "Promedio de tiempo de almacenamiento"
msgstr "Tiempo de conservación promedio"
msgid "Spoil rate"
msgstr "Ratio de desperdicio"
@@ -1247,11 +1247,6 @@ msgstr "Nunca"
msgid "Today"
msgstr "Hoy"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"No todos los ingredientes de la receta \"%s\" están en el inventario, nada "
"fue eliminado"
msgid "Undo task"
msgstr "Deshacer tarea"
@@ -1983,7 +1978,7 @@ msgid "Chore journal"
msgstr "Diario de tareas del hogar"
msgid "Track next chore schedule"
msgstr ""
msgstr "Registrar la siguiente ejecución programada de la tarea"
msgid "Mark task as completed"
msgstr "Marcar tarea como completada"
@@ -2010,6 +2005,8 @@ msgid ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgstr ""
"Esta es la unidad de cantidad predeterminada al comprar y al añadir este "
"producto a la lista de la compra"
msgid ""
"Show a warning when the due date of the purchased product is earlier than "
@@ -2039,11 +2036,15 @@ msgid ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgstr ""
"Esta cantidad se usa para el botón de \"consumo rápido\" en la página de "
"resumen de inventario (medido en unidades de inventario)"
msgid ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgstr ""
"Esta cantidad se usa para el botón de \"apertura rápida\" en la página de "
"resumen de inventario (medido en unidades de inventario)"
msgid "Copy"
msgstr "Copiar"
@@ -2338,7 +2339,7 @@ msgid "A product or a note is required"
msgstr "Hace falta un producto o una nota"
msgid "Grocycode"
msgstr ""
msgstr "Grocycode"
msgid "Download"
msgstr "Descargar"
@@ -2351,6 +2352,8 @@ msgid ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
msgstr ""
"El Grocycode es una referencia única a este %s en tu instancia de Grocy - "
"imprímalo en una etiqueta y escanéelo como cualquier otro código de barras"
# Abbreviation for "due date"
msgid "DD"
@@ -2379,7 +2382,7 @@ msgstr "Error al ejecutar WebHook"
# Example: Print *Product* Grocycode on label printer
msgid "Print %s Grocycode on label printer"
msgstr ""
msgstr "Imprimir Grocycode de %s en una impresora de etiquetas"
msgid "Open stock entry label in new window"
msgstr "Abrir etiqueta de entrada de inventario en una ventana nueva"
@@ -2587,7 +2590,7 @@ msgid "Skipped"
msgstr "Omitido"
msgid "Skip next chore schedule"
msgstr "Omitir el siguiente programa de tareas"
msgstr "Omitir la siguiente ejecución programada de la tarea"
msgid "Time"
msgstr "Tiempo"
@@ -2784,10 +2787,10 @@ msgstr ""
"etiqueta."
msgid "Quick open amount"
msgstr ""
msgstr "Cantidad de apertura rápida"
msgid "Track chore execution now"
msgstr ""
msgstr "Registrar ejecución de la tarea del hogar ahora"
msgid "Total"
msgstr "Total"
@@ -2803,9 +2806,9 @@ msgstr "Ayer"
msgid "Last %1$s day"
msgid_plural "Last %1$s days"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "Último %1$s día"
msgstr[1] "Últimos %1$s días"
msgstr[2] "Últimos %1$s días"
msgid "This month"
msgstr "Este mes"
@@ -2823,7 +2826,7 @@ msgid "Reports"
msgstr "Informes"
msgid "Spendings"
msgstr ""
msgstr "Gastos"
msgid "Stock report"
msgstr "Inventario"
@@ -2832,12 +2835,14 @@ msgid "Out-of-stock products"
msgstr "Productos sin existencias"
msgid "Quantity unit for prices"
msgstr ""
msgstr "Unidad para los precios"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr ""
"Cuando se muestren los precios para este producto, se mostrarán en términos "
"de esta unidad de cantidad"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"

View File

@@ -33,6 +33,10 @@ msgstr "Número (entero)"
msgid "number-decimal"
msgstr "Número (decimal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Fecha"

View File

@@ -2,6 +2,7 @@
# Translators:
# Mario Loik <mariomobla@gmail.com>, 2020
# Lauri Lepik, 2023
# aylamz, 2023
#
msgid ""
msgstr ""
@@ -9,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Lauri Lepik, 2023\n"
"Last-Translator: aylamz, 2023\n"
"Language-Team: Estonian (Estonia) (https://app.transifex.com/grocy/teams/93189/et_EE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,7 +32,7 @@ msgid "Candy cupboard"
msgstr "Kommisahtel"
msgid "Tinned food cupboard"
msgstr "Metallpurgitoidu sahtel"
msgstr "Konservisahtel"
msgid "Fridge"
msgstr "Külmkapp"
@@ -106,16 +107,16 @@ msgid "Tomato"
msgstr "Tomat"
msgid "Change towels in the bathroom"
msgstr "Vaheta vannitoas rätikud"
msgstr "Vaheta vetsu rätikud"
msgid "Mop the kitchen floor"
msgstr "Pühi köögi põrand"
msgid "Warranty ends"
msgstr "Garantii lõpeb"
msgstr "Garantii lõppeb"
msgid "TV remote control"
msgstr "TV pult"
msgstr "Teleri pult"
msgid "Alarm clock"
msgstr "Äratuskell"
@@ -148,7 +149,7 @@ msgid "Pizza"
msgstr "Pitsa"
msgid "Spaghetti bolognese"
msgstr "Bolognese spagetid"
msgstr "Pasta bolognese"
msgid "Sandwiches"
msgstr "Võileivad"
@@ -166,7 +167,7 @@ msgid "This is the note content of the recipe ingredient"
msgstr "See on retsepti koostisosade sisu märge"
msgid "Demo User"
msgstr "Demo Kasutaja"
msgstr "Demo kasutaja"
msgid "Gram"
msgid_plural "Grams"
@@ -186,7 +187,7 @@ msgid "Sweets"
msgstr "Maiustused"
msgid "Bakery products"
msgstr "Ahjutooted"
msgstr "Pagaritooted"
msgid "Tinned food"
msgstr "Konserv"
@@ -198,7 +199,7 @@ msgid "Vegetables/Fruits"
msgstr "Köögiviljad/Puuviljad"
msgid "Refrigerated products"
msgstr "Külmutatud Tooted"
msgstr "Külmutatud tooted"
msgid "Coffee machine"
msgstr "Kohvimasin"
@@ -222,7 +223,7 @@ msgid "Milk"
msgstr "Piim"
msgid "Chocolate sauce"
msgstr "Šokolaadi kaste"
msgstr "Šokolaadikaste"
msgid "Milliliters"
msgstr "Millimeetrit"
@@ -249,7 +250,7 @@ msgid "Russian"
msgstr "Vene"
msgid "Vacuum the living room floor"
msgstr "Korista tolmuimejaga elutuba"
msgstr "Korista elutuba tolmuimejaga"
msgid "Clean the litter box"
msgstr "Korista liivakast"
@@ -267,7 +268,7 @@ msgid "Milk Chocolate"
msgstr "Piimašokolaad"
msgid "Dark Chocolate"
msgstr "Must Šokolaad"
msgstr "Must šokolaad"
msgid "Slice"
msgid_plural "Slices"
@@ -275,16 +276,16 @@ msgstr[0] "Viil"
msgstr[1] "Viilu"
msgid "Example userentity"
msgstr "Näidis kasutajasisend"
msgstr "Näidis kasutajaolem"
msgid "This is an example user entity..."
msgstr "See on kasutaja sisendi näide..."
msgstr "See on kasutajaolemi näide..."
msgid "Custom field"
msgstr "Kohandatud väli"
msgstr "Kohandatav väli"
msgid "Example field value..."
msgstr "Näidisvälja väärtus..."
msgstr "Välja näidisväärtus..."
msgid "Waffle rolls"
msgstr "Vahvlirullid"
@@ -320,7 +321,7 @@ msgid "This is a note"
msgstr "See on märge"
msgid "Freezer"
msgstr "Külmik"
msgstr "Sügavkülmik"
msgid "Hungarian"
msgstr "Ungari"
@@ -411,4 +412,4 @@ msgid "Beer"
msgstr "Õlu"
msgid "Estonian"
msgstr ""
msgstr "eesti"

View File

@@ -1,6 +1,7 @@
#
# Translators:
# Lauri Lepik, 2023
# aylamz, 2023
#
msgid ""
msgstr ""
@@ -8,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: Lauri Lepik, 2023\n"
"Last-Translator: aylamz, 2023\n"
"Language-Team: Estonian (Estonia) (https://app.transifex.com/grocy/teams/93189/et_EE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -143,4 +144,4 @@ msgstr "Rumeenia keel"
# Estonian
msgid "et_EE"
msgstr ""
msgstr "eesti keel"

View File

@@ -1,6 +1,7 @@
#
# Translators:
# Lauri Lepik, 2023
# aylamz, 2023
#
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: Lauri Lepik, 2023\n"
"Last-Translator: aylamz, 2023\n"
"Language-Team: Estonian (Estonia) (https://app.transifex.com/grocy/teams/93189/et_EE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,10 +28,10 @@ msgid "transfer_to"
msgstr "kategooriasse üleviimine"
msgid "consume"
msgstr "tarbimine"
msgstr "tarbi"
msgid "inventory-correction"
msgstr "invetuuri-parandus"
msgstr "inventuuri-parandus"
msgid "product-opened"
msgstr "toode-avatud"

File diff suppressed because it is too large Load Diff

View File

@@ -33,6 +33,10 @@ msgstr "number-terviklik"
msgid "number-decimal"
msgstr "number-kümnend"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "kuupäev"

View File

@@ -1204,9 +1204,6 @@ msgstr "Ei koskaan"
msgid "Today"
msgstr "Tänään"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Reseptin \"%s\" kaikkia ainesosia ei ole varastossa, ei poistettu mitään"
msgid "Undo task"
msgstr "Kumoa tehtävä"

View File

@@ -36,6 +36,10 @@ msgstr "numero-kokonaisluku"
msgid "number-decimal"
msgstr "numero-desimaali"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "päivämäärä"

View File

@@ -1265,11 +1265,6 @@ msgstr "Jamais"
msgid "Today"
msgstr "Aujourd'hui"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Des ingrédients de la recette \"%s\" sont manquants,\n"
"rien n'est retiré"
msgid "Undo task"
msgstr "Annuler"

View File

@@ -37,6 +37,10 @@ msgstr "nombre entier"
msgid "number-decimal"
msgstr "nombre décimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "date"

View File

@@ -1218,9 +1218,6 @@ msgstr "אף פעם"
msgid "Today"
msgstr "היום"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "לא כל הרכיבים של המתכון „%s” נמצאים במלאי, לא הוסר דבר"
msgid "Undo task"
msgstr "ביטול ביצוע משימה"

View File

@@ -34,6 +34,10 @@ msgstr "מספר שלם"
msgid "number-decimal"
msgstr "מספר עשרוני"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "תאריך (בלי שעה)"

View File

@@ -1216,11 +1216,6 @@ msgstr "Soha"
msgid "Today"
msgstr "Ma"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nincs a \"%s\" recept összes hozzávalója készleten, így nem használtunk fel "
"semmit se"
msgid "Undo task"
msgstr "Feladat visszavonása"

View File

@@ -35,6 +35,10 @@ msgstr "egész szám"
msgid "number-decimal"
msgstr "decimális szám"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "dátum"

View File

@@ -6,6 +6,7 @@
# Andrea Raineri, 2022
# Moltivie Denied <major2015usa@gmail.com>, 2022
# Davide Casella, 2023
# Claudio Arseni <claudio.arseni@gmail.com>, 2023
#
msgid ""
msgstr ""
@@ -13,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Davide Casella, 2023\n"
"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>, 2023\n"
"Language-Team: Italian (https://app.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -424,4 +425,4 @@ msgid "Beer"
msgstr "Birra"
msgid "Estonian"
msgstr ""
msgstr "Estone"

View File

@@ -5,6 +5,7 @@
# Moltivie Denied <major2015usa@gmail.com>, 2022
# Martino Falorni, 2023
# Davide Casella, 2023
# Claudio Arseni <claudio.arseni@gmail.com>, 2023
#
msgid ""
msgstr ""
@@ -12,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: Davide Casella, 2023\n"
"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>, 2023\n"
"Language-Team: Italian (https://app.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -147,4 +148,4 @@ msgstr "Rumeno"
# Estonian
msgid "et_EE"
msgstr ""
msgstr "et_EE"

View File

@@ -9,7 +9,10 @@
# Walter Palagi, 2022
# Moltivie Denied <major2015usa@gmail.com>, 2022
# Martino Falorni, 2023
# Saul il, 2023
# Davide G., 2023
# Davide Casella, 2023
# Claudio Arseni <claudio.arseni@gmail.com>, 2023
#
msgid ""
msgstr ""
@@ -17,7 +20,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Davide Casella, 2023\n"
"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>, 2023\n"
"Language-Team: Italian (https://app.transifex.com/grocy/teams/93189/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -95,10 +98,10 @@ msgid "Shopping list"
msgstr "Lista della spesa"
msgid "Chore tracking"
msgstr "Tracciamento delle faccende domestiche"
msgstr "Tracciamento delle faccende"
msgid "Battery tracking"
msgstr "Dati batterie"
msgstr "Dati sulle batterie"
msgid "Locations"
msgstr "Posizioni"
@@ -125,7 +128,7 @@ msgid "Last tracked"
msgstr "Ultima esecuzione"
msgid "Battery"
msgstr "Batterie"
msgstr "Batteria"
msgid "Last charged"
msgstr "Ultima ricarica"
@@ -215,7 +218,7 @@ msgid "Create product"
msgstr "Aggiungi prodotto"
msgid "Barcode(s)"
msgstr "Codice(i) a barre"
msgstr "Codice a barre"
msgid "Minimum stock amount"
msgstr "Quantità minima in dispensa"
@@ -287,19 +290,19 @@ msgid "Login"
msgstr "Accesso"
msgid "Username"
msgstr "Nome Utente"
msgstr "Nome utente"
msgid "Password"
msgstr "Password"
msgid "Invalid credentials, please try again"
msgstr "Credenziali non valide, per favore riprova"
msgstr "Credenziali non valide, riprovare"
msgid "Are you sure to delete battery \"%s\"?"
msgstr "Sei sicuro di voler eliminare la batteria \"%s\"?"
msgid "Yes"
msgstr "Si"
msgstr "Sì"
msgid "No"
msgstr "No"
@@ -1243,11 +1246,6 @@ msgstr "Mai"
msgid "Today"
msgstr "Oggi"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Non tutti gli ingredienti della ricetta \"%s\" sono disponibili in dispensa,"
" nulla è stato rimosso"
msgid "Undo task"
msgstr "Annulla attività"
@@ -2359,6 +2357,8 @@ msgid ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
msgstr ""
"Grocycode è un riferimento univoco a questo %s nell'istanza di Grocy. "
"Stampalo su un'etichetta e scansionalo come qualsiasi altro codice a barre."
# Abbreviation for "due date"
msgid "DD"
@@ -2387,7 +2387,7 @@ msgstr "Errore durante l'esecuzione di WebHook"
# Example: Print *Product* Grocycode on label printer
msgid "Print %s Grocycode on label printer"
msgstr ""
msgstr "Stampa il Grocycode di %s su una stampante per etichette"
msgid "Open stock entry label in new window"
msgstr "Apri l'etichetta della dispensa in una nuova finestra"
@@ -2726,14 +2726,14 @@ msgstr ""
"consumate"
msgid "Move on open"
msgstr "Avanti apri"
msgstr "Muovi all'apertura"
msgid ""
"When enabled, on marking this product as opened, the corresponding amount "
"will be moved to the default consume location"
msgstr ""
"Quando abilitato, selezionando questo prodotto come aperto, l'attuale "
"quantita' verra' spostata nella location di consumo predefinita"
"Quando abilitato, selezionando questo prodotto come aperto, la rispettiva "
"quantità verrà spostata nella location di consumo predefinita"
msgid "Moved to %1$s"
msgstr "Spostato a %1$s"
@@ -2751,27 +2751,31 @@ msgid ""
"This shows all to this product directly or indirectly related quantity units"
" and their derived conversion factors"
msgstr ""
"Mostra tutte le unità di quantità direttamente o indirettamente correlate a "
"questo prodotto e i relativi fattori di conversione derivati"
msgid "Show resolved conversions"
msgstr ""
msgstr "Mostra le conversioni risolte"
msgid "QU conversions resolved"
msgstr ""
msgstr "UQ di conversioni risolte"
msgid "Product specifc QU conversions"
msgstr ""
msgstr "UQ di conversioni specifiche per il prodotto"
msgid "Default quantity unit consume"
msgstr ""
msgstr "Quantità di unità di acquisto predefinita"
msgid "This is the default quantity unit used when consuming this product"
msgstr ""
"È l'unità di quantità predefinita utilizzata per il consumo di questo "
"prodotto"
msgid "Add to meal plan"
msgstr ""
msgstr "Aggiungi al piano alimentare"
msgid "Successfully added the recipe to the meal plan"
msgstr ""
msgstr "La ricetta è stata aggiunta con successo al piano pasti"
msgid "Reprint stock entry label"
msgstr ""
@@ -2786,7 +2790,7 @@ msgid ""
msgstr ""
msgid "Quick open amount"
msgstr ""
msgstr "Quantità per consumo rapido"
msgid "Track chore execution now"
msgstr "Traccia l'esecuzione delle faccende ora"

View File

@@ -33,6 +33,10 @@ msgstr "numero intero"
msgid "number-decimal"
msgstr "numero decimale"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "data"

View File

@@ -1157,9 +1157,6 @@ msgstr "期限なし"
msgid "Today"
msgstr "今日"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
msgid "Undo task"
msgstr ""

View File

@@ -34,6 +34,10 @@ msgstr "整数"
msgid "number-decimal"
msgstr "小数"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "日付"

View File

@@ -1169,9 +1169,6 @@ msgstr "Never"
msgid "Today"
msgstr "오늘"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgid "Undo task"
msgstr "작업 되돌리기"

View File

@@ -33,6 +33,10 @@ msgstr "number-integral"
msgid "number-decimal"
msgstr "number-decimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "date"

View File

@@ -1238,9 +1238,6 @@ msgstr "Niekada"
msgid "Today"
msgstr "Šiandien"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Ne visi recepto „%s“ ingredientai yra sandėlyje, nieko nėra pašalinta"
msgid "Undo task"
msgstr "Anuliuoti užduotį"

View File

@@ -33,6 +33,10 @@ msgstr "skaičių integralas"
msgid "number-decimal"
msgstr "skaičius po kablelio"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "data"

View File

@@ -15,6 +15,7 @@
# Daan Breur <daanbreur@gmail.com>, 2021
# Luc Donderwinkel, 2022
# 36d163aedfa797f6b2721cfc9bae9c42_308433e, 2023
# Matthijs <matthijs@spamkip.com>, 2023
#
msgid ""
msgstr ""
@@ -22,7 +23,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: 36d163aedfa797f6b2721cfc9bae9c42_308433e, 2023\n"
"Last-Translator: Matthijs <matthijs@spamkip.com>, 2023\n"
"Language-Team: Dutch (https://app.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -402,26 +403,26 @@ msgstr "Oekraïens"
msgid "Kilogram"
msgid_plural "Kilograms"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Kilogram"
msgstr[1] "Kilogrammen"
msgid "Romanian"
msgstr "Roemeense"
msgid "Pint"
msgstr ""
msgstr "Pint"
msgid "Beverages"
msgstr ""
msgstr "Dranken"
msgid "Ice Cream"
msgstr ""
msgstr "IJs"
msgid "Soda"
msgstr ""
msgstr "Frisdrank"
msgid "Beer"
msgstr ""
msgstr "Bier"
msgid "Estonian"
msgstr ""
msgstr "Estisch"

View File

@@ -2,7 +2,7 @@
# Translators:
# Stan Overgauw <stan.overgauw@gmail.com>, 2020
# Luc Donderwinkel, 2022
# 36d163aedfa797f6b2721cfc9bae9c42_308433e, 2023
# Matthijs <transifex.com@brievenbus.6689.nl>, 2023
#
msgid ""
msgstr ""
@@ -10,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2020-08-31 19:11+0000\n"
"Last-Translator: 36d163aedfa797f6b2721cfc9bae9c42_308433e, 2023\n"
"Last-Translator: Matthijs <transifex.com@brievenbus.6689.nl>, 2023\n"
"Language-Team: Dutch (https://app.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -121,7 +121,7 @@ msgstr "Hebreeuws"
# Tamil
msgid "ta"
msgstr "Tamils"
msgstr "Tamil"
# Finnish
msgid "fi"
@@ -141,8 +141,8 @@ msgstr "Oekraïens"
# Romanian
msgid "ro_RO"
msgstr "ro_RO"
msgstr "Roemeens"
# Estonian
msgid "et_EE"
msgstr ""
msgstr "Estisch"

View File

@@ -32,6 +32,7 @@
# Pieter Vantorre, 2022
# Luc Donderwinkel, 2022
# vanhoof.tech, 2023
# Matthijs <matthijs@spamkip.com>, 2023
#
msgid ""
msgstr ""
@@ -39,7 +40,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: vanhoof.tech, 2023\n"
"Last-Translator: Matthijs <matthijs@spamkip.com>, 2023\n"
"Language-Team: Dutch (https://app.transifex.com/grocy/teams/93189/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -385,7 +386,7 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "%1$s %2$s verwijderd uit de voorraad"
msgid "About Grocy"
msgstr ""
msgstr "Over Grocy"
msgid "Close"
msgstr "Sluit"
@@ -1243,11 +1244,6 @@ msgstr "Nooit"
msgid "Today"
msgstr "Vandaag"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Niet alle ingrediënten van het recept \"%s\" zijn op voorraad, er is niets "
"verwijderd"
msgid "Undo task"
msgstr "Taak ongedaan maken"
@@ -1353,7 +1349,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled at the same time "
"(based on the start date) every %s days"
msgstr[0] ""
"Dit betekent dat de volgende uitvoering van dit klusje iedere dag op "
"hetzelfde tijdstip (gebaseerd op de startdatum) gepland wordt"
msgstr[1] ""
"Dit betekent dat de volgende uitvoering van dit klusje iedere %s dagen op "
"hetzelfde tijdstip (gebaseerd op de startdatum) gepland wordt"
msgid ""
"This means the next execution of this chore is scheduled %s hour after the "
@@ -1362,7 +1362,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled %s hours after the "
"last execution"
msgstr[0] ""
"Dit betekent dat de uitvoering van dit klusje %s uur na de laatste "
"uitvoering gepland wordt"
msgstr[1] ""
"Dit betekent dat de uitvoering van dit klusje %s uur na de laatste "
"uitvoering gepland wordt"
msgid ""
"This means the next execution of this chore is scheduled every week on the "
@@ -1371,7 +1375,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s weeks on "
"the selected weekdays"
msgstr[0] ""
"Dit betekent dat de volgende uitvoering van dit klusje elke week gepland "
"staat voor de geselecteerde weekdagen"
msgstr[1] ""
"Dit betekent dat de volgende uitvoering van dit klusje elke %s weken gepland"
" staat voor de geselecteerde weekdagen"
msgid ""
"This means the next execution of this chore is scheduled on the selected day"
@@ -1380,7 +1388,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled on the selected day"
" every %s months"
msgstr[0] ""
"Dit betekent dat de volgende uitvoering van dit klusje iedere maand op de "
"geselecteerde dag gepland staat"
msgstr[1] ""
"Dit betekent dat de volgende uitvoering van dit klusje iedere %s maanden op "
"de geselecteerde dag gepland staat"
msgid "This means the next execution of this chore is not scheduled"
msgstr ""
@@ -1492,7 +1504,7 @@ msgid "Price factor"
msgstr "Prijsfactor"
msgid "Do you find Grocy useful?"
msgstr ""
msgstr "Vind je Grocy nuttig?"
msgid "Say thanks"
msgstr "Zeg bedankt"
@@ -1510,7 +1522,7 @@ msgid "Output"
msgstr "Uitvoer"
msgid "Energy"
msgstr ""
msgstr "Energie"
msgid "Per stock quantity unit"
msgstr "Voorraadhoeveelheidseenheid"
@@ -1578,7 +1590,11 @@ msgid_plural ""
"This means the next execution of this chore is scheduled every %s years on "
"the same day (based on the start date)"
msgstr[0] ""
"Dit betekent dat de volgende uitvoering van dit klusje ieder jaar op "
"dezelfde dag (op basis van de startdatum) gepland staat"
msgstr[1] ""
"Dit betekent dat de volgende uitvoering van dit klusje iedere %s jaar op "
"dezelfde dag (op basis van de startdatum) gepland staat"
msgid "Transfer"
msgstr "Overdragen"
@@ -1623,6 +1639,9 @@ msgid ""
"Camera access is only possible when supported and allowed by your browser "
"and when Grocy is served via a secure (https://) connection"
msgstr ""
"Camera-toegang is alleen mogelijk als dit ondersteund en toegestaan is door "
"je browser, en als Grocy via een beveiligde (https://) verbinding wordt "
"geopend"
msgid "Keep screen on"
msgstr "Houd scherm aan"
@@ -1944,7 +1963,7 @@ msgid "Chore journal"
msgstr "Klusjesdagboek"
msgid "Track next chore schedule"
msgstr ""
msgstr "Voer volgend klusje uit"
msgid "Mark task as completed"
msgstr "Markeer taak als gedaan"
@@ -1971,6 +1990,8 @@ msgid ""
"This is the default quantity unit used on purchase and when adding this "
"product to the shopping list"
msgstr ""
"Dit is de standaardhoeveelheid die wordt gebruikt bij aankoop en bij het "
"toevoegen van dit product aan de boodschappenlijst"
msgid ""
"Show a warning when the due date of the purchased product is earlier than "
@@ -1998,11 +2019,15 @@ msgid ""
"This amount is used for the \"quick consume button\" on the stock overview "
"page (related to quantity unit stock)"
msgstr ""
"Deze hoeveelheid wordt gebruikt voor de \"snel verbruiken knop\" op de "
"voorraadoverzichtspagina (gerelateerd aan hoeveelheidsvoorraad)"
msgid ""
"This amount is used for the \"quick open button\" on the stock overview page"
" (related to quantity unit stock)"
msgstr ""
"Deze hoeveelheid wordt gebruikt voor de \"snel openen knop\" op de "
"voorraadoverzichtspagina (gerelateerd aan hoeveelheidsvoorraad)"
msgid "Copy"
msgstr "Kopieer"
@@ -2293,19 +2318,21 @@ msgid "A product or a note is required"
msgstr "Een product of notitie is nodig"
msgid "Grocycode"
msgstr ""
msgstr "Grocycode"
msgid "Download"
msgstr "Download"
# Example: Download *Product* Grocycode
msgid "Download %s Grocycode"
msgstr ""
msgstr "%s Grocycode downloaden"
msgid ""
"Grocycode is a unique referer to this %s in your Grocy instance - print it "
"onto a label and scan it like any other barcode"
msgstr ""
"Grocycode is een unieke verwijzing naar dit %s in je Grocy omgeving - print "
"het op een label en scan het net als iedere andere barcode"
# Abbreviation for "due date"
msgid "DD"
@@ -2334,7 +2361,7 @@ msgstr "Fout tijdens het uitvoeren van WebHook"
# Example: Print *Product* Grocycode on label printer
msgid "Print %s Grocycode on label printer"
msgstr ""
msgstr "Print %s Grocycode op labelprinter"
msgid "Open stock entry label in new window"
msgstr "Open voorraad invoer label in een nieuw venster"
@@ -2559,6 +2586,8 @@ msgid ""
"This means the next execution of this chore is scheduled dynamically based "
"on the past average execution frequency"
msgstr ""
"Dit betekent dat de volgende uitvoering van dit klusje dynamisch wordt "
"gepland op basis van de gemiddelde voorgaande uitvoeringen"
msgid "Average execution frequency"
msgstr "Gemiddelde uitvoeringsfrequentie"
@@ -2690,13 +2719,13 @@ msgstr ""
"hoeveelheidseenheden en hun afgeleide conversiefactoren"
msgid "Show resolved conversions"
msgstr ""
msgstr "Toon opgeloste conversies"
msgid "QU conversions resolved"
msgstr ""
msgstr "Hoeveelheidseenheid conversies opgelost"
msgid "Product specifc QU conversions"
msgstr ""
msgstr "Product-specifieke hoeveelheidseenheid conversies"
msgid "Default quantity unit consume"
msgstr "Standaard verbruikte hoeveelheidseenheid"
@@ -2728,61 +2757,63 @@ msgstr ""
"bijbehorende standaard vervaldagen) het label opnieuw afdrukken"
msgid "Quick open amount"
msgstr ""
msgstr "Snel deze hoeveelheid openen"
msgid "Track chore execution now"
msgstr ""
msgstr "Voer klusje nu uit"
msgid "Total"
msgstr ""
msgstr "Totaal"
msgid "Apply"
msgstr ""
msgstr "Toepassen"
msgid "Custom range"
msgstr ""
msgstr "Aangepast bereik"
msgid "Yesterday"
msgstr ""
msgstr "Gisteren"
msgid "Last %1$s day"
msgid_plural "Last %1$s days"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Laatste %1$s dag"
msgstr[1] "Laatste %1$s dagen"
msgid "This month"
msgstr ""
msgstr "Deze maand"
msgid "Last month"
msgstr ""
msgstr "Vorige maand"
msgid "This year"
msgstr ""
msgstr "Dit jaar"
msgid "Last year"
msgstr ""
msgstr "Vorig jaar"
msgid "Reports"
msgstr ""
msgstr "Rapporten"
msgid "Spendings"
msgstr ""
msgstr "Uitgaven"
msgid "Stock report"
msgstr ""
msgstr "Voorraadrapport"
msgid "Out-of-stock products"
msgstr ""
msgstr "Producten niet op voorraad"
msgid "Quantity unit for prices"
msgstr ""
msgstr "Hoeveelheidseenheid voor prijzen"
msgid ""
"When displaying prices for this product, they will be related to this "
"quantity unit"
msgstr ""
"Bij het tonen van prijzen voor dit product, worden deze gerelateerd aan deze"
" hoeveelheidseenheid"
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Dit betekend dat 1 label wordt geprint"
msgstr[1] "Dit betekend dat %1$s labels worden geprint"

View File

@@ -33,6 +33,10 @@ msgstr "Nummer (geheel getal)"
msgid "number-decimal"
msgstr "Nummer (decimaal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Datum (zonder tijd)"

View File

@@ -1206,11 +1206,6 @@ msgstr "Aldri"
msgid "Today"
msgstr "I dag"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Ikke alle ingrediensene i oppskriften \"%s\" er på lager, så ingenting er "
"fjernet!"
msgid "Undo task"
msgstr "Angre oppgave"

View File

@@ -33,6 +33,10 @@ msgstr "number-integral"
msgid "number-decimal"
msgstr "number-decimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "date"

View File

@@ -10,6 +10,7 @@
# Kamila Frej, 2022
# Michał G, 2022
# Oskar Sawaryn, 2023
# orl0pl, 2023
#
msgid ""
msgstr ""
@@ -17,7 +18,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: Oskar Sawaryn, 2023\n"
"Last-Translator: orl0pl, 2023\n"
"Language-Team: Polish (https://app.transifex.com/grocy/teams/93189/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -422,7 +423,7 @@ msgid "Romanian"
msgstr "Rumuński"
msgid "Pint"
msgstr ""
msgstr "Pół kwarty"
msgid "Beverages"
msgstr "Napoje"
@@ -431,10 +432,10 @@ msgid "Ice Cream"
msgstr "Lody"
msgid "Soda"
msgstr ""
msgstr "Soda"
msgid "Beer"
msgstr "Piwo"
msgid "Estonian"
msgstr ""
msgstr "Estoński"

View File

@@ -19,6 +19,7 @@
# Kamila Frej, 2022
# Michał G, 2022
# Oskar Sawaryn, 2023
# orl0pl, 2023
#
msgid ""
msgstr ""
@@ -26,7 +27,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: Oskar Sawaryn, 2023\n"
"Last-Translator: orl0pl, 2023\n"
"Language-Team: Polish (https://app.transifex.com/grocy/teams/93189/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -384,7 +385,7 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "%2$s - %1$s - usunięto z zapasów"
msgid "About Grocy"
msgstr ""
msgstr "O Grocy"
msgid "Close"
msgstr "Zamknij"
@@ -895,6 +896,9 @@ msgid ""
"The first item in this list would be picked by the default rule consume rule"
" (Opened first, then first due first, then first in first out)"
msgstr ""
"Pierwszy element na tej liście zostanie wybrany domyślną regułą, którą jest "
"\"Otwarte najpierw, następnie najszybciej przeterminowane, następnie "
"pierwsze weszło-pierwsze wyszło\""
msgid "Mark %1$s of %2$s as open"
msgstr "%2$s - %1$s - oznacz jako otwarte"
@@ -1249,11 +1253,6 @@ msgstr "Nigdy"
msgid "Today"
msgstr "Dzisiaj"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nie wszystkie składniki przepisu \"%s\" są dostępne, nic nie zostało "
"usunięte"
msgid "Undo task"
msgstr "Cofnij zadanie"

View File

@@ -36,6 +36,10 @@ msgstr "Liczba (całkowita)"
msgid "number-decimal"
msgstr "Liczba (dziesiętna)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Data (bez czasu)"

View File

@@ -3,7 +3,7 @@
# Danilo Vieira <cebikyn@gmail.com>, 2019
# Jefferson Brito Passos dos Santos <jeffersantoss@gmail.com>, 2019
# Ryan Monteiro, 2022
# Arthur Rodrigues <araruna@gmail.com>, 2022
# Arthur Rodrigues <transifex@araruna.me>, 2022
# Aurelio Barreto <aurelio@aureliobarreto.com>, 2023
#
msgid ""

View File

@@ -133,10 +133,10 @@ msgid "Battery"
msgstr "Bateria"
msgid "Last charged"
msgstr "Última Carga"
msgstr "Último Carregamento"
msgid "Next planned charge cycle"
msgstr "Próximo ciclo de carga prevista"
msgstr "Próxima recarga"
msgid "Best before"
msgstr "Melhor consumido antes de "
@@ -572,7 +572,7 @@ msgstr "Diários"
msgid "0 means suggestions for the next charge cycle are disabled"
msgstr ""
"0 significa que as sugestões para o próximo ciclo de carga estão "
"0 (zero) significa que as sugestões para o próximo ciclo de carga estão "
"desabilitados"
msgid "Charge cycle interval (days)"
@@ -913,7 +913,7 @@ msgid "Chore due"
msgstr "Ativ."
msgid "Battery charge cycle due"
msgstr "Vence carga"
msgstr "Carregar"
msgid "Show clock in header"
msgstr "Exibir relógio no cabeçalho"
@@ -1240,11 +1240,6 @@ msgstr "Nunca"
msgid "Today"
msgstr "Hoje"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nem todos os ingredientes da receita \"%s\" estão no estoque, nada foi "
"removido"
msgid "Undo task"
msgstr "Desfazer tarefa"
@@ -1976,7 +1971,7 @@ msgid "Mark task as completed"
msgstr "Marcar a tarefa como concluída"
msgid "Track charge cycle"
msgstr "Rastrear ciclo de recarga"
msgstr "Atualizar ciclo de recarga"
msgid "Battery journal"
msgstr "Diário"

View File

@@ -1,7 +1,7 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# Arthur Rodrigues <araruna@gmail.com>, 2022
# Arthur Rodrigues <transifex@araruna.me>, 2022
# Fernando Luiz Bonifácio de Oliveira, 2022
#
msgid ""
@@ -35,6 +35,10 @@ msgstr "Número (inteiro)"
msgid "number-decimal"
msgstr "Número (decimal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Data (sem horário)"

View File

@@ -1226,11 +1226,6 @@ msgstr "Nunca"
msgid "Today"
msgstr "Hoje"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
"Nem todos os ingredientes da receita \"%s\" estão em stock, nada foi "
"removido"
msgid "Undo task"
msgstr "Desfazer tarefa"

View File

@@ -35,6 +35,10 @@ msgstr "Número (inteiro)"
msgid "number-decimal"
msgstr "Número (décimal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Data (sem horas)"

View File

@@ -1224,9 +1224,6 @@ msgstr "Niciodată"
msgid "Today"
msgstr "Astăzi"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Nu toate ingredientele rețetei \"%s\" sunt în stoc, nimic eliminat"
msgid "Undo task"
msgstr "Anulați sarcina"

View File

@@ -33,6 +33,10 @@ msgstr "Număr (integral)"
msgid "number-decimal"
msgstr "Număr (decimal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Dată (fără timp)"

View File

@@ -7,9 +7,9 @@
# unwarkz <git@unwar.kz>, 2021
# J K <su1ka.box@gmail.com>, 2021
# Pavel Pletenev <cpp.create@gmail.com>, 2021
# Sergey Kodolov, 2022
# Dmitry Galyshev, 2022
# Юрий Куклин, 2022
# Sergey Kodolov, 2023
#
msgid ""
msgstr ""
@@ -17,7 +17,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: Юрий Куклин, 2022\n"
"Last-Translator: Sergey Kodolov, 2023\n"
"Language-Team: Russian (https://app.transifex.com/grocy/teams/93189/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -376,7 +376,7 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "Убрано %1$s из %2$s из запаса"
msgid "About Grocy"
msgstr ""
msgstr "О Grocy"
msgid "Close"
msgstr "Закрыть"
@@ -1253,9 +1253,6 @@ msgstr "Никогда"
msgid "Today"
msgstr "Сегодня"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Не все ингредиенты рецепта \"%s\" есть в запасе, ничего не изъято"
msgid "Undo task"
msgstr "Отменить задание"
@@ -1535,7 +1532,7 @@ msgid "Price factor"
msgstr "Коэффициент цены"
msgid "Do you find Grocy useful?"
msgstr ""
msgstr "Вы находите Grocy полезным?"
msgid "Say thanks"
msgstr "Сказать спасибо"
@@ -1553,7 +1550,7 @@ msgid "Output"
msgstr "Вывод"
msgid "Energy"
msgstr ""
msgstr "Энергетическая ценность"
msgid "Per stock quantity unit"
msgstr "На единицу измерения в запасе"
@@ -1668,6 +1665,9 @@ 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 "Держать экран включенным"
@@ -1874,16 +1874,16 @@ msgid "Unauthorized"
msgstr "Не авторизированы"
msgid "Error source"
msgstr ""
msgstr "Источник ошибок"
msgid "Error message"
msgstr "Сообщение об ошибке"
msgid "Stack trace"
msgstr ""
msgstr "Трассировки стека"
msgid "Easy error info copy & paste (for reporting)"
msgstr ""
msgstr "Простое копирование и вставка информации об ошибках (для отчетности)"
msgid "This page does not exist"
msgstr "Эта страница не существует"
@@ -2738,10 +2738,10 @@ msgid "Track chore execution now"
msgstr ""
msgid "Total"
msgstr ""
msgstr "Всего"
msgid "Apply"
msgstr ""
msgstr "Применить"
msgid "Custom range"
msgstr ""
@@ -2766,13 +2766,13 @@ msgid "This year"
msgstr ""
msgid "Last year"
msgstr ""
msgstr "Прошлый год"
msgid "Reports"
msgstr ""
msgstr "Отчеты"
msgid "Spendings"
msgstr ""
msgstr "Расходы"
msgid "Stock report"
msgstr ""

View File

@@ -35,6 +35,10 @@ msgstr "Число (целочисленное)"
msgid "number-decimal"
msgstr "Число (дробное)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Дата (без времени)"

View File

@@ -1228,9 +1228,6 @@ msgstr "Nikdy"
msgid "Today"
msgstr "Dnes"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Nie všetky suroviny v recepte \"%s\" sú v zásobe, nič nebude odstránené"
msgid "Undo task"
msgstr "Zrušiť úlohu"

View File

@@ -34,6 +34,10 @@ msgstr "číslo-celé"
msgid "number-decimal"
msgstr "číslo-desatinné"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "dátum"

View File

@@ -1,10 +1,14 @@
#
# Translators:
# Anže Pintar <anze.pintar2@gmail.com>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Anže Pintar <anze.pintar2@gmail.com>, 2023\n"
"Language-Team: Slovenian (https://app.transifex.com/grocy/teams/93189/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -14,13 +18,13 @@ msgstr ""
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr ""
msgstr "Brez zadolžitve"
msgid "who-least-did-first"
msgstr ""
msgid "random"
msgstr ""
msgstr "naključno"
msgid "in-alphabetical-order"
msgstr ""
msgstr "po-abecednem-vrstnem-redu"

View File

@@ -1,10 +1,14 @@
#
# Translators:
# Anže Pintar <anze.pintar2@gmail.com>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Anže Pintar <anze.pintar2@gmail.com>, 2023\n"
"Language-Team: Slovenian (https://app.transifex.com/grocy/teams/93189/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -14,10 +18,10 @@ msgstr ""
"X-Domain: grocy/demo_data\n"
msgid "Cookies"
msgstr ""
msgstr "Piškoti"
msgid "Chocolate"
msgstr ""
msgstr "Čokolada"
msgid "Pantry"
msgstr ""
@@ -29,14 +33,14 @@ msgid "Tinned food cupboard"
msgstr ""
msgid "Fridge"
msgstr ""
msgstr "Hladilnik"
msgid "Piece"
msgid_plural "Pieces"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[0] "Kos"
msgstr[1] "Kosa"
msgstr[2] "Kosi"
msgstr[3] "Kosov"
msgid "Pack"
msgid_plural "Packs"
@@ -80,37 +84,37 @@ msgid "Crisps"
msgstr ""
msgid "Eggs"
msgstr ""
msgstr "Jajca"
msgid "Noodles"
msgstr ""
msgstr "Rezanci"
msgid "Pickles"
msgstr ""
msgid "Gulash soup"
msgstr ""
msgstr "Golaž"
msgid "Yogurt"
msgstr ""
msgstr "Jogurt"
msgid "Cheese"
msgstr ""
msgstr "Sir"
msgid "Cold cuts"
msgstr ""
msgid "Paprika"
msgstr ""
msgstr "Paprika"
msgid "Cucumber"
msgstr ""
msgstr "Kumara"
msgid "Radish"
msgstr ""
msgstr "Redkev"
msgid "Tomato"
msgstr ""
msgstr "Paradižnik"
msgid "Change towels in the bathroom"
msgstr ""
@@ -137,28 +141,28 @@ msgid "Some good snacks"
msgstr ""
msgid "Pizza dough"
msgstr ""
msgstr "Testo za pico"
msgid "Sieved tomatoes"
msgstr ""
msgid "Salami"
msgstr ""
msgstr "Salama"
msgid "Toast"
msgstr ""
msgstr "Toast"
msgid "Minced meat"
msgstr ""
msgid "Pizza"
msgstr ""
msgstr "Pica"
msgid "Spaghetti bolognese"
msgstr ""
msgstr "Špageti Bolognese"
msgid "Sandwiches"
msgstr ""
msgstr "Sendviči"
msgid "English"
msgstr ""
@@ -177,22 +181,22 @@ msgstr ""
msgid "Gram"
msgid_plural "Grams"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[0] "Gram"
msgstr[1] "Grama"
msgstr[2] "Grami"
msgstr[3] "Gramov"
msgid "Flour"
msgstr ""
msgstr "Moka"
msgid "Pancakes"
msgstr ""
msgstr "Palačinke"
msgid "Sugar"
msgstr ""
msgstr "Sladkor"
msgid "Sweets"
msgstr ""
msgstr "Sladkarije"
msgid "Bakery products"
msgstr ""
@@ -213,31 +217,31 @@ msgid "Coffee machine"
msgstr ""
msgid "Dishwasher"
msgstr ""
msgstr "Pomivalni stroj"
msgid "Liter"
msgstr ""
msgstr "Liter"
msgid "Liters"
msgstr ""
msgstr "Litrov"
msgid "Bottle"
msgstr ""
msgstr "Steklenica"
msgid "Bottles"
msgstr ""
msgstr "Steklenic"
msgid "Milk"
msgstr ""
msgstr "Mleko"
msgid "Chocolate sauce"
msgstr ""
msgid "Milliliters"
msgstr ""
msgstr "Mililitrov"
msgid "Milliliter"
msgstr ""
msgstr "Mililiter"
msgid "Bottom"
msgstr ""
@@ -273,17 +277,17 @@ msgid "Polish"
msgstr ""
msgid "Milk Chocolate"
msgstr ""
msgstr "Mlečna čokolada"
msgid "Dark Chocolate"
msgstr ""
msgstr "Temna čokolada"
msgid "Slice"
msgid_plural "Slices"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[0] "Rezina"
msgstr[1] "Rezini"
msgstr[2] "Rezine"
msgstr[3] "Rezin"
msgid "Example userentity"
msgstr ""
@@ -328,10 +332,10 @@ msgid "Portuguese (Brazil)"
msgstr ""
msgid "This is a note"
msgstr ""
msgstr "To je opomba"
msgid "Freezer"
msgstr ""
msgstr "Zamrzovalnik"
msgid "Hungarian"
msgstr ""
@@ -347,11 +351,11 @@ msgstr ""
# Use a in your country well known supermarket name
msgid "DemoSupermarket1"
msgstr ""
msgstr "DemoTrgovina1"
# Use a in your country well known supermarket name
msgid "DemoSupermarket2"
msgstr ""
msgstr "DemoTrgovina2"
msgid "Japanese"
msgstr ""
@@ -378,13 +382,13 @@ msgid "Finnish"
msgstr ""
msgid "Breakfast"
msgstr ""
msgstr "Zajtrk"
msgid "Lunch"
msgstr ""
msgstr "Kosilo"
msgid "Dinner"
msgstr ""
msgstr "Večerja"
msgid "Catalan"
msgstr ""
@@ -400,10 +404,10 @@ msgstr ""
msgid "Kilogram"
msgid_plural "Kilograms"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[0] "Kilogram"
msgstr[1] "Kilograma"
msgstr[2] "Kilogrami"
msgstr[3] "Kilogramov"
msgid "Romanian"
msgstr ""
@@ -415,13 +419,13 @@ msgid "Beverages"
msgstr ""
msgid "Ice Cream"
msgstr ""
msgstr "Sladoled"
msgid "Soda"
msgstr ""
msgid "Beer"
msgstr ""
msgstr "Pivo"
msgid "Estonian"
msgstr ""

View File

@@ -1,6 +1,7 @@
#
# Translators:
# bostjo g, 2022
# Anže Pintar <anze.pintar2@gmail.com>, 2023
#
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: bostjo g, 2022\n"
"Last-Translator: Anže Pintar <anze.pintar2@gmail.com>, 2023\n"
"Language-Team: Slovenian (https://app.transifex.com/grocy/teams/93189/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -364,7 +365,7 @@ msgid "Removed %1$s of %2$s from stock"
msgstr "Izbrisan %1$s količine %2$s iz zaloge"
msgid "About Grocy"
msgstr ""
msgstr "O Grocy"
msgid "Close"
msgstr "Zapri"
@@ -1218,9 +1219,6 @@ msgstr "Nikoli"
msgid "Today"
msgstr "Danes"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Nekatere sestavine recepta \"%s\" so na zalogi, ničesar ne bo odstranjeno"
msgid "Undo task"
msgstr "Razveljavi opravilo"

View File

@@ -29,6 +29,10 @@ msgstr ""
msgid "number-decimal"
msgstr ""
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr ""

View File

@@ -1139,9 +1139,6 @@ msgstr ""
msgid "Today"
msgstr ""
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
msgid "Undo task"
msgstr ""

View File

@@ -1216,9 +1216,6 @@ msgstr "Aldrig"
msgid "Today"
msgstr "Idag"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr "Inte alla ingredienser i recept \"%s\" finns i lager, inget togs bort"
msgid "Undo task"
msgstr "Ångra uppgift"

View File

@@ -38,6 +38,10 @@ msgstr "Antal (heltal)"
msgid "number-decimal"
msgstr "Antal (decimal)"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "Datum (utan tid)"

View File

@@ -1175,9 +1175,6 @@ msgstr "ஒருபோதும் இல்லை"
msgid "Today"
msgstr "இன்று"
msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed"
msgstr ""
msgid "Undo task"
msgstr ""

View File

@@ -33,6 +33,10 @@ msgstr "எண்-முழு"
msgid "number-decimal"
msgstr "எண்-decimal"
# Number (currency)
msgid "number-currency"
msgstr ""
# Date (without time)
msgid "date"
msgstr "தேதி"

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