Skip to content

Commit 64b4c9c

Browse files
bakiburakogunlukasdotcom
authored andcommitted
fix: use static language list instead of l10nFactory for translation providers
When force_language is set in config.php, l10nFactory->getLanguages() returns only the forced language, causing translation providers to offer an empty or single-language list. AI translation services can translate any language regardless of installed Nextcloud UI languages. Introduce a shared LanguageList helper class with common ISO 639 languages. Both OldTranslationProvider and TranslateProvider now use this static list instead of depending on l10nFactory for determining available translation languages. Fixes #357 Signed-off-by: Lukas Schaefer <lukas@lschaefer.xyz>
1 parent f2db663 commit 64b4c9c

5 files changed

Lines changed: 47 additions & 25 deletions

File tree

lib/AppInfo/Application.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class Application extends App implements IBootstrap {
8080
public const QUOTA_RULES_CACHE_PREFIX = 'quota_rules';
8181
public const MODELS_CACHE_TTL = 60 * 30;
8282

83-
public const AUDIO_TO_TEXT_LANGUAGES = [['en', 'English'], ['zh', '中文'], ['de', 'Deutsch'], ['es', 'Español'], ['ru', 'Русский'], ['ko', '한국어'], ['fr', 'Français'], ['ja', '日本語'], ['pt', 'Português'], ['tr', 'Türkçe'], ['pl', 'Polski'], ['ca', 'Català'], ['nl', 'Nederlands'], ['ar', 'العربية'], ['sv', 'Svenska'], ['it', 'Italiano'], ['id', 'Bahasa Indonesia'], ['hi', 'हिन्दी'], ['fi', 'Suomi'], ['vi', 'Tiếng Việt'], ['he', 'עברית'], ['uk', 'Українська'], ['el', 'Ελληνικά'], ['ms', 'Bahasa Melayu'], ['cs', 'Česky'], ['ro', 'Română'], ['da', 'Dansk'], ['hu', 'Magyar'], ['ta', 'தமிழ்'], ['no', 'Norsk (bokmål / riksmål)'], ['th', 'ไทย / Phasa Thai'], ['ur', 'اردو'], ['hr', 'Hrvatski'], ['bg', 'Български'], ['lt', 'Lietuvių'], ['la', 'Latina'], ['mi', 'Māori'], ['ml', 'മലയാളം'], ['cy', 'Cymraeg'], ['sk', 'Slovenčina'], ['te', 'తెలుగు'], ['fa', 'فارسی'], ['lv', 'Latviešu'], ['bn', 'বাংলা'], ['sr', 'Српски'], ['az', 'Azərbaycanca / آذربايجان'], ['sl', 'Slovenščina'], ['kn', 'ಕನ್ನಡ'], ['et', 'Eesti'], ['mk', 'Македонски'], ['br', 'Brezhoneg'], ['eu', 'Euskara'], ['is', 'Íslenska'], ['hy', 'Հայերեն'], ['ne', 'नेपाली'], ['mn', 'Монгол'], ['bs', 'Bosanski'], ['kk', 'Қазақша'], ['sq', 'Shqip'], ['sw', 'Kiswahili'], ['gl', 'Galego'], ['mr', 'मराठी'], ['pa', 'ਪੰਜਾਬੀ / पंजाबी / پنجابي'], ['si', 'සිංහල'], ['km', 'ភាសាខ្មែរ'], ['sn', 'chiShona'], ['yo', 'Yorùbá'], ['so', 'Soomaaliga'], ['af', 'Afrikaans'], ['oc', 'Occitan'], ['ka', 'ქართული'], ['be', 'Беларуская'], ['tg', 'Тоҷикӣ'], ['sd', 'सिनधि'], ['gu', 'ગુજરાતી'], ['am', 'አማርኛ'], ['yi', 'ייִדיש'], ['lo', 'ລາວ / Pha xa lao'], ['uz', 'Ўзбек'], ['fo', 'Føroyskt'], ['ht', 'Krèyol ayisyen'], ['ps', 'پښتو'], ['tk', 'Туркмен / تركمن'], ['nn', 'Norsk (nynorsk)'], ['mt', 'bil-Malti'], ['sa', 'संस्कृतम्'], ['lb', 'Lëtzebuergesch'], ['my', 'Myanmasa'], ['bo', 'བོད་ཡིག / Bod skad'], ['tl', 'Tagalog'], ['mg', 'Malagasy'], ['as', 'অসমীয়া'], ['tt', 'Tatarça'], ['haw', 'ʻŌlelo Hawaiʻi'], ['ln', 'Lingála'], ['ha', 'هَوُسَ'], ['ba', 'Башҡорт'], ['jw', 'ꦧꦱꦗꦮ'], ['su', 'Basa Sunda'], ['yue', '粤语']];
83+
public const LANGUAGE_CODES_AND_ENDONYMS = [['en', 'English'], ['zh', '中文'], ['de', 'Deutsch'], ['es', 'Español'], ['ru', 'Русский'], ['ko', '한국어'], ['fr', 'Français'], ['ja', '日本語'], ['pt', 'Português'], ['tr', 'Türkçe'], ['pl', 'Polski'], ['ca', 'Català'], ['nl', 'Nederlands'], ['ar', 'العربية'], ['sv', 'Svenska'], ['it', 'Italiano'], ['id', 'Bahasa Indonesia'], ['hi', 'हिन्दी'], ['fi', 'Suomi'], ['vi', 'Tiếng Việt'], ['he', 'עברית'], ['uk', 'Українська'], ['el', 'Ελληνικά'], ['ms', 'Bahasa Melayu'], ['cs', 'Česky'], ['ro', 'Română'], ['da', 'Dansk'], ['hu', 'Magyar'], ['ta', 'தமிழ்'], ['no', 'Norsk (bokmål / riksmål)'], ['th', 'ไทย / Phasa Thai'], ['ur', 'اردو'], ['hr', 'Hrvatski'], ['bg', 'Български'], ['lt', 'Lietuvių'], ['la', 'Latina'], ['mi', 'Māori'], ['ml', 'മലയാളം'], ['cy', 'Cymraeg'], ['sk', 'Slovenčina'], ['te', 'తెలుగు'], ['fa', 'فارسی'], ['lv', 'Latviešu'], ['bn', 'বাংলা'], ['sr', 'Српски'], ['az', 'Azərbaycanca / آذربايجان'], ['sl', 'Slovenščina'], ['kn', 'ಕನ್ನಡ'], ['et', 'Eesti'], ['mk', 'Македонски'], ['br', 'Brezhoneg'], ['eu', 'Euskara'], ['is', 'Íslenska'], ['hy', 'Հայերեն'], ['ne', 'नेपाली'], ['mn', 'Монгол'], ['bs', 'Bosanski'], ['kk', 'Қазақша'], ['sq', 'Shqip'], ['sw', 'Kiswahili'], ['gl', 'Galego'], ['mr', 'मराठी'], ['pa', 'ਪੰਜਾਬੀ / पंजाबी / پنجابي'], ['si', 'සිංහල'], ['km', 'ភាសាខ្មែរ'], ['sn', 'chiShona'], ['yo', 'Yorùbá'], ['so', 'Soomaaliga'], ['af', 'Afrikaans'], ['oc', 'Occitan'], ['ka', 'ქართული'], ['be', 'Беларуская'], ['tg', 'Тоҷикӣ'], ['sd', 'सिनधि'], ['gu', 'ગુજરાતી'], ['am', 'አማርኛ'], ['yi', 'ייִדיש'], ['lo', 'ລາວ / Pha xa lao'], ['uz', 'Ўзбек'], ['fo', 'Føroyskt'], ['ht', 'Krèyol ayisyen'], ['ps', 'پښتو'], ['tk', 'Туркмен / تركمن'], ['nn', 'Norsk (nynorsk)'], ['mt', 'bil-Malti'], ['sa', 'संस्कृतम्'], ['lb', 'Lëtzebuergesch'], ['my', 'Myanmasa'], ['bo', 'བོད་ཡིག / Bod skad'], ['tl', 'Tagalog'], ['mg', 'Malagasy'], ['as', 'অসমীয়া'], ['tt', 'Tatarça'], ['haw', 'ʻŌlelo Hawaiʻi'], ['ln', 'Lingála'], ['ha', 'هَوُسَ'], ['ba', 'Башҡорт'], ['jw', 'ꦧꦱꦗꦮ'], ['su', 'Basa Sunda'], ['yue', '粤语']];
8484

8585
public const SERVICE_TYPE_IMAGE = 'image';
8686
public const SERVICE_TYPE_STT = 'stt';

lib/OldProcessing/Translation/TranslationProvider.php

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@ public function getName(): string {
3838
return $this->openAiAPIService->getServiceName();
3939
}
4040

41+
/**
42+
* @return array<array{code: string, name: string}>
43+
*/
44+
private function getStaticLanguages(): array {
45+
return array_map(static function (array $language): array {
46+
return [
47+
'code' => $language[0],
48+
'name' => $language[1],
49+
];
50+
}, Application::LANGUAGE_CODES_AND_ENDONYMS);
51+
}
52+
53+
/**
54+
* @return array<string, string>
55+
*/
56+
private function getCoreLanguagesByCode(): array {
57+
$map = [];
58+
foreach ($this->getStaticLanguages() as $lang) {
59+
$map[$lang['code']] = $lang['name'];
60+
}
61+
return $map;
62+
}
63+
4164
public function getAvailableLanguages(): array {
4265
$cache = $this->cacheFactory->createDistributed('integration_openai');
4366
if ($cached = $cache->get('languages')) {
@@ -46,8 +69,7 @@ public function getAvailableLanguages(): array {
4669
}, $cached);
4770
}
4871

49-
$coreL = $this->l10nFactory->getLanguages();
50-
$languages = array_merge($coreL['commonLanguages'], $coreL['otherLanguages']);
72+
$languages = $this->getStaticLanguages();
5173

5274
$availableLanguages = [];
5375
foreach ($languages as $sourceLanguage) {
@@ -89,15 +111,6 @@ public function detectLanguage(string $text): ?string {
89111
return null;
90112
}
91113

92-
private function getCoreLanguagesByCode(): array {
93-
$coreL = $this->l10nFactory->getLanguages();
94-
$coreLanguages = array_reduce(array_merge($coreL['commonLanguages'], $coreL['otherLanguages']), function ($carry, $val) {
95-
$carry[$val['code']] = $val['name'];
96-
return $carry;
97-
});
98-
return $coreLanguages;
99-
}
100-
101114
public function translate(?string $fromLanguage, string $toLanguage, string $text): string {
102115
$cacheKey = ($fromLanguage ?? '') . '/' . $toLanguage . '/' . md5($text);
103116

lib/Settings/Personal.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function getForm(): TemplateResponse {
3333
$userConfig = $this->openAiSettingsService->getUserConfig($this->userId);
3434
$userConfig['api_key'] = $userConfig['api_key'] === '' ? '' : 'dummyApiKey';
3535
$userConfig['basic_password'] = $userConfig['basic_password'] === '' ? '' : 'dummyPassword';
36-
$languages = Application::AUDIO_TO_TEXT_LANGUAGES;
36+
$languages = Application::LANGUAGE_CODES_AND_ENDONYMS;
3737
array_unshift($languages, ['detect_language', $this->l->t('Detect language')]);
3838
$languages = array_map(static function (array $language) use ($userConfig) {
3939
return [

lib/TaskProcessing/AudioToTextProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public function getOptionalInputShape(): array {
6868
public function getOptionalInputShapeEnumValues(): array {
6969
$languageEnumValues = array_map(static function (array $language) {
7070
return new ShapeEnumValue($language[1], $language[0]);
71-
}, Application::AUDIO_TO_TEXT_LANGUAGES);
71+
}, Application::LANGUAGE_CODES_AND_ENDONYMS);
7272
$detectLanguageEnumValue = new ShapeEnumValue($this->l->t('Detect language'), 'detect_language');
7373
$defaultLanguageEnumValue = new ShapeEnumValue($this->l->t('Default'), 'default');
7474
return ['language' => array_merge([$detectLanguageEnumValue, $defaultLanguageEnumValue], $languageEnumValues)];

lib/TaskProcessing/TranslateProvider.php

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,27 @@ public function getExpectedRuntime(): int {
8181
return $this->openAiAPIService->getExpTextProcessingTime();
8282
}
8383

84+
/**
85+
* @return array<array{code: string, name: string}>
86+
*/
87+
private function getStaticLanguages(): array {
88+
return array_map(static function (array $language): array {
89+
return [
90+
'code' => $language[0],
91+
'name' => $language[1],
92+
];
93+
}, Application::LANGUAGE_CODES_AND_ENDONYMS);
94+
}
95+
96+
/**
97+
* @return array<string, string>
98+
*/
99+
private function getCoreLanguagesByCode(): array {
100+
return array_column(Application::LANGUAGE_CODES_AND_ENDONYMS, 1, 0);
101+
}
102+
84103
public function getInputShapeEnumValues(): array {
85-
$coreL = $this->l10nFactory->getLanguages();
86-
$languages = array_merge($coreL['commonLanguages'], $coreL['otherLanguages']);
104+
$languages = $this->getStaticLanguages();
87105
$languageEnumValues = array_map(static function (array $language) {
88106
return new ShapeEnumValue($language['name'], $language['code']);
89107
}, $languages);
@@ -143,15 +161,6 @@ public function getOptionalOutputShapeEnumValues(): array {
143161
return [];
144162
}
145163

146-
private function getCoreLanguagesByCode(): array {
147-
$coreL = $this->l10nFactory->getLanguages();
148-
$coreLanguages = array_reduce(array_merge($coreL['commonLanguages'], $coreL['otherLanguages']), function ($carry, $val) {
149-
$carry[$val['code']] = $val['name'];
150-
return $carry;
151-
});
152-
return $coreLanguages;
153-
}
154-
155164
public function process(?string $userId, array $input, callable $reportProgress): array {
156165
/*
157166
foreach (range(1, 20) as $i) {

0 commit comments

Comments
 (0)