From f6c30cbeaec508c074aae2cdc90a01579ec03d52 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 26 Jun 2019 10:18:14 +0300 Subject: [PATCH 1/7] Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list --- CHANGELOG.md | 2 + system/src/Grav/Common/Language/Language.php | 9 +- system/src/Grav/Common/Page/Page.php | 88 ++++++++++++++------ 3 files changed, 74 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff71f3d1f..94399eb1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ 1. [](#new) * Added support for custom `FormFlash` save locations +1. [](#bugfix) + * Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list # v1.6.11 ## 06/21/2019 diff --git a/system/src/Grav/Common/Language/Language.php b/system/src/Grav/Common/Language/Language.php index 81abbc11a..e02f775ff 100644 --- a/system/src/Grav/Common/Language/Language.php +++ b/system/src/Grav/Common/Language/Language.php @@ -25,7 +25,7 @@ class Language protected $page_extensions = []; protected $fallback_languages = []; protected $default; - protected $active = null; + protected $active; /** @var Config $config */ protected $config; @@ -534,4 +534,11 @@ class Language return LanguageCodes::get($code, $type); } + public function __debugInfo() + { + $vars = get_object_vars($this); + unset($vars['grav'], $vars['config']); + + return $vars; + } } diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index bcf7539bd..b47b2da8a 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -15,6 +15,7 @@ use Grav\Common\Data\Blueprint; use Grav\Common\File\CompiledYamlFile; use Grav\Common\Filesystem\Folder; use Grav\Common\Grav; +use Grav\Common\Language\Language; use Grav\Common\Markdown\Parsedown; use Grav\Common\Markdown\ParsedownExtra; use Grav\Common\Page\Interfaces\PageInterface; @@ -129,7 +130,10 @@ class Page implements PageInterface */ public function init(\SplFileInfo $file, $extension = null) { - $config = Grav::instance()['config']; + $grav = Grav::instance(); + + /** @var Config $config */ + $config = $grav['config']; // some extension logic if (empty($extension)) { @@ -139,8 +143,13 @@ class Page implements PageInterface } // extract page language from page extension - $language = trim(basename($this->extension(), 'md'), '.') ?: null; - $this->language($language); + $languageCode = trim(basename($this->extension(), 'md'), '.') ?: null; + if (!$languageCode) { + /** @var Language $language */ + $language = $grav['language']; + $languageCode = $language->enabled() ? $language->getDefault() : null; + } + $this->language($languageCode); $this->hide_home_route = $config->get('system.home.hide_in_urls', false); $this->home_route = $this->adjustRouteCase($config->get('system.home.alias')); @@ -188,16 +197,32 @@ class Page implements PageInterface */ public function translatedLanguages($onlyPublished = false) { - $filename = substr($this->name, 0, -(strlen($this->extension()))); - $config = Grav::instance()['config']; - $languages = $config->get('system.languages.supported', []); + $grav = Grav::instance(); + + /** @var Language $language */ + $language = $grav['language']; + + $languages = $language->getLanguages(); + $defaultCode = $language->getDefault(); + + $name = substr($this->name, 0, -strlen($this->extension())); $translatedLanguages = []; - foreach ($languages as $language) { - $path = $this->path . DS . $this->folder . DS . $filename . '.' . $language . '.md'; - if (file_exists($path)) { + foreach ($languages as $languageCode) { + $languageExtension = ".{$languageCode}.md"; + $path = $this->path . DS . $this->folder . DS . $name . $languageExtension; + $exists = file_exists($path); + + // Default language may be saved without language file location. + if (!$exists && $languageCode === $defaultCode) { + $languageExtension = '.md'; + $path = $this->path . DS . $this->folder . DS . $name . $languageExtension; + $exists = file_exists($path); + } + + if ($exists) { $aPage = new Page(); - $aPage->init(new \SplFileInfo($path), $language . '.md'); + $aPage->init(new \SplFileInfo($path), $languageExtension); $route = $aPage->header()->routes['default'] ?? $aPage->rawRoute(); if (!$route) { @@ -208,7 +233,7 @@ class Page implements PageInterface continue; } - $translatedLanguages[$language] = $route; + $translatedLanguages[$languageCode] = $route; } } @@ -224,22 +249,37 @@ class Page implements PageInterface */ public function untranslatedLanguages($includeUnpublished = false) { - $filename = substr($this->name, 0, -strlen($this->extension())); - $config = Grav::instance()['config']; - $languages = $config->get('system.languages.supported', []); + $grav = Grav::instance(); + + /** @var Language $language */ + $language = $grav['language']; + + $languages = $language->getLanguages(); + $defaultCode = $language->getDefault(); + + $name = substr($this->name, 0, -strlen($this->extension())); $untranslatedLanguages = []; - foreach ($languages as $language) { - $path = $this->path . DS . $this->folder . DS . $filename . '.' . $language . '.md'; - if (file_exists($path)) { - $aPage = new Page(); - $aPage->init(new \SplFileInfo($path), $language . '.md'); - if ($includeUnpublished && !$aPage->published()) { - $untranslatedLanguages[] = $language; - } - } else { - $untranslatedLanguages[] = $language; + foreach ($languages as $languageCode) { + $path = $this->path . DS . $this->folder . DS . $name . '.' . $languageCode . '.md'; + $exists = file_exists($path); + + // Default language may be saved without language file location. + if (!$exists && $languageCode === $defaultCode) { + $path = $this->path . DS . $this->folder . DS . $name . '.md'; + $exists = file_exists($path); } + + if ($exists && !$includeUnpublished) { + $aPage = new Page(); + $aPage->init(new \SplFileInfo($path), $languageCode . '.md'); + + if (!$aPage->published()) { + continue; + } + } + + $untranslatedLanguages[] = $languageCode; } return $untranslatedLanguages; From e0e29f468b785835d244a19476ef7415b0f85791 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 12:06:07 +0300 Subject: [PATCH 2/7] Fixed `Language::getFallbackPageExtensions()` to append `.md` file after the default language extension --- CHANGELOG.md | 1 + system/src/Grav/Common/Language/Language.php | 40 ++++++++++++-------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94399eb1d..492a68ca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Added support for custom `FormFlash` save locations 1. [](#bugfix) * Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list + * Fixed `Language::getFallbackPageExtensions()` to append `.md` file after the default language extension # v1.6.11 ## 06/21/2019 diff --git a/system/src/Grav/Common/Language/Language.php b/system/src/Grav/Common/Language/Language.php index e02f775ff..b5876f086 100644 --- a/system/src/Grav/Common/Language/Language.php +++ b/system/src/Grav/Common/Language/Language.php @@ -291,26 +291,36 @@ class Language } if ($this->enabled()) { + $default = $this->getDefault() ?? 'en'; + $active = $this->getActive() ?? $default; + $valid_lang_extensions = []; - foreach ($this->languages as $lang) { - $valid_lang_extensions[] = '.' . $lang . $file_ext; + + // First add active language. + $valid_lang_extensions[$active] = '.' . $active . $file_ext; + + // If active language is the same as default, count it in, too. + if ($active === $default) { + $valid_lang_extensions[''] = $file_ext; } - if ($this->active) { - $active_extension = '.' . $this->active . $file_ext; - $key = \array_search($active_extension, $valid_lang_extensions, true); - - // Default behavior is to find any language other than active - if ($this->config->get('system.languages.pages_fallback_only')) { - $slice = \array_slice($valid_lang_extensions, 0, $key+1); - $valid_lang_extensions = array_reverse($slice); - } else { - unset($valid_lang_extensions[$key]); - array_unshift($valid_lang_extensions, $active_extension); + if ($this->config->get('system.languages.pages_fallback_only')) { + // Add the extensionless default. + if ($active !== $default) { + $valid_lang_extensions[$default] = '.' . $default . $file_ext; + $valid_lang_extensions[''] = $file_ext; + } + } else { + // We want to have full list of languages. + foreach ($this->languages as $lang) { + $valid_lang_extensions[$lang] = '.' . $lang . $file_ext; + if ($active !== $default) { + $valid_lang_extensions[''] = $file_ext; + } } } - $valid_lang_extensions[] = $file_ext; - $this->page_extensions = $valid_lang_extensions; + + $this->page_extensions = array_values($valid_lang_extensions); } else { $this->page_extensions = (array)$file_ext; } From 8f391d327a4a9754fd8517560e73792c91402e44 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 13:01:11 +0300 Subject: [PATCH 3/7] Fixed another bug in Page::untranslatedLanguages() --- system/src/Grav/Common/Page/Page.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index b47b2da8a..5ea99885c 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -270,7 +270,11 @@ class Page implements PageInterface $exists = file_exists($path); } - if ($exists && !$includeUnpublished) { + if ($exists) { + if ($includeUnpublished) { + continue; + } + $aPage = new Page(); $aPage->init(new \SplFileInfo($path), $languageCode . '.md'); From b54e4fb71b628453128cf266e238e262d5ada9dd Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 13:49:31 +0300 Subject: [PATCH 4/7] Better form value handling for page name --- system/src/Grav/Common/Page/Page.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 5ea99885c..5da8920cb 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -966,13 +966,16 @@ class Page implements PageInterface return $this->slug(); } if ($name === 'name') { + $name = $this->name(); $language = $this->language() ? '.' . $this->language() : ''; - $name_val = str_replace($language . '.md', '', $this->name()); + $pattern = '%(' . preg_quote($language, '%') . ')?\.md$%'; + $name = preg_replace($pattern, '', $name); + if ($this->modular()) { - return 'modular/' . $name_val; + return 'modular/' . $name; } - return $name_val; + return $name; } if ($name === 'media') { return $this->media()->all(); From ffa2e0a6f6a1c7586adb773cef46bc80d84f2045 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 14:44:35 +0300 Subject: [PATCH 5/7] Added new configuration option `system.languages.include_default_lang_file_extension` to keep default language in `.md` files if set to `false` --- CHANGELOG.md | 1 + system/blueprints/config/system.yaml | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 492a68ca4..817b9eb69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 1. [](#new) * Added support for custom `FormFlash` save locations + * Added new configuration option `system.languages.include_default_lang_file_extension` to keep default language in `.md` files if set to `false` 1. [](#bugfix) * Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list * Fixed `Language::getFallbackPageExtensions()` to append `.md` file after the default language extension diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index f67b92c84..c8c841b7b 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -340,6 +340,17 @@ form: validate: type: bool + languages.include_default_lang_file_extension: + type: toggle + label: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG_FILE_EXTENSION + help: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG_HELP_FILE_EXTENSION + highlight: 1 + options: + 1: PLUGIN_ADMIN.YES + 0: PLUGIN_ADMIN.NO + validate: + type: bool + languages.pages_fallback_only: type: toggle label: PLUGIN_ADMIN.PAGES_FALLBACK_ONLY From 91d20d88407d40d915fba9989193fb90f826696b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 14:47:05 +0300 Subject: [PATCH 6/7] Changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e00dac79..574fb9f8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,11 @@ 1. [](#new) * Added support for custom `FormFlash` save locations + * Added new configuration option `system.languages.include_default_lang_file_extension` to keep default language in `.md` files if set to `false` 1. [](#improved) * Use new `Utils::getSupportedPageTypes()` to enforce `html,htm` at the front of the list [#2531](https://github.com/getgrav/grav/issues/2531) 1. [](#bugfix) * Fixed some potential issues when `$grav['user']` is not set - * Added new configuration option `system.languages.include_default_lang_file_extension` to keep default language in `.md` files if set to `false` * Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list * Fixed `Language::getFallbackPageExtensions()` to append `.md` file after the default language extension From 3f176c1924e2ce1a40c28d0ae7521133cb75902f Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 27 Jun 2019 17:59:05 +0300 Subject: [PATCH 7/7] Changelog update --- CHANGELOG.md | 1 + system/src/Grav/Common/Language/Language.php | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 574fb9f8e..a86ec0268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * Fixed some potential issues when `$grav['user']` is not set * Fixed `.md` page to be assigned to the default language and to be listed in translated/untranslated page list * Fixed `Language::getFallbackPageExtensions()` to append `.md` file after the default language extension + * Fixed `Language::getFallbackPageExtensions()` returning wrong file extensions when passing custom page extension # v1.6.11 ## 06/21/2019 diff --git a/system/src/Grav/Common/Language/Language.php b/system/src/Grav/Common/Language/Language.php index cc389dc8f..3891b443d 100644 --- a/system/src/Grav/Common/Language/Language.php +++ b/system/src/Grav/Common/Language/Language.php @@ -58,7 +58,7 @@ class Language $this->default = reset($this->languages); } - $this->page_extensions = null; + $this->page_extensions = []; if (empty($this->languages)) { $this->enabled = false; @@ -285,7 +285,9 @@ class Language */ public function getFallbackPageExtensions($file_ext = null) { - if (empty($this->page_extensions)) { + $file_ext = (string)$file_ext; + + if (!isset($this->page_extensions[$file_ext])) { if (!$file_ext) { $file_ext = CONTENT_EXT; } @@ -320,13 +322,13 @@ class Language } } - $this->page_extensions = array_values($valid_lang_extensions); + $this->page_extensions[$file_ext] = array_values($valid_lang_extensions); } else { - $this->page_extensions = (array)$file_ext; + $this->page_extensions[$file_ext] = (array)$file_ext; } } - return $this->page_extensions; + return $this->page_extensions[$file_ext]; } /** @@ -342,7 +344,7 @@ class Language */ public function resetFallbackPageExtensions() { - $this->page_extensions = null; + $this->page_extensions = []; } /**