Compare commits

..

70 Commits

Author SHA1 Message Date
Bernd Bestel
f32d0bb28d
Switched password hashing algorithm 2026-03-22 17:29:38 +01:00
Bernd Bestel
23af6adcee
Removed obsolete config file 2026-03-07 18:20:48 +01:00
Bernd Bestel
7581ad8d1b
Prepared next release 2026-03-06 18:28:49 +01:00
Bernd Bestel
a324d430e0
Pulled translations from Transifex 2026-03-06 18:23:28 +01:00
Bernd Bestel
68bd83e104
Raise SQLite runtime version 2026-03-06 18:17:38 +01:00
Bernd Bestel
95d490d6ff
Fixed missing PHP package after cleanup 2026-03-04 21:26:20 +01:00
Bernd Bestel
634bae4930
PHP packages cleanup 2026-03-04 20:29:03 +01:00
Bernd Bestel
b5284a80c9
Removed no longer needed settings 2026-03-04 19:31:55 +01:00
Bernd Bestel
eb5332f0da
PHP 8.5 compatibility 2026-03-02 20:58:11 +01:00
Bernd Bestel
a5ea20afc6
Optimized VSCode formatter handling 2026-03-02 20:12:28 +01:00
Bernd Bestel
c70a7efd15
Optimized Composer handling 2026-03-02 20:11:39 +01:00
Bernd Bestel
1463a8d21b
PHP 8.5 support 2026-03-01 18:32:51 +01:00
Bernd Bestel
9fe398c4bf
Updated .github files 2026-02-08 21:42:23 +01:00
Bernd Bestel
541cf6599f
Formatting optimization 2026-02-08 18:07:55 +01:00
Bernd Bestel
29033a28a9
Updated .github files 2026-02-07 18:03:53 +01:00
Bernd Bestel
487631397c
Optimized product definition quantity unit handling 2026-02-04 21:49:46 +01:00
Bernd Bestel
cf7df4bdf8
Fixed stock entry form "Reprint stock entry label" 2026-02-03 20:29:15 +01:00
Bernd Bestel
471f21e992
Fixed broken HTML markup (fixes #2867) 2026-01-31 23:48:17 +01:00
Bernd Bestel
2a124a3d47
Check for empty usernames in ReverseProxyAuthMiddleware (references #2843) 2026-01-13 21:02:30 +01:00
Bernd Bestel
bf96ff5b92
Optimized special character handling in OOF plugin product names (fixes #2848, references #2740) 2026-01-13 20:51:25 +01:00
Bernd Bestel
b1e3ef7881
Fixed % handling in Userfield captions (fixes #2856) 2026-01-13 20:09:30 +01:00
Bernd Bestel
68b4abfac4
Added changelog for #2814 2025-09-28 20:44:05 +02:00
GammaC0de
1934256f29
Support data: URI images for external barcode lookup plugins (#2814)
* add support for data: URI images for external barcode lookup plugins

* Adapt existing code style

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-09-28 20:37:47 +02:00
Bernd Bestel
8129b6b60b
Added changelog for #2788 2025-09-20 12:17:22 +02:00
Bernd Bestel
5bb016dfa5
Added changelog for #2811 2025-09-20 12:15:47 +02:00
Jordy
23ccd05719
Get the image file type from the response content type (#2811)
* Get the image file type from the response content type
When using the external lookup tool, the file extention in the URL is used for the name of the downloaded image. However, some API's do not use file types in the resource name. If that is the case, the Content-Type of the request will now be used to define the file extention.

* Typo: Deleted last empty line on accident.

* Typo

* Apply code style and simplify this

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-09-20 12:12:45 +02:00
Bernd Bestel
4c5fbffd25
Optimized date input shorthand handling (fixes #2806) 2025-09-14 13:48:01 +02:00
Bernd Bestel
8509645985
Optimized datetimepicker next input focus handling (fixes #2807) 2025-09-14 10:32:26 +02:00
Bernd Bestel
7de98db143
Added changelog for #2794 2025-08-15 16:59:23 +02:00
DeepCoreSystem
31185beac5
Enhance product card chart colors for better visibility (#2794)
* Enhance product card chart colors for better visibility

* Code style

---------

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

* Applied code formatting rules

* Delete now obsolete user settings

* Review

---------

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

* Removed LABEL_PRINTER_INCLUDE_DETAILS flag

* Make this actually work

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

---------

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2025-03-21 16:34:33 +01:00
Bernd Bestel
541318e964
Include non-latin font variants / clean up font-weight (closes #2699) 2025-03-12 17:48:06 +01:00
Bernd Bestel
d1a8900f98
Also show the product's default store on /stockoverview (closes #2698) 2025-03-10 17:36:23 +01:00
Bertrand SIFRE
6ca87a9a49
fix(openapi): volatile is not an array, it's an object (#2694) 2025-03-10 17:22:56 +01:00
Bernd Bestel
2a3e23ded4
Handle image URLs with query parameters returned from an external barcode lookup plugin 2025-03-04 20:40:48 +01:00
Bernd Bestel
46253c455f
Optimize product name special characters handling in OFF external barcode lookup plugin 2025-03-04 20:38:10 +01:00
Bernd Bestel
63dcfcde47
Prepared next release 2025-02-28 17:12:16 +01:00
Bernd Bestel
54cd5a004d
Updated README / changelog 2025-02-28 16:14:26 +01:00
Bernd Bestel
c11bbba214
Updated changelog 2025-02-27 21:23:56 +01:00
Bernd Bestel
fdddc9295d
Updated dependencies 2025-02-27 18:01:56 +01:00
Bernd Bestel
1d6e545710
Pulled translations from Transifex 2025-02-27 18:01:40 +01:00
Bernd Bestel
57438409c4
Reduce package size 2025-02-27 18:01:18 +01:00
Bernd Bestel
72453eac0a
Transpose product column index when searching in it (fixes #2688) 2025-02-27 17:07:30 +01:00
Bernd Bestel
27b79841fc
Scale up values on the shopping list when shopping_list_round_up is enabled (closes #2687) 2025-02-25 18:43:42 +01:00
Bernd Bestel
2b994fd2ee
Handle window.top in embedded iframe situations (fixes #2686) 2025-02-24 19:52:43 +01:00
Bernd Bestel
ce5be6645e
Optimized /locationcontentsheet only-in-stock checkbox page reload persistence (in Chrome) (references #2669) 2025-02-06 20:27:35 +01:00
Bernd Bestel
b7c4011e80
Fixed link userfield saving (fixes #2670) 2025-02-06 20:09:19 +01:00
Bernd Bestel
ebcc9a422e
Use OFF localized product names if available (closes #2666) 2025-02-03 18:55:33 +01:00
Bernd Bestel
6a7436dbf0
Persist shopping list print settings (closes #2667) 2025-02-03 18:36:10 +01:00
Bernd Bestel
bf353d9622
API: Expose permission_hierarchy read only via generic entity interactions (closes #2662) 2025-02-01 09:34:16 +01:00
Pierre Penninckx
2690e535e3
Make labels on login form point to correct inputs (#2661)
Co-authored-by: ibizaman <ibizapeanut@gmail.com>
2025-02-01 09:31:54 +01:00
Bernd Bestel
98769aea11
grocy/grocy-docker has been retired 2025-01-31 18:18:40 +01:00
384 changed files with 7818 additions and 3440 deletions

View File

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

View File

@ -15,5 +15,5 @@ if ($adminUserRow == null)
}
$adminUserRow->update([
'password' => password_hash('admin', PASSWORD_DEFAULT)
'password' => password_hash('admin', PASSWORD_ARGON2ID)
]);

View File

@ -1,4 +1,5 @@
pushd ..
set COMPOSER_FUND=0
call composer install
call yarn install
popd

View File

@ -1,4 +1,5 @@
pushd ..
set COMPOSER_FUND=0
call composer update
call yarn upgrade
popd

View File

@ -1,8 +0,0 @@
root = true
[*]
indent_style = tab
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

14
.github/CONTRIBUTING.md vendored Normal file
View File

@ -0,0 +1,14 @@
## Help & Usage Questions
&rarr; [r/grocy on Reddit](https://www.reddit.com/r/grocy)
## Bug Reports & Feature Requests
&rarr; [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose)
## Say thanks
&rarr; <https://grocy.info/#say-thanks>
## Translations
&rarr; [Transifex](https://explore.transifex.com/grocy/grocy/)
## Pull Requests
This project does not accept code contributions.

View File

@ -1,7 +1,6 @@
---
name: Bug Report
about: If you've found something that does not work, please report it to help improve
Grocy
about: If you've found something that does not work, please report it to help improve Grocy
title: 'Bug: '
labels: bug
assignees: ''
@ -13,8 +12,8 @@ Please make sure to:
- Describe the bug as detailed as possible by providing the exact steps how to reproduce it
- Attach screenshots where useful
- Check if the problem was maybe already reported or fixed by searching open and closed issues here
- Keep it to one topic per issue
- Check if the problem was maybe already reported or fixed by searching open and also already closed requests here
- Keep it to one topic per request
Please also try to reproduce the problem on the pre-release demo: => https://demo-prerelease.grocy.info
- Use a private demo instance to make your example persistent

View File

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

View File

@ -1,7 +1,6 @@
---
name: Feature Request
about: Ideas for improvements or new things which you would find useful are always
welcome
about: Ideas for improvements or new things which you would find useful are always welcome
title: 'Feature Request: '
labels: enhancement
assignees: ''
@ -12,6 +11,6 @@ assignees: ''
Please make sure to:
- Describe what you would find useful as detailed as possible
- Check if your idea was maybe already requested by searching open requests here
- Check if your idea was maybe already requested by searching open and also already closed requests here
- Keep it to one topic per request
-->

1
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1 @@
This project does not accept code contributions.

1
.gitignore vendored
View File

@ -1,5 +1,4 @@
embedded.txt
.DS_Store
/.release
/packages
/public/packages

15
.vscode/settings.json vendored
View File

@ -1,16 +1,3 @@
{
"phpserver.relativePath": "public",
"editor.formatOnType": true,
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.insertSpaces": false,
"javascript.format.placeOpenBraceOnNewLineForControlBlocks": true,
"javascript.format.placeOpenBraceOnNewLineForFunctions": true,
"javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
"javascript.preferences.quoteStyle": "double",
"blade.format.enable": true,
"html.format.wrapAttributes": "force",
"html.format.wrapLineLength": 0,
"php-cs-fixer.formatHtml": true,
"php-cs-fixer.autoFixBySemicolon": true
"phpserver.relativePath": "public"
}

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017 Bernd Bestel
Copyright (c) 2017-2026 Bernd Bestel (<https://berrnd.de>)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -20,7 +20,7 @@ See the website. &rarr; <https://grocy.info>
## Questions / Help / Bug Reports / Feature Requests
- General help and usage questions &rarr; [r/grocy subreddit](https://www.reddit.com/r/grocy)
- General help and usage questions &rarr; [r/grocy on Reddit](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 anything Grocy. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
@ -33,7 +33,7 @@ See the website for a list of community contributed Add-ons / Tools. &rarr; [htt
> 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".
> Directly download the [latest release](https://releases.grocy.info/latest-desktop) (also [available via the Microsoft Store](https://apps.microsoft.com/detail/9NWB1TRNNKSF)) - the installation is nothing more than just clicking 2 times "next".
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)
@ -50,21 +50,20 @@ See the website for more installation guides and troubleshooting help. &rarr; [h
### Platform support
- PHP 8.2 or 8.3 (with SQLite 3.34.0+)
- PHP 8.5 (with SQLite 3.40+)
- Required PHP extensions: `fileinfo`, `pdo_sqlite`, `gd`, `ctype`, `intl`, `zlib`, `mbstring`
- _Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version._
- Recent Firefox, Chrome or Edge
## How to run using Docker
See [grocy/grocy-docker](https://github.com/grocy/grocy-docker) or [linuxserver/docker-grocy](https://github.com/linuxserver/docker-grocy) for instructions.
&rarr; https://hub.docker.com/r/linuxserver/grocy
## How to update
- Overwrite everything with the [latest release](https://releases.grocy.info/latest) while keeping the `data` directory
- Check `config-dist.php` for new configuration options and add them to your `data/config.php` where appropriate (the default values from `config-dist.php` will be used for not in `data/config.php` defined settings)
If you run Grocy on Linux, there is also `update.sh` (remember to make the script executable (`chmod +x update.sh`) and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update).
If you run Grocy on Linux, there is also `update.sh` (remember to make the script executable via `chmod +x update.sh` and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update).
## Localization
@ -78,7 +77,7 @@ The [pre-release demo](https://demo-prerelease.grocy.info) is available for any
Also any translation which once reached a completion level of 70 % ([`strings` resource](https://app.transifex.com/grocy/grocy/strings/)) will be included in releases.
_RTL languages are unfortunately not yet supported._
_RTL languages are not yet supported._
## Motivation
@ -94,22 +93,32 @@ The web frontend uses exactly this API for pretty much everything. So everything
### Barcode readers & camera scanning
Some fields (with a barcode icon above) also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a `$`) and sends a `TAB` after a scan.
Some fields (with a barcode icon) also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a `$`) and sends a `TAB` after a scan.
Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding input field (powered by [Quagga2](https://github.com/ericblade/quagga2), totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)). [Here](https://www.youtube.com/watch?v=veezFX4X1JU) and [there](https://www.youtube.com/watch?v=Y5YH6IJFnfc) are quick video demos of that.
Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding input field (powered by [ZXing](https://github.com/zxing-js/library), totally offline / client-side camera stream processing. Please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)). [Here](https://www.youtube.com/watch?v=veezFX4X1JU) and [there](https://www.youtube.com/watch?v=Y5YH6IJFnfc) are quick video demos of that.
_My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000 % better, faster, under any lighting condition and from any angle._
_My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000% better, faster, under any lighting condition and from any angle._
### Barcode lookup via external services
Products can be directly added to the database via looking them up against external services by a barcode.
This can be done in-place using the product picker workflow "External barcode lookup" (the workflow dialog is displayed when entering something unknown in any product input field) Quick video demo: <https://www.youtube.com/watch?v=-moXPA-VvGc>
A plugin for [Open Food Facts](https://world.openfoodfacts.org/) is included and used by default (see the `data/config.php` option `STOCK_BARCODE_LOOKUP_PLUGIN`).
See that plugin or `plugins/DemoBarcodeLookupPlugin.php` for a commented example implementation if you want to build a plugin.
### Input shorthands for date fields
For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization.
The following shorthands are available:
- `MMDD` gets expanded to the given day on the current year, if > today, or to the given day next year, if < today, in proper notation
- Example: `0517` will be converted to `2025-05-17`
- Example: `0517` will be converted to `2026-05-17`
- `YYYYMMDD` gets expanded to the proper ISO-8601 notation
- Example: `20250417` will be converted to `2025-04-17`
- Example: `20260417` will be converted to `2026-04-17`
- `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation
- Example: `202507e` will be converted to `2025-07-31`
- Example: `202607e` will be converted to `2026-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")
@ -123,15 +132,12 @@ The following shorthands are available:
Wherever a button contains a bold highlighted letter, this is a shortcut key.
Example: Button "**P** Add as new product" can be "pressed" by using the `P` key on your keyboard.
### Barcode lookup via external services
### Installable web app (PWA)
Products can be directly added to the database via looking them up against external services by a barcode.
Grocy's web frontend is responsive and an "installable web app" ([PWA](https://en.wikipedia.org/wiki/Progressive_web_app), without providing any offline usage capabilities), that provides a pretty native mobile app-like experience without the need for additional tools.
This can be done in-place using the product picker workflow "External barcode lookup" (the workflow dialog is displayed when entering something unknown in any product input field) Quick video demo: <https://www.youtube.com/watch?v=-moXPA-VvGc>
A plugin for [Open Food Facts](https://world.openfoodfacts.org/) is included and used by default (see the `data/config.php` option `STOCK_BARCODE_LOOKUP_PLUGIN`).
See that plugin or `plugins/DemoBarcodeLookupPlugin.php` for a commented example implementation if you want to build a plugin.
- Quick video demo on Android/Firefox: <https://www.youtube.com/watch?v=L38drVZfwHs>
- Quick video demo on Android/Chrome: <https://www.youtube.com/watch?v=rjLdXUFDNuk>
### Database migrations
@ -160,11 +166,11 @@ In embedded mode, settings can be overridden by text files in `data/settingoverr
## Contributing / Say Thanks
Any help is welcome, feel free to contribute anything which comes to your mind or see <https://grocy.info/#say-thanks> if you just want to say thanks.
See <https://grocy.info/#say-thanks> if you just want to say thanks or [Contributing](https://github.com/grocy/grocy?tab=contributing-ov-file#contributing-ov-file) for anything else.
## 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. The progress of a specific bug/enhancement is always tracked in the corresponding request, 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

@ -2,11 +2,11 @@
use Grocy\Controllers\ExceptionController;
use Grocy\Helpers\UrlManager;
use Grocy\Helpers\SlimBladeView;
use Grocy\Middleware\LocaleMiddleware;
use Grocy\Middleware\CorsMiddleware;
use Psr\Container\ContainerInterface as Container;
use Slim\Factory\AppFactory;
use Slim\Views\Blade;
// Load composer dependencies
require_once __DIR__ . '/packages/autoload.php';
@ -14,7 +14,6 @@ require_once __DIR__ . '/packages/autoload.php';
// Load config files
require_once GROCY_DATAPATH . '/config.php';
require_once __DIR__ . '/config-dist.php'; // For not in own config defined values we use the default ones
require_once __DIR__ . '/helpers/ConfigurationValidator.php';
// Error reporting definitions
if (GROCY_MODE === 'dev')
@ -44,9 +43,9 @@ if (GROCY_DISABLE_AUTH === true)
// Check if any invalid entries in config.php have been made
try
{
(new ConfigurationValidator())->validateConfig();
(new Grocy\Helpers\ConfigurationValidator())->validateConfig();
}
catch (EInvalidConfig $ex)
catch (\Grocy\Helpers\EInvalidConfig $ex)
{
exit('Invalid setting in config.php: ' . $ex->getMessage());
}
@ -85,7 +84,7 @@ $app = AppFactory::create();
$container = $app->getContainer();
$container->set('view', function (Container $container)
{
return new Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');
return new SlimBladeView(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');
});
$container->set('UrlManager', function (Container $container)

View File

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

View File

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

View File

@ -33,7 +33,7 @@
- New product option "Auto reprint stock entry label"
- When enabled, auto-changing the due date of a stock entry (by opening/freezing/thawing and having corresponding default due days set) will reprint its label (only server side label printer WebHooks are supported)
- Defaults to disabled, so no changed behavior when not configured
- Added a new option "Reprint stock entry label" on the stock entry edit page (will print the correspondind stock entry label on save)
- Added a new option "Reprint stock entry label" on the stock entry edit page (will print the corresponding stock entry label on save)
- This option will be automatically set on changing the entry's due date
- The product option "Quick consume amount" (the amount used for the "quick consume/open buttons" on the stock overview page) has been split into another option "Quick open amount", to be able to set different amounts for consume and open (defaults to the "Quick consume amount" per product, so no changed behavior when not configured)
- Changed that for the product's average and last price (and for the price history chart) stock transactions with an empty or `0` price are ignored

View File

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

View File

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

View File

@ -0,0 +1,36 @@
> ⚠️ PHP 8.5 (with SQLite 3.40+) is from now on the only supported runtime version.
### Stock
- Optimized product definition quantity unit handling:
- As long as a product was not once in stock, the product options "Default quantity unit purchase", "Default quantity unit consume" and "Quantity unit for prices" can now be changed to any other unit
- When necessary (means when no default quantity unit conversions apply), "1:1" product specific quantity unit conversion between the product's QU stock and the corresponding other unit will now be created automatically after editing a product (like already done when initially creating a product with different unit definitions)
- For convenience, when changing a product's QU stock and when all other unit properties ("Default quantity unit purchase" etc.) are the same, they will now be changed in tandem (like already done when creating a new product and initially setting the product's QU stock)
- (This should drastically improve the workflow of completing a product setup looked up via an external barcode lookup plugin)
- Optimized the line plot markers color of the price history chart (product card) (thanks @DeepCoreSystem)
- External barcode lookup plugin optimizations:
- When an image URL without a file extension is returned, the file extension is now determined by the Content-Type header (if any) (thanks @jordy-u for the idea)
- Data URLs for images are now supported (`data:image/png;base64,xxxx`) (thanks @GammaC0de)
- Fixed that German Umlauts and other special characters were removed from product names when looking up a barcode via the built-in Open Food Facts external barcode lookup plugin
- Fixed that when using/scanning a barcode on the purchase page with a note attached (which prefills the note field) and when manually selecting another product afterwards, the note of the previously used barcode was incorrectly prefilled again
- Fixed that the "next input focus handling" (jumping to the next input after entering a value) didn't work at some places (e.g. after entering a purchased date on the purchase page)
- Fixed that changing the stock setting "Due soon days" wasn't saved/applied
- Fixed that "Reprint stock entry label" on the stock entry edit page didn't actually print the corresponding label
### Shopping list
- An amount of `0` is now allowed for shopping list items (just a convenience optimization, it was already possible to leave the amount field empty which implicitly resulted in an amount of `0`)
- Fixed that the "Add all list items to stock" workflow closed the dialog after every item instead only after the last one was added
### Chores
- Fixed that changing the chore setting "Due soon days" wasn't saved/applied
### Userfields
- Fixed that the corresponding form was broken when using a `%` in an Userfield caption (only affected numeric and date-time Userfields)
### General
- Added a workaround for different SQL errors when running Grocy on FreeBSD and SQLite 3.41+
- Fixed that the date input shorthand `[+/-]n[d/m/y]` didn't work when the value length was >= 4 (e.g. `+10d`)

View File

@ -1,25 +1,30 @@
{
"require": {
"php": ">=8.2",
"slim/slim": "^4.0",
"slim/psr7": "^1.0",
"slim/http": "^1.0",
"php-di/php-di": "^7.0.3",
"berrnd/slim-blade-view": "^1.0.0",
"morris/lessql": "dev-php82",
"gettext/gettext": "^4.8.10",
"php": "8.5.*",
"eluceo/ical": "^2.2.0",
"erusev/parsedown": "^1.7",
"gumlet/php-image-resize": "^2.0",
"ezyang/htmlpurifier": "^4.13",
"interficieis/php-barcode": "^2.0.2",
"gettext/gettext": "dev-4.x-fork",
"gumlet/php-image-resize": "^2.0",
"guzzlehttp/guzzle": "^7.0",
"mike42/escpos-php": "^4.0"
"interficieis/php-barcode": "^2.0.2",
"mike42/escpos-php": "^4.0",
"morris/lessql": "dev-master-fork",
"php-di/php-di": "^7.0.3",
"slim/http": "^1.0",
"slim/psr7": "^1.0",
"slim/slim": "^4.0",
"webman/blade": "^1.5",
"ramsey/uuid": "^4.9"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/berrnd/lessql"
},
{
"type": "vcs",
"url": "https://github.com/berrnd/php-gettext"
}
],
"autoload": {

1279
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -103,14 +103,14 @@ Setting('LDAP_UID_ATTR', ''); // Windows AD: "sAMAccountName", OpenLDAP: "uid",
Setting('DEFAULT_PERMISSIONS', ['ADMIN']);
// "1D" (=> Code128) or "2D" (=> DataMatrix)
Setting('GROCYCODE_TYPE', '1D');
Setting('GROCYCODE_TYPE', '2D');
// Label printer settings
Setting('LABEL_PRINTER_WEBHOOK', ''); // The URI that Grocy will POST to when asked to print a label
Setting('LABEL_PRINTER_RUN_SERVER', true); // Whether the webhook will be called server- or client-side
Setting('LABEL_PRINTER_PARAMS', ['font_family' => 'Source Sans Pro (Regular)']); // Additional parameters supplied to the webhook
Setting('LABEL_PRINTER_HOOK_JSON', false); // TRUE to use JSON or FALSE to use normal POST request variables
Setting('LABEL_PRINTER_HOOK_JSON', true); // TRUE to use JSON or FALSE to use normal POST request variables
// Thermal printer options
@ -202,6 +202,9 @@ DefaultUserSetting('shopping_list_show_calendar', false); // When enabled, a sma
DefaultUserSetting('shopping_list_round_up', false); // When enabled, all quantity amounts on the shopping list are always displayed rounded up to the nearest whole number
DefaultUserSetting('shopping_list_auto_add_below_min_stock_amount', false); // If products should be automatically added to the shopping list when they are below their min. stock amount
DefaultUserSetting('shopping_list_auto_add_below_min_stock_amount_list_id', 1); // When the above setting is enabled, the id of the shopping list to which the products will be added
DefaultUserSetting('shopping_list_print_show_header', true); // Default for the shopping list print option "Show header"
DefaultUserSetting('shopping_list_print_group_by_product_group', true); // Default for the shopping list print option "Group by product group"
DefaultUserSetting('shopping_list_print_layout_type', 'table'); // Default for the shopping list print option "Layout type" (table or list)
// Recipe settings
DefaultUserSetting('recipe_ingredients_group_by_product_group', false); // Group recipe ingredients by their product group
@ -224,13 +227,3 @@ DefaultUserSetting('calendar_color_tasks', '#28a745'); // The event color (hex c
DefaultUserSetting('calendar_color_chores', '#ffc107'); // The event color (hex code) for due chores
DefaultUserSetting('calendar_color_batteries', '#17a2b8'); // The event color (hex code) for due battery charge cycles
DefaultUserSetting('calendar_color_meal_plan', '#6c757d'); // The event color (hex code) for meal plan items
// Component configuration for Quagga2
// See https://github.com/ericblade/quagga2#configobject for details
// Below is a generic good configuration,
// For an iPhone 7 Plus, halfsample = true, patchsize = small, frequency = 5 yields very good results
DefaultUserSetting('quagga2_numofworkers', 4);
DefaultUserSetting('quagga2_halfsample', false);
DefaultUserSetting('quagga2_patchsize', 'medium');
DefaultUserSetting('quagga2_frequency', 10);
DefaultUserSetting('quagga2_debug', false);

View File

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

View File

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

View File

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

View File

@ -672,11 +672,12 @@ class StockApiController extends BaseApiController
{
try
{
$product = $this->getDatabase()->products()->where('id', $args['productId'])->fetch();
$productDetails = (object)$this->getStockService()->GetProductDetails($args['productId']);
$webhookData = array_merge([
'product' => $product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $product->id)),
'product' => $productDetails->product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $productDetails->product->id)),
'details' => $productDetails,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_LABEL_PRINTER_RUN_SERVER)
@ -697,11 +698,13 @@ class StockApiController extends BaseApiController
try
{
$stockEntry = $this->getDatabase()->stock()->where('id', $args['entryId'])->fetch();
$product = $this->getDatabase()->products()->where('id', $stockEntry->product_id)->fetch();
$productDetails = (object)$this->getStockService()->GetProductDetails($stockEntry->product_id);
$webhookData = array_merge([
'product' => $product->name,
'product' => $productDetails->product->name,
'grocycode' => (string)(new Grocycode(Grocycode::PRODUCT, $stockEntry->product_id, [$stockEntry->stock_id])),
'details' => $productDetails,
'stock_entry' => $stockEntry,
], GROCY_LABEL_PRINTER_PARAMS);
if (GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING)

View File

@ -195,12 +195,13 @@ class StockController extends BaseController
{
if ($args['productId'] == 'new')
{
$quantityunits = $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE');
return $this->renderPage($response, 'productform', [
'locations' => $this->getDatabase()->locations()->where('active = 1')->orderBy('name'),
'barcodes' => $this->getDatabase()->product_barcodes()->orderBy('barcode'),
'quantityunits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityunitsStock' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
'referencedQuantityunits' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityunitsAll' => $quantityunits,
'quantityunitsReferenced' => $quantityunits,
'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'),
@ -217,9 +218,8 @@ class StockController extends BaseController
'product' => $product,
'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 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'),
'quantityunitsAll' => $this->getDatabase()->quantity_units()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
'quantityunitsReferenced' => $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'),
'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'),

View File

@ -1063,6 +1063,7 @@
"/users/{userId}/permissions": {
"get": {
"summary": "Returns the assigned permissions of the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@ -1113,6 +1114,7 @@
},
"post": {
"summary": "Adds a permission to the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@ -1161,6 +1163,7 @@
},
"put": {
"summary": "Replaces the assigned permissions of the given user",
"description": "See \"GET /objects/permission_hierarchy\" for a permission name / id mapping",
"tags": [
"User management"
],
@ -1614,10 +1617,7 @@
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CurrentVolatilStockResponse"
}
"$ref": "#/components/schemas/CurrentVolatilStockResponse"
}
}
}
@ -5906,7 +5906,8 @@
"quantity_unit_conversions_resolved",
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view"
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityNoListing": {
@ -5928,7 +5929,8 @@
"quantity_unit_conversions_resolved",
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view"
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityNoDelete": {
@ -5943,7 +5945,8 @@
"quantity_unit_conversions_resolved",
"recipes_pos_resolved",
"battery_charge_cycles",
"product_barcodes_view"
"product_barcodes_view",
"permission_hierarchy"
]
},
"ExposedEntityEditRequiresAdmin": {

View File

@ -1,6 +1,8 @@
<?php
class EInvalidConfig extends Exception
namespace Grocy\Helpers;
class EInvalidConfig extends \Exception
{
}

View File

@ -1,6 +1,8 @@
<?php
class ERequirementNotMet extends Exception
namespace Grocy\Helpers;
class ERequirementNotMet extends \Exception
{
}
@ -10,8 +12,8 @@ const REQUIRED_PHP_EXTENSIONS = ['fileinfo', 'pdo_sqlite', 'gd', 'ctype', 'intl'
'filter', 'iconv', 'tokenizer', 'json'
];
const REQUIRED_PHP_VERSION = '8.2.0';
const REQUIRED_SQLITE_VERSION = '3.34.0';
const REQUIRED_PHP_VERSION = '8.5.0';
const REQUIRED_SQLITE_VERSION = '3.40.0';
class PrerequisiteChecker
{
@ -81,7 +83,7 @@ class PrerequisiteChecker
private function getSqlVersionAsString()
{
$dbh = new PDO('sqlite::memory:');
$dbh = new \PDO('sqlite::memory:');
return $dbh->query('select sqlite_version()')->fetch()[0];
}
}

34
helpers/SlimBladeView.php Normal file
View File

@ -0,0 +1,34 @@
<?php
namespace Grocy\Helpers;
use Jenssegers\Blade\Blade;
use Psr\Http\Message\ResponseInterface;
class SlimBladeView
{
public function __construct(string $viewPaths, string $cachePath)
{
$this->ViewPaths = $viewPaths;
$this->CachePath = $cachePath;
}
protected $ViewPaths;
protected $CachePath;
protected $ViewData = [];
public function render(ResponseInterface $response, string $template, array $data = [])
{
$data = array_merge($this->ViewData, $data);
$renderer = new Blade($this->ViewPaths, $this->CachePath, null);
$output = $renderer->make($template, $data)->render();
$response->getBody()->write($output);
return $response;
}
public function set(string $key, mixed $value)
{
$this->ViewData[$key] = $value;
}
}

View File

@ -265,9 +265,9 @@ function require_frontend_packages(array $packages)
function EmptyFolder($folderPath)
{
foreach(glob("{$folderPath}/*") as $item)
foreach (glob("{$folderPath}/*") as $item)
{
if(is_dir($item))
if (is_dir($item))
{
EmptyFolder($item);
rmdir($item);

View File

@ -0,0 +1,31 @@
# Translators:
# Plamen Stoyanov <fireto@gmail.com>, 2020
# Dwight Schrute <rvelitchkov@gmail.com>, 2020
# Mihail Andreev, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-09-17 10:45+0000\n"
"Last-Translator: Mihail Andreev, 2020\n"
"Language-Team: Bulgarian (Bulgaria) (https://app.transifex.com/grocy/teams/93189/bg_BG/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Domain: grocy/chore_assignment_types\n"
msgid "no-assignment"
msgstr "не-разпределен"
msgid "who-least-did-first"
msgstr "пръв-последния-направил"
msgid "random"
msgstr "случаен"
msgid "in-alphabetical-order"
msgstr "по-азбучен-ред"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -1,4 +1,3 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Carles Riera <blauigris@gmail.com>, 2022

View File

@ -1,4 +1,3 @@
#
# Translators:
# Joan Rodas <joanrc93@gmail.com>, 2020
# Martí Gombau, 2023

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2022
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Joan Rodas <joanrc93@gmail.com>, 2020
# gimy16 <gimy16@hotmail.com>, 2021
@ -414,3 +413,6 @@ msgstr "Cervesa"
msgid "Estonian"
msgstr "Estonià"
msgid "Bulgarian"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Martí Gombau, 2023
# Auri, 2024
@ -145,3 +144,7 @@ msgstr "ro_RO"
# Estonian
msgid "et_EE"
msgstr "et_EE"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Martí Gombau, 2023

View File

@ -1,4 +1,3 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Auri, 2024

View File

@ -1,4 +1,3 @@
#
# Translators:
# Joan Rodas <joanrc93@gmail.com>, 2020
# Carles Riera <blauigris@gmail.com>, 2021
@ -2768,3 +2767,8 @@ msgstr ""
msgid "List actions"
msgstr ""
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# gimy16 <gimy16@hotmail.com>, 2021
# Roger Solé Vilajuliu, 2024

View File

@ -1,4 +1,3 @@
#
# Translators:
# Radim Kabeláč <radim.ekk@gmail.com>, 2020
# Pavel Paseka, 2022

View File

@ -1,4 +1,3 @@
#
# Translators:
# Tomas Reznicek <tomas.reznicek@gmail.com>, 2019
# Michal Petříček <michal@petricek.org>, 2019

View File

@ -1,4 +1,3 @@
#
# Translators:
# Tomas Reznicek <tomas.reznicek@gmail.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Michal Petříček <michal@petricek.org>, 2019
# Ondřej Suk <ondra.suk.55@gmail.com>, 2020
@ -432,3 +431,6 @@ msgstr "Pivo"
msgid "Estonian"
msgstr ""
msgid "Bulgarian"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Radim Kabeláč <radim.ekk@gmail.com>, 2020
# Jarda Tesar <intossh@gmail.com>, 2021
@ -146,3 +145,7 @@ msgstr "Rumunština"
# Estonian
msgid "et_EE"
msgstr ""
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Pavel Paseka, 2022
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Pavel Paseka, 2022
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Tomas Reznicek <tomas.reznicek@gmail.com>, 2019
# Michal Petříček <michal@petricek.org>, 2019
@ -8,7 +7,7 @@
# Radim Kabeláč <radim.ekk@gmail.com>, 2020
# Jaroslav Lichtblau <l10n@lichtblau.cz>, 2020
# Jarda Tesar <intossh@gmail.com>, 2021
# Pavel Paseka, 2025
# Pavel Paseka, 2026
#
msgid ""
msgstr ""
@ -16,7 +15,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Pavel Paseka, 2025\n"
"Last-Translator: Pavel Paseka, 2026\n"
"Language-Team: Czech (https://app.transifex.com/grocy/teams/93189/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -1509,7 +1508,7 @@ msgid "Price factor"
msgstr "Násobek ceny ingredience"
msgid "Do you find Grocy useful?"
msgstr "Je pro vás Grocy užitečný?"
msgstr "Je pro vás Grocy užitečné?"
msgid "Say thanks"
msgstr "Poděkujte za aplikaci"
@ -2873,7 +2872,7 @@ msgstr ""
"aktuální zásoba."
msgid "Can't be opened"
msgstr "Nelze otevřít."
msgstr "Tento produkt nelze „otevřít“."
msgid "Default purchase price type"
msgstr "Výchozí druh ceny"
@ -2892,3 +2891,11 @@ msgstr "Operace se zásobami"
msgid "List actions"
msgstr "Operace se seznamem"
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""
"Pokud byl tento produkt alespoň jednou v zásobě a není na výběr jednotka "
"množství, kterou byste potřebovali, vytvořte si vhodnou konverzi stávající "
"množstevní jednotky."

View File

@ -1,4 +1,3 @@
#
# Translators:
# Tomas Reznicek <tomas.reznicek@gmail.com>, 2019
# Michal Franc, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Troels Siggaard <troels@siggaard.com>, 2019
# klavslund <klavslund@gmail.com>, 2021

View File

@ -1,4 +1,3 @@
#
# Translators:
# Troels Siggaard <troels@siggaard.com>, 2019
# Rasmus Bojsen <rasmus@bojsen.cn>, 2019

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# dark159123 <r.j.hansen@protonmail.com>, 2019
# Troels Siggaard <troels@siggaard.com>, 2019
@ -419,3 +418,6 @@ msgstr "Øl"
msgid "Estonian"
msgstr "Estisk"
msgid "Bulgarian"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# klavslund <klavslund@gmail.com>, 2021
# Brian Moos Lindberg <brian@blueeel.dk>, 2022
@ -147,3 +146,7 @@ msgstr "ro_RO"
# Estonian
msgid "et_EE"
msgstr "et_EE"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Mihai Marinescu <mihai@marinescu.dk>, 2020
# klavslund <klavslund@gmail.com>, 2021

View File

@ -1,4 +1,3 @@
#
# Translators:
# Troels Siggaard <troels@siggaard.com>, 2019
# Brian Moos Lindberg <brian@blueeel.dk>, 2019

View File

@ -1,4 +1,3 @@
#
# Translators:
# dark159123 <r.j.hansen@protonmail.com>, 2019
# Bernd Bestel <bernd@berrnd.de>, 2019
@ -12,6 +11,7 @@
# hskdk <henrik@skjaerbaek.net>, 2023
# G Momsen, 2024
# Brian Moos Lindberg <brian@blueeel.dk>, 2024
# eurosite, 2025
#
msgid ""
msgstr ""
@ -19,7 +19,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: Brian Moos Lindberg <brian@blueeel.dk>, 2024\n"
"Last-Translator: eurosite, 2025\n"
"Language-Team: Danish (https://app.transifex.com/grocy/teams/93189/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -288,7 +288,7 @@ msgid "Invalid credentials, please try again"
msgstr "Ugyldig brugernavn og/eller adgangskode, prøv igen"
msgid "Are you sure you want to delete battery \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette batteri \"%s\"?"
msgid "Yes"
msgstr "Ja"
@ -321,13 +321,13 @@ msgid "Are you sure you want to delete quantity unit \"%s\"?"
msgstr ""
msgid "Are you sure you want to delete product \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette varen \"%s\"?"
msgid "Are you sure you want to delete location \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette placeringen \"%s\"?"
msgid "Are you sure you want to delete store \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette butikken \"%s\"?"
msgid "Manage API keys"
msgstr "Administrer API nøgler"
@ -441,13 +441,13 @@ msgid "Edit recipe ingredient"
msgstr "Rediger ingrediens til opskrift"
msgid "Are you sure you want to delete recipe \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette opskriften \"%s\"?"
msgid "Are you sure you want to delete recipe ingredient \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette ingrediensen \"%s\" fra opskriften?"
msgid "Are you sure you want to empty shopping list \"%s\"?"
msgstr ""
msgstr "Er du sikker på at du vil tømme indkøbslisten \"%s\"?"
msgid "Clear list"
msgstr "Ryd indkøbslisten"
@ -497,6 +497,8 @@ msgid ""
"Are you sure you want to put all missing ingredients for recipe \"%s\" on "
"the shopping list?"
msgstr ""
"Er du sikker på du vil sætte alle manglende ingredienser til \"%s\" på "
"indkøbslisten?"
msgid "Manage users"
msgstr "Administrer brugere"
@ -508,7 +510,7 @@ msgid "Users"
msgstr "Brugere"
msgid "Are you sure you want to delete user \"%s\"?"
msgstr ""
msgstr "Er du sikker på du vil slette brugeren \"%s\"?"
msgid "Create user"
msgstr "Opret bruger"
@ -608,7 +610,7 @@ msgid ""
msgstr ""
msgid "Removed all in stock ingredients needed by recipe \"%s\" from stock"
msgstr ""
msgstr "Fjernede alle ingredienser til opskrift \"%s\" fra beholdningen"
msgid "Consume all ingredients needed by this recipe"
msgstr "Forbrug alle nødvendige ingredienser til denne opskrift"
@ -2767,3 +2769,8 @@ msgstr ""
msgid "List actions"
msgstr ""
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Brian Moos Lindberg <brian@blueeel.dk>, 2019
# Mihai Marinescu <mihai@marinescu.dk>, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2021
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2022
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
#

View File

@ -1,6 +1,5 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2023
# Bernd Bestel <bernd@berrnd.de>, 2025
#
msgid ""
msgstr ""
@ -8,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2023\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Language-Team: German (https://app.transifex.com/grocy/teams/93189/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -411,3 +410,6 @@ msgstr "Bier"
msgid "Estonian"
msgstr "Estnisch"
msgid "Bulgarian"
msgstr "Bulgarisch"

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2025
#
@ -144,3 +143,7 @@ msgstr "Rumänisch"
# Estonian
msgid "et_EE"
msgstr "Estnisch"
# Bulgarian
msgid "bg_BG"
msgstr "Bulgarisch"

View File

@ -1,4 +1,3 @@
#
# Translators:
# @RubenKelevra <ruben@freifunk-nrw.de>, 2021
# Bernd Bestel <bernd@berrnd.de>, 2021

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2020
#

View File

@ -1,9 +1,8 @@
#
# Translators:
# Luca RHK <luca@rhk-in.de>, 2020
# Tobias Wolter <mumpfpuffel@gmail.com>, 2020
# @RubenKelevra <ruben@freifunk-nrw.de>, 2021
# Bernd Bestel <bernd@berrnd.de>, 2025
# Bernd Bestel <bernd@berrnd.de>, 2026
#
msgid ""
msgstr ""
@ -11,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: Bernd Bestel <bernd@berrnd.de>, 2025\n"
"Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2026\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"
@ -2851,3 +2850,11 @@ msgstr "Bestandsaktionen"
msgid "List actions"
msgstr "Listenaktionen"
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""
"Wenn dieses Produkt schon einmal im Bestand war und die gewünschte "
"Mengeneinheit hier nicht ausgewählt werden kann, erstelle zunächst eine "
"entsprechende ME-Umrechnung"

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2023
#

View File

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

View File

@ -1,4 +1,3 @@
#
# Translators:
# Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# datablitz7 <plant7@gmail.com>, 2019
# emmker kats, 2022

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2020
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# datablitz7 <plant7@gmail.com>, 2019
# ByteGet, 2020
@ -414,3 +413,6 @@ msgstr ""
msgid "Estonian"
msgstr ""
msgid "Bulgarian"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# ByteGet, 2020
# Thodoris Kalatzis <teo.kal@hotmail.com>, 2021
@ -145,3 +144,7 @@ msgstr ""
# Estonian
msgid "et_EE"
msgstr ""
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# datablitz7 <plant7@gmail.com>, 2020
# ByteGet, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020
# ByteGet, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Stathis Stamoulis <sstamoulis2010@gmail.com>, 2020
# Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020
@ -2707,3 +2706,8 @@ msgstr ""
msgid "List actions"
msgstr ""
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020
# ByteGet, 2020

View File

@ -107,3 +107,6 @@ msgstr "Romanian"
msgid "et_EE"
msgstr "Estonian"
msgid "bg_BG"
msgstr "Bulgarian"

View File

@ -1,4 +1,3 @@
#
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
# duck. <me@duck.me.uk>, 2020
@ -6,7 +5,7 @@
# Chris H <cjh861@outlook.com>, 2021
# David Knapman <dai.knapz@gmail.com>, 2021
# Johnnie Blows, 2022
# Andi Chandler <andi@gowling.com>, 2023
# Andi Chandler <andi@gowling.com>, 2025
#
msgid ""
msgstr ""
@ -14,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2023\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2025\n"
"Language-Team: English (United Kingdom) (https://app.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -417,3 +416,6 @@ msgstr "Beer"
msgid "Estonian"
msgstr "Estonian"
msgid "Bulgarian"
msgstr "Bulgarian"

View File

@ -107,3 +107,6 @@ msgstr "Romanian"
msgid "et_EE"
msgstr "Estonian"
msgid "bg_BG"
msgstr "Bulgarian"

View File

@ -1,4 +1,3 @@
#
# Translators:
# Jonathan Adams <jonathan@connockadams.uk>, 2020
# Ben Fayers <ben.fayers@gmail.com>, 2020
@ -6,7 +5,7 @@
# John Coles <john@johncoles.com>, 2020
# w ralb <g.frcy.trnsfx@barlowhome.org>, 2021
# George Aston, 2024
# Andi Chandler <andi@gowling.com>, 2025
# Andi Chandler <andi@gowling.com>, 2026
#
msgid ""
msgstr ""
@ -14,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01T17:59:17+00:00\n"
"PO-Revision-Date: 2019-05-01 17:42+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2025\n"
"Last-Translator: Andi Chandler <andi@gowling.com>, 2026\n"
"Language-Team: English (United Kingdom) (https://app.transifex.com/grocy/teams/93189/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -2798,3 +2797,10 @@ msgstr "Stock actions"
msgid "List actions"
msgstr "List actions"
msgid ""
"After this product was once in stock and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"
msgstr ""
"After this product was once in stock, and when the desired quantity unit "
"cannot be selected here, first create a corresponding unit conversion"

View File

@ -1,4 +1,3 @@
#
# Translators:
# Alberto Martin <ami232@gmail.com>, 2021
# GRBaset, 2022

View File

@ -1,4 +1,3 @@
#
# Translators:
# GRBaset, 2023
#

View File

@ -1,4 +1,3 @@
#
# Translators:
# Bernd Bestel <bernd@berrnd.de>, 2019
# José Rugel <joserugel@gmail.com>, 2020

View File

@ -1,4 +1,3 @@
#
# Translators:
# Ankue <ankue.spam@gmail.com>, 2019
# Fernando Sánchez <fernando.l.sanchez@gmail.com>, 2019
@ -429,3 +428,6 @@ msgstr "Cerveza"
msgid "Estonian"
msgstr "Estonio"
msgid "Bulgarian"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Alberto Martin <ami232@gmail.com>, 2021
# Jose Manuel Ruiz, 2023
@ -146,3 +145,7 @@ msgstr "Rumano (Rumanía)"
# Estonian
msgid "et_EE"
msgstr "Estonio"
# Bulgarian
msgid "bg_BG"
msgstr ""

View File

@ -1,4 +1,3 @@
#
# Translators:
# Enrique Lapenta <enriquelap20@gmail.com>, 2020
# Alberto Martin <ami232@gmail.com>, 2021

View File

@ -1,4 +1,3 @@
#
# Translators:
# Alberto Martin <ami232@gmail.com>, 2021
#

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