appwrite/app/controllers/api/locale.php

301 lines
10 KiB
PHP
Raw Normal View History

2019-05-09 06:54:39 +00:00
<?php
2025-01-17 04:31:39 +00:00
use Appwrite\SDK\AuthType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
2022-04-20 16:44:34 +00:00
use Appwrite\Utopia\Request;
2024-03-06 17:34:21 +00:00
use Appwrite\Utopia\Response;
2022-04-24 04:51:28 +00:00
use MaxMind\Db\Reader;
use Utopia\Config\Config;
2022-04-24 04:51:28 +00:00
use Utopia\Database\Document;
use Utopia\Http\Http;
2022-04-20 16:44:34 +00:00
use Utopia\Locale\Locale;
2019-05-09 06:54:39 +00:00
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale')
2023-08-01 15:26:48 +00:00
->desc('Get user locale')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
2019-05-09 06:54:39 +00:00
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'get',
description: '/docs/references/locale/get-locale.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_LOCALE,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('request')
->inject('response')
->inject('locale')
->inject('geodb')
2022-04-20 16:19:50 +00:00
->action(function (Request $request, Response $response, Locale $locale, Reader $geodb) {
$eu = Config::getParam('locale-eu');
$currencies = Config::getParam('locale-currencies');
2020-06-29 21:43:34 +00:00
$output = [];
$ip = $request->getIP();
2020-10-30 19:53:27 +00:00
2020-06-29 21:43:34 +00:00
$output['ip'] = $ip;
2019-05-09 06:54:39 +00:00
2020-06-29 21:43:34 +00:00
$currency = null;
2019-05-09 06:54:39 +00:00
2020-10-25 09:27:07 +00:00
$record = $geodb->get($ip);
2020-10-25 06:15:36 +00:00
2020-10-27 00:11:24 +00:00
if ($record) {
$output['countryCode'] = $record['country']['iso_code'];
2022-05-08 15:10:56 +00:00
$output['country'] = $locale->getText('countries.' . strtolower($record['country']['iso_code']), $locale->getText('locale.country.unknown'));
$output['continent'] = $locale->getText('continents.' . strtolower($record['continent']['code']), $locale->getText('locale.country.unknown'));
$output['continentCode'] = $record['continent']['code'];
$output['eu'] = (\in_array($record['country']['iso_code'], $eu)) ? true : false;
2019-05-09 06:54:39 +00:00
2020-06-29 21:43:34 +00:00
foreach ($currencies as $code => $element) {
if (isset($element['locations']) && isset($element['code']) && \in_array($record['country']['iso_code'], $element['locations'])) {
2020-06-29 21:43:34 +00:00
$currency = $element['code'];
2019-05-09 06:54:39 +00:00
}
}
2020-06-29 21:43:34 +00:00
$output['currency'] = $currency;
2020-10-25 09:27:07 +00:00
} else {
2020-06-29 21:43:34 +00:00
$output['countryCode'] = '--';
$output['country'] = $locale->getText('locale.country.unknown');
$output['continent'] = $locale->getText('locale.country.unknown');
$output['continentCode'] = '--';
$output['eu'] = false;
$output['currency'] = $currency;
2019-05-09 06:54:39 +00:00
}
2020-06-29 21:43:34 +00:00
2020-10-30 19:53:27 +00:00
$response->dynamic(new Document($output), Response::MODEL_LOCALE);
2020-12-26 15:13:42 +00:00
});
2019-05-09 06:54:39 +00:00
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/codes')
2024-10-08 07:54:40 +00:00
->desc('List locale codes')
2023-04-17 02:10:17 +00:00
->groups(['api', 'locale'])
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listCodes',
description: '/docs/references/locale/list-locale-codes.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_LOCALE_CODE_LIST,
)
]
))
2023-04-17 02:10:17 +00:00
->inject('response')
->action(function (Response $response) {
$codes = Config::getParam('locale-codes');
$response->dynamic(new Document([
'localeCodes' => $codes,
'total' => count($codes),
]), Response::MODEL_LOCALE_CODE_LIST);
});
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/countries')
2023-08-01 15:26:48 +00:00
->desc('List countries')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
2019-05-09 06:54:39 +00:00
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listCountries',
description: '/docs/references/locale/list-countries.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_COUNTRY_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
->inject('locale')
2022-04-20 16:19:50 +00:00
->action(function (Response $response, Locale $locale) {
2025-02-25 08:31:24 +00:00
$list = array_keys(Config::getParam('locale-countries')); /* @var $list array */
2020-10-30 19:53:27 +00:00
$output = [];
2019-05-09 06:54:39 +00:00
2021-07-22 20:15:01 +00:00
foreach ($list as $value) {
2020-10-30 19:53:27 +00:00
$output[] = new Document([
2022-05-08 15:10:56 +00:00
'name' => $locale->getText('countries.' . strtolower($value)),
2021-07-22 20:15:01 +00:00
'code' => $value,
2020-10-30 19:53:27 +00:00
]);
}
2020-06-29 21:43:34 +00:00
2021-07-26 07:05:08 +00:00
usort($output, function ($a, $b) {
return strcmp($a->getAttribute('name'), $b->getAttribute('name'));
});
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['countries' => $output, 'total' => \count($output)]), Response::MODEL_COUNTRY_LIST);
2020-12-26 15:13:42 +00:00
});
2019-05-09 06:54:39 +00:00
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/countries/eu')
2023-08-01 15:26:48 +00:00
->desc('List EU countries')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
2019-05-09 06:54:39 +00:00
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listCountriesEU',
description: '/docs/references/locale/list-countries-eu.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_COUNTRY_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
->inject('locale')
2022-04-20 16:19:50 +00:00
->action(function (Response $response, Locale $locale) {
$eu = Config::getParam('locale-eu');
2020-10-30 19:53:27 +00:00
$output = [];
2020-06-29 21:43:34 +00:00
foreach ($eu as $code) {
2022-05-08 15:10:56 +00:00
if ($locale->getText('countries.' . strtolower($code), false) !== false) {
2020-10-30 19:53:27 +00:00
$output[] = new Document([
2022-05-08 15:10:56 +00:00
'name' => $locale->getText('countries.' . strtolower($code)),
2020-10-30 19:53:27 +00:00
'code' => $code,
]);
2020-06-29 21:43:34 +00:00
}
2019-05-09 06:54:39 +00:00
}
2020-06-29 21:43:34 +00:00
2021-07-26 07:05:08 +00:00
usort($output, function ($a, $b) {
return strcmp($a->getAttribute('name'), $b->getAttribute('name'));
});
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['countries' => $output, 'total' => \count($output)]), Response::MODEL_COUNTRY_LIST);
2020-12-26 15:13:42 +00:00
});
2019-05-09 06:54:39 +00:00
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/countries/phones')
2023-08-01 15:26:48 +00:00
->desc('List countries phone codes')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
2019-05-09 06:54:39 +00:00
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listCountriesPhones',
description: '/docs/references/locale/list-countries-phones.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_PHONE_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
->inject('locale')
2022-04-20 16:19:50 +00:00
->action(function (Response $response, Locale $locale) {
$list = Config::getParam('locale-phones'); /* @var $list array */
2020-10-30 19:53:27 +00:00
$output = [];
2021-07-22 20:15:01 +00:00
2020-10-30 19:53:27 +00:00
\asort($list);
2020-06-29 21:43:34 +00:00
foreach ($list as $code => $name) {
2022-05-08 15:10:56 +00:00
if ($locale->getText('countries.' . strtolower($code), false) !== false) {
2020-10-30 19:53:27 +00:00
$output[] = new Document([
2022-05-08 15:10:56 +00:00
'code' => '+' . $list[$code],
2020-10-30 19:53:27 +00:00
'countryCode' => $code,
2022-05-08 15:10:56 +00:00
'countryName' => $locale->getText('countries.' . strtolower($code)),
2020-10-30 19:53:27 +00:00
]);
2019-05-09 06:54:39 +00:00
}
2020-06-29 21:43:34 +00:00
}
2019-05-09 06:54:39 +00:00
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['phones' => $output, 'total' => \count($output)]), Response::MODEL_PHONE_LIST);
2020-12-26 15:13:42 +00:00
});
2019-08-19 10:31:06 +00:00
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/continents')
2023-08-01 15:26:48 +00:00
->desc('List continents')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listContinents',
description: '/docs/references/locale/list-continents.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_CONTINENT_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
->inject('locale')
2022-04-21 02:47:51 +00:00
->action(function (Response $response, Locale $locale) {
2025-02-25 08:31:24 +00:00
$list = array_keys(Config::getParam('locale-continents'));
2022-05-08 15:10:56 +00:00
foreach ($list as $value) {
2020-10-30 19:53:27 +00:00
$output[] = new Document([
2022-05-08 15:10:56 +00:00
'name' => $locale->getText('continents.' . strtolower($value)),
2021-07-23 14:35:21 +00:00
'code' => $value,
2020-10-30 19:53:27 +00:00
]);
}
2020-06-29 21:43:34 +00:00
2021-07-26 07:05:08 +00:00
usort($output, function ($a, $b) {
return strcmp($a->getAttribute('name'), $b->getAttribute('name'));
});
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['continents' => $output, 'total' => \count($output)]), Response::MODEL_CONTINENT_LIST);
2020-12-26 15:13:42 +00:00
});
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/currencies')
2023-08-01 15:26:48 +00:00
->desc('List currencies')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
2019-08-19 10:31:06 +00:00
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listCurrencies',
description: '/docs/references/locale/list-currencies.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_CURRENCY_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
2022-04-20 16:19:50 +00:00
->action(function (Response $response) {
2020-10-30 19:53:27 +00:00
$list = Config::getParam('locale-currencies');
2022-05-08 15:10:56 +00:00
$list = array_map(fn ($node) => new Document($node), $list);
2020-06-29 21:43:34 +00:00
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['currencies' => $list, 'total' => \count($list)]), Response::MODEL_CURRENCY_LIST);
2020-12-26 15:13:42 +00:00
});
2026-02-04 05:30:22 +00:00
Http::get('/v1/locale/languages')
2023-08-01 15:26:48 +00:00
->desc('List languages')
2020-06-25 18:32:12 +00:00
->groups(['api', 'locale'])
->label('scope', 'locale.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'locale',
group: null,
2025-01-17 04:31:39 +00:00
name: 'listLanguages',
description: '/docs/references/locale/list-languages.md',
auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT],
2025-01-17 04:31:39 +00:00
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_LANGUAGE_LIST,
)
]
))
2020-12-26 15:13:42 +00:00
->inject('response')
2022-04-20 16:19:50 +00:00
->action(function (Response $response) {
2020-10-30 19:53:27 +00:00
$list = Config::getParam('locale-languages');
$list = array_map(fn ($node) => new Document($node), $list);
2020-06-29 21:43:34 +00:00
2022-02-27 09:57:09 +00:00
$response->dynamic(new Document(['languages' => $list, 'total' => \count($list)]), Response::MODEL_LANGUAGE_LIST);
2025-01-17 04:39:16 +00:00
});