• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FluidTYPO3 / vhs / 13014063024

28 Jan 2025 03:39PM UTC coverage: 71.952% (+0.08%) from 71.877%
13014063024

Pull #1930

github

web-flow
Merge 7683654f2 into 388420fff
Pull Request #1930: [TASK] Make tests run on v13

9 of 9 new or added lines in 2 files covered. (100.0%)

9 existing lines in 2 files now uncovered.

5636 of 7833 relevant lines covered (71.95%)

17.17 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.46
/Classes/ViewHelpers/Resource/LanguageViewHelper.php
1
<?php
2
namespace FluidTYPO3\Vhs\ViewHelpers\Resource;
3

4
/*
5
 * This file is part of the FluidTYPO3/Vhs project under GPLv2 or later.
6
 *
7
 * For the full copyright and license information, please read the
8
 * LICENSE.md file that was distributed with this source code.
9
 */
10

11
use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
12
use FluidTYPO3\Vhs\Utility\ContextUtility;
13
use FluidTYPO3\Vhs\Utility\RequestResolver;
14
use Psr\Http\Message\ServerRequestInterface;
15
use TYPO3\CMS\Core\Localization\Locale;
16
use TYPO3\CMS\Core\Localization\LocalizationFactory;
17
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
18
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
19
use TYPO3\CMS\Core\Utility\GeneralUtility;
20
use TYPO3\CMS\Lang\LanguageService;
21
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
22

23
/**
24
 * Resource: Language
25
 *
26
 * Reads a certain language file with returning not just one single label,
27
 * but all the translated labels.
28
 *
29
 * ### Examples
30
 *
31
 * ```
32
 * <!-- Tag usage for force getting labels in a specific language (different to current is possible too) -->
33
 * <v:resource.language extensionName="myext" path="Path/To/Locallang.xlf" languageKey="en"/>
34
 * ```
35
 *
36
 * ```
37
 * <!-- Tag usage for getting labels of current language -->
38
 * <v:resource.language extensionName="myext" path="Path/To/Locallang.xlf"/>
39
 * ```
40
 */
41
class LanguageViewHelper extends AbstractViewHelper
42
{
43
    use TemplateVariableViewHelperTrait;
44

45
    const LOCALLANG_DEFAULT = 'locallang.xlf';
46

47
    /**
48
     * @var boolean
49
     */
50
    protected $escapeOutput = false;
51

52
    public function initializeArguments(): void
53
    {
54
        $this->registerAsArgument();
6✔
55
        $this->registerArgument('extensionName', 'string', 'Name of the extension');
6✔
56
        $this->registerArgument(
6✔
57
            'path',
6✔
58
            'string',
6✔
59
            'Absolute or relative path to the locallang file',
6✔
60
            false,
6✔
61
            static::LOCALLANG_DEFAULT
6✔
62
        );
6✔
63
        $this->registerArgument(
6✔
64
            'languageKey',
6✔
65
            'string',
6✔
66
            'Key for getting translation of a different than current initialized language'
6✔
67
        );
6✔
68
    }
69

70
    /**
71
     * The main render method of this ViewHelper.
72
     *
73
     * @return mixed
74
     */
75
    public function render()
76
    {
77
        $path = $this->getResolvedPath();
6✔
78
        $languageKey = $this->getLanguageKey();
6✔
79
        /** @var LocalizationFactory $languageFactory */
80
        $languageFactory = GeneralUtility::makeInstance(LocalizationFactory::class);
6✔
81
        $locallang = (array) $languageFactory->getParsedData($path, $languageKey);
6✔
82
        $labels = $this->getLabelsByLanguageKey($locallang, $languageKey);
6✔
83
        $labels = $this->getLabelsFromTarget($labels);
6✔
84
        return $this->renderChildrenWithVariableOrReturnInput($labels);
6✔
85
    }
86

87
    /**
88
     * Gets the extension name from defined argument or
89
     * tries to resolve it from the controller context if not set.
90
     */
91
    protected function getResolvedExtensionName(): ?string
92
    {
93
        /** @var string|null $extensionName */
94
        $extensionName = $this->arguments['extensionName'];
6✔
95

96
        return $extensionName
6✔
97
            ?? RequestResolver::resolveControllerExtensionNameFromRenderingContext($this->renderingContext);
6✔
98
    }
99

100
    /**
101
     * Gets the resolved file path with trying to resolve relative paths even if no
102
     * extension key is defined.
103
     */
104
    protected function getResolvedPath(): string
105
    {
106
        /** @var string $path */
107
        $path = $this->arguments['path'];
6✔
108
        $absoluteFileName = GeneralUtility::getFileAbsFileName($path);
6✔
109

110
        if (!file_exists($absoluteFileName) && ($extensionName = $this->getResolvedExtensionName())) {
6✔
111
            $extensionKey = GeneralUtility::camelCaseToLowerCaseUnderscored($extensionName);
6✔
112
            $absoluteFileName = ExtensionManagementUtility::extPath($extensionKey, $path);
6✔
113
        }
114

115
        return $absoluteFileName;
6✔
116
    }
117

118
    /**
119
     * Gets the translated labels by a specific language key
120
     * or fallback to 'default'.
121
     */
122
    protected function getLabelsByLanguageKey(array $locallang, string $languageKey): array
123
    {
124
        $labels = [];
6✔
125

126
        if (!empty($locallang[$languageKey])) {
6✔
127
            $labels = $locallang[$languageKey];
×
128
        } elseif (!empty($locallang['default'])) {
6✔
129
            $labels = $locallang['default'];
×
130
        }
131

132
        return $labels;
6✔
133
    }
134

135
    /**
136
     * Simplify label array with just taking the value from target.
137
     */
138
    protected function getLabelsFromTarget(array $labels): array
139
    {
140
        foreach ($labels as $labelKey => $label) {
6✔
141
            $labels[$labelKey] = $label[0]['target'];
×
142
        }
143

144
        return $labels;
6✔
145
    }
146

147
    /**
148
     * Gets the language key from arguments or from current
149
     * initialized language if argument is not defined.
150
     */
151
    protected function getLanguageKey(): string
152
    {
153
        /** @var string|null $languageKey */
154
        $languageKey = $this->arguments['languageKey'];
6✔
155
        return $languageKey ?? $this->getInitializedLanguage();
6✔
156
    }
157

158
    /**
159
     * Gets the key of current initialized language
160
     * or fallback to 'default'.
161
     */
162
    protected function getInitializedLanguage(): string
163
    {
164
        $language = 'default';
6✔
165

166
        if (ContextUtility::isFrontend()) {
6✔
167
            /** @var ServerRequestInterface $request */
168
            $request = $GLOBALS['TYPO3_REQUEST'];
6✔
169
            /** @var SiteLanguage $language */
170
            $language = $request->getAttribute('language');
6✔
171
            /** @var Locale|string $locale */
172
            $locale = $language->getLocale();
6✔
173
            if (is_string($locale)) {
6✔
174
                return $locale;
3✔
175
            }
176
            return $locale->getLanguageCode();
3✔
177
        } elseif ($GLOBALS['LANG'] instanceof LanguageService) {
×
178
            $language = $GLOBALS['LANG']->lang;
×
179
        }
180

UNCOV
181
        return (string) $language;
×
182
    }
183
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc