Compare commits

...

483 Commits

Author SHA1 Message Date
Andy Miller
2dff43acba prepare for rc.3 2019-02-18 14:56:57 -07:00
Andy Miller
c97853e1aa updated languages 2019-02-18 14:43:06 -07:00
Andy Miller
c9be74fe39 Updated libs 2019-02-18 13:52:56 -07:00
Andy Miller
e7df9c1dca Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2019-02-18 13:50:22 -07:00
Andy Miller
3c680cd8e8 Added support for a backlink in scheduler 2019-02-18 13:18:01 -07:00
Andy Miller
3545761b92 reformatted the site.yaml a little 2019-02-18 12:59:56 -07:00
Andy Miller
72016d7e7c Fixed purgeJob() and added clearJob() 2019-02-18 12:59:47 -07:00
Andy Miller
6c1701ea5a Fix for email causing infinite ‘call’ recursion 2019-02-16 18:13:24 -07:00
Matias Griese
28372be982 Fixed bug in Flex collection caching 2019-02-15 22:08:02 +02:00
Matias Griese
58f85212db Renamed flex users blueprints to match the class name, move index file [#2378] 2019-02-15 20:15:17 +02:00
Matias Griese
c39bdaf7f2 Added getCache() method to FlexIndex, FlexCollection and FlexObject 2019-02-15 14:17:21 +02:00
Matias Griese
16ab2e59f1 Renamed FlexIndex::getIndex() to getIndexMap() 2019-02-15 13:15:24 +02:00
Matias Griese
29c65c74db Merge remote-tracking branch 'origin/1.6' into 1.6 2019-02-15 11:14:02 +02:00
Matias Griese
fee77d7301 Fixed FlexIndex keys being lost when FlexCollection gets loaded 2019-02-15 11:13:50 +02:00
Andy Miller
21d9fa1e74 display fullname instead of title in list 2019-02-14 16:40:02 -07:00
Matias Griese
b4d973bfd0 Remove var_dump(), oopsie! 2019-02-14 21:12:53 +02:00
Matias Griese
993db32652 Console commands: add method for invalidating cache 2019-02-14 15:32:42 +02:00
Matias Griese
a0f4878c12 Updated version to rc.3 2019-02-14 11:44:32 +02:00
Matias Griese
452df10ea1 Updated UserInterface and FlexObjectInterface by adding missing update() parameter 2019-02-14 11:35:43 +02:00
Matias Griese
a3bf38b182 Change typehints from User to UserInterface 2019-02-14 11:34:41 +02:00
Matias Griese
674ea8ae25 Fixed validation for boolean toggles 2019-02-14 10:39:10 +02:00
Matias Griese
94610f4e61 Fixed missing form_nonce for JS when using FlexForm 2019-02-14 10:06:24 +02:00
Matias Griese
b2df60647d Initialize users before plugins on bin/plugin commands 2019-02-14 09:56:11 +02:00
Matias Griese
e8650a55af Merge remote-tracking branch 'origin/1.6' into 1.6 2019-02-13 23:48:26 +02:00
Matias Griese
09805f7091 Fixed FlexIndex keys being lost when FlexCollection gets loaded 2019-02-13 23:30:35 +02:00
Andy Miller
a63040aa11 Updated built-in composer 2019-02-13 13:18:22 -07:00
Andy Miller
3e97ecab68 Fixes issue with uninitialized users object 2019-02-13 13:17:21 -07:00
Robbert
409b4028d0 fix dead link + add http > https changes to site urls (#2369) 2019-02-12 12:14:28 -07:00
Matias Griese
85b4996dbf Changelog update 2019-02-12 16:16:17 +02:00
Matias Griese
e7041ff48e Change default attribute value of Flex[class]::getType($prefix) to false 2019-02-12 16:14:02 +02:00
Matias Griese
793b56fc8c Fixed validation for select field type with selectize 2019-02-12 14:32:29 +02:00
Matias Griese
ea91601459 Allow onRequestHandlerInit to set Response object 2019-02-11 15:01:23 +02:00
Matias Griese
6e3edb7dfb Some bug fixes for Psr-7 & request handler 2019-02-11 13:59:15 +02:00
Matias Griese
4e38c1fe25 Improve onRequestHandlerInit event 2019-02-11 13:18:32 +02:00
Andy Miller
2adb13ac66 Use array to make ordering easier 2019-02-08 12:34:52 -07:00
Matias Griese
d565c4af16 Improvements for Grav\Framework\Psr7 2019-02-08 21:24:02 +02:00
Matias Griese
877529ae5b Implemented Grav\Framework\Psr7 classes as Nyholm/psr7 decorators 2019-02-08 20:49:05 +02:00
Andy Miller
8b89c2c52e Missing pages.types #1612 2019-02-08 08:47:57 -07:00
Matias Griese
427ba0e420 Fixed FlexUser caching 2019-02-08 13:33:33 +02:00
Matias Griese
4be7aa5665 Changelog update 2019-02-08 12:58:34 +02:00
Matias Griese
9bd66031ab Grav 1.6 code cleanup (#2366)
* Code cleanup
* Define admin menu for Flex Users
2019-02-08 12:56:15 +02:00
Andy Miller
48816d9f2e Fix issue with vUndefined in GPM 2019-02-07 17:56:45 -07:00
Andy Miller
031bfdc1e7 prepare for rc.2 release 2019-02-07 16:23:57 -07:00
Andy Miller
88121aaab4 Merge tag '1.5.8' into develop
Release v1.5.8
2019-02-07 16:04:56 -07:00
Andy Miller
8f588aca99 Merge branch 'release/1.5.8' 2019-02-07 16:04:55 -07:00
Andy Miller
5b34a9bfc4 prepare for release 2019-02-07 16:04:31 -07:00
Andy Miller
ef55d2615f update changelog 2019-02-07 16:03:49 -07:00
Matias Griese
1391dd38a4 Changelog update 2019-02-07 23:40:33 +02:00
Andy Miller
f8f1d5854c Squashed commit of the following:
commit 6522db9beb579ee9ccb4f8b73f22bd0a57af5294
Merge: e047173f a1c8cb9f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:25:18 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit e047173fe0acf79a593db5b2e9db87cdc6f416a1
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:09:18 2019 +0200

    Updated FlexCollection to match object isAuthorized() call (fixed oopsie)

commit a937a5834fab908c915d9859479b07088cbe1677
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:02:21 2019 +0200

    Updated FlexCollection to match object isAuthorized() call

commit 24ea31364632dddc38057e243075787340c3e86b
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 20:48:13 2019 +0200

    Fixed infinite loop when creating DataUser object

commit 5da9fa8e1a4d213e16d8ca5c64a898c1712a28aa
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 17:34:54 2019 +0200

    Renamed `FlexAuthorizeInterface::authorize()` to `isAuthorized()`

commit 42fcf352a53a89e2082449ff6280804d913cac99
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 10:10:41 2019 +0200

    Added proper security check for user access levels

commit 43f8051305909f4579a65026de020c4ccdb1d15a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 10:07:35 2019 +0200

    Added configuration options for system.accounts fields

commit 9ff8cc6e984744cb1031184721cb3a03d38ca33a
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Feb 6 13:20:02 2019 -0700

    Cleanly handle session corruption due to changing Flex object types

commit 472c7e5367d7e27044e6bf1629800c69178a4b70
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 21:50:48 2019 +0200

    Added isValid() method for Data/FlexUser classes

commit 3098479d5e5f0ae370495f77e0615f1a50d9501c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 14:00:06 2019 +0200

    Changelog update

commit 56956e178c93b8eefe055f645693b44f0ce71092
Merge: 84510cdc 466374ba
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 13:32:03 2019 +0200

    Merge remote-tracking branch 'origin/1.7' into 1.7

commit 84510cdc24bf445aeb3b4787c6a3198d31789e8c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 13:31:40 2019 +0200

    Restructure Users logic to allow us to switch between old and new classes

commit 466374ba33ba89b396a36cc4fc0bd53f0d974bd0
Merge: 3a84c382 26de0340
Author: Andy Miller <rhuk@mac.com>
Date:   Tue Feb 5 20:37:33 2019 -0700

    Merge branch '1.6' into 1.7

commit 8f9c0e513a48161e97ca8940036c94984b9e814e
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Feb 5 16:23:21 2019 +0200

    Restructure FlexUsers to allow us to switch between old and new classes

commit 3a84c3822b4374dd767fed235003f426a0e48f4b
Merge: 6412498a 34bf8fb5
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Feb 5 14:24:09 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/defines.php

commit 6412498acab51bfe96ff2fd071a6875e3f8e435b
Merge: 3467f1d8 b1d43d29
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Feb 4 16:48:04 2019 -0700

    Merge branch '1.6' into 1.7

commit 3467f1d8d0448e588a8902ff70f13e24c4117e33
Merge: 49cf9820 c713625a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Feb 4 22:27:56 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 49cf9820be70b37ae9ac69e7a35950e5b9fb6c25
Merge: e0aca2f6 24e6b6c8
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Feb 4 22:21:37 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit e0aca2f6a0823b7346dc3eeaed698d55d9ae2f4f
Merge: 0bc93fae 632a2d79
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Feb 1 09:06:50 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 0bc93faec721e497867bdba224a61bdd397ff8c6
Merge: 91e17b8b e4b1d2ed
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 18:42:25 2019 -0700

    Merge branch '1.6' into 1.7

commit 91e17b8b14d4eeeccdd2f297dd27efbc4f515a19
Merge: 959cd21d 9fadb992
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 15:41:51 2019 -0700

    Merge branch '1.7' of github.com:getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md

commit 959cd21da6a3aa3d15e67ad25114b4238fd5eba9
Merge: 22eedbfd a3fea3d0
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 15:40:21 2019 -0700

    Merge branch '1.6' into 1.7

    # Conflicts:
    #	CHANGELOG.md
    #	system/defines.php

commit 9fadb992a409473ec047cee329adfd2fc001ec99
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Feb 1 00:11:05 2019 +0200

    Added search() for user collection

commit fb1193e465fa0f6719a43215d0218d9e774519f1
Merge: d633eabf d50e5d95
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 21:19:35 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit d633eabf58216f18c3bd2ac179f474f621206d5a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 21:17:35 2019 +0200

    Index username and email in lowercase letters

commit 86db584b0075ef7ad523d97bbe600c83815648e0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 15:21:40 2019 +0200

    Rework FlexUser index

commit 540dbcd24c790114cec122f8bfbdc4d199cd9e2b
Merge: 28e41fb7 7a044c73
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 15:08:38 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md

commit 28e41fb7e76bc1e569c0fcb8440c16d228396c73
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 11:17:29 2019 +0200

    Remove useless check

commit bd7b91efcba0914a3b4a664319c73b230e0e0755
Merge: 22eedbfd 4f80a156
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 10:16:33 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md
    #	system/defines.php

commit 22eedbfd1160a38f24525c50cb4ca61caec4a1f8
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 30 17:18:59 2019 -0700

    Defines update

commit 338d40993e16e5c233c5fd010a259bbb37433de3
Merge: 1ecb6c4c f312c44a
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 30 17:15:38 2019 -0700

    Merge branch '1.6' into 1.7

commit 1ecb6c4c2b42e61785c473348bbeaffd2319344a
Merge: 22fc6ede 60436104
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 21:05:13 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 22fc6edea286a51bb15f23dd8762960b5bb1821f
Merge: 21b9e2cd d45efb48
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 20:51:30 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 21b9e2cd7c06e9f286428f2794ebd7d4e8f0e64d
Merge: 09f9eb22 610c6c34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 11:20:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 09f9eb228f5980a56602b0a82ca73929d1d0336c
Author: Andy Miller <rhuk@mac.com>
Date:   Tue Jan 29 17:16:42 2019 -0700

    updated changelog

commit d2641c89e5a8e25d5a8d20cb10d7d0d302661ac7
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 23:08:04 2019 +0200

    Added support for looking up user by key, flex_key and storage_key

commit 2482ae7b8ca46e9cd6c7759ee5c3a62cb1e58363
Merge: 354bfd95 bbdac0fd
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 22:22:29 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 354bfd95fccf169357591a7f4c6b603121012f12
Merge: c0299f0d 5f5bfdaa
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 19:32:41 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit c0299f0de81ebc3a0d05e147443a1602e7f86a34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 19:22:24 2019 +0200

    Log alert if user index file gets corrupted or cannot be read

commit a9bd316868c45ada12ba7756ef6abc46daa3638d
Merge: 318cff10 ad7fdd5c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 18:15:00 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 318cff102747c863e785f3bdbf3e538c84884b29
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 18:00:18 2019 +0200

    FlexUser: Do not fail hard if user index is corrupted

commit a402e675e485c2ccaa9e15f0d4f444073efe1fc5
Merge: a6179018 1321e582
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 16:09:10 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit a6179018d3e57acf6a0e00ed8cbe65be1b214ae7
Merge: eaeb9d30 f7865873
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 28 19:48:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit eaeb9d30251e9e31cd72c34c2f0f3a9b8e448f6c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 12:20:16 2019 +0200

    FlexUser: Fixed original avatar image saving if there wasn't any before resize

commit 6e9b880dba19e3e717065e1d6b9adce4eb4fa100
Merge: d02f1c3d 5ad4ffd3
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 12:13:03 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/src/Grav/Common/Form/FormFlash.php

commit d02f1c3dd6b9e621fd1da5d9fb845faf2efb14d2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 11:42:56 2019 +0200

    Fixed a bug on Form file crop with existing data

commit 17221a2a31fb7153e83e6a949bd004fe6aa73af8
Merge: c1c0467e 0700e4bf
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 11:08:14 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit c1c0467ea1510bf7a7dceadefccb1358a6e74b28
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 24 16:20:51 2019 +0200

    Added `FlexCollection::sort()` method

commit a07f36995573646ce08fa8fb70adcb9f6ccbb95b
Merge: 4929c700 6d89108c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 21:25:35 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 4929c700065c10c6e047fd46169d121aea8c0fad
Merge: 13aac576 4e31a114
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 23 12:17:23 2019 -0700

    Merge branch '1.6' into feature/1.6-flex-users

commit 13aac576f81c0ef1a6721652c04432512c3bb669
Merge: 81b47c21 18d53079
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 20:54:29 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 81b47c21ff58d5c6c876857dd9ea24d9cef97880
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:43:23 2019 +0200

    Move user search index into user-data://accounts folder

commit c7bf4fc71abd1298d729da08e0770dd94ab4f708
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:41:48 2019 +0200

    Fixed fatal error when user has no avatar

commit 586f6252d84c657b58fe84b79955c4542900e56a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:41:18 2019 +0200

    Added configuration option for account storage type, default to old structure

commit 78cd6d05aa06e132ba4090edac5b4a4dab54d13b
Merge: 2d554b55 57de7cc0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:14:17 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 2d554b5577224bdd160e1319a9ba51b0b0ee6a34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 12:46:50 2019 +0200

    FlexUser: Added original/cropped image support

commit 3f78f1b82316cf4d8bb2d0109c11ec6bf73c2bc5
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 12:13:54 2019 +0200

    FlexUser: Added original image/crop support

commit f8b7e7922cb036d57345d5587e9ba70271722503
Merge: f6b81fde e6b6e218
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 11:21:16 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit f6b81fde528a2b6ef17b784a5b695bb371b4617c
Merge: d82eeeac 24305528
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 11:11:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit d82eeeac9b50290d17b852e2221d9ae97b375fdc
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 10:28:58 2019 +0200

    MediaTrait: Clearing cache should unset media variable

commit ddaa9117ed7e795f95d897b6dd07a604482ca60b
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 10:11:26 2019 +0200

    FlexUser: Fixed issue on avatar if the field isn't what is expected by default (an array)

commit 8b23a47708106557c41fe497211e4dc3c7c1767e
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 22:03:47 2019 +0200

    Added User::getAvatarMedia() method

commit bb175341a5cb556c698481731fe73e9fa4b07643
Merge: bc9d60ca 5b0e2e40
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 21:44:18 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit bc9d60ca79888c1c7eb0087bc841f409a67017b0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 21:25:19 2019 +0200

    FlexUser: Fix extra parameter

commit 93b4b03706e8440e8e7ccad473fc5595ac85b631
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 11:10:51 2019 +0200

    FlexUser: Added support for avatar (or images in general)

commit fcd5756d2747cc4126c03fc53c2bd1bd35f0e8dc
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 09:29:54 2019 +0200

    Add `FormFlash::clearFiles()` method

commit 9da3c566188fa3f68077292d82a68b793763dc6a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 21 20:57:07 2019 +0200

    Added media support for User

commit bb94022b709cebc73be4b3f010568b6504535aa2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 21 11:44:35 2019 +0200

    Store users with unique ids

commit 6a184c4011ed3ed90cec4d536ead067896a580aa
Merge: 698a291c bd27d6fe
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 14:14:23 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 698a291cc844605dd8e969784883207308bc3a5f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 14:02:02 2019 +0200

    Make sure that `authenticated` and `authorized` will not be saved into the file

commit 59c7dd59af86c7e0feaf4a9fa3832bad8a85b631
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 13:09:43 2019 +0200

    FlexUser: Fixed missing username in the object

commit b139e5daaa67d51baa26222e6155b359ac5a17f5
Merge: 426dae47 254fe990
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 12:22:22 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 426dae4731383bfd64f7e8e611f3721f58776feb
Merge: f4ff6713 0afe9d4f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 11:00:36 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit f4ff6713ac1c930b3f932b285c762552f99c79b0
Merge: eaab0b0a 751d1da7
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 13:04:04 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit eaab0b0ae9c50ca5995ea7aa769720fc647ec4c2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 12:57:15 2019 +0200

    Fixed merge conflict

commit 531dd1a788a6496c228c56103d4512d39c4d7650
Merge: 3bd925d6 f0cf4ed8
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 12:50:46 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 3bd925d61b96c12ea77cad19f4a9c01ba9afba8f
Merge: a383fbac a224c8b3
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 8 18:37:22 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit a383fbac0447d3226ee3a6109b99edca5210c5e5
Merge: 422e1f70 b38a143c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Dec 4 15:32:39 2018 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/flex-users

    # Conflicts:
    #	system/src/Grav/Common/Grav.php

commit 422e1f7027389fd1727dac4e269309a33187ea69
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Nov 26 19:57:28 2018 +0200

    Implement Flex User classes
2019-02-07 14:36:07 -07:00
Matias Griese
a1c8cb9f78 Typo in changelog 2019-02-07 14:42:19 +02:00
Matias Griese
54ce1b570a Regression: $session->getFlashObject('files-upload) did not work with Form 3.0 2019-02-07 11:28:54 +02:00
Matias Griese
f2d66c810a Use standard filename check in FormTrait 2019-02-07 08:35:43 +02:00
Andy Miller
26de0340ec Updated vendor libs including Symfony 4.2.3 2019-02-05 16:47:53 -07:00
Andy Miller
333fbd0db1 Update vendor libraries 2019-02-05 16:47:05 -07:00
Andy Miller
4cf4c09339 limit stack track rows… 50+ is nuts! 2019-02-05 14:18:48 -07:00
Matias Griese
34bf8fb5bb Minor fix when installing full package via direct install 2019-02-05 13:51:07 +02:00
Matias Griese
06eee1e711 Some installer fixes (clear cache, direct install with full package) 2019-02-05 13:23:16 +02:00
Matias Griese
b6ab086bf7 Changelog update 2019-02-05 11:35:11 +02:00
Andy Miller
b1d43d292d Added some useful object twig functions/filters 2019-02-04 16:30:18 -07:00
Matias Griese
19b92f17dd Improved Grav Core installer 2019-02-04 22:34:46 +02:00
Matias Griese
c713625a38 FlexIndex: Fixed undefined index 2019-02-04 22:27:21 +02:00
Matias Griese
24e6b6c8f1 Fixed Flex from indexing hidden folders/files as objects 2019-02-04 22:21:11 +02:00
Andy Miller
cebe28e591 Updated changelog 2019-02-01 19:02:16 -07:00
Andy Miller
b111a2c29d Added standard Yes/No lang strings to Grav 2019-02-01 13:34:23 -07:00
Matias Griese
8743a8080c Changelog update for #2350 2019-02-01 21:31:59 +02:00
Andy Miller
f2155aa04f Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-01 11:26:21 -07:00
Andy Miller
45346b72f2 Fix for trailing slash redirect in multlang 2019-02-01 11:26:16 -07:00
Matias Griese
632a2d79b6 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2019-02-01 09:05:29 +02:00
Matias Griese
2fa5021a0c Improved User unserialize to not to break the object if serialized data is not what expected 2019-02-01 09:04:01 +02:00
Andy Miller
e4b1d2ed9e Enhancements to logviewer output to support lines in trace 2019-01-31 18:38:31 -07:00
Andy Miller
a3fea3d0fc Added LogViewer class and CLI command 2019-01-31 15:39:46 -07:00
Matias Griese
d50e5d954d Fixed oopsie in Package class 2019-01-31 20:49:12 +02:00
Matias Griese
970af3870e Some code cleanup 2019-01-31 17:57:05 +02:00
Matias Griese
9ba572d788 Fixed non-namespaced exceptions in scheduler 2019-01-31 17:53:11 +02:00
Matias Griese
ba2c37c216 Removed apc and xcache support, made apc alias of apcu 2019-01-31 17:51:04 +02:00
Matias Griese
0e14a325f8 Fixed some static/object calls to match the method 2019-01-31 17:42:18 +02:00
Matias Griese
1141dabbd8 Code cleanup 2019-01-31 17:32:06 +02:00
Matias Griese
7a044c7397 Added index file support for Flex Objects 2019-01-31 15:07:30 +02:00
Matias Griese
d0b3dd1d99 Improved error detection for broken Flex Objects 2019-01-31 15:06:41 +02:00
Matias Griese
4f80a1567d Update PHP file headers and copyrights 2019-01-31 10:04:57 +02:00
Andy Miller
23098a6b02 Revert "Grav 1.6 copyright updates and cleanup (PHP files only) (#2351)"
This reverts commit 0566185c4f.
2019-01-30 17:54:37 -07:00
Andy Miller
5c8a37be64 Updated version 2019-01-30 17:35:30 -07:00
Andy Miller
7b8944e8f2 updated changelog 2019-01-30 17:34:17 -07:00
Andy Miller
37fcb12ad1 Updated languages 2019-01-30 17:33:25 -07:00
Matias Griese
f312c44a46 Changelog update 2019-01-31 00:13:16 +02:00
Andy Miller
999e439d47 Merge branch 'develop' into 1.6 2019-01-30 13:45:19 -07:00
Matias Griese
0566185c4f Grav 1.6 copyright updates and cleanup (PHP files only) (#2351)
* Framework: update copyrights to 2019

* Some code cleanup (Assets, Backup, Config, Session)

* Continue code cleanup, update copyrights

* Fixed exception issues in scheduler, code cleanup

* Remove apc and xcache support, make apc alias of apcu

* Fixed Getters::count() method not returning anything

* More code cleanup, copyright updates

* Copyright updates for Grav\Console
2019-01-30 13:44:19 -07:00
Hamilton Turner
b91574e5c2 Remove unused parameter (#2357) 2019-01-30 13:42:34 -07:00
Matias Griese
604361045b Fixed bad host header in PSR-7 (if using 'php -S localhost:8000 system/router.php') part 2 2019-01-30 21:04:53 +02:00
Matias Griese
d45efb484c Fixed bad host header in PSR-7 (if using 'php -S localhost:8000 system/router.php') 2019-01-30 20:51:09 +02:00
Matias Griese
610c6c341c Fixed ImageMedium constructor warning when file cannot be accessed 2019-01-30 11:20:12 +02:00
Matias Griese
6daf480bfc Fixed FlexMediaTrait::getMedia() trying to include uploaded but already moved media 2019-01-30 11:17:49 +02:00
Matias Griese
bbdac0fd6d Made FormFlashFile more robust against deleted files (over time) 2019-01-29 22:22:00 +02:00
Matias Griese
5f5bfdaa42 Add protected method FormTrait::unsetFlash() 2019-01-29 19:32:19 +02:00
Matias Griese
ad7fdd5c2b Fixed a bug in FormFlashFile::moveTo() not deleting the old file 2019-01-29 18:12:38 +02:00
Matias Griese
1321e582d5 FlexObject: Fixed a bug when updating media 2019-01-29 14:13:14 +02:00
Stefan Bauer
6d6689b431 Update CHANGELOG.md (#2355) 2019-01-29 10:21:39 +02:00
Matias Griese
f78658738a FlexObject: Fixed a bug when updating media 2019-01-28 13:00:51 +02:00
Andy Miller
7c99ece0e1 make sure HTTP_DNT is set before inspecting it 2019-01-25 16:49:23 -07:00
Andy Miller
9058e1166d prepare for release 2019-01-25 14:42:33 -07:00
Andy Miller
ebd94a532c Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	composer.lock
#	system/defines.php
2019-01-25 14:41:36 -07:00
Andy Miller
95a4ecb0f1 Merge branch 'release/1.5.7' 2019-01-25 14:38:52 -07:00
Andy Miller
ff8cc83b3a Merge tag '1.5.7' into develop
Release v1.5.7
2019-01-25 14:38:52 -07:00
Andy Miller
fbd3bbdbf9 Prepare for release 2019-01-25 14:38:31 -07:00
Andy Miller
f0e58adfbc Updated vendor libraries 2019-01-25 14:37:43 -07:00
Matias Griese
5ad4ffd3cf FormFlash: Fixed some image cropping issues 2019-01-25 12:12:04 +02:00
Matias Griese
0700e4bfdb Replace array cast in FormTrait::getFiles() 2019-01-25 10:42:21 +02:00
Matias Griese
82e5df960d Merge remote-tracking branch 'origin/1.6' into 1.6 2019-01-25 10:40:36 +02:00
Matias Griese
3ace15d01a Added FlexCollection::sort() method 2019-01-25 10:40:28 +02:00
Andy Miller
d367e6a1fb Fix null -> array issue 2019-01-24 15:08:23 -07:00
Matias Griese
a09940ef6a Added FlexCollection::sort() method 2019-01-24 16:21:26 +02:00
Matias Griese
6d89108cc4 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-01-23 21:24:37 +02:00
Matias Griese
bd01b07b4b Reverted Route::__toString() behavior and added deprecated message for proper use (part 2) 2019-01-23 21:24:31 +02:00
Andy Miller
4e31a114ef Use new toString() 2019-01-23 12:16:48 -07:00
Matias Griese
18d53079dd Reverted Route::__toString() behavior and added deprecated message for proper use 2019-01-23 20:54:10 +02:00
Matias Griese
57de7cc03d Missing docblock parameter 2019-01-23 15:13:52 +02:00
Matias Griese
2d7eeb611d Added missing Flex::getObject() and Flex::getCollection() parameters 2019-01-23 13:02:33 +02:00
Matias Griese
e6b6e218f8 Fixed MediaTrait::getMedia() to return refreshed Media object after calling MediaTrait::clearMediaCache() 2019-01-23 11:20:44 +02:00
Matias Griese
243055289b Add FormFlash::clearFiles() method 2019-01-23 10:59:04 +02:00
Matias Griese
52c7d8dfb7 Fixed Grav\Framework\Route::__toString() returning relative URL, not relative route 2019-01-23 10:55:32 +02:00
Andy Miller
5b0e2e401e vendor udpates 2019-01-22 09:40:09 -07:00
Matias Griese
8381261b7c Do not cache FlexObject::authorize() 2019-01-22 13:33:44 +02:00
Matias Griese
2ada99d314 Make $user->update() to behave like $user->merge() 2019-01-21 21:00:58 +02:00
Matias Griese
bd27d6fe8c Fixed backwards incompatibility: Form::getData($name) 2019-01-18 14:12:28 +02:00
Matias Griese
b94631533d User: Ignore authenticated and authorized on object creation 2019-01-18 14:11:33 +02:00
Matias Griese
fb9baaed8a Make sure that authenticated and authorized will not be saved into the file 2019-01-18 13:33:17 +02:00
Matias Griese
254fe990ba Improved Grav\Common\User class; added $user->update() method 2019-01-18 12:20:57 +02:00
Matias Griese
0afe9d4f93 Undo comment out, code works now 2019-01-17 15:26:22 +02:00
Matias Griese
ccca3170d3 Fixed HTTP codes for non-standard response codes becoming 500 server errors 2019-01-17 12:08:19 +02:00
Andy Miller
00b1f12dda Updated changelog 2019-01-16 17:05:48 -07:00
Andy Miller
9ca411aa24 Fixed issue with redirect_trailing_slash losing query string #2269 2019-01-16 17:05:42 -07:00
Andy Miller
e976aa0f5f Fixed some issues with Medium querystring + timestamps 2019-01-16 14:21:56 -07:00
Matias Griese
02c979bdf6 Fixed FlexForm::getValue() call to return the correct data 2019-01-16 21:53:44 +02:00
Matias Griese
88625c6362 For now, do not save form data in flex submit 2019-01-16 18:09:04 +02:00
Matias Griese
76ff68a594 Added file modification timestamps for media images 2019-01-16 17:59:29 +02:00
Matias Griese
d27a2171ea Route: Added support for file extension (part 2) 2019-01-16 15:10:00 +02:00
Matias Griese
075498d03b Route: Added support for file extension 2019-01-16 12:04:26 +02:00
Matias Griese
f04ae315e4 Filter unknown array fields as arrays, not text 2019-01-16 10:45:19 +02:00
Matias Griese
2e277f3cb3 Make Form::getFlash() public 2019-01-16 10:10:53 +02:00
Andy Miller
29098aa8db Updated changelog 2019-01-15 16:32:00 -07:00
Andy Miller
659cd1bb92 return $this from init() 2019-01-15 16:31:54 -07:00
Andy Miller
3bf7c6943a Added some Util array functions 2019-01-15 16:31:43 -07:00
Andy Miller
189e29b5c6 Add FlexObject::getChanges() method 2019-01-15 16:29:47 -07:00
Matias Griese
0ede252fa3 Fix undefined variable id on FormTrait::getFlash() 2019-01-15 20:18:46 +02:00
Matias Griese
d7d69b2be8 Added support for storing form state by user or session 2019-01-15 12:31:03 +02:00
Matias Griese
d79729f596 Fixed a timer bug in Tasks Processor 2019-01-15 11:31:33 +02:00
Matias Griese
988d4ab047 Fix a bug in FormTrait::validate() 2019-01-15 11:31:08 +02:00
Andy Miller
437866dfcd Merge branch 'develop' into 1.6 2019-01-14 19:00:21 -07:00
Rotzbua
c40dcf020c add do not track header detection (#2334) 2019-01-14 17:49:46 -07:00
Andy Miller
e520bd0eb8 Fixed environment issue #2284 2019-01-14 13:55:29 -07:00
Matias Griese
3a9e57e228 Added form preview support for FlexObject, including a way to render newly uploaded files before saving them 2019-01-14 18:44:37 +02:00
Matias Griese
22ed1286e8 Added support to add extra files to Media object 2019-01-14 18:41:05 +02:00
Matias Griese
1a37c54316 Fixed FlexForm::updateObject() to update array values when they are empty in the form 2019-01-14 14:15:22 +02:00
Andy Miller
b6328944a3 Move processMarkdown() method from TwigExtension to more general Utils class 2019-01-13 16:20:19 -07:00
Matias Griese
751d1da704 Added unset type/filter to the validation 2019-01-11 13:03:04 +02:00
Matias Griese
5cf4eea09e Remove debug backtrace and die when session fails to start 2019-01-11 13:02:37 +02:00
Matias Griese
f0cf4ed8ff Regression: Fix serialize issues with forms 2019-01-11 00:28:57 +02:00
Matias Griese
fa61ed17b1 Added check for bad JSON back (tracked down and fixed the issue in form plugin) 2019-01-10 19:59:11 +02:00
Raphaël Droz
f1363877d8 preserve accents in fields containing Twig expr. using unicode (#2279)
When a fields contain accentuated characters, reduce the risk of messing with it by passing unicode characters unescaped.
Twig will deal with them. And fewer backslash-escaping problems will arise.
2019-01-09 13:05:32 -07:00
Basile Trujillo [L0gIn]
e8825beae5 Added support for AWS Cloudfront forwarded scheme header (#2297)
AWS Cloudfront does not provide HTTP_X_FORWARDED_PROTO header but provide a HTTP_CLOUDFRONT_FORWARDED_PROTO header instead
2019-01-09 13:04:32 -07:00
Matias Griese
830a83e3d1 Symfony library update 2019-01-09 09:28:33 +02:00
Matias Griese
7d249c61c2 Added check for bad JSON back (tracked down and fixed the issue in form plugin) 2019-01-08 19:35:51 +02:00
Matias Griese
a224c8b348 FlexForm: Maintain form state on page reloads 2019-01-08 14:32:18 +02:00
Matias Griese
c04208d5dd FlexForm: Fixed missing inputs after save, reset form after save 2019-01-08 13:52:13 +02:00
ranitham
394dfad566 Small bugfix for responsive images (#2300)
* Replace spaces in image filename with %20 to avoid parse errors with the srcset attribute

* Update system/src/Grav/Common/Page/Medium/ImageMedium.php

Co-Authored-By: ranitham <ranitha.m@gmail.com>
2019-01-07 21:34:00 -07:00
Rotzbua
2c55fe01ac add return types for user/authentication (#2293) 2019-01-07 21:29:30 -07:00
Rotzbua
680bfef2c3 http to https (#2299) 2019-01-07 21:28:56 -07:00
Matias Griese
a23cbd0257 Added Blueprint::processForm() method to filter form inputs in Flex form 2018-12-21 12:37:08 +02:00
Matias Griese
f5b77e8082 Added onPageAction, onPageTask, onPageAction.{$action} and onPageTask.{$action} events 2018-12-20 14:08:40 +02:00
Matias Griese
10378ac5af FlexForm: Added support for custom(ized) blueprint layouts 2018-12-20 11:36:01 +02:00
Matias Griese
4a290e6194 Added Grav\Framework\Form\Interfaces\FormFactoryInterface 2018-12-19 22:44:31 +02:00
Matias Griese
c2c0fb242b Minor bugfix 2018-12-19 21:00:10 +02:00
Matias Griese
9b37e50492 Added Page::forms() method to get normalized list of all forms defined in the page 2018-12-19 20:57:47 +02:00
Matias Griese
6c6e8d2605 Added Flex::getObject() for getting flex object directly 2018-12-19 17:40:09 +02:00
Matias Griese
5a6e6dceda Define FormInterface 2018-12-19 13:35:02 +02:00
Andy Miller
e8631da9f3 parepare for beta release 2018-12-14 15:13:09 -07:00
Andy Miller
5d57713f95 Merge branch 'develop' into 1.6
# Conflicts:
#	system/defines.php
2018-12-14 15:07:51 -07:00
Andy Miller
28bd4027cd Merge branch 'release/1.5.6' 2018-12-14 15:07:22 -07:00
Andy Miller
108541e0d0 Merge tag '1.5.6' into develop
Release v1.5.6
2018-12-14 15:07:22 -07:00
Andy Miller
54a177279f prepare for release 2018-12-14 15:07:12 -07:00
Andy Miller
b3e9974e95 updated changelog 2018-12-14 15:06:39 -07:00
Matias Griese
2ad66102d2 FlexMediaTrait: Cropping existing image without original fails to move the original image to safe place 2018-12-13 23:14:31 +02:00
Matias Griese
6828114e86 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-13 22:21:18 +02:00
Matias Griese
f53b43de14 FormFlash: Added support for storing form data 2018-12-13 22:21:10 +02:00
Andy Miller
d53dbdf5ba Updated vendor libs 2018-12-13 13:06:34 -07:00
Matias Griese
8ba00f5967 Flex: Fixed cropping issues on edit 2018-12-13 18:21:39 +02:00
Matias Griese
56c7b8ca5f Flex: Fixed uploading images when creating a new object 2018-12-13 13:49:04 +02:00
Matias Griese
d6115007ab Flex: Clear updated after saving the changes to prevent it being called twice 2018-12-13 11:36:59 +02:00
Matias Griese
ba53d876bc FlexMediaTrait::deleteMediaFile() should check if folder exists 2018-12-13 10:55:45 +02:00
Matias Griese
2d593995ee Flex: Added support to automatically update object media on save 2018-12-13 10:42:23 +02:00
Matias Griese
3808776ddb Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-12 23:37:58 +02:00
Matias Griese
9a118d0a71 Fixed upload of original images 2018-12-12 23:37:50 +02:00
Andy Miller
684d6d3389 This can get used externally too… 2018-12-12 10:14:28 -07:00
Matias Griese
89a0e960e2 Improve file upload logic on flex objects 2018-12-12 16:14:55 +02:00
Matias Griese
1b21e01938 FlexForm: Disable handling of file uploads on form submit (for now) 2018-12-12 14:09:24 +02:00
Matias Griese
3b692a27b4 Improved Flex save/delete 2018-12-12 12:45:06 +02:00
Matias Griese
3c83f379ee Added onFlexObjectSave and onFlexObjectDelete events 2018-12-12 11:52:50 +02:00
Matias Griese
0c344df07a Fixed Flex indexes with flex_key 2018-12-12 10:38:09 +02:00
Matias Griese
2a20959660 Fixed session throwing error in CLI if initialized 2018-12-12 09:39:13 +02:00
Matias Griese
94a843429d Added {% render object layout: 'default' with { variable: true } %} for Flex objects and collections 2018-12-12 00:02:38 +02:00
Matias Griese
34e6b6652a Make FlexForm more flexible for different tasks 2018-12-11 20:25:31 +02:00
Matias Griese
1ba785f28e ContentBlock: Fixed nested caching detection 2018-12-11 16:08:58 +02:00
Matias Griese
bac24cf520 Flex: Improve FlexAuthorizeTrait 2018-12-11 11:54:59 +02:00
Matias Griese
40b7d53349 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-10 15:30:19 +02:00
Matias Griese
96d44b4322 Flex: Allow disabling collection/object caching from template 2018-12-10 15:30:09 +02:00
Andy Miller
bf127fb0bd fix for ini_set 2018-12-07 13:04:35 -07:00
Matias Griese
501bc0133f FormFlash: Allow no field for file uploads 2018-12-07 21:35:28 +02:00
Matias Griese
787bf8beeb FlexForm: Implemented delayed flash uploads 2018-12-07 20:41:37 +02:00
Matias Griese
257396aa06 FormFlash: Added support for removing existing files (null instead of object) 2018-12-05 14:45:29 +02:00
Matias Griese
7eb469f0ae Fixed bug in FlexForm::getFlash() 2018-12-05 12:09:56 +02:00
Matias Griese
156e544ab9 Change FormFlash constructor to be more generic, add method to clear session 2018-12-05 09:37:56 +02:00
Matias Griese
b38a143c66 Added new $grav['filesystem'] service using an instance of the new Filesystem object 2018-12-04 15:30:37 +02:00
Matias Griese
cd21d65400 FlexForm: minor improvement to making method overriding more of copy/paste 2018-12-04 15:03:29 +02:00
Matias Griese
b19cb1215b Fix tests 2018-12-03 13:55:32 +02:00
Matias Griese
48acad3e47 Improve Filesystem class 2018-12-03 13:54:40 +02:00
Matias Griese
009db01ab9 Changelog update 2018-12-03 11:37:51 +02:00
Matias Griese
7d8fff9571 Minor fix, oops 2018-12-03 11:36:42 +02:00
Matias Griese
9d048f5f36 Merge branch 'feature/1.6-cleanup' into 1.6 2018-12-03 11:29:20 +02:00
Matias Griese
cb4ea86310 Improved Grav\Framework\File classes to use better type hints and the new Filesystem class 2018-12-03 11:26:55 +02:00
Matias Griese
2b099c2ed5 Added Grav\Framework\Filesystem\Filesystem class with methods to manipulate stream URLs 2018-12-03 11:11:00 +02:00
Matias Griese
6afb55cc30 Improved Grav\Framework\File\Formatter classes to have abstract parent class and some useful methods 2018-12-03 08:00:14 +02:00
Matias Griese
0937e0ff91 Added return type DI\Container::has(): bool 2018-12-03 07:40:59 +02:00
Matias Griese
d602cb6e9e Fixed Object serialization breaking if overriding jsonSerialize() method 2018-12-03 07:34:59 +02:00
Matias Griese
e02fa1a4e7 Some code cleanup 2018-12-03 07:28:50 +02:00
Andy Miller
9e1661eb8c commited composer lock file 2018-12-02 21:31:53 -07:00
Chris Jung
00c6313102 Update to Symfony 4.2 (#2280) 2018-12-02 21:29:53 -07:00
Matias Griese
f01792ae81 Added FormFlash and FormFlashFile classes, allow custom FlexForm class, improvements 2018-12-01 22:09:44 +02:00
Matias Griese
bc18b9408b Added onAction.{$action} event 2018-12-01 10:04:15 +02:00
Matias Griese
fa948c04ab Typo in changelog 2018-11-30 23:05:51 +02:00
Matias Griese
8fdd34c245 Added support for task:action (like task but works without nonce) 2018-11-30 23:04:34 +02:00
Matias Griese
cd5bda3f9e Improve debug messages (routed page, flex view) 2018-11-30 20:31:32 +02:00
Matias Griese
e14129d278 Implemented object save in FlexForm::submit() 2018-11-30 15:16:22 +02:00
Matias Griese
decb19b92e Further improve FlexObject::update() 2018-11-30 15:06:27 +02:00
Matias Griese
eb770e95d5 Fixed FlexObject::update() call with partial object update 2018-11-30 14:30:50 +02:00
Matias Griese
77f035eb2d FlexForm: Allow custom nonce, fix fatal error on validation failure 2018-11-30 13:15:20 +02:00
Matias Griese
db2738978e Sanitize $grav['task']` 2018-11-30 13:14:10 +02:00
Matias Griese
180f3c2eca FlexDirectory::getObject() should return any existing object 2018-11-30 13:13:13 +02:00
Matias Griese
e84fbc425f FlexMediaTrait: Fix media meta file 2018-11-29 23:19:28 +02:00
Matias Griese
c5e2ed9f22 FlexForm: Added methods for file upload/delete task routes 2018-11-29 22:04:57 +02:00
Matias Griese
a92f0898d8 Fixed Medium::relativePath() for streams 2018-11-29 21:12:37 +02:00
Matias Griese
d968901d98 Flex: store metadata on file uploads (if available) 2018-11-29 19:27:11 +02:00
Matias Griese
c38b761871 Improve Flex index caching by sharing the same cached item even if using a different key 2018-11-29 12:43:32 +02:00
Matias Griese
b49741f8aa Fixed Flex index caching if using non-standard key 2018-11-29 11:51:27 +02:00
Matias Griese
6866c2a39a Merge remote-tracking branch 'origin/1.6' into 1.6 2018-11-29 10:25:56 +02:00
Matias Griese
9598cd13fe Added user-data:// which is a writable stream (user://data is not and should be avoided) 2018-11-29 10:25:48 +02:00
Andy Miller
49c8fef5f5 Made inflector static so it can be used quickly 2018-11-28 21:58:31 -07:00
Matias Griese
13341f8aa8 Tasks: Pass path to the controller as well 2018-11-28 14:55:03 +02:00
Matias Griese
251cb3f9fa FlexForm: Implement HTML id support 2018-11-28 14:20:50 +02:00
Matias Griese
51767a8f36 Improve FlexMediaTrait 2018-11-28 11:36:07 +02:00
Andy Miller
c653fe6e4a multibyte and case insensitivity support in Util string functions 2018-11-27 16:39:30 -07:00
Matias Griese
70688f3e00 Fixed cache test in Flex 2018-11-27 22:22:13 +02:00
Matias Griese
e9c52046fa Fixed timestamp and serialization 2018-11-27 11:39:04 +02:00
Matias Griese
a01b94f80b Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2018-11-27 10:17:53 +02:00
Matias Griese
708c79cef8 Improved user serialization to use less memory in the session 2018-11-27 10:15:55 +02:00
Matias Griese
f1ce69d4bf Fixed some minor issues in Flex 2018-11-26 14:17:13 +02:00
Matias Griese
5bd417aa39 Minor Flex improvements 2018-11-26 09:49:06 +02:00
Andy Miller
2bf448c587 Merge branch 'develop' into 1.6 2018-11-25 19:08:01 -07:00
Stephan Diehl
b6c582ad3a Update InitializeProcessor.php (#2268)
fix redirect_trailing_slash in a multi language page
2018-11-23 23:01:47 -07:00
Matias Griese
c35c285580 Fixed a bug in flex index caching 2018-11-21 09:45:59 +02:00
Matias Griese
890a61358a Code cleanup on CLI 2018-11-20 20:40:13 +02:00
Matias Griese
7de66cdc53 Improve debugger in CLI 2018-11-20 13:17:19 +02:00
Matias Griese
b353ec12e1 Flex: Fixes for indexing with different keys 2018-11-20 12:01:32 +02:00
Matias Griese
48489ae291 Composer update 2018-11-19 23:26:11 +02:00
Matias Griese
85a3d98d4c Flex: Fixed object keys if using non-standard keys in index 2018-11-19 15:07:36 +02:00
Matias Griese
c9eea7e019 Flex: Fixed some issues with new orderBy() logic 2018-11-19 13:43:02 +02:00
Matias Griese
da483d63f6 Flex: Fixed a bug if there's no entries in the index 2018-11-19 12:43:32 +02:00
Matias Griese
3f89b39b60 Flex: Added support for custom index fields when ordering (major speed up) 2018-11-19 11:11:45 +02:00
Matias Griese
e89b5ce870 Flex: Added support for defining used key field when getting index/collection/build 2018-11-19 10:09:07 +02:00
Matias Griese
88f6d02c03 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	README.md
2018-11-19 09:25:23 +02:00
Matias Griese
cc78fcf31c Some bug fixes in Flex collection / index 2018-11-17 00:34:53 +02:00
Matias Griese
37e880b64a Allow switching to custom keys on FlexIndex 2018-11-17 00:06:46 +02:00
Matias Griese
75b2307d30 Added initial support for Flex keys (unique identifier) 2018-11-16 15:13:12 +02:00
Matias Griese
9e8f700119 Improved Custom FlexIndex logic (breaking old API) 2018-11-16 12:34:17 +02:00
Matias Griese
4bcba0e4f9 Flex: Added support for custom object index classes 2018-11-16 10:26:09 +02:00
Andy Miller
11b661cad5 new Discord reference 2018-11-15 16:30:44 -07:00
Andy Miller
5e1980d770 New Discord reference 2018-11-15 16:30:21 -07:00
Andy Miller
5e7eb6b2f4 Better discord badge 2018-11-15 16:29:08 -07:00
Andy Miller
994a1f89cd Better Badge 2018-11-15 16:28:15 -07:00
Andy Miller
4daa07fd14 Discord Chat button 2018-11-15 16:21:51 -07:00
Andy Miller
d39165f506 discord only 2018-11-15 16:21:03 -07:00
Matias Griese
468db9566b Fixed missing $collection->getStorageKeys() 2018-11-15 22:37:47 +02:00
Matias Griese
33309105d3 Fixed clearing cache having no effect on Doctrine cache 2018-11-15 13:25:53 +02:00
Matias Griese
8cfe6e772d Debug mode: Include HTML comments around the output when rendering flex objects 2018-11-15 13:23:40 +02:00
Matias Griese
bad6e32e18 ObjectIndex: Remove unneeded method which was moved to base class 2018-11-15 12:12:38 +02:00
Matias Griese
02d48693dd Added select() and unselect() methods to CollectionInterface and its base classes
Added `orderBy()` and `limit()` methods to `ObjectCollectionInterface` and its base classes
2018-11-15 10:01:09 +02:00
Andy Miller
7975ec8d09 Merge branch 'develop' into 1.6 2018-11-14 11:21:14 -07:00
Matias Griese
de898b610d Flex: Fixed a bug in new findPrefixedKeysFromFilesystem() method 2018-11-14 16:31:06 +02:00
Matias Griese
0743816822 Flex: Improved object indexing 2018-11-14 16:18:59 +02:00
Matias Griese
bb4958115b Added support for prefixed FolderStorage 2018-11-14 10:59:22 +02:00
Matias Griese
b64404a924 Fixed duplicate key in blueprint YAML 2018-11-14 09:41:03 +02:00
Djamil Legato
9a8b47872e Updated opencollective backers/sponsors list 2018-11-13 23:05:18 -08:00
Andy Miller
76070ddd43 Better handling of append_url_extension inside of Page::templateFormat() #2264 2018-11-13 18:04:53 -07:00
Andy Miller
22066e11b3 more lang stuff 2018-11-13 14:53:39 -07:00
Andy Miller
ef157c7d2b Fixed a broken lang string #2261 2018-11-13 14:08:37 -07:00
Andy Miller
e42e9fdd54 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-11-13 11:29:36 -07:00
Andy Miller
e2594dc72c symlink .editorconfig when using sandbox 2018-11-13 11:29:31 -07:00
Andy Miller
f4e2153291 Updated clean command with vendor udpates 2018-11-13 11:29:16 -07:00
Matias Griese
44db0245a7 Improve new flex object saving and storage 2018-11-13 20:13:32 +02:00
Matias Griese
ff5aa8a0ac Improve Flex storage 2018-11-13 18:00:18 +02:00
Matias Griese
8c0dd6a8d1 Added missing changelog entry from 1.5.5 2018-11-13 08:35:17 +02:00
Andy Miller
1ba21afd30 prepare for release 2018-11-12 15:59:10 -07:00
Andy Miller
e73537f488 Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2018-11-12 15:57:47 -07:00
Andy Miller
9405418572 Merge branch 'release/1.5.5' 2018-11-12 15:56:13 -07:00
Andy Miller
59ccd662c7 Merge tag '1.5.5' into develop
Release v1.5.5
2018-11-12 15:56:13 -07:00
Andy Miller
377751416b Prepare for release 2018-11-12 15:56:04 -07:00
Andy Miller
116c279f01 update changelog 2018-11-12 15:55:29 -07:00
Matias Griese
1d8ef45e9c Added Plugin::isCli() to determine if plugin is running under CLI 2018-11-12 13:48:20 +02:00
Matias Griese
380b3be928 Added $grav->setup() to simplify CLI and custom access points 2018-11-12 12:21:44 +02:00
Matias Griese
c151043c70 Code cleanup in Language class 2018-11-12 11:39:15 +02:00
Andy Miller
64e13c5f87 Updated changelog 2018-11-11 21:37:08 -07:00
Andy Miller
b55d29dfb7 Merge branch 'develop' into 1.6 2018-11-11 21:23:36 -07:00
Aaron Dalton
bf86b5a924 Propagate error code if between 400 and 600 for production sites (errors:display = false or -1) (#2181) 2018-11-11 21:22:47 -07:00
Andy Miller
9f2da67d48 Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2018-11-11 21:20:07 -07:00
Emil Hesslow
d0b34d114d Register theme prefixes as namespaces in twig (#2210) 2018-11-11 21:18:57 -07:00
Andy Miller
d0c9e56aeb Support negotiated language types set via the Request Accept-Language: header 2018-11-11 18:51:20 -07:00
Andy Miller
74cd3ac1e0 Supporting negotiated content types 2018-11-11 18:27:12 -07:00
Andy Miller
ecbc401584 Revert "Set template type based on request headers content-type if set"
This reverts commit 005f626b88.

# Conflicts:
#	CHANGELOG.md
#	system/src/Grav/Common/Page/Page.php
2018-11-11 15:01:44 -07:00
Andy Miller
0c81568df6 Updated changelog 2018-11-11 14:58:36 -07:00
Makara Sok
b9dc2baef1 Remove hardcoded 302 when redirecting trailing slash (#2155)
When `system.pages.redirect_trailing_slash` is enabled, it's always a 302 even though `redirect_default_code` is set to something else. 

By removing it, it works as intended.
2018-11-09 22:30:35 -07:00
Andy Miller
9b43f20159 Use append_url_extension from page header to set template format #2604 2018-11-09 22:28:44 -07:00
Andy Miller
82d3d5edda Fixed Uri::hasStandardPort() to support reverse proxy configurations #1786 2018-11-09 17:22:34 -07:00
Andy Miller
005f626b88 Set template type based on request headers content-type if set 2018-11-09 17:10:03 -07:00
Andy Miller
63005a8280 minor monolog update 2018-11-08 10:40:22 -07:00
Matias Griese
2943294d08 Added CsvFormatter and CvsFile classes 2018-11-08 12:12:37 +02:00
Andy Miller
ed03b02e52 updated changelog 2018-11-06 08:54:48 -07:00
Andy Miller
f43f992125 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-11-06 08:52:51 -07:00
Andy Miller
0b646875d0 cleaned up service id map 2018-11-06 08:52:45 -07:00
Matias Griese
b1b4469d18 Flex form: allow custom form views 2018-11-06 13:54:55 +02:00
Andy Miller
eea70d380c Set default config to testing 2018-11-05 16:10:54 -07:00
Andy Miller
a32880a84d Prepare for 1.6.0-beta.5 release 2018-11-05 15:45:19 -07:00
Andy Miller
72cc5b9d07 Merge tag '1.5.4' into develop
Release v1.5.4
2018-11-05 15:42:04 -07:00
Andy Miller
3c2a8510f9 Added new uniqueness option to optionally use security.salt 2018-11-04 15:50:03 -07:00
Andy Miller
64b0fd7e86 minor symfony library version updates 2018-11-03 18:53:43 -06:00
Andy Miller
36432c00ac Merge branch 'develop' into 1.6 2018-11-03 18:52:18 -06:00
Andy Miller
601990d59b Set session name based on security.salt rather than GRAV_ROOT #2242 2018-11-03 14:36:51 -06:00
Andy Miller
3469974861 Smarter security.salt checking now we use security.yaml for other options 2018-11-03 14:28:47 -06:00
Andy Miller
167ea6419b Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-11-03 14:09:06 -06:00
Andy Miller
472b575e20 Added option to configure list of xss_invalid_protocols in Security config #2250 2018-11-03 14:09:00 -06:00
Matias Griese
b622ff7f14 Flex form: added support for uniqueid 2018-11-02 21:01:29 +02:00
Djamil Legato
d70d0b889e Fixed count of commands list for bin/plugin 2018-11-01 17:18:48 -07:00
Matias Griese
a84b791ac7 Minor fix for AbstractIndexCollection 2018-11-01 11:45:50 +02:00
Andy Miller
6332e7f518 Updated changelog 2018-10-30 17:45:53 -06:00
Andy Miller
849d3184b3 Added Video::preload() that was missing 2018-10-30 17:45:23 -06:00
Andy Miller
4344148bfa added link 2018-10-30 09:26:35 -06:00
Andy Miller
251971485b Added discord badge 2018-10-30 09:24:33 -06:00
Andy Miller
fa3ce13a87 minor dev vendor updates 2018-10-30 09:06:57 -06:00
Andy Miller
bc70d50ff0 Updated icon in debugger 2018-10-29 15:27:31 -06:00
Matias Griese
64a0dd52e8 Changelog update 2018-10-29 20:28:26 +02:00
Matias Griese
5d1c65c936 Minor collection cleanup 2018-10-29 20:13:34 +02:00
Matias Griese
3537770823 Added Route::withAddedPath() method 2018-10-29 12:22:43 +02:00
Matias Griese
b1090d4286 Added NotHandledException class 2018-10-29 09:55:36 +02:00
Matias Griese
5b097fc038 Merge remote-tracking branch 'origin/feature/1.6-controller' into feature/1.6-controller 2018-10-29 08:27:36 +02:00
Matias Griese
092ecd1417 Make Data class to extend JsonSerializable 2018-10-29 08:27:27 +02:00
Andy Miller
ff54dc82ff Merge branch '1.6' into feature/1.6-controller 2018-10-26 21:15:59 -06:00
Andy Miller
ed105b42a2 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-10-26 17:40:57 -06:00
Andy Miller
9e2a95db73 Minor code tweaks 2018-10-26 17:40:51 -06:00
Matias Griese
acf0854e6a Changelog update 2018-10-26 09:12:58 +03:00
Matias Griese
809c4a1bcf Merge remote-tracking branch 'origin/feature/1.6-controller' into feature/1.6-controller 2018-10-26 09:01:59 +03:00
Matias Griese
42887ca282 Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-controller 2018-10-26 09:01:39 +03:00
Matias Griese
46752e9b10 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-10-26 08:58:11 +03:00
Matias Griese
6be1127cf0 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2018-10-26 08:58:01 +03:00
Andy Miller
1f87c5069b prepare for release 2018-10-24 16:03:40 -06:00
Andy Miller
222f05fe81 version update 2018-10-24 15:10:20 -06:00
Andy Miller
023221bfab added GRAV. prefix to core language strings 2018-10-24 14:41:54 -06:00
Matias Griese
b4e40a669d Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
#	composer.lock
#	system/defines.php
2018-10-24 13:23:51 +03:00
Andy Miller
f812236180 whoops update 2018-10-23 12:37:01 -06:00
Matias Griese
b8c9f0cc8c Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-controller
# Conflicts:
#	CHANGELOG.md
2018-10-23 21:10:28 +03:00
Matias Griese
072c7929f7 Fixed Folder::doDelete($folder, false) removing symlink when it should not 2018-10-23 20:16:12 +03:00
Matias Griese
4811fa7d49 Allow new task controllers to run 2018-10-23 18:04:21 +03:00
Andy Miller
3d786f78d5 Added new system config option for languages.pages_fallback_only 2018-10-23 06:56:06 -06:00
Andy Miller
0bf62ed39b added pages.hide_empty_folders config option 2018-10-23 06:23:10 -06:00
Andy Miller
a9196c3268 Some lang improvements 2018-10-22 18:11:26 -06:00
Matias Griese
699c72841c Composer update 2018-10-22 13:54:31 +03:00
Matias Griese
9c4a80a25f Changelog update 2018-10-22 11:32:07 +03:00
Matias Griese
beb1b41317 Added Grav\Framework\DI\Container class 2018-10-22 11:27:30 +03:00
Matias Griese
bdc3f41ac2 Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-controller
# Conflicts:
#	CHANGELOG.md
2018-10-22 10:47:59 +03:00
Matias Griese
fc0dfbe8b4 Added request processor 2018-10-22 10:46:37 +03:00
Andy Miller
8590f4fbf5 Use login provider User avatar if set 2018-10-19 06:26:28 -06:00
Matias Griese
f9cc86a6db Changelog update 2018-10-17 15:07:03 +03:00
Matias Griese
dc263c12e9 Updated Grav Processor classes to implement PSR-15 2018-10-17 15:01:52 +03:00
Matias Griese
d6c17132df Added PSR-7 and PSR-15 classes 2018-10-17 14:57:45 +03:00
Matias Griese
3742be10bc Debugger optimizations 2018-10-17 14:51:15 +03:00
Andy Miller
27aa5e8e15 vendor updates 2018-10-16 19:24:36 -06:00
Matias Griese
83211acaae Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-controller 2018-10-16 13:17:59 +03:00
Matias Griese
eb97964a00 Debugger optimizations 2018-10-16 13:12:26 +03:00
Matias Griese
f43ab0ed59 Added apcu autoloader optimization 2018-10-16 13:02:32 +03:00
Matias Griese
df5f7f4890 Remove old assets class 2018-10-16 13:00:16 +03:00
Andy Miller
08f07e663e Prepare for release 2018-10-15 14:39:40 -06:00
Matias Griese
cc61fb5d0f BlueprintSchema: Added methods to get the type defaults 2018-10-15 13:03:10 +03:00
Matias Griese
049f84a52a Optimize Grav Services stage for speed 2018-10-12 13:57:11 +03:00
Matias Griese
776d1419c1 Built-in PHP Webserver: log requests before handling them 2018-10-12 12:13:59 +03:00
Matias Griese
d848dcde5d Call onFatalException event also on internal PHP errors 2018-10-12 12:06:10 +03:00
Ole Vik
4ff0d34aa2 Fallback for never run and Windows (#2202) 2018-10-11 21:44:07 -06:00
Andy Miller
c6f6677d6e Prepare for release 2018-10-09 11:40:41 -06:00
Andy Miller
b96e264cc7 Fixed pipeline + remote url rewrites #2216 2018-10-08 13:56:46 -06:00
Andy Miller
1d6cdd45eb minor symfony updates 2018-10-07 21:23:03 -06:00
Andy Miller
0204906454 Improved usability of System configuration blueprint with side-tabs 2018-10-07 16:51:42 -06:00
Andy Miller
a7b184abdb Setup is now in the template… 2018-10-07 15:46:26 -06:00
Andy Miller
fff9c657d4 Support route/path output 2018-10-06 17:52:46 -06:00
Andy Miller
6070bfc46e updated changelog 2018-10-06 16:37:52 -06:00
Andy Miller
6b46c288a6 Added configurable dangerous file upload extensions 2018-10-06 16:35:15 -06:00
Andy Miller
8dd352c5c4 typo 2018-10-04 21:20:25 -06:00
Matias Griese
8fe3f0c35f FlexMediaTrait: Added checks for bad filenames 2018-10-04 14:53:44 +03:00
Matias Griese
16edb93efb Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2018-10-04 14:45:33 +03:00
Andy Miller
6e5b173861 updated changelog 2018-10-03 13:50:39 -06:00
Matias Griese
6010b8e1b4 Flex: Added support for custom media tasks 2018-10-03 14:21:35 +03:00
Matias Griese
8d0d26ed9b Update script and style twig tags to use the new Asset classes 2018-10-03 11:31:36 +03:00
Matias Griese
65bb683b4a Merge remote-tracking branch 'origin/1.6' into 1.6
# Conflicts:
#	CHANGELOG.md
2018-10-03 10:54:01 +03:00
Matias Griese
75e8a19363 Regression: Asset methods with default legacy attributes were not working 2018-10-03 10:52:08 +03:00
Andy Miller
1a47b837f5 updated changelog 2018-10-02 17:58:11 -06:00
Andy Miller
50c211fc10 cleanup var names to avoid confusion 2018-10-02 17:57:05 -06:00
Andy Miller
4fb035c512 Don’t add missing assets 2018-10-02 17:56:34 -06:00
Djamil Legato
78992df894 Added support for syslog and syslog facility logging (default: 'file') 2018-10-02 12:36:34 -07:00
Djamil Legato
70c423563f Merge branch '1.6' of https://github.com/getgrav/grav into 1.6 2018-10-02 10:45:39 -07:00
Matias Griese
2503180e73 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	composer.lock
#	system/defines.php
2018-10-02 09:58:31 +03:00
Andy Miller
ed0cb0c8f2 set to testing mode 2018-10-01 21:32:49 -06:00
Djamil Legato
a6449cb8ba Splitted log handler and added support for syslog along side with stream (file) 2018-10-01 16:07:04 -07:00
Andy Miller
9e776df296 Prepare for rlease 2018-10-01 15:58:02 -06:00
Andy Miller
70b6fb32c4 Revert "Splitted log handler and added support for syslog along side with stream (file)"
This reverts commit ecaeb32675.
2018-10-01 15:11:13 -06:00
Andy Miller
7148e9e136 Merge branch 'develop' into 1.6
# Conflicts:
#	system/src/Grav/Common/Security.php
#	system/src/Grav/Common/Twig/TwigExtension.php
2018-10-01 14:14:23 -06:00
Djamil Legato
ecaeb32675 Splitted log handler and added support for syslog along side with stream (file) 2018-10-01 11:43:31 -07:00
Andy Miller
e4f6f8bcf2 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-10-01 12:33:36 -06:00
Andy Miller
91d8a16db2 Refactored security 2018-10-01 12:33:26 -06:00
Matias Griese
920b0fcb2e Register all page types into blueprint://pages stream 2018-10-01 21:26:36 +03:00
Matias Griese
760c3e869f Merge branch 'develop' of https://github.com/getgrav/grav into 1.6 2018-10-01 21:07:28 +03:00
Andy Miller
6488a0f2fb get rawcontent 2018-09-30 21:11:23 -06:00
Andy Miller
efe45f64bc Updated vendor 2018-09-30 19:13:51 -06:00
Andy Miller
d893dd55ff Merge branch 'develop' into 1.6
# Conflicts:
#	.gitignore
#	bin/grav
2018-09-30 18:39:46 -06:00
Matias Griese
ce5f0b7785 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-09-27 22:51:42 +03:00
Matias Griese
9204b87f3a Hide form fields in blueprints by using dynamic property like scope@: object or scope-ignore@: object, right now only Flex sets the scope 2018-09-27 22:51:35 +03:00
Andy Miller
4a83314095 Should fix more legacy issues 2018-09-27 12:27:07 -06:00
Andy Miller
99ea119483 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-09-27 09:52:56 -06:00
Andy Miller
c361f16fcf remove duplicate option 2018-09-27 09:52:51 -06:00
Matias Griese
b4d4fb900e Composer update 2018-09-27 09:43:08 +03:00
Matias Griese
0c3b34e89a Updated Asset classes for PHP 7.1, fixed a bug in \Closure name 2018-09-27 09:36:32 +03:00
Andy Miller
a549615257 Updated changelog 2018-09-26 16:55:36 -06:00
Andy Miller
c796474bce legacy fix 2018-09-26 16:52:10 -06:00
Andy Miller
26aea439c6 Assets Manager Refactoring (#2201)
* initial commit of refactored class structure

* more refactoring

* more progress

* more refactoring…

* Rendering stuff!

* Updates

* filter + sort

* inline stuff now added

* continued compatibility improvements + some test fixes

* more compatibility fixes

* CSS pipeline working!

* pipeline in the house

* Various fixes for testing bugs

* Fix timestamps

* CSS/JS Inline support

* Tidy

* Optimizations…

* fix for tests

* Added a couple of inline tests
2018-09-26 16:34:53 -06:00
Andy Miller
32cfb749af ignore testing templates 2018-09-25 18:15:51 -06:00
Andy Miller
b79cbf8975 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-09-25 15:57:46 -06:00
Andy Miller
3ef154949d ignore testing template 2018-09-25 15:57:40 -06:00
Matias Griese
007b17a7ba Fixed partial save for Flex Objects 2018-09-25 11:16:31 +03:00
Matias Griese
8c64434069 Fixed updating empty array (no data, should be ignored) 2018-09-24 15:33:49 +03:00
Matias Griese
ff1d5bc965 Fix extra storageKey, timestamps fields stored into the Flex objects 2018-09-24 15:23:23 +03:00
Matias Griese
346b8683ac Fix extra authorize, forms fields stored into the Flex objects 2018-09-24 15:18:56 +03:00
Matias Griese
7a61b09a85 Added proper support for hiding form fields in blueprints by using dynamic property like security@: admin.foobar to any field 2018-09-24 11:25:51 +03:00
Andy Miller
53f5a6fa57 Updated changelog 2018-09-20 13:33:43 -06:00
Andy Miller
95172ce4c1 wip 2018-09-20 12:53:43 -06:00
Andy Miller
84ecdfee71 Updated changelog 2018-09-20 11:28:08 -06:00
Andy Miller
537c5f4ee8 Merge branch 'feature/cache-refactor' into 1.6 2018-09-20 11:25:35 -06:00
Andy Miller
68ee0f7580 changed text.. need to move to. lang file 2018-09-20 11:24:51 -06:00
Andy Miller
178193ab1a Added a deleteAll() method and also renamed CLI command 2018-09-20 11:07:39 -06:00
Matias Griese
e7ddae713f Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	composer.json
2018-09-20 11:03:02 +03:00
Matias Griese
bd2883d63f Merge branch '1.6' of https://github.com/getgrav/grav into 1.6 2018-09-20 09:43:57 +03:00
Andy Miller
12c3c6c472 tooltip work 2018-09-19 22:02:08 -06:00
Andy Miller
1c08fa2b1a typo 2018-09-19 17:04:44 -06:00
Andy Miller
24991dc17d Updated changelog 2018-09-19 16:57:38 -06:00
Andy Miller
9261f105e3 Squashed commit of the following:
commit 85194f77412fb25c1708d594435a87ded4ccdddc
Author: Andy Miller <rhuk@mac.com>
Date:   Tue Sep 11 16:13:04 2018 -0600

    cleanup

commit 38b35d57ebf3a74c5210487add1a023c93a1c45b
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 21:24:12 2018 -0600

    Removed old ZipBackup class

commit 05da0b3eee8a3156776771e89604c89870aad8e2
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 21:19:41 2018 -0600

    Fix for empty crontab message

commit a77955a598a6d8e1a4d34a8e61d54dea2ea3a38a
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 14:33:33 2018 -0600

    Implemented purge

commit ead22829c0ffe1c08478833e96802d6a7b93da0f
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 13:15:29 2018 -0600

    Remove double code logic

commit 44d37ad91017e401fbe58e05af7b9141e35128d4
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 13:10:49 2018 -0600

    Optimized loading

commit e8b96d22cfd67f8226e53a54051aff2deb450e66
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Sep 10 12:00:18 2018 -0600

    more progress for events

commit 32579228d3ed351ad883da85917a9b745721611b
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 21:55:17 2018 -0600

    validations

commit 39c0eee1c3bf64184bd30483ae629fee7d04f532
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 21:37:19 2018 -0600

    require stuff

commit 7a0cf861d45fc5da4a2acc877ee6518d717f0a53
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 18:07:38 2018 -0600

    added ability to turn off tense in nicetime

commit 09bffc6cac2123325262b6e3deb75a15a553ea42
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 14:35:50 2018 -0600

    title for profiles

commit fa70782c275bb4e37cb55423c73c2f7de63888a3
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 14:31:45 2018 -0600

    Improvements

commit 83342bf563a9a2a7b338ad22490052fb4b2c3165
Author: Andy Miller <rhuk@mac.com>
Date:   Sun Sep 9 13:28:31 2018 -0600

    Optimizations

commit a5a2c133d280d7c2d18d39ffb936df019007ca09
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 23:36:32 2018 -0600

    Tidyup

commit 1e7585dd6fd0d7cdae4a294229d7813863bbd243
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 22:19:25 2018 -0600

    Pick the backup from CLI if more than 1

commit 8e36a3b1063c8feabfe9e2702d78246ad03d87b1
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 20:07:02 2018 -0600

    Added downloads button

commit 9d7408a09472ca58f50e46f6a9839bb95b510c07
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 16:59:24 2018 -0600

    Integrated with build configuration

commit c22a6de8791522f1b6c622c255e09d94d7288811
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 15:05:38 2018 -0600

    init and create backup dir if required

commit 40a28def5df42ab3edd265a5622580c1170d5a33
Author: Andy Miller <rhuk@mac.com>
Date:   Sat Sep 8 08:39:52 2018 -0600

    Made backup a Grav service provider

commit b09f778b8f6d823e6c03e83f3759114fab9a2959
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 18:19:29 2018 -0600

    backups config has begun

commit 69da2948d6374f2a6d428ce2fa6b5f65ca6f4715
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 18:19:02 2018 -0600

    Scheduler tweaks

commit d30d3010d670c4771859947b950ae7984fd3529e
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 15:10:58 2018 -0600

    style integrated

commit d37b250a5d98c3dfd9556bc0491c41debf94720b
Merge: c8823edd be0573f6
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 15:04:05 2018 -0600

    Merge branch '1.6' into feature/backup

commit c8823edd0cef4bfc878c83f1dd7e35fabaa6157d
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 14:35:29 2018 -0600

    Better messages in CLI

commit 6695fb4d512cfe2e48220caf941e41c5dca0293e
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 14:15:40 2018 -0600

    CLI status bar integration

commit bae7047482ef786e5b0012b99eb911a7740f8818
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 07:32:56 2018 -0600

    optimizations

commit 4b8d67a15c3c14297d2bdb8769fbddd0221d13a9
Author: Andy Miller <rhuk@mac.com>
Date:   Fri Sep 7 06:49:49 2018 -0600

    archive class stuff

commit d03722689a1c06098e3db7fd3130d36ee8225ff6
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Sep 6 17:31:21 2018 -0600

    initial commit of some stub classes
2018-09-19 15:44:31 -06:00
Matias Griese
7a4b234c6d Update Config classes for PHP 7.1 2018-09-14 15:36:25 +03:00
Matias Griese
a1680ddeaa Update Data classes for PHP 7.1 2018-09-13 17:27:04 +03:00
Matias Griese
871333d3a0 Bug fixes for Flex 2018-09-13 15:21:47 +03:00
Matias Griese
5c81d7863c Add Flex class 2018-09-13 10:22:15 +03:00
Matias Griese
354831338c Update more Framework code for PHP 7.1 2018-09-12 21:17:35 +03:00
Matias Griese
593abccedc Added Grav\Framework\Flex classes 2018-09-12 15:52:28 +03:00
Matias Griese
e5c6788243 Minor fixes 2018-09-12 15:37:37 +03:00
Matias Griese
a358f2953a Update Framework classes to use PHP 7.1 syntax 2018-09-12 14:23:13 +03:00
Matias Griese
9444b63f8b Added Grav\Framework\Collection\AbstractIndexCollection, Grav\Framework\Object\ObjectIndex classes 2018-09-12 13:34:48 +03:00
Matias Griese
79df293fc4 Added Grav\Framework\File classes for handling YAML, Markdown, JSON, INI and PHP serialized files 2018-09-12 10:58:39 +03:00
Matias Griese
be0573f6ea Composer update 2018-09-07 14:58:50 +03:00
Matias Griese
4dc6264c64 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	system/src/Grav/Common/Twig/TwigExtension.php
2018-09-07 14:44:14 +03:00
Matias Griese
3a0c7168c9 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6 2018-09-06 12:35:21 +03:00
Matias Griese
a0e475b277 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6 2018-09-06 11:04:19 +03:00
Matias Griese
a7ad34bd99 Resolve merge conflicts 2018-09-06 09:18:34 +03:00
Andy Miller
5499f2edb6 Feature/scheduler (#2170)
* scheduler first commit

* moved jobs to config

* got some args working

* commands and static methods working.. events hooked up

* No longer dependent on `exec()`.. uses Symfony\Process

* More improvements

* support getAt()

* Make inflector available in DI

* Fix for inflector

* store job run states

* more improvements including cron twig function

* Add scheduler to event + cleanup

* improvements to the CLI command

* Added id field

* use proper func

* Added email

* Fix quotes

* Updated built-in composer

* Better command for adding the scheduler cron via terminal

* Fixed typo and added cron language

* Added Cron class to make at -> human readable date possible

* Added some checks when there are no jobs

* Added method to get CronExpression

* Revamped with Symfony 4.1 CLI updates
2018-09-05 19:02:12 -06:00
Matias Griese
935fb98013 Added new {% throw 404 'Not Found' %} twig tag (with custom code/message 2018-09-05 12:03:57 +03:00
Matias Griese
665fa6cc9c Require doctrine/cache 1.8 2018-09-04 09:24:50 +03:00
Matias Griese
772f07e521 Make asset and image stream read/write 2018-09-04 09:24:18 +03:00
Matias Griese
2bbf219dc0 Composer update 2018-08-31 08:29:02 +03:00
Matias Griese
7cc98b8265 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
#	index.php
#	system/defines.php
2018-08-31 08:26:39 +03:00
Matias Griese
2dfd6b76d8 Remove PHP 5.6 and 7.0 from travis 2018-08-18 12:02:56 +03:00
Matias Griese
330b2e6a6b Changelog update 2018-08-18 00:34:35 +03:00
Matias Griese
896c25dc9e Updated Symfony Components to 4.1 2018-08-18 00:32:55 +03:00
Matias Griese
3b04315a38 Grav 1.6.0-dev: updated minimum PHP requirements to 7.1.3
Updated Doctrine Collections and Cache
2018-08-17 23:29:24 +03:00
396 changed files with 29156 additions and 8339 deletions

3
.gitignore vendored
View File

@@ -38,8 +38,9 @@ Thumbs.db
# phpstorm
.idea/*
# testing stuff
tests/_output/*
tests/_support/_generated/*
tests/cache/*
tests/error.log
/system/templates/testing
system/templates/testing/*

View File

@@ -1,7 +1,5 @@
language: php
php:
- '5.6'
- '7.0.21'
- '7.1'
- '7.2'
branches:
@@ -53,7 +51,7 @@ before_install:
- if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
composer install --dev --prefer-dist;
fi
- if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
- if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
export TRAVIS_TAG=$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/getgrav/grav/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4);
eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.8 bash)";
go get github.com/aktau/github-release;
@@ -70,7 +68,7 @@ script:
vendor/bin/codecept run;
fi
- echo "Latest Release Tag - ${TRAVIS_TAG}"
- if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
- if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
FILES="$RT_DEVTOOLS/grav-dist/*.zip";
for file in ${FILES[@]}; do
NAME=${file##*/};

View File

@@ -1,3 +1,253 @@
# v1.6.0-rc.3
## 02/18/2019
1. [](#new)
* Implemented `Grav\Framework\Psr7` classes as `Nyholm/psr7` decorators
* Renamed `blueprints/user/accounts.yaml` to `blueprints/user/users.yaml`
* Moved FlexUser index into `user-data://flex/indexes/users.yaml` [#2378](https://github.com/getgrav/grav/issues/2378)
* Added a new `cache-clear` scheduled job to go along with `cache-purge`
1. [](#improved)
* More code cleanup
* Fixed `FlexUser` caching
* Added back missing `page.types` field in system content configuration [admin#1612](https://github.com/getgrav/grav-plugin-admin/issues/1612)
* Console commands: add method for invalidating cache
* Updated languages
1. [](#bugfix)
* Fixed validation for select field type with selectize
* Fixed validation for boolean toggles
* Fixed `Flex[class]::getType()` to return the same value in every class
* Fixed `FlexIndex` keys being lost when `FlexCollection` gets loaded
* Fixed missing `form_nonce` for JS when using `FlexForm`
* Fixed slow loading of `FlexUser` objects on `$grav['users']->find()` and `load()` calls
# v1.6.0-rc.2
## 02/07/2019
1. [](#new)
* New experimental **FlexObjects** powered `Users` for increased performance and capability (**disabled** by default)
* New `$grav['users']` service to allow custom user classes implementing `UserInterface`
* Added index file support for Flex Objects
* Added `LogViewer` helper class and CLI command: `bin/grav logviewer`
1. [](#improved)
* Improved error detection for broken Flex Objects
* Removed `apc` and `xcache` support, made `apc` alias of `apcu`
* Support admin and regular translations via the `|t` twig filter and `t()` twig function
* Improved Grav Core installer/updater to run installer script
* Updated vendor libraries including Symfony `4.2.3`
* Renamed old `User` class to `Grav\Common\User\DataUser\User` with multiple improvements and small fixes
* `User` class now acts as a compatibility layer to older versions of Grav
* Deprecated `new User()`, `User::load()`, `User::find()` and `User::delete()` in favor of `$grav['users']` service
* `Media` constructor has now support to not to initialize the media objects
* Cleanly handle session corruption due to changing Flex object types
* Renamed `FlexAuthorizeInterface::authorize()` to `isAuthorized()`
1. [](#bugfix)
* Fixed non-namespaced exceptions in scheduler
* Fixed trailing slash redirect in multlang environment [#2350](https://github.com/getgrav/grav/issues/2350)
* Fixed Flex from indexing hidden folders/files as objects
* Regression: `$session->getFlashObject('files-upload')` did not work with Form 3.0
# v1.6.0-rc.1
## 01/30/2019
1. [](#improved)
* Improved `$page->forms()` call, added `$page->addForms()`
* Made `FormFlashFile` more robust against deleted files
* Updated languages from crowdin
* Fixed a bug in `FormFlashFile::moveTo()` not deleting the old file
* Fixed `FlexMediaTrait::getMedia()` trying to include uploaded but already moved media
* Fixed `ImageMedium` constructor warning when file does not exist
* Fixed bad host header in PSR-7 (if using `php -S localhost:8000 system/router.php`)
# v1.6.0-beta.8
## 01/25/2019
1. [](#new)
* Added `Grav\Framework\Form\Interfaces\FormInterface`
* Added `Grav\Framework\Form\Interfaces\FormFactoryInterface`
* Added `Grav\Framework\Form\FormTrait`
* Added `Page::forms()` method to get normalized list of all form headers defined in the page
* Added `onPageAction`, `onPageTask`, `onPageAction.{$action}` and `onPageTask.{$task}` events
* Added `Blueprint::processForm()` method to filter form inputs
* Move `processMarkdown()` method from `TwigExtension` to more general `Utils` class
* Added support to include extra files into `Media` (such as uploaded files)
* Added form preview support for `FlexObject`, including a way to render newly uploaded files before saving them
* Added `FlexObject::getChanges()` to determine what fields change during an update
* Added `arrayDiffMultidimensional`, `arrayIsAssociative`, `arrayCombine` Util functions
1. [](#improved)
* Added method argument `Data::filter($missingValuesAsNull)`, defaulting to `false`
* Improved `Grav\Common\User` class; added `$user->update()` method
* Added trim support for text input fields `validate: trim: true`
1. [](#bugfix)
* Fixed environment getting port added [#2284](https://github.com/getgrav/grav/issues/2284)
* Fixed `FlexForm::updateObject()` to update array values when they are empty in the form
* Fixed some issues related to Medium objects losing query string attributes
* Broke out Medium timestamp so it's not cleared on `reset()s`
* Fixed issue with `redirect_trailing_slash` losing query string [#2269](https://github.com/getgrav/grav/issues/2269)
* Fixed failed login if user attempts to log in with upper case non-english letters
* Removed extra authenticated/authorized fields when saving existing user from a form
* Fixed `Grav\Framework\Route::__toString()` returning relative URL, not relative route
# v1.6.0-beta.7
## 12/14/2018
1. [](#new)
* Updated Symfony Components to 4.2
* Added `select()` and `unselect()` methods to `CollectionInterface` and its base classes
* Added `orderBy()` and `limit()` methods to `ObjectCollectionInterface` and its base classes
* Added `user-data://` which is a writable stream (`user://data` is not and should be avoided)
* Added support for `/action:{$action}` (like task but used without nonce when only receiving data)
* Added `onAction.{$action}` event
* Added `Grav\Framework\Form\FormFlash` class to contain AJAX uploaded files in more reliable way
* Added `Grav\Framework\Form\FormFlashFile` class which implements `UploadedFileInterface` from PSR-7
* Added `Grav\Framework\Filesystem\Filesystem` class with methods to manipulate stream URLs
* Added new `$grav['filesystem']` service using an instance of the new `Filesystem` object
* Added `{% render object layout: 'default' with { variable: true } %}` for Flex objects and collections
* Grav 1.6: Flex: Added support for custom object index classes (API compatibility break)
1. [](#improved)
* Improved `Grav\Framework\File\Formatter` classes to have abstract parent class and some useful methods
* Grav 1.6: Improved Flex storage classes
* Grav 1.6: Improved `Grav\Framework\File` classes to use better type hints and the new `Filesystem` class
1. [](#bugfix)
* Fixed handling of `append_url_extension` inside of `Page::templateFormat()` [#2264](https://github.com/getgrav/grav/issues/2264)
* Fixed a broken language string [#2261](https://github.com/getgrav/grav/issues/2261)
* Fixed clearing cache having no effect on Doctrine cache
* Fixed `Medium::relativePath()` for streams
* Fixed `Object` serialization breaking if overriding `jsonSerialize()` method
* Grav 1.6: Fixed `FlexObject::update()` call with partial object update
* Fixed `YamlFormatter::decode()` when calling `init_set()` with integer
* Fixed session throwing error in CLI if initialized
# v1.6.0-beta.6
## 11/12/2018
1. [](#new)
* Added `$grav->setup()` to simplify CLI and custom access points
* Grav 1.6: Added `CsvFormatter` and `CsvFile` classes
1. [](#improved)
* Support negotiated content types set via the Request `Accept:` header
* Support negotiated language types set via the Request `Accept-Language:` header
* Cleaned up and sorted the Service `idMap`
* Grav 1.6: Allow custom Flex form views
1. [](#bugfix)
* Fixed `Uri::hasStandardPort()` to support reverse proxy configurations [#1786](https://github.com/getgrav/grav/issues/1786)
* Use `append_url_extension` from page header to set template format if set [#2604](https://github.com/getgrav/grav/pull/2064)
* Fixed some bugs in Grav environment selection logic
# v1.6.0-beta.5
## 11/05/2018
1. [](#new)
* Added PSR-7 and PSR-15 classes
* Added `Grav\Framework\DI\Container` class
* Added `Grav\Framework\RequestHandler\RequestHandler` class
* Added `Page::httpResponseCode()` and `Page::httpHeaders()` methods
1. [](#improved)
* Updated `Grav` container object to implement PSR-11 `ContainerInterface`
* Updated Grav `Processor` classes to implement PSR-15 `MiddlewareInterface`
* Make `Data` class to extend `JsonSerializable`
* Modified debugger icon to use retina space-dude version
* Added missing `Video::preload()` method
* Set session name based on `security.salt` rather than `GRAV_ROOT` [#2242](https://github.com/getgrav/grav/issues/2242)
* Added option to configure list of `xss_invalid_protocols` in `Security` config [#2250](https://github.com/getgrav/grav/issues/2250)
* Smarter `security.salt` checking now we use `security.yaml` for other options
* Grav 1.6: Merged Grav 1.5.4 fixes in
# v1.6.0-beta.4
## 10/24/2018
1. [](#new)
* Added new system config option to `pages.hide_empty_folders` if a folder has no valid `.md` file available. Default behavior is `false` for compatibility.
* Added new system config option for `languages.pages_fallback_only` forcing only 'fallback' to find page content through supported languages, default behavior is to display any language found if active language is missing
* Added `Utils::arrayFlattenDotNotation()` and `Utils::arrayUnflattenDotNotation()` helper methods
1. [](#improved)
* Added apcu autoloader optimization
* Additional helper methods in `Language`, `Languages`, and `LanguageCodes` classes
1. [](#bugfix)
* Use login provider User avatar if set
* Fixed `Folder::doDelete($folder, false)` removing symlink when it should not
# v1.6.0-beta.3
## 10/15/2018
1. [](#improved)
* Call `onFatalException` event also on internal PHP errors
* Built-in PHP Webserver: log requests before handling them
1. [](#bugfix)
* Grav 1.6: Scheduler Fallback for never runs and Windows support [#2202](https://github.com/getgrav/grav/pull/2202)
# v1.6.0-beta.2
## 10/09/2018
1. [](#new)
* Grav 1.6: Added Flex support for custom media tasks
1. [](#improved)
* Added support for syslog and syslog facility logging (default: 'file')
* Improved usability of `System` configuration blueprint with side-tabs
1. [](#bugfix)
* Fixed asset manager to not add empty assets when they don't exist in the filesystem
* Update `script` and `style` Twig tags to use the new `Assets` classes
* Fixed asset pipeline to rewrite remote URLs as well as local [#2216](https://github.com/getgrav/grav/issues/2216)
* Grav 1.6: Regression: Fixed asset manager methods with default legacy attributes
# v1.6.0-beta.1
## 10/01/2018
1. [](#new)
* Set minimum requirements to [PHP 7.1.3](https://getgrav.org/blog/raising-php-requirements-2018)
* New `Scheduler` functionality for periodic jobs
* New `Backup` functionality with multiple backup profiles and scheduler integration
* Refactored `Assets Manager` to be more powerful and flexible
* Updated Doctrine Collections to 1.5
* Updated Doctrine Cache to 1.8
* Updated Symfony Components to 4.1
* Added a new Deferred Twig extension to allow adding content to Twig blocks after render
* Added new Cache purge functionality old cache manually via CLI/Admin as well as scheduler integration
* Added new `{% throw 404 'Not Found' %}` twig tag (with custom code/message)
* Added `Grav\Framework\File` classes for handling YAML, Markdown, JSON, INI and PHP serialized files
* Added `Grav\Framework\Collection\AbstractIndexCollection` class
* Added `Grav\Framework\Object\ObjectIndex` class
* Added `Grav\Framework\Flex` classes
* Added support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar`, `scope@: object` or `scope-ignore@: object` to any field
1. [](#improved)
* Doctrine filecache is now namespaced with prefix to support purging
* Register all page types into `blueprint://pages` stream
# v1.5.8
## 02/07/2019
1. [](#improved)
* Improved `User` unserialize to not to break the object if serialized data is not what expected
* Removed unused parameter [#2357](https://github.com/getgrav/grav/pull/2357)
# v1.5.7
## 01/25/2019
1. [](#new)
* Support for AWS Cloudfront forwarded scheme header [#2297](https://github.com/getgrav/grav/pull/2297)
1. [](#improved)
* Set homepage with `https://` protocol [#2299](https://github.com/getgrav/grav/pull/2299)
* Preserve accents in fields containing Twig expr. using unicode [#2279](https://github.com/getgrav/grav/pull/2279)
* Updated vendor libraries
1. [](#bugfix)
* Support spaces with filenames in responsive images [#2300](https://github.com/getgrav/grav/pull/2300)
# v1.5.6
## 12/14/2018
1. [](#improved)
* Updated InitializeProcessor.php to use lang-safe redirect [#2268](https://github.com/getgrav/grav/pull/2268)
* Improved user serialization to use less memory in the session
# v1.5.5
## 11/12/2018
1. [](#new)
* Register theme prefixes as namespaces in Twig [#2210](https://github.com/getgrav/grav/pull/2210)
1. [](#improved)
* Propogate error code between 400 and 600 for production sites [#2181](https://github.com/getgrav/grav/pull/2181)
1. [](#bugfix)
* Remove hardcoded `302` when redirecting trailing slash [#2155](https://github.com/getgrav/grav/pull/2155)
# v1.5.4
## 11/05/2018

View File

@@ -1,24 +1,26 @@
# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) [![Slack](https://grav-chat.now.sh/badge.svg)](https://chat.getgrav.org) [![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad)
[![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org)
[![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.
The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include:
* [Twig Templating](http://twig.sensiolabs.org/): for powerful control of the user interface
* [Markdown](http://en.wikipedia.org/wiki/Markdown): for easy content creation
* [YAML](http://yaml.org): for simple configuration
* [Parsedown](http://parsedown.org/): for fast Markdown and Markdown Extra support
* [Doctrine Cache](http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
* [Pimple Dependency Injection Container](http://pimple.sensiolabs.org/): for extensibility and maintainability
* [Symfony Event Dispatcher](http://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
* [Symfony Console](http://symfony.com/doc/current/components/console/introduction.html): for CLI interface
* [Twig Templating](https://twig.sensiolabs.org/): for powerful control of the user interface
* [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation
* [YAML](https://yaml.org): for simple configuration
* [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support
* [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
* [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability
* [Symfony Event Dispatcher](https://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
* [Symfony Console](https://symfony.com/doc/current/components/console/introduction.html): for CLI interface
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
# Requirements
- PHP 5.6.4 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements)
- PHP 7.1.3 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements)
- Check the [Apache](https://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](https://learn.getgrav.org/basics/requirements#iis-requirements) requirements
# QuickStart
@@ -94,7 +96,7 @@ If you discover a possible security issue related to Grav or one of its plugins,
* [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds
* Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration)
* Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons)
* If you have questions, jump on our [Slack Room](https://getgrav.org/slack)!
* If you have questions, jump on our [Discord Chat Server](https://chat.getgrav.org)!
* Have fun!
# Exploring More
@@ -107,71 +109,12 @@ If you discover a possible security issue related to Grav or one of its plugins,
# Backers
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
<a href="https://opencollective.com/grav/backer/0/website" target="_blank"><img src="https://opencollective.com/grav/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/1/website" target="_blank"><img src="https://opencollective.com/grav/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/2/website" target="_blank"><img src="https://opencollective.com/grav/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/3/website" target="_blank"><img src="https://opencollective.com/grav/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/4/website" target="_blank"><img src="https://opencollective.com/grav/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/5/website" target="_blank"><img src="https://opencollective.com/grav/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/6/website" target="_blank"><img src="https://opencollective.com/grav/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/7/website" target="_blank"><img src="https://opencollective.com/grav/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/8/website" target="_blank"><img src="https://opencollective.com/grav/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/9/website" target="_blank"><img src="https://opencollective.com/grav/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/10/website" target="_blank"><img src="https://opencollective.com/grav/backer/10/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/11/website" target="_blank"><img src="https://opencollective.com/grav/backer/11/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/12/website" target="_blank"><img src="https://opencollective.com/grav/backer/12/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/13/website" target="_blank"><img src="https://opencollective.com/grav/backer/13/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/14/website" target="_blank"><img src="https://opencollective.com/grav/backer/14/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/15/website" target="_blank"><img src="https://opencollective.com/grav/backer/15/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/16/website" target="_blank"><img src="https://opencollective.com/grav/backer/16/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/17/website" target="_blank"><img src="https://opencollective.com/grav/backer/17/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/18/website" target="_blank"><img src="https://opencollective.com/grav/backer/18/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/19/website" target="_blank"><img src="https://opencollective.com/grav/backer/19/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/20/website" target="_blank"><img src="https://opencollective.com/grav/backer/20/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/21/website" target="_blank"><img src="https://opencollective.com/grav/backer/21/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/22/website" target="_blank"><img src="https://opencollective.com/grav/backer/22/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/23/website" target="_blank"><img src="https://opencollective.com/grav/backer/23/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/24/website" target="_blank"><img src="https://opencollective.com/grav/backer/24/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/25/website" target="_blank"><img src="https://opencollective.com/grav/backer/25/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/26/website" target="_blank"><img src="https://opencollective.com/grav/backer/26/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/27/website" target="_blank"><img src="https://opencollective.com/grav/backer/27/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/28/website" target="_blank"><img src="https://opencollective.com/grav/backer/28/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/29/website" target="_blank"><img src="https://opencollective.com/grav/backer/29/avatar.svg"></a>
<img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
# Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
<a href="https://opencollective.com/grav/sponsor/0/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/1/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/2/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/3/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/4/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/5/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/6/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/7/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/8/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/9/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/10/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/11/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/12/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/12/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/13/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/13/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/14/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/14/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/15/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/15/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/16/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/16/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/17/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/17/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/18/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/18/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/19/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/19/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/20/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/20/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/21/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/21/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/22/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/22/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/23/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/23/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/24/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/24/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/25/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/25/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/26/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/26/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/27/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/27/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/28/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/28/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/29/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/29/avatar.svg"></a>
<img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />
# License
@@ -183,7 +126,7 @@ See [LICENSE](LICENSE.txt)
# Running Tests
First install the dev dependencies by running `composer update` from the Grav root.
Then `composer test` will run the Unit Tests, which should be always executed successfully on any site.
Windows users should use the `composer test-windows` command.
First install the dev dependencies by running `composer update` from the Grav root.
Then `composer test` will run the Unit Tests, which should be always executed successfully on any site.
Windows users should use the `composer test-windows` command.
You can also run a single unit test file, e.g. `composer test tests/unit/Grav/Common/AssetsTest.php`

Binary file not shown.

31
bin/gpm
View File

@@ -1,26 +1,24 @@
#!/usr/bin/env php
<?php
define('GRAV_CLI', true);
if (!file_exists(__DIR__ . '/../vendor')){
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Composer;
use Grav\Common\Config\Setup;
use Symfony\Component\Console\Application;
use Grav\Common\Grav;
if (!file_exists(__DIR__ . '/../vendor')){
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
// Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
use Symfony\Component\Console\Application;
use Grav\Common\Grav;
$autoload = require_once(__DIR__ . '/../vendor/autoload.php');
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
@@ -30,7 +28,7 @@ if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
if (!file_exists(ROOT_DIR . 'index.php')) {
if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!');
}
@@ -48,15 +46,16 @@ $climate->arguments->add([
]
]);
$climate->arguments->parse();
$environment = $climate->arguments->get('environment');
// Set up environment based on params.
Setup::$environment = $environment;
$environment = $climate->arguments->get('environment');
$grav = Grav::instance(array('loader' => $autoload));
$grav['uri']->init();
$grav->setup($environment);
$grav['config']->init();
$grav['streams'];
$grav['uri']->init();
$grav['users'];
$app = new Application('Grav Package Manager', GRAV_VERSION);
$app->addCommands(array(

View File

@@ -1,34 +1,36 @@
#!/usr/bin/env php
<?php
define('GRAV_CLI', true);
if (!file_exists(__DIR__ . '/../vendor')){
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Composer;
use Grav\Common\Grav;
use Symfony\Component\Console\Application;
if (!file_exists(__DIR__ . '/../vendor')){
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
// Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
use Symfony\Component\Console\Application;
require_once __DIR__ . '/../vendor/autoload.php';
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
Grav::instance(array('loader' => $autoload));
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
if (!file_exists(ROOT_DIR . 'index.php')) {
if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!');
}
@@ -38,9 +40,11 @@ $app->addCommands(array(
new \Grav\Console\Cli\ComposerCommand(),
new \Grav\Console\Cli\SandboxCommand(),
new \Grav\Console\Cli\CleanCommand(),
new \Grav\Console\Cli\ClearCacheCommand(),
new \Grav\Console\Cli\CacheCommand(),
new \Grav\Console\Cli\BackupCommand(),
new \Grav\Console\Cli\NewProjectCommand(),
new \Grav\Console\Cli\SchedulerCommand(),
new \Grav\Console\Cli\SecurityCommand(),
new \Grav\Console\Cli\LogViewerCommand(),
));
$app->run();

View File

@@ -1,30 +1,28 @@
#!/usr/bin/env php
<?php
define('GRAV_CLI', true);
if (!file_exists(__DIR__ . '/../vendor')) {
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Composer;
if (!file_exists(__DIR__ . '/../vendor')) {
// Before we can even start, we need to run composer first
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer . ' --working-dir="' . __DIR__ . '/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Grav\Common\Grav;
use Grav\Common\Config\Setup;
use Grav\Common\Filesystem\Folder;
$autoload = require_once(__DIR__ . '/../vendor/autoload.php');
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
// Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
@@ -34,7 +32,7 @@ if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
if (!file_exists(ROOT_DIR . 'index.php')) {
if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!');
}
@@ -48,15 +46,15 @@ $climate->arguments->add([
]
]);
$climate->arguments->parse();
$environment = $climate->arguments->get('environment');
// Set up environment based on params.
Setup::$environment = $environment;
$grav = Grav::instance(array('loader' => $autoload));
$grav['uri']->init();
$grav->setup($environment);
$grav['config']->init();
$grav['streams'];
$grav['uri']->init();
$grav['users'];
$grav['plugins']->init();
$grav['themes']->init();
@@ -83,13 +81,14 @@ $output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', nul
if (!$name) {
$output->writeln('');
$output->writeln("<red>Usage:</red>");
$output->writeln('<red>Usage:</red>');
$output->writeln(" {$bin} [slug] [command] [arguments]");
$output->writeln('');
$output->writeln("<red>Example:</red>");
$output->writeln('<red>Example:</red>');
$output->writeln(" {$bin} error log -l 1 --trace");
$list = Folder::all('plugins://', ['compare' => 'Pathname', 'pattern' => '/\/cli\/' . $pattern . '$/usm', 'levels' => 2]);
$total = 0;
if (count($list)) {
$available = [];
$output->writeln('');
@@ -98,13 +97,15 @@ if (!$name) {
$split = explode('/', $entry);
$entry = array_shift($split);
$index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
if (in_array($entry, $available)) {
$total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT);
if (\in_array($entry, $available, true)) {
$total--;
continue;
}
$available[] = $entry;
$output->writeln(' ' . $index . ". <red>" . str_pad($entry, 15) . "</red> <white>${bin} ${entry} list</white>");
$commands_count = $index - $total + 1;
$output->writeln(' ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>{$bin} {$entry} list</white>");
}
}

View File

@@ -3,50 +3,64 @@
"type": "project",
"description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS",
"keywords": ["cms","flat-file cms","flat cms","flatfile cms","php"],
"homepage": "http://getgrav.org",
"homepage": "https://getgrav.org",
"license": "MIT",
"require": {
"php": ">=5.6.4",
"twig/twig": "~1.24",
"erusev/parsedown": "1.6.4",
"erusev/parsedown-extra": "~0.7",
"symfony/yaml": "~3.4",
"symfony/console": "~3.4",
"symfony/event-dispatcher": "~3.4",
"symfony/var-dumper": "~3.4",
"symfony/polyfill-iconv": "~1.0",
"doctrine/cache": "^1.6",
"doctrine/collections": "^1.4",
"psr/simple-cache": "^1.0",
"psr/http-message": "^1.0",
"guzzlehttp/psr7": "^1.4",
"filp/whoops": "~2.0",
"matthiasmullie/minify": "^1.3",
"monolog/monolog": "~1.0",
"gregwar/image": "2.*",
"donatj/phpuseragentparser": "~0.3",
"pimple/pimple": "~3.2",
"rockettheme/toolbox": "~1.4",
"maximebf/debugbar": "~1.10",
"php": ">=7.1.3",
"ext-json": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-curl": "*",
"ext-zip": "*",
"ext-json": "*",
"league/climate": "^3.2",
"symfony/polyfill-iconv": "^1.9",
"symfony/polyfill-php72": "^1.9",
"symfony/polyfill-php73": "^1.9",
"psr/simple-cache": "^1.0",
"psr/http-message": "^1.0",
"psr/http-server-middleware": "^1.0",
"kodus/psr7-server": "*",
"nyholm/psr7": "^1.0",
"twig/twig": "~1.35",
"erusev/parsedown": "1.6.4",
"erusev/parsedown-extra": "~0.7",
"symfony/yaml": "~4.2",
"symfony/console": "~4.2",
"symfony/event-dispatcher": "~4.2",
"symfony/var-dumper": "~4.2",
"symfony/process": "~4.2",
"doctrine/cache": "^1.8",
"doctrine/collections": "^1.5",
"guzzlehttp/psr7": "^1.4",
"filp/whoops": "~2.2",
"matthiasmullie/minify": "^1.3",
"monolog/monolog": "~1.0",
"gregwar/image": "2.*",
"donatj/phpuseragentparser": "~0.10",
"pimple/pimple": "~3.2",
"rockettheme/toolbox": "~1.4",
"maximebf/debugbar": "~1.15",
"league/climate": "^3.4",
"antoligy/dom-string-iterators": "^1.0",
"miljar/php-exif": "^0.6.3",
"composer/ca-bundle": "^1.0"
"miljar/php-exif": "^0.6.4",
"composer/ca-bundle": "^1.0",
"dragonmantank/cron-expression": "^1.2",
"phive/twig-extensions-deferred": "^1.0",
"willdurand/negotiation": "^2.3"
},
"require-dev": {
"codeception/codeception": "^2.1",
"phpunit/php-code-coverage": "~2.0",
"fzaninotto/faker": "^1.5",
"codeception/codeception": "^2.4",
"phpunit/php-code-coverage": "~6.0",
"fzaninotto/faker": "^1.8",
"victorjonsson/markdowndocs": "dev-master"
},
"config": {
"apcu-autoloader": true,
"platform": {
"php": "5.6.4"
"php": "7.1.3"
}
},
"repositories": [

1836
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,35 +9,34 @@
namespace Grav;
define('GRAV_PHP_MIN', '5.6.4');
// Ensure vendor libraries exist
$autoload = __DIR__ . '/vendor/autoload.php';
if (!is_file($autoload)) {
die("Please run: <i>bin/grav install</i>");
}
if (PHP_SAPI === 'cli-server') {
if (!isset($_SERVER['PHP_CLI_ROUTER'])) {
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
}
}
use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event;
\define('GRAV_REQUEST_TIME', microtime(true));
\define('GRAV_PHP_MIN', '7.1.3');
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
die(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
}
if (PHP_SAPI === 'cli-server' && !isset($_SERVER['PHP_CLI_ROUTER'])) {
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
}
// Ensure vendor libraries exist
$autoload = __DIR__ . '/vendor/autoload.php';
if (!is_file($autoload)) {
die('Please run: <i>bin/grav install</i>');
}
// Register the auto-loader.
$loader = require $autoload;
use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event;
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding if mbstring loaded
if (!extension_loaded('mbstring')) {
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
mb_internal_encoding('UTF-8');
@@ -52,6 +51,9 @@ $grav = Grav::instance(
// Process the page
try {
$grav->process();
} catch (\Error $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;
} catch (\Exception $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 B

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,125 @@
title: PLUGIN_ADMIN.BACKUPS
form:
validation: loose
fields:
history_title:
type: section
title: PLUGIN_ADMIN.BACKUPS_HISTORY
underline: true
history:
type: backupshistory
config_title:
type: section
title: PLUGIN_ADMIN.BACKUPS_PURGE_CONFIG
underline: true
purge.trigger:
type: select
label: Backup Storage Purge Trigger
size: medium
default: space
options:
space: Maximum Backup Space
number: Maximum Number of Backups
time: maximum Rention Time
validate:
required: true
purge.max_backups_count:
type: number
label: Maximum Number of Backups
default: 25
size: x-small
help: "0 is unlimited"
validate:
min: 0
type: number
required: true
message: Must be a number 0 or greater
purge.max_backups_space:
type: number
label: Maximum Backups Space
append: in GB
size: x-small
default: 5
validate:
min: 1
type: number
required: true
message: Space must be 1GB or greater
purge.max_backups_time:
type: number
label: Maximum Rention Time
append: in Days
size: x-small
default: 365
validate:
min: 7
type: number
required: true
message: Rentenion days must be 7 or greater
profiles_title:
type: section
title: PLUGIN_ADMIN.BACKUPS_PROFILES
underline: true
profiles:
type: list
style: vertical
label:
classes: backups-list compact
sort: false
fields:
.name:
type: text
label: Name
placeholder: 'Clear Backup Name'
validate:
max: 20
message: 'Name must be less than 20 characters'
required: true
.root:
type: text
label: Root Folder
help: Can be an absolute path or a stream
placeholder: '/'
default: '/'
validate:
required: true
.exclude_paths:
type: textarea
label: Exclude Paths
rows: 5
placeholder: "/backup\r/cache\r/images\r/logs\r/tmp"
help: Absolute paths to exclude, one per line
.exclude_files:
type: textarea
label: Exclude Files
rows: 5
placeholder: ".DS_Store\r.git\r.svn\r.hg\r.idea\r.vscode\rnode_modules"
help: Specfic Files or Folders to exclude, one per line
.schedule:
type: toggle
label: Enable Scheduled Job
highlight: 1
default: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
.schedule_at:
type: cron
label: Run Scheduled Job
default: '* 3 * * *'
validate:
required: true

View File

@@ -0,0 +1,76 @@
title: PLUGIN_ADMIN.SCHEDULER
form:
validation: loose
fields:
status_title:
type: section
title: PLUGIN_ADMIN.SCHEDULER_STATUS
underline: true
status:
type: cronstatus
validate:
type: commalist
jobs_title:
type: section
title: PLUGIN_ADMIN.SCHEDULER_JOBS
underline: true
custom_jobs:
type: list
style: vertical
label:
classes: cron-job-list compact
key: id
fields:
.id:
type: key
label: ID
placeholder: 'process-name'
validate:
required: true
pattern: '[a-zа-я0-9_\-]+'
max: 20
message: 'ID must be lowercase with dashes/underscores only and less than 20 characters'
.command:
type: text
label: Command
placeholder: 'cd ~;ls -lah;'
validate:
required: true
.args:
type: text
label: Extra Arguments
.at:
type: cron
label: Run At
help: 'Cron formatted "at" syntax'
placeholder: '* * * * *'
validate:
required: true
.output:
type: text
label: Output File
help: 'The path/filename of the output file (from the root of the Grav installation)'
placeholder: 'logs/ls-cron.out'
.output_mode:
type: select
label: Output Type
help: 'Either append to the same file each run, or overwrite the file with each run'
default: append
options:
append: Append
overwrite: Overwrite
.email:
type: text
label: Email
help: 'Email to send output to. NOTE: requires output file to be set'
placeholder: 'notifications@yoursite.com'

View File

@@ -41,6 +41,14 @@ form:
validate:
type: bool
xss_invalid_protocols:
type: selectize
size: large
label: PLUGIN_ADMIN.XSS_INVALID_PROTOCOLS_LIST
classes: fancy
validate:
type: commalist
xss_enabled.moz_binding:
type: toggle
label: PLUGIN_ADMIN.XSS_MOZ_BINDINGS

File diff suppressed because it is too large Load Diff

View File

@@ -4,122 +4,122 @@ form:
fields:
info:
type: userinfo
size: large
info:
type: userinfo
size: large
avatar:
type: file
size: large
destination: 'user://accounts/avatars'
multiple: false
random_name: true
avatar:
type: file
size: large
destination: 'user://accounts/avatars'
multiple: false
random_name: true
content:
type: section
title: PLUGIN_ADMIN.ACCOUNT
underline: true
content:
type: section
title: PLUGIN_ADMIN.ACCOUNT
underline: true
username:
type: text
size: large
label: PLUGIN_ADMIN.USERNAME
disabled: true
readonly: true
username:
type: text
size: large
label: PLUGIN_ADMIN.USERNAME
disabled: true
readonly: true
email:
type: email
size: large
label: PLUGIN_ADMIN.EMAIL
validate:
type: email
message: PLUGIN_ADMIN.EMAIL_VALIDATION_MESSAGE
required: true
email:
type: email
size: large
label: PLUGIN_ADMIN.EMAIL
validate:
type: email
message: PLUGIN_ADMIN.EMAIL_VALIDATION_MESSAGE
required: true
password:
type: password
size: large
label: PLUGIN_ADMIN.PASSWORD
autocomplete: new-password
validate:
required: false
message: PLUGIN_ADMIN.PASSWORD_VALIDATION_MESSAGE
config-pattern@: system.pwd_regex
password:
type: password
size: large
label: PLUGIN_ADMIN.PASSWORD
autocomplete: new-password
validate:
required: false
message: PLUGIN_ADMIN.PASSWORD_VALIDATION_MESSAGE
config-pattern@: system.pwd_regex
fullname:
type: text
size: large
label: PLUGIN_ADMIN.FULL_NAME
validate:
required: true
fullname:
type: text
size: large
label: PLUGIN_ADMIN.FULL_NAME
validate:
required: true
title:
type: text
size: large
label: PLUGIN_ADMIN.TITLE
title:
type: text
size: large
label: PLUGIN_ADMIN.TITLE
language:
type: select
label: PLUGIN_ADMIN.LANGUAGE
size: medium
classes: fancy
data-options@: '\Grav\Plugin\Admin\Admin::adminLanguages'
default: 'en'
help: PLUGIN_ADMIN.LANGUAGE_HELP
language:
type: select
label: PLUGIN_ADMIN.LANGUAGE
size: medium
classes: fancy
data-options@: '\Grav\Plugin\Admin\Admin::adminLanguages'
default: 'en'
help: PLUGIN_ADMIN.LANGUAGE_HELP
twofa_check:
type: conditional
condition: config.plugins.admin.twofa_enabled
twofa_check:
type: conditional
condition: config.plugins.admin.twofa_enabled
fields:
fields:
twofa:
title: PLUGIN_ADMIN.2FA_TITLE
type: section
underline: true
twofa:
title: PLUGIN_ADMIN.2FA_TITLE
type: section
underline: true
twofa_enabled:
type: toggle
label: PLUGIN_ADMIN.2FA_ENABLED
classes: twofa-toggle
highlight: 1
default: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
twofa_enabled:
type: toggle
label: PLUGIN_ADMIN.2FA_ENABLED
classes: twofa-toggle
highlight: 1
default: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
twofa_secret:
type: 2fa_secret
outerclasses: 'twofa-secret'
markdown: true
label: PLUGIN_ADMIN.2FA_SECRET
sublabel: PLUGIN_ADMIN.2FA_SECRET_HELP
twofa_secret:
type: 2fa_secret
outerclasses: 'twofa-secret'
markdown: true
label: PLUGIN_ADMIN.2FA_SECRET
sublabel: PLUGIN_ADMIN.2FA_SECRET_HELP
security:
title: PLUGIN_ADMIN.ACCESS_LEVELS
type: section
security: admin.super
underline: true
security:
security@: admin.super
title: PLUGIN_ADMIN.ACCESS_LEVELS
type: section
underline: true
fields:
groups:
type: select
multiple: true
size: large
label: PLUGIN_ADMIN.GROUPS
data-options@: '\Grav\Common\User\Group::groupNames'
classes: fancy
help: PLUGIN_ADMIN.GROUPS_HELP
validate:
type: commalist
fields:
groups:
type: select
multiple: true
size: large
label: PLUGIN_ADMIN.GROUPS
data-options@: '\Grav\Common\User\Group::groupNames'
classes: fancy
help: PLUGIN_ADMIN.GROUPS_HELP
validate:
type: commalist
access:
type: permissions
label: PLUGIN_ADMIN.PERMISSIONS
ignore_empty: true
validate:
type: array
access:
type: permissions
label: PLUGIN_ADMIN.PERMISSIONS
ignore_empty: true
validate:
type: array

View File

@@ -0,0 +1,29 @@
title: User Accounts
description: User Accounts
type: flex-objects
extends@: 'user/account'
config:
admin:
list:
fields:
username:
link: edit
search: true
email:
search: true
fullname:
search: true
options:
per_page: 20
order:
by: username
dir: asc
menu:
list:
route: /users
title: Users
icon: fa-users
authorize: ['admin.users', 'admin.super']

View File

@@ -0,0 +1,15 @@
purge:
trigger: space
max_backups_count: 25
max_backups_space: 5
max_backups_time: 365
profiles:
-
name: 'Default Site Backup'
root: '/'
schedule: false
schedule_at: '0 3 * * *'
exclude_paths: "/backup\r\n/cache\r\n/images\r\n/logs\r\n/tmp"
exclude_files: ".DS_Store\r\n.git\r\n.svn\r\n.hg\r\n.idea\r\n.vscode\r\nnode_modules"

View File

@@ -5,6 +5,13 @@ xss_enabled:
moz_binding: true
html_inline_styles: true
dangerous_tags: true
xss_invalid_protocols:
- javascript
- livescript
- vbscript
- mocha
- feed
- data
xss_dangerous_tags:
- applet
- meta

View File

@@ -17,17 +17,17 @@ summary:
delimiter: === # The summary delimiter
redirects:
# '/redirect-test': '/' # Redirect test goes to home page
# '/old/(.*)': '/new/$1' # Would redirect /old/my-page to /new/my-page
# '/redirect-test': '/' # Redirect test goes to home page
# '/old/(.*)': '/new/$1' # Would redirect /old/my-page to /new/my-page
routes:
# '/something/else': '/blog/sample-3' # Alias for /blog/sample-3
# '/new/(.*)': '/blog/$1' # Regex any /new/my-page URL to /blog/my-page Route
# '/something/else': '/blog/sample-3' # Alias for /blog/sample-3
# '/new/(.*)': '/blog/$1' # Regex any /new/my-page URL to /blog/my-page Route
blog:
route: '/blog' # Custom value added (accessible via system.blog.route)
#menu: # Sample Menu Example
#menu: # Menu Example
# - text: Source
# icon: github
# url: https://github.com/getgrav/grav

View File

@@ -1,6 +1,6 @@
schemes:
image:
type: ReadOnlyStream
type: Stream
paths:
- user://images
- system://images

View File

@@ -14,6 +14,7 @@ intl_enabled: true # Special logic for PHP Interna
languages:
supported: [] # List of languages supported. eg: [en, fr, de]
include_default_lang: true # Include the default lang prefix in all URLs
pages_fallback_only: false # Only fallback to find page content through supported languages
translations: true # Enable translations by default
translations_fallback: true # Fallback through supported translations if active lang doesn't exist
session_store_active: false # Store active language in session
@@ -52,7 +53,7 @@ pages:
special_chars: # List of special characters to automatically convert to entities
'>': 'gt'
'<': 'lt'
types: [txt,xml,html,htm,json,rss,atom] # list of valid page types
types: [html,htm,json,xml,txt,rss,atom] # list of valid page types
append_url_extension: '' # Append page's extension in Page urls (e.g. '.html' results in /path/page.html)
expires: 604800 # Page expires time in seconds (604800 seconds = 7 days)
cache_control: # Can be blank for no setting, or a valid `cache-control` text value
@@ -65,6 +66,7 @@ pages:
ignore_files: [.DS_Store] # Files to ignore in Pages
ignore_folders: [.git, .idea] # Folders to ignore in Pages
ignore_hidden: true # Ignore all Hidden files and folders
hide_empty_folders: false # If folder has no .md file, should it be hidden
url_taxonomy_filters: true # Enable auto-magic URL-based taxonomy filters for page collections
frontmatter:
process_twig: false # Should the frontmatter be processed to replace Twig variables?
@@ -76,6 +78,9 @@ cache:
method: file # Method to check for updates in pages: file|folder|hash|none
driver: auto # One of: auto|file|apc|xcache|memcache|wincache
prefix: 'g' # Cache prefix string (prevents cache conflicts)
purge_at: '0 4 * * *' # How often to purge old file cache (using new scheduler)
clear_at: '0 3 * * *' # How often to clear cache (using new scheduler)
clear_job_type: 'standard' # Type to clear when processing the scheduled clear job `standard`|`all`
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
@@ -112,6 +117,11 @@ errors:
display: 0 # Display either (1) Full backtrace | (0) Simple Error | (-1) System Error
log: true # Log errors to /logs folder
log:
handler: file # Log handler. Currently supported: file | syslog
syslog:
facility: local6 # Syslog facilities output
debugger:
enabled: false # Enable Grav debugger and following settings
shutdown:
@@ -135,6 +145,7 @@ session:
initialize: true # Initialize session from Grav (if false, plugin needs to start the session)
timeout: 1800 # Timeout in seconds
name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name
uniqueness: path # Should sessions be `path` based or `security.salt` based
secure: false # Set session secure. If true, indicates that communication for this cookie must be over an encrypted transmission. Enable this only on sites that run exclusively on HTTPS
httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed.
split: true # Sessions should be independent between site and plugins (such as admin)
@@ -147,6 +158,10 @@ gpm:
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
accounts:
type: data # Account type: data or flex
storage: file # Flex storage type: file or folder
strict_mode:
yaml_compat: true # Grav 1.5+: Enables YAML backwards compatibility
twig_compat: true # Grav 1.5+: Enables deprecated Twig autoescape setting (autoescape: false)

View File

@@ -1,19 +1,19 @@
<?php
/**
* @package Grav.Core
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
// Some standard defines
define('GRAV', true);
define('GRAV_VERSION', '1.5.4');
define('GRAV_TESTING', false);
define('GRAV_VERSION', '1.6.0-rc.3');
define('GRAV_TESTING', true);
define('DS', '/');
if (!defined('GRAV_PHP_MIN')) {
define('GRAV_PHP_MIN', '5.6.4');
define('GRAV_PHP_MIN', '7.1.3');
}
// Directories and Paths

17
system/install.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
/**
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
if (!defined('GRAV_ROOT')) {
die();
}
use Grav\Installer\Install;
require_once __DIR__ . '/src/Grav/Installer/Install.php';
return Install::instance();

View File

@@ -1,75 +1,63 @@
---
FRONTMATTER_ERROR_PAGE: |
---
العنوان: %1$s
---
# خطأ: مادة أمامية غير صحيحة
مسار: '%2$s'
**%3$s**
, , ,
%4$s
, , ,
NICETIME:
NO_DATE_PROVIDED: لم يتم تقديم التاريخ
BAD_DATE: تاريخ خاطئ
AGO: من قبل
FROM_NOW: من الآن
SECOND: ثانية
MINUTE: دقيقة
HOUR: ساعة
DAY: يوم
WEEK: أسبوع
MONTH: شهر
YEAR: سنة
DECADE: عقد
SEC: ثانية
MIN: دقيقة
HR: ساعة
WK: أسبوع
MO: شهر
YR: سنة
DEC: عقد
SECOND_PLURAL: ثواني
MINUTE_PLURAL: ‮دقائق
HOUR_PLURAL: ساعات
DAY_PLURAL: أيام
WEEK_PLURAL: أسابيع
MONTH_PLURAL: أشهر
YEAR_PLURAL: سنوات
DECADE_PLURAL: عقود
SEC_PLURAL: ثواني
MIN_PLURAL: دقائق
HR_PLURAL: ساعات
WK_PLURAL: أسابيع
MO_PLURAL: أشهر
YR_PLURAL: سنوات
DEC_PLURAL: عقود
FORM:
VALIDATION_FAIL: '<b>فشل التحقق من صحة:</b>'
INVALID_INPUT: إدخال غير صحيح في
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
MONTHS_OF_THE_YEAR:
- كانون الثاني
- شباط
- آذار/ مارس
- نيسان
- أيار
- حزيران
- تموز
- آب
- أيلول
- تشرين الأول
- تشرين الثاني
- كانون الأول
DAYS_OF_THE_WEEK:
- الاثنين
- الثلاثاء
- الأربعاء
- الخميس
- الجمعة
- السبت
- الأحد
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nالعنوان: %1$s\n---\n# خطأ: مادة أمامية غير صحيحة\n\nمسار: '%2$s'\n\n**%3$s**\n\n, , ,\n\n%4$s\n, , ,"
NICETIME:
NO_DATE_PROVIDED: لم يتم تقديم التاريخ
BAD_DATE: تاريخ خاطئ
AGO: من قبل
FROM_NOW: من الآن
SECOND: ثانية
MINUTE: دقيقة
HOUR: ساعة
DAY: يوم
WEEK: أسبوع
MONTH: شهر
YEAR: سنة
DECADE: عقد
SEC: ثانية
MIN: دقيقة
HR: ساعة
WK: أسبوع
MO: شهر
YR: سنة
DEC: عقد
SECOND_PLURAL: ثواني
MINUTE_PLURAL: '‮دقائق'
HOUR_PLURAL: ساعات
DAY_PLURAL: أيام
WEEK_PLURAL: أسابيع
MONTH_PLURAL: أشهر
YEAR_PLURAL: سنوات
DECADE_PLURAL: عقود
SEC_PLURAL: ثواني
MIN_PLURAL: دقائق
HR_PLURAL: ساعات
WK_PLURAL: أسابيع
MO_PLURAL: أشهر
YR_PLURAL: سنوات
DEC_PLURAL: عقود
FORM:
VALIDATION_FAIL: <b>فشل التحقق من صحة:</b>
INVALID_INPUT: إدخال غير صحيح في
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
MONTHS_OF_THE_YEAR:
- 'كانون الثاني'
- 'شباط'
- 'آذار/ مارس'
- 'نيسان'
- 'أيار'
- 'حزيران'
- 'تموز'
- 'آب'
- 'أيلول'
- 'تشرين الأول'
- 'تشرين الثاني'
- 'كانون الأول'
DAYS_OF_THE_WEEK:
- 'الاثنين'
- 'الثلاثاء'
- 'الأربعاء'
- 'الخميس'
- 'الجمعة'
- 'السبت'
- 'الأحد'

62
system/languages/bg.yaml Normal file
View File

@@ -0,0 +1,62 @@
---
GRAV:
NICETIME:
NO_DATE_PROVIDED: Не е въведена дата
BAD_DATE: Невалидна дата
AGO: преди
FROM_NOW: от сега
SECOND: секунда
MINUTE: минута
HOUR: час
DAY: ден
WEEK: седмица
MONTH: месец
YEAR: година
DECADE: десетилетие
SEC: сек
MIN: мин
HR: ч
WK: седм
MO: мес
YR: г
DEC: дстлт
SECOND_PLURAL: секунди
MINUTE_PLURAL: минути
HOUR_PLURAL: часа
DAY_PLURAL: дена
WEEK_PLURAL: седмици
MONTH_PLURAL: месеца
YEAR_PLURAL: години
DECADE_PLURAL: десетилетия
SEC_PLURAL: сек
MIN_PLURAL: мин
HR_PLURAL: ч
WK_PLURAL: седм
MO_PLURAL: мес
YR_PLURAL: г
DEC_PLURAL: дстлт
FORM:
VALIDATION_FAIL: <b>Неуспешна проверка:</b>
INVALID_INPUT: Невалидно въвеждане в
MISSING_REQUIRED_FIELD: 'Липсва задължително поле:'
MONTHS_OF_THE_YEAR:
- 'януари'
- 'февруари'
- 'март'
- 'април'
- 'май'
- 'юни'
- 'юли'
- 'август'
- 'септември'
- 'октомври'
- 'ноември'
- 'декември'
DAYS_OF_THE_WEEK:
- 'понеделник'
- 'вторник'
- 'сряда'
- 'четвъртък'
- 'петък'
- 'събота'
- 'неделя'

View File

@@ -1,75 +1,62 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# S'ha produït un error: Frontmatter invàlid
Ruta: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: "No s'ha proporcionat data"
BAD_DATE: Data invàlida
AGO: abans
FROM_NOW: "des d'ara"
SECOND: segon
MINUTE: minut
HOUR: hora
DAY: dia
WEEK: setmana
MONTH: mes
YEAR: any
DECADE: dècada
SEC: s
MIN: min
HR: h
WK: setm.
MO: m.
YR: a.
DEC: dèc.
SECOND_PLURAL: segons
MINUTE_PLURAL: minuts
HOUR_PLURAL: hores
DAY_PLURAL: dies
WEEK_PLURAL: setmanes
MONTH_PLURAL: mesos
YEAR_PLURAL: anys
DECADE_PLURAL: dècades
SEC_PLURAL: s
MIN_PLURAL: min
HR_PLURAL: h
WK_PLURAL: setm.
MO_PLURAL: mesos
YR_PLURAL: anys
DEC_PLURAL: dèc.
FORM:
VALIDATION_FAIL: '<b>Ha fallat la validació:</b>'
INVALID_INPUT: Entrada no vàlida a
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
MONTHS_OF_THE_YEAR:
- Gener
- Febrer
- Març
- Abril
- Maig
- Juny
- Juliol
- Agost
- Setembre
- Octubre
- Novembre
- Desembre
DAYS_OF_THE_WEEK:
- Dilluns
- Dimarts
- Dimecres
- Dijous
- Divendres
- Dissabte
- Diumenge
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# S'ha produït un error: Frontmatter invàlid\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: No s'ha proporcionat data
BAD_DATE: Data invàlida
AGO: abans
FROM_NOW: des d'ara
SECOND: segon
MINUTE: minut
HOUR: hora
DAY: dia
WEEK: setmana
MONTH: mes
YEAR: any
DECADE: dècada
SEC: s
HR: h
WK: setm.
MO: m.
YR: a.
DEC: dèc.
SECOND_PLURAL: segons
MINUTE_PLURAL: minuts
HOUR_PLURAL: hores
DAY_PLURAL: dies
WEEK_PLURAL: setmanes
MONTH_PLURAL: mesos
YEAR_PLURAL: anys
DECADE_PLURAL: dècades
SEC_PLURAL: s
MIN_PLURAL: min
HR_PLURAL: h
WK_PLURAL: setm.
MO_PLURAL: mesos
YR_PLURAL: anys
DEC_PLURAL: dèc.
FORM:
VALIDATION_FAIL: <b>Ha fallat la validació:</b>
INVALID_INPUT: Entrada no vàlida a
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
MONTHS_OF_THE_YEAR:
- 'Gener'
- 'Febrer'
- 'Març'
- 'Abril'
- 'Maig'
- 'Juny'
- 'Juliol'
- 'Agost'
- 'Setembre'
- 'Octubre'
- 'Novembre'
- 'Desembre'
DAYS_OF_THE_WEEK:
- 'Dilluns'
- 'Dimarts'
- 'Dimecres'
- 'Dijous'
- 'Divendres'
- 'Dissabte'
- 'Diumenge'

View File

@@ -1,81 +1,144 @@
---
INFLECTOR_UNCOUNTABLE:
- vybavení
- informace
- rýže
- peníze
- druhy
- série
- ryba
- ovce
INFLECTOR_IRREGULAR:
person: lidé
man: muži
child: děti
sex: pohlaví
move: pohyby
INFLECTOR_ORDINALS:
default: '.'
first: '.'
second: '.'
third: '.'
NICETIME:
NO_DATE_PROVIDED: Datum nebylo vloženo
BAD_DATE: Chybné datum
AGO: zpět
FROM_NOW: od teď
SECOND: sekunda
MINUTE: minuta
HOUR: hodina
DAY: den
WEEK: týden
MONTH: měsíc
YEAR: rok
DECADE: dekáda
SEC: sek
MIN: min
HR: hod
WK: t
MO: m
YR: r
DEC: dek
SECOND_PLURAL: sekundy
MINUTE_PLURAL: minuty
HOUR_PLURAL: hodiny
DAY_PLURAL: dny
WEEK_PLURAL: týdny
MONTH_PLURAL: měsíce
YEAR_PLURAL: roky
DECADE_PLURAL: dekády
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: hod
WK_PLURAL: t
MO_PLURAL: m
YR_PLURAL: r
DEC_PLURAL: dek
FORM:
VALIDATION_FAIL: '<b>Ověření se nezdařilo:</b>'
INVALID_INPUT: Neplatný vstup v
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
MONTHS_OF_THE_YEAR:
- ledna
- února
- března
- dubna
- května
- června
- července
- srpna
- září
- října
- listopadu
- prosince
DAYS_OF_THE_WEEK:
- Pondělí
- Úterý
- Středa
- Čtvrtek
- Pátek
- Sobota
- Neděle
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Chyba: Chybný frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'vybavení'
- 'informace'
- 'rýže'
- 'peníze'
- 'druhy'
- 'série'
- 'ryba'
- 'ovce'
INFLECTOR_IRREGULAR:
'person': 'lidé'
'man': 'muži'
'child': 'děti'
'sex': 'pohlaví'
'move': 'pohyby'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME:
NO_DATE_PROVIDED: Datum nebylo vloženo
BAD_DATE: Chybné datum
AGO: zpět
FROM_NOW: od teď
JUST_NOW: právě teď
SECOND: sekunda
MINUTE: minuta
HOUR: hodina
DAY: den
WEEK: týden
MONTH: měsíc
YEAR: rok
DECADE: dekáda
SEC: sek
MIN: min
HR: hod
WK: t
MO: m
YR: r
DEC: dek
SECOND_PLURAL: sekundy
MINUTE_PLURAL: minuty
HOUR_PLURAL: hodiny
DAY_PLURAL: dny
WEEK_PLURAL: týdny
MONTH_PLURAL: měsíce
YEAR_PLURAL: roky
DECADE_PLURAL: dekády
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: hod
WK_PLURAL: t
MO_PLURAL: m
YR_PLURAL: r
DEC_PLURAL: dek
FORM:
VALIDATION_FAIL: <b>Ověření se nezdařilo:</b>
INVALID_INPUT: Neplatný vstup v
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
MONTHS_OF_THE_YEAR:
- 'leden'
- 'únor'
- 'březen'
- 'duben'
- 'květen'
- 'červen'
- 'červenec'
- 'srpen'
- 'září'
- 'říjen'
- 'listopad'
- 'prosinec'
DAYS_OF_THE_WEEK:
- 'pondělí'
- 'úterý'
- 'středa'
- 'čtvrtek'
- 'pátek'
- 'sobota'
- 'neděle'
CRON:
EVERY: každý
EVERY_HOUR: každou hodinu
EVERY_MINUTE: každou minutu
EVERY_DAY_OF_WEEK: každý den v týdnu
EVERY_DAY_OF_MONTH: každý den v měsíci
EVERY_MONTH: každý měsíc
TEXT_PERIOD: Every <b />
TEXT_MINS: ' at <b /> minute(s) past the hour'
TEXT_TIME: ' at <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: Tag %s není podporován!
ERROR2: Chybný počet prvků
ERROR3: jquery_element musí být nastaven v nastaveních pro jqCron
ERROR4: Nerozpoznaný výraz

View File

@@ -1,75 +1,62 @@
---
FRONTMATTER_ERROR_PAGE: |
---
Titel: %1$s
---
# Fejl: Ugyldigt frontmatter
Sti: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: Ingen dato angivet
BAD_DATE: Ugyldig dato
AGO: siden
FROM_NOW: fra nu
SECOND: sekund
MINUTE: minut
HOUR: time
DAY: dag
WEEK: uge
MONTH: måned
YEAR: år
DECADE: årti
SEC: sek
MIN: min
HR: t
WK: u
MO: md
YR: år
DEC: årti
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minutter
HOUR_PLURAL: timer
DAY_PLURAL: dage
WEEK_PLURAL: uger
MONTH_PLURAL: måneder
YEAR_PLURAL: år
DECADE_PLURAL: årtier
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: timer
WK_PLURAL: uger
MO_PLURAL: mdr
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: '<b>Validering mislykkedes:</b>'
INVALID_INPUT: Ugyldigt input i
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
MONTHS_OF_THE_YEAR:
- Januar
- Februar
- Marts
- April
- Maj
- Juni
- Juli
- August
- September
- Oktober
- November
- December
DAYS_OF_THE_WEEK:
- Mandag
- Tirsdag
- Onsdag
- Torsdag
- Fredag
- Lørdag
- Søndag
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nTitel: %1$s\n---\n\n# Fejl: Ugyldigt frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Ingen dato angivet
BAD_DATE: Ugyldig dato
AGO: siden
FROM_NOW: fra nu
SECOND: sekund
MINUTE: minut
HOUR: time
DAY: dag
WEEK: uge
MONTH: måned
YEAR: år
DECADE: årti
SEC: sek
HR: t
WK: u
MO: md
YR: år
DEC: årti
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minutter
HOUR_PLURAL: timer
DAY_PLURAL: dage
WEEK_PLURAL: uger
MONTH_PLURAL: måneder
YEAR_PLURAL: år
DECADE_PLURAL: årtier
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: timer
WK_PLURAL: uger
MO_PLURAL: mdr
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: <b>Validering mislykkedes:</b>
INVALID_INPUT: Ugyldigt input i
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
MONTHS_OF_THE_YEAR:
- 'januar'
- 'februar'
- 'mars'
- 'april'
- 'mai'
- 'juni'
- 'juli'
- 'august'
- 'september'
- 'oktober'
- 'november'
- 'desember'
DAYS_OF_THE_WEEK:
- 'mandag'
- 'tirsdag'
- 'onsdag'
- 'torsdag'
- 'fredag'
- 'lørdag'
- 'søndag'

View File

@@ -1,89 +1,144 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Fehler: Frontmatter enthält Fehler
Pfad: `%2$s`
**%3$s **
```
%4$s
```
INFLECTOR_UNCOUNTABLE:
1: Informationen
2: Reis
3: Geld
INFLECTOR_IRREGULAR:
person: Personen
man: Menschen
child: Kinder
sex: Geschlecht
move: Züge
INFLECTOR_ORDINALS:
default: '.'
first: '.'
second: '.'
third: '.'
NICETIME:
NO_DATE_PROVIDED: Kein Datum angegeben
BAD_DATE: Falsches Datum
AGO: her
FROM_NOW: ab jetzt
SECOND: Sekunde
MINUTE: Minute
HOUR: Stunde
DAY: Tag
WEEK: Woche
MONTH: Monat
YEAR: Jahr
DECADE: Jahrzehnt
SEC: Sek.
MIN: Min.
HR: Std.
WK: Wo.
MO: Mo.
YR: J.
DEC: Dek.
SECOND_PLURAL: Sekunden
MINUTE_PLURAL: Minuten
HOUR_PLURAL: Stunden
DAY_PLURAL: Tage
WEEK_PLURAL: Wochen
MONTH_PLURAL: Monate
YEAR_PLURAL: Jahre
DECADE_PLURAL: Jahrzehnte
SEC_PLURAL: Sekunden
MIN_PLURAL: Minuten
HR_PLURAL: Stunden
WK_PLURAL: Wochen
MO_PLURAL: Monate
YR_PLURAL: Jahre
DEC_PLURAL: Jahrzehnten
FORM:
VALIDATION_FAIL: '<b>Überprüfung fehlgeschlagen:</b>'
INVALID_INPUT: Ungültige Eingabe in
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
MONTHS_OF_THE_YEAR:
- Januar
- Februar
- März
- April
- Mai
- Juni
- Juli
- August
- September
- Oktober
- November
- Dezember
DAYS_OF_THE_WEEK:
- Montag
- Dienstag
- Mittwoch
- Donnerstag
- Freitag
- Samstag
- Sonntag
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n# Fehler: Frontmatter enthält Fehler\n\nPfad: `%2$s`\n\n**%3$s ** \n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ice'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1ies'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2ves'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'Ausstattung'
- 'Informationen'
- 'Reis'
- 'Geld'
- 'Arten'
- 'Serie'
- 'Fisch'
- 'Schaf'
INFLECTOR_IRREGULAR:
'person': 'Personen'
'man': 'Menschen'
'child': 'Kinder'
'sex': 'Geschlecht'
'move': 'Züge'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME:
NO_DATE_PROVIDED: Kein Datum angegeben
BAD_DATE: Falsches Datum
AGO: her
FROM_NOW: ab jetzt
JUST_NOW: jetzt gerade
SECOND: Sekunde
MINUTE: Minute
HOUR: Stunde
DAY: Tag
WEEK: Woche
MONTH: Monat
YEAR: Jahr
DECADE: Jahrzehnt
SEC: Sek.
MIN: Min.
HR: Std.
WK: Wo.
MO: Mo.
YR: J.
DEC: Dez
SECOND_PLURAL: Sekunden
MINUTE_PLURAL: Minuten
HOUR_PLURAL: Stunden
DAY_PLURAL: Tage
WEEK_PLURAL: Wochen
MONTH_PLURAL: Monate
YEAR_PLURAL: Jahre
DECADE_PLURAL: Jahrzehnte
SEC_PLURAL: Sekunden
MIN_PLURAL: Minuten
HR_PLURAL: Stunden
WK_PLURAL: Wochen
MO_PLURAL: Monate
YR_PLURAL: Jahre
DEC_PLURAL: Jahrzehnten
FORM:
VALIDATION_FAIL: <b>Überprüfung fehlgeschlagen:</b>
INVALID_INPUT: Ungültige Eingabe in
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
MONTHS_OF_THE_YEAR:
- 'Januar'
- 'Februar'
- 'März'
- 'April'
- 'Mai'
- 'Juni'
- 'Juli'
- 'August'
- 'September'
- 'Oktober'
- 'November'
- 'Dezember'
DAYS_OF_THE_WEEK:
- 'Montag'
- 'Dienstag'
- 'Mittwoch'
- 'Donnerstag'
- 'Freitag'
- 'Samstag'
- 'Sonntag'
CRON:
EVERY: jede
EVERY_HOUR: jede Stunde
EVERY_MINUTE: Jede Minute
EVERY_DAY_OF_WEEK: jeden Tag der Woche
EVERY_DAY_OF_MONTH: jeden Tag des Monats
EVERY_MONTH: jeden Monat
TEXT_PERIOD: Alle <b />
TEXT_MINS: ' bei <b /> Minuten nach der vollen Stunde (n)'
TEXT_TIME: ' bei <b />:<b />'
TEXT_DOW: ' auf <b />'
TEXT_MONTH: ' von <b />'
TEXT_DOM: ' auf <b />'
ERROR1: Der Tag %s wird nicht unterstützt!
ERROR2: Ungültige Anzahl von Elementen
ERROR3: jquery_element sollte in den jqCron Einstellungen gesetzt werden
ERROR4: Unbekannter Ausdruck

View File

@@ -1,22 +1,63 @@
---
MONTHS_OF_THE_YEAR:
- Ιανουάριος
- Φεβρουάριος
- Μάρτιος
- Απρίλιος
- Μάιος
- Ιούνιος
- Ιούλιος
- Αύγουστος
- Σεπτέμβριος
- Οκτώβριος
- Νοέμβριος
- Δεκέμβριος
DAYS_OF_THE_WEEK:
- Δευτέρα
- Τρίτη
- Τετάρτη
- Πέμπτη
- Παρασκευή
- Σάββατο
- Κυριακή
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nΤίτλος: %1$s\n---\n\n# Σφάλμα: Μη έγκυρη διαδρομή Frontmatter\n\nΔιαδρομή: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Δεν δόθηκε καμία ημερομηνία
BAD_DATE: Εσφαλμένη ημερομηνία
AGO: πρίν
FROM_NOW: από τώρα
SECOND: δευτερόλεπτο
MINUTE: λεπτό
HOUR: ώρα
DAY: ημέρα
WEEK: εβδομάδα
MONTH: μήνας
YEAR: έτος
DECADE: δεκαετία
SEC: δευτερόλεπτο
MIN: λεπτό
HR: ώρα
WK: εβδ
MO: μην
YR: έτος
DEC: δεκαετία
SECOND_PLURAL: δευτερόλεπτα
MINUTE_PLURAL: λεπτά
HOUR_PLURAL: ώρες
DAY_PLURAL: ημέρες
WEEK_PLURAL: εβδομάδες
MONTH_PLURAL: μήνες
YEAR_PLURAL: έτη
DECADE_PLURAL: δεκαετίες
SEC_PLURAL: δευτ.
MIN_PLURAL: λεπτά
HR_PLURAL: ώρες
WK_PLURAL: εβδομάδες
MO_PLURAL: μήνες
YR_PLURAL: έτη
DEC_PLURAL: δεκαετίες
FORM:
VALIDATION_FAIL: <b>Η επικύρωση απέτυχε:</b>
INVALID_INPUT: Μη έγκυρα δεδομένα σε
MISSING_REQUIRED_FIELD: 'Λείπει το απαιτούμενο πεδίο:'
MONTHS_OF_THE_YEAR:
- 'Ιανουάριος'
- 'Φεβρουάριος'
- 'Μάρτιος'
- 'Απρίλιος'
- 'Μάιος'
- 'Ιούνιος'
- 'Ιούλιος'
- 'Αύγουστος'
- 'Σεπτέμβριος'
- 'Οκτώβριος'
- 'Νοέμβριος'
- 'Δεκέμβριος'
DAYS_OF_THE_WEEK:
- 'Δευτέρα'
- 'Τρίτη'
- 'Τετάρτη'
- 'Πέμπτη'
- 'Παρασκευή'
- 'Σάββατο'
- 'Κυριακή'

View File

@@ -1,99 +1,120 @@
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
'/s$/i': ''
INFLECTOR_UNCOUNTABLE: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep']
INFLECTOR_IRREGULAR:
'person': 'people'
'man': 'men'
'child': 'children'
'sex': 'sexes'
'move': 'moves'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: No date provided
BAD_DATE: Bad date
AGO: ago
FROM_NOW: from now
JUST_NOW: just now
SECOND: second
MINUTE: minute
HOUR: hour
DAY: day
WEEK: week
MONTH: month
YEAR: year
DECADE: decade
SEC: sec
MIN: min
HR: hr
WK: wk
MO: mo
YR: yr
DEC: dec
SECOND_PLURAL: seconds
MINUTE_PLURAL: minutes
HOUR_PLURAL: hours
DAY_PLURAL: days
WEEK_PLURAL: weeks
MONTH_PLURAL: months
YEAR_PLURAL: years
DECADE_PLURAL: decades
SEC_PLURAL: secs
MIN_PLURAL: mins
HR_PLURAL: hrs
WK_PLURAL: wks
MO_PLURAL: mos
YR_PLURAL: yrs
DEC_PLURAL: decs
FORM:
VALIDATION_FAIL: <b>Validation failed:</b>
INVALID_INPUT: Invalid input in
MISSING_REQUIRED_FIELD: Missing required field:
MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
'/s$/i': ''
INFLECTOR_UNCOUNTABLE: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep']
INFLECTOR_IRREGULAR:
'person': 'people'
'man': 'men'
'child': 'children'
'sex': 'sexes'
'move': 'moves'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: No date provided
BAD_DATE: Bad date
AGO: ago
FROM_NOW: from now
JUST_NOW: just now
SECOND: second
MINUTE: minute
HOUR: hour
DAY: day
WEEK: week
MONTH: month
YEAR: year
DECADE: decade
SEC: sec
MIN: min
HR: hr
WK: wk
MO: mo
YR: yr
DEC: dec
SECOND_PLURAL: seconds
MINUTE_PLURAL: minutes
HOUR_PLURAL: hours
DAY_PLURAL: days
WEEK_PLURAL: weeks
MONTH_PLURAL: months
YEAR_PLURAL: years
DECADE_PLURAL: decades
SEC_PLURAL: secs
MIN_PLURAL: mins
HR_PLURAL: hrs
WK_PLURAL: wks
MO_PLURAL: mos
YR_PLURAL: yrs
DEC_PLURAL: decs
FORM:
VALIDATION_FAIL: <b>Validation failed:</b>
INVALID_INPUT: Invalid input in
MISSING_REQUIRED_FIELD: Missing required field:
MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
YES: "Yes"
NO: "No"
CRON:
EVERY: every
EVERY_HOUR: every hour
EVERY_MINUTE: every minute
EVERY_DAY_OF_WEEK: every day of the week
EVERY_DAY_OF_MONTH: every day of the month
EVERY_MONTH: every month
TEXT_PERIOD: Every <b />
TEXT_MINS: ' at <b /> minute(s) past the hour'
TEXT_TIME: ' at <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: The tag %s is not supported!
ERROR2: Bad number of elements
ERROR3: The jquery_element should be set into jqCron settings
ERROR4: Unrecognized expression

View File

@@ -1,90 +1,95 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Error: Frontmatter Inválido
Ruta: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_UNCOUNTABLE:
0: equipo
1: información
3: dinero
5: series
6: pescado
7: oveja
INFLECTOR_IRREGULAR:
man: hombres
child: niños
sex: sexos
INFLECTOR_ORDINALS:
first: ro
second: do
third: ro
NICETIME:
NO_DATE_PROVIDED: No se proporcionó fecha
BAD_DATE: Fecha erronea
AGO: antes
FROM_NOW: desde ahora
SECOND: segundo
MINUTE: minuto
HOUR: hora
DAY: día
WEEK: semana
MONTH: mes
YEAR: año
DECADE: década
SEC: seg
MIN: min
HR: h
WK: sem
MO: mes
YR: año
DEC: dec
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
DAY_PLURAL: días
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: años
DECADE_PLURAL: décadas
SEC_PLURAL: segs
MIN_PLURAL: mins
HR_PLURAL: hs
WK_PLURAL: sem
MO_PLURAL: mes
YR_PLURAL: años
DEC_PLURAL: décadas
FORM:
VALIDATION_FAIL: '<b>Falló la validación. </b>'
INVALID_INPUT: 'Dato inválido en: '
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
MONTHS_OF_THE_YEAR:
- Enero
- Febrero
- Marzo
- Abril
- Mayo
- Junio
- Julio
- Agosto
- Septiembre
- Octubre
- Noviembre
- Diciembre
DAYS_OF_THE_WEEK:
- Lunes
- Martes
- Miércoles
- Jueves
- Viernes
- Sábado
- Domingo
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntítulo: %1$s\n---\n\n# Error: Frontmatter no válido\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipo'
- 'información'
- 'rice'
- 'dinero'
- 'species'
- 'series'
- 'pescado'
- 'oveja'
INFLECTOR_IRREGULAR:
'man': 'hombres'
'child': 'niños'
'sex': 'sexos'
INFLECTOR_ORDINALS:
'first': 'ro'
'second': 'do'
'third': 'ro'
NICETIME:
NO_DATE_PROVIDED: No se proporcionó fecha
BAD_DATE: Fecha errónea
AGO: antes
FROM_NOW: desde ahora
JUST_NOW: justo ahora
SECOND: segundo
MINUTE: minuto
HOUR: hora
DAY: día
WEEK: semana
MONTH: mes
YEAR: año
DECADE: década
SEC: seg
HR: h
WK: sem
MO: mes
YR: año
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
DAY_PLURAL: días
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: años
DECADE_PLURAL: décadas
SEC_PLURAL: segs
HR_PLURAL: hs
WK_PLURAL: sem
MO_PLURAL: mes
YR_PLURAL: os
DEC_PLURAL: décadas
FORM:
VALIDATION_FAIL: '<b>Falló la validación: </b>'
INVALID_INPUT: 'Dato inválido en: '
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
MONTHS_OF_THE_YEAR:
- 'Enero'
- 'Febrero'
- 'Marzo'
- 'Abril'
- 'Mayo'
- 'Junio'
- 'Julio'
- 'Agosto'
- 'Septiembre'
- 'Octubre'
- 'Noviembre'
- 'Diciembre'
DAYS_OF_THE_WEEK:
- 'Lunes'
- 'Martes'
- 'Miércoles'
- 'Jueves'
- 'Viernes'
- 'Sábado'
- 'Domingo'
CRON:
EVERY: cada
EVERY_HOUR: cada hora
EVERY_MINUTE: cada minuto
EVERY_DAY_OF_WEEK: cada día de la semana
EVERY_DAY_OF_MONTH: cada día del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' a <b /> minuto(s) despues de la hora'
TEXT_TIME: ' a <b />:<b />'
TEXT_DOW: ' en <b />'
TEXT_MONTH: ' de<b />'
TEXT_DOM: ' en<b />'
ERROR1: La etiqueta %s no está soportada!
ERROR2: El número de elementos es erroneo
ERROR3: El jquery_element debería establecerse en la configuración del jqCron
ERROR4: Expresión no reconocida

62
system/languages/et.yaml Normal file
View File

@@ -0,0 +1,62 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\npealkiri: %1$s\n---\n\n# Viga: vigane Frontmatter'i\n\nasukoht: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Kuupäev määramata
BAD_DATE: Vigane kuupäev
AGO: tagasi
FROM_NOW: praegusest
SECOND: sekund
MINUTE: minut
HOUR: tundi
DAY: päev
WEEK: nädal
MONTH: kuu
YEAR: aasta
DECADE: 10 aastat
SEC: sek
HR: t
WK: näd
MO: k.
YR: a.
DEC: dekaad
SECOND_PLURAL: sekundit
MINUTE_PLURAL: minutit
HOUR_PLURAL: tundi
DAY_PLURAL: päeva
WEEK_PLURAL: nädalat
MONTH_PLURAL: kuud
YEAR_PLURAL: aastat
DECADE_PLURAL: dekaadi
SEC_PLURAL: sekundit
MIN_PLURAL: min
HR_PLURAL: t
WK_PLURAL: näd
MO_PLURAL: kuud
YR_PLURAL: aastat
DEC_PLURAL: dek.
FORM:
VALIDATION_FAIL: <b>Kinnitamine nurjus:</b>
INVALID_INPUT: 'Vigane sisend:'
MISSING_REQUIRED_FIELD: 'Nõutud väli puudub:'
MONTHS_OF_THE_YEAR:
- 'jaanuar'
- 'veebruar'
- 'märts'
- 'aprill'
- 'mai'
- 'juuni'
- 'juuli'
- 'august'
- 'september'
- 'oktoober'
- 'november'
- 'detsember'
DAYS_OF_THE_WEEK:
- 'esmaspäev'
- 'teisipäev'
- 'kolmapäev'
- 'neljapäev'
- 'reede'
- 'laupäev'
- 'pühapäev'

62
system/languages/eu.yaml Normal file
View File

@@ -0,0 +1,62 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "--- title: %1$s --- # Errorea: Baliogabeko Frontmatter Bidea: `%2$s` **%3$s** ``` %4$s ```"
NICETIME:
NO_DATE_PROVIDED: Ez da datarik ezarri
BAD_DATE: Okerreko data
AGO: ' duela'
FROM_NOW: oraindik aurrera
SECOND: segundo
MINUTE: minutu
HOUR: ordua
DAY: egun
WEEK: astea
MONTH: hilabetea
YEAR: urtea
DECADE: hamarkada
SEC: seg
HR: h
WK: ast
MO: hil
YR: urt
DEC: ham
SECOND_PLURAL: segundo
MINUTE_PLURAL: minutu
HOUR_PLURAL: ordu
DAY_PLURAL: egun
WEEK_PLURAL: aste
MONTH_PLURAL: hilabete
YEAR_PLURAL: urte
DECADE_PLURAL: hamarkada
SEC_PLURAL: segundo
MIN_PLURAL: minutu
HR_PLURAL: h
WK_PLURAL: ast
MO_PLURAL: hil
YR_PLURAL: urt
DEC_PLURAL: ham
FORM:
VALIDATION_FAIL: <b>Balidazioak huts egin du</b>
INVALID_INPUT: Baliogabeko sarrera
MISSING_REQUIRED_FIELD: 'Derrigorrezko eremua bete gabe:'
MONTHS_OF_THE_YEAR:
- 'Urtarrila'
- 'Otsaila'
- 'Martxoa'
- 'Apirila'
- 'Maiatza'
- 'Ekaina'
- 'Uztaila'
- 'Abuztua'
- 'Iraila'
- 'Urria'
- 'Azaroa'
- 'Abendua'
DAYS_OF_THE_WEEK:
- 'Astelehena'
- 'Asteartea'
- 'Azteazkena'
- 'Osteguna'
- 'Ostirala'
- 'Larunbata'
- 'Igandea'

62
system/languages/fa.yaml Normal file
View File

@@ -0,0 +1,62 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nعنوان: %1$s\n---\n\n# خطا: Frontmatter غلط\n\nمسیر: %2$s\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: تاریخی ارائه نشده
BAD_DATE: تاریخ اشتباه
AGO: قبل
FROM_NOW: از حالا
SECOND: ثانیه
MINUTE: دقیقه
HOUR: ساعت
DAY: روز
WEEK: هفته
MONTH: ماه
YEAR: سال
DECADE: دهه
SEC: ثانیه
MIN: دقیقه
HR: ساعت
WK: هفته
MO: ماه
YR: سال
DEC: دهه
SECOND_PLURAL: ثانیه
MINUTE_PLURAL: دقیقه
HOUR_PLURAL: ساعت
DAY_PLURAL: روز
WEEK_PLURAL: هفته
MONTH_PLURAL: ماه
YEAR_PLURAL: سال
DECADE_PLURAL: دهه
SEC_PLURAL: ثانیه
MIN_PLURAL: دقیقه
HR_PLURAL: ساعت
WK_PLURAL: هفته
YR_PLURAL: سال
DEC_PLURAL: دهه
FORM:
VALIDATION_FAIL: <b>سنجش اعتبار ناموفق بود</b>
INVALID_INPUT: ورودی نامعتبر در
MISSING_REQUIRED_FIELD: 'قسمت ضروری جا افتاده:'
MONTHS_OF_THE_YEAR:
- 'ژانویه'
- 'فوریه'
- 'مارس'
- 'آوریل'
- 'می'
- 'ژوئن'
- 'ژوئیه'
- 'اوت'
- 'سپتامبر'
- 'اکتبر'
- 'نوامبر'
- 'دسامبر'
DAYS_OF_THE_WEEK:
- 'دوشنبه'
- 'سه‌ شنبه'
- 'چهارشنبه'
- 'پنج شنبه'
- 'جمعه'
- 'شنبه'
- 'یک‌شنبه'

View File

@@ -1,60 +1,134 @@
---
NICETIME:
NO_DATE_PROVIDED: Päivämäärää ei annettu
BAD_DATE: Virheellinen päivämäärä
AGO: sitten
FROM_NOW: tästä lähtien
SECOND: sekunti
MINUTE: minuutti
HOUR: tunti
DAY: päivä
WEEK: viikko
MONTH: kuukausi
YEAR: vuosi
DECADE: vuosikymmen
SEC: sek
MIN: min
HR: h
WK: vk
MO: kk
YR: v
DEC: vuosikymmen
SECOND_PLURAL: sekuntia
MINUTE_PLURAL: minuuttia
HOUR_PLURAL: tuntia
DAY_PLURAL: päivää
WEEK_PLURAL: viikkoa
MONTH_PLURAL: kuukautta
YEAR_PLURAL: vuotta
DECADE_PLURAL: vuosikymmentä
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: h
WK_PLURAL: v
MO_PLURAL: kk
YR_PLURAL: v
DEC_PLURAL: vuosikymmentä
FORM:
VALIDATION_FAIL: '<b>Vahvistus epäonnistui:</b>'
MISSING_REQUIRED_FIELD: 'Puuttuva pakollinen kenttä:'
MONTHS_OF_THE_YEAR:
- Tammikuu
- Helmikuu
- Maaliskuu
- Huhtikuu
- Toukokuu
- Kesäkuuta
- Heinäkuu
- Elokuu
- Syyskuu
- Lokakuu
- Marraskuu
- Joulukuu
DAYS_OF_THE_WEEK:
- Maanantai
- Tiistai
- Keskiviikko
- Torstai
- Perjantai
- Lauantai
- Sunnuntai
GRAV:
FRONTMATTER_ERROR_PAGE: "---\notsikko: %1$s\n---\n\n# Virhe: Virheellinen Frontmatter\n\nPolku: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'information'
- 'riisi'
- 'raha'
- 'lajit'
- 'series'
- 'kala'
- 'lammas'
INFLECTOR_IRREGULAR:
'person': 'ihmiset'
'man': 'miehet'
'child': 'lapset'
'sex': 'sukupuoli'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME:
NO_DATE_PROVIDED: Päivämäärää ei annettu
BAD_DATE: Virheellinen päivämäärä
AGO: sitten
FROM_NOW: tästä lähtien
JUST_NOW: juuri nyt
SECOND: sekuntti
MINUTE: minuutti
HOUR: tunti
DAY: päivä
WEEK: viikko
MONTH: kuukausi
YEAR: vuosi
DECADE: vuosikymmen
SEC: sek
MIN: min
HR: h
WK: vk
MO: kk
YR: v
DEC: vuosikymmen
SECOND_PLURAL: sekuntia
MINUTE_PLURAL: minuuttia
HOUR_PLURAL: tuntia
DAY_PLURAL: päivää
WEEK_PLURAL: viikkoa
MONTH_PLURAL: kuukautta
YEAR_PLURAL: vuotta
DECADE_PLURAL: vuosikymmentä
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: h
WK_PLURAL: v
MO_PLURAL: kk
YR_PLURAL: v
DEC_PLURAL: vuosikymmentä
FORM:
VALIDATION_FAIL: <b>Vahvistus epäonnistui:</b>
INVALID_INPUT: Syöte ei kelpaa
MISSING_REQUIRED_FIELD: 'Puuttuva pakollinen kenttä:'
MONTHS_OF_THE_YEAR:
- 'Tammikuu'
- 'Helmikuu'
- 'Maaliskuu'
- 'Huhtikuu'
- 'Toukokuu'
- 'Kesäkuuta'
- 'Heinäkuu'
- 'Elokuu'
- 'Syyskuu'
- 'Lokakuu'
- 'Marraskuu'
- 'Joulukuu'
DAYS_OF_THE_WEEK:
- 'Maanantai'
- 'Tiistai'
- 'Keskiviikko'
- 'Torstai'
- 'Perjantai'
- 'Lauantai'
- 'Sunnuntai'
CRON:
EVERY: joka
EVERY_HOUR: joka tunti
EVERY_MINUTE: joka minuutti
EVERY_DAY_OF_WEEK: viikon jokaisena päivänä
EVERY_DAY_OF_MONTH: kuukauden jokaisena päivänä
EVERY_MONTH: joka kuukausi
TEXT_PERIOD: Joka <b />

View File

@@ -1,138 +1,121 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Erreur : Frontmatter invalide
Path: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes'
/^(ox)$/i: '\1en'
"/([m|l])ouse$/i": '\1ice'
/(matr|vert|ind)ix|ex$/i: '\1ices'
/(x|ch|ss|sh)$/i: '\1es'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([^aeiouy]|qu)y$/i": '\1ies'
/(hive)$/i: '\1s'
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves'
/sis$/i: ses
"/([ti])um$/i": '\1a'
/(buffal|tomat)o$/i: '\1oes'
/(bu)s$/i: '\1ses'
/(alias|status)/i: '\1es'
/(octop|vir)us$/i: '\1i'
/(ax|test)is$/i: '\1es'
/s$/i: s
/$/: s
INFLECTOR_SINGULAR:
/(quiz)zes$/i: '\1'
/(matr)ices$/i: '\1ix'
/(vert|ind)ices$/i: '\1ex'
/^(ox)en/i: '\1'
/(alias|status)es$/i: '\1'
"/([octop|vir])i$/i": '\1us'
/(cris|ax|test)es$/i: '\1is'
/(shoe)s$/i: '\1'
/(o)es$/i: '\1'
/(bus)es$/i: '\1'
"/([m|l])ice$/i": '\1ouse'
/(x|ch|ss|sh)es$/i: '\1'
/(m)ovies$/i: '\1ovie'
/(s)eries$/i: '\1eries'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([lr])ves$/i": '\1f'
/(tive)s$/i: '\1'
/(hive)s$/i: '\1'
"/([^f])ves$/i": '\1fe'
/(^analy)ses$/i: '\1sis'
/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i: '\1\2sis'
"/([ti])a$/i": '\1um'
/(n)ews$/i: '\1ews'
INFLECTOR_UNCOUNTABLE:
- équipement
- informations
- riz
- argent
- espèces
- séries
- poisson
- mouton
INFLECTOR_IRREGULAR:
person: personnes
man: hommes
child: enfants
sex: sexes
move: déplacements
INFLECTOR_ORDINALS:
default: ème
first: er
second: ème
third: ème
NICETIME:
NO_DATE_PROVIDED: Aucune date fournie
BAD_DATE: Date erronée
AGO: plus tôt
FROM_NOW: à partir de maintenant
SECOND: seconde
MINUTE: minute
HOUR: heure
DAY: jour
WEEK: semaine
MONTH: mois
YEAR: année
DECADE: décennie
SEC: s
MIN: m
HR: h
WK: sem
MO: m
YR: an
DEC: déc
SECOND_PLURAL: secondes
MINUTE_PLURAL: minutes
HOUR_PLURAL: heures
DAY_PLURAL: jours
WEEK_PLURAL: semaines
MONTH_PLURAL: mois
YEAR_PLURAL: années
DECADE_PLURAL: décennies
SEC_PLURAL: s
MIN_PLURAL: m
HR_PLURAL: h
WK_PLURAL: sem
MO_PLURAL: mois
YR_PLURAL: a
DEC_PLURAL: décs
FORM:
VALIDATION_FAIL: '<b>La validation a échoué :</b>'
INVALID_INPUT: Saisie non valide
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
MONTHS_OF_THE_YEAR:
- Janvier
- Février
- Mars
- Avril
- Mai
- Juin
- Juillet
- Août
- Septembre
- Octobre
- Novembre
- Décembre
DAYS_OF_THE_WEEK:
- Lundi
- Mardi
- Mercredi
- Jeudi
- Vendredi
- Samedi
- Dimanche
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitre: %1$s\n---\n\n# Erreur : Frontmatter invalide\n\nChemin: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1es'
'/(ax|test)is$/i': '\1s'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
INFLECTOR_UNCOUNTABLE:
- 'équipement'
- 'information'
- 'riz'
- 'argent'
- 'espèces'
- 'séries'
- 'poisson'
- 'mouton'
INFLECTOR_IRREGULAR:
'person': 'personnes'
'man': 'hommes'
'child': 'enfants'
'sex': 'sexes'
'move': 'déplacements'
INFLECTOR_ORDINALS:
'default': 'ème'
'first': 'er'
'second': 'ème'
'third': 'ème'
NICETIME:
NO_DATE_PROVIDED: Aucune date fournie
BAD_DATE: Date erronée
AGO: plus tôt
FROM_NOW: à partir de maintenant
JUST_NOW: à l'instant
SECOND: seconde
MINUTE: minute
HOUR: heure
DAY: jour
WEEK: semaine
MONTH: mois
YEAR: année
DECADE: décennie
SEC: s
MIN: m
HR: h
WK: sem
MO: m
YR: an
DEC: déc
SECOND_PLURAL: secondes
MINUTE_PLURAL: minutes
HOUR_PLURAL: heures
DAY_PLURAL: jours
WEEK_PLURAL: semaines
MONTH_PLURAL: mois
YEAR_PLURAL: années
DECADE_PLURAL: décennies
SEC_PLURAL: s
MIN_PLURAL: m
HR_PLURAL: h
WK_PLURAL: sem
MO_PLURAL: mois
YR_PLURAL: a
DEC_PLURAL: décs
FORM:
VALIDATION_FAIL: <b>La validation a échoué :</b>
INVALID_INPUT: Saisie non valide
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
MONTHS_OF_THE_YEAR:
- 'Janvier'
- 'Février'
- 'Mars'
- 'Avril'
- 'Mai'
- 'Juin'
- 'Juillet'
- 'Août'
- 'Septembre'
- 'Octobre'
- 'Novembre'
- 'Décembre'
DAYS_OF_THE_WEEK:
- 'Lundi'
- 'Mardi'
- 'Mercredi'
- 'Jeudi'
- 'Vendredi'
- 'Samedi'
- 'Dimanche'
CRON:
EVERY: chaque
EVERY_HOUR: toutes les heures
EVERY_MINUTE: chaque minute
EVERY_DAY_OF_WEEK: tous les jours de la semaine
EVERY_DAY_OF_MONTH: tous les jours du mois
EVERY_MONTH: chaque mois
TEXT_PERIOD: Chaque<b/>
TEXT_MINS: ' à <b /> minute(s) après l''heure'
TEXT_TIME: ' à<b/>:<b/>'
TEXT_DOW: ' sur <b/>'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' sur <b/>'
ERROR1: La balise %s n'est pas supportée!
ERROR2: Nombre invalide d'éléments
ERROR3: L'élément jquery_element doit être défini dans les paramètres jqCron
ERROR4: Expression non reconnue

63
system/languages/he.yaml Normal file
View File

@@ -0,0 +1,63 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nכותרת: %1$s\n---\n# שגיאה: Fronmatter לא חוקי\nנתיב: `%2$s`\n**%3$s**\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: לא סופק תאריך
BAD_DATE: תאריך פגום
AGO: לפני
FROM_NOW: כרגע
SECOND: שנייה
MINUTE: דקה
HOUR: שעה
DAY: יום
WEEK: שבוע
MONTH: חודש
YEAR: שנה
DECADE: עשור
SEC: שנ'
MIN: דק'
HR: ש'
WK: שב'
MO: חו'
YR: שני'
DEC: עש'
SECOND_PLURAL: שניות
MINUTE_PLURAL: דקות
HOUR_PLURAL: שעות
DAY_PLURAL: ימים
WEEK_PLURAL: שבועות
MONTH_PLURAL: חודשים
YEAR_PLURAL: שנים
DECADE_PLURAL: עשורים
SEC_PLURAL: שנ'
MIN_PLURAL: דק'
HR_PLURAL: ש'
WK_PLURAL: שב'
MO_PLURAL: חו'
YR_PLURAL: שני'
DEC_PLURAL: עש'
FORM:
VALIDATION_FAIL: <b>האימות נכשל:</b>
INVALID_INPUT: קלט לא חוקי
MISSING_REQUIRED_FIELD: 'שדות חובה חסרים:'
MONTHS_OF_THE_YEAR:
- 'ינואר'
- 'פברואר'
- 'מרץ'
- 'אפריל'
- 'מאי'
- 'יוני'
- 'יולי'
- 'אוגוסט'
- 'ספטמבר'
- 'אוקטובר'
- 'נובמבר'
- 'דצמבר'
DAYS_OF_THE_WEEK:
- 'שני'
- 'שלישי'
- 'רביעי'
- 'חמישי'
- 'שישי'
- 'שבת'
- 'ראשון'

View File

@@ -1,75 +1,76 @@
---
INFLECTOR_UNCOUNTABLE:
- oprema
- informacije
- riža
- novac
- vrsta
- serija
- riba
- ovca
INFLECTOR_IRREGULAR:
person: osobe
man: ljudi
child: djeca
sex: spolovi
move: Pomakni
NICETIME:
NO_DATE_PROVIDED: Datum nije upisan
BAD_DATE: Pogrešan datum
AGO: prije
FROM_NOW: od sada
SECOND: sekunda
MINUTE: minuta
HOUR: sat
DAY: dan
WEEK: tjedan
MONTH: mjesec
YEAR: godina
DECADE: desetljeće
SEC: sek
HR: sat
WK: t
MO: m
YR: g
DEC: des
SECOND_PLURAL: sekundi
MINUTE_PLURAL: minuta
HOUR_PLURAL: sati
DAY_PLURAL: dan
WEEK_PLURAL: tjedana
MONTH_PLURAL: mjeseci
YEAR_PLURAL: godina
DECADE_PLURAL: desetljeća
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: sat
WK_PLURAL: t
MO_PLURAL: m
YR_PLURAL: g
DEC_PLURAL: des
FORM:
VALIDATION_FAIL: '<b>Validacija nije uspjela:</b>'
INVALID_INPUT: Pogrešan unos u
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
MONTHS_OF_THE_YEAR:
- Siječanj
- Veljača
- Ožujak
- Travanj
- Svibanj
- Lipanj
- Srpanj
- Kolovoz
- Rujan
- Listopad
- Studeni
- Prosinac
DAYS_OF_THE_WEEK:
- Ponedjeljak
- Utorak
- Srijeda
- Četvrtak
- Petak
- Subota
- Nedjelja
GRAV:
INFLECTOR_UNCOUNTABLE:
- 'oprema'
- 'informacije'
- 'riža'
- 'novac'
- 'vrsta'
- 'serija'
- 'riba'
- 'ovca'
INFLECTOR_IRREGULAR:
'person': 'osobe'
'man': 'ljudi'
'child': 'djeca'
'sex': 'spolovi'
'move': 'Pomakni'
NICETIME:
NO_DATE_PROVIDED: Datum nije upisan
BAD_DATE: Pogrešan datum
AGO: prije
FROM_NOW: od sada
SECOND: sekunda
MINUTE: minuta
HOUR: sat
DAY: dan
WEEK: tjedan
MONTH: mjesec
YEAR: godina
DECADE: desetljeće
SEC: sek
HR: sat
WK: t
MO: m
YR: g
DEC: des
SECOND_PLURAL: sekundi
MINUTE_PLURAL: minuta
HOUR_PLURAL: sati
DAY_PLURAL: dan
WEEK_PLURAL: tjedana
MONTH_PLURAL: mjeseci
YEAR_PLURAL: godina
DECADE_PLURAL: desetljeća
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: sat
WK_PLURAL: t
MO_PLURAL: m
YR_PLURAL: g
DEC_PLURAL: des
FORM:
VALIDATION_FAIL: <b>Validacija nije uspjela:</b>
INVALID_INPUT: Pogrešan unos u
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
MONTHS_OF_THE_YEAR:
- 'Siječanj'
- 'Veljača'
- 'Ožujak'
- 'Travanj'
- 'Svibanj'
- 'Lipanj'
- 'Srpanj'
- 'Kolovoz'
- 'Rujan'
- 'Listopad'
- 'Studeni'
- 'Prosinac'
DAYS_OF_THE_WEEK:
- 'Ponedjeljak'
- 'Utorak'
- 'Srijeda'
- 'Četvrtak'
- 'Petak'
- 'Subota'
- 'Nedjelja'

View File

@@ -1,138 +1,97 @@
---
FRONTMATTER_ERROR_PAGE: |
---
cím: %1$s
---
# Hiba: Érvénytelen Frontmatter
Elérési út: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes'
/^(ox)$/i: '\1en'
"/([m|l])ouse$/i": '\1ice'
/(matr|vert|ind)ix|ex$/i: '\1ices'
/(x|ch|ss|sh)$/i: '\1es'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([^aeiouy]|qu)y$/i": '\1ies'
/(hive)$/i: '\1s'
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves'
/sis$/i: ses
"/([ti])um$/i": '\1a'
/(buffal|tomat)o$/i: '\1oes'
/(bu)s$/i: '\1ses'
/(alias|status)/i: '\1es'
/(octop|vir)us$/i: '\1i'
/(ax|test)is$/i: '\1es'
/s$/i: s
/$/: s
INFLECTOR_SINGULAR:
/(quiz)zes$/i: '\1'
/(matr)ices$/i: '\1ix'
/(vert|ind)ices$/i: '\1ex'
/^(ox)en/i: '\1'
/(alias|status)es$/i: '\1'
"/([octop|vir])i$/i": '\1us'
/(cris|ax|test)es$/i: '\1is'
/(shoe)s$/i: '\1'
/(o)es$/i: '\1'
/(bus)es$/i: '\1'
"/([m|l])ice$/i": '\1ouse'
/(x|ch|ss|sh)es$/i: '\1'
/(m)ovies$/i: '\1ovie'
/(s)eries$/i: '\1eries'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([lr])ves$/i": '\1f'
/(tive)s$/i: '\1'
/(hive)s$/i: '\1'
"/([^f])ves$/i": '\1fe'
/(^analy)ses$/i: '\1sis'
/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i: '\1\2sis'
"/([ti])a$/i": '\1um'
/(n)ews$/i: '\1ews'
INFLECTOR_UNCOUNTABLE:
- felszerelés
- információ
- rizs
- pénz
- fajok
- sorozat
- hal
- juh
INFLECTOR_IRREGULAR:
person: személyek
man: férfiak
child: gyerekek
sex: nemek
move: lépések
INFLECTOR_ORDINALS:
default: '.'
first: '.'
second: '.'
third: '.'
NICETIME:
NO_DATE_PROVIDED: Nincs dátum megadva
BAD_DATE: Hibás dátum
AGO: elteltével
FROM_NOW: mostantól
SECOND: másodperc
MINUTE: perc
HOUR: óra
DAY: nap
WEEK: t
MONTH: hónap
YEAR: év
DECADE: évtized
SEC: mp
MIN: p
HR: ó
WK: hét
MO:
YR: év
DEC: évt
SECOND_PLURAL: másodperc
MINUTE_PLURAL: perc
HOUR_PLURAL: óra
DAY_PLURAL: nap
WEEK_PLURAL: hét
MONTH_PLURAL: hónap
YEAR_PLURAL: év
DECADE_PLURAL: évtized
SEC_PLURAL: mp
MIN_PLURAL: perc
HR_PLURAL: ó
WK_PLURAL: hét
MO_PLURAL:
YR_PLURAL: év
DEC_PLURAL: évt
FORM:
VALIDATION_FAIL: '<b>A validáció hibát talált:</b>'
INVALID_INPUT: 'Az itt megadott érték érvénytelen:'
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
MONTHS_OF_THE_YEAR:
- január
- február
- március
- április
- május
- június
- július
- augusztus
- szeptember
- október
- november
- december
DAYS_OF_THE_WEEK:
- hétfő
- kedd
- szerda
- csütörtök
- péntek
- szombat
- vasárnap
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ncím: %1$s\n---\n\n# Hiba: Érvénytelen Frontmatter\n\nElérési út: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'felszerelés'
- 'információ'
- 'rizs'
- 'pénz'
- 'fajok'
- 'sorozat'
- 'hal'
- 'juh'
INFLECTOR_IRREGULAR:
'person': 'személyek'
'man': 'férfiak'
'child': 'gyerekek'
'sex': 'nemek'
'move': 'lépések'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME:
NO_DATE_PROVIDED: Nincs dátum megadva
BAD_DATE: Hibás dátum
AGO: elteltével
FROM_NOW: mostantól
JUST_NOW: épp most
SECOND: másodperc
MINUTE: perc
HOUR: óra
DAY: nap
WEEK: hét
MONTH: hónap
YEAR: év
DECADE: évtized
SEC: mp
MIN: p
HR: ó
WK: hét
MO:
YR: év
DEC: évt
SECOND_PLURAL: másodperc
MINUTE_PLURAL: perc
HOUR_PLURAL: óra
DAY_PLURAL: nap
WEEK_PLURAL: hét
MONTH_PLURAL: hónap
YEAR_PLURAL: év
DECADE_PLURAL: évtized
SEC_PLURAL: mp
MIN_PLURAL: perc
HR_PLURAL: ó
WK_PLURAL: hét
MO_PLURAL:
YR_PLURAL: év
DEC_PLURAL: évt
FORM:
VALIDATION_FAIL: <b>Érvényesítés nem sikerült:</b>
INVALID_INPUT: 'A megadott érték érvénytelen:'
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
MONTHS_OF_THE_YEAR:
- 'január'
- 'február'
- 'március'
- 'április'
- 'május'
- 'június'
- 'július'
- 'augusztus'
- 'szeptember'
- 'október'
- 'november'
- 'december'
DAYS_OF_THE_WEEK:
- 'hétfő'
- 'kedd'
- 'szerda'
- 'csütörtök'
- 'péntek'
- 'szombat'
- 'vasárnap'
CRON:
EVERY: minden
EVERY_HOUR: óránként
EVERY_MINUTE: percenként
EVERY_DAY_OF_WEEK: a hét minden napján
EVERY_DAY_OF_MONTH: a hónap minden napján
EVERY_MONTH: minden hónapban
TEXT_PERIOD: Minden <b />
TEXT_MINS: '<b /> perccel az óra elteltével'
ERROR1: A %s címke nem engedélyezett!
ERROR2: Hibás elemszám
ERROR3: A jquery_element-et a jqCron beállítsokban kell meghatározni
ERROR4: Ismeretlen kifejezés

95
system/languages/id.yaml Normal file
View File

@@ -0,0 +1,95 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Frontmatter tidak valid\n\nLokasi: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'peralatan'
- 'informasi'
- 'nasi'
- 'uang'
- 'spesies'
- 'rangkaian'
- 'ikan'
- 'domba'
INFLECTOR_IRREGULAR:
'person': 'orang-orang'
'man': 'laki-laki'
'child': 'anak-anak'
'sex': 'jenis kelamin'
'move': 'pindahkan'
NICETIME:
NO_DATE_PROVIDED: Tanggal tidak tersedia
BAD_DATE: Format tanggal salah
AGO: yang lalu
FROM_NOW: dari saat ini
JUST_NOW: baru saja
SECOND: detik
MINUTE: menit
HOUR: jam
DAY: hari
WEEK: pekan
MONTH: bulan
YEAR: tahun
DECADE: dekade
SEC: dtk
MIN: mnt
HR: j
WK: mng
MO: bln
YR: thn
DEC: desimal
SECOND_PLURAL: detik
MINUTE_PLURAL: menit
HOUR_PLURAL: jam
DAY_PLURAL: hari
WEEK_PLURAL: pekan
MONTH_PLURAL: bulan
YEAR_PLURAL: tahun
DECADE_PLURAL: dekade
SEC_PLURAL: dtk
MIN_PLURAL: mnt
HR_PLURAL: j
WK_PLURAL: mgg
MO_PLURAL: bln
YR_PLURAL: thn
DEC_PLURAL: dekade
FORM:
VALIDATION_FAIL: <b>Validasi gagal:</b>
INVALID_INPUT: Input tidak valid di
MISSING_REQUIRED_FIELD: 'Data yang diperlukan belum terisi:'
MONTHS_OF_THE_YEAR:
- 'Januari'
- 'Februari'
- 'Maret'
- 'April'
- 'Mei'
- 'Juni'
- 'Juli'
- 'Agustus'
- 'September'
- 'Oktober'
- 'November'
- 'Desember'
DAYS_OF_THE_WEEK:
- 'Senin'
- 'Selasa'
- 'Rabu'
- 'Kamis'
- 'Jumat'
- 'Sabtu'
- 'Minggu'
CRON:
EVERY: Setiap
EVERY_HOUR: Setiap jam
EVERY_MINUTE: Setiap menit
EVERY_DAY_OF_WEEK: Setiap hari selama seminggu
EVERY_DAY_OF_MONTH: pada tanggal setiap bulannya
EVERY_MONTH: setiap bulan
TEXT_PERIOD: Setiap <b />
TEXT_TIME: ' pada <b />:<b />'
TEXT_DOW: ' pada <b />'
TEXT_MONTH: ' pada <b />'
TEXT_DOM: ' pada <b />'
ERROR1: Tag %s tidak didukung!
ERROR2: Jumlah elemen tidak valid
ERROR3: jquery_element harus ditetapkan ke pengaturan jqCron
ERROR4: Ekspresi tidak dikenali

69
system/languages/is.yaml Normal file
View File

@@ -0,0 +1,69 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitill: %1$s\n---\n\n# Villa: Ógilt efni á forsíðu\n\nSlóð: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'upplýsingar'
- 'rice'
- 'money'
- 'species'
- 'series'
- 'fish'
- 'sheep'
NICETIME:
AGO: síðan
JUST_NOW: í þessu
SECOND: sekúndu
MINUTE: mínútu
HOUR: klukkustund
DAY: degi
WEEK: viku
MONTH: mánuði
YEAR: ári
DECADE: áratug
SEC: sek
MIN: mín
HR: klst
WK: vk
MO: mán
YR: ár
DEC: árat
SECOND_PLURAL: sekúndum
MINUTE_PLURAL: mínútum
HOUR_PLURAL: klukkustundum
DAY_PLURAL: dögum
WEEK_PLURAL: vikum
MONTH_PLURAL: mánuðum
YEAR_PLURAL: árum
DECADE_PLURAL: áratugum
SEC_PLURAL: sek
MIN_PLURAL: mín
HR_PLURAL: klst
WK_PLURAL: vik
MO_PLURAL: mán
YR_PLURAL: árum
DEC_PLURAL: árat
FORM:
VALIDATION_FAIL: <b>Sannvottun mistókst:</b>
MISSING_REQUIRED_FIELD: 'Vantar nauðsynlegan reit:'
MONTHS_OF_THE_YEAR:
- 'janúar'
- 'Febrúar'
- 'Mars'
- 'Apríl'
- 'Maí'
- 'Júní'
- 'Júlí'
- 'Ágúst'
- 'September'
- 'Október'
- 'Nóvember'
- 'Desember'
DAYS_OF_THE_WEEK:
- 'Mánudagur'
- 'Þriðjudagur'
- 'Miðvikudagur'
- 'Fimmtudagur'
- 'Föstudagur'
- 'Laugardagur'
- 'Sunnudagur'

View File

@@ -1,62 +1,101 @@
---
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
NICETIME:
NO_DATE_PROVIDED: Nessuna data fornita
BAD_DATE: Data non valida
AGO: fa
FROM_NOW: da adesso
SECOND: secondo
MINUTE: minuto
HOUR: ora
DAY: giorno
WEEK: settimana
MONTH: mese
YEAR: anno
DECADE: decennio
SEC: sec
MIN: min
HR: ora
WK: settimana
MO: mese
YR: anno
DEC: decennio
SECOND_PLURAL: secondi
MINUTE_PLURAL: minuti
HOUR_PLURAL: ore
DAY_PLURAL: giorni
WEEK_PLURAL: settimane
MONTH_PLURAL: mesi
YEAR_PLURAL: anni
DECADE_PLURAL: decadi
SEC_PLURAL: secondi
MIN_PLURAL: minuti
HR_PLURAL: ore
WK_PLURAL: settimane
MO_PLURAL: mesi
YR_PLURAL: anni
DEC_PLURAL: decenni
FORM:
VALIDATION_FAIL: '<b>Validazione fallita:</b>'
INVALID_INPUT: Input non valido in
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
MONTHS_OF_THE_YEAR:
- Gennaio
- Febbraio
- Marzo
- Aprile
- Maggio
- Giugno
- Luglio
- Agosto
- Settembre
- Ottobre
- Novembre
- Dicembre
DAYS_OF_THE_WEEK:
- Lunedì
- Martedì
- Mercoledì
- Giovedì
- Venerdì
- Sabato
- Domenica
GRAV:
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
INFLECTOR_UNCOUNTABLE:
- 'dotazione'
- 'informazione'
- 'riso'
- 'denaro'
- 'specie'
- 'serie'
- 'pesce'
- 'pecora'
INFLECTOR_IRREGULAR:
'person': 'persone'
'man': 'uomini'
'child': 'bambino'
'sex': 'sessi'
'move': 'sposta'
INFLECTOR_ORDINALS:
'default': '°'
'first': '°'
'second': 'o'
'third': 'o'
NICETIME:
NO_DATE_PROVIDED: Nessuna data fornita
BAD_DATE: Data non valida
AGO: fa
FROM_NOW: da adesso
JUST_NOW: ora
SECOND: secondo
MINUTE: minuto
HOUR: ora
DAY: giorno
WEEK: settimana
MONTH: mese
YEAR: anno
DECADE: decennio
SEC: sec
MIN: min
HR: ora
WK: settimana
MO: mese
YR: anno
DEC: decennio
SECOND_PLURAL: secondi
MINUTE_PLURAL: minuti
HOUR_PLURAL: ore
DAY_PLURAL: giorni
WEEK_PLURAL: settimane
MONTH_PLURAL: mesi
YEAR_PLURAL: anni
DECADE_PLURAL: decadi
SEC_PLURAL: secondi
MIN_PLURAL: minuti
HR_PLURAL: ore
WK_PLURAL: settimane
MO_PLURAL: mesi
YR_PLURAL: anni
DEC_PLURAL: decenni
FORM:
VALIDATION_FAIL: <b>Validazione fallita:</b>
INVALID_INPUT: Input non valido in
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
MONTHS_OF_THE_YEAR:
- 'Gennaio'
- 'Febbraio'
- 'Marzo'
- 'Aprile'
- 'Maggio'
- 'Giugno'
- 'Luglio'
- 'Agosto'
- 'Settembre'
- 'Ottobre'
- 'Novembre'
- 'Dicembre'
DAYS_OF_THE_WEEK:
- 'Lunedì'
- 'Martedì'
- 'Mercoledì'
- 'Giovedì'
- 'Venerdì'
- 'Sabato'
- 'Domenica'
CRON:
EVERY: ogni
EVERY_HOUR: ogni ora
EVERY_MINUTE: ogni minuto
EVERY_DAY_OF_WEEK: ogni giorno della settimana
EVERY_DAY_OF_MONTH: ogni giorno del mese
EVERY_MONTH: ogni mese
TEXT_PERIOD: Ogni <b />
TEXT_MINS: ' a <b /> minuto(i) dall''inizio dell''ora'
TEXT_TIME: ' alle <b />:<b />'
TEXT_DOW: ' su <b />'
TEXT_MONTH: ' di <b />'
TEXT_DOM: ' di <b />'
ERROR1: Il tag %s non è supportato!
ERROR2: Numero di elementi non valido
ERROR3: Il jquery_element deve essere impostato nelle impostazioni di jqCron
ERROR4: Espressione non riconosciuta

View File

@@ -1,24 +1,15 @@
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS: []
INFLECTOR_SINGULAR: []
INFLECTOR_UNCOUNTABLE: []
INFLECTOR_IRREGULAR:
---
GRAV:
INFLECTOR_IRREGULAR:
'person': 'みんな'
'man': '人'
'child': '子供'
'sex': '性別'
'move': '移動'
INFLECTOR_ORDINALS: []
NICETIME:
NICETIME:
NO_DATE_PROVIDED: 日付が設定されていません
BAD_DATE: 不正な日付
AGO:
FROM_NOW: from now
SECOND:
MINUTE:
HOUR:
@@ -33,7 +24,6 @@ NICETIME:
WK:
MO:
YR:
DEC: dec
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL:
@@ -49,9 +39,28 @@ NICETIME:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 10年
FORM:
FORM:
VALIDATION_FAIL: <b>バリデーション失敗 :</b>
INVALID_INPUT: 不正な入力:
MISSING_REQUIRED_FIELD: 必須項目が入力されていません:
MONTHS_OF_THE_YEAR: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
DAYS_OF_THE_WEEK: ['月', '火', '水', '木', '金', '土', '日']
MISSING_REQUIRED_FIELD: '必須項目が入力されていません:'
MONTHS_OF_THE_YEAR:
- '1月'
- '2月'
- '3月'
- '4月'
- '5月'
- '6月'
- '7月'
- '8月'
- '9月'
- '10月'
- '11月'
- '12月'
DAYS_OF_THE_WEEK:
- '月'
- '火'
- '水'
- '木'
- '金'
- '土'
- '日'

63
system/languages/ko.yaml Normal file
View File

@@ -0,0 +1,63 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# 오류: 무효의 Frontmatter\n\n경로: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: 제공된 날짜가 없습니다
BAD_DATE: 잘못된 날짜
AGO:
FROM_NOW:
SECOND:
MINUTE:
HOUR: 시간
DAY:
WEEK:
MONTH: 개월
YEAR:
DECADE: 년간
SEC:
MIN:
HR: 시간
WK:
MO: 개월
YR:
DEC: 년간
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL: 시간
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL: 개월
YEAR_PLURAL:
DECADE_PLURAL: 년간
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL: 시간
WK_PLURAL:
MO_PLURAL: 개월
YR_PLURAL:
DEC_PLURAL: 년간
FORM:
VALIDATION_FAIL: <b>유효성 검사 실패:</b>
INVALID_INPUT: 잘못된 입력
MISSING_REQUIRED_FIELD: '누락 된 필수 필드:'
MONTHS_OF_THE_YEAR:
- '일월'
- '이월'
- '삼월'
- '사월'
- '오월'
- '유월'
- '칠월'
- '팔월'
- '구월'
- '시월'
- '십일월'
- '십이월'
DAYS_OF_THE_WEEK:
- '월요일'
- '화요일'
- '수요일'
- '목요일'
- '금요일'
- '토요일'
- '일요일'

View File

@@ -1,69 +1,78 @@
---
INFLECTOR_UNCOUNTABLE:
2: ryžiai
3: pinigai
4: prieskoniai
5: serijos
6: žuvis
7: avis
INFLECTOR_IRREGULAR:
person: žmonės
man: žmogus
child: vaikai
sex: lytys
move: juda
NICETIME:
NO_DATE_PROVIDED: Nenurodyta data
BAD_DATE: Neteisinga data
AGO: prieš
FROM_NOW: nuo dabar
SECOND: sekundė
MINUTE: minutė
HOUR: valanda
DAY: diena
WEEK: savaitė
MONTH: mėnuo
YEAR: metai
DECADE: dešimtmetis
SEC: sek
MIN: min
HR: val
WK: sav
MO: mėn
YR: m
MINUTE_PLURAL: minutės
HOUR_PLURAL: valandos
DAY_PLURAL: dienos
WEEK_PLURAL: savaitės
MONTH_PLURAL: mėnesiai
YEAR_PLURAL: metai
DECADE_PLURAL: dešimtmečiai
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: val
WK_PLURAL: sav
MO_PLURAL: mėn
YR_PLURAL: m
FORM:
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
MONTHS_OF_THE_YEAR:
- Sausis
- Vasaris
- Kovas
- Balandis
- Gegužė
- Birželis
- Liepa
- Rugpjūtis
- Rugsėjis
- Spalis
- Lakpritis
- Gruodis
DAYS_OF_THE_WEEK:
- Pirmadienis
- Antradienis
- Trečiadienis
- Ketvirtadienis
- Penktadienis
- Šeštadienis
- Sekmadienis
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Klaida: klaidinga įžanginė konfigūracija\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n %4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'information'
- 'ryžiai'
- 'pinigai'
- 'prieskoniai'
- 'serijos'
- 'žuvis'
- 'avis'
INFLECTOR_IRREGULAR:
'person': 'žmonės'
'man': 'žmogus'
'child': 'vaikai'
'sex': 'lytys'
'move': 'juda'
NICETIME:
NO_DATE_PROVIDED: Nenurodyta data
BAD_DATE: Neteisinga data
AGO: prieš
FROM_NOW: nuo dabar
SECOND: sekundė
MINUTE: minu
HOUR: valanda
DAY: diena
WEEK: savaitė
MONTH: mėnuo
YEAR: metai
DECADE: dešimtmetis
SEC: sek.
MIN: min.
HR: val.
WK: sav.
MO: mėn.
YR: m.
DEC: dešimtmetis
SECOND_PLURAL: sekundės
MINUTE_PLURAL: minutės
HOUR_PLURAL: valandos
DAY_PLURAL: dienos
WEEK_PLURAL: savaitės
MONTH_PLURAL: mėnesiai
YEAR_PLURAL: metai
DECADE_PLURAL: dešimtmečiai
SEC_PLURAL: sek.
MIN_PLURAL: min.
HR_PLURAL: val.
WK_PLURAL: sav.
MO_PLURAL: mėn.
YR_PLURAL: m.
DEC_PLURAL: dešimtmečiai
FORM:
VALIDATION_FAIL: <b>Patvirtinimas nepavyko:</b>
INVALID_INPUT: Neteisingai įvesta į
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
MONTHS_OF_THE_YEAR:
- 'Sausis'
- 'Vasaris'
- 'Kovas'
- 'Balandis'
- 'Gegužė'
- 'Birželis'
- 'Liepa'
- 'Rugpjūtis'
- 'Rugsėjis'
- 'Spalis'
- 'Lakpritis'
- 'Gruodis'
DAYS_OF_THE_WEEK:
- 'Pirmadienis'
- 'Antradienis'
- 'Trečiadienis'
- 'Ketvirtadienis'
- 'Penktadienis'
- 'Šeštadienis'
- 'Sekmadienis'

View File

@@ -1,2 +1,4 @@
MONTHS_OF_THE_YEAR: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']
DAYS_OF_THE_WEEK: ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag']
---
GRAV:
MONTHS_OF_THE_YEAR: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']
DAYS_OF_THE_WEEK: ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag']

View File

@@ -1,64 +1,144 @@
---
INFLECTOR_IRREGULAR:
person: personen
man: mensen
child: kinderen
sex: geslacht
move: verplaatsen
NICETIME:
NO_DATE_PROVIDED: geen datum opgegeven
BAD_DATE: Datumformaat onjuist
AGO: geleden
FROM_NOW: vanaf nu
SECOND: seconde
MINUTE: minuut
HOUR: uur
DAY: dag
WEEK: week
MONTH: maand
YEAR: jaar
DECADE: decenium
SEC: s
MIN: min
HR: u
MO: ma
YR: j
SECOND_PLURAL: seconden
MINUTE_PLURAL: minuten
HOUR_PLURAL: uren
DAY_PLURAL: dagen
WEEK_PLURAL: weken
MONTH_PLURAL: maanden
YEAR_PLURAL: jaren
DECADE_PLURAL: decennia
SEC_PLURAL: seconden
MIN_PLURAL: minuten
HR_PLURAL: uren
WK_PLURAL: weken
MO_PLURAL: maanden
YR_PLURAL: jaren
FORM:
VALIDATION_FAIL: '<b>Validatie mislukt:</b>'
INVALID_INPUT: Ongeldige invoer in
MISSING_REQUIRED_FIELD: 'Verplicht veld ontbreekt:'
MONTHS_OF_THE_YEAR:
- Januari
- Februari
- Maart
- april
- Mei
- Juni
- Juli
- Augustus
- september
- Oktober
- november
- december
DAYS_OF_THE_WEEK:
- Maandag
- Dinsdag
- Woensdag
- Donderdag
- Vrijdag
- Zaterdag
- Zondag
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitel: %1$s\n---\n\n# Fout: ongeldige frontmatter\n\nPad: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'uitrusting'
- 'informatie'
- 'rijst'
- 'geld'
- 'soorten'
- 'reeks'
- 'vis'
- 'schaap'
INFLECTOR_IRREGULAR:
'person': 'personen'
'man': 'mensen'
'child': 'kinderen'
'sex': 'geslacht'
'move': 'verplaatsen'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: geen datum opgegeven
BAD_DATE: Datumformaat onjuist
AGO: geleden
FROM_NOW: vanaf nu
JUST_NOW: zojuist
SECOND: seconde
MINUTE: minuut
HOUR: uur
DAY: dag
WEEK: week
MONTH: maand
YEAR: jaar
DECADE: decennium
SEC: s
MIN: min
HR: u
WK: week
MO: ma
YR: j
DEC: decennia
SECOND_PLURAL: seconden
MINUTE_PLURAL: minuten
HOUR_PLURAL: uren
DAY_PLURAL: dagen
WEEK_PLURAL: weken
MONTH_PLURAL: maanden
YEAR_PLURAL: jaren
DECADE_PLURAL: decennia
SEC_PLURAL: seconden
MIN_PLURAL: minuten
HR_PLURAL: uren
WK_PLURAL: weken
MO_PLURAL: maanden
YR_PLURAL: jaren
DEC_PLURAL: decennia
FORM:
VALIDATION_FAIL: <b>Validatie mislukt:</b>
INVALID_INPUT: Ongeldige invoer in
MISSING_REQUIRED_FIELD: 'Ontbrekend verplicht veld:'
MONTHS_OF_THE_YEAR:
- 'Januari'
- 'Februari'
- 'Maart'
- 'April'
- 'Mei'
- 'Juni'
- 'Juli'
- 'Augustus'
- 'September'
- 'Oktober'
- 'November'
- 'December'
DAYS_OF_THE_WEEK:
- 'Maandag'
- 'Dinsdag'
- 'Woensdag'
- 'Donderdag'
- 'Vrijdag'
- 'Zaterdag'
- 'Zondag'
CRON:
EVERY: elke
EVERY_HOUR: elk uur
EVERY_MINUTE: elke minuut
EVERY_DAY_OF_WEEK: elke dag van de week
EVERY_DAY_OF_MONTH: elke dag van de maand
EVERY_MONTH: elke maand
TEXT_PERIOD: Elke <b />
TEXT_MINS: ' <b /> minuten te laat'
TEXT_TIME: ' op <b />:<b />'
TEXT_DOW: ' op <b />'
TEXT_MONTH: ' van <b />'
TEXT_DOM: ' op <b />'
ERROR1: De tag %s wordt niet ondersteund!
ERROR2: Slecht aantal elementen
ERROR3: Het jquery_element moet ingesteld worden in de jqCron instellingen
ERROR4: Onbekende expressie

View File

@@ -1,93 +1,77 @@
---
FRONTMATTER_ERROR_PAGE: |
---
Tittel: %1$s
---
# Feilmelding: Ugyldig Frontmatter
Pane: '%2$s'
**%3$s **
```
%4$s
```
INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes'
/^(ox)$/i: '\1en'
INFLECTOR_UNCOUNTABLE:
- utstyr
- informasjon
- ris
- penger
- arter
- serier
- fisk
- sau
INFLECTOR_IRREGULAR:
person: folk
man: menn
child: barn
sex: kjønn
move: trekk
NICETIME:
NO_DATE_PROVIDED: Ingen dato gitt
BAD_DATE: Dårlig dato
AGO: siden
FROM_NOW: fra nå
SECOND: sekund
MINUTE: minutt
HOUR: time
DAY: dag
WEEK: uke
MONTH: måned
YEAR: år
DECADE: tiår
SEC: sek
MIN: min
HR: t
WK: uke
MO: må
YR: år
DEC: des
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minutter
HOUR_PLURAL: timer
DAY_PLURAL: dager
WEEK_PLURAL: uker
MONTH_PLURAL: måneder
YEAR_PLURAL: år
DECADE_PLURAL: tiår
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: timer
WK_PLURAL: uker
MO_PLURAL: mdr
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: '<b>Validering mislyktes:</b>'
INVALID_INPUT: Ugyldig innhold i
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
MONTHS_OF_THE_YEAR:
- januar
- februar
- mars
- april
- mai
- juni
- juli
- august
- september
- oktober
- november
- desember
DAYS_OF_THE_WEEK:
- mandag
- tirsdag
- onsdag
- torsdag
- fredag
- lørdag
- søndag
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nTittel: %1$s\n---\n\n# Feilmelding: Ugyldig Frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'utstyr'
- 'informasjon'
- 'ris'
- 'penger'
- 'arter'
- 'serier'
- 'fisk'
- 'sau'
INFLECTOR_IRREGULAR:
'person': 'folk'
'man': 'menn'
'child': 'barn'
'sex': 'kjønn'
'move': 'trekk'
NICETIME:
NO_DATE_PROVIDED: Ingen dato gitt
BAD_DATE: Ugyldig dato
AGO: siden
FROM_NOW: fra nå
SECOND: sekund
MINUTE: minutt
HOUR: time
DAY: dag
WEEK: uke
MONTH: måned
YEAR: år
DECADE: tiår
SEC: sek
HR: t
WK: uke
MO:
YR: år
DEC: tiår
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minutter
HOUR_PLURAL: timer
DAY_PLURAL: dager
WEEK_PLURAL: uker
MONTH_PLURAL: måneder
YEAR_PLURAL: år
DECADE_PLURAL: tiår
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: timer
WK_PLURAL: uker
MO_PLURAL: md
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: <b>Godkjenning mislyktes:</b>
INVALID_INPUT: Ugyldig innhold i
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
MONTHS_OF_THE_YEAR:
- 'januar'
- 'februar'
- 'mars'
- 'april'
- 'mai'
- 'juni'
- 'juli'
- 'august'
- 'september'
- 'oktober'
- 'november'
- 'desember'
DAYS_OF_THE_WEEK:
- 'mandag'
- 'tirsdag'
- 'onsdag'
- 'torsdag'
- 'fredag'
- 'lørdag'
- 'søndag'

View File

@@ -1,75 +1,62 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Error: Nieprawidłowy Frontmatter
Path: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: Nie podano daty
BAD_DATE: Zła data
AGO: temu
FROM_NOW: od teraz
SECOND: sekunda
MINUTE: minuta
HOUR: godzina
DAY: dzień
WEEK: tydzi
MONTH: miesiąc
YEAR: rok
DECADE: dekada
SEC: sek
MIN: min
HR: godz
WK: tydz
MO: m-c
YR: rok
DEC: dekada
SECOND_PLURAL: sekund
MINUTE_PLURAL: minut
HOUR_PLURAL: godzin
DAY_PLURAL: dni
WEEK_PLURAL: tygodnie
MONTH_PLURAL: miesięcy
YEAR_PLURAL: lat
DECADE_PLURAL: dekad
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: godz
WK_PLURAL: tyg
MO_PLURAL: m-ce
YR_PLURAL: lat
DEC_PLURAL: dekad
FORM:
VALIDATION_FAIL: '<b>Weryfikacja nie powiodła się:</b>'
INVALID_INPUT: Nieprawidłowe dane wejściowe
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
MONTHS_OF_THE_YEAR:
- Styczeń
- Luty
- Marzec
- Kwiecień
- Maj
- Czerwiec
- Lipiec
- Sierpień
- Wrzesień
- Październik
- Listopad
- Grudzień
DAYS_OF_THE_WEEK:
- Poniedziałek
- Wtorek
- Środa
- Czwartek
- Piątek
- Sobota
- Niedziela
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Nieprawidłowy Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Nie podano daty
BAD_DATE: Zła data
AGO: temu
FROM_NOW: od teraz
SECOND: sekunda
MINUTE: minuta
HOUR: godzina
DAY: dzień
WEEK: tydzień
MONTH: miesiąc
YEAR: rok
DECADE: dekada
SEC: sek
HR: godz
WK: tydz
MO: m-c
YR: rok
DEC: dekada
SECOND_PLURAL: sekund
MINUTE_PLURAL: minut
HOUR_PLURAL: godzin
DAY_PLURAL: dni
WEEK_PLURAL: tygodnie
MONTH_PLURAL: miesięcy
YEAR_PLURAL: lat
DECADE_PLURAL: dekad
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: godz
WK_PLURAL: tyg
MO_PLURAL: m-ce
YR_PLURAL: lat
DEC_PLURAL: dekad
FORM:
VALIDATION_FAIL: <b>Weryfikacja nie powiodła się:</b>
INVALID_INPUT: Nieprawidłowe dane wejściowe
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
MONTHS_OF_THE_YEAR:
- 'Styczeń'
- 'Luty'
- 'Marzec'
- 'Kwiecień'
- 'Maj'
- 'Czerwiec'
- 'Lipiec'
- 'Sierpień'
- 'Wrzesień'
- 'Październik'
- 'Listopad'
- 'Grudzień'
DAYS_OF_THE_WEEK:
- 'Poniedziałek'
- 'Wtorek'
- 'Środa'
- 'Czwartek'
- 'Piątek'
- 'Sobota'
- 'Niedziela'

View File

@@ -1,79 +1,37 @@
---
FRONTMATTER_ERROR_PAGE: |
---
título: %1$s
---
# Erro: Frontmatter inválida
Caminho: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_UNCOUNTABLE:
1: informação
2: arroz
3: dinheiro
INFLECTOR_IRREGULAR:
man: homens
sex: sexos
NICETIME:
NO_DATE_PROVIDED: Não foi fornecida data
BAD_DATE: Data inválida
AGO: atrás
FROM_NOW: a partir de agora
SECOND: segundo
MINUTE: minuto
HOUR: hora
DAY: dia
WEEK: semana
MONTH: mês
YEAR: ano
DECADE: década
SEC: seg
MIN: mín
HR: h
WK: sem
MO: m
YR: a
DEC: dec
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
DAY_PLURAL: dias
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: anos
DECADE_PLURAL: décadas
SEC_PLURAL: seg
MIN_PLURAL: mins
HR_PLURAL: hrs
WK_PLURAL: sems
YR_PLURAL: anos
FORM:
VALIDATION_FAIL: '<b>Validação falhada: </b>'
MISSING_REQUIRED_FIELD: 'Campo obrigatório ausente:'
MONTHS_OF_THE_YEAR:
- Janeiro
- Fevereiro
- Março
- Abril
- Maio
- Junho
- Julho
- Agosto
- Setembro
- Outubro
- Novembro
- Dezembro
DAYS_OF_THE_WEEK:
- Segunda
- Terça
- Quarta
- Quinta
- Sexta
- Sábado
- Domingo
GRAV:
NICETIME:
NO_DATE_PROVIDED: Nenhuma data fornecida
AGO: atrás
SECOND: segundo
MINUTE: minuto
HOUR: hora
DAY: dia
WEEK: semana
MONTH: mês
YEAR: ano
DECADE: década
SEC: segundos
MIN: minutos
MINUTE_PLURAL: minutos
DAY_PLURAL: dias
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: anos
DECADE_PLURAL: decadas
FORM:
VALIDATION_FAIL: <b>Falha na validação!</b>
MISSING_REQUIRED_FIELD: 'Campo obrigatório requerido:'
MONTHS_OF_THE_YEAR:
- 'Janeiro'
- 'Fevereiro'
- 'Março'
- 'Abril'
- 'Maio'
- 'Junho'
- 'Julho'
- 'Agosto'
- 'Setembro'
- 'Outubro'
- 'Novembro'
- 'Dezembro'

View File

@@ -1,101 +1,96 @@
---
FRONTMATTER_ERROR_PAGE: |
---
Titlu: %1$s
---
# Eroare: Frontmatter este invalid
Calea: `%2$s`
**%3$s**
```
%4$s
INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes'
/^(ox)$/i: '\1en'
"/([m|l])ouse$/i": '\1ice'
/(matr|vert|ind)ix|ex$/i: '\1ices'
/(x|ch|ss|sh)$/i: '\1es'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([^aeiouy]|qu)y$/i": '\1ies'
/(hive)$/i: '\1s'
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves'
/sis$/i: ses
"/([ti])um$/i": '\1a'
/(buffal|tomat)o$/i: '\1oes'
INFLECTOR_UNCOUNTABLE:
- echipament
- informaţie
- orez
- bani
- specii
- serii
- peşte
- oaie
INFLECTOR_IRREGULAR:
person: persoane
man: bărbați
child: copii
sex: sexe
move: mutări
NICETIME:
NO_DATE_PROVIDED: Nu există o dată prevăzută
BAD_DATE: Dată incorectă
AGO: în urmă
FROM_NOW: de acum
SECOND: secundă
MINUTE: minut
HOUR: oră
DAY: zi
WEEK: săptămână
MONTH: lună
YEAR: an
DECADE: decadă
SEC: sec
MIN: min
HR: oră
WK: săpt
MO: lună
YR: an
DEC: decadă
SECOND_PLURAL: secunde
MINUTE_PLURAL: minute
HOUR_PLURAL: ore
DAY_PLURAL: zile
WEEK_PLURAL: săptămâni
MONTH_PLURAL: luni
YEAR_PLURAL: ani
DECADE_PLURAL: decade
SEC_PLURAL: sec
MIN_PLURAL: min
HR_PLURAL: ore
WK_PLURAL: săpt
MO_PLURAL: luni
YR_PLURAL: ani
DEC_PLURAL: decenii
FORM:
VALIDATION_FAIL: '<b>Validare nereușită</b>'
INVALID_INPUT: Date incorecte în
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
MONTHS_OF_THE_YEAR:
- Ianuarie
- Februarie
- Martie
- Aprilie
- Mai
- Iunie
- Iulie
- August
- Septembrie
- Octombrie
- Noiembrie
- Decembrie
DAYS_OF_THE_WEEK:
- Luni
- Marți
- Miercuri
- Joi
- Vineri
- Sâmbătă
- Duminică
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nTitlu: %1$s\n---\n# Eroare: Frontmatter este invalid\n\nCalea: `%2$s`\n\n**%3$s**\n\n```\n%4$s"
INFLECTOR_UNCOUNTABLE:
- 'echipament'
- 'informaţie'
- 'orez'
- 'bani'
- 'specii'
- 'serii'
- 'peşte'
- 'oaie'
INFLECTOR_IRREGULAR:
'person': 'persoane'
'man': 'bărbați'
'child': 'copii'
'sex': 'sexe'
'move': 'mutări'
NICETIME:
NO_DATE_PROVIDED: Nu există o dată prevăzută
BAD_DATE: Dată incorectă
AGO: în urmă
FROM_NOW: de acum
JUST_NOW: chiar acum
SECOND: secundă
MINUTE: minut
HOUR: oră
DAY: zi
WEEK: săptămână
MONTH: lună
YEAR: an
DECADE: decadă
SEC: secunde
MIN: minute
HR: oră
WK: săpt
MO: lună
YR: an
DEC: decadă
SECOND_PLURAL: secunde
MINUTE_PLURAL: minute
HOUR_PLURAL: ore
DAY_PLURAL: zile
WEEK_PLURAL: săptămâni
MONTH_PLURAL: luni
YEAR_PLURAL: ani
DECADE_PLURAL: decade
SEC_PLURAL: sec
MIN_PLURAL: min
HR_PLURAL: ore
WK_PLURAL: săpt
MO_PLURAL: luni
YR_PLURAL: ani
DEC_PLURAL: decenii
FORM:
VALIDATION_FAIL: <b>Validare nereușită</b>
INVALID_INPUT: Date incorecte în
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
MONTHS_OF_THE_YEAR:
- 'Ianuarie'
- 'Februarie'
- 'Martie'
- 'Aprilie'
- 'Mai'
- 'Iunie'
- 'Iulie'
- 'August'
- 'Septembrie'
- 'Octombrie'
- 'Noiembrie'
- 'Decembrie'
DAYS_OF_THE_WEEK:
- 'Luni'
- 'Marți'
- 'Miercuri'
- 'Joi'
- 'Vineri'
- 'Sâmbătă'
- 'Duminică'
CRON:
EVERY: la fiecare
EVERY_HOUR: la fiecare oră
EVERY_MINUTE: la fiecare minut
EVERY_DAY_OF_WEEK: fiecare zi a săptămânii
EVERY_DAY_OF_MONTH: fiecare zi a lunii
EVERY_MONTH: fiecare lună
TEXT_PERIOD: Fiecare <b />
TEXT_MINS: ' la <b /> minut(e) ale fiecărei ore'
TEXT_TIME: ' la <b />:<b />'
TEXT_DOW: ' pe <b />'
TEXT_MONTH: 'al(e) <b />'
TEXT_DOM: ' pe <b />'
ERROR1: Eticheta %s nu este acceptată!
ERROR2: Număr nevalid de elemente
ERROR3: jquery_element ar trebui setat în opțiunile jqCron
ERROR4: Expresie necunoscută

View File

@@ -1,81 +1,101 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Ошибка: Недопустимое содержимое
Path: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_IRREGULAR:
person: люди
man: человек
child: ребенок
sex: пол
move: движется
NICETIME:
NO_DATE_PROVIDED: Дата не указана
BAD_DATE: Неверная дата
AGO: назад
FROM_NOW: теперь
SECOND: секунда
MINUTE: минута
HOUR: час
DAY: д
WEEK: неделя
MONTH: месяц
YEAR: год
DECADE: десятилетие
SEC: с
MIN: мин
HR: ч
WK: нед.
MO: мес.
YR: г.
DEC: гг.
SECOND_PLURAL: секунды
MINUTE_PLURAL: минуты
HOUR_PLURAL: часы
DAY_PLURAL: д
WEEK_PLURAL: недели
MONTH_PLURAL: месяцы
YEAR_PLURAL: годы
DECADE_PLURAL: десятилетия
SEC_PLURAL: с
MIN_PLURAL: мин
HR_PLURAL: ч
WK_PLURAL: нед
MO_PLURAL: мес
YR_PLURAL: г.
DEC_PLURAL: гг.
FORM:
VALIDATION_FAIL: '<b>Проверка не удалась:</b>'
INVALID_INPUT: Неверный ввод в
MISSING_REQUIRED_FIELD: 'Отсутствует необходимое поле:'
MONTHS_OF_THE_YEAR:
- Январь
- Февраль
- Март
- Апрель
- Май
- Июнь
- Июль
- Август
- Сентябрь
- Октябрь
- Ноябрь
- Декабрь
DAYS_OF_THE_WEEK:
- Понедельник
- Вторник
- Среда
- Четверг
- Пятница
- Суббота
- Воскресенье
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Ошибка: недопустимое содержимое Frontmatter\n\nПуть: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'экипировка'
- 'информация'
- 'рис'
- 'деньги'
- 'виды'
- 'серии'
- 'рыба'
- 'овца'
INFLECTOR_IRREGULAR:
'person': 'люди'
'man': 'человек'
'child': 'ребенок'
'sex': 'пол'
'move': 'движется'
INFLECTOR_ORDINALS:
'default': 'й'
'first': 'й'
'second': 'й'
'third': 'й'
NICETIME:
NO_DATE_PROVIDED: Дата не указана
BAD_DATE: Неверная дата
AGO: назад
FROM_NOW: теперь
JUST_NOW: только что
SECOND: секунда
MINUTE: минута
HOUR: час
DAY: день
WEEK: неделя
MONTH: месяц
YEAR: год
DECADE: десятилетие
SEC: сек
MIN: мин
HR: ч
WK: нед
MO: мес
YR: г
DEC: дстлт
SECOND_PLURAL: сек
MINUTE_PLURAL: мин
HOUR_PLURAL: ч
DAY_PLURAL: д
WEEK_PLURAL: нед
MONTH_PLURAL: мес
YEAR_PLURAL: г
DECADE_PLURAL: дстлт
SEC_PLURAL: сек
MIN_PLURAL: мин
HR_PLURAL: ч
WK_PLURAL: нед
MO_PLURAL: мес
YR_PLURAL: г
DEC_PLURAL: дстлт
FORM:
VALIDATION_FAIL: <b>Проверка не удалась:</b>
INVALID_INPUT: Неверный ввод в
MISSING_REQUIRED_FIELD: 'Отсутствует необходимое поле:'
MONTHS_OF_THE_YEAR:
- 'январь'
- 'февраль'
- 'март'
- 'апрель'
- 'май'
- 'июнь'
- 'Июль'
- 'Август'
- 'Сентябрь'
- 'Октябрь'
- 'Ноябрь'
- 'Декабрь'
DAYS_OF_THE_WEEK:
- 'понедельник'
- 'вторник'
- 'среда'
- 'четверг'
- 'пятница'
- 'суббота'
- 'воскресенье'
CRON:
EVERY: раз в
EVERY_HOUR: раз в час
EVERY_MINUTE: раз в минуту
EVERY_DAY_OF_WEEK: каждый день недели
EVERY_DAY_OF_MONTH: каждый день недели
EVERY_MONTH: раз в месяц
TEXT_PERIOD: Каждый <b />
TEXT_MINS: ' в <b /> минуте(ах) за час'
TEXT_TIME: ' в <b />:<b />'
TEXT_DOW: ' на <b />'
TEXT_MONTH: ' из <b />'
TEXT_DOM: ' на <b />'
ERROR1: Тег %s не поддерживается!
ERROR2: Неверное количество элементов
ERROR3: jquery_element должен быть установлен в настройки jqCron
ERROR4: Выражение не распознано

View File

@@ -1,42 +1,60 @@
---
NICETIME:
NO_DATE_PROVIDED: Neposkytnutý žiaden dátum
BAD_DATE: Nesprávny dátum
AGO: pred
FROM_NOW: odteraz
SECOND: sekunda
MINUTE: minúta
HOUR: hodina
DAY: deň
WEEK: týždeň
MONTH: mesiac
YEAR: rok
DECADE: desaťročie
SEC: sek
MIN: min
HR: hod
FORM:
VALIDATION_FAIL: '<b>Overenie zlyhalo:</b>'
INVALID_INPUT: Neplatný vstup v
MISSING_REQUIRED_FIELD: 'Chýba vyžadované pole:'
MONTHS_OF_THE_YEAR:
- Január
- Február
- Marec
- Apríl
- Máj
- Jún
- Júl
- August
- September
- Október
- November
- December
DAYS_OF_THE_WEEK:
- Pondelok
- Utorok
- Streda
- Štvrtok
- Piatok
- Sobota
- Nedeľa
GRAV:
NICETIME:
NO_DATE_PROVIDED: Neposkytnutý žiaden dátum
BAD_DATE: Nesprávny dátum
AGO: pred
FROM_NOW: odteraz
SECOND: sekunda
MINUTE: minúta
HOUR: hodina
DAY: deň
WEEK: týždeň
MONTH: mesiac
YEAR: rok
DECADE: desaťročie
SEC: sek
HR: hod
WK: t
MO: m
YR: r
SECOND_PLURAL: sekúnd
MINUTE_PLURAL: minút
HOUR_PLURAL: hodín
DAY_PLURAL: dní
WEEK_PLURAL: týždňov
MONTH_PLURAL: mesiacov
YEAR_PLURAL: rokov
DECADE_PLURAL: dekád
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: hod
WK_PLURAL: t
MO_PLURAL: mes.
YR_PLURAL: rokov
DEC_PLURAL: dekád
FORM:
VALIDATION_FAIL: <b>Overenie zlyhalo:</b>
INVALID_INPUT: Neplatný vstup v
MISSING_REQUIRED_FIELD: 'Chýba vyžadované pole:'
MONTHS_OF_THE_YEAR:
- 'Január'
- 'Február'
- 'Marec'
- 'Apríl'
- 'Máj'
- 'Jún'
- 'Júl'
- 'August'
- 'September'
- 'Október'
- 'November'
- 'December'
DAYS_OF_THE_WEEK:
- 'Pondelok'
- 'Utorok'
- 'Streda'
- 'Štvrtok'
- 'Piatok'
- 'Sobota'
- 'Nedeľa'

62
system/languages/sl.yaml Normal file
View File

@@ -0,0 +1,62 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Napaka: Neveljavna Frontmatter\n\nPath: `%2$s`\n\n**%3$s ** \n\n```\n%4$s \n```"
NICETIME:
NO_DATE_PROVIDED: Datum ni na voljo
BAD_DATE: Neveljaven datum
AGO: pred
FROM_NOW: od zdaj
SECOND: sekunda
MINUTE: minuta
HOUR: ura
DAY: dan
WEEK: teden
MONTH: mesec
YEAR: leto
DECADE: desetletje
SEC: sek
HR: ur
WK: T.
MO: m
YR: l
DEC: des
SECOND_PLURAL: sekund
MINUTE_PLURAL: minut
HOUR_PLURAL: ure
DAY_PLURAL: dnevi
WEEK_PLURAL: tednov
MONTH_PLURAL: mesecev
YEAR_PLURAL: leta
DECADE_PLURAL: desetletja
SEC_PLURAL: s
MIN_PLURAL: min
HR_PLURAL: ur
WK_PLURAL: t
MO_PLURAL: m
YR_PLURAL: l
DEC_PLURAL: des
FORM:
VALIDATION_FAIL: <b>Preverjanje veljavnosti ni uspelo:</b>
INVALID_INPUT: Neveljaven vnos v
MISSING_REQUIRED_FIELD: 'Manjka obvezno polje:'
MONTHS_OF_THE_YEAR:
- 'Januar'
- 'Februar'
- 'Marec'
- 'April'
- 'Maj'
- 'Junij'
- 'Julij'
- 'Avgust'
- 'September'
- 'Oktober'
- 'November'
- 'December'
DAYS_OF_THE_WEEK:
- 'Ponedeljek'
- 'Torek'
- 'Sreda'
- 'Četrtek'
- 'Petek'
- 'Sobota'
- 'Nedelja'

View File

@@ -1,62 +1,61 @@
---
FRONTMATTER_ERROR_PAGE: '--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```'
NICETIME:
NO_DATE_PROVIDED: Inget datum har angivits
BAD_DATE: Ogiltigt datum
AGO: sedan
FROM_NOW: från nu
SECOND: sekund
MINUTE: minut
HOUR: timme
DAY: dag
WEEK: vecka
MONTH: månad
YEAR: år
DECADE: årtionde
SEC: sek
MIN: min
HR: t
WK: v
MO: m
YR: år
DEC: dec
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minuter
HOUR_PLURAL: timmar
DAY_PLURAL: dagar
WEEK_PLURAL: veckor
MONTH_PLURAL: månader
YEAR_PLURAL: år
DECADE_PLURAL: årtionden
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: t
WK_PLURAL: v
MO_PLURAL: må
YR_PLURAL: år
DEC_PLURAL: dec
FORM:
VALIDATION_FAIL: '<b>Kontrollen misslyckades:</b>'
INVALID_INPUT: Ogiltig indata i
MISSING_REQUIRED_FIELD: 'Obligatoriskt fält måste fyllas i:'
MONTHS_OF_THE_YEAR:
- Januari
- Februrari
- Mars
- April
- Maj
- Juni
- Juli
- Augusti
- September
- Oktober
- November
- December
DAYS_OF_THE_WEEK:
- Måndag
- Tisdag
- Onsdag
- Torsdag
- Fredag
- Lördag
- Söndag
GRAV:
FRONTMATTER_ERROR_PAGE: "--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```"
NICETIME:
NO_DATE_PROVIDED: Inget datum har angivits
BAD_DATE: Ogiltigt datum
AGO: sedan
FROM_NOW: fr.o.m nu
SECOND: sekund
MINUTE: minut
HOUR: timme
DAY: dag
WEEK: vecka
MONTH: månad
YEAR: år
DECADE: årtionde
SEC: sek
HR: t
WK: v
MO: m
YR: år
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minuter
HOUR_PLURAL: timmar
DAY_PLURAL: dagar
WEEK_PLURAL: veckor
MONTH_PLURAL: månader
YEAR_PLURAL: år
DECADE_PLURAL: årtionden
SEC_PLURAL: sek
MIN_PLURAL: min
HR_PLURAL: t
WK_PLURAL: v
MO_PLURAL:
YR_PLURAL: år
DEC_PLURAL: dec
FORM:
VALIDATION_FAIL: <b>Kontrollen misslyckades:</b>
INVALID_INPUT: Ogiltig indata i
MISSING_REQUIRED_FIELD: 'Obligatoriskt fält måste fyllas i:'
MONTHS_OF_THE_YEAR:
- 'Januari'
- 'Februari'
- 'Mars'
- 'April'
- 'Maj'
- 'Juni'
- 'Juli'
- 'Augusti'
- 'September'
- 'Oktober'
- 'November'
- 'December'
DAYS_OF_THE_WEEK:
- 'Måndag'
- 'Tisdag'
- 'Onsdag'
- 'Torsdag'
- 'Fredag'
- 'Lördag'
- 'Söndag'

View File

@@ -1,75 +1,56 @@
---
FRONTMATTER_ERROR_PAGE: |
---
ชื่อเรื่อง: %1$s
---
# ข้อผิดพลาด: Invalid Frontmatter
Path: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: ไม่มีวันที่ให้
BAD_DATE: รูปแบบวันที่ผิด
AGO: ที่ผ่านมา
FROM_NOW: จากตอนนี้
SECOND: วินาที
MINUTE: นาที
HOUR: ชั่วโมง
DAY: วัน
WEEK: สัปดาห์
MONTH: เดือน
YEAR: ปี
DECADE: ทศวรรษที่ผ่านมา
SEC: วิ
MIN: นาที
HR: ชม.
WK: wk
MO: mo
YR: yr
DEC: dec
SECOND_PLURAL: วินาที
MINUTE_PLURAL: นาที
HOUR_PLURAL: ชั่วโมง
DAY_PLURAL: วัน
WEEK_PLURAL: สัปดาห์
MONTH_PLURAL: เดือน
YEAR_PLURAL: ปี
DECADE_PLURAL: ทศวรรษที่ผ่านมา
SEC_PLURAL: วินาที
MIN_PLURAL: นาที
HR_PLURAL: ชั่วโมง
WK_PLURAL: wks
MO_PLURAL: mos
YR_PLURAL: ปี
DEC_PLURAL: decs
FORM:
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
MONTHS_OF_THE_YEAR:
- มกราคม
- กุมภาพันธ์
- มีนาคม
- เมษายน
- พฤษภาคม
- มิถุนายน
- กรกฏาคม
- สิงหาคม
- กันยายน
- ตุลาคม
- พฤศจิกายน
- ธันวาคม
DAYS_OF_THE_WEEK:
- จันทร์
- อังคาร
- พุธ
- พฤหัสบดี
- ศุกร์
- เสาร์
- อาทิตย์
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nชื่อเรื่อง: %1$s\n---\n\n# ข้อผิดพลาด: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: ไม่มีวันที่ให้
BAD_DATE: รูปแบบวันที่ผิด
AGO: ที่ผ่านมา
FROM_NOW: จากตอนนี้
SECOND: วินาที
MINUTE: นาที
HOUR: ชั่วโมง
DAY: วัน
WEEK: สัปดาห์
MONTH: เดือน
YEAR: ปี
DECADE: ทศวรรษที่ผ่านมา
SEC: วิ
MIN: นาที
HR: ชม.
SECOND_PLURAL: วินาที
MINUTE_PLURAL: นาที
HOUR_PLURAL: ชั่วโมง
DAY_PLURAL: วัน
WEEK_PLURAL: สัปดาห์
MONTH_PLURAL: เดือน
YEAR_PLURAL: ปี
DECADE_PLURAL: ทศวรรษที่ผ่านมา
SEC_PLURAL: วินาที
MIN_PLURAL: นาที
HR_PLURAL: ชั่วโมง
YR_PLURAL: ปี
FORM:
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
MONTHS_OF_THE_YEAR:
- 'มกราคม'
- 'กุมภาพันธ์'
- 'มีนาคม'
- 'เมษายน'
- 'พฤษภาคม'
- 'มิถุนายน'
- 'กรกฏาคม'
- 'สิงหาคม'
- 'กันยายน'
- 'ตุลาคม'
- 'พฤศจิกายน'
- 'ธันวาคม'
DAYS_OF_THE_WEEK:
- 'จันทร์'
- 'อังคาร'
- 'พุธ'
- 'พฤหัสบดี'
- 'ศุกร์'
- 'เสาร์'
- 'อาทิตย์'

View File

@@ -1,59 +1,63 @@
---
NICETIME:
NO_DATE_PROVIDED: Tarih yok
BAD_DATE: Yanlış tarih
AGO: önce
FROM_NOW: (şimdiden)
SECOND: saniye
MINUTE: dakika
HOUR: saat
DAY: gün
WEEK: hafta
MONTH: ay
YEAR: yıl
DECADE: onyıl
SEC: sn
MIN: dk
HR: sa
WK: hft
MO: ay
YR: yl
DEC: onyl
SECOND_PLURAL: saniye
MINUTE_PLURAL: dakika
HOUR_PLURAL: saat
DAY_PLURAL: gün
WEEK_PLURAL: hafta
MONTH_PLURAL: ay
YEAR_PLURAL: yıl
DECADE_PLURAL: onyıl
SEC_PLURAL: sn
MIN_PLURAL: dk
HR_PLURAL: sa
WK_PLURAL: hft
MO_PLURAL: ay
YR_PLURAL: yl
DEC_PLURAL: onyl
FORM:
VALIDATION_FAIL: '<b>Doğrulama başarısız:</b>'
MONTHS_OF_THE_YEAR:
- Ocak
- Şubat
- Mart
- Nisan
- Mayıs
- Haziran
- Temmuz
- Ağustos
- Eylül
- Ekim
- Kasım
- Aralık
DAYS_OF_THE_WEEK:
- Pazartesi
- Salı
- Çarşamba
- Perşembe
- Cuma
- Cumartesi
- Pazar
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nBaşlık: %1$s\n---\n\n# Hata: Geçersiz Önbölüm\n\nYol: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Sağlanan tarih yok
BAD_DATE: Yanlış tarih
AGO: önce
FROM_NOW: şu andan itibaren
SECOND: saniye
MINUTE: dakika
HOUR: saat
DAY: gün
WEEK: hafta
MONTH: ay
YEAR: yıl
DECADE: onyıl
SEC: sn
MIN: dk
HR: sa
WK: hft
MO: ay
YR: yl
DEC: onyl
SECOND_PLURAL: saniye
MINUTE_PLURAL: dakika
HOUR_PLURAL: saat
DAY_PLURAL: gün
WEEK_PLURAL: hafta
MONTH_PLURAL: ay
YEAR_PLURAL: yıl
DECADE_PLURAL: onyıl
SEC_PLURAL: sn
MIN_PLURAL: dk
HR_PLURAL: sa
WK_PLURAL: hft
MO_PLURAL: ay
YR_PLURAL: yıl
DEC_PLURAL: onyl
FORM:
VALIDATION_FAIL: <b>Doğrulama başarısız:</b>
INVALID_INPUT: Geçersiz bilgi girişi
MISSING_REQUIRED_FIELD: 'Gerekli alan eksik:'
MONTHS_OF_THE_YEAR:
- 'Ocak'
- 'Şubat'
- 'Mart'
- 'Nisan'
- 'Mayıs'
- 'Haziran'
- 'Temmuz'
- 'Ağustos'
- 'Eylül'
- 'Ekim'
- 'Kasım'
- 'Aralık'
DAYS_OF_THE_WEEK:
- 'Pazartesi'
- 'Salı'
- 'Çarşamba'
- 'Perşembe'
- 'Cuma'
- 'Cumartesi'
- 'Pazar'

View File

@@ -1,75 +1,63 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Помилка: Недопустимий вміст
Path: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: Не вказана дата
BAD_DATE: Невірна дата
AGO: назад
FROM_NOW: відтепер
SECOND: секунда
MINUTE: хвилина
HOUR: година
DAY: день
WEEK: тиждень
MONTH: місяць
YEAR: рік
DECADE: десятиріччя
SEC: с
MIN: хв
HR: год
WK: тиж.
MO: міс.
YR: р.
DEC: рр.
SECOND_PLURAL: секунди
MINUTE_PLURAL: хвилини
HOUR_PLURAL: години
DAY_PLURAL: дні
WEEK_PLURAL: тижні
MONTH_PLURAL: місяці
YEAR_PLURAL: роки
DECADE_PLURAL: десятиріччя
SEC_PLURAL: с
MIN_PLURAL: хв
HR_PLURAL: год
WK_PLURAL: тиж.
MO_PLURAL: міс.
YR_PLURAL: рр.
DEC_PLURAL: рр.
FORM:
VALIDATION_FAIL: '<b>Перевірка не вдалася:</b>'
INVALID_INPUT: Невірне введення в
MISSING_REQUIRED_FIELD: 'Відсутнє необхідне поле:'
MONTHS_OF_THE_YEAR:
- Січень
- Лютий
- Березень
- Квітень
- Травень
- Червень
- Липень
- Серпень
- Вересень
- Жовтень
- Листопад
- Грудень
DAYS_OF_THE_WEEK:
- Понеділок
- Вівторок
- Середа
- Четвер
- "П'ятниця"
- Субота
- Неділя
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Помилка: Недопустимий вміст\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Не вказана дата
BAD_DATE: Невірна дата
AGO: назад
FROM_NOW: відтепер
SECOND: секунда
MINUTE: хвилина
HOUR: година
DAY: день
WEEK: тиждень
MONTH: місяць
YEAR: рік
DECADE: десятиріччя
SEC: с
MIN: хв
HR: год
WK: тиж.
MO: міс.
YR: р.
DEC: рр.
SECOND_PLURAL: секунди
MINUTE_PLURAL: хвилини
HOUR_PLURAL: години
DAY_PLURAL: дні
WEEK_PLURAL: тижні
MONTH_PLURAL: місяці
YEAR_PLURAL: роки
DECADE_PLURAL: десятиріччя
SEC_PLURAL: с
MIN_PLURAL: хв
HR_PLURAL: год
WK_PLURAL: тиж.
MO_PLURAL: міс.
YR_PLURAL: рр.
DEC_PLURAL: рр.
FORM:
VALIDATION_FAIL: <b>Перевірка не вдалася:</b>
INVALID_INPUT: Невірне введення в
MISSING_REQUIRED_FIELD: 'Відсутнє обов''язкове поле:'
MONTHS_OF_THE_YEAR:
- 'Січень'
- 'Лютий'
- 'Березень'
- 'Квітень'
- 'Травень'
- 'Червень'
- 'Липень'
- 'Серпень'
- 'Вересень'
- 'Жовтень'
- 'Листопад'
- 'Грудень'
DAYS_OF_THE_WEEK:
- 'Понеділок'
- 'Вівторок'
- 'Середа'
- 'Четвер'
- 'П''ятниця'
- 'Субота'
- 'Неділя'

View File

@@ -1,75 +1,63 @@
---
FRONTMATTER_ERROR_PAGE: |
---
title: %1$s
---
# Error: Invalid Frontmatter
Path: `%2$s`
**%3$s**
```
%4$s
```
NICETIME:
NO_DATE_PROVIDED: Không có ngày được cung cấp
BAD_DATE: Ngày không hợp lệ
AGO: cách đây
FROM_NOW: từ bây giờ
SECOND: giây
MINUTE: phút
HOUR: giờ
DAY: ngày
WEEK: tuần
MONTH: tháng
YEAR: năm
DECADE: thập kỷ
SEC: giây
MIN: phút
HR: giờ
WK: tuần
MO: tháng
YR: năm
DEC: thập kỷ
SECOND_PLURAL: giây
MINUTE_PLURAL: phút
HOUR_PLURAL: giờ
DAY_PLURAL: ngày
WEEK_PLURAL: tuần
MONTH_PLURAL: tháng
YEAR_PLURAL: năm
DECADE_PLURAL: thập kỷ
SEC_PLURAL: giây
MIN_PLURAL: phút
HR_PLURAL: giờ
WK_PLURAL: tuần
MO_PLURAL: tháng
YR_PLURAL: năm
DEC_PLURAL: thập kỷ
FORM:
VALIDATION_FAIL: '<b>Xác nhận thất bại:</b>'
INVALID_INPUT: Dữ liệu nhập không hợp lệ cho
MISSING_REQUIRED_FIELD: 'Thiếu trường bắt buộc:'
MONTHS_OF_THE_YEAR:
- Tháng 1
- Tháng 2
- Tháng 3
- Tháng 4
- Tháng 5
- Tháng 6
- Tháng 7
- Tháng 8
- Tháng 9
- Tháng 10
- Tháng Mười 11
- Tháng 12
DAYS_OF_THE_WEEK:
- Thứ 2
- Thứ 3
- Thứ 4
- Thứ 5
- Thứ 6
- Thứ 7
- Chủ Nhật
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntiêu đề: %1$s\n---\n\n# Error: Trang không hợp lệ\n\nĐường dẫn: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: Không có ngày được cung cấp
BAD_DATE: Ngày không hợp lệ
AGO: cách đây
FROM_NOW: từ bây giờ
SECOND: giây
MINUTE: phút
HOUR: giờ
DAY: ngày
WEEK: tuần
MONTH: tháng
YEAR: năm
DECADE: thập kỷ
SEC: giây
MIN: phút
HR: giờ
WK: tuần
MO: tháng
YR: năm
DEC: thập kỷ
SECOND_PLURAL: giây
MINUTE_PLURAL: phút
HOUR_PLURAL: giờ
DAY_PLURAL: ngày
WEEK_PLURAL: tuần
MONTH_PLURAL: tháng
YEAR_PLURAL: năm
DECADE_PLURAL: thập kỷ
SEC_PLURAL: giây
MIN_PLURAL: phút
HR_PLURAL: giờ
WK_PLURAL: tuần
MO_PLURAL: tháng
YR_PLURAL: năm
DEC_PLURAL: thập kỷ
FORM:
VALIDATION_FAIL: <b>Xác nhận thất bại:</b>
INVALID_INPUT: Dữ liệu nhập không hợp lệ cho
MISSING_REQUIRED_FIELD: 'Thiếu trường bắt buộc:'
MONTHS_OF_THE_YEAR:
- 'Tháng 1'
- 'Tháng 2'
- 'Tháng 3'
- 'Tháng 4'
- 'Tháng 5'
- 'Tháng 6'
- 'Tháng 7'
- 'Tháng 8'
- 'Tháng 9'
- 'Tháng 10'
- 'Tháng 11'
- 'Tháng 12'
DAYS_OF_THE_WEEK:
- 'Thứ 2'
- 'Thứ 3'
- 'Thứ 4'
- 'Thứ 5'
- 'Thứ 6'
- 'Thứ 7'
- 'Chủ Nhật'

View File

@@ -0,0 +1,42 @@
---
GRAV:
NICETIME:
SECOND:
MINUTE:
HOUR: 小時
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL:
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL:
YEAR_PLURAL:
DECADE_PLURAL: 十年
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL:
WK_PLURAL:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 十年
MONTHS_OF_THE_YEAR:
- '一月'
- '二月'
- '三月'
- '四月'
- '五月'
- '六月'
- '七月'
- '八月'
- '九月'
- '十月'
- '十一月'
- '十二月'
DAYS_OF_THE_WEEK:
- '星期一'
- '星期二'
- '星期三'
- '星期四'
- '星期五'
- '星期六'
- '星期日'

63
system/languages/zh.yaml Normal file
View File

@@ -0,0 +1,63 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# 錯誤: 不正確的 Frontmatter\n\n路徑 `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: 沒有提供日期
BAD_DATE: 錯誤日期
AGO: 之前
FROM_NOW: 之後
JUST_NOW: 剛剛
SECOND:
MINUTE:
HOUR: 小時
DAY:
WEEK:
MONTH:
YEAR:
DECADE: 十年
SEC:
MIN:
HR: 小時
WK:
MO:
YR:
DEC: 十年
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL: 小時
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL:
YEAR_PLURAL:
DECADE_PLURAL: 十年
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL:
WK_PLURAL:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 十年
FORM:
MISSING_REQUIRED_FIELD: 遺漏必填欄位:
MONTHS_OF_THE_YEAR:
- '一月'
- '二月'
- '三月'
- '四月'
- '五月'
- '六月'
- '七月'
- '八月'
- '九月'
- '十月'
- '十一月'
- '十二月'
DAYS_OF_THE_WEEK:
- '星期一'
- '星期二'
- '星期三'
- '星期四'
- '星期五'
- '星期六'
- '星期日'

View File

@@ -1,13 +1,14 @@
<?php
/**
* @package Grav.Core
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
if (PHP_SAPI !== 'cli-server') {
exit('This script cannot be run from browser. Run it from a CLI.');
die('This script cannot be run from browser. Run it from a CLI.');
}
$_SERVER['PHP_CLI_ROUTER'] = true;
@@ -21,6 +22,6 @@ $_SERVER['SCRIPT_FILENAME'] = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR .
$_SERVER['SCRIPT_NAME'] = DIRECTORY_SEPARATOR . 'index.php';
$_SERVER['PHP_SELF'] = DIRECTORY_SEPARATOR . 'index.php';
require 'index.php';
error_log(sprintf('%s:%d [%d]: %s', $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], http_response_code(), $_SERVER['REQUEST_URI']), 4);
require 'index.php';

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,178 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets\Traits\AssetUtilsTrait;
use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject;
abstract class BaseAsset extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
/** @const Regex to match CSS import content */
protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
protected $asset;
protected $asset_type;
protected $order;
protected $group;
protected $position;
protected $priority;
protected $attributes = [];
protected $timestamp;
protected $modified;
protected $remote;
protected $query = '';
// Private Bits
private $base_url;
private $fetch_command;
private $css_rewrite = false;
private $css_minify = false;
abstract function render();
public function __construct(array $elements = [], $key = null)
{
$base_config = [
'group' => 'head',
'position' => 'pipeline',
'priority' => 10,
'modified' => null,
'asset' => null
];
// Merge base defaults
$elements = array_merge($base_config, $elements);
parent::__construct($elements, $key);
}
public function init($asset, $options)
{
$config = Grav::instance()['config'];
$uri = Grav::instance()['uri'];
// set attributes
foreach ($options as $key => $value) {
if ($this->hasProperty($key)) {
$this->setProperty($key, $value);
} else {
$this->attributes[$key] = $value;
}
}
// Do some special stuff for CSS/JS (not inline)
if (!Utils::startsWith($this->getType(), 'inline')) {
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
$this->remote = static::isRemoteLink($asset);
// Move this to render?
if (!$this->remote) {
$asset_parts = parse_url($asset);
if (isset($asset_parts['query'])) {
$this->query = $asset_parts['query'];
unset($asset_parts['query']);
$asset = Uri::buildUrl($asset_parts);
}
$locator = Grav::instance()['locator'];
if ($locator->isStream($asset)) {
$path = $locator->findResource($asset, true);
} else {
$path = GRAV_ROOT . $asset;
}
// If local file is missing return
if ($path === false) {
return false;
}
$file = new \SplFileInfo($path);
$asset = $this->buildLocalLink($file->getPathname());
$this->modified = $file->isFile() ? $file->getMTime() : false;
}
}
$this->asset = $asset;
return $this;
}
public function getAsset()
{
return $this->asset;
}
public function getRemote()
{
return $this->remote;
}
/**
*
* Get the last modification time of asset
*
* @param string $asset the asset string reference
*
* @return string the last modifcation time or false on error
*/
// protected function getLastModificationTime($asset)
// {
// $file = GRAV_ROOT . $asset;
// if (Grav::instance()['locator']->isStream($asset)) {
// $file = $this->buildLocalLink($asset, true);
// }
//
// return file_exists($file) ? filemtime($file) : false;
// }
/**
*
* Build local links including grav asset shortcodes
*
* @param string $asset the asset string reference
* @param bool $absolute build absolute asset link
*
* @return string the final link url to the asset
*/
protected function buildLocalLink($asset)
{
if ($asset) {
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_ROOT, '', $asset), '/');
}
return false;
}
/**
* Implements JsonSerializable interface.
*
* @return array
*/
public function jsonSerialize()
{
return ['type' => $this->getType(), 'elements' => $this->getElements()];
}
}

View File

@@ -0,0 +1,40 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
class Css extends BaseAsset
{
public function __construct(array $elements = [], $key = null)
{
$base_options = [
'asset_type' => 'css',
'attributes' => [
'type' => 'text/css',
'rel' => 'stylesheet'
]
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
public function render()
{
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
$buffer = $this->gatherLinks( [$this], self::CSS_ASSET);
return "<style>\n" . trim($buffer) . "\n</style>\n";
}
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
}
}

View File

@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
class InlineCss extends BaseAsset
{
public function __construct(array $elements = [], $key = null)
{
$base_options = [
'asset_type' => 'css',
'position' => 'after'
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
public function render()
{
return '<style' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</style>\n";
}
}

View File

@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
class InlineJs extends BaseAsset
{
public function __construct(array $elements = [], $key = null)
{
$base_options = [
'asset_type' => 'js',
'position' => 'after'
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
public function render()
{
return '<script' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</script>\n";
}
}

View File

@@ -0,0 +1,36 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
class Js extends BaseAsset
{
public function __construct(array $elements = [], $key = null)
{
$base_options = [
'asset_type' => 'js',
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
public function render()
{
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
$buffer = $this->gatherLinks( [$this], self::JS_ASSET);
return '<script' . $this->renderAttributes() . ">\n" . trim($buffer) . "\n</script>\n";
}
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
}
}

View File

@@ -0,0 +1,284 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets\Traits\AssetUtilsTrait;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Pipeline extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
/** @const Regex to match CSS urls */
protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}';
/** @const Regex to match CSS sourcemap comments */
protected const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}';
/** @const Regex to match CSS import content */
protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
protected $css_minify;
protected $css_minify_windows;
protected $css_rewrite;
protected $js_minify;
protected $js_minify_windows;
protected $base_url;
protected $assets_dir;
protected $assets_url;
protected $timestamp;
protected $attributes;
protected $query;
protected $asset;
protected $css_pipeline_include_externals;
protected $js_pipeline_include_externals;
/**
* Closure used by the pipeline to fetch assets.
*
* Useful when file_get_contents() function is not available in your PHP
* installation or when you want to apply any kind of preprocessing to
* your assets before they get pipelined.
*
* The closure will receive as the only parameter a string with the path/URL of the asset and
* it should return the content of the asset file as a string.
*
* @var \Closure
*/
protected $fetch_command;
public function __construct(array $elements = [], ?string $key = null)
{
parent::__construct($elements, $key);
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
/** @var Config $config */
$config = Grav::instance()['config'];
/** @var Uri $uri */
$uri = Grav::instance()['uri'];
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
$this->assets_dir = $locator->findResource('asset://') . DS;
$this->assets_url = $locator->findResource('asset://', false);
}
/**
* Minify and concatenate CSS
*
* @param array $assets
* @param string $group
* @param array $attributes
* @param array $no_pipeline
*
* @return bool|string URL or generated content if available, else false
*/
public function renderCss($assets, $group, $attributes = [], &$no_pipeline = [])
{
// temporary list of assets to pipeline
$inline_group = false;
if (array_key_exists('loading', $attributes) && $attributes['loading'] === 'inline') {
$inline_group = true;
unset($attributes['loading']);
}
// Store Attributes
$this->attributes = array_merge(['type' => 'text/css', 'rel' => 'stylesheet'], $attributes);
// Compute uid based on assets and timestamp
$json_assets = json_encode($assets);
$uid = md5($json_assets . $this->css_minify . $this->css_rewrite . $group);
$file = $uid . '.css';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
} else {
foreach ($assets as $id => $asset) {
if ($this->css_pipeline_include_externals === false && $asset->getRemote()) {
$no_pipeline[$id] = $asset;
unset($assets[$id]);
}
}
//if nothing found get out of here!
if (empty($assets) && empty($no_pipeline)) {
return false;
}
// Concatenate files
$buffer = $this->gatherLinks($assets, self::CSS_ASSET, $no_pipeline);
// Minify if required
if ($this->shouldMinify('css')) {
$minifier = new \MatthiasMullie\Minify\CSS();
$minifier->add($buffer);
$buffer = $minifier->minify();
}
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
}
}
if ($inline_group) {
$output = "<style>\n" . $buffer . "\n</style>\n";
} else {
$this->asset = $relative_path;
$output = '<link href="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
}
return $output;
}
/**
* Minify and concatenate JS files.
*
* @param array $assets
* @param string $group
* @param array $attributes
* @param array $no_pipeline
*
* @return bool|string URL or generated content if available, else false
*/
public function renderJs($assets, $group, $attributes = [], &$no_pipeline = [])
{
// temporary list of assets to pipeline
$inline_group = false;
if (array_key_exists('loading', $attributes) && $attributes['loading'] === 'inline') {
$inline_group = true;
unset($attributes['loading']);
}
// Store Attributes
$this->attributes = $attributes;
// Compute uid based on assets and timestamp
$json_assets = json_encode($assets);
$uid = md5($json_assets . $this->js_minify . $group);
$file = $uid . '.js';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
} else {
foreach ($assets as $id => $asset) {
if ($this->js_pipeline_include_externals === false && $asset->getRemote()) {
$no_pipeline[$id] = $asset;
unset($assets[$id]);
}
}
//if nothing found get out of here!
if (empty($assets) && empty($no_pipeline)) {
return false;
}
// Concatenate files
$buffer = $this->gatherLinks($assets, self::JS_ASSET, $no_pipeline);
// Minify if required
if ($this->shouldMinify('js')) {
$minifier = new \MatthiasMullie\Minify\JS();
$minifier->add($buffer);
$buffer = $minifier->minify();
}
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
}
}
if ($inline_group) {
$output = '<script' . $this->renderAttributes(). ">\n" . $buffer . "\n</script>\n";
} else {
$this->asset = $relative_path;
$output = '<script src="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
}
return $output;
}
/**
* Finds relative CSS urls() and rewrites the URL with an absolute one
*
* @param string $file the css source file
* @param string $dir , $local relative path to the css file
* @param boolean $local is this a local or remote asset
*
* @return mixed
*/
protected function cssRewrite($file, $dir, $local)
{
// Strip any sourcemap comments
$file = preg_replace(self::CSS_SOURCEMAP_REGEX, '', $file);
// Find any css url() elements, grab the URLs and calculate an absolute path
// Then replace the old url with the new one
$file = (string)preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($dir, $local) {
$old_url = $matches[2];
// Ensure link is not rooted to web server, a data URL, or to a remote host
if (Utils::startsWith($old_url, '/') || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) {
return $matches[0];
}
$new_url = ($local ? $this->base_url: '') . ltrim(Utils::normalizePath($dir . '/' . $old_url), '/');
return str_replace($old_url, $new_url, $matches[0]);
}, $file);
return $file;
}
private function shouldMinify($type = 'css')
{
$check = $type . '_minify';
$win_check = $type . '_minify_windows';
$minify = (bool) $this->$check;
// If this is a Windows server, and minify_windows is false (default value) skip the
// minification process because it will cause Apache to die/crash due to insufficient
// ThreadStackSize in httpd.conf - See: https://bugs.php.net/bug.php?id=47689
if (stripos(php_uname('s'), 'WIN') === 0 && !$this->{$win_check}) {
$minify = false;
}
return $minify;
}
}

View File

@@ -0,0 +1,186 @@
<?php
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets\Traits;
use Grav\Common\Grav;
use Grav\Common\Utils;
trait AssetUtilsTrait
{
/**
* Determine whether a link is local or remote.
* Understands both "http://" and "https://" as well as protocol agnostic links "//"
*
* @param string $link
* @return bool
*/
public static function isRemoteLink($link)
{
$base = Grav::instance()['uri']->rootUrl(true);
// Sanity check for local URLs with absolute URL's enabled
if (Utils::startsWith($link, $base)) {
return false;
}
return (0 === strpos($link, 'http://') || 0 === strpos($link, 'https://') || 0 === strpos($link, '//'));
}
/**
* Download and concatenate the content of several links.
*
* @param array $assets
* @param bool $css
* @param array $no_pipeline
*
* @return string
*/
protected function gatherLinks(array $assets, $css = true, &$no_pipeline = [])
{
$buffer = '';
foreach ($assets as $id => $asset) {
$local = true;
$link = $asset->getAsset();
$relative_path = $link;
if (static::isRemoteLink($link)) {
$local = false;
if (0 === strpos($link, '//')) {
$link = 'http:' . $link;
}
$relative_dir = \dirname($relative_path);
} else {
// Fix to remove relative dir if grav is in one
if (($this->base_url !== '/') && Utils::startsWith($relative_path, $this->base_url)) {
$base_url = '#' . preg_quote($this->base_url, '#') . '#';
$relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/');
}
$relative_dir = \dirname($relative_path);
$link = ROOT_DIR . $relative_path;
}
$file = ($this->fetch_command instanceof \Closure) ? @$this->fetch_command->__invoke($link) : @file_get_contents($link);
// No file found, skip it...
if ($file === false) {
if (!$local) { // Assume we couldn't download this file for some reason assume it's not pipeline compatible
$no_pipeline[$id] = $asset;
}
continue;
}
// Double check last character being
if (!$css) {
$file = rtrim($file, ' ;') . ';';
}
// If this is CSS + the file is local + rewrite enabled
if ($css && $this->css_rewrite) {
$file = $this->cssRewrite($file, $relative_dir, $local);
}
$file = rtrim($file) . PHP_EOL;
$buffer .= $file;
}
// Pull out @imports and move to top
if ($css) {
$buffer = $this->moveImports($buffer);
}
return $buffer;
}
/**
* Moves @import statements to the top of the file per the CSS specification
*
* @param string $file the file containing the combined CSS files
*
* @return string the modified file with any @imports at the top of the file
*/
protected function moveImports($file)
{
$imports = [];
$file = (string)preg_replace_callback(self::CSS_IMPORT_REGEX, function ($matches) {
$imports[] = $matches[0];
return '';
}, $file);
return implode("\n", $imports) . "\n\n" . $file;
}
/**
*
* Build an HTML attribute string from an array.
*
* @return string
*/
protected function renderAttributes()
{
$html = '';
$no_key = ['loading'];
foreach ($this->attributes as $key => $value) {
if (is_numeric($key)) {
$key = $value;
}
if (\is_array($value)) {
$value = implode(' ', $value);
}
if (\in_array($key, $no_key, true)) {
$element = htmlentities($value, ENT_QUOTES, 'UTF-8', false);
} else {
$element = $key . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"';
}
$html .= ' ' . $element;
}
return $html;
}
/**
* Render Querystring
*
* @param string $asset
* @return string
*/
protected function renderQueryString($asset = null)
{
$querystring = '';
$asset = $asset ?? $this->asset;
if (!empty($this->query)) {
if (Utils::contains($asset, '?')) {
$querystring .= '&' . $this->query;
} else {
$querystring .= '?' . $this->query;
}
}
if ($this->timestamp) {
if (Utils::contains($asset, '?') || $querystring) {
$querystring .= '&' . $this->timestamp;
} else {
$querystring .= '?' . $this->timestamp;
}
}
return $querystring;
}
}

View File

@@ -0,0 +1,111 @@
<?php
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets\Traits;
use Grav\Common\Assets;
trait LegacyAssetsTrait
{
protected function unifyLegacyArguments($args, $type = Assets::CSS_TYPE)
{
// First argument is always the asset
array_shift($args);
if (\count($args) === 0) {
return [];
}
if (\count($args) === 1 && \is_array($args[0])) {
return $args[0];
}
switch ($type) {
case(Assets::INLINE_CSS_TYPE):
$defaults = ['priority' => null, 'group' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
break;
case(Assets::JS_TYPE):
$defaults = ['priority' => null, 'pipeline' => true, 'loading' => null, 'group' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
break;
case(Assets::INLINE_JS_TYPE):
$defaults = ['priority' => null, 'group' => null, 'attributes' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
// special case to handle old attributes being passed in
if (isset($arguments['attributes'])) {
$old_attributes = $arguments['attributes'];
$arguments = array_merge($arguments, $old_attributes);
}
unset($arguments['attributes']);
break;
default:
case(Assets::CSS_TYPE):
$defaults = ['priority' => null, 'pipeline' => true, 'group' => null, 'loading' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
}
return $arguments;
}
protected function createArgumentsFromLegacy(array $args, array $defaults)
{
// Remove arguments with old default values.
$arguments = [];
foreach ($args as $arg) {
$default = current($defaults);
if ($arg !== $default) {
$arguments[key($defaults)] = $arg;
}
next($defaults);
}
return $arguments;
}
/**
* Convenience wrapper for async loading of JavaScript
*
* @param $asset
* @param int $priority
* @param bool $pipeline
* @param string $group name of the group
*
* @deprecated Please use dynamic method with ['loading' => 'async']
*
* @return \Grav\Common\Assets
*/
public function addAsyncJs($asset, $priority = 10, $pipeline = true, $group = 'head')
{
return $this->addJs($asset, $priority, $pipeline, 'async', $group);
}
/**
* Convenience wrapper for deferred loading of JavaScript
*
* @param $asset
* @param int $priority
* @param bool $pipeline
* @param string $group name of the group
*
* @deprecated Please use dynamic method with ['loading' => 'defer']
*
* @return \Grav\Common\Assets
*/
public function addDeferJs($asset, $priority = 10, $pipeline = true, $group = 'head')
{
return $this->addJs($asset, $priority, $pipeline, 'defer', $group);
}
}

View File

@@ -0,0 +1,343 @@
<?php
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets\Traits;
use Grav\Common\Grav;
trait TestingAssetsTrait
{
/**
* Determines if an asset exists as a collection, CSS or JS reference
*
* @param $asset
*
* @return bool
*/
public function exists($asset)
{
return isset($this->collections[$asset]) || isset($this->assets_css[$asset]) || isset($this->assets_js[$asset]);
}
/**
* Return the array of all the registered collections
*
* @return array
*/
public function getCollections()
{
return $this->collections;
}
/**
* Set the array of collections explicitly
*
* @param $collections
*
* @return $this
*/
public function setCollection($collections)
{
$this->collections = $collections;
return $this;
}
/**
* Return the array of all the registered CSS assets
* If a $key is provided, it will try to return only that asset
* else it will return null
*
* @param null|string $key the asset key
* @return array
*/
public function getCss($key = null)
{
if (null !== $key) {
$asset_key = md5($key);
return $this->assets_css[$asset_key] ?? null;
}
return $this->assets_css;
}
/**
* Return the array of all the registered JS assets
* If a $key is provided, it will try to return only that asset
* else it will return null
*
* @param null|string $key the asset key
* @return array
*/
public function getJs($key = null)
{
if (null !== $key) {
$asset_key = md5($key);
return $this->assets_js[$asset_key] ?? null;
}
return $this->assets_js;
}
/**
* Set the whole array of CSS assets
*
* @param $css
*
* @return $this
*/
public function setCss($css)
{
$this->assets_css = $css;
return $this;
}
/**
* Set the whole array of JS assets
*
* @param $js
*
* @return $this
*/
public function setJs($js)
{
$this->assets_js = $js;
return $this;
}
/**
* Removes an item from the CSS array if set
*
* @param string $key The asset key
*
* @return $this
*/
public function removeCss($key)
{
$asset_key = md5($key);
if (isset($this->assets_css[$asset_key])) {
unset($this->assets_css[$asset_key]);
}
return $this;
}
/**
* Removes an item from the JS array if set
*
* @param string $key The asset key
*
* @return $this
*/
public function removeJs($key)
{
$asset_key = md5($key);
if (isset($this->assets_js[$asset_key])) {
unset($this->assets_js[$asset_key]);
}
return $this;
}
/**
* Sets the state of CSS Pipeline
*
* @param boolean $value
*
* @return $this
*/
public function setCssPipeline($value)
{
$this->css_pipeline = (bool)$value;
return $this;
}
/**
* Sets the state of JS Pipeline
*
* @param boolean $value
*
* @return $this
*/
public function setJsPipeline($value)
{
$this->js_pipeline = (bool)$value;
return $this;
}
/**
* Reset all assets.
*
* @return $this
*/
public function reset()
{
$this->resetCss();
$this->resetJs();
$this->setCssPipeline(false);
$this->setJsPipeline(false);
return $this;
}
/**
* Reset JavaScript assets.
*
* @return $this
*/
public function resetJs()
{
$this->assets_js = [];
return $this;
}
/**
* Reset CSS assets.
*
* @return $this
*/
public function resetCss()
{
$this->assets_css = [];
return $this;
}
/**
* Explicitly set's a timestamp for assets
*
* @param $value
*/
public function setTimestamp($value)
{
$this->timestamp = $value;
}
/**
* Get the timestamp for assets
*
* @param bool $include_join
* @return string
*/
public function getTimestamp($include_join = true)
{
if ($this->timestamp) {
return $include_join ? '?' . $this->timestamp : $this->timestamp;
}
return null;
}
/**
* Add all assets matching $pattern within $directory.
*
* @param string $directory Relative to the Grav root path, or a stream identifier
* @param string $pattern (regex)
*
* @return $this
*/
public function addDir($directory, $pattern = self::DEFAULT_REGEX)
{
$root_dir = rtrim(ROOT_DIR, '/');
// Check if $directory is a stream.
if (strpos($directory, '://')) {
$directory = Grav::instance()['locator']->findResource($directory, null);
}
// Get files
$files = $this->rglob($root_dir . DIRECTORY_SEPARATOR . $directory, $pattern, $root_dir . '/');
// No luck? Nothing to do
if (!$files) {
return $this;
}
// Add CSS files
if ($pattern === self::CSS_REGEX) {
foreach ($files as $file) {
$this->addCss($file);
}
return $this;
}
// Add JavaScript files
if ($pattern === self::JS_REGEX) {
foreach ($files as $file) {
$this->addJs($file);
}
return $this;
}
// Unknown pattern.
foreach ($files as $asset) {
$this->add($asset);
}
return $this;
}
/**
* Add all JavaScript assets within $directory
*
* @param string $directory Relative to the Grav root path, or a stream identifier
*
* @return $this
*/
public function addDirJs($directory)
{
return $this->addDir($directory, self::JS_REGEX);
}
/**
* Add all CSS assets within $directory
*
* @param string $directory Relative to the Grav root path, or a stream identifier
*
* @return $this
*/
public function addDirCss($directory)
{
return $this->addDir($directory, self::CSS_REGEX);
}
/**
* Recursively get files matching $pattern within $directory.
*
* @param string $directory
* @param string $pattern (regex)
* @param string $ltrim Will be trimmed from the left of the file path
*
* @return array
*/
protected function rglob($directory, $pattern, $ltrim = null)
{
$iterator = new \RegexIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory,
\FilesystemIterator::SKIP_DOTS)), $pattern);
$offset = \strlen($ltrim);
$files = [];
foreach ($iterator as $file) {
$files[] = substr($file->getPathname(), $offset);
}
return $files;
}
}

View File

@@ -0,0 +1,252 @@
<?php
/**
* @package Grav\Common\Backup
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Backup;
use Grav\Common\Filesystem\Archiver;
use Grav\Common\Filesystem\Folder;
use Grav\Common\Inflector;
use Grav\Common\Scheduler\Job;
use Grav\Common\Scheduler\Scheduler;
use Grav\Common\Utils;
use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\Event\EventDispatcher;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Backups
{
protected const BACKUP_FILENAME_REGEXZ = "#(.*)--(\d*).zip#";
protected const BACKUP_DATE_FORMAT = 'YmdHis';
protected static $backup_dir;
protected static $backups = null;
public function init()
{
/** @var EventDispatcher $dispatcher */
$dispatcher = Grav::instance()['events'];
$dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']);
Grav::instance()->fireEvent('onBackupsInitialized', new Event(['backups' => $this]));
}
public function setup()
{
if (null === static::$backup_dir) {
static::$backup_dir = Grav::instance()['locator']->findResource('backup://', true, true);
Folder::create(static::$backup_dir);
}
}
public function onSchedulerInitialized(Event $event)
{
/** @var Scheduler $scheduler */
$scheduler = $event['scheduler'];
/** @var Inflector $inflector */
$inflector = Grav::instance()['inflector'];
foreach (static::getBackupProfiles() as $id => $profile) {
$at = $profile['schedule_at'];
$name = $inflector::hyphenize($profile['name']);
$logs = 'logs/backup-' . $name . '.out';
/** @var Job $job */
$job = $scheduler->addFunction('Grav\Common\Backup\Backups::backup', [$id], $name );
$job->at($at);
$job->output($logs);
$job->backlink('/tools/backups');
}
}
public function getBackupDownloadUrl($backup, $base_url)
{
$param_sep = $param_sep = Grav::instance()['config']->get('system.param_sep', ':');
$download = urlencode(base64_encode($backup));
$url = rtrim(Grav::instance()['uri']->rootUrl(true), '/') . '/' . trim($base_url,
'/') . '/task' . $param_sep . 'backup/download' . $param_sep . $download . '/admin-nonce' . $param_sep . Utils::getNonce('admin-form');
return $url;
}
public static function getBackupProfiles()
{
return Grav::instance()['config']->get('backups.profiles');
}
public static function getPurgeConfig()
{
return Grav::instance()['config']->get('backups.purge');
}
public function getBackupNames()
{
return array_column(static::getBackupProfiles(), 'name');
}
public static function getTotalBackupsSize()
{
$backups = static::getAvailableBackups();
$size = array_sum(array_column($backups, 'size'));
return $size ?? 0;
}
public static function getAvailableBackups($force = false)
{
if ($force || null === static::$backups) {
static::$backups = [];
$backups_itr = new \GlobIterator(static::$backup_dir . '/*.zip', \FilesystemIterator::KEY_AS_FILENAME);
$inflector = Grav::instance()['inflector'];
$long_date_format = DATE_RFC2822;
/**
* @var string $name
* @var \SplFileInfo $file
*/
foreach ($backups_itr as $name => $file) {
if (preg_match(static::BACKUP_FILENAME_REGEXZ, $name, $matches)) {
$date = \DateTime::createFromFormat(static::BACKUP_DATE_FORMAT, $matches[2]);
$timestamp = $date->getTimestamp();
$backup = new \stdClass();
$backup->title = $inflector->titleize($matches[1]);
$backup->time = $date;
$backup->date = $date->format($long_date_format);
$backup->filename = $name;
$backup->path = $file->getPathname();
$backup->size = $file->getSize();
static::$backups[$timestamp] = $backup;
}
}
// Reverse Key Sort to get in reverse date order
krsort(static::$backups);
}
return static::$backups;
}
/**
* Backup
*
* @param int $id
* @param callable|null $status
*
* @return null|string
*/
public static function backup($id = 0, callable $status = null)
{
$profiles = static::getBackupProfiles();
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
if (isset($profiles[$id])) {
$backup = (object) $profiles[$id];
} else {
throw new \RuntimeException('No backups defined...');
}
$name = Grav::instance()['inflector']->underscorize($backup->name);
$date = date(static::BACKUP_DATE_FORMAT, time());
$filename = trim($name, '_') . '--' . $date . '.zip';
$destination = static::$backup_dir . DS . $filename;
$max_execution_time = ini_set('max_execution_time', 600);
$backup_root = $backup->root;
if ($locator->isStream($backup_root)) {
$backup_root = $locator->findResource($backup_root);
} else {
$backup_root = rtrim(GRAV_ROOT . $backup_root, '/');
}
if (!file_exists($backup_root)) {
throw new \RuntimeException("Backup location: {$backup_root} does not exist...");
}
$options = [
'exclude_files' => static::convertExclude($backup->exclude_files ?? ''),
'exclude_paths' => static::convertExclude($backup->exclude_paths ?? ''),
];
/** @var Archiver $archiver */
$archiver = Archiver::create('zip');
$archiver->setArchive($destination)->setOptions($options)->compress($backup_root, $status)->addEmptyFolders($options['exclude_paths'], $status);
$status && $status([
'type' => 'message',
'message' => 'Done...',
]);
$status && $status([
'type' => 'progress',
'complete' => true
]);
if ($max_execution_time !== false) {
ini_set('max_execution_time', $max_execution_time);
}
// Log the backup
Grav::instance()['log']->error('Backup Created: ' . $destination);
// Fire Finished event
Grav::instance()->fireEvent('onBackupFinished', new Event(['backup' => $destination]));
// Purge anything required
static::purge();
return $destination;
}
public static function purge()
{
$purge_config = static::getPurgeConfig();
$trigger = $purge_config['trigger'];
$backups = static::getAvailableBackups(true);
switch ($trigger)
{
case 'number':
$backups_count = count($backups);
if ($backups_count > $purge_config['max_backups_count']) {
$last = end($backups);
unlink ($last->path);
static::purge();
}
break;
case 'time':
$last = end($backups);
$now = new \DateTime();
$interval = $now->diff($last->time);
if ($interval->days > $purge_config['max_backups_time']) {
unlink($last->path);
static::purge();
}
break;
default:
$used_space = static::getTotalBackupsSize();
$max_space = $purge_config['max_backups_space'] * 1024 * 1024 * 1024;
if ($used_space > $max_space) {
$last = end($backups);
unlink($last->path);
static::purge();
}
break;
}
}
protected static function convertExclude($exclude)
{
$lines = preg_split("/[\s,]+/", $exclude);
return array_map('trim', $lines, array_fill(0, \count($lines), '/'));
}
}

View File

@@ -1,144 +0,0 @@
<?php
/**
* @package Grav.Common.Backup
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Backup;
use Grav\Common\Grav;
use Grav\Common\Inflector;
class ZipBackup
{
protected static $ignorePaths = [
'backup',
'cache',
'images',
'logs',
'tmp'
];
protected static $ignoreFolders = [
'.git',
'.svn',
'.hg',
'.idea',
'node_modules'
];
/**
* Backup
*
* @param string|null $destination
* @param callable|null $messager
*
* @return null|string
*/
public static function backup($destination = null, callable $messager = null)
{
if (!$destination) {
$destination = Grav::instance()['locator']->findResource('backup://', true);
if (!$destination) {
throw new \RuntimeException('The backup folder is missing.');
}
}
$name = substr(strip_tags(Grav::instance()['config']->get('site.title', basename(GRAV_ROOT))), 0, 20);
$inflector = new Inflector();
if (is_dir($destination)) {
$date = date('YmdHis', time());
$filename = trim($inflector->hyphenize($name), '-') . '-' . $date . '.zip';
$destination = rtrim($destination, DS) . DS . $filename;
}
$messager && $messager([
'type' => 'message',
'level' => 'info',
'message' => 'Creating new Backup "' . $destination . '"'
]);
$messager && $messager([
'type' => 'message',
'level' => 'info',
'message' => ''
]);
$zip = new \ZipArchive();
$zip->open($destination, \ZipArchive::CREATE);
$max_execution_time = ini_set('max_execution_time', 600);
static::folderToZip(GRAV_ROOT, $zip, strlen(rtrim(GRAV_ROOT, DS) . DS), $messager);
$messager && $messager([
'type' => 'progress',
'percentage' => false,
'complete' => true
]);
$messager && $messager([
'type' => 'message',
'level' => 'info',
'message' => ''
]);
$messager && $messager([
'type' => 'message',
'level' => 'info',
'message' => 'Saving and compressing archive...'
]);
$zip->close();
if ($max_execution_time !== false) {
ini_set('max_execution_time', $max_execution_time);
}
return $destination;
}
/**
* @param $folder
* @param $zipFile
* @param $exclusiveLength
* @param $messager
*/
private static function folderToZip($folder, \ZipArchive $zipFile, $exclusiveLength, callable $messager = null)
{
$handle = opendir($folder);
while (false !== $f = readdir($handle)) {
if ($f !== '.' && $f !== '..') {
$filePath = "$folder/$f";
// Remove prefix from file path before add to zip.
$localPath = substr($filePath, $exclusiveLength);
if (in_array($f, static::$ignoreFolders)) {
continue;
}
if (in_array($localPath, static::$ignorePaths)) {
$zipFile->addEmptyDir($f);
continue;
}
if (is_file($filePath)) {
$zipFile->addFile($filePath, $localPath);
$messager && $messager([
'type' => 'progress',
'percentage' => false,
'complete' => false
]);
} elseif (is_dir($filePath)) {
// Add sub-directory.
$zipFile->addEmptyDir($localPath);
static::folderToZip($filePath, $zipFile, $exclusiveLength, $messager);
}
}
}
closedir($handle);
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common
* @package Grav\Common
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -113,7 +114,7 @@ class Browser
{
$version = explode('.', $this->getLongVersion());
return intval($version[0]);
return (int)$version[0];
}
/**
@@ -134,4 +135,15 @@ class Browser
return true;
}
/**
* Determine if “Do Not Track” is set by browser
* @see https://www.w3.org/TR/tracking-dnt/
*
* @return bool
*/
public function isTrackable(): bool
{
return !(isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] === '1');
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common
* @package Grav\Common
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -11,7 +12,9 @@ namespace Grav\Common;
use \Doctrine\Common\Cache as DoctrineCache;
use Grav\Common\Config\Config;
use Grav\Common\Filesystem\Folder;
use Grav\Common\Scheduler\Scheduler;
use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\Event\EventDispatcher;
/**
* The GravCache object is used throughout Grav to store and retrieve cached data.
@@ -117,27 +120,50 @@ class Cache extends Getters
$this->config = $grav['config'];
$this->now = time();
$this->cache_dir = $grav['locator']->findResource('cache://doctrine', true, true);
if (null === $this->enabled) {
$this->enabled = (bool)$this->config->get('system.cache.enabled');
}
/** @var Uri $uri */
$uri = $grav['uri'];
$prefix = $this->config->get('system.cache.prefix');
if (is_null($this->enabled)) {
$this->enabled = (bool)$this->config->get('system.cache.enabled');
}
$uniqueness = substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION), 2, 8);
// Cache key allows us to invalidate all cache on configuration changes.
$this->key = ($prefix ? $prefix : 'g') . '-' . substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION),
2, 8);
$this->key = ($prefix ? $prefix : 'g') . '-' . $uniqueness;
$this->cache_dir = $grav['locator']->findResource('cache://doctrine/' . $uniqueness, true, true);
$this->driver_setting = $this->config->get('system.cache.driver');
$this->driver = $this->getCacheDriver();
// Set the cache namespace to our unique key
$this->driver->setNamespace($this->key);
/** @var EventDispatcher $dispatcher */
$dispatcher = Grav::instance()['events'];
$dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']);
}
/**
* Deletes the old out of date file-based caches
*
* @return int
*/
public function purgeOldCache()
{
$cache_dir = dirname($this->cache_dir);
$current = basename($this->cache_dir);
$count = 0;
foreach (new \DirectoryIterator($cache_dir) as $file) {
$dir = $file->getBasename();
if ($dir === $current || $file->isDot() || $file->isFile()) {
continue;
}
Folder::delete($file->getPathname());
$count++;
}
return $count;
}
/**
@@ -147,7 +173,7 @@ class Cache extends Getters
*/
public function setEnabled($enabled)
{
$this->enabled = (bool) $enabled;
$this->enabled = (bool)$enabled;
}
/**
@@ -184,19 +210,15 @@ class Cache extends Getters
// CLI compatibility requires a non-volatile cache driver
if ($this->config->get('system.cache.cli_compatibility') && (
$setting == 'auto' || $this->isVolatileDriver($setting))) {
$setting === 'auto' || $this->isVolatileDriver($setting))) {
$setting = $driver_name;
}
if (!$setting || $setting == 'auto') {
if (!$setting || $setting === 'auto') {
if (extension_loaded('apcu')) {
$driver_name = 'apcu';
} elseif (extension_loaded('apc')) {
$driver_name = 'apc';
} elseif (extension_loaded('wincache')) {
$driver_name = 'wincache';
} elseif (extension_loaded('xcache')) {
$driver_name = 'xcache';
}
} else {
$driver_name = $setting;
@@ -206,9 +228,6 @@ class Cache extends Getters
switch ($driver_name) {
case 'apc':
$driver = new DoctrineCache\ApcCache();
break;
case 'apcu':
$driver = new DoctrineCache\ApcuCache();
break;
@@ -217,10 +236,6 @@ class Cache extends Getters
$driver = new DoctrineCache\WinCacheCache();
break;
case 'xcache':
$driver = new DoctrineCache\XcacheCache();
break;
case 'memcache':
$memcache = new \Memcache();
$memcache->connect($this->config->get('system.cache.memcache.server', 'localhost'),
@@ -277,9 +292,9 @@ class Cache extends Getters
{
if ($this->enabled) {
return $this->driver->fetch($id);
} else {
return false;
}
return false;
}
/**
@@ -310,6 +325,21 @@ class Cache extends Getters
if ($this->enabled) {
return $this->driver->delete($id);
}
return false;
}
/**
* Deletes all cache
*
* @return bool
*/
public function deleteAll()
{
if ($this->enabled) {
return $this->driver->deleteAll();
}
return false;
}
@@ -324,6 +354,7 @@ class Cache extends Getters
if ($this->enabled) {
return $this->driver->contains(($id));
}
return false;
}
@@ -382,6 +413,12 @@ class Cache extends Getters
}
// Delete entries in the doctrine cache if required
if (in_array($remove, ['all', 'standard'])) {
$cache = Grav::instance()['cache'];
$cache->driver->deleteAll();
}
// Clearing cache event to add paths to clear
Grav::instance()->fireEvent('onBeforeCacheClear', new Event(['remove' => $remove, 'paths' => &$remove_paths]));
@@ -422,7 +459,7 @@ class Cache extends Getters
$output[] = '';
if (($remove == 'all' || $remove == 'standard') && file_exists($user_config)) {
if (($remove === 'all' || $remove === 'standard') && file_exists($user_config)) {
touch($user_config);
$output[] = '<red>Touched: </red>' . $user_config;
@@ -440,6 +477,24 @@ class Cache extends Getters
return $output;
}
public static function invalidateCache()
{
$user_config = USER_DIR . 'config/system.yaml';
if (file_exists($user_config)) {
touch($user_config);
}
// Clear stat cache
@clearstatcache();
// Clear opcache
if (function_exists('opcache_reset')) {
@opcache_reset();
}
}
/**
* Set the cache lifetime programmatically
@@ -503,8 +558,64 @@ class Cache extends Getters
{
if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) {
return true;
} else {
return false;
}
return false;
}
/**
* Static function to call as a scheduled Job to purge old Doctrine files
*/
public static function purgeJob()
{
/** @var Cache $cache */
$cache = Grav::instance()['cache'];
$deleted_folders = $cache->purgeOldCache();
echo 'Purged ' . $deleted_folders . ' old cache folders...';
}
/**
* Static function to call as a scheduled Job to clear Grav cache
*
* @param $type
*/
public static function clearJob($type)
{
$result = static::clearCache($type);
static::invalidateCache();
echo strip_tags(implode("\n", $result));
}
public function onSchedulerInitialized(Event $event)
{
/** @var Scheduler $scheduler */
$scheduler = $event['scheduler'];
$config = Grav::instance()['config'];
// File Cache Purge
$at = $config->get('system.cache.purge_at');
$name = 'cache-purge';
$logs = 'logs/' . $name . '.out';
$job = $scheduler->addFunction('Grav\Common\Cache::purgeJob', [], $name );
$job->at($at);
$job->output($logs);
$job->backlink('/config/system#caching');
// Cache Clear
$at = $config->get('system.cache.clear_at');
$clear_type = $config->get('system.cache.clear_job_type');
$name = 'cache-clear';
$logs = 'logs/' . $name . '.out';
$job = $scheduler->addFunction('Grav\Common\Cache::clearJob', [$clear_type], $name );
$job->at($at);
$job->output($logs);
$job->backlink('/config/system#caching');
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common
* @package Grav\Common
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -11,7 +12,7 @@ namespace Grav\Common;
class Composer
{
/** @const Default composer location */
const DEFAULT_PATH = "bin/composer.phar";
const DEFAULT_PATH = 'bin/composer.phar';
/**
* Returns the location of composer.
@@ -20,12 +21,12 @@ class Composer
*/
public static function getComposerLocation()
{
if (!function_exists('shell_exec') || strtolower(substr(PHP_OS, 0, 3)) === 'win') {
if (!\function_exists('shell_exec') || stripos(PHP_OS, 'win') === 0) {
return self::DEFAULT_PATH;
}
// check for global composer install
$path = trim(shell_exec("command -v composer"));
$path = trim(shell_exec('command -v composer'));
// fall back to grav bundled composer
if (!$path || !preg_match('/(composer|composer\.phar)$/', $path)) {
@@ -46,7 +47,7 @@ class Composer
$composer = static::getComposerLocation();
if ($composer !== static::DEFAULT_PATH && is_executable($composer)) {
$file = fopen($composer, 'r');
$file = fopen($composer, 'rb');
$firstLine = fgets($file);
fclose($file);

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -128,7 +129,7 @@ abstract class CompiledBase
*/
public function checksum()
{
if (!isset($this->checksum)) {
if (null === $this->checksum) {
$this->checksum = md5(json_encode($this->files) . $this->version);
}
@@ -197,11 +198,9 @@ abstract class CompiledBase
$cache = include $filename;
if (
!is_array($cache)
|| !isset($cache['checksum'])
|| !isset($cache['data'])
|| !isset($cache['@class'])
|| $cache['@class'] != get_class($this)
!\is_array($cache)
|| !isset($cache['checksum'], $cache['data'], $cache['@class'])
|| $cache['@class'] !== \get_class($this)
) {
return false;
}
@@ -212,7 +211,7 @@ abstract class CompiledBase
}
$this->createObject($cache['data']);
$this->timestamp = isset($cache['timestamp']) ? $cache['timestamp'] : 0;
$this->timestamp = $cache['timestamp'] ?? 0;
$this->finalizeObject();
@@ -243,7 +242,7 @@ abstract class CompiledBase
}
$cache = [
'@class' => get_class($this),
'@class' => \get_class($this),
'timestamp' => time(),
'checksum' => $this->checksum(),
'files' => $this->files,

View File

@@ -1,27 +1,30 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Config;
use Grav\Common\Data\Blueprint;
use Grav\Common\Data\BlueprintSchema;
use Grav\Common\Grav;
/**
* Class CompiledBlueprints
* @package Grav\Common\Config
*/
class CompiledBlueprints extends CompiledBase
{
/**
* @var int Version number for the compiled file.
*/
public $version = 2;
public function __construct($cacheFolder, array $files, $path)
{
parent::__construct($cacheFolder, $files, $path);
/**
* @var BlueprintSchema Blueprints object.
*/
protected $object;
$this->version = 2;
}
/**
* Returns checksum from the configuration files.

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -12,16 +13,6 @@ use Grav\Common\File\CompiledYamlFile;
class CompiledConfig extends CompiledBase
{
/**
* @var int Version number for the compiled file.
*/
public $version = 1;
/**
* @var Config Configuration object.
*/
protected $object;
/**
* @var callable Blueprints loader.
*/
@@ -32,6 +23,13 @@ class CompiledConfig extends CompiledBase
*/
protected $withDefaults;
public function __construct($cacheFolder, array $files, $path)
{
parent::__construct($cacheFolder, $files, $path);
$this->version = 1;
}
/**
* Set blueprints for the configuration.
*
@@ -63,7 +61,7 @@ class CompiledConfig extends CompiledBase
*/
protected function createObject(array $data = [])
{
if ($this->withDefaults && empty($data) && is_callable($this->callable)) {
if ($this->withDefaults && empty($data) && \is_callable($this->callable)) {
$blueprints = $this->callable;
$data = $blueprints()->getDefaults();
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -12,15 +13,12 @@ use Grav\Common\File\CompiledYamlFile;
class CompiledLanguages extends CompiledBase
{
/**
* @var int Version number for the compiled file.
*/
public $version = 1;
public function __construct($cacheFolder, array $files, $path)
{
parent::__construct($cacheFolder, $files, $path);
/**
* @var Languages Configuration object.
*/
protected $object;
$this->version = 1;
}
/**
* Create configuration object.

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -16,14 +17,24 @@ use Grav\Common\Utils;
class Config extends Data
{
public $environment;
/** @var string */
protected $key;
/** @var string */
protected $checksum;
protected $modified = false;
/** @var int */
protected $timestamp = 0;
/** @var bool */
protected $modified = false;
public function key()
{
return $this->checksum();
if (null === $this->key) {
$this->key = md5($this->checksum . $this->timestamp);
}
return $this->key;
}
public function checksum($checksum = null)
@@ -90,7 +101,7 @@ class Config extends Data
{
$setup = Grav::instance()['setup']->toArray();
foreach ($setup as $key => $value) {
if ($key === 'streams' || !is_array($value)) {
if ($key === 'streams' || !\is_array($value)) {
// Optimized as streams and simple values are fully defined in setup.
$this->items[$key] = $value;
} else {

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -52,4 +53,15 @@ class Languages extends Data
{
$this->items = Utils::arrayMergeRecursiveUnique($this->items, $data);
}
public function flattenByLang($lang)
{
$language = $this->items[$lang];
return Utils::arrayFlattenDotNotation($language);
}
public function unflatten($array)
{
return Utils::arrayUnflattenDotNotation($array);
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Config
* @package Grav\Common\Config
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -12,11 +13,23 @@ use Grav\Common\File\CompiledYamlFile;
use Grav\Common\Data\Data;
use Grav\Common\Utils;
use Pimple\Container;
use RocketTheme\Toolbox\File\YamlFile;
use Psr\Http\Message\ServerRequestInterface;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Setup extends Data
{
/**
* @var array Environment aliases normalized to lower case.
*/
public static $environments = [
'' => 'unknown',
'127.0.0.1' => 'localhost',
'::1' => 'localhost'
];
/**
* @var string Current environment normalized to lower case.
*/
public static $environment;
protected $streams = [
@@ -38,7 +51,7 @@ class Setup extends Data
// If not defined, environment will be set up in the constructor.
],
'asset' => [
'type' => 'ReadOnlyStream',
'type' => 'Stream',
'prefixes' => [
'' => ['assets'],
]
@@ -109,7 +122,7 @@ class Setup extends Data
]
],
'image' => [
'type' => 'ReadOnlyStream',
'type' => 'Stream',
'prefixes' => [
'' => ['user://images', 'system://images']
]
@@ -120,6 +133,13 @@ class Setup extends Data
'' => ['user://pages']
]
],
'user-data' => [
'type' => 'Stream',
'force' => true,
'prefixes' => [
'' => ['user://data']
]
],
'account' => [
'type' => 'ReadOnlyStream',
'prefixes' => [
@@ -133,12 +153,26 @@ class Setup extends Data
*/
public function __construct($container)
{
$environment = null !== static::$environment ? static::$environment : ($container['uri']->environment() ?: 'localhost');
// If no environment is set, make sure we get one (CLI or hostname).
if (!static::$environment) {
if (\defined('GRAV_CLI')) {
static::$environment = 'cli';
} else {
/** @var ServerRequestInterface $request */
$request = $container['request'];
$host = $request->getUri()->getHost();
static::$environment = Utils::substrToString($host, ':');
}
}
// Resolve server aliases to the proper environment.
$environment = $this->environments[static::$environment] ?? static::$environment;
// Pre-load setup.php which contains our initial configuration.
// Configuration may contain dynamic parts, which is why we need to always load it.
// If "GRAVE_SETUP_PATH" has been defined, use it, otherwise use defaults.
$file = defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php';
// If "GRAV_SETUP_PATH" has been defined, use it, otherwise use defaults.
$file = \defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php';
$setup = is_file($file) ? (array) include $file : [];
// Add default streams defined in beginning of the class.
@@ -151,8 +185,8 @@ class Setup extends Data
parent::__construct($setup);
// Set up environment.
$this->def('environment', $environment ?: 'cli');
$this->def('streams.schemes.environment.prefixes', ['' => $environment ? ["user://{$this->environment}"] : []]);
$this->def('environment', $environment);
$this->def('streams.schemes.environment.prefixes', ['' => ["user://{$this->get('environment')}"]]);
}
/**
@@ -212,8 +246,8 @@ class Setup extends Data
$locator->addPath($scheme, '', $config['paths']);
}
$override = isset($config['override']) ? $config['override'] : false;
$force = isset($config['force']) ? $config['force'] : false;
$override = $config['override'] ?? false;
$force = $config['force'] ?? false;
if (isset($config['prefixes'])) {
foreach ((array)$config['prefixes'] as $prefix => $paths) {
@@ -232,7 +266,7 @@ class Setup extends Data
{
$schemes = [];
foreach ((array) $this->get('streams.schemes') as $scheme => $config) {
$type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream';
$type = $config['type'] ?? 'ReadOnlyStream';
if ($type[0] !== '\\') {
$type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type;
}
@@ -251,8 +285,8 @@ class Setup extends Data
*/
protected function check(UniformResourceLocator $locator)
{
$streams = isset($this->items['streams']['schemes']) ? $this->items['streams']['schemes'] : null;
if (!is_array($streams)) {
$streams = $this->items['streams']['schemes'] ?? null;
if (!\is_array($streams)) {
throw new \InvalidArgumentException('Configuration is missing streams.schemes!');
}
$diff = array_keys(array_diff_key($this->streams, $streams));
@@ -271,10 +305,14 @@ class Setup extends Data
// Create security.yaml if it doesn't exist.
$filename = $locator->findResource('config://security.yaml', true, true);
$file = YamlFile::instance($filename);
if (!$file->exists()) {
$file->save(['salt' => Utils::generateRandomString(14)]);
$file->free();
$security_file = CompiledYamlFile::instance($filename);
$security_content = (array)$security_file->content();
if (!isset($security_content['salt'])) {
$security_content = array_merge($security_content, ['salt' => Utils::generateRandomString(14)]);
$security_file->content($security_content);
$security_file->save();
$security_file->free();
}
} catch (\RuntimeException $e) {
throw new \RuntimeException(sprintf('Grav failed to initialize: %s', $e->getMessage()), 500, $e);

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -10,21 +11,25 @@ namespace Grav\Common\Data;
use Grav\Common\File\CompiledYamlFile;
use Grav\Common\Grav;
use Grav\Common\User\Interfaces\UserInterface;
use RocketTheme\Toolbox\Blueprints\BlueprintForm;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Blueprint extends BlueprintForm
{
/**
* @var string
*/
/** @var string */
protected $context = 'blueprints://';
/**
* @var BlueprintSchema
*/
protected $scope;
/** @var BlueprintSchema */
protected $blueprintSchema;
public function setScope($scope)
{
$this->scope = $scope;
}
/**
* Set default values for field types.
*
@@ -70,6 +75,20 @@ class Blueprint extends BlueprintForm
return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator);
}
/**
* Process data coming from a form.
*
* @param array $data
* @param array $toggles
* @return array
*/
public function processForm(array $data, array $toggles = [])
{
$this->initInternals();
return $this->blueprintSchema->processForm($data, $toggles);
}
/**
* Return data fields that do not exist in blueprints.
*
@@ -101,13 +120,14 @@ class Blueprint extends BlueprintForm
* Filter data by using blueprints.
*
* @param array $data
* @param bool $missingValuesAsNull
* @return array
*/
public function filter(array $data)
public function filter(array $data, bool $missingValuesAsNull = false)
{
$this->initInternals();
return $this->blueprintSchema->filter($data);
return $this->blueprintSchema->filter($data, $missingValuesAsNull);
}
/**
@@ -127,13 +147,15 @@ class Blueprint extends BlueprintForm
*/
protected function initInternals()
{
if (!isset($this->blueprintSchema)) {
if (null === $this->blueprintSchema) {
$types = Grav::instance()['plugins']->formFieldTypes;
$this->blueprintSchema = new BlueprintSchema;
if ($types) {
$this->blueprintSchema->setTypes($types);
}
$this->blueprintSchema->embed('', $this->items);
$this->blueprintSchema->init();
}
@@ -162,17 +184,19 @@ class Blueprint extends BlueprintForm
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
if (is_string($path) && !$locator->isStream($path)) {
if (\is_string($path) && !$locator->isStream($path)) {
// Find path overrides.
$paths = isset($this->overrides[$path]) ? (array) $this->overrides[$path] : [];
$paths = (array) ($this->overrides[$path] ?? null);
// Add path pointing to default context.
if ($context === null) {
$context = $this->context;
}
if ($context && $context[strlen($context)-1] !== '/') {
if ($context && $context[\strlen($context)-1] !== '/') {
$context .= '/';
}
$path = $context . $path;
if (!preg_match('/\.yaml$/', $path)) {
@@ -186,7 +210,7 @@ class Blueprint extends BlueprintForm
$files = [];
foreach ($paths as $lookup) {
if (is_string($lookup) && strpos($lookup, '://')) {
if (\is_string($lookup) && strpos($lookup, '://')) {
$files = array_merge($files, $locator->findResources($lookup));
} else {
$files[] = $lookup;
@@ -205,27 +229,29 @@ class Blueprint extends BlueprintForm
{
$params = $call['params'];
if (is_array($params)) {
if (\is_array($params)) {
$function = array_shift($params);
} else {
$function = $params;
$params = [];
}
list($o, $f) = preg_split('/::/', $function, 2);
[$o, $f] = explode('::', $function, 2);
$data = null;
if (!$f) {
if (function_exists($o)) {
$data = call_user_func_array($o, $params);
if (\function_exists($o)) {
$data = \call_user_func_array($o, $params);
}
} else {
if (method_exists($o, $f)) {
$data = call_user_func_array(array($o, $f), $params);
$data = \call_user_func_array([$o, $f], $params);
}
}
// If function returns a value,
if (isset($data)) {
if (isset($field[$property]) && is_array($field[$property]) && is_array($data)) {
if (null !== $data) {
if (\is_array($data) && isset($field[$property]) && \is_array($field[$property])) {
// Combine field and @data-field together.
$field[$property] += $data;
} else {
@@ -243,12 +269,75 @@ class Blueprint extends BlueprintForm
protected function dynamicConfig(array &$field, $property, array &$call)
{
$value = $call['params'];
$default = isset($field[$property]) ? $field[$property] : null;
$default = $field[$property] ?? null;
$config = Grav::instance()['config']->get($value, $default);
if (!is_null($config)) {
if (null !== $config) {
$field[$property] = $config;
}
}
/**
* @param array $field
* @param string $property
* @param array $call
*/
protected function dynamicSecurity(array &$field, $property, array &$call)
{
if ($property || !empty($field['validate']['ignore'])) {
return;
}
$grav = Grav::instance();
$actions = (array)$call['params'];
/** @var UserInterface $user */
if (isset($grav['user'])) {
$user = Grav::instance()['user'];
foreach ($actions as $action) {
if (!$user->authorize($action)) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
return;
}
}
}
}
/**
* @param array $field
* @param string $property
* @param array $call
*/
protected function dynamicScope(array &$field, $property, array &$call)
{
if ($property && $property !== 'ignore') {
return;
}
$scopes = (array)$call['params'];
$matches = \in_array($this->scope, $scopes, true);
if ($this->scope && $property !== 'ignore') {
$matches = !$matches;
}
if ($matches) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
return;
}
}
protected function addPropertyRecursive(array &$field, $property, $value)
{
if (\is_array($value) && isset($field[$property]) && \is_array($field[$property])) {
$field[$property] = array_merge_recursive($field[$property], $value);
} else {
$field[$property] = $value;
}
if (!empty($field['fields'])) {
foreach ($field['fields'] as $key => &$child) {
$this->addPropertyRecursive($child, $property, $value);
}
}
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -26,6 +27,23 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
'fields' => true
];
/**
* @return array
*/
public function getTypes()
{
return $this->types;
}
/**
* @param string $name
* @return array
*/
public function getType($name)
{
return $this->types[$name] ?? [];
}
/**
* Validate data against blueprints.
*
@@ -47,35 +65,50 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
}
/**
* Filter data by using blueprints.
*
* @param array $data
* @param array $data
* @param array $toggles
* @return array
*/
public function filter(array $data)
public function processForm(array $data, array $toggles = [])
{
return $this->filterArray($data, $this->nested);
return $this->processFormRecursive($data, $toggles, $this->nested);
}
/**
* Filter data by using blueprints.
*
* @param array $data Incoming data, for example from a form.
* @param bool $missingValuesAsNull Include missing values as nulls.
* @return array
*/
public function filter(array $data, $missingValuesAsNull = false)
{
return $this->filterArray($data, $this->nested, $missingValuesAsNull);
}
/**
* @param array $data
* @param array $rules
* @returns array
* @return array
* @throws \RuntimeException
* @internal
*/
protected function validateArray(array $data, array $rules)
{
$messages = $this->checkRequired($data, $rules);
foreach ($data as $key => $field) {
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
$rule = is_string($val) ? $this->items[$val] : null;
$val = $rules[$key] ?? $rules['*'] ?? null;
$rule = \is_string($val) ? $this->items[$val] : null;
if ($rule) {
// Item has been defined in blueprints.
if (!empty($rule['validate']['ignore'])) {
// Skip validation in the ignored field.
continue;
}
$messages += Validation::validate($field, $rule);
} elseif (is_array($field) && is_array($val)) {
} elseif (\is_array($field) && \is_array($val)) {
// Array has been defined in blueprints.
$messages += $this->validateArray($field, $val);
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
@@ -90,27 +123,47 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
/**
* @param array $data
* @param array $rules
* @param bool $missingValuesAsNull
* @return array
* @internal
*/
protected function filterArray(array $data, array $rules)
protected function filterArray(array $data, array $rules, $missingValuesAsNull)
{
$results = array();
$results = [];
if ($missingValuesAsNull) {
// First pass is to fill up all the fields with null. This is done to lock the ordering of the fields.
foreach ($rules as $key => $rule) {
if ($key && !isset($results[$key])) {
$val = $rules[$key] ?? $rules['*'] ?? null;
$rule = \is_string($val) ? $this->items[$val] : null;
if (empty($rule['validate']['ignore'])) {
$results[$key] = null;
}
}
}
}
foreach ($data as $key => $field) {
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
$rule = is_string($val) ? $this->items[$val] : null;
$val = $rules[$key] ?? $rules['*'] ?? null;
$rule = \is_string($val) ? $this->items[$val] : null;
if ($rule) {
// Item has been defined in blueprints.
if (!empty($rule['validate']['ignore'])) {
// Skip any data in the ignored field.
continue;
}
$field = Validation::filter($field, $rule);
} elseif (is_array($field) && is_array($val)) {
} elseif (\is_array($field) && \is_array($val)) {
// Array has been defined in blueprints.
$field = $this->filterArray($field, $val);
$field = $this->filterArray($field, $val, $missingValuesAsNull);
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
$field = null;
}
if (isset($field) && (!is_array($field) || !empty($field))) {
if (null !== $field && (!\is_array($field) || !empty($field))) {
$results[$key] = $field;
}
}
@@ -118,6 +171,52 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
return $results;
}
/**
* @param array $data
* @param array $toggles
* @param array $nested
* @return array
*/
protected function processFormRecursive(array $data, array $toggles, array $nested)
{
foreach ($nested as $key => $value) {
if ($key === '') {
continue;
}
if ($key === '*') {
// TODO: Add support to collections.
continue;
}
if (is_array($value)) {
// Recursively fetch the items.
$array = $this->processFormRecursive($data[$key] ?? [], $toggles[$key] ?? [], $value);
if (!empty($array)) {
$data[$key] = $array;
}
} else {
$field = $this->get($value);
// Do not add the field if:
if (
// Not an input field
!$field
// Field validation is set to be ignored
|| !empty($field['validate']['ignore'])
// Field is toggleable and the toggle is turned off
|| (!empty($field['toggleable']) && empty($toggles[$key]))
) {
continue;
}
if (!isset($data[$key])) {
$data[$key] = null;
}
}
}
return $data;
}
/**
* @param array $data
* @param array $fields
@@ -128,10 +227,18 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
$messages = [];
foreach ($fields as $name => $field) {
if (!is_string($field)) {
if (!\is_string($field)) {
continue;
}
$field = $this->items[$field];
// Skip ignored field, it will not be required.
if (!empty($field['validate']['ignore'])) {
continue;
}
// Check if required.
if (isset($field['validate']['required'])
&& $field['validate']['required'] === true) {
@@ -142,9 +249,9 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
continue;
}
$value = isset($field['label']) ? $field['label'] : $field['name'];
$value = $field['label'] ?? $field['name'];
$language = Grav::instance()['language'];
$message = sprintf($language->translate('FORM.MISSING_REQUIRED_FIELD', null, true) . ' %s', $language->translate($value));
$message = sprintf($language->translate('GRAV.FORM.MISSING_REQUIRED_FIELD', null, true) . ' %s', $language->translate($value));
$messages[$field['name']][] = $message;
}
}
@@ -161,7 +268,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
{
$value = $call['params'];
$default = isset($field[$property]) ? $field[$property] : null;
$default = $field[$property] ?? null;
$config = Grav::instance()['config']->get($value, $default);
if (null !== $config) {

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -13,8 +14,11 @@ use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Blueprints
{
/** @var array|string */
protected $search;
/** @var array */
protected $types;
/** @var array */
protected $instances = [];
/**
@@ -49,7 +53,7 @@ class Blueprints
public function types()
{
if ($this->types === null) {
$this->types = array();
$this->types = [];
$grav = Grav::instance();
@@ -87,7 +91,7 @@ class Blueprints
{
$blueprint = new Blueprint($name);
if (is_array($this->search) || is_object($this->search)) {
if (\is_array($this->search) || \is_object($this->search)) {
// Page types.
$blueprint->setOverrides($this->search);
$blueprint->setContext('blueprints://pages');

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -15,28 +16,27 @@ use RocketTheme\Toolbox\ArrayTraits\NestedArrayAccessWithGetters;
use RocketTheme\Toolbox\File\File;
use RocketTheme\Toolbox\File\FileInterface;
class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
class Data implements DataInterface, \ArrayAccess, \Countable, \JsonSerializable, ExportInterface
{
use NestedArrayAccessWithGetters, Countable, Export;
/** @var string */
protected $gettersVariable = 'items';
/** @var array */
protected $items;
/**
* @var Blueprints
*/
/** @var Blueprints */
protected $blueprints;
/**
* @var File
*/
/** @var File */
protected $storage;
/**
* @param array $items
* @param Blueprint|callable $blueprints
*/
public function __construct(array $items = array(), $blueprints = null)
public function __construct(array $items = [], $blueprints = null)
{
$this->items = $items;
$this->blueprints = $blueprints;
@@ -70,14 +70,16 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
{
$old = $this->get($name, null, $separator);
if ($old !== null) {
if (!is_array($old)) {
if (!\is_array($old)) {
throw new \RuntimeException('Value ' . $old);
}
if (is_object($value)) {
if (\is_object($value)) {
$value = (array) $value;
} elseif (!is_array($value)) {
} elseif (!\is_array($value)) {
throw new \RuntimeException('Value ' . $value);
}
$value = $this->blueprints()->mergeData($old, $value, $name, $separator);
}
@@ -108,9 +110,10 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
*/
public function joinDefaults($name, $value, $separator = '.')
{
if (is_object($value)) {
if (\is_object($value)) {
$value = (array) $value;
}
$old = $this->get($name, null, $separator);
if ($old !== null) {
$value = $this->blueprints()->mergeData($value, $old, $name, $separator);
@@ -125,16 +128,16 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
* Get value from the configuration and join it with given data.
*
* @param string $name Dot separated path to the requested value.
* @param array $value Value to be joined.
* @param array|object $value Value to be joined.
* @param string $separator Separator, defaults to '.'
* @return array
* @throws \RuntimeException
*/
public function getJoined($name, $value, $separator = '.')
{
if (is_object($value)) {
if (\is_object($value)) {
$value = (array) $value;
} elseif (!is_array($value)) {
} elseif (!\is_array($value)) {
throw new \RuntimeException('Value ' . $value);
}
@@ -145,7 +148,7 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
return $value;
}
if (!is_array($old)) {
if (!\is_array($old)) {
throw new \RuntimeException('Value ' . $old);
}
@@ -194,12 +197,13 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
}
/**
* @param bool $missingValuesAsNull
* @return $this
* Filter all items by using blueprints.
*/
public function filter()
public function filter(bool $missingValuesAsNull = false)
{
$this->items = $this->blueprints()->filter($this->items);
$this->items = $this->blueprints()->filter($this->items, $missingValuesAsNull);
return $this;
}
@@ -223,7 +227,7 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
{
if (!$this->blueprints){
$this->blueprints = new Blueprint;
} elseif (is_callable($this->blueprints)) {
} elseif (\is_callable($this->blueprints)) {
// Lazy load blueprints.
$blueprints = $this->blueprints;
$this->blueprints = $blueprints();
@@ -282,6 +286,12 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
if ($storage) {
$this->storage = $storage;
}
return $this->storage;
}
public function jsonSerialize()
{
return $this->items;
}
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -11,7 +12,6 @@ namespace Grav\Common\Data;
use Grav\Common\Grav;
use Grav\Common\Utils;
use Grav\Common\Yaml;
use RocketTheme\Toolbox\Compat\Yaml\Yaml as FallbackYaml;
class Validation
{
@@ -24,49 +24,46 @@ class Validation
*/
public static function validate($value, array $field)
{
$messages = [];
$validate = isset($field['validate']) ? (array) $field['validate'] : [];
// Validate type with fallback type text.
$type = (string) isset($validate['type']) ? $validate['type'] : $field['type'];
$method = 'type'.strtr($type, '-', '_');
// If value isn't required, we will stop validation if empty value is given.
if ((empty($validate['required']) || (isset($validate['required']) && $validate['required'] !== true)) && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))) {
return $messages;
}
if (!isset($field['type'])) {
$field['type'] = 'text';
}
$type = $validate['type'] ?? $field['type'];
$validate = (array)($field['validate'] ?? null);
$required = $validate['required'] ?? false;
// If value isn't required, we will stop validation if empty value is given.
if ($required !== true && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))
) {
return [];
}
// Get language class.
$language = Grav::instance()['language'];
$name = ucfirst(isset($field['label']) ? $field['label'] : $field['name']);
$name = ucfirst($field['label'] ?? $field['name']);
$message = (string) isset($field['validate']['message'])
? $language->translate($field['validate']['message'])
: $language->translate('FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"';
: $language->translate('GRAV.FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"';
// Validate type with fallback type text.
$method = 'type' . str_replace('-', '_', $type);
// If this is a YAML field validate/filter as such
if ($type != 'yaml' && isset($field['yaml']) && $field['yaml'] === true) {
if (isset($field['yaml']) && $field['yaml'] === true) {
$method = 'typeYaml';
}
if (method_exists(__CLASS__, $method)) {
$success = self::$method($value, $validate, $field);
} else {
$success = true;
}
$messages = [];
$success = method_exists(__CLASS__, $method) ? self::$method($value, $validate, $field) : true;
if (!$success) {
$messages[$field['name']][] = $message;
}
// Check individual rules.
foreach ($validate as $rule => $params) {
$method = 'validate' . ucfirst(strtr($rule, '-', '_'));
$method = 'validate' . ucfirst(str_replace('-', '_', $rule));
if (method_exists(__CLASS__, $method)) {
$success = self::$method($value, $params);
@@ -89,29 +86,27 @@ class Validation
*/
public static function filter($value, array $field)
{
$validate = isset($field['validate']) ? (array) $field['validate'] : [];
$validate = (array)($field['filter'] ?? $field['validate'] ?? null);
// If value isn't required, we will return null if empty value is given.
if (empty($validate['required']) && ($value === null || $value === '')) {
if (($value === null || $value === '') && empty($validate['required'])) {
return null;
}
if (!isset($field['type'])) {
$field['type'] = 'text';
}
$type = $field['filter']['type'] ?? $field['validate']['type'] ?? $field['type'];
// Validate type with fallback type text.
$type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type'];
$method = 'filter' . ucfirst(strtr($type, '-', '_'));
$method = 'filter' . ucfirst(str_replace('-', '_', $type));
// If this is a YAML field validate/filter as such
if ($type !== 'yaml' && isset($field['yaml']) && $field['yaml'] === true) {
if (isset($field['yaml']) && $field['yaml'] === true) {
$method = 'filterYaml';
}
if (!method_exists(__CLASS__, $method)) {
$method = 'filterText';
$method = isset($field['array']) && $field['array'] === true ? 'filterArray' : 'filterText';
}
return self::$method($value, $validate, $field);
@@ -127,22 +122,26 @@ class Validation
*/
public static function typeText($value, array $params, array $field)
{
if (!is_string($value) && !is_numeric($value)) {
if (!\is_string($value) && !is_numeric($value)) {
return false;
}
$value = (string)$value;
if (isset($params['min']) && strlen($value) < $params['min']) {
if (!empty($params['trim'])) {
$value = trim($value);
}
if (isset($params['min']) && \strlen($value) < $params['min']) {
return false;
}
if (isset($params['max']) && strlen($value) > $params['max']) {
if (isset($params['max']) && \strlen($value) > $params['max']) {
return false;
}
$min = isset($params['min']) ? $params['min'] : 0;
if (isset($params['step']) && (strlen($value) - $min) % $params['step'] == 0) {
$min = $params['min'] ?? 0;
if (isset($params['step']) && (\strlen($value) - $min) % $params['step'] === 0) {
return false;
}
@@ -155,17 +154,21 @@ class Validation
protected static function filterText($value, array $params, array $field)
{
if (!empty($params['trim'])) {
$value = trim($value);
}
return (string) $value;
}
protected static function filterCommaList($value, array $params, array $field)
{
return is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
return \is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
}
public static function typeCommaList($value, array $params, array $field)
{
return is_array($value) ? true : self::typeText($value, $params, $field);
return \is_array($value) ? true : self::typeText($value, $params, $field);
}
protected static function filterLower($value, array $params)
@@ -234,6 +237,7 @@ class Validation
{
// Set multiple: true so checkboxes can easily use min/max counts to control number of options required
$field['multiple'] = true;
return self::typeArray((array) $value, $params, $field);
}
@@ -252,16 +256,10 @@ class Validation
*/
public static function typeCheckbox($value, array $params, array $field)
{
$value = (string) $value;
$value = (string)$value;
$field_value = (string)($field['value'] ?? '1');
if (!isset($field['value'])) {
$field['value'] = 1;
}
if (isset($value) && $value != $field['value']) {
return false;
}
return true;
return $value === $field_value;
}
/**
@@ -287,6 +285,10 @@ class Validation
*/
public static function typeToggle($value, array $params, array $field)
{
if (\is_bool($value)) {
$value = (int)$value;
}
return self::typeArray((array) $value, $params, $field);
}
@@ -300,12 +302,12 @@ class Validation
*/
public static function typeFile($value, array $params, array $field)
{
return self::typeArray((array) $value, $params, $field);
return self::typeArray((array)$value, $params, $field);
}
protected static function filterFile($value, array $params, array $field)
{
return (array) $value;
return (array)$value;
}
/**
@@ -343,12 +345,9 @@ class Validation
return false;
}
$min = isset($params['min']) ? $params['min'] : 0;
if (isset($params['step']) && fmod($value - $min, $params['step']) == 0) {
return false;
}
$min = $params['min'] ?? 0;
return true;
return !(isset($params['step']) && fmod($value - $min, $params['step']) === 0);
}
protected static function filterNumber($value, array $params, array $field)
@@ -408,10 +407,10 @@ class Validation
*/
public static function typeEmail($value, array $params, array $field)
{
$values = !is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
$values = !\is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
foreach ($values as $value) {
if (!(self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_EMAIL))) {
foreach ($values as $val) {
if (!(self::typeText($val, $params, $field) && filter_var($val, FILTER_VALIDATE_EMAIL))) {
return false;
}
}
@@ -445,9 +444,11 @@ class Validation
{
if ($value instanceof \DateTime) {
return true;
} elseif (!is_string($value)) {
}
if (!\is_string($value)) {
return false;
} elseif (!isset($params['format'])) {
}
if (!isset($params['format'])) {
return false !== strtotime($value);
}
@@ -479,10 +480,10 @@ class Validation
*/
public static function typeDate($value, array $params, array $field)
{
$params = array($params);
if (!isset($params['format'])) {
$params['format'] = 'Y-m-d';
}
return self::typeDatetime($value, $params, $field);
}
@@ -496,10 +497,10 @@ class Validation
*/
public static function typeTime($value, array $params, array $field)
{
$params = array($params);
if (!isset($params['format'])) {
$params['format'] = 'H:i';
}
return self::typeDatetime($value, $params, $field);
}
@@ -513,10 +514,10 @@ class Validation
*/
public static function typeMonth($value, array $params, array $field)
{
$params = array($params);
if (!isset($params['format'])) {
$params['format'] = 'Y-m';
}
return self::typeDatetime($value, $params, $field);
}
@@ -533,6 +534,7 @@ class Validation
if (!isset($params['format']) && !preg_match('/^\d{4}-W\d{2}$/u', $value)) {
return false;
}
return self::typeDatetime($value, $params, $field);
}
@@ -546,72 +548,80 @@ class Validation
*/
public static function typeArray($value, array $params, array $field)
{
if (!is_array($value)) {
if (!\is_array($value)) {
return false;
}
if (isset($field['multiple'])) {
if (isset($params['min']) && count($value) < $params['min']) {
if (isset($params['min']) && \count($value) < $params['min']) {
return false;
}
if (isset($params['max']) && count($value) > $params['max']) {
if (isset($params['max']) && \count($value) > $params['max']) {
return false;
}
$min = isset($params['min']) ? $params['min'] : 0;
if (isset($params['step']) && (count($value) - $min) % $params['step'] == 0) {
$min = $params['min'] ?? 0;
if (isset($params['step']) && (\count($value) - $min) % $params['step'] === 0) {
return false;
}
}
$options = isset($field['options']) ? array_keys($field['options']) : array();
$values = isset($field['use']) && $field['use'] == 'keys' ? array_keys($value) : $value;
if ($options && array_diff($values, $options)) {
return false;
$options = $field['options'] ?? [];
$use = $field['use'] ?? 'values';
if (empty($field['selectize']) || empty($field['multiple'])) {
$options = array_keys($options);
}
if ($use === 'keys') {
$value = array_keys($value);
}
return true;
return !($options && array_diff($value, $options));
}
protected static function filterArray($value, $params, $field)
{
$values = (array) $value;
$options = isset($field['options']) ? array_keys($field['options']) : array();
$multi = isset($field['multiple']) ? $field['multiple'] : false;
$options = isset($field['options']) ? array_keys($field['options']) : [];
$multi = $field['multiple'] ?? false;
if (count($values) == 1 && isset($values[0]) && $values[0] == '') {
if (\count($values) === 1 && isset($values[0]) && $values[0] === '') {
return null;
}
if ($options) {
$useKey = isset($field['use']) && $field['use'] == 'keys';
foreach ($values as $key => $value) {
$values[$key] = $useKey ? (bool) $value : $value;
$useKey = isset($field['use']) && $field['use'] === 'keys';
foreach ($values as $key => $val) {
$values[$key] = $useKey ? (bool) $val : $val;
}
}
if ($multi) {
foreach ($values as $key => $value) {
if (is_array($value)) {
$value = implode(',', $value);
$values[$key] = array_map('trim', explode(',', $value));
foreach ($values as $key => $val) {
if (\is_array($val)) {
$val = implode(',', $val);
$values[$key] = array_map('trim', explode(',', $val));
} else {
$values[$key] = trim($value);
$values[$key] = trim($val);
}
}
}
if (isset($field['ignore_empty']) && Utils::isPositive($field['ignore_empty'])) {
foreach ($values as $key => $value) {
foreach ($value as $inner_key => $inner_value) {
if ($inner_value == '') {
unset($value[$inner_key]);
foreach ($values as $key => $val) {
if ($val === '') {
unset($values[$key]);
} elseif (\is_array($val)) {
foreach ($val as $inner_key => $inner_value) {
if ($inner_value === '') {
unset($val[$inner_key]);
}
}
}
$values[$key] = $value;
$values[$key] = $val;
}
}
@@ -620,7 +630,7 @@ class Validation
public static function typeList($value, array $params, array $field)
{
if (!is_array($value)) {
if (!\is_array($value)) {
return false;
}
@@ -628,7 +638,7 @@ class Validation
foreach ($value as $key => $item) {
foreach ($field['fields'] as $subKey => $subField) {
$subKey = trim($subKey, '.');
$subValue = isset($item[$subKey]) ? $item[$subKey] : null;
$subValue = $item[$subKey] ?? null;
self::validate($subValue, $subField);
}
}
@@ -644,7 +654,7 @@ class Validation
public static function filterYaml($value, $params)
{
if (!is_string($value)) {
if (!\is_string($value)) {
return $value;
}
@@ -670,6 +680,23 @@ class Validation
return $value;
}
/**
* Input value which can be ignored.
*
* @param mixed $value Value to be validated.
* @param array $params Validation parameters.
* @param array $field Blueprint for the field.
* @return bool True if validation succeeded.
*/
public static function typeUnset($value, array $params, array $field)
{
return true;
}
public static function filterUnset($value, array $params, array $field)
{
return null;
}
// HTML5 attributes (min, max and range are handled inside the types)
@@ -677,9 +704,9 @@ class Validation
{
if (is_scalar($value)) {
return (bool) $params !== true || $value !== '';
} else {
return (bool) $params !== true || !empty($value);
}
return (bool) $params !== true || !empty($value);
}
public static function validatePattern($value, $params)
@@ -702,12 +729,12 @@ class Validation
public static function typeBool($value, $params)
{
return is_bool($value) || $value == 1 || $value == 0;
return \is_bool($value) || $value == 1 || $value == 0;
}
public static function validateBool($value, $params)
{
return is_bool($value) || $value == 1 || $value == 0;
return \is_bool($value) || $value == 1 || $value == 0;
}
protected static function filterBool($value, $params)
@@ -722,7 +749,7 @@ class Validation
public static function validateFloat($value, $params)
{
return is_float(filter_var($value, FILTER_VALIDATE_FLOAT));
return \is_float(filter_var($value, FILTER_VALIDATE_FLOAT));
}
protected static function filterFloat($value, $params)
@@ -737,20 +764,17 @@ class Validation
public static function validateInt($value, $params)
{
return is_numeric($value) && (int) $value == $value;
return is_numeric($value) && (int)$value == $value;
}
protected static function filterInt($value, $params)
{
return (int) $value;
return (int)$value;
}
public static function validateArray($value, $params)
{
return is_array($value)
|| ($value instanceof \ArrayAccess
&& $value instanceof \Traversable
&& $value instanceof \Countable);
return \is_array($value) || ($value instanceof \ArrayAccess && $value instanceof \Traversable && $value instanceof \Countable);
}
public static function filterItem_List($value, $params)

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Data
* @package Grav\Common\Data
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -18,7 +19,7 @@ class ValidationException extends \RuntimeException
$this->messages = $messages;
$language = Grav::instance()['language'];
$this->message = $language->translate('FORM.VALIDATION_FAIL', null, true) . ' ' . $this->message;
$this->message = $language->translate('GRAV.FORM.VALIDATION_FAIL', null, true) . ' ' . $this->message;
foreach ($messages as $variable => &$list) {
$list = array_unique($list);

View File

@@ -1,15 +1,22 @@
<?php
/**
* @package Grav.Common
* @package Grav\Common
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common;
use DebugBar\DataCollector\ConfigCollector;
use DebugBar\DataCollector\ExceptionsCollector;
use DebugBar\DataCollector\MemoryCollector;
use DebugBar\DataCollector\MessagesCollector;
use DebugBar\DataCollector\PhpInfoCollector;
use DebugBar\DataCollector\RequestDataCollector;
use DebugBar\DataCollector\TimeDataCollector;
use DebugBar\DebugBar;
use DebugBar\JavascriptRenderer;
use DebugBar\StandardDebugBar;
use Grav\Common\Config\Config;
@@ -28,13 +35,18 @@ class Debugger
/** @var StandardDebugBar $debugbar */
protected $debugbar;
/** @var bool */
protected $enabled;
protected $initialized = false;
/** @var array */
protected $timers = [];
/** @var string[] $deprecations */
protected $deprecations = [];
/** @var callable */
protected $errorHandler;
/**
@@ -42,11 +54,26 @@ class Debugger
*/
public function __construct()
{
$currentTime = microtime(true);
if (!\defined('GRAV_REQUEST_TIME')) {
\define('GRAV_REQUEST_TIME', $currentTime);
}
// Enable debugger until $this->init() gets called.
$this->enabled = true;
$this->debugbar = new StandardDebugBar();
$this->debugbar['time']->addMeasure('Loading', $this->debugbar['time']->getRequestStartTime(), microtime(true));
$debugbar = new DebugBar();
$debugbar->addCollector(new PhpInfoCollector());
$debugbar->addCollector(new MessagesCollector());
$debugbar->addCollector(new RequestDataCollector());
$debugbar->addCollector(new TimeDataCollector($_SERVER['REQUEST_TIME_FLOAT'] ?? GRAV_REQUEST_TIME));
$debugbar['time']->addMeasure('Server', $debugbar['time']->getRequestStartTime(), GRAV_REQUEST_TIME);
$debugbar['time']->addMeasure('Loading', GRAV_REQUEST_TIME, $currentTime);
$debugbar['time']->addMeasure('Debugger', $currentTime, microtime(true));
$this->debugbar = $debugbar;
// Set deprecation collector.
$this->setErrorHandler();
@@ -60,6 +87,10 @@ class Debugger
*/
public function init()
{
if ($this->initialized) {
return $this;
}
$this->grav = Grav::instance();
$this->config = $this->grav['config'];
@@ -67,14 +98,17 @@ class Debugger
$this->enabled = $this->config->get('system.debugger.enabled');
if ($this->enabled()) {
$this->initialized = true;
$plugins_config = (array)$this->config->get('plugins');
ksort($plugins_config);
$this->debugbar->addCollector(new ConfigCollector((array)$this->config->get('system'), 'Config'));
$this->debugbar->addCollector(new ConfigCollector($plugins_config, 'Plugins'));
$debugbar = $this->debugbar;
$debugbar->addCollector(new MemoryCollector());
$debugbar->addCollector(new ExceptionsCollector());
$debugbar->addCollector(new ConfigCollector((array)$this->config->get('system'), 'Config'));
$debugbar->addCollector(new ConfigCollector($plugins_config, 'Plugins'));
$this->addMessage('Grav v' . GRAV_VERSION);
}
@@ -229,14 +263,14 @@ class Debugger
/**
* Start a timer with an associated name and description
*
* @param $name
* @param string $name
* @param string|null $description
*
* @return $this
*/
public function startTimer($name, $description = null)
{
if ($name[0] === '_' || $this->enabled()) {
if (strpos($name, '_') === 0 || $this->enabled()) {
$this->debugbar['time']->startMeasure($name, $description);
$this->timers[] = $name;
}
@@ -253,7 +287,7 @@ class Debugger
*/
public function stopTimer($name)
{
if (in_array($name, $this->timers, true) && ($name[0] === '_' || $this->enabled())) {
if (\in_array($name, $this->timers, true) && (strpos($name, '_') === 0 || $this->enabled())) {
$this->debugbar['time']->stopMeasure($name);
}
@@ -286,7 +320,7 @@ class Debugger
*/
public function addException(\Exception $e)
{
if ($this->enabled()) {
if ($this->initialized && $this->enabled()) {
$this->debugbar['exceptions']->addException($e);
}
@@ -411,8 +445,8 @@ class Debugger
$trace = [];
foreach ($deprecated['trace'] as $current) {
$class = isset($current['class']) ? $current['class'] : '';
$type = isset($current['type']) ? $current['type'] : '';
$class = $current['class'] ?? '';
$type = $current['type'] ?? '';
$function = $this->getFunction($current);
if (isset($current['file'])) {
$current['file'] = str_replace(GRAV_ROOT . '/', '', $current['file']);

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Errors
* @package Grav\Common\Errors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -18,6 +19,13 @@ class BareHandler extends Handler
*/
public function handle()
{
$inspector = $this->getInspector();
$code = $inspector->getException()->getCode();
if ( ($code >= 400) && ($code < 600) )
{
$this->getRun()->sendHttpCode($code);
}
return Handler::QUIT;
}

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Errors
* @package Grav\Common\Errors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -17,11 +18,11 @@ class Errors
{
$grav = Grav::instance();
$config = $grav['config']->get('system.errors');
$jsonRequest = $_SERVER && isset($_SERVER['HTTP_ACCEPT']) && $_SERVER['HTTP_ACCEPT'] == 'application/json';
$jsonRequest = $_SERVER && isset($_SERVER['HTTP_ACCEPT']) && $_SERVER['HTTP_ACCEPT'] === 'application/json';
// Setup Whoops-based error handler
$system = new SystemFacade;
$whoops = new \Whoops\Run($system);
$whoops = new Whoops\Run($system);
$verbosity = 1;
@@ -49,17 +50,8 @@ class Errors
break;
}
if (method_exists('Whoops\Util\Misc', 'isAjaxRequest')) { //Whoops 2.0
if (Whoops\Util\Misc::isAjaxRequest() || $jsonRequest) {
$whoops->pushHandler(new Whoops\Handler\JsonResponseHandler);
}
} elseif (function_exists('Whoops\isAjaxRequest')) { //Whoops 2.0.0-alpha
if (Whoops\isAjaxRequest() || $jsonRequest) {
$whoops->pushHandler(new Whoops\Handler\JsonResponseHandler);
}
} else { //Whoops 1.x
$json_page = new Whoops\Handler\JsonResponseHandler;
$json_page->onlyForAjaxRequests(true);
if (Whoops\Util\Misc::isAjaxRequest() || $jsonRequest) {
$whoops->pushHandler(new Whoops\Handler\JsonResponseHandler);
}
if (isset($config['log']) && $config['log']) {

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Errors
* @package Grav\Common\Errors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -20,7 +21,7 @@ class SimplePageHandler extends Handler
public function __construct()
{
// Add the default, local resource search path:
$this->searchPaths[] = __DIR__ . "/Resources";
$this->searchPaths[] = __DIR__ . '/Resources';
}
/**
@@ -31,10 +32,14 @@ class SimplePageHandler extends Handler
$inspector = $this->getInspector();
$helper = new TemplateHelper();
$templateFile = $this->getResource("layout.html.php");
$cssFile = $this->getResource("error.css");
$templateFile = $this->getResource('layout.html.php');
$cssFile = $this->getResource('error.css');
$code = $inspector->getException()->getCode();
if ( ($code >= 400) && ($code < 600) )
{
$this->getRun()->sendHttpCode($code);
}
$message = $inspector->getException()->getMessage();
if ($inspector->getException() instanceof \ErrorException) {
@@ -42,9 +47,9 @@ class SimplePageHandler extends Handler
}
$vars = array(
"stylesheet" => file_get_contents($cssFile),
"code" => $code,
"message" => filter_var(rawurldecode($message), FILTER_SANITIZE_STRING),
'stylesheet' => file_get_contents($cssFile),
'code' => $code,
'message' => filter_var(rawurldecode($message), FILTER_SANITIZE_STRING),
);
$helper->setVariables($vars);
@@ -70,7 +75,7 @@ class SimplePageHandler extends Handler
// Search through available search paths, until we find the
// resource we're after:
foreach ($this->searchPaths as $path) {
$fullPath = $path . "/$resource";
$fullPath = "{$path}/{$resource}";
if (is_file($fullPath)) {
// Cache the result:

View File

@@ -1,8 +1,9 @@
<?php
/**
* @package Grav.Common.Errors
* @package Grav\Common\Errors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

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