mirror of
https://github.com/grocy/grocy.git
synced 2025-10-16 18:25:10 +00:00
Compare commits
57 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
acd1e7337c | ||
|
3586bf77c3 | ||
|
ff886fea61 | ||
|
5bd00d8be7 | ||
|
9f36a599a4 | ||
|
ff15e81abe | ||
|
e8b471f572 | ||
|
2d8ad24887 | ||
|
45db9ff90c | ||
|
c813a6500d | ||
|
1077149784 | ||
|
e08dfb408c | ||
|
fcdeda91d9 | ||
|
4932b9c6d2 | ||
|
7f2942d414 | ||
|
3a1c5efcfd | ||
|
816eb03147 | ||
|
8504429f5f | ||
|
90291fdbca | ||
|
77b0bc675c | ||
|
8020f92d6b | ||
|
38825c70da | ||
|
bb5daa5f8b | ||
|
8c11d0f15d | ||
|
5b544f76a5 | ||
|
6f93da9b5f | ||
|
e9ef7ea6d8 | ||
|
54a23019b8 | ||
|
89ad25c904 | ||
|
ee38d626aa | ||
|
40b60bed85 | ||
|
b89643ddb1 | ||
|
32e878afc9 | ||
|
9974305ad4 | ||
|
a3b2d03d68 | ||
|
01e9e3f5ce | ||
|
b5ac319a90 | ||
|
ad09630dbe | ||
|
03720940d4 | ||
|
dfc05e0bec | ||
|
9e139e2b73 | ||
|
5c622b9512 | ||
|
eec3515b6d | ||
|
276bc94cc6 | ||
|
bfa59dd29c | ||
|
0ce8d706a6 | ||
|
98d95f80df | ||
|
a72afa7174 | ||
|
0d145bbf1e | ||
|
f6cf26009d | ||
|
c042657dd8 | ||
|
43c9ab7734 | ||
|
f6649d51bd | ||
|
2e265ac70a | ||
|
30e54997b2 | ||
|
b9f0470d76 | ||
|
bdcd176f81 |
16
.devtools/create_release_package.bat
Normal file
16
.devtools/create_release_package.bat
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
set projectPath=%~dp0
|
||||||
|
if %projectPath:~-1%==\ set projectPath=%projectPath:~0,-1%
|
||||||
|
set projectPath=%projectPath%\..
|
||||||
|
|
||||||
|
set releasePath=%projectPath%\.release
|
||||||
|
mkdir "%releasePath%"
|
||||||
|
|
||||||
|
copy "%projectPath%\version.json" versiontemp.json
|
||||||
|
for /f "tokens=*" %%a in ('jq .Version versiontemp.json --raw-output') do set version=%%a
|
||||||
|
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!publication_assets
|
||||||
|
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\*
|
4
.devtools/install_dependencies.bat
Normal file
4
.devtools/install_dependencies.bat
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
pushd ..
|
||||||
|
call composer install
|
||||||
|
yarn install
|
||||||
|
popd
|
3
.devtools/transifex_download.bat
Normal file
3
.devtools/transifex_download.bat
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pushd ..
|
||||||
|
tx pull --all --minimum-perc=90
|
||||||
|
popd
|
3
.devtools/transifex_upload.bat
Normal file
3
.devtools/transifex_upload.bat
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pushd ..
|
||||||
|
tx push --source
|
||||||
|
popd
|
4
.devtools/update_dependencies.bat
Normal file
4
.devtools/update_dependencies.bat
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
pushd ..
|
||||||
|
call composer update
|
||||||
|
yarn upgrade
|
||||||
|
popd
|
@@ -73,6 +73,9 @@ There is no plugin included for any service, see the reference implementation in
|
|||||||
### Database migrations
|
### Database migrations
|
||||||
Database schema migration is automatically done when visiting the root (`/`) route (click on the logo in the left upper edge).
|
Database schema migration is automatically done when visiting the root (`/`) route (click on the logo in the left upper edge).
|
||||||
|
|
||||||
|
### Disable certain features
|
||||||
|
If you don't use certain feature sets of grocy (for example if you don't need "Chores"), there are feature flags per major feature set to hide/disable the related UI elements (see `config-dist.php`)
|
||||||
|
|
||||||
### Adding your own CSS or JS without to have to modify the application itself
|
### Adding your own CSS or JS without to have to modify the application itself
|
||||||
- When the file `data/custom_js.html` exists, the contents of the file will be added just before `</body>` (end of body) on every page
|
- When the file `data/custom_js.html` exists, the contents of the file will be added just before `</body>` (end of body) on every page
|
||||||
- When the file `data/custom_css.html` exists, the contents of the file will be added just before `</head>` (end of head) on every page
|
- When the file `data/custom_css.html` exists, the contents of the file will be added just before `</head>` (end of head) on every page
|
||||||
|
13
build.bat
13
build.bat
@@ -1,13 +0,0 @@
|
|||||||
set projectPath=%~dp0
|
|
||||||
if %projectPath:~-1%==\ set projectPath=%projectPath:~0,-1%
|
|
||||||
|
|
||||||
set releasePath=%projectPath%\.release
|
|
||||||
mkdir "%releasePath%"
|
|
||||||
|
|
||||||
for /f "tokens=*" %%a in ('build_tools\jq.exe .Version version.json --raw-output') do set version=%%a
|
|
||||||
|
|
||||||
del "%releasePath%\grocy_%version%.zip"
|
|
||||||
"build_tools\7za.exe" a -r "%releasePath%\grocy_%version%.zip" "%projectPath%\*" -xr!.* -xr!build_tools -xr!build.bat -xr!composer.json -xr!composer.lock -xr!package.json -xr!yarn.lock -xr!publication_assets
|
|
||||||
"build_tools\7za.exe" a "%releasePath%\grocy_%version%.zip" "%projectPath%\public\.htaccess"
|
|
||||||
"build_tools\7za.exe" rn "%releasePath%\grocy_%version%.zip" .htaccess public\.htaccess
|
|
||||||
"build_tools\7za.exe" d "%releasePath%\grocy_%version%.zip" data\*.* data\storage data\viewcache\*
|
|
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,8 @@
|
|||||||
"slim/slim": "^3.8",
|
"slim/slim": "^3.8",
|
||||||
"morris/lessql": "^0.3.4",
|
"morris/lessql": "^0.3.4",
|
||||||
"rubellum/slim-blade-view": "^0.1.1",
|
"rubellum/slim-blade-view": "^0.1.1",
|
||||||
"tuupola/cors-middleware": "^0.7.0"
|
"tuupola/cors-middleware": "^0.7.0",
|
||||||
|
"eluceo/ical": "^0.15.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
328
composer.lock
generated
328
composer.lock
generated
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"_readme": [
|
"_readme": [
|
||||||
"This file locks the dependencies of your project to a known state",
|
"This file locks the dependencies of your project to a known state",
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "c1bc4c17739e9d0ee8b33628f6d4b9a4",
|
"content-hash": "0b203f875499dfeaa61890cdec018a2d",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "container-interop/container-interop",
|
"name": "container-interop/container-interop",
|
||||||
@@ -104,6 +104,57 @@
|
|||||||
],
|
],
|
||||||
"time": "2018-01-09T20:05:19+00:00"
|
"time": "2018-01-09T20:05:19+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "eluceo/ical",
|
||||||
|
"version": "0.15.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/markuspoerschke/iCal.git",
|
||||||
|
"reference": "add0ca99aa1f77f134a2e8b071f2ebc22b115139"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/markuspoerschke/iCal/zipball/add0ca99aa1f77f134a2e8b071f2ebc22b115139",
|
||||||
|
"reference": "add0ca99aa1f77f134a2e8b071f2ebc22b115139",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^6.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-mbstring": "Massive performance enhancement of line folding"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Eluceo\\iCal\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Markus Poerschke",
|
||||||
|
"email": "markus@eluceo.de",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The eluceo/iCal package offers a abstraction layer for creating iCalendars. You can easily create iCal files by using PHP object instead of typing your *.ics file by hand. The output will follow RFC 5545 as best as possible.",
|
||||||
|
"homepage": "https://github.com/markuspoerschke/iCal",
|
||||||
|
"keywords": [
|
||||||
|
"calendar",
|
||||||
|
"iCalendar",
|
||||||
|
"ical",
|
||||||
|
"ics",
|
||||||
|
"php calendar"
|
||||||
|
],
|
||||||
|
"time": "2019-01-13T22:00:58+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "http-interop/http-factory",
|
"name": "http-interop/http-factory",
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
@@ -159,28 +210,28 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/container",
|
"name": "illuminate/container",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/container.git",
|
"url": "https://github.com/illuminate/container.git",
|
||||||
"reference": "4c90c3d3ba88e52da152e885d24c9f891a2ec545"
|
"reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/container/zipball/4c90c3d3ba88e52da152e885d24c9f891a2ec545",
|
"url": "https://api.github.com/repos/illuminate/container/zipball/b984960d2634c6be97b0dd368a8953e8c4e06ec7",
|
||||||
"reference": "4c90c3d3ba88e52da152e885d24c9f891a2ec545",
|
"reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/contracts": "5.7.*",
|
"illuminate/contracts": "5.8.*",
|
||||||
"illuminate/support": "5.7.*",
|
"illuminate/support": "5.8.*",
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"psr/container": "^1.0"
|
"psr/container": "^1.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -200,20 +251,20 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate Container package.",
|
"description": "The Illuminate Container package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-18T03:39:45+00:00"
|
"time": "2019-03-03T15:13:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/contracts",
|
"name": "illuminate/contracts",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/contracts.git",
|
"url": "https://github.com/illuminate/contracts.git",
|
||||||
"reference": "64df81d3382d876f1c1d3d5481d89c93b61b8279"
|
"reference": "3e3a9a654adbf798e05491a5dbf90112df1effde"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/contracts/zipball/64df81d3382d876f1c1d3d5481d89c93b61b8279",
|
"url": "https://api.github.com/repos/illuminate/contracts/zipball/3e3a9a654adbf798e05491a5dbf90112df1effde",
|
||||||
"reference": "64df81d3382d876f1c1d3d5481d89c93b61b8279",
|
"reference": "3e3a9a654adbf798e05491a5dbf90112df1effde",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -224,7 +275,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -244,32 +295,32 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate Contracts package.",
|
"description": "The Illuminate Contracts package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-08T13:34:14+00:00"
|
"time": "2019-02-18T18:37:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/events",
|
"name": "illuminate/events",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/events.git",
|
"url": "https://github.com/illuminate/events.git",
|
||||||
"reference": "a8e5e3d601ad7f3571428176a578ddf03ce649d8"
|
"reference": "a85d7c273bc4e3357000c5fc4812374598515de3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/events/zipball/a8e5e3d601ad7f3571428176a578ddf03ce649d8",
|
"url": "https://api.github.com/repos/illuminate/events/zipball/a85d7c273bc4e3357000c5fc4812374598515de3",
|
||||||
"reference": "a8e5e3d601ad7f3571428176a578ddf03ce649d8",
|
"reference": "a85d7c273bc4e3357000c5fc4812374598515de3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/container": "5.7.*",
|
"illuminate/container": "5.8.*",
|
||||||
"illuminate/contracts": "5.7.*",
|
"illuminate/contracts": "5.8.*",
|
||||||
"illuminate/support": "5.7.*",
|
"illuminate/support": "5.8.*",
|
||||||
"php": "^7.1.3"
|
"php": "^7.1.3"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -289,27 +340,27 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate Events package.",
|
"description": "The Illuminate Events package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-06T18:48:42+00:00"
|
"time": "2019-02-18T18:37:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/filesystem",
|
"name": "illuminate/filesystem",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/filesystem.git",
|
"url": "https://github.com/illuminate/filesystem.git",
|
||||||
"reference": "cbb5650be36d7370f7ae5f039d2143952fa58f51"
|
"reference": "8aef3ed5028eea80fa20287b776d6ec8e7eafbba"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/filesystem/zipball/cbb5650be36d7370f7ae5f039d2143952fa58f51",
|
"url": "https://api.github.com/repos/illuminate/filesystem/zipball/8aef3ed5028eea80fa20287b776d6ec8e7eafbba",
|
||||||
"reference": "cbb5650be36d7370f7ae5f039d2143952fa58f51",
|
"reference": "8aef3ed5028eea80fa20287b776d6ec8e7eafbba",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/contracts": "5.7.*",
|
"illuminate/contracts": "5.8.*",
|
||||||
"illuminate/support": "5.7.*",
|
"illuminate/support": "5.8.*",
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/finder": "^4.1"
|
"symfony/finder": "^4.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.0).",
|
"league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.0).",
|
||||||
@@ -321,7 +372,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -341,43 +392,45 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate Filesystem package.",
|
"description": "The Illuminate Filesystem package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-24T12:49:16+00:00"
|
"time": "2019-02-18T18:37:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/support",
|
"name": "illuminate/support",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/support.git",
|
"url": "https://github.com/illuminate/support.git",
|
||||||
"reference": "45bfc0cd080c51946f61c04e324c2b4c6df58a9d"
|
"reference": "0f0291d1bc2f036af3fceb8e46900b58812533c4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/support/zipball/45bfc0cd080c51946f61c04e324c2b4c6df58a9d",
|
"url": "https://api.github.com/repos/illuminate/support/zipball/0f0291d1bc2f036af3fceb8e46900b58812533c4",
|
||||||
"reference": "45bfc0cd080c51946f61c04e324c2b4c6df58a9d",
|
"reference": "0f0291d1bc2f036af3fceb8e46900b58812533c4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"doctrine/inflector": "^1.1",
|
"doctrine/inflector": "^1.1",
|
||||||
|
"ext-json": "*",
|
||||||
"ext-mbstring": "*",
|
"ext-mbstring": "*",
|
||||||
"illuminate/contracts": "5.7.*",
|
"illuminate/contracts": "5.8.*",
|
||||||
"nesbot/carbon": "^1.26.3",
|
"nesbot/carbon": "^1.26.3 || ^2.0",
|
||||||
"php": "^7.1.3"
|
"php": "^7.1.3"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"tightenco/collect": "<5.5.33"
|
"tightenco/collect": "<5.5.33"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"illuminate/filesystem": "Required to use the composer class (5.7.*).",
|
"illuminate/filesystem": "Required to use the composer class (5.8.*).",
|
||||||
"moontoast/math": "Required to use ordered UUIDs (^1.1).",
|
"moontoast/math": "Required to use ordered UUIDs (^1.1).",
|
||||||
"ramsey/uuid": "Required to use Str::uuid() (^3.7).",
|
"ramsey/uuid": "Required to use Str::uuid() (^3.7).",
|
||||||
"symfony/process": "Required to use the composer class (^4.1).",
|
"symfony/process": "Required to use the composer class (^4.2).",
|
||||||
"symfony/var-dumper": "Required to use the dd function (^4.1)."
|
"symfony/var-dumper": "Required to use the dd function (^4.2).",
|
||||||
|
"vlucas/phpdotenv": "Required to use the env helper (^3.3)."
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -400,35 +453,36 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate Support package.",
|
"description": "The Illuminate Support package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-22T17:36:06+00:00"
|
"time": "2019-03-05T13:38:58+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/view",
|
"name": "illuminate/view",
|
||||||
"version": "v5.7.11",
|
"version": "v5.8.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/view.git",
|
"url": "https://github.com/illuminate/view.git",
|
||||||
"reference": "97dbb6910aa5df5a7414877da89b7520f4260a58"
|
"reference": "33818dc7b783f3afbeea9b0b09455c8cc89aa899"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/view/zipball/97dbb6910aa5df5a7414877da89b7520f4260a58",
|
"url": "https://api.github.com/repos/illuminate/view/zipball/33818dc7b783f3afbeea9b0b09455c8cc89aa899",
|
||||||
"reference": "97dbb6910aa5df5a7414877da89b7520f4260a58",
|
"reference": "33818dc7b783f3afbeea9b0b09455c8cc89aa899",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/container": "5.7.*",
|
"ext-json": "*",
|
||||||
"illuminate/contracts": "5.7.*",
|
"illuminate/container": "5.8.*",
|
||||||
"illuminate/events": "5.7.*",
|
"illuminate/contracts": "5.8.*",
|
||||||
"illuminate/filesystem": "5.7.*",
|
"illuminate/events": "5.8.*",
|
||||||
"illuminate/support": "5.7.*",
|
"illuminate/filesystem": "5.8.*",
|
||||||
|
"illuminate/support": "5.8.*",
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/debug": "^4.1"
|
"symfony/debug": "^4.2"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.7-dev"
|
"dev-master": "5.8-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -448,7 +502,7 @@
|
|||||||
],
|
],
|
||||||
"description": "The Illuminate View package.",
|
"description": "The Illuminate View package.",
|
||||||
"homepage": "https://laravel.com",
|
"homepage": "https://laravel.com",
|
||||||
"time": "2018-10-11T15:32:19+00:00"
|
"time": "2019-02-27T12:03:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "morris/lessql",
|
"name": "morris/lessql",
|
||||||
@@ -555,28 +609,30 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nesbot/carbon",
|
"name": "nesbot/carbon",
|
||||||
"version": "1.36.1",
|
"version": "2.14.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/briannesbitt/Carbon.git",
|
"url": "https://github.com/briannesbitt/Carbon.git",
|
||||||
"reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983"
|
"reference": "a1f4f9abcde8241ce33bf5090896e9c16d0b4232"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/63da8cdf89d7a5efe43aabc794365f6e7b7b8983",
|
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a1f4f9abcde8241ce33bf5090896e9c16d0b4232",
|
||||||
"reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983",
|
"reference": "a1f4f9abcde8241ce33bf5090896e9c16d0b4232",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.9",
|
"ext-json": "*",
|
||||||
"symfony/translation": "~2.6 || ~3.0 || ~4.0"
|
"php": "^7.1.8 || ^8.0",
|
||||||
|
"symfony/translation": "^3.4 || ^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^4.8.35 || ^5.7"
|
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
|
||||||
},
|
"kylekatarnls/multi-tester": "^0.1",
|
||||||
"suggest": {
|
"phpmd/phpmd": "^2.6",
|
||||||
"friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.",
|
"phpstan/phpstan": "^0.10.8",
|
||||||
"phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors."
|
"phpunit/phpunit": "^7.5 || ^8.0",
|
||||||
|
"squizlabs/php_codesniffer": "^3.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -588,7 +644,7 @@
|
|||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"": "src/"
|
"Carbon\\": "src/Carbon/"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
@@ -609,7 +665,7 @@
|
|||||||
"datetime",
|
"datetime",
|
||||||
"time"
|
"time"
|
||||||
],
|
],
|
||||||
"time": "2018-11-22T18:23:02+00:00"
|
"time": "2019-02-28T09:07:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/fast-route",
|
"name": "nikic/fast-route",
|
||||||
@@ -902,16 +958,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-server-middleware",
|
"name": "psr/http-server-middleware",
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/http-server-middleware.git",
|
"url": "https://github.com/php-fig/http-server-middleware.git",
|
||||||
"reference": "ea17eb1fb2c8df6db919cc578451a8013c6a0ae5"
|
"reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/ea17eb1fb2c8df6db919cc578451a8013c6a0ae5",
|
"url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5",
|
||||||
"reference": "ea17eb1fb2c8df6db919cc578451a8013c6a0ae5",
|
"reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -951,7 +1007,7 @@
|
|||||||
"request",
|
"request",
|
||||||
"response"
|
"response"
|
||||||
],
|
],
|
||||||
"time": "2018-01-22T17:08:31+00:00"
|
"time": "2018-10-30T17:12:04+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/log",
|
"name": "psr/log",
|
||||||
@@ -1100,16 +1156,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "slim/slim",
|
"name": "slim/slim",
|
||||||
"version": "3.11.0",
|
"version": "3.12.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/slimphp/Slim.git",
|
"url": "https://github.com/slimphp/Slim.git",
|
||||||
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a"
|
"reference": "f4947cc900b6e51cbfda58b9f1247bca2f76f9f0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/slimphp/Slim/zipball/d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
"url": "https://api.github.com/repos/slimphp/Slim/zipball/f4947cc900b6e51cbfda58b9f1247bca2f76f9f0",
|
||||||
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
"reference": "f4947cc900b6e51cbfda58b9f1247bca2f76f9f0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1167,20 +1223,88 @@
|
|||||||
"micro",
|
"micro",
|
||||||
"router"
|
"router"
|
||||||
],
|
],
|
||||||
"time": "2018-09-16T10:54:21+00:00"
|
"time": "2019-01-15T13:21:25+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/debug",
|
"name": "symfony/contracts",
|
||||||
"version": "v4.1.7",
|
"version": "v1.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/debug.git",
|
"url": "https://github.com/symfony/contracts.git",
|
||||||
"reference": "19090917b848a799cbae4800abf740fe4eb71c1d"
|
"reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/debug/zipball/19090917b848a799cbae4800abf740fe4eb71c1d",
|
"url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf",
|
||||||
"reference": "19090917b848a799cbae4800abf740fe4eb71c1d",
|
"reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/cache": "^1.0",
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/cache": "When using the Cache contracts",
|
||||||
|
"psr/container": "When using the Service contracts",
|
||||||
|
"symfony/cache-contracts-implementation": "",
|
||||||
|
"symfony/service-contracts-implementation": "",
|
||||||
|
"symfony/translation-contracts-implementation": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Contracts\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"**/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nicolas Grekas",
|
||||||
|
"email": "p@tchwork.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A set of abstractions extracted out of the Symfony components",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"abstractions",
|
||||||
|
"contracts",
|
||||||
|
"decoupling",
|
||||||
|
"interfaces",
|
||||||
|
"interoperability",
|
||||||
|
"standards"
|
||||||
|
],
|
||||||
|
"time": "2018-12-05T08:06:11+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/debug",
|
||||||
|
"version": "v4.2.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/debug.git",
|
||||||
|
"reference": "de73f48977b8eaf7ce22814d66e43a1662cc864f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/debug/zipball/de73f48977b8eaf7ce22814d66e43a1662cc864f",
|
||||||
|
"reference": "de73f48977b8eaf7ce22814d66e43a1662cc864f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1196,7 +1320,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "4.1-dev"
|
"dev-master": "4.2-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -1223,20 +1347,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Debug Component",
|
"description": "Symfony Debug Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2018-10-31T09:09:42+00:00"
|
"time": "2019-03-03T18:11:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
"version": "v4.1.7",
|
"version": "v4.2.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/finder.git",
|
"url": "https://github.com/symfony/finder.git",
|
||||||
"reference": "1f17195b44543017a9c9b2d437c670627e96ad06"
|
"reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06",
|
"url": "https://api.github.com/repos/symfony/finder/zipball/267b7002c1b70ea80db0833c3afe05f0fbde580a",
|
||||||
"reference": "1f17195b44543017a9c9b2d437c670627e96ad06",
|
"reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1245,7 +1369,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "4.1-dev"
|
"dev-master": "4.2-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -1272,7 +1396,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Finder Component",
|
"description": "Symfony Finder Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2018-10-03T08:47:56+00:00"
|
"time": "2019-02-23T15:42:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
@@ -1335,20 +1459,21 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation",
|
"name": "symfony/translation",
|
||||||
"version": "v4.1.7",
|
"version": "v4.2.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/translation.git",
|
"url": "https://github.com/symfony/translation.git",
|
||||||
"reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c"
|
"reference": "748464177a77011f8f4cdd076773862ce4915f8f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/translation/zipball/aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c",
|
"url": "https://api.github.com/repos/symfony/translation/zipball/748464177a77011f8f4cdd076773862ce4915f8f",
|
||||||
"reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c",
|
"reference": "748464177a77011f8f4cdd076773862ce4915f8f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
|
"symfony/contracts": "^1.0.2",
|
||||||
"symfony/polyfill-mbstring": "~1.0"
|
"symfony/polyfill-mbstring": "~1.0"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
@@ -1356,6 +1481,9 @@
|
|||||||
"symfony/dependency-injection": "<3.4",
|
"symfony/dependency-injection": "<3.4",
|
||||||
"symfony/yaml": "<3.4"
|
"symfony/yaml": "<3.4"
|
||||||
},
|
},
|
||||||
|
"provide": {
|
||||||
|
"symfony/translation-contracts-implementation": "1.0"
|
||||||
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"psr/log": "~1.0",
|
"psr/log": "~1.0",
|
||||||
"symfony/config": "~3.4|~4.0",
|
"symfony/config": "~3.4|~4.0",
|
||||||
@@ -1373,7 +1501,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "4.1-dev"
|
"dev-master": "4.2-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -1400,7 +1528,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Translation Component",
|
"description": "Symfony Translation Component",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"time": "2018-10-28T18:38:52+00:00"
|
"time": "2019-02-27T03:31:50+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tuupola/callable-handler",
|
"name": "tuupola/callable-handler",
|
||||||
|
@@ -1,5 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
# Settings can also be overwritten in two ways
|
||||||
|
#
|
||||||
|
# First priority
|
||||||
|
# A .txt file with the same name as the setting in /data/settingoverrides
|
||||||
|
# the content of the file is used as the setting value
|
||||||
|
#
|
||||||
|
# Second priority
|
||||||
|
# An environment variable with the same name as the setting and prefix "GROCY_"
|
||||||
|
# so for example "GROCY_BASE_URL"
|
||||||
|
#
|
||||||
|
# Third priority
|
||||||
|
# The settings defined here below
|
||||||
|
|
||||||
|
|
||||||
# Either "production", "dev" or "prerelease"
|
# Either "production", "dev" or "prerelease"
|
||||||
Setting('MODE', 'production');
|
Setting('MODE', 'production');
|
||||||
|
|
||||||
@@ -14,7 +28,7 @@ Setting('CURRENCY', '$');
|
|||||||
|
|
||||||
# The base url of your installation,
|
# The base url of your installation,
|
||||||
# should be just "/" when running directly under the root of a (sub)domain
|
# should be just "/" when running directly under the root of a (sub)domain
|
||||||
# or for example "https:/example.com/grocy" when using a subdirectory
|
# or for example "https://example.com/grocy" when using a subdirectory
|
||||||
Setting('BASE_URL', '/');
|
Setting('BASE_URL', '/');
|
||||||
|
|
||||||
# The plugin to use for external barcode lookups,
|
# The plugin to use for external barcode lookups,
|
||||||
@@ -27,6 +41,8 @@ Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'DemoBarcodeLookupPlugin');
|
|||||||
Setting('DISABLE_URL_REWRITING', false);
|
Setting('DISABLE_URL_REWRITING', false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default user settings
|
# Default user settings
|
||||||
# These settings can be changed per user, here the defaults
|
# These settings can be changed per user, here the defaults
|
||||||
# are defined which are used when the user has not changed the setting so far
|
# are defined which are used when the user has not changed the setting so far
|
||||||
@@ -53,3 +69,19 @@ DefaultUserSetting('show_clock_in_header', false);
|
|||||||
# Automatically do the booking using the last price and the amount
|
# Automatically do the booking using the last price and the amount
|
||||||
# of the shopping list item, if the product has "Default best before days" set
|
# of the shopping list item, if the product has "Default best before days" set
|
||||||
DefaultUserSetting('shopping_list_to_stock_workflow_auto_submit_when_prefilled', false);
|
DefaultUserSetting('shopping_list_to_stock_workflow_auto_submit_when_prefilled', false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Feature flags
|
||||||
|
# grocy was initially about "stock management for your household", many other things
|
||||||
|
# came and still come by, because they are useful - here you can disable the parts
|
||||||
|
# which you don't need to have a less cluttered UI
|
||||||
|
# (set the setting to "false" to disable the corresponding part, which should be self explanatory)
|
||||||
|
Setting('FEATURE_FLAG_SHOPPINGLIST', true);
|
||||||
|
Setting('FEATURE_FLAG_RECIPES', true);
|
||||||
|
Setting('FEATURE_FLAG_CHORES', true);
|
||||||
|
Setting('FEATURE_FLAG_TASKS', true);
|
||||||
|
Setting('FEATURE_FLAG_BATTERIES', true);
|
||||||
|
Setting('FEATURE_FLAG_EQUIPMENT', true);
|
||||||
|
Setting('FEATURE_FLAG_CALENDAR', true);
|
||||||
|
@@ -18,10 +18,14 @@ class BaseApiController extends BaseController
|
|||||||
return json_encode($data);
|
return json_encode($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function VoidApiActionResponse($response, $success = true, $status = 200, $errorMessage = '')
|
protected function EmptyApiResponse($response, $status = 204)
|
||||||
|
{
|
||||||
|
return $response->withStatus($status);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function GenericErrorResponse($response, $errorMessage, $status = 400)
|
||||||
{
|
{
|
||||||
return $response->withStatus($status)->withJson(array(
|
return $response->withStatus($status)->withJson(array(
|
||||||
'success' => $success,
|
|
||||||
'error_message' => $errorMessage
|
'error_message' => $errorMessage
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@@ -49,6 +49,16 @@ class BaseController
|
|||||||
}
|
}
|
||||||
$container->view->set('embedded', $embedded);
|
$container->view->set('embedded', $embedded);
|
||||||
|
|
||||||
|
$constants = get_defined_constants();
|
||||||
|
foreach ($constants as $constant => $value)
|
||||||
|
{
|
||||||
|
if (substr($constant, 0, 19) !== 'GROCY_FEATURE_FLAG_')
|
||||||
|
{
|
||||||
|
unset($constants[$constant]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$container->view->set('featureFlags', $constants);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$usersService = new UsersService();
|
$usersService = new UsersService();
|
||||||
|
@@ -16,20 +16,22 @@ class BatteriesApiController extends BaseApiController
|
|||||||
|
|
||||||
public function TrackChargeCycle(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function TrackChargeCycle(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$trackedTime = date('Y-m-d H:i:s');
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['tracked_time']) && !empty($request->getQueryParams()['tracked_time']) && IsIsoDateTime($request->getQueryParams()['tracked_time']))
|
|
||||||
{
|
|
||||||
$trackedTime = $request->getQueryParams()['tracked_time'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
$trackedTime = date('Y-m-d H:i:s');
|
||||||
|
if (array_key_exists('tracked_time', $requestBody) && IsIsoDateTime($requestBody['tracked_time']))
|
||||||
|
{
|
||||||
|
$trackedTime = $requestBody['tracked_time'];
|
||||||
|
}
|
||||||
|
|
||||||
$chargeCycleId = $this->BatteriesService->TrackChargeCycle($args['batteryId'], $trackedTime);
|
$chargeCycleId = $this->BatteriesService->TrackChargeCycle($args['batteryId'], $trackedTime);
|
||||||
return $this->ApiResponse(array('charge_cycle_id' => $chargeCycleId));
|
return $this->ApiResponse($this->Database->battery_charge_cycles($chargeCycleId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +43,7 @@ class BatteriesApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,11 +57,11 @@ class BatteriesApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->ApiResponse($this->BatteriesService->UndoChargeCycle($args['chargeCycleId']));
|
$this->ApiResponse($this->BatteriesService->UndoChargeCycle($args['chargeCycleId']));
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
62
controllers/CalendarApiController.php
Normal file
62
controllers/CalendarApiController.php
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Grocy\Controllers;
|
||||||
|
|
||||||
|
use \Grocy\Services\CalendarService;
|
||||||
|
use \Grocy\Services\ApiKeyService;
|
||||||
|
|
||||||
|
class CalendarApiController extends BaseApiController
|
||||||
|
{
|
||||||
|
public function __construct(\Slim\Container $container)
|
||||||
|
{
|
||||||
|
parent::__construct($container);
|
||||||
|
$this->CalendarService = new CalendarService();
|
||||||
|
$this->ApiKeyService = new ApiKeyService();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected $CalendarService;
|
||||||
|
protected $ApiKeyService;
|
||||||
|
|
||||||
|
public function Ical(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$vCalendar = new \Eluceo\iCal\Component\Calendar('grocy');
|
||||||
|
|
||||||
|
$events = $this->CalendarService->GetEvents();
|
||||||
|
foreach($events as $event)
|
||||||
|
{
|
||||||
|
$vEvent = new \Eluceo\iCal\Component\Event();
|
||||||
|
$vEvent->setDtStart(new \DateTime($event['start']))
|
||||||
|
->setDtEnd(new \DateTime($event['start']))
|
||||||
|
->setSummary($event['title'])
|
||||||
|
->setNoTime($event['date_format'] === 'date')
|
||||||
|
->setUseUtc(false);
|
||||||
|
|
||||||
|
$vCalendar->addComponent($vEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response->write($vCalendar->render());
|
||||||
|
$response = $response->withHeader('Content-Type', 'text/calendar; charset=utf-8');
|
||||||
|
return $response->withHeader('Content-Disposition', 'attachment; filename="grocy.ics"');
|
||||||
|
}
|
||||||
|
catch (\Exception $ex)
|
||||||
|
{
|
||||||
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IcalSharingLink(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return $this->ApiResponse(array(
|
||||||
|
'url' => $this->AppContainer->UrlManager->ConstructUrl('/api/calendar/ical?secret=' . $this->ApiKeyService->GetOrCreateApiKey(ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
catch (\Exception $ex)
|
||||||
|
{
|
||||||
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2,80 +2,22 @@
|
|||||||
|
|
||||||
namespace Grocy\Controllers;
|
namespace Grocy\Controllers;
|
||||||
|
|
||||||
use \Grocy\Services\StockService;
|
use \Grocy\Services\CalendarService;
|
||||||
use \Grocy\Services\TasksService;
|
|
||||||
use \Grocy\Services\ChoresService;
|
|
||||||
use \Grocy\Services\BatteriesService;
|
|
||||||
|
|
||||||
class CalendarController extends BaseController
|
class CalendarController extends BaseController
|
||||||
{
|
{
|
||||||
public function __construct(\Slim\Container $container)
|
public function __construct(\Slim\Container $container)
|
||||||
{
|
{
|
||||||
parent::__construct($container);
|
parent::__construct($container);
|
||||||
$this->StockService = new StockService();
|
$this->CalendarService = new CalendarService();
|
||||||
$this->TasksService = new TasksService();
|
|
||||||
$this->ChoresService = new ChoresService();
|
|
||||||
$this->BatteriesService = new BatteriesService();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $StockService;
|
protected $CalendarService;
|
||||||
protected $TasksService;
|
|
||||||
protected $ChoresService;
|
|
||||||
protected $BatteriesService;
|
|
||||||
|
|
||||||
public function Overview(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function Overview(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$products = $this->Database->products();
|
|
||||||
$titlePrefix = $this->LocalizationService->Localize('Product expires') . ': ';
|
|
||||||
$stockEvents = array();
|
|
||||||
foreach($this->StockService->GetCurrentStock() as $currentStockEntry)
|
|
||||||
{
|
|
||||||
$stockEvents[] = array(
|
|
||||||
'title' => $titlePrefix . FindObjectInArrayByPropertyValue($products, 'id', $currentStockEntry->product_id)->name,
|
|
||||||
'start' => $currentStockEntry->best_before_date
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$titlePrefix = $this->LocalizationService->Localize('Task due') . ': ';
|
|
||||||
$taskEvents = array();
|
|
||||||
foreach($this->TasksService->GetCurrent() as $currentTaskEntry)
|
|
||||||
{
|
|
||||||
$taskEvents[] = array(
|
|
||||||
'title' => $titlePrefix . $currentTaskEntry->name,
|
|
||||||
'start' => $currentTaskEntry->due_date
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$chores = $this->Database->chores();
|
|
||||||
$titlePrefix = $this->LocalizationService->Localize('Chore due') . ': ';
|
|
||||||
$choreEvents = array();
|
|
||||||
foreach($this->ChoresService->GetCurrent() as $currentChoreEntry)
|
|
||||||
{
|
|
||||||
$choreEvents[] = array(
|
|
||||||
'title' => $titlePrefix . FindObjectInArrayByPropertyValue($chores, 'id', $currentChoreEntry->chore_id)->name,
|
|
||||||
'start' => $currentChoreEntry->next_estimated_execution_time
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$batteries = $this->Database->batteries();
|
|
||||||
$titlePrefix = $this->LocalizationService->Localize('Battery charge cycle due') . ': ';
|
|
||||||
$batteryEvents = array();
|
|
||||||
foreach($this->BatteriesService->GetCurrent() as $currentBatteryEntry)
|
|
||||||
{
|
|
||||||
$batteryEvents[] = array(
|
|
||||||
'title' => $titlePrefix . FindObjectInArrayByPropertyValue($batteries, 'id', $currentBatteryEntry->battery_id)->name,
|
|
||||||
'start' => $currentBatteryEntry->next_estimated_charge_time
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$fullcalendarEventSources = array();
|
|
||||||
$fullcalendarEventSources[] = $stockEvents;
|
|
||||||
$fullcalendarEventSources[] = $taskEvents;
|
|
||||||
$fullcalendarEventSources[] = $choreEvents;
|
|
||||||
$fullcalendarEventSources[] = $batteryEvents;
|
|
||||||
|
|
||||||
return $this->AppContainer->view->render($response, 'calendar', [
|
return $this->AppContainer->view->render($response, 'calendar', [
|
||||||
'fullcalendarEventSources' => $fullcalendarEventSources
|
'fullcalendarEventSources' => $this->CalendarService->GetEvents()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,26 +16,28 @@ class ChoresApiController extends BaseApiController
|
|||||||
|
|
||||||
public function TrackChoreExecution(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function TrackChoreExecution(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$trackedTime = date('Y-m-d H:i:s');
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['tracked_time']) && !empty($request->getQueryParams()['tracked_time']) && IsIsoDateTime($request->getQueryParams()['tracked_time']))
|
|
||||||
{
|
|
||||||
$trackedTime = $request->getQueryParams()['tracked_time'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$doneBy = GROCY_USER_ID;
|
|
||||||
if (isset($request->getQueryParams()['done_by']) && !empty($request->getQueryParams()['done_by']))
|
|
||||||
{
|
|
||||||
$doneBy = $request->getQueryParams()['done_by'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
$trackedTime = date('Y-m-d H:i:s');
|
||||||
|
if (array_key_exists('tracked_time', $requestBody) && IsIsoDateTime($requestBody['tracked_time']))
|
||||||
|
{
|
||||||
|
$trackedTime = $requestBody['tracked_time'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$doneBy = GROCY_USER_ID;
|
||||||
|
if (array_key_exists('done_by', $requestBody) && !empty($requestBody['done_by']))
|
||||||
|
{
|
||||||
|
$doneBy = $requestBody['done_by'];
|
||||||
|
}
|
||||||
|
|
||||||
$choreExecutionId = $this->ChoresService->TrackChore($args['choreId'], $trackedTime, $doneBy);
|
$choreExecutionId = $this->ChoresService->TrackChore($args['choreId'], $trackedTime, $doneBy);
|
||||||
return $this->ApiResponse(array('chore_execution_id' => $choreExecutionId));
|
return $this->ApiResponse($this->Database->chores_log($choreExecutionId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +49,7 @@ class ChoresApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,11 +63,11 @@ class ChoresApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->ApiResponse($this->ChoresService->UndoChoreExecution($args['executionId']));
|
$this->ApiResponse($this->ChoresService->UndoChoreExecution($args['executionId']));
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,23 +18,23 @@ class FilesApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (isset($request->getQueryParams()['file_name']) && !empty($request->getQueryParams()['file_name']) && IsValidFileName($request->getQueryParams()['file_name']))
|
if (IsValidFileName(base64_decode($args['fileName'])))
|
||||||
{
|
{
|
||||||
$fileName = $request->getQueryParams()['file_name'];
|
$fileName = base64_decode($args['fileName']);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new \Exception('file_name query parameter missing or contains an invalid filename');
|
throw new \Exception('Invalid filename');
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $request->getBody()->getContents();
|
$data = $request->getBody()->getContents();
|
||||||
file_put_contents($this->FilesService->GetFilePath($args['group'], $fileName), $data);
|
file_put_contents($this->FilesService->GetFilePath($args['group'], $fileName), $data);
|
||||||
|
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,13 +42,13 @@ class FilesApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (isset($request->getQueryParams()['file_name']) && !empty($request->getQueryParams()['file_name']) && IsValidFileName($request->getQueryParams()['file_name']))
|
if (IsValidFileName(base64_decode($args['fileName'])))
|
||||||
{
|
{
|
||||||
$fileName = $request->getQueryParams()['file_name'];
|
$fileName = base64_decode($args['fileName']);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new \Exception('file_name query parameter missing or contains an invalid filename');
|
throw new \Exception('Invalid filename');
|
||||||
}
|
}
|
||||||
|
|
||||||
$filePath = $this->FilesService->GetFilePath($args['group'], $fileName);
|
$filePath = $this->FilesService->GetFilePath($args['group'], $fileName);
|
||||||
@@ -61,12 +61,12 @@ class FilesApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 404, 'File not found');
|
return $this->GenericErrorResponse($response, 'File not found', 404);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,13 +74,13 @@ class FilesApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (isset($request->getQueryParams()['file_name']) && !empty($request->getQueryParams()['file_name']) && IsValidFileName($request->getQueryParams()['file_name']))
|
if (IsValidFileName(base64_decode($args['fileName'])))
|
||||||
{
|
{
|
||||||
$fileName = $request->getQueryParams()['file_name'];
|
$fileName = base64_decode($args['fileName']);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new \Exception('file_name query parameter missing or contains an invalid filename');
|
throw new \Exception('Invalid filename');
|
||||||
}
|
}
|
||||||
|
|
||||||
$filePath = $this->FilesService->GetFilePath($args['group'], $fileName);
|
$filePath = $this->FilesService->GetFilePath($args['group'], $fileName);
|
||||||
@@ -89,11 +89,11 @@ class FilesApiController extends BaseApiController
|
|||||||
unlink($filePath);
|
unlink($filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ class GenericEntityApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, 'Entity does not exist or is not exposed');
|
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ class GenericEntityApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, 'Entity does not exist or is not exposed');
|
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,14 +32,28 @@ class GenericEntityApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
if ($this->IsValidEntity($args['entity']))
|
if ($this->IsValidEntity($args['entity']))
|
||||||
{
|
{
|
||||||
$newRow = $this->Database->{$args['entity']}()->createRow($request->getParsedBody());
|
$requestBody = $request->getParsedBody();
|
||||||
$newRow->save();
|
|
||||||
$success = $newRow->isClean();
|
try
|
||||||
return $this->ApiResponse(array('success' => $success));
|
{
|
||||||
|
if ($requestBody === null)
|
||||||
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
$newRow = $this->Database->{$args['entity']}()->createRow($requestBody);
|
||||||
|
$newRow->save();
|
||||||
|
$success = $newRow->isClean();
|
||||||
|
return $this->EmptyApiResponse($response);
|
||||||
|
}
|
||||||
|
catch (\Exception $ex)
|
||||||
|
{
|
||||||
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, 'Entity does not exist or is not exposed');
|
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,14 +61,28 @@ class GenericEntityApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
if ($this->IsValidEntity($args['entity']))
|
if ($this->IsValidEntity($args['entity']))
|
||||||
{
|
{
|
||||||
$row = $this->Database->{$args['entity']}($args['objectId']);
|
$requestBody = $request->getParsedBody();
|
||||||
$row->update($request->getParsedBody());
|
|
||||||
$success = $row->isClean();
|
try
|
||||||
return $this->ApiResponse(array('success' => $success));
|
{
|
||||||
|
if ($requestBody === null)
|
||||||
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $this->Database->{$args['entity']}($args['objectId']);
|
||||||
|
$row->update($requestBody);
|
||||||
|
$success = $row->isClean();
|
||||||
|
return $this->EmptyApiResponse($response);
|
||||||
|
}
|
||||||
|
catch (\Exception $ex)
|
||||||
|
{
|
||||||
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, 'Entity does not exist or is not exposed');
|
return $this->GenericErrorResponse($response, 'Entity does not exist or is not exposed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,11 +93,11 @@ class GenericEntityApiController extends BaseApiController
|
|||||||
$row = $this->Database->{$args['entity']}($args['objectId']);
|
$row = $this->Database->{$args['entity']}($args['objectId']);
|
||||||
$row->delete();
|
$row->delete();
|
||||||
$success = $row->isClean();
|
$success = $row->isClean();
|
||||||
return $this->ApiResponse(array('success' => $success));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, 'Entity does not exist or is not exposed');
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -63,21 +63,6 @@ class LoginController extends BaseController
|
|||||||
return $response->withRedirect($this->AppContainer->UrlManager->ConstructUrl('/'));
|
return $response->withRedirect($this->AppContainer->UrlManager->ConstructUrl('/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Root(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
|
||||||
{
|
|
||||||
// Schema migration is done here
|
|
||||||
$databaseMigrationService = new DatabaseMigrationService();
|
|
||||||
$databaseMigrationService->MigrateDatabase();
|
|
||||||
|
|
||||||
if (GROCY_IS_DEMO_INSTALL)
|
|
||||||
{
|
|
||||||
$demoDataGeneratorService = new DemoDataGeneratorService();
|
|
||||||
$demoDataGeneratorService->PopulateDemoData();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $response->withRedirect($this->AppContainer->UrlManager->ConstructUrl('/stockoverview'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetSessionCookieName()
|
public function GetSessionCookieName()
|
||||||
{
|
{
|
||||||
return $this->SessionCookieName;
|
return $this->SessionCookieName;
|
||||||
|
@@ -16,8 +16,16 @@ class RecipesApiController extends BaseApiController
|
|||||||
|
|
||||||
public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId']);
|
$requestBody = $request->getParsedBody();
|
||||||
return $this->VoidApiActionResponse($response);
|
$excludedProductIds = null;
|
||||||
|
|
||||||
|
if ($requestBody !== null && array_key_exists('excludedProductIds', $requestBody))
|
||||||
|
{
|
||||||
|
$excludedProductIds = $requestBody['excludedProductIds'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId'], $excludedProductIds);
|
||||||
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
@@ -25,11 +33,11 @@ class RecipesApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->RecipesService->ConsumeRecipe($args['recipeId']);
|
$this->RecipesService->ConsumeRecipe($args['recipeId']);
|
||||||
return $this->VoidApiActionResponse($response);
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,37 +17,47 @@ class RecipesController extends BaseController
|
|||||||
public function Overview(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function Overview(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$recipes = $this->Database->recipes()->orderBy('name');
|
$recipes = $this->Database->recipes()->orderBy('name');
|
||||||
|
$recipesResolved = $this->RecipesService->GetRecipesResolved();
|
||||||
|
|
||||||
$selectedRecipe = null;
|
$selectedRecipe = null;
|
||||||
$selectedRecipePositions = null;
|
$selectedRecipePositionsResolved = null;
|
||||||
if (isset($request->getQueryParams()['recipe']))
|
if (isset($request->getQueryParams()['recipe']))
|
||||||
{
|
{
|
||||||
$selectedRecipe = $this->Database->recipes($request->getQueryParams()['recipe']);
|
$selectedRecipe = $this->Database->recipes($request->getQueryParams()['recipe']);
|
||||||
$selectedRecipePositions = $this->Database->recipes_pos()->where('recipe_id', $request->getQueryParams()['recipe'])->orderBy('ingredient_group');
|
$selectedRecipePositionsResolved = $this->Database->recipes_pos_resolved()->where('recipe_id', $request->getQueryParams()['recipe'])->orderBy('ingredient_group');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach ($recipes as $recipe)
|
foreach ($recipes as $recipe)
|
||||||
{
|
{
|
||||||
$selectedRecipe = $recipe;
|
$selectedRecipe = $recipe;
|
||||||
$selectedRecipePositions = $this->Database->recipes_pos()->where('recipe_id', $recipe->id)->orderBy('ingredient_group');
|
$selectedRecipePositionsResolved = $this->Database->recipes_pos_resolved()->where('recipe_id', $recipe->id)->orderBy('ingredient_group');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$selectedRecipeSubRecipes = $this->Database->recipes()->where('id IN (SELECT includes_recipe_id FROM recipes_nestings_resolved WHERE recipe_id = :1 AND includes_recipe_id != :1)', $selectedRecipe->id)->orderBy('name')->fetchAll();
|
$selectedRecipeSubRecipes = $this->Database->recipes()->where('id IN (SELECT includes_recipe_id FROM recipes_nestings_resolved WHERE recipe_id = :1 AND includes_recipe_id != :1)', $selectedRecipe->id)->orderBy('name')->fetchAll();
|
||||||
$selectedRecipeSubRecipesPositions = $this->Database->recipes_pos()->where('recipe_id IN (SELECT includes_recipe_id FROM recipes_nestings_resolved WHERE recipe_id = :1 AND includes_recipe_id != :1)', $selectedRecipe->id)->orderBy('ingredient_group')->fetchAll();
|
$selectedRecipeSubRecipesPositions = $this->Database->recipes_pos_resolved()->where('recipe_id = :1', $selectedRecipe->id)->orderBy('ingredient_group')->fetchAll();
|
||||||
|
|
||||||
|
$includedRecipeIdsAbsolute = array();
|
||||||
|
$includedRecipeIdsAbsolute[] = $selectedRecipe->id;
|
||||||
|
foreach($selectedRecipeSubRecipes as $subRecipe)
|
||||||
|
{
|
||||||
|
$includedRecipeIdsAbsolute[] = $subRecipe->id;
|
||||||
|
}
|
||||||
|
|
||||||
return $this->AppContainer->view->render($response, 'recipes', [
|
return $this->AppContainer->view->render($response, 'recipes', [
|
||||||
'recipes' => $recipes,
|
'recipes' => $recipes,
|
||||||
'recipesFulfillment' => $this->RecipesService->GetRecipesFulfillment(),
|
'recipesResolved' => $recipesResolved,
|
||||||
'recipesSumFulfillment' => $this->RecipesService->GetRecipesSumFulfillment(),
|
'recipePositionsResolved' => $this->Database->recipes_pos_resolved(),
|
||||||
'selectedRecipe' => $selectedRecipe,
|
'selectedRecipe' => $selectedRecipe,
|
||||||
'selectedRecipePositions' => $selectedRecipePositions,
|
'selectedRecipePositionsResolved' => $selectedRecipePositionsResolved,
|
||||||
'products' => $this->Database->products(),
|
'products' => $this->Database->products(),
|
||||||
'quantityunits' => $this->Database->quantity_units(),
|
'quantityunits' => $this->Database->quantity_units(),
|
||||||
'selectedRecipeSubRecipes' => $selectedRecipeSubRecipes,
|
'selectedRecipeSubRecipes' => $selectedRecipeSubRecipes,
|
||||||
'selectedRecipeSubRecipesPositions' => $selectedRecipeSubRecipesPositions
|
'selectedRecipeSubRecipesPositions' => $selectedRecipeSubRecipesPositions,
|
||||||
|
'includedRecipeIdsAbsolute' => $includedRecipeIdsAbsolute,
|
||||||
|
'selectedRecipeTotalCosts' => FindObjectInArrayByPropertyValue($recipesResolved, 'recipe_id', $selectedRecipe->id)->costs
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +80,8 @@ class RecipesController extends BaseController
|
|||||||
'mode' => 'edit',
|
'mode' => 'edit',
|
||||||
'products' => $this->Database->products(),
|
'products' => $this->Database->products(),
|
||||||
'quantityunits' => $this->Database->quantity_units(),
|
'quantityunits' => $this->Database->quantity_units(),
|
||||||
'recipesFulfillment' => $this->RecipesService->GetRecipesFulfillment(),
|
'recipePositionsResolved' => $this->RecipesService->GetRecipesPosResolved(),
|
||||||
'recipesSumFulfillment' => $this->RecipesService->GetRecipesSumFulfillment(),
|
'recipesResolved' => $this->RecipesService->GetRecipesResolved(),
|
||||||
'recipes' => $this->Database->recipes()->orderBy('name'),
|
'recipes' => $this->Database->recipes()->orderBy('name'),
|
||||||
'recipeNestings' => $this->Database->recipes_nestings()->where('recipe_id', $recipeId)
|
'recipeNestings' => $this->Database->recipes_nestings()->where('recipe_id', $recipeId)
|
||||||
]);
|
]);
|
||||||
|
@@ -22,7 +22,7 @@ class StockApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,107 +34,167 @@ class StockApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function AddProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function AddProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$bestBeforeDate = date('Y-m-d');
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['bestbeforedate']) && !empty($request->getQueryParams()['bestbeforedate']) && IsIsoDate($request->getQueryParams()['bestbeforedate']))
|
|
||||||
{
|
|
||||||
$bestBeforeDate = $request->getQueryParams()['bestbeforedate'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$price = null;
|
|
||||||
if (isset($request->getQueryParams()['price']) && !empty($request->getQueryParams()['price']) && is_numeric($request->getQueryParams()['price']))
|
|
||||||
{
|
|
||||||
$price = $request->getQueryParams()['price'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$transactionType = StockService::TRANSACTION_TYPE_PURCHASE;
|
|
||||||
if (isset($request->getQueryParams()['transactiontype']) && !empty($request->getQueryParams()['transactiontype']))
|
|
||||||
{
|
|
||||||
$transactionType = $request->getQueryParams()['transactiontype'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$bookingId = $this->StockService->AddProduct($args['productId'], $args['amount'], $bestBeforeDate, $transactionType, date('Y-m-d'), $price);
|
if ($requestBody === null)
|
||||||
return $this->ApiResponse(array('booking_id' => $bookingId));
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists('amount', $requestBody))
|
||||||
|
{
|
||||||
|
throw new \Exception('An amount is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
$bestBeforeDate = date('Y-m-d');
|
||||||
|
if (array_key_exists('best_before_date', $requestBody) && IsIsoDate($requestBody['best_before_date']))
|
||||||
|
{
|
||||||
|
$bestBeforeDate = $requestBody['best_before_date'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$price = null;
|
||||||
|
if (array_key_exists('price', $requestBody) && is_numeric($requestBody['price']))
|
||||||
|
{
|
||||||
|
$price = $requestBody['price'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$locationId = null;
|
||||||
|
if (array_key_exists('location_id', $requestBody) && is_numeric($requestBody['location_id']))
|
||||||
|
{
|
||||||
|
$locationId = $requestBody['location_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$transactionType = StockService::TRANSACTION_TYPE_PURCHASE;
|
||||||
|
if (array_key_exists('transaction_type', $requestBody) && !empty($requestBody['transactiontype']))
|
||||||
|
{
|
||||||
|
$transactionType = $requestBody['transactiontype'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookingId = $this->StockService->AddProduct($args['productId'], $requestBody['amount'], $bestBeforeDate, $transactionType, date('Y-m-d'), $price, $locationId);
|
||||||
|
return $this->ApiResponse($this->Database->stock_log($bookingId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ConsumeProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function ConsumeProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$spoiled = false;
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['spoiled']) && !empty($request->getQueryParams()['spoiled']) && $request->getQueryParams()['spoiled'] == '1')
|
|
||||||
{
|
|
||||||
$spoiled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transactionType = StockService::TRANSACTION_TYPE_CONSUME;
|
|
||||||
if (isset($request->getQueryParams()['transactiontype']) && !empty($request->getQueryParams()['transactiontype']))
|
|
||||||
{
|
|
||||||
$transactionType = $request->getQueryParams()['transactiontype'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$specificStockEntryId = "default";
|
|
||||||
if (isset($request->getQueryParams()['stock_entry_id']) && !empty($request->getQueryParams()['stock_entry_id']))
|
|
||||||
{
|
|
||||||
$specificStockEntryId = $request->getQueryParams()['stock_entry_id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$bookingId = $this->StockService->ConsumeProduct($args['productId'], $args['amount'], $spoiled, $transactionType, $specificStockEntryId);
|
if ($requestBody === null)
|
||||||
return $this->ApiResponse(array('booking_id' => $bookingId));
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists('amount', $requestBody))
|
||||||
|
{
|
||||||
|
throw new \Exception('An amount is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
$spoiled = false;
|
||||||
|
if (array_key_exists('spoiled', $requestBody))
|
||||||
|
{
|
||||||
|
$spoiled = $requestBody['spoiled'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$transactionType = StockService::TRANSACTION_TYPE_CONSUME;
|
||||||
|
if (array_key_exists('transaction_type', $requestBody) && !empty($requestBody['transactiontype']))
|
||||||
|
{
|
||||||
|
$transactionType = $requestBody['transactiontype'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$specificStockEntryId = 'default';
|
||||||
|
if (array_key_exists('stock_entry_id', $requestBody) && !empty($requestBody['stock_entry_id']))
|
||||||
|
{
|
||||||
|
$specificStockEntryId = $requestBody['stock_entry_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$recipeId = null;
|
||||||
|
if (array_key_exists('recipe_id', $requestBody) && is_numeric($requestBody['recipe_id']))
|
||||||
|
{
|
||||||
|
$recipeId = $requestBody['recipe_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookingId = $this->StockService->ConsumeProduct($args['productId'], $requestBody['amount'], $spoiled, $transactionType, $specificStockEntryId, $recipeId);
|
||||||
|
return $this->ApiResponse($this->Database->stock_log($bookingId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function InventoryProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function InventoryProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$bestBeforeDate = date('Y-m-d');
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['bestbeforedate']) && !empty($request->getQueryParams()['bestbeforedate']) && IsIsoDate($request->getQueryParams()['bestbeforedate']))
|
|
||||||
{
|
|
||||||
$bestBeforeDate = $request->getQueryParams()['bestbeforedate'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$bookingId = $this->StockService->InventoryProduct($args['productId'], $args['newAmount'], $bestBeforeDate);
|
if ($requestBody === null)
|
||||||
return $this->ApiResponse(array('booking_id' => $bookingId));
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists('new_amount', $requestBody))
|
||||||
|
{
|
||||||
|
throw new \Exception('An new amount is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
$bestBeforeDate = date('Y-m-d');
|
||||||
|
if (array_key_exists('best_before_date', $requestBody) && IsIsoDate($requestBody['best_before_date']))
|
||||||
|
{
|
||||||
|
$bestBeforeDate = $requestBody['best_before_date'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookingId = $this->StockService->InventoryProduct($args['productId'], $requestBody['new_amount'], $bestBeforeDate);
|
||||||
|
return $this->ApiResponse($this->Database->stock_log($bookingId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function OpenProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function OpenProduct(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$specificStockEntryId = "default";
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['stock_entry_id']) && !empty($request->getQueryParams()['stock_entry_id']))
|
|
||||||
{
|
|
||||||
$specificStockEntryId = $request->getQueryParams()['stock_entry_id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$bookingId = $this->StockService->OpenProduct($args['productId'], $args['amount'], $specificStockEntryId);
|
if ($requestBody === null)
|
||||||
return $this->ApiResponse(array('booking_id' => $bookingId));
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists('amount', $requestBody))
|
||||||
|
{
|
||||||
|
throw new \Exception('An amount is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
$specificStockEntryId = 'default';
|
||||||
|
if (array_key_exists('stock_entry_id', $requestBody) && !empty($requestBody['stock_entry_id']))
|
||||||
|
{
|
||||||
|
$specificStockEntryId = $requestBody['stock_entry_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookingId = $this->StockService->OpenProduct($args['productId'], $requestBody['amount'], $specificStockEntryId);
|
||||||
|
return $this->ApiResponse($this->Database->stock_log($bookingId));
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,13 +224,13 @@ class StockApiController extends BaseApiController
|
|||||||
public function AddMissingProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function AddMissingProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$this->StockService->AddMissingProductsToShoppingList();
|
$this->StockService->AddMissingProductsToShoppingList();
|
||||||
return $this->VoidApiActionResponse($response);
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ClearShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function ClearShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$this->StockService->ClearShoppingList();
|
$this->StockService->ClearShoppingList();
|
||||||
return $this->VoidApiActionResponse($response);
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ExternalBarcodeLookup(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function ExternalBarcodeLookup(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
@@ -187,7 +247,7 @@ class StockApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,11 +256,11 @@ class StockApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->ApiResponse($this->StockService->UndoBooking($args['bookingId']));
|
$this->ApiResponse($this->StockService->UndoBooking($args['bookingId']));
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@ class StockController extends BaseController
|
|||||||
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
|
'quantityunits' => $this->Database->quantity_units()->orderBy('name'),
|
||||||
'locations' => $this->Database->locations()->orderBy('name'),
|
'locations' => $this->Database->locations()->orderBy('name'),
|
||||||
'currentStock' => $this->StockService->GetCurrentStock(),
|
'currentStock' => $this->StockService->GetCurrentStock(),
|
||||||
|
'currentStockLocations' => $this->StockService->GetCurrentStockLocations(),
|
||||||
'missingProducts' => $this->StockService->GetMissingProducts(),
|
'missingProducts' => $this->StockService->GetMissingProducts(),
|
||||||
'nextXDays' => 5,
|
'nextXDays' => 5,
|
||||||
'productGroups' => $this->Database->product_groups()->orderBy('name')
|
'productGroups' => $this->Database->product_groups()->orderBy('name')
|
||||||
@@ -31,14 +32,16 @@ class StockController extends BaseController
|
|||||||
public function Purchase(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function Purchase(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
return $this->AppContainer->view->render($response, 'purchase', [
|
return $this->AppContainer->view->render($response, 'purchase', [
|
||||||
'products' => $this->Database->products()->orderBy('name')
|
'products' => $this->Database->products()->orderBy('name'),
|
||||||
|
'locations' => $this->Database->locations()->orderBy('name')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Consume(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function Consume(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
return $this->AppContainer->view->render($response, 'consume', [
|
return $this->AppContainer->view->render($response, 'consume', [
|
||||||
'products' => $this->Database->products()->orderBy('name')
|
'products' => $this->Database->products()->orderBy('name'),
|
||||||
|
'recipes' => $this->Database->recipes()->orderBy('name')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
namespace Grocy\Controllers;
|
namespace Grocy\Controllers;
|
||||||
|
|
||||||
use \Grocy\Services\DatabaseService;
|
use \Grocy\Services\DatabaseService;
|
||||||
|
use \Grocy\Services\ApplicationService;
|
||||||
|
|
||||||
class SystemApiController extends BaseApiController
|
class SystemApiController extends BaseApiController
|
||||||
{
|
{
|
||||||
@@ -10,9 +11,11 @@ class SystemApiController extends BaseApiController
|
|||||||
{
|
{
|
||||||
parent::__construct($container);
|
parent::__construct($container);
|
||||||
$this->DatabaseService = new DatabaseService();
|
$this->DatabaseService = new DatabaseService();
|
||||||
|
$this->ApplicationService = new ApplicationService();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $DatabaseService;
|
protected $DatabaseService;
|
||||||
|
protected $ApplicationService;
|
||||||
|
|
||||||
public function GetDbChangedTime(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function GetDbChangedTime(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
@@ -30,12 +33,17 @@ class SystemApiController extends BaseApiController
|
|||||||
$requestBody = $request->getParsedBody();
|
$requestBody = $request->getParsedBody();
|
||||||
|
|
||||||
$this->LocalizationService->LogMissingLocalization(GROCY_CULTURE, $requestBody['text']);
|
$this->LocalizationService->LogMissingLocalization(GROCY_CULTURE, $requestBody['text']);
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function GetSystemInfo(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
|
{
|
||||||
|
return $this->ApiResponse($this->ApplicationService->GetSystemInfo());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
40
controllers/SystemController.php
Normal file
40
controllers/SystemController.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Grocy\Controllers;
|
||||||
|
|
||||||
|
use \Grocy\Services\ApplicationService;
|
||||||
|
use \Grocy\Services\DatabaseMigrationService;
|
||||||
|
use \Grocy\Services\DemoDataGeneratorService;
|
||||||
|
|
||||||
|
class SystemController extends BaseController
|
||||||
|
{
|
||||||
|
public function __construct(\Slim\Container $container)
|
||||||
|
{
|
||||||
|
parent::__construct($container);
|
||||||
|
$this->ApplicationService = new ApplicationService();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected $ApplicationService;
|
||||||
|
|
||||||
|
public function Root(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
|
{
|
||||||
|
// Schema migration is done here
|
||||||
|
$databaseMigrationService = new DatabaseMigrationService();
|
||||||
|
$databaseMigrationService->MigrateDatabase();
|
||||||
|
|
||||||
|
if (GROCY_IS_DEMO_INSTALL)
|
||||||
|
{
|
||||||
|
$demoDataGeneratorService = new DemoDataGeneratorService();
|
||||||
|
$demoDataGeneratorService->PopulateDemoData();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response->withRedirect($this->AppContainer->UrlManager->ConstructUrl('/stockoverview'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function About(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
|
{
|
||||||
|
return $this->AppContainer->view->render($response, 'about', [
|
||||||
|
'system_info' => $this->ApplicationService->GetSystemInfo()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@@ -21,20 +21,22 @@ class TasksApiController extends BaseApiController
|
|||||||
|
|
||||||
public function MarkTaskAsCompleted(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
public function MarkTaskAsCompleted(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||||
{
|
{
|
||||||
$doneTime = date('Y-m-d H:i:s');
|
$requestBody = $request->getParsedBody();
|
||||||
if (isset($request->getQueryParams()['done_time']) && !empty($request->getQueryParams()['done_time']) && IsIsoDateTime($request->getQueryParams()['done_time']))
|
|
||||||
{
|
|
||||||
$doneTime = $request->getQueryParams()['done_time'];
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
$doneTime = date('Y-m-d H:i:s');
|
||||||
|
if (array_key_exists('done_time', $requestBody) && IsIsoDateTime($requestBody['done_time']))
|
||||||
|
{
|
||||||
|
$doneTime = $requestBody['done_time'];
|
||||||
|
}
|
||||||
|
|
||||||
$this->TasksService->MarkTaskAsCompleted($args['taskId'], $doneTime);
|
$this->TasksService->MarkTaskAsCompleted($args['taskId'], $doneTime);
|
||||||
return $this->VoidApiActionResponse($response);
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,7 @@ class UsersApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,12 +32,17 @@ class UsersApiController extends BaseApiController
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if ($requestBody === null)
|
||||||
|
{
|
||||||
|
throw new \Exception('Request body could not be parsed (probably invalid JSON format or missing/wrong Content-Type header)');
|
||||||
|
}
|
||||||
|
|
||||||
$this->UsersService->CreateUser($requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']);
|
$this->UsersService->CreateUser($requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']);
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,11 +51,11 @@ class UsersApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->UsersService->DeleteUser($args['userId']);
|
$this->UsersService->DeleteUser($args['userId']);
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,11 +66,11 @@ class UsersApiController extends BaseApiController
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->UsersService->EditUser($args['userId'], $requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']);
|
$this->UsersService->EditUser($args['userId'], $requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']);
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +83,7 @@ class UsersApiController extends BaseApiController
|
|||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,11 +94,11 @@ class UsersApiController extends BaseApiController
|
|||||||
$requestBody = $request->getParsedBody();
|
$requestBody = $request->getParsedBody();
|
||||||
|
|
||||||
$value = $this->UsersService->SetUserSetting(GROCY_USER_ID, $args['settingKey'], $requestBody['value']);
|
$value = $this->UsersService->SetUserSetting(GROCY_USER_ID, $args['settingKey'], $requestBody['value']);
|
||||||
return $this->ApiResponse(array('success' => true));
|
return $this->EmptyApiResponse($response);
|
||||||
}
|
}
|
||||||
catch (\Exception $ex)
|
catch (\Exception $ex)
|
||||||
{
|
{
|
||||||
return $this->VoidApiActionResponse($response, false, 400, $ex->getMessage());
|
return $this->GenericErrorResponse($response, $ex->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1905
grocy.openapi.json
1905
grocy.openapi.json
File diff suppressed because it is too large
Load Diff
@@ -138,6 +138,10 @@ function Setting(string $name, $value)
|
|||||||
{
|
{
|
||||||
define('GROCY_' . $name, file_get_contents($settingOverrideFile));
|
define('GROCY_' . $name, file_get_contents($settingOverrideFile));
|
||||||
}
|
}
|
||||||
|
elseif (getenv('GROCY_' . $name) !== false) // An environment variable with the same name and prefix GROCY_ overwrites the given setting
|
||||||
|
{
|
||||||
|
define('GROCY_' . $name, getenv('GROCY_' . $name));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
define('GROCY_' . $name, $value);
|
define('GROCY_' . $name, $value);
|
||||||
|
6
localization/da/chore_types.php
Normal file
6
localization/da/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Manuelt',
|
||||||
|
'dynamic-regular' => 'Dynamic regular'
|
||||||
|
);
|
10
localization/da/component_translations.php
Normal file
10
localization/da/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'en',
|
||||||
|
'timeago_nan' => 'NaN years ago',
|
||||||
|
'moment_locale' => 'x',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||||
|
'summernote_locale' => 'x',
|
||||||
|
'fullcalendar_locale' => 'x'
|
||||||
|
);
|
89
localization/da/demo_data.php
Normal file
89
localization/da/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Småkager',
|
||||||
|
'Chocolate' => 'chokolade',
|
||||||
|
'Pantry' => 'Spisekammer',
|
||||||
|
'Candy cupboard' => 'Slik skuffe',
|
||||||
|
'Tinned food cupboard' => 'Dåsemadsskab',
|
||||||
|
'Fridge' => 'Køleskab',
|
||||||
|
'Piece' => 'Styk',
|
||||||
|
'Pieces' => 'Stykker',
|
||||||
|
'Pack' => 'Pakke',
|
||||||
|
'Packs' => 'Pakker',
|
||||||
|
'Glass' => 'Glas',
|
||||||
|
'Glasses' => 'Glas',
|
||||||
|
'Tin' => 'Beholder',
|
||||||
|
'Tins' => 'Beholdere',
|
||||||
|
'Can' => 'Dåse',
|
||||||
|
'Cans' => 'Dåser',
|
||||||
|
'Bunch' => 'Bundt',
|
||||||
|
'Bunches' => 'Bundt',
|
||||||
|
'Gummy bears' => 'Vingummi bamser',
|
||||||
|
'Crisps' => 'Chips',
|
||||||
|
'Eggs' => 'Æg',
|
||||||
|
'Noodles' => 'Nudler',
|
||||||
|
'Pickles' => 'Syltede agurker',
|
||||||
|
'Gulash soup' => 'Gulash',
|
||||||
|
'Yogurt' => 'Yoghurt',
|
||||||
|
'Cheese' => 'Ost',
|
||||||
|
'Cold cuts' => 'Pålæg',
|
||||||
|
'Paprika' => 'Paprika',
|
||||||
|
'Cucumber' => 'Agurk',
|
||||||
|
'Radish' => 'Radisse',
|
||||||
|
'Tomato' => 'Tomat',
|
||||||
|
'Changed towels in the bathroom' => 'Skiftede håndklæder i badeværelset',
|
||||||
|
'Cleaned the kitchen floor' => 'Gjorde køkkengulvet rent',
|
||||||
|
'Warranty ends' => 'Reklamationsret udløber',
|
||||||
|
'TV remote control' => 'Fjernbetjening',
|
||||||
|
'Alarm clock' => 'Vægge ur',
|
||||||
|
'Heat remote control' => 'Varmefjernbetjening',
|
||||||
|
'Lawn mowed in the garden' => 'Græs slået',
|
||||||
|
'Some good snacks' => 'Nogle gode snacks',
|
||||||
|
'Pizza dough' => 'Pizza dej',
|
||||||
|
'Sieved tomatoes' => 'Sigtede tomater',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Toast',
|
||||||
|
'Minced meat' => 'Hakkekød',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
||||||
|
'Sandwiches' => 'Sandwiches',
|
||||||
|
'English' => 'Engelsk',
|
||||||
|
'German' => 'Tysk',
|
||||||
|
'Italian' => 'Italiænsk',
|
||||||
|
'Demo in different language' => 'Demo i et andet sprog',
|
||||||
|
'This is the note content of the recipe ingredient' => 'Dette er indholdet af opskrift ingrediensens notefelt',
|
||||||
|
'Demo User' => 'Demo Bruger',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Gram',
|
||||||
|
'Flour' => 'Mel',
|
||||||
|
'Pancakes' => 'Pandekager',
|
||||||
|
'Sugar' => 'Sukker',
|
||||||
|
'Home' => 'Hjem',
|
||||||
|
'Life' => 'Liv',
|
||||||
|
'Projects' => 'Projekter',
|
||||||
|
'Repair the garage door' => 'Reparér garagedøren',
|
||||||
|
'Fork and improve grocy' => 'Fork og forbedre grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Find en løsning for når jeg glemmer husnøglen',
|
||||||
|
'Sweets' => 'Slik',
|
||||||
|
'Bakery products' => 'Bageriprodukter',
|
||||||
|
'Tinned food' => 'Dåsemad',
|
||||||
|
'Butchery products' => 'Slagteriprodukter',
|
||||||
|
'Vegetables/Fruits' => 'Frugt og grønt',
|
||||||
|
'Refrigerated products' => 'Nedkølede produkter',
|
||||||
|
'Coffee machine' => 'Kaffemaskine',
|
||||||
|
'Dishwasher' => 'Opvasker',
|
||||||
|
'Liter' => 'Liter',
|
||||||
|
'Liters' => 'Liter',
|
||||||
|
'Bottle' => 'Flaske',
|
||||||
|
'Bottles' => 'Flasker',
|
||||||
|
'Milk' => 'Mælk',
|
||||||
|
'Chocolate sauce' => 'Chokoladesauce',
|
||||||
|
'Milliliters' => 'Milliliter',
|
||||||
|
'Milliliter' => 'Milliliter',
|
||||||
|
'Bottom' => 'Bund',
|
||||||
|
'Topping' => 'Topping',
|
||||||
|
'French' => 'Fransk',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
|
);
|
8
localization/da/stock_transaction_types.php
Normal file
8
localization/da/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Køb',
|
||||||
|
'consume' => 'Brug',
|
||||||
|
'inventory-correction' => 'Beholdningsrettelse',
|
||||||
|
'product-opened' => 'Produkt åbnet'
|
||||||
|
);
|
348
localization/da/strings.php
Normal file
348
localization/da/strings.php
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Beholdnings oversigt',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 produkter der udløber inden for de næste #2 dage',
|
||||||
|
'#1 products are already expired' => '#1 produkter er allerede udløbede',
|
||||||
|
'#1 products are below defined min. stock amount' => 'Beholdningen af #1 produkter er under minimums antallet',
|
||||||
|
'Product' => 'Produkt',
|
||||||
|
'Amount' => 'Mængde',
|
||||||
|
'Next best before date' => 'Næste bedst før dato',
|
||||||
|
'Logout' => 'Log ud',
|
||||||
|
'Chores overview' => 'Pligt oversigt',
|
||||||
|
'Batteries overview' => 'Batteri oversigt',
|
||||||
|
'Purchase' => 'Køb',
|
||||||
|
'Consume' => 'Brug',
|
||||||
|
'Inventory' => 'Beholdning',
|
||||||
|
'Shopping list' => 'Indkøbsliste',
|
||||||
|
'Chore tracking' => 'Pligt overvågning',
|
||||||
|
'Battery tracking' => 'Batteri overvågning',
|
||||||
|
'Products' => 'Produkter',
|
||||||
|
'Locations' => 'Steder',
|
||||||
|
'Quantity units' => 'Mængde enheder',
|
||||||
|
'Chores' => 'Pligter',
|
||||||
|
'Batteries' => 'Batterier',
|
||||||
|
'Chore' => 'Pligt',
|
||||||
|
'Next estimated tracking' => 'Next estimated tracking',
|
||||||
|
'Last tracked' => 'Sidst overvåget',
|
||||||
|
'Battery' => 'Batteri',
|
||||||
|
'Last charged' => 'Sidst opladt',
|
||||||
|
'Next planned charge cycle' => 'Næste planlagte opladning',
|
||||||
|
'Best before' => 'Bedst før',
|
||||||
|
'OK' => 'OK',
|
||||||
|
'Product overview' => 'Produkt oversigt',
|
||||||
|
'Stock quantity unit' => 'Standard enhed',
|
||||||
|
'Stock amount' => 'Standard mængde',
|
||||||
|
'Last purchased' => 'Sidst købt',
|
||||||
|
'Last used' => 'Sidst brugt',
|
||||||
|
'Spoiled' => 'Udløbet',
|
||||||
|
'Barcode lookup is disabled' => 'Stregkode opslag er slået fra',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'Bliver tilføjet til stregkodelisten for det valgte produkt når du sender',
|
||||||
|
'New amount' => 'Ny mængde',
|
||||||
|
'Note' => 'Note',
|
||||||
|
'Tracked time' => 'Overvåget tid',
|
||||||
|
'Chore overview' => 'Pligt oversigt',
|
||||||
|
'Tracked count' => 'Antal overvågede',
|
||||||
|
'Battery overview' => 'Batteri oversigt',
|
||||||
|
'Charge cycles count' => 'Antal opladninger',
|
||||||
|
'Create shopping list item' => 'Lav indkøbsliste punkt',
|
||||||
|
'Edit shopping list item' => 'Ændr indkøbsliste punkt',
|
||||||
|
'Save' => 'Gem',
|
||||||
|
'Add' => 'Tilføj',
|
||||||
|
'Name' => 'Navn',
|
||||||
|
'Location' => 'Sted',
|
||||||
|
'Min. stock amount' => 'Mindste beholdning',
|
||||||
|
'QU purchase' => 'QU køb',
|
||||||
|
'QU stock' => 'QU beholdning',
|
||||||
|
'QU factor' => 'QU factor',
|
||||||
|
'Description' => 'Beskrivelse',
|
||||||
|
'Create product' => 'Lav produkt',
|
||||||
|
'Barcode(s)' => 'Stegkode(r)',
|
||||||
|
'Minimum stock amount' => 'Minimum mængde',
|
||||||
|
'Default best before days' => 'Standard bedst før dage',
|
||||||
|
'Quantity unit purchase' => 'Quantity unit purchase',
|
||||||
|
'Quantity unit stock' => 'Quantity unit stock',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Factor purchase to stock quantity unit',
|
||||||
|
'Create location' => 'Lav placering',
|
||||||
|
'Create quantity unit' => 'Lav mængde enhed',
|
||||||
|
'Period type' => 'Periode type',
|
||||||
|
'Period days' => 'Period days',
|
||||||
|
'Create chore' => 'Lav pligt',
|
||||||
|
'Used in' => 'Brugt i',
|
||||||
|
'Create battery' => 'Lav batteri',
|
||||||
|
'Edit battery' => 'Ændr batteri',
|
||||||
|
'Edit chore' => 'Ændr pligt',
|
||||||
|
'Edit quantity unit' => 'Ændr mængde enhed',
|
||||||
|
'Edit product' => 'Ændr produkt',
|
||||||
|
'Edit location' => 'Ændr placering',
|
||||||
|
'Record data' => 'Optag data',
|
||||||
|
'Manage master data' => 'Manage master data',
|
||||||
|
'This will apply to added products' => 'Dette vil gælde tilføjede produkter',
|
||||||
|
'never' => 'aldrig',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Tilføj produkter der er under minimumsantallet',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'Dette betyder at 1 #1 bliver lavet om til #2 #3 i beholdningen',
|
||||||
|
'Login' => 'Login',
|
||||||
|
'Username' => 'Brugernavn',
|
||||||
|
'Password' => 'Kode',
|
||||||
|
'Invalid credentials, please try again' => 'Ugyldige informationer, prøv igen',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Er du sikker på du vil slette batteriet "#1"?',
|
||||||
|
'Yes' => 'Ja',
|
||||||
|
'No' => 'Nej',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Er du sikker på du vil slette pligten "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" kunne ikke findes som produkt. Hvordan vil du fortsætte?',
|
||||||
|
'Create or assign product' => 'Lav eller tilknyt produkt',
|
||||||
|
'Cancel' => 'Afbryd',
|
||||||
|
'Add as new product' => 'Tilføj som nyt produkt',
|
||||||
|
'Add as barcode to existing product' => 'Tilføj som stregkode til et eksisterende produkt',
|
||||||
|
'Add as new product and prefill barcode' => 'Tilføj som nyt produkt og udfyld stregkoden på forhånd',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Er du sikker på du vil slette mængde enheden "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Er du sikker på du vil slette produktet "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Er du sikker på du vil slette placeringen "#1"?',
|
||||||
|
'Manage API keys' => 'Styr API nøgler',
|
||||||
|
'REST API & data model documentation' => 'REST API & datamodel dokumentation',
|
||||||
|
'API keys' => 'API nøgler',
|
||||||
|
'Create new API key' => 'Lav ny API nøgle',
|
||||||
|
'API key' => 'API nøgle',
|
||||||
|
'Expires' => 'Udløber',
|
||||||
|
'Created' => 'Lavet',
|
||||||
|
'This product is not in stock' => 'Dette produkt er ikke i beholdningen',
|
||||||
|
'This means #1 will be added to stock' => 'Dette betyder #1 bliver tilføjet til beholdningen',
|
||||||
|
'This means #1 will be removed from stock' => 'Dette betyder at #1 bliver fjernet fra beholdningen',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Fjernede #1 #2 af #3 fra beholdningen',
|
||||||
|
'About grocy' => 'Omkring Grocy',
|
||||||
|
'Close' => 'Luk',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 batterier skal oplades indenfor de næste #2 dage',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 batterier trænger til at blive opladt',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 pligter skal udfyldes indenfor de næste #2 dage',
|
||||||
|
'#1 chores are overdue to be done' => '#1 pligter skulle have været gjort',
|
||||||
|
'Released on' => 'Released on',
|
||||||
|
'Consume #3 #1 of #2' => 'Brug #3 #1 af #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Tilføjede #1 #2 af #3 til beholdningen',
|
||||||
|
'Stock amount of #1 is now #2 #3' => 'Mængden af #1 er nu #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Overvågede udførslen af pligt #1 på #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Tracked charge cycle of battery #1 on #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Brug alle #1 i beholdningen',
|
||||||
|
'All' => 'Alle',
|
||||||
|
'Track charge cycle of battery #1' => 'Overvåg opladningscyklus af batteri #1',
|
||||||
|
'Track execution of chore #1' => 'Track execution of chore #1',
|
||||||
|
'Filter by location' => 'Filtre med placering',
|
||||||
|
'Search' => 'Søg',
|
||||||
|
'Not logged in' => 'Ikke logget ind',
|
||||||
|
'You have to select a product' => 'Du skal vælge et produkt',
|
||||||
|
'You have to select a chore' => 'Du skal vælge en pligt',
|
||||||
|
'You have to select a battery' => 'Du skal vælge et batteri',
|
||||||
|
'A name is required' => 'Du skal vælge et navn',
|
||||||
|
'A location is required' => 'Du skal vælge en placering',
|
||||||
|
'The amount cannot be lower than #1' => 'Mængden kan ikek kvære lavere end #1',
|
||||||
|
'This cannot be negative' => 'Dette kan ikke være negativt',
|
||||||
|
'A quantity unit is required' => 'Du skal vælge en enhed for mængden',
|
||||||
|
'A period type is required' => 'Du skal vælge en slags periode',
|
||||||
|
'A best before date is required and must be later than today' => 'Du skal vælge en bedst før dato som er senere end i dag',
|
||||||
|
'Settings' => 'Indstillinger',
|
||||||
|
'This can only be before now' => 'Dette skal være før nu',
|
||||||
|
'Calendar' => 'Kalender',
|
||||||
|
'Recipes' => 'Opskrifter',
|
||||||
|
'Edit recipe' => 'Ændr opskrift',
|
||||||
|
'New recipe' => 'Ny opskrift',
|
||||||
|
'Ingredients list' => 'Ingrediens liste',
|
||||||
|
'Add recipe ingredient' => 'Tilføj ingrediens til opskrift',
|
||||||
|
'Edit recipe ingredient' => 'Ændr ingrediens til opskrift',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Er du sikker på du vil slette opskriften "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Er du sikker på du vil slette ingrediensen "#1" fra opskriften?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Er du sikker på du vil tømme indkøbslisten?',
|
||||||
|
'Clear list' => 'Ryd liste',
|
||||||
|
'Requirements fulfilled' => 'Skal udfyldes',
|
||||||
|
'Put missing products on shopping list' => 'Sæt manglende produkter på en indkøbsliste',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Der er ikke nok i beholdningen. Der mangler #1 ingredienser. ',
|
||||||
|
'Enough in stock' => 'Der er nok i beholdningen',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Der er ikke nok i beholdningen. Der mangler #1 ingredienser som allerede er på indkøbslisten',
|
||||||
|
'Expand to fullscreen' => 'Udvid til fuldskærm',
|
||||||
|
'Ingredients' => 'Ingredienser',
|
||||||
|
'Preparation' => 'Tilberedning',
|
||||||
|
'Recipe' => 'Opskrift',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Der er ikke nok i beholdningen. Der mangler #1, #2 er allerede i beholdningen',
|
||||||
|
'Show notes' => 'Vis noter',
|
||||||
|
'Put missing amount on shopping list' => 'Put manglende mængde på indkøbsliste',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Er du sikker på du vil sætte alle manglende ingredienser til "#1" på indkøbslisten?',
|
||||||
|
'Added for recipe #1' => 'Tilføjet til opskriften #1',
|
||||||
|
'Manage users' => 'Manage users',
|
||||||
|
'User' => 'Bruger',
|
||||||
|
'Users' => 'Brugere',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Er du sikker på du vil slette brugeren "#1"?',
|
||||||
|
'Create user' => 'Lav bruger',
|
||||||
|
'Edit user' => 'Ændr bruger',
|
||||||
|
'First name' => 'First name',
|
||||||
|
'Last name' => 'Last name',
|
||||||
|
'A username is required' => 'A username is required',
|
||||||
|
'Confirm password' => 'Confirm password',
|
||||||
|
'Passwords do not match' => 'Passwords do not match',
|
||||||
|
'Change password' => 'Change password',
|
||||||
|
'Done by' => 'Done by',
|
||||||
|
'Last done by' => 'Last done by',
|
||||||
|
'Unknown' => 'Unknown',
|
||||||
|
'Filter by chore' => 'Filter by chore',
|
||||||
|
'Chores journal' => 'Chores journal',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 means suggestions for the next charge cycle are disabled',
|
||||||
|
'Charge cycle interval (days)' => 'Charge cycle interval (days)',
|
||||||
|
'Last price' => 'Last price',
|
||||||
|
'Price history' => 'Price history',
|
||||||
|
'No price history available' => 'No price history available',
|
||||||
|
'Price' => 'Price',
|
||||||
|
'in #1 per purchase quantity unit' => 'in #1 per purchase quantity unit',
|
||||||
|
'The price cannot be lower than #1' => 'The price cannot be lower than #1',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 product expires within the next #2 days',
|
||||||
|
'#1 product is already expired' => '#1 product is already expired',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 product is below defined min. stock amount',
|
||||||
|
'Unit' => 'Unit',
|
||||||
|
'Units' => 'Units',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 chore is due to be done within the next #2 days',
|
||||||
|
'#1 chore is overdue to be done' => '#1 chore is overdue to be done',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 battery is due to be charged within the next #2 days',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 battery is overdue to be charged',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unit was automatically added and will apply in addition to the amount entered here',
|
||||||
|
'in singular form' => 'in singular form',
|
||||||
|
'in plural form' => 'in plural form',
|
||||||
|
'Never expires' => 'Never expires',
|
||||||
|
'This cannot be lower than #1' => 'This cannot be lower than #1',
|
||||||
|
'-1 means that this product never expires' => '-1 means that this product never expires',
|
||||||
|
'Quantity unit' => 'Quantity unit',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Only check if a single unit is in stock (a different quantity can then be used above)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => 'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Removed all ingredients of recipe "#1" from stock',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Consume all ingredients needed by this recipe',
|
||||||
|
'Click to show technical details' => 'Click to show technical details',
|
||||||
|
'Error while saving, probably this item already exists' => 'Error while saving, probably this item already exists',
|
||||||
|
'Error details' => 'Error details',
|
||||||
|
'Tasks' => 'Tasks',
|
||||||
|
'Show done tasks' => 'Show done tasks',
|
||||||
|
'Task' => 'Task',
|
||||||
|
'Due' => 'Due',
|
||||||
|
'Assigned to' => 'Assigned to',
|
||||||
|
'Mark task "#1" as completed' => 'Mark task "#1" as completed',
|
||||||
|
'Uncategorized' => 'Uncategorized',
|
||||||
|
'Task categories' => 'Task categories',
|
||||||
|
'Create task' => 'Create task',
|
||||||
|
'A due date is required' => 'A due date is required',
|
||||||
|
'Category' => 'Category',
|
||||||
|
'Edit task' => 'Edit task',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Are you sure to delete task "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 task is due to be done within the next #2 days',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 tasks are due to be done within the next #2 days',
|
||||||
|
'#1 task is overdue to be done' => '#1 task is overdue to be done',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 tasks are overdue to be done',
|
||||||
|
'Edit task category' => 'Edit task category',
|
||||||
|
'Create task category' => 'Create task category',
|
||||||
|
'Product groups' => 'Product groups',
|
||||||
|
'Ungrouped' => 'Ungrouped',
|
||||||
|
'Create product group' => 'Create product group',
|
||||||
|
'Edit product group' => 'Edit product group',
|
||||||
|
'Product group' => 'Product group',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Stay logged in permanently',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'When not set, you will get logged out at latest after 30 days',
|
||||||
|
'Filter by status' => 'Filter by status',
|
||||||
|
'Below min. stock amount' => 'Below min. stock amount',
|
||||||
|
'Expiring soon' => 'Expiring soon',
|
||||||
|
'Already expired' => 'Already expired',
|
||||||
|
'Due soon' => 'Due soon',
|
||||||
|
'Overdue' => 'Overdue',
|
||||||
|
'View settings' => 'View settings',
|
||||||
|
'Auto reload on external changes' => 'Auto reload on external changes',
|
||||||
|
'Enable night mode' => 'Enable night mode',
|
||||||
|
'Auto enable in time range' => 'Auto enable in time range',
|
||||||
|
'From' => 'From',
|
||||||
|
'in format' => 'in format',
|
||||||
|
'To' => 'To',
|
||||||
|
'Time range goes over midnight' => 'Time range goes over midnight',
|
||||||
|
'Product picture' => 'Product picture',
|
||||||
|
'No file selected' => 'No file selected',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
|
'Delete' => 'Delete',
|
||||||
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
|
'Select file' => 'Select file',
|
||||||
|
'Image of product #1' => 'Image of product #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'This product cannot be deleted because it is in stock, please remove the stock amount first.',
|
||||||
|
'Delete not possible' => 'Delete not possible',
|
||||||
|
'Equipment' => 'Equipment',
|
||||||
|
'Instruction manual' => 'Instruction manual',
|
||||||
|
'The selected equipment has no instruction manual' => 'The selected equipment has no instruction manual',
|
||||||
|
'Notes' => 'Notes',
|
||||||
|
'Edit equipment' => 'Edit equipment',
|
||||||
|
'Create equipment' => 'Create equipment',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
|
'No picture available' => 'No picture available',
|
||||||
|
'Filter by product group' => 'Filter by product group',
|
||||||
|
'Presets for new products' => 'Presets for new products',
|
||||||
|
'Included recipes' => 'Included recipes',
|
||||||
|
'A recipe is required' => 'A recipe is required',
|
||||||
|
'Add included recipe' => 'Add included recipe',
|
||||||
|
'Edit included recipe' => 'Edit included recipe',
|
||||||
|
'Group' => 'Group',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'This will be used as a headline to group ingredients together',
|
||||||
|
'Journal' => 'Journal',
|
||||||
|
'Stock journal' => 'Stock journal',
|
||||||
|
'Filter by product' => 'Filter by product',
|
||||||
|
'Booking time' => 'Booking time',
|
||||||
|
'Booking type' => 'Booking type',
|
||||||
|
'Undo booking' => 'Undo booking',
|
||||||
|
'Undone on' => 'Undone on',
|
||||||
|
'Batteries journal' => 'Batteries journal',
|
||||||
|
'Filter by battery' => 'Filter by battery',
|
||||||
|
'Undo charge cycle' => 'Undo charge cycle',
|
||||||
|
'Undo chore execution' => 'Undo chore execution',
|
||||||
|
'Chore execution successfully undone' => 'Chore execution successfully undone',
|
||||||
|
'Undo' => 'Undo',
|
||||||
|
'Booking successfully undone' => 'Booking successfully undone',
|
||||||
|
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||||
|
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||||
|
'Add all list items to stock' => 'Add all list items to stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||||
|
'Use a specific stock item' => 'Use a specific stock item',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||||
|
'Default best before days after opened' => 'Default best before days after opened',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||||
|
'Mark as opened' => 'Mark as opened',
|
||||||
|
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||||
|
'Not opened' => 'Not opened',
|
||||||
|
'Opened' => 'Opened',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'#1 opened' => '#1 opened',
|
||||||
|
'Product expires' => 'Product expires',
|
||||||
|
'Task due' => 'Task due',
|
||||||
|
'Chore due' => 'Chore due',
|
||||||
|
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||||
|
'Show clock in header' => 'Show clock in header',
|
||||||
|
'Stock settings' => 'Stock settings',
|
||||||
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
|
'Skip' => 'Skip',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
|
);
|
@@ -83,5 +83,7 @@ return array(
|
|||||||
'Milliliter' => 'Milliliter',
|
'Milliliter' => 'Milliliter',
|
||||||
'Bottom' => 'Boden',
|
'Bottom' => 'Boden',
|
||||||
'Topping' => 'Belag',
|
'Topping' => 'Belag',
|
||||||
'French' => 'Französisch'
|
'French' => 'Französisch',
|
||||||
|
'Turkish' => 'Türkisch',
|
||||||
|
'Spanish' => 'Spanisch'
|
||||||
);
|
);
|
||||||
|
@@ -47,7 +47,6 @@ return array(
|
|||||||
'Charge cycles count' => 'Ladezyklen',
|
'Charge cycles count' => 'Ladezyklen',
|
||||||
'Create shopping list item' => 'Einkaufszettel Eintrag erstellen',
|
'Create shopping list item' => 'Einkaufszettel Eintrag erstellen',
|
||||||
'Edit shopping list item' => 'Einkaufszettel Eintrag bearbeiten',
|
'Edit shopping list item' => 'Einkaufszettel Eintrag bearbeiten',
|
||||||
'#1 units were automatically added and will apply in addition to the amount entered here' => '#1 Einheiten wurden automatisch hinzugefügt und gelten zusätzlich der hier eingegebenen Menge',
|
|
||||||
'Save' => 'Speichern',
|
'Save' => 'Speichern',
|
||||||
'Add' => 'Hinzufügen',
|
'Add' => 'Hinzufügen',
|
||||||
'Name' => 'Name',
|
'Name' => 'Name',
|
||||||
@@ -260,7 +259,6 @@ return array(
|
|||||||
'Product picture' => 'Produktbild',
|
'Product picture' => 'Produktbild',
|
||||||
'No file selected' => 'Keine Datei ausgewählt',
|
'No file selected' => 'Keine Datei ausgewählt',
|
||||||
'If you don\'t select a file, the current picture will not be altered' => 'Wenn du keine Datei auswählst, wird das aktuelle Bild nicht verändert',
|
'If you don\'t select a file, the current picture will not be altered' => 'Wenn du keine Datei auswählst, wird das aktuelle Bild nicht verändert',
|
||||||
'Current picture' => 'Aktuelles Bild',
|
|
||||||
'Delete' => 'Löschen',
|
'Delete' => 'Löschen',
|
||||||
'The current picture will be deleted when you save the product' => 'Das aktuelle Bild wird beim Speichern des Produkts gelöscht',
|
'The current picture will be deleted when you save the product' => 'Das aktuelle Bild wird beim Speichern des Produkts gelöscht',
|
||||||
'Select file' => 'Datei auswählen',
|
'Select file' => 'Datei auswählen',
|
||||||
@@ -274,7 +272,6 @@ return array(
|
|||||||
'Edit equipment' => 'Geräte bearbeiten',
|
'Edit equipment' => 'Geräte bearbeiten',
|
||||||
'Create equipment' => 'Geräte erstellen',
|
'Create equipment' => 'Geräte erstellen',
|
||||||
'If you don\'t select a file, the current instruction manual will not be altered' => 'Wenn du keine Datei auswählst, wird die aktuelle Bedienungsanleitung nicht verändert',
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Wenn du keine Datei auswählst, wird die aktuelle Bedienungsanleitung nicht verändert',
|
||||||
'Current instruction manual' => 'Aktuelle Bedienungsanleitung',
|
|
||||||
'No instruction manual available' => 'Keine Bedienungsanleitung vorhanden',
|
'No instruction manual available' => 'Keine Bedienungsanleitung vorhanden',
|
||||||
'The current instruction manual will be deleted when you save the equipment' => 'Die aktuelle Bedienungsanleitung wird beim Speichern des Geräts gelöscht',
|
'The current instruction manual will be deleted when you save the equipment' => 'Die aktuelle Bedienungsanleitung wird beim Speichern des Geräts gelöscht',
|
||||||
'No picture available' => 'Kein Bild vorhanden',
|
'No picture available' => 'Kein Bild vorhanden',
|
||||||
@@ -326,5 +323,27 @@ return array(
|
|||||||
'Stock settings' => 'Bestandseinstellungen',
|
'Stock settings' => 'Bestandseinstellungen',
|
||||||
'Shopping list to stock workflow' => 'Einkaufsliste -> Bestand Workflow',
|
'Shopping list to stock workflow' => 'Einkaufsliste -> Bestand Workflow',
|
||||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Buchung automatisch ausführen, wenn das Produkt "Standard Haltbarkeit in Tagen" hinterlegt hat (als Preis wird der letzte Preis verwendet)',
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Buchung automatisch ausführen, wenn das Produkt "Standard Haltbarkeit in Tagen" hinterlegt hat (als Preis wird der letzte Preis verwendet)',
|
||||||
'Skip' => 'Überspringen'
|
'Skip' => 'Überspringen',
|
||||||
|
'Servings' => 'Portionen',
|
||||||
|
'Costs' => 'Kosten',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Basierend auf den Preisen des letzten Kaufs pro Produkt',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'Die hier aufgeführten Zutaten ergeben diese Menge an Portionen',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Nicht gegen die bereits auf der Einkaufsliste vorhandene Menge prüfen, wenn fehlende Zutaten auf die Einkaufsliste gesetzt werden',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'Standardmäßig ist die Menge, die der Einkaufsliste hinzugefügt werden soll, "benötigte Menge - Lagerbestand - Menge bereits auf der Einkaufsliste" - wenn dies aktiviert ist, wird nur gegen den Lagerbestand geprüft, nicht gegen das, was bereits auf der Einkaufsliste steht',
|
||||||
|
'Picture' => 'Bild',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Entferne den Haken einer Zutat, um diese nicht auf die Einkaufsliste zu übernehmen',
|
||||||
|
'This is for statistical purposes only' => 'Dies wird nur für Auswertezwecke benötigt',
|
||||||
|
'You have to select a recipe' => 'Ein Rezept muss ausgewählt werden',
|
||||||
|
'Key type' => 'Schlusseltyp',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Kalender teilen/integrieren (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Verwende die folgende (öffentliche) URL, um den Kalender im iCal-Format zu teilen oder zu integrieren',
|
||||||
|
'Allow partial units in stock' => 'Teilmengen im Bestand zulassen',
|
||||||
|
'Enable tare weight handling' => 'Taragewichtbehandlung aktivieren',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'Dies ist z.B. für Mehl im Glas nützlich - beim Buchen eines Kaufs/Verbrauchs oder bei der Inventur musst du dann immer das gesamte Glas wiegen, die zu buchende Menge wird dann automatisch basierend auf dem Bestand und dem unten definierten Eigengewicht berechnet',
|
||||||
|
'Tare weight' => 'Taragewicht',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Taragewichtbehandlung aktiviert - bitte den gesamten Behälter wiegen, die zu buchende Menge wird automatisch berechnet',
|
||||||
|
'You have to select a location' => 'Ein Standort muss ausgewählt werden',
|
||||||
|
'List' => 'Liste',
|
||||||
|
'Gallery' => 'Galerie',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'Das aktuelle Bild wird beim Speichern des Rezepts gelöscht '
|
||||||
);
|
);
|
||||||
|
@@ -83,5 +83,7 @@ return array(
|
|||||||
'Milliliter' => 'Milliliter',
|
'Milliliter' => 'Milliliter',
|
||||||
'Bottom' => 'Bottom',
|
'Bottom' => 'Bottom',
|
||||||
'Topping' => 'Topping',
|
'Topping' => 'Topping',
|
||||||
'French' => 'French'
|
'French' => 'French',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
);
|
);
|
||||||
|
@@ -47,7 +47,6 @@ return array(
|
|||||||
'Charge cycles count' => 'Charge cycles count',
|
'Charge cycles count' => 'Charge cycles count',
|
||||||
'Create shopping list item' => 'Create shopping list item',
|
'Create shopping list item' => 'Create shopping list item',
|
||||||
'Edit shopping list item' => 'Edit shopping list item',
|
'Edit shopping list item' => 'Edit shopping list item',
|
||||||
'#1 units were automatically added and will apply in addition to the amount entered here' => '#1 units were automatically added and will apply in addition to the amount entered here',
|
|
||||||
'Save' => 'Save',
|
'Save' => 'Save',
|
||||||
'Add' => 'Add',
|
'Add' => 'Add',
|
||||||
'Name' => 'Name',
|
'Name' => 'Name',
|
||||||
@@ -260,7 +259,6 @@ return array(
|
|||||||
'Product picture' => 'Product picture',
|
'Product picture' => 'Product picture',
|
||||||
'No file selected' => 'No file selected',
|
'No file selected' => 'No file selected',
|
||||||
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
'Current picture' => 'Current picture',
|
|
||||||
'Delete' => 'Delete',
|
'Delete' => 'Delete',
|
||||||
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
'Select file' => 'Select file',
|
'Select file' => 'Select file',
|
||||||
@@ -274,7 +272,6 @@ return array(
|
|||||||
'Edit equipment' => 'Edit equipment',
|
'Edit equipment' => 'Edit equipment',
|
||||||
'Create equipment' => 'Create equipment',
|
'Create equipment' => 'Create equipment',
|
||||||
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
'Current instruction manual' => 'Current instruction manual',
|
|
||||||
'No instruction manual available' => 'No instruction manual available',
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
'No picture available' => 'No picture available',
|
'No picture available' => 'No picture available',
|
||||||
@@ -326,5 +323,27 @@ return array(
|
|||||||
'Stock settings' => 'Stock settings',
|
'Stock settings' => 'Stock settings',
|
||||||
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
'Skip' => 'Skip'
|
'Skip' => 'Skip',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||||
);
|
);
|
||||||
|
6
localization/es/chore_types.php
Normal file
6
localization/es/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Manualmente',
|
||||||
|
'dynamic-regular' => 'Dinámico regular'
|
||||||
|
);
|
10
localization/es/component_translations.php
Normal file
10
localization/es/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'es',
|
||||||
|
'timeago_nan' => 'Hace NaN años',
|
||||||
|
'moment_locale' => 'es',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"Sin datos en la tabla","sInfo":"Mostrando de _START_ a _END_ de _TOTAL_ entradas","sInfoEmpty":"Mostrando de 0 a 0 de 0 entradas","sInfoFiltered":"(filtrando a _MAX_ entradas máximas)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Mostrar _MENU_ entradas","sLoadingRecords":"Cargando...","sProcessing":"Procesando...","sSearch":"Buscar:","sZeroRecords":"No se han encontrado resultados coincidentes","oPaginate":{"sFirst":"Primero","sLast":"Último","sNext":"Siguiente","sPrevious":"Anterior"},"oAria":{"sSortAscending":": activar para ordenar ascendentemente","sSortDescending":": activar para ordenar descendentemente"}}',
|
||||||
|
'summernote_locale' => 'es-ES',
|
||||||
|
'fullcalendar_locale' => 'es'
|
||||||
|
);
|
89
localization/es/demo_data.php
Normal file
89
localization/es/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Galletas',
|
||||||
|
'Chocolate' => 'Chocolate',
|
||||||
|
'Pantry' => 'Despensa',
|
||||||
|
'Candy cupboard' => 'Estante de los dulces',
|
||||||
|
'Tinned food cupboard' => 'Estante de las latas',
|
||||||
|
'Fridge' => 'Nevera',
|
||||||
|
'Piece' => 'Pieza',
|
||||||
|
'Pieces' => 'Piezas',
|
||||||
|
'Pack' => 'Pack',
|
||||||
|
'Packs' => 'Packs',
|
||||||
|
'Glass' => 'Vaso',
|
||||||
|
'Glasses' => 'Vasos',
|
||||||
|
'Tin' => 'Envase',
|
||||||
|
'Tins' => 'Envases',
|
||||||
|
'Can' => 'Lata',
|
||||||
|
'Cans' => 'Latas',
|
||||||
|
'Bunch' => 'Puñado',
|
||||||
|
'Bunches' => 'Puñados',
|
||||||
|
'Gummy bears' => 'Ositos',
|
||||||
|
'Crisps' => 'Patatas fritas',
|
||||||
|
'Eggs' => 'Huevos',
|
||||||
|
'Noodles' => 'Fideos',
|
||||||
|
'Pickles' => 'Pepinillos',
|
||||||
|
'Gulash soup' => 'Sopa',
|
||||||
|
'Yogurt' => 'Yogurt',
|
||||||
|
'Cheese' => 'Queso',
|
||||||
|
'Cold cuts' => 'Fiambres',
|
||||||
|
'Paprika' => 'Pimentón',
|
||||||
|
'Cucumber' => 'Pepino',
|
||||||
|
'Radish' => 'Rábano',
|
||||||
|
'Tomato' => 'Tomate',
|
||||||
|
'Changed towels in the bathroom' => 'Cambiar las toallas del baño',
|
||||||
|
'Cleaned the kitchen floor' => 'Limpiar el suelo de la cocina',
|
||||||
|
'Warranty ends' => 'Final de la garantía',
|
||||||
|
'TV remote control' => 'Mando de la TV',
|
||||||
|
'Alarm clock' => 'Despertador',
|
||||||
|
'Heat remote control' => 'Mando de la calefacción',
|
||||||
|
'Lawn mowed in the garden' => 'Cortar el césped del jardín',
|
||||||
|
'Some good snacks' => 'Cosas de picar',
|
||||||
|
'Pizza dough' => 'Masa de pizza',
|
||||||
|
'Sieved tomatoes' => 'Tomate triturado',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Tostada',
|
||||||
|
'Minced meat' => 'Carne picada',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti boloñesa',
|
||||||
|
'Sandwiches' => 'Bocadillos',
|
||||||
|
'English' => 'Inglés',
|
||||||
|
'German' => 'Alemán',
|
||||||
|
'Italian' => 'Italiano',
|
||||||
|
'Demo in different language' => 'Demo en otro idioma',
|
||||||
|
'This is the note content of the recipe ingredient' => 'Este es el contenido de la nota del ingrediente de la receta',
|
||||||
|
'Demo User' => 'Usuario de demostración',
|
||||||
|
'Gram' => 'Gramo',
|
||||||
|
'Grams' => 'Gramos',
|
||||||
|
'Flour' => 'Harina',
|
||||||
|
'Pancakes' => 'Tortitas',
|
||||||
|
'Sugar' => 'Azucar',
|
||||||
|
'Home' => 'Casa',
|
||||||
|
'Life' => 'Vida',
|
||||||
|
'Projects' => 'Proyectos',
|
||||||
|
'Repair the garage door' => 'Reparar la puerta del garaje',
|
||||||
|
'Fork and improve grocy' => 'Forkea y mejora grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Encontrar una solución a qué hacer cuando me olvido las llaves',
|
||||||
|
'Sweets' => 'Dulces',
|
||||||
|
'Bakery products' => 'Productos de panadería',
|
||||||
|
'Tinned food' => 'Comida en lata',
|
||||||
|
'Butchery products' => 'Productos de carnicería',
|
||||||
|
'Vegetables/Fruits' => 'Verduras/Frutas',
|
||||||
|
'Refrigerated products' => 'Productos refrigerados',
|
||||||
|
'Coffee machine' => 'Máquina de café',
|
||||||
|
'Dishwasher' => 'Lavavajillas',
|
||||||
|
'Liter' => 'Litro',
|
||||||
|
'Liters' => 'Litros',
|
||||||
|
'Bottle' => 'Botella',
|
||||||
|
'Bottles' => 'Botellas',
|
||||||
|
'Milk' => 'Leche',
|
||||||
|
'Chocolate sauce' => 'Salsa de chocolate',
|
||||||
|
'Milliliters' => 'Mililitros',
|
||||||
|
'Milliliter' => 'Mililitro',
|
||||||
|
'Bottom' => 'Fondo',
|
||||||
|
'Topping' => 'Parte superior',
|
||||||
|
'French' => 'Francés',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
|
);
|
8
localization/es/stock_transaction_types.php
Normal file
8
localization/es/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Compra',
|
||||||
|
'consume' => 'Consumo',
|
||||||
|
'inventory-correction' => 'Corrección de inventario',
|
||||||
|
'product-opened' => 'Producto abierto'
|
||||||
|
);
|
349
localization/es/strings.php
Normal file
349
localization/es/strings.php
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Resumen de stock',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 productos caducan en los próximos #2 días',
|
||||||
|
'#1 products are already expired' => '#1 productos ya han caducado',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 productos están por debajo del mínimo de stock definido',
|
||||||
|
'Product' => 'Producto',
|
||||||
|
'Amount' => 'Cantidad',
|
||||||
|
'Next best before date' => 'Siguiente fecha de caducidad',
|
||||||
|
'Logout' => 'Cerrar sesión',
|
||||||
|
'Chores overview' => 'Resumen de tareas del hogar',
|
||||||
|
'Batteries overview' => 'Resumen de pilas',
|
||||||
|
'Purchase' => 'Compra',
|
||||||
|
'Consume' => 'Consumo',
|
||||||
|
'Inventory' => 'Inventario',
|
||||||
|
'Shopping list' => 'Lista de la compra',
|
||||||
|
'Chore tracking' => 'Seguimiento de tareas del hogar',
|
||||||
|
'Battery tracking' => 'Seguimiento de pilas',
|
||||||
|
'Products' => 'Productos',
|
||||||
|
'Locations' => 'Lugares',
|
||||||
|
'Quantity units' => 'Unidades',
|
||||||
|
'Chores' => 'Tareas del hogar',
|
||||||
|
'Batteries' => 'Pilas',
|
||||||
|
'Chore' => 'Tarea del hogar',
|
||||||
|
'Next estimated tracking' => 'Siguiente seguimiento estimado',
|
||||||
|
'Last tracked' => 'Último seguimiento',
|
||||||
|
'Battery' => 'Pila',
|
||||||
|
'Last charged' => 'Última carga',
|
||||||
|
'Next planned charge cycle' => 'Siguiente ciclo de carga planificado',
|
||||||
|
'Best before' => 'Preferentemente antes de',
|
||||||
|
'OK' => 'OK',
|
||||||
|
'Product overview' => 'Resumen de producto',
|
||||||
|
'Stock quantity unit' => 'Unidad de stock',
|
||||||
|
'Stock amount' => 'Cantidad de stock',
|
||||||
|
'Last purchased' => 'Última compra',
|
||||||
|
'Last used' => 'Último uso',
|
||||||
|
'Spoiled' => 'Desperdiciado',
|
||||||
|
'Barcode lookup is disabled' => 'El buscador de códigos de barras está deshabilitado',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'será añadido a la lista de códigos de barras para el producto seleccionado al enviar',
|
||||||
|
'New amount' => 'Nueva cantidad',
|
||||||
|
'Note' => 'Nota',
|
||||||
|
'Tracked time' => 'Tiempo seguido',
|
||||||
|
'Chore overview' => 'Resumen de tarea del hogar',
|
||||||
|
'Tracked count' => 'Cuenta seguida',
|
||||||
|
'Battery overview' => 'Resumen de pila',
|
||||||
|
'Charge cycles count' => 'Cuenta de ciclos de carga',
|
||||||
|
'Create shopping list item' => 'Crear elemento de la lista de la compra',
|
||||||
|
'Edit shopping list item' => 'Editar elemento de la lista de la compra',
|
||||||
|
'Save' => 'Grabar',
|
||||||
|
'Add' => 'Añadir',
|
||||||
|
'Name' => 'Nombre',
|
||||||
|
'Location' => 'Lugar',
|
||||||
|
'Min. stock amount' => 'Min. cantidad de stock',
|
||||||
|
'QU purchase' => 'Cantidad de compra',
|
||||||
|
'QU stock' => 'Cantidad de stock',
|
||||||
|
'QU factor' => 'Factor de cantidad',
|
||||||
|
'Description' => 'Descripción',
|
||||||
|
'Create product' => 'Crear producto',
|
||||||
|
'Barcode(s)' => 'Código(s) de barras',
|
||||||
|
'Minimum stock amount' => 'Mínima cantidad de stock',
|
||||||
|
'Default best before days' => 'Días de caducidad por defecto',
|
||||||
|
'Quantity unit purchase' => 'Unidad de compra',
|
||||||
|
'Quantity unit stock' => 'Unidad de stock',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Factor de unidad entre compra y stock',
|
||||||
|
'Create location' => 'Crear lugar',
|
||||||
|
'Create quantity unit' => 'Crear unidad',
|
||||||
|
'Period type' => 'Tipo de periodo',
|
||||||
|
'Period days' => 'Días del periodo',
|
||||||
|
'Create chore' => 'Crear tarea del hogar',
|
||||||
|
'Used in' => 'Usado en',
|
||||||
|
'Create battery' => 'Crear pila',
|
||||||
|
'Edit battery' => 'Editar pila',
|
||||||
|
'Edit chore' => 'Editar tarea del hogar',
|
||||||
|
'Edit quantity unit' => 'Editar unidad',
|
||||||
|
'Edit product' => 'Editar producto',
|
||||||
|
'Edit location' => 'Editar lugar',
|
||||||
|
'Record data' => 'Grabar datos',
|
||||||
|
'Manage master data' => 'Administrar datos maestros',
|
||||||
|
'This will apply to added products' => 'Esto se aplicará a los productos añadidos',
|
||||||
|
'never' => 'nunca',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Añadir productos que están por debajo del mínimo de stock definido',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'Para nuevas compras, esta cantidad de días se añadirán desde hoy como sugerencia de fecha de caducidad',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'Quiere decir que 1 #1 comprada se convertirá en #2 #3 en el stock',
|
||||||
|
'Login' => 'Iniciar sesión',
|
||||||
|
'Username' => 'Nombre usuario',
|
||||||
|
'Password' => 'Contraseña',
|
||||||
|
'Invalid credentials, please try again' => 'Credenciales inválidas, prueba de nuevo',
|
||||||
|
'Are you sure to delete battery "#1"?' => '¿Estás seguro de querer borrar la pila "#1"?',
|
||||||
|
'Yes' => 'Sí',
|
||||||
|
'No' => 'No',
|
||||||
|
'Are you sure to delete chore "#1"?' => '¿Estás seguro de querer borrar la tarea del hogar "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" no puede resolverse a un producto, ¿cómo quieres proceder?',
|
||||||
|
'Create or assign product' => 'Crear o asignar un producto',
|
||||||
|
'Cancel' => 'Cancelar',
|
||||||
|
'Add as new product' => 'Añadir como un nuevo producto',
|
||||||
|
'Add as barcode to existing product' => 'Añadir como código de barras de un producto existente',
|
||||||
|
'Add as new product and prefill barcode' => 'Añadir un nuevo producto y rellenar código de barras',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => '¿Estás seguro de querer borrar la unidad "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => '¿Estás seguro de querer borrar el producto "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => '¿Estás seguro de querer borrar el lugar "#1"?',
|
||||||
|
'Manage API keys' => 'Administrar las claves de API',
|
||||||
|
'REST API & data model documentation' => 'Documentación de la API REST y modelo de datos',
|
||||||
|
'API keys' => 'Claves de API',
|
||||||
|
'Create new API key' => 'Crear nueva clave de API',
|
||||||
|
'API key' => 'Clave de API',
|
||||||
|
'Expires' => 'Caduca',
|
||||||
|
'Created' => 'Creado',
|
||||||
|
'This product is not in stock' => 'Este producto no está en stock',
|
||||||
|
'This means #1 will be added to stock' => 'Quiere decir que #1 será añadido al stock',
|
||||||
|
'This means #1 will be removed from stock' => 'Quiere decir que #1 será eliminado del stock',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'Quiere decir que una nueva ocurrencia de esta tarea del hogar se seguirá #1 días después de la última vez',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Eliminado #1 #2 de #3 del stock',
|
||||||
|
'About grocy' => 'Sobre grocy',
|
||||||
|
'Close' => 'Cerrar',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 pilas están pendientes de carga en los siguientes #2 días',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 pilas han pasado su fecha de carga prevista',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 tareas del hogar están pendientes de suceder en los siguientes #2 días',
|
||||||
|
'#1 chores are overdue to be done' => '#1 tareas del hogar están vencidas',
|
||||||
|
'Released on' => 'Publicado el',
|
||||||
|
'Consume #3 #1 of #2' => 'Consumir #3 #1 de #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Añadido #1 #2 de #3 al stock',
|
||||||
|
'Stock amount of #1 is now #2 #3' => 'La cantidad de stock de #1 es ahora #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Registrada ejecución de tarea del hogar #1 en #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Registrado ciclo de carga de la pila #1 en #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Consumir todo #1 que está en stock',
|
||||||
|
'All' => 'Todo',
|
||||||
|
'Track charge cycle of battery #1' => 'Registrar ciclo de carga de la pila #1',
|
||||||
|
'Track execution of chore #1' => 'Registrar ejecución de tarea del hogar #1',
|
||||||
|
'Filter by location' => 'Filtrar por lugar',
|
||||||
|
'Search' => 'Buscar',
|
||||||
|
'Not logged in' => 'Sesión no iniciada',
|
||||||
|
'You have to select a product' => 'Has de seleccionar un producto',
|
||||||
|
'You have to select a chore' => 'Has de seleccionar una tarea del hogar',
|
||||||
|
'You have to select a battery' => 'Has de seleccionar una pila',
|
||||||
|
'A name is required' => 'Es necesario un nombre',
|
||||||
|
'A location is required' => 'Es necesario un lugar',
|
||||||
|
'The amount cannot be lower than #1' => 'La cantidad no puede ser menor a #1',
|
||||||
|
'This cannot be negative' => 'Esto no puede ser negativo',
|
||||||
|
'A quantity unit is required' => 'Es necesaria una unidad',
|
||||||
|
'A period type is required' => 'Es necesario un tipo de periodo',
|
||||||
|
'A best before date is required and must be later than today' => 'Es necesaria una fecha de caducidad y debe ser posterior a hoy',
|
||||||
|
'Settings' => 'Configuración',
|
||||||
|
'This can only be before now' => 'Sólo puede ser antes que ahora',
|
||||||
|
'Calendar' => 'Calendario',
|
||||||
|
'Recipes' => 'Recetas',
|
||||||
|
'Edit recipe' => 'Editar receta',
|
||||||
|
'New recipe' => 'Nueva receta',
|
||||||
|
'Ingredients list' => 'Lista de ingredientes',
|
||||||
|
'Add recipe ingredient' => 'Añadir ingrediente',
|
||||||
|
'Edit recipe ingredient' => 'Editar ingrediente',
|
||||||
|
'Are you sure to delete recipe "#1"?' => '¿Estás seguro de querer borrar la receta "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => '¿Estás seguro de querer borrar el ingrediente "#1" de la receta?',
|
||||||
|
'Are you sure to empty the shopping list?' => '¿Estás seguro de querer borrar la lista de la compra?',
|
||||||
|
'Clear list' => 'Borrar lista',
|
||||||
|
'Requirements fulfilled' => 'Requerimientos completos',
|
||||||
|
'Put missing products on shopping list' => 'Añadir productos faltantes a la lista de la compra',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'No hay suficiente stock, faltan #1 ingredientes',
|
||||||
|
'Enough in stock' => 'Suficiente stock',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'No hay suficiente stock, faltan #1 ingredientes, pero están en la lista de la compra',
|
||||||
|
'Expand to fullscreen' => 'Pantalla completa',
|
||||||
|
'Ingredients' => 'Ingredientes',
|
||||||
|
'Preparation' => 'Preparación',
|
||||||
|
'Recipe' => 'Receta',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'No hay suficiente stock, faltan #1, pero #2 están en la lista de la compra',
|
||||||
|
'Show notes' => 'Mostrar notas',
|
||||||
|
'Put missing amount on shopping list' => 'Añadir cantidades faltantes en la lista de la compra',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => '¿Estás seguro de poner todos los ingredientes faltantes para la recepta "#1" en la lista de la compra?',
|
||||||
|
'Added for recipe #1' => 'Añadido para la receta #1',
|
||||||
|
'Manage users' => 'Administrar usuarios',
|
||||||
|
'User' => 'Usuario',
|
||||||
|
'Users' => 'Usuarios',
|
||||||
|
'Are you sure to delete user "#1"?' => '¿Estás seguro de borrar el usuario "#1"?',
|
||||||
|
'Create user' => 'Crear usuario',
|
||||||
|
'Edit user' => 'Editar usuario',
|
||||||
|
'First name' => 'Nombre',
|
||||||
|
'Last name' => 'Apellidos',
|
||||||
|
'A username is required' => 'Es necesario un nombre de usuario',
|
||||||
|
'Confirm password' => 'Confirma la contraseña',
|
||||||
|
'Passwords do not match' => 'Las contraseñas no coinciden',
|
||||||
|
'Change password' => 'Cambiar contraseña',
|
||||||
|
'Done by' => 'Hecho el',
|
||||||
|
'Last done by' => 'Último hecho el',
|
||||||
|
'Unknown' => 'Desconocido',
|
||||||
|
'Filter by chore' => 'Filtrar por tarea del hogar',
|
||||||
|
'Chores journal' => 'Diario de tareas del hogar',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 significa que las sugerencias para el siguiente ciclo de carga estarán deshabilitadas',
|
||||||
|
'Charge cycle interval (days)' => 'Intervalo de ciclo de carga (días)',
|
||||||
|
'Last price' => 'Último precio',
|
||||||
|
'Price history' => 'Histórico de precios',
|
||||||
|
'No price history available' => 'No hay histórico de precios disponible',
|
||||||
|
'Price' => 'Precio',
|
||||||
|
'in #1 per purchase quantity unit' => 'en #1 por unidad de compra',
|
||||||
|
'The price cannot be lower than #1' => 'El precio no puede ser menor que #1',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 producto caduca en los próximos #2 días',
|
||||||
|
'#1 product is already expired' => '#1 producto está ya caducado',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 producto está por debajo de la min. cantidad de stock',
|
||||||
|
'Unit' => 'Unidad',
|
||||||
|
'Units' => 'Unidades',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 tarea del hogar vence en los próximos #2 días',
|
||||||
|
'#1 chore is overdue to be done' => '#1 tarea del hogar está vencida',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 pila debe ser cargada en los próximos #2 días',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 pila ha vencido para ser cargada',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unidad se ha añadido automáticamente y se aplicará además de la cantidad indicada aquí',
|
||||||
|
'in singular form' => 'en singular',
|
||||||
|
'in plural form' => 'en plural',
|
||||||
|
'Never expires' => 'Nunca caduca',
|
||||||
|
'This cannot be lower than #1' => 'No puede ser menor que #1',
|
||||||
|
'-1 means that this product never expires' => '-1 significa que este producto nunca caduca',
|
||||||
|
'Quantity unit' => 'Unidad',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Solo comprobar si una unidad está en stock (una cantidad diferente puede usarse arriba)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => '¿Estás seguro de consumir todos los ingredientes necesarios de la receta "#1" (los ingredientes marcados como "solo comprobar si una unidad está en stock" se ignorarán)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Eliminar todos los ingredientes de la recepta "#1" del stock',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Consumir todos los ingredientes necesarios para esta receta',
|
||||||
|
'Click to show technical details' => 'Haz click para mostrar detalles técnicos',
|
||||||
|
'Error while saving, probably this item already exists' => 'Error al gabar, probablemente este elemento ya existe',
|
||||||
|
'Error details' => 'Detalles del error',
|
||||||
|
'Tasks' => 'Tareas',
|
||||||
|
'Show done tasks' => 'Mostrar tareas completadas',
|
||||||
|
'Task' => 'Tarea',
|
||||||
|
'Due' => 'Vence',
|
||||||
|
'Assigned to' => 'Asignado a',
|
||||||
|
'Mark task "#1" as completed' => 'Marcar la tarea "#1" como completada',
|
||||||
|
'Uncategorized' => 'Sin categorizar',
|
||||||
|
'Task categories' => 'Categoría de tareas',
|
||||||
|
'Create task' => 'Crear tarea',
|
||||||
|
'A due date is required' => 'Es necesaria una fecha de vencimiento',
|
||||||
|
'Category' => 'Categoría',
|
||||||
|
'Edit task' => 'Editar tarea',
|
||||||
|
'Are you sure to delete task "#1"?' => '¿Estás seguro de borrar la tarea "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 tarea vence en los próximos #2 días',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 tareas vencen en los próximos #2 días',
|
||||||
|
'#1 task is overdue to be done' => '#1 tarea está vencida',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 tareas están vencidas',
|
||||||
|
'Edit task category' => 'Editar categoría de tarea',
|
||||||
|
'Create task category' => 'Crear categoría de tarea',
|
||||||
|
'Product groups' => 'Grupos de producto',
|
||||||
|
'Ungrouped' => 'Sin agrupar',
|
||||||
|
'Create product group' => 'Crear grupo de productos',
|
||||||
|
'Edit product group' => 'Editar grupos de producto',
|
||||||
|
'Product group' => 'Grupo de producto',
|
||||||
|
'Are you sure to delete product group "#1"?' => '¿Estás seguro de querer borrar el grupo de productos "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Permanecer con la sesión iniciada',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'Si no está marcado, se cerrará la sesión como máximo en 30 días',
|
||||||
|
'Filter by status' => 'Filtrar por estado',
|
||||||
|
'Below min. stock amount' => 'Por debajo de la min. cantidad de stock',
|
||||||
|
'Expiring soon' => 'Caduca pronto',
|
||||||
|
'Already expired' => 'Ya caducado',
|
||||||
|
'Due soon' => 'Vence pronto',
|
||||||
|
'Overdue' => 'Vencido',
|
||||||
|
'View settings' => 'Ver configuración',
|
||||||
|
'Auto reload on external changes' => 'Autorecarga en cambios externos',
|
||||||
|
'Enable night mode' => 'Habilitar modo noche',
|
||||||
|
'Auto enable in time range' => 'Autohabilitar en una franja de tiempo',
|
||||||
|
'From' => 'Desde',
|
||||||
|
'in format' => 'en formato',
|
||||||
|
'To' => 'A',
|
||||||
|
'Time range goes over midnight' => 'La franja del tiempo atraviesa la media noche',
|
||||||
|
'Product picture' => 'Foto del producto',
|
||||||
|
'No file selected' => 'No hay fichero seleccionado',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'Si no seleccionas un fichero, la imagen actual no cambiará',
|
||||||
|
'Delete' => 'Borrar',
|
||||||
|
'The current picture will be deleted when you save the product' => 'Se borrará la imagen actual si grabas el producto',
|
||||||
|
'Select file' => 'Seleccionar fichero',
|
||||||
|
'Image of product #1' => 'Imagen del producto #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'Este producto no se puede borrar porque está en stock, por favor, elimina el stock antes.',
|
||||||
|
'Delete not possible' => 'No es posible eliminar',
|
||||||
|
'Equipment' => 'Equipamiento',
|
||||||
|
'Instruction manual' => 'Manual de instrucciones',
|
||||||
|
'The selected equipment has no instruction manual' => 'El equipamiento seleccionado no tiene manual de instrucciones',
|
||||||
|
'Notes' => 'Notas',
|
||||||
|
'Edit equipment' => 'Editar equipamiento',
|
||||||
|
'Create equipment' => 'Crear equipamiento',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Si no seleccionas un fichero, el manual de instrucciones actual no cambiará',
|
||||||
|
'No instruction manual available' => 'No hay manual de instrucciones disponible',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'Se borrará el manual de instrucciones si grabas el equipamiento',
|
||||||
|
'No picture available' => 'No hay imagen disponible',
|
||||||
|
'Filter by product group' => 'Filtrar por grupo de producto',
|
||||||
|
'Presets for new products' => 'Configuraciones para nuevos productos',
|
||||||
|
'Included recipes' => 'Recetas incluidas',
|
||||||
|
'A recipe is required' => 'Es necesaria una receta',
|
||||||
|
'Add included recipe' => 'Añadir receta incluida',
|
||||||
|
'Edit included recipe' => 'Editar receta incluida',
|
||||||
|
'Group' => 'Grupo',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'Esto se usará como titular del grupo de ingredientes',
|
||||||
|
'Journal' => 'Diario',
|
||||||
|
'Stock journal' => 'Diario de stock',
|
||||||
|
'Filter by product' => 'Filtrar por producto',
|
||||||
|
'Booking time' => 'Momento de reserva',
|
||||||
|
'Booking type' => 'Tipo de reserva',
|
||||||
|
'Undo booking' => 'Deshacer reserva',
|
||||||
|
'Undone on' => 'Deshecho el',
|
||||||
|
'Batteries journal' => 'Diario de pilas',
|
||||||
|
'Filter by battery' => 'Filtrar por pila',
|
||||||
|
'Undo charge cycle' => 'Deshacer el ciclo de carga',
|
||||||
|
'Undo chore execution' => 'Deshacer ejecución de tarea del hogar',
|
||||||
|
'Chore execution successfully undone' => 'Ejecución de tarea del hogar deshecha',
|
||||||
|
'Undo' => 'Deshacer',
|
||||||
|
'Booking successfully undone' => 'Reserva deshecha',
|
||||||
|
'Charge cycle successfully undone' => 'Ciclo de carga deshecho',
|
||||||
|
'This cannot be negative and must be an integral number' => 'No puede ser negativo y ha de ser un número entero',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Deshabilitar comprobación de stock para este ingrediente',
|
||||||
|
'Add all list items to stock' => 'Añadir todos los elementos de la lista al stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Añadir #3 #1 de #2 al stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Añadiendo elemento de la lista de la compra #1 a #2',
|
||||||
|
'Use a specific stock item' => 'Usar un elemento específico del stock',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'El primer elemento de esta lista sería elegido por la regla "primero lo primero a caducar, luego primero en llegar, primero en salir"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Marcar #3 #1 de #2 como abierto',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'Cuando un producto es marcado como abierto, la fecha de caducidad se cambiará por hoy más esta cantidad de días (un valor de 0 deshabilita esto)',
|
||||||
|
'Default best before days after opened' => 'Días de consumo después de abierto por defecto',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marcado #1 #2 de #3 como abierto',
|
||||||
|
'Mark as opened' => 'Marcar como abierto',
|
||||||
|
'Expires on #1; Bought on #2' => 'Caduca el #1; comprado el #2',
|
||||||
|
'Not opened' => 'Sin abrir',
|
||||||
|
'Opened' => 'Abierto',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Marcar #3 #1 de #2 como abierto',
|
||||||
|
'#1 opened' => '#1 abierto',
|
||||||
|
'Product expires' => 'El producto caduca',
|
||||||
|
'Task due' => 'Vencimiento de tarea',
|
||||||
|
'Chore due' => 'Vencimiento de tarea del hogar',
|
||||||
|
'Battery charge cycle due' => 'Vencimiento de ciclo de carga',
|
||||||
|
'Show clock in header' => 'Mostrar reloj en la cabecera',
|
||||||
|
'Stock settings' => 'Configuración de stock',
|
||||||
|
'Shopping list to stock workflow' => 'Flujo de lista de la compra a stock',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Hacer automáticamente la reserva utilizando el último precio y cantidad del elemento de la lista de la compra, si el producto tiene valor en "días de consumo por defecto"',
|
||||||
|
'Skip' => 'Pasar',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||||
|
);
|
@@ -83,5 +83,7 @@ return array(
|
|||||||
'Milliliter' => 'Millilitre',
|
'Milliliter' => 'Millilitre',
|
||||||
'Bottom' => 'Dessous',
|
'Bottom' => 'Dessous',
|
||||||
'Topping' => 'Garniture',
|
'Topping' => 'Garniture',
|
||||||
'French' => 'Français'
|
'French' => 'Français',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
);
|
);
|
||||||
|
@@ -47,7 +47,6 @@ return array(
|
|||||||
'Charge cycles count' => 'Nombre de charges',
|
'Charge cycles count' => 'Nombre de charges',
|
||||||
'Create shopping list item' => 'Créer une liste de courses',
|
'Create shopping list item' => 'Créer une liste de courses',
|
||||||
'Edit shopping list item' => 'Modifier une liste de courses',
|
'Edit shopping list item' => 'Modifier une liste de courses',
|
||||||
'#1 units were automatically added and will apply in addition to the amount entered here' => '#1 unités seront automatiquement ajoutées en plus de la quantité renseignée ici',
|
|
||||||
'Save' => 'Sauvegarder',
|
'Save' => 'Sauvegarder',
|
||||||
'Add' => 'Ajouter',
|
'Add' => 'Ajouter',
|
||||||
'Name' => 'Nom',
|
'Name' => 'Nom',
|
||||||
@@ -260,7 +259,6 @@ return array(
|
|||||||
'Product picture' => 'Photo du produit',
|
'Product picture' => 'Photo du produit',
|
||||||
'No file selected' => 'Aucun fichier sélectionné',
|
'No file selected' => 'Aucun fichier sélectionné',
|
||||||
'If you don\'t select a file, the current picture will not be altered' => 'Si vous ne sélectionnez pas de photo, l\'actuelle sera conservée',
|
'If you don\'t select a file, the current picture will not be altered' => 'Si vous ne sélectionnez pas de photo, l\'actuelle sera conservée',
|
||||||
'Current picture' => 'Photo actuelle',
|
|
||||||
'Delete' => 'Supprimer',
|
'Delete' => 'Supprimer',
|
||||||
'The current picture will be deleted when you save the product' => 'La photo actuelle va être supprimée lors de la sauvegarde du produit',
|
'The current picture will be deleted when you save the product' => 'La photo actuelle va être supprimée lors de la sauvegarde du produit',
|
||||||
'Select file' => 'Sélectionner un fichier',
|
'Select file' => 'Sélectionner un fichier',
|
||||||
@@ -274,7 +272,6 @@ return array(
|
|||||||
'Edit equipment' => 'Modifier un équipement',
|
'Edit equipment' => 'Modifier un équipement',
|
||||||
'Create equipment' => 'Créer un équipement',
|
'Create equipment' => 'Créer un équipement',
|
||||||
'If you don\'t select a file, the current instruction manual will not be altered' => 'Si vous ne sélectionnez pas de fichier, le manuel actuel ne sera pas modifié',
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Si vous ne sélectionnez pas de fichier, le manuel actuel ne sera pas modifié',
|
||||||
'Current instruction manual' => 'Manuel d\'utilisation actuel',
|
|
||||||
'No instruction manual available' => 'Aucun manuel d\'utilisation disponible',
|
'No instruction manual available' => 'Aucun manuel d\'utilisation disponible',
|
||||||
'The current instruction manual will be deleted when you save the equipment' => 'Le manuel d\'utilisation actuel sera supprimé lors de la sauvegarde de cet équipement',
|
'The current instruction manual will be deleted when you save the equipment' => 'Le manuel d\'utilisation actuel sera supprimé lors de la sauvegarde de cet équipement',
|
||||||
'No picture available' => 'Aucune photo disponible',
|
'No picture available' => 'Aucune photo disponible',
|
||||||
@@ -326,5 +323,27 @@ return array(
|
|||||||
'Stock settings' => 'Paramètres du stock',
|
'Stock settings' => 'Paramètres du stock',
|
||||||
'Shopping list to stock workflow' => 'Transition de la liste de courses vers le stock',
|
'Shopping list to stock workflow' => 'Transition de la liste de courses vers le stock',
|
||||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Réaliser automatiquement les achats en utilisant le dernier prix connu et la quantité indiquée dans la liste, si le premier a une date de péremption par défaut renseignée',
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Réaliser automatiquement les achats en utilisant le dernier prix connu et la quantité indiquée dans la liste, si le premier a une date de péremption par défaut renseignée',
|
||||||
'Skip' => 'Passer'
|
'Skip' => 'Passer',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||||
);
|
);
|
||||||
|
@@ -39,41 +39,41 @@ return array(
|
|||||||
'Alarm clock' => 'Sveglia',
|
'Alarm clock' => 'Sveglia',
|
||||||
'Heat remote control' => 'Termostato',
|
'Heat remote control' => 'Termostato',
|
||||||
'Lawn mowed in the garden' => 'Prato falciato nel giardino',
|
'Lawn mowed in the garden' => 'Prato falciato nel giardino',
|
||||||
'Some good snacks' => 'Some good snacks',
|
'Some good snacks' => 'Alcuni buoni spuntini',
|
||||||
'Pizza dough' => 'Pizza dough',
|
'Pizza dough' => 'Impasto per pizza',
|
||||||
'Sieved tomatoes' => 'Sieved tomatoes',
|
'Sieved tomatoes' => 'Pomodori setacciati',
|
||||||
'Salami' => 'Salami',
|
'Salami' => 'Salame',
|
||||||
'Toast' => 'Toast',
|
'Toast' => 'Toast',
|
||||||
'Minced meat' => 'Minced meat',
|
'Minced meat' => 'Carne macinata',
|
||||||
'Pizza' => 'Pizza',
|
'Pizza' => 'Pizza',
|
||||||
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
'Spaghetti bolognese' => 'Spaghetti alla bolognese',
|
||||||
'Sandwiches' => 'Sandwiches',
|
'Sandwiches' => 'Sandwiches',
|
||||||
'English' => 'English',
|
'English' => 'Inglese',
|
||||||
'German' => 'German',
|
'German' => 'Tedesco',
|
||||||
'Italian' => 'Italian',
|
'Italian' => 'Italiano',
|
||||||
'Demo in different language' => 'Demo in different language',
|
'Demo in different language' => 'Demo in lingue diverse',
|
||||||
'This is the note content of the recipe ingredient' => 'This is the note content of the recipe ingredient',
|
'This is the note content of the recipe ingredient' => 'Questo è il contenuto della nota dell\'ingrediente della ricetta',
|
||||||
'Demo User' => 'Demo User',
|
'Demo User' => 'Utente Demo',
|
||||||
'Gram' => 'Gram',
|
'Gram' => 'Grammo',
|
||||||
'Grams' => 'Grams',
|
'Grams' => 'Grammi',
|
||||||
'Flour' => 'Flour',
|
'Flour' => 'Farina',
|
||||||
'Pancakes' => 'Pancakes',
|
'Pancakes' => 'Pancakes',
|
||||||
'Sugar' => 'Sugar',
|
'Sugar' => 'Zucchero',
|
||||||
'Home' => 'Home',
|
'Home' => 'Casa',
|
||||||
'Life' => 'Life',
|
'Life' => 'Vita',
|
||||||
'Projects' => 'Projects',
|
'Projects' => 'Progetti',
|
||||||
'Repair the garage door' => 'Repair the garage door',
|
'Repair the garage door' => 'Riparare la porta del garage',
|
||||||
'Fork and improve grocy' => 'Fork and improve grocy',
|
'Fork and improve grocy' => 'Forka e migliora grocy',
|
||||||
'Find a solution for what to do when I forget the door keys' => 'Find a solution for what to do when I forget the door keys',
|
'Find a solution for what to do when I forget the door keys' => 'Trova una soluzione per cosa fare quando dimentico le chiavi della porta',
|
||||||
'Sweets' => 'Sweets',
|
'Sweets' => 'Dolci',
|
||||||
'Bakery products' => 'Bakery products',
|
'Bakery products' => 'Prodotti da forno',
|
||||||
'Tinned food' => 'Tinned food',
|
'Tinned food' => 'Cibo in scatola',
|
||||||
'Butchery products' => 'Butchery products',
|
'Butchery products' => 'Prodotti della macelleria',
|
||||||
'Vegetables/Fruits' => 'Vegetables/Fruits',
|
'Vegetables/Fruits' => 'Verdura/Frutta',
|
||||||
'Refrigerated products' => 'Refrigerated products',
|
'Refrigerated products' => 'Prodotti refrigerati',
|
||||||
'Coffee machine' => 'Coffee machine',
|
'Coffee machine' => 'Macchina per il caffè',
|
||||||
'Dishwasher' => 'Dishwasher',
|
'Dishwasher' => 'Lavastoviglie',
|
||||||
'Liter' => 'Liter',
|
'Liter' => 'Litro',
|
||||||
'Liters' => 'Litri',
|
'Liters' => 'Litri',
|
||||||
'Bottle' => 'Bottiglia',
|
'Bottle' => 'Bottiglia',
|
||||||
'Bottles' => 'Bottiglie',
|
'Bottles' => 'Bottiglie',
|
||||||
@@ -82,6 +82,8 @@ return array(
|
|||||||
'Milliliters' => 'Millilitri',
|
'Milliliters' => 'Millilitri',
|
||||||
'Milliliter' => 'Millilitro',
|
'Milliliter' => 'Millilitro',
|
||||||
'Bottom' => 'Parte inferiore',
|
'Bottom' => 'Parte inferiore',
|
||||||
'Topping' => 'Topping',
|
'Topping' => 'Guarnizione',
|
||||||
'French' => 'French'
|
'French' => 'Francese',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
);
|
);
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'purchase' => 'Purchase',
|
'purchase' => 'Acquista',
|
||||||
'consume' => 'Consume',
|
'consume' => 'Consumare',
|
||||||
'inventory-correction' => 'Inventory correction',
|
'inventory-correction' => 'Correzione dell\'inventario',
|
||||||
'product-opened' => 'Product opened'
|
'product-opened' => 'Prodotto aperto'
|
||||||
);
|
);
|
||||||
|
@@ -47,7 +47,6 @@ return array(
|
|||||||
'Charge cycles count' => 'Numero di ricariche',
|
'Charge cycles count' => 'Numero di ricariche',
|
||||||
'Create shopping list item' => 'Aggiungi un prodotto alla lista della spesa',
|
'Create shopping list item' => 'Aggiungi un prodotto alla lista della spesa',
|
||||||
'Edit shopping list item' => 'Modifica un\'entrata della lista della spesa',
|
'Edit shopping list item' => 'Modifica un\'entrata della lista della spesa',
|
||||||
'#1 units were automatically added and will apply in addition to the amount entered here' => '#1 sono state aggiunte automaticamente',
|
|
||||||
'Save' => 'Salva',
|
'Save' => 'Salva',
|
||||||
'Add' => 'Aggiungi',
|
'Add' => 'Aggiungi',
|
||||||
'Name' => 'Nome',
|
'Name' => 'Nome',
|
||||||
@@ -140,27 +139,27 @@ return array(
|
|||||||
'This cannot be negative' => 'Il numero non può essere negativo',
|
'This cannot be negative' => 'Il numero non può essere negativo',
|
||||||
'A quantity unit is required' => 'Inserisci un\'unità di misura',
|
'A quantity unit is required' => 'Inserisci un\'unità di misura',
|
||||||
'A period type is required' => 'Seleziona un tipo di ripetizione',
|
'A period type is required' => 'Seleziona un tipo di ripetizione',
|
||||||
'A best before date is required and must be later than today' => 'A best before date is required and must be later than today',
|
'A best before date is required and must be later than today' => 'È necessaria una data di scadenza anticipata e deve essere successiva a quella di oggi',
|
||||||
'Settings' => 'Settings',
|
'Settings' => 'Impostazioni',
|
||||||
'This can only be before now' => 'This can only be before now',
|
'This can only be before now' => 'Questo può essere solo prima d\'ora',
|
||||||
'Calendar' => 'Calendar',
|
'Calendar' => 'Calendario',
|
||||||
'Recipes' => 'Recipes',
|
'Recipes' => 'Ricette',
|
||||||
'Edit recipe' => 'Edit recipe',
|
'Edit recipe' => 'Modifica Ricetta',
|
||||||
'New recipe' => 'New recipe',
|
'New recipe' => 'Nuova Ricetta',
|
||||||
'Ingredients list' => 'Ingredients list',
|
'Ingredients list' => 'Lista Ingredienti',
|
||||||
'Add recipe ingredient' => 'Add recipe ingredient',
|
'Add recipe ingredient' => 'Aggiungi l\'ingrediente della ricetta',
|
||||||
'Edit recipe ingredient' => 'Edit recipe ingredient',
|
'Edit recipe ingredient' => 'Modifica l\'ingrediente della ricetta',
|
||||||
'Are you sure to delete recipe "#1"?' => 'Are you sure to delete recipe "#1"?',
|
'Are you sure to delete recipe "#1"?' => 'Sei sicuro di voler eliminare la ricetta "# 1"?',
|
||||||
'Are you sure to delete recipe ingredient "#1"?' => 'Are you sure to delete recipe ingredient "#1"?',
|
'Are you sure to delete recipe ingredient "#1"?' => 'Sei sicuro di voler eliminare l\'ingrediente della ricetta "# 1"?',
|
||||||
'Are you sure to empty the shopping list?' => 'Are you sure to empty the shopping list?',
|
'Are you sure to empty the shopping list?' => 'Sei sicuro di svuotare la lista della spesa?',
|
||||||
'Clear list' => 'Clear list',
|
'Clear list' => 'Pulisci lista',
|
||||||
'Requirements fulfilled' => 'Requirements fulfilled',
|
'Requirements fulfilled' => 'Requisiti soddisfatti',
|
||||||
'Put missing products on shopping list' => 'Put missing products on shopping list',
|
'Put missing products on shopping list' => 'Metti i prodotti mancanti nella lista della spesa',
|
||||||
'Not enough in stock, #1 ingredients missing' => 'Not enough in stock, #1 ingredients missing',
|
'Not enough in stock, #1 ingredients missing' => 'Non abbastanza in magazzino, mancano gli ingredienti # 1',
|
||||||
'Enough in stock' => 'Enough in stock',
|
'Enough in stock' => 'Abbastanza in magazzino',
|
||||||
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Not enough in stock, #1 ingredients missing but already on the shopping list',
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Non abbastanza in magazzino, mancano gli ingredienti # 1 ma sono già nella lista della spesa',
|
||||||
'Expand to fullscreen' => 'Expand to fullscreen',
|
'Expand to fullscreen' => 'Espandi a schermo intero',
|
||||||
'Ingredients' => 'Ingredients',
|
'Ingredients' => 'Ingredienti',
|
||||||
'Preparation' => 'Preparation',
|
'Preparation' => 'Preparation',
|
||||||
'Recipe' => 'Recipe',
|
'Recipe' => 'Recipe',
|
||||||
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Not enough in stock, #1 missing, #2 already on shopping list',
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Not enough in stock, #1 missing, #2 already on shopping list',
|
||||||
@@ -260,7 +259,6 @@ return array(
|
|||||||
'Product picture' => 'Product picture',
|
'Product picture' => 'Product picture',
|
||||||
'No file selected' => 'No file selected',
|
'No file selected' => 'No file selected',
|
||||||
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
'Current picture' => 'Current picture',
|
|
||||||
'Delete' => 'Delete',
|
'Delete' => 'Delete',
|
||||||
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
'Select file' => 'Select file',
|
'Select file' => 'Select file',
|
||||||
@@ -274,7 +272,6 @@ return array(
|
|||||||
'Edit equipment' => 'Edit equipment',
|
'Edit equipment' => 'Edit equipment',
|
||||||
'Create equipment' => 'Create equipment',
|
'Create equipment' => 'Create equipment',
|
||||||
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
'Current instruction manual' => 'Current instruction manual',
|
|
||||||
'No instruction manual available' => 'No instruction manual available',
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
'No picture available' => 'No picture available',
|
'No picture available' => 'No picture available',
|
||||||
@@ -326,5 +323,26 @@ return array(
|
|||||||
'Stock settings' => 'Stock settings',
|
'Stock settings' => 'Stock settings',
|
||||||
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
'Skip' => 'Skip'
|
'Skip' => 'Salta',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
);
|
);
|
||||||
|
6
localization/nl/chore_types.php
Normal file
6
localization/nl/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Handmatig',
|
||||||
|
'dynamic-regular' => 'Dynamic regular'
|
||||||
|
);
|
10
localization/nl/component_translations.php
Normal file
10
localization/nl/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'nl',
|
||||||
|
'timeago_nan' => 'NaN jaar',
|
||||||
|
'moment_locale' => 'nl',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||||
|
'summernote_locale' => 'nl-NL',
|
||||||
|
'fullcalendar_locale' => 'nl'
|
||||||
|
);
|
89
localization/nl/demo_data.php
Normal file
89
localization/nl/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Cookies',
|
||||||
|
'Chocolate' => 'Chocolate',
|
||||||
|
'Pantry' => 'Pantry',
|
||||||
|
'Candy cupboard' => 'Candy cupboard',
|
||||||
|
'Tinned food cupboard' => 'Tinned food cupboard',
|
||||||
|
'Fridge' => 'Fridge',
|
||||||
|
'Piece' => 'Piece',
|
||||||
|
'Pieces' => 'Pieces',
|
||||||
|
'Pack' => 'Pack',
|
||||||
|
'Packs' => 'Packs',
|
||||||
|
'Glass' => 'Glass',
|
||||||
|
'Glasses' => 'Glasses',
|
||||||
|
'Tin' => 'Tin',
|
||||||
|
'Tins' => 'Tins',
|
||||||
|
'Can' => 'Can',
|
||||||
|
'Cans' => 'Cans',
|
||||||
|
'Bunch' => 'Bunch',
|
||||||
|
'Bunches' => 'Bunches',
|
||||||
|
'Gummy bears' => 'Gummy bears',
|
||||||
|
'Crisps' => 'Crisps',
|
||||||
|
'Eggs' => 'Eggs',
|
||||||
|
'Noodles' => 'Noodles',
|
||||||
|
'Pickles' => 'Pickles',
|
||||||
|
'Gulash soup' => 'Gulash soup',
|
||||||
|
'Yogurt' => 'Yogurt',
|
||||||
|
'Cheese' => 'Cheese',
|
||||||
|
'Cold cuts' => 'Cold cuts',
|
||||||
|
'Paprika' => 'Paprika',
|
||||||
|
'Cucumber' => 'Cucumber',
|
||||||
|
'Radish' => 'Radish',
|
||||||
|
'Tomato' => 'Tomato',
|
||||||
|
'Changed towels in the bathroom' => 'Changed towels in the bathroom',
|
||||||
|
'Cleaned the kitchen floor' => 'Cleaned the kitchen floor',
|
||||||
|
'Warranty ends' => 'Warranty ends',
|
||||||
|
'TV remote control' => 'TV remote control',
|
||||||
|
'Alarm clock' => 'Alarm clock',
|
||||||
|
'Heat remote control' => 'Heat remote control',
|
||||||
|
'Lawn mowed in the garden' => 'Lawn mowed in the garden',
|
||||||
|
'Some good snacks' => 'Some good snacks',
|
||||||
|
'Pizza dough' => 'Pizza dough',
|
||||||
|
'Sieved tomatoes' => 'Sieved tomatoes',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Toast',
|
||||||
|
'Minced meat' => 'Minced meat',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
||||||
|
'Sandwiches' => 'Sandwiches',
|
||||||
|
'English' => 'English',
|
||||||
|
'German' => 'German',
|
||||||
|
'Italian' => 'Italian',
|
||||||
|
'Demo in different language' => 'Demo in different language',
|
||||||
|
'This is the note content of the recipe ingredient' => 'This is the note content of the recipe ingredient',
|
||||||
|
'Demo User' => 'Demo User',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Grams',
|
||||||
|
'Flour' => 'Flour',
|
||||||
|
'Pancakes' => 'Pancakes',
|
||||||
|
'Sugar' => 'Sugar',
|
||||||
|
'Home' => 'Home',
|
||||||
|
'Life' => 'Life',
|
||||||
|
'Projects' => 'Projects',
|
||||||
|
'Repair the garage door' => 'Repair the garage door',
|
||||||
|
'Fork and improve grocy' => 'Fork and improve grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Find a solution for what to do when I forget the door keys',
|
||||||
|
'Sweets' => 'Sweets',
|
||||||
|
'Bakery products' => 'Bakery products',
|
||||||
|
'Tinned food' => 'Tinned food',
|
||||||
|
'Butchery products' => 'Butchery products',
|
||||||
|
'Vegetables/Fruits' => 'Vegetables/Fruits',
|
||||||
|
'Refrigerated products' => 'Refrigerated products',
|
||||||
|
'Coffee machine' => 'Coffee machine',
|
||||||
|
'Dishwasher' => 'Dishwasher',
|
||||||
|
'Liter' => 'Liter',
|
||||||
|
'Liters' => 'Liters',
|
||||||
|
'Bottle' => 'Bottle',
|
||||||
|
'Bottles' => 'Bottles',
|
||||||
|
'Milk' => 'Milk',
|
||||||
|
'Chocolate sauce' => 'Chocolate sauce',
|
||||||
|
'Milliliters' => 'Milliliters',
|
||||||
|
'Milliliter' => 'Milliliter',
|
||||||
|
'Bottom' => 'Bottom',
|
||||||
|
'Topping' => 'Topping',
|
||||||
|
'French' => 'French',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
|
);
|
8
localization/nl/stock_transaction_types.php
Normal file
8
localization/nl/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Aankoop',
|
||||||
|
'consume' => 'Consumeren',
|
||||||
|
'inventory-correction' => 'Voorraadcorrectie',
|
||||||
|
'product-opened' => 'Product geopend'
|
||||||
|
);
|
348
localization/nl/strings.php
Normal file
348
localization/nl/strings.php
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Voorraadoverzicht',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 producten vervallen binnen de volgende #2 dagen',
|
||||||
|
'#1 products are already expired' => '#1 producten zijn al verlopen',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 producten zijn onder gedefinieerde min. voorraad aantal',
|
||||||
|
'Product' => 'Product',
|
||||||
|
'Amount' => 'Aantal',
|
||||||
|
'Next best before date' => 'De eerstvolgende houdbaarheidsdatum',
|
||||||
|
'Logout' => 'Uitloggen',
|
||||||
|
'Chores overview' => 'Overzicht klusjes',
|
||||||
|
'Batteries overview' => 'Batterijen overzicht',
|
||||||
|
'Purchase' => 'Aankoop',
|
||||||
|
'Consume' => 'Consumeren',
|
||||||
|
'Inventory' => 'Voorraad',
|
||||||
|
'Shopping list' => 'Boodschappenlijst',
|
||||||
|
'Chore tracking' => 'Klusjes volgen',
|
||||||
|
'Battery tracking' => 'Batterij volgen',
|
||||||
|
'Products' => 'Producten',
|
||||||
|
'Locations' => 'Locaties',
|
||||||
|
'Quantity units' => 'Aantal eenheden',
|
||||||
|
'Chores' => 'Klusjes',
|
||||||
|
'Batteries' => 'Batterijen',
|
||||||
|
'Chore' => 'Klus',
|
||||||
|
'Next estimated tracking' => 'Next estimated tracking',
|
||||||
|
'Last tracked' => 'Laatst gevolgd',
|
||||||
|
'Battery' => 'Batterij',
|
||||||
|
'Last charged' => 'Laatst opgeladen',
|
||||||
|
'Next planned charge cycle' => 'Volgende geplande laadcyclus',
|
||||||
|
'Best before' => 'Houdbaar tot',
|
||||||
|
'OK' => 'OK',
|
||||||
|
'Product overview' => 'Productoverzicht',
|
||||||
|
'Stock quantity unit' => 'Voorraadhoeveelheidseenheid',
|
||||||
|
'Stock amount' => 'Voorraadhoeveelheid',
|
||||||
|
'Last purchased' => 'Laatst gekocht',
|
||||||
|
'Last used' => 'Laatst gebruikt',
|
||||||
|
'Spoiled' => 'Verspild',
|
||||||
|
'Barcode lookup is disabled' => 'Opzoeken op streepjescode is uitgeschakeld',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'will be added to the list of barcodes for the selected product on submit',
|
||||||
|
'New amount' => 'Nieuwe aantal',
|
||||||
|
'Note' => 'Notitie',
|
||||||
|
'Tracked time' => 'Bijgehouden tijd',
|
||||||
|
'Chore overview' => 'Overzicht klus',
|
||||||
|
'Tracked count' => 'Bijgehouden aantal',
|
||||||
|
'Battery overview' => 'Batterijoverzicht',
|
||||||
|
'Charge cycles count' => 'Aantal laadcycli',
|
||||||
|
'Create shopping list item' => 'Maak een item in de boodschappenlijst',
|
||||||
|
'Edit shopping list item' => 'Bewerk item in de boodschappenlijst',
|
||||||
|
'Save' => 'Opslaan',
|
||||||
|
'Add' => 'Toevoegen',
|
||||||
|
'Name' => 'Naam',
|
||||||
|
'Location' => 'Locatie',
|
||||||
|
'Min. stock amount' => 'Min. voorraadhoeveelheid',
|
||||||
|
'QU purchase' => 'QU purchase',
|
||||||
|
'QU stock' => 'QU stock',
|
||||||
|
'QU factor' => 'QU factor',
|
||||||
|
'Description' => 'Omschrijving',
|
||||||
|
'Create product' => 'Maak een product',
|
||||||
|
'Barcode(s)' => 'Barcode(s)',
|
||||||
|
'Minimum stock amount' => 'Minimale voorraadhoeveelheid',
|
||||||
|
'Default best before days' => 'Standaard houdbaarheidsdatum',
|
||||||
|
'Quantity unit purchase' => 'Aankoop aantal eenheden ',
|
||||||
|
'Quantity unit stock' => 'Voorraad aantal eenheden',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Factor purchase to stock quantity unit',
|
||||||
|
'Create location' => 'Maak een locatie',
|
||||||
|
'Create quantity unit' => 'Maak eenheidseenheid',
|
||||||
|
'Period type' => 'Periode type',
|
||||||
|
'Period days' => 'Periode dagen',
|
||||||
|
'Create chore' => 'Create chore',
|
||||||
|
'Used in' => 'Gebruikt in',
|
||||||
|
'Create battery' => 'Maak een batterij',
|
||||||
|
'Edit battery' => 'Edit battery',
|
||||||
|
'Edit chore' => 'Edit chore',
|
||||||
|
'Edit quantity unit' => 'Edit quantity unit',
|
||||||
|
'Edit product' => 'Edit product',
|
||||||
|
'Edit location' => 'Wijzig locatie',
|
||||||
|
'Record data' => 'Record data',
|
||||||
|
'Manage master data' => 'Manage master data',
|
||||||
|
'This will apply to added products' => 'This will apply to added products',
|
||||||
|
'never' => 'never',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Add products that are below defined min. stock amount',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'This means 1 #1 purchased will be converted into #2 #3 in stock',
|
||||||
|
'Login' => 'Login',
|
||||||
|
'Username' => 'Username',
|
||||||
|
'Password' => 'Password',
|
||||||
|
'Invalid credentials, please try again' => 'Invalid credentials, please try again',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Are you sure to delete battery "#1"?',
|
||||||
|
'Yes' => 'Yes',
|
||||||
|
'No' => 'No',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Are you sure to delete chore "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" could not be resolved to a product, how do you want to proceed?',
|
||||||
|
'Create or assign product' => 'Create or assign product',
|
||||||
|
'Cancel' => 'Cancel',
|
||||||
|
'Add as new product' => 'Add as new product',
|
||||||
|
'Add as barcode to existing product' => 'Add as barcode to existing product',
|
||||||
|
'Add as new product and prefill barcode' => 'Add as new product and prefill barcode',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Are you sure to delete quantity unit "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Are you sure to delete product "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Weet u zeker dat u locatie "#1" wilt verwijderen?',
|
||||||
|
'Manage API keys' => 'Manage API keys',
|
||||||
|
'REST API & data model documentation' => 'REST API & data model documentation',
|
||||||
|
'API keys' => 'API keys',
|
||||||
|
'Create new API key' => 'Create new API key',
|
||||||
|
'API key' => 'API key',
|
||||||
|
'Expires' => 'Expires',
|
||||||
|
'Created' => 'Created',
|
||||||
|
'This product is not in stock' => 'This product is not in stock',
|
||||||
|
'This means #1 will be added to stock' => 'This means #1 will be added to stock',
|
||||||
|
'This means #1 will be removed from stock' => 'This means #1 will be removed from stock',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Removed #1 #2 of #3 from stock',
|
||||||
|
'About grocy' => 'About grocy',
|
||||||
|
'Close' => 'Close',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 batteries are due to be charged within the next #2 days',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 batteries are overdue to be charged',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 chores are due to be done within the next #2 days',
|
||||||
|
'#1 chores are overdue to be done' => '#1 chores are overdue to be done',
|
||||||
|
'Released on' => 'Released on',
|
||||||
|
'Consume #3 #1 of #2' => 'Consume #3 #1 of #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Added #1 #2 of #3 to stock',
|
||||||
|
'Stock amount of #1 is now #2 #3' => 'Stock amount of #1 is now #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Tracked execution of chore #1 on #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Tracked charge cycle of battery #1 on #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Consume all #1 which are currently in stock',
|
||||||
|
'All' => 'All',
|
||||||
|
'Track charge cycle of battery #1' => 'Track charge cycle of battery #1',
|
||||||
|
'Track execution of chore #1' => 'Track execution of chore #1',
|
||||||
|
'Filter by location' => 'Filteren op locatie',
|
||||||
|
'Search' => 'Search',
|
||||||
|
'Not logged in' => 'Not logged in',
|
||||||
|
'You have to select a product' => 'You have to select a product',
|
||||||
|
'You have to select a chore' => 'You have to select a chore',
|
||||||
|
'You have to select a battery' => 'You have to select a battery',
|
||||||
|
'A name is required' => 'A name is required',
|
||||||
|
'A location is required' => 'Een locatie is verplicht',
|
||||||
|
'The amount cannot be lower than #1' => 'The amount cannot be lower than #1',
|
||||||
|
'This cannot be negative' => 'Dit kan niet negatief zijn',
|
||||||
|
'A quantity unit is required' => 'A quantity unit is required',
|
||||||
|
'A period type is required' => 'A period type is required',
|
||||||
|
'A best before date is required and must be later than today' => 'A best before date is required and must be later than today',
|
||||||
|
'Settings' => 'Instellingen',
|
||||||
|
'This can only be before now' => 'This can only be before now',
|
||||||
|
'Calendar' => 'Calendar',
|
||||||
|
'Recipes' => 'Recipes',
|
||||||
|
'Edit recipe' => 'Edit recipe',
|
||||||
|
'New recipe' => 'New recipe',
|
||||||
|
'Ingredients list' => 'Ingredients list',
|
||||||
|
'Add recipe ingredient' => 'Add recipe ingredient',
|
||||||
|
'Edit recipe ingredient' => 'Edit recipe ingredient',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Are you sure to delete recipe "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Are you sure to delete recipe ingredient "#1"?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Are you sure to empty the shopping list?',
|
||||||
|
'Clear list' => 'Clear list',
|
||||||
|
'Requirements fulfilled' => 'Requirements fulfilled',
|
||||||
|
'Put missing products on shopping list' => 'Put missing products on shopping list',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Not enough in stock, #1 ingredients missing',
|
||||||
|
'Enough in stock' => 'Enough in stock',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Not enough in stock, #1 ingredients missing but already on the shopping list',
|
||||||
|
'Expand to fullscreen' => 'Expand to fullscreen',
|
||||||
|
'Ingredients' => 'Ingredients',
|
||||||
|
'Preparation' => 'Preparation',
|
||||||
|
'Recipe' => 'Recipe',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Not enough in stock, #1 missing, #2 already on shopping list',
|
||||||
|
'Show notes' => 'Show notes',
|
||||||
|
'Put missing amount on shopping list' => 'Put missing amount on shopping list',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?',
|
||||||
|
'Added for recipe #1' => 'Added for recipe #1',
|
||||||
|
'Manage users' => 'Beheer gebruikers',
|
||||||
|
'User' => 'Gebruiker',
|
||||||
|
'Users' => 'Gebruikers',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Are you sure to delete user "#1"?',
|
||||||
|
'Create user' => 'Create user',
|
||||||
|
'Edit user' => 'Bewerk gebruiker',
|
||||||
|
'First name' => 'Voornaam',
|
||||||
|
'Last name' => 'Achternaam',
|
||||||
|
'A username is required' => 'een gebruikersnaam is verplicht',
|
||||||
|
'Confirm password' => 'Bevestig wachtwoord',
|
||||||
|
'Passwords do not match' => 'Wachtwoorden komen niet overeen',
|
||||||
|
'Change password' => 'Wachtwoord wijzigen',
|
||||||
|
'Done by' => 'Gedaan door',
|
||||||
|
'Last done by' => 'Laatst gedaan door',
|
||||||
|
'Unknown' => 'Onbekend',
|
||||||
|
'Filter by chore' => 'Filter op klus',
|
||||||
|
'Chores journal' => 'Klusjesjournaal',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 betekent dat suggesties voor de volgende laadcyclus zijn uitgeschakeld',
|
||||||
|
'Charge cycle interval (days)' => 'Laadcyclusinterval (dagen)',
|
||||||
|
'Last price' => 'Laatste prijs',
|
||||||
|
'Price history' => 'Prijs geschiedenis',
|
||||||
|
'No price history available' => 'Geen prijsgeschiedenis beschikbaar',
|
||||||
|
'Price' => 'Price',
|
||||||
|
'in #1 per purchase quantity unit' => 'in #1 per purchase quantity unit',
|
||||||
|
'The price cannot be lower than #1' => 'The price cannot be lower than #1',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 product expires within the next #2 days',
|
||||||
|
'#1 product is already expired' => '#1 product is already expired',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 product is below defined min. stock amount',
|
||||||
|
'Unit' => 'Unit',
|
||||||
|
'Units' => 'Units',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 chore is due to be done within the next #2 days',
|
||||||
|
'#1 chore is overdue to be done' => '#1 chore is overdue to be done',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 battery is due to be charged within the next #2 days',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 battery is overdue to be charged',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unit was automatically added and will apply in addition to the amount entered here',
|
||||||
|
'in singular form' => 'in singular form',
|
||||||
|
'in plural form' => 'in plural form',
|
||||||
|
'Never expires' => 'Never expires',
|
||||||
|
'This cannot be lower than #1' => 'This cannot be lower than #1',
|
||||||
|
'-1 means that this product never expires' => '-1 means that this product never expires',
|
||||||
|
'Quantity unit' => 'Quantity unit',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Only check if a single unit is in stock (a different quantity can then be used above)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => 'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Removed all ingredients of recipe "#1" from stock',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Consume all ingredients needed by this recipe',
|
||||||
|
'Click to show technical details' => 'Click to show technical details',
|
||||||
|
'Error while saving, probably this item already exists' => 'Error while saving, probably this item already exists',
|
||||||
|
'Error details' => 'Error details',
|
||||||
|
'Tasks' => 'Tasks',
|
||||||
|
'Show done tasks' => 'Show done tasks',
|
||||||
|
'Task' => 'Task',
|
||||||
|
'Due' => 'Due',
|
||||||
|
'Assigned to' => 'Assigned to',
|
||||||
|
'Mark task "#1" as completed' => 'Mark task "#1" as completed',
|
||||||
|
'Uncategorized' => 'Uncategorized',
|
||||||
|
'Task categories' => 'Task categories',
|
||||||
|
'Create task' => 'Create task',
|
||||||
|
'A due date is required' => 'A due date is required',
|
||||||
|
'Category' => 'Category',
|
||||||
|
'Edit task' => 'Edit task',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Are you sure to delete task "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 task is due to be done within the next #2 days',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 tasks are due to be done within the next #2 days',
|
||||||
|
'#1 task is overdue to be done' => '#1 task is overdue to be done',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 tasks are overdue to be done',
|
||||||
|
'Edit task category' => 'Edit task category',
|
||||||
|
'Create task category' => 'Create task category',
|
||||||
|
'Product groups' => 'Product groups',
|
||||||
|
'Ungrouped' => 'Ungrouped',
|
||||||
|
'Create product group' => 'Create product group',
|
||||||
|
'Edit product group' => 'Edit product group',
|
||||||
|
'Product group' => 'Product group',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Stay logged in permanently',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'When not set, you will get logged out at latest after 30 days',
|
||||||
|
'Filter by status' => 'Filter by status',
|
||||||
|
'Below min. stock amount' => 'Below min. stock amount',
|
||||||
|
'Expiring soon' => 'Expiring soon',
|
||||||
|
'Already expired' => 'Already expired',
|
||||||
|
'Due soon' => 'Due soon',
|
||||||
|
'Overdue' => 'Overdue',
|
||||||
|
'View settings' => 'View settings',
|
||||||
|
'Auto reload on external changes' => 'Auto reload on external changes',
|
||||||
|
'Enable night mode' => 'Enable night mode',
|
||||||
|
'Auto enable in time range' => 'Auto enable in time range',
|
||||||
|
'From' => 'From',
|
||||||
|
'in format' => 'in format',
|
||||||
|
'To' => 'To',
|
||||||
|
'Time range goes over midnight' => 'Time range goes over midnight',
|
||||||
|
'Product picture' => 'Product picture',
|
||||||
|
'No file selected' => 'No file selected',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
|
'Delete' => 'Delete',
|
||||||
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
|
'Select file' => 'Select file',
|
||||||
|
'Image of product #1' => 'Image of product #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'This product cannot be deleted because it is in stock, please remove the stock amount first.',
|
||||||
|
'Delete not possible' => 'Delete not possible',
|
||||||
|
'Equipment' => 'Equipment',
|
||||||
|
'Instruction manual' => 'Instruction manual',
|
||||||
|
'The selected equipment has no instruction manual' => 'The selected equipment has no instruction manual',
|
||||||
|
'Notes' => 'Notes',
|
||||||
|
'Edit equipment' => 'Edit equipment',
|
||||||
|
'Create equipment' => 'Create equipment',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
|
'No picture available' => 'No picture available',
|
||||||
|
'Filter by product group' => 'Filter by product group',
|
||||||
|
'Presets for new products' => 'Presets for new products',
|
||||||
|
'Included recipes' => 'Included recipes',
|
||||||
|
'A recipe is required' => 'A recipe is required',
|
||||||
|
'Add included recipe' => 'Add included recipe',
|
||||||
|
'Edit included recipe' => 'Edit included recipe',
|
||||||
|
'Group' => 'Groep',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'This will be used as a headline to group ingredients together',
|
||||||
|
'Journal' => 'Journal',
|
||||||
|
'Stock journal' => 'Stock journal',
|
||||||
|
'Filter by product' => 'Filter by product',
|
||||||
|
'Booking time' => 'Booking time',
|
||||||
|
'Booking type' => 'Booking type',
|
||||||
|
'Undo booking' => 'Undo booking',
|
||||||
|
'Undone on' => 'Undone on',
|
||||||
|
'Batteries journal' => 'Batteries journal',
|
||||||
|
'Filter by battery' => 'Filter by battery',
|
||||||
|
'Undo charge cycle' => 'Undo charge cycle',
|
||||||
|
'Undo chore execution' => 'Undo chore execution',
|
||||||
|
'Chore execution successfully undone' => 'Chore execution successfully undone',
|
||||||
|
'Undo' => 'Undo',
|
||||||
|
'Booking successfully undone' => 'Booking successfully undone',
|
||||||
|
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||||
|
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||||
|
'Add all list items to stock' => 'Add all list items to stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||||
|
'Use a specific stock item' => 'Use a specific stock item',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||||
|
'Default best before days after opened' => 'Default best before days after opened',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||||
|
'Mark as opened' => 'Mark as opened',
|
||||||
|
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||||
|
'Not opened' => 'Not opened',
|
||||||
|
'Opened' => 'Geopend',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'#1 opened' => '#1 opened',
|
||||||
|
'Product expires' => 'Product expires',
|
||||||
|
'Task due' => 'Task due',
|
||||||
|
'Chore due' => 'Chore due',
|
||||||
|
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||||
|
'Show clock in header' => 'Toon klok in koptekst',
|
||||||
|
'Stock settings' => 'Voorraadinstellingen',
|
||||||
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
|
'Skip' => 'Overslaan',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
|
);
|
@@ -83,5 +83,7 @@ return array(
|
|||||||
'Milliliter' => 'Milliliter',
|
'Milliliter' => 'Milliliter',
|
||||||
'Bottom' => 'Bunn',
|
'Bottom' => 'Bunn',
|
||||||
'Topping' => 'Topping',
|
'Topping' => 'Topping',
|
||||||
'French' => 'Fransk'
|
'French' => 'Fransk',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
);
|
);
|
||||||
|
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
return array(
|
return array(
|
||||||
'Stock overview' => 'Husholdning',
|
'Stock overview' => 'Husholdning',
|
||||||
'#1 products expiring within the next #2 days' => '#1 Produkt som går ut på dato innen de neste #2 dagene',
|
'#1 products expiring within the next #2 days' => '#1 produkt går ut på dato innen de neste #2 dagene',
|
||||||
'#1 products are already expired' => '#1 Produkt som har gått ut på dato',
|
'#1 products are already expired' => '#1 produkt har gått ut på dato',
|
||||||
'#1 products are below defined min. stock amount' => '#1 Produkt under minimum husholdningsnivå',
|
'#1 products are below defined min. stock amount' => '#1 produkt under minimum husholdningsnivå',
|
||||||
'Product' => 'Produkt',
|
'Product' => 'Produkt',
|
||||||
'Amount' => 'Antall',
|
'Amount' => 'Antall',
|
||||||
'Next best before date' => 'Kommende best før dato',
|
'Next best before date' => 'Kommende best før dato',
|
||||||
@@ -47,7 +47,6 @@ return array(
|
|||||||
'Charge cycles count' => 'Antall ladesykluser',
|
'Charge cycles count' => 'Antall ladesykluser',
|
||||||
'Create shopping list item' => 'Opprett handelisteoppføring',
|
'Create shopping list item' => 'Opprett handelisteoppføring',
|
||||||
'Edit shopping list item' => 'Endre på handlelistoppføring',
|
'Edit shopping list item' => 'Endre på handlelistoppføring',
|
||||||
'#1 units were automatically added and will apply in addition to the amount entered here' => '#1 enheter ble automatisk lagt til i tillegg til hva som blir skrevet inn her',
|
|
||||||
'Save' => 'Lagre',
|
'Save' => 'Lagre',
|
||||||
'Add' => 'Legg til',
|
'Add' => 'Legg til',
|
||||||
'Name' => 'Navn',
|
'Name' => 'Navn',
|
||||||
@@ -193,9 +192,9 @@ return array(
|
|||||||
'Price' => 'Pris',
|
'Price' => 'Pris',
|
||||||
'in #1 per purchase quantity unit' => 'I #1 per kjøpt forpakning ',
|
'in #1 per purchase quantity unit' => 'I #1 per kjøpt forpakning ',
|
||||||
'The price cannot be lower than #1' => 'Prisen kan ikke være lavere enn #1',
|
'The price cannot be lower than #1' => 'Prisen kan ikke være lavere enn #1',
|
||||||
'#1 product expires within the next #2 days' => '#1 Produkt går ut på dato innen de #2 neste dagene',
|
'#1 product expires within the next #2 days' => '#1 produkt går ut på dato innen de #2 neste dagene',
|
||||||
'#1 product is already expired' => '#1 Produkt er allerede gått ut på dato',
|
'#1 product is already expired' => '#1 produkt er allerede gått ut på dato',
|
||||||
'#1 product is below defined min. stock amount' => '#1 Produkt er under minimums husholdningsnivå',
|
'#1 product is below defined min. stock amount' => '#1 produkt er under minimums husholdningsnivå',
|
||||||
'Unit' => 'Enhet',
|
'Unit' => 'Enhet',
|
||||||
'Units' => 'Enheter',
|
'Units' => 'Enheter',
|
||||||
'#1 chore is due to be done within the next #2 days' => '#1 husarbeid oppgave skal gjøres inne de #2 neste dagene',
|
'#1 chore is due to be done within the next #2 days' => '#1 husarbeid oppgave skal gjøres inne de #2 neste dagene',
|
||||||
@@ -260,7 +259,6 @@ return array(
|
|||||||
'Product picture' => 'Produktbilde',
|
'Product picture' => 'Produktbilde',
|
||||||
'No file selected' => 'Produktbilde ikke valgt',
|
'No file selected' => 'Produktbilde ikke valgt',
|
||||||
'If you don\'t select a file, the current picture will not be altered' => 'Hvis du ikke velger et bilde, vil nåværende produktbilde bli værende',
|
'If you don\'t select a file, the current picture will not be altered' => 'Hvis du ikke velger et bilde, vil nåværende produktbilde bli værende',
|
||||||
'Current picture' => 'Nåværende produktbilde',
|
|
||||||
'Delete' => 'Slett',
|
'Delete' => 'Slett',
|
||||||
'The current picture will be deleted when you save the product' => 'Nåværende produktbilde vil bli slettet når du lagrer produktet',
|
'The current picture will be deleted when you save the product' => 'Nåværende produktbilde vil bli slettet når du lagrer produktet',
|
||||||
'Select file' => 'Velg produktbilde',
|
'Select file' => 'Velg produktbilde',
|
||||||
@@ -274,7 +272,6 @@ return array(
|
|||||||
'Edit equipment' => 'Endre instruksjonmanualer for utstyr',
|
'Edit equipment' => 'Endre instruksjonmanualer for utstyr',
|
||||||
'Create equipment' => 'Opprett instruksjonmanualer for utstyr',
|
'Create equipment' => 'Opprett instruksjonmanualer for utstyr',
|
||||||
'If you don\'t select a file, the current instruction manual will not be altered' => 'Hvis du ikke velger en instruksjonsmanual, vil nåværende instruksjonsmanual ikke bli endret',
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Hvis du ikke velger en instruksjonsmanual, vil nåværende instruksjonsmanual ikke bli endret',
|
||||||
'Current instruction manual' => 'Nåværende instruksjonsmanual',
|
|
||||||
'No instruction manual available' => 'Ingen instruksjonsmanual tilgjengelig',
|
'No instruction manual available' => 'Ingen instruksjonsmanual tilgjengelig',
|
||||||
'The current instruction manual will be deleted when you save the equipment' => 'Nåværende instruksjonsmanual vil bli slettet når du lagrer utstyret',
|
'The current instruction manual will be deleted when you save the equipment' => 'Nåværende instruksjonsmanual vil bli slettet når du lagrer utstyret',
|
||||||
'No picture available' => 'Ingen bilde tilgjengelig',
|
'No picture available' => 'Ingen bilde tilgjengelig',
|
||||||
@@ -326,5 +323,27 @@ return array(
|
|||||||
'Stock settings' => 'Husholdningsinnstillinger',
|
'Stock settings' => 'Husholdningsinnstillinger',
|
||||||
'Shopping list to stock workflow' => 'Arbeidsflyt fra handleliste til husholding',
|
'Shopping list to stock workflow' => 'Arbeidsflyt fra handleliste til husholding',
|
||||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Legg produkter automatisk til fra handlelisten. Dette vil bruke sist innkjøpspris og forutsetter at "Standard for antall dager best før" er satt',
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Legg produkter automatisk til fra handlelisten. Dette vil bruke sist innkjøpspris og forutsetter at "Standard for antall dager best før" er satt',
|
||||||
'Skip' => 'Hopp'
|
'Skip' => 'Hopp over',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||||
);
|
);
|
||||||
|
6
localization/pl/chore_types.php
Normal file
6
localization/pl/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Manually',
|
||||||
|
'dynamic-regular' => 'Dynamic regular'
|
||||||
|
);
|
10
localization/pl/component_translations.php
Normal file
10
localization/pl/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'en',
|
||||||
|
'timeago_nan' => 'NaN years ago',
|
||||||
|
'moment_locale' => 'x',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||||
|
'summernote_locale' => 'x',
|
||||||
|
'fullcalendar_locale' => 'x'
|
||||||
|
);
|
89
localization/pl/demo_data.php
Normal file
89
localization/pl/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Ciastka',
|
||||||
|
'Chocolate' => 'Czekolada',
|
||||||
|
'Pantry' => 'Pantry',
|
||||||
|
'Candy cupboard' => 'Candy cupboard',
|
||||||
|
'Tinned food cupboard' => 'Tinned food cupboard',
|
||||||
|
'Fridge' => 'Lodówka',
|
||||||
|
'Piece' => 'Piece',
|
||||||
|
'Pieces' => 'Pieces',
|
||||||
|
'Pack' => 'Pack',
|
||||||
|
'Packs' => 'Packs',
|
||||||
|
'Glass' => 'Szklanka',
|
||||||
|
'Glasses' => 'Szklanki',
|
||||||
|
'Tin' => 'Tin',
|
||||||
|
'Tins' => 'Tins',
|
||||||
|
'Can' => 'Can',
|
||||||
|
'Cans' => 'Cans',
|
||||||
|
'Bunch' => 'Bunch',
|
||||||
|
'Bunches' => 'Bunches',
|
||||||
|
'Gummy bears' => 'Gummy bears',
|
||||||
|
'Crisps' => 'Crisps',
|
||||||
|
'Eggs' => 'Eggs',
|
||||||
|
'Noodles' => 'Noodles',
|
||||||
|
'Pickles' => 'Pickles',
|
||||||
|
'Gulash soup' => 'Gulash soup',
|
||||||
|
'Yogurt' => 'Yogurt',
|
||||||
|
'Cheese' => 'Cheese',
|
||||||
|
'Cold cuts' => 'Cold cuts',
|
||||||
|
'Paprika' => 'Paprika',
|
||||||
|
'Cucumber' => 'Cucumber',
|
||||||
|
'Radish' => 'Radish',
|
||||||
|
'Tomato' => 'Tomato',
|
||||||
|
'Changed towels in the bathroom' => 'Changed towels in the bathroom',
|
||||||
|
'Cleaned the kitchen floor' => 'Cleaned the kitchen floor',
|
||||||
|
'Warranty ends' => 'Warranty ends',
|
||||||
|
'TV remote control' => 'TV remote control',
|
||||||
|
'Alarm clock' => 'Alarm clock',
|
||||||
|
'Heat remote control' => 'Heat remote control',
|
||||||
|
'Lawn mowed in the garden' => 'Lawn mowed in the garden',
|
||||||
|
'Some good snacks' => 'Some good snacks',
|
||||||
|
'Pizza dough' => 'Pizza dough',
|
||||||
|
'Sieved tomatoes' => 'Sieved tomatoes',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Toast',
|
||||||
|
'Minced meat' => 'Minced meat',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
||||||
|
'Sandwiches' => 'Sandwiches',
|
||||||
|
'English' => 'English',
|
||||||
|
'German' => 'German',
|
||||||
|
'Italian' => 'Italian',
|
||||||
|
'Demo in different language' => 'Demo in different language',
|
||||||
|
'This is the note content of the recipe ingredient' => 'This is the note content of the recipe ingredient',
|
||||||
|
'Demo User' => 'Demo User',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Grams',
|
||||||
|
'Flour' => 'Flour',
|
||||||
|
'Pancakes' => 'Pancakes',
|
||||||
|
'Sugar' => 'Sugar',
|
||||||
|
'Home' => 'Home',
|
||||||
|
'Life' => 'Life',
|
||||||
|
'Projects' => 'Projects',
|
||||||
|
'Repair the garage door' => 'Repair the garage door',
|
||||||
|
'Fork and improve grocy' => 'Fork and improve grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Find a solution for what to do when I forget the door keys',
|
||||||
|
'Sweets' => 'Sweets',
|
||||||
|
'Bakery products' => 'Bakery products',
|
||||||
|
'Tinned food' => 'Tinned food',
|
||||||
|
'Butchery products' => 'Butchery products',
|
||||||
|
'Vegetables/Fruits' => 'Vegetables/Fruits',
|
||||||
|
'Refrigerated products' => 'Refrigerated products',
|
||||||
|
'Coffee machine' => 'Coffee machine',
|
||||||
|
'Dishwasher' => 'Dishwasher',
|
||||||
|
'Liter' => 'Liter',
|
||||||
|
'Liters' => 'Liters',
|
||||||
|
'Bottle' => 'Bottle',
|
||||||
|
'Bottles' => 'Bottles',
|
||||||
|
'Milk' => 'Milk',
|
||||||
|
'Chocolate sauce' => 'Chocolate sauce',
|
||||||
|
'Milliliters' => 'Milliliters',
|
||||||
|
'Milliliter' => 'Milliliter',
|
||||||
|
'Bottom' => 'Bottom',
|
||||||
|
'Topping' => 'Topping',
|
||||||
|
'French' => 'French',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
|
);
|
8
localization/pl/stock_transaction_types.php
Normal file
8
localization/pl/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Zakup',
|
||||||
|
'consume' => 'Konsumpcja',
|
||||||
|
'inventory-correction' => 'Korekta zapasów',
|
||||||
|
'product-opened' => 'Produkt otwarty'
|
||||||
|
);
|
348
localization/pl/strings.php
Normal file
348
localization/pl/strings.php
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Przegląd magazynu',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 produktów będzie przeterminowanych w ciągu #2 dni',
|
||||||
|
'#1 products are already expired' => '#1 przeterminowanych produktów',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 produktów są poniżej zdefiniowanej minimalnej ilości w magazynie',
|
||||||
|
'Product' => 'Produkt',
|
||||||
|
'Amount' => 'Ilość',
|
||||||
|
'Next best before date' => 'Następna data przydatności do spożycia ',
|
||||||
|
'Logout' => 'Wyloguj',
|
||||||
|
'Chores overview' => 'Przegląd obowiązków domowych',
|
||||||
|
'Batteries overview' => 'Przegląd baterii',
|
||||||
|
'Purchase' => 'Zakup',
|
||||||
|
'Consume' => 'Skonsumuj',
|
||||||
|
'Inventory' => 'Spis produktów',
|
||||||
|
'Shopping list' => 'Lista zakupów',
|
||||||
|
'Chore tracking' => 'Śledzenie stanu obowiązków domowych',
|
||||||
|
'Battery tracking' => 'Śledzenie stanu baterii',
|
||||||
|
'Products' => 'Produkty',
|
||||||
|
'Locations' => 'Miejsca',
|
||||||
|
'Quantity units' => 'Jednostki ilości',
|
||||||
|
'Chores' => 'Obowiązki domowe',
|
||||||
|
'Batteries' => 'Baterie',
|
||||||
|
'Chore' => 'Obowiązek domowy',
|
||||||
|
'Next estimated tracking' => 'Następne oszacowane śledzenie',
|
||||||
|
'Last tracked' => 'Ostatnio śledzono',
|
||||||
|
'Battery' => 'Bateria',
|
||||||
|
'Last charged' => 'Ostatnio ładowane',
|
||||||
|
'Next planned charge cycle' => 'Następny planowany cykl ładowania',
|
||||||
|
'Best before' => 'Najlepiej spożyć przed',
|
||||||
|
'OK' => 'OK',
|
||||||
|
'Product overview' => 'Przegląd produktów',
|
||||||
|
'Stock quantity unit' => 'Jednostka ilości w magazynie',
|
||||||
|
'Stock amount' => 'Ilość w magazynie',
|
||||||
|
'Last purchased' => 'Ostatnio kupione',
|
||||||
|
'Last used' => 'Ostatnio użyte',
|
||||||
|
'Spoiled' => 'Zepsute',
|
||||||
|
'Barcode lookup is disabled' => 'Czytnik kodów kreskowych jest wyłączony',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'po przesłaniu zostanie dodany do listy kodów kreskowych dla podanego produktu',
|
||||||
|
'New amount' => 'Nowa ilość',
|
||||||
|
'Note' => 'Notatka',
|
||||||
|
'Tracked time' => 'Śledzony czas',
|
||||||
|
'Chore overview' => 'Przegląd obowiązków domowych',
|
||||||
|
'Tracked count' => 'Śledzona ilość',
|
||||||
|
'Battery overview' => 'Przegląd baterii',
|
||||||
|
'Charge cycles count' => 'Ilość cykli ładowania',
|
||||||
|
'Create shopping list item' => 'Utwórz przedmiot na liście zakupów',
|
||||||
|
'Edit shopping list item' => 'Edytuj przedmiot na liście zakupów',
|
||||||
|
'Save' => 'Zapisz',
|
||||||
|
'Add' => 'Dodaj',
|
||||||
|
'Name' => 'Nazwa',
|
||||||
|
'Location' => 'Miejsce',
|
||||||
|
'Min. stock amount' => 'Minimalna ilość',
|
||||||
|
'QU purchase' => 'QU purchase',
|
||||||
|
'QU stock' => 'QU stock',
|
||||||
|
'QU factor' => 'QU factor',
|
||||||
|
'Description' => 'Opis',
|
||||||
|
'Create product' => 'Utwórz produkt',
|
||||||
|
'Barcode(s)' => 'Kod(y) kreskowe',
|
||||||
|
'Minimum stock amount' => 'Minimalna ilość',
|
||||||
|
'Default best before days' => 'Domyślna ilość dni przydatności do spożycia ',
|
||||||
|
'Quantity unit purchase' => 'Quantity unit purchase',
|
||||||
|
'Quantity unit stock' => 'Quantity unit stock',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Factor purchase to stock quantity unit',
|
||||||
|
'Create location' => 'Utwórz miejsce',
|
||||||
|
'Create quantity unit' => 'Utwórz jednostkę miary',
|
||||||
|
'Period type' => 'Typ okresu',
|
||||||
|
'Period days' => 'Dni okresu',
|
||||||
|
'Create chore' => 'Utwórz obowiązek domowy',
|
||||||
|
'Used in' => 'Użyte w',
|
||||||
|
'Create battery' => 'Utwórz baterię',
|
||||||
|
'Edit battery' => 'Edytuj baterię',
|
||||||
|
'Edit chore' => 'Edytuj obowiązek domowy',
|
||||||
|
'Edit quantity unit' => 'Edit quantity unit',
|
||||||
|
'Edit product' => 'Edytuj produkt',
|
||||||
|
'Edit location' => 'Edytuj lokalizację',
|
||||||
|
'Record data' => 'Record data',
|
||||||
|
'Manage master data' => 'Manage master data',
|
||||||
|
'This will apply to added products' => 'This will apply to added products',
|
||||||
|
'never' => 'nigdy',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Dodaj produkty poniżej zdefiniowanej minimalnej ilości w magazynie',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'This means 1 #1 purchased will be converted into #2 #3 in stock',
|
||||||
|
'Login' => 'Zaloguj',
|
||||||
|
'Username' => 'Nazwa użytkownika',
|
||||||
|
'Password' => 'Hasło',
|
||||||
|
'Invalid credentials, please try again' => 'Nieprawidłowe dane logowania, spróbuj jeszcze raz',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Czy na pewno chcesz usunąć baterię "#1"?',
|
||||||
|
'Yes' => 'Tak',
|
||||||
|
'No' => 'Nie',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Czy na pewno chcesz usunąć obowiązek domowy "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" could not be resolved to a product, how do you want to proceed?',
|
||||||
|
'Create or assign product' => 'Utwórz lub przydziel produkt',
|
||||||
|
'Cancel' => 'Anuluj',
|
||||||
|
'Add as new product' => 'Dodaj jako nowy produkt',
|
||||||
|
'Add as barcode to existing product' => 'Dodaj jako kod kreskowy do istniejącego produktu',
|
||||||
|
'Add as new product and prefill barcode' => 'Dodaj jako nowy produkt i dodaj kod kreskowy',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Are you sure to delete quantity unit "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Are you sure to delete product "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Are you sure to delete location "#1"?',
|
||||||
|
'Manage API keys' => 'Zarządzaj kluczami API',
|
||||||
|
'REST API & data model documentation' => 'REST API & dokumentacja modelu danych',
|
||||||
|
'API keys' => 'Klucze API',
|
||||||
|
'Create new API key' => 'Utwórz nowy klucz API',
|
||||||
|
'API key' => 'Klucz API',
|
||||||
|
'Expires' => 'Traci ważność',
|
||||||
|
'Created' => 'Utworzono',
|
||||||
|
'This product is not in stock' => 'Nie ma tego produktu na stanie',
|
||||||
|
'This means #1 will be added to stock' => ' To znaczy że #1 zostanie dodany do magazynu',
|
||||||
|
'This means #1 will be removed from stock' => 'To znaczy że #1 zostanie usunięty z magazynu',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Removed #1 #2 of #3 from stock',
|
||||||
|
'About grocy' => 'O grocy',
|
||||||
|
'Close' => 'Zamknij',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 batteries are due to be charged within the next #2 days',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 batteries are overdue to be charged',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 chores are due to be done within the next #2 days',
|
||||||
|
'#1 chores are overdue to be done' => '#1 chores are overdue to be done',
|
||||||
|
'Released on' => 'Released on',
|
||||||
|
'Consume #3 #1 of #2' => 'Consume #3 #1 of #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Added #1 #2 of #3 to stock',
|
||||||
|
'Stock amount of #1 is now #2 #3' => 'Stock amount of #1 is now #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Tracked execution of chore #1 on #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Tracked charge cycle of battery #1 on #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Consume all #1 which are currently in stock',
|
||||||
|
'All' => 'Wszystko',
|
||||||
|
'Track charge cycle of battery #1' => 'Track charge cycle of battery #1',
|
||||||
|
'Track execution of chore #1' => 'Track execution of chore #1',
|
||||||
|
'Filter by location' => 'Filter by location',
|
||||||
|
'Search' => 'Szukaj',
|
||||||
|
'Not logged in' => 'Not logged in',
|
||||||
|
'You have to select a product' => 'Musisz wybrać produkt',
|
||||||
|
'You have to select a chore' => 'Musisz wybrać obowiązek domowy',
|
||||||
|
'You have to select a battery' => 'Musisz wybrać baterię',
|
||||||
|
'A name is required' => 'Nazwa jest wymagana',
|
||||||
|
'A location is required' => 'Lokalizacja jest wymagana',
|
||||||
|
'The amount cannot be lower than #1' => 'Wartość nie może być mniejsza niż #1',
|
||||||
|
'This cannot be negative' => 'This cannot be negative',
|
||||||
|
'A quantity unit is required' => 'A quantity unit is required',
|
||||||
|
'A period type is required' => 'A period type is required',
|
||||||
|
'A best before date is required and must be later than today' => 'A best before date is required and must be later than today',
|
||||||
|
'Settings' => 'Ustawienia',
|
||||||
|
'This can only be before now' => 'This can only be before now',
|
||||||
|
'Calendar' => 'Kalendarz',
|
||||||
|
'Recipes' => 'Przepisy',
|
||||||
|
'Edit recipe' => 'Edytuj przepis',
|
||||||
|
'New recipe' => 'Nowy przepis',
|
||||||
|
'Ingredients list' => 'Lista składników',
|
||||||
|
'Add recipe ingredient' => 'Dodaj składnik przepisu',
|
||||||
|
'Edit recipe ingredient' => 'Edytuj składnik przepisu',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Czy na pewno chcesz usunąć przepis "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Czy na pewno chcesz usunąć składnik przepisu "#1"?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Czy na pewno chcesz wyczyścić listę zakupów?',
|
||||||
|
'Clear list' => 'Wyczyść listę',
|
||||||
|
'Requirements fulfilled' => 'Requirements fulfilled',
|
||||||
|
'Put missing products on shopping list' => 'Put missing products on shopping list',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Not enough in stock, #1 ingredients missing',
|
||||||
|
'Enough in stock' => 'Enough in stock',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Not enough in stock, #1 ingredients missing but already on the shopping list',
|
||||||
|
'Expand to fullscreen' => 'Pokaż w pełnym ekranie',
|
||||||
|
'Ingredients' => 'Składniki',
|
||||||
|
'Preparation' => 'Przygotowanie',
|
||||||
|
'Recipe' => 'Przepis',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Not enough in stock, #1 missing, #2 already on shopping list',
|
||||||
|
'Show notes' => 'Pokaż notatki',
|
||||||
|
'Put missing amount on shopping list' => 'Put missing amount on shopping list',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?',
|
||||||
|
'Added for recipe #1' => 'Dodano do przepisu #1',
|
||||||
|
'Manage users' => 'Zarządzaj użytkownikami',
|
||||||
|
'User' => 'Użytkownik',
|
||||||
|
'Users' => 'Użytkownicy',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Czy na pewno chcesz usunąć użytkownika "#1"?',
|
||||||
|
'Create user' => 'Utwórz użytkownika',
|
||||||
|
'Edit user' => 'Edytuj użytkownika',
|
||||||
|
'First name' => 'Imię',
|
||||||
|
'Last name' => 'Nazwisko',
|
||||||
|
'A username is required' => 'Nazwa użytkownika jest wymagana',
|
||||||
|
'Confirm password' => 'Potwierdź hasło',
|
||||||
|
'Passwords do not match' => 'Hasła nie są identyczne',
|
||||||
|
'Change password' => 'Zmień hasło',
|
||||||
|
'Done by' => 'Ukończony przez',
|
||||||
|
'Last done by' => 'Ostatnio ukończony przez',
|
||||||
|
'Unknown' => 'Nieznany',
|
||||||
|
'Filter by chore' => 'Filtruj po pracach domowych',
|
||||||
|
'Chores journal' => 'Pamiętnik prac domowych',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 means suggestions for the next charge cycle are disabled',
|
||||||
|
'Charge cycle interval (days)' => 'Charge cycle interval (days)',
|
||||||
|
'Last price' => 'Ostatnia cena',
|
||||||
|
'Price history' => 'Historia cen',
|
||||||
|
'No price history available' => 'Historia cen jest niedostępna',
|
||||||
|
'Price' => 'Cena',
|
||||||
|
'in #1 per purchase quantity unit' => 'in #1 per purchase quantity unit',
|
||||||
|
'The price cannot be lower than #1' => 'The price cannot be lower than #1',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 product expires within the next #2 days',
|
||||||
|
'#1 product is already expired' => '#1 product is already expired',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 product is below defined min. stock amount',
|
||||||
|
'Unit' => 'Jednostka',
|
||||||
|
'Units' => 'Jednostki',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 chore is due to be done within the next #2 days',
|
||||||
|
'#1 chore is overdue to be done' => '#1 chore is overdue to be done',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 battery is due to be charged within the next #2 days',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 battery is overdue to be charged',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unit was automatically added and will apply in addition to the amount entered here',
|
||||||
|
'in singular form' => 'in singular form',
|
||||||
|
'in plural form' => 'in plural form',
|
||||||
|
'Never expires' => 'Never expires',
|
||||||
|
'This cannot be lower than #1' => 'This cannot be lower than #1',
|
||||||
|
'-1 means that this product never expires' => '-1 means that this product never expires',
|
||||||
|
'Quantity unit' => 'Quantity unit',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Only check if a single unit is in stock (a different quantity can then be used above)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => 'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Removed all ingredients of recipe "#1" from stock',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Consume all ingredients needed by this recipe',
|
||||||
|
'Click to show technical details' => 'Naciśnij, aby poznać techniczne szczegóły',
|
||||||
|
'Error while saving, probably this item already exists' => 'Error while saving, probably this item already exists',
|
||||||
|
'Error details' => 'Szczegóły błędu',
|
||||||
|
'Tasks' => 'Zadania',
|
||||||
|
'Show done tasks' => 'Pokaż ukończone zadania',
|
||||||
|
'Task' => 'Zadanie',
|
||||||
|
'Due' => 'Należy',
|
||||||
|
'Assigned to' => 'Przypisany do',
|
||||||
|
'Mark task "#1" as completed' => 'Mark task "#1" as completed',
|
||||||
|
'Uncategorized' => 'Bez kategorii',
|
||||||
|
'Task categories' => 'Kategorie zadań',
|
||||||
|
'Create task' => 'Utwórz zadanie',
|
||||||
|
'A due date is required' => 'A due date is required',
|
||||||
|
'Category' => 'Kategoria',
|
||||||
|
'Edit task' => 'Edytuj zadanie',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Czy jesteś pewien, że chcesz usunąć zadanie "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 task is due to be done within the next #2 days',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 tasks are due to be done within the next #2 days',
|
||||||
|
'#1 task is overdue to be done' => '#1 task is overdue to be done',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 tasks are overdue to be done',
|
||||||
|
'Edit task category' => 'Edytuj kategorię zadania',
|
||||||
|
'Create task category' => 'Utwórz kategorię zadania',
|
||||||
|
'Product groups' => 'Grupy produktów',
|
||||||
|
'Ungrouped' => 'Bez grupy',
|
||||||
|
'Create product group' => 'Utwórz grupę produktów',
|
||||||
|
'Edit product group' => 'Edytuj grupę produktów',
|
||||||
|
'Product group' => 'Grupa produktów',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Pozostań zalogowany na zawsze',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'When not set, you will get logged out at latest after 30 days',
|
||||||
|
'Filter by status' => 'Filtruj po statusie',
|
||||||
|
'Below min. stock amount' => 'Below min. stock amount',
|
||||||
|
'Expiring soon' => 'Expiring soon',
|
||||||
|
'Already expired' => 'Already expired',
|
||||||
|
'Due soon' => 'Due soon',
|
||||||
|
'Overdue' => 'Overdue',
|
||||||
|
'View settings' => 'Zobacz ustawienia',
|
||||||
|
'Auto reload on external changes' => 'Auto reload on external changes',
|
||||||
|
'Enable night mode' => 'Włącz tryb nocny',
|
||||||
|
'Auto enable in time range' => 'Auto enable in time range',
|
||||||
|
'From' => 'Od',
|
||||||
|
'in format' => 'w formacie',
|
||||||
|
'To' => 'Do',
|
||||||
|
'Time range goes over midnight' => 'Time range goes over midnight',
|
||||||
|
'Product picture' => 'Zdjęcie produktu',
|
||||||
|
'No file selected' => 'Nie wybrano pliku',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
|
'Delete' => 'Usuń',
|
||||||
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
|
'Select file' => 'Wybierz plik',
|
||||||
|
'Image of product #1' => 'Image of product #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'This product cannot be deleted because it is in stock, please remove the stock amount first.',
|
||||||
|
'Delete not possible' => 'Delete not possible',
|
||||||
|
'Equipment' => 'Equipment',
|
||||||
|
'Instruction manual' => 'Instruction manual',
|
||||||
|
'The selected equipment has no instruction manual' => 'The selected equipment has no instruction manual',
|
||||||
|
'Notes' => 'Notatki',
|
||||||
|
'Edit equipment' => 'Edit equipment',
|
||||||
|
'Create equipment' => 'Create equipment',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
|
'No picture available' => 'No picture available',
|
||||||
|
'Filter by product group' => 'Filter by product group',
|
||||||
|
'Presets for new products' => 'Presets for new products',
|
||||||
|
'Included recipes' => 'Included recipes',
|
||||||
|
'A recipe is required' => 'A recipe is required',
|
||||||
|
'Add included recipe' => 'Add included recipe',
|
||||||
|
'Edit included recipe' => 'Edit included recipe',
|
||||||
|
'Group' => 'Grupa',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'This will be used as a headline to group ingredients together',
|
||||||
|
'Journal' => 'Pamiętnik',
|
||||||
|
'Stock journal' => 'Stock journal',
|
||||||
|
'Filter by product' => 'Filter by product',
|
||||||
|
'Booking time' => 'Booking time',
|
||||||
|
'Booking type' => 'Booking type',
|
||||||
|
'Undo booking' => 'Undo booking',
|
||||||
|
'Undone on' => 'Undone on',
|
||||||
|
'Batteries journal' => 'Batteries journal',
|
||||||
|
'Filter by battery' => 'Filter by battery',
|
||||||
|
'Undo charge cycle' => 'Undo charge cycle',
|
||||||
|
'Undo chore execution' => 'Undo chore execution',
|
||||||
|
'Chore execution successfully undone' => 'Chore execution successfully undone',
|
||||||
|
'Undo' => 'Cofnij',
|
||||||
|
'Booking successfully undone' => 'Booking successfully undone',
|
||||||
|
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||||
|
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||||
|
'Add all list items to stock' => 'Add all list items to stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||||
|
'Use a specific stock item' => 'Use a specific stock item',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||||
|
'Default best before days after opened' => 'Default best before days after opened',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||||
|
'Mark as opened' => 'Mark as opened',
|
||||||
|
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||||
|
'Not opened' => 'Not opened',
|
||||||
|
'Opened' => 'Opened',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'#1 opened' => '#1 opened',
|
||||||
|
'Product expires' => 'Product expires',
|
||||||
|
'Task due' => 'Task due',
|
||||||
|
'Chore due' => 'Chore due',
|
||||||
|
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||||
|
'Show clock in header' => 'Show clock in header',
|
||||||
|
'Stock settings' => 'Stock settings',
|
||||||
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
|
'Skip' => 'Pomiń',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
|
);
|
6
localization/ru/chore_types.php
Normal file
6
localization/ru/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Вручную',
|
||||||
|
'dynamic-regular' => 'Динамически постоянно'
|
||||||
|
);
|
10
localization/ru/component_translations.php
Normal file
10
localization/ru/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'en',
|
||||||
|
'timeago_nan' => 'NaN years ago',
|
||||||
|
'moment_locale' => 'x',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||||
|
'summernote_locale' => 'x',
|
||||||
|
'fullcalendar_locale' => 'x'
|
||||||
|
);
|
89
localization/ru/demo_data.php
Normal file
89
localization/ru/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Печенье',
|
||||||
|
'Chocolate' => 'Шоколад',
|
||||||
|
'Pantry' => 'Pantry',
|
||||||
|
'Candy cupboard' => 'Candy cupboard',
|
||||||
|
'Tinned food cupboard' => 'Tinned food cupboard',
|
||||||
|
'Fridge' => 'Холодильник',
|
||||||
|
'Piece' => 'Штука',
|
||||||
|
'Pieces' => 'Штук(и)',
|
||||||
|
'Pack' => 'Упаковка',
|
||||||
|
'Packs' => 'Упаков(ки/ок)',
|
||||||
|
'Glass' => 'Стакан',
|
||||||
|
'Glasses' => 'Стакан(а/ов)',
|
||||||
|
'Tin' => 'Tin',
|
||||||
|
'Tins' => 'Tins',
|
||||||
|
'Can' => 'Can',
|
||||||
|
'Cans' => 'Cans',
|
||||||
|
'Bunch' => 'Bunch',
|
||||||
|
'Bunches' => 'Bunches',
|
||||||
|
'Gummy bears' => 'Gummy bears',
|
||||||
|
'Crisps' => 'Crisps',
|
||||||
|
'Eggs' => 'Яйца',
|
||||||
|
'Noodles' => 'Макароны',
|
||||||
|
'Pickles' => 'Огурцы',
|
||||||
|
'Gulash soup' => 'Gulash soup',
|
||||||
|
'Yogurt' => 'Йогурт',
|
||||||
|
'Cheese' => 'Сыр',
|
||||||
|
'Cold cuts' => 'Cold cuts',
|
||||||
|
'Paprika' => 'Paprika',
|
||||||
|
'Cucumber' => 'Cucumber',
|
||||||
|
'Radish' => 'Radish',
|
||||||
|
'Tomato' => 'Помидор',
|
||||||
|
'Changed towels in the bathroom' => 'Changed towels in the bathroom',
|
||||||
|
'Cleaned the kitchen floor' => 'Cleaned the kitchen floor',
|
||||||
|
'Warranty ends' => 'Гарантия заканчивается',
|
||||||
|
'TV remote control' => 'Пульт ДУ',
|
||||||
|
'Alarm clock' => 'Часы с будильником',
|
||||||
|
'Heat remote control' => 'Heat remote control',
|
||||||
|
'Lawn mowed in the garden' => 'Lawn mowed in the garden',
|
||||||
|
'Some good snacks' => 'Some good snacks',
|
||||||
|
'Pizza dough' => 'Pizza dough',
|
||||||
|
'Sieved tomatoes' => 'Sieved tomatoes',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Toast',
|
||||||
|
'Minced meat' => 'Minced meat',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
||||||
|
'Sandwiches' => 'Sandwiches',
|
||||||
|
'English' => 'English',
|
||||||
|
'German' => 'German',
|
||||||
|
'Italian' => 'Italian',
|
||||||
|
'Demo in different language' => 'Demo in different language',
|
||||||
|
'This is the note content of the recipe ingredient' => 'This is the note content of the recipe ingredient',
|
||||||
|
'Demo User' => 'Demo User',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Grams',
|
||||||
|
'Flour' => 'Flour',
|
||||||
|
'Pancakes' => 'Pancakes',
|
||||||
|
'Sugar' => 'Sugar',
|
||||||
|
'Home' => 'Home',
|
||||||
|
'Life' => 'Life',
|
||||||
|
'Projects' => 'Projects',
|
||||||
|
'Repair the garage door' => 'Repair the garage door',
|
||||||
|
'Fork and improve grocy' => 'Fork and improve grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Find a solution for what to do when I forget the door keys',
|
||||||
|
'Sweets' => 'Sweets',
|
||||||
|
'Bakery products' => 'Bakery products',
|
||||||
|
'Tinned food' => 'Tinned food',
|
||||||
|
'Butchery products' => 'Butchery products',
|
||||||
|
'Vegetables/Fruits' => 'Vegetables/Fruits',
|
||||||
|
'Refrigerated products' => 'Refrigerated products',
|
||||||
|
'Coffee machine' => 'Coffee machine',
|
||||||
|
'Dishwasher' => 'Dishwasher',
|
||||||
|
'Liter' => 'Liter',
|
||||||
|
'Liters' => 'Liters',
|
||||||
|
'Bottle' => 'Bottle',
|
||||||
|
'Bottles' => 'Bottles',
|
||||||
|
'Milk' => 'Milk',
|
||||||
|
'Chocolate sauce' => 'Chocolate sauce',
|
||||||
|
'Milliliters' => 'Milliliters',
|
||||||
|
'Milliliter' => 'Milliliter',
|
||||||
|
'Bottom' => 'Bottom',
|
||||||
|
'Topping' => 'Topping',
|
||||||
|
'French' => 'Французский',
|
||||||
|
'Turkish' => 'Турецкий',
|
||||||
|
'Spanish' => 'Испанский'
|
||||||
|
);
|
8
localization/ru/stock_transaction_types.php
Normal file
8
localization/ru/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Купить',
|
||||||
|
'consume' => 'Употребить',
|
||||||
|
'inventory-correction' => 'Исправление инвентаря',
|
||||||
|
'product-opened' => 'Продукт открыт'
|
||||||
|
);
|
349
localization/ru/strings.php
Normal file
349
localization/ru/strings.php
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Обзор склада',
|
||||||
|
'#1 products expiring within the next #2 days' => 'У #1 продуктов заканчивается срок годности через #2 дня (дней)',
|
||||||
|
'#1 products are already expired' => 'У #1 продуктов закончился срок годности',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 продуктов имеются в количестве меньше минимально заданного',
|
||||||
|
'Product' => 'Продукт',
|
||||||
|
'Amount' => 'Количество',
|
||||||
|
'Next best before date' => 'Следующий срок годности',
|
||||||
|
'Logout' => 'Выйти',
|
||||||
|
'Chores overview' => 'Обзор работ по дому',
|
||||||
|
'Batteries overview' => 'Обзор батарей',
|
||||||
|
'Purchase' => 'Покупка',
|
||||||
|
'Consume' => 'Потребление',
|
||||||
|
'Inventory' => 'Инвентарь',
|
||||||
|
'Shopping list' => 'Список покупок',
|
||||||
|
'Chore tracking' => 'Выполнить работу по дому',
|
||||||
|
'Battery tracking' => 'Отслеживание батарей',
|
||||||
|
'Products' => 'Продукты',
|
||||||
|
'Locations' => 'Места хранения',
|
||||||
|
'Quantity units' => 'Единицы измерения',
|
||||||
|
'Chores' => 'Работы по дому',
|
||||||
|
'Batteries' => 'Батареи',
|
||||||
|
'Chore' => 'Работа по дому',
|
||||||
|
'Next estimated tracking' => 'Следующий период отслеживания',
|
||||||
|
'Last tracked' => 'Последнее время отслеживания',
|
||||||
|
'Battery' => 'Батарея',
|
||||||
|
'Last charged' => 'Последний раз заряжалась',
|
||||||
|
'Next planned charge cycle' => 'Следующий запланированный цикл заряда',
|
||||||
|
'Best before' => 'Срок годности',
|
||||||
|
'OK' => 'Готово',
|
||||||
|
'Product overview' => 'Обзор продуктов',
|
||||||
|
'Stock quantity unit' => 'Единица измерения запаса',
|
||||||
|
'Stock amount' => 'Количество в запасе',
|
||||||
|
'Last purchased' => 'Последняя покупка',
|
||||||
|
'Last used' => 'Последний раз использовалось',
|
||||||
|
'Spoiled' => 'Испорчено',
|
||||||
|
'Barcode lookup is disabled' => 'Поиск по штрихкоду отключён',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'будет добавлен к списку штрихкодов для выбранного продукта при сохранении',
|
||||||
|
'New amount' => 'Новое количество',
|
||||||
|
'Note' => 'Заметки',
|
||||||
|
'Tracked time' => 'Время выполнения',
|
||||||
|
'Chore overview' => 'Обзор работы по дому',
|
||||||
|
'Tracked count' => 'Количество выполнений',
|
||||||
|
'Battery overview' => 'Обзор батарей',
|
||||||
|
'Charge cycles count' => 'Количество циклов заряда',
|
||||||
|
'Create shopping list item' => 'Создать элемент списка покупок',
|
||||||
|
'Edit shopping list item' => 'Изменить элемент списка покупок',
|
||||||
|
'Save' => 'Сохранить',
|
||||||
|
'Add' => 'Добавить',
|
||||||
|
'Name' => 'Имя',
|
||||||
|
'Location' => 'Место хранения',
|
||||||
|
'Min. stock amount' => 'Мин. количество в запасе',
|
||||||
|
'QU purchase' => 'Ед.изм. покупки',
|
||||||
|
'QU stock' => 'Ед.изм. запаса',
|
||||||
|
'QU factor' => 'Пересчёт ед.изм.',
|
||||||
|
'Description' => 'Описание',
|
||||||
|
'Create product' => 'Создать продукт',
|
||||||
|
'Barcode(s)' => 'Штрихкод(ы)',
|
||||||
|
'Minimum stock amount' => 'Минимальное количество в запасе',
|
||||||
|
'Default best before days' => 'Срок годности по умолчанию',
|
||||||
|
'Quantity unit purchase' => 'Единица измерения про покупке',
|
||||||
|
'Quantity unit stock' => 'Единица измерения в запасе',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Коэффициент пересчёта единиц измерения при покупке и в запасе',
|
||||||
|
'Create location' => 'Создать место хранения',
|
||||||
|
'Create quantity unit' => 'Создать единицу измерения',
|
||||||
|
'Period type' => 'Тип периода',
|
||||||
|
'Period days' => 'Период в днях',
|
||||||
|
'Create chore' => 'Создать работу по дому',
|
||||||
|
'Used in' => 'Используется в',
|
||||||
|
'Create battery' => 'Создать батарею',
|
||||||
|
'Edit battery' => 'Изменить батарею',
|
||||||
|
'Edit chore' => 'Изменить работу по дому',
|
||||||
|
'Edit quantity unit' => 'Изменить единицу измерения',
|
||||||
|
'Edit product' => 'Изменить продукт',
|
||||||
|
'Edit location' => 'Изменить место хранения',
|
||||||
|
'Record data' => 'Записать данные',
|
||||||
|
'Manage master data' => 'Управление основными данными',
|
||||||
|
'This will apply to added products' => 'Будет применено к добавленным продуктам',
|
||||||
|
'never' => 'никогда',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Add products that are below defined min. stock amount',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'Означает, что 1 купленный #1 будет пересчитан в #2 #3 в запасе',
|
||||||
|
'Login' => 'Вход',
|
||||||
|
'Username' => 'Имя пользователя',
|
||||||
|
'Password' => 'Пароль',
|
||||||
|
'Invalid credentials, please try again' => 'Неправильные данные для входа, попробуйте снова',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Вы уверены, что нужно удалить батарею "#1"? ',
|
||||||
|
'Yes' => 'Да',
|
||||||
|
'No' => 'Нет',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Вы уверены, что нужно удалить работу по дому "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" не может быть преобразован к существующему продукту. Как вы хотите продолжить?',
|
||||||
|
'Create or assign product' => 'Создать или назначить продукт',
|
||||||
|
'Cancel' => 'Отмена',
|
||||||
|
'Add as new product' => 'Добавить как новый продукт',
|
||||||
|
'Add as barcode to existing product' => 'Добавить в качестве штрихкода к существующему продукту',
|
||||||
|
'Add as new product and prefill barcode' => 'Добавить новый продукт, заполнив штрихкод',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Вы уверены, что нужно удалить единицу измерения "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Вы уверены, что нужно удалить продукт "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Вы уверены, что нужно удалить место хранения "#1"?',
|
||||||
|
'Manage API keys' => 'Управление ключами доступа к API',
|
||||||
|
'REST API & data model documentation' => 'Документация на REST API и модуль данных',
|
||||||
|
'API keys' => 'Ключи доступа к API',
|
||||||
|
'Create new API key' => 'Создать ключ доступа к API',
|
||||||
|
'API key' => 'Ключ доступа к API',
|
||||||
|
'Expires' => 'Истекает',
|
||||||
|
'Created' => 'Создан',
|
||||||
|
'This product is not in stock' => 'Данного продукта нет в запасе',
|
||||||
|
'This means #1 will be added to stock' => 'Означает, что #1 будет добавлен в запас',
|
||||||
|
'This means #1 will be removed from stock' => 'Означает, что #1 будет убран из запаса',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'Это означает, что следующее выполнение данной работы по дому будет назначено спустя #1 дней после самого недавнего выполнения',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Убрано #1 #2 из #3 из запаса',
|
||||||
|
'About grocy' => 'О grocy',
|
||||||
|
'Close' => 'Закрыть',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 батарей нужно будет зарядить в ближайшие #2 дня',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 батарей нужно зарядить',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => 'Срок исполнения #1 работ по дому наступает в ближайшие #2 дня (дней)',
|
||||||
|
'#1 chores are overdue to be done' => 'У #1 работ по дому уже подошёл срок выполнения',
|
||||||
|
'Released on' => 'Выпуск от',
|
||||||
|
'Consume #3 #1 of #2' => 'Употреблено #3 #1 из #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Добавлено #1 #2 из #3 в запас',
|
||||||
|
'Stock amount of #1 is now #2 #3' => '#1 в запасе теперь #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Отмечено выполнения работы по дому #1 в #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Отмечен цикл заряд батареи #1 в #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Употребить все #1, что находятся в запасе',
|
||||||
|
'All' => 'Все',
|
||||||
|
'Track charge cycle of battery #1' => 'Отметить цикл заряда батареи #1',
|
||||||
|
'Track execution of chore #1' => 'Отметить выполнение работы по дому #1',
|
||||||
|
'Filter by location' => 'Отфильтровать по месту хранения',
|
||||||
|
'Search' => 'Поиск',
|
||||||
|
'Not logged in' => 'Нет входа в систему',
|
||||||
|
'You have to select a product' => 'Вам нужно выбрать продукт',
|
||||||
|
'You have to select a chore' => 'Вам нужно выбрать работу по дому',
|
||||||
|
'You have to select a battery' => 'Вам нужно выбрать батарею',
|
||||||
|
'A name is required' => 'Имя необходимо',
|
||||||
|
'A location is required' => 'Место хранения необходимо',
|
||||||
|
'The amount cannot be lower than #1' => 'Количество не может быть меньше #1',
|
||||||
|
'This cannot be negative' => 'Значение не может быть отрицательным',
|
||||||
|
'A quantity unit is required' => 'Необходима единица измерения',
|
||||||
|
'A period type is required' => 'Необходим тип периода',
|
||||||
|
'A best before date is required and must be later than today' => 'Необходим срок годности и он должен быть не раньше сегодня',
|
||||||
|
'Settings' => 'Настройки',
|
||||||
|
'This can only be before now' => 'Данное поле должно быть раньше текущего времени',
|
||||||
|
'Calendar' => 'Календарь',
|
||||||
|
'Recipes' => 'Рецепты',
|
||||||
|
'Edit recipe' => 'Изменить рецепт',
|
||||||
|
'New recipe' => 'Новый рецепт',
|
||||||
|
'Ingredients list' => 'Список ингредиентов',
|
||||||
|
'Add recipe ingredient' => 'Добавить ингредиент рецепта',
|
||||||
|
'Edit recipe ingredient' => 'Изменить ингредиент рецепта',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Вы уверены, что нужно удалить рецепт "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Вы уверены, что нужно удалить ингредиент рецепта "#1"?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Вы уверены, что нужно очистить список покупок?',
|
||||||
|
'Clear list' => 'Очистить список',
|
||||||
|
'Requirements fulfilled' => 'Требования выполнены',
|
||||||
|
'Put missing products on shopping list' => 'Добавить отсутствующие продукты в список покупок',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Запаса недостаточно, #1 ингредиентов нет',
|
||||||
|
'Enough in stock' => 'Достаточно в запасе',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Запаса недостаточно, #1 ингредиентов нет, но уже добавлены в список покупок',
|
||||||
|
'Expand to fullscreen' => 'Раскрыть на весь экран',
|
||||||
|
'Ingredients' => 'Ингредиенты',
|
||||||
|
'Preparation' => 'Приготовление',
|
||||||
|
'Recipe' => 'Рецепт',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Запаса недостаточно, #1 ингредиентов нет, #2 уже добавлены в список покупок',
|
||||||
|
'Show notes' => 'Показать заметки',
|
||||||
|
'Put missing amount on shopping list' => 'Добавить отсутствующее количество в список покупок',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Вы уверены, что нужно добавить все отсутствующие ингредиенты для рецепта "#1" в список покупок?',
|
||||||
|
'Added for recipe #1' => 'Добавлен рецепт #1',
|
||||||
|
'Manage users' => 'Управление пользователями',
|
||||||
|
'User' => 'Пользователь',
|
||||||
|
'Users' => 'Пользователи',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Вы уверены, что нужно удалить пользователя "#1"?',
|
||||||
|
'Create user' => 'Создать пользователя',
|
||||||
|
'Edit user' => 'Изменить пользователя',
|
||||||
|
'First name' => 'Имя',
|
||||||
|
'Last name' => 'Фамилия',
|
||||||
|
'A username is required' => 'Имя пользователя обязательно',
|
||||||
|
'Confirm password' => 'Подтверждение пароля',
|
||||||
|
'Passwords do not match' => 'Пароли не совпадают',
|
||||||
|
'Change password' => 'Изменить пароль',
|
||||||
|
'Done by' => 'Выполнено ',
|
||||||
|
'Last done by' => 'Последний раз выполнено',
|
||||||
|
'Unknown' => 'Неизвестно',
|
||||||
|
'Filter by chore' => 'Отфильтровать по работе по дому',
|
||||||
|
'Chores journal' => 'Журнал выполнения работ по дому',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 означен, что предложения следующего цикла заряда выключены',
|
||||||
|
'Charge cycle interval (days)' => 'Цикл работы от 1 заряда (дней)',
|
||||||
|
'Last price' => 'Последняя цена покупки',
|
||||||
|
'Price history' => 'История цен',
|
||||||
|
'No price history available' => 'Нет истории цен для показа',
|
||||||
|
'Price' => 'Цена',
|
||||||
|
'in #1 per purchase quantity unit' => 'в #1 на покупку единицы измерения',
|
||||||
|
'The price cannot be lower than #1' => 'Цена не может быть ниже #1',
|
||||||
|
'#1 product expires within the next #2 days' => 'У #1 продукта закончится срок годности через #2 дня(дней)',
|
||||||
|
'#1 product is already expired' => 'У #1 продукта уже закончился срок годности',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 продукт имеется в количестве меньше минимально заданного',
|
||||||
|
'Unit' => 'Ед.изм.',
|
||||||
|
'Units' => 'Ед.изм.',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => 'Срок исполнения #1 работы по дому наступает в ближайшие #2 дня (дней) ',
|
||||||
|
'#1 chore is overdue to be done' => 'У #1 работы по дому уже подошёл срок исполнения ',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 батарею нужно будет зарядить в ближайшие #2 дня ',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 батарею нужно зарядить',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unit was automatically added and will apply in addition to the amount entered here',
|
||||||
|
'in singular form' => 'в единственном числе',
|
||||||
|
'in plural form' => 'в множественном числе',
|
||||||
|
'Never expires' => 'Бесконечный срок годности',
|
||||||
|
'This cannot be lower than #1' => 'Не может быть менее #1',
|
||||||
|
'-1 means that this product never expires' => '-1 означает, что у данного продукта бесконечный срок годности',
|
||||||
|
'Quantity unit' => 'Единица измерения',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Only check if a single unit is in stock (a different quantity can then be used above)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => 'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Все ингредиенты рецепта "#1" убраны из запаса',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Употребить все ингредиенты, необходимые данному рецепту',
|
||||||
|
'Click to show technical details' => 'Нажмите, чтобы посмотреть технические детали',
|
||||||
|
'Error while saving, probably this item already exists' => 'Ошибка при сохранении, вероятно, данный элемент уже существует',
|
||||||
|
'Error details' => 'Детали ошибки',
|
||||||
|
'Tasks' => 'Задачи',
|
||||||
|
'Show done tasks' => 'Показать законченные задачи',
|
||||||
|
'Task' => 'Задача',
|
||||||
|
'Due' => 'Срок выполнения',
|
||||||
|
'Assigned to' => 'Назначена',
|
||||||
|
'Mark task "#1" as completed' => 'Пометить задачу "#1" как выполненную',
|
||||||
|
'Uncategorized' => 'Без категории',
|
||||||
|
'Task categories' => 'Категории задач',
|
||||||
|
'Create task' => 'Создать задачу',
|
||||||
|
'A due date is required' => 'Необходим срок выполнения',
|
||||||
|
'Category' => 'Категория',
|
||||||
|
'Edit task' => 'Изменить задачу',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Вы уверены, что нужно удалить задачу "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => 'У #1 задачи заканчивается срок выполнения в ближайшие #2 дня(дней)',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => 'У #1 задач заканчивается срок выполнения в ближайшие #2 дня (дней)',
|
||||||
|
'#1 task is overdue to be done' => 'У #1 задачи вышел срок выполнения',
|
||||||
|
'#1 tasks are overdue to be done' => 'У #1 задач вышел срок выполнения',
|
||||||
|
'Edit task category' => 'Изменить категорию задач',
|
||||||
|
'Create task category' => 'Создать категорию задач',
|
||||||
|
'Product groups' => 'Группы продуктов',
|
||||||
|
'Ungrouped' => 'Без группы',
|
||||||
|
'Create product group' => 'Создать группу продуктов',
|
||||||
|
'Edit product group' => 'Изменить группу продуктов',
|
||||||
|
'Product group' => 'Группа продуктов',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Оставаться в сети всегда',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'Если не отмечено, то вы выйдете автоматически через 30 дней',
|
||||||
|
'Filter by status' => 'Отфильтровать по статусу',
|
||||||
|
'Below min. stock amount' => 'Below min. stock amount',
|
||||||
|
'Expiring soon' => 'Скоро заканчивается срок',
|
||||||
|
'Already expired' => 'Срок годности вышел',
|
||||||
|
'Due soon' => 'Срок выполнения подходит',
|
||||||
|
'Overdue' => 'Срок выполнен кончился',
|
||||||
|
'View settings' => 'Настройки показа',
|
||||||
|
'Auto reload on external changes' => 'Автоматическая перезагрузка при внешних изменениях',
|
||||||
|
'Enable night mode' => 'Включить ночной режим',
|
||||||
|
'Auto enable in time range' => 'Автоматически включать на данном отрезке времени',
|
||||||
|
'From' => 'Начиная с',
|
||||||
|
'in format' => 'в формате',
|
||||||
|
'To' => 'Заканчивая на',
|
||||||
|
'Time range goes over midnight' => 'Временной период пересекает полночь',
|
||||||
|
'Product picture' => 'Изображение продукта',
|
||||||
|
'No file selected' => 'Файл не выбран',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'Если файл не выбран, то текущее изображение не изменится',
|
||||||
|
'Delete' => 'Удалить',
|
||||||
|
'The current picture will be deleted when you save the product' => 'Текущее изображение будет удалено при сохранении продукта',
|
||||||
|
'Select file' => 'Выбрать файл',
|
||||||
|
'Image of product #1' => 'Изображение продукта #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'Данный продукт не может быть удалён, так как он ещё есть в запасе. Пожалуйста, сначала опустошите запас.',
|
||||||
|
'Delete not possible' => 'Удаление невозможно',
|
||||||
|
'Equipment' => 'Техника',
|
||||||
|
'Instruction manual' => 'Инструкция',
|
||||||
|
'The selected equipment has no instruction manual' => 'У данной техники нет инструкции',
|
||||||
|
'Notes' => 'Заметки',
|
||||||
|
'Edit equipment' => 'Изменить технику',
|
||||||
|
'Create equipment' => 'Создать технику',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Если файл не выбран, то текущая инструкция не будет изменена',
|
||||||
|
'No instruction manual available' => 'Нет доступной инструкции
|
||||||
|
',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'Текущая инструкция будет удалена при сохранении техники',
|
||||||
|
'No picture available' => 'Нет доступного изображения',
|
||||||
|
'Filter by product group' => 'Отфильтровать по групп',
|
||||||
|
'Presets for new products' => 'Настройки по умолчанию для новых продуктов',
|
||||||
|
'Included recipes' => 'Включённые рецепты',
|
||||||
|
'A recipe is required' => 'Необходим рецепт',
|
||||||
|
'Add included recipe' => 'Добавить включённый рецепт',
|
||||||
|
'Edit included recipe' => 'Изменить включённый рецепт',
|
||||||
|
'Group' => 'Группа',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'This will be used as a headline to group ingredients together',
|
||||||
|
'Journal' => 'Журнал',
|
||||||
|
'Stock journal' => 'Журнал запасов',
|
||||||
|
'Filter by product' => 'Отфильтровать по продукту',
|
||||||
|
'Booking time' => 'Booking time',
|
||||||
|
'Booking type' => 'Booking type',
|
||||||
|
'Undo booking' => 'Undo booking',
|
||||||
|
'Undone on' => 'Отменено',
|
||||||
|
'Batteries journal' => 'Журнал батарей',
|
||||||
|
'Filter by battery' => 'Отфильтровать по батарее',
|
||||||
|
'Undo charge cycle' => 'Undo charge cycle',
|
||||||
|
'Undo chore execution' => 'Отменить выполнение работы по дому',
|
||||||
|
'Chore execution successfully undone' => 'Успешно отменено выполнение работы по дому',
|
||||||
|
'Undo' => 'Отменить',
|
||||||
|
'Booking successfully undone' => 'Booking successfully undone',
|
||||||
|
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||||
|
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||||
|
'Add all list items to stock' => 'Add all list items to stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||||
|
'Use a specific stock item' => 'Use a specific stock item',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||||
|
'Default best before days after opened' => 'Default best before days after opened',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||||
|
'Mark as opened' => 'Mark as opened',
|
||||||
|
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||||
|
'Not opened' => 'Not opened',
|
||||||
|
'Opened' => 'Opened',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'#1 opened' => '#1 opened',
|
||||||
|
'Product expires' => 'Product expires',
|
||||||
|
'Task due' => 'Task due',
|
||||||
|
'Chore due' => 'Срок выполнения работы по дому',
|
||||||
|
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||||
|
'Show clock in header' => 'Show clock in header',
|
||||||
|
'Stock settings' => 'Stock settings',
|
||||||
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
|
'Skip' => 'Skip',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
|
);
|
6
localization/ta/chore_types.php
Normal file
6
localization/ta/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Manually',
|
||||||
|
'dynamic-regular' => 'Dynamic regular'
|
||||||
|
);
|
10
localization/ta/component_translations.php
Normal file
10
localization/ta/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'en',
|
||||||
|
'timeago_nan' => 'NaN years ago',
|
||||||
|
'moment_locale' => 'x',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||||
|
'summernote_locale' => 'x',
|
||||||
|
'fullcalendar_locale' => 'x'
|
||||||
|
);
|
89
localization/ta/demo_data.php
Normal file
89
localization/ta/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Cookies',
|
||||||
|
'Chocolate' => 'Chocolate',
|
||||||
|
'Pantry' => 'Pantry',
|
||||||
|
'Candy cupboard' => 'Candy cupboard',
|
||||||
|
'Tinned food cupboard' => 'Tinned food cupboard',
|
||||||
|
'Fridge' => 'Fridge',
|
||||||
|
'Piece' => 'Piece',
|
||||||
|
'Pieces' => 'Pieces',
|
||||||
|
'Pack' => 'Pack',
|
||||||
|
'Packs' => 'Packs',
|
||||||
|
'Glass' => 'Glass',
|
||||||
|
'Glasses' => 'Glasses',
|
||||||
|
'Tin' => 'Tin',
|
||||||
|
'Tins' => 'Tins',
|
||||||
|
'Can' => 'Can',
|
||||||
|
'Cans' => 'Cans',
|
||||||
|
'Bunch' => 'Bunch',
|
||||||
|
'Bunches' => 'Bunches',
|
||||||
|
'Gummy bears' => 'Gummy bears',
|
||||||
|
'Crisps' => 'Crisps',
|
||||||
|
'Eggs' => 'Eggs',
|
||||||
|
'Noodles' => 'Noodles',
|
||||||
|
'Pickles' => 'Pickles',
|
||||||
|
'Gulash soup' => 'Gulash soup',
|
||||||
|
'Yogurt' => 'Yogurt',
|
||||||
|
'Cheese' => 'Cheese',
|
||||||
|
'Cold cuts' => 'Cold cuts',
|
||||||
|
'Paprika' => 'Paprika',
|
||||||
|
'Cucumber' => 'Cucumber',
|
||||||
|
'Radish' => 'Radish',
|
||||||
|
'Tomato' => 'Tomato',
|
||||||
|
'Changed towels in the bathroom' => 'Changed towels in the bathroom',
|
||||||
|
'Cleaned the kitchen floor' => 'Cleaned the kitchen floor',
|
||||||
|
'Warranty ends' => 'Warranty ends',
|
||||||
|
'TV remote control' => 'TV remote control',
|
||||||
|
'Alarm clock' => 'Alarm clock',
|
||||||
|
'Heat remote control' => 'Heat remote control',
|
||||||
|
'Lawn mowed in the garden' => 'Lawn mowed in the garden',
|
||||||
|
'Some good snacks' => 'Some good snacks',
|
||||||
|
'Pizza dough' => 'Pizza dough',
|
||||||
|
'Sieved tomatoes' => 'Sieved tomatoes',
|
||||||
|
'Salami' => 'Salami',
|
||||||
|
'Toast' => 'Toast',
|
||||||
|
'Minced meat' => 'Minced meat',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spaghetti bolognese',
|
||||||
|
'Sandwiches' => 'Sandwiches',
|
||||||
|
'English' => 'English',
|
||||||
|
'German' => 'German',
|
||||||
|
'Italian' => 'Italian',
|
||||||
|
'Demo in different language' => 'Demo in different language',
|
||||||
|
'This is the note content of the recipe ingredient' => 'This is the note content of the recipe ingredient',
|
||||||
|
'Demo User' => 'Demo User',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Grams',
|
||||||
|
'Flour' => 'Flour',
|
||||||
|
'Pancakes' => 'Pancakes',
|
||||||
|
'Sugar' => 'Sugar',
|
||||||
|
'Home' => 'Home',
|
||||||
|
'Life' => 'Life',
|
||||||
|
'Projects' => 'Projects',
|
||||||
|
'Repair the garage door' => 'Repair the garage door',
|
||||||
|
'Fork and improve grocy' => 'Fork and improve grocy',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Find a solution for what to do when I forget the door keys',
|
||||||
|
'Sweets' => 'Sweets',
|
||||||
|
'Bakery products' => 'Bakery products',
|
||||||
|
'Tinned food' => 'Tinned food',
|
||||||
|
'Butchery products' => 'Butchery products',
|
||||||
|
'Vegetables/Fruits' => 'Vegetables/Fruits',
|
||||||
|
'Refrigerated products' => 'Refrigerated products',
|
||||||
|
'Coffee machine' => 'Coffee machine',
|
||||||
|
'Dishwasher' => 'Dishwasher',
|
||||||
|
'Liter' => 'Liter',
|
||||||
|
'Liters' => 'Liters',
|
||||||
|
'Bottle' => 'Bottle',
|
||||||
|
'Bottles' => 'Bottles',
|
||||||
|
'Milk' => 'Milk',
|
||||||
|
'Chocolate sauce' => 'Chocolate sauce',
|
||||||
|
'Milliliters' => 'Milliliters',
|
||||||
|
'Milliliter' => 'Milliliter',
|
||||||
|
'Bottom' => 'Bottom',
|
||||||
|
'Topping' => 'Topping',
|
||||||
|
'French' => 'French',
|
||||||
|
'Turkish' => 'Turkish',
|
||||||
|
'Spanish' => 'Spanish'
|
||||||
|
);
|
8
localization/ta/stock_transaction_types.php
Normal file
8
localization/ta/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Purchase',
|
||||||
|
'consume' => 'Consume',
|
||||||
|
'inventory-correction' => 'Inventory correction',
|
||||||
|
'product-opened' => 'Product opened'
|
||||||
|
);
|
348
localization/ta/strings.php
Normal file
348
localization/ta/strings.php
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Stock overview',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 products expiring within the next #2 days',
|
||||||
|
'#1 products are already expired' => '#1 products are already expired',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 products are below defined min. stock amount',
|
||||||
|
'Product' => 'Product',
|
||||||
|
'Amount' => 'Amount',
|
||||||
|
'Next best before date' => 'Next best before date',
|
||||||
|
'Logout' => 'Logout',
|
||||||
|
'Chores overview' => 'Chores overview',
|
||||||
|
'Batteries overview' => 'Batteries overview',
|
||||||
|
'Purchase' => 'Purchase',
|
||||||
|
'Consume' => 'Consume',
|
||||||
|
'Inventory' => 'Inventory',
|
||||||
|
'Shopping list' => 'Shopping list',
|
||||||
|
'Chore tracking' => 'Chore tracking',
|
||||||
|
'Battery tracking' => 'Battery tracking',
|
||||||
|
'Products' => 'Products',
|
||||||
|
'Locations' => 'Locations',
|
||||||
|
'Quantity units' => 'Quantity units',
|
||||||
|
'Chores' => 'Chores',
|
||||||
|
'Batteries' => 'Batteries',
|
||||||
|
'Chore' => 'Chore',
|
||||||
|
'Next estimated tracking' => 'Next estimated tracking',
|
||||||
|
'Last tracked' => 'Last tracked',
|
||||||
|
'Battery' => 'Battery',
|
||||||
|
'Last charged' => 'Last charged',
|
||||||
|
'Next planned charge cycle' => 'Next planned charge cycle',
|
||||||
|
'Best before' => 'Best before',
|
||||||
|
'OK' => 'OK',
|
||||||
|
'Product overview' => 'Product overview',
|
||||||
|
'Stock quantity unit' => 'Stock quantity unit',
|
||||||
|
'Stock amount' => 'Stock amount',
|
||||||
|
'Last purchased' => 'Last purchased',
|
||||||
|
'Last used' => 'Last used',
|
||||||
|
'Spoiled' => 'Spoiled',
|
||||||
|
'Barcode lookup is disabled' => 'Barcode lookup is disabled',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'will be added to the list of barcodes for the selected product on submit',
|
||||||
|
'New amount' => 'New amount',
|
||||||
|
'Note' => 'Note',
|
||||||
|
'Tracked time' => 'Tracked time',
|
||||||
|
'Chore overview' => 'Chore overview',
|
||||||
|
'Tracked count' => 'Tracked count',
|
||||||
|
'Battery overview' => 'Battery overview',
|
||||||
|
'Charge cycles count' => 'Charge cycles count',
|
||||||
|
'Create shopping list item' => 'Create shopping list item',
|
||||||
|
'Edit shopping list item' => 'Edit shopping list item',
|
||||||
|
'Save' => 'Save',
|
||||||
|
'Add' => 'Add',
|
||||||
|
'Name' => 'Name',
|
||||||
|
'Location' => 'Location',
|
||||||
|
'Min. stock amount' => 'Min. stock amount',
|
||||||
|
'QU purchase' => 'QU purchase',
|
||||||
|
'QU stock' => 'QU stock',
|
||||||
|
'QU factor' => 'QU factor',
|
||||||
|
'Description' => 'Description',
|
||||||
|
'Create product' => 'Create product',
|
||||||
|
'Barcode(s)' => 'Barcode(s)',
|
||||||
|
'Minimum stock amount' => 'Minimum stock amount',
|
||||||
|
'Default best before days' => 'Default best before days',
|
||||||
|
'Quantity unit purchase' => 'Quantity unit purchase',
|
||||||
|
'Quantity unit stock' => 'Quantity unit stock',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Factor purchase to stock quantity unit',
|
||||||
|
'Create location' => 'Create location',
|
||||||
|
'Create quantity unit' => 'Create quantity unit',
|
||||||
|
'Period type' => 'Period type',
|
||||||
|
'Period days' => 'Period days',
|
||||||
|
'Create chore' => 'Create chore',
|
||||||
|
'Used in' => 'Used in',
|
||||||
|
'Create battery' => 'Create battery',
|
||||||
|
'Edit battery' => 'Edit battery',
|
||||||
|
'Edit chore' => 'Edit chore',
|
||||||
|
'Edit quantity unit' => 'Edit quantity unit',
|
||||||
|
'Edit product' => 'Edit product',
|
||||||
|
'Edit location' => 'Edit location',
|
||||||
|
'Record data' => 'Record data',
|
||||||
|
'Manage master data' => 'Manage master data',
|
||||||
|
'This will apply to added products' => 'This will apply to added products',
|
||||||
|
'never' => 'never',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Add products that are below defined min. stock amount',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'This means 1 #1 purchased will be converted into #2 #3 in stock',
|
||||||
|
'Login' => 'Login',
|
||||||
|
'Username' => 'Username',
|
||||||
|
'Password' => 'Password',
|
||||||
|
'Invalid credentials, please try again' => 'Invalid credentials, please try again',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Are you sure to delete battery "#1"?',
|
||||||
|
'Yes' => 'Yes',
|
||||||
|
'No' => 'No',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Are you sure to delete chore "#1"?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" could not be resolved to a product, how do you want to proceed?',
|
||||||
|
'Create or assign product' => 'Create or assign product',
|
||||||
|
'Cancel' => 'Cancel',
|
||||||
|
'Add as new product' => 'Add as new product',
|
||||||
|
'Add as barcode to existing product' => 'Add as barcode to existing product',
|
||||||
|
'Add as new product and prefill barcode' => 'Add as new product and prefill barcode',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Are you sure to delete quantity unit "#1"?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Are you sure to delete product "#1"?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Are you sure to delete location "#1"?',
|
||||||
|
'Manage API keys' => 'Manage API keys',
|
||||||
|
'REST API & data model documentation' => 'REST API & data model documentation',
|
||||||
|
'API keys' => 'API keys',
|
||||||
|
'Create new API key' => 'Create new API key',
|
||||||
|
'API key' => 'API key',
|
||||||
|
'Expires' => 'Expires',
|
||||||
|
'Created' => 'Created',
|
||||||
|
'This product is not in stock' => 'This product is not in stock',
|
||||||
|
'This means #1 will be added to stock' => 'This means #1 will be added to stock',
|
||||||
|
'This means #1 will be removed from stock' => 'This means #1 will be removed from stock',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked',
|
||||||
|
'Removed #1 #2 of #3 from stock' => 'Removed #1 #2 of #3 from stock',
|
||||||
|
'About grocy' => 'About grocy',
|
||||||
|
'Close' => 'Close',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 batteries are due to be charged within the next #2 days',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 batteries are overdue to be charged',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 chores are due to be done within the next #2 days',
|
||||||
|
'#1 chores are overdue to be done' => '#1 chores are overdue to be done',
|
||||||
|
'Released on' => 'Released on',
|
||||||
|
'Consume #3 #1 of #2' => 'Consume #3 #1 of #2',
|
||||||
|
'Added #1 #2 of #3 to stock' => 'Added #1 #2 of #3 to stock',
|
||||||
|
'Stock amount of #1 is now #2 #3' => 'Stock amount of #1 is now #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => 'Tracked execution of chore #1 on #2',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Tracked charge cycle of battery #1 on #2',
|
||||||
|
'Consume all #1 which are currently in stock' => 'Consume all #1 which are currently in stock',
|
||||||
|
'All' => 'All',
|
||||||
|
'Track charge cycle of battery #1' => 'Track charge cycle of battery #1',
|
||||||
|
'Track execution of chore #1' => 'Track execution of chore #1',
|
||||||
|
'Filter by location' => 'Filter by location',
|
||||||
|
'Search' => 'Search',
|
||||||
|
'Not logged in' => 'Not logged in',
|
||||||
|
'You have to select a product' => 'You have to select a product',
|
||||||
|
'You have to select a chore' => 'You have to select a chore',
|
||||||
|
'You have to select a battery' => 'You have to select a battery',
|
||||||
|
'A name is required' => 'A name is required',
|
||||||
|
'A location is required' => 'A location is required',
|
||||||
|
'The amount cannot be lower than #1' => 'The amount cannot be lower than #1',
|
||||||
|
'This cannot be negative' => 'This cannot be negative',
|
||||||
|
'A quantity unit is required' => 'A quantity unit is required',
|
||||||
|
'A period type is required' => 'A period type is required',
|
||||||
|
'A best before date is required and must be later than today' => 'A best before date is required and must be later than today',
|
||||||
|
'Settings' => 'Settings',
|
||||||
|
'This can only be before now' => 'This can only be before now',
|
||||||
|
'Calendar' => 'Calendar',
|
||||||
|
'Recipes' => 'Recipes',
|
||||||
|
'Edit recipe' => 'Edit recipe',
|
||||||
|
'New recipe' => 'New recipe',
|
||||||
|
'Ingredients list' => 'Ingredients list',
|
||||||
|
'Add recipe ingredient' => 'Add recipe ingredient',
|
||||||
|
'Edit recipe ingredient' => 'Edit recipe ingredient',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Are you sure to delete recipe "#1"?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Are you sure to delete recipe ingredient "#1"?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Are you sure to empty the shopping list?',
|
||||||
|
'Clear list' => 'Clear list',
|
||||||
|
'Requirements fulfilled' => 'Requirements fulfilled',
|
||||||
|
'Put missing products on shopping list' => 'Put missing products on shopping list',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Not enough in stock, #1 ingredients missing',
|
||||||
|
'Enough in stock' => 'Enough in stock',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Not enough in stock, #1 ingredients missing but already on the shopping list',
|
||||||
|
'Expand to fullscreen' => 'Expand to fullscreen',
|
||||||
|
'Ingredients' => 'Ingredients',
|
||||||
|
'Preparation' => 'Preparation',
|
||||||
|
'Recipe' => 'Recipe',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Not enough in stock, #1 missing, #2 already on shopping list',
|
||||||
|
'Show notes' => 'Show notes',
|
||||||
|
'Put missing amount on shopping list' => 'Put missing amount on shopping list',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?',
|
||||||
|
'Added for recipe #1' => 'Added for recipe #1',
|
||||||
|
'Manage users' => 'Manage users',
|
||||||
|
'User' => 'User',
|
||||||
|
'Users' => 'Users',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Are you sure to delete user "#1"?',
|
||||||
|
'Create user' => 'Create user',
|
||||||
|
'Edit user' => 'Edit user',
|
||||||
|
'First name' => 'First name',
|
||||||
|
'Last name' => 'Last name',
|
||||||
|
'A username is required' => 'A username is required',
|
||||||
|
'Confirm password' => 'Confirm password',
|
||||||
|
'Passwords do not match' => 'Passwords do not match',
|
||||||
|
'Change password' => 'Change password',
|
||||||
|
'Done by' => 'Done by',
|
||||||
|
'Last done by' => 'Last done by',
|
||||||
|
'Unknown' => 'Unknown',
|
||||||
|
'Filter by chore' => 'Filter by chore',
|
||||||
|
'Chores journal' => 'Chores journal',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 means suggestions for the next charge cycle are disabled',
|
||||||
|
'Charge cycle interval (days)' => 'Charge cycle interval (days)',
|
||||||
|
'Last price' => 'Last price',
|
||||||
|
'Price history' => 'Price history',
|
||||||
|
'No price history available' => 'No price history available',
|
||||||
|
'Price' => 'Price',
|
||||||
|
'in #1 per purchase quantity unit' => 'in #1 per purchase quantity unit',
|
||||||
|
'The price cannot be lower than #1' => 'The price cannot be lower than #1',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 product expires within the next #2 days',
|
||||||
|
'#1 product is already expired' => '#1 product is already expired',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 product is below defined min. stock amount',
|
||||||
|
'Unit' => 'Unit',
|
||||||
|
'Units' => 'Units',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 chore is due to be done within the next #2 days',
|
||||||
|
'#1 chore is overdue to be done' => '#1 chore is overdue to be done',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 battery is due to be charged within the next #2 days',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 battery is overdue to be charged',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 unit was automatically added and will apply in addition to the amount entered here',
|
||||||
|
'in singular form' => 'in singular form',
|
||||||
|
'in plural form' => 'in plural form',
|
||||||
|
'Never expires' => 'Never expires',
|
||||||
|
'This cannot be lower than #1' => 'This cannot be lower than #1',
|
||||||
|
'-1 means that this product never expires' => '-1 means that this product never expires',
|
||||||
|
'Quantity unit' => 'Quantity unit',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Only check if a single unit is in stock (a different quantity can then be used above)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => 'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Removed all ingredients of recipe "#1" from stock',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Consume all ingredients needed by this recipe',
|
||||||
|
'Click to show technical details' => 'Click to show technical details',
|
||||||
|
'Error while saving, probably this item already exists' => 'Error while saving, probably this item already exists',
|
||||||
|
'Error details' => 'Error details',
|
||||||
|
'Tasks' => 'Tasks',
|
||||||
|
'Show done tasks' => 'Show done tasks',
|
||||||
|
'Task' => 'Task',
|
||||||
|
'Due' => 'Due',
|
||||||
|
'Assigned to' => 'Assigned to',
|
||||||
|
'Mark task "#1" as completed' => 'Mark task "#1" as completed',
|
||||||
|
'Uncategorized' => 'Uncategorized',
|
||||||
|
'Task categories' => 'Task categories',
|
||||||
|
'Create task' => 'Create task',
|
||||||
|
'A due date is required' => 'A due date is required',
|
||||||
|
'Category' => 'Category',
|
||||||
|
'Edit task' => 'Edit task',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Are you sure to delete task "#1"?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 task is due to be done within the next #2 days',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 tasks are due to be done within the next #2 days',
|
||||||
|
'#1 task is overdue to be done' => '#1 task is overdue to be done',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 tasks are overdue to be done',
|
||||||
|
'Edit task category' => 'Edit task category',
|
||||||
|
'Create task category' => 'Create task category',
|
||||||
|
'Product groups' => 'Product groups',
|
||||||
|
'Ungrouped' => 'Ungrouped',
|
||||||
|
'Create product group' => 'Create product group',
|
||||||
|
'Edit product group' => 'Edit product group',
|
||||||
|
'Product group' => 'Product group',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||||
|
'Stay logged in permanently' => 'Stay logged in permanently',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'When not set, you will get logged out at latest after 30 days',
|
||||||
|
'Filter by status' => 'Filter by status',
|
||||||
|
'Below min. stock amount' => 'Below min. stock amount',
|
||||||
|
'Expiring soon' => 'Expiring soon',
|
||||||
|
'Already expired' => 'Already expired',
|
||||||
|
'Due soon' => 'Due soon',
|
||||||
|
'Overdue' => 'Overdue',
|
||||||
|
'View settings' => 'View settings',
|
||||||
|
'Auto reload on external changes' => 'Auto reload on external changes',
|
||||||
|
'Enable night mode' => 'Enable night mode',
|
||||||
|
'Auto enable in time range' => 'Auto enable in time range',
|
||||||
|
'From' => 'From',
|
||||||
|
'in format' => 'in format',
|
||||||
|
'To' => 'To',
|
||||||
|
'Time range goes over midnight' => 'Time range goes over midnight',
|
||||||
|
'Product picture' => 'Product picture',
|
||||||
|
'No file selected' => 'No file selected',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'If you don\'t select a file, the current picture will not be altered',
|
||||||
|
'Delete' => 'Delete',
|
||||||
|
'The current picture will be deleted when you save the product' => 'The current picture will be deleted when you save the product',
|
||||||
|
'Select file' => 'Select file',
|
||||||
|
'Image of product #1' => 'Image of product #1',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'This product cannot be deleted because it is in stock, please remove the stock amount first.',
|
||||||
|
'Delete not possible' => 'Delete not possible',
|
||||||
|
'Equipment' => 'Equipment',
|
||||||
|
'Instruction manual' => 'Instruction manual',
|
||||||
|
'The selected equipment has no instruction manual' => 'The selected equipment has no instruction manual',
|
||||||
|
'Notes' => 'Notes',
|
||||||
|
'Edit equipment' => 'Edit equipment',
|
||||||
|
'Create equipment' => 'Create equipment',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'If you don\'t select a file, the current instruction manual will not be altered',
|
||||||
|
'No instruction manual available' => 'No instruction manual available',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'The current instruction manual will be deleted when you save the equipment',
|
||||||
|
'No picture available' => 'No picture available',
|
||||||
|
'Filter by product group' => 'Filter by product group',
|
||||||
|
'Presets for new products' => 'Presets for new products',
|
||||||
|
'Included recipes' => 'Included recipes',
|
||||||
|
'A recipe is required' => 'A recipe is required',
|
||||||
|
'Add included recipe' => 'Add included recipe',
|
||||||
|
'Edit included recipe' => 'Edit included recipe',
|
||||||
|
'Group' => 'Group',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'This will be used as a headline to group ingredients together',
|
||||||
|
'Journal' => 'Journal',
|
||||||
|
'Stock journal' => 'Stock journal',
|
||||||
|
'Filter by product' => 'Filter by product',
|
||||||
|
'Booking time' => 'Booking time',
|
||||||
|
'Booking type' => 'Booking type',
|
||||||
|
'Undo booking' => 'Undo booking',
|
||||||
|
'Undone on' => 'Undone on',
|
||||||
|
'Batteries journal' => 'Batteries journal',
|
||||||
|
'Filter by battery' => 'Filter by battery',
|
||||||
|
'Undo charge cycle' => 'Undo charge cycle',
|
||||||
|
'Undo chore execution' => 'Undo chore execution',
|
||||||
|
'Chore execution successfully undone' => 'Chore execution successfully undone',
|
||||||
|
'Undo' => 'Undo',
|
||||||
|
'Booking successfully undone' => 'Booking successfully undone',
|
||||||
|
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||||
|
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||||
|
'Add all list items to stock' => 'Add all list items to stock',
|
||||||
|
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||||
|
'Use a specific stock item' => 'Use a specific stock item',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||||
|
'Default best before days after opened' => 'Default best before days after opened',
|
||||||
|
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||||
|
'Mark as opened' => 'Mark as opened',
|
||||||
|
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||||
|
'Not opened' => 'Not opened',
|
||||||
|
'Opened' => 'Opened',
|
||||||
|
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||||
|
'#1 opened' => '#1 opened',
|
||||||
|
'Product expires' => 'Product expires',
|
||||||
|
'Task due' => 'Task due',
|
||||||
|
'Chore due' => 'Chore due',
|
||||||
|
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||||
|
'Show clock in header' => 'Show clock in header',
|
||||||
|
'Stock settings' => 'Stock settings',
|
||||||
|
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||||
|
'Skip' => 'Skip',
|
||||||
|
'Servings' => 'Servings',
|
||||||
|
'Costs' => 'Costs',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||||
|
'Picture' => 'Picture',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||||
|
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||||
|
'You have to select a recipe' => 'You have to select a recipe',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery'
|
||||||
|
);
|
6
localization/tr/chore_types.php
Normal file
6
localization/tr/chore_types.php
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'manually' => 'Manuel',
|
||||||
|
'dynamic-regular' => 'Dinamik düzenli'
|
||||||
|
);
|
10
localization/tr/component_translations.php
Normal file
10
localization/tr/component_translations.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'timeago_locale' => 'tr',
|
||||||
|
'timeago_nan' => 'NaN yıl önce',
|
||||||
|
'moment_locale' => 'tr',
|
||||||
|
'datatables_localization' => '{"sEmptyTable":"Tablo içerisinde uygun veri yok","sInfo":"_TOTAL_ girdiden _START_ - _END_ aralığı gösteriliyor","sInfoEmpty":"0 girdiden 0 - 0 aralığı gösteriliyor","sInfoFiltered":"(_MAX_ toplam girdiden filtrelendi)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"_MENU_ girdilerini göster","sLoadingRecords":"Yükleniyor...","sProcessing":"İşleniyor...","sSearch":"Ara:","sZeroRecords":"Eşleşen kayıt bulunamadı","oPaginate":{"sFirst":"İlk","sLast":"Son","sNext":"Sonraki","sPrevious":"Önceki"},"oAria":{"sSortAscending":": sütunu artan sıraya göre sıralamak için aktif edin","sSortDescending":": sütunu azalan sıraya göre sıralamak için aktif edin"}}',
|
||||||
|
'summernote_locale' => 'tr-TR',
|
||||||
|
'fullcalendar_locale' => 'tr'
|
||||||
|
);
|
89
localization/tr/demo_data.php
Normal file
89
localization/tr/demo_data.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Cookies' => 'Kurabiyeler',
|
||||||
|
'Chocolate' => 'Çikolata',
|
||||||
|
'Pantry' => 'Kiler',
|
||||||
|
'Candy cupboard' => 'Şeker dolabı',
|
||||||
|
'Tinned food cupboard' => 'Konserve dolabı',
|
||||||
|
'Fridge' => 'Buzdolabı',
|
||||||
|
'Piece' => 'Tane',
|
||||||
|
'Pieces' => 'Tane',
|
||||||
|
'Pack' => 'Paket',
|
||||||
|
'Packs' => 'Paket',
|
||||||
|
'Glass' => 'Bardak',
|
||||||
|
'Glasses' => 'Bardak',
|
||||||
|
'Tin' => 'Teneke',
|
||||||
|
'Tins' => 'Teneke',
|
||||||
|
'Can' => 'Konserve',
|
||||||
|
'Cans' => 'Konserve',
|
||||||
|
'Bunch' => 'Demet',
|
||||||
|
'Bunches' => 'Demet',
|
||||||
|
'Gummy bears' => 'Jelibon ayı',
|
||||||
|
'Crisps' => 'Cips',
|
||||||
|
'Eggs' => 'Yumurta',
|
||||||
|
'Noodles' => 'Noodle',
|
||||||
|
'Pickles' => 'Turşu',
|
||||||
|
'Gulash soup' => 'Gulaş çorbası',
|
||||||
|
'Yogurt' => 'Yoğurt',
|
||||||
|
'Cheese' => 'Peynir',
|
||||||
|
'Cold cuts' => 'Söğüş',
|
||||||
|
'Paprika' => 'Kırmızı biber',
|
||||||
|
'Cucumber' => 'Salatalık',
|
||||||
|
'Radish' => 'Turp',
|
||||||
|
'Tomato' => 'Domates',
|
||||||
|
'Changed towels in the bathroom' => 'Banyoda değişen havlular',
|
||||||
|
'Cleaned the kitchen floor' => 'Temizlenen mutfak zeminleri',
|
||||||
|
'Warranty ends' => 'Garantisi bitiyor',
|
||||||
|
'TV remote control' => 'TV uzaktan kumandası',
|
||||||
|
'Alarm clock' => 'Alarm saati',
|
||||||
|
'Heat remote control' => 'Uzaktan ısı kontrolü',
|
||||||
|
'Lawn mowed in the garden' => 'Biçilen bahçeler',
|
||||||
|
'Some good snacks' => 'Bazı iyi atıştırmalıklar',
|
||||||
|
'Pizza dough' => 'Pizza hamuru',
|
||||||
|
'Sieved tomatoes' => 'Elenmiş domates',
|
||||||
|
'Salami' => 'Salam',
|
||||||
|
'Toast' => 'Tost',
|
||||||
|
'Minced meat' => 'Kıyma',
|
||||||
|
'Pizza' => 'Pizza',
|
||||||
|
'Spaghetti bolognese' => 'Spagetti bolonez',
|
||||||
|
'Sandwiches' => 'Sandviç',
|
||||||
|
'English' => 'İngilizce',
|
||||||
|
'German' => 'Almanca',
|
||||||
|
'Italian' => 'İtalyanca',
|
||||||
|
'Demo in different language' => 'Farklı dilde bir demo',
|
||||||
|
'This is the note content of the recipe ingredient' => 'Bu, tarif malzemesi için bir not içeriği',
|
||||||
|
'Demo User' => 'Demo Kullanıcısı',
|
||||||
|
'Gram' => 'Gram',
|
||||||
|
'Grams' => 'Gram',
|
||||||
|
'Flour' => 'Un',
|
||||||
|
'Pancakes' => 'Pankek',
|
||||||
|
'Sugar' => 'Şeker',
|
||||||
|
'Home' => 'Ev',
|
||||||
|
'Life' => 'Yaşam',
|
||||||
|
'Projects' => 'Projeler',
|
||||||
|
'Repair the garage door' => 'Garaj kapısını tamir et',
|
||||||
|
'Fork and improve grocy' => 'grocy\'i forkla ve geliştir',
|
||||||
|
'Find a solution for what to do when I forget the door keys' => 'Anahtarları unuttuğumda ne yapmam gerektiğine dair bir çözüm bul',
|
||||||
|
'Sweets' => 'Tatlılar',
|
||||||
|
'Bakery products' => 'Fırın ürünleri',
|
||||||
|
'Tinned food' => 'Konserve yiyecekler',
|
||||||
|
'Butchery products' => 'Kasap ürünleri',
|
||||||
|
'Vegetables/Fruits' => 'Sebze/Meyve',
|
||||||
|
'Refrigerated products' => 'Dondurulmuş ürünler',
|
||||||
|
'Coffee machine' => 'Kahve makinesi',
|
||||||
|
'Dishwasher' => 'Bulaşık makinesi',
|
||||||
|
'Liter' => 'Litre',
|
||||||
|
'Liters' => 'Litre',
|
||||||
|
'Bottle' => 'Şişe',
|
||||||
|
'Bottles' => 'Şişe',
|
||||||
|
'Milk' => 'Süt',
|
||||||
|
'Chocolate sauce' => 'Çikolata sosu',
|
||||||
|
'Milliliters' => 'Mililitre',
|
||||||
|
'Milliliter' => 'Mililitre',
|
||||||
|
'Bottom' => 'Dip',
|
||||||
|
'Topping' => 'Süsleme',
|
||||||
|
'French' => 'Fransızca',
|
||||||
|
'Turkish' => 'Türkçe',
|
||||||
|
'Spanish' => 'İspanyolca'
|
||||||
|
);
|
8
localization/tr/stock_transaction_types.php
Normal file
8
localization/tr/stock_transaction_types.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'purchase' => 'Satın al',
|
||||||
|
'consume' => 'Tüket',
|
||||||
|
'inventory-correction' => 'Envanter doğrulama',
|
||||||
|
'product-opened' => 'Ürün açıldı'
|
||||||
|
);
|
349
localization/tr/strings.php
Normal file
349
localization/tr/strings.php
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Stock overview' => 'Stoklara genel bakış',
|
||||||
|
'#1 products expiring within the next #2 days' => '#1 ürünün son kullanma tarihi #2 gün içerisinde dolacak',
|
||||||
|
'#1 products are already expired' => '#1 ürünün son kullanma tarihi geçti',
|
||||||
|
'#1 products are below defined min. stock amount' => '#1 ürün belirlenen minimum stok miktarının altında',
|
||||||
|
'Product' => 'Ürün',
|
||||||
|
'Amount' => 'Miktar',
|
||||||
|
'Next best before date' => 'Son kullanma tarihi',
|
||||||
|
'Logout' => 'Çıkış yap',
|
||||||
|
'Chores overview' => 'Ev işlerine genel bakış',
|
||||||
|
'Batteries overview' => 'Pillere genel bakış',
|
||||||
|
'Purchase' => 'Satın al',
|
||||||
|
'Consume' => 'Tüket',
|
||||||
|
'Inventory' => 'Envanter',
|
||||||
|
'Shopping list' => 'Alışveriş listesi',
|
||||||
|
'Chore tracking' => 'Ev işleri takibi',
|
||||||
|
'Battery tracking' => 'Pil takibi',
|
||||||
|
'Products' => 'Ürünler',
|
||||||
|
'Locations' => 'Lokasyonlar',
|
||||||
|
'Quantity units' => 'Miktar birimleri',
|
||||||
|
'Chores' => 'Ev işleri',
|
||||||
|
'Batteries' => 'Piller',
|
||||||
|
'Chore' => 'Ev işi',
|
||||||
|
'Next estimated tracking' => 'Sonraki tahmini takip',
|
||||||
|
'Last tracked' => 'Son takip',
|
||||||
|
'Battery' => 'Pil',
|
||||||
|
'Last charged' => 'Son şarj ediş',
|
||||||
|
'Next planned charge cycle' => 'Sonraki planlanan şarj döngüsü',
|
||||||
|
'Best before' => 'Son kullanma tarihi',
|
||||||
|
'OK' => 'Tamam',
|
||||||
|
'Product overview' => 'Ürün genel bakışı',
|
||||||
|
'Stock quantity unit' => 'Stok miktar birimi',
|
||||||
|
'Stock amount' => 'Stok miktarı',
|
||||||
|
'Last purchased' => 'Son satın alış',
|
||||||
|
'Last used' => 'Son kullanış',
|
||||||
|
'Spoiled' => 'Bozulmuş',
|
||||||
|
'Barcode lookup is disabled' => 'Barkod inceleme özelliği devre dışı bırakıldı',
|
||||||
|
'will be added to the list of barcodes for the selected product on submit' => 'kayıt esnasında seçilen ürün için barkod listesine eklenecek',
|
||||||
|
'New amount' => 'Yeni miktar',
|
||||||
|
'Note' => 'Not',
|
||||||
|
'Tracked time' => 'Takip edilen süre',
|
||||||
|
'Chore overview' => 'Ev işlerine genel bakış',
|
||||||
|
'Tracked count' => 'Takip sayısı',
|
||||||
|
'Battery overview' => 'Pillere genel bakış',
|
||||||
|
'Charge cycles count' => 'Şarj döngüsü sayısı',
|
||||||
|
'Create shopping list item' => 'Alışveriş listesine bir madde ekle',
|
||||||
|
'Edit shopping list item' => 'Alışveriş listesi maddesini düzenle',
|
||||||
|
'Save' => 'Kaydet',
|
||||||
|
'Add' => 'Ekle',
|
||||||
|
'Name' => 'İsim',
|
||||||
|
'Location' => 'Lokasyon',
|
||||||
|
'Min. stock amount' => 'Min. stok miktarı',
|
||||||
|
'QU purchase' => 'QU satın al',
|
||||||
|
'QU stock' => 'QU stok',
|
||||||
|
'QU factor' => 'QU faktör',
|
||||||
|
'Description' => 'Açıklama',
|
||||||
|
'Create product' => 'Ürün oluştur',
|
||||||
|
'Barcode(s)' => 'Barkod(lar)',
|
||||||
|
'Minimum stock amount' => 'Minimum stok miktarı',
|
||||||
|
'Default best before days' => 'Varsayılan son kullanım tarihi',
|
||||||
|
'Quantity unit purchase' => 'Miktar birim alımı',
|
||||||
|
'Quantity unit stock' => 'Miktar birim stoğu',
|
||||||
|
'Factor purchase to stock quantity unit' => 'Alımı stok miktar birimle çarp',
|
||||||
|
'Create location' => 'Lokasyon oluştur',
|
||||||
|
'Create quantity unit' => 'Miktar birimi oluştur',
|
||||||
|
'Period type' => 'Dönem türü',
|
||||||
|
'Period days' => 'Dönem günleri',
|
||||||
|
'Create chore' => 'Ev işi oluştur',
|
||||||
|
'Used in' => 'içinde kullanılıyor',
|
||||||
|
'Create battery' => 'Pil oluştur',
|
||||||
|
'Edit battery' => 'Pil düzenle',
|
||||||
|
'Edit chore' => 'Ev işi düzenle',
|
||||||
|
'Edit quantity unit' => 'Miktar birimi düzenle',
|
||||||
|
'Edit product' => 'Ürünü düzenle',
|
||||||
|
'Edit location' => 'Lokasyonu düzenle',
|
||||||
|
'Record data' => 'Veri kaydet',
|
||||||
|
'Manage master data' => 'Ana veriyi yönet',
|
||||||
|
'This will apply to added products' => 'Bu eklenen ürünlere uygulanacak',
|
||||||
|
'never' => 'asla',
|
||||||
|
'Add products that are below defined min. stock amount' => 'Tanımlanan min. stok miktarının altındaki ürünleri ekle',
|
||||||
|
'For purchases this amount of days will be added to today for the best before date suggestion' => 'Satın alımlar için bu kadar gün son kullanım tarihi önerisi üzerine bugün eklenecek',
|
||||||
|
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'Bu 1 #1 satın alımının #2 #3 stoklarına dönüştürüleceğini ifade ediyor',
|
||||||
|
'Login' => 'Giriş yap',
|
||||||
|
'Username' => 'Kullanıcı adı',
|
||||||
|
'Password' => 'Parola',
|
||||||
|
'Invalid credentials, please try again' => 'Yanlış giriş bilgisi, lütfen tekrar deneyin',
|
||||||
|
'Are you sure to delete battery "#1"?' => 'Pil "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Yes' => 'Evet',
|
||||||
|
'No' => 'Hayır',
|
||||||
|
'Are you sure to delete chore "#1"?' => 'Ev işi "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'"#1" could not be resolved to a product, how do you want to proceed?' => '"#1" bir ürünle eşleşmiyor, nasıl ilerlemek istersin?',
|
||||||
|
'Create or assign product' => 'Oluştur veya bir ürüne ata',
|
||||||
|
'Cancel' => 'İptal et',
|
||||||
|
'Add as new product' => 'Yeni ürün olarak ekle',
|
||||||
|
'Add as barcode to existing product' => 'Var olan ürüne barkod olarak ekle',
|
||||||
|
'Add as new product and prefill barcode' => 'Yeni ürün olarak ekle ve barkodu otomatik doldur',
|
||||||
|
'Are you sure to delete quantity unit "#1"?' => 'Miktar birimi "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Are you sure to delete product "#1"?' => 'Ürün "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Are you sure to delete location "#1"?' => 'Lokasyon "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Manage API keys' => 'API anahtarlarını yönet',
|
||||||
|
'REST API & data model documentation' => 'REST API & veri modeli dökümantasyonu',
|
||||||
|
'API keys' => 'API anahtarları',
|
||||||
|
'Create new API key' => 'Yeni API anahtarı oluştur',
|
||||||
|
'API key' => 'API anahtarı',
|
||||||
|
'Expires' => 'Süresi doluyor',
|
||||||
|
'Created' => 'Oluşturuldu',
|
||||||
|
'This product is not in stock' => 'Bu ürün stoklarda yok',
|
||||||
|
'This means #1 will be added to stock' => 'Bu #1\'in stoklara ekleneceğini ifade ediyor',
|
||||||
|
'This means #1 will be removed from stock' => 'Bu #1\'in stoklardan silineceğini ifade ediyor',
|
||||||
|
'This means it is estimated that a new execution of this chore is tracked #1 days after the last was tracked' => 'Bu ev işinin sonraki takibinin son takipten #1 gün sonra olacağının tahmin edildiğini ifade ediyor',
|
||||||
|
'Removed #1 #2 of #3 from stock' => '#3\'ün #1 #2\'si stoklardan silindi',
|
||||||
|
'About grocy' => 'grocy hakkında',
|
||||||
|
'Close' => 'Kapat',
|
||||||
|
'#1 batteries are due to be charged within the next #2 days' => '#1 pilin önümüzdeki #2 gün içerisinde şarj olması bekleniyor',
|
||||||
|
'#1 batteries are overdue to be charged' => '#1 pilin şarj etme zamanı geçti',
|
||||||
|
'#1 chores are due to be done within the next #2 days' => '#1 ev işi önümüzdeki #2 gün içerisinde yapılacak',
|
||||||
|
'#1 chores are overdue to be done' => '#1 ev işinin yapılma zamanı geçti',
|
||||||
|
'Released on' => 'Yayınlanma tarihi',
|
||||||
|
'Consume #3 #1 of #2' => '#3\'ün #1/#2\'sini tüket',
|
||||||
|
'Added #1 #2 of #3 to stock' => '#1\'in #2/#3\'ü stoklara eklendi',
|
||||||
|
'Stock amount of #1 is now #2 #3' => '#1\'in stok miktarı şimdi #2 #3',
|
||||||
|
'Tracked execution of chore #1 on #2' => '#1\'in #2 üzerindeki uygulaması takip edildi',
|
||||||
|
'Tracked charge cycle of battery #1 on #2' => 'Pil #1\'in #2 üzerindeki şarj döngüsü takip edildi',
|
||||||
|
'Consume all #1 which are currently in stock' => '#1\'in bütün stoklarını tüket',
|
||||||
|
'All' => 'Hepsi',
|
||||||
|
'Track charge cycle of battery #1' => 'Pil #1\'in şarj döngüsünü takip et',
|
||||||
|
'Track execution of chore #1' => 'Ev işi #1\'in uygulamasını takip et',
|
||||||
|
'Filter by location' => 'Lokasyona göre filtrele',
|
||||||
|
'Search' => 'Ara',
|
||||||
|
'Not logged in' => 'Giriş yapılmadı',
|
||||||
|
'You have to select a product' => 'Ürün seçmeniz lazım',
|
||||||
|
'You have to select a chore' => 'Ev işi seçmeniz lazım',
|
||||||
|
'You have to select a battery' => 'Pil seçmeniz lazım',
|
||||||
|
'A name is required' => 'Bir isim zorunlu',
|
||||||
|
'A location is required' => 'Bir lokasyon zorunlu',
|
||||||
|
'The amount cannot be lower than #1' => 'Miktar #1\'den az olamaz',
|
||||||
|
'This cannot be negative' => 'Bu negatif olamaz',
|
||||||
|
'A quantity unit is required' => 'Miktar birim zorunlu',
|
||||||
|
'A period type is required' => 'Dönem tipi zorunlu',
|
||||||
|
'A best before date is required and must be later than today' => 'Bugünden ileride bir son kullanma tarihi girmek zorunlu',
|
||||||
|
'Settings' => 'Ayarlar',
|
||||||
|
'This can only be before now' => 'Bu sadece şu andan önce olabilir',
|
||||||
|
'Calendar' => 'Takvim',
|
||||||
|
'Recipes' => 'Tarifler',
|
||||||
|
'Edit recipe' => 'Tarifi düzenle',
|
||||||
|
'New recipe' => 'Yeni tarif',
|
||||||
|
'Ingredients list' => 'Malzeme listesi',
|
||||||
|
'Add recipe ingredient' => 'Tarife malzeme ekle',
|
||||||
|
'Edit recipe ingredient' => 'Tarif malzemesini düzenle',
|
||||||
|
'Are you sure to delete recipe "#1"?' => 'Tarif "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Are you sure to delete recipe ingredient "#1"?' => 'Tarif malzemesi "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Are you sure to empty the shopping list?' => 'Alışveriş listesini temizlemek istediğine emin misin?',
|
||||||
|
'Clear list' => 'Listeyi temizle',
|
||||||
|
'Requirements fulfilled' => 'Gereklilikler sağlandı',
|
||||||
|
'Put missing products on shopping list' => 'Eksik malzemeleri alışveriş listesine ekle',
|
||||||
|
'Not enough in stock, #1 ingredients missing' => 'Stokta yeterince #1 malzemesi yok',
|
||||||
|
'Enough in stock' => 'Stokta yeteri kadar var',
|
||||||
|
'Not enough in stock, #1 ingredients missing but already on the shopping list' => 'Stokta #1 yok ancak alışveriş listesine eklenmiş',
|
||||||
|
'Expand to fullscreen' => 'Tam ekran yap',
|
||||||
|
'Ingredients' => 'Malzemeler',
|
||||||
|
'Preparation' => 'Hazırlanışı',
|
||||||
|
'Recipe' => 'Tarif',
|
||||||
|
'Not enough in stock, #1 missing, #2 already on shopping list' => 'Stokta yeterince #1 yok, #2 alış veriş listesine eklenmiş',
|
||||||
|
'Show notes' => 'Notları göster',
|
||||||
|
'Put missing amount on shopping list' => 'Eksik miktar kadar alışveriş listesine ekle',
|
||||||
|
'Are you sure to put all missing ingredients for recipe "#1" on the shopping list?' => 'Tarif "#1"\'deki bütün eksik malzemeleri alışveriş listesine eklemek istediğinize emin misiniz?',
|
||||||
|
'Added for recipe #1' => 'Tarif #1 için eklendi',
|
||||||
|
'Manage users' => 'Kullanıcıları yönet',
|
||||||
|
'User' => 'Kullanıcı',
|
||||||
|
'Users' => 'Kullanıcılar',
|
||||||
|
'Are you sure to delete user "#1"?' => 'Kullanıcı "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Create user' => 'Kullanıcı oluştur',
|
||||||
|
'Edit user' => 'Kullanıcıyı düzenle',
|
||||||
|
'First name' => 'İsim',
|
||||||
|
'Last name' => 'Soyisim',
|
||||||
|
'A username is required' => 'Bir kullanıcı adı zorunlu',
|
||||||
|
'Confirm password' => 'Parolayı doğrulayın',
|
||||||
|
'Passwords do not match' => 'Parolalar uyuşmuyor',
|
||||||
|
'Change password' => 'Parolayı değiştir',
|
||||||
|
'Done by' => 'Tamamlanma tarihi',
|
||||||
|
'Last done by' => 'Son tamamlanma tarih',
|
||||||
|
'Unknown' => 'Bilinmeyen',
|
||||||
|
'Filter by chore' => 'Ev işine göre filtrele',
|
||||||
|
'Chores journal' => 'Ev işi günlüğü',
|
||||||
|
'0 means suggestions for the next charge cycle are disabled' => '0 sonraki şarj döngüsünün devre dışı bırakıldığını ifade eder',
|
||||||
|
'Charge cycle interval (days)' => 'Şart döngüsü aralığı (gün)',
|
||||||
|
'Last price' => 'Son fiyat',
|
||||||
|
'Price history' => 'Fiyat tarihçesi',
|
||||||
|
'No price history available' => 'Fiyat tarihçesi yok',
|
||||||
|
'Price' => 'Fiyat',
|
||||||
|
'in #1 per purchase quantity unit' => '#1 için her miktar birimini satın al',
|
||||||
|
'The price cannot be lower than #1' => 'Fiyat #1\'den az olamaz',
|
||||||
|
'#1 product expires within the next #2 days' => '#1 ürünün son kullanma tarihi #2 gün içerisinde dolacak',
|
||||||
|
'#1 product is already expired' => '#1 ürünün son kullanma tarihi geçti',
|
||||||
|
'#1 product is below defined min. stock amount' => '#1 ürün belirlenen min. stok miktarının altında',
|
||||||
|
'Unit' => 'Birim',
|
||||||
|
'Units' => 'Birimler',
|
||||||
|
'#1 chore is due to be done within the next #2 days' => '#1 ev işi önümüzdeki #2 gün içerisinde yapılacak',
|
||||||
|
'#1 chore is overdue to be done' => '#1 ev işinin yapılma zamanı geçti',
|
||||||
|
'#1 battery is due to be charged within the next #2 days' => '#1 pilin önümüzdeki #2 gün içerisinde şarj olması bekleniyor',
|
||||||
|
'#1 battery is overdue to be charged' => '#1 pilin şarj etme zamanı geçti',
|
||||||
|
'#1 unit was automatically added and will apply in addition to the amount entered here' => '#1 birim otomatik olarak eklendi ve buraya girilen miktar haricinde uygulanacak',
|
||||||
|
'in singular form' => 'tekil formda',
|
||||||
|
'in plural form' => 'çoğul formda',
|
||||||
|
'Never expires' => 'Son kullanma tarihi asla dolmuyor',
|
||||||
|
'This cannot be lower than #1' => 'Bu #1\'den az olamaz',
|
||||||
|
'-1 means that this product never expires' => '-1 ürünün son kullanma tarihinin asla dolmadığını ifade eder',
|
||||||
|
'Quantity unit' => 'Miktar birimi',
|
||||||
|
'Only check if a single unit is in stock (a different quantity can then be used above)' => 'Sadece tek ürün stoklardaysa işaretleyin (farklı miktar daha sonra yukarıdan kullanılabilir)',
|
||||||
|
'Are you sure to consume all ingredients needed by recipe "#1" (ingredients marked with "check only if a single unit is in stock" will be ignored)?' => '"#1" için gereken tüm malzemeleri tüketmek istediğine emin misin ("sadece tek ürün varsa işaretle" ile işaretlenmiş ürünler ihmal edilecek)?',
|
||||||
|
'Removed all ingredients of recipe "#1" from stock' => 'Tarif "#1"\'in tüm malzemeleri stoklardan silindi',
|
||||||
|
'Consume all ingredients needed by this recipe' => 'Bu tarif için gereken tüm malzemeleri tüket',
|
||||||
|
'Click to show technical details' => 'Teknik detayları görmek için tıkla',
|
||||||
|
'Error while saving, probably this item already exists' => 'Kaydederken problem oldu, bu ürün muhtemelen zaten kayıtlı',
|
||||||
|
'Error details' => 'Hata detayları',
|
||||||
|
'Tasks' => 'Görevler',
|
||||||
|
'Show done tasks' => 'Tamamlanmış görevleri göster',
|
||||||
|
'Task' => 'Görev',
|
||||||
|
'Due' => 'Tamamlanma tarihi',
|
||||||
|
'Assigned to' => 'Atanan kişi',
|
||||||
|
'Mark task "#1" as completed' => 'Görev "#1"\'i tamamlandı olarak işaretle',
|
||||||
|
'Uncategorized' => 'Kategorize edilmemiş',
|
||||||
|
'Task categories' => 'Görev kategorileri',
|
||||||
|
'Create task' => 'Görev oluştur',
|
||||||
|
'A due date is required' => 'Bir tamamlanma tarihi zorunlu',
|
||||||
|
'Category' => 'Kategori',
|
||||||
|
'Edit task' => 'Görevi düzenle',
|
||||||
|
'Are you sure to delete task "#1"?' => 'Görev "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'#1 task is due to be done within the next #2 days' => '#1 görev önümüzdeki #2 gün içerisinde yapılacak',
|
||||||
|
'#1 tasks are due to be done within the next #2 days' => '#1 görev önümüzdeki #2 gün içerisinde yapılacak',
|
||||||
|
'#1 task is overdue to be done' => '#1 görevin yapılma zamanı geçti',
|
||||||
|
'#1 tasks are overdue to be done' => '#1 görevin yapılma zamanı geçti',
|
||||||
|
'Edit task category' => 'Görev kategorisini düzenle',
|
||||||
|
'Create task category' => 'Görev kategorisi oluştur',
|
||||||
|
'Product groups' => 'Ürün grupları',
|
||||||
|
'Ungrouped' => 'Grupsuz',
|
||||||
|
'Create product group' => 'Ürün grubu oluştur',
|
||||||
|
'Edit product group' => 'Ürün grubunu düzenle',
|
||||||
|
'Product group' => 'Ürün grubu',
|
||||||
|
'Are you sure to delete product group "#1"?' => 'Ürün grubu "#1"\'i silmek istediğine emin misin?',
|
||||||
|
'Stay logged in permanently' => 'Sürekli olarak girişli kal',
|
||||||
|
'When not set, you will get logged out at latest after 30 days' => 'Seçilmediği takdirde, en az 30 gün sonra otomatik olarak çıkış yapacaksınız',
|
||||||
|
'Filter by status' => 'Duruma göre filtrele',
|
||||||
|
'Below min. stock amount' => 'Min. stok miktarının altında',
|
||||||
|
'Expiring soon' => 'Son kullanma tarihi yakında doluyor',
|
||||||
|
'Already expired' => 'Son kullanma tarihi dolmuş',
|
||||||
|
'Due soon' => 'Tamamlanma süresi yakında',
|
||||||
|
'Overdue' => 'Tamamlanma süresi geçmiş',
|
||||||
|
'View settings' => 'Ayarlara bak',
|
||||||
|
'Auto reload on external changes' => 'Dış değişikliklerde otomatik olarak yenile',
|
||||||
|
'Enable night mode' => 'Gece modunu aktif et',
|
||||||
|
'Auto enable in time range' => 'Zaman aralığında otomatik olarak aktif et',
|
||||||
|
'From' => 'Tarafından',
|
||||||
|
'in format' => 'biçiminde',
|
||||||
|
'To' => 'İçin',
|
||||||
|
'Time range goes over midnight' => 'Zaman aralığı gece yarısını geçiyor',
|
||||||
|
'Product picture' => 'Ürün fotoğrafı',
|
||||||
|
'No file selected' => 'Hiçbir dosya seçilmedi',
|
||||||
|
'If you don\'t select a file, the current picture will not be altered' => 'Eğer herhangi bir dosya seçmezseniz, şimdiki fotoğraf değişmeyecek',
|
||||||
|
'Delete' => 'Sil',
|
||||||
|
'The current picture will be deleted when you save the product' => 'Ürünü kaydettiğiniz zaman şimdiki fotoğraf silinecek',
|
||||||
|
'Select file' => 'Dosya seç',
|
||||||
|
'Image of product #1' => '#1 ürününe ait fotoğraf',
|
||||||
|
'This product cannot be deleted because it is in stock, please remove the stock amount first.' => 'Bu ürün silinemiyor çünkü stoklarda var, lütfen öncelikle stok miktarını silin',
|
||||||
|
'Delete not possible' => 'Silme işlemi mümkün değil',
|
||||||
|
'Equipment' => 'Ekipman',
|
||||||
|
'Instruction manual' => 'Kullanım kılavuzu',
|
||||||
|
'The selected equipment has no instruction manual' => 'Seçili ekipmanın kullanım kılavuzu yok',
|
||||||
|
'Notes' => 'Notlar',
|
||||||
|
'Edit equipment' => 'Ekipmanı düzenle',
|
||||||
|
'Create equipment' => 'Ekipman oluştur',
|
||||||
|
'If you don\'t select a file, the current instruction manual will not be altered' => 'Eğer herhangi bir dosya seçmezseniz, şimdiki kullanım kılavuzu değişmeyecek',
|
||||||
|
'No instruction manual available' => 'Herhangi bir kullanım kılavuzu yok',
|
||||||
|
'The current instruction manual will be deleted when you save the equipment' => 'Ekipmanı kaydettiğiniz zaman şimdiki kullanım kılavuzu silinecek',
|
||||||
|
'No picture available' => 'Görsel mevcut değil',
|
||||||
|
'Filter by product group' => 'Ürün grubuna göre filtrele',
|
||||||
|
'Presets for new products' => 'Yeni ürünler için ön tanımlar',
|
||||||
|
'Included recipes' => 'Dahil edilmiş tarifler',
|
||||||
|
'A recipe is required' => 'Bir tarif gerekiyor',
|
||||||
|
'Add included recipe' => 'Dahil edilmiş tarif ekle',
|
||||||
|
'Edit included recipe' => 'Dahil edilmiş tarifi düzenle',
|
||||||
|
'Group' => 'Grup',
|
||||||
|
'This will be used as a headline to group ingredients together' => 'Bu, malzemeleri beraber gruplamak için başlık olarak kullanılacak',
|
||||||
|
'Journal' => 'Günlük',
|
||||||
|
'Stock journal' => 'Stok günlüğü',
|
||||||
|
'Filter by product' => 'Ürüne göre filtrele',
|
||||||
|
'Booking time' => 'Rezervasyon zamanı',
|
||||||
|
'Booking type' => 'Rezervasyon türü',
|
||||||
|
'Undo booking' => 'Rezervasyonu geri al',
|
||||||
|
'Undone on' => 'Tarihinde tamamlanmamış',
|
||||||
|
'Batteries journal' => 'Pil günlüğü',
|
||||||
|
'Filter by battery' => 'Pile göre filtrele',
|
||||||
|
'Undo charge cycle' => 'Şart döngüsünü geri al',
|
||||||
|
'Undo chore execution' => 'Ev işi uygulamasını geri al',
|
||||||
|
'Chore execution successfully undone' => 'Ev işi başarıyla geri alındı',
|
||||||
|
'Undo' => 'Geri al',
|
||||||
|
'Booking successfully undone' => 'Rezervasyon başarıyla geri alındı',
|
||||||
|
'Charge cycle successfully undone' => 'Şarj döngüsü başarıyla geri alındı',
|
||||||
|
'This cannot be negative and must be an integral number' => 'Bu, negatif olamaz ve bir tam sayı olmak zorunda',
|
||||||
|
'Disable stock fulfillment checking for this ingredient' => 'Bu malzeme için stok yenilemeyi kapat',
|
||||||
|
'Add all list items to stock' => 'Bütün liste maddelerini stoğa ekle',
|
||||||
|
'Add #3 #1 of #2 to stock' => '#3\'ün #1/#2\'sini stoğa ekle',
|
||||||
|
'Adding shopping list item #1 of #2' => 'Alışveriş listesi maddelerinin #1/#2\'si ekleniyor',
|
||||||
|
'Use a specific stock item' => 'Spesifik bir stok maddesi kullan',
|
||||||
|
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'Bu listedeki ilk madde ön tanımlı olarak "Süresi ilk dolan ilk, ondan sonra ilk giren ilk çıkar" mantığıyla seçilecektir',
|
||||||
|
'Mark #3 #1 of #2 as open' => '#3\'ün #1/#2\'sini açık olarak işaretle',
|
||||||
|
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'Ürün açık olarak işaretlendikten sonra, son kullanım tarihi bugün + belirtilen gün miktarı olarak güncellenecektir (0 değeri bunu kapatır)',
|
||||||
|
'Default best before days after opened' => 'Açıldıktan sonrası için ön tanımlı son kullanım tarihi',
|
||||||
|
'Marked #1 #2 of #3 as opened' => '#1\'in #2/#3\'ü açık olarak işaretlendi',
|
||||||
|
'Mark as opened' => 'Açıldı olarak işaretle',
|
||||||
|
'Expires on #1; Bought on #2' => '#1\'de son kullanım tarihi doluyor; #2\'de satın alındı',
|
||||||
|
'Not opened' => 'Açılmadı',
|
||||||
|
'Opened' => 'Açıldı',
|
||||||
|
'Mark #3 #1 of #2 as open' => '#3\'ün #1/#2\'sini açık olarak işaretle',
|
||||||
|
'#1 opened' => '#1 açıldı',
|
||||||
|
'Product expires' => 'Ürünün son kullanma tarihi doluyor',
|
||||||
|
'Task due' => 'Görev süresi',
|
||||||
|
'Chore due' => 'Ev işi süresi',
|
||||||
|
'Battery charge cycle due' => 'Pil şarj döngüsü süresi',
|
||||||
|
'Show clock in header' => 'Saati başlıkta göster',
|
||||||
|
'Stock settings' => 'Stok ayarları',
|
||||||
|
'Shopping list to stock workflow' => 'Alışveriş listesinden stok akışına',
|
||||||
|
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Eğer ürünün "ön tanımlı son kullanım tarihi" ayarlanmamışsa, otomatik olarak rezervasyonu son fiyatı ve alışveriş listesindeki madde sayısını baz alarak yap',
|
||||||
|
'Skip' => 'Geç',
|
||||||
|
'Servings' => 'Porsiyon',
|
||||||
|
'Costs' => 'Maliyet',
|
||||||
|
'Based on the prices of the last purchase per product' => 'Satın alınan her ürünün son satın alış fiyatlarına göre',
|
||||||
|
'The ingredients listed here result in this amount of servings' => 'Burada listelenen malzemelerle bu kadar porsiyon çıkıyor',
|
||||||
|
'Do not check against the shopping list when adding missing items to it' => 'Eksik malzemeleri eklerken alışveriş listesine karşı kontrol etme',
|
||||||
|
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'Varsayılan olarak alışveriş listesine eklenen miktar "gereken miktar - stok miktarı - alışveriş listesi miktarı" olarak hesaplanır. Bu aktif edildiği zaman sadece stok miktarına karşı kontrol yapılır ve alışveriş listesi kontrol edilmez.',
|
||||||
|
'Picture' => 'Resim',
|
||||||
|
'Uncheck ingredients to not put them on the shopping list' => 'Alışveriş listesine malzemeleri eklememek için işareti kaldırın',
|
||||||
|
'This is for statistical purposes only' => 'Bu sadece istatistiki amaçlar için',
|
||||||
|
'You have to select a recipe' => 'Bir tarif seçmelisiniz',
|
||||||
|
'Key type' => 'Key type',
|
||||||
|
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||||
|
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||||
|
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||||
|
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||||
|
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||||
|
'Tare weight' => 'Tare weight',
|
||||||
|
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||||
|
'You have to select a location' => 'You have to select a location',
|
||||||
|
'List' => 'List',
|
||||||
|
'Gallery' => 'Gallery',
|
||||||
|
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||||
|
);
|
@@ -44,6 +44,18 @@ class ApiKeyAuthMiddleware extends BaseMiddleware
|
|||||||
$validApiKey = false;
|
$validApiKey = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handling of special purpose API keys
|
||||||
|
if (!$validApiKey)
|
||||||
|
{
|
||||||
|
if ($routeName === 'calendar-ical')
|
||||||
|
{
|
||||||
|
if ($request->getQueryParam('secret') !== null && $apiKeyService->IsValidApiKey($request->getQueryParam('secret'), ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL))
|
||||||
|
{
|
||||||
|
$validApiKey = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!$validSession && !$validApiKey)
|
if (!$validSession && !$validApiKey)
|
||||||
{
|
{
|
||||||
define('GROCY_AUTHENTICATED', false);
|
define('GROCY_AUTHENTICATED', false);
|
||||||
|
@@ -29,6 +29,15 @@ FROM recipes_pos_old;
|
|||||||
|
|
||||||
DROP TABLE recipes_pos_old;
|
DROP TABLE recipes_pos_old;
|
||||||
|
|
||||||
|
DROP TRIGGER cascade_change_qu_id_stock;
|
||||||
|
CREATE TRIGGER cascade_change_qu_id_stock AFTER UPDATE ON products
|
||||||
|
BEGIN
|
||||||
|
UPDATE recipes_pos
|
||||||
|
SET qu_id = (SELECT qu_id_stock FROM products WHERE id = NEW.id)
|
||||||
|
WHERE product_id IN (SELECT id FROM products WHERE id = NEW.id)
|
||||||
|
AND only_check_single_unit_in_stock = 0;
|
||||||
|
END;
|
||||||
|
|
||||||
DROP VIEW recipes_fulfillment;
|
DROP VIEW recipes_fulfillment;
|
||||||
CREATE VIEW recipes_fulfillment
|
CREATE VIEW recipes_fulfillment
|
||||||
AS
|
AS
|
||||||
|
69
migrations/0047.sql
Normal file
69
migrations/0047.sql
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
DROP TRIGGER cascade_change_qu_id_stock;
|
||||||
|
CREATE TRIGGER cascade_change_qu_id_stock AFTER UPDATE ON products
|
||||||
|
BEGIN
|
||||||
|
UPDATE recipes_pos
|
||||||
|
SET qu_id = (SELECT qu_id_stock FROM products WHERE id = NEW.id)
|
||||||
|
WHERE product_id IN (SELECT id FROM products WHERE id = NEW.id)
|
||||||
|
AND only_check_single_unit_in_stock = 0;
|
||||||
|
END;
|
||||||
|
|
||||||
|
UPDATE recipes_pos
|
||||||
|
SET qu_id = (SELECT qu_id_stock FROM products WHERE id = recipes_pos.product_id)
|
||||||
|
WHERE only_check_single_unit_in_stock = 0;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_fulfillment
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END < 0 THEN ABS(IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount + amount_autoadded) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount + amount_autoadded) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
75
migrations/0048.sql
Normal file
75
migrations/0048.sql
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
PRAGMA legacy_alter_table = ON;
|
||||||
|
|
||||||
|
ALTER TABLE shopping_list RENAME TO shopping_list_old;
|
||||||
|
|
||||||
|
CREATE TABLE shopping_list (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
|
||||||
|
product_id INTEGER,
|
||||||
|
note TEXT,
|
||||||
|
amount INTEGER NOT NULL DEFAULT 0,
|
||||||
|
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO shopping_list
|
||||||
|
(product_id, amount, note, row_created_timestamp)
|
||||||
|
SELECT product_id, amount + amount_autoadded, note, row_created_timestamp
|
||||||
|
FROM shopping_list_old;
|
||||||
|
|
||||||
|
DROP TABLE shopping_list_old;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_fulfillment
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END < 0 THEN ABS(IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
69
migrations/0049.sql
Normal file
69
migrations/0049.sql
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
ALTER TABLE products
|
||||||
|
ADD allow_partial_units_in_stock TINYINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
PRAGMA legacy_alter_table = ON;
|
||||||
|
|
||||||
|
ALTER TABLE stock RENAME TO stock_old;
|
||||||
|
|
||||||
|
CREATE TABLE stock (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
|
||||||
|
product_id INTEGER NOT NULL,
|
||||||
|
amount DECIMAL(15, 2) NOT NULL,
|
||||||
|
best_before_date DATE,
|
||||||
|
purchased_date DATE DEFAULT (datetime('now', 'localtime')),
|
||||||
|
stock_id TEXT NOT NULL,
|
||||||
|
price DECIMAL(15, 2),
|
||||||
|
open TINYINT NOT NULL DEFAULT 0 CHECK(open IN (0, 1)),
|
||||||
|
opened_date DATETIME,
|
||||||
|
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO stock
|
||||||
|
(product_id, amount, best_before_date, purchased_date, stock_id, price, open, opened_date, row_created_timestamp)
|
||||||
|
SELECT product_id, amount, best_before_date, purchased_date, stock_id, price, open, opened_date, row_created_timestamp
|
||||||
|
FROM stock_old;
|
||||||
|
|
||||||
|
DROP TABLE stock_old;
|
||||||
|
|
||||||
|
ALTER TABLE stock_log RENAME TO stock_log_old;
|
||||||
|
|
||||||
|
CREATE TABLE stock_log (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
|
||||||
|
product_id INTEGER NOT NULL,
|
||||||
|
amount DECIMAL(15, 2) NOT NULL,
|
||||||
|
best_before_date DATE,
|
||||||
|
purchased_date DATE,
|
||||||
|
used_date DATE,
|
||||||
|
spoiled INTEGER NOT NULL DEFAULT 0,
|
||||||
|
stock_id TEXT NOT NULL,
|
||||||
|
transaction_type TEXT NOT NULL,
|
||||||
|
price DECIMAL(15, 2),
|
||||||
|
undone TINYINT NOT NULL DEFAULT 0 CHECK(undone IN (0, 1)),
|
||||||
|
undone_timestamp DATETIME,
|
||||||
|
opened_date DATETIME,
|
||||||
|
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO stock_log
|
||||||
|
(product_id, amount, best_before_date, purchased_date, used_date, spoiled, stock_id, transaction_type, price, undone, undone_timestamp, opened_date, row_created_timestamp)
|
||||||
|
SELECT product_id, amount, best_before_date, purchased_date, used_date, spoiled, stock_id, transaction_type, price, undone, undone_timestamp, opened_date, row_created_timestamp
|
||||||
|
FROM stock_log_old;
|
||||||
|
|
||||||
|
DROP TABLE stock_log_old;
|
||||||
|
|
||||||
|
ALTER TABLE shopping_list RENAME TO shopping_list_old;
|
||||||
|
|
||||||
|
CREATE TABLE shopping_list (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
|
||||||
|
product_id INTEGER,
|
||||||
|
note TEXT,
|
||||||
|
amount DECIMAL(15, 2) NOT NULL DEFAULT 0,
|
||||||
|
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO shopping_list
|
||||||
|
(product_id, amount, note, row_created_timestamp)
|
||||||
|
SELECT product_id, amount, note, row_created_timestamp
|
||||||
|
FROM shopping_list_old;
|
||||||
|
|
||||||
|
DROP TABLE shopping_list_old;
|
2
migrations/0050.sql
Normal file
2
migrations/0050.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE recipes
|
||||||
|
ADD picture_file_name TEXT;
|
15
migrations/0051.sql
Normal file
15
migrations/0051.sql
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
ALTER TABLE stock
|
||||||
|
ADD location_id INTEGER;
|
||||||
|
|
||||||
|
ALTER TABLE stock_log
|
||||||
|
ADD location_id INTEGER;
|
||||||
|
|
||||||
|
CREATE VIEW stock_current_locations
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
s.product_id,
|
||||||
|
IFNULL(s.location_id, p.location_id) AS location_id
|
||||||
|
FROM stock s
|
||||||
|
JOIN products p
|
||||||
|
ON s.product_id = p.id
|
||||||
|
GROUP BY s.product_id, IFNULL(s.location_id, p.location_id);
|
62
migrations/0052.sql
Normal file
62
migrations/0052.sql
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
ALTER TABLE recipes
|
||||||
|
ADD base_servings INTEGER DEFAULT 1;
|
||||||
|
|
||||||
|
ALTER TABLE recipes
|
||||||
|
ADD desired_servings INTEGER DEFAULT 1;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_fulfillment
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END)) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
59
migrations/0053.sql
Normal file
59
migrations/0053.sql
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
ALTER TABLE recipes
|
||||||
|
ADD not_check_shoppinglist TINYINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_fulfillment
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END)) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (CASE WHEN r.not_check_shoppinglist = 1 THEN 0 ELSE IFNULL(sl.amount, 0) END * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
79
migrations/0054.sql
Normal file
79
migrations/0054.sql
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
CREATE VIEW products_current_price
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
p.id AS product_id,
|
||||||
|
IFNULL(sl.price, 0) AS last_price
|
||||||
|
FROM products p
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, MAX(id) AS newest_Id
|
||||||
|
FROM stock_log
|
||||||
|
WHERE undone = 0
|
||||||
|
AND transaction_type = 'purchase'
|
||||||
|
GROUP BY product_id
|
||||||
|
) slg
|
||||||
|
ON p.id = slg.product_id
|
||||||
|
LEFT JOIN stock_log sl
|
||||||
|
ON slg.newest_id = sl.id;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_fulfillment
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END)) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (CASE WHEN r.not_check_shoppinglist = 1 THEN 0 ELSE IFNULL(sl.amount, 0) END * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings / r.base_servings) END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings / r.base_servings) END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON r.id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
2
migrations/0055.sql
Normal file
2
migrations/0055.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE stock_log
|
||||||
|
ADD recipe_id INTEGER;
|
2
migrations/0056.sql
Normal file
2
migrations/0056.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE api_keys
|
||||||
|
ADD key_type TEXT NOT NULL DEFAULT 'default';
|
5
migrations/0057.sql
Normal file
5
migrations/0057.sql
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
ALTER TABLE products
|
||||||
|
ADD enable_tare_weight_handling TINYINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
ALTER TABLE products
|
||||||
|
ADD tare_weight REAL NOT NULL DEFAULT 0;
|
109
migrations/0058.sql
Normal file
109
migrations/0058.sql
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
ALTER TABLE recipes_nestings
|
||||||
|
ADD servings INTEGER DEFAULT 1;
|
||||||
|
|
||||||
|
DROP VIEW recipes_nestings_resolved;
|
||||||
|
CREATE VIEW recipes_nestings_resolved
|
||||||
|
AS
|
||||||
|
WITH RECURSIVE r1(recipe_id, includes_recipe_id, includes_servings)
|
||||||
|
AS (
|
||||||
|
SELECT id, id, 1
|
||||||
|
FROM recipes
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT rn.recipe_id, r1.includes_recipe_id, rn.servings
|
||||||
|
FROM recipes_nestings rn, r1 r1
|
||||||
|
WHERE rn.includes_recipe_id = r1.recipe_id
|
||||||
|
LIMIT 100 -- This is just a safety limit to prevent infinite loops due to infinite nested recipes
|
||||||
|
)
|
||||||
|
SELECT *
|
||||||
|
FROM r1;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment;
|
||||||
|
CREATE VIEW recipes_pos_resolved
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) * rnr.includes_servings AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) * rnr.includes_servings END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) * rnr.includes_servings END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) * rnr.includes_servings END)) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (CASE WHEN r.not_check_shoppinglist = 1 THEN 0 ELSE IFNULL(sl.amount, 0) END * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) * (r.desired_servings / r.base_servings) * rnr.includes_servings END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings / r.base_servings) * rnr.includes_servings END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||||
|
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||||
|
rp.ingredient_group,
|
||||||
|
rp.id, -- Just a dummy id column
|
||||||
|
rnr.includes_recipe_id as child_recipe_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_nestings_resolved rnr
|
||||||
|
ON r.id = rnr.recipe_id
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON rnr.includes_recipe_id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings / r.base_servings) * rnr.includes_servings AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings / r.base_servings) * rnr.includes_servings END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||||
|
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||||
|
rp.ingredient_group,
|
||||||
|
rp.id, -- Just a dummy id column
|
||||||
|
rnr.includes_recipe_id as child_recipe_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_nestings_resolved rnr
|
||||||
|
ON r.id = rnr.recipe_id
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON rnr.includes_recipe_id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
||||||
|
|
||||||
|
DROP VIEW recipes_fulfillment_sum;
|
||||||
|
CREATE VIEW recipes_resolved
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
IFNULL(MIN(rpr.need_fulfilled), 1) AS need_fulfilled,
|
||||||
|
IFNULL(MIN(rpr.need_fulfilled_with_shopping_list), 1) AS need_fulfilled_with_shopping_list,
|
||||||
|
(SELECT COUNT(*) FROM recipes_pos_resolved WHERE recipe_id = r.id AND need_fulfilled = 0) AS missing_products_count,
|
||||||
|
SUM(rpr.costs) AS costs
|
||||||
|
FROM recipes r
|
||||||
|
LEFT JOIN recipes_pos_resolved rpr
|
||||||
|
ON r.id = rpr.recipe_id
|
||||||
|
GROUP BY r.id;
|
91
migrations/0059.sql
Normal file
91
migrations/0059.sql
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
DROP VIEW recipes_pos_resolved;
|
||||||
|
CREATE VIEW recipes_pos_resolved
|
||||||
|
AS
|
||||||
|
|
||||||
|
-- Multiplication by 1.0 to force conversion to float (REAL)
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END)) ELSE 0 END AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
CASE WHEN IFNULL(sc.amount, 0) + (CASE WHEN r.not_check_shoppinglist = 1 THEN 0 ELSE IFNULL(sl.amount, 0) END * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||||
|
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||||
|
rp.ingredient_group,
|
||||||
|
rp.id, -- Just a dummy id column
|
||||||
|
rnr.includes_recipe_id as child_recipe_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_nestings_resolved rnr
|
||||||
|
ON r.id = rnr.recipe_id
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON rnr.includes_recipe_id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 0
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
rp.id AS recipe_pos_id,
|
||||||
|
rp.product_id AS product_id,
|
||||||
|
rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 AS recipe_amount,
|
||||||
|
IFNULL(sc.amount, 0) AS stock_amount,
|
||||||
|
1 AS need_fulfilled,
|
||||||
|
0 AS missing_amount,
|
||||||
|
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||||
|
1 AS need_fulfilled_with_shopping_list,
|
||||||
|
rp.qu_id,
|
||||||
|
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||||
|
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||||
|
rp.ingredient_group,
|
||||||
|
rp.id, -- Just a dummy id column
|
||||||
|
rnr.includes_recipe_id as child_recipe_id
|
||||||
|
FROM recipes r
|
||||||
|
JOIN recipes_nestings_resolved rnr
|
||||||
|
ON r.id = rnr.recipe_id
|
||||||
|
JOIN recipes_pos rp
|
||||||
|
ON rnr.includes_recipe_id = rp.recipe_id
|
||||||
|
JOIN products p
|
||||||
|
ON rp.product_id = p.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT product_id, SUM(amount) AS amount
|
||||||
|
FROM shopping_list
|
||||||
|
GROUP BY product_id) sl
|
||||||
|
ON rp.product_id = sl.product_id
|
||||||
|
LEFT JOIN stock_current sc
|
||||||
|
ON rp.product_id = sc.product_id
|
||||||
|
LEFT JOIN products_current_price pcp
|
||||||
|
ON rp.product_id = pcp.product_id
|
||||||
|
WHERE rp.not_check_stock_fulfillment = 1;
|
||||||
|
|
||||||
|
DROP VIEW recipes_resolved;
|
||||||
|
CREATE VIEW recipes_resolved
|
||||||
|
AS
|
||||||
|
SELECT
|
||||||
|
r.id AS recipe_id,
|
||||||
|
IFNULL(MIN(rpr.need_fulfilled), 1) AS need_fulfilled,
|
||||||
|
IFNULL(MIN(rpr.need_fulfilled_with_shopping_list), 1) AS need_fulfilled_with_shopping_list,
|
||||||
|
(SELECT COUNT(*) FROM recipes_pos_resolved WHERE recipe_id = r.id AND need_fulfilled = 0) AS missing_products_count,
|
||||||
|
IFNULL(SUM(rpr.costs), 0) AS costs
|
||||||
|
FROM recipes r
|
||||||
|
LEFT JOIN recipes_pos_resolved rpr
|
||||||
|
ON r.id = rpr.recipe_id
|
||||||
|
GROUP BY r.id;
|
22
package.json
22
package.json
@@ -3,32 +3,32 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@danielfarrell/bootstrap-combobox": "https://github.com/berrnd/bootstrap-combobox.git#master",
|
"@danielfarrell/bootstrap-combobox": "https://github.com/berrnd/bootstrap-combobox.git#master",
|
||||||
"@fortawesome/fontawesome-free": "^5.1.0",
|
"@fortawesome/fontawesome-free": "^5.7.2",
|
||||||
"TagManager": "https://github.com/max-favilli/tagmanager.git#3.0.2",
|
"TagManager": "https://github.com/max-favilli/tagmanager.git#3.0.2",
|
||||||
"bootbox": "https://github.com/makeusabrew/bootbox.git#v5.x",
|
"bootbox": "https://github.com/makeusabrew/bootbox.git#v5.x",
|
||||||
"bootstrap": "^4.1.1",
|
"bootstrap": "^4.3.1",
|
||||||
"chart.js": "^2.7.2",
|
"chart.js": "^2.7.3",
|
||||||
"datatables.net": "^1.10.19",
|
"datatables.net": "^1.10.19",
|
||||||
"datatables.net-bs4": "^1.10.19",
|
"datatables.net-bs4": "^1.10.19",
|
||||||
"datatables.net-colreorder": "^1.5.1",
|
"datatables.net-colreorder": "^1.5.1",
|
||||||
"datatables.net-colreorder-bs4": "^1.5.1",
|
"datatables.net-colreorder-bs4": "^1.5.1",
|
||||||
"datatables.net-responsive": "^2.2.3",
|
"datatables.net-responsive": "^2.2.3",
|
||||||
"datatables.net-responsive-bs4": "^2.2.3",
|
"datatables.net-responsive-bs4": "^2.2.3",
|
||||||
"datatables.net-rowgroup": "^1.0.4",
|
"datatables.net-rowgroup": "^1.1.0",
|
||||||
"datatables.net-rowgroup-bs4": "^1.0.4",
|
"datatables.net-rowgroup-bs4": "^1.0.4",
|
||||||
"datatables.net-select": "^1.2.7",
|
"datatables.net-select": "^1.2.7",
|
||||||
"datatables.net-select-bs4": "^1.2.7",
|
"datatables.net-select-bs4": "^1.2.7",
|
||||||
"fullcalendar": "^3.9.0",
|
"fullcalendar": "^3.10.0",
|
||||||
"jquery": "^3.3.1",
|
"jquery": "^3.3.1",
|
||||||
"jquery-serializejson": "^2.8.1",
|
"jquery-serializejson": "^2.9.0",
|
||||||
"jquery-ui-dist": "^1.12.1",
|
"jquery-ui-dist": "^1.12.1",
|
||||||
"moment": "^2.22.2",
|
"moment": "^2.24.0",
|
||||||
"startbootstrap-sb-admin": "^4.0.0",
|
"startbootstrap-sb-admin": "^4.0.0",
|
||||||
"summernote": "^0.8.10",
|
"summernote": "^0.8.11",
|
||||||
"swagger-ui-dist": "^3.17.3",
|
"swagger-ui-dist": "^3.21.0",
|
||||||
"tagmanager": "https://github.com/max-favilli/tagmanager.git#3.0.2",
|
"tagmanager": "https://github.com/max-favilli/tagmanager.git#3.0.2",
|
||||||
"tempusdominus-bootstrap-4": "^5.1.2",
|
"tempusdominus-bootstrap-4": "https://github.com/berrnd/tempusdominus-bootstrap-4.git#master",
|
||||||
"timeago": "^1.6.3",
|
"timeago": "^1.6.5",
|
||||||
"toastr": "^2.1.4"
|
"toastr": "^2.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -168,9 +168,19 @@ input::-webkit-inner-spin-button {
|
|||||||
cursor: wait;
|
cursor: wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Third party component customizations - Bootstrap */
|
||||||
|
|
||||||
|
/* Hide the form validation feedback icons introduced in Bootstrap 4.2.0 - a colored border is enough */
|
||||||
|
.form-control.is-invalid,
|
||||||
|
.was-validated .form-control:invalid,
|
||||||
|
.form-control.is-valid,
|
||||||
|
.was-validated .form-control:valid {
|
||||||
|
background-size: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Third party component customizations - DataTables */
|
/* Third party component customizations - DataTables */
|
||||||
td {
|
td {
|
||||||
vertical-align: middle !important;
|
vertical-align: middle !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table td.fit-content,
|
.table td.fit-content,
|
||||||
|
BIN
public/img/appicons/android-chrome-192x192.png
Normal file
BIN
public/img/appicons/android-chrome-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.9 KiB |
BIN
public/img/appicons/android-chrome-512x512.png
Normal file
BIN
public/img/appicons/android-chrome-512x512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
BIN
public/img/appicons/apple-touch-icon.png
Normal file
BIN
public/img/appicons/apple-touch-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
9
public/img/appicons/browserconfig.xml
Normal file
9
public/img/appicons/browserconfig.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<browserconfig>
|
||||||
|
<msapplication>
|
||||||
|
<tile>
|
||||||
|
<square150x150logo src="mstile-150x150.png"/>
|
||||||
|
<TileColor>#e5e5e5</TileColor>
|
||||||
|
</tile>
|
||||||
|
</msapplication>
|
||||||
|
</browserconfig>
|
BIN
public/img/appicons/favicon-16x16.png
Normal file
BIN
public/img/appicons/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 948 B |
BIN
public/img/appicons/favicon-32x32.png
Normal file
BIN
public/img/appicons/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user