1
0
Fork 0
mirror of synced 2024-06-28 11:10:46 +12:00

Merge branch 'master' into ro-locale

This commit is contained in:
Eldad A. Fux 2019-10-01 09:05:33 +03:00 committed by GitHub
commit 15ad75ff8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
63 changed files with 2276 additions and 463 deletions

View file

@ -63,24 +63,24 @@ RUN \
RUN echo "upload_max_filesize = 4M" > /etc/php/7.3/fpm/conf.d/appwrite.ini RUN echo "upload_max_filesize = 4M" > /etc/php/7.3/fpm/conf.d/appwrite.ini
# nginx conf (with ssl certificates) # nginx conf (with ssl certificates)
ADD ./docker/nginx.conf /etc/nginx/nginx.conf COPY ./docker/nginx.conf /etc/nginx/nginx.conf
ADD ./docker/ssl/nginx.crt /etc/nginx/ssl/nginx.crt COPY ./docker/ssl/nginx.crt /etc/nginx/ssl/nginx.crt
ADD ./docker/ssl/nginx.key /etc/nginx/ssl/nginx.key COPY ./docker/ssl/nginx.key /etc/nginx/ssl/nginx.key
# php conf # php conf
RUN mkdir -p /var/run/php RUN mkdir -p /var/run/php
ADD ./docker/www.conf /etc/php/7.3/fpm/pool.d/www.conf COPY ./docker/www.conf /etc/php/7.3/fpm/pool.d/www.conf
# supervisord conf # supervisord conf
ADD ./docker/supervisord.conf /etc/supervisord.conf COPY ./docker/supervisord.conf /etc/supervisord.conf
ADD ./docker/entrypoint.sh /entrypoint.sh COPY ./docker/entrypoint.sh /entrypoint.sh
RUN chmod 775 /entrypoint.sh RUN chmod 775 /entrypoint.sh
# add PHP files # add PHP files
ADD ./app /usr/share/nginx/html/app COPY ./app /usr/share/nginx/html/app
ADD ./public /usr/share/nginx/html/public COPY ./public /usr/share/nginx/html/public
ADD ./src /usr/share/nginx/html/src COPY ./src /usr/share/nginx/html/src
ADD ./vendor /usr/share/nginx/html/vendor COPY ./vendor /usr/share/nginx/html/vendor
WORKDIR /storage/uploads WORKDIR /storage/uploads
RUN chown -Rf www-data.www-data /storage/uploads && chmod -Rf 0755 /storage/uploads RUN chown -Rf www-data.www-data /storage/uploads && chmod -Rf 0755 /storage/uploads
@ -90,4 +90,4 @@ RUN chown -Rf www-data.www-data /storage/cache && chmod -Rf 0755 /storage/cache
EXPOSE 80 EXPOSE 80
CMD ["/bin/bash", "/entrypoint.sh"] CMD ["/bin/bash", "/entrypoint.sh"]

View file

@ -2,7 +2,7 @@
<a href="https://appwrite.io" target="_blank"><img width="260" height="39" src="https://appwrite.io/images/github-logo.png" alt="Appwrite Logo"></a> <a href="https://appwrite.io" target="_blank"><img width="260" height="39" src="https://appwrite.io/images/github-logo.png" alt="Appwrite Logo"></a>
<br /> <br />
<br /> <br />
<b>Simple Backend Server for your [Vue / Angular / React / iOS / Android / Flutter / *ANY*] Frontend App</b> <b>Simple Backend Server for your [Vue / Angular / React / iOS / Android / Flutter / *ANY OTHER*] Frontend App</b>
<br /> <br />
<br /> <br />
</p> </p>
@ -37,9 +37,9 @@ curl -o docker-compose.yml https://appwrite.io/docker-compose.yml?port=80 && \
docker-compose up -d --remove-orphans docker-compose up -d --remove-orphans
``` ```
Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please notice that on non-linux native hosts the server might take a few minutes to start after installation completes. Once the Docker installation is completed, go to http://localhost to access the Appwrite console from your browser. Please notice that on non-linux native hosts the server might take a few minutes to start after the completion of the installation.
For advanced, production and custom installation check out our Docker [environment variables](/docs/EnviornementVariables.md) docs. For advanced, production and custom installation, check out our Docker [environment variables](/docs/EnviornementVariables.md) docs.
### Changing Port Number ### Changing Port Number
@ -50,9 +50,9 @@ In case your port 80 is already taken, change the port number in the command abo
Getting started with Appwrite is as easy as creating a new project, choosing your platform and integrating its SDK in your code. You can easily get started with your platform of choice by reading one of our getting started tutorials. Getting started with Appwrite is as easy as creating a new project, choosing your platform and integrating its SDK in your code. You can easily get started with your platform of choice by reading one of our getting started tutorials.
* [Getting Started for Web](https://appwrite.io/docs/getting-started-for-web) * [Getting Started for Web](https://appwrite.io/docs/getting-started-for-web)
* [Getting Started for Server](https://appwrite.io/docs/getting-started-for-server)
* Getting Started for Android (soon...) * Getting Started for Android (soon...)
* Getting Started for iOS (soon...) * Getting Started for iOS (soon...)
* [Getting Started for Server](https://appwrite.io/docs/getting-started-for-server)
### Services ### Services
@ -69,7 +69,7 @@ For the complete API documentation, visit [https://appwrite.io/docs](https://app
### SDKs ### SDKs
Currently we are supporting a few SDK libraries and we are constantly working on adding new ones. Currently, we are supporting only a few SDK libraries and are constantly working on including new ones.
Below is a list of currently supported platforms and languages. If you wish to help us add support to your platform of choice you can go over to our [SDK Generator](https://github.com/appwrite/sdk-generator) project and view our contribution guide. Below is a list of currently supported platforms and languages. If you wish to help us add support to your platform of choice you can go over to our [SDK Generator](https://github.com/appwrite/sdk-generator) project and view our contribution guide.
@ -82,7 +82,7 @@ Below is a list of currently supported platforms and languages. If you wish to h
## Security ## Security
For security issues, please email [security@appwrite.io](mailto:security@appwrite.io) instead of posting a public issue in GitHub. For security issues, kindly email us [security@appwrite.io](mailto:security@appwrite.io) instead of posting a public issue in GitHub.
## Follow Us ## Follow Us
@ -109,4 +109,6 @@ Created by [Eldad Fux](https://twitter.com/eldadfux) with the amazing help of ou
* 🇫🇮 Pessi Päivärinne ([Github](https://github.com/pessip)) * 🇫🇮 Pessi Päivärinne ([Github](https://github.com/pessip))
* 🇺🇳 Sergi Vos ([Github](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [Linkedin](https://www.linkedin.com/in/sergivb01/)) * 🇺🇳 Sergi Vos ([Github](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [Linkedin](https://www.linkedin.com/in/sergivb01/))
* 🇮🇱 Tomer Cohen ([Github](https://github.com/tomer), [Twitter](https://twitter.com/tomer)) * 🇮🇱 Tomer Cohen ([Github](https://github.com/tomer), [Twitter](https://twitter.com/tomer))
* 🇬🇷 Panagiotis Skarlas ([Github](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets)) * 🇬🇷 Panagiotis Skarlas ([Github](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets))
* 🇷🇺 Alexey Pyltsyn ([Github](https://github.com/lex111))
* 🇩🇪 Robin C ([Github](https://github.com/Taminoful))

View file

@ -1,7 +1,7 @@
<?php <?php
// Init // Init
require_once __DIR__ . '/init.php'; require_once __DIR__.'/init.php';
global $env, $utopia, $request, $response, $register, $consoleDB, $project, $domain, $sentry, $version, $service, $providers; global $env, $utopia, $request, $response, $register, $consoleDB, $project, $domain, $sentry, $version, $service, $providers;
@ -20,16 +20,16 @@ use Database\Validator\Authorization;
use Event\Event; use Event\Event;
use Utopia\Validator\WhiteList; use Utopia\Validator\WhiteList;
/** /*
* Configuration files * Configuration files
*/ */
$roles = include __DIR__ . '/config/roles.php'; // User roles and scopes $roles = include __DIR__.'/config/roles.php'; // User roles and scopes
$sdks = include __DIR__ . '/config/sdks.php'; // List of SDK clients $sdks = include __DIR__.'/config/sdks.php'; // List of SDK clients
$services = include __DIR__ . '/config/services.php'; // List of SDK clients $services = include __DIR__.'/config/services.php'; // List of SDK clients
$webhook = new Event('v1-webhooks', 'WebhooksV1'); $webhook = new Event('v1-webhooks', 'WebhooksV1');
$audit = new Event('v1-audits', 'AuditsV1'); $audit = new Event('v1-audits', 'AuditsV1');
$usage = new Event('v1-usage', 'UsageV1'); $usage = new Event('v1-usage', 'UsageV1');
$clientsConsole = array_map(function ($node) { $clientsConsole = array_map(function ($node) {
return $node['url']; return $node['url'];
@ -37,6 +37,7 @@ $clientsConsole = array_map(function ($node) {
if (isset($node['type']) && $node['type'] === 'web' && isset($node['url']) && !empty($node['url'])) { if (isset($node['type']) && $node['type'] === 'web' && isset($node['url']) && !empty($node['url'])) {
return true; return true;
} }
return false; return false;
})); }));
@ -46,19 +47,20 @@ $clients = array_merge($clientsConsole, array_map(function ($node) {
if (isset($node['type']) && $node['type'] === 'web' && isset($node['url']) && !empty($node['url'])) { if (isset($node['type']) && $node['type'] === 'web' && isset($node['url']) && !empty($node['url'])) {
return true; return true;
} }
return false; return false;
}))); })));
$utopia->init(function () use ($utopia, $request, $response, $register, &$user, $project, $roles, $webhook, $audit, $usage, $domain, $clients) { $utopia->init(function () use ($utopia, $request, $response, $register, &$user, $project, $roles, $webhook, $audit, $usage, $domain, $clients) {
$route = $utopia->match($request); $route = $utopia->match($request);
$referrer = $request->getServer('HTTP_REFERER', ''); $referrer = $request->getServer('HTTP_REFERER', '');
$origin = $request->getServer('HTTP_ORIGIN', parse_url($referrer, PHP_URL_SCHEME) . '://' . parse_url($referrer, PHP_URL_HOST)); $origin = $request->getServer('HTTP_ORIGIN', parse_url($referrer, PHP_URL_SCHEME).'://'.parse_url($referrer, PHP_URL_HOST));
$refDomain = (in_array($origin, $clients)) $refDomain = (in_array($origin, $clients))
? $origin : 'http://localhost'; ? $origin : 'http://localhost';
/** /*
* Security Headers * Security Headers
* *
* As recommended at: * As recommended at:
@ -66,7 +68,7 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
*/ */
$response $response
->addHeader('Server', 'Appwrite') ->addHeader('Server', 'Appwrite')
->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . urlencode($request->getServer('REQUEST_URI'))) ->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url='.urlencode($request->getServer('REQUEST_URI')))
//->addHeader('X-Frame-Options', ($refDomain == 'http://localhost') ? 'SAMEORIGIN' : 'ALLOW-FROM ' . $refDomain) //->addHeader('X-Frame-Options', ($refDomain == 'http://localhost') ? 'SAMEORIGIN' : 'ALLOW-FROM ' . $refDomain)
->addHeader('X-Content-Type-Options', 'nosniff') ->addHeader('X-Content-Type-Options', 'nosniff')
->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE') ->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE')
@ -75,7 +77,7 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
->addHeader('Access-Control-Allow-Credentials', 'true') ->addHeader('Access-Control-Allow-Credentials', 'true')
; ;
/** /*
* Validate Client Domain - Check to avoid CSRF attack * Validate Client Domain - Check to avoid CSRF attack
* Adding appwrite api domains to allow XDOMAIN communication * Adding appwrite api domains to allow XDOMAIN communication
*/ */
@ -84,10 +86,10 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
if (!$hostValidator->isValid($request->getServer('HTTP_ORIGIN', $request->getServer('HTTP_REFERER', ''))) if (!$hostValidator->isValid($request->getServer('HTTP_ORIGIN', $request->getServer('HTTP_REFERER', '')))
&& in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT, Request::METHOD_PATCH, Request::METHOD_DELETE]) && in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT, Request::METHOD_PATCH, Request::METHOD_DELETE])
&& empty($request->getHeader('X-Appwrite-Key', ''))) { && empty($request->getHeader('X-Appwrite-Key', ''))) {
throw new Exception('Access from this client host is forbidden. ' . $hostValidator->getDescription(), 403); throw new Exception('Access from this client host is forbidden. '.$hostValidator->getDescription(), 403);
} }
/** /*
* ACL Check * ACL Check
*/ */
$role = ($user->isEmpty()) ? Auth::USER_ROLE_GUEST : Auth::USER_ROLE_MEMBER; $role = ($user->isEmpty()) ? Auth::USER_ROLE_GUEST : Auth::USER_ROLE_MEMBER;
@ -111,46 +113,46 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
} }
} }
$scope = $route->getLabel('scope', 'none'); // Allowed scope for chosen route $scope = $route->getLabel('scope', 'none'); // Allowed scope for chosen route
$scopes = $roles[$role]['scopes']; // Allowed scopes for user role $scopes = $roles[$role]['scopes']; // Allowed scopes for user role
// Check if given key match project API keys // Check if given key match project API keys
$key = $project->search('secret', $request->getHeader('X-Appwrite-Key', ''), $project->getAttribute('keys', [])); $key = $project->search('secret', $request->getHeader('X-Appwrite-Key', ''), $project->getAttribute('keys', []));
/** /*
* Try app auth when we have project key and no user * Try app auth when we have project key and no user
* Mock user to app and grant API key scopes in addition to default app scopes * Mock user to app and grant API key scopes in addition to default app scopes
*/ */
if (null !== $key && $user->isEmpty()) { if (null !== $key && $user->isEmpty()) {
$user = new Document([ $user = new Document([
'$uid' => 0, '$uid' => 0,
'status' => Auth::USER_STATUS_ACTIVATED, 'status' => Auth::USER_STATUS_ACTIVATED,
'email' => 'app.' . $project->getUid() . '@service.' . $domain, 'email' => 'app.'.$project->getUid().'@service.'.$domain,
'password' => '', 'password' => '',
'name' => $project->getAttribute('name', 'Untitled'), 'name' => $project->getAttribute('name', 'Untitled'),
]); ]);
$role = Auth::USER_ROLE_APP; $role = Auth::USER_ROLE_APP;
$scopes = array_merge($roles[$role]['scopes'], $key->getAttribute('scopes', [])); $scopes = array_merge($roles[$role]['scopes'], $key->getAttribute('scopes', []));
Authorization::disable(); // Cancel security segmentation for API keys. Authorization::disable(); // Cancel security segmentation for API keys.
} }
Authorization::setRole('user:' . $user->getUid()); Authorization::setRole('user:'.$user->getUid());
Authorization::setRole('role:' . $role); Authorization::setRole('role:'.$role);
array_map(function ($node) { array_map(function ($node) {
if (isset($node['teamId']) && isset($node['roles'])) { if (isset($node['teamId']) && isset($node['roles'])) {
Authorization::setRole('team:' . $node['teamId']); Authorization::setRole('team:'.$node['teamId']);
foreach ($node['roles'] as $nodeRole) { // Set all team roles foreach ($node['roles'] as $nodeRole) { // Set all team roles
Authorization::setRole('team:' . $node['teamId'] . '/' . $nodeRole); Authorization::setRole('team:'.$node['teamId'].'/'.$nodeRole);
} }
} }
}, $user->getAttribute('memberships', [])); }, $user->getAttribute('memberships', []));
if (!in_array($scope, $scopes)) { if (!in_array($scope, $scopes)) {
throw new Exception($user->getAttribute('email', 'Guest') . ' (role: ' . strtolower($roles[$role]['label']) . ') missing scope (' . $scope . ')', 401); throw new Exception($user->getAttribute('email', 'Guest').' (role: '.strtolower($roles[$role]['label']).') missing scope ('.$scope.')', 401);
} }
if (Auth::USER_STATUS_BLOCKED == $user->getAttribute('status')) { // Account has not been activated if (Auth::USER_STATUS_BLOCKED == $user->getAttribute('status')) { // Account has not been activated
@ -161,7 +163,7 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
throw new Exception('Password reset is required', 412); throw new Exception('Password reset is required', 412);
} }
/** /*
* Background Jobs * Background Jobs
*/ */
$webhook $webhook
@ -182,31 +184,31 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
$usage $usage
->setParam('projectId', $project->getUid()) ->setParam('projectId', $project->getUid())
->setParam('url', $request->getServer('HTTP_HOST', '') . $request->getServer('REQUEST_URI', '')) ->setParam('url', $request->getServer('HTTP_HOST', '').$request->getServer('REQUEST_URI', ''))
->setParam('method', $request->getServer('REQUEST_METHOD', 'UNKNOWN')) ->setParam('method', $request->getServer('REQUEST_METHOD', 'UNKNOWN'))
->setParam('request', 0) ->setParam('request', 0)
->setParam('response', 0) ->setParam('response', 0)
->setParam('storage', 0) ->setParam('storage', 0)
; ;
/** /*
* Abuse Check * Abuse Check
*/ */
$timeLimit = new TimeLimit($route->getLabel('abuse-key', 'url:{url},ip:{ip}'), $route->getLabel('abuse-limit', 0), $route->getLabel('abuse-time', 3600), function () use ($register) { $timeLimit = new TimeLimit($route->getLabel('abuse-key', 'url:{url},ip:{ip}'), $route->getLabel('abuse-limit', 0), $route->getLabel('abuse-time', 3600), function () use ($register) {
return $register->get('db'); return $register->get('db');
}); });
$timeLimit->setNamespace('app_' . $project->getUid()); $timeLimit->setNamespace('app_'.$project->getUid());
$timeLimit $timeLimit
->setParam('{userId}', $user->getUid()) ->setParam('{userId}', $user->getUid())
->setParam('{userAgent}', $request->getServer('HTTP_USER_AGENT', '')) ->setParam('{userAgent}', $request->getServer('HTTP_USER_AGENT', ''))
->setParam('{ip}', $request->getIP()) ->setParam('{ip}', $request->getIP())
->setParam('{url}', $request->getServer('HTTP_HOST', '') . $route->getURL()) ->setParam('{url}', $request->getServer('HTTP_HOST', '').$route->getURL())
; ;
//TODO make sure we get array here //TODO make sure we get array here
foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys
$timeLimit->setParam('{param-' . $key . '}', (is_array($value)) ? json_encode($value) : $value); $timeLimit->setParam('{param-'.$key.'}', (is_array($value)) ? json_encode($value) : $value);
} }
$abuse = new Abuse($timeLimit); $abuse = new Abuse($timeLimit);
@ -218,7 +220,7 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
->addHeader('X-RateLimit-Reset', $timeLimit->time() + $route->getLabel('abuse-time', 3600)) ->addHeader('X-RateLimit-Reset', $timeLimit->time() + $route->getLabel('abuse-time', 3600))
; ;
} }
if ($abuse->check() && $request->getServer('_APP_OPTIONS_ABUSE', 'enabled') !== 'disabled') { if ($abuse->check() && $request->getServer('_APP_OPTIONS_ABUSE', 'enabled') !== 'disabled') {
throw new Exception('Too many requests', 429); throw new Exception('Too many requests', 429);
} }
@ -226,7 +228,7 @@ $utopia->init(function () use ($utopia, $request, $response, $register, &$user,
$utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage) { $utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage) {
/** /*
* Trigger Events for background jobs * Trigger Events for background jobs
*/ */
if (!empty($webhook->getParam('event'))) { if (!empty($webhook->getParam('event'))) {
@ -253,7 +255,6 @@ $utopia->options(function () use ($request, $response, $domain, $project) {
->addHeader('Access-Control-Allow-Origin', $origin) ->addHeader('Access-Control-Allow-Origin', $origin)
->addHeader('Access-Control-Allow-Credentials', 'true') ->addHeader('Access-Control-Allow-Credentials', 'true')
->send(); ->send();
;
}); });
$utopia->error(function ($error /* @var $error Exception */) use ($request, $response, $utopia, $project, $env, $version, $sentry, $user) { $utopia->error(function ($error /* @var $error Exception */) use ($request, $response, $utopia, $project, $env, $version, $sentry, $user) {
@ -265,27 +266,27 @@ $utopia->error(function ($error /* @var $error Exception */) use ($request, $res
case 404: // Error allowed publicly case 404: // Error allowed publicly
case 412: // Error allowed publicly case 412: // Error allowed publicly
case 429: // Error allowed publicly case 429: // Error allowed publicly
$code = $error->getCode(); $code = $error->getCode();
$message = $error->getMessage(); $message = $error->getMessage();
break; break;
default: default:
$code = 500; // All other errors get the generic 500 server error status code $code = 500; // All other errors get the generic 500 server error status code
$message = 'Server Error'; $message = 'Server Error';
} }
$_SERVER = []; // Reset before reporting to error log to avoid keys being compromised $_SERVER = []; // Reset before reporting to error log to avoid keys being compromised
$output = ((App::ENV_TYPE_DEVELOPMENT == $env)) ? [ $output = ((App::ENV_TYPE_DEVELOPMENT == $env)) ? [
'message' => $error->getMessage(), 'message' => $error->getMessage(),
'code' => $error->getCode(), 'code' => $error->getCode(),
'file' => $error->getFile(), 'file' => $error->getFile(),
'line' => $error->getLine(), 'line' => $error->getLine(),
'trace' => $error->getTrace(), 'trace' => $error->getTrace(),
'version' => $version, 'version' => $version,
] : [ ] : [
'message' => $message, 'message' => $message,
'code' => $code, 'code' => $code,
'version' => $version, 'version' => $version,
]; ];
$response $response
@ -295,12 +296,12 @@ $utopia->error(function ($error /* @var $error Exception */) use ($request, $res
->setStatusCode($code) ->setStatusCode($code)
; ;
$route = $utopia->match($request); $route = $utopia->match($request);
$template = ($route) ? $route->getLabel('error', null): null; $template = ($route) ? $route->getLabel('error', null) : null;
if ($template) { if ($template) {
$layout = new View(__DIR__ . '/views/layouts/default.phtml'); $layout = new View(__DIR__.'/views/layouts/default.phtml');
$comp = new View($template); $comp = new View($template);
$comp $comp
->setParam('projectName', $project->getAttribute('name')) ->setParam('projectName', $project->getAttribute('name'))
@ -310,7 +311,7 @@ $utopia->error(function ($error /* @var $error Exception */) use ($request, $res
; ;
$layout $layout
->setParam('title', $project->getAttribute('name') . ' - Error') ->setParam('title', $project->getAttribute('name').' - Error')
->setParam('description', 'No Description') ->setParam('description', 'No Description')
->setParam('body', $comp) ->setParam('body', $comp)
->setParam('version', $version) ->setParam('version', $version)
@ -344,9 +345,9 @@ $utopia->get('/manifest.json')
[ [
'src' => 'images/favicon.png', 'src' => 'images/favicon.png',
'sizes' => '256x256', 'sizes' => '256x256',
'type' => 'image/png' 'type' => 'image/png',
] ],
] ],
]); ]);
} }
); );
@ -357,10 +358,10 @@ $utopia->get('/robots.txt')
->label('docs', false) ->label('docs', false)
->action( ->action(
function () use ($response) { function () use ($response) {
$response->text("# robotstxt.org/ $response->text('# robotstxt.org/
User-agent: * User-agent: *
"); ');
} }
); );
@ -370,14 +371,14 @@ $utopia->get('/humans.txt')
->label('docs', false) ->label('docs', false)
->action( ->action(
function () use ($response) { function () use ($response) {
$response->text("# humanstxt.org/ $response->text('# humanstxt.org/
# The humans responsible & technology colophon # The humans responsible & technology colophon
# TEAM # TEAM
<name> -- <role> -- <twitter> <name> -- <role> -- <twitter>
# THANKS # THANKS
<name>"); <name>');
} }
); );
@ -387,15 +388,15 @@ $utopia->get('/v1/info') // This is only visible to gods
->action( ->action(
function () use ($response, $user, $project, $version, $env) { //TODO CONSIDER BLOCKING THIS ACTION TO ROLE GOD function () use ($response, $user, $project, $version, $env) { //TODO CONSIDER BLOCKING THIS ACTION TO ROLE GOD
$response->json([ $response->json([
'name' => 'API', 'name' => 'API',
'version' => $version, 'version' => $version,
'environment' => $env, 'environment' => $env,
'time' => date('Y-m-d H:i:s', time()), 'time' => date('Y-m-d H:i:s', time()),
'user' => [ 'user' => [
'id' => $user->getUid(), 'id' => $user->getUid(),
'name' => $user->getAttribute('name', ''), 'name' => $user->getAttribute('name', ''),
], ],
'project' => [ 'project' => [
'id' => $project->getUid(), 'id' => $project->getUid(),
'name' => $project->getAttribute('name', ''), 'name' => $project->getAttribute('name', ''),
], ],
@ -418,7 +419,7 @@ $utopia->get('/v1/proxy')
->label('docs', false) ->label('docs', false)
->action( ->action(
function () use ($response, $console, $clients) { function () use ($response, $console, $clients) {
$view = new View(__DIR__ . '/views/proxy.phtml'); $view = new View(__DIR__.'/views/proxy.phtml');
$view $view
->setParam('routes', '') ->setParam('routes', '')
->setParam('clients', array_merge($clients, $console->getAttribute('clients', []))) ->setParam('clients', array_merge($clients, $console->getAttribute('clients', [])))
@ -449,6 +450,7 @@ $utopia->get('/v1/open-api-2.json')
foreach ($ret as &$match) { foreach ($ret as &$match) {
$match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match); $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
} }
return implode('_', $ret); return implode('_', $ret);
} }
@ -457,7 +459,7 @@ $utopia->get('/v1/open-api-2.json')
return str_replace([' ', '_'], '-', strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $input))); return str_replace([' ', '_'], '-', strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $input)));
} }
foreach ($services as $service) { /** @noinspection PhpIncludeInspection */ foreach ($services as $service) { /* @noinspection PhpIncludeInspection */
if (!$service['sdk']) { if (!$service['sdk']) {
continue; continue;
} }
@ -471,7 +473,7 @@ $utopia->get('/v1/open-api-2.json')
'server' => ['Project' => [], 'Key' => []], 'server' => ['Project' => [], 'Key' => []],
]; ];
/** /*
* Specifications (v3.0.0): * Specifications (v3.0.0):
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md
*/ */
@ -540,30 +542,23 @@ $utopia->get('/v1/open-api-2.json')
], ],
], ],
], ],
'Pets' => 'Pets' => array(
array(
'type' => 'array', 'type' => 'array',
'items' => 'items' => array(
array(
'$ref' => '#/definitions/Pet', '$ref' => '#/definitions/Pet',
), ),
), ),
'Error' => 'Error' => array(
array( 'required' => array(
'required' =>
array(
0 => 'code', 0 => 'code',
1 => 'message', 1 => 'message',
), ),
'properties' => 'properties' => array(
array( 'code' => array(
'code' =>
array(
'type' => 'integer', 'type' => 'integer',
'format' => 'int32', 'format' => 'int32',
), ),
'message' => 'message' => array(
array(
'type' => 'string', 'type' => 'string',
), ),
), ),
@ -571,8 +566,8 @@ $utopia->get('/v1/open-api-2.json')
], ],
'externalDocs' => [ 'externalDocs' => [
'description' => 'Full API docs, specs and tutorials', 'description' => 'Full API docs, specs and tutorials',
'url' => $request->getServer('REQUEST_SCHEME', 'https') . '://' . $domain . '/docs' 'url' => $request->getServer('REQUEST_SCHEME', 'https').'://'.$domain.'/docs',
] ],
]; ];
foreach ($utopia->getRoutes() as $key => $method) { foreach ($utopia->getRoutes() as $key => $method) {
@ -585,10 +580,10 @@ $utopia->get('/v1/open-api-2.json')
continue; continue;
} }
$url = str_replace('/v1', '', $route->getURL()); $url = str_replace('/v1', '', $route->getURL());
$scope = $route->getLabel('scope', ''); $scope = $route->getLabel('scope', '');
$hide = $route->getLabel('sdk.hide', false); $hide = $route->getLabel('sdk.hide', false);
$consumes = []; $consumes = [];
if ($hide) { if ($hide) {
continue; continue;
@ -604,7 +599,7 @@ $utopia->get('/v1/open-api-2.json')
200 => [ 200 => [
'description' => 'An paged array of pets', 'description' => 'An paged array of pets',
'schema' => [ 'schema' => [
'$ref' => '#/definitions/Pet' '$ref' => '#/definitions/Pet',
], ],
], ],
], ],
@ -615,7 +610,7 @@ $utopia->get('/v1/open-api-2.json')
'weight' => $route->getOrder(), 'weight' => $route->getOrder(),
'cookies' => $route->getLabel('sdk.cookies', false), 'cookies' => $route->getLabel('sdk.cookies', false),
'location' => $route->getLabel('sdk.location', false), 'location' => $route->getLabel('sdk.location', false),
'demo' => 'docs/examples/' . fromCamelCaseToDash($route->getLabel('sdk.namespace', 'default')) . '/' . fromCamelCaseToDash($temp['operationId']) . '.md', 'demo' => 'docs/examples/'.fromCamelCaseToDash($route->getLabel('sdk.namespace', 'default')).'/'.fromCamelCaseToDash($temp['operationId']).'.md',
]; ];
} }
@ -631,8 +626,8 @@ $utopia->get('/v1/open-api-2.json')
'properties' => [], 'properties' => [],
], ],
'required' => [], 'required' => [],
] ],
] ],
]; ];
foreach ($route->getParams() as $name => $param) { foreach ($route->getParams() as $name => $param) {
@ -647,11 +642,11 @@ $utopia->get('/v1/open-api-2.json')
switch ((!empty($validator)) ? get_class($validator) : '') { switch ((!empty($validator)) ? get_class($validator) : '') {
case 'Utopia\Validator\Text': case 'Utopia\Validator\Text':
$node['type'] = 'string'; $node['type'] = 'string';
$node['x-example'] = '[' . strtoupper(fromCamelCase($node['name'])) . ']'; $node['x-example'] = '['.strtoupper(fromCamelCase($node['name'])).']';
break; break;
case 'Database\Validator\UID': case 'Database\Validator\UID':
$node['type'] = 'string'; $node['type'] = 'string';
$node['x-example'] = '[' . strtoupper(fromCamelCase($node['name'])) . ']'; $node['x-example'] = '['.strtoupper(fromCamelCase($node['name'])).']';
break; break;
case 'Utopia\Validator\Email': case 'Utopia\Validator\Email':
$node['type'] = 'string'; $node['type'] = 'string';
@ -678,7 +673,7 @@ $utopia->get('/v1/open-api-2.json')
$node['type'] = 'array'; $node['type'] = 'array';
$node['collectionFormat'] = 'multi'; $node['collectionFormat'] = 'multi';
$node['items'] = [ $node['items'] = [
'type' => 'string' 'type' => 'string',
]; ];
break; break;
case 'Auth\Validator\Password': case 'Auth\Validator\Password':
@ -716,7 +711,7 @@ $utopia->get('/v1/open-api-2.json')
$node['default'] = $param['default']; $node['default'] = $param['default'];
} }
if (false !== strpos($url, ':' . $name)) { // Param is in URL path if (false !== strpos($url, ':'.$name)) { // Param is in URL path
$node['in'] = 'path'; $node['in'] = 'path';
$temp['parameters'][] = $node; $temp['parameters'][] = $node;
} elseif ($key == 'GET') { // Param is in query } elseif ($key == 'GET') { // Param is in query
@ -732,7 +727,7 @@ $utopia->get('/v1/open-api-2.json')
} }
} }
$url = str_replace(':' . $name, '{' . $name . '}', $url); $url = str_replace(':'.$name, '{'.$name.'}', $url);
} }
$temp['consumes'] = $consumes; $temp['consumes'] = $consumes;
@ -755,18 +750,18 @@ $name = APP_NAME;
if (array_key_exists($service, $services)) { /** @noinspection PhpIncludeInspection */ if (array_key_exists($service, $services)) { /** @noinspection PhpIncludeInspection */
include_once $services[$service]['controller']; include_once $services[$service]['controller'];
$name = APP_NAME . ' ' . ucfirst($services[$service]['name']); $name = APP_NAME.' '.ucfirst($services[$service]['name']);
} else { } else {
/** @noinspection PhpIncludeInspection */ /** @noinspection PhpIncludeInspection */
include_once $services['/']['controller']; include_once $services['/']['controller'];
} }
if (extension_loaded('newrelic')) { if (extension_loaded('newrelic')) {
$route = $utopia->match($request); $route = $utopia->match($request);
$url = (!empty($route)) ? $route->getURL() : '/error'; $url = (!empty($route)) ? $route->getURL() : '/error';
newrelic_set_appname($name); newrelic_set_appname($name);
newrelic_name_transaction($request->getServer('REQUEST_METHOD', 'UNKNOWN') . ': ' . $url); newrelic_name_transaction($request->getServer('REQUEST_METHOD', 'UNKNOWN').': '.$url);
} }
$utopia->run($request, $response); $utopia->run($request, $response);

View file

@ -38,13 +38,13 @@ $collections = [
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS, '$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
'name' => 'Localhost (SSL)', 'name' => 'Localhost (SSL)',
'type' => 'web', 'type' => 'web',
'url' => 'https://' . $request->getServer('HTTP_HOST'), 'url' => 'https://'.$request->getServer('HTTP_HOST'),
], ],
[ [
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS, '$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
'name' => 'Localhost (Non-SSL)', 'name' => 'Localhost (Non-SSL)',
'type' => 'web', 'type' => 'web',
'url' => 'http://' . $request->getServer('HTTP_HOST'), 'url' => 'http://'.$request->getServer('HTTP_HOST'),
], ],
], ],
'legalName' => '', 'legalName' => '',
@ -1076,7 +1076,7 @@ foreach ($providers as $key => $provider) {
$collections[Database::SYSTEM_COLLECTION_PROJECTS]['rules'][] = [ $collections[Database::SYSTEM_COLLECTION_PROJECTS]['rules'][] = [
'$collection' => Database::SYSTEM_COLLECTION_RULES, '$collection' => Database::SYSTEM_COLLECTION_RULES,
'label' => 'OAuth '.ucfirst($key).' ID', 'label' => 'OAuth '.ucfirst($key).' ID',
'key' => 'usersOauth'.ucfirst($key) . 'Appid', 'key' => 'usersOauth'.ucfirst($key).'Appid',
'type' => 'text', 'type' => 'text',
'default' => '', 'default' => '',
'required' => false, 'required' => false,

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Àfrica',
'AN' => 'Antàrtica',
'AS' => 'Àsia',
'EU' => 'Europa',
'NA' => 'Amèrica del Nord',
'OC' => 'Oceania',
'SA' => 'Amèrica del Sud',
];

View file

@ -0,0 +1,197 @@
<?php
return [
'AF' => 'Afganistan',
'AO' => 'Angola',
'AL' => 'Albània',
'AD' => 'Andorra',
'AE' => 'Unió dels Emirats Àrabs Units',
'AR' => 'Argentina',
'AM' => 'Armènia',
'AG' => 'Antigua o Barbuda',
'AU' => 'Austràlia',
'AT' => 'Àustria',
'AZ' => 'Azerbaidjan',
'BI' => 'Burundi',
'BE' => 'Bèlgica',
'BJ' => 'Benín',
'BF' => 'Burkina Faso',
'BD' => 'Bangla Desh',
'BG' => 'Bulgaria',
'BH' => 'Bahrain',
'BS' => 'Bahamas',
'BA' => 'Bòsnia i Hercegovina',
'BY' => 'Bielorússia',
'BZ' => 'Belize',
'BO' => 'Bolívia',
'BR' => 'Brasil',
'BB' => 'Barbados',
'BN' => 'Brunei',
'BT' => 'Bhutan',
'BW' => 'Botswana',
'CF' => 'República Centreafricana',
'CA' => 'Canadà',
'CH' => 'Suïssa',
'CL' => 'Xile',
'CN' => 'Xina',
'CI' => 'Costa d\'Ivori',
'CM' => 'Camerun',
'CD' => 'República Democràtica del Congo',
'CG' => 'República del congo',
'CO' => 'Colòmbia',
'KM' => 'Comores',
'CV' => 'Cap Verd',
'CR' => 'Costa Rica',
'CU' => 'Cuba',
'CY' => 'Xipre',
'CZ' => 'Txèquia',
'DE' => 'Alemanya',
'DJ' => 'Djibouti',
'DM' => 'Dominica',
'DK' => 'Dinamarca',
'DO' => 'República Dominicana',
'DZ' => 'Argelia',
'EC' => 'Equador',
'EG' => 'Egipte',
'ER' => 'Eritrea',
'ES' => 'Espanya',
'EE' => 'Estònia',
'ET' => 'Etiòpia',
'FI' => 'Finlàndia',
'FJ' => 'Fiji',
'FR' => 'França',
'FM' => 'Micronèsia',
'GA' => 'Gabon',
'GB' => 'Regne Unit',
'GE' => 'Geòrgia',
'GH' => 'Ghana',
'GN' => 'Guinea',
'GM' => 'Gàmbia',
'GW' => 'Guinea Bissau',
'GQ' => 'Guinea Equatorial',
'GR' => 'Grècia',
'GD' => 'Granada',
'GT' => 'Guatemala',
'GY' => 'Guaiana',
'HN' => 'Hondures',
'HR' => 'Croàcia',
'HT' => 'Haití',
'HU' => 'Hungria',
'ID' => 'Indonèsia',
'IN' => 'Índia',
'IE' => 'Irlanda',
'IR' => 'Iran',
'IQ' => 'Iraq',
'IS' => 'Islàndia',
'IL' => 'Israel',
'IT' => 'Itàlia',
'JM' => 'Jamaica',
'JO' => 'Jordà',
'JP' => 'Japó',
'KZ' => 'Kazakhstan',
'KE' => 'Kenya',
'KG' => 'Kirguizistan',
'KH' => 'Cambodja',
'KI' => 'Kiribati',
'KN' => 'Sant Cristòfol i Neus',
'KR' => 'Corea del Sud',
'KW' => 'Kuwait',
'LA' => 'Laos',
'LB' => 'Líban',
'LR' => 'Libèria',
'LY' => 'Líbia',
'LC' => 'Santa Llúcia',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
'LS' => 'Lesoto',
'LT' => 'Lituània',
'LU' => 'Luxemburg',
'LV' => 'Letònia',
'MA' => 'Marroc',
'MC' => 'Mònaco',
'MD' => 'Moldàvia',
'MG' => 'Madagascar',
'MV' => 'Maldives',
'MX' => 'Mèxic',
'MH' => 'Illes Marshall',
'MK' => 'Macedònia',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Myanmar',
'ME' => 'Montenegro',
'MN' => 'Mongòlia',
'MZ' => 'Moçambic',
'MR' => 'Mauritània',
'MU' => 'Maurici',
'MW' => 'Malawi',
'MY' => 'Malàsia',
'NA' => 'Namíbia',
'NE' => 'Níger',
'NG' => 'Nigèria',
'NI' => 'Nicaragua',
'NL' => 'Països Baixos',
'NO' => 'Noruega',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'Nova Zelanda',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panamà',
'PE' => 'Perú',
'PH' => 'Filipines',
'PW' => 'Palaos',
'PG' => 'Papua Nova Guinea',
'PL' => 'Polònia',
'KP' => 'Corea del Nord',
'PT' => 'Portugal',
'PY' => 'Paraguai',
'QA' => 'Katar',
'RO' => 'Romania',
'RU' => 'Rússia',
'RW' => 'Rwanda',
'SA' => 'Aràbia Saudita',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapur',
'SB' => 'Illes Salomó',
'SL' => 'Sierra Leone',
'SV' => 'El Salvador',
'SM' => 'San Marí',
'SO' => 'Somàlia',
'RS' => 'Sèrbia',
'SS' => 'Sudàn del Sud',
'ST' => 'Santo Tomé y Príncipe',
'SR' => 'Surinam',
'SK' => 'Eslovàquia',
'SI' => 'Eslovènia',
'SE' => 'Suècia',
'SZ' => 'Swazilàndia',
'SC' => 'Seychelles',
'SY' => 'Síria',
'TD' => 'Txad',
'TG' => 'Togo',
'TH' => 'Tailàndia',
'TJ' => 'Tadjikistan',
'TM' => 'Turkmenistan',
'TL' => 'Timor Oriental',
'TO' => 'Tonga',
'TT' => 'Trinitat i Tobago',
'TN' => 'Tunísia',
'TR' => 'Turquia',
'TV' => 'Tuvalu',
'TZ' => 'Tanzània',
'UG' => 'Uganda',
'UA' => 'Ucraïna',
'UY' => 'Uruguai',
'US' => 'Estats Units',
'UZ' => 'Uzbekistan',
'VA' => 'Ciudat del Vaticà',
'VC' => 'Saint Vincent i les Grenadines',
'VE' => 'Veneçuela',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Iemen',
'ZA' => 'Sud-àfrica',
'ZM' => 'Zàmbia',
'ZW' => 'Zimbabwe',
];

21
app/config/locale/cat.php Normal file
View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"L\'art de ser sabi és l\'art de saber què passar per alt"', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'cat',
'settings.direction' => 'ltr',
// Service - Users
'auth.emails.team' => '%s Equip',
'auth.emails.confirm.title' => 'Confirmació del compte',
'auth.emails.confirm.body' => 'cat.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Restablir contrasenya',
'auth.emails.recovery.body' => 'cat.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Invitació a l\'Equipo %s a %s',
'auth.emails.invitation.body' => 'cat.email.auth.invitation.tpl',
'locale.country.unknown' => 'Desconegut',
'countries' => include 'cat.countries.php',
'continents' => include 'cat.continents.php',
];

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Afrika',
'AN' => 'Antarktis',
'AS' => 'Asien',
'EU' => 'Europa',
'NA' => 'Nordamerika',
'OC' => 'Ozeanien',
'SA' => 'Südamerika',
];

View file

@ -0,0 +1,198 @@
<?php
return [
'AF' => 'Afghanistan',
'AO' => 'Angola',
'AL' => 'Albanien',
'AD' => 'Andorra',
'AE' => 'Vereinigte Arabische Emirate',
'AR' => 'Argentinien',
'AM' => 'Armenien',
'AG' => 'Antigua und Barbuda',
'AU' => 'Australien',
'AT' => 'Österreich',
'AZ' => 'Aserbaidschan',
'BI' => 'Burundi',
'BE' => 'Belgien',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladesch',
'BG' => 'Bulgarien',
'BH' => 'Bahrain',
'BS' => 'Bahamas',
'BA' => 'Bosnien und Herzegowina',
'BY' => 'Weißrussland',
'BZ' => 'Belize',
'BO' => 'Bolivien',
'BR' => 'Brazilen',
'BB' => 'Barbados',
'BN' => 'Brunei',
'BT' => 'Bhutan',
'BW' => 'Botswana',
'CF' => 'Zentralafrikanische Republik',
'CA' => 'Kanada',
'CH' => 'Schweiz',
'CL' => 'Chile',
'CN' => 'China',
'CI' => 'Elfenbeinküste',
'CM' => 'Kamerun',
'CD' => 'Demokratische Republik Kongo',
'CG' => 'Republik Kongo',
'CO' => 'Kolumbien',
'KM' => 'Komoren',
'CV' => 'Kap Verde',
'CR' => 'Costa Rica',
'CU' => 'Kuba',
'CY' => 'Zypern',
'CZ' => 'Tschechien',
'DE' => 'Deutschland',
'DJ' => 'Dschibuti',
'DM' => 'Dominica',
'DK' => 'Dänemark',
'DO' => 'Dominikanische Republik',
'DZ' => 'Algerien',
'EC' => 'Ecuador',
'EG' => 'Ägypten',
'ER' => 'Eritrea',
'ES' => 'Spanien',
'EE' => 'Estland',
'ET' => 'Äthiopien',
'FI' => 'Finnland',
'FJ' => 'Fidschi',
'FR' => 'Frankreich',
'FM' => 'Mikronesien',
'GA' => 'Gabun',
'GB' => 'Großbritannien',
'GE' => 'Georgien',
'GH' => 'Ghana',
'GN' => 'Guinea',
'GM' => 'Gambia',
'GW' => 'Guinea-Bissau',
'GQ' => 'Äquatorialguinea',
'GR' => 'Griechenland',
'GD' => 'Grenada',
'GT' => 'Guatemala',
'GY' => 'Guyana',
'HN' => 'Honduras',
'HR' => 'Kroatien',
'HT' => 'Haiti',
'HU' => 'Ungarn',
'ID' => 'Indonesien',
'IN' => 'Indien',
'IE' => 'Irland',
'IR' => 'Iran',
'IQ' => 'Irak',
'IS' => 'Island',
'IL' => 'Israel',
'IT' => 'Italien',
'JM' => 'Jamaika',
'JO' => 'Jordan',
'JP' => 'Japan',
'KZ' => 'Kasachstan',
'KE' => 'Kenia',
'KG' => 'Kirgisistan',
'KH' => 'Kambodscha',
'KI' => 'Kiribati',
'KN' => 'St. Kitts und Nevis',
'KR' => 'Südkorea',
'KW' => 'Kuwait',
'LA' => 'Laos',
'LB' => 'Libanon',
'LR' => 'Liberia',
'LY' => 'Libyen',
'LC' => 'St. Lucia',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
'LS' => 'Lesotho',
'LT' => 'Litauen',
'LU' => 'Luxemburg',
'LV' => 'Lettland',
'MA' => 'Marokko',
'MC' => 'Monaco',
'MD' => 'Moldawien',
'MG' => 'Madagaskar',
'MV' => 'Malediven',
'MX' => 'Mexiko',
'MH' => 'Marshallinseln',
'MK' => 'Mazedonien',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Myanmar',
'ME' => 'Montenegro',
'MN' => 'Mongolei',
'MZ' => 'Mosambik',
'MR' => 'Mauretanien',
'MU' => 'Mauritius',
'MW' => 'Malawi',
'MY' => 'Malaysia',
'NA' => 'Namibia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nicaragua',
'NL' => 'Niederlande',
'NO' => 'Norwegen',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'Neuseeland',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PE' => 'Peru',
'PH' => 'Philippinen',
'PW' => 'Palau',
'PG' => 'Papua Neu-Guinea',
'PL' => 'Polen',
'KP' => 'Nord Korea',
'PT' => 'Portugal',
'PY' => 'Paraguay',
'QA' => 'Katar',
'RO' => 'Rumänien',
'RU' => 'Russland',
'RW' => 'Ruanda',
'SA' => 'Saudi Arabien',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapur',
'SB' => 'Salomon-Inseln',
'SL' => 'Sierra Leone',
'SV' => 'El Salvador',
'SM' => 'San Marino',
'SO' => 'Somalia',
'RS' => 'Serbien',
'SS' => 'Südsudan',
'ST' => 'São Tomé und Príncipe',
'SR' => 'Suriname',
'SK' => 'Slowakei',
'SI' => 'Slowenien',
'SE' => 'Schweden',
'SZ' => 'Swasiland',
'SC' => 'Seychellen',
'SY' => 'Syrien',
'TD' => 'Tschad',
'TG' => 'Togo',
'TH' => 'Thailand',
'TJ' => 'Tadschikistan',
'TM' => 'Turkmenistan',
'TL' => 'Timor-Leste',
'TO' => 'Tonga',
'TT' => 'Trinidad und Tobago',
'TN' => 'Tunesien',
'TR' => 'Türkei',
'TV' => 'Tuvalu',
'TZ' => 'Tansania',
'UG' => 'Uganda',
'UA' => 'Ukraine',
'UY' => 'Uruguay',
'US' => 'Vereinigte Staaten',
'UZ' => 'Usbekistan',
'VA' => 'Vatikanstadt',
'VC' => 'St. Vincent und die Grenadinen',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Jemen',
'ZA' => 'Südafrika',
'ZM' => 'Sambia',
'ZW' => 'Zimbabwe',
];

21
app/config/locale/de.php Normal file
View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"Die Kunst, weise zu sein, ist die Kunst, zu wissen, was zu übersehen ist."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'de',
'settings.direction' => 'ltr',
// Service - Users
'auth.emails.team' => '%s Team',
'auth.emails.confirm.title' => 'Accountbestätigung',
'auth.emails.confirm.body' => 'de.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Passwort zurücksetzen',
'auth.emails.recovery.body' => 'de.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Einladung zum %s Team bei %s',
'auth.emails.invitation.body' => 'de.email.auth.invitation.tpl',
'locale.country.unknown' => 'Unbekannt',
'countries' => include 'de.countries.php',
'continents' => include 'de.continents.php',
];

View file

@ -1,4 +1,5 @@
<?php <?php
return [ return [
'AF' => 'Afganistán', 'AF' => 'Afganistán',
'AO' => 'Angola', 'AO' => 'Angola',

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Afrikka',
'AN' => 'Antarktis',
'AS' => 'Aasia',
'EU' => 'Eurooppa',
'NA' => 'Pohjois Amerikka',
'OC' => 'Oceania',
'SA' => 'Etelä Amerikka',
];

View file

@ -0,0 +1,198 @@
<?php
return [
'AF' => 'Afganistan',
'AO' => 'Angola',
'AL' => 'Albania',
'AD' => 'Andorra',
'AE' => 'Arabiemiirikunnat',
'AR' => 'Argentiina',
'AM' => 'Armenia',
'AG' => 'Antigua ja Barbuda',
'AU' => 'Australia',
'AT' => 'Itävalta',
'AZ' => 'Azerbaidžan',
'BI' => 'Burundi',
'BE' => 'Belgia',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladesh',
'BG' => 'Bulgaria',
'BH' => 'Bahrain',
'BS' => 'Bahama',
'BA' => 'Bosnia ja Hertsegovina',
'BY' => 'Valkovenäjä',
'BZ' => 'Belize',
'BO' => 'Bolivia',
'BR' => 'Brasilia',
'BB' => 'Barbados',
'BN' => 'Brunei',
'BT' => 'Bhutan',
'BW' => 'Botswana',
'CF' => 'Keski-Afrikan tasavalta',
'CA' => 'Kanada',
'CH' => 'Sveitsi',
'CL' => 'Chile',
'CN' => 'Kiina',
'CI' => 'Norsunluurannikko',
'CM' => 'Kamerun',
'CD' => 'Kongon demokraattinen tasavalta',
'CG' => 'Kongon tasavalta',
'CO' => 'Kolumbia',
'KM' => 'Komorit',
'CV' => 'Kap Verde',
'CR' => 'Costa Rica',
'CU' => 'Kuuba',
'CY' => 'Kypros',
'CZ' => 'Tšekki',
'DE' => 'Saksa',
'DJ' => 'Djibouti',
'DM' => 'Dominica',
'DK' => 'Tanska',
'DO' => 'Dominikaaninen tasavalta',
'DZ' => 'Algeria',
'EC' => 'Ecuador',
'EG' => 'Egypti',
'ER' => 'Eritrea',
'ES' => 'Espanja',
'EE' => 'Viro',
'ET' => 'Etiopia',
'FI' => 'Suomi',
'FJ' => 'Fidži',
'FR' => 'Ranska',
'FM' => 'Mikronesia',
'GA' => 'Gabon',
'GB' => 'Yhdistynyt kuningaskunta',
'GE' => 'Georgia',
'GH' => 'Ghana',
'GN' => 'Guinea',
'GM' => 'Gambia',
'GW' => 'Guinea-Bissau',
'GQ' => 'Päiväntasaajan Guinea',
'GR' => 'Kreikka',
'GD' => 'Grenada',
'GT' => 'Guatemala',
'GY' => 'Guyana',
'HN' => 'Honduras',
'HR' => 'Kroatia',
'HT' => 'Haiti',
'HU' => 'Unkari',
'ID' => 'Indonesia',
'IN' => 'Intia',
'IE' => 'Irlanti',
'IR' => 'Iran',
'IQ' => 'Irak',
'IS' => 'Islanti',
'IL' => 'Israel',
'IT' => 'Italia',
'JM' => 'Jamaika',
'JO' => 'Jordan',
'JP' => 'Japani',
'KZ' => 'Kazakstan',
'KE' => 'Kenia',
'KG' => 'Kirgisia',
'KH' => 'Kambodža',
'KI' => 'Kiribati',
'KN' => 'Saint Kitts ja Nevis',
'KR' => 'Etelä-Korea',
'KW' => 'Kuwait',
'LA' => 'Laos',
'LB' => 'Libanon',
'LR' => 'Liberia',
'LY' => 'Libya',
'LC' => 'Saint Lucia',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
'LS' => 'Lesotho',
'LT' => 'Liettua',
'LU' => 'Luxemburg',
'LV' => 'Latvia',
'MA' => 'Marokko',
'MC' => 'Monaco',
'MD' => 'Moldova',
'MG' => 'Madagaskar',
'MV' => 'Malediivit',
'MX' => 'Meksiko',
'MH' => 'Marshallinsaaret',
'MK' => 'Makedonia',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Myanmar',
'ME' => 'Montenegro',
'MN' => 'Mongolia',
'MZ' => 'Mosambik',
'MR' => 'Mauritania',
'MU' => 'Mauritius',
'MW' => 'Malawi',
'MY' => 'Malesia',
'NA' => 'Namibia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nicaragua',
'NL' => 'Alankomaat',
'EI' => 'Norja',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'Uusi-Seelanti',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PE' => 'Peru',
'PH' => 'Filippiinit',
'PW' => 'Palau',
'PG' => 'Papua-Uusi-Guinea',
'PL' => 'Puola',
'KP' => 'Pohjois-Korea',
'PT' => 'Portugali',
'PY' => 'Paraguay',
'QA' => 'Qatar',
'RO' => 'Romania',
'RU' => 'Venäjä',
'RW' => 'Ruanda',
'SA' => 'Saudi-Arabia',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapore',
'SB' => 'Salomonsaaret',
'SL' => 'Sierra Leone',
'SV' => 'Salvador',
'SM' => 'San Marino',
'SO' => 'Somalia',
'RS' => 'Serbia',
'SS' => 'Etelä-Sudan',
'ST' => 'São Tomé ja Príncipe',
'SR' => 'Suriname',
'SK' => 'Slovakia',
'SI' => 'Slovenia',
'SE' => 'Ruotsi',
'SZ' => 'Swazimaa',
'SC' => 'Seychellit',
'SY' => 'Syyria',
'TD' => 'Tšad',
'TG' => 'Togo',
'TH' => 'Thaimaa',
'TJ' => 'Tadžikistan',
'TM' => 'Turkmenistan',
'TL' => 'Timor-Leste',
'TO' => 'Tonga',
'TT' => 'Trinidad ja Tobago',
'TN' => 'Tunisia',
'TR' => 'Turkki',
'TV' => 'Tuvalu',
'TZ' => 'Tansania',
'UG' => 'Uganda',
'UA' => 'Ukraina',
'UY' => 'Uruguay',
'US' => 'Yhdysvallat',
'UZ' => 'Uzbekistan',
'VA' => 'Vatikaanikaupunki',
'VC' => 'Saint Vincent ja Grenadiinit',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Jemen',
'ZA' => 'Etelä-Afrikka',
'ZM' => 'Sambia',
'ZW' => 'Zimbabwe',
];

21
app/config/locale/fi.php Normal file
View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'fi',
'settings.direction' => 'ltr',
// Service - Users
'auth.emails.team' => '%s Tiimi',
'auth.emails.confirm.title' => 'Tilin Vahvistus',
'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Salasanan Nollaus',
'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Kutsu %s Tiimiin %s',
'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl',
'locale.country.unknown' => 'Unknown',
'countries' => include 'fi.countries.php',
'continents' => include 'fi.continents.php',
];

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Afrika',
'AN' => 'Antartika',
'AS' => 'Asia',
'EU' => 'Eropa',
'NA' => 'Amerika Utara',
'OC' => 'Oseania',
'SA' => 'Amerika Selatan',
];

View file

@ -0,0 +1,198 @@
<?php
return [
'AF' => 'Afganistan',
'AO' => 'Angola',
'AL' => 'Albania',
'AD' => 'Andorra',
'AE' => 'Uni Emirat Arab',
'AR' => 'Argentina',
'AM' => 'Armenia',
'AG' => 'Antigua dan Barbuda',
'AU' => 'Australia',
'AT' => 'Austria',
'AZ' => 'Azerbaijan',
'BI' => 'Burundi',
'BE' => 'Belgium',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladesh',
'BG' => 'Bulgaria',
'BH' => 'Bahrain',
'BS' => 'Bahama',
'BA' => 'Bosnia dan Herzegovina',
'BY' => 'Belarus',
'BZ' => 'Belize',
'BO' => 'Bolivia',
'BR' => 'Brazil',
'BB' => 'Barbados',
'BN' => 'Brunei',
'BT' => 'Bhutan',
'BW' => 'Botswana',
'CF' => 'Republik Afrika Tengah',
'CA' => 'Kanada',
'CH' => 'Swiss',
'CL' => 'Chili',
'CN' => 'Cina',
'CI' => 'Pantai Gading',
'CM' => 'Kamerun',
'CD' => 'DR Kongo',
'CG' => 'Republik Kongo',
'CO' => 'Kolumbia',
'KM' => 'Komoro',
'CV' => 'Tanjung Verde',
'CR' => 'Kosta Rika',
'CU' => 'Kuba',
'CY' => 'Siprus',
'CZ' => 'Czechia',
'DE' => 'Jerman',
'DJ' => 'Djibouti',
'DM' => 'Dominika',
'DK' => 'Denmark',
'DO' => 'Republik Dominika',
'DZ' => 'Aljazair',
'EC' => 'Ekuador',
'EG' => 'Mesir',
'ER' => 'Eritrea',
'ES' => 'Spanyol',
'EE' => 'Estonia',
'ET' => 'Etiopia',
'FI' => 'Finlandia',
'FJ' => 'Fiji',
'FR' => 'Perancis',
'FM' => 'Mikronesia',
'GA' => 'Gabon',
'GB' => 'Britania Raya',
'GE' => 'Georgia',
'GH' => 'Ghana',
'GN' => 'Guinea',
'GM' => 'Gambia',
'GW' => 'Guinea-Bissau',
'GQ' => 'Guinea Khatulistiwa',
'GR' => 'Yunani',
'GD' => 'Grenada',
'GT' => 'Guatemala',
'GY' => 'Guyana',
'HN' => 'Honduras',
'HR' => 'Kroasia',
'HT' => 'Haiti',
'HU' => 'Hungaria',
'ID' => 'Indonesia',
'IN' => 'India',
'IE' => 'Irlandia',
'IR' => 'Iran',
'IQ' => 'Irak',
'IS' => 'Islandia',
'IL' => 'Israel',
'IT' => 'Italia',
'JM' => 'Jamaika',
'JO' => 'Jordan',
'JP' => 'Jepang',
'KZ' => 'Kazakhstan',
'KE' => 'Kenya',
'KG' => 'Kirgistan',
'KH' => 'Kamboja',
'KI' => 'Kiribati',
'KN' => 'Saint Kitts dan Nevis',
'KR' => 'Korea Selatan',
'KW' => 'Kuwait',
'LA' => 'Laos',
'LB' => 'Lebanon',
'LR' => 'Liberia',
'LY' => 'Libya',
'LC' => 'Saint Lucia',
'LI' => 'Liechtenstein',
'LK' => 'Srilanka',
'LS' => 'Lesotho',
'LT' => 'Lithuania',
'LU' => 'Luksemburg',
'LV' => 'Latvia',
'MA' => 'Maroko',
'MC' => 'Monako',
'MD' => 'Moldova',
'MG' => 'Madagaskar',
'MV' => 'Maladewa',
'MX' => 'Meksiko',
'MH' => 'Pulau Marshall',
'MK' => 'Makedonia',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Myanmar',
'ME' => 'Montenegro',
'MN' => 'Mongolia',
'MZ' => 'Mozambik',
'MR' => 'Mauritania',
'MU' => 'Mauritius',
'MW' => 'Malawi',
'MY' => 'Malaysia',
'NA' => 'Namibia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nikaragua',
'NL' => 'Belanda',
'NO' => 'Norway',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'Selandia Baru',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PE' => 'Peru',
'PH' => 'Filipina',
'PW' => 'Palau',
'PG' => 'Papua Nugini',
'PL' => 'Polandia',
'KP' => 'Korea Utara',
'PT' => 'Portugal',
'PY' => 'Paraguay',
'QA' => 'Qatar',
'RO' => 'Rumania',
'RU' => 'Rusia',
'RW' => 'Rwanda',
'SA' => 'Arab Saudi',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapura',
'SB' => 'Pulau Solomon',
'SL' => 'Sierra Leone',
'SV' => 'El Salvador',
'SM' => 'San Marino',
'SO' => 'Somalia',
'RS' => 'Serbia',
'SS' => 'Sudan Selatan',
'ST' => 'São Tomé dan Príncipe',
'SR' => 'Suriname',
'SK' => 'Slovakia',
'SI' => 'Slovenia',
'SE' => 'Swedia',
'SZ' => 'Swaziland',
'SC' => 'Seychelles',
'SY' => 'Suriah',
'TD' => 'Chad',
'TG' => 'Untuk pergi',
'TH' => 'Thailand',
'TJ' => 'Tajikistan',
'TM' => 'Turkmenistan',
'TL' => 'Timor-Leste',
'TO' => 'Tonga',
'TT' => 'Trinidad dan Tobago',
'TN' => 'Tunisia',
'TR' => 'Turki',
'TV' => 'Tuvalu',
'TZ' => 'Tanzania',
'UG' => 'Uganda',
'UA' => 'Ukraina',
'UY' => 'Uruguay',
'US' => 'Amerika Serikat',
'UZ' => 'Uzbekistan',
'VA' => 'Kota Vatikan',
'VC' => 'Saint Vincent dan Grenadines',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Yaman',
'ZA' => 'Afrika Selatan',
'ZM' => 'Zambia',
'ZW' => 'Zimbabwe',
];

21
app/config/locale/id.php Normal file
View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'id',
'settings.direction' => 'ltr',
// Service - Users
'auth.emails.team' => 'Tim %s',
'auth.emails.confirm.title' => 'Konfirmasi Akun',
'auth.emails.confirm.body' => 'id.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Reset Kata Sandi',
'auth.emails.recovery.body' => 'id.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Undangan ke Tim %s di %s',
'auth.emails.invitation.body' => 'id.email.auth.invitation.tpl',
'locale.country.unknown' => 'Tidak diketahui',
'countries' => include 'id.countries.php',
'continents' => include 'id.continents.php',
];

View file

@ -1,10 +1,11 @@
<?php <?php
return [
'AF' => 'Africa', return [
'AN' => 'Antartide', 'AF' => 'Africa',
'AS' => 'Asia', 'AN' => 'Antartide',
'EU' => 'Europa', 'AS' => 'Asia',
'NA' => 'Nord America', 'EU' => 'Europa',
'OC' => 'Oceania', 'NA' => 'Nord America',
'SA' => 'Sud America', 'OC' => 'Oceania',
]; 'SA' => 'Sud America',
];

View file

@ -1,198 +1,198 @@
<?php <?php
return [ return [
'AF' => 'Afghanistan', 'AF' => 'Afghanistan',
'AO' => 'Angola', 'AO' => 'Angola',
'AL' => 'Albania', 'AL' => 'Albania',
'AD' => 'Andorra', 'AD' => 'Andorra',
'AE' => 'Emirati Arabi Uniti', 'AE' => 'Emirati Arabi Uniti',
'AR' => 'Argentina', 'AR' => 'Argentina',
'AM' => 'Armenia', 'AM' => 'Armenia',
'AG' => 'Antigua e Barbuda', 'AG' => 'Antigua e Barbuda',
'AU' => 'Australia', 'AU' => 'Australia',
'AT' => 'Austria', 'AT' => 'Austria',
'AZ' => 'Azerbaigian', 'AZ' => 'Azerbaigian',
'BI' => 'Burundi', 'BI' => 'Burundi',
'BE' => 'Belgio', 'BE' => 'Belgio',
'BJ' => 'Benin', 'BJ' => 'Benin',
'BF' => 'Burkina Faso', 'BF' => 'Burkina Faso',
'BD' => 'Bangladesh', 'BD' => 'Bangladesh',
'BG' => 'Bulgaria', 'BG' => 'Bulgaria',
'BH' => 'Bahrein', 'BH' => 'Bahrein',
'BS' => 'Bahamas', 'BS' => 'Bahamas',
"BA" => "Bosnia ed Erzegovina", 'BA' => 'Bosnia ed Erzegovina',
'BY' => 'Bielorussia', 'BY' => 'Bielorussia',
'BZ' => 'Belize', 'BZ' => 'Belize',
'BO' => 'Bolivia', 'BO' => 'Bolivia',
'BR' => 'Brasile', 'BR' => 'Brasile',
'BB' => 'Barbados', 'BB' => 'Barbados',
'BN' => 'Brunei', 'BN' => 'Brunei',
'BT' => 'Bhutan', 'BT' => 'Bhutan',
'BW' => 'Botswana', 'BW' => 'Botswana',
"CF" => "Repubblica centrafricana", 'CF' => 'Repubblica centrafricana',
'CA' => 'Canada', 'CA' => 'Canada',
'CH' => 'Svizzera', 'CH' => 'Svizzera',
'CL' => 'Cile', 'CL' => 'Cile',
'CN' => 'Cina', 'CN' => 'Cina',
'CI' => 'Costa d\'Avorio', 'CI' => 'Costa d\'Avorio',
'CM' => 'Camerun', 'CM' => 'Camerun',
'CD' => 'DR Congo', 'CD' => 'DR Congo',
'CG' => 'Repubblica del Congo', 'CG' => 'Repubblica del Congo',
'CO' => 'Colombia', 'CO' => 'Colombia',
'KM' => 'Comore', 'KM' => 'Comore',
'CV' => 'Capo Verde', 'CV' => 'Capo Verde',
'CR' => 'Costa Rica', 'CR' => 'Costa Rica',
'CU' => 'Cuba', 'CU' => 'Cuba',
'CY' => 'Cipro', 'CY' => 'Cipro',
'CZ' => 'Czechia', 'CZ' => 'Czechia',
'DE' => 'Germania', 'DE' => 'Germania',
'DJ' => 'Gibuti', 'DJ' => 'Gibuti',
'DM' => 'Dominica', 'DM' => 'Dominica',
'DK' => 'Danimarca', 'DK' => 'Danimarca',
'DO' => 'Repubblica Dominicana', 'DO' => 'Repubblica Dominicana',
'DZ' => 'Algeria', 'DZ' => 'Algeria',
'EC' => 'Ecuador', 'EC' => 'Ecuador',
'EG' => 'Egitto', 'EG' => 'Egitto',
'ER' => 'Eritrea', 'ER' => 'Eritrea',
'ES' => 'Spagna', 'ES' => 'Spagna',
'EE' => 'Estonia', 'EE' => 'Estonia',
'ET' => 'Etiopia', 'ET' => 'Etiopia',
'FI' => 'Finlandia', 'FI' => 'Finlandia',
'FJ' => 'Figi', 'FJ' => 'Figi',
'FR' => 'France', 'FR' => 'France',
'FM' => 'Micronesia', 'FM' => 'Micronesia',
'GA' => 'Gabon', 'GA' => 'Gabon',
'GB' => 'Regno Unito', 'GB' => 'Regno Unito',
'GE' => 'Georgia', 'GE' => 'Georgia',
'GH' => 'Ghana', 'GH' => 'Ghana',
'GN' => 'Guinea', 'GN' => 'Guinea',
'GM' => 'Gambia', 'GM' => 'Gambia',
'GW' => 'Guinea-Bissau', 'GW' => 'Guinea-Bissau',
'GQ' => 'Guinea equatoriale', 'GQ' => 'Guinea equatoriale',
'GR' => 'Grecia', 'GR' => 'Grecia',
'GD' => 'Grenada', 'GD' => 'Grenada',
'GT' => 'Guatemala', 'GT' => 'Guatemala',
'GY' => 'Guyana', 'GY' => 'Guyana',
'HN' => 'Honduras', 'HN' => 'Honduras',
'HR' => 'Croazia', 'HR' => 'Croazia',
'HT' => 'Haiti', 'HT' => 'Haiti',
'HU' => 'Ungheria', 'HU' => 'Ungheria',
'ID' => 'Indonesia', 'ID' => 'Indonesia',
'IN' => 'India', 'IN' => 'India',
'IE' => 'Irlanda', 'IE' => 'Irlanda',
'IR' => 'Iran', 'IR' => 'Iran',
'IQ' => 'Iraq', 'IQ' => 'Iraq',
'IS' => 'Islanda', 'IS' => 'Islanda',
'IL' => 'Israele', 'IL' => 'Israele',
'IT' => 'Italia', 'IT' => 'Italia',
'JM' => 'Giamaica', 'JM' => 'Giamaica',
'JO' => 'Jordan', 'JO' => 'Jordan',
'JP' => 'Giappone', 'JP' => 'Giappone',
'KZ' => 'Kazakistan', 'KZ' => 'Kazakistan',
'KE' => 'Kenya', 'KE' => 'Kenya',
'KG' => 'Kirghizistan', 'KG' => 'Kirghizistan',
'KH' => 'Cambogia', 'KH' => 'Cambogia',
'KI' => 'Kiribati', 'KI' => 'Kiribati',
'KN' => 'Saint Kitts e Nevis', 'KN' => 'Saint Kitts e Nevis',
"KR" => "Corea del Sud", 'KR' => 'Corea del Sud',
'KW' => 'Kuwait', 'KW' => 'Kuwait',
'LA' => 'Laos', 'LA' => 'Laos',
'LB' => 'Libano', 'LB' => 'Libano',
'LR' => 'Liberia', 'LR' => 'Liberia',
'LY' => 'Libia', 'LY' => 'Libia',
'LC' => 'Santa Lucia', 'LC' => 'Santa Lucia',
'LI' => 'Liechtenstein', 'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka', 'LK' => 'Sri Lanka',
'LS' => 'Lesotho', 'LS' => 'Lesotho',
'LT' => 'Lituania', 'LT' => 'Lituania',
'LU' => 'Lussemburgo', 'LU' => 'Lussemburgo',
'LV' => 'Lettonia', 'LV' => 'Lettonia',
'MA' => 'Marocco', 'MA' => 'Marocco',
'MC' => 'Monaco', 'MC' => 'Monaco',
'MD' => 'Moldavia', 'MD' => 'Moldavia',
'MG' => 'Madagascar', 'MG' => 'Madagascar',
'MV' => 'Maldive', 'MV' => 'Maldive',
'MX' => 'Messico', 'MX' => 'Messico',
'MH' => 'Isole Marshall', 'MH' => 'Isole Marshall',
'MK' => 'Macedonia', 'MK' => 'Macedonia',
'ML' => 'Mali', 'ML' => 'Mali',
'MT' => 'Malta', 'MT' => 'Malta',
'MM' => 'Myanmar', 'MM' => 'Myanmar',
'ME' => 'Montenegro', 'ME' => 'Montenegro',
'MN' => 'Mongolia', 'MN' => 'Mongolia',
'MZ' => 'Mozambico', 'MZ' => 'Mozambico',
'MR' => 'Mauritania', 'MR' => 'Mauritania',
'MU' => 'Mauritius', 'MU' => 'Mauritius',
'MW' => 'Malawi', 'MW' => 'Malawi',
'MY' => 'Malaysia', 'MY' => 'Malaysia',
'NA' => 'Namibia', 'NA' => 'Namibia',
'NE' => 'Niger', 'NE' => 'Niger',
'NG' => 'Nigeria', 'NG' => 'Nigeria',
'NI' => 'Nicaragua', 'NI' => 'Nicaragua',
'NL' => 'Paesi Bassi', 'NL' => 'Paesi Bassi',
'NO' => 'Norvegia', 'NO' => 'Norvegia',
'NP' => 'Nepal', 'NP' => 'Nepal',
'NR' => 'Nauru', 'NR' => 'Nauru',
'NZ' => 'Nuova Zelanda', 'NZ' => 'Nuova Zelanda',
'OM' => 'Oman', 'OM' => 'Oman',
'PK' => 'Pakistan', 'PK' => 'Pakistan',
'PA' => 'Panama', 'PA' => 'Panama',
'PE' => 'Perù', 'PE' => 'Perù',
'PH' => 'Filippine', 'PH' => 'Filippine',
'PW' => 'Palau', 'PW' => 'Palau',
'PG' => 'Papua New Guinea', 'PG' => 'Papua New Guinea',
'PL' => 'Polonia', 'PL' => 'Polonia',
'KP' => 'Corea del Nord', 'KP' => 'Corea del Nord',
'PT' => 'Portogallo', 'PT' => 'Portogallo',
'PY' => 'Paraguay', 'PY' => 'Paraguay',
'QA' => 'Qatar', 'QA' => 'Qatar',
'RO' => 'Romania', 'RO' => 'Romania',
'RU' => 'Russia', 'RU' => 'Russia',
'RW' => 'Ruanda', 'RW' => 'Ruanda',
'SA' => 'Arabia Saudita', 'SA' => 'Arabia Saudita',
'SD' => 'Sudan', 'SD' => 'Sudan',
'SN' => 'Senegal', 'SN' => 'Senegal',
'SG' => 'Singapore', 'SG' => 'Singapore',
'SB' => 'Isole Salomone', 'SB' => 'Isole Salomone',
'SL' => 'Sierra Leone', 'SL' => 'Sierra Leone',
'SV' => 'El Salvador', 'SV' => 'El Salvador',
'SM' => 'San Marino', 'SM' => 'San Marino',
'SO' => 'Somalia', 'SO' => 'Somalia',
'RS' => 'Serbia', 'RS' => 'Serbia',
'SS' => 'Sudan del Sud', 'SS' => 'Sudan del Sud',
'ST' => 'São Tomé and Príncipe', 'ST' => 'São Tomé and Príncipe',
'SR' => 'Suriname', 'SR' => 'Suriname',
'SK' => 'Slovacchia', 'SK' => 'Slovacchia',
'SI' => 'Slovenia', 'SI' => 'Slovenia',
'SE' => 'Svezia', 'SE' => 'Svezia',
'SZ' => 'Swaziland', 'SZ' => 'Swaziland',
'SC' => 'Seychelles', 'SC' => 'Seychelles',
'SY' => 'Siria', 'SY' => 'Siria',
'TD' => 'Chad', 'TD' => 'Chad',
'TG' => 'Togo', 'TG' => 'Togo',
'TH' => 'Thailand', 'TH' => 'Thailand',
'TJ' => 'Tagikistan', 'TJ' => 'Tagikistan',
'TM' => 'Turkmenistan', 'TM' => 'Turkmenistan',
'TL' => 'Timor Est', 'TL' => 'Timor Est',
'TO' => 'Tonga', 'TO' => 'Tonga',
'TT' => 'Trinidad e Tobago', 'TT' => 'Trinidad e Tobago',
'TN' => 'Tunisia', 'TN' => 'Tunisia',
'TR' => 'Turchia', 'TR' => 'Turchia',
'TV' => 'Tuvalu', 'TV' => 'Tuvalu',
'TZ' => 'Tanzania', 'TZ' => 'Tanzania',
'UG' => 'Uganda', 'UG' => 'Uganda',
'UA' => 'Ucraina', 'UA' => 'Ucraina',
'UY' => 'Uruguay', 'UY' => 'Uruguay',
'US' => 'Stati Uniti', 'US' => 'Stati Uniti',
'UZ' => 'Uzbekistan', 'UZ' => 'Uzbekistan',
'VA' => 'Città del Vaticano', 'VA' => 'Città del Vaticano',
'VC' => 'Saint Vincent e Grenadine', 'VC' => 'Saint Vincent e Grenadine',
'VE' => 'Venezuela', 'VE' => 'Venezuela',
'VN' => 'Vietnam', 'VN' => 'Vietnam',
'VU' => 'Vanuatu', 'VU' => 'Vanuatu',
'WS' => 'Samoa', 'WS' => 'Samoa',
'YE' => 'Yemen', 'YE' => 'Yemen',
'ZA' => 'Sudafrica', 'ZA' => 'Sudafrica',
'ZM' => 'Zambia', 'ZM' => 'Zambia',
'ZW' => 'Zimbabwe', 'ZW' => 'Zimbabwe',
]; ];

View file

@ -1,18 +1,18 @@
<?php <?php
return [ return [
'settings.inspire' => '"L\'arte di essere saggi è l\'arte di sapere cosa trascurare."', // Questa è la riga stampata nella homepage e nella console 'view-source' 'settings.inspire' => '"L\'arte di essere saggi è l\'arte di sapere cosa trascurare."', // Questa è la riga stampata nella homepage e nella console 'view-source'
'settings.locale' => 'it', 'settings.locale' => 'it',
'settings.direction' => 'ltr', 'settings.direction' => 'ltr',
// Servizio - Utenti // Servizio - Utenti
'auth.emails.team' => '%s Squadra', 'auth.emails.team' => '%s Squadra',
'auth.emails.confirm.title' => 'Conferma dell\'account', 'auth.emails.confirm.title' => 'Conferma dell\'account',
'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Reimpostazione della password', 'auth.emails.recovery.title' => 'Reimpostazione della password',
'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Invito a %s squadra %s', 'auth.emails.invitation.title' => 'Invito a %s squadra %s',
'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl',
'locale.country.unknown' => 'Sconosciuto', 'locale.country.unknown' => 'Sconosciuto',
'countries' => include 'it.countries.php', 'countries' => include 'it.countries.php',
'continents' => include 'it.continents.php', 'continents' => include 'it.continents.php',
]; ];

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Afrika',
'AN' => 'Antarktis',
'AS' => 'Asia',
'EU' => 'Europa',
'NA' => 'Nord-Amerika',
'OC' => 'Oseania',
'SA' => 'Sør-Amerika',
];

View file

@ -0,0 +1,198 @@
<?php
return [
'AF' => 'Afghanistan',
'AO' => 'Angola',
'AL' => 'Albania',
'AD' => 'Andorra',
'AE' => 'De forente arabiske emirater',
'AR' => 'Argentina',
'AM' => 'Armenia',
'AG' => 'Antigua og Barbuda',
'AU' => 'Australia',
'AT' => 'Østerrike',
'AZ' => 'Aserbajdsjan',
'BI' => 'Burundi',
'BE' => 'Belgia',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladesh',
'BG' => 'Bulgaria',
'BH' => 'Bahrain',
'BS' => 'Bahamas',
'BA' => 'Bosnia-Hercegovina',
'BY' => 'Hviterussland',
'BZ' => 'Belize',
'BO' => 'Bolivia',
'BR' => 'Brasil',
'BB' => 'Barbados',
'BN' => 'Brunei Darussalam',
'BT' => 'Bhutan',
'BW' => 'Botswana',
'CF' => 'Den sentralafrikanske republikk',
'CA' => 'Canada',
'CH' => 'Sveits',
'CL' => 'Chile',
'CN' => 'Kina',
'CI' => 'Elfenbenskysten',
'CM' => 'Kamerun',
'CD' => 'Den demokratiske republikken Kongo',
'CG' => 'Republikken Kongo',
'CO' => 'Colombia',
'KM' => 'Komorene',
'CV' => 'Kapp Verde',
'CR' => 'Costa Rica',
'CU' => 'Cuba',
'CY' => 'Kypros',
'CZ' => 'Tjekkia',
'DE' => 'Tyskland',
'DJ' => 'Djibouti',
'DM' => 'Dominica',
'DK' => 'Danmark',
'DO' => 'Den dominikanske republikk',
'DZ' => 'Algerie',
'EC' => 'Ecuador',
'EG' => 'Egypt',
'ER' => 'Eritrea',
'ES' => 'Spania',
'EE' => 'Estland',
'ET' => 'Etiopia',
'FI' => 'Finland',
'FJ' => 'Fiji',
'FR' => 'Frankrike',
'FM' => 'Mikronesia',
'GA' => 'Gabon',
'GB' => 'Storbritannia',
'GE' => 'Georgia',
'GH' => 'Ghana',
'GN' => 'Guinea',
'GM' => 'Gambia',
'GW' => 'Guinea-Bissau',
'GQ' => 'Ekvatorial-Guinea',
'GR' => 'Hellas',
'GD' => 'Grenada',
'GT' => 'Guatemala',
'GY' => 'Guyana',
'HN' => 'Honduras',
'HR' => 'Kroatia',
'HT' => 'Haiti',
'HU' => 'Ungarn',
'ID' => 'Indonesia',
'IN' => 'India',
'IE' => 'Irland',
'IR' => 'Iran',
'IQ' => 'Irak',
'IS' => 'Island',
'IL' => 'Israel',
'IT' => 'Italia',
'JM' => 'Jamaica',
'JO' => 'Jordan',
'JP' => 'Japan',
'KZ' => 'Kasakhstan',
'KE' => 'Kenya',
'KG' => 'Kirgisistan',
'KH' => 'Kambodsja',
'KI' => 'Kiribati',
'KN' => 'Saint Kitts og Nevis',
'KR' => 'Sør-Korea',
'KW' => 'Kuwait',
'LA' => 'Laos',
'LB' => 'Libanon',
'LR' => 'Liberia',
'LY' => 'Libya',
'LC' => 'Saint Lucia',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
'LS' => 'Lesotho',
'LT' => 'Litauen',
'LU' => 'Luxembourg',
'LV' => 'Latvia',
'MA' => 'Marokko',
'MC' => 'Monaco',
'MD' => 'Moldova',
'MG' => 'Madagaskar',
'MV' => 'Maldivene',
'MX' => 'Mexico',
'MH' => 'Marshalløyene',
'MK' => 'Nord-Makedonia',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Myanmar',
'ME' => 'Montenegro',
'MN' => 'Mongolia',
'MZ' => 'Mozambik',
'MR' => 'Mauritania',
'MU' => 'Mauritius',
'MW' => 'Malawi',
'MY' => 'Malaysia',
'NA' => 'Namibia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nicaragua',
'NL' => 'Nederland',
'NO' => 'Norge',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'New Zealand',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PE' => 'Peru',
'PH' => 'Filippinene',
'PW' => 'Palau',
'PG' => 'Papua Ny-Guinea',
'PL' => 'Polen',
'KP' => 'Nord-Korea',
'PT' => 'Portugal',
'PY' => 'Paraguay',
'QA' => 'Qatar',
'RO' => 'Romania',
'RU' => 'Russland',
'RW' => 'Rwanda',
'SA' => 'Saudi-Arabia',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapore',
'SB' => 'Solomonøyene',
'SL' => 'Sierra Leone',
'SV' => 'El Salvador',
'SM' => 'San Marino',
'SO' => 'Somalia',
'RS' => 'Serbia',
'SS' => 'Sør-Sudan',
'ST' => 'São Tomé og Príncipe',
'SR' => 'Surinam',
'SK' => 'Slovakia',
'SI' => 'Slovenia',
'SE' => 'Sverige',
'SZ' => 'Swaziland',
'SC' => 'Seychellene',
'SY' => 'Syria',
'TD' => 'Tsjad',
'TG' => 'Togo',
'TH' => 'Thailand',
'TJ' => 'Tajikistan',
'TM' => 'Turkmenistan',
'TL' => 'Øst-Timor',
'TO' => 'Tonga',
'TT' => 'Trinidad og Tobago',
'TN' => 'Tunisia',
'TR' => 'Tyrkia',
'TV' => 'Tuvalu',
'TZ' => 'Tanzania',
'UG' => 'Uganda',
'UA' => 'Ukraina',
'UY' => 'Uruguay',
'US' => 'Amerikas forente stater',
'UZ' => 'Usbekistan',
'VA' => 'Vatikanstaten',
'VC' => 'Saint Vincent og Grenadinene',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Jemen',
'ZA' => 'Sør-Africa',
'ZM' => 'Zambia',
'ZW' => 'Zimbabwe',
];

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hola {{name}},
<br />
<br />
Segueix aquest enllaç per verificar la teva direcció de correu:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Si no has solicitat verificar aquesta direcció, pots ignorar aquest missatge.
<br />
<br />
Gràcies,
<br />
Equip {{project}}
</div>

View file

@ -0,0 +1,28 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hola,
<br />
<br />
T'hem enviat aquest correu perquè <b>{{owner}}</b> et vol convidar a formar part
de l'equip <b>{{team}}</b> a {{project}}.
<br />
<br />
Segueix aquest enllaç per unir-te a l'equip <b>{{team}}</b>:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Si no estàs interessat, pots ignorar aquest missatge.
<br />
<br />
Gràcies,
<br />
Equip {{project}}
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hola {{name}},
<br />
<br />
Segueix aquest enllaç per restablir la teva contrasenya de {{project}}.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Si no has demanat restablir la teva contrasenya, pots ignorar aquest missatge.
<br />
<br />
Gràcies,
<br />
Equip {{project}}
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hallo {{name}},
<br />
<br />
bitte folge diesem Link um deine E-Mail Adresse zu verifizieren.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Bitte ignoriere diese Nachricht, wenn du das Verifizieren deiner E-Mail Adresse nicht beantragt hast.
<br />
<br />
Vielen dank,
<br />
{{project}} Team
</div>

View file

@ -0,0 +1,27 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hallo,
<br />
<br />
diese E-Mail wurde dir geschickt, weil <b>{{owner}}</b> dich eingeladen hat Teammitglied im Team <b>{{team}}</b> bei {{project}} zu werden.
<br />
<br />
Folge diesem Link um dem <b>{{team}}</b> Team beizutreten:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Wenn du daran nicht interessiert bist, kannst du diese Nachricht ignorieren.
<br />
<br />
Vielen dank,
<br />
{{project}} Team
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hallo {{name}},
<br />
<br />
Folge diesem Link um dein Passwort für {{project}} zurückzusetzen.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Bitte ignoriere diese Nachricht, wenn du das Zurücksetzen deines Passworts nicht beantragt hast.
<br />
<br />
Vielen dank,
<br />
{{project}} Team
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei {{name}},
<br />
<br />
Varmista sähköpostiosoite tästä linkistä.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jos et kysynyt tämän sähköpostiosoitteen varmistamista, voit sivuuttaa tämän viestin.
<br />
<br />
kiitos,
<br />
{{project}} tiimi
</div>

View file

@ -0,0 +1,27 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei,
<br />
<br />
Sait tämän sähköpostin koska <b>{{owner}}</b> halusi kutsua sinut jäseneksi <b>{{team}}</b> tiimiin, täällä {{project}}.
<br />
<br />
Käytä tätä linkkiä liittyäksesi <b>{{team}}</b> tiimiin:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jos et ole kiinnostunut, voit sivuuttaa tämän viestin.
<br />
<br />
kiitos,
<br />
{{project}} tiimi
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei {{name}},
<br />
<br />
Resetoi {{project}} salasana tästä linkistä.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jos et pyytänyt salasanan nollaamista, voit sivuuttaa tämän viestin-
<br />
<br />
Kiitos,
<br />
{{project}} tiimi
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Halo {{name}},
<br />
<br />
Ikuti link ini untuk memverifikasi alamat email Anda.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jika Anda tidak meminta untuk memverifikasi alamat ini, Anda dapat mengabaikan pesan ini.
<br />
<br />
Terima kasih,
<br />
Tim {{project}}
</div>

View file

@ -0,0 +1,27 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Halo,
<br />
<br />
Email ini dikirimkan kepada Anda karena <b>{{owner}}</b> ingin mengundang Anda untuk menjadi anggota tim <b>{{team}}</b> di {{project}}.
<br />
<br />
Ikuti link ini untuk bergabung dengan tim <b>{{team}}</b>:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jika Anda tidak tertarik, Anda dapat mengabaikan pesan ini.
<br />
<br />
Terima kasih,
<br />
Tim {{project}}
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Halo {{name}},
<br />
<br />
Ikuti link ini untuk mereset kata sandi {{project}} Anda.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Jika Anda tidak meminta untuk mereset kata sandi Anda, Anda dapat mengabaikan pesan ini.
<br />
<br />
Terima kasih,
<br />
Tim {{project}}
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei {{name}},
<br />
<br />
Følg denne lenken for å verifisere din e-postadresse.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Hvis du ikke har spurt om å verifisere din e-post, kan du ignorere denne meldingen.
<br />
<br />
Hilsen,
<br />
{{project}}-teamet
</div>

View file

@ -0,0 +1,28 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei,
<br />
<br />
Denne mailen ble sendt til deg fordi <b>{{owner}}</b> har invitert deg til å bli medlem av <b>{{team}}</b>-teamet på {{project}}.
<br />
<br />
Follow this link to join the <b>{{team}}</b> team:
Følg denne lenken for å bli med på <b>{{team}}</b>-teamet:
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Hvis du ikke er interresert kan du ignorere denne meldingen.
<br />
<br />
Hilsen,
<br />
{{project}}-teamet
</div>

View file

@ -0,0 +1,25 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Hei {{name}},
<br />
<br />
Follow this link to reset your {{project}} password.
Følg denne lenken for å tilbakestille ditt {{project}}-passord.
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Hvis du ikke har spurt om å tilbakestille passordet ditt, kan du ignorere denne meldingen.
<br />
<br />
Hilsen,
<br />
{{project}}-teamet
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Вітаємо {{name}},
<br />
<br />
Перейдіть за цим посиланням, та підтвердіть свою електронну адресу
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Якщо ви не запитували підтвердження цієї адреси, проігноруйте це повідомлення.
<br />
<br />
Дякуємо,
<br />
команда {{project}}
</div>

View file

@ -0,0 +1,27 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Вітаємо,
<br />
<br />
Цей лист був надісланий вам тому що <b>{{owner}}</b> хоче запросити вас стати членом команди <b>{{team}}</b> у {{project}}.
<br />
<br />
Перейдіть за цим посиланням щоб приєднатись до команди <b>{{team}}</b> :
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Якщо ви не зацікавлені, проігноруйте це повідомлення.
<br />
<br />
Дякуємо,
<br />
Команда {{project}}
</div>

View file

@ -0,0 +1,24 @@
<style>
* {
font-family: sans-serif,Arial;
-webkit-font-smoothing: antialiased;
font-weight: lighter;
}
</style>
<div style="direction: {{direction}}">
Вітаємо, {{name}},
<br />
<br />
Перейдіть за цим посиланням для того щоб скинути свій пароль для {{project}} .
<br />
<a href="{{redirect}}">{{redirect}}</a>
<br />
<br />
Якщо ви не запитували скидання паролю, проігноруйте це повідомлення.
<br />
<br />
Дякуємо,
<br />
команда {{project}}
</div>

View file

@ -0,0 +1,10 @@
<?php
return [
'AF' => 'Африка',
'AN' => 'Антарктика',
'AS' => 'Азія',
'EU' => 'Європа',
'NA' => 'Північна Америка',
'OC' => 'Океанія',
'SA' => 'Південна Америка',
];

View file

@ -0,0 +1,197 @@
<?php
return [
'AF' => 'Афганістан',
'AO' => 'Ангола',
'AL' => 'Албанія',
'AD' => 'Андора',
'AE' => 'Об\'єднані Арабські Емірати',
'AR' => 'Аргентина',
'AM' => 'Арменія',
'AG' => 'Антигуа і Барбуда',
'AU' => 'Австралія',
'AT' => 'Австрія',
'AZ' => 'Азербайджан',
'BI' => 'Бурунді',
'BE' => 'Бельгія',
'BJ' => 'Бенін',
'BF' => 'Буркіна Фасо',
'BD' => 'Бангладеш',
'BG' => 'Болгарія',
'BH' => 'Бахрейн',
'BS' => 'Багамські острови',
'BA' => 'Боснія і Герцеговина',
'BY' => 'Беларусь',
'BZ' => 'Бейліз',
'BO' => 'Болівія',
'BR' => 'Бразилія',
'BB' => 'Барбадос',
'BN' => 'Бруней',
'BT' => 'Бутан',
'BW' => 'Ботсвана',
'CF' => 'Центральноафриканська Республіка',
'CA' => 'Канада',
'CH' => 'Швейцарія',
'CL' => 'Чілі',
'CN' => 'Китай',
'CI' => 'Кот-д\'Ивуар',
'CM' => 'Камерун',
'CD' => 'ДР Конго',
'CG' => 'Республіка Конго',
'CO' => 'Колумбія',
'KM' => 'Комори',
'CV' => 'Кабо-Верде',
'CR' => 'Коста-Ріка',
'CU' => 'Куба',
'CY' => 'Кіпр',
'CZ' => 'Чехія',
'DE' => 'Німеччина',
'DJ' => 'Джибуті',
'DM' => 'Домініка',
'DK' => 'Данія',
'DO' => 'Домініканська Республіка',
'DZ' => 'Алжир',
'EC' => 'Эквадор',
'EG' => 'Єгипет',
'ER' => 'Ерітрея',
'ES' => 'Іспанія',
'EE' => 'Естонія',
'ET' => 'Ефіопія',
'FI' => 'Фінляндія',
'FJ' => 'Фіджи',
'FR' => 'Франція',
'FM' => 'Мікронезія',
'GA' => 'Габон',
'GB' => 'Велика Британія',
'GE' => 'Грузія',
'GH' => 'Гана',
'GN' => 'Гвінея',
'GM' => 'Гамбія',
'GW' => 'Гвінея-Бісау',
'GQ' => 'Экваторіальна Гвінея',
'GR' => 'Греція',
'GD' => 'Гренада',
'GT' => 'Гватемала',
'GY' => 'Гайана',
'HN' => 'Гондурас',
'HR' => 'Хорватія',
'HT' => 'Гаїті',
'HU' => 'Угорщина',
'ID' => 'Індонезія',
'IN' => 'Індія',
'IE' => 'Ірландія',
'IR' => 'Іран',
'IQ' => 'Ірак',
'IS' => 'Ісландія',
'IL' => 'Ізраїль',
'IT' => 'Італія',
'JM' => 'Ямайка',
'JO' => 'Іорданія',
'JP' => 'Японія',
'KZ' => 'Казахстан',
'KE' => 'Кенія',
'KG' => 'Кіргізія',
'KH' => 'Камбоджа',
'KI' => 'Кірібаті',
'KN' => 'Сент-Кітс і Невіс',
'KR' => 'Південна Корея',
'KW' => 'Кувейт',
'LA' => 'Лаос',
'LB' => 'Ліван',
'LR' => 'Ліберія',
'LY' => 'Лівія',
'LC' => 'Сент-Люсія',
'LI' => 'Ліхтенштейн',
'LK' => 'Шрі Ланка',
'LS' => 'Лесото',
'LT' => 'Литва',
'LU' => 'Люксембург',
'LV' => 'Латвія',
'MA' => 'Марокко',
'MC' => 'Монако',
'MD' => 'Молдова',
'MG' => 'Мадагаскар',
'MV' => 'Мальдіви',
'MX' => 'Мексика',
'MH' => 'Маршаллові острови',
'MK' => 'Македонія',
'ML' => 'Малі',
'MT' => 'Мальта',
'MM' => 'М\'янма',
'ME' => 'Чорногорія',
'MN' => 'Монголія',
'MZ' => 'Мозамбік',
'MR' => 'Мавританія',
'MU' => 'Маврікій',
'MW' => 'Малаві',
'MY' => 'Малайзія',
'NA' => 'Намібія',
'NE' => 'Нігер',
'NG' => 'Нігерія',
'NI' => 'Нікарагуа',
'NL' => 'Нідерланди',
'NO' => 'Норвегія',
'NP' => 'Непал',
'NR' => 'Науру',
'NZ' => 'Нова Зеландія',
'OM' => 'Оман',
'PK' => 'Пакістан',
'PA' => 'Панама',
'PE' => 'Перу',
'PH' => 'Філіппіни',
'PW' => 'Палау',
'PG' => 'Папуа Нова Гвінея',
'PL' => 'Польша',
'KP' => 'Північна Корея',
'PT' => 'Португалія',
'PY' => 'Парагвай',
'QA' => 'Катар',
'RO' => 'Румунія',
'RU' => 'Росія',
'RW' => 'Руанда',
'SA' => 'Саудовська Аравія',
'SD' => 'Судан',
'SN' => 'Сенегал',
'SG' => 'Сінгапур',
'SB' => 'Соломонові Острови',
'SL' => 'Сьєрра-Леоне',
'SV' => 'Ель Сальвадор',
'SM' => 'Сан Маріно',
'SO' => 'Сомалі',
'RS' => 'Сербія',
'SS' => 'Південний Судан',
'ST' => 'Сан-Томе і Принсіпі',
'SR' => 'Суринам',
'SK' => 'Словакія',
'SI' => 'Словенія',
'SE' => 'Швеція',
'SZ' => 'Свазіленд',
'SC' => 'Сейшели',
'SY' => 'Сирія',
'TD' => 'Чад',
'TG' => 'Того',
'TH' => 'Таіланд',
'TJ' => 'Таджикістан',
'TM' => 'Туркменістан',
'TL' => 'Східний Тимор',
'TO' => 'Тонга',
'TT' => 'Тринідад і Тобаго',
'TN' => 'Туніс',
'TR' => 'Туреччина',
'TV' => 'Тувалу',
'TZ' => 'Танзанія',
'UG' => 'Уганда',
'UA' => 'Україна',
'UY' => 'Уругвай',
'US' => 'Сполучені Штати',
'UZ' => 'Узбекистан',
'VA' => 'Ватикан',
'VC' => 'Сент-Вінсент і Гренадин',
'VE' => 'Венесуела',
'VN' => 'В\'єтнам',
'VU' => 'Вануату',
'WS' => 'Самоа',
'YE' => 'Ємен',
'ZA' => 'Південна Африка',
'ZM' => 'Замбія',
'ZW' => 'Зімбабве',
];

20
app/config/locale/ua.php Normal file
View file

@ -0,0 +1,20 @@
<?php
return [
'settings.inspire' => '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'ua',
'settings.direction' => 'ltr',
'auth.emails.team' => '%s Команда',
'auth.emails.confirm.title' => 'Підтвердження Акаунту' ,
'auth.emails.confirm.body' => 'ua.email.auth.confirm.tpl',
'auth.emails.recovery.title' => 'Скидання пароля',
'auth.emails.recovery.body' => 'ua.email.auth.recovery.tpl',
'auth.emails.invitation.title' => 'Запрошення до %s Команди у %s',
'auth.emails.invitation.body' => 'ua.email.auth.invitation.tpl',
'locale.country.unknown' => 'Невідомо',
'countries' => include 'ua.countries.php',
'continents' => include 'ua.continents.php',
];

View file

@ -1,4 +1,5 @@
<?php <?php
const VERSION = '0.1.15'; const VERSION = '0.1.15';
return VERSION; return VERSION;

View file

@ -49,9 +49,9 @@ $utopia->post('/v1/auth/register')
->action( ->action(
function ($email, $password, $confirm, $success, $failure, $name) use ($request, $response, $register, $audit, $projectDB, $project, $webhook) { function ($email, $password, $confirm, $success, $failure, $name) use ($request, $response, $register, $audit, $projectDB, $project, $webhook) {
if ('console' === $project->getUid()) { if ('console' === $project->getUid()) {
$whitlistEmails = $project->getAttribute('authWhitelistEmails'); $whitlistEmails = $project->getAttribute('authWhitelistEmails');
$whitlistIPs = $project->getAttribute('authWhitelistIPs'); $whitlistIPs = $project->getAttribute('authWhitelistIPs');
$whitlistDomains = $project->getAttribute('authWhitelistDomains'); $whitlistDomains = $project->getAttribute('authWhitelistDomains');
if (!empty($whitlistEmails) && !in_array($email, $whitlistEmails)) { if (!empty($whitlistEmails) && !in_array($email, $whitlistEmails)) {
throw new Exception('Console registration is restricted to specific emails. Contact your administrator for more information.', 401); throw new Exception('Console registration is restricted to specific emails. Contact your administrator for more information.', 401);
@ -61,11 +61,11 @@ $utopia->post('/v1/auth/register')
throw new Exception('Console registration is restricted to specific IPs. Contact your administrator for more information.', 401); throw new Exception('Console registration is restricted to specific IPs. Contact your administrator for more information.', 401);
} }
if (!empty($whitlistDomains) && !in_array(substr(strrchr($email, "@"), 1), $whitlistDomains)) { if (!empty($whitlistDomains) && !in_array(substr(strrchr($email, '@'), 1), $whitlistDomains)) {
throw new Exception('Console registration is restricted to specific domains. Contact your administrator for more information.', 401); throw new Exception('Console registration is restricted to specific domains. Contact your administrator for more information.', 401);
} }
} }
$profile = $projectDB->getCollection([ // Get user by email address $profile = $projectDB->getCollection([ // Get user by email address
'limit' => 1, 'limit' => 1,
'first' => true, 'first' => true,
@ -77,7 +77,7 @@ $utopia->post('/v1/auth/register')
if (!empty($profile)) { if (!empty($profile)) {
if ($failure) { if ($failure) {
$response->redirect($failure . '?message=User already registered'); $response->redirect($failure.'?message=User already registered');
return; return;
} }
@ -778,7 +778,7 @@ $utopia->get('/v1/auth/oauth/:provider/redirect')
} }
$oauthID = $oauth->getUserID($accessToken); $oauthID = $oauth->getUserID($accessToken);
if (empty($oauthID)) { if (empty($oauthID)) {
if (!empty($state['failure'])) { if (!empty($state['failure'])) {
$response->redirect($state['failure'], 301, 0); $response->redirect($state['failure'], 301, 0);
@ -788,7 +788,7 @@ $utopia->get('/v1/auth/oauth/:provider/redirect')
} }
$current = Auth::tokenVerify($user->getAttribute('tokens', []), Auth::TOKEN_TYPE_LOGIN, Auth::$secret); $current = Auth::tokenVerify($user->getAttribute('tokens', []), Auth::TOKEN_TYPE_LOGIN, Auth::$secret);
if ($current) { if ($current) {
$projectDB->deleteDocument($current); //throw new Exception('User already logged in', 401); $projectDB->deleteDocument($current); //throw new Exception('User already logged in', 401);
} }
@ -802,7 +802,6 @@ $utopia->get('/v1/auth/oauth/:provider/redirect')
], ],
]) : $user; ]) : $user;
if (empty($user)) { // No user logged in or with oauth provider ID, create new one or connect with account with same email if (empty($user)) { // No user logged in or with oauth provider ID, create new one or connect with account with same email
$name = $oauth->getUserName($accessToken); $name = $oauth->getUserName($accessToken);
$email = $oauth->getUserEmail($accessToken); $email = $oauth->getUserEmail($accessToken);

View file

@ -5,7 +5,6 @@ include_once 'shared/web.php';
global $utopia, $response, $request, $layout, $version, $providers; global $utopia, $response, $request, $layout, $version, $providers;
use Utopia\View; use Utopia\View;
use Utopia\Locale\Locale;
use Database\Database; use Database\Database;
use Database\Validator\UID; use Database\Validator\UID;
@ -83,7 +82,7 @@ $utopia->get('/console/account')
; ;
$layout $layout
->setParam('title', 'Account - ' . APP_NAME) ->setParam('title', 'Account - '.APP_NAME)
->setParam('body', $page); ->setParam('body', $page);
}); });

View file

@ -119,17 +119,17 @@ $utopia->post('/v1/database')
->action( ->action(
function ($name, $read, $write, $rules) use ($response, $projectDB, $webhook, $audit) { function ($name, $read, $write, $rules) use ($response, $projectDB, $webhook, $audit) {
$parsedRules = []; $parsedRules = [];
foreach ($rules as &$rule) { foreach ($rules as &$rule) {
$parsedRules[] = array_merge([ $parsedRules[] = array_merge([
'$collection' => Database::SYSTEM_COLLECTION_RULES, '$collection' => Database::SYSTEM_COLLECTION_RULES,
'$permissions' => [ '$permissions' => [
'read' => $read, 'read' => $read,
'write' => $write, 'write' => $write,
] ],
], $rule); ], $rule);
} }
try { try {
$data = $projectDB->createDocument([ $data = $projectDB->createDocument([
'$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS,
@ -201,16 +201,16 @@ $utopia->put('/v1/database/:collectionId')
if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) {
throw new Exception('Collection not found', 404); throw new Exception('Collection not found', 404);
} }
$parsedRules = []; $parsedRules = [];
foreach ($rules as &$rule) { foreach ($rules as &$rule) {
$parsedRules[] = array_merge([ $parsedRules[] = array_merge([
'$collection' => Database::SYSTEM_COLLECTION_RULES, '$collection' => Database::SYSTEM_COLLECTION_RULES,
'$permissions' => [ '$permissions' => [
'read' => $read, 'read' => $read,
'write' => $write, 'write' => $write,
] ],
], $rule); ], $rule);
} }

View file

@ -115,11 +115,11 @@ $utopia->get('/v1/health/storage/local')
function () use ($response) { function () use ($response) {
$device = new Local(); $device = new Local();
if (!is_readable($device->getRoot(). '/..')) { if (!is_readable($device->getRoot().'/..')) {
throw new Exception('Device is not readable'); throw new Exception('Device is not readable');
} }
if (!is_writable($device->getRoot(). '/..')) { if (!is_writable($device->getRoot().'/..')) {
throw new Exception('Device is not writable'); throw new Exception('Device is not writable');
} }

View file

@ -5,7 +5,6 @@ include_once 'shared/web.php';
global $utopia, $response, $request, $layout, $version, $providers, $sdks; global $utopia, $response, $request, $layout, $version, $providers, $sdks;
use Utopia\View; use Utopia\View;
use Utopia\Locale\Locale;
$layout $layout
->setParam('title', APP_NAME) ->setParam('title', APP_NAME)

View file

@ -1,4 +1,5 @@
<?php <?php
/* /*
* Created by PhpStorm. * Created by PhpStorm.
* User: eldadfux * User: eldadfux

View file

@ -1,8 +1,8 @@
<?php <?php
// Init // Init
if (file_exists(__DIR__ . '/../vendor/autoload.php')) { if (file_exists(__DIR__.'/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__.'/../vendor/autoload.php';
} }
use Utopia\App; use Utopia\App;
@ -18,48 +18,48 @@ use Utopia\Locale\Locale;
use Utopia\Registry\Registry; use Utopia\Registry\Registry;
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\PHPMailer;
const APP_NAME = 'Appwrite'; const APP_NAME = 'Appwrite';
const APP_DOMAIN = 'appwrite.io'; const APP_DOMAIN = 'appwrite.io';
const APP_EMAIL_TEAM = 'team@' . APP_DOMAIN; const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN;
const APP_EMAIL_SECURITY = 'security@' . APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN;
const APP_USERAGENT = APP_NAME . '-Server/%s Please report abuse at ' . APP_EMAIL_SECURITY; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY;
const APP_MODE_ADMIN = 'admin'; const APP_MODE_ADMIN = 'admin';
const APP_LOCALES = ['en', 'he', 'pt-br', 'es', 'ro']; const APP_LOCALES = ['en', 'he', 'pt-br', 'es'];
const APP_PAGING_LIMIT = 15; const APP_PAGING_LIMIT = 15;
$register = new Registry(); $register = new Registry();
$request = new Request(); $request = new Request();
$response = new Response(); $response = new Response();
/** /*
* ENV vars * ENV vars
*/ */
$env = $request->getServer('_APP_ENV', App::ENV_TYPE_PRODUCTION); $env = $request->getServer('_APP_ENV', App::ENV_TYPE_PRODUCTION);
$domain = $request->getServer('HTTP_HOST', ''); $domain = $request->getServer('HTTP_HOST', '');
$version = include __DIR__ . '/../app/config/version.php'; $version = include __DIR__.'/../app/config/version.php';
$providers = include __DIR__ . '/../app/config/providers.php'; // OAuth providers list $providers = include __DIR__.'/../app/config/providers.php'; // OAuth providers list
$collections = include __DIR__ . '/../app/config/collections.php'; // OAuth providers list $collections = include __DIR__.'/../app/config/collections.php'; // OAuth providers list
$redisHost = $request->getServer('_APP_REDIS_HOST', ''); $redisHost = $request->getServer('_APP_REDIS_HOST', '');
$redisPort = $request->getServer('_APP_REDIS_PORT', ''); $redisPort = $request->getServer('_APP_REDIS_PORT', '');
$utopia = new App('Asia/Tel_Aviv', $env); $utopia = new App('Asia/Tel_Aviv', $env);
$port = (string)(isset($_SERVER['HTTP_HOST'])) ? parse_url($_SERVER['HTTP_HOST'], PHP_URL_PORT) : ''; $port = (string) (isset($_SERVER['HTTP_HOST'])) ? parse_url($_SERVER['HTTP_HOST'], PHP_URL_PORT) : '';
Resque::setBackend($redisHost . ':' . $redisPort); Resque::setBackend($redisHost.':'.$redisPort);
define('COOKIE_DOMAIN', ($request->getServer('HTTP_HOST', null) === 'localhost' || $request->getServer('HTTP_HOST', null) === 'localhost:' . $port) ? false : '.' . $request->getServer('HTTP_HOST', false)); define('COOKIE_DOMAIN', ($request->getServer('HTTP_HOST', null) === 'localhost' || $request->getServer('HTTP_HOST', null) === 'localhost:'.$port) ? false : '.'.$request->getServer('HTTP_HOST', false));
/** /*
* Registry * Registry
*/ */
$register->set('db', function () use ($request) { // Register DB connection $register->set('db', function () use ($request) { // Register DB connection
$dbHost = $request->getServer('_APP_DB_HOST', ''); $dbHost = $request->getServer('_APP_DB_HOST', '');
$dbUser = $request->getServer('_APP_DB_USER', ''); $dbUser = $request->getServer('_APP_DB_USER', '');
$dbPass = $request->getServer('_APP_DB_PASS', ''); $dbPass = $request->getServer('_APP_DB_PASS', '');
$dbScheme = $request->getServer('_APP_DB_SCHEMA', ''); $dbScheme = $request->getServer('_APP_DB_SCHEMA', '');
$pdo = new PDO("mysql:host={$dbHost};dbname={$dbScheme};charset=utf8mb4", $dbUser, $dbPass, array( $pdo = new PDO("mysql:host={$dbHost};dbname={$dbScheme};charset=utf8mb4", $dbUser, $dbPass, array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4', PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
PDO::ATTR_TIMEOUT => 5 // Seconds PDO::ATTR_TIMEOUT => 5, // Seconds
)); ));
// Connection settings // Connection settings
@ -73,7 +73,7 @@ $register->set('influxdb', function () use ($request) { // Register DB connectio
$port = $request->getServer('_APP_INFLUXDB_PORT', ''); $port = $request->getServer('_APP_INFLUXDB_PORT', '');
if (empty($host) || empty($port)) { if (empty($host) || empty($port)) {
return null; return;
} }
$client = new InfluxDB\Client($host, $port, '', '', false, false, 5); $client = new InfluxDB\Client($host, $port, '', '', false, false, 5);
@ -93,6 +93,7 @@ $register->set('cache', function () use ($redisHost, $redisPort) { // Register c
$redis = new Redis(); $redis = new Redis();
$redis->connect($redisHost, $redisPort); $redis->connect($redisHost, $redisPort);
return $redis; return $redis;
}); });
$register->set('smtp', function () use ($request) { $register->set('smtp', function () use ($request) {
@ -103,23 +104,23 @@ $register->set('smtp', function () use ($request) {
$username = $request->getServer('_APP_SMTP_USERNAME', ''); $username = $request->getServer('_APP_SMTP_USERNAME', '');
$password = $request->getServer('_APP_SMTP_PASSWORD', ''); $password = $request->getServer('_APP_SMTP_PASSWORD', '');
$mail->XMailer = 'Appwrite Mailer'; $mail->XMailer = 'Appwrite Mailer';
$mail->Host = $request->getServer('_APP_SMTP_HOST', 'smtp'); $mail->Host = $request->getServer('_APP_SMTP_HOST', 'smtp');
$mail->Port = $request->getServer('_APP_SMTP_PORT', 25); $mail->Port = $request->getServer('_APP_SMTP_PORT', 25);
$mail->SMTPAuth = (!empty($username) && !empty($password)); $mail->SMTPAuth = (!empty($username) && !empty($password));
$mail->Username = $username; $mail->Username = $username;
$mail->Password = $password; $mail->Password = $password;
$mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', ''); $mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', '');
$mail->setFrom('team@appwrite.io', APP_NAME . ' Team'); $mail->setFrom('team@appwrite.io', APP_NAME.' Team');
$mail->addReplyTo('team@appwrite.io', APP_NAME . ' Team'); $mail->addReplyTo('team@appwrite.io', APP_NAME.' Team');
$mail->isHTML(true); $mail->isHTML(true);
return $mail; return $mail;
}); });
/** /*
* Localization * Localization
*/ */
$locale = $request->getParam('locale', $request->getHeader('X-Appwrite-Locale', null)); $locale = $request->getParam('locale', $request->getHeader('X-Appwrite-Locale', null));
@ -128,6 +129,7 @@ Locale::$exceptions = false;
Locale::setLanguage('en', include __DIR__ . '/config/locale/en.php'); Locale::setLanguage('en', include __DIR__ . '/config/locale/en.php');
Locale::setLanguage('he', include __DIR__ . '/config/locale/he.php'); Locale::setLanguage('he', include __DIR__ . '/config/locale/he.php');
Locale::setLanguage('ua', include __DIR__ . '/config/locale/ua.php');
Locale::setLanguage('pt-br', include __DIR__ . '/config/locale/pt-br.php'); Locale::setLanguage('pt-br', include __DIR__ . '/config/locale/pt-br.php');
Locale::setLanguage('es', include __DIR__ . '/config/locale/es.php'); Locale::setLanguage('es', include __DIR__ . '/config/locale/es.php');
Locale::setLanguage('ro', include __DIR__ . '/config/locale/ro.php'); Locale::setLanguage('ro', include __DIR__ . '/config/locale/ro.php');
@ -140,11 +142,11 @@ stream_context_set_default([ // Set global user agent and http settings
'http' => [ 'http' => [
'method' => 'GET', 'method' => 'GET',
'user_agent' => sprintf(APP_USERAGENT, $version), 'user_agent' => sprintf(APP_USERAGENT, $version),
'timeout' => 2 'timeout' => 2,
] ],
]); ]);
/** /*
* Auth & Project Scope * Auth & Project Scope
*/ */
$consoleDB = new Database(); $consoleDB = new Database();
@ -166,19 +168,19 @@ if (is_null($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $pro
$mode = $request->getParam('mode', $request->getHeader('X-Appwrite-Mode', 'default')); $mode = $request->getParam('mode', $request->getHeader('X-Appwrite-Mode', 'default'));
Auth::setCookieName('a-session-' . $project->getUid()); Auth::setCookieName('a-session-'.$project->getUid());
if (APP_MODE_ADMIN === $mode) { if (APP_MODE_ADMIN === $mode) {
Auth::setCookieName('a-session-' . $console->getUid()); Auth::setCookieName('a-session-'.$console->getUid());
} }
$session = Auth::decodeSession($request->getCookie(Auth::$cookieName, $request->getHeader('X-Appwrite-Key', ''))); $session = Auth::decodeSession($request->getCookie(Auth::$cookieName, $request->getHeader('X-Appwrite-Key', '')));
Auth::$unique = $session['id']; Auth::$unique = $session['id'];
Auth::$secret = $session['secret']; Auth::$secret = $session['secret'];
$projectDB = new Database(); $projectDB = new Database();
$projectDB->setAdapter(new RedisAdapter(new MySQLAdapter($register), $register)); $projectDB->setAdapter(new RedisAdapter(new MySQLAdapter($register), $register));
$projectDB->setNamespace('app_' . $project->getUid()); $projectDB->setNamespace('app_'.$project->getUid());
$projectDB->setMocks($collections); $projectDB->setMocks($collections);
$user = $projectDB->getDocument(Auth::$unique); $user = $projectDB->getDocument(Auth::$unique);
@ -187,7 +189,7 @@ if (APP_MODE_ADMIN === $mode) {
$user = $consoleDB->getDocument(Auth::$unique); $user = $consoleDB->getDocument(Auth::$unique);
$user $user
->setAttribute('$uid', 'admin-' . $user->getAttribute('$uid')) ->setAttribute('$uid', 'admin-'.$user->getAttribute('$uid'))
; ;
} }

View file

@ -97,9 +97,9 @@ $cli
]; ];
foreach ($clients as $name => $client) { foreach ($clients as $name => $client) {
Console::info('Fetching API Spec for ' . $name . ' (' . $client['platform'] . ')'); Console::info('Fetching API Spec for '.$name.' ('.$client['platform'].')');
$spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1&platform=' . $client['platform']); $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1&platform='.$client['platform']);
$spec = getSSLPage('https://appwrite.test/v1/open-api-2.json?extensions=1&platform=' . $client['platform']); $spec = getSSLPage('https://appwrite.test/v1/open-api-2.json?extensions=1&platform='.$client['platform']);
switch ($name) { switch ($name) {
case 'php': case 'php':

View file

@ -86,11 +86,11 @@ $collection = $this->getParam('collection', []);
<table class="vertical"> <table class="vertical">
<thead> <thead>
<tr> <tr>
<?php foreach($collection['rules'] as $rule): ?> <?php foreach ($collection['rules'] as $rule): ?>
<th width="220"> <th width="220">
<?php echo $rule['label']; ?> <?php echo $rule['label']; ?>
<?php if(!empty($rule['description'])): ?> <?php if (!empty($rule['description'])): ?>
<span class="tooltip large" data-tooltip="<?php echo $rule['description']; ?>"><i class="icon-question"></i></span> <span class="tooltip large" data-tooltip="<?php echo $rule['description']; ?>"><i class="icon-question"></i></span>
<?php endif; ?> <?php endif; ?>
</th> </th>
@ -101,9 +101,9 @@ $collection = $this->getParam('collection', []);
</thead> </thead>
<tbody data-ls-loop="project-documents.documents" data-ls-as="document"> <tbody data-ls-loop="project-documents.documents" data-ls-as="document">
<tr> <tr>
<?php foreach($collection['rules'] as $rule): ?> <?php foreach ($collection['rules'] as $rule): ?>
<td> <td>
<?php switch($rule['type']): <?php switch ($rule['type']):
case 'numeric':?> case 'numeric':?>
<span class="tag" data-ls-bind="{{document.<?php echo $rule['key']; ?>|emptyDash}}" data-ls-attrs="title={{document.<?php echo $rule['key']; ?>}}"></span> <span class="tag" data-ls-bind="{{document.<?php echo $rule['key']; ?>|emptyDash}}" data-ls-attrs="title={{document.<?php echo $rule['key']; ?>}}"></span>
<?php break;?> <?php break;?>

View file

@ -315,7 +315,7 @@ $providers = $this->getParam('providers', []);
data-param-project-id="{{router.params.project}}" data-param-project-id="{{router.params.project}}"
data-scope="console"> data-scope="console">
<ul class="list"> <ul class="list">
<?php foreach ($providers as $provider => $data): if(isset($data['enabled']) && !$data['enabled']) { continue; } ?> <?php foreach ($providers as $provider => $data): if (isset($data['enabled']) && !$data['enabled']) { continue; } ?>
<li class="clear <?php echo (isset($data['enabled']) && !$data['enabled']) ? 'dev-feature' : ''; ?>"> <li class="clear <?php echo (isset($data['enabled']) && !$data['enabled']) ? 'dev-feature' : ''; ?>">
<div data-ui-modal class="modal close" data-button-text="Settings" data-button-class="pull-end"> <div data-ui-modal class="modal close" data-button-text="Settings" data-button-class="pull-end">
<button type="button" class="close pull-end" data-ui-modal-close=""><i class="icon-cancel"></i></button> <button type="button" class="close pull-end" data-ui-modal-close=""><i class="icon-cancel"></i></button>

View file

@ -13,7 +13,7 @@ $projectURL = $this->getParam('projectURL', '');
<small>Error ID: <?php echo $errorID; ?></small> <small>Error ID: <?php echo $errorID; ?></small>
<?php if(!empty($projectURL)): ?> <?php if (!empty($projectURL)): ?>
<hr class="margin-top margin-bottom" /> <hr class="margin-top margin-bottom" />
<p><a href="<?php echo $this->escape($projectURL); ?>" rel="noopener">Back to <?php echo $projectName; ?></a></p> <p><a href="<?php echo $this->escape($projectURL); ?>" rel="noopener">Back to <?php echo $projectName; ?></a></p>

View file

@ -27,7 +27,7 @@ $canonical = $this->getParam('canonical', '');
<link href="https://fonts.googleapis.com/css?family=Poppins:100,300,400,500,600" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Poppins:100,300,400,500,600" rel="stylesheet">
<link rel="apple-touch-icon" href="/images/apple.png"> <link rel="apple-touch-icon" href="/images/apple.png">
<link rel="preconnect" href="<?php echo $api; ?>" /> <link rel="preconnect" href="<?php echo $api; ?>" />
<?php if(!empty($canonical)): ?> <?php if (!empty($canonical)): ?>
<link rel="canonical" href="<?php echo $canonical; ?>" /> <link rel="canonical" href="<?php echo $canonical; ?>" />
<?php endif; ?> <?php endif; ?>
<?php foreach ($this->getParam('prefetch', []) as $prefetch): ?> <?php foreach ($this->getParam('prefetch', []) as $prefetch): ?>
@ -63,7 +63,7 @@ $canonical = $this->getParam('canonical', '');
PAGING_LIMIT: <?PHP echo APP_PAGING_LIMIT; ?> PAGING_LIMIT: <?PHP echo APP_PAGING_LIMIT; ?>
}; };
<?php if($litespeed): ?> <?php if ($litespeed): ?>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var head = document.getElementsByTagName('head')[0]; var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script'); var script = document.createElement('script');

View file

@ -9,7 +9,7 @@
$list = []; $list = [];
foreach ($clients as $client) { foreach ($clients as $client) {
if(empty($client)) { if (empty($client)) {
continue; continue;
} }

View file

@ -15,7 +15,7 @@ fi
echo "Setting Version #" echo "Setting Version #"
echo -e "<?php\nconst VERSION = '$1';\n\nreturn VERSION;" > app/config/version.php echo -e "<?php\n\nconst VERSION = '$1';\n\nreturn VERSION;" > app/config/version.php
echo 'Updating PHP dependencies and auto-loading...' echo 'Updating PHP dependencies and auto-loading...'

View file

@ -99,7 +99,7 @@ abstract class OAuth
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
} }
$headers[] = "Content-length: ".strlen($payload); $headers[] = 'Content-length: '.strlen($payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// Send the request & save response to $response // Send the request & save response to $response

View file

@ -24,11 +24,11 @@ class Gitlab extends OAuth
*/ */
public function getLoginURL(): string public function getLoginURL(): string
{ {
return 'https://gitlab.com/oauth/authorize?' . return 'https://gitlab.com/oauth/authorize?'.
'client_id=' . urlencode($this->appID) . 'client_id='.urlencode($this->appID).
'&redirect_uri=' . urlencode($this->callback) . '&redirect_uri='.urlencode($this->callback).
'&scope=read_user' . '&scope=read_user'.
'&state=' . urlencode(json_encode($this->state)) . '&state='.urlencode(json_encode($this->state)).
'&response_type=code'; '&response_type=code';
} }
@ -42,10 +42,10 @@ class Gitlab extends OAuth
$accessToken = $this->request( $accessToken = $this->request(
'POST', 'POST',
'https://gitlab.com/oauth/token?'. 'https://gitlab.com/oauth/token?'.
'code=' . urlencode($code) . 'code='.urlencode($code).
'&client_id=' . urlencode($this->appID) . '&client_id='.urlencode($this->appID).
'&client_secret=' . urlencode($this->appSecret) . '&client_secret='.urlencode($this->appSecret).
'&redirect_uri=' . urlencode($this->callback) . '&redirect_uri='.urlencode($this->callback).
'&grant_type=authorization_code' '&grant_type=authorization_code'
); );
@ -55,7 +55,6 @@ class Gitlab extends OAuth
return $accessToken['access_token']; return $accessToken['access_token'];
} }
return ''; return '';
} }
@ -115,9 +114,10 @@ class Gitlab extends OAuth
protected function getUser(string $accessToken): array protected function getUser(string $accessToken): array
{ {
if (empty($this->user)) { if (empty($this->user)) {
$user = $this->request('GET', 'https://gitlab.com/api/v4/user?access_token=' . urlencode($accessToken)); $user = $this->request('GET', 'https://gitlab.com/api/v4/user?access_token='.urlencode($accessToken));
$this->user = json_decode($user, true); $this->user = json_decode($user, true);
} }
return $this->user; return $this->user;
} }
} }

View file

@ -28,11 +28,11 @@ class Google extends OAuth
*/ */
public function getLoginURL(): string public function getLoginURL(): string
{ {
return 'https://accounts.google.com/o/oauth2/v2/auth?' . return 'https://accounts.google.com/o/oauth2/v2/auth?'.
'client_id=' . urlencode($this->appID) . 'client_id='.urlencode($this->appID).
'&redirect_uri=' . urlencode($this->callback) . '&redirect_uri='.urlencode($this->callback).
'&scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile' . '&scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile'.
'&state=' . urlencode(json_encode($this->state)) . '&state='.urlencode(json_encode($this->state)).
'&response_type=code'; '&response_type=code';
} }
@ -45,12 +45,12 @@ class Google extends OAuth
{ {
$accessToken = $this->request( $accessToken = $this->request(
'POST', 'POST',
'https://www.googleapis.com/oauth2/' . $this->version . '/token?' . 'https://www.googleapis.com/oauth2/'.$this->version.'/token?'.
'code=' . urlencode($code) . 'code='.urlencode($code).
'&client_id=' . urlencode($this->appID) . '&client_id='.urlencode($this->appID).
'&client_secret=' . urlencode($this->appSecret) . '&client_secret='.urlencode($this->appSecret).
'&redirect_uri=' . urlencode($this->callback) . '&redirect_uri='.urlencode($this->callback).
'&scope=' . '&scope='.
'&grant_type=authorization_code' '&grant_type=authorization_code'
); );
@ -119,9 +119,10 @@ class Google extends OAuth
protected function getUser(string $accessToken): array protected function getUser(string $accessToken): array
{ {
if (empty($this->user)) { if (empty($this->user)) {
$user = $this->request('GET', 'https://www.googleapis.com/oauth2/v2/userinfo?access_token=' . urlencode($accessToken)); $user = $this->request('GET', 'https://www.googleapis.com/oauth2/v2/userinfo?access_token='.urlencode($accessToken));
$this->user = json_decode($user, true); $this->user = json_decode($user, true);
} }
return $this->user; return $this->user;
} }
} }

View file

@ -40,7 +40,7 @@ class Collection extends Structure
$document = new Document( $document = new Document(
array_merge($this->merge, ($document instanceof Document) ? $document->getArrayCopy() : $document) array_merge($this->merge, ($document instanceof Document) ? $document->getArrayCopy() : $document)
); );
if (is_null($document->getCollection())) { if (is_null($document->getCollection())) {
$this->message = 'Missing collection attribute $collection'; $this->message = 'Missing collection attribute $collection';

View file

@ -186,18 +186,19 @@ class Structure extends Validator
} }
if (empty($validator)) { // Error creating validator for property if (empty($validator)) { // Error creating validator for property
$this->message = 'Unknown rule type "' . $ruleType . '" for property "' . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . '"'; $this->message = 'Unknown rule type "'.$ruleType.'" for property "'.htmlspecialchars($key, ENT_QUOTES, 'UTF-8').'"';
if (empty($ruleType)) { if (empty($ruleType)) {
$this->message = 'Unknown property "'.$key.'" type'. $this->message = 'Unknown property "'.$key.'" type'.
'. Make sure to follow '.strtolower($collection->getAttribute('name', 'unknown')).' collection structure'; '. Make sure to follow '.strtolower($collection->getAttribute('name', 'unknown')).' collection structure';
} }
return false; return false;
} }
if ($ruleRequired && ('' === $value || null === $value)) { if ($ruleRequired && ('' === $value || null === $value)) {
$this->message = 'Required property "'.$key.'" has no value'; $this->message = 'Required property "'.$key.'" has no value';
return false; return false;
} }
@ -211,6 +212,7 @@ class Structure extends Validator
if ($ruleArray) { // Array of values validation if ($ruleArray) { // Array of values validation
if (!is_array($value)) { if (!is_array($value)) {
$this->message = 'Property "'.$key.'" must be an array'; $this->message = 'Property "'.$key.'" must be an array';
return false; return false;
} }
@ -219,12 +221,14 @@ class Structure extends Validator
foreach ($value as $node) { foreach ($value as $node) {
if (!$validator->isValid($node)) { // Check if property is valid, if not required can also be empty if (!$validator->isValid($node)) { // Check if property is valid, if not required can also be empty
$this->message = 'Property "'.$key.'" has invalid input. '.$validator->getDescription(); $this->message = 'Property "'.$key.'" has invalid input. '.$validator->getDescription();
return false; return false;
} }
} }
} else { // Single value validation } else { // Single value validation
if ((!$validator->isValid($value)) && !('' === $value && !$ruleRequired)) { // Error when value is not valid, and is not optional and empty if ((!$validator->isValid($value)) && !('' === $value && !$ruleRequired)) { // Error when value is not valid, and is not optional and empty
$this->message = 'Property "'.$key.'" has invalid input. '.$validator->getDescription(); $this->message = 'Property "'.$key.'" has invalid input. '.$validator->getDescription();
return false; return false;
} }
} }