Merge pull request #886 from appwrite/0.7.x

0.7.x
This commit is contained in:
Eldad A. Fux 2021-02-11 11:07:00 +02:00 committed by GitHub
commit 7acfa98221
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2631 changed files with 70412 additions and 60334 deletions

View file

@ -6,4 +6,5 @@ public/styles
.git
.idea
.cd .babelrc
.DS_Store
.DS_Store
debug

41
.env Normal file
View file

@ -0,0 +1,41 @@
_APP_ENV=production
_APP_ENV=development
_APP_SYSTEM_EMAIL_NAME=Appwrite
_APP_SYSTEM_EMAIL_ADDRESS=team@appwrite.io
_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=security@appwrite.io
_APP_SYSTEM_RESPONSE_FORMAT=
_APP_OPTIONS_ABUSE=disabled
_APP_OPTIONS_FORCE_HTTPS=disabled
_APP_OPENSSL_KEY_V1=your-secret-key
_APP_DOMAIN=demo.appwrite.io
_APP_DOMAIN_TARGET=demo.appwrite.io
_APP_REDIS_HOST=redis
_APP_REDIS_PORT=6379
_APP_DB_HOST=mariadb
_APP_DB_PORT=3306
_APP_DB_SCHEMA=appwrite
_APP_DB_USER=user
_APP_DB_PASS=password
_APP_STORAGE_ANTIVIRUS=enabled
_APP_STORAGE_ANTIVIRUS_HOST=clamav
_APP_STORAGE_ANTIVIRUS_PORT=3310
_APP_INFLUXDB_HOST=influxdb
_APP_INFLUXDB_PORT=8086
_APP_STATSD_HOST=telegraf
_APP_STATSD_PORT=8125
_APP_SMTP_HOST=maildev
_APP_SMTP_PORT=25
_APP_SMTP_SECURE=
_APP_SMTP_USERNAME=
_APP_SMTP_PASSWORD=
_APP_STORAGE_LIMIT=10000000
_APP_FUNCTIONS_TIMEOUT=900
_APP_FUNCTIONS_CONTAINERS=10
_APP_FUNCTIONS_CPUS=1
_APP_FUNCTIONS_MEMORY=256
_APP_FUNCTIONS_MEMORY_SWAP=256
_APP_MAINTENANCE_INTERVAL=86400
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600
_APP_MAINTENANCE_RETENTION_ABUSE=86400
_APP_MAINTENANCE_RETENTION_AUDIT=1209600
_APP_USAGE_STATS=enabled

6
.gitignore vendored
View file

@ -1,12 +1,8 @@
/.vscode/
/vendor/
/node_modules/
/storage/uploads/
/storage/cache
/storage/db
/storage/influxdb
/tests/resources/storage/
/.idea/
.DS_Store
.php_cs.cache
.env
debug/

1
.travis-ci/deploy.sh Normal file
View file

@ -0,0 +1 @@
echo 'Nothing to deploy right now.'

View file

@ -1,11 +1,11 @@
language: php
dist: xenial
php:
- '7.4'
arch:
- amd64
addons:
hosts:
- appwrite.test
os: linux
language: shell
notifications:
email:
@ -14,20 +14,36 @@ notifications:
services:
- docker
# cache:
# directories:
# - docker_images
# before_install:
# - docker load -i docker_images/images.tar || true
# before_cache:
# - docker save -o docker_images/images.tar appwrite_appwrite
before_install:
- curl -fsSL https://get.docker.com | sh
- echo '{"experimental":"enabled"}' | sudo tee /etc/docker/daemon.json
- mkdir -p $HOME/.docker
- echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
- sudo service docker start
- >
if [ ! -z "${DOCKERHUB_PULL_USERNAME:-}" ]; then
echo "${DOCKERHUB_PULL_PASSWORD}" | docker login --username "${DOCKERHUB_PULL_USERNAME}" --password-stdin
fi
- docker --version
- docker buildx create --use
- chmod -R u+x ./.travis-ci
install:
- docker-compose up -d
- sleep 90
- sleep 10
script:
- docker ps
- docker exec appwrite test
- docker-compose logs appwrite
- docker-compose logs appwrite-worker-functions
- docker-compose exec appwrite doctor
- docker-compose exec appwrite vars
- docker-compose exec appwrite test
deploy:
- provider: script
edge: true
script: ./.travis-ci/deploy.sh
on:
repo: appwrite/appwrite
branch: deploy

View file

@ -2,26 +2,97 @@
## Features
- New route in Locale API to fetch a list of languages (@TorstenDittmann)
- Added Google Fonts to Appwrite for offline availability
- Added a new route in the Avatars API to get user initials avatar
- Added option to delete team from the console
- Added option to view team members from the console
- Added option to join a user to any team from the console
- Added support for Brotli compression (@PedroCisnerosSantana, @Rohitub222)
- New UI micro-interactions and CSS fixes (@AnatoleLucet)
- UI performance & accessibility improvements (#406)
- Improved Webhooks and added new system events - [Learn more]()
- Added response to /locale/languages API with a list of languages (@TorstenDittmann ,[#351](https://github.com/appwrite/appwrite/issues/351))
- Added a new route in the Avatars API to get user initials avatar ([#386](https://github.com/appwrite/appwrite/issues/386))
- Added API response payload structure info and examples to the docs site ([#381](https://github.com/appwrite/appwrite/issues/381))
- Added support for Brotli compression (@PedroCisnerosSantana, @Rohitub222, [#310](https://github.com/appwrite/appwrite/issues/310))
- New deletion worker ([#521](https://github.com/appwrite/appwrite/issues/521))
- New maintenance worker - cleaning up system logs and other optimizations ([#766](https://github.com/appwrite/appwrite/pull/766))
- New email worker - all emails are now sent asynchronously for improved performance (@TorstenDittmann ,[#402](https://github.com/appwrite/appwrite/pull/402))
- Moved all Appwrite container logs to STDOUT & STDERR ([#389](https://github.com/appwrite/appwrite/issues/389))
- New Doctor CLI to debug the Appwrite server ([#415](https://github.com/appwrite/appwrite/issues/415))
- All emails are now sent asynchronously for improved performance (@TorstenDittmann)
- Updated grid for OAuth2 providers list in the console
- Upgraded Redis Resque queue library to version 1.3.6
- Added container names to docker-compose.yml (@drandell)
- Upgraded ClamAV container image to version 1.0.11 ([#412](https://github.com/appwrite/appwrite/issues/412))
- Optimised function execution by using fully-qualified function calls
- Added support for boolean 'true' and 'false' in query strings alongside 1 and 0
- Updated storage calculation to match IEC standards
- Now using Alpine as base Docker image
- Switch standard dev ports to 95xx prefix ([#780](https://github.com/appwrite/appwrite/pull/780))
- User & Team name max length is now 128 chars and not 100 for better API consistency
- Collection name max length is now 128 chars and not 256 for better API consistency
- Project name max length is now 128 chars and not 100 for better API consistency
- Webhook name max length is now 128 chars and not 256 for better API consistency
- API Key name max length is now 128 chars and not 256 for better API consistency
- Task name max length is now 128 chars and not 256 for better API consistency
- Platform name max length is now 128 chars and not 256 for better API consistency
- Webhooks payloads are now exactly the same as any of the API response objects, documentation added
- Added new locale: Marathi -mr (@spielers)
- New and consistent response format for all API object + new response examples in the docs
- Removed user roles attribute from user object (can be fetched from /v1/teams/memberships) **
- Removed type attribute from session object response (used only internally)
- ** - might be changed before merging to master
- Added fallback option to 0.6 format for backward compatibility with any changes (@christyjacob4 [#772](https://github.com/appwrite/appwrite/pull/772))
- Added option to disable mail sending by setting an empty SMTP host value ([#730](https://github.com/appwrite/appwrite/issues/730))
- Upgraded installation script ([#490](https://github.com/appwrite/appwrite/issues/490))
- Added new environment variables for ClamAV hostname and port ([#780](https://github.com/appwrite/appwrite/pull/780))
- New OAuth adapter for Box.com (@armino-dev - [#420](https://github.com/appwrite/appwrite/issues/410))
- New OAuth adapter for PayPal sandbox (@armino-dev - [#420](https://github.com/appwrite/appwrite/issues/410))
- New OAuth adapter for Tradeshift (@armino-dev - [#855](https://github.com/appwrite/appwrite/pull/855))
- New OAuth adapter for Tradeshift sandbox (@armino-dev - [#855](https://github.com/appwrite/appwrite/pull/855))
- Introducing new permssion types: role:guest & role:member
- Disabled rate-limits on server side integrations
- Refactored migration script
### User Interface
- Updated grid for OAuth2 providers list in the console ([#413](https://github.com/appwrite/appwrite/issues/413))
- Added Google Fonts to Appwrite for offline availability
- Added option to delete user from the console (@PineappleIOnic - [#538](https://github.com/appwrite/appwrite/issues/538))
- Added option to delete team from the console ([#380](https://github.com/appwrite/appwrite/issues/380))
- Added option to view team members from the console ([#378](https://github.com/appwrite/appwrite/issues/378))
- Add option to assign new team members to a team from the console and the API ([#379](https://github.com/appwrite/appwrite/issues/379))
- Added Select All Checkbox for on Console API key Scopes Screen ([#477](https://github.com/appwrite/appwrite/issues/477))
- Added pagination and search for team memberships route ([#387](https://github.com/appwrite/appwrite/issues/387))
- Added pagination for projects list on the console home page.
- UI performance & accessibility improvements ([#406](https://github.com/appwrite/appwrite/pull/406))
- New UI micro-interactions and CSS fixes (@AnatoleLucet)
- Added toggle to hide/show secret keys and passwords inside the dashboard (@kodumbeats, [#535](https://github.com/appwrite/appwrite/issues/535))
### Upgrades
- Upgraded QR codes generator library (@PedroCisnerosSantana - [#475](https://github.com/appwrite/appwrite/issues/475))
- Upgraded Traefik image to version 2.3
- Upgraded MariaDB to version 10.5.5
- Upgraded Redis Docker image to version 6.0 (alpine)
- Upgraded Influxdb Docker image to version 1.8 (alpine)
- Upgraded Redis Resque queue library to version 1.3.6 ([#319](https://github.com/appwrite/appwrite/issues/319))
- Upgraded ClamAV container image to version 1.0.11 ([#412](https://github.com/appwrite/appwrite/issues/412))
- Upgraded device detctor to version 3.12.6
- Upgraded GEOIP DB file to Feb 2021 release
## Breaking Changes (Read before upgrading!)
- **Deprecated** `first` and `last` query params for documents list route in the database API
- **Deprecated** Deprectaed Pubjabi Translations ('pn')
- **Deprecated** `PATCH /account/prefs` is now updating the prefs payload and not just merging it
- **Deprecated** `PATCH /users/:userId/prefs` is now updating the prefs payload and not just merging it
- Switched order of limit and offset params in all the SDKs `listDocuments` method for better consistency
- Default `limit` param value in all the SDKs `listDocuments` method is now 25 for better consistency
## Bug Fixes
- Fixed a bug that caused blocked users to be able to create sessions ([#777](https://github.com/appwrite/appwrite/pull/781))
- Fixed an issue where Special characters in _APP_OPENSSL_KEY_V1_ env caused an error ([#732](https://github.com/appwrite/appwrite/issues/732))
- Fixed an issue where Account webhook doesn't trigger through the console ([#493](https://github.com/appwrite/appwrite/issues/493))
- Fixed case sensitive country flag code ([#526](https://github.com/appwrite/appwrite/issues/526))
- Fixed redirect to Appwrite login page when deep link is provided ([#427](https://github.com/appwrite/appwrite/issues/427))
- Fixed an issue where Creating documents fails for parent documents would result in an error ([#514](https://github.com/appwrite/appwrite/issues/514))
- Fixed an issue with Email Sending Problem using external smtp ([#707](https://github.com/appwrite/appwrite/issues/707))
- Fixed an issue where you could not remove a key from User Prefs ([#316](https://github.com/appwrite/appwrite/issues/316))
- Fixed an issue where events are not fully visible in the console ([#492](https://github.com/appwrite/appwrite/issues/492))
- Fixed an issue where UI would wrongly validate integers ([#394](https://github.com/appwrite/appwrite/issues/394))
- Fixed an issue where graphs were cut in mobile view ([#376](https://github.com/appwrite/appwrite/issues/376))
- Fixed URL issue where console/ would not display list of projects ([#372](https://github.com/appwrite/appwrite/issues/372))
- Fixed output of /v1/health/queue/certificates returning wrong data
- Fixed bug where team members count was wrong in some cases
- Fixed network calculation for uploaded files
@ -37,19 +108,18 @@
- Fixed Bug when trying to overwrite OAuth cookie in the Flutter SDK
- Fixed OAuth redirect when using the self-hosted instance default success URL ([#454](https://github.com/appwrite/appwrite/issues/454))
- Fixed bug denying authentication with Github OAuth provider
- New OAuth adapter for Box.com
- New OAuth adapter for PayPal sandbox
- Fixed a bug making read permission overwrite write permission in some cases
## Breaking Changes
- **Deprecated** `first` and `last` query params for documents list route in the database API
- **Deprecated** Deprecated Punjabi Translations ('pn')
- Fixed consistent property names in databases by enforcing camel case
## Security
- Access to Health API now requires authentication with an API Key with access to `health.read` scope allowed
- Added option to force HTTPS connection to the Appwrite server (_APP_OPTIONS_FORCE_HTTPS)
- Now using your `_APP_SYSTEM_EMAIL_ADDRESS` as the email address for issuing and renewing SSL certificates
- Block iframe access to Appwrite console using the `X-Frame-Options` header.
- Fixed `roles` param input validator
- API Keys are now stored encrypted
- Disabled domains whitlist ACL for the Appwrite console
# Version 0.6.2 (PRE-RELEASE)

View file

@ -72,7 +72,23 @@ cd appwrite
docker-compose up -d
```
After finishing the installation process, you can start writing and editing code. To compile new CSS and JS distribution files, use 'less' and 'build' tasks using gulp as a task manager.
### Code Autocompletion
To get proper autocompletion for all the different functions and classes in the codebase, you'll need to install Appwrite dependencies on your local machine. You can easily do that with PHP's package manager, [Composer](https://getcomposer.org/). If you don't have Composer installed, you can use the Docker Hub image to get the same result:
```bash
docker run --rm --interactive --tty \
--volume $PWD:/app \
composer install
```
### User Interface
Appwrite uses an internal micro-framework called Litespeed.js to build simple UI components in vanilla JS and [less](http://lesscss.org/) for compiling CSS code. To apply any of your changes to the UI, use the `gulp build` or `gulp less` commands, and restart the Appwrite main container to load the new static files to memory using `docker-compose restart appwrite`.
### Get Started
After finishing the installation process, you can start writing and editing code.
## Architecture
@ -145,6 +161,10 @@ Each container in Appwrite is a microservice on its own. Each service is an inde
Currently, all of the Appwrite microservices are intended to communicate using the TCP protocol over a private network. You should be aware to not expose any of the services to the public-facing network, besides the public port 80 and 443, who, by default, are used to expose the Appwrite HTTP API.
## Ports
Appwrite dev version uses ports 80 and 443 as an entry point to the Appwrite API and console. We also expose multiple ports in the range of 9500-9504 for debugging some of the Appwrite containers on dev mode. If you have any conflicts with the ports running on your system, you can easily replace them by editing Appwrite's docker-compose.yml file and executing `docker-compose up -d` command.
## Technology Stack
To start helping us to improve the Appwrite server by submitting code, prior knowledge of Appwrite's technology stack can help you with getting started.
@ -198,8 +218,6 @@ When contributing code, please take into account the following considerations:
Security and privacy are extremely important to Appwrite, developers, and users alike. Make sure to follow the best industry standards and practices.
<!-- To help you make sure you are doing as best as possible, we have set up our security checklist for pull requests and contributors. Please make sure to follow the list before sending a pull request. -->
## Dependencies
Please avoid introducing new dependencies to Appwrite without consulting the team. New dependencies can be very helpful but also introduce new security and privacy issues, complexity, and impact total docker image size.
@ -214,32 +232,77 @@ For us to find the right balance, please open an issue explaining your ideas bef
This will allow the Appwrite community to have sufficient discussion about the new feature value and how it fits in the product roadmap and vision.
This is also important for the Appwrite lead developers to be able to give technical input and different emphasis regarding the feature design and architecture.
This is also important for the Appwrite lead developers to be able to give technical input and different emphasis regarding the feature design and architecture. Some bigger features might need to go through our [RFC process](https://github.com/appwrite/rfc).
## Build
To build a new version of the Appwrite server, all you need to do is run the build.sh file like this:
```bash
bash ./build.sh 1.0.0
bash ./build.sh X.X.X
```
Before running the command, make sure you have proper write permissions to the Appwrite docker hub team.
**Build for multicore**
**Build for Multicore**
```bash
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t appwrite/multicore:0.0.0 --push
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -t appwrite/appwrite:dev --push .
```
**Build Functions Envs**
Build envs for all supported cloud functions (multicore builds)
```bash
bash ./docker/environments/build.sh
```
## Tests
To run tests manually, use the Appwrite Docker CLI from your terminal:
To run all tests manually, use the Appwrite Docker CLI from your terminal:
```bash
docker-compose exec appwrite test
```
To run unit tests use:
```bash
docker-compose exec appwrite test /usr/src/code/tests/unit
```
To run end-2-end tests use:
```bash
docker-compose exec appwrite test /usr/src/code/tests/e2e
```
To run end-2-end tests for a spcific service use:
```bash
docker-compose exec appwrite test /usr/src/code/tests/e2e/Services/[ServiceName]
```
## Benchmarking
You can use WRK Docker image to benchmark the server performance. Benchmarking is extremely useful when you want to compare how the server behaves before and after a change has been applied. Replace [APPWRITE_HOSTNAME_OR_IP] with your Appwrite server hostname or IP. Note that localhost is not accessible from inside the WRK container.
```
Options:
-c, --connections <N> Connections to keep open
-d, --duration <T> Duration of test
-t, --threads <N> Number of threads to use
-s, --script <S> Load Lua script file
-H, --header <H> Add header to request
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details
```
```bash
docker run --rm skandyla/wrk -t3 -c100 -d30 https://[APPWRITE_HOSTNAME_OR_IP]
```
## Code Maintenance
We use some automation tools to help us keep a healthy codebase.
@ -260,6 +323,12 @@ php-cs-fixer fix app/controllers --rules='{"braces": {"allow_single_line_closure
php-cs-fixer fix src --rules='{"braces": {"allow_single_line_closure": true}}'
```
Static Code Analysis:
```bash
docker-compose exec appwrite /usr/src/code/vendor/bin/psalm
```
## Tutorials
From time to time, our team will add tutorials that will help contributors find their way in the Appwrite source code. Below is a list of currently available tutorials:

251
Dockerfile Normal file → Executable file
View file

@ -1,56 +1,72 @@
FROM ubuntu:20.04 AS builder
LABEL maintainer="team@appwrite.io"
FROM composer:2.0 as step0
ARG TESTING=false
ENV TZ=Asia/Tel_Aviv \
DEBIAN_FRONTEND=noninteractive \
PHP_VERSION=7.4 \
PHP_REDIS_VERSION=5.2.1
RUN \
apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests ca-certificates software-properties-common wget git openssl && \
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && \
apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests make php$PHP_VERSION php$PHP_VERSION-dev zip unzip php$PHP_VERSION-zip && \
# Redis Extension
wget -q https://github.com/phpredis/phpredis/archive/$PHP_REDIS_VERSION.tar.gz && \
tar -xf $PHP_REDIS_VERSION.tar.gz && \
cd phpredis-$PHP_REDIS_VERSION && \
phpize$PHP_VERSION && \
./configure && \
make && \
# Composer
wget https://getcomposer.org/composer.phar && \
chmod +x ./composer.phar && \
mv ./composer.phar /usr/bin/composer && \
#Brotli
cd / && \
git clone https://github.com/eustas/ngx_brotli.git && \
cd ngx_brotli && git submodule update --init && cd ..
ENV TESTING=$TESTING
WORKDIR /usr/local/src/
# Updating PHP Dependencies and Auto-loading...
ENV TESTING=$TESTING
COPY composer.* /usr/local/src/
COPY composer.lock /usr/local/src/
COPY composer.json /usr/local/src/
RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
FROM ubuntu:20.04
FROM php:7.4-cli-alpine as step1
ENV PHP_REDIS_VERSION=5.3.0 \
PHP_SWOOLE_VERSION=v4.5.8 \
PHP_MAXMINDDB_VERSION=v1.8.0 \
PHP_XDEBUG_VERSION=sdebug_2_9-beta
RUN \
apk add --no-cache --virtual .deps \
make \
automake \
autoconf \
gcc \
g++ \
git \
zlib-dev \
brotli-dev \
libmaxminddb-dev
RUN docker-php-ext-install sockets
RUN \
# Redis Extension
git clone https://github.com/phpredis/phpredis.git && \
cd phpredis && \
git checkout $PHP_REDIS_VERSION && \
phpize && \
./configure && \
make && make install && \
cd .. && \
## Swoole Extension
git clone https://github.com/swoole/swoole-src.git && \
cd swoole-src && \
git checkout $PHP_SWOOLE_VERSION && \
phpize && \
./configure --enable-sockets --enable-http2 && \
make && make install && \
cd .. && \
## Maxminddb extension
git clone https://github.com/maxmind/MaxMind-DB-Reader-php.git && \
cd MaxMind-DB-Reader-php && \
git checkout $PHP_MAXMINDDB_VERSION && \
cd ext && \
phpize && \
./configure && \
make && make install && \
cd ../..
FROM php:7.4-cli-alpine as final
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
ENV TZ=Asia/Tel_Aviv \
DEBIAN_FRONTEND=noninteractive \
PHP_VERSION=7.4 \
ENV _APP_SERVER=swoole \
_APP_ENV=production \
_APP_DOMAIN=localhost \
_APP_DOMAIN_TARGET=localhost \
@ -59,8 +75,10 @@ ENV TZ=Asia/Tel_Aviv \
_APP_OPTIONS_ABUSE=enabled \
_APP_OPTIONS_FORCE_HTTPS=disabled \
_APP_OPENSSL_KEY_V1=your-secret-key \
_APP_STORAGE_LIMIT=104857600 \
_APP_STORAGE_LIMIT=10000000 \
_APP_STORAGE_ANTIVIRUS=enabled \
_APP_STORAGE_ANTIVIRUS_HOST=clamav \
_APP_STORAGE_ANTIVIRUS_PORT=3310 \
_APP_REDIS_HOST=redis \
_APP_REDIS_PORT=6379 \
_APP_DB_HOST=mariadb \
@ -74,105 +92,110 @@ ENV TZ=Asia/Tel_Aviv \
_APP_STATSD_PORT=8125 \
_APP_SMTP_HOST=smtp \
_APP_SMTP_PORT=25 \
_APP_FUNCTIONS_TIMEOUT=900 \
_APP_FUNCTIONS_CONTAINERS=10 \
_APP_FUNCTIONS_CPUS=1 \
_APP_FUNCTIONS_MEMORY=128 \
_APP_FUNCTIONS_MEMORY_SWAP=128 \
_APP_SETUP=self-hosted \
_APP_VERSION=$VERSION
_APP_VERSION=$VERSION \
_APP_USAGE_STATS=enabled \
# 14 Days = 1209600 s
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600 \
_APP_MAINTENANCE_RETENTION_AUDIT=1209600 \
# 1 Day = 86400 s
_APP_MAINTENANCE_RETENTION_ABUSE=86400 \
_APP_MAINTENANCE_INTERVAL=86400
#ENV _APP_SMTP_SECURE ''
#ENV _APP_SMTP_USERNAME ''
#ENV _APP_SMTP_PASSWORD ''
COPY --from=builder /phpredis-5.2.1/modules/redis.so /usr/lib/php/20190902/
COPY --from=builder /phpredis-5.2.1/modules/redis.so /usr/lib/php/20190902/
COPY --from=builder /ngx_brotli /ngx_brotli
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN \
apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests wget ca-certificates software-properties-common build-essential libpcre3-dev zlib1g-dev libssl-dev openssl gnupg htop supervisor && \
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && \
add-apt-repository universe && \
apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests php$PHP_VERSION php$PHP_VERSION-fpm \
php$PHP_VERSION-mysqlnd php$PHP_VERSION-curl php$PHP_VERSION-imagick php$PHP_VERSION-mbstring php$PHP_VERSION-dom webp certbot && \
# Nginx
wget http://nginx.org/download/nginx-1.19.0.tar.gz && \
tar -xzvf nginx-1.19.0.tar.gz && rm nginx-1.19.0.tar.gz && \
cd nginx-1.19.0 && \
./configure --prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=www-data \
--group=www-data \
--build=Ubuntu \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-http_v2_module \
--add-module=/ngx_brotli && \
make && \
make install && \
rm -rf ../nginx-1.19.0 && \
# Redis Extension
echo extension=redis.so >> /etc/php/$PHP_VERSION/fpm/conf.d/redis.ini && \
echo extension=redis.so >> /etc/php/$PHP_VERSION/cli/conf.d/redis.ini && \
# Cleanup
cd ../ && \
apt-get purge -y --auto-remove wget software-properties-common build-essential libpcre3-dev zlib1g-dev libssl-dev gnupg && \
apt-get clean && \
rm -rf /ngx_brotli && \
rm -rf /var/lib/apt/lists/*
apk update \
&& apk add --no-cache --virtual .deps \
make \
automake \
autoconf \
gcc \
g++ \
curl-dev \
&& apk add --no-cache \
libstdc++ \
yaml-dev \
imagemagick \
imagemagick-dev \
certbot \
docker-cli \
docker-compose \
libmaxminddb \
libmaxminddb-dev \
&& pecl install imagick yaml \
&& docker-php-ext-enable imagick yaml \
&& docker-php-ext-install sockets opcache pdo_mysql \
&& apk del .deps \
&& rm -rf /var/cache/apk/*
# Set Upload Limit (default to 100MB)
RUN echo "upload_max_filesize = ${_APP_STORAGE_LIMIT}" >> /etc/php/$PHP_VERSION/fpm/conf.d/appwrite.ini
RUN echo "post_max_size = ${_APP_STORAGE_LIMIT}" >> /etc/php/$PHP_VERSION/fpm/conf.d/appwrite.ini
WORKDIR /usr/src/code
# Add logs file
RUN echo "" >> /var/log/appwrite.log
COPY --from=step0 /usr/local/src/vendor /usr/src/code/vendor
COPY --from=step1 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
COPY --from=step1 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
COPY --from=step1 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/maxminddb.so /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
# Nginx Configuration (with self-signed ssl certificates)
COPY ./docker/nginx.conf.template /etc/nginx/nginx.conf.template
COPY ./docker/ssl/cert.pem /etc/nginx/ssl/cert.pem
COPY ./docker/ssl/key.pem /etc/nginx/ssl/key.pem
# PHP Configuration
RUN mkdir -p /var/run/php
COPY ./docker/www.conf /etc/php/$PHP_VERSION/fpm/pool.d/www.conf
# Add PHP Source Code
COPY ./app /usr/share/nginx/html/app
# Add Source Code
COPY ./app /usr/src/code/app
COPY ./bin /usr/local/bin
COPY ./docs /usr/share/nginx/html/docs
COPY ./public /usr/share/nginx/html/public
COPY ./src /usr/share/nginx/html/src
COPY --from=builder /usr/local/src/vendor /usr/share/nginx/html/vendor
COPY ./docs /usr/src/code/docs
COPY ./public /usr/src/code/public
COPY ./src /usr/src/code/src
# Set Volumes
RUN mkdir -p /storage/uploads && \
mkdir -p /storage/cache && \
mkdir -p /storage/config && \
mkdir -p /storage/certificates && \
mkdir -p /storage/functions && \
mkdir -p /storage/debug && \
chown -Rf www-data.www-data /storage/uploads && chmod -Rf 0755 /storage/uploads && \
chown -Rf www-data.www-data /storage/cache && chmod -Rf 0755 /storage/cache && \
chown -Rf www-data.www-data /storage/config && chmod -Rf 0755 /storage/config && \
chown -Rf www-data.www-data /storage/certificates && chmod -Rf 0755 /storage/certificates
# Supervisord Conf
COPY ./docker/supervisord.conf /etc/supervisord.conf
chown -Rf www-data.www-data /storage/certificates && chmod -Rf 0755 /storage/certificates && \
chown -Rf www-data.www-data /storage/functions && chmod -Rf 0755 /storage/functions && \
chown -Rf www-data.www-data /storage/debug && chmod -Rf 0755 /storage/debug
# Executables
RUN chmod +x /usr/local/bin/start
RUN chmod +x /usr/local/bin/doctor
RUN chmod +x /usr/local/bin/migrate
RUN chmod +x /usr/local/bin/test
RUN chmod +x /usr/local/bin/doctor && \
chmod +x /usr/local/bin/maintenance && \
chmod +x /usr/local/bin/install && \
chmod +x /usr/local/bin/migrate && \
chmod +x /usr/local/bin/schedule && \
chmod +x /usr/local/bin/sdks && \
chmod +x /usr/local/bin/ssl && \
chmod +x /usr/local/bin/test && \
chmod +x /usr/local/bin/vars && \
chmod +x /usr/local/bin/worker-audits && \
chmod +x /usr/local/bin/worker-certificates && \
chmod +x /usr/local/bin/worker-deletes && \
chmod +x /usr/local/bin/worker-functions && \
chmod +x /usr/local/bin/worker-mails && \
chmod +x /usr/local/bin/worker-tasks && \
chmod +x /usr/local/bin/worker-usage && \
chmod +x /usr/local/bin/worker-webhooks
# Letsencrypt Permissions
RUN mkdir -p /etc/letsencrypt/live/ && chmod -Rf 755 /etc/letsencrypt/live/
# Enable Extensions
RUN echo extension=swoole.so >> /usr/local/etc/php/conf.d/swoole.ini
RUN echo extension=redis.so >> /usr/local/etc/php/conf.d/redis.ini
RUN echo extension=maxminddb.so >> /usr/local/etc/php/conf.d/maxminddb.ini
RUN echo "opcache.preload_user=www-data" >> /usr/local/etc/php/conf.d/appwrite.ini
RUN echo "opcache.preload=/usr/src/code/app/preload.php" >> /usr/local/etc/php/conf.d/appwrite.ini
RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/appwrite.ini
EXPOSE 80
WORKDIR /usr/share/nginx/html
CMD ["/bin/bash", "/usr/local/bin/start"]
CMD [ "php", "app/http.php", "-dopcache.preload=opcache.preload=/usr/src/code/app/preload.php" ]

View file

@ -51,9 +51,9 @@ The easiest way to start running your Appwrite server is by running our docker-c
```bash
docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/install/appwrite:rw \
-e version=0.6.2 \
appwrite/install
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:0.7.0
```
### Windows
@ -63,9 +63,9 @@ docker run -it --rm \
```cmd
docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/install/appwrite:rw ^
-e version=0.6.2 ^
appwrite/install
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:0.7.0
```
#### PowerShell
@ -73,9 +73,9 @@ docker run -it --rm ^
```powershell
docker run -it --rm ,
--volume /var/run/docker.sock:/var/run/docker.sock ,
--volume ${pwd}/appwrite:/install/appwrite:rw ,
-e version=0.6.2 ,
appwrite/install
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
--entrypoint="install" ,
appwrite/appwrite:0.7.0
```
Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please note that on non-linux native hosts, the server might take a few minutes to start after installation completes.
@ -104,6 +104,7 @@ Getting started with Appwrite is as easy as creating a new project, choosing you
* [**Teams**](https://appwrite.io/docs/client/teams) - Manage and group users in teams. Manage memberships, invites, and user roles within a team.
* [**Database**](https://appwrite.io/docs/client/database) - Manage database collections and documents. Read, create, update, and delete documents and filter lists of document collections using advanced filters.
* [**Storage**](https://appwrite.io/docs/client/storage) - Manage storage files. Read, create, delete, and preview files. Manipulate the preview of your files to fit your app perfectly. All files are scanned by ClamAV and stored in a secure and encrypted way.
* [**Functions**](https://appwrite.io/docs/server/functions) - Customize your Appwrite server by executing your custom code in a secure, isolated environment. You can trigger your code on any Appwrite system event, manually or using a CRON schedule.
* [**Locale**](https://appwrite.io/docs/client/locale) - Track your user's location, and manage your app locale-based data.
* [**Avatars**](https://appwrite.io/docs/client/avatars) - Manage your users' avatars, countries' flags, browser icons, credit card symbols, and generate QR codes.
@ -114,7 +115,7 @@ For the complete API documentation, visit [https://appwrite.io/docs](https://app
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](https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md).
#### Client
* ✅ &nbsp; [Web](https://github.com/appwrite/sdk-for-js) (Maintained by the Appwrite Team)
* ✅ &nbsp; [Web](https://github.com/appwrite/sdk-for-web) (Maintained by the Appwrite Team)
* ✅ &nbsp; [Flutter](https://github.com/appwrite/sdk-for-flutter) (Maintained by the Appwrite Team)
#### Server
@ -123,8 +124,9 @@ Below is a list of currently supported platforms and languages. If you wish to h
* ✅ &nbsp; [Deno](https://github.com/appwrite/sdk-for-deno) - **Beta** (Maintained by the Appwrite Team)
* ✅ &nbsp; [Ruby](https://github.com/appwrite/sdk-for-ruby) - **Beta** (Maintained by the Appwrite Team)
* ✅ &nbsp; [Python](https://github.com/appwrite/sdk-for-python) - **Beta** (Maintained by the Appwrite Team)
* ✅ &nbsp; [.NET](https://github.com/appwrite/sdk-for-dotnet) - **Experimental** (Maintained by the Appwrite Team)
* ✅ &nbsp; [Dart](https://github.com/appwrite/sdk-for-dart) **Experimental** (Maintained by the Appwrite Team)
* ✅ &nbsp; [Go](https://github.com/appwrite/sdk-for-go) **Work in progress** (Maintained by the Appwrite Team)
* ✅ &nbsp; [Dart](https://github.com/appwrite/sdk-for-dart) **Work in progress** (Maintained by the Appwrite Team)
Looking for more SDKs? - Help us by contributing a pull request to our [SDK Generator](https://github.com/appwrite/sdk-generator)!

View file

@ -1,433 +0,0 @@
<?php
require_once __DIR__.'/init.php';
global $utopia, $request, $response, $register, $consoleDB, $project;
use Utopia\App;
use Utopia\Request;
use Utopia\View;
use Utopia\Exception;
use Utopia\Config\Config;
use Utopia\Domains\Domain;
use Appwrite\Auth\Auth;
use Appwrite\Database\Database;
use Appwrite\Database\Document;
use Appwrite\Database\Validator\Authorization;
use Appwrite\Event\Event;
use Appwrite\Network\Validator\Origin;
/*
* Configuration files
*/
$webhook = new Event('v1-webhooks', 'WebhooksV1');
$audit = new Event('v1-audits', 'AuditsV1');
$usage = new Event('v1-usage', 'UsageV1');
$mail = new Event('v1-mails', 'MailsV1');
$deletes = new Event('v1-deletes', 'DeletesV1');
/**
* Get All verified client URLs for both console and current projects
* + Filter for duplicated entries
*/
$clientsConsole = \array_map(function ($node) {
return $node['hostname'];
}, \array_filter($console->getAttribute('platforms', []), function ($node) {
if (isset($node['type']) && $node['type'] === 'web' && isset($node['hostname']) && !empty($node['hostname'])) {
return true;
}
return false;
}));
$clients = \array_unique(\array_merge($clientsConsole, \array_map(function ($node) {
return $node['hostname'];
}, \array_filter($project->getAttribute('platforms', []), function ($node) {
if (isset($node['type']) && $node['type'] === 'web' && isset($node['hostname']) && !empty($node['hostname'])) {
return true;
}
return false;
}))));
$utopia->init(function () use ($utopia, $request, $response, &$user, $project, $console, $webhook, $mail, $audit, $usage, $clients) {
$route = $utopia->match($request);
if(!empty($route->getLabel('sdk.platform', [])) && empty($project->getId()) && ($route->getLabel('scope', '') !== 'public')) {
throw new Exception('Missing or unknown project ID', 400);
}
$referrer = $request->getServer('HTTP_REFERER', '');
$origin = \parse_url($request->getServer('HTTP_ORIGIN', $referrer), PHP_URL_HOST);
$protocol = \parse_url($request->getServer('HTTP_ORIGIN', $referrer), PHP_URL_SCHEME);
$port = \parse_url($request->getServer('HTTP_ORIGIN', $referrer), PHP_URL_PORT);
$refDomain = $protocol.'://'.((\in_array($origin, $clients))
? $origin : 'localhost') . (!empty($port) ? ':'.$port : '');
$selfDomain = new Domain(Config::getParam('hostname'));
$endDomain = new Domain((string)$origin);
Config::setParam('domainVerification',
($selfDomain->getRegisterable() === $endDomain->getRegisterable()) &&
$endDomain->getRegisterable() !== '');
/*
* Security Headers
*
* As recommended at:
* @see https://www.owasp.org/index.php/List_of_useful_HTTP_headers
*/
if ($utopia->getEnv('_APP_OPTIONS_FORCE_HTTPS', 'disabled') === 'enabled') { // Force HTTPS
if(Config::getParam('protocol') !== 'https') {
return $response->redirect('https://' . Config::getParam('domain').$request->getServer('REQUEST_URI'));
}
$response->addHeader('Strict-Transport-Security', 'max-age='.(60 * 60 * 24 * 126)); // 126 days
}
$response
->addHeader('Server', 'Appwrite')
->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-Content-Type-Options', 'nosniff')
->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-SDK-Version, Cache-Control, Expires, Pragma')
->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies')
->addHeader('Access-Control-Allow-Origin', $refDomain)
->addHeader('Access-Control-Allow-Credentials', 'true')
;
/*
* Validate Client Domain - Check to avoid CSRF attack
* Adding Appwrite API domains to allow XDOMAIN communication
* Skip this check for non-web platforms which are not requiredto send an origin header
*/
$origin = $request->getServer('HTTP_ORIGIN', $request->getServer('HTTP_REFERER', ''));
$originValidator = new Origin(\array_merge($project->getAttribute('platforms', []), $console->getAttribute('platforms', [])));
if(!$originValidator->isValid($origin)
&& \in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT, Request::METHOD_PATCH, Request::METHOD_DELETE])
&& $route->getLabel('origin', false) !== '*'
&& empty($request->getHeader('X-Appwrite-Key', ''))) {
throw new Exception($originValidator->getDescription(), 403);
}
/*
* ACL Check
*/
$role = ($user->isEmpty()) ? Auth::USER_ROLE_GUEST : Auth::USER_ROLE_MEMBER;
// Add user roles
$membership = $user->search('teamId', $project->getAttribute('teamId', null), $user->getAttribute('memberships', []));
if ($membership) {
foreach ($membership->getAttribute('roles', []) as $memberRole) {
switch ($memberRole) {
case 'owner':
$role = Auth::USER_ROLE_OWNER;
break;
case 'admin':
$role = Auth::USER_ROLE_ADMIN;
break;
case 'developer':
$role = Auth::USER_ROLE_DEVELOPER;
break;
}
}
}
$roles = Config::getParam('roles', []);
$scope = $route->getLabel('scope', 'none'); // Allowed scope for chosen route
$scopes = $roles[$role]['scopes']; // Allowed scopes for user role
// Check if given key match project API keys
$key = $project->search('secret', $request->getHeader('X-Appwrite-Key', ''), $project->getAttribute('keys', []));
/*
* 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
*/
if (null !== $key && $user->isEmpty()) {
$user = new Document([
'$id' => 0,
'status' => Auth::USER_STATUS_ACTIVATED,
'email' => 'app.'.$project->getId().'@service.'.Config::getParam('domain'),
'password' => '',
'name' => $project->getAttribute('name', 'Untitled'),
]);
$role = Auth::USER_ROLE_APP;
$scopes = \array_merge($roles[$role]['scopes'], $key->getAttribute('scopes', []));
Authorization::setDefaultStatus(false); // Cancel security segmentation for API keys.
}
Authorization::setRole('user:'.$user->getId());
Authorization::setRole('role:'.$role);
\array_map(function ($node) {
if (isset($node['teamId']) && isset($node['roles'])) {
Authorization::setRole('team:'.$node['teamId']);
foreach ($node['roles'] as $nodeRole) { // Set all team roles
Authorization::setRole('team:'.$node['teamId'].'/'.$nodeRole);
}
}
}, $user->getAttribute('memberships', []));
// TDOO Check if user is god
if (!\in_array($scope, $scopes)) {
if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { // Check if permission is denied because project is missing
throw new Exception('Project not found', 404);
}
throw new Exception($user->getAttribute('email', 'User').' (role: '.\strtolower($roles[$role]['label']).') missing scope ('.$scope.')', 401);
}
if (Auth::USER_STATUS_BLOCKED == $user->getAttribute('status')) { // Account has not been activated
throw new Exception('Invalid credentials. User is blocked', 401); // User is in status blocked
}
if ($user->getAttribute('reset')) {
throw new Exception('Password reset is required', 412);
}
/*
* Background Jobs
*/
$webhook
->setParam('projectId', $project->getId())
->setParam('event', $route->getLabel('webhook', ''))
->setParam('payload', [])
;
$audit
->setParam('projectId', $project->getId())
->setParam('userId', $user->getId())
->setParam('event', '')
->setParam('resource', '')
->setParam('userAgent', $request->getServer('HTTP_USER_AGENT', ''))
->setParam('ip', $request->getIP())
->setParam('data', [])
;
$usage
->setParam('projectId', $project->getId())
->setParam('url', $request->getServer('HTTP_HOST', '').$request->getServer('REQUEST_URI', ''))
->setParam('method', $request->getServer('REQUEST_METHOD', 'UNKNOWN'))
->setParam('request', 0)
->setParam('response', 0)
->setParam('storage', 0)
;
});
$utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage, $deletes, $mode, $project, $utopia) {
/*
* Trigger events for background workers
*/
if (!empty($webhook->getParam('event'))) {
$webhook->trigger();
}
if (!empty($audit->getParam('event'))) {
$audit->trigger();
}
if (!empty($deletes->getParam('document'))) {
$deletes->trigger();
}
$route = $utopia->match($request);
if($project->getId()
&& $mode !== APP_MODE_ADMIN
&& !empty($route->getLabel('sdk.namespace', null))) { // Don't calculate console usage and admin mode
$usage
->setParam('request', $request->getSize() + $usage->getParam('storage'))
->setParam('response', $response->getSize())
->trigger()
;
}
});
$utopia->options(function () use ($request, $response) {
$origin = $request->getServer('HTTP_ORIGIN');
$response
->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-SDK-Version, Cache-Control, Expires, Pragma, X-Fallback-Cookies')
->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies')
->addHeader('Access-Control-Allow-Origin', $origin)
->addHeader('Access-Control-Allow-Credentials', 'true')
->send();
});
$utopia->error(function ($error /* @var $error Exception */) use ($request, $response, $utopia, $project) {
$env = Config::getParam('env');
$version = Config::getParam('version');
switch ($error->getCode()) {
case 400: // Error allowed publicly
case 401: // Error allowed publicly
case 402: // Error allowed publicly
case 403: // Error allowed publicly
case 404: // Error allowed publicly
case 409: // Error allowed publicly
case 412: // Error allowed publicly
case 429: // Error allowed publicly
$code = $error->getCode();
$message = $error->getMessage();
break;
default:
$code = 500; // All other errors get the generic 500 server error status code
$message = 'Server Error';
}
$_SERVER = []; // Reset before reporting to error log to avoid keys being compromised
$output = ((App::MODE_TYPE_DEVELOPMENT == $env)) ? [
'message' => $error->getMessage(),
'code' => $error->getCode(),
'file' => $error->getFile(),
'line' => $error->getLine(),
'trace' => $error->getTrace(),
'version' => $version,
] : [
'message' => $message,
'code' => $code,
'version' => $version,
];
$response
->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
->addHeader('Expires', '0')
->addHeader('Pragma', 'no-cache')
->setStatusCode($code)
;
$route = $utopia->match($request);
$template = ($route) ? $route->getLabel('error', null) : null;
if ($template) {
$layout = new View(__DIR__.'/views/layouts/default.phtml');
$comp = new View($template);
$comp
->setParam('projectName', $project->getAttribute('name'))
->setParam('projectURL', $project->getAttribute('url'))
->setParam('message', $error->getMessage())
->setParam('code', $code)
;
$layout
->setParam('title', $project->getAttribute('name').' - Error')
->setParam('description', 'No Description')
->setParam('body', $comp)
->setParam('version', $version)
->setParam('litespeed', false)
;
$response->send($layout->render());
}
$response
->json($output)
;
});
$utopia->get('/manifest.json')
->desc('Progressive app manifest file')
->label('scope', 'public')
->label('docs', false)
->action(
function () use ($response) {
$response->json([
'name' => APP_NAME,
'short_name' => APP_NAME,
'start_url' => '.',
'url' => 'https://appwrite.io/',
'display' => 'standalone',
'background_color' => '#fff',
'theme_color' => '#f02e65',
'description' => 'End to end backend server for frontend and mobile apps. 👩‍💻👨‍💻',
'icons' => [
[
'src' => 'images/favicon.png',
'sizes' => '256x256',
'type' => 'image/png',
],
],
]);
}
);
$utopia->get('/robots.txt')
->desc('Robots.txt File')
->label('scope', 'public')
->label('docs', false)
->action(
function () use ($response) {
$template = new View(__DIR__.'/views/general/robots.phtml');
$response->text($template->render(false));
}
);
$utopia->get('/humans.txt')
->desc('Humans.txt File')
->label('scope', 'public')
->label('docs', false)
->action(
function () use ($response) {
$template = new View(__DIR__.'/views/general/humans.phtml');
$response->text($template->render(false));
}
);
$utopia->get('/.well-known/acme-challenge')
->desc('SSL Verification')
->label('scope', 'public')
->label('docs', false)
->action(
function () use ($request, $response) {
$base = \realpath(APP_STORAGE_CERTIFICATES);
$path = \str_replace('/.well-known/acme-challenge/', '', $request->getParam('q'));
$absolute = \realpath($base.'/.well-known/acme-challenge/'.$path);
if(!$base) {
throw new Exception('Storage error', 500);
}
if(!$absolute) {
throw new Exception('Unknown path', 404);
}
if(!\substr($absolute, 0, \strlen($base)) === $base) {
throw new Exception('Invalid path', 401);
}
if(!\file_exists($absolute)) {
throw new Exception('Unknown path', 404);
}
$content = @\file_get_contents($absolute);
if(!$content) {
throw new Exception('Failed to get contents', 500);
}
$response->text($content);
}
);
include_once __DIR__ . '/controllers/shared/api.php';
include_once __DIR__ . '/controllers/shared/web.php';
foreach(Config::getParam('services', []) as $service) {
include_once $service['controller'];
}
$utopia->run($request, $response);

26
app/cli.php Normal file
View file

@ -0,0 +1,26 @@
<?php
require_once __DIR__.'/init.php';
use Utopia\App;
use Utopia\CLI\CLI;
use Utopia\CLI\Console;
$cli = new CLI();
include 'tasks/doctor.php';
include 'tasks/maintenance.php';
include 'tasks/install.php';
include 'tasks/migrate.php';
include 'tasks/sdks.php';
include 'tasks/ssl.php';
include 'tasks/vars.php';
$cli
->task('version')
->desc('Get the server version')
->action(function () {
Console::log(App::getEnv('_APP_VERSION', 'UNKNOWN'));
});
$cli->run();

File diff suppressed because it is too large Load diff

138
app/config/environments.php Normal file
View file

@ -0,0 +1,138 @@
<?php
use Utopia\App;
use Utopia\System\System;
/**
* List of Appwrite Cloud Functions supported environments
*/
$environments = [
'node-14.5' => [
'name' => 'Node.js',
'version' => '14.5',
'base' => 'node:14.5-alpine',
'image' => 'appwrite/env-node-14.5:1.0.0',
'build' => '/usr/src/code/docker/environments/node-14.5',
'logo' => 'node.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'node-15.5' => [
'name' => 'Node.js',
'version' => '15.5',
'base' => 'node:15.5-alpine',
'image' => 'appwrite/env-node-15.5:1.0.0',
'build' => '/usr/src/code/docker/environments/node-15.5',
'logo' => 'node.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'php-7.4' => [
'name' => 'PHP',
'version' => '7.4',
'base' => 'php:7.4-cli-alpine',
'image' => 'appwrite/env-php-7.4:1.0.0',
'build' => '/usr/src/code/docker/environments/php-7.4',
'logo' => 'php.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'php-8.0' => [
'name' => 'PHP',
'version' => '8.0',
'base' => 'php:8.0-cli-alpine',
'image' => 'appwrite/env-php-8.0:1.0.0',
'build' => '/usr/src/code/docker/environments/php-8.0',
'logo' => 'php.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'ruby-2.7' => [
'name' => 'Ruby',
'version' => '2.7',
'base' => 'ruby:2.7-alpine',
'image' => 'appwrite/env-ruby-2.7:1.0.2',
'build' => '/usr/src/code/docker/environments/ruby-2.7',
'logo' => 'ruby.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'ruby-3.0' => [
'name' => 'Ruby',
'version' => '3.0',
'base' => 'ruby:3.0-alpine',
'image' => 'appwrite/env-ruby-3.0:1.0.0',
'build' => '/usr/src/code/docker/environments/ruby-3.0',
'logo' => 'ruby.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'python-3.8' => [
'name' => 'Python',
'version' => '3.8',
'base' => 'python:3.8-alpine',
'image' => 'appwrite/env-python-3.8:1.0.0',
'build' => '/usr/src/code/docker/environments/python-3.8',
'logo' => 'python.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'deno-1.2' => [
'name' => 'Deno',
'version' => '1.2',
'base' => 'hayd/deno:alpine-1.2.0',
'image' => 'appwrite/env-deno-1.2:1.0.0',
'build' => '/usr/src/code/docker/environments/deno-1.2',
'logo' => 'deno.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'deno-1.5' => [
'name' => 'Deno',
'version' => '1.5',
'base' => 'hayd/deno:alpine-1.5.0',
'image' => 'appwrite/env-deno-1.5:1.0.0',
'build' => '/usr/src/code/docker/environments/deno-1.5',
'logo' => 'deno.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'deno-1.6' => [
'name' => 'Deno',
'version' => '1.6',
'base' => 'hayd/deno:alpine-1.6.0',
'image' => 'appwrite/env-deno-1.6:1.0.0',
'build' => '/usr/src/code/docker/environments/deno-1.6',
'logo' => 'deno.png',
'supports' => [System::X86, System::PPC, System::ARM],
],
'dart-2.10' => [
'name' => 'Dart',
'version' => '2.10',
'base' => 'google/dart:2.10',
'image' => 'appwrite/env-dart-2.10:1.0.0',
'build' => '/usr/src/code/docker/environments/dart-2.10',
'logo' => 'dart.png',
'supports' => [System::X86],
],
'dotnet-3.1' => [
'name' => '.NET',
'version' => '3.1',
'base' => 'mcr.microsoft.com/dotnet/runtime:3.1-alpine',
'image' => 'appwrite/env-dotnet-3.1:1.0.0',
'build' => '/usr/src/code/docker/environments/dotnet-3.1',
'logo' => 'dotnet.png',
'supports' => [System::X86, System::ARM],
],
'dotnet-5.0' => [
'name' => '.NET',
'version' => '5.0',
'base' => 'mcr.microsoft.com/dotnet/runtime:5.0-alpine',
'image' => 'appwrite/env-dotnet-5.0:1.0.0',
'build' => '/usr/src/code/docker/environments/dotnet-5.0',
'logo' => 'dotnet.png',
'supports' => [System::X86, System::ARM],
],
];
$allowList = empty(App::getEnv('_APP_FUNCTIONS_ENVS', null)) ? false : \explode(',', App::getEnv('_APP_FUNCTIONS_ENVS', null));
$environments = array_filter($environments, function ($environment, $key) use ($allowList) {
$isAllowed = $allowList && in_array($key, $allowList);
$isSupported = in_array(System::getArchEnum(), $environment["supports"]);
return $allowList ? ($isAllowed && $isSupported) : $isSupported;
}, ARRAY_FILTER_USE_BOTH);
return $environments;

View file

@ -3,56 +3,163 @@
/**
* List of publicly accessiable system events
*/
use Appwrite\Utopia\Response;
return [
'account.create' => [
'description' => 'This event triggers when the account is created.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.update.email' => [
'description' => 'This event triggers when the account email address is updated.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.update.name' => [
'description' => 'This event triggers when the account name is updated.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.update.password' => [
'description' => 'This event triggers when the account password is updated.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.update.prefs' => [
'description' => 'This event triggers when the account preferences are updated.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.recovery.create' => [
'description' => 'This event triggers when the account recovery token is created.',
'model' => Response::MODEL_TOKEN,
'note' => 'version >= 0.7',
],
'account.recovery.update' => [
'description' => 'This event triggers when the account recovery token is validated.',
'model' => Response::MODEL_TOKEN,
'note' => 'version >= 0.7',
],
'account.verification.create' => [
'description' => 'This event triggers when the account verification token is created.',
'model' => Response::MODEL_TOKEN,
'note' => 'version >= 0.7',
],
'account.verification.update' => [
'description' => 'This event triggers when the account verification token is validated.',
'model' => Response::MODEL_TOKEN,
'note' => 'version >= 0.7',
],
'account.delete' => [
'description' => 'This event triggers when the account is deleted.',
'model' => Response::MODEL_USER,
'note' => '',
],
'account.sessions.create' => [
'description' => 'This event triggers when the account session is created.',
'model' => Response::MODEL_SESSION,
'note' => '',
],
'account.sessions.delete' => [
'description' => 'This event triggers when the account session is deleted.',
'model' => Response::MODEL_SESSION,
'note' => '',
],
'database.collections.create' => [
'description' => 'This event triggers when a database collection is created.',
'model' => Response::MODEL_COLLECTION,
'note' => '',
],
'database.collections.update' => [
'description' => 'This event triggers when a database collection is updated.',
'model' => Response::MODEL_COLLECTION,
'note' => '',
],
'database.collections.delete' => [
'description' => 'This event triggers when a database collection is deleted.',
'model' => Response::MODEL_COLLECTION,
'note' => '',
],
'database.documents.create' => [
'description' => 'This event triggers when a database document is created.',
'model' => Response::MODEL_ANY,
'note' => '',
],
'database.documents.patch' => [
'description' => 'This event triggers when a database document is patched.',
'database.documents.update' => [
'description' => 'This event triggers when a database document is updated.',
'model' => Response::MODEL_ANY,
'note' => '',
],
'database.documents.delete' => [
'description' => 'This event triggers when a database document is deleted.',
'model' => Response::MODEL_ANY,
'note' => '',
],
'storage.files.create' => [
'description' => 'This event triggers when a storage file is created.',
'model' => Response::MODEL_FILE,
'note' => '',
],
'storage.files.update' => [
'description' => 'This event triggers when a storage file is updated.',
'model' => Response::MODEL_FILE,
'note' => '',
],
'storage.files.delete' => [
'description' => 'This event triggers when a storage file is deleted.',
'model' => Response::MODEL_FILE,
'note' => '',
],
'users.create' => [
'description' => 'This event triggers when a user is created from the users API.',
'model' => Response::MODEL_USER,
'note' => 'version >= 0.7',
],
'users.update.status' => [
'description' => 'This event triggers when a user status is updated from the users API.',
'model' => Response::MODEL_USER,
'note' => 'version >= 0.7',
],
'users.delete' => [
'description' => 'This event triggers when a user is deleted from users API.',
'model' => Response::MODEL_USER,
'note' => 'version >= 0.7',
],
'users.sessions.delete' => [
'description' => 'This event triggers when a user session is deleted from users API.',
'model' => Response::MODEL_SESSION,
'note' => 'version >= 0.7',
],
'teams.create' => [
'description' => 'This event triggers when a team is created.',
'model' => Response::MODEL_TEAM,
'note' => 'version >= 0.7',
],
'teams.update' => [
'description' => 'This event triggers when a team is updated.',
'model' => Response::MODEL_TEAM,
'note' => 'version >= 0.7',
],
'teams.delete' => [
'description' => 'This event triggers when a team is deleted.',
'model' => Response::MODEL_TEAM,
'note' => 'version >= 0.7',
],
'teams.memberships.create' => [
'description' => 'This event triggers when a team memberships is created.',
'model' => Response::MODEL_MEMBERSHIP,
'note' => 'version >= 0.7',
],
'teams.memberships.update.status' => [
'description' => 'This event triggers when a team memberships status is updated.',
'model' => Response::MODEL_MEMBERSHIP,
'note' => 'version >= 0.7',
],
'teams.memberships.delete' => [
'description' => 'This event triggers when a team memberships is deleted.',
'model' => Response::MODEL_MEMBERSHIP,
'note' => 'version >= 0.7',
],
];

View file

@ -3,16 +3,21 @@
return [
'af', // Afrikaans
'ar', // Arabic
'ba', //Bosnian
'be', // Belarusian
'bg', // Bulgarian
'bn', // Bengali
'cat', // Catalan
'cz', // Czech
'de', // German
'en', // English
'es', // Spanish
'fa', // Farsi/Persian
'fi', // Finnish
'fo', // Faroese
'fr', // French
'gr', // Greek
'gu', //Gujrati
'he', // Hebrew
'hi', // Hindi
'hu', // Hungarian
@ -22,17 +27,22 @@ return [
'it', // Italian
'ja', // Japanese
'jv', // Javanese
'ka', // Kannada
'km', // Khmer
'ko', // Korean
'lt', // Lithuanian
'ml', // Malayalam
'mr', // Marathi
'ms', // Malay
'nl', // Dutch
'no', // Norwegian
'np', // Nepali
'od', // Odia
'ph', // Filipino
'pl', // Polish
'pt-br', // Portuguese - Brazil
'pt-pt', // Portuguese - Portugal
'pa', //Punjabi
'ro', // Romanian
'ru', // Russian
'si', // Sinhala
@ -43,7 +53,8 @@ return [
'th', // Thai
'tr', // Turkish
'ua', // Ukrainian
'ur', //Urdu
'vi', // Vietnamese
'zh-cn', // Chinese - China
'zh-tw', // Chinese - Taiwan
];
];

View file

@ -30,8 +30,4 @@ $list = [
'SE', // Sweden
];
if (\time() < \strtotime('2020-01-31')) { // @see https://en.wikipedia.org/wiki/Brexit
$list[] = 'GB'; // // United Kingdom
}
return $list;

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'Afrika',
'AN' => 'Antartika',
'AS' => 'Azija',
'EU' => 'Europa',
'NA' => 'Sjeverna Amerika',
'OC' => 'Okeanija',
'SA' => 'Južna Amerika',
];

View file

@ -0,0 +1,198 @@
<?php
return [
'AF' => 'Afganistan',
'AO' => 'Angola',
'AL' => 'Albanija',
'AD' => 'Andora',
'AE' => 'Ujedinjeni Arapski Emirati',
'AR' => 'Argentina',
'AM' => 'Armenija',
'AG' => 'Antigua i Barbuda',
'AU' => 'Australija',
'AT' => 'Austria',
'AZ' => 'Azerbejdžan',
'BI' => 'Burundi',
'BE' => 'Belgija',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladeš',
'BG' => 'Bugarska',
'BH' => 'Bahrein',
'BS' => 'Bahami',
'BA' => 'Bosna i Hercegovina',
'BY' => 'Bjelorusija',
'BZ' => 'Belize',
'BO' => 'Bolivija',
'BR' => 'Brazil',
'BB' => 'Barbados',
'BN' => 'Brineji',
'BT' => 'Butan',
'BW' => 'Bocvanija',
'CF' => 'Centralna Afrička Republika',
'CA' => 'Kanada',
'CH' => 'Švicarska',
'CL' => 'Čile',
'CN' => 'Kina',
'CI' => 'Obala Slonovače',
'CM' => 'Kameron',
'CD' => 'DR Kongo',
'CG' => 'Republika Kongo',
'CO' => 'Kolumbija',
'KM' => 'Komori',
'CV' => 'Zelenortska Ostrva',
'CR' => 'Kostarika',
'CU' => 'Kuba',
'CY' => 'Kipar',
'CZ' => 'Češka',
'DE' => 'Njemačka',
'DJ' => 'Džibuti',
'DM' => 'Dominika',
'DK' => 'Danska',
'DO' => 'Dominikanska Republika',
'DZ' => 'Alžir',
'EC' => 'Ekvador',
'EG' => 'Egipt',
'ER' => 'Eritreja',
'ES' => 'Španija',
'EE' => 'Estonija',
'ET' => 'Etiopija',
'FI' => 'Finska',
'FJ' => 'Fidži',
'FR' => 'Francuska',
'FM' => 'Mikronezija',
'GA' => 'Gabon',
'GB' => 'Ujedinjeno Kraljevstvo',
'GE' => 'Gruzija',
'GH' => 'Gana',
'GN' => 'Gvineja',
'GM' => 'Gambia',
'GW' => 'Gvineja Bisau',
'GQ' => 'Ekvatorijalna Gvineja',
'GR' => 'Grčka',
'GD' => 'Grenada',
'GT' => 'Guatemala',
'GY' => 'Gvajana',
'HN' => 'Honduras',
'HR' => 'Hrvatska',
'HT' => 'Haiti',
'HU' => 'Mađarska',
'ID' => 'Indonezija',
'IN' => 'India',
'IE' => 'Irska',
'IR' => 'Iran',
'IQ' => 'Irak',
'IS' => 'Island',
'IL' => 'Izrael',
'IT' => 'Italija',
'JM' => 'Jamajka',
'JO' => 'Jordan',
'JP' => 'Japan',
'KZ' => 'Kazahstan',
'KE' => 'Kenija',
'KG' => 'Kirgistan',
'KH' => 'Kambodža',
'KI' => 'Kiribati',
'KN' => 'Sveti Kitts i Nevis',
'KR' => 'Južna Korea',
'KW' => 'Kuvajt',
'LA' => 'Laos',
'LB' => 'Libanon',
'LR' => 'Liberija',
'LY' => 'Libija',
'LC' => 'Sveta Lucija',
'LI' => 'Lihtenštajn',
'LK' => 'Šri Lanka',
'LS' => 'Lesoto',
'LT' => 'Litvanija',
'LU' => 'Luksemburg',
'LV' => 'Lavija',
'MA' => 'Maroko',
'MC' => 'Monako',
'MD' => 'Moldavija',
'MG' => 'Madagaskar',
'MV' => 'Maldivi',
'MX' => 'Meksiko',
'MH' => 'Marshall Islands',
'MK' => 'Makedonija',
'ML' => 'Mali',
'MT' => 'Malta',
'MM' => 'Mijanmar',
'ME' => 'Crna Gora',
'MN' => 'Mongolia',
'MZ' => 'Mozambik',
'MR' => 'Mauritanija',
'MU' => 'Mauricijus',
'MW' => 'Malavi',
'MY' => 'Malezija',
'NA' => 'Namibia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nikaragva',
'NL' => 'Holandija',
'NO' => 'Norveška',
'NP' => 'Nepal',
'NR' => 'Nauru',
'NZ' => 'Novi Zeland',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PE' => 'Peru',
'PH' => 'Filipini',
'PW' => 'Palau',
'PG' => 'Papua Nova Guinea',
'PL' => 'Poljska',
'KP' => 'Sjeverna Korea',
'PT' => 'Portugal',
'PY' => 'Paragvaj',
'QA' => 'Katar',
'RO' => 'Rumunija',
'RU' => 'Rusija',
'RW' => 'Ruanda',
'SA' => 'Saudijska Arabija',
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapur',
'SB' => 'Solomonova Ostrva',
'SL' => 'Sijera Leone',
'SV' => 'Salvador',
'SM' => 'San Marino',
'SO' => 'Somalia',
'RS' => 'Srbija',
'SS' => 'Južni Sudan',
'ST' => 'Sveti Toma i Prinsipe',
'SR' => 'Surinam',
'SK' => 'Slovačka',
'SI' => 'Slovenija',
'SE' => 'Švedska',
'SZ' => 'Svazilend',
'SC' => 'Sejšeli',
'SY' => 'Sirija',
'TD' => 'Čad',
'TG' => 'Togo',
'TH' => 'Tajland',
'TJ' => 'Tajikistan',
'TM' => 'Turkmenistan',
'TL' => 'Timor-Leste',
'TO' => 'Tonga',
'TT' => 'Trinidad i Tobago',
'TN' => 'Tunis',
'TR' => 'Turska',
'TV' => 'Tuvalu',
'TZ' => 'Tanzania',
'UG' => 'Uganda',
'UA' => 'Ukrajina',
'UY' => 'Urugvaj',
'US' => 'Sjedinjene Američke Države',
'UZ' => 'Uzbekistan',
'VA' => 'Vatikan',
'VC' => 'Sveti Vincent i Grenadini',
'VE' => 'Venecuela',
'VN' => 'Vijetnam',
'VU' => 'Vanuatu',
'WS' => 'Samoa',
'YE' => 'Jemen',
'ZA' => 'Južna Afrika',
'ZM' => 'Zambia',
'ZW' => 'Zimbabve',
];

View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"Umjetnost mudrosti je umjetnost znanja o tome šta zanemariti."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'ba',
'settings.direction' => 'ltr',
// Service - Users
'account.emails.team' => '%s Tim',
'account.emails.verification.title' => 'Verifikacija računa',
'account.emails.verification.body' => 'ba.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Reset lozinke',
'account.emails.recovery.body' => 'ba.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Pozivnica za %s Team na %s',
'account.emails.invitation.body' => 'ba.email.auth.invitation.tpl',
'locale.country.unknown' => 'Nepoznat',
'countries' => include 'ba.countries.php',
'continents' => include 'ba.continents.php',
];

View file

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

View file

@ -0,0 +1,198 @@
<?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' => 'Зімбабвэ',
];

View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"Мастацтва быць мудрым - гэта мастацтва ведаць, на што нельга звярнуць увагу."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'be',
'settings.direction' => 'ltr',
// Service - Users
'account.emails.team' => 'Каманда %s',
'account.emails.verification.title' => 'Праверка ўліковага запісу',
'account.emails.verification.body' => 'be.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Скід пароля',
'account.emails.recovery.body' => 'be.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Запрашэнне да каманды %s y %s',
'account.emails.invitation.body' => 'be.email.auth.invitation.tpl',
'locale.country.unknown' => 'Невядомы',
'countries' => include 'be.countries.php',
'continents' => include 'be.continents.php',
];

View file

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

View file

@ -0,0 +1,198 @@
<?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' => 'Зимбабве',
];

View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"Изкуството да бъдеш мъдър е изкуството да знаеш какво да пренебрегнеш."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'bg',
'settings.direction' => 'ltr',
// Service - Users
'account.emails.team' => '%s Екип',
'account.emails.verification.title' => 'Потвърждаване на профила',
'account.emails.verification.body' => 'bg.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Възстановяване на парола',
'account.emails.recovery.body' => 'bg.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Покана към %s екипа при %s',
'account.emails.invitation.body' => 'bg.email.auth.invitation.tpl',
'locale.country.unknown' => 'Неизвестно',
'countries' => include 'bg.countries.php',
'continents' => include 'bg.continents.php',
];

View file

@ -9,7 +9,7 @@ return [
'account.emails.team' => 'Equipo %s',
'account.emails.verification.title' => 'Confirmación de la cuenta',
'account.emails.verification.body' => 'es.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Reestablecer contraseña',
'account.emails.recovery.title' => 'Restablecer contraseña',
'account.emails.recovery.body' => 'es.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Invitación al Equipo %s en %s',
'account.emails.invitation.body' => 'es.email.auth.invitation.tpl',

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'آفریقا',
'AN' => 'قطب جنوب',
'AS' => 'آسیا',
'EU' => 'اروپا',
'NA' => 'آمریکای شمالی',
'OC' => 'اقیانوسیه',
'SA' => 'آمریکای جنوبی',
];

View file

@ -0,0 +1,198 @@
<?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' => 'زیمباوه',
];

View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"هنر خردمند بودن، هنر دانستن چیزی است که باید از آن غافل شد."', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'fa',
'settings.direction' => 'rtl',
// Service - Users
'account.emails.team' => 'تیم %s',
'account.emails.verification.title' => 'تایید حساب کاربری',
'account.emails.verification.body' => 'fa.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'بازیابی رمز عبور',
'account.emails.recovery.body' => 'fa.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'دعوتنامه به تیم %s در %s',
'account.emails.invitation.body' => 'fa.email.auth.invitation.tpl',
'locale.country.unknown' => 'ناشناخته',
'countries' => include 'fa.countries.php',
'continents' => include 'fa.continents.php',
];

View file

@ -8,11 +8,11 @@ return [
// Service - Users
'account.emails.team' => '%s Tiimi',
'account.emails.verification.title' => 'Tilin Vahvistus',
'account.emails.verification.body' => 'en.email.auth.confirm.tpl',
'account.emails.verification.body' => 'fi.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Salasanan Nollaus',
'account.emails.recovery.body' => 'en.email.auth.recovery.tpl',
'account.emails.recovery.body' => 'fi.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Kutsu %s Tiimiin %s',
'account.emails.invitation.body' => 'en.email.auth.invitation.tpl',
'account.emails.invitation.body' => 'fi.email.auth.invitation.tpl',
'locale.country.unknown' => 'Unknown',

View file

@ -0,0 +1,11 @@
<?php
return [
'AF' => 'આફ્રિકા',
'AN' => 'એન્ટાર્કટિકા',
'AS' => 'એશિયા',
'EU' => 'યુરોપ',
'NA' => 'ઉત્તર અમેરિકા',
'OC' => 'ઓશનિયા',
'SA' => 'દક્ષિણ અમેરિકા',
];

View file

@ -0,0 +1,200 @@
<?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' => 'અલ્જેરિયા',
'ER' => 'એરિટ્રીઆ',
'EC' => 'એક્વાડોર',
'EG' => 'ઇજિપ્ત',
'IR' => 'એરિટ્રીઆ',
'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' => 'ઝિમ્બાબ્વે',
];

View file

@ -0,0 +1,21 @@
<?php
return [
'settings.inspire' => '"સ્માર્ટ બનવાની કળા એ છે કે શું અવગણવું તે જાણવાની કળા છે."', // Tmrs is the line printed in the homepage and console 'view-source'
'settings.locale' => 'gu',
'settings.direction' => 'ltr',
// Service - Users
'account.emails.team' => '%s ટીમ',
'account.emails.verification.title' => 'ખાતાની પુષ્ટિ ',
'account.emails.verification.body' => 'gu.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'પાસવૉર્ડ રીસેટ ',
'account.emails.recovery.body' => 'gu.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'આમંત્રણ %s ટીમ %s',
'account.emails.invitation.body' => 'gu.email.auth.invitation.tpl',
'locale.country.unknown' => 'अज्ञात',
'countries' => include 'gu.countries.php',
'continents' => include 'gu.continents.php',
];

View file

@ -0,0 +1,199 @@
<?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' => 'अल्जीरिया',
'ER' => 'इरित्रिया',
'EC' => 'ईक्वाडोर',
'EG' => 'मिस्र',
'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' => 'ज़िम्बाब्वे',
];

View file

@ -17,7 +17,7 @@ return [
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Banglades',
'BG' => 'Bulgaria',
'BG' => 'Bulgária',
'BH' => 'Bahrein',
'BS' => 'Bahamák',
'BA' => 'Bosznia-Hercegovina',
@ -50,7 +50,7 @@ return [
'DM' => 'Dominika',
'DK' => 'Dánia',
'DO' => 'Dominikai Köztársaság',
'DZ' => 'Algíria',
'DZ' => 'Algéria',
'EC' => 'Ecuador',
'EG' => 'Egyiptom',
'ER' => 'Eritrea',
@ -67,7 +67,7 @@ return [
'GH' => 'Ghána',
'GN' => 'Guinea',
'GM' => 'Gambia',
'GW' => 'Guinea-Bissau',
'GW' => 'Bissau-Guinea',
'GQ' => 'Egyenlítői-Guinea',
'GR' => 'Görögország',
'GD' => 'Grenada',
@ -88,24 +88,24 @@ return [
'JM' => 'Jamaika',
'JO' => 'Jordánia',
'JP' => 'Japán',
'KZ' => 'Kazakhsztán',
'KZ' => 'Kazahsztán',
'KE' => 'Kenya',
'KG' => 'Kirgizisztán',
'KH' => 'Kambodzsa',
'KI' => 'Kiribati',
'KN' => 'Saint Kitts és Nevis',
'KR' => 'Dél Korea',
'KW' => 'Kuwait',
'KR' => 'Dél-Korea',
'KW' => 'Kuvait',
'LA' => 'Laosz',
'LB' => 'Libanon',
'LR' => 'Libéria',
'LY' => 'Líbia',
'LC' => 'Saint Lucia',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
'LK' => 'Srí Lanka',
'LS' => 'Lesotho',
'LT' => 'Litvánia',
'LU' => 'Luxembourg',
'LU' => 'Luxemburg',
'LV' => 'Lettország',
'MA' => 'Marokkó',
'MC' => 'Monaco',
@ -127,8 +127,8 @@ return [
'MY' => 'Malajzia',
'NA' => 'Namíbia',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NI' => 'Nikaragua',
'NG' => 'Nigéria',
'NI' => 'Nicaragua',
'NL' => 'Hollandia',
'NO' => 'Norvégia',
'NP' => 'Nepál',
@ -145,10 +145,10 @@ return [
'KP' => 'Észak-Korea',
'PT' => 'Portugália',
'PY' => 'Paraguay',
'QA' => 'Qatar',
'QA' => 'Katar',
'RO' => 'Románia',
'RU' => 'Oroszország',
'RW' => 'Rwanda',
'RW' => 'Ruanda',
'SA' => 'Szaúd-Arábia',
'SD' => 'Szudán',
'SN' => 'Szenegál',
@ -161,16 +161,16 @@ return [
'RS' => 'Szerbia',
'SS' => 'Dél-Szudán',
'ST' => 'São Tomé és Príncipe',
'SR' => 'Szurinám',
'SR' => 'Suriname',
'SK' => 'Szlovákia',
'SI' => 'Szlovénia',
'SE' => 'Svédország',
'SZ' => 'Swaziland',
'SZ' => 'Szváziföld',
'SC' => 'Seychelles-szigetek',
'SY' => 'Szíria',
'TD' => 'Csád',
'TG' => 'Togo',
'TH' => 'Tájföld',
'TH' => 'Thaiföld',
'TJ' => 'Tádzsikisztán',
'TM' => 'Türkmenisztán',
'TL' => 'Timor-Leste',
@ -179,9 +179,9 @@ return [
'TN' => 'Tunézia',
'TR' => 'Törökország',
'TV' => 'Tuvalu',
'TZ' => 'Tanzania',
'TZ' => 'Tanzánia',
'UG' => 'Uganda',
'UA' => 'Ukraina',
'UA' => 'Ukrajna',
'UY' => 'Uruguay',
'US' => 'Egyesült Államok',
'UZ' => 'Üzbegisztán',
@ -191,7 +191,7 @@ return [
'VN' => 'Vietnám',
'VU' => 'Vanuatu',
'WS' => 'Szamoa',
'YE' => 'Yemen',
'YE' => 'Jemen',
'ZA' => 'Dél-Afrikai Köztársaság',
'ZM' => 'Zambia',
'ZW' => 'Zimbabwe',

View file

@ -7,11 +7,11 @@ return [
// Service - Users
'account.emails.team' => '%s Csapat',
'account.emails.verification.title' => 'Fiók megerősítés',
'account.emails.verification.title' => 'Fiók megerősítése',
'account.emails.verification.body' => 'hu.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'Jelszó Visszaállítás',
'account.emails.recovery.title' => 'Jelszó-visszaállítás',
'account.emails.recovery.body' => 'hu.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'Meghívás a %s Csapathoz %s',
'account.emails.invitation.title' => 'Meghívás a %s csapatba %s',
'account.emails.invitation.body' => 'hu.email.auth.invitation.tpl',
'locale.country.unknown' => 'Ismeretlen',

View file

@ -13,7 +13,7 @@ return [
'AT' => 'Austria',
'AZ' => 'Azerbaijan',
'BI' => 'Burundi',
'BE' => 'Belgium',
'BE' => 'Belgia',
'BJ' => 'Benin',
'BF' => 'Burkina Faso',
'BD' => 'Bangladesh',
@ -24,7 +24,7 @@ return [
'BY' => 'Belarus',
'BZ' => 'Belize',
'BO' => 'Bolivia',
'BR' => 'Brazil',
'BR' => 'Brasil',
'BB' => 'Barbados',
'BN' => 'Brunei',
'BT' => 'Bhutan',
@ -36,15 +36,15 @@ return [
'CN' => 'Cina',
'CI' => 'Pantai Gading',
'CM' => 'Kamerun',
'CD' => 'DR Kongo',
'CD' => 'Republik Demokratik Kongo',
'CG' => 'Republik Kongo',
'CO' => 'Kolumbia',
'CO' => 'Kolombia',
'KM' => 'Komoro',
'CV' => 'Tanjung Verde',
'CR' => 'Kosta Rika',
'CU' => 'Kuba',
'CY' => 'Siprus',
'CZ' => 'Czechia',
'CZ' => 'Ceko',
'DE' => 'Jerman',
'DJ' => 'Djibouti',
'DM' => 'Dominika',
@ -86,11 +86,11 @@ return [
'IL' => 'Israel',
'IT' => 'Italia',
'JM' => 'Jamaika',
'JO' => 'Jordan',
'JO' => 'Yordania',
'JP' => 'Jepang',
'KZ' => 'Kazakhstan',
'KE' => 'Kenya',
'KG' => 'Kirgistan',
'KG' => 'Kirgizstan',
'KH' => 'Kamboja',
'KI' => 'Kiribati',
'KN' => 'Saint Kitts dan Nevis',
@ -113,7 +113,7 @@ return [
'MG' => 'Madagaskar',
'MV' => 'Maladewa',
'MX' => 'Meksiko',
'MH' => 'Pulau Marshall',
'MH' => 'Kepulauan Marshall',
'MK' => 'Makedonia',
'ML' => 'Mali',
'MT' => 'Malta',
@ -153,7 +153,7 @@ return [
'SD' => 'Sudan',
'SN' => 'Senegal',
'SG' => 'Singapura',
'SB' => 'Pulau Solomon',
'SB' => 'Kepulauan Solomon',
'SL' => 'Sierra Leone',
'SV' => 'El Salvador',
'SM' => 'San Marino',
@ -165,11 +165,11 @@ return [
'SK' => 'Slovakia',
'SI' => 'Slovenia',
'SE' => 'Swedia',
'SZ' => 'Swaziland',
'SZ' => 'Eswatini',
'SC' => 'Seychelles',
'SY' => 'Suriah',
'TD' => 'Chad',
'TG' => 'Untuk pergi',
'TG' => 'Togo',
'TH' => 'Thailand',
'TJ' => 'Tajikistan',
'TM' => 'Turkmenistan',

View file

@ -86,7 +86,7 @@ return [
'IL' => 'Israele',
'IT' => 'Italia',
'JM' => 'Giamaica',
'JO' => 'Jordan',
'JO' => 'Giordania',
'JP' => 'Giappone',
'KZ' => 'Kazakistan',
'KE' => 'Kenya',

Some files were not shown because too many files have changed in this diff Show more