PageTranslateTrait.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * @package Grav\Common\Flex
  5. *
  6. * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved.
  7. * @license MIT License; see LICENSE file for details.
  8. */
  9. namespace Grav\Common\Flex\Types\Pages\Traits;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Language\Language;
  12. use Grav\Common\Page\Page;
  13. use Grav\Common\Utils;
  14. use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
  15. use SplFileInfo;
  16. /**
  17. * Implements PageTranslateInterface
  18. */
  19. trait PageTranslateTrait
  20. {
  21. /**
  22. * Return an array with the routes of other translated languages
  23. *
  24. * @param bool $onlyPublished only return published translations
  25. * @return array the page translated languages
  26. */
  27. public function translatedLanguages($onlyPublished = false): array
  28. {
  29. if (Utils::isAdminPlugin()) {
  30. return parent::translatedLanguages();
  31. }
  32. $translated = $this->getLanguageTemplates();
  33. if (!$translated) {
  34. return $translated;
  35. }
  36. $grav = Grav::instance();
  37. /** @var Language $language */
  38. $language = $grav['language'];
  39. /** @var UniformResourceLocator $locator */
  40. $locator = $grav['locator'];
  41. $languages = $language->getLanguages();
  42. $languages[] = '';
  43. $defaultCode = $language->getDefault();
  44. if (isset($translated[$defaultCode])) {
  45. unset($translated['']);
  46. }
  47. foreach ($translated as $key => &$template) {
  48. $template .= $key !== '' ? ".{$key}.md" : '.md';
  49. }
  50. unset($template);
  51. $translated = array_intersect_key($translated, array_flip($languages));
  52. $folder = $this->getStorageFolder();
  53. if (!$folder) {
  54. return [];
  55. }
  56. $folder = $locator->isStream($folder) ? $locator->getResource($folder) : GRAV_ROOT . "/{$folder}";
  57. $list = array_fill_keys($languages, null);
  58. foreach ($translated as $languageCode => $languageFile) {
  59. $languageExtension = $languageCode ? ".{$languageCode}.md" : '.md';
  60. $path = "{$folder}/{$languageFile}";
  61. // FIXME: use flex, also rawRoute() does not fully work?
  62. $aPage = new Page();
  63. $aPage->init(new SplFileInfo($path), $languageExtension);
  64. if ($onlyPublished && !$aPage->published()) {
  65. continue;
  66. }
  67. $header = $aPage->header();
  68. // @phpstan-ignore-next-line
  69. $routes = $header->routes ?? [];
  70. $route = $routes['default'] ?? $aPage->rawRoute();
  71. if (!$route) {
  72. $route = $aPage->route();
  73. }
  74. $list[$languageCode ?: $defaultCode] = $route ?? '';
  75. }
  76. $list = array_filter($list, static function ($var) {
  77. return null !== $var;
  78. });
  79. // Hack to get the same result as with old pages.
  80. foreach ($list as &$path) {
  81. if ($path === '') {
  82. $path = null;
  83. }
  84. }
  85. return $list;
  86. }
  87. }