Add fallback locale support + tests

This commit is contained in:
Matej Bačo
2025-08-12 15:13:08 +02:00
parent c3665c35ff
commit b816557970
9 changed files with 95 additions and 17 deletions
+2 -1
View File
@@ -245,5 +245,6 @@
"emails.otpSession.clientInfo": "Diese Anmeldung wurde über {{agentClient}} auf {{agentDevice}} {{agentOs}} angefordert. Wenn Sie die Anmeldung nicht angefordert haben, können Sie diese E-Mail getrost ignorieren.",
"emails.otpSession.securityPhrase": "Die Sicherheitsphrase für diese E-Mail lautet {{phrase}}. Sie können dieser E-Mail vertrauen, wenn diese Phrase mit der Phrase übereinstimmt, die beim Anmelden angezeigt wird.",
"emails.otpSession.thanks": "Danke,",
"emails.otpSession.signature": "{{project}} Team"
"emails.otpSession.signature": "{{project}} Team",
"mock": "Eine Beispielübersetzung für Testzwecke."
}
+2 -1
View File
@@ -274,5 +274,6 @@
"continents.eu": "Europe",
"continents.na": "North America",
"continents.oc": "Oceania",
"continents.sa": "South America"
"continents.sa": "South America",
"mock": "A mock translation for testing purposes."
}
+2
View File
@@ -2267,6 +2267,8 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale')
$template = $templates['email.' . $type . '-' . $locale] ?? null;
$localeObj = new Locale($locale);
$localeObj->setFallback(System::getEnv('_APP_LOCALE', 'en'));
if (is_null($template)) {
/**
* different templates, different placeholders.
+20
View File
@@ -13,6 +13,7 @@ use Utopia\Database\Helpers\ID;
use Utopia\Database\Helpers\Permission;
use Utopia\Database\Helpers\Role;
use Utopia\Database\Validator\UID;
use Utopia\Locale\Locale;
use Utopia\System\System;
use Utopia\Validator\Host;
use Utopia\Validator\Text;
@@ -35,6 +36,25 @@ App::get('/v1/mock/tests/general/oauth2')
$response->redirect($redirectURI . '?' . \http_build_query(['code' => 'abcdef', 'state' => $state]));
});
App::get('/v1/mock/tests/locale')
->desc('Mock locale translation key')
->groups(['mock'])
->label('scope', 'public')
->label('docs', false)
->label('mock', true)
->inject('locale')
->inject('localeCodes')
->inject('request')
->inject('response')
->action(function (Locale $locale, array $localeCodes, Request $request, Response $response) {
$localeParam = (string) $request->getParam('locale', $request->getHeader('x-appwrite-locale', ''));
if (\in_array($localeParam, $localeCodes)) {
$locale->setDefault($localeParam);
}
$response->send($locale->getText('mock'));
});
App::get('/v1/mock/tests/general/oauth2/token')
->desc('OAuth2 Token')
->groups(['mock'])
+5 -1
View File
@@ -70,7 +70,11 @@ App::setResource('hooks', function ($register) {
}, ['register']);
App::setResource('register', fn () => $register);
App::setResource('locale', fn () => new Locale(System::getEnv('_APP_LOCALE', 'en')));
App::setResource('locale', function () {
$locale = new Locale(System::getEnv('_APP_LOCALE', 'en'));
$locale->setFallback(System::getEnv('_APP_LOCALE', 'en'));
return $locale;
});
App::setResource('localeCodes', function () {
return array_map(fn ($locale) => $locale['code'], Config::getParam('locale-codes', []));
+1 -1
View File
@@ -60,7 +60,7 @@
"utopia-php/framework": "0.33.*",
"utopia-php/fetch": "0.4.*",
"utopia-php/image": "0.8.*",
"utopia-php/locale": "0.4.*",
"utopia-php/locale": "0.8.*",
"utopia-php/logger": "0.6.*",
"utopia-php/messaging": "0.18.*",
"utopia-php/migration": "0.11.*",
Generated
+9 -13
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "761a7e17b49381e68038c92873888125",
"content-hash": "c0641df1dfb292f9d8f0d6b6278d0e9c",
"packages": [
{
"name": "adhocore/jwt",
@@ -3945,22 +3945,24 @@
},
{
"name": "utopia-php/locale",
"version": "0.4.0",
"version": "0.8.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/locale.git",
"reference": "c2d9358d0fe2f6b6ed5448369f9d1e430c615447"
"reference": "10ffc869c904c45e32ab0c61f4b33ba774777eb6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/locale/zipball/c2d9358d0fe2f6b6ed5448369f9d1e430c615447",
"reference": "c2d9358d0fe2f6b6ed5448369f9d1e430c615447",
"url": "https://api.github.com/repos/utopia-php/locale/zipball/10ffc869c904c45e32ab0c61f4b33ba774777eb6",
"reference": "10ffc869c904c45e32ab0c61f4b33ba774777eb6",
"shasum": ""
},
"require": {
"php": ">=7.4"
},
"require-dev": {
"laravel/pint": "1.2.*",
"phpstan/phpstan": "1.*",
"phpunit/phpunit": "^9.3",
"vimeo/psalm": "4.0.1"
},
@@ -3974,12 +3976,6 @@
"license": [
"MIT"
],
"authors": [
{
"name": "Eldad Fux",
"email": "eldad@appwrite.io"
}
],
"description": "A simple locale library to manage application translations",
"keywords": [
"framework",
@@ -3990,9 +3986,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/locale/issues",
"source": "https://github.com/utopia-php/locale/tree/0.4.0"
"source": "https://github.com/utopia-php/locale/tree/0.8.0"
},
"time": "2021-07-24T11:35:55+00:00"
"time": "2025-08-12T12:58:26+00:00"
},
{
"name": "utopia-php/logger",
@@ -373,6 +373,7 @@ class Certificates extends Action
Console::warning('Cannot renew domain (' . $domain . ') on attempt no. ' . $attempt . ' certificate: ' . $errorMessage);
$locale = new Locale(System::getEnv('_APP_LOCALE', 'en'));
$locale->setFallback(System::getEnv('_APP_LOCALE', 'en'));
// Send mail to administrator mail
$template = Template::fromFile(__DIR__ . '/../../../../app/config/locale/templates/email-certificate-failed.tpl');
+53
View File
@@ -269,4 +269,57 @@ trait LocaleBase
return [];
}
public function testFallbackLocale()
{
$en = 'A mock translation for testing purposes.';
$de = 'Eine Beispielübersetzung für Testzwecke.';
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($en, $response['body']);
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-locale' => 'en'
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($en, $response['body']);
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-locale' => 'de'
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($de, $response['body']);
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-locale' => 'cs'
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($en, $response['body']);
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-locale' => 'non-existing'
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($en, $response['body']);
$response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-locale' => ''
]);
$this->assertEquals($response['headers']['status-code'], 200);
$this->assertEquals($en, $response['body']);
}
}