├── .changelog ├── current │ ├── 2711-fix-microdata-parser.md │ └── 2712-eslint-import-resolver.md ├── prefix.md └── versions │ ├── v0.10.0.md │ ├── v0.10.1.md │ ├── v0.10.2.md │ ├── v0.10.3.md │ ├── v0.11.0.md │ ├── v0.11.1.md │ ├── v0.11.2.md │ ├── v0.11.3.md │ ├── v0.7.10.md │ ├── v0.7.6.md │ ├── v0.7.7.md │ ├── v0.7.8.md │ ├── v0.7.9.md │ ├── v0.8.0.md │ ├── v0.8.1.md │ ├── v0.8.2.md │ ├── v0.8.3.md │ ├── v0.8.4.md │ ├── v0.9.0.md │ ├── v0.9.1.md │ ├── v0.9.10.md │ ├── v0.9.11.md │ ├── v0.9.12.md │ ├── v0.9.13.md │ ├── v0.9.14.md │ ├── v0.9.15.md │ ├── v0.9.16.md │ ├── v0.9.17.md │ ├── v0.9.2.md │ ├── v0.9.3.md │ ├── v0.9.4.md │ ├── v0.9.5.md │ ├── v0.9.6.md │ ├── v0.9.7.md │ ├── v0.9.8.md │ └── v0.9.9.md ├── .codecov.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc.yml ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── feature_request.md │ └── website_support.md ├── actions │ ├── backport │ │ └── backport.sh │ ├── check-todo │ │ ├── action.yml │ │ └── check.sh │ ├── deploy │ │ ├── appinfo │ │ │ └── info.xml.dist │ │ ├── last_release │ │ ├── major │ │ ├── minor │ │ ├── patch │ │ ├── stable_name │ │ ├── trunk_name │ │ └── update-data.sh │ ├── php-linter │ │ ├── Dockerfile │ │ └── tester.sh │ └── run-tests │ │ ├── .env │ │ ├── .gitignore │ │ ├── README.md │ │ ├── action.yml │ │ ├── config │ │ ├── apache │ │ │ └── httpd.conf │ │ ├── nginx │ │ │ └── conf.d │ │ │ │ └── default.conf │ │ └── www │ │ │ ├── 000-default.conf │ │ │ └── apache2.conf │ │ ├── docker-compose.yml │ │ ├── extract-annotations.py │ │ ├── mysql.env │ │ ├── mysql │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ │ ├── postgres.env │ │ ├── postgres │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ │ ├── requirements.txt │ │ ├── reset-from-container.sh │ │ ├── run-locally.py │ │ ├── run-locally.sh │ │ ├── run-occ.sh │ │ ├── scripts │ │ ├── enable_app_install_script.php │ │ ├── set_custom_apps_path.php │ │ └── set_debug_mode.php │ │ ├── test_runner │ │ ├── .gitignore │ │ ├── __init__.py │ │ ├── argument_parser.py │ │ ├── ci_printer.py │ │ ├── config.py │ │ ├── coverate_rotation.py │ │ ├── db.py │ │ ├── docker_helper.py │ │ ├── docker_management.py │ │ ├── dumps.py │ │ ├── proc.py │ │ ├── runner.py │ │ ├── test_env.py │ │ └── timer.py │ │ ├── tests │ │ ├── Dockerfile │ │ ├── entrypoints │ │ │ ├── default-entrypoint.sh │ │ │ ├── fpm.sh │ │ │ ├── minimal-default-entrypoint.sh │ │ │ ├── occ.sh │ │ │ └── test.sh │ │ ├── install-composer.sh │ │ ├── install-gd.sh │ │ ├── install-php-ini.sh │ │ ├── install-sudoers.sh │ │ ├── style.sed │ │ ├── xdebug.config │ │ └── zz-php-fpm-user.conf │ │ └── www │ │ └── Dockerfile ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── build-test-images.yml │ ├── dependabot-approve-merge.yml │ ├── depending-issues.yml │ ├── deploy-appstore.yml │ ├── pages.yml │ ├── publish-test-results.yml │ ├── pull-checks.yml │ ├── slack-commands.yaml │ ├── stale.yml │ └── tests.yml ├── .gitignore ├── .helpers ├── appstore │ ├── .gitignore │ ├── URL │ └── query-request.sh ├── changelog │ ├── .gitignore │ ├── Pipfile │ ├── Pipfile.lock │ ├── changelog_builder │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── cli.py │ │ ├── github.py │ │ └── parser.py │ ├── create-changelog-prerelease.sh │ └── create-changelog-release.sh └── release │ └── create-release.sh ├── .hook-checkout ├── .gitignore └── README.md ├── .hooks ├── README.md ├── pre-commit └── pre-push ├── .img ├── BrowserStack.png ├── BrowserStack.svg └── blackfire-io.png ├── .l10nignore ├── .php-cs-fixer.dist.php ├── .prettierignore ├── .prettierrc.json ├── .tx ├── backport └── config ├── .vscode ├── launch.json └── settings.json ├── CHANGELOG.md ├── COPYING ├── DEVELOPMENT.md ├── LICENSE ├── Makefile ├── README.md ├── appinfo ├── info.xml └── routes.php ├── assets └── alarm-continuous.mp3 ├── babel.config.js ├── composer.json ├── composer.lock ├── cookbook.code-workspace ├── docs ├── .bundle │ └── config ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── Makefile ├── Makefile.local.dist ├── _config.yml ├── admin │ └── index.md ├── assets │ ├── app-icon.png │ ├── app-icon.svg │ ├── icon256x256-dark.png │ ├── icon256x256.png │ └── screenshot.png ├── contact.md ├── dev │ ├── api │ │ ├── 0.0.2 │ │ │ ├── index.html │ │ │ ├── openapi-cookbook.yaml │ │ │ └── swagger-initializer.js │ │ ├── 0.0.3 │ │ │ ├── index.html │ │ │ ├── openapi-cookbook.yaml │ │ │ └── swagger-initializer.js │ │ ├── 0.0.4 │ │ │ ├── index.html │ │ │ ├── openapi-cookbook.yaml │ │ │ └── swagger-initializer.js │ │ ├── 0.1.0 │ │ │ ├── index.html │ │ │ ├── internal-cookbook.yaml │ │ │ ├── internal.html │ │ │ ├── objects.yaml │ │ │ ├── openapi-cookbook.yaml │ │ │ ├── swagger-initializer-internal.js │ │ │ └── swagger-initializer.js │ │ ├── 0.1.1 │ │ │ ├── index.html │ │ │ ├── internal-cookbook.yaml │ │ │ ├── internal.html │ │ │ ├── objects.yaml │ │ │ ├── openapi-cookbook.yaml │ │ │ ├── swagger-initializer-internal.js │ │ │ └── swagger-initializer.js │ │ ├── 0.1.2 │ │ │ ├── index.html │ │ │ ├── internal-cookbook.yaml │ │ │ ├── internal.html │ │ │ ├── objects.yaml │ │ │ ├── openapi-cookbook.yaml │ │ │ ├── swagger-initializer-internal.js │ │ │ └── swagger-initializer.js │ │ ├── changelog │ │ │ └── 0.md │ │ ├── index.md │ │ └── swagger │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ ├── oauth2-redirect.html │ │ │ ├── swagger-initializer.js │ │ │ ├── swagger-ui-bundle.js │ │ │ ├── swagger-ui-bundle.js.map │ │ │ ├── swagger-ui-es-bundle-core.js │ │ │ ├── swagger-ui-es-bundle-core.js.map │ │ │ ├── swagger-ui-es-bundle.js │ │ │ ├── swagger-ui-es-bundle.js.map │ │ │ ├── swagger-ui-standalone-preset.js │ │ │ ├── swagger-ui-standalone-preset.js.map │ │ │ ├── swagger-ui-version │ │ │ ├── swagger-ui.css │ │ │ ├── swagger-ui.css.map │ │ │ ├── swagger-ui.js │ │ │ └── swagger-ui.js.map │ ├── assets │ │ └── use-dev-build │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ ├── 04.png │ │ │ ├── 05.png │ │ │ └── 06.png │ ├── changelog.md │ ├── contributing │ │ ├── code_coverage.md │ │ ├── index.md │ │ └── setup.md │ ├── deployment.md │ ├── docs.md │ ├── frontend │ │ ├── assets │ │ │ ├── confirmation-hot-reload.png │ │ │ ├── hot-reload.mp4 │ │ │ └── webpack-bundle-analyzer_example.png │ │ ├── hot-reload.md │ │ ├── logging.md │ │ └── webpack-bundle-analyzer.md │ ├── index.md │ ├── misc │ │ └── automated-testing │ │ │ ├── backend │ │ │ ├── fixtures.md │ │ │ ├── index.md │ │ │ └── xdebug.md │ │ │ └── index.md │ └── use-autobuild.md ├── favicon.ico ├── index.md └── user │ ├── assets │ ├── create_import-fr.png │ ├── create_import.png │ ├── keywords-and-categories-fr.png │ ├── keywords-and-categories.png │ ├── keywords-and-categories.xcf │ ├── screen_structure-fr.png │ ├── screen_structure.png │ ├── settings-fr.png │ └── settings.png │ ├── clients │ ├── Index.md │ └── img │ │ ├── f-droid.png │ │ ├── g-play.png │ │ └── ios-store.svg │ ├── index-fr.md │ ├── index.md │ └── metadata.md ├── img ├── app.svg ├── favicon-api.png ├── favicon-api.svg ├── favicon-doc.png ├── favicon-doc.svg ├── favicon-large.png ├── favicon.png ├── favicon.svg ├── recipe-thumb16.jpg ├── recipe.svg ├── screenshot1.png ├── screenshot1_small.png └── screenshot2.png ├── jest.config.js ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── bg.js ├── bg.json ├── bn_BD.js ├── bn_BD.json ├── br.js ├── br.json ├── bs.js ├── bs.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── cy_GB.js ├── cy_GB.json ├── da.js ├── da.json ├── de.js ├── de.json ├── de_DE.js ├── de_DE.json ├── el.js ├── el.json ├── en_GB.js ├── en_GB.json ├── eo.js ├── eo.json ├── es.js ├── es.json ├── es_419.js ├── es_419.json ├── es_AR.js ├── es_AR.json ├── es_CL.js ├── es_CL.json ├── es_CO.js ├── es_CO.json ├── es_CR.js ├── es_CR.json ├── es_DO.js ├── es_DO.json ├── es_EC.js ├── es_EC.json ├── es_GT.js ├── es_GT.json ├── es_HN.js ├── es_HN.json ├── es_MX.js ├── es_MX.json ├── es_NI.js ├── es_NI.json ├── es_PA.js ├── es_PA.json ├── es_PE.js ├── es_PE.json ├── es_PR.js ├── es_PR.json ├── es_PY.js ├── es_PY.json ├── es_SV.js ├── es_SV.json ├── es_UY.js ├── es_UY.json ├── et_EE.js ├── et_EE.json ├── eu.js ├── eu.json ├── fa.js ├── fa.json ├── fi.js ├── fi.json ├── fr.js ├── fr.json ├── ga.js ├── ga.json ├── gd.js ├── gd.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── ia.js ├── ia.json ├── id.js ├── id.json ├── is.js ├── is.json ├── it.js ├── it.json ├── ja.js ├── ja.json ├── ka.js ├── ka.json ├── ka_GE.js ├── ka_GE.json ├── kab.js ├── kab.json ├── km.js ├── km.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lo.js ├── lo.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── nb.js ├── nb.json ├── nl.js ├── nl.json ├── nn_NO.js ├── nn_NO.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── pt_BR.js ├── pt_BR.json ├── pt_PT.js ├── pt_PT.json ├── ro.js ├── ro.json ├── ru.js ├── ru.json ├── sc.js ├── sc.json ├── si.js ├── si.json ├── sk.js ├── sk.json ├── sl.js ├── sl.json ├── sq.js ├── sq.json ├── sr.js ├── sr.json ├── sr@latin.js ├── sr@latin.json ├── sv.js ├── sv.json ├── ta.js ├── ta.json ├── th.js ├── th.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── uz.js ├── uz.json ├── vi.js ├── vi.json ├── zh_CN.js ├── zh_CN.json ├── zh_HK.js ├── zh_HK.json ├── zh_TW.js └── zh_TW.json ├── lib ├── AppInfo │ └── Application.php ├── Controller │ ├── CategoryApiController.php │ ├── CategoryController.php │ ├── ConfigApiController.php │ ├── ConfigController.php │ ├── Implementation │ │ ├── CategoryImplementation.php │ │ ├── ConfigImplementation.php │ │ ├── KeywordImplementation.php │ │ └── RecipeImplementation.php │ ├── KeywordApiController.php │ ├── KeywordController.php │ ├── MainController.php │ ├── RecipeApiController.php │ ├── RecipeController.php │ └── UtilApiController.php ├── Db │ └── RecipeDb.php ├── Exception │ ├── CouldNotGuessEncodingException.php │ ├── HtmlParsingException.php │ ├── ImportException.php │ ├── InvalidDurationException.php │ ├── InvalidJSONFileException.php │ ├── InvalidRecipeException.php │ ├── InvalidThumbnailTypeException.php │ ├── InvalidTimestampException.php │ ├── NoDownloadWasCarriedOutException.php │ ├── NoRecipeImageFoundException.php │ ├── NoRecipeNameGivenException.php │ ├── RecipeExistsException.php │ ├── RecipeImageExistsException.php │ ├── UserFolderNotValidException.php │ ├── UserFolderNotWritableException.php │ └── UserNotLoggedInException.php ├── Helper │ ├── AcceptHeaderParsingHelper.php │ ├── DownloadEncodingHelper.php │ ├── DownloadHelper.php │ ├── EncodingGuessingHelper.php │ ├── FileSystem │ │ └── RecipeNameHelper.php │ ├── Filter │ │ ├── DB │ │ │ ├── AbstractRecipeFilter.php │ │ │ ├── NormalizeRecipeFileFilter.php │ │ │ ├── RecipeDatesFilter.php │ │ │ └── RecipeNameLengthFilter.php │ │ ├── JSON │ │ │ ├── AbstractJSONFilter.php │ │ │ ├── CleanCategoryFilter.php │ │ │ ├── ExtractImageUrlFilter.php │ │ │ ├── FixDescriptionFilter.php │ │ │ ├── FixDurationsFilter.php │ │ │ ├── FixImageSchemeFilter.php │ │ │ ├── FixIngredientsFilter.php │ │ │ ├── FixInstructionsFilter.php │ │ │ ├── FixKeywordsFilter.php │ │ │ ├── FixNutritionFilter.php │ │ │ ├── FixRecipeYieldFilter.php │ │ │ ├── FixTimestampsFilter.php │ │ │ ├── FixToolsFilter.php │ │ │ ├── FixUrlFilter.php │ │ │ ├── JSONFilter.php │ │ │ ├── RecipeIdCopyFilter.php │ │ │ ├── RecipeIdTypeFilter.php │ │ │ ├── RecipeNameFilter.php │ │ │ ├── SchemaConformityFilter.php │ │ │ ├── TimestampFixFilter.php │ │ │ └── TimezoneFixFilter.php │ │ └── Output │ │ │ ├── EnsureNutritionPresentFilter.php │ │ │ ├── RecipeJSONOutputFilter.php │ │ │ └── RecipeStubFilter.php │ ├── HTMLFilter │ │ ├── AbstractHtmlFilter.php │ │ ├── HtmlEncodingFilter.php │ │ └── HtmlEntityDecodeFilter.php │ ├── HTMLParser │ │ ├── AbstractHtmlParser.php │ │ ├── AttributeNotFoundException.php │ │ ├── HttpJsonLdParser.php │ │ └── HttpMicrodataParser.php │ ├── HtmlToDomParser.php │ ├── ISO8601DurationHelper.php │ ├── ImageService │ │ ├── ImageFileHelper.php │ │ ├── ImageGenerationHelper.php │ │ ├── ImageSize.php │ │ └── ThumbnailFileHelper.php │ ├── RestParameterParser.php │ ├── TextCleanupHelper.php │ ├── TimestampHelper.php │ ├── UserConfigHelper.php │ └── UserFolderHelper.php ├── Migration │ ├── Version000000Date20190312140601.php │ ├── Version000000Date20190910100911.php │ ├── Version000000Date20190910223344.php │ ├── Version000000Date20200315121603.php │ ├── Version000000Date20210427082010.php │ ├── Version000000Date20210701093123.php │ ├── Version000000Date20220703174647.php │ └── Version000000Date20241010200522.php ├── Search │ └── Provider.php └── Service │ ├── DbCacheService.php │ ├── HtmlDownloadService.php │ ├── ImageService.php │ ├── JsonService.php │ ├── RecipeExtractionService.php │ ├── RecipeService.php │ └── ThumbnailService.php ├── package-lock.json ├── package.json ├── phpunit.integration.xml ├── phpunit.migration.xml ├── phpunit.xml ├── psalm.xml ├── src ├── bus │ └── index.js ├── components │ ├── AppControls │ │ ├── AppControls.vue │ │ ├── LocationIndicator.vue │ │ └── ModeIndicator.vue │ ├── AppIndex.vue │ ├── AppInvalidGuest.vue │ ├── AppMain.vue │ ├── AppNavi.vue │ ├── FormComponents │ │ ├── EditImageField.vue │ │ ├── EditInputField.vue │ │ ├── EditInputGroup.vue │ │ ├── EditMultiselect.vue │ │ ├── EditMultiselectInputGroup.vue │ │ └── EditTimeField.vue │ ├── List │ │ ├── EmptyList.vue │ │ ├── RecipeCard.vue │ │ ├── RecipeFilterControlsInline.vue │ │ ├── RecipeFilterControlsModal.vue │ │ ├── RecipeList.vue │ │ ├── RecipeListKeywordCloud.vue │ │ └── RecipeSortSelect.vue │ ├── Modals │ │ ├── SettingsDialog.vue │ │ ├── SimpleAlertModal.vue │ │ ├── SimpleConfirmModal.vue │ │ └── SuggestionsPopup.vue │ ├── NotFound.vue │ ├── RecipeEdit.vue │ ├── RecipeKeyword.vue │ ├── RecipeView │ │ ├── RecipeImages.vue │ │ ├── RecipeIngredient.vue │ │ ├── RecipeInstruction.vue │ │ ├── RecipeNutritionInfoItem.vue │ │ ├── RecipeTimer.vue │ │ ├── RecipeTool.vue │ │ └── RecipeView.vue │ ├── SearchResults.vue │ └── Utilities │ │ ├── LazyPicture.vue │ │ ├── LoadingIndicator.vue │ │ └── ToggleIconButton.vue ├── composables │ ├── dateTimeHandling │ │ └── index.js │ ├── useDelayedDisplay │ │ └── index.js │ ├── useIsMobile │ │ └── index.js │ ├── useRecipeFilterControls │ │ └── index.js │ ├── useSettingsDialog │ │ └── index.js │ └── useSuggestionsPopup │ │ └── index.js ├── guest.ts ├── js │ ├── LogicOperators │ │ ├── AndOperator.js │ │ ├── BinaryOperator.js │ │ ├── OrOperator.js │ │ └── index.js │ ├── RecipeFilters │ │ ├── RecipeCategoriesFilter.js │ │ ├── RecipeFilter.js │ │ ├── RecipeKeywordsFilter.js │ │ ├── RecipeNamesFilter.js │ │ └── index.js │ ├── api-interface.js │ ├── helper.js │ ├── logging.js │ ├── modals.js │ ├── title-rename.js │ ├── utils │ │ ├── applyRecipeFilters.js │ │ └── string-utils.js │ └── yieldCalculator.js ├── main.ts ├── router │ └── index.ts ├── shims-tsx.d.ts ├── shims-vue.d.ts ├── store │ ├── .eslintrc.yml │ └── index.ts └── tests │ ├── .eslintrc.yml │ └── unit │ ├── RecipeFilters │ ├── RecipeCategoriesFilter.test.js │ ├── RecipeKeywordsFilter.test.js │ └── RecipeNamesFilter.test.js │ └── utils │ └── applyRecipeFilters.test.js ├── stylelint.config.js ├── templates ├── index.php └── invalid_guest.php ├── tests ├── Integration │ ├── AbstractDatabaseTestCase.php │ ├── Db │ │ └── RecipeDb │ │ │ ├── RecipeDbBigTest.php │ │ │ └── RecipeDbTest.php │ └── Helper │ │ ├── DownloadHelper │ │ ├── DownloadHelperTest.php │ │ └── res │ │ │ ├── content-type.php │ │ │ └── htaccess │ │ └── Filter │ │ └── JSON │ │ ├── FixIngredientsFilterTest.php │ │ ├── FixInstructionsFilterTest.php │ │ ├── FixToolsFilterTest.php │ │ └── RecipeFixIdsTest.php ├── Migration │ ├── AppTest.php │ └── Setup │ │ └── Migrations │ │ ├── AbstractMigrationTestCase.php │ │ ├── Version000000Date20190312140601Test.php │ │ ├── Version000000Date20190910100911Test.php │ │ ├── Version000000Date20190910223344Test.php │ │ ├── Version000000Date20200315121603Test.php │ │ ├── Version000000Date20210427082010Test.php │ │ ├── Version000000Date20210701093123Test.php │ │ ├── Version000000Date20220703174647Test.php │ │ └── Version000000Date20241010200522Test.php ├── Unit │ ├── Controller │ │ ├── AbstractControllerTestCase.php │ │ ├── CategoryApiControllerTest.php │ │ ├── CategoryControllerTest.php │ │ ├── ConfigApiControllerTest.php │ │ ├── ConfigControllerTest.php │ │ ├── Implementation │ │ │ ├── CategoryImplementationTest.php │ │ │ ├── ConfigImplementationTest.php │ │ │ ├── KeywordImplementationTest.php │ │ │ └── RecipeImplementationTest.php │ │ ├── KeywordApiControllerTest.php │ │ ├── KeywordControllerTest.php │ │ ├── MainControllerTest.php │ │ ├── RecipeApiControllerTest.php │ │ ├── RecipeControllerTest.php │ │ └── UtilApiControllerTest.php │ ├── Helper │ │ ├── AcceptHeaderParsingHelperTest.php │ │ ├── DownloadEncodingHelper │ │ │ ├── iso-8859-1.orig │ │ │ └── iso-8859-1.utf8 │ │ ├── DownloadEncodingHelperTest.php │ │ ├── EncodeingGuessingHelperTest.php │ │ ├── EncodingGuessingHelper │ │ │ ├── contentA.html │ │ │ └── contentB.html │ │ ├── FileSystem │ │ │ └── RecipeNameHelperTest.php │ │ ├── Filter │ │ │ ├── DB │ │ │ │ ├── RecipeDatesFilterTest.php │ │ │ │ └── RecipeNameLengthFilterTest.php │ │ │ ├── JSON │ │ │ │ ├── CleanCategoryFilterTest.php │ │ │ │ ├── ExtractImageUrlFilterTest.php │ │ │ │ ├── FixDescriptionFilterTest.php │ │ │ │ ├── FixDurationsFilterTest.php │ │ │ │ ├── FixImageSchemeFilterTest.php │ │ │ │ ├── FixIngredientsFilterTest.php │ │ │ │ ├── FixInstructionsFilterTest.php │ │ │ │ ├── FixKeywordsFilterTest.php │ │ │ │ ├── FixNutritionFilterTest.php │ │ │ │ ├── FixRecipeYieldFilterTest.php │ │ │ │ ├── FixTimestampsFilterTest.php │ │ │ │ ├── FixToolsFilterTest.php │ │ │ │ ├── FixUrlFilterTest.php │ │ │ │ ├── RecipeIdTypeFilterTest.php │ │ │ │ ├── RecipeNameFilterTest.php │ │ │ │ ├── SchemaConformityFilterTest.php │ │ │ │ ├── TimestampFixFilterTest.php │ │ │ │ ├── TimezoneFixFilterTest.php │ │ │ │ └── res_FixInstructionsFilter │ │ │ │ │ ├── case01.expected.json │ │ │ │ │ ├── case01.html │ │ │ │ │ ├── case01.json │ │ │ │ │ └── case01.url │ │ │ ├── JSONFilterTest.php │ │ │ ├── NormalizeRecipeFileFilterTest.php │ │ │ ├── Output │ │ │ │ └── EnsureNutritionPresentFilterTest.php │ │ │ └── RecipeJSONOutputFilterTest.php │ │ ├── HTMLFilter │ │ │ ├── HtmlEncodingFilterTest.php │ │ │ └── HtmlEntityDecodeFilterTest.php │ │ ├── HTMLParser │ │ │ ├── HttpJsonLdParserTest.php │ │ │ ├── HttpMicrodataParserTest.php │ │ │ ├── res_JsonLd │ │ │ │ ├── caseA.html │ │ │ │ ├── caseA.json │ │ │ │ ├── caseB.html │ │ │ │ ├── caseB.json │ │ │ │ ├── caseC.html │ │ │ │ ├── caseD.html │ │ │ │ ├── caseE.html │ │ │ │ ├── caseF.html │ │ │ │ ├── caseF.json │ │ │ │ ├── caseG.html │ │ │ │ ├── caseG.json │ │ │ │ ├── caseH.html │ │ │ │ ├── caseH.json │ │ │ │ ├── caseI.html │ │ │ │ ├── caseI.json │ │ │ │ ├── caseJ.html │ │ │ │ ├── caseJ.json │ │ │ │ ├── caseJ.src │ │ │ │ ├── caseK.html │ │ │ │ ├── caseK.json │ │ │ │ ├── caseK.json-graph │ │ │ │ ├── caseK.src │ │ │ │ ├── caseL.html │ │ │ │ └── caseL.json │ │ │ └── res_Microdata │ │ │ │ ├── case2711.html │ │ │ │ ├── case2711.json │ │ │ │ ├── caseA.html │ │ │ │ ├── caseA.json │ │ │ │ ├── caseA1.html │ │ │ │ ├── caseB.html │ │ │ │ ├── caseB.json │ │ │ │ ├── caseB1.html │ │ │ │ ├── caseC.html │ │ │ │ ├── caseD.html │ │ │ │ ├── caseD.json │ │ │ │ ├── caseE.html │ │ │ │ ├── caseE.json │ │ │ │ ├── caseFix1209.html │ │ │ │ ├── caseFix1209.json │ │ │ │ ├── caseFix1209.url │ │ │ │ ├── caseImage.json │ │ │ │ ├── caseImageAttribute.html │ │ │ │ ├── caseImageContent.html │ │ │ │ ├── caseIngredient.html │ │ │ │ ├── caseIngredient.json │ │ │ │ ├── caseInstruction.html │ │ │ │ ├── caseInstruction.json │ │ │ │ ├── caseIssue1617a.html │ │ │ │ ├── caseIssue1617a.json │ │ │ │ ├── caseIssue1617a.url │ │ │ │ ├── caseIssue1617b.html │ │ │ │ ├── caseIssue1617b.json │ │ │ │ ├── caseIssue1617b.url │ │ │ │ ├── caseIssue1617c.html │ │ │ │ ├── caseIssue1617c.json │ │ │ │ └── caseIssue1617c.url │ │ ├── HtmlToDomParserTest.php │ │ ├── ISO8601DurationHelperTest.php │ │ ├── ImageService │ │ │ ├── ImageFileHelperTest.php │ │ │ ├── ImageGenerationHelperTest.php │ │ │ └── ThumbnailFileHelperTest.php │ │ ├── TextCleanupHelperTest.php │ │ ├── TimestampHelperTest.php │ │ ├── UserConfigHelperTest.php │ │ └── UserFolderHelperTest.php │ └── Service │ │ ├── HtmlDownloadServiceTest.php │ │ ├── ImageServiceTest.php │ │ ├── JsonServiceTest.php │ │ ├── RecipeExtractionServiceTest.php │ │ └── ThumbnailServiceTest.php ├── bootstrap.php ├── bootstrap_helper.php ├── bootstrap_migration.php ├── phpunit │ ├── .gitignore │ └── composer.json ├── psalm-baseline.xml └── psalm-baseline.xml.license ├── translationfiles └── README.md ├── tsconfig.json ├── webpack.config.js └── webpack.devel.js /.changelog/current/2711-fix-microdata-parser.md: -------------------------------------------------------------------------------- 1 | # Fix 2 | 3 | - Parse Microdata correctly using itemscope properties 4 | -------------------------------------------------------------------------------- /.changelog/current/2712-eslint-import-resolver.md: -------------------------------------------------------------------------------- 1 | # Maintenance 2 | 3 | - Update eslint import resolver typescript dependency 4 | 5 | -------------------------------------------------------------------------------- /.changelog/prefix.md: -------------------------------------------------------------------------------- 1 | ## Note on incomplete changelogs and releases 2 | 3 | Please note that the changelog in this branch is not complete. 4 | This is due to the way, how the changelog file is managed and generated. 5 | 6 | Any changes to the branch not yet released are not guaranteed to be part of the changelog file. 7 | This file is auto-generated during the release process. 8 | See also the other files in `.changelog/current` for all merged changes since the last release. 9 | 10 | To be precise: 11 | Releses on parallel development branches will not appear in this CHANGELOG. 12 | Instead have a look at the correpsonding branches for an appropriate CHANGELOG. 13 | 14 | Also note, that the releases on this repository are not the actual releases of the cookbook. 15 | The releases are stored for technical reasins in the repository [christianlupus-nextcloud/cookbook-releases](https://github.com/christianlupus-nextcloud/cookbook-releases). 16 | Sorry for the inconvience. 17 | 18 | 19 | -------------------------------------------------------------------------------- /.changelog/versions/v0.10.0.md: -------------------------------------------------------------------------------- 1 | ## 0.10.0 - 2022-11-06 2 | 3 | ### Changed 4 | - Update app to be compatible with Nextcloud server version 25 @christianlupus 5 | 6 | ### Fixed 7 | - Allow import of recipes with HowToSections 8 | [#1255](https://github.com/nextcloud/cookbook/pull/1255) @christianlupus 9 | 10 | ### Changed 11 | - Add an app configuration (settings modal) to replace the one in the sidebar 12 | [#1258](https://github.com/nextcloud/cookbook/pull/1258) @MarcelRobitaille 13 | 14 | 15 | -------------------------------------------------------------------------------- /.changelog/versions/v0.10.1.md: -------------------------------------------------------------------------------- 1 | ## 0.10.1 - 2022-11-09 2 | 3 | ### Fixed 4 | - Fix printing in app to show all pages with NC25 5 | [#1327](https://github.com/nextcloud/cookbook/pull/1327) @christianlupus 6 | - Critical security issue fixed related to vue-loader 7 | 8 | ### Maintenance 9 | - Cleaned up some minor code issues and updated some dependencies 10 | [#1321](https://github.com/nextcloud/cookbook/pull/1321) @christianlupus 11 | - Make issue-template selection description clearer 12 | [1323](https://github.com/nextcloud/cookbook/pull/1323) @seyfeb 13 | 14 | 15 | -------------------------------------------------------------------------------- /.changelog/versions/v0.7.10.md: -------------------------------------------------------------------------------- 1 | ## 0.7.10 - 2021-01-16 2 | 3 | ### Fixed 4 | - Replaced function calls only available in PHP 8 with generic ones 5 | [#524](https://github.com/nextcloud/cookbook/pull/524) @christianlupus 6 | 7 | -------------------------------------------------------------------------------- /.changelog/versions/v0.7.6.md: -------------------------------------------------------------------------------- 1 | ## 0.7.6 - 2020-06-27 2 | 3 | ### Added 4 | - Allow forward slashes in ingredients 5 | [#272](https://github.com/nextcloud/cookbook/pull/272) @timandrews335 6 | 7 | ### Fixed 8 | - Swapping ingredients and instructions cause items been deleted 9 | [#278](https://github.com/nextcloud/cookbook/pull/278) @sam-19 10 | -------------------------------------------------------------------------------- /.changelog/versions/v0.7.7.md: -------------------------------------------------------------------------------- 1 | ## 0.7.7 - 2020-12-10 2 | 3 | ### Fixed 4 | - Increase version compatibility to nextcloud 20 @mrzapp 5 | 6 | 7 | -------------------------------------------------------------------------------- /.changelog/versions/v0.8.1.md: -------------------------------------------------------------------------------- 1 | ## 0.8.1 - 2021-02-15 2 | 3 | ### Added 4 | - Code style checker in Vue files 5 | [#581](https://github.com/nextcloud/cookbook/pull/581) @christianlupus 6 | 7 | ### Fixed 8 | - Remove look-behind to support Safari users as well 9 | [#591](https://github.com/nextcloud/cookbook/pull/591) @christianlupus 10 | 11 | -------------------------------------------------------------------------------- /.changelog/versions/v0.8.3.md: -------------------------------------------------------------------------------- 1 | ## 0.8.3 - 2021-03-03 2 | 3 | ### Fixed 4 | - Corrected compatibility list 5 | [#632](https://github.com/nextcloud/cookbook/pull/632) @christianlupus 6 | 7 | -------------------------------------------------------------------------------- /.changelog/versions/v0.8.4.md: -------------------------------------------------------------------------------- 1 | ## 0.8.4 - 2021-03-08 2 | 3 | ### Added 4 | - Sorting recipes in list by creation and modification date 5 | [#623](https://github.com/nextcloud/cookbook/pull/623) @seyfeb 6 | 7 | ### Fixed 8 | - Minor errors in displaying ingredients and instructions 9 | [#642](https://github.com/nextcloud/cookbook/pull/642) @seyfeb 10 | - Missing translation 11 | [#644](https://github.com/nextcloud/cookbook/pull/644) @seyfeb 12 | - Recipe-reference popup being shown on the wrong input depending on keyboard layout 13 | [#648](https://github.com/nextcloud/cookbook/pull/648) @seyfeb 14 | 15 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.1.md: -------------------------------------------------------------------------------- 1 | ## 0.9.1 - 2021-07-05 2 | 3 | ### Added 4 | - OpenAPI specification and documentation of the valid API endpoints 5 | [#757](https://github.com/nextcloud/cookbook/pull/757) @christianlupus 6 | 7 | ### Fixed 8 | - Correct handling of uploads to codecov 9 | [#758](https://github.com/nextcloud/cookbook/pull/758) @christianlupus 10 | - Added issue template and documentation regarding website support 11 | [#759](https://github.com/nextcloud/cookbook/pull/759) @christianlupus 12 | - Avoid sharing of recipes does break the database upgrade process 13 | [#755](https://github.com/nextcloud/cookbook/pull/755) @christianlupus 14 | 15 | ### Removed 16 | - Obsolete API routes that are no longer working due to missing files 17 | [#757](https://github.com/nextcloud/cookbook/pull/757) @christianlupus 18 | 19 | 20 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.2.md: -------------------------------------------------------------------------------- 1 | ## 0.9.2 - 2021-08-09 2 | 3 | ### Added 4 | - Added debugging helpers in the CI scripts 5 | [#774](https://github.com/nextcloud/cookbook/pull/774) @christianlupus 6 | 7 | ### Fixed 8 | - Fixed changes from #774 and minor extensions 9 | [#775](https://github.com/nextcloud/cookbook/pull/775) @christianlupus 10 | - Clean tables from old, redundant, and non-unique data to allow migrations (see #762 #763) 11 | [#776](https://github.com/nextcloud/cookbook/pull/776) @christianlupus 12 | 13 | 14 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.4.md: -------------------------------------------------------------------------------- 1 | ## 0.9.4 - 2021-09-29 2 | 3 | ### Fixed 4 | - Failed database caching in case of ill-formatted json file (category/keyword) 5 | [#797](https://github.com/nextcloud/cookbook/pull/797) @christianlupus 6 | - Added Nook app in README 7 | [#798](https://github.com/nextcloud/cookbook/pull/798) @christianlupus 8 | 9 | 10 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.5.md: -------------------------------------------------------------------------------- 1 | ## 0.9.5 - 2021-10-15 2 | 3 | ### Fixed 4 | - Fix empty Category 5 | [#805](https://github.com/nextcloud/cookbook/pull/805) @jotoeri 6 | - Fix CI test scripts 7 | [#809](https://github.com/nextcloud/cookbook/pull/809) @christianlupus 8 | - Update stylelint-config-prettier 9 | [#807](https://github.com/nextcloud/cookbook/pull/807) @christianlupus 10 | - Correct unit testing for dependabot and forked branches 11 | [#811](https://github.com/nextcloud/cookbook/pull/811) @christianlupus 12 | - Updated codecov parser to binary version (fix #810) 13 | [#813](https://github.com/nextcloud/cookbook/pull/813) @christianlupus 14 | - Allow bot user to push to stable branch 15 | [#812](https://github.com/nextcloud/cookbook/pull/812) @christianlupus 16 | 17 | 18 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.6.md: -------------------------------------------------------------------------------- 1 | ## 0.9.6 - 2021-10-18 2 | 3 | ### Added 4 | - Save button at the bottom of the edit page 5 | [#818](https://github.com/nextcloud/cookbook/pull/818) @christianlupus 6 | 7 | ### Fixed 8 | - Usage of PAT for deployment action 9 | [#815](https://github.com/nextcloud/cookbook/pull/815) @christianlupus 10 | - Correct usage of EXIF data to rotate thumb images accordingly 11 | [#816](https://github.com/nextcloud/cookbook/pull/816) @christianlupus 12 | - Trim spaces from names of imported recipes 13 | [#817](https://github.com/nextcloud/cookbook/pull/817) @christianlupus 14 | - Fixed regression in #805 15 | [#820](https://github.com/nextcloud/cookbook/pull/820) @christianlupus 16 | 17 | 18 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.8.md: -------------------------------------------------------------------------------- 1 | ## 0.9.8 - 2021-12-05 2 | 3 | ### Fixed 4 | - Update comaptible version to contain v23 5 | [#864](https://github.com/nextcloud/cookbook/pull/864) @christianlupus 6 | 7 | 8 | -------------------------------------------------------------------------------- /.changelog/versions/v0.9.9.md: -------------------------------------------------------------------------------- 1 | ## 0.9.9 - 2022-01-13 2 | 3 | ### Fixed 4 | - Update NPM plugins to enhance build process 5 | [#868](https://github.com/nextcloud/cookbook/pull/868) @christianlupus 6 | - Removed missing CSS link in guest template 7 | [#869](https://github.com/nextcloud/cookbook/pull/869) @christianlupus 8 | - Avoid usage of deprecated JS function 9 | [#870](https://github.com/nextcloud/cookbook/pull/870) @christianlupus 10 | - Added some translations manually 11 | (see also [#875](https://github.com/nextcloud/cookbook/issues/875)) @nickvergessen 12 | 13 | 14 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | require_ci_to_pass: yes 3 | 4 | coverage: 5 | precision: 2 6 | round: down 7 | range: "70...100" 8 | status: 9 | project: 10 | default: 11 | informational: true 12 | patch: 13 | default: 14 | informational: true 15 | 16 | parsers: 17 | gcov: 18 | branch_detection: 19 | conditional: yes 20 | loop: yes 21 | method: no 22 | macro: no 23 | 24 | comment: 25 | layout: "reach,diff,flags,tree" 26 | behavior: default 27 | require_changes: no 28 | 29 | ignore: 30 | - "vendor/**/*.php" 31 | - ".github/**/*" 32 | 33 | fixes: 34 | - "/workdir/nextcloud/apps/cookbook/::" 35 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 4 9 | indent_style = tab 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.{vue,js}] 14 | indent_style = space 15 | indent_size = 4 16 | 17 | [*.yml] 18 | indent_size = 2 19 | indent_style = space 20 | 21 | [*.md] 22 | trim_trailing_whitespace = false 23 | 24 | [*.svg] 25 | insert_final_newline = false 26 | 27 | [package*.json] 28 | indent_size = 2 29 | indent_style = space 30 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /vendor/ 3 | /.git/ 4 | /.github/ 5 | /docs/ 6 | /l10n/ 7 | /node_modules/ 8 | /tests/ 9 | /translationfiles/ 10 | /.hook-checkout/ 11 | 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | contact_links: 2 | - name: Documentation of the project 3 | url: https://nextcloud.github.io/cookbook/ 4 | about: Documentation of the usage, the administration and development of the cookbook app 5 | - name: Matrix Chat 6 | url: https://matrix.to/#/#nextcloud-cookbook:matrix.org 7 | about: A generic matrix channel to chat about the app and ask for help and support 8 | - name: Contact page 9 | url: https://nextcloud.github.io/cookbook/contact 10 | about: See all options to contact developers and the Cookbook community 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: 7 | 8 | --- 9 | 10 | 16 | 17 | **Is your feature request related to a problem? Please describe.** 18 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 19 | 20 | **Describe the solution you'd like** 21 | A clear and concise description of what you want to happen. 22 | 23 | **Describe alternatives you've considered** 24 | A clear and concise description of any alternative solutions or features you've considered. 25 | -------------------------------------------------------------------------------- /.github/actions/check-todo/action.yml: -------------------------------------------------------------------------------- 1 | name: Check for todo comments in the codebase 2 | author: Christian Wolf 3 | description: < 4 | This is a github action to look out for any remaining todos in the code base. 5 | Any todo will be marked with a warning. 6 | 7 | inputs: 8 | path: 9 | description: The path to look for source files 10 | required: false 11 | default: '.' 12 | extension: 13 | description: The file extension to look for 14 | required: true 15 | default: php 16 | 17 | runs: 18 | using: 'composite' 19 | 20 | steps: 21 | - name: Add annotations 22 | shell: bash 23 | run: ./.github/actions/check-todo/check.sh HEAD $GITHUB_BASE_REF 24 | -------------------------------------------------------------------------------- /.github/actions/check-todo/check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # set -x 4 | 5 | BRANCH_REF=HEAD 6 | BASE_REF=master 7 | 8 | if [ $# -gt 0 ]; then 9 | BRANCH_REF="$1" 10 | shift 11 | fi 12 | 13 | if [ $# -gt 0 ]; then 14 | BASE_REF="$1" 15 | shift 16 | fi 17 | 18 | echo "Base Reference: $BASE_REF" 19 | echo "Head Reference: $BRANCH_REF" 20 | 21 | files="$(git diff --name-only "$BASE_REF...$BRANCH_REF")" 22 | 23 | echo '::group::Updated files' 24 | echo "$files" 25 | echo '::endgroup::' 26 | 27 | echo "$files" | grep -E '[.](php|phpt|vue|js)$' | while read line 28 | do 29 | file=$(echo "$line" | sed 's@^\./@@') 30 | 31 | grep -noE '(TODO|ToDo|@todo|XXX|FIXME|FixMe)([^a-zA-Z0-9].*)?$' "$line" | while read match 32 | do 33 | IFS=: read lineno msg <<< "$match" 34 | echo "::warning file=$file,line=$lineno::Found $msg" 35 | done 36 | done 37 | -------------------------------------------------------------------------------- /.github/actions/deploy/last_release: -------------------------------------------------------------------------------- 1 | 0.11.3 2 | -------------------------------------------------------------------------------- /.github/actions/deploy/major: -------------------------------------------------------------------------------- 1 | 0 2 | -------------------------------------------------------------------------------- /.github/actions/deploy/minor: -------------------------------------------------------------------------------- 1 | 11 2 | -------------------------------------------------------------------------------- /.github/actions/deploy/patch: -------------------------------------------------------------------------------- 1 | 3 2 | -------------------------------------------------------------------------------- /.github/actions/deploy/stable_name: -------------------------------------------------------------------------------- 1 | stable 2 | -------------------------------------------------------------------------------- /.github/actions/deploy/trunk_name: -------------------------------------------------------------------------------- 1 | master 2 | -------------------------------------------------------------------------------- /.github/actions/php-linter/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1 2 | 3 | COPY tester.sh /tester.sh 4 | 5 | CMD ["/tester.sh", "/work"] 6 | -------------------------------------------------------------------------------- /.github/actions/php-linter/tester.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$1" 4 | 5 | ret=0 6 | 7 | while IFS= read -d '' file 8 | do 9 | php -l "$file" > /tmp/msg 10 | retSingle=$? 11 | 12 | if [ $retSingle -eq 0 ] 13 | then 14 | cat /tmp/msg | sed 's@^@::debug::@' 15 | else 16 | ret=1 17 | msg="$(cat /tmp/msg)" 18 | echo "$msg" | sed 's@^\s*$@@' | grep -v '^$' > /tmp/msg 19 | line=$(cat /tmp/msg | grep -o ' on line [0-9]*' | sed -E 's@ on line ([0-9]*)$@\1@') 20 | prefix="::error file=$file,line=$line,title=PHP linter failed::" 21 | sed "s@^@$prefix@" /tmp/msg 22 | fi 23 | done < <(find lib -type f -name '*.php' -print0) 24 | 25 | exit $ret 26 | -------------------------------------------------------------------------------- /.github/actions/run-tests/.env: -------------------------------------------------------------------------------- 1 | COMPOSE_PROJECT_NAME=cookbook_unittesting 2 | -------------------------------------------------------------------------------- /.github/actions/run-tests/.gitignore: -------------------------------------------------------------------------------- 1 | /volumes/ 2 | /venv/ 3 | -------------------------------------------------------------------------------- /.github/actions/run-tests/mysql.env: -------------------------------------------------------------------------------- 1 | MYSQL_DATABASE=nc_test 2 | MYSQL_USER=tester 3 | MYSQL_PASSWORD=tester_pass 4 | MYSQL_ROOT_PASSWORD=pass_root 5 | -------------------------------------------------------------------------------- /.github/actions/run-tests/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM mariadb:10.5 3 | 4 | LABEL maintainer="Christian Wolf " 5 | 6 | RUN apt-get update >/dev/null && \ 7 | apt-get install -y --no-install-recommends eatmydata > /dev/null && \ 8 | apt-get clean 9 | 10 | HEALTHCHECK --interval=1s --timeout=1s --retries=24 \ 11 | CMD mysqladmin ping --silent --socket /run/mysqld/mysqld.sock -ppass_root 12 | 13 | COPY docker-entrypoint.sh /usr/local/bin 14 | # CMD ["eatmydata", "mysqld"] 15 | -------------------------------------------------------------------------------- /.github/actions/run-tests/postgres.env: -------------------------------------------------------------------------------- 1 | POSTGRES_USER=tester 2 | POSTGRES_PASSWORD=tester_pass 3 | POSTGRES_DB=nc_test 4 | -------------------------------------------------------------------------------- /.github/actions/run-tests/postgres/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:latest 2 | 3 | LABEL maintainer="Christian Wolf " 4 | 5 | RUN apt-get update && \ 6 | apt-get install -y --no-install-recommends eatmydata && \ 7 | apt-get clean 8 | 9 | COPY docker-entrypoint.sh /usrlocal/bin 10 | -------------------------------------------------------------------------------- /.github/actions/run-tests/requirements.txt: -------------------------------------------------------------------------------- 1 | debugpy==1.6.7 2 | tabulate==0.8.10 3 | -------------------------------------------------------------------------------- /.github/actions/run-tests/run-locally.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash -e 2 | 3 | cat << EOF 4 | The run-locally.sh script was replaced by the run-locally.py python script. 5 | The latter is simpler to read and to structure. 6 | 7 | Also the implementation was adopted to the documentation. 8 | 9 | Please migrate your scripts. 10 | EOF 11 | 12 | # sleep 2 13 | 14 | cd "$(dirname "$0")" 15 | 16 | if [ -d venv ]; then 17 | . venv/bin/activate 18 | fi 19 | 20 | ./run-locally.py "$@" 21 | ret=$? 22 | 23 | echo "Do not forget to migrate your scripts to the python version" 24 | 25 | exit $ret 26 | -------------------------------------------------------------------------------- /.github/actions/run-tests/run-occ.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh -e 2 | 3 | #set -x 4 | 5 | cd /var/www/html 6 | php occ "$@" 7 | 8 | exit $? 9 | 10 | -------------------------------------------------------------------------------- /.github/actions/run-tests/scripts/enable_app_install_script.php: -------------------------------------------------------------------------------- 1 | "/var/www/html/apps", 9 | "url" => "/apps", 10 | "writable" => false, 11 | ], 12 | [ 13 | "path" => "/var/www/html/custom_apps", 14 | "url" => "/custom_apps", 15 | "writable" => true, 16 | ] 17 | ]; 18 | 19 | } else { 20 | $found = false; 21 | 22 | foreach($CONFIG['apps_paths'] as $pc) { 23 | if($pc['path'] === '/var/www/html/custom_apps') { 24 | $found = true; 25 | break; 26 | } 27 | } 28 | 29 | if(!$found) { 30 | $CONFIG['apps_paths'][] = [ 31 | "path" => "/var/www/html/custom_apps", 32 | "url" => "/custom_apps", 33 | "writable" => true, 34 | ]; 35 | } 36 | } 37 | 38 | 39 | $dump = '&2 echo 'ERROR: Invalid installer checksum' 11 | exit 1 12 | fi 13 | 14 | php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer 15 | rm /tmp/composer-setup.php 16 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/install-gd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | function configure_gd_normal () 4 | { 5 | docker-php-ext-configure gd --with-freetype --with-jpeg 6 | return $? 7 | } 8 | 9 | function configure_gd_without () 10 | { 11 | docker-php-ext-configure gd 12 | return $? 13 | } 14 | 15 | function configure_gd() 16 | { 17 | if [ "$1" = "7.2" -o "$1" = "7.3" ]; then 18 | configure_gd_without 19 | return $? 20 | else 21 | configure_gd_normal 22 | return $? 23 | fi 24 | } 25 | 26 | echo 'Installing PHP gd' 27 | configure_gd "$1" > /dev/null 28 | docker-php-ext-install -j$(nproc) gd > /dev/null 29 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/install-php-ini.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo 'Installing php.ini for development' 4 | cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini 5 | cat > /usr/local/etc/php/conf.d/memory_limit.ini << EOF 6 | memory_limit = 512M 7 | EOF 8 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/install-sudoers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | echo 'runner ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers 4 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/style.sed: -------------------------------------------------------------------------------- 1 | s@#dff0d8@#7F7@gi 2 | s@#f2dede@#F77@gi 3 | s@#fcf8e3@#FF7@gi 4 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/xdebug.config: -------------------------------------------------------------------------------- 1 | 2 | xdebug.mode=develop,coverage 3 | 4 | xdebug.log = /output/xdebug.log 5 | xdebug.log_level = 3 6 | xdebug.output_dir = /output 7 | 8 | xdebug.trace_output_name = trace.%c.%u 9 | xdebug.collect_return = true 10 | xdebug.var_display_max_depth = 3 11 | xdebug.var_display_max_data = 1024 12 | xdebug.var_display_max_children = 515 13 | 14 | xdebug.profiler_output_name = cachegrind.out.%c.%u 15 | -------------------------------------------------------------------------------- /.github/actions/run-tests/tests/zz-php-fpm-user.conf: -------------------------------------------------------------------------------- 1 | [www] 2 | 3 | user=runner 4 | group=runner 5 | -------------------------------------------------------------------------------- /.github/actions/run-tests/www/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:apache 2 | RUN a2enmod headers 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "03:00" 8 | timezone: Europe/Paris 9 | open-pull-requests-limit: 10 10 | - package-ecosystem: composer 11 | directory: "/" 12 | schedule: 13 | interval: daily 14 | time: "03:00" 15 | timezone: Europe/Paris 16 | open-pull-requests-limit: 10 17 | - package-ecosystem: bundler 18 | directory: "/docs" 19 | schedule: 20 | timezone: Europe/Berlin 21 | interval: daily 22 | time: "02:50" 23 | open-pull-requests-limit: 10 24 | - package-ecosystem: github-actions 25 | directory: "/" 26 | schedule: 27 | timezone: Europe/Berlin 28 | interval: daily 29 | time: "02:50" 30 | open-pull-requests-limit: 10 31 | 32 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Topic and Scope 4 | 5 | _Please write, what the PR is about and what it does or should do. This does not need to be very long._ 6 | 7 | ## Concerns/issues 8 | 9 | _Is the PR potentially cause any issues that might be of interest? Any other issues to be tought of?_ 10 | 11 | ## Formal requirements 12 | 13 | There are some formal requirements that should be satisfied. Please mark those by checking the corresponding box. 14 | 15 | - [ ] I did check that the app can still be opened and does not throw any browser logs 16 | - [ ] I created tests for newly added PHP code (check this if no PHP changes were made) 17 | - [ ] I updated the OpenAPI specs and added an entry to the API changelog (check if API was not modified) 18 | - [ ] I notified the matrix channel if I introduced an API change 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.swo 3 | 4 | cookbook.tar.gz 5 | 6 | .idea/ 7 | 8 | /.php-cs-fixer.cache 9 | /.eslintcache 10 | 11 | # Built js package 12 | js/* 13 | 14 | ### NPM ### 15 | 16 | # Node modules 17 | node_modules 18 | 19 | ### Composer ### 20 | 21 | /vendor 22 | -------------------------------------------------------------------------------- /.helpers/appstore/.gitignore: -------------------------------------------------------------------------------- 1 | token.file 2 | -------------------------------------------------------------------------------- /.helpers/appstore/URL: -------------------------------------------------------------------------------- 1 | https://nextcloudappstore.readthedocs.io/en/latest/restapi.html#specification 2 | -------------------------------------------------------------------------------- /.helpers/appstore/query-request.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dir=$(dirname "$0") 4 | TOKEN=$(cat "$dir/token.file") 5 | 6 | curl -H "Authorization: Token $TOKEN" "$@" 7 | -------------------------------------------------------------------------------- /.helpers/changelog/.gitignore: -------------------------------------------------------------------------------- 1 | /venv/ 2 | __pycache__/ 3 | /token 4 | -------------------------------------------------------------------------------- /.helpers/changelog/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | coloredlogs = "*" 8 | toml = "*" 9 | requests = "*" 10 | gitpython = "*" 11 | 12 | [dev-packages] 13 | 14 | [requires] 15 | python_version = "3.11" 16 | -------------------------------------------------------------------------------- /.helpers/changelog/changelog_builder/__main__.py: -------------------------------------------------------------------------------- 1 | import changelog_builder 2 | 3 | changelog_builder.main() 4 | -------------------------------------------------------------------------------- /.helpers/changelog/changelog_builder/cli.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | def parseParams(): 4 | parser = argparse.ArgumentParser() 5 | 6 | parser.add_argument('files', nargs='+') 7 | parser.add_argument('-t', '--token', required=True, help='The file containing the token to use when making API requests.') 8 | parser.add_argument('--tag', help='The version to tag this with') 9 | parser.add_argument('--ci', action='store_true', help='Make the script more restrictive for use in CI.') 10 | parser.add_argument('--pr', help='Define the PR number if run in a pull_request check') 11 | 12 | parser.add_argument('-v', '--verbose', default=0, action='count') 13 | return parser.parse_args() 14 | -------------------------------------------------------------------------------- /.helpers/changelog/changelog_builder/github.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def getGitHubPullInformation(pr: int, token: str): 4 | url = f'https://api.github.com/repos/nextcloud/cookbook/pulls/{pr}' 5 | headers= { 6 | 'Authorization': f'Bearer {token}' 7 | } 8 | res = requests.get(url, headers=headers) 9 | return res 10 | -------------------------------------------------------------------------------- /.helpers/changelog/create-changelog-prerelease.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | localdir="$(dirname "$0")" 4 | 5 | versions_dir="$localdir/../../.changelog/versions" 6 | 7 | . "$localdir/venv/bin/activate" 8 | 9 | changelog="$localdir/../../CHANGELOG.md" 10 | 11 | cat "$localdir/../../.changelog/prefix.md" > "$changelog" 12 | 13 | echo "## [Unreleased]" >> "$changelog" 14 | 15 | ( 16 | export PYTHONPATH="$(pwd)/.helpers/changelog" 17 | python -m changelog_builder "$@" 18 | ) >> "$localdir/../../CHANGELOG.md" 19 | 20 | find "$versions_dir" -type f | sort -Vr | xargs -n 1 cat >> "$localdir/../../CHANGELOG.md" 21 | 22 | -------------------------------------------------------------------------------- /.helpers/changelog/create-changelog-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | if [ $# -lt 1 ] 4 | then 5 | echo "Please give the path to the old changelog snippets" 6 | exit 1 7 | fi 8 | 9 | localdir="$(dirname "$0")" 10 | 11 | versions_dir="$localdir/../../.changelog/versions" 12 | new_version="$1" 13 | shift 14 | 15 | . .helpers/changelog/venv/bin/activate 16 | 17 | changelog="$localdir/../../CHANGELOG.md" 18 | 19 | cat "$localdir/../../.changelog/prefix.md" > "$changelog" 20 | 21 | echo "## [Unreleased]" >> "$changelog" 22 | echo "" >> "$changelog" 23 | echo "" >> "$changelog" 24 | 25 | ( 26 | export PYTHONPATH="$(pwd)/.helpers/changelog" 27 | python -m changelog_builder --tag "$new_version" "$@" 28 | ) > ".changelog/versions/v$new_version.md" 29 | 30 | rm .changelog/current/* 31 | 32 | find "$versions_dir" -type f | sort -Vr | xargs -n 1 cat >> "$changelog" 33 | 34 | -------------------------------------------------------------------------------- /.hook-checkout/.gitignore: -------------------------------------------------------------------------------- 1 | /checkout 2 | /tmp 3 | -------------------------------------------------------------------------------- /.hook-checkout/README.md: -------------------------------------------------------------------------------- 1 | DO NOT CHANGE OR COMMIT ANYTING IN THIS FOLDER! 2 | 3 | This is just a temporary folder for checking the code during commit/push in the hooks. 4 | -------------------------------------------------------------------------------- /.img/BrowserStack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/.img/BrowserStack.png -------------------------------------------------------------------------------- /.img/blackfire-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/.img/blackfire-io.png -------------------------------------------------------------------------------- /.l10nignore: -------------------------------------------------------------------------------- 1 | docs/dev/api/ 2 | docs/_site/ 3 | docs/vendor/ 4 | tests/ 5 | vendor/ 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /.git/ 2 | /.github/ 3 | /vendor/ 4 | /docs/ 5 | /build/ 6 | /l10n/ 7 | /node_modules/ 8 | /tests/ 9 | /translationfiles/ 10 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 4, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /.tx/backport: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi 4 | 5 | [o:nextcloud:p:nextcloud:r:cookbook] 6 | file_filter = translationfiles//cookbook.po 7 | source_file = translationfiles/templates/cookbook.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.validate": false, 3 | "less.validate": false, 4 | "scss.validate": false, 5 | "intelephense.environment.includePaths": [ 6 | "../../lib", 7 | ], 8 | "intelephense.files.exclude": [ 9 | "**/.git/**", 10 | "**/.svn/**", 11 | "**/.hg/**", 12 | "**/CVS/**", 13 | "**/.DS_Store/**", 14 | "**/node_modules/**", 15 | "**/bower_components/**", 16 | "**/vendor/**/{Tests,tests}/**", 17 | "**/.history/**", 18 | "**/vendor/**/vendor/**", 19 | "**/.github/actions/run-tests/volumes/nextcloud/custom_apps/cookbook/**", 20 | "**/.github/actions/run-tests/volumes/nextcloud/3rdparty/**", 21 | "**/.github/actions/run-tests/volumes/**", 22 | "**/.github/actions/run-tests/volumes" 23 | ], 24 | "intelephense.references.exclude": [ 25 | "**/vendor/**", 26 | ".github/actions/run-tests/volumes/**" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # Development of the cookbook app 2 | 3 | We are happily accepting code contributions of different types. Here are some hints on this. 4 | 5 | Please have a look at the [developer documentation](https://nextcloud.github.io/cookbook/dev/) in general and about [contributing](https://nextcloud.github.io/cookbook/dev/contributing/). 6 | -------------------------------------------------------------------------------- /assets/alarm-continuous.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/assets/alarm-continuous.mp3 -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | const babelConfig = require('@nextcloud/babel-config'); 2 | 3 | module.exports = babelConfig; 4 | -------------------------------------------------------------------------------- /docs/.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_BUNDLE_PATH: "vendor/bundle" 3 | BUNDLE_PATH: "vendor/bundle" 4 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /_site/ 3 | /.jekyll-metadata 4 | /.sass-cache 5 | /.jekyll-cache 6 | /Makefile.local 7 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | 2 | BUNDLER=bundler 3 | HOST=127.0.0.1 4 | 5 | PLANTUML_SRC=$(shell find -name \*.puml ! -path ./_site/\*) 6 | PLANTUML_DST_SVG=${PLANTUML_SRC:%.puml=%.svg} 7 | 8 | .PHONY: all 9 | all: help 10 | 11 | .PHONY: help watch build install build-uml-svg 12 | 13 | help: 14 | @echo "Make tragets supported:" 15 | @echo " help - Show this help screen" 16 | @echo " build - Build the HTML pages locally" 17 | @echo " watch - Keep building the pages locally and serve on local port for writing" 18 | @echo " install - Install the ruby packages using bundler" 19 | 20 | build: 21 | ${BUNDLER} exec jekyll build 22 | 23 | watch: 24 | ${BUNDLER} exec jekyll serve --host ${HOST} --livereload 25 | 26 | install: 27 | ${BUNDLER} install 28 | 29 | build-uml-svg: 30 | ifeq ($(strip ${PLANTUML_SRC}),) 31 | @echo 'No plantuml files were found. Skipping.' 32 | else 33 | ${MAKE} ${PLANTUML_DST_SVG} 34 | endif 35 | 36 | %.svg: %.puml 37 | plantuml -tsvg $< 38 | 39 | %.png: %.puml 40 | plantuml -tpng $< 41 | 42 | -include Makefile.local 43 | -------------------------------------------------------------------------------- /docs/Makefile.local.dist: -------------------------------------------------------------------------------- 1 | # Example of local configuration 2 | # BUNDLER = bundler-2.7 3 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate 2 | repository: nextcloud/cookbook 3 | exclude: 4 | - "Makefile" 5 | - Makefile.local 6 | - .gitignore 7 | - "vendor/" 8 | - Gemfile 9 | - Gemfile.lock 10 | # plugins: 11 | # - jekyll-spaceship 12 | markdown: kramdown 13 | kramdown: 14 | input: GFM 15 | -------------------------------------------------------------------------------- /docs/admin/index.md: -------------------------------------------------------------------------------- 1 | # Administrative Documentation 2 | 3 | There is no content yet 4 | -------------------------------------------------------------------------------- /docs/assets/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/assets/app-icon.png -------------------------------------------------------------------------------- /docs/assets/app-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /docs/assets/icon256x256-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/assets/icon256x256-dark.png -------------------------------------------------------------------------------- /docs/assets/icon256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/assets/icon256x256.png -------------------------------------------------------------------------------- /docs/assets/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/assets/screenshot.png -------------------------------------------------------------------------------- /docs/dev/api/0.0.2/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.0.2/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.0.3/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.0.3/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.0.4/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.0.4/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.0/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.1.0/internal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.0/swagger-initializer-internal.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "internal-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.0/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.1/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.1.1/internal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.1/swagger-initializer-internal.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "internal-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.1/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.2/index.html: -------------------------------------------------------------------------------- 1 | ../swagger/index.html -------------------------------------------------------------------------------- /docs/dev/api/0.1.2/internal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.2/swagger-initializer-internal.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "internal-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/0.1.2/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "openapi-cookbook.yaml", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/index.md: -------------------------------------------------------------------------------- 1 | # OpenAPI documentation 2 | 3 | This page provides an overview over the possible API endpoints provided by the app. In the following are the various versions of the API linked: 4 | 5 | - [Version 0.0.2](0.0.2/index.html) 6 | - [Version 0.0.3](0.0.3/index.html) 7 | - [Version 0.0.4](0.0.4/index.html) 8 | - [Version 0.1.0](0.1.0/index.html) ([internal interface](0.1.0/internal.html)) 9 | - [Version 0.1.1](0.1.1/index.html) ([internal interface](0.1.1/internal.html)) 10 | - [Version 0.1.2](0.1.2/index.html) ([internal interface](0.1.2/internal.html)) 11 | 12 | The following list provides a in depth changelog for the individual epochs: 13 | 14 | - [Epoch 0.x.x](changelog/0.html) 15 | -------------------------------------------------------------------------------- /docs/dev/api/swagger/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/api/swagger/favicon-16x16.png -------------------------------------------------------------------------------- /docs/dev/api/swagger/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/api/swagger/favicon-32x32.png -------------------------------------------------------------------------------- /docs/dev/api/swagger/index.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | overflow: -moz-scrollbars-vertical; 4 | overflow-y: scroll; 5 | } 6 | 7 | *, 8 | *:before, 9 | *:after { 10 | box-sizing: inherit; 11 | } 12 | 13 | body { 14 | margin: 0; 15 | background: #fafafa; 16 | } 17 | -------------------------------------------------------------------------------- /docs/dev/api/swagger/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dev/api/swagger/swagger-initializer.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | // 3 | 4 | // the following lines will be replaced by docker/configurator, when it runs in a docker-container 5 | window.ui = SwaggerUIBundle({ 6 | url: "https://petstore.swagger.io/v2/swagger.json", 7 | dom_id: '#swagger-ui', 8 | deepLinking: true, 9 | presets: [ 10 | SwaggerUIBundle.presets.apis, 11 | SwaggerUIStandalonePreset 12 | ], 13 | plugins: [ 14 | SwaggerUIBundle.plugins.DownloadUrl 15 | ], 16 | layout: "StandaloneLayout" 17 | }); 18 | 19 | // 20 | }; 21 | -------------------------------------------------------------------------------- /docs/dev/api/swagger/swagger-ui-version: -------------------------------------------------------------------------------- 1 | 4.15.5 2 | -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/01.png -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/02.png -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/03.png -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/04.png -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/05.png -------------------------------------------------------------------------------- /docs/dev/assets/use-dev-build/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/assets/use-dev-build/06.png -------------------------------------------------------------------------------- /docs/dev/contributing/code_coverage.md: -------------------------------------------------------------------------------- 1 | ## Unit tests and code coverage 2 | 3 | Currently there is a github action in place that does automatic unit testing upon pushing to github. 4 | These tests are generating code coverage reports as well. 5 | 6 | Firstly, for each such run (see in the actions view or the PR tests) there is the option to download the code coverage as zipped HTML page. 7 | Secondly, the [codecov.io service](https://codecov.io/gh/nextcloud/cookbook) is installed, where more details about the coverage can be found. 8 | -------------------------------------------------------------------------------- /docs/dev/contributing/index.md: -------------------------------------------------------------------------------- 1 | # Contributing with the project 2 | 3 | * TOC 4 | {:toc} 5 | 6 | This page should help any willing contributors to start working. 7 | If you need additional information or find any missing parts, feel free to contact us at the [#nextcloud-cookbook room on matrix.org](https://matrix.to/#/#nextcloud-cookbook:matrix.org). 8 | 9 | ## Coding 10 | The first step, when you want to help with coding on the app, will be to setup your development environment. 11 | We prepared a [page on the setup](setup) to help you get started with the technical requirements. 12 | See also the page on [code coverage](code_coverage). 13 | Please also note that the [changelog process](../changelog) needs some addressing as well. 14 | 15 | ## Translating 16 | Feel free to have a look at the [transifex page on the cookbook app](https://app.transifex.com/nextcloud/nextcloud/cookbook/). 17 | Any translations done there will be synchronized on a nightly base. 18 | 19 | ## Documentation 20 | We also need helpers in writing documentation for various levels and user groups. 21 | If you think you can help by writing appropriate documentation or tutorials, feel free to step forward. 22 | -------------------------------------------------------------------------------- /docs/dev/frontend/assets/confirmation-hot-reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/frontend/assets/confirmation-hot-reload.png -------------------------------------------------------------------------------- /docs/dev/frontend/assets/hot-reload.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/frontend/assets/hot-reload.mp4 -------------------------------------------------------------------------------- /docs/dev/frontend/assets/webpack-bundle-analyzer_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/dev/frontend/assets/webpack-bundle-analyzer_example.png -------------------------------------------------------------------------------- /docs/dev/frontend/logging.md: -------------------------------------------------------------------------------- 1 | # Debugging in production through logging 2 | 3 | Sometimes, it is necessary to debug problems in production 4 | where it is not possible to use a debugger or other developer tools to find the 5 | source of the problem. 6 | For example, if a user reports an issue that cannot be reproduced locally, 7 | you can instruct them to enable logging to narrow down the source of the issue. 8 | 9 | To enable logging, a user only has to run the following before loading the app/refreshing the page: 10 | ```js 11 | localStorage.setItem('COOKBOOK_LOGGING_ENABLED', 'true') 12 | ``` 13 | 14 | This will automatically be reset after 30 minutes so verbose logging is not enabled permanently for the user. 15 | 16 | The log level is also configurable. For example: 17 | ```js 18 | localStorage.setItem('COOKBOOK_LOGGING_LEVEL', 'debug') 19 | ``` 20 | 21 | The documentation for the logging library used is available [here](https://www.npmjs.com/package/vuejs-logger). 22 | -------------------------------------------------------------------------------- /docs/dev/misc/automated-testing/backend/xdebug.md: -------------------------------------------------------------------------------- 1 | # Debugging the tests 2 | 3 | The debugging of the tests can be activated to allow for step-debugging of the tests in case of issues. 4 | 5 | The debugging framework uses the xdebug module of PHP. 6 | If the debugging is enabled, the PHP executable will open a network connection to the IDE of the developer. 7 | Thus, it is required to set up the IDE appropriately _before_ the debug session is started. 8 | 9 | Using the command lien options (like `--debug-port`, `--debug-host`, etc) of the runner script, the connection options can be configured. 10 | The defaults are sensible for a local docker installation. 11 | To request the debugger to be enabled, you mist provide the `--debug` (`-d`) option for each invocation. 12 | 13 | If you are using VS code, the running configuration as committed to git provides all required configuration to make the step-debugger run. 14 | Just start the debugger listening on port `9000`. 15 | 16 | For other IDEs, you need to configure appropriately. 17 | Feel free to ask for help with other IDEs but be prepared to enable the logging feature of xdebug to debug the debugger. 18 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # Nextcloud Cookbook app documentation 2 | 3 | This is the documentation area for the Nextcloud Cookbook app. 4 | The documentation covers three different aspects of the app. 5 | 6 | - [Documentation for usage of the app as regular user](user/) 7 | - [Documentation for the administrator of a Nextcloud instance](admin/) 8 | - [Documentation for developers](dev/) 9 | 10 | If you need to get in touch with us, have a look at the [contact page](contact). 11 | There you find some ways to get in touch. 12 | 13 | All the documentation can be found in the `/docs/` folder in the [app's repository]({{ site.github.url }}). 14 | If you feel like you want to add more information or enhance the documentation, you are welcome to open a PR against the main repository. 15 | -------------------------------------------------------------------------------- /docs/user/assets/create_import-fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/create_import-fr.png -------------------------------------------------------------------------------- /docs/user/assets/create_import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/create_import.png -------------------------------------------------------------------------------- /docs/user/assets/keywords-and-categories-fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/keywords-and-categories-fr.png -------------------------------------------------------------------------------- /docs/user/assets/keywords-and-categories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/keywords-and-categories.png -------------------------------------------------------------------------------- /docs/user/assets/keywords-and-categories.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/keywords-and-categories.xcf -------------------------------------------------------------------------------- /docs/user/assets/screen_structure-fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/screen_structure-fr.png -------------------------------------------------------------------------------- /docs/user/assets/screen_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/screen_structure.png -------------------------------------------------------------------------------- /docs/user/assets/settings-fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/settings-fr.png -------------------------------------------------------------------------------- /docs/user/assets/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/assets/settings.png -------------------------------------------------------------------------------- /docs/user/clients/img/f-droid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/clients/img/f-droid.png -------------------------------------------------------------------------------- /docs/user/clients/img/g-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/docs/user/clients/img/g-play.png -------------------------------------------------------------------------------- /img/app.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /img/favicon-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/favicon-api.png -------------------------------------------------------------------------------- /img/favicon-doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/favicon-doc.png -------------------------------------------------------------------------------- /img/favicon-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/favicon-large.png -------------------------------------------------------------------------------- /img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/favicon.png -------------------------------------------------------------------------------- /img/recipe-thumb16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/recipe-thumb16.jpg -------------------------------------------------------------------------------- /img/recipe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/screenshot1.png -------------------------------------------------------------------------------- /img/screenshot1_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/screenshot1_small.png -------------------------------------------------------------------------------- /img/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/img/screenshot2.png -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | // Jest configuration 2 | module.exports = { 3 | testEnvironment: 'node', 4 | moduleFileExtensions: ['js', 'vue'], 5 | modulePaths: [ 6 | '/src/' 7 | ], 8 | modulePathIgnorePatterns: [ 9 | '/.github/' 10 | ], 11 | transform: { 12 | '.*\\.js$': '/node_modules/babel-jest', 13 | '.*\\.(vue)$': '/node_modules/@vue/vue2-jest', 14 | }, 15 | transformIgnorePatterns: ['node_modules/(?!variables/.*)'], 16 | }; 17 | -------------------------------------------------------------------------------- /l10n/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "in %s", 5 | "Category" : "Kategorie", 6 | "Tags" : "Etikette", 7 | "None" : "Geen", 8 | "Page not found" : "Blad nie gevind nie", 9 | "Edit" : "Wysig", 10 | "Save" : "Bewaar", 11 | "Search" : "Soek", 12 | "Filter" : "Filter", 13 | "Categories" : "Kategorieë", 14 | "Rename" : "Hernoem", 15 | "Add" : "Voeg by", 16 | "Name" : "Naam", 17 | "Tools" : "Nutsmiddels", 18 | "Dismiss" : "Ontslaan", 19 | "Cancel" : "Kanselleer", 20 | "OK" : "Goed", 21 | "Description" : "Beskrywing", 22 | "URL" : "Bronadres", 23 | "Loading…" : "Laai…", 24 | "Last modified" : "Laas gewysig" 25 | }, 26 | "nplurals=2; plural=(n != 1);"); 27 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "in %s", 3 | "Category" : "Kategorie", 4 | "Tags" : "Etikette", 5 | "None" : "Geen", 6 | "Page not found" : "Blad nie gevind nie", 7 | "Edit" : "Wysig", 8 | "Save" : "Bewaar", 9 | "Search" : "Soek", 10 | "Filter" : "Filter", 11 | "Categories" : "Kategorieë", 12 | "Rename" : "Hernoem", 13 | "Add" : "Voeg by", 14 | "Name" : "Naam", 15 | "Tools" : "Nutsmiddels", 16 | "Dismiss" : "Ontslaan", 17 | "Cancel" : "Kanselleer", 18 | "OK" : "Goed", 19 | "Description" : "Beskrywing", 20 | "URL" : "Bronadres", 21 | "Loading…" : "Laai…", 22 | "Last modified" : "Laas gewysig" 23 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 24 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "içinə %s", 5 | "Category" : "Kateqoriya", 6 | "Tags" : "Işarələr", 7 | "None" : "Heç bir", 8 | "Edit" : "Dəyişiklik et", 9 | "Save" : "Saxla", 10 | "Search" : "Axtarış", 11 | "Categories" : "Kateqoriyalar", 12 | "Rename" : "Adı dəyiş", 13 | "Add" : "Əlavə etmək", 14 | "Name" : "Ad", 15 | "Tools" : "Alətlər", 16 | "Dismiss" : "Rədd et", 17 | "Cancel" : "Dayandır", 18 | "OK" : "Oldu", 19 | "Description" : "Açıqlanma", 20 | "URL" : "URL" 21 | }, 22 | "nplurals=2; plural=(n != 1);"); 23 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "içinə %s", 3 | "Category" : "Kateqoriya", 4 | "Tags" : "Işarələr", 5 | "None" : "Heç bir", 6 | "Edit" : "Dəyişiklik et", 7 | "Save" : "Saxla", 8 | "Search" : "Axtarış", 9 | "Categories" : "Kateqoriyalar", 10 | "Rename" : "Adı dəyiş", 11 | "Add" : "Əlavə etmək", 12 | "Name" : "Ad", 13 | "Tools" : "Alətlər", 14 | "Dismiss" : "Rədd et", 15 | "Cancel" : "Dayandır", 16 | "OK" : "Oldu", 17 | "Description" : "Açıqlanma", 18 | "URL" : "URL" 19 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 20 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "ভেতর %s", 5 | "Tags" : "ট্যাগ", 6 | "None" : "কোনটিই নয়", 7 | "Edit" : "সম্পাদনা", 8 | "Save" : "সংরক্ষণ", 9 | "Search" : "Search", 10 | "Rename" : "পূনঃনামকরণ", 11 | "Add" : "যোগ করুন", 12 | "Name" : "নাম", 13 | "Cancel" : "বাতির", 14 | "OK" : "তথাস্তু", 15 | "Description" : "বিবরণ", 16 | "URL" : "URL" 17 | }, 18 | "nplurals=2; plural=(n != 1);"); 19 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "ভেতর %s", 3 | "Tags" : "ট্যাগ", 4 | "None" : "কোনটিই নয়", 5 | "Edit" : "সম্পাদনা", 6 | "Save" : "সংরক্ষণ", 7 | "Search" : "Search", 8 | "Rename" : "পূনঃনামকরণ", 9 | "Add" : "যোগ করুন", 10 | "Name" : "নাম", 11 | "Cancel" : "বাতির", 12 | "OK" : "তথাস্তু", 13 | "Description" : "বিবরণ", 14 | "URL" : "URL" 15 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 16 | } -------------------------------------------------------------------------------- /l10n/br.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "e %s", 5 | "Tags" : "Klavioù", 6 | "None" : "Hini ebet", 7 | "Edit" : "Cheñch", 8 | "Save" : "Enrollañ", 9 | "Search" : "Klask", 10 | "Filter" : "Filtre", 11 | "Categories" : "Rummadoù", 12 | "Rename" : "Adenvel", 13 | "Add" : "Ouzhpennañ", 14 | "Name" : "Anv", 15 | "Clear" : "Netaat", 16 | "Apply" : "Lakaat", 17 | "Dismiss" : "Arrest", 18 | "Cancel" : "Nullañ", 19 | "OK" : "OK", 20 | "Description" : "Diskrivadur", 21 | "URL" : "URL", 22 | "Loading…" : "O Kargañ..." 23 | }, 24 | "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); 25 | -------------------------------------------------------------------------------- /l10n/br.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "e %s", 3 | "Tags" : "Klavioù", 4 | "None" : "Hini ebet", 5 | "Edit" : "Cheñch", 6 | "Save" : "Enrollañ", 7 | "Search" : "Klask", 8 | "Filter" : "Filtre", 9 | "Categories" : "Rummadoù", 10 | "Rename" : "Adenvel", 11 | "Add" : "Ouzhpennañ", 12 | "Name" : "Anv", 13 | "Clear" : "Netaat", 14 | "Apply" : "Lakaat", 15 | "Dismiss" : "Arrest", 16 | "Cancel" : "Nullañ", 17 | "OK" : "OK", 18 | "Description" : "Diskrivadur", 19 | "URL" : "URL", 20 | "Loading…" : "O Kargañ..." 21 | },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" 22 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "u %s", 5 | "None" : "Ništa", 6 | "Edit" : "Izmjeni", 7 | "Save" : "Spremi", 8 | "Search" : "Search", 9 | "Rename" : "Preimenuj", 10 | "Add" : "Dodaj", 11 | "Name" : "Ime", 12 | "Cancel" : "Otkaži", 13 | "OK" : "OK", 14 | "Description" : "Opis", 15 | "URL" : "Url" 16 | }, 17 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 18 | -------------------------------------------------------------------------------- /l10n/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "u %s", 3 | "None" : "Ništa", 4 | "Edit" : "Izmjeni", 5 | "Save" : "Spremi", 6 | "Search" : "Search", 7 | "Rename" : "Preimenuj", 8 | "Add" : "Dodaj", 9 | "Name" : "Ime", 10 | "Cancel" : "Otkaži", 11 | "OK" : "OK", 12 | "Description" : "Opis", 13 | "URL" : "Url" 14 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 15 | } -------------------------------------------------------------------------------- /l10n/cy_GB.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Category" : "Categori", 5 | "Tags" : "Tagiau", 6 | "None" : "Dim", 7 | "Page not found" : "Heb ganfod y dudalen", 8 | "Edit" : "Golygu", 9 | "Save" : "Cadw", 10 | "Search" : "Chwilio", 11 | "Categories" : "Categorïau", 12 | "Rename" : "Ailenwi", 13 | "Add" : "Ychwanegu", 14 | "Name" : "Enw", 15 | "Tools" : "Offer", 16 | "Cancel" : "Diddymu", 17 | "OK" : "Iawn", 18 | "Description" : "Disgrifiad", 19 | "URL" : "URL", 20 | "Loading…" : "Yn llwytho…", 21 | "Last modified" : "Newidiwyd diwethaf" 22 | }, 23 | "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); 24 | -------------------------------------------------------------------------------- /l10n/cy_GB.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Category" : "Categori", 3 | "Tags" : "Tagiau", 4 | "None" : "Dim", 5 | "Page not found" : "Heb ganfod y dudalen", 6 | "Edit" : "Golygu", 7 | "Save" : "Cadw", 8 | "Search" : "Chwilio", 9 | "Categories" : "Categorïau", 10 | "Rename" : "Ailenwi", 11 | "Add" : "Ychwanegu", 12 | "Name" : "Enw", 13 | "Tools" : "Offer", 14 | "Cancel" : "Diddymu", 15 | "OK" : "Iawn", 16 | "Description" : "Disgrifiad", 17 | "URL" : "URL", 18 | "Loading…" : "Yn llwytho…", 19 | "Last modified" : "Newidiwyd diwethaf" 20 | },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" 21 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_AR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categoría", 14 | "Rename" : "Renombrar", 15 | "Add" : "Añadir", 16 | "Name" : "Nombre", 17 | "Clear" : "Borrar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Despedir", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando…", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_AR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categoría", 12 | "Rename" : "Renombrar", 13 | "Add" : "Añadir", 14 | "Name" : "Nombre", 15 | "Clear" : "Borrar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Despedir", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando…", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_CL.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_MX.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Order" : "Ordenar", 18 | "Clear" : "Limpiar", 19 | "Apply" : "Aplicar", 20 | "Tools" : "Herramientas", 21 | "Dismiss" : "Descartar", 22 | "Cancel" : "Cancelar", 23 | "OK" : "OK", 24 | "Description" : "Descripción", 25 | "URL" : "URL", 26 | "Image" : "Imagen", 27 | "Loading…" : "Cargando...", 28 | "Last modified" : "Última modificación", 29 | "Energy" : "Energía" 30 | }, 31 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 32 | -------------------------------------------------------------------------------- /l10n/es_MX.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Order" : "Ordenar", 16 | "Clear" : "Limpiar", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Image" : "Imagen", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación", 27 | "Energy" : "Energía" 28 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 29 | } -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Clear" : "Limpiar", 18 | "Apply" : "Aplicar", 19 | "Tools" : "Herramientas", 20 | "Dismiss" : "Descartar", 21 | "Cancel" : "Cancelar", 22 | "OK" : "OK", 23 | "Description" : "Descripción", 24 | "URL" : "URL", 25 | "Loading…" : "Cargando...", 26 | "Last modified" : "Última modificación" 27 | }, 28 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 29 | -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Clear" : "Limpiar", 16 | "Apply" : "Aplicar", 17 | "Tools" : "Herramientas", 18 | "Dismiss" : "Descartar", 19 | "Cancel" : "Cancelar", 20 | "OK" : "OK", 21 | "Description" : "Descripción", 22 | "URL" : "URL", 23 | "Loading…" : "Cargando...", 24 | "Last modified" : "Última modificación" 25 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 26 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "en %s", 5 | "Category" : "Categoría", 6 | "Tags" : "Etiquetas", 7 | "None" : "Ninguno", 8 | "Page not found" : "Página no encontrada", 9 | "Edit" : "Editar", 10 | "Save" : "Guardar", 11 | "Search" : "Buscar", 12 | "Filter" : "Filtrar", 13 | "Categories" : "Categorías", 14 | "Rename" : "Renombrar", 15 | "Add" : "Agregar", 16 | "Name" : "Nombre", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Herramientas", 19 | "Dismiss" : "Descartar", 20 | "Cancel" : "Cancelar", 21 | "OK" : "OK", 22 | "Description" : "Descripción", 23 | "URL" : "URL", 24 | "Loading…" : "Cargando...", 25 | "Last modified" : "Última modificación" 26 | }, 27 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 28 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "en %s", 3 | "Category" : "Categoría", 4 | "Tags" : "Etiquetas", 5 | "None" : "Ninguno", 6 | "Page not found" : "Página no encontrada", 7 | "Edit" : "Editar", 8 | "Save" : "Guardar", 9 | "Search" : "Buscar", 10 | "Filter" : "Filtrar", 11 | "Categories" : "Categorías", 12 | "Rename" : "Renombrar", 13 | "Add" : "Agregar", 14 | "Name" : "Nombre", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Herramientas", 17 | "Dismiss" : "Descartar", 18 | "Cancel" : "Cancelar", 19 | "OK" : "OK", 20 | "Description" : "Descripción", 21 | "URL" : "URL", 22 | "Loading…" : "Cargando...", 23 | "Last modified" : "Última modificación" 24 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 25 | } -------------------------------------------------------------------------------- /l10n/gd.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Category" : "Roinn-seòrsa", 5 | "Tags" : "Tagaichean", 6 | "None" : "Chan eil gin", 7 | "Edit" : "Deasaich", 8 | "Save" : "Sàbhail", 9 | "Search" : "Lorg", 10 | "Rename" : "Thoir ainm ùr air", 11 | "Name" : "Ainm", 12 | "Dismiss" : "Leig seachad", 13 | "Cancel" : "Sguir dheth", 14 | "OK" : "Ceart ma-thà", 15 | "Loading…" : "’Ga luchdadh…" 16 | }, 17 | "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); 18 | -------------------------------------------------------------------------------- /l10n/gd.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Category" : "Roinn-seòrsa", 3 | "Tags" : "Tagaichean", 4 | "None" : "Chan eil gin", 5 | "Edit" : "Deasaich", 6 | "Save" : "Sàbhail", 7 | "Search" : "Lorg", 8 | "Rename" : "Thoir ainm ùr air", 9 | "Name" : "Ainm", 10 | "Dismiss" : "Leig seachad", 11 | "Cancel" : "Sguir dheth", 12 | "OK" : "Ceart ma-thà", 13 | "Loading…" : "’Ga luchdadh…" 14 | },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" 15 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "in %s", 5 | "Category" : "Categoria", 6 | "Tags" : "Etiquettas", 7 | "None" : "Nulle", 8 | "Edit" : "Modificar", 9 | "Save" : "Salveguardar", 10 | "Search" : "Cercar", 11 | "Rename" : "Renominar", 12 | "Add" : "Adder", 13 | "Name" : "Nomine", 14 | "Apply" : "Applicar", 15 | "Dismiss" : "Dimitter", 16 | "Cancel" : "Cancellar", 17 | "OK" : "Ok", 18 | "Description" : "Description", 19 | "URL" : "URL", 20 | "Loading…" : "Cargante..." 21 | }, 22 | "nplurals=2; plural=(n != 1);"); 23 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "in %s", 3 | "Category" : "Categoria", 4 | "Tags" : "Etiquettas", 5 | "None" : "Nulle", 6 | "Edit" : "Modificar", 7 | "Save" : "Salveguardar", 8 | "Search" : "Cercar", 9 | "Rename" : "Renominar", 10 | "Add" : "Adder", 11 | "Name" : "Nomine", 12 | "Apply" : "Applicar", 13 | "Dismiss" : "Dimitter", 14 | "Cancel" : "Cancellar", 15 | "OK" : "Ok", 16 | "Description" : "Description", 17 | "URL" : "URL", 18 | "Loading…" : "Cargante..." 19 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 20 | } -------------------------------------------------------------------------------- /l10n/id.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Recipes" : "Resep", 5 | "in %s" : "dalam %s", 6 | "Category" : "Kategori", 7 | "Tags" : "Tag", 8 | "None" : "Tidak ada", 9 | "Page not found" : "Halaman tidak ditemukan", 10 | "Edit" : "Sunting", 11 | "Save" : "Simpan", 12 | "Search" : "Cari", 13 | "Filter" : "Filter", 14 | "Categories" : "Kategori", 15 | "Rename" : "Ubah nama", 16 | "Add" : "Masukkan", 17 | "Name" : "Nama", 18 | "Order" : "Pesan", 19 | "Clear" : "Bersihkan", 20 | "Apply" : "Terapkan", 21 | "Creation date" : "Tanggal pembuatan", 22 | "Tools" : "Peralatan", 23 | "Dismiss" : "Batal", 24 | "Cancel" : "Membatalkan", 25 | "OK" : "OK", 26 | "Description" : "Deskrisi", 27 | "URL" : "URL", 28 | "Image" : "Gambar", 29 | "Loading…" : "Memuat…", 30 | "Last modified" : "Terakhir diubah" 31 | }, 32 | "nplurals=1; plural=0;"); 33 | -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Recipes" : "Resep", 3 | "in %s" : "dalam %s", 4 | "Category" : "Kategori", 5 | "Tags" : "Tag", 6 | "None" : "Tidak ada", 7 | "Page not found" : "Halaman tidak ditemukan", 8 | "Edit" : "Sunting", 9 | "Save" : "Simpan", 10 | "Search" : "Cari", 11 | "Filter" : "Filter", 12 | "Categories" : "Kategori", 13 | "Rename" : "Ubah nama", 14 | "Add" : "Masukkan", 15 | "Name" : "Nama", 16 | "Order" : "Pesan", 17 | "Clear" : "Bersihkan", 18 | "Apply" : "Terapkan", 19 | "Creation date" : "Tanggal pembuatan", 20 | "Tools" : "Peralatan", 21 | "Dismiss" : "Batal", 22 | "Cancel" : "Membatalkan", 23 | "OK" : "OK", 24 | "Description" : "Deskrisi", 25 | "URL" : "URL", 26 | "Image" : "Gambar", 27 | "Loading…" : "Memuat…", 28 | "Last modified" : "Terakhir diubah" 29 | },"pluralForm" :"nplurals=1; plural=0;" 30 | } -------------------------------------------------------------------------------- /l10n/ka.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Recipes" : "Recipes", 5 | "in %s" : "in %s", 6 | "Category" : "Category", 7 | "Tags" : "Tags", 8 | "None" : "None", 9 | "Page not found" : "Page not found", 10 | "Edit" : "Edit", 11 | "Save" : "Save", 12 | "Search" : "Search", 13 | "Filter" : "Filter", 14 | "Categories" : "Categories", 15 | "Rename" : "Rename", 16 | "Add" : "Add", 17 | "Name" : "Name", 18 | "Clear" : "Clear", 19 | "Tools" : "Tools", 20 | "Dismiss" : "Dismiss", 21 | "Cancel" : "Cancel", 22 | "OK" : "OK", 23 | "Description" : "Description", 24 | "URL" : "URL", 25 | "Image" : "Image", 26 | "Loading…" : "Loading…", 27 | "Last modified" : "Last modified" 28 | }, 29 | "nplurals=2; plural=(n!=1);"); 30 | -------------------------------------------------------------------------------- /l10n/ka.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Recipes" : "Recipes", 3 | "in %s" : "in %s", 4 | "Category" : "Category", 5 | "Tags" : "Tags", 6 | "None" : "None", 7 | "Page not found" : "Page not found", 8 | "Edit" : "Edit", 9 | "Save" : "Save", 10 | "Search" : "Search", 11 | "Filter" : "Filter", 12 | "Categories" : "Categories", 13 | "Rename" : "Rename", 14 | "Add" : "Add", 15 | "Name" : "Name", 16 | "Clear" : "Clear", 17 | "Tools" : "Tools", 18 | "Dismiss" : "Dismiss", 19 | "Cancel" : "Cancel", 20 | "OK" : "OK", 21 | "Description" : "Description", 22 | "URL" : "URL", 23 | "Image" : "Image", 24 | "Loading…" : "Loading…", 25 | "Last modified" : "Last modified" 26 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 27 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "%s-ში", 5 | "Category" : "კატეგორია", 6 | "Tags" : "ტეგები", 7 | "None" : "არც ერთი", 8 | "Page not found" : "გვერდი არაა ნაპოვნი", 9 | "Edit" : "შეცვლა", 10 | "Save" : "შენახვა", 11 | "Search" : "ძიება", 12 | "Filter" : "ფილტრი", 13 | "Categories" : "კატეგორიები", 14 | "Rename" : "სახელის შეცვლა", 15 | "Add" : "დამატება", 16 | "Name" : "სახელი", 17 | "Clear" : "გასუფთავება", 18 | "Apply" : "გამოყენება", 19 | "Tools" : "ხელსაწყოები", 20 | "Dismiss" : "დათხოვნა", 21 | "Cancel" : "უარყოფა", 22 | "OK" : "კარგი", 23 | "Description" : "აღწერილობა", 24 | "URL" : "მისამართი", 25 | "Loading…" : "იტვირთება…", 26 | "Last modified" : "ბოლო ცვლილება" 27 | }, 28 | "nplurals=2; plural=(n!=1);"); 29 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "%s-ში", 3 | "Category" : "კატეგორია", 4 | "Tags" : "ტეგები", 5 | "None" : "არც ერთი", 6 | "Page not found" : "გვერდი არაა ნაპოვნი", 7 | "Edit" : "შეცვლა", 8 | "Save" : "შენახვა", 9 | "Search" : "ძიება", 10 | "Filter" : "ფილტრი", 11 | "Categories" : "კატეგორიები", 12 | "Rename" : "სახელის შეცვლა", 13 | "Add" : "დამატება", 14 | "Name" : "სახელი", 15 | "Clear" : "გასუფთავება", 16 | "Apply" : "გამოყენება", 17 | "Tools" : "ხელსაწყოები", 18 | "Dismiss" : "დათხოვნა", 19 | "Cancel" : "უარყოფა", 20 | "OK" : "კარგი", 21 | "Description" : "აღწერილობა", 22 | "URL" : "მისამართი", 23 | "Loading…" : "იტვირთება…", 24 | "Last modified" : "ბოლო ცვლილება" 25 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 26 | } -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Tags" : "Tibzimin", 5 | "None" : "Ula d yiwen", 6 | "Page not found" : "Ulac asebter", 7 | "Edit" : "Ẓreg", 8 | "Save" : "Sekles", 9 | "Search" : "Nadi", 10 | "Filter" : "Sizdeg", 11 | "Rename" : "Beddel isem", 12 | "Add" : "Rnu", 13 | "Name" : "Nom", 14 | "Dismiss" : "Agi", 15 | "Cancel" : "Sefsex", 16 | "OK" : "IH", 17 | "Loading…" : "Asali..." 18 | }, 19 | "nplurals=2; plural=(n != 1);"); 20 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Tags" : "Tibzimin", 3 | "None" : "Ula d yiwen", 4 | "Page not found" : "Ulac asebter", 5 | "Edit" : "Ẓreg", 6 | "Save" : "Sekles", 7 | "Search" : "Nadi", 8 | "Filter" : "Sizdeg", 9 | "Rename" : "Beddel isem", 10 | "Add" : "Rnu", 11 | "Name" : "Nom", 12 | "Dismiss" : "Agi", 13 | "Cancel" : "Sefsex", 14 | "OK" : "IH", 15 | "Loading…" : "Asali..." 16 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 17 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Tags" : "ស្លាក", 5 | "None" : "គ្មាន", 6 | "Edit" : "កែប្រែ", 7 | "Save" : "រក្សាទុក", 8 | "Search" : "Search", 9 | "Rename" : "ប្ដូរ​ឈ្មោះ", 10 | "Add" : "បញ្ចូល", 11 | "Name" : "ឈ្មោះ", 12 | "Apply" : "អនុវត្ត", 13 | "Cancel" : "បោះបង់", 14 | "OK" : "ព្រម", 15 | "Description" : "ការ​អធិប្បាយ", 16 | "URL" : "URL" 17 | }, 18 | "nplurals=1; plural=0;"); 19 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Tags" : "ស្លាក", 3 | "None" : "គ្មាន", 4 | "Edit" : "កែប្រែ", 5 | "Save" : "រក្សាទុក", 6 | "Search" : "Search", 7 | "Rename" : "ប្ដូរ​ឈ្មោះ", 8 | "Add" : "បញ្ចូល", 9 | "Name" : "ឈ្មោះ", 10 | "Apply" : "អនុវត្ត", 11 | "Cancel" : "បោះបង់", 12 | "OK" : "ព្រម", 13 | "Description" : "ការ​អធិប្បាយ", 14 | "URL" : "URL" 15 | },"pluralForm" :"nplurals=1; plural=0;" 16 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "an %s", 5 | "Tags" : "Tags", 6 | "None" : "Keng", 7 | "Edit" : "Änneren", 8 | "Save" : "Späicheren", 9 | "Search" : "Search", 10 | "Rename" : "Ëmbenennen", 11 | "Add" : "Derbäimaachen", 12 | "Name" : "Numm", 13 | "Apply" : "Uwenden", 14 | "Dismiss" : "Ofbriechen", 15 | "Cancel" : "Ofbriechen", 16 | "OK" : "OK", 17 | "Description" : "Beschreiwung", 18 | "URL" : "URL", 19 | "Loading…" : "Et gëtt gelueden" 20 | }, 21 | "nplurals=2; plural=(n != 1);"); 22 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "an %s", 3 | "Tags" : "Tags", 4 | "None" : "Keng", 5 | "Edit" : "Änneren", 6 | "Save" : "Späicheren", 7 | "Search" : "Search", 8 | "Rename" : "Ëmbenennen", 9 | "Add" : "Derbäimaachen", 10 | "Name" : "Numm", 11 | "Apply" : "Uwenden", 12 | "Dismiss" : "Ofbriechen", 13 | "Cancel" : "Ofbriechen", 14 | "OK" : "OK", 15 | "Description" : "Beschreiwung", 16 | "URL" : "URL", 17 | "Loading…" : "Et gëtt gelueden" 18 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 19 | } -------------------------------------------------------------------------------- /l10n/lo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Tags" : "ປ້າຍກຳກັບ", 5 | "None" : "ບໍ່ມີ", 6 | "Edit" : "ແກ້ໄຂ", 7 | "Save" : "ບັນທຶກ", 8 | "Search" : "ຄົ້ນຫາ", 9 | "Rename" : "ປ່ຽນຊື່", 10 | "Add" : "ເພີ່ມ", 11 | "Name" : "ຊື່", 12 | "Dismiss" : "ຍົກເລີກ", 13 | "Cancel" : "ຍົກເລີກ", 14 | "OK" : "ຕົກລົງ", 15 | "URL" : "URL", 16 | "Loading…" : "ກຳລັງໂຫຼດ" 17 | }, 18 | "nplurals=1; plural=0;"); 19 | -------------------------------------------------------------------------------- /l10n/lo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Tags" : "ປ້າຍກຳກັບ", 3 | "None" : "ບໍ່ມີ", 4 | "Edit" : "ແກ້ໄຂ", 5 | "Save" : "ບັນທຶກ", 6 | "Search" : "ຄົ້ນຫາ", 7 | "Rename" : "ປ່ຽນຊື່", 8 | "Add" : "ເພີ່ມ", 9 | "Name" : "ຊື່", 10 | "Dismiss" : "ຍົກເລີກ", 11 | "Cancel" : "ຍົກເລີກ", 12 | "OK" : "ຕົກລົງ", 13 | "URL" : "URL", 14 | "Loading…" : "ກຳລັງໂຫຼດ" 15 | },"pluralForm" :"nplurals=1; plural=0;" 16 | } -------------------------------------------------------------------------------- /l10n/mk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "во %s", 5 | "Category" : "Категорија", 6 | "Tags" : "Ознаки", 7 | "None" : "Ништо", 8 | "Page not found" : "Страницата не е пронајдена", 9 | "Edit" : "Уреди", 10 | "Save" : "Зачувај", 11 | "Search" : "Барај", 12 | "Filter" : "Филтер", 13 | "Categories" : "Категории", 14 | "Rename" : "Преименувај", 15 | "Add" : "Додади", 16 | "Name" : "Име", 17 | "Search term" : "Пребарувај термин", 18 | "Keywords" : "Клучни зборови", 19 | "Clear" : "Исчисти", 20 | "Apply" : "Примени", 21 | "Tools" : "Алатки", 22 | "Dismiss" : "Отфрли", 23 | "Cancel" : "Откажи", 24 | "OK" : "Добро", 25 | "Description" : "Опис", 26 | "URL" : "Адреса", 27 | "Image" : "Слика", 28 | "Instructions" : "Инструкции", 29 | "Loading…" : "Се вчитува…", 30 | "Date created" : "Датум на креирање", 31 | "Last modified" : "Скоро изменети", 32 | "Source" : "Извор" 33 | }, 34 | "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); 35 | -------------------------------------------------------------------------------- /l10n/mk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "во %s", 3 | "Category" : "Категорија", 4 | "Tags" : "Ознаки", 5 | "None" : "Ништо", 6 | "Page not found" : "Страницата не е пронајдена", 7 | "Edit" : "Уреди", 8 | "Save" : "Зачувај", 9 | "Search" : "Барај", 10 | "Filter" : "Филтер", 11 | "Categories" : "Категории", 12 | "Rename" : "Преименувај", 13 | "Add" : "Додади", 14 | "Name" : "Име", 15 | "Search term" : "Пребарувај термин", 16 | "Keywords" : "Клучни зборови", 17 | "Clear" : "Исчисти", 18 | "Apply" : "Примени", 19 | "Tools" : "Алатки", 20 | "Dismiss" : "Отфрли", 21 | "Cancel" : "Откажи", 22 | "OK" : "Добро", 23 | "Description" : "Опис", 24 | "URL" : "Адреса", 25 | "Image" : "Слика", 26 | "Instructions" : "Инструкции", 27 | "Loading…" : "Се вчитува…", 28 | "Date created" : "Датум на креирање", 29 | "Last modified" : "Скоро изменети", 30 | "Source" : "Извор" 31 | },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" 32 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Category" : "Ангилал", 5 | "Tags" : "Tag-үүд", 6 | "None" : "юу ч үгүй", 7 | "Edit" : "засварлах", 8 | "Save" : "Хадгалах", 9 | "Search" : "Хайх", 10 | "Filter" : "Шүүлтүүр", 11 | "Categories" : "төрөл", 12 | "Rename" : "Нэрлэнэ үү", 13 | "Add" : "нэмэх", 14 | "Name" : "Нэр", 15 | "Apply" : "хэрэглэх", 16 | "Dismiss" : "Арилгах", 17 | "Cancel" : "болиулах", 18 | "OK" : "ок", 19 | "Description" : "Тодорхойлолт", 20 | "URL" : "URL", 21 | "Loading…" : "уншиж байна", 22 | "Last modified" : "Сүүлд өөрчилсөн" 23 | }, 24 | "nplurals=2; plural=(n != 1);"); 25 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Category" : "Ангилал", 3 | "Tags" : "Tag-үүд", 4 | "None" : "юу ч үгүй", 5 | "Edit" : "засварлах", 6 | "Save" : "Хадгалах", 7 | "Search" : "Хайх", 8 | "Filter" : "Шүүлтүүр", 9 | "Categories" : "төрөл", 10 | "Rename" : "Нэрлэнэ үү", 11 | "Add" : "нэмэх", 12 | "Name" : "Нэр", 13 | "Apply" : "хэрэглэх", 14 | "Dismiss" : "Арилгах", 15 | "Cancel" : "болиулах", 16 | "OK" : "ок", 17 | "Description" : "Тодорхойлолт", 18 | "URL" : "URL", 19 | "Loading…" : "уншиж байна", 20 | "Last modified" : "Сүүлд өөрчилсөн" 21 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 22 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "i %s", 5 | "Category" : "Kategori", 6 | "Tags" : "Emneord", 7 | "None" : "Ingen", 8 | "Page not found" : "Fann ikkje sida", 9 | "Edit" : "Rediger", 10 | "Save" : "Lagre", 11 | "Search" : "Search", 12 | "Filter" : "Filter", 13 | "Rename" : "Gje nytt namn", 14 | "Add" : "Legg til", 15 | "Name" : "Namn", 16 | "Apply" : "Anvend", 17 | "Dismiss" : "Forkast", 18 | "Cancel" : "Avbryt", 19 | "OK" : "OK", 20 | "Description" : "Skildring", 21 | "URL" : "URL", 22 | "Loading…" : "Laster...", 23 | "Last modified" : "Siste endra" 24 | }, 25 | "nplurals=2; plural=(n != 1);"); 26 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "i %s", 3 | "Category" : "Kategori", 4 | "Tags" : "Emneord", 5 | "None" : "Ingen", 6 | "Page not found" : "Fann ikkje sida", 7 | "Edit" : "Rediger", 8 | "Save" : "Lagre", 9 | "Search" : "Search", 10 | "Filter" : "Filter", 11 | "Rename" : "Gje nytt namn", 12 | "Add" : "Legg til", 13 | "Name" : "Namn", 14 | "Apply" : "Anvend", 15 | "Dismiss" : "Forkast", 16 | "Cancel" : "Avbryt", 17 | "OK" : "OK", 18 | "Description" : "Skildring", 19 | "URL" : "URL", 20 | "Loading…" : "Laster...", 21 | "Last modified" : "Siste endra" 22 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 23 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "dins %s", 5 | "Category" : "Categoria", 6 | "Tags" : "Etiquetas", 7 | "None" : "Cap", 8 | "Page not found" : "Pagina pas trobada", 9 | "Edit" : "Modificar", 10 | "Save" : "Enregistrar", 11 | "Search" : "Search", 12 | "Categories" : "Categorias", 13 | "Rename" : "Renomenar", 14 | "Add" : "Ajustar", 15 | "Name" : "Nom", 16 | "Clear" : "Escafar", 17 | "Apply" : "Aplicar", 18 | "Tools" : "Aisinas", 19 | "Dismiss" : "Regetar", 20 | "Cancel" : "Anullar", 21 | "OK" : "D’acòrdi", 22 | "Calories" : "Calorias", 23 | "Description" : "Descripcion", 24 | "URL" : "URL", 25 | "Loading…" : "Cargament…" 26 | }, 27 | "nplurals=2; plural=(n > 1);"); 28 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "dins %s", 3 | "Category" : "Categoria", 4 | "Tags" : "Etiquetas", 5 | "None" : "Cap", 6 | "Page not found" : "Pagina pas trobada", 7 | "Edit" : "Modificar", 8 | "Save" : "Enregistrar", 9 | "Search" : "Search", 10 | "Categories" : "Categorias", 11 | "Rename" : "Renomenar", 12 | "Add" : "Ajustar", 13 | "Name" : "Nom", 14 | "Clear" : "Escafar", 15 | "Apply" : "Aplicar", 16 | "Tools" : "Aisinas", 17 | "Dismiss" : "Regetar", 18 | "Cancel" : "Anullar", 19 | "OK" : "D’acòrdi", 20 | "Calories" : "Calorias", 21 | "Description" : "Descripcion", 22 | "URL" : "URL", 23 | "Loading…" : "Cargament…" 24 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 25 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Category" : "ප්‍රවර්ගය", 5 | "Edit" : "සංස්කරණය", 6 | "Save" : "සුරකින්න", 7 | "Search" : "සොයන්න", 8 | "Filter" : "පෙරහන", 9 | "Rename" : "නැවත නම් කරන්න", 10 | "Add" : "එකතු කරන්න", 11 | "Name" : "නම", 12 | "Cancel" : "අවලංගු කරන්න", 13 | "OK" : "හරි", 14 | "Description" : "විස්තරය", 15 | "Loading…" : "පූරණය වෙමින්…" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Category" : "ප්‍රවර්ගය", 3 | "Edit" : "සංස්කරණය", 4 | "Save" : "සුරකින්න", 5 | "Search" : "සොයන්න", 6 | "Filter" : "පෙරහන", 7 | "Rename" : "නැවත නම් කරන්න", 8 | "Add" : "එකතු කරන්න", 9 | "Name" : "නම", 10 | "Cancel" : "අවලංගු කරන්න", 11 | "OK" : "හරි", 12 | "Description" : "විස්තරය", 13 | "Loading…" : "පූරණය වෙමින්…" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/sq.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "në %s", 5 | "Category" : "Kategori", 6 | "Tags" : "Etiketat", 7 | "None" : "Asnjë", 8 | "Page not found" : "Faqja nuk u gjet ", 9 | "Edit" : "Përpuno", 10 | "Save" : "Ruaj", 11 | "Search" : "Kërko", 12 | "Filter" : "Filtro", 13 | "Categories" : "Kategoritë", 14 | "Rename" : "Rename", 15 | "Add" : "Shto", 16 | "Name" : "Emri", 17 | "Clear" : "Pastro", 18 | "Apply" : "Apliko", 19 | "Tools" : "Mjete", 20 | "Dismiss" : "Hiq", 21 | "Cancel" : "Anullo", 22 | "OK" : "OK", 23 | "Description" : "Përshkrim", 24 | "URL" : "Url", 25 | "Loading…" : "Duke u ngarkuar…", 26 | "Last modified" : "Ndryshuar së fundmi" 27 | }, 28 | "nplurals=2; plural=(n != 1);"); 29 | -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "në %s", 3 | "Category" : "Kategori", 4 | "Tags" : "Etiketat", 5 | "None" : "Asnjë", 6 | "Page not found" : "Faqja nuk u gjet ", 7 | "Edit" : "Përpuno", 8 | "Save" : "Ruaj", 9 | "Search" : "Kërko", 10 | "Filter" : "Filtro", 11 | "Categories" : "Kategoritë", 12 | "Rename" : "Rename", 13 | "Add" : "Shto", 14 | "Name" : "Emri", 15 | "Clear" : "Pastro", 16 | "Apply" : "Apliko", 17 | "Tools" : "Mjete", 18 | "Dismiss" : "Hiq", 19 | "Cancel" : "Anullo", 20 | "OK" : "OK", 21 | "Description" : "Përshkrim", 22 | "URL" : "Url", 23 | "Loading…" : "Duke u ngarkuar…", 24 | "Last modified" : "Ndryshuar së fundmi" 25 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 26 | } -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "u %s", 5 | "Category" : "Kategorija", 6 | "Tags" : "Oznake", 7 | "None" : "Ništa", 8 | "Edit" : "Izmeni", 9 | "Save" : "Sačuvaj", 10 | "Search" : "Traži", 11 | "Rename" : "Preimenuj", 12 | "Add" : "Dodaj", 13 | "Name" : "Ime", 14 | "Dismiss" : "Odbaci", 15 | "Cancel" : "Otkaži", 16 | "OK" : "U redu", 17 | "Description" : "Opis", 18 | "URL" : "Url", 19 | "Loading…" : "Učitavam…" 20 | }, 21 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 22 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "u %s", 3 | "Category" : "Kategorija", 4 | "Tags" : "Oznake", 5 | "None" : "Ništa", 6 | "Edit" : "Izmeni", 7 | "Save" : "Sačuvaj", 8 | "Search" : "Traži", 9 | "Rename" : "Preimenuj", 10 | "Add" : "Dodaj", 11 | "Name" : "Ime", 12 | "Dismiss" : "Odbaci", 13 | "Cancel" : "Otkaži", 14 | "OK" : "U redu", 15 | "Description" : "Opis", 16 | "URL" : "Url", 17 | "Loading…" : "Učitavam…" 18 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 19 | } -------------------------------------------------------------------------------- /l10n/ta.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Tags" : "சீட்டுகள்", 5 | "None" : "ஒன்றுமில்லை", 6 | "Edit" : "தொகுக்க", 7 | "Save" : "சேமிக்க ", 8 | "Search" : "Search", 9 | "Rename" : "பெயர்மாற்றம்", 10 | "Add" : "சேர்க்க", 11 | "Name" : "பெயர்", 12 | "Cancel" : "இரத்து செய்க", 13 | "OK" : "சரி ", 14 | "Description" : "விவரிப்பு", 15 | "URL" : "URL" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/ta.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Tags" : "சீட்டுகள்", 3 | "None" : "ஒன்றுமில்லை", 4 | "Edit" : "தொகுக்க", 5 | "Save" : "சேமிக்க ", 6 | "Search" : "Search", 7 | "Rename" : "பெயர்மாற்றம்", 8 | "Add" : "சேர்க்க", 9 | "Name" : "பெயர்", 10 | "Cancel" : "இரத்து செய்க", 11 | "OK" : "சரி ", 12 | "Description" : "விவரிப்பு", 13 | "URL" : "URL" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "in %s" : "ใน %s", 5 | "Category" : "หมวดหมู่", 6 | "Tags" : "แท็ก", 7 | "None" : "ไม่มี", 8 | "Page not found" : "ไม่พบหน้า", 9 | "Edit" : "แก้ไข", 10 | "Save" : "บันทึก", 11 | "Search" : "ค้นหา", 12 | "Filter" : "ตัวกรอง", 13 | "Categories" : "หมวดหมู่", 14 | "Rename" : "เปลี่ยนชื่อ", 15 | "Add" : "เพิ่ม", 16 | "Name" : "ชื่อ", 17 | "Clear" : "ล้าง", 18 | "Apply" : "นำไปใช้", 19 | "Dismiss" : "ปิดทิ้ง", 20 | "Cancel" : "ยกเลิก", 21 | "OK" : "ตกลง", 22 | "Description" : "คำอธิบาย", 23 | "URL" : "URL", 24 | "Loading…" : "กำลังโหลด..." 25 | }, 26 | "nplurals=1; plural=0;"); 27 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "in %s" : "ใน %s", 3 | "Category" : "หมวดหมู่", 4 | "Tags" : "แท็ก", 5 | "None" : "ไม่มี", 6 | "Page not found" : "ไม่พบหน้า", 7 | "Edit" : "แก้ไข", 8 | "Save" : "บันทึก", 9 | "Search" : "ค้นหา", 10 | "Filter" : "ตัวกรอง", 11 | "Categories" : "หมวดหมู่", 12 | "Rename" : "เปลี่ยนชื่อ", 13 | "Add" : "เพิ่ม", 14 | "Name" : "ชื่อ", 15 | "Clear" : "ล้าง", 16 | "Apply" : "นำไปใช้", 17 | "Dismiss" : "ปิดทิ้ง", 18 | "Cancel" : "ยกเลิก", 19 | "OK" : "ตกลง", 20 | "Description" : "คำอธิบาย", 21 | "URL" : "URL", 22 | "Loading…" : "กำลังโหลด..." 23 | },"pluralForm" :"nplurals=1; plural=0;" 24 | } -------------------------------------------------------------------------------- /l10n/uz.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "cookbook", 3 | { 4 | "Recipes" : "Retseptlar", 5 | "in %s" : " %s da", 6 | "Category" : "Kategoriya", 7 | "Tags" : "Tags", 8 | "None" : "None", 9 | "Page not found" : "Sahifa topilmadi", 10 | "Edit" : "Tahrirlash", 11 | "Save" : "Save", 12 | "Search" : "Search", 13 | "Filter" : "Filtr", 14 | "Categories" : "Kategoriyalar", 15 | "Rename" : "Rename", 16 | "Add" : "Add", 17 | "Name" : "Name", 18 | "Order" : "Buyurtma", 19 | "Dismiss" : "Dismiss", 20 | "Cancel" : "Cancel", 21 | "OK" : "OK", 22 | "Description" : "Tavsif", 23 | "Instructions" : "Ko'rsatmalar", 24 | "Loading…" : "Loading…" 25 | }, 26 | "nplurals=1; plural=0;"); 27 | -------------------------------------------------------------------------------- /l10n/uz.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Recipes" : "Retseptlar", 3 | "in %s" : " %s da", 4 | "Category" : "Kategoriya", 5 | "Tags" : "Tags", 6 | "None" : "None", 7 | "Page not found" : "Sahifa topilmadi", 8 | "Edit" : "Tahrirlash", 9 | "Save" : "Save", 10 | "Search" : "Search", 11 | "Filter" : "Filtr", 12 | "Categories" : "Kategoriyalar", 13 | "Rename" : "Rename", 14 | "Add" : "Add", 15 | "Name" : "Name", 16 | "Order" : "Buyurtma", 17 | "Dismiss" : "Dismiss", 18 | "Cancel" : "Cancel", 19 | "OK" : "OK", 20 | "Description" : "Tavsif", 21 | "Instructions" : "Ko'rsatmalar", 22 | "Loading…" : "Loading…" 23 | },"pluralForm" :"nplurals=1; plural=0;" 24 | } -------------------------------------------------------------------------------- /lib/AppInfo/Application.php: -------------------------------------------------------------------------------- 1 | registerSearchProvider(Provider::class); 20 | } 21 | 22 | public function boot(IBootContext $context): void { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/Controller/CategoryApiController.php: -------------------------------------------------------------------------------- 1 | impl = $categoryImplementation; 22 | } 23 | 24 | /** 25 | * @NoAdminRequired 26 | * @NoCSRFRequired 27 | * @CORS 28 | * 29 | * @return JSONResponse 30 | */ 31 | public function categories() { 32 | return $this->impl->index(); 33 | } 34 | 35 | /** 36 | * @NoAdminRequired 37 | * @NoCSRFRequired 38 | * @CORS 39 | * @param string $category 40 | * @return JSONResponse 41 | */ 42 | public function rename($category) { 43 | return $this->impl->rename($category); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Controller/CategoryController.php: -------------------------------------------------------------------------------- 1 | impl = $categoryImplementation; 22 | } 23 | 24 | /** 25 | * @NoAdminRequired 26 | * 27 | * @return JSONResponse 28 | */ 29 | public function categories() { 30 | return $this->impl->index(); 31 | } 32 | 33 | /** 34 | * @NoAdminRequired 35 | * @param string $category 36 | * @return JSONResponse 37 | */ 38 | public function rename($category) { 39 | return $this->impl->rename($category); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/Controller/ConfigController.php: -------------------------------------------------------------------------------- 1 | implementation = $configImplementation; 22 | } 23 | 24 | /** 25 | * @NoAdminRequired 26 | * 27 | * @return JSONResponse 28 | */ 29 | public function list() { 30 | return $this->implementation->list(); 31 | } 32 | 33 | /** 34 | * @NoAdminRequired 35 | * 36 | * @return JSONResponse 37 | */ 38 | public function config() { 39 | return $this->implementation->config(); 40 | } 41 | 42 | /** 43 | * @NoAdminRequired 44 | * 45 | * @return JSONResponse 46 | */ 47 | public function reindex() { 48 | return $this->implementation->reindex(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/Controller/Implementation/KeywordImplementation.php: -------------------------------------------------------------------------------- 1 | service = $recipeService; 20 | $this->dbCacheService = $dbCacheService; 21 | } 22 | /** 23 | * List all available keywords. 24 | * 25 | * @return JSONResponse 26 | */ 27 | public function index() { 28 | $this->dbCacheService->triggerCheck(); 29 | 30 | $keywords = $this->service->getAllKeywordsInSearchIndex(); 31 | 32 | return new JSONResponse($keywords, 200); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Controller/KeywordApiController.php: -------------------------------------------------------------------------------- 1 | impl = $keywordImplementation; 22 | } 23 | /** 24 | * @NoAdminRequired 25 | * @NoCSRFRequired 26 | * @CORS 27 | * 28 | * @return JSONResponse 29 | */ 30 | public function keywords() { 31 | return $this->impl->index(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Controller/KeywordController.php: -------------------------------------------------------------------------------- 1 | impl = $keywordImplementation; 22 | } 23 | /** 24 | * @NoAdminRequired 25 | * 26 | * @return JSONResponse 27 | */ 28 | public function keywords() { 29 | return $this->impl->index(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/Controller/UtilApiController.php: -------------------------------------------------------------------------------- 1 | [0, 11, 3], /* VERSION_TAG do not change this line manually */ 23 | 'api_version' => [ 24 | 'epoch' => 0, 25 | 'major' => 1, 26 | 'minor' => 2 27 | ] 28 | ]; 29 | 30 | return new JSONResponse($response, 200); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/Exception/CouldNotGuessEncodingException.php: -------------------------------------------------------------------------------- 1 | l = $l; 19 | } 20 | 21 | public function apply(array &$json): bool { 22 | if (substr($json['image'], 0, 2) === '//') { 23 | if (!isset($json['url'])) { 24 | throw new InvalidRecipeException($this->l->t('Could not guess image URL as no recipe URL was found.')); 25 | } 26 | 27 | if (preg_match('/^([a-zA-Z]+:)\/\//', $json['url'], $matches) !== 1) { 28 | throw new InvalidRecipeException($this->l->t('Could not guess image URL scheme from recipe URL %s', [$json['url']])); 29 | } 30 | 31 | $json['image'] = $matches[1] . $json['image']; 32 | 33 | return true; 34 | } else { 35 | return false; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/Helper/Filter/JSON/RecipeIdCopyFilter.php: -------------------------------------------------------------------------------- 1 | setJSONValue($json, '@context', 'http://schema.org')) { 12 | $changed = true; 13 | } 14 | if ($this->setJSONValue($json, '@type', 'Recipe')) { 15 | $changed = true; 16 | } 17 | return $changed; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/Helper/Filter/JSON/TimestampFixFilter.php: -------------------------------------------------------------------------------- 1 | handleTimestamp($json[$key], $changed); 16 | } 17 | } 18 | 19 | return $changed; 20 | } 21 | 22 | private function handleTimestamp(string $value, bool &$changed): string { 23 | $pattern = '/^([0-9]{4}-[0-9]{2}-[0-9]{2}) +(.*)/'; 24 | $replacement = '${1}T${2}'; 25 | $nv = preg_replace($pattern, $replacement, $value); 26 | 27 | if ($nv !== $value) { 28 | $changed = true; 29 | } 30 | 31 | return $nv; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /lib/Helper/Filter/Output/EnsureNutritionPresentFilter.php: -------------------------------------------------------------------------------- 1 | l = $l; 26 | $this->logger = $logger; 27 | } 28 | 29 | public function apply(array &$json): bool { 30 | $cache = $json; 31 | 32 | if (empty($json['nutrition']) || !is_array($json['nutrition'])) { 33 | $json['nutrition'] = []; 34 | } 35 | 36 | if (empty($json['nutrition']['@type'])) { 37 | $json['nutrition']['@type'] = 'NutritionInformation'; 38 | } 39 | 40 | return $json !== $cache; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Helper/Filter/Output/RecipeJSONOutputFilter.php: -------------------------------------------------------------------------------- 1 | filters = [ 16 | $ensureNutritionPresentFilter, 17 | ]; 18 | } 19 | 20 | /** 21 | * Fix the JSON output of a file to match the specifications 22 | * 23 | * @param array $json The content of the recipe 24 | * @return array The corrected recipe object 25 | */ 26 | public function filter(array $json): array { 27 | foreach ($this->filters as $filter) { 28 | /** @var AbstractJSONFilter $filter */ 29 | $filter->apply($json); 30 | } 31 | 32 | return $json; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Helper/Filter/Output/RecipeStubFilter.php: -------------------------------------------------------------------------------- 1 | filters = [ 22 | $recipeIdCopyFilter, 23 | $recipeIdTypeFilter, 24 | $timestampFixFilter, 25 | $timezoneFixFilter, 26 | ]; 27 | } 28 | 29 | public function apply(array $json): array { 30 | foreach ($this->filters as $filter) { 31 | $filter->apply($json); 32 | } 33 | 34 | return $json; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/Helper/HTMLFilter/AbstractHtmlFilter.php: -------------------------------------------------------------------------------- 1 | ' . $html; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/Helper/HTMLFilter/HtmlEntityDecodeFilter.php: -------------------------------------------------------------------------------- 1 | l = $l10n; 16 | } 17 | 18 | /** 19 | * Extract the recipe from the given document. 20 | * 21 | * @param \DOMDocument $document The document to parse 22 | * @param ?string $url The URL of the recipe to import 23 | * @return array The JSON content in the document as a PHP array 24 | * @throws HtmlParsingException If the parsing was not successful 25 | */ 26 | abstract public function parse(\DOMDocument $document, ?string $url): array; 27 | } 28 | -------------------------------------------------------------------------------- /lib/Helper/HTMLParser/AttributeNotFoundException.php: -------------------------------------------------------------------------------- 1 | 'full.jpg', 12 | self::THUMBNAIL => 'thumb.jpg', 13 | self::MINI_THUMBNAIL => 'thumb16.jpg', 14 | ]; 15 | } 16 | -------------------------------------------------------------------------------- /phpunit.integration.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | ./tests/Integration 15 | 16 | 17 | 18 | 19 | lib 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /phpunit.migration.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | ./tests/Migration 15 | 16 | 17 | 18 | 19 | lib 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | ./tests/Unit 15 | 16 | 17 | 18 | 19 | lib 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/bus/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud Cookbook app 3 | * Event bus module 4 | * ---------------------- 5 | * @license AGPL3 or later 6 | */ 7 | import mitt from 'mitt'; 8 | 9 | const emitter = mitt(); 10 | 11 | export default emitter; 12 | -------------------------------------------------------------------------------- /src/components/AppControls/LocationIndicator.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /src/components/AppControls/ModeIndicator.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /src/components/Modals/SimpleAlertModal.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | 18 | 23 | 24 | 41 | -------------------------------------------------------------------------------- /src/components/Modals/SimpleConfirmModal.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 20 | 21 | 26 | 27 | 45 | -------------------------------------------------------------------------------- /src/components/NotFound.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | 16 | 21 | 22 | 27 | -------------------------------------------------------------------------------- /src/components/RecipeView/RecipeNutritionInfoItem.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | 25 | 30 | 31 | 43 | -------------------------------------------------------------------------------- /src/components/RecipeView/RecipeTool.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 21 | 22 | 31 | -------------------------------------------------------------------------------- /src/components/Utilities/LoadingIndicator.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | 28 | 29 | 42 | -------------------------------------------------------------------------------- /src/composables/dateTimeHandling/index.js: -------------------------------------------------------------------------------- 1 | import moment from '@nextcloud/moment'; 2 | 3 | /** 4 | * The schema.org standard requires the dates formatted as Date (https://schema.org/Date) 5 | * or DateTime (https://schema.org/DateTime). This follows the ISO 8601 standard. 6 | * @param dt 7 | * @returns {null|moment.Moment|*} 8 | */ 9 | export function parseDateTime(dt) { 10 | if (!dt) return null; 11 | const date = moment(dt, moment.ISO_8601); 12 | if (!date.isValid()) { 13 | return null; 14 | } 15 | return date; 16 | } 17 | -------------------------------------------------------------------------------- /src/composables/useDelayedDisplay/index.js: -------------------------------------------------------------------------------- 1 | import { onMounted, ref } from 'vue'; 2 | 3 | export const DelayedDisplayProps = { 4 | /** Delay in milliseconds before the component is displayed */ 5 | delay: { 6 | type: Number, 7 | default: 0, 8 | }, 9 | }; 10 | 11 | export default function useDelayedDisplay(delay = 800) { 12 | /** 13 | * @type {import('vue').Ref} 14 | */ 15 | const isVisible = ref(false); 16 | 17 | // Vue lifecycle 18 | onMounted(() => { 19 | window.setTimeout(() => { 20 | isVisible.value = true; 21 | }, delay); 22 | }); 23 | 24 | return { isVisible }; 25 | } 26 | -------------------------------------------------------------------------------- /src/composables/useSettingsDialog/index.js: -------------------------------------------------------------------------------- 1 | export const SHOW_SETTINGS_EVENT = 'show-settings'; 2 | 3 | // export default function useSettingsDialog() { 4 | // return { 5 | // 'SHOW_SETTINGS_EVENT': SHOW_SETTINGS_EVENT 6 | // }; 7 | // }; 8 | -------------------------------------------------------------------------------- /src/js/LogicOperators/AndOperator.js: -------------------------------------------------------------------------------- 1 | import BinaryOperator from './BinaryOperator'; 2 | 3 | /** 4 | * Implementation for the AND operator. 5 | * @extends BinaryOperator 6 | */ 7 | class AndOperator extends BinaryOperator { 8 | // eslint-disable-next-line class-methods-use-this 9 | get toString() { 10 | return 'AND'; 11 | } 12 | 13 | /** 14 | * Applies the AND operation. 15 | * @param {boolean} result - The result accumulated so far. 16 | * @param {boolean} current - The current value to apply. 17 | * @returns {boolean} The result after applying the AND operation. 18 | */ 19 | // eslint-disable-next-line class-methods-use-this 20 | apply(result, current) { 21 | return result && current; 22 | } 23 | } 24 | 25 | export default AndOperator; 26 | -------------------------------------------------------------------------------- /src/js/LogicOperators/BinaryOperator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Abstract class for binary operators. 3 | * @abstract 4 | */ 5 | class BinaryOperator { 6 | // eslint-disable-next-line class-methods-use-this 7 | get toString() { 8 | return 'Abstract operation base class'; 9 | } 10 | 11 | /** 12 | * Constructor for the abstract class. 13 | * @throws {TypeError} Cannot instantiate abstract class. 14 | */ 15 | constructor() { 16 | if (new.target === BinaryOperator) { 17 | throw new TypeError('Cannot instantiate abstract class'); 18 | } 19 | } 20 | 21 | /** 22 | * Abstract method to be implemented by subclasses. 23 | * @param {boolean} result - The result accumulated so far. 24 | * @param {boolean} current - The current value to apply. 25 | * @throws {Error} Method 'apply' must be implemented by subclasses. 26 | */ 27 | // eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars,class-methods-use-this 28 | apply(result, current) { 29 | throw new Error("Method 'apply' must be implemented by subclasses"); 30 | } 31 | } 32 | 33 | export default BinaryOperator; 34 | -------------------------------------------------------------------------------- /src/js/LogicOperators/OrOperator.js: -------------------------------------------------------------------------------- 1 | import BinaryOperator from './BinaryOperator'; 2 | 3 | /** 4 | * Implementation for the OR operator. 5 | * @extends BinaryOperator 6 | */ 7 | class OrOperator extends BinaryOperator { 8 | // eslint-disable-next-line class-methods-use-this 9 | get toString() { 10 | return 'OR'; 11 | } 12 | 13 | /** 14 | * Applies the OR operation. 15 | * @param {boolean} result - The result accumulated so far. 16 | * @param {boolean} current - The current value to apply. 17 | * @returns {boolean} The result after applying the OR operation. 18 | */ 19 | // eslint-disable-next-line class-methods-use-this 20 | apply(result, current) { 21 | return result || current; 22 | } 23 | } 24 | 25 | export default OrOperator; 26 | -------------------------------------------------------------------------------- /src/js/LogicOperators/index.js: -------------------------------------------------------------------------------- 1 | import AndOperator from './AndOperator'; 2 | import BinaryOperator from './BinaryOperator'; 3 | import OrOperator from './OrOperator'; 4 | 5 | export { AndOperator, BinaryOperator, OrOperator }; 6 | -------------------------------------------------------------------------------- /src/js/RecipeFilters/RecipeFilter.js: -------------------------------------------------------------------------------- 1 | import { BinaryOperator } from '../LogicOperators'; 2 | 3 | /** 4 | * Abstract class for a recipe filter. 5 | * @abstract 6 | */ 7 | class RecipeFilter { 8 | /** 9 | * Constructor for the abstract class. 10 | * @param {BinaryOperator} operator - The binary operator for combining filter conditions. 11 | * @throws {TypeError} Invalid operator. 12 | */ 13 | constructor(operator) { 14 | if (!(operator instanceof BinaryOperator)) { 15 | throw new TypeError('Invalid operator'); 16 | } 17 | this.operator = operator; 18 | } 19 | 20 | /** 21 | * Abstract method to be implemented by subclasses. 22 | * @param {Object} recipe - The recipe object to be filtered. 23 | * @throws {Error} Method 'filter' must be implemented by subclasses. 24 | */ 25 | // eslint-disable-next-line class-methods-use-this,no-unused-vars,@typescript-eslint/no-unused-vars 26 | filter(recipe) { 27 | throw new Error("Method 'filter' must be implemented by subclasses"); 28 | } 29 | } 30 | 31 | // module.exports = RecipeFilter; 32 | export default RecipeFilter; 33 | -------------------------------------------------------------------------------- /src/js/RecipeFilters/index.js: -------------------------------------------------------------------------------- 1 | import RecipeCategoriesFilter from './RecipeCategoriesFilter'; 2 | import RecipeKeywordsFilter from './RecipeKeywordsFilter'; 3 | import RecipeNamesFilter from './RecipeNamesFilter'; 4 | 5 | export { RecipeCategoriesFilter, RecipeKeywordsFilter, RecipeNamesFilter }; 6 | -------------------------------------------------------------------------------- /src/js/modals.js: -------------------------------------------------------------------------------- 1 | import { create } from 'vue-modal-dialogs'; 2 | 3 | import SimpleAlertModal from '../components/Modals/SimpleAlertModal.vue'; 4 | import SimpleConfirmModal from '../components/Modals/SimpleConfirmModal.vue'; 5 | 6 | export const showSimpleAlertModal = create( 7 | SimpleAlertModal, 8 | 'content', 9 | 'title', 10 | ); 11 | export const showSimpleConfirmModal = create( 12 | SimpleConfirmModal, 13 | 'content', 14 | 'title', 15 | ); 16 | -------------------------------------------------------------------------------- /src/js/utils/applyRecipeFilters.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Function to apply a set of filters on an array of recipes. 3 | * @param {Object[]} recipes - The array of recipe objects to be filtered. 4 | * @param {RecipeFilter[]} filters - The array of filters to apply. 5 | * @returns {Object[]} The filtered array of recipes. 6 | */ 7 | function applyRecipeFilters(recipes, filters) { 8 | return recipes.filter((recipe) => 9 | filters.every((filter) => filter.filter(recipe)), 10 | ); 11 | } 12 | 13 | export default applyRecipeFilters; 14 | -------------------------------------------------------------------------------- /src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from 'vue'; 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue'; 3 | 4 | export default Vue; 5 | } 6 | -------------------------------------------------------------------------------- /src/store/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | extends: '../../.eslintrc.yml' 2 | 3 | rules: 4 | no-param-reassign: 5 | - error 6 | - props: true 7 | ignorePropertyModificationsFor: 8 | - state 9 | -------------------------------------------------------------------------------- /src/tests/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | jest: true 3 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | const stylelintConfig = require('@nextcloud/stylelint-config') 2 | 3 | stylelintConfig.extends.push('stylelint-config-idiomatic-order') 4 | 5 | stylelintConfig.rules['function-no-unknown'] = [true, { 6 | 'ignoreFunctions': ["math.div"] 7 | }] 8 | 9 | module.exports = stylelintConfig 10 | -------------------------------------------------------------------------------- /templates/index.php: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /templates/invalid_guest.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /tests/Integration/Helper/DownloadHelper/res/content-type.php: -------------------------------------------------------------------------------- 1 | 8 | Test 9 | -------------------------------------------------------------------------------- /tests/Integration/Helper/DownloadHelper/res/htaccess: -------------------------------------------------------------------------------- 1 | # Remove the Content-Type header from the request 2 | # https://stackoverflow.com/questions/2428563/how-can-i-prevent-apache2-from-setting-the-content-type-header 3 | 4 | Header always set Content-Type "" 5 | Header always unset Content-Type 6 | -------------------------------------------------------------------------------- /tests/Migration/AppTest.php: -------------------------------------------------------------------------------- 1 | container = $app->getContainer(); 21 | } 22 | 23 | public function testAppInstalled() { 24 | /** @var IAppManager $appManager */ 25 | $appManager = $this->container->query(IAppManager::class); 26 | $appManager->enableApp('cookbook'); 27 | $this->assertTrue($appManager->isInstalled('cookbook')); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Unit/Controller/CategoryApiControllerTest.php: -------------------------------------------------------------------------------- 1 | 'categories', 'implName' => 'index'], 27 | ['name' => 'rename', 'args' => [['my category']], 'once' => true], 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Unit/Controller/CategoryControllerTest.php: -------------------------------------------------------------------------------- 1 | 'categories', 'implName' => 'index'], 27 | ['name' => 'rename', 'args' => [['my category']], 'once' => true], 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Unit/Controller/ConfigApiControllerTest.php: -------------------------------------------------------------------------------- 1 | 'list'], 27 | ['name' => 'reindex'], 28 | ['name' => 'config', 'once' => true], 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /tests/Unit/Controller/ConfigControllerTest.php: -------------------------------------------------------------------------------- 1 | 'list'], 27 | ['name' => 'reindex'], 28 | ['name' => 'config', 'once' => true], 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /tests/Unit/Controller/KeywordApiControllerTest.php: -------------------------------------------------------------------------------- 1 | 'keywords', 'implName' => 'index'], 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Unit/Controller/KeywordControllerTest.php: -------------------------------------------------------------------------------- 1 | 'keywords', 'implName' => 'index'], 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Unit/Helper/DownloadEncodingHelper/iso-8859-1.orig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/cookbook/52c98e2275b3970968654c983b5fa1dc2cc0d05f/tests/Unit/Helper/DownloadEncodingHelper/iso-8859-1.orig -------------------------------------------------------------------------------- /tests/Unit/Helper/DownloadEncodingHelper/iso-8859-1.utf8: -------------------------------------------------------------------------------- 1 | abcäöüßÄÖÜ 2 | -------------------------------------------------------------------------------- /tests/Unit/Helper/EncodingGuessingHelper/contentA.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/Unit/Helper/EncodingGuessingHelper/contentB.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/Unit/Helper/Filter/JSON/RecipeIdTypeFilterTest.php: -------------------------------------------------------------------------------- 1 | dut = new RecipeIdTypeFilter(); 14 | } 15 | 16 | public function dp() { 17 | $stub = [ 18 | 'name' => 'The name of the recipe', 19 | 'servings' => 5, 20 | 'ingredients' => ['Spaghetti', 'Tomatoes', 'Salt'], 21 | ]; 22 | 23 | $stub['id'] = 123; 24 | $expected = $stub; 25 | $expected['id'] = '123'; 26 | yield [$stub, $expected, true]; 27 | 28 | $stub['id'] = '123'; 29 | yield [$stub, $expected, false]; 30 | } 31 | 32 | /** @dataProvider dp */ 33 | public function testFilter($input, $expected, $changed) { 34 | $ret = $this->dut->apply($input); 35 | 36 | $this->assertSame($expected, $input); 37 | $this->assertEquals($changed, $ret); 38 | $this->assertTrue(is_string($input['id'])); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/Unit/Helper/Filter/JSON/res_FixInstructionsFilter/case01.url: -------------------------------------------------------------------------------- 1 | https://ilovevegan.com/spinach-avocado-and-marinated-tofu-salad/ 2 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_JsonLd/caseC.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lamm-Tajine mit Walnüssen und Feigen von Gallo | Chefkoch 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_JsonLd/caseE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lamm-Tajine mit Walnüssen und Feigen von Gallo | Chefkoch 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_JsonLd/caseJ.src: -------------------------------------------------------------------------------- 1 | https://www.allrecipes.com/recipe/223042/chicken-parmesan/ 2 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_JsonLd/caseK.src: -------------------------------------------------------------------------------- 1 | https://www.vkusnyblog.com/recipe/myatnyj-limonad/ 2 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/case2711.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Sample recipe name 5 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/case2711.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "name": "Sample recipe name", 5 | "recipeInstructions": [] 6 | } 7 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseB.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
Foo
9 | Bar 10 | 11 | Baz 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseB.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": [] 5 | } 6 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseC.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 | Bar 9 | 10 | Baz 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseD.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 | MyName 11 | foo,bar,baz 12 | MyCat 13 | 5 14 |
    15 |
  • A
  • 16 |
  • B
  • 17 |
  • C
  • 18 |
19 |
20 | Bar 21 | 22 | Baz 23 | 24 | 25 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseD.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": ["A", "B", "C"], 5 | "name": "MyName", 6 | "keywords": "foo,bar,baz", 7 | "category": "MyCat", 8 | "recipeYield": "5" 9 | } 10 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 | MyName 11 | foo,bar,baz 12 | 13 | 5 14 |

A

15 |

B

16 |

17 |

C

18 |
19 | Bar 20 | 21 | Baz 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseE.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": ["A", "B", "C"], 5 | "name": "MyName", 6 | "keywords": "foo,bar,baz", 7 | "recipeYield": "5" 8 | } 9 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseFix1209.url: -------------------------------------------------------------------------------- 1 | https://frischgekocht.billa.at/rezept/kuerbis-erdaepfel-gulasch-mit-debreziner-BI-28065 2 | 3 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseImage.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": [], 5 | "image": ["A", "B", "C"] 6 | } 7 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseImageAttribute.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 | 11 | 12 | 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseImageContent.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 | A 11 | B 12 | C 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseIngredient.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 |
    11 |
  • A
  • 12 |
  • B
  • 13 |
  • C
  • 14 |
15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseIngredient.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": [], 5 | "recipeIngredient": ["A", "B", "C"] 6 | } 7 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseInstruction.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | asdf 5 | 6 | 7 | 8 |
9 | Foo 10 |
    11 |
  • A
  • 12 |
  • B
  • 13 |
  • C
  • 14 |
15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseInstruction.json: -------------------------------------------------------------------------------- 1 | { 2 | "@type": "Recipe", 3 | "@context": "http://schema.org", 4 | "recipeInstructions": ["A", "B", "C"] 5 | } 6 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseIssue1617a.url: -------------------------------------------------------------------------------- 1 | https://www.swrfernsehen.de/kaffee-oder-tee/rezepte/eier-curry-100.html 2 | 3 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseIssue1617b.url: -------------------------------------------------------------------------------- 1 | https://aniagotuje.pl/przepis/butter-chicken 2 | 3 | -------------------------------------------------------------------------------- /tests/Unit/Helper/HTMLParser/res_Microdata/caseIssue1617c.url: -------------------------------------------------------------------------------- 1 | https://poprostupycha.com.pl/przepis/ciasteczka-czekoladowe/ 2 | 3 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | &1", $output, $ret); 7 | if ($ret !== 0 || $forceprint) { 8 | echo "\nStandard output:\n"; 9 | print_r($output); 10 | echo "Return value: $ret\n"; 11 | if ($ret !== 0) { 12 | throw new Exception('Could not reset environment'); 13 | } 14 | } 15 | } 16 | 17 | function runOCCCommand(array $args, bool $forceprint = false) { 18 | $output = []; 19 | $ret = -1; 20 | $params = join(' ', array_map(function ($x) { 21 | return escapeshellarg($x); 22 | }, $args)); 23 | 24 | $cmd = "./.github/actions/run-tests/run-occ.sh $params 2>&1"; 25 | 26 | exec($cmd, $output, $ret); 27 | if ($ret !== 0 || $forceprint) { 28 | echo "\nStandard output:\n"; 29 | print_r($output); 30 | echo "Return value: $ret\n"; 31 | if ($ret !== 0) { 32 | throw new Exception('Could not run OCC command'); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /tests/bootstrap_migration.php: -------------------------------------------------------------------------------- 1 | 2 | SPDX-License-Identifier: CC0-1.0 3 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.vue"], 3 | "exclude": ["node_modules"], 4 | "compilerOptions": { 5 | "lib": [ 6 | "dom", 7 | "es2015.promise", 8 | "es6" 9 | ], 10 | "module": "ES6", 11 | "moduleResolution": "node", 12 | "target": "ES6", 13 | "allowJs": true, 14 | "allowSyntheticDefaultImports": true, 15 | "strictNullChecks": true, 16 | "sourceMap": true, 17 | "esModuleInterop": true, 18 | "paths": { 19 | "cookbook/*": ["./src/*"], 20 | "icons/*": ["./node_modules/vue-material-design-icons/*"] 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /webpack.devel.js: -------------------------------------------------------------------------------- 1 | const { merge } = require('webpack-merge') 2 | const base = require('./webpack.config.js') 3 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 4 | 5 | module.exports = (env) => merge(base(env), { 6 | plugins: env.BUNDLE_ANALYZER ? [ 7 | new BundleAnalyzerPlugin( 8 | { 9 | openAnalyzer: true, 10 | } 11 | ) 12 | ] : [], 13 | }) 14 | --------------------------------------------------------------------------------