Compare commits

..
Author SHA1 Message Date
fogelito 472efa55e5 version 2025-04-01 14:58:37 +03:00
fogelito f97dfc8d1b Test bind params PR 2025-04-01 14:55:07 +03:00
30560 changed files with 51663 additions and 859045 deletions
-17
View File
@@ -1,17 +0,0 @@
reviews:
path_filters:
- "!app/config/specs/**"
- "!docs/examples/**"
- "!docs/references/**"
- "!docs/sdks/**"
auto_review:
base_branches:
- main
- 1.6.x
- 1.7.x
- 1.8.x
high_level_summary: false
poem: false
sequence_diagrams: false
collapse_walkthrough: true
changed_files_summary: false
+13 -23
View File
@@ -15,21 +15,14 @@ _APP_SYSTEM_TEAM_EMAIL=team@appwrite.io
_APP_EMAIL_SECURITY=security@appwrite.io
_APP_EMAIL_CERTIFICATES=certificates@appwrite.io
_APP_SYSTEM_RESPONSE_FORMAT=
_APP_CUSTOM_DOMAIN_DENY_LIST=
_APP_OPTIONS_ABUSE=disabled
_APP_OPTIONS_ROUTER_PROTECTION=disabled
_APP_OPTIONS_FORCE_HTTPS=disabled
_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled
_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled
_APP_OPENSSL_KEY_V1=your-secret-key
_APP_DNS=8.8.8.8
_APP_DOMAIN=traefik
_APP_CONSOLE_DOMAIN=localhost
_APP_DOMAIN_FUNCTIONS=functions.localhost
_APP_DOMAIN_SITES=sites.localhost
_APP_DOMAIN_TARGET_CNAME=test.localhost
_APP_DOMAIN_TARGET_A=127.0.0.1
_APP_DOMAIN_TARGET_AAAA=::1
_APP_DOMAIN_TARGET_CAA=digicert.com
_APP_DOMAIN_TARGET=localhost
_APP_RULES_FORMAT=md5
_APP_REDIS_HOST=redis
_APP_REDIS_PORT=6379
@@ -76,29 +69,26 @@ _APP_SMS_FROM=+123456789
_APP_SMS_PROJECTS_DENY_LIST=
_APP_STORAGE_LIMIT=30000000
_APP_STORAGE_PREVIEW_LIMIT=20000000
_APP_COMPUTE_SIZE_LIMIT=30000000
_APP_FUNCTIONS_SIZE_LIMIT=30000000
_APP_FUNCTIONS_TIMEOUT=900
_APP_SITES_TIMEOUT=30
_APP_COMPUTE_BUILD_TIMEOUT=900
_APP_COMPUTE_CPUS=8
_APP_COMPUTE_MEMORY=8192
_APP_COMPUTE_INACTIVE_THRESHOLD=600
_APP_COMPUTE_MAINTENANCE_INTERVAL=600
_APP_COMPUTE_RUNTIMES_NETWORK=runtimes
_APP_FUNCTIONS_BUILD_TIMEOUT=900
_APP_FUNCTIONS_CPUS=8
_APP_FUNCTIONS_MEMORY=8192
_APP_FUNCTIONS_INACTIVE_THRESHOLD=600
_APP_FUNCTIONS_MAINTENANCE_INTERVAL=600
_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes
_APP_EXECUTOR_SECRET=your-secret-key
_APP_EXECUTOR_HOST=http://exc1/v1
_APP_BROWSER_HOST=http://appwrite-browser:3000/v1
_APP_FUNCTIONS_RUNTIMES=node-22
_APP_SITES_RUNTIMES=static-1,node-22
_APP_EXECUTOR_HOST=http://proxy/v1
_APP_FUNCTIONS_RUNTIMES=php-8.0,node-18.0,python-3.9,ruby-3.1
_APP_MAINTENANCE_INTERVAL=86400
_APP_MAINTENANCE_START_TIME=12:00
_APP_MAINTENANCE_DELAY=
_APP_MAINTENANCE_RETENTION_CACHE=2592000
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600
_APP_MAINTENANCE_RETENTION_ABUSE=86400
_APP_MAINTENANCE_RETENTION_AUDIT=1209600
_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800
_APP_USAGE_AGGREGATION_INTERVAL=30
_APP_STATS_RESOURCES_INTERVAL=30
_APP_STATS_RESOURCES_INTERVAL=3600
_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000
_APP_MAINTENANCE_RETENTION_SCHEDULES=86400
_APP_USAGE_STATS=enabled
-2
View File
@@ -5,5 +5,3 @@ src/** linguist-detectable=false
tests/** linguist-detectable=false
public/scripts/** linguist-detectable=false
public/dist/scripts/** linguist-detectable=false
.github/workflows/*.lock.yml linguist-generated=true merge=ours
-83
View File
@@ -1,83 +0,0 @@
# Fixes and upgrades for the Appwrite Auth / Users / Teams services.
"product / auth":
- "(auth|session|login|logout|register|2fa|mfa|users|teams|memberships|invite|oauth|oauth2|sso|jwt)"
# Fixes and upgrades for the Appwrite Realtime API.
"api / realtime":
- "(realtime|subscribe|websockets)"
# Console, UI and UX issues
"product / console":
- "(console)"
# Fixes and upgrades for the Appwrite Storage.
"product / storage":
- "(storage|bucket|file|image|preview|download)"
# Fixes and upgrades for the Appwrite Database.
"product / databases":
- "(database|collection|tables|attribute|column|document|row|query|queries|indexes|search|filter|sort|pagination)"
# Fixes and upgrades for the Appwrite Functions.
"product / functions":
- "(function|runtime|deployment|execution|trigger|cron|schedule)"
# Fixes and upgrades for the Appwrite Docs.
# "product / docs":
# -
# Fixes and upgrades for the Appwrite Migrations.
"product / migrations":
- "(migrate|migration)"
# Fixes and upgrades for the Appwrite Messaging.
"product / messaging":
- "(messaging|email|sms|push|provider|topic|target|notification)"
# Fixes and upgrades for the Appwrite Platform.
# "product / platform":
# -
# Fixes and upgrades for database relationships
"feature / relationships":
- "(relationship)"
# Issues found only on Appwrite Cloud
# "product / cloud":
# -
# Fixes and upgrades for the Appwrite VCS.
"product / vcs":
- "(repo|push|vcs|repository)"
# Fixes and upgrades for the Appwrite GraphQL API.
"api / graphql":
- "(graphql|gql|mutation)"
# Fixes and upgrades for the Appwrite Assistant.
"product / assistant":
- "(assistant)"
# Fixes and upgrades for the Appwrite Domains.
"product / domains":
- "(domain|dns|ssl|certificate)"
# Fixes and upgrades for the Appwrite Locale.
"product / locale":
- "(locale|i18n|internationalization|localization|l10n|translation|timezone|country)"
# Fixes and upgrades for the Appwrite Avatars.
"product / avatars":
- "(avatar|initial|flag|icon)"
# Fixes and upgrades for Appwrite Sites.
"product / sites":
- "(site|web|hosting|domain|ssl|certificate|nextjs|nuxt|react|angular|vue|svelte|astro)"
# Fixes and upgrades for the Appwrite CLI.
"sdk / cli":
- "(cli|command line)"
# Issues only found when self-hosting Appwrite
"product / self-hosted":
- "(self-host|self host)"
-32
View File
@@ -1,32 +0,0 @@
name: AI Moderator
on:
issues:
types: [opened, edited]
issue_comment:
types: [created, edited]
pull_request:
types: [opened, edited]
pull_request_review:
types: [submitted, edited]
pull_request_review_comment:
types: [created, edited]
discussion:
types: [created, edited]
discussion_comment:
types: [created, edited]
permissions:
models: read
issues: write
pull-requests: write
discussions: write
jobs:
moderate:
runs-on: ubuntu-latest
steps:
- name: AI Moderator
uses: github/ai-moderator@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
-22
View File
@@ -1,22 +0,0 @@
name: Auto Label Issue
on:
issues:
types: [opened]
permissions:
issues: write
contents: read
jobs:
labeler:
runs-on: ubuntu-latest
steps:
- name: Issue Labeler
uses: github/issue-labeler@v3.4
with:
configuration-path: .github/labeler.yml
enable-versioned-regex: false
include-title: 1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-121
View File
@@ -1,121 +0,0 @@
name: Benchmark
concurrency:
group: '${{ github.workflow }}-${{ github.ref }}'
cancel-in-progress: true
env:
IMAGE: appwrite-dev
CACHE_KEY: 'appwrite-dev-${{ github.event.pull_request.head.sha }}'
'on':
- pull_request
jobs:
setup:
name: Setup & Build Appwrite Image
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Appwrite
uses: docker/build-push-action@v6
with:
context: .
push: false
tags: '${{ env.IMAGE }}'
load: true
cache-from: type=gha
cache-to: 'type=gha,mode=max'
outputs: 'type=docker,dest=/tmp/${{ env.IMAGE }}.tar'
build-args: |
DEBUG=false
TESTING=true
VERSION=dev
- name: Cache Docker Image
uses: actions/cache@v4
with:
key: '${{ env.CACHE_KEY }}'
path: '/tmp/${{ env.IMAGE }}.tar'
benchmarking:
name: Benchmark
runs-on: ubuntu-latest
needs: setup
permissions:
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache@v4
with:
key: '${{ env.CACHE_KEY }}'
path: '/tmp/${{ env.IMAGE }}.tar'
fail-on-cache-miss: true
- name: Load and Start Appwrite
run: |
sed -i 's/traefik/localhost/g' .env
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose up -d
sleep 10
- name: Install Oha
run: |
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ stable main" | sudo tee /etc/apt/sources.list.d/azlux.list
sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg
sudo apt update
sudo apt install oha
oha --version
- name: Benchmark PR
run: 'oha -z 180s http://localhost/v1/health/version --output-format json > benchmark.json'
- name: Cleaning
run: docker compose down -v
- name: Installing latest version
run: |
rm docker-compose.yml
rm .env
curl https://appwrite.io/install/compose -o docker-compose.yml
curl https://appwrite.io/install/env -o .env
sed -i 's/_APP_OPTIONS_ABUSE=enabled/_APP_OPTIONS_ABUSE=disabled/g' .env
docker compose up -d
sleep 10
- name: Benchmark Latest
run: oha -z 180s http://localhost/v1/health/version --output-format json > benchmark-latest.json
- name: Prepare comment
run: |
echo '## :sparkles: Benchmark results' > benchmark.txt
echo ' ' >> benchmark.txt
echo "- Requests per second: $(jq -r '.summary.requestsPerSec|tonumber?|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json)" >> benchmark.txt
echo "- Requests with 200 status code: $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json)" >> benchmark.txt
echo "- P99 latency: $(jq -r '.latencyPercentiles.p99' benchmark.json )" >> benchmark.txt
echo " " >> benchmark.txt
echo " " >> benchmark.txt
echo "## :zap: Benchmark Comparison" >> benchmark.txt
echo " " >> benchmark.txt
echo "| Metric | This PR | Latest version | " >> benchmark.txt
echo "| --- | --- | --- | " >> benchmark.txt
echo "| RPS | $(jq -r '.summary.requestsPerSec|tonumber?|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json) | $(jq -r '.summary.requestsPerSec|tonumber|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark-latest.json) | " >> benchmark.txt
echo "| 200 | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json) | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark-latest.json) | " >> benchmark.txt
echo "| P99 | $(jq -r '.latencyPercentiles.p99' benchmark.json ) | $(jq -r '.latencyPercentiles.p99' benchmark-latest.json ) | " >> benchmark.txt
- name: Save results
uses: actions/upload-artifact@v4
if: '${{ !cancelled() }}'
with:
name: benchmark.json
path: benchmark.json
retention-days: 7
- name: Find Comment
if: github.event.pull_request.head.repo.full_name == github.repository
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: '${{ github.event.pull_request.number }}'
comment-author: 'github-actions[bot]'
body-includes: Benchmark results
- name: Comment on PR
if: github.event.pull_request.head.repo.full_name == github.repository
uses: peter-evans/create-or-update-comment@v4
with:
comment-id: '${{ steps.fc.outputs.comment-id }}'
issue-number: '${{ github.event.pull_request.number }}'
body-path: benchmark.txt
edit-mode: replace
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v3
- name: Cleanup
run: |
+1 -1
View File
@@ -34,7 +34,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v3
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
File diff suppressed because it is too large Load Diff
-85
View File
@@ -1,85 +0,0 @@
---
on:
schedule:
- cron: '0 0 * * *' # Run daily at midnight UTC
workflow_dispatch: # Enable manual trigger
stop-after: +30d # workflow will no longer trigger after 30 days. Remove this and recompile to run indefinitely
reaction: eyes
permissions: read-all
network: defaults
safe-outputs:
add-labels:
max: 5
add-comment:
tools:
web-fetch:
web-search:
timeout_minutes: 10
source: githubnext/agentics/workflows/issue-triage.md@0837fb7b24c3b84ee77fb7c8cfa8735c48be347a
---
# Agentic Triage
<!-- Note - this file can be customized to your needs. Replace this section directly, or add further instructions here. After editing run 'gh aw compile' -->
You're a triage assistant for GitHub issues. Your task is to analyze issues created in the last 24 hours and perform initial triage tasks for each of them.
1. First, use the `list_issues` tool to retrieve all issues created in the last 24 hours. Filter issues by using the `since` parameter with a timestamp from 24 hours ago (calculate: current time minus 24 hours in ISO 8601 format).
2. For each issue found, perform the following triage tasks:
3. Select appropriate labels for the issue from the provided list.
4. Retrieve the issue content using the `get_issue` tool. If the issue is obviously spam, or generated by bot, or something else that is not an actual issue to be worked on, then add an issue comment to the issue with a one sentence analysis and move to the next issue.
5. Next, use the GitHub tools to gather additional context about the issue:
- Fetch the list of labels available in this repository. Use 'gh label list' bash command to fetch the labels. This will give you the labels you can use for triaging issues.
- Fetch any comments on the issue using the `get_issue_comments` tool
- **Search for duplicate and related issues**: Use the `search_issues` tool to find similar issues by searching for key terms from the issue title and description. Look for both open and closed issues that might be related or duplicates.
6. Analyze the issue content, considering:
- The issue title and description
- The type of issue (bug report, feature request, question, etc.)
- Technical areas mentioned
- Severity or priority indicators
- User impact
- Components affected
7. Write notes, ideas, nudges, resource links, debugging strategies and/or reproduction steps for the team to consider relevant to the issue.
8. Select appropriate labels from the available labels list provided above:
- Choose labels that accurately reflect the issue's nature
- Be specific but comprehensive
- Select priority labels if you can determine urgency (high-priority, med-priority, or low-priority)
- Consider platform labels (android, ios) if applicable
- Search for similar issues, and if you find similar issues consider using a "duplicate" label if appropriate. Only do so if the issue is a duplicate of another OPEN issue.
- Only select labels from the provided list above
- It's okay to not add any labels if none are clearly applicable
9. Apply the selected labels:
- Use the `update_issue` tool to apply the labels to the issue
- DO NOT communicate directly with users
- If no labels are clearly applicable, do not apply any labels
10. Add an issue comment to the issue with your analysis:
- Start with "🎯 Agentic Issue Triage"
- Provide a brief summary of the issue
- **If duplicate or related issues were found**, add a section listing them with links (e.g., "### 🔗 Potentially Related Issues" followed by a bullet list of related issues with their titles and links)
- Mention any relevant details that might help the team understand the issue better
- Include any debugging strategies or reproduction steps if applicable
- Suggest resources or links that might be helpful for resolving the issue or learning skills related to the issue or the particular area of the codebase affected by it
- Mention any nudges or ideas that could help the team in addressing the issue
- If you have possible reproduction steps, include them in the comment
- If you have any debugging strategies, include them in the comment
- If appropriate break the issue down to sub-tasks and write a checklist of things to do.
- Use collapsed-by-default sections in the GitHub markdown to keep the comment tidy. Collapse all sections except the short main summary at the top.
11. After processing all issues, provide a summary of how many issues were triaged. If no issues were created in the last 24 hours, simply note that no new issues needed triage.
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v3
with:
fetch-depth: 2
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v3
with:
fetch-depth: 2
submodules: recursive
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v3
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
+5 -26
View File
@@ -1,46 +1,25 @@
name: "SDK Preview"
name: "Console SDK Preview"
on:
pull_request:
paths:
- 'app/config/specs/*-latest-console.json'
workflow_dispatch:
inputs:
platform:
type: choice
description: "Platform to build"
options:
- client
- server
jobs:
setup:
name: Setup & Build SDK
name: Setup & Build Console SDK
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set SDK type
id: set-sdk
run: |
PLATFORM="${{ github.event.inputs.platform }}"
if [ -z "$PLATFORM" ]; then
PLATFORM="console"
fi
if [ "$PLATFORM" = "server" ]; then
echo "sdk_type=nodejs" >> $GITHUB_OUTPUT
else
echo "sdk_type=web" >> $GITHUB_OUTPUT
fi
echo "platform=$PLATFORM" >> $GITHUB_OUTPUT
- name: Load and Start Appwrite
run: |
docker compose build
docker compose up -d
docker compose exec appwrite sdks --platform=${{ steps.set-sdk.outputs.platform }} --sdk=${{ steps.set-sdk.outputs.sdk_type }} --version=latest --git=no
sudo chown -R $USER:$USER ./app/sdks/${{ steps.set-sdk.outputs.platform }}-${{ steps.set-sdk.outputs.sdk_type }}
docker compose exec appwrite sdks --platform=console --sdk=web --version=latest --git=no
sudo chown -R $USER:$USER ./app/sdks/console-web
- uses: actions/setup-node@v4
with:
-21
View File
@@ -1,21 +0,0 @@
name: "Static code analysis"
on: [pull_request]
jobs:
lint:
name: CodeQL
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Run CodeQL
run: |
docker run --rm -v $PWD:/app composer:2.6 sh -c \
"composer install --profile --ignore-platform-reqs && composer check"
- name: Run Locale check
run: |
docker run --rm -v $PWD:/app node:24-alpine sh -c \
"cd /app/.github/workflows/static-analysis/locale && node index.js"
@@ -1,115 +0,0 @@
/*
* Look into all local files, and collect unique keys.
* Ensure fallback locale (English) has translation for all keys.
* If configured as `const strict = true`, all locales will be checked to include all keys.
*/
import { readdir, readFile } from "fs/promises";
import { join, dirname } from "path";
import { fileURLToPath } from "url";
const config = {
strict: false,
fallbackLocale: "en.json",
};
(async () => {
try {
// Prepare current directory equivalent in ES modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const translationsPath = join(
__dirname,
"../../../../app/config/locale/translations",
);
const files = (await readdir(translationsPath)).filter((file) =>
file.endsWith(".json"),
);
if (files.length === 0) {
console.error("No translation files found in ", translationsPath);
process.exit(1);
}
// Check if fallback locale exists
if (!files.includes(config.fallbackLocale)) {
console.error(`Fallback locale file ${config.fallbackLocale} not found`);
process.exit(1);
}
console.log(
`Found ${files.length} translation files in ${translationsPath}`,
);
// Collect all unique keys from all translation files
const allKeys = new Set();
for (const file of files) {
const filePath = join(translationsPath, file);
const content = await readFile(filePath, "utf8");
const translations = JSON.parse(content);
// Add all keys from this file
Object.keys(translations).forEach((key) => allKeys.add(key));
}
console.log(`Total unique keys found across all locales: ${allKeys.size}`);
const localesToCheck = [];
if (config.strict) {
localesToCheck.push(...files);
} else {
localesToCheck.push(config.fallbackLocale);
}
let errorsCount = 0;
let missingLocaleCount = 0;
for (const localeToCheck of localesToCheck) {
// Read locale
const path = join(translationsPath, localeToCheck);
const content = await readFile(path, "utf8");
const translations = JSON.parse(content);
// Check for missing keys in the locale
const keys = new Set(Object.keys(translations));
console.log(`Keys in locale (${localeToCheck}): ${keys.size}`);
const missingKeys = [];
for (const key of allKeys) {
if (!keys.has(key)) {
missingKeys.push(key);
}
}
if (missingKeys.length > 0) {
console.error(
`\nERROR: Fallback locale (${localeToCheck}) is missing ${missingKeys.length} key(s):`,
);
missingKeys.sort().forEach((key) => {
console.error(` - ${key}`);
});
console.error(
`\nTo fix this issue, add the missing keys to ${translationsPath}/${localeToCheck}`,
);
errorsCount++;
missingLocaleCount += missingKeys.length;
} else {
console.log(
`\nSUCCESS: Fallback locale (${localeToCheck}) contains all ${allKeys.size} keys.`,
);
}
}
if (errorsCount > 0) {
console.log(`\n${missingLocaleCount} locales missing found across ${errorsCount} locales.`);
process.exit(1);
}
} catch (error) {
console.error("Unexpected error.");
console.error(error);
process.exit(1);
}
})();
@@ -1,13 +0,0 @@
{
"name": "static-analysis-locale",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}
+72 -264
View File
@@ -8,15 +8,7 @@ env:
IMAGE: appwrite-dev
CACHE_KEY: appwrite-dev-${{ github.event.pull_request.head.sha }}
on:
pull_request:
workflow_dispatch:
inputs:
response_format:
description: 'Response format version to test (e.g., 1.5.0, 1.4.0)'
required: false
type: string
default: ''
on: [ pull_request ]
jobs:
check_database_changes:
@@ -98,9 +90,6 @@ jobs:
docker compose up -d
sleep 10
- name: Logs
run: docker compose logs appwrite
- name: Doctor
run: docker compose exec -T appwrite doctor
@@ -108,10 +97,7 @@ jobs:
run: docker compose exec -T appwrite vars
- name: Run Unit Tests
run: |
docker compose exec \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/unit
run: docker compose exec appwrite test /usr/src/code/tests/unit
e2e_general_test:
name: E2E General Test
@@ -133,28 +119,9 @@ jobs:
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose up -d
sleep 10
- name: Wait for Open Runtimes
timeout-minutes: 3
run: |
while ! docker compose logs openruntimes-executor | grep -q "Executor is ready."; do
echo "Waiting for Executor to come online"
sleep 1
done
- name: Run General Tests
run: |
docker compose exec -T \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/General --debug
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
run: docker compose exec -T appwrite test /usr/src/code/tests/e2e/General --debug
e2e_service_test:
name: E2E Service Test
@@ -167,8 +134,7 @@ jobs:
Account,
Avatars,
Console,
Databases/Legacy,
Databases/TablesDB,
Databases,
Functions,
FunctionsSchedule,
GraphQL,
@@ -176,10 +142,7 @@ jobs:
Locale,
Projects,
Realtime,
Sites,
Proxy,
Storage,
Tokens,
Teams,
Users,
Webhooks,
@@ -201,18 +164,9 @@ jobs:
- name: Load and Start Appwrite
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
sed -i 's|^_APP_BROWSER_HOST=.*|_APP_BROWSER_HOST=http://invalid-browser/v1|' .env
docker compose up -d
sleep 30
- name: Wait for Open Runtimes
timeout-minutes: 3
run: |
while ! docker compose logs openruntimes-executor | grep -q "Executor is ready."; do
echo "Waiting for Executor to come online"
sleep 1
done
- name: Run ${{ matrix.service }} tests with Project table mode
run: |
echo "Using project tables"
@@ -222,16 +176,7 @@ jobs:
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group devKeys,screenshots
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug
e2e_shared_mode_test:
name: E2E Shared Mode Service Test
@@ -246,8 +191,7 @@ jobs:
Account,
Avatars,
Console,
Databases/Legacy,
Databases/TablesDB,
Databases,
Functions,
FunctionsSchedule,
GraphQL,
@@ -255,16 +199,13 @@ jobs:
Locale,
Projects,
Realtime,
Sites,
Proxy,
Storage,
Teams,
Users,
Webhooks,
VCS,
Messaging,
Migrations,
Tokens
Migrations
]
tables-mode: [
'Shared V1',
@@ -288,14 +229,6 @@ jobs:
docker compose up -d
sleep 30
- name: Wait for Open Runtimes
timeout-minutes: 3
run: |
while ! docker compose logs openruntimes-executor | grep -q "Executor is ready."; do
echo "Waiting for Executor to come online"
sleep 1
done
- name: Run ${{ matrix.service }} tests with ${{ matrix.tables-mode }} table mode
run: |
if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then
@@ -307,215 +240,90 @@ jobs:
export _APP_DATABASE_SHARED_TABLES=database_db_main
export _APP_DATABASE_SHARED_TABLES_V1=
fi
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group devKeys,screenshots
appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
e2e_dev_keys:
name: E2E Service Test (Dev Keys)
benchmarking:
name: Benchmark
runs-on: ubuntu-latest
needs: setup
permissions:
pull-requests: write
steps:
- name: checkout
- name: Checkout repository
uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache@v4
with:
key: ${{ env.CACHE_KEY }}
path: /tmp/${{ env.IMAGE }}.tar
fail-on-cache-miss: true
- name: Load and Start Appwrite
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
sed -i 's/_APP_OPTIONS_ABUSE=disabled/_APP_OPTIONS_ABUSE=enabled/' .env
sed -i 's/traefik/localhost/g' .env
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose up -d
sleep 30
- name: Run Projects tests with dev keys in dedicated table mode
sleep 10
- name: Install Oha
run: |
echo "Using project tables"
export _APP_DATABASE_SHARED_TABLES=
export _APP_DATABASE_SHARED_TABLES_V1=
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=devKeys
- name: Failure Logs
if: failure()
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ stable main" | sudo tee /etc/apt/sources.list.d/azlux.list
sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg
sudo apt update
sudo apt install oha
- name: Benchmark PR
run: oha -z 180s http://localhost/v1/health/version -j > benchmark.json
- name: Cleaning
run: docker compose down -v
- name: Installing latest version
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
e2e_dev_keys_shared_mode:
name: E2E Shared Mode Service Test (Dev Keys)
runs-on: ubuntu-latest
needs: [ setup, check_database_changes ]
if: needs.check_database_changes.outputs.database_changed == 'true'
strategy:
fail-fast: false
matrix:
tables-mode: [
'Shared V1',
'Shared V2',
]
steps:
- name: checkout
uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache@v4
rm docker-compose.yml
rm .env
curl https://appwrite.io/install/compose -o docker-compose.yml
curl https://appwrite.io/install/env -o .env
sed -i 's/_APP_OPTIONS_ABUSE=enabled/_APP_OPTIONS_ABUSE=disabled/g' .env
docker compose up -d
sleep 10
- name: Benchmark Latest
run: oha -z 180s http://localhost/v1/health/version -j > benchmark-latest.json
- name: Prepare comment
run: |
echo '## :sparkles: Benchmark results' > benchmark.txt
echo ' ' >> benchmark.txt
echo "- Requests per second: $(jq -r '.summary.requestsPerSec|tonumber?|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json)" >> benchmark.txt
echo "- Requests with 200 status code: $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json)" >> benchmark.txt
echo "- P99 latency: $(jq -r '.latencyPercentiles.p99' benchmark.json )" >> benchmark.txt
echo " " >> benchmark.txt
echo " " >> benchmark.txt
echo "## :zap: Benchmark Comparison" >> benchmark.txt
echo " " >> benchmark.txt
echo "| Metric | This PR | Latest version | " >> benchmark.txt
echo "| --- | --- | --- | " >> benchmark.txt
echo "| RPS | $(jq -r '.summary.requestsPerSec|tonumber?|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json) | $(jq -r '.summary.requestsPerSec|tonumber|floor|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark-latest.json) | " >> benchmark.txt
echo "| 200 | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json) | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark-latest.json) | " >> benchmark.txt
echo "| P99 | $(jq -r '.latencyPercentiles.p99' benchmark.json ) | $(jq -r '.latencyPercentiles.p99' benchmark-latest.json ) | " >> benchmark.txt
- name: Save results
uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
key: ${{ env.CACHE_KEY }}
path: /tmp/${{ env.IMAGE }}.tar
fail-on-cache-miss: true
- name: Load and Start Appwrite
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
sed -i 's/_APP_OPTIONS_ABUSE=disabled/_APP_OPTIONS_ABUSE=enabled/' .env
docker compose up -d
sleep 30
- name: Run Projects tests with dev keys in ${{ matrix.tables-mode }} table mode
run: |
if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then
echo "Using shared tables V1"
export _APP_DATABASE_SHARED_TABLES=database_db_main
export _APP_DATABASE_SHARED_TABLES_V1=database_db_main
elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then
echo "Using shared tables V2"
export _APP_DATABASE_SHARED_TABLES=database_db_main
export _APP_DATABASE_SHARED_TABLES_V1=
fi
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=devKeys
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
e2e_screenshots_keys:
name: E2E Service Test (Site Screenshots)
runs-on: ubuntu-latest
needs: setup
steps:
- name: checkout
uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache@v4
name: benchmark.json
path: benchmark.json
retention-days: 7
- name: Find Comment
if: github.event.pull_request.head.repo.full_name == github.repository
uses: peter-evans/find-comment@v3
id: fc
with:
key: ${{ env.CACHE_KEY }}
path: /tmp/${{ env.IMAGE }}.tar
fail-on-cache-miss: true
- name: Load and Start Appwrite
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
sed -i 's/_APP_OPTIONS_ABUSE=disabled/_APP_OPTIONS_ABUSE=enabled/' .env
docker compose up -d
sleep 30
- name: Run Site tests with browser connected in dedicated table mode
run: |
echo "Keeping original value of _APP_BROWSER_HOST"
echo "Using project tables"
export _APP_DATABASE_SHARED_TABLES=
export _APP_DATABASE_SHARED_TABLES_V1=
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
e2e_screenshots_shared_mode:
name: E2E Shared Mode Service Test (Site Screenshots)
runs-on: ubuntu-latest
needs: [ setup, check_database_changes ]
if: needs.check_database_changes.outputs.database_changed == 'true'
strategy:
fail-fast: false
matrix:
tables-mode: [
'Shared V1',
'Shared V2',
]
steps:
- name: checkout
uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache@v4
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Benchmark results
- name: Comment on PR
if: github.event.pull_request.head.repo.full_name == github.repository
uses: peter-evans/create-or-update-comment@v4
with:
key: ${{ env.CACHE_KEY }}
path: /tmp/${{ env.IMAGE }}.tar
fail-on-cache-miss: true
- name: Load and Start Appwrite
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
sed -i 's/_APP_OPTIONS_ABUSE=disabled/_APP_OPTIONS_ABUSE=enabled/' .env
docker compose up -d
sleep 30
- name: Run Site tests with browser connected in ${{ matrix.tables-mode }} table mode
run: |
echo "Keeping original value of _APP_BROWSER_HOST"
if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then
echo "Using shared tables V1"
export _APP_DATABASE_SHARED_TABLES=database_db_main
export _APP_DATABASE_SHARED_TABLES_V1=database_db_main
elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then
echo "Using shared tables V2"
export _APP_DATABASE_SHARED_TABLES=database_db_main
export _APP_DATABASE_SHARED_TABLES_V1=
fi
docker compose exec -T \
-e _APP_DATABASE_SHARED_TABLES \
-e _APP_DATABASE_SHARED_TABLES_V1 \
-e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \
appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots
- name: Failure Logs
if: failure()
run: |
echo "=== Appwrite Worker Builds Logs ==="
docker compose logs appwrite-worker-builds
echo "=== OpenRuntimes Executor Logs ==="
docker compose logs openruntimes-executor
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-path: benchmark.txt
edit-mode: replace
+1 -2
View File
@@ -3,7 +3,6 @@
/node_modules/
/tests/resources/storage/
/tests/resources/functions/**/code.tar.gz
/tests/resources/sites/**/code.tar.gz
/app/sdks/*
/.idea/
!/.idea/workspace.xml
@@ -16,5 +15,5 @@ app/sdks
dev/yasd_init.php
.phpunit.result.cache
Makefile
appwrite.config.json
appwrite.json
/.zed/
+8 -1
View File
@@ -7,7 +7,6 @@ tasks:
docker pull composer
command: |
docker run --rm --interactive --tty \
--user "$(id -u):$(id -g)" \
--volume $PWD:/app \
composer install \
--ignore-platform-reqs \
@@ -24,3 +23,11 @@ vscode:
extensions:
- ms-azuretools.vscode-docker
- zobo.php-intellisense
github:
# https://www.gitpod.io/docs/prebuilds#github-specific-configuration
prebuilds:
# enable for pull requests coming from forks (defaults to false)
pullRequestsFromForks: true
# add a check to pull requests (defaults to true)
addCheck: false
-652
View File
@@ -1,655 +1,3 @@
# Version 1.8.0
## What's Changed
### Notable changes
* Do not allow full range in [#9847](https://github.com/appwrite/appwrite/pull/9847)
* Expose internal id as a part of auto increment id in [#9713](https://github.com/appwrite/appwrite/pull/9713)
* Expose sequence in [#9870](https://github.com/appwrite/appwrite/pull/9870)
* Add flutter 3.32 and dart 3.8 runtimes in [#9914](https://github.com/appwrite/appwrite/pull/9914)
* Shorten commit url and branch url in [#9919](https://github.com/appwrite/appwrite/pull/9919)
* Remove powered by from error pages in [#9927](https://github.com/appwrite/appwrite/pull/9927)
* Enable resource limits on GIF previews in [#9940](https://github.com/appwrite/appwrite/pull/9940)
* Only run maintenance task for projects accessed in last 24 hours in [#9989](https://github.com/appwrite/appwrite/pull/9989)
* Add increment + decrement routes in [#9986](https://github.com/appwrite/appwrite/pull/9986)
* Only run maintenance task for projects accessed in last 30 days in [#9995](https://github.com/appwrite/appwrite/pull/9995)
* Update appwrite-assistant image version to 0.8.3 in [#10003](https://github.com/appwrite/appwrite/pull/10003)
* Update emails to use button in [#9590](https://github.com/appwrite/appwrite/pull/9590)
* Create commit & branch url for first git deployment when site is linked to repo in [#9969](https://github.com/appwrite/appwrite/pull/9969)
* Handle React Native schemes in [#9650](https://github.com/appwrite/appwrite/pull/9650)
* Handle origin validation for web extensions in [#10107](https://github.com/appwrite/appwrite/pull/10107)
* Preview text for emails in [#10198](https://github.com/appwrite/appwrite/pull/10198)
* Create email target when using email OTP registration in [#10224](https://github.com/appwrite/appwrite/pull/10224)
* Add CSV imports in [#10231](https://github.com/appwrite/appwrite/pull/10231)
* Add support for svg favicons in [#10255](https://github.com/appwrite/appwrite/pull/10255)
* Realtime support for bulk api in [#10096](https://github.com/appwrite/appwrite/pull/10096)
* Skip redundant subqueries in users list route in [#10297](https://github.com/appwrite/appwrite/pull/10297)
* Add native sign in with Apple function template in [#10286](https://github.com/appwrite/appwrite/pull/10286)
* Add support for HEAD requests in [#10304](https://github.com/appwrite/appwrite/pull/10304)
* Update invite email copy in [#10309](https://github.com/appwrite/appwrite/pull/10309)
* Increase dynamic API key expiration in [#10328](https://github.com/appwrite/appwrite/pull/10328)
* Add TablesDB service in [#10333](https://github.com/appwrite/appwrite/pull/10333)
* Add execution.deploymentId to response model in [#10357](https://github.com/appwrite/appwrite/pull/10357)
* Switch Union China Pay to just Union Pay in [#10372](https://github.com/appwrite/appwrite/pull/10372) and [#10382](https://github.com/appwrite/appwrite/pull/10382)
* Add execution id and log id to response headers in [#10379](https://github.com/appwrite/appwrite/pull/10379)
* Add executionId and client IP to function headers in [#9147](https://github.com/appwrite/appwrite/pull/9147)
* Allow HEAD requests in function executions in [#10385](https://github.com/appwrite/appwrite/pull/10385)
* Add support for select queries when listing deployments in [#10380](https://github.com/appwrite/appwrite/pull/10380)
* Add spatial type attributes in [#10356](https://github.com/appwrite/appwrite/pull/10356) and [#10443](https://github.com/appwrite/appwrite/pull/10443)
* Add realtime support for bulk upserts in [#10425](https://github.com/appwrite/appwrite/pull/10425)
* Add previewUrl to vcs comment from vcs controller in [#10396](https://github.com/appwrite/appwrite/pull/10396)
* Rename verification SDK methods to be more specific in [#10606](https://github.com/appwrite/appwrite/pull/10606)
* Add project name in email subject in [#10609](https://github.com/appwrite/appwrite/pull/10609)
* Throw error when email is not available for account verification in [#10533](https://github.com/appwrite/appwrite/pull/10533)
* Add support for transactions in [#10023](https://github.com/appwrite/appwrite/pull/10023) and [#10624](https://github.com/appwrite/appwrite/pull/10624)
* Use bcc only emails for smtp in [#10644](https://github.com/appwrite/appwrite/pull/10644)
### Fixes
* Fix rules on active deployment in [#9902](https://github.com/appwrite/appwrite/pull/9902)
* Fix for upserts with differing optional parameter sets in [#9928](https://github.com/appwrite/appwrite/pull/9928)
* Fix teams deletion in [#9888](https://github.com/appwrite/appwrite/pull/9888)
* Fix deletion logic in [#9938](https://github.com/appwrite/appwrite/pull/9938)
* Update database for upsert fix in [#9941](https://github.com/appwrite/appwrite/pull/9941)
* Fix expire format in account recovery, verification, phone and mfa in [#9600](https://github.com/appwrite/appwrite/pull/9600)
* Fix github comments and deployment creation on branch deletion in [#9949](https://github.com/appwrite/appwrite/pull/9949)
* Fix cache issues with proxy for deployment download in [#9971](https://github.com/appwrite/appwrite/pull/9971)
* Redirect rule parent resource in [#9982](https://github.com/appwrite/appwrite/pull/9982)
* Fix usage queues in [#9946](https://github.com/appwrite/appwrite/pull/9946)
* Transfer control for the migration in [#9997](https://github.com/appwrite/appwrite/pull/9997)
* Prevent 'Attribute "factors" must be an array' error in [#10004](https://github.com/appwrite/appwrite/pull/10004)
* Fix all vcs urls missing region in [#9998](https://github.com/appwrite/appwrite/pull/9998)
* Add readable error for csv imports in [#9947](https://github.com/appwrite/appwrite/pull/9947)
* Fix missing screenshot logs in [#10024](https://github.com/appwrite/appwrite/pull/10024)
* Update executor to fix s3 endpoint bug in [#10036](https://github.com/appwrite/appwrite/pull/10036)
* Fix build duration calculation in [#10053](https://github.com/appwrite/appwrite/pull/10053)
* Fix logs order in [#10052](https://github.com/appwrite/appwrite/pull/10052)
* Fix platform check for Sites with automatic rule in [#10043](https://github.com/appwrite/appwrite/pull/10043)
* Increase cache ttl to ensure hits in [#10079](https://github.com/appwrite/appwrite/pull/10079)
* Fix connect to existing repo flow in [#10034](https://github.com/appwrite/appwrite/pull/10034)
* Fix migrations path and type in [#10090](https://github.com/appwrite/appwrite/pull/10090)
* Fix JWT authentication database selection for admin mode in [#10098](https://github.com/appwrite/appwrite/pull/10098)
* Use _APP_CONSOLE_DOMAIN, if not found, then use _APP_DOMAIN in [#9999](https://github.com/appwrite/appwrite/pull/9999)
* Fix file tokens not working on file-security in [#10120](https://github.com/appwrite/appwrite/pull/10120)
* Fix build activation race condition in [#9952](https://github.com/appwrite/appwrite/pull/9952)
* Changed the default permission param of upsert document in [#10129](https://github.com/appwrite/appwrite/pull/10129)
* Fix success validation in oauth2 redirect in [#10130](https://github.com/appwrite/appwrite/pull/10130)
* Update OAuth2 redirect URLs in [#10119](https://github.com/appwrite/appwrite/pull/10119)
* Fix specs with new env vars in [#10135](https://github.com/appwrite/appwrite/pull/10135)
* Skip deployment when commit is created by us in [#10187](https://github.com/appwrite/appwrite/pull/10187)
* Use direct source for file-preview when empty in [#10181](https://github.com/appwrite/appwrite/pull/10181)
* Better error message for invalid function scheduled time in [#10201](https://github.com/appwrite/appwrite/pull/10201)
* Add defaultBranch in getRepository response in [#10190](https://github.com/appwrite/appwrite/pull/10190)
* Filter sequence to int because any models skip rule checks in [#10221](https://github.com/appwrite/appwrite/pull/10221)
* Fix 500 errors on robots and humans txt files in [#10248](https://github.com/appwrite/appwrite/pull/10248)
* Fix atomic number ops with limit 0 in [#10264](https://github.com/appwrite/appwrite/pull/10264)
* Update build command for flutter in [#10288](https://github.com/appwrite/appwrite/pull/10288)
* Add a fallback locale in [#10307](https://github.com/appwrite/appwrite/pull/10307)
* Fix variables sharing across resources in [#10308](https://github.com/appwrite/appwrite/pull/10308)
* Fix uncaught invalid arg in [#10318](https://github.com/appwrite/appwrite/pull/10318)
* Add missing upsert event in [#10317](https://github.com/appwrite/appwrite/pull/10317)
* Improve font reliability in [#10332](https://github.com/appwrite/appwrite/pull/10332)
* Truncate logs in function worker in [#9773](https://github.com/appwrite/appwrite/pull/9773)
* Fix event template configuration issues in [#10350](https://github.com/appwrite/appwrite/pull/10350)
* Fix users events & missed publisher logic for Functions in [#10348](https://github.com/appwrite/appwrite/pull/10348)
* Fix incorrect file token expiry in [#10329](https://github.com/appwrite/appwrite/pull/10329)
* Fix upserting that makes no change in [#10363](https://github.com/appwrite/appwrite/pull/10363) and [#10364](https://github.com/appwrite/appwrite/pull/10364)
* Fix domain validator in [#10374](https://github.com/appwrite/appwrite/pull/10374)
* Apply sequence integer casting and attribute cleanup fixes to Row model, TablesDB tests, and document processing in [#10383](https://github.com/appwrite/appwrite/pull/10383)
* Fix domain validator in [#10386](https://github.com/appwrite/appwrite/pull/10386)
* Fix sequence removal in [#10388](https://github.com/appwrite/appwrite/pull/10388)
* Fix TablesDB scopes in [#10387](https://github.com/appwrite/appwrite/pull/10387)
* Fix request filter in [#10389](https://github.com/appwrite/appwrite/pull/10389)
* Fix nested filter selects in [#10393](https://github.com/appwrite/appwrite/pull/10393)
* Fix readonly attr stripping on write in [#10405](https://github.com/appwrite/appwrite/pull/10405)
* Replace %s with mustache placeholder in [#10392](https://github.com/appwrite/appwrite/pull/10392)
* Support array headers for set-cookie in [#10427](https://github.com/appwrite/appwrite/pull/10427)
* Fix put prefs structure validation in [#10436](https://github.com/appwrite/appwrite/pull/10436)
* Fix oauth identity check in [#10460](https://github.com/appwrite/appwrite/pull/10460)
* Fix check in [#10489](https://github.com/appwrite/appwrite/pull/10489)
* Fix database usage metrics in [#10483](https://github.com/appwrite/appwrite/pull/10483)
* Throw appropriate 400s from request filters in [#10502](https://github.com/appwrite/appwrite/pull/10502)
* Catch query exception on bucket/file list in [#10505](https://github.com/appwrite/appwrite/pull/10505)
* Use outputDirectory attribute from deployment in [#10571](https://github.com/appwrite/appwrite/pull/10571)
* Fix buildOutput attribute name in deployment check in [#10572](https://github.com/appwrite/appwrite/pull/10572)
* Update database for nested selection fix in [#10577](https://github.com/appwrite/appwrite/pull/10577)
* Auto-allow sites domain for OAuth in [#10503](https://github.com/appwrite/appwrite/pull/10503)
* Handle OIDC well-known endpoint errors in [#10589](https://github.com/appwrite/appwrite/pull/10589)
* Correct invalid template links in Create temporary deployment endpoint in [#10581](https://github.com/appwrite/appwrite/pull/10581)
* Update broken create table links in TablesDB docs in [#10592](https://github.com/appwrite/appwrite/pull/10592)
* Fix cross API compatibility in [#10626](https://github.com/appwrite/appwrite/pull/10626)
* Fix code 0 from databases on realtime in [#10631](https://github.com/appwrite/appwrite/pull/10631)
* Throw duplicate error when function id already exists in [#10618](https://github.com/appwrite/appwrite/pull/10618)
### Miscellaneous
* Fix task coroutine hooks in [#9850](https://github.com/appwrite/appwrite/pull/9850)
* Feat sync encrypt updates in [#9871](https://github.com/appwrite/appwrite/pull/9871)
* Revert "Feat sync encrypt updates" in [#9877](https://github.com/appwrite/appwrite/pull/9877)
* Add builds worker group in [#9872](https://github.com/appwrite/appwrite/pull/9872)
* Revert encrypted attribute changes in [#9898](https://github.com/appwrite/appwrite/pull/9898)
* Update sdk generator and sdks in [#9849](https://github.com/appwrite/appwrite/pull/9849)
* Release cli in [#9900](https://github.com/appwrite/appwrite/pull/9900)
* Improve how rules are fetched in [#9915](https://github.com/appwrite/appwrite/pull/9915)
* Sync 1.6 in [#9920](https://github.com/appwrite/appwrite/pull/9920)
* Update messaging library in [#9764](https://github.com/appwrite/appwrite/pull/9764)
* Disable TCP hook on stats resources in [#9932](https://github.com/appwrite/appwrite/pull/9932)
* Remove JSON index on roles due to MySQL bug in [#9924](https://github.com/appwrite/appwrite/pull/9924)
* Update queue in [#9936](https://github.com/appwrite/appwrite/pull/9936)
* Fix flaky account tests in [#9954](https://github.com/appwrite/appwrite/pull/9954)
* Fix flaky messaging test in [#9957](https://github.com/appwrite/appwrite/pull/9957)
* Make usage tests robust in [#9956](https://github.com/appwrite/appwrite/pull/9956)
* Increase deployment timeouts in tests in [#9955](https://github.com/appwrite/appwrite/pull/9955)
* Graceful shutdown on SIGTERM in [#9890](https://github.com/appwrite/appwrite/pull/9890)
* Bring back telemetry for storage in [#9903](https://github.com/appwrite/appwrite/pull/9903)
* Update version to 1.7.4 and add experimental warnings in [#9959](https://github.com/appwrite/appwrite/pull/9959)
* Return queue pre-fetch results in [#9731](https://github.com/appwrite/appwrite/pull/9731)
* Update SDK versions in [#9987](https://github.com/appwrite/appwrite/pull/9987)
* Restore unique filename for health check #9842 in [#9993](https://github.com/appwrite/appwrite/pull/9993)
* Add after build hook in [#9996](https://github.com/appwrite/appwrite/pull/9996)
* Remove endpoint selector in [#10000](https://github.com/appwrite/appwrite/pull/10000)
* Use static code instead of astro in tests in [#9966](https://github.com/appwrite/appwrite/pull/9966)
* Add ref param to vcs list contents in [#9991](https://github.com/appwrite/appwrite/pull/9991)
* Update coderabbit config file in [#10005](https://github.com/appwrite/appwrite/pull/10005)
* TAR support in [#10016](https://github.com/appwrite/appwrite/pull/10016)
* Update delete project scope in [#10017](https://github.com/appwrite/appwrite/pull/10017)
* Lazy-load relationships in [#9669](https://github.com/appwrite/appwrite/pull/9669)
* Revert "Feat: Lazy-load relationships" in [#10018](https://github.com/appwrite/appwrite/pull/10018)
* Revert "Update delete project scope" in [#10022](https://github.com/appwrite/appwrite/pull/10022)
* 1.8.x in [#9985](https://github.com/appwrite/appwrite/pull/9985)
* Update cli version and add bulk operation warnings in [#10007](https://github.com/appwrite/appwrite/pull/10007)
* Update Appwrite description to include Sites, add MCP to products list in [#9867](https://github.com/appwrite/appwrite/pull/9867)
* Update README.md in [#10026](https://github.com/appwrite/appwrite/pull/10026)
* Fix duplication of platforms in swagger specs in [#10008](https://github.com/appwrite/appwrite/pull/10008)
* Update react native sdk and changelog in [#10025](https://github.com/appwrite/appwrite/pull/10025)
* Update delete project signature in [#10028](https://github.com/appwrite/appwrite/pull/10028)
* Fix Golang SDK examples for docs in [#10001](https://github.com/appwrite/appwrite/pull/10001)
* Revert "worker: Graceful shutdown on SIGTERM" in [#10035](https://github.com/appwrite/appwrite/pull/10035)
* Fix benchmark CI in [#10055](https://github.com/appwrite/appwrite/pull/10055)
* Use ->action(...)) instead of ->callback([$this, 'action']); in [#9967](https://github.com/appwrite/appwrite/pull/9967)
* Override project via custom domains log in [#10011](https://github.com/appwrite/appwrite/pull/10011)
* Add database worker job logging in [#10056](https://github.com/appwrite/appwrite/pull/10056)
* Add runtimeEntrypoint param in [#10062](https://github.com/appwrite/appwrite/pull/10062)
* Add missing injections in [#10061](https://github.com/appwrite/appwrite/pull/10061)
* Replace Console loop with Swoole Timer for stats resource m… in [#10054](https://github.com/appwrite/appwrite/pull/10054)
* Update README.md in [#10063](https://github.com/appwrite/appwrite/pull/10063)
* Fix parameter order in action function for robots.txt route in [#10067](https://github.com/appwrite/appwrite/pull/10067)
* Preview endpoint logging in [#10068](https://github.com/appwrite/appwrite/pull/10068)
* Fix flakyness of account tests in [#10066](https://github.com/appwrite/appwrite/pull/10066)
* Update cli to 8.1.0 and add changelog in [#10070](https://github.com/appwrite/appwrite/pull/10070)
* Update composer.json and composer.lock to include appwrite-lab… in [#10051](https://github.com/appwrite/appwrite/pull/10051)
* Fix tests, for `Cloud` in [#10085](https://github.com/appwrite/appwrite/pull/10085)
* Update README.md in [#10084](https://github.com/appwrite/appwrite/pull/10084)
* Revert "chore: update composer.json and composer.lock to include appwrite-lab…" in [#10086](https://github.com/appwrite/appwrite/pull/10086)
* Update README to add Bulk API link in [#10095](https://github.com/appwrite/appwrite/pull/10095)
* Add redis publisher to schedule base if available in [#10099](https://github.com/appwrite/appwrite/pull/10099)
* Fix site template test in [#10104](https://github.com/appwrite/appwrite/pull/10104)
* Update nodejs 17.1.0 in [#10088](https://github.com/appwrite/appwrite/pull/10088)
* Update README.md to add Upsert announcement in [#10112](https://github.com/appwrite/appwrite/pull/10112)
* Reduce delete batch size in [#10128](https://github.com/appwrite/appwrite/pull/10128)
* Update README.md in [#10134](https://github.com/appwrite/appwrite/pull/10134)
* Speed up tests in [#10127](https://github.com/appwrite/appwrite/pull/10127)
* Update cli to 8.2.0 in [#10136](https://github.com/appwrite/appwrite/pull/10136)
* Prevent injected $user from being shadowed in [#10150](https://github.com/appwrite/appwrite/pull/10150)
* Update react native to 0.10.1 and dotnet to 0.14.0 in [#10138](https://github.com/appwrite/appwrite/pull/10138)
* Update README.md in [#10153](https://github.com/appwrite/appwrite/pull/10153)
* Update cli 8.2.1 in [#10155](https://github.com/appwrite/appwrite/pull/10155)
* Fix build usage specification in [#10157](https://github.com/appwrite/appwrite/pull/10157)
* Handle redirect validator in specs + GraphQL type mapper in [#10158](https://github.com/appwrite/appwrite/pull/10158)
* Update dart 16.1.0, flutter 17.0.2 and cli 8.2.2 in [#10161](https://github.com/appwrite/appwrite/pull/10161)
* Improve invalid scheme error in origin check in [#10164](https://github.com/appwrite/appwrite/pull/10164)
* 1.7.x in [#9897](https://github.com/appwrite/appwrite/pull/9897)
* Added the cases of null permissions in the upsert route and update th… in [#10179](https://github.com/appwrite/appwrite/pull/10179)
* Fix 1.7.x specs in [#10197](https://github.com/appwrite/appwrite/pull/10197)
* Suppress git-action exception in deployment worker in [#10199](https://github.com/appwrite/appwrite/pull/10199)
* Stats-usage on redis in [#10156](https://github.com/appwrite/appwrite/pull/10156)
* Fix templates on `1.7.x`. in [#10203](https://github.com/appwrite/appwrite/pull/10203)
* Change preview & body for MFA email in [#10205](https://github.com/appwrite/appwrite/pull/10205)
* Add docs for nestedType, encode, from and toMap in [#10204](https://github.com/appwrite/appwrite/pull/10204)
* Update sdks 1.7.x in [#10202](https://github.com/appwrite/appwrite/pull/10202)
* Update migration release in [#10222](https://github.com/appwrite/appwrite/pull/10222)
* Remove sequence on incoming docs in [#10228](https://github.com/appwrite/appwrite/pull/10228)
* Filter certificates renewal task in maintenance by region in [#10227](https://github.com/appwrite/appwrite/pull/10227)
* Move changelog to sdks platforms array in [#10233](https://github.com/appwrite/appwrite/pull/10233)
* Update changelog and sdk gen in [#10247](https://github.com/appwrite/appwrite/pull/10247)
* Telemetry for cache hits and misses in [#10240](https://github.com/appwrite/appwrite/pull/10240)
* Add model examples + additonal examples to specs in [#10249](https://github.com/appwrite/appwrite/pull/10249)
* Update favicons endpoint to fallback to ico instead of throwing error in [#10260](https://github.com/appwrite/appwrite/pull/10260)
* Update README.md in [#10259](https://github.com/appwrite/appwrite/pull/10259)
* Check CAA record before issuing certificate in [#10258](https://github.com/appwrite/appwrite/pull/10258)
* Revert "Check CAA record before issuing certificate" in [#10263](https://github.com/appwrite/appwrite/pull/10263)
* Test var id attribute in [#10243](https://github.com/appwrite/appwrite/pull/10243)
* Add type attribute to the database creation flow in [#10266](https://github.com/appwrite/appwrite/pull/10266)
* Add CAA validator in [#10267](https://github.com/appwrite/appwrite/pull/10267)
* Update database type to grids and legacy in [#10273](https://github.com/appwrite/appwrite/pull/10273)
* Update README.md in [#10272](https://github.com/appwrite/appwrite/pull/10272)
* Upgrade composer for utopia migration in [#10274](https://github.com/appwrite/appwrite/pull/10274)
* Update SDK generator and sdks in [#10271](https://github.com/appwrite/appwrite/pull/10271)
* Fix wrong resource path for audits in [#10279](https://github.com/appwrite/appwrite/pull/10279)
* Update `grid` on resource events in [#10282](https://github.com/appwrite/appwrite/pull/10282)
* Add readonly param to sequence, databaseId and collectionId in [#10278](https://github.com/appwrite/appwrite/pull/10278)
* Update migrations in [#10283](https://github.com/appwrite/appwrite/pull/10283)
* Add placeholder detection in [#10284](https://github.com/appwrite/appwrite/pull/10284)
* Update docker base to 0.10.3 in [#10285](https://github.com/appwrite/appwrite/pull/10285)
* Make check for adding warning header stricter in [#10293](https://github.com/appwrite/appwrite/pull/10293)
* Fix databases worker cache clearing bug in [#10294](https://github.com/appwrite/appwrite/pull/10294)
* Reapply Redis functions queue in [#10299](https://github.com/appwrite/appwrite/pull/10299)
* Add new database query type tests in [#10296](https://github.com/appwrite/appwrite/pull/10296)
* Update package in [#10312](https://github.com/appwrite/appwrite/pull/10312)
* Update required attributes in [#10311](https://github.com/appwrite/appwrite/pull/10311)
* Remove experiment warnings from bulk methods in [#10310](https://github.com/appwrite/appwrite/pull/10310)
* Update README.md in [#10313](https://github.com/appwrite/appwrite/pull/10313)
* Added internal file param to handle upload to internal bucket in [#10321](https://github.com/appwrite/appwrite/pull/10321)
* Remove temp logging in [#10302](https://github.com/appwrite/appwrite/pull/10302)
* Improve sites test for stability in [#10331](https://github.com/appwrite/appwrite/pull/10331)
* Database lib bump to 0.71.15 in [#10336](https://github.com/appwrite/appwrite/pull/10336)
* Clarify userId param in endpoints that create accounts in [#10117](https://github.com/appwrite/appwrite/pull/10117)
* Upgrade HTTP in [#10338](https://github.com/appwrite/appwrite/pull/10338)
* Remove unnessessary external dependnecies in [#10343](https://github.com/appwrite/appwrite/pull/10343)
* Sync main into 1.7.x in [#10347](https://github.com/appwrite/appwrite/pull/10347)
* Fix TablesDB casing in [#10346](https://github.com/appwrite/appwrite/pull/10346)
* Add cookies test in [#10352](https://github.com/appwrite/appwrite/pull/10352)
* Update token tests with jwt decode in [#10354](https://github.com/appwrite/appwrite/pull/10354)
* Utilize assets server for fonts in [#10358](https://github.com/appwrite/appwrite/pull/10358)
* Sync main into 1.7.x in [#10359](https://github.com/appwrite/appwrite/pull/10359)
* Bump 1.7.x in [#10365](https://github.com/appwrite/appwrite/pull/10365)
* Fix queue health in [#10369](https://github.com/appwrite/appwrite/pull/10369)
* Allow publisher messaging override in scheduler in [#10370](https://github.com/appwrite/appwrite/pull/10370)
* Add replacewith and deprecated since to account methods in [#10377](https://github.com/appwrite/appwrite/pull/10377)
* Update README.md in [#10376](https://github.com/appwrite/appwrite/pull/10376)
* Update CLI in [#10390](https://github.com/appwrite/appwrite/pull/10390)
* Update default method in description in [#10391](https://github.com/appwrite/appwrite/pull/10391)
* Rename namespace from tables-db to tablesdb in specs in [#10395](https://github.com/appwrite/appwrite/pull/10395)
* Update tables group in specs in [#10394](https://github.com/appwrite/appwrite/pull/10394)
* Update description for upsert methods in [#10397](https://github.com/appwrite/appwrite/pull/10397)
* Update README.md in [#10401](https://github.com/appwrite/appwrite/pull/10401)
* Added handling of database resources after migration in [#10400](https://github.com/appwrite/appwrite/pull/10400)
* Revert "Added handling of database resources after migration" in [#10406](https://github.com/appwrite/appwrite/pull/10406)
* Remove sdk deprecation warnings in [#10408](https://github.com/appwrite/appwrite/pull/10408)
* Mark Row response model's param with readonly in [#10409](https://github.com/appwrite/appwrite/pull/10409)
* Update exception thrown when svg sanitization fails in [#10416](https://github.com/appwrite/appwrite/pull/10416)
* Fix allow null params in [#10417](https://github.com/appwrite/appwrite/pull/10417)
* Allow running tests with specific response format in [#10418](https://github.com/appwrite/appwrite/pull/10418)
* Make webhooks publisher overridable in [#10419](https://github.com/appwrite/appwrite/pull/10419)
* Check audits logs in [#10414](https://github.com/appwrite/appwrite/pull/10414)
* Remove direct publisher calls in [#10420](https://github.com/appwrite/appwrite/pull/10420)
* removed spatial type response and will be using the json type for the… in [#10433](https://github.com/appwrite/appwrite/pull/10433)
* Add tests for new time helpers in [#10437](https://github.com/appwrite/appwrite/pull/10437)
* Move projects.list() to module in [#10441](https://github.com/appwrite/appwrite/pull/10441)
* Update cli to 9.1.0 in [#10442](https://github.com/appwrite/appwrite/pull/10442)
* Add requestBody param examples in specs in [#10431](https://github.com/appwrite/appwrite/pull/10431)
* Fix mysql tests in [#10445](https://github.com/appwrite/appwrite/pull/10445)
* Upgrade platform lib to have older queue lib in [#10447](https://github.com/appwrite/appwrite/pull/10447)
* Fix router compression in [#10452](https://github.com/appwrite/appwrite/pull/10452)
* Upgrade http lib for backwards compatible default param in [#10455](https://github.com/appwrite/appwrite/pull/10455)
* Update examples in [#10444](https://github.com/appwrite/appwrite/pull/10444)
* Automatic pr creation in sdk release script in [#10457](https://github.com/appwrite/appwrite/pull/10457)
* Remove avatars command from cli in [#10454](https://github.com/appwrite/appwrite/pull/10454)
* Remove deno from platforms array in [#10453](https://github.com/appwrite/appwrite/pull/10453)
* Spatial type attributes sdk updates in [#10463](https://github.com/appwrite/appwrite/pull/10463)
* Stats resources try catch in [#10469](https://github.com/appwrite/appwrite/pull/10469)
* Move proxy endpoints to modules in [#10470](https://github.com/appwrite/appwrite/pull/10470)
* Add certificate validation override in [#10471](https://github.com/appwrite/appwrite/pull/10471)
* Generate SDKs in [#10475](https://github.com/appwrite/appwrite/pull/10475)
* Spatial test tablesdb updates in [#10473](https://github.com/appwrite/appwrite/pull/10473)
* Add colors to certificate logs in [#10438](https://github.com/appwrite/appwrite/pull/10438)
* appwrite db bump in [#10479](https://github.com/appwrite/appwrite/pull/10479)
* Bump database in [#10480](https://github.com/appwrite/appwrite/pull/10480)
* Health db queues in [#10482](https://github.com/appwrite/appwrite/pull/10482)
* Attempt small size for website dependency in [#10485](https://github.com/appwrite/appwrite/pull/10485)
* Worker stop in [#10498](https://github.com/appwrite/appwrite/pull/10498)
* Update database in [#10506](https://github.com/appwrite/appwrite/pull/10506)
* Stats resources and usage sorting by unique field in [#10472](https://github.com/appwrite/appwrite/pull/10472)
* Add spatial column validation during required mode and tests for exis… in [#10509](https://github.com/appwrite/appwrite/pull/10509)
* Sub query variables order by in [#10513](https://github.com/appwrite/appwrite/pull/10513)
* Update README.md in [#10514](https://github.com/appwrite/appwrite/pull/10514)
* bump database 1.5.0 in [#10515](https://github.com/appwrite/appwrite/pull/10515)
* Don't remove required attributes in [#10516](https://github.com/appwrite/appwrite/pull/10516)
* Catch query exception on bulk update/delete in [#10517](https://github.com/appwrite/appwrite/pull/10517)
* Update cli to 10.0.0 in [#10511](https://github.com/appwrite/appwrite/pull/10511)
* Add type_enum support and update docs in [#10496](https://github.com/appwrite/appwrite/pull/10496)
* Improve code readability for schedules in [#10522](https://github.com/appwrite/appwrite/pull/10522)
* Include response model enum names in [#10538](https://github.com/appwrite/appwrite/pull/10538)
* SDK releases in [#10539](https://github.com/appwrite/appwrite/pull/10539)
* Fix health status enum in [#10540](https://github.com/appwrite/appwrite/pull/10540)
* Update afterbuild fn in [#10541](https://github.com/appwrite/appwrite/pull/10541)
* Update afterbuild to also pass adapter in [#10545](https://github.com/appwrite/appwrite/pull/10545)
* Update `z-index` to be the highest in [#9874](https://github.com/appwrite/appwrite/pull/9874)
* Update framework lib to 0.33.28 in [#10551](https://github.com/appwrite/appwrite/pull/10551)
* Fix enum typing for platform in specs in [#10553](https://github.com/appwrite/appwrite/pull/10553)
* Add enums for database type and column status in [#10561](https://github.com/appwrite/appwrite/pull/10561)
* Fix activities in [#10586](https://github.com/appwrite/appwrite/pull/10586)
* Fix logs truncation tests in [#10585](https://github.com/appwrite/appwrite/pull/10585)
* Remove related data in realtime payload in [#10590](https://github.com/appwrite/appwrite/pull/10590)
* Update composer dependencies in [#10601](https://github.com/appwrite/appwrite/pull/10601)
* Update sdks add response models in [#10554](https://github.com/appwrite/appwrite/pull/10554)
* Sanitize 5xx errors on realtime in [#10598](https://github.com/appwrite/appwrite/pull/10598)
* Update database in [#10596](https://github.com/appwrite/appwrite/pull/10596)
* Add both collection and table id in the realtime in [#10608](https://github.com/appwrite/appwrite/pull/10608)
* Chore bump db in [#10611](https://github.com/appwrite/appwrite/pull/10611)
* Branded email for Console auth flows in [#10501](https://github.com/appwrite/appwrite/pull/10501)
* Add minor releases for all SDKs - deprecate createVerification, add createEmailVerification in [#10614](https://github.com/appwrite/appwrite/pull/10614)
* Add automatic releases in [#10615](https://github.com/appwrite/appwrite/pull/10615)
* Feat txn sdks in [#10621](https://github.com/appwrite/appwrite/pull/10621)
* Prevent empty releases in sdk release script in [#10627](https://github.com/appwrite/appwrite/pull/10627)
* Update domains lib to 0.8.2 in [#10629](https://github.com/appwrite/appwrite/pull/10629)
* Fix txn API scope backwards compat in [#10640](https://github.com/appwrite/appwrite/pull/10640)
* Fix block schedules in [#10620](https://github.com/appwrite/appwrite/pull/10620)
* Update .NET SDK to 0.21.2 and improve release detection in [#10641](https://github.com/appwrite/appwrite/pull/10641)
* Make methods protected for extending in [#10617](https://github.com/appwrite/appwrite/pull/10617)
# Version 1.7.4
## What's Changed
### Notable changes
* Update console image to version 6.0.13 in [#9891](https://github.com/appwrite/appwrite/pull/9891)
### Fixes
* Fix createDeployment chunk upload in [#9886](https://github.com/appwrite/appwrite/pull/9886)
### Miscellaneous
* Update version from 1.7.3 to 1.7.4 in [#9893](https://github.com/appwrite/appwrite/pull/9893)
# Version 1.7.3
## What's Changed
### Notable changes
* Allow unlimited deployment size in [#9866](https://github.com/appwrite/appwrite/pull/9866)
* Bump console to version 6.0.11 in [#9881](https://github.com/appwrite/appwrite/pull/9881)
### Fixes
* Send deploymentResourceType in rules verification in [#9859](https://github.com/appwrite/appwrite/pull/9859)
* Fix CNAME validation in [#9861](https://github.com/appwrite/appwrite/pull/9861)
* Fix bucket not included in path in [#9864](https://github.com/appwrite/appwrite/pull/9864)
* Fix URL for view logs in github comment in [#9875](https://github.com/appwrite/appwrite/pull/9875)
* Set owner and region while migrating rules in [#9856](https://github.com/appwrite/appwrite/pull/9856)
* Remove _APP_DEFAULT_REGION because it is not a valid env var in [#9883](https://github.com/appwrite/appwrite/pull/9883)
### Miscellaneous
* Only load error page for development mode in [#9860](https://github.com/appwrite/appwrite/pull/9860)
* Make max deployment and build size configurable in [#9863](https://github.com/appwrite/appwrite/pull/9863)
* Update flutter_web_auth_2 docs to match 4.x in [#9858](https://github.com/appwrite/appwrite/pull/9858)
* Use unique filename for health check in [#9842](https://github.com/appwrite/appwrite/pull/9842)
* Added encrypt property in the attribute string response model in [#9868](https://github.com/appwrite/appwrite/pull/9868)
* Add sequence in [#9865](https://github.com/appwrite/appwrite/pull/9865)
* Add builds worker group in [#9873](https://github.com/appwrite/appwrite/pull/9873)
* updated errro for the string encryption in [#9878](https://github.com/appwrite/appwrite/pull/9878)
* Revert "Add sequence" in [#9879](https://github.com/appwrite/appwrite/pull/9879)
* Prepare 1.7.3 release in [#9882](https://github.com/appwrite/appwrite/pull/9882)
# Version 1.6.2
## What's Changed
### Notable changes
* Delete git folder to reduce build size in [#9076](https://github.com/appwrite/appwrite/pull/9076)
* Upgrade assistant in [#9100](https://github.com/appwrite/appwrite/pull/9100)
* Use redis adapter for abuse in [#9121](https://github.com/appwrite/appwrite/pull/9121)
* Set base specification CPUs to 0.5 again in [#9146](https://github.com/appwrite/appwrite/pull/9146)
* Add new push message parameters in [#9060](https://github.com/appwrite/appwrite/pull/9060)
* Update audits to include user type in [#9211](https://github.com/appwrite/appwrite/pull/9211)
* Enable HEIC in [#9251](https://github.com/appwrite/appwrite/pull/9251)
* Added teamName to membership redirect url in [#9269](https://github.com/appwrite/appwrite/pull/9269)
* Add support endpoint url for S3 in [#9303](https://github.com/appwrite/appwrite/pull/9303)
* Added RuPay Credit Card Icon in Avatars Service in [#5046](https://github.com/appwrite/appwrite/pull/5046)
* Add figma oauth provider in [#9623](https://github.com/appwrite/appwrite/pull/9623)
* Update console to version 5.2.58 in [#9637](https://github.com/appwrite/appwrite/pull/9637)
### Fixes
* Remove failed attribute in [#9032](https://github.com/appwrite/appwrite/pull/9032)
* Fix delete notFound attribute in [#9038](https://github.com/appwrite/appwrite/pull/9038)
* 🇮🇸 Added missing Icelandic translations for email strings. in [#4848](https://github.com/appwrite/appwrite/pull/4848)
* fix doc comment for filter method in [#5769](https://github.com/appwrite/appwrite/pull/5769)
* Delete attribute No throwing Exception on not found in [#9157](https://github.com/appwrite/appwrite/pull/9157)
* Fix VCS identity collision in [#9138](https://github.com/appwrite/appwrite/pull/9138)
* Fix disabling of email-otp when user wants to in [#9200](https://github.com/appwrite/appwrite/pull/9200)
* Ensure user can delete session in [#9209](https://github.com/appwrite/appwrite/pull/9209)
* Fix resend invitation in [#9218](https://github.com/appwrite/appwrite/pull/9218)
* Fix phone number parsing exception handling in [#9246](https://github.com/appwrite/appwrite/pull/9246)
* Fix amazon oauth in [#9253](https://github.com/appwrite/appwrite/pull/9253)
* Fix slack oauth scopes, and updated to v2 in [#9228](https://github.com/appwrite/appwrite/pull/9228)
* Fix forwarded user agent in [#9271](https://github.com/appwrite/appwrite/pull/9271)
* Fix WEBP File Preview Rendering Issue in [#9321](https://github.com/appwrite/appwrite/pull/9321)
* Fix build memory specifications in [#9360](https://github.com/appwrite/appwrite/pull/9360)
* Fix Self Hosting functions by adding missed config in [#9373](https://github.com/appwrite/appwrite/pull/9373)
* Fix resend team invite if already accepted in [#9348](https://github.com/appwrite/appwrite/pull/9348)
* Fix null errors on team invite in [#9391](https://github.com/appwrite/appwrite/pull/9391)
* Fix email (smtp) to multiple recipients in [#9243](https://github.com/appwrite/appwrite/pull/9243)
* Fix stats timing by using receivedAt date when available in [#9428](https://github.com/appwrite/appwrite/pull/9428)
* Make min/max params optional for attribute update in [#9387](https://github.com/appwrite/appwrite/pull/9387)
* Fix blocking of phone sessions when disabled on console in [#9447](https://github.com/appwrite/appwrite/pull/9447)
* Fix logging config in [#9467](https://github.com/appwrite/appwrite/pull/9467)
* Update audit timestamp origin in [#9481](https://github.com/appwrite/appwrite/pull/9481)
* Fix certificates in deletes worker in [#9466](https://github.com/appwrite/appwrite/pull/9466)
* Fix console audits delete in [#9547](https://github.com/appwrite/appwrite/pull/9547)
* Fix migrations in [#9633](https://github.com/appwrite/appwrite/pull/9633)
* Ensure all 4xx errors in OAuth redirect lead to the failure URL in [#9679](https://github.com/appwrite/appwrite/pull/9679)
* Treat 0 as unlimited for CPUs and memory in [#9638](https://github.com/appwrite/appwrite/pull/9638)
* Add contextual dispatch logic to fix high CPU usage in [#9687](https://github.com/appwrite/appwrite/pull/9687)
### Miscellaneous
* Merge 1.6.x into feat-custom-cf-hostnames in [#8904](https://github.com/appwrite/appwrite/pull/8904)
* Improve compression param checks in [#8922](https://github.com/appwrite/appwrite/pull/8922)
* upgrade utopia storage in [#8930](https://github.com/appwrite/appwrite/pull/8930)
* Feat migration in [#8797](https://github.com/appwrite/appwrite/pull/8797)
* feat fix web routes in [#8962](https://github.com/appwrite/appwrite/pull/8962)
* Fix no pool access in [#9027](https://github.com/appwrite/appwrite/pull/9027)
* feat: use environment variable to check rules format in [#9039](https://github.com/appwrite/appwrite/pull/9039)
* Update storage.php in [#9037](https://github.com/appwrite/appwrite/pull/9037)
* Upgrade db 0.53.200 in [#9050](https://github.com/appwrite/appwrite/pull/9050)
* Chore: upgrade utopia storage in [#9066](https://github.com/appwrite/appwrite/pull/9066)
* Update usage-dump payload in [#9085](https://github.com/appwrite/appwrite/pull/9085)
* GitHub Workflows security hardening in [#3728](https://github.com/appwrite/appwrite/pull/3728)
* Update add-oauth2-provider.md in [#4313](https://github.com/appwrite/appwrite/pull/4313)
* update readme-cn some doc in [#5278](https://github.com/appwrite/appwrite/pull/5278)
* Add accessibility features in [#7042](https://github.com/appwrite/appwrite/pull/7042)
* Add Appwrite Cloud to read me. in [#5445](https://github.com/appwrite/appwrite/pull/5445)
* Migration throw error in [#9092](https://github.com/appwrite/appwrite/pull/9092)
* Fix usage payload bug in [#9097](https://github.com/appwrite/appwrite/pull/9097)
* chore: replace occurrences of dbForConsole to dbForPlatform in [#9096](https://github.com/appwrite/appwrite/pull/9096)
* fix(realtime): decrement connectionCounter only if connection is known in [#9055](https://github.com/appwrite/appwrite/pull/9055)
* payload bug fix in [#9098](https://github.com/appwrite/appwrite/pull/9098)
* Fix usage payload bug in [#9099](https://github.com/appwrite/appwrite/pull/9099)
* Usage payload debug in [#9101](https://github.com/appwrite/appwrite/pull/9101)
* Usage payload debug in [#9103](https://github.com/appwrite/appwrite/pull/9103)
* Usage payload debug in [#9104](https://github.com/appwrite/appwrite/pull/9104)
* Feat: createFunction abuse labels in [#9102](https://github.com/appwrite/appwrite/pull/9102)
* Docs-create-document in [#9105](https://github.com/appwrite/appwrite/pull/9105)
* Docs: Create document and unknown attribute error messages. in [#5427](https://github.com/appwrite/appwrite/pull/5427)
* Fix: update project accessed at from router and schedulers in [#9109](https://github.com/appwrite/appwrite/pull/9109)
* chore: initial commit in [#9111](https://github.com/appwrite/appwrite/pull/9111)
* chore: optimise webhooks payload in [#9115](https://github.com/appwrite/appwrite/pull/9115)
* Revert "chore: initial commit" in [#9117](https://github.com/appwrite/appwrite/pull/9117)
* chore: fix attribute name in [#9118](https://github.com/appwrite/appwrite/pull/9118)
* Migrate to redis abuse in [#9124](https://github.com/appwrite/appwrite/pull/9124)
* Added webhooks usage stats in [#9125](https://github.com/appwrite/appwrite/pull/9125)
* chore remove abuse cleanup in [#9137](https://github.com/appwrite/appwrite/pull/9137)
* fix: remove abuse delete trigger in [#9139](https://github.com/appwrite/appwrite/pull/9139)
* Remove firebase OAuth API endpoints in [#9144](https://github.com/appwrite/appwrite/pull/9144)
* chore: release client sdks in [#9112](https://github.com/appwrite/appwrite/pull/9112)
* Update general.php in [#9155](https://github.com/appwrite/appwrite/pull/9155)
* feat(swoole): allow configuration override of available cpus in [#9177](https://github.com/appwrite/appwrite/pull/9177)
* Usage databases api read writes addition in [#9142](https://github.com/appwrite/appwrite/pull/9142)
* Fix dead connections in [#9190](https://github.com/appwrite/appwrite/pull/9190)
* Add hostname to audits in [#9165](https://github.com/appwrite/appwrite/pull/9165)
* chore: shifted authphone usage tracking to api calls in [#9191](https://github.com/appwrite/appwrite/pull/9191)
* Revert "Fix dead connections" in [#9201](https://github.com/appwrite/appwrite/pull/9201)
* Add assertEventually to messaging provider logs test in [#9192](https://github.com/appwrite/appwrite/pull/9192)
* feat project sms usage in [#9198](https://github.com/appwrite/appwrite/pull/9198)
* chore: add audit labels to project resources in [#9056](https://github.com/appwrite/appwrite/pull/9056)
* fix sms usage in [#9207](https://github.com/appwrite/appwrite/pull/9207)
* Update database in [#9202](https://github.com/appwrite/appwrite/pull/9202)
* Fix dead connections in [#9213](https://github.com/appwrite/appwrite/pull/9213)
* Revert "Fix dead connections" in [#9214](https://github.com/appwrite/appwrite/pull/9214)
* Add logs db init for consistency in [#9163](https://github.com/appwrite/appwrite/pull/9163)
* Split the collection definitions in [#9153](https://github.com/appwrite/appwrite/pull/9153)
* Log path with populated parameters in [#9220](https://github.com/appwrite/appwrite/pull/9220)
* Add missing scope on function template in [#9208](https://github.com/appwrite/appwrite/pull/9208)
* Add relatedCollection default in [#9225](https://github.com/appwrite/appwrite/pull/9225)
* fix: function usage in [#9235](https://github.com/appwrite/appwrite/pull/9235)
* feat: optimise events payloads in [#9232](https://github.com/appwrite/appwrite/pull/9232)
* Optimise webhook events in [#9168](https://github.com/appwrite/appwrite/pull/9168)
* fix: maintenance job missing type in [#9238](https://github.com/appwrite/appwrite/pull/9238)
* Update Fetch to 0.3.0 in [#9245](https://github.com/appwrite/appwrite/pull/9245)
* Fix maintenance job in [#9247](https://github.com/appwrite/appwrite/pull/9247)
* chore: add missing case for executions in [#9248](https://github.com/appwrite/appwrite/pull/9248)
* Add index dependency exception in [#9226](https://github.com/appwrite/appwrite/pull/9226)
* chore: fix benchmarking test when made from fork in [#9233](https://github.com/appwrite/appwrite/pull/9233)
* Update SDK Generator versions in [#9188](https://github.com/appwrite/appwrite/pull/9188)
* chore: skipped job instead of throwing error in [#9250](https://github.com/appwrite/appwrite/pull/9250)
* Implement new SDK Class on 1.6.x in [#9237](https://github.com/appwrite/appwrite/pull/9237)
* Delete collection before Appwrite's attributes in [#9256](https://github.com/appwrite/appwrite/pull/9256)
* Feat batch usage dump in [#9255](https://github.com/appwrite/appwrite/pull/9255)
* Fix cloud tests in [#9261](https://github.com/appwrite/appwrite/pull/9261)
* Usage: Databases reads writes in [#9260](https://github.com/appwrite/appwrite/pull/9260)
* Update: Latest sdk specs in [#9274](https://github.com/appwrite/appwrite/pull/9274)
* Revert "Feat batch usage dump" in [#9276](https://github.com/appwrite/appwrite/pull/9276)
* feat: add fast2SMS adapter in [#9263](https://github.com/appwrite/appwrite/pull/9263)
* Update Sdk Generator dependency in [#9280](https://github.com/appwrite/appwrite/pull/9280)
* Transformed at addition in [#9281](https://github.com/appwrite/appwrite/pull/9281)
* Docs: clarify update endpoints only work on draft messages in [#9236](https://github.com/appwrite/appwrite/pull/9236)
* Update sdk generator dependency in [#9282](https://github.com/appwrite/appwrite/pull/9282)
* Revert "Transformed at addition" in [#9284](https://github.com/appwrite/appwrite/pull/9284)
* replaced init for cloud link in [#9285](https://github.com/appwrite/appwrite/pull/9285)
* Add transformed at in [#9289](https://github.com/appwrite/appwrite/pull/9289)
* Make migrations use Dynamic keys for destination in [#9291](https://github.com/appwrite/appwrite/pull/9291)
* Make sessions limit tests assert eventually in [#9298](https://github.com/appwrite/appwrite/pull/9298)
* Chore update database in [#9306](https://github.com/appwrite/appwrite/pull/9306)
* feat: add AMQP queues in [#9287](https://github.com/appwrite/appwrite/pull/9287)
* fix(test): use assertEventually instead of while(true) in [#9308](https://github.com/appwrite/appwrite/pull/9308)
* fix(certificate worker): events are published without queue name in [#9309](https://github.com/appwrite/appwrite/pull/9309)
* chore: update utopia-php/queue to 0.8.1 in [#9311](https://github.com/appwrite/appwrite/pull/9311)
* chore: update utopia-php/queue to 0.8.2 in [#9312](https://github.com/appwrite/appwrite/pull/9312)
* fix(schedule-tasks): revert back to direct pool usage in [#9313](https://github.com/appwrite/appwrite/pull/9313)
* feat: custom app schemes in [#9262](https://github.com/appwrite/appwrite/pull/9262)
* Revert "feat: custom app schemes" in [#9319](https://github.com/appwrite/appwrite/pull/9319)
* Restore "feat: custom app schemes"" in [#9320](https://github.com/appwrite/appwrite/pull/9320)
* Revert "Restore "feat: custom app schemes""" in [#9323](https://github.com/appwrite/appwrite/pull/9323)
* chore: update dependencies in [#9330](https://github.com/appwrite/appwrite/pull/9330)
* Feat: logs DB in [#9272](https://github.com/appwrite/appwrite/pull/9272)
* Catch invalid index in [#9329](https://github.com/appwrite/appwrite/pull/9329)
* Fix: missing call for image transformations counting in [#9342](https://github.com/appwrite/appwrite/pull/9342)
* Fix drop abuse on shared table project delete in [#9346](https://github.com/appwrite/appwrite/pull/9346)
* Only run all table mode tests on db update in [#9338](https://github.com/appwrite/appwrite/pull/9338)
* Fix: missing periodic metric in [#9350](https://github.com/appwrite/appwrite/pull/9350)
* feat(builds): check if function is blocked before building in [#9332](https://github.com/appwrite/appwrite/pull/9332)
* feat: batch create audit logs in [#9347](https://github.com/appwrite/appwrite/pull/9347)
* Chore: Update migrations in [#9355](https://github.com/appwrite/appwrite/pull/9355)
* Fix: metric time was not being written to DB in [#9354](https://github.com/appwrite/appwrite/pull/9354)
* Fix patch index validation in [#9356](https://github.com/appwrite/appwrite/pull/9356)
* Fix image trnasformation metrics in [#9370](https://github.com/appwrite/appwrite/pull/9370)
* Use batch delete in worker in [#9375](https://github.com/appwrite/appwrite/pull/9375)
* Fix Model Platform is missing response key: store in [#9361](https://github.com/appwrite/appwrite/pull/9361)
* Feat key segmented usage in [#9336](https://github.com/appwrite/appwrite/pull/9336)
* Feat messaging metrics in [#9353](https://github.com/appwrite/appwrite/pull/9353)
* Fix removed audits for shared v2 in [#9388](https://github.com/appwrite/appwrite/pull/9388)
* chore: bump utopia-php/image to 0.8.0 in [#9390](https://github.com/appwrite/appwrite/pull/9390)
* Fix outdated CLI commands in documentation in [#9122](https://github.com/appwrite/appwrite/pull/9122)
* disable logs display in [#9398](https://github.com/appwrite/appwrite/pull/9398)
* Log batches per project in [#9403](https://github.com/appwrite/appwrite/pull/9403)
* Batch per project in [#9410](https://github.com/appwrite/appwrite/pull/9410)
* Fix: stats resources only queue projects accessed in last 3 hours in [#9411](https://github.com/appwrite/appwrite/pull/9411)
* Track options requests in [#9397](https://github.com/appwrite/appwrite/pull/9397)
* chore: bump docker-base in [#9406](https://github.com/appwrite/appwrite/pull/9406)
* refactor: migrate Realtime::send calls to queueForRealtime in [#9325](https://github.com/appwrite/appwrite/pull/9325)
* Revert "Fix: stats resources only queue projects accessed in last 3 hours" in [#9424](https://github.com/appwrite/appwrite/pull/9424)
* Remove usage and usage dump in favor of stats-usage and stats-usage-dump in [#9339](https://github.com/appwrite/appwrite/pull/9339)
* Fix: disable dual writing in [#9429](https://github.com/appwrite/appwrite/pull/9429)
* Disable transformedAt update for console users in [#9425](https://github.com/appwrite/appwrite/pull/9425)
* chore: add image transformation stats to usage endpoint in [#9393](https://github.com/appwrite/appwrite/pull/9393)
* chore: added timeout to deployment builds in tests in [#9426](https://github.com/appwrite/appwrite/pull/9426)
* fix: model for image transformations in usage project in [#9442](https://github.com/appwrite/appwrite/pull/9442)
* Feat: calculate database storage in stats-resources in [#9443](https://github.com/appwrite/appwrite/pull/9443)
* Activities batch writes in [#9438](https://github.com/appwrite/appwrite/pull/9438)
* chore: bump cache 0.12.x in [#9412](https://github.com/appwrite/appwrite/pull/9412)
* chore: queue console project for maintenance delete in [#9479](https://github.com/appwrite/appwrite/pull/9479)
* chore: added logsdb for deletes worker in [#9462](https://github.com/appwrite/appwrite/pull/9462)
* Feat: calculate and log time taken for each project in [#9491](https://github.com/appwrite/appwrite/pull/9491)
* chore: update initializing dbForLogs in [#9494](https://github.com/appwrite/appwrite/pull/9494)
* Feat bulk audit delete in [#9487](https://github.com/appwrite/appwrite/pull/9487)
* Prepare 1.6.2 release in [#9499](https://github.com/appwrite/appwrite/pull/9499)
* Regenerate specs in [#9497](https://github.com/appwrite/appwrite/pull/9497)
* Regenerate examples in [#9498](https://github.com/appwrite/appwrite/pull/9498)
* chore: bump sdk in [#9414](https://github.com/appwrite/appwrite/pull/9414)
* update queue to 0.9.* in [#9505](https://github.com/appwrite/appwrite/pull/9505)
* Feat improve delete queries in [#9507](https://github.com/appwrite/appwrite/pull/9507)
* Feat: Add rule attributes in [#9508](https://github.com/appwrite/appwrite/pull/9508)
* Sync main into 1.6.x in [#9496](https://github.com/appwrite/appwrite/pull/9496)
* Bump console to version 5.2.53 in [#9495](https://github.com/appwrite/appwrite/pull/9495)
* Prepare 1.6.1 release in [#9294](https://github.com/appwrite/appwrite/pull/9294)
* Improve delete ordering in [#9512](https://github.com/appwrite/appwrite/pull/9512)
* Cleanups in [#9511](https://github.com/appwrite/appwrite/pull/9511)
* Feat dynamic regions in [#9408](https://github.com/appwrite/appwrite/pull/9408)
* Feat env vars to system lib in [#9515](https://github.com/appwrite/appwrite/pull/9515)
* Feat: domains count in [#9514](https://github.com/appwrite/appwrite/pull/9514)
* Migration read from db in [#9529](https://github.com/appwrite/appwrite/pull/9529)
* feat: add pool telemetry in [#9530](https://github.com/appwrite/appwrite/pull/9530)
* Disable PDO persistence since we manage our own pool in [#9526](https://github.com/appwrite/appwrite/pull/9526)
* chore: set min operations to 1 for reads and writes in [#9536](https://github.com/appwrite/appwrite/pull/9536)
* Remove default region in [#9430](https://github.com/appwrite/appwrite/pull/9430)
* Use cursor pagination with bigger limit for maintenance project loop in [#9546](https://github.com/appwrite/appwrite/pull/9546)
* chore: stop tests on failure in [#9525](https://github.com/appwrite/appwrite/pull/9525)
* chore: only update total count for privileged users in [#9554](https://github.com/appwrite/appwrite/pull/9554)
* refactor: initialization of audit retention in [#9563](https://github.com/appwrite/appwrite/pull/9563)
* Delete worker queries fixes in [#9523](https://github.com/appwrite/appwrite/pull/9523)
* Bump database 0.62.x in [#9568](https://github.com/appwrite/appwrite/pull/9568)
* Fix: schedules region filtering in [#9577](https://github.com/appwrite/appwrite/pull/9577)
* Deletes worker fix selects for pagination in [#9578](https://github.com/appwrite/appwrite/pull/9578)
* Add $permissions for delete documents selects in [#9579](https://github.com/appwrite/appwrite/pull/9579)
* chore(audits): return queue pre-fetch results in [#9533](https://github.com/appwrite/appwrite/pull/9533)
* Revert "chore(audits): return queue pre-fetch results" in [#9586](https://github.com/appwrite/appwrite/pull/9586)
* Feat multi tenant insert in [#9573](https://github.com/appwrite/appwrite/pull/9573)
* Add order by for cursor in [#9588](https://github.com/appwrite/appwrite/pull/9588)
* Feat update fetch in [#9592](https://github.com/appwrite/appwrite/pull/9592)
* Fix tenant casting in [#9598](https://github.com/appwrite/appwrite/pull/9598)
* Feat update ws in [#9602](https://github.com/appwrite/appwrite/pull/9602)
* Update database in [#9603](https://github.com/appwrite/appwrite/pull/9603)
* Fix: image transformation cache in [#9608](https://github.com/appwrite/appwrite/pull/9608)
* Remove audit payload in [#9610](https://github.com/appwrite/appwrite/pull/9610)
* Sample rate from DSN in [#9559](https://github.com/appwrite/appwrite/pull/9559)
* Restrict role change for sole org owner in [#9615](https://github.com/appwrite/appwrite/pull/9615)
* chore: update php image to 0.8.1 in [#9616](https://github.com/appwrite/appwrite/pull/9616)
* feat: refactor executor setup in [#9420](https://github.com/appwrite/appwrite/pull/9420)
* chore: update gitpod.yml config in [#9561](https://github.com/appwrite/appwrite/pull/9561)
* chore: update dependencies in [#9625](https://github.com/appwrite/appwrite/pull/9625)
* Update migrations lib in [#9628](https://github.com/appwrite/appwrite/pull/9628)
* feat: cache telemetry in [#9624](https://github.com/appwrite/appwrite/pull/9624)
* Bump console to version 5.2.56 in [#9631](https://github.com/appwrite/appwrite/pull/9631)
* Multi region support in [#8667](https://github.com/appwrite/appwrite/pull/8667)
* Revert "Multi region support" in [#9632](https://github.com/appwrite/appwrite/pull/9632)
* Revert "Revert "Multi region support"" in [#9636](https://github.com/appwrite/appwrite/pull/9636)
* Fix tasks in [#9644](https://github.com/appwrite/appwrite/pull/9644)
* chore: updated the migration version to 8.6 in [#9646](https://github.com/appwrite/appwrite/pull/9646)
* Fix: merge the working of StatsUsage and StatsUsageDump in [#9585](https://github.com/appwrite/appwrite/pull/9585)
* Update database in [#9643](https://github.com/appwrite/appwrite/pull/9643)
* chore: fix error logging for CLI tasks in [#9651](https://github.com/appwrite/appwrite/pull/9651)
* fix: usage test assertion in [#9653](https://github.com/appwrite/appwrite/pull/9653)
* Fix keys in [#9656](https://github.com/appwrite/appwrite/pull/9656)
* Feat: multi tenant dual writing in [#9583](https://github.com/appwrite/appwrite/pull/9583)
* Fix/throwing 400 for null order attributes in [#9657](https://github.com/appwrite/appwrite/pull/9657)
* feat: sdk group attribute in [#9596](https://github.com/appwrite/appwrite/pull/9596)
* Add configurable function and build size in [#9648](https://github.com/appwrite/appwrite/pull/9648)
* feat: update API endpoint in the code examples in [#8933](https://github.com/appwrite/appwrite/pull/8933)
* chore: abstract token secret hiding to response model in [#9574](https://github.com/appwrite/appwrite/pull/9574)
* chore: update sdks in [#9655](https://github.com/appwrite/appwrite/pull/9655)
* feat: allow non-critical events to ignore exceptions when enqueuing the event in [#9680](https://github.com/appwrite/appwrite/pull/9680)
* Revert "Add configurable function and build size" in [#9681](https://github.com/appwrite/appwrite/pull/9681)
* core: introduce endpoint.docs in specs in [#9685](https://github.com/appwrite/appwrite/pull/9685)
* fix: remove content-type header from get request specs in [#9666](https://github.com/appwrite/appwrite/pull/9666)
* chore: update flutter sdk in [#9691](https://github.com/appwrite/appwrite/pull/9691)
# Version 1.6.1
## What's Changed
+6 -52
View File
@@ -9,31 +9,7 @@ You can [find issues using this query](https://github.com/search?q=org%3Aappwrit
## How to Start?
Welcome! We're excited that you're interested in contributing to Appwrite. To make sure your time is valued and your contributions are successful, please follow these steps before writing any code:
### 🔍 Step 1: Find an Issue
Browse open issues and look for ones labeled [good first issue](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22good+first+issue%22&type=issues) or [help wanted](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22help+wanted%22&type=issues).
If you're not sure which issue to pick, ask in our [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord.
### 📝 Step 2: Ask to Be Assigned
Before working on an issue, comment on the GitHub issue asking to be assigned. This prevents multiple people working on the same task.
Then, create a thread in the [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord with a link to the issue.
Our team is small and may not see your GitHub comment right away - posting in the [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) ensures it gets seen.
### 💬 Step 3: Dont Submit Random PRs
If you're not working on an assigned issue, create a GitHub issue first.
PRs submitted without context or discussion may not align with our roadmap and may be closed without review.
### ⚠️ Please Note
Were a very small team managing a large project. Many PRs are submitted, and while we appreciate every effort, we can only review contributions that follow the process above. This helps us keep things fair and organized.
If you are worried or dont know where to start, check out the next section that explains what kind of help we could use and where you can get involved. You can send your questions to [@appwrite on Twitter](https://twitter.com/appwrite) or to anyone from the [Appwrite team on Discord](https://appwrite.io/discord). You can also submit an issue, and a maintainer can guide you!
## Code of Conduct
@@ -187,28 +163,6 @@ Other containes should be named the same as their service, for example `redis` s
- [Encryption](https://medium.com/searchencrypt/what-is-encryption-how-does-it-work-e8f20e340537#:~:text=Encryption%20is%20a%20process%20that,%2C%20or%20decrypt%2C%20the%20information.)
- [Hashing](https://searchsqlserver.techtarget.com/definition/hashing#:~:text=Hashing%20is%20the%20transformation%20of,it%20using%20the%20original%20value.)
## Modules
As Appwrite grows, we noticed approach of having all service endpoints in `app/controllers/api/[service].php` is not maintainable. Not only it creates massive files, it also doesnt contain all product's features such as workers or tasks. While there might still be some occurances of those controller files, we avoid it in all new development, and gradually migrate existing controllers to **HTTP modules**.
### HTTP Endpoints
Every endpoint file follows below structure, making it consistent with HTTP REST endpoint path:
```
src/Appwrite/Platform/Modules/[service]/Http/[resource]/[action].php
```
Tips and tricks:
1. If endpoint doesn't have resource, use service name as resource name too
> Example: `Modules/Sites/Http/Sites/Get.php`
2. If there are multiple resources, use then all in folder structure
> Example: `Modules/Sites/Http/Deployments/Builds/Create.php`
3. Action can only be `Get`, `Create`, `Update`, `Delete` or `XList`
## Architecture
Appwrite's current structure is a combination of both [Monolithic](https://en.wikipedia.org/wiki/Monolithic_application) and [Microservice](https://en.wikipedia.org/wiki/Microservices) architectures.
@@ -439,8 +393,8 @@ In addition, you will also need to add some logic to the `reduce()` method of th
```php
case $document->getCollection() === 'buckets':
$files = $dbForProject->getDocument('stats', md5(self::INFINITY_PERIOD . str_replace('{bucketInternalId}', $document->getSequence(), METRIC_BUCKET_ID_FILES)));
$storage = $dbForProject->getDocument('stats', md5(self::INFINITY_PERIOD . str_replace('{bucketInternalId}', $document->getSequence(), METRIC_BUCKET_ID_FILES_STORAGE)));
$files = $dbForProject->getDocument('stats', md5(self::INFINITY_PERIOD . str_replace('{bucketInternalId}', $document->getInternalId(), METRIC_BUCKET_ID_FILES)));
$storage = $dbForProject->getDocument('stats', md5(self::INFINITY_PERIOD . str_replace('{bucketInternalId}', $document->getInternalId(), METRIC_BUCKET_ID_FILES_STORAGE)));
if (!empty($files['value'])) {
$metrics[] = [
@@ -487,9 +441,9 @@ $queueForStatsUsage
->addMetric(METRIC_BUILDS, 1)
->addMetric(METRIC_BUILDS_STORAGE, $build->getAttribute('size', 0))
->addMetric(METRIC_BUILDS_COMPUTE, (int)$build->getAttribute('duration', 0) * 1000)
->addMetric(str_replace('{functionInternalId}', $function->getSequence(), METRIC_FUNCTION_ID_BUILDS), 1)
->addMetric(str_replace('{functionInternalId}', $function->getSequence(), METRIC_FUNCTION_ID_BUILDS_STORAGE), $build->getAttribute('size', 0))
->addMetric(str_replace('{functionInternalId}', $function->getSequence(), METRIC_FUNCTION_ID_BUILDS_COMPUTE), (int)$build->getAttribute('duration', 0) * 1000)
->addMetric(str_replace('{functionInternalId}', $function->getInternalId(), METRIC_FUNCTION_ID_BUILDS), 1)
->addMetric(str_replace('{functionInternalId}', $function->getInternalId(), METRIC_FUNCTION_ID_BUILDS_STORAGE), $build->getAttribute('size', 0))
->addMetric(str_replace('{functionInternalId}', $function->getInternalId(), METRIC_FUNCTION_ID_BUILDS_COMPUTE), (int)$build->getAttribute('duration', 0) * 1000)
->setProject($project)
->trigger();
```
+10 -11
View File
@@ -12,7 +12,7 @@ RUN composer install --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
FROM appwrite/base:0.10.5 AS final
FROM appwrite/base:0.10.1 AS final
LABEL maintainer="team@appwrite.io"
@@ -28,6 +28,8 @@ RUN \
apk add boost boost-dev; \
fi
RUN apk add libwebp
WORKDIR /usr/src/code
COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor
@@ -42,19 +44,17 @@ COPY ./dev /usr/src/code/dev
# Set Volumes
RUN mkdir -p /storage/uploads && \
mkdir -p /storage/imports && \
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/imports && chmod -Rf 0755 /storage/imports && \
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 && \
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
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 && \
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/doctor && \
@@ -68,7 +68,6 @@ RUN chmod +x /usr/local/bin/doctor && \
chmod +x /usr/local/bin/sdks && \
chmod +x /usr/local/bin/specs && \
chmod +x /usr/local/bin/ssl && \
chmod +x /usr/local/bin/screenshot && \
chmod +x /usr/local/bin/test && \
chmod +x /usr/local/bin/upgrade && \
chmod +x /usr/local/bin/vars && \
@@ -87,6 +86,7 @@ RUN chmod +x /usr/local/bin/doctor && \
chmod +x /usr/local/bin/worker-migrations && \
chmod +x /usr/local/bin/worker-webhooks && \
chmod +x /usr/local/bin/worker-stats-usage && \
chmod +x /usr/local/bin/worker-stats-usage-dump && \
chmod +x /usr/local/bin/stats-resources && \
chmod +x /usr/local/bin/worker-stats-resources
@@ -96,7 +96,6 @@ RUN mkdir -p /etc/letsencrypt/live/ && chmod -Rf 755 /etc/letsencrypt/live/
# Enable Extensions
RUN if [ "$DEBUG" = "true" ]; then cp /usr/src/code/dev/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini; fi
RUN if [ "$DEBUG" = "true" ]; then mkdir -p /tmp/xdebug; fi
RUN if [ "$DEBUG" = "true" ]; then apk add --update --no-cache openssh-client github-cli; fi
RUN if [ "$DEBUG" = "false" ]; then rm -rf /usr/src/code/dev; fi
RUN if [ "$DEBUG" = "false" ]; then rm -f /usr/local/lib/php/extensions/no-debug-non-zts-20230831/xdebug.so; fi
+4 -6
View File
@@ -26,7 +26,7 @@
[**Appwrite 云公开测试版!立即注册!**](https://cloud.appwrite.io)
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,原生应用,以及后端。它既包含后端服务器,也提供了用于部署静态和服务器端渲染前端的完全集成托管解决方案。Appwrite 通过视觉化界面简化了从零开始构建现代应用的复杂性和重复性,让您能够更快地构建安全的全栈应用
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面简化了从零开始编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境
Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存,图像处理,云函数计算,[等多种服务](https://appwrite.io/docs).
@@ -72,7 +72,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
### Windows
@@ -84,7 +84,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
#### PowerShell
@@ -94,7 +94,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="install" `
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。
@@ -179,8 +179,6 @@ docker run -it --rm `
- [**消息传递**](https://appwrite.io/docs/references/cloud/client-web/messaging) - 使用 Appwrite 消息传递功能通过推送通知、电子邮件和短信与用户进行通信。
- [**语言适配**](https://appwrite.io/docs/references/cloud/client-web/locale) - 根据用户所在的的国家和地区做出合适的语言适配。
- [**头像**](https://appwrite.io/docs/references/cloud/client-web/avatars) -管理用户头像、国家旗帜、浏览器图标、信用卡符号,和生成二维码。
- [**MCP**](https://appwrite.io/docs/tooling/mcp) - 使用 Appwrite 的模型上下文协议(Model Context Protocol)服务器,允许大语言模型(LLM)和 AI 工具(如 Claude Desktop、Cursor 和 Windsurf Editor)通过自然语言直接与您的 Appwrite 项目交互。
- [**站点**](https://appwrite.io/docs/products/sites) - 直接从 Appwrite 开发、部署和扩展您的 Web 应用程序,与您的后端一起。
如需完整的 API 界面文档,请访问 [https://appwrite.io/docs](https://appwrite.io/docs)。如需更多教程、新闻和公告,请订阅我们的 [博客](https://medium.com/appwrite-io) 和 加入我们的[Discord 社区](https://discord.gg/GSeTUeA)。
### 开发套件
+11 -18
View File
@@ -1,7 +1,3 @@
> We just announced DB operators for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-db-operators)
> Appwrite Cloud is now Generally Available - [Learn more](https://appwrite.io/cloud-ga)
> [Get started with Appwrite](https://apwr.dev/appcloud)
<br />
@@ -9,7 +5,7 @@
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner, with logo and text saying "Build Like a Team of Hundreds"></a>
<br />
<br />
<b>Appwrite is an all-in-one development platform for Web, Mobile, and Flutter applications. Use built-in backend infrastructure and web hosting, all from a single place. Built with the open source community and optimized for developer experience in the coding languages you love.</b>
<b>Appwrite is a backend platform for developing Web, Mobile, and Flutter applications. Built with the open source community and optimized for developer experience in the coding languages you love.</b>
<br />
<br />
</p>
@@ -28,7 +24,7 @@
English | [简体中文](README-CN.md)
Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.
Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker<nobr> microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.
Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and [more services](https://appwrite.io/docs).
@@ -45,7 +41,7 @@ Find out more at: [https://appwrite.io](https://appwrite.io).
Table of Contents:
- [Installation \& Setup](#installation--setup)
- [Getting Started](#getting-started)
- [Self-Hosting](#self-hosting)
- [Unix](#unix)
- [Windows](#windows)
@@ -65,9 +61,8 @@ Table of Contents:
- [Follow Us](#follow-us)
- [License](#license)
## Installation & Setup
The easiest way to get started with Appwrite is by [signing up for Appwrite Cloud](https://cloud.appwrite.io/). While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won't collect your credit card information.
## Getting Started
The easiest way to get started with Appwrite is by [signing up for Appwrite Cloud](https://cloud.appwrite.io/). While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won't collect you credit card information.
## Self-Hosting
@@ -82,7 +77,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
### Windows
@@ -94,7 +89,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
#### PowerShell
@@ -104,7 +99,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="install" `
appwrite/appwrite:1.8.0
appwrite/appwrite:1.6.2
```
Once the Docker installation is complete, 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 completing the installation.
@@ -132,19 +127,19 @@ Choose from one of the providers below:
<td align="center" width="100" height="100">
<a href="https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod">
<img width="50" height="39" src="public/images/integrations/gitpod-logo.svg" alt="Gitpod Logo" />
<br /><sub><b>Gitpod</b></sub></a>
<br /><sub><b>Gitpod</b></sub></a>
</a>
</td>
<td align="center" width="100" height="100">
<a href="https://www.linode.com/marketplace/apps/appwrite/appwrite/">
<img width="50" height="39" src="public/images/integrations/akamai-logo.svg" alt="Akamai Logo" />
<br /><sub><b>Akamai Compute</b></sub></a>
<br /><sub><b>Akamai Compute</b></sub></a>
</a>
</td>
<td align="center" width="100" height="100">
<a href="https://aws.amazon.com/marketplace/pp/prodview-2hiaeo2px4md6">
<img width="50" height="39" src="public/images/integrations/aws-logo.svg" alt="AWS Logo" />
<br /><sub><b>AWS Marketplace</b></sub></a>
<br /><sub><b>AWS Marketplace</b></sub></a>
</a>
</td>
</tr>
@@ -190,8 +185,6 @@ Getting started with Appwrite is as easy as creating a new project, choosing you
- [**Realtime**](https://appwrite.io/docs/realtime) - Listen to real-time events for any of your Appwrite services including users, storage, functions, databases, and more.
- [**Locale**](https://appwrite.io/docs/references/cloud/client-web/locale) - Track your user's location and manage your app locale-based data.
- [**Avatars**](https://appwrite.io/docs/references/cloud/client-web/avatars) - Manage your users' avatars, countries' flags, browser icons, and credit card symbols. Generate QR codes from links or plaintext strings.
- [**MCP**](https://appwrite.io/docs/tooling/mcp) - Use Appwrite's Model Context Protocol (MCP) server to allow LLMs and AI tools like Claude Desktop, Cursor, and Windsurf Editor to directly interact with your Appwrite project through natural language.
- [**Sites**](https://appwrite.io/docs/products/sites) - Develop, deploy, and scale your web applications directly from Appwrite, alongside your backend.
For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcements check out our [blog](https://medium.com/appwrite-io) and [Discord Server](https://discord.gg/GSeTUeA).
+55 -100
View File
@@ -9,16 +9,11 @@ use Appwrite\Event\StatsResources;
use Appwrite\Event\StatsUsage;
use Appwrite\Platform\Appwrite;
use Appwrite\Runtimes\Runtimes;
use Executor\Executor;
use Swoole\Runtime;
use Swoole\Timer;
use Utopia\Cache\Adapter\Pool as CachePool;
use Utopia\Cache\Adapter\Sharding;
use Utopia\Cache\Cache;
use Utopia\CLI\CLI;
use Utopia\CLI\Console;
use Utopia\Config\Config;
use Utopia\Database\Adapter\Pool as DatabasePool;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
@@ -26,20 +21,18 @@ use Utopia\DSN\DSN;
use Utopia\Logger\Log;
use Utopia\Platform\Service;
use Utopia\Pools\Group;
use Utopia\Queue\Broker\Pool as BrokerPool;
use Utopia\Queue\Publisher;
use Utopia\Registry\Registry;
use Utopia\System\System;
use Utopia\Telemetry\Adapter\None as NoTelemetry;
use function Swoole\Coroutine\run;
// overwriting runtimes to be architecture agnostic for CLI
Config::setParam('runtimes', (new Runtimes('v5'))->getAll(supported: false));
// Overwriting runtimes to be architecture agnostic for CLI
Config::setParam('runtimes', (new Runtimes('v4'))->getAll(supported: false));
// require controllers after overwriting runtimes
require_once __DIR__ . '/controllers/general.php';
Authorization::disable();
CLI::setResource('register', fn () => $register);
CLI::setResource('cache', function ($pools) {
@@ -47,7 +40,10 @@ CLI::setResource('cache', function ($pools) {
$adapters = [];
foreach ($list as $value) {
$adapters[] = new CachePool($pools->get($value));
$adapters[] = $pools
->get($value)
->pop()
->getResource();
}
return new Cache(new Sharding($adapters));
@@ -57,13 +53,7 @@ CLI::setResource('pools', function (Registry $register) {
return $register->get('pools');
}, ['register']);
CLI::setResource('authorization', function () {
$authorization = new Authorization();
$authorization->disable();
return $authorization;
}, []);
CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) {
CLI::setResource('dbForPlatform', function ($pools, $cache) {
$sleep = 3;
$maxAttempts = 5;
$attempts = 0;
@@ -73,11 +63,14 @@ CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) {
$attempts++;
try {
// Prepare database connection
$adapter = new DatabasePool($pools->get('console'));
$dbForPlatform = new Database($adapter, $cache);
$dbAdapter = $pools
->get('console')
->pop()
->getResource();
$dbForPlatform = new Database($dbAdapter, $cache);
$dbForPlatform
->setAuthorization($authorization)
->setNamespace('_console')
->setMetadata('host', \gethostname())
->setMetadata('project', 'console');
@@ -93,6 +86,7 @@ CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) {
$ready = true;
} catch (\Throwable $err) {
Console::warning($err->getMessage());
$pools->get('console')->reclaim();
sleep($sleep);
}
} while ($attempts < $maxAttempts && !$ready);
@@ -102,21 +96,16 @@ CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) {
}
return $dbForPlatform;
}, ['pools', 'cache', 'authorization']);
}, ['pools', 'cache']);
CLI::setResource('console', function () {
return new Document(Config::getParam('console'));
}, []);
CLI::setResource(
'isResourceBlocked',
fn () => fn (Document $project, string $resourceType, ?string $resourceId) => false
);
CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform, $cache, $authorization) {
CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform, $cache) {
$databases = []; // TODO: @Meldiron This should probably be responsibility of utopia-php/pools
return function (Document $project) use ($pools, $dbForPlatform, $cache, $authorization, &$databases) {
return function (Document $project) use ($pools, $dbForPlatform, $cache, &$databases) {
if ($project->isEmpty() || $project->getId() === 'console') {
return $dbForPlatform;
}
@@ -135,59 +124,66 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform
if (\in_array($dsn->getHost(), $sharedTables)) {
$database
->setSharedTables(true)
->setTenant((int)$project->getSequence())
->setTenant($project->getInternalId())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
->setTenant(null)
->setNamespace('_' . $project->getSequence());
->setNamespace('_' . $project->getInternalId());
}
return $database;
}
$adapter = new DatabasePool($pools->get($dsn->getHost()));
$database = new Database($adapter, $cache);
$dbAdapter = $pools
->get($dsn->getHost())
->pop()
->getResource();
$database = new Database($dbAdapter, $cache);
$databases[$dsn->getHost()] = $database;
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
if (\in_array($dsn->getHost(), $sharedTables)) {
$database
->setSharedTables(true)
->setTenant((int)$project->getSequence())
->setTenant($project->getInternalId())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
->setTenant(null)
->setNamespace('_' . $project->getSequence());
->setNamespace('_' . $project->getInternalId());
}
$database
->setAuthorization($authorization)
->setMetadata('host', \gethostname())
->setMetadata('project', $project->getId());
return $database;
};
}, ['pools', 'dbForPlatform', 'cache', 'authorization']);
}, ['pools', 'dbForPlatform', 'cache']);
CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorization $authorization) {
CLI::setResource('getLogsDB', function (Group $pools, Cache $cache) {
$database = null;
return function (?Document $project = null) use ($pools, $cache, $database, $authorization) {
return function (?Document $project = null) use ($pools, $cache, $database) {
if ($database !== null && $project !== null && !$project->isEmpty() && $project->getId() !== 'console') {
$database->setTenant((int)$project->getSequence());
$database->setTenant($project->getInternalId());
return $database;
}
$adapter = new DatabasePool($pools->get('logs'));
$database = new Database($adapter, $cache);
$dbAdapter = $pools
->get('logs')
->pop()
->getResource();
$database = new Database(
$dbAdapter,
$cache
);
$database
->setAuthorization($authorization)
->setSharedTables(true)
->setNamespace('logsV1')
->setTimeout(APP_DATABASE_TIMEOUT_MILLISECONDS_TASK)
@@ -195,36 +191,22 @@ CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorizatio
// set tenant
if ($project !== null && !$project->isEmpty() && $project->getId() !== 'console') {
$database->setTenant((int)$project->getSequence());
$database->setTenant($project->getInternalId());
}
return $database;
};
}, ['pools', 'cache', 'authorization']);
CLI::setResource('publisher', function (Group $pools) {
return new BrokerPool(publisher: $pools->get('publisher'));
}, ['pools']);
CLI::setResource('publisherDatabases', function (BrokerPool $publisher) {
return $publisher;
}, ['publisher']);
CLI::setResource('publisherFunctions', function (BrokerPool $publisher) {
return $publisher;
}, ['publisher']);
CLI::setResource('publisherMigrations', function (BrokerPool $publisher) {
return $publisher;
}, ['publisher']);
CLI::setResource('publisherStatsUsage', function (BrokerPool $publisher) {
return $publisher;
}, ['publisher']);
CLI::setResource('publisherMessaging', function (BrokerPool $publisher) {
return $publisher;
}, ['publisher']);
CLI::setResource('queueForStatsUsage', function (Publisher $publisher) {
}, ['pools', 'cache']);
CLI::setResource('queueForStatsUsage', function (Connection $publisher) {
return new StatsUsage($publisher);
}, ['publisher']);
CLI::setResource('queueForStatsResources', function (Publisher $publisher) {
return new StatsResources($publisher);
}, ['publisher']);
CLI::setResource('publisher', function (Group $pools) {
return $pools->get('publisher')->pop()->getResource();
}, ['pools']);
CLI::setResource('queueForFunctions', function (Publisher $publisher) {
return new Func($publisher);
}, ['publisher']);
@@ -236,13 +218,6 @@ CLI::setResource('queueForCertificates', function (Publisher $publisher) {
}, ['publisher']);
CLI::setResource('logError', function (Registry $register) {
return function (Throwable $error, string $namespace, string $action) use ($register) {
Console::error('[Error] Timestamp: ' . date('c', time()));
Console::error('[Error] Type: ' . get_class($error));
Console::error('[Error] Message: ' . $error->getMessage());
Console::error('[Error] File: ' . $error->getFile());
Console::error('[Error] Line: ' . $error->getLine());
Console::error('[Error] Trace: ' . $error->getTraceAsString());
$logger = $register->get('logger');
if ($logger) {
@@ -261,7 +236,6 @@ CLI::setResource('logError', function (Registry $register) {
$log->addExtra('file', $error->getFile());
$log->addExtra('line', $error->getLine());
$log->addExtra('trace', $error->getTraceAsString());
$log->addExtra('detailedTrace', $error->getTrace());
$log->setAction($action);
@@ -275,41 +249,22 @@ CLI::setResource('logError', function (Registry $register) {
Console::error('Error pushing log: ' . $th->getMessage());
}
}
Console::warning("Failed: {$error->getMessage()}");
Console::warning($error->getTraceAsString());
};
}, ['register']);
CLI::setResource('executor', fn () => new Executor());
CLI::setResource('telemetry', fn () => new NoTelemetry());
$platform = new Appwrite();
$args = $platform->getEnv('argv');
if (!isset($args[0])) {
Console::error('Missing task name');
Console::exit(1);
}
\array_shift($args);
$taskName = $args[0];
$platform->init(Service::TYPE_TASK);
$cli = $platform->getCli();
$cli
->error()
->inject('error')
->inject('logError')
->action(function (Throwable $error, callable $logError) use ($taskName) {
call_user_func_array($logError, [
$error,
'Task',
$taskName,
]);
Timer::clearAll();
->action(function (Throwable $error) {
Console::error($error->getMessage());
});
$cli->shutdown()->action(fn () => Timer::clearAll());
Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
run($cli->run(...));
$cli->run();
+1 -1
View File
@@ -13,7 +13,7 @@ return [
'mastercard' => ['name' => 'Mastercard', 'path' => __DIR__ . '/credit-cards/mastercard.png'],
'naranja' => ['name' => 'Naranja', 'path' => __DIR__ . '/credit-cards/naranja.png'],
'targeta-shopping' => ['name' => 'Tarjeta Shopping', 'path' => __DIR__ . '/credit-cards/tarjeta-shopping.png'],
'unionpay' => ['name' => 'Union Pay', 'path' => __DIR__ . '/credit-cards/unionpay.png'],
'union-china-pay' => ['name' => 'Union China Pay', 'path' => __DIR__ . '/credit-cards/union-china-pay.png'],
'visa' => ['name' => 'Visa', 'path' => __DIR__ . '/credit-cards/visa.png'],
'mir' => ['name' => 'MIR', 'path' => __DIR__ . '/credit-cards/mir.png'],
'maestro' => ['name' => 'Maestro', 'path' => __DIR__ . '/credit-cards/maestro.png'],

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

-102
View File
@@ -364,61 +364,6 @@ return [
'array' => false,
'filters' => ['datetime'],
],
[
'$id' => ID::custom('emailCanonical'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 320,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('emailIsFree'),
'type' => Database::VAR_BOOLEAN,
'format' => '',
'size' => 0,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('emailIsDisposable'),
'type' => Database::VAR_BOOLEAN,
'format' => '',
'size' => 0,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('emailIsCorporate'),
'type' => Database::VAR_BOOLEAN,
'format' => '',
'size' => 0,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('emailIsCanonical'),
'type' => Database::VAR_BOOLEAN,
'format' => '',
'size' => 0,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
],
'indexes' => [
[
@@ -1156,28 +1101,6 @@ return [
'array' => false,
'filters' => ['json', 'encrypt'],
],
[
'$id' => ID::custom('scopes'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => null,
'array' => true,
'filters' => [],
],
[
'$id' => ID::custom('expire'),
'type' => Database::VAR_DATETIME,
'format' => '',
'size' => 0,
'required' => false,
'signed' => false,
'default' => null,
'array' => false,
'filters' => ['datetime'],
],
],
'indexes' => [
[
@@ -1582,17 +1505,6 @@ return [
'required' => true,
'array' => false,
],
[
'$id' => ID::custom('transformations'),
'type' => Database::VAR_BOOLEAN,
'signed' => true,
'size' => 0,
'format' => '',
'filters' => [],
'required' => false,
'array' => false,
'default' => true,
],
[
'$id' => ID::custom('search'),
'type' => Database::VAR_STRING,
@@ -2440,20 +2352,6 @@ return [
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_expired'),
'type' => Database::INDEX_KEY,
'attributes' => ['expired'],
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_session_internal_id'),
'type' => Database::INDEX_KEY,
'attributes' => ['sessionInternalId'],
'lengths' => [],
'orders' => [],
],
],
],
+27 -318
View File
@@ -225,7 +225,7 @@ return [
'$id' => ID::custom('templates'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 1_000_000, // TODO make sure size fits
'size' => 1000000, // TODO make sure size fits
'signed' => true,
'required' => false,
'default' => [],
@@ -287,17 +287,6 @@ return [
'array' => false,
'filters' => ['subQueryKeys'],
],
[
'$id' => ID::custom('devKeys'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 16384,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => ['subQueryDevKeys'],
],
[
'$id' => ID::custom('search'),
'type' => Database::VAR_STRING,
@@ -367,21 +356,7 @@ return [
'attributes' => ['pingedAt'],
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_database'),
'type' => Database::INDEX_KEY,
'attributes' => ['database'],
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_region_accessed_at'),
'type' => Database::INDEX_KEY,
'attributes' => ['region', 'accessedAt'],
'lengths' => [],
'orders' => [],
],
]
],
],
@@ -407,7 +382,7 @@ return [
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'required' => true,
'default' => null,
'array' => false,
'filters' => [],
@@ -505,20 +480,6 @@ return [
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_project_id_region'),
'type' => Database::INDEX_KEY,
'attributes' => ['projectId', 'region'],
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_region_rt_active'),
'type' => Database::INDEX_KEY,
'attributes' => ['region', 'resourceType', 'active'],
'lengths' => [],
'orders' => [],
],
],
],
@@ -728,107 +689,6 @@ return [
],
],
'devKeys' => [
'$collection' => ID::custom(Database::METADATA),
'$id' => ID::custom('devKeys'),
'name' => 'Dev keys',
'attributes' => [
[
'$id' => ID::custom('projectInternalId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => true,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('projectId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => true,
'default' => 0,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('name'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => true,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('secret'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 512, // var_dump of \bin2hex(\random_bytes(128)) => string(256) doubling for encryption
'signed' => true,
'required' => true,
'default' => null,
'array' => false,
'filters' => ['encrypt'],
],
[
'$id' => ID::custom('expire'),
'type' => Database::VAR_DATETIME,
'format' => '',
'size' => 0,
'signed' => false,
'required' => false,
'default' => null,
'array' => false,
'filters' => ['datetime'],
],
[
'$id' => ID::custom('accessedAt'),
'type' => Database::VAR_DATETIME,
'format' => '',
'size' => 0,
'signed' => false,
'required' => false,
'default' => null,
'array' => false,
'filters' => ['datetime'],
],
[
'$id' => ID::custom('sdks'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => true,
'default' => null,
'array' => true,
'filters' => [],
],
],
'indexes' => [
[
'$id' => ID::custom('_key_project'),
'type' => Database::INDEX_KEY,
'attributes' => ['projectInternalId'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_accessedAt',
'type' => Database::INDEX_KEY,
'attributes' => ['accessedAt'],
'lengths' => [],
'orders' => [],
],
],
],
'webhooks' => [
'$collection' => ID::custom(Database::METADATA),
'$id' => ID::custom('webhooks'),
@@ -1153,10 +1013,21 @@ return [
'filters' => [],
],
[
'$id' => ID::custom('type'), // 'api', 'redirect', 'deployment' (site or function)
'$id' => ID::custom('resourceType'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 32,
'size' => 100,
'signed' => true,
'required' => true,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('resourceInternalId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => null,
@@ -1164,104 +1035,16 @@ return [
'filters' => [],
],
[
'$id' => ID::custom('trigger'), // 'manual', 'deployment', '' (empty)
'$id' => ID::custom('resourceId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 32,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('redirectUrl'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 2048,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('redirectStatusCode'),
'type' => Database::VAR_INTEGER,
'format' => '',
'size' => 0,
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentResourceType'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 32,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentInternalId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentResourceId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentResourceInternalId'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('deploymentVcsProviderBranch'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => Database::LENGTH_KEY,
'signed' => true,
'required' => false,
'default' => '',
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('status'),
'type' => Database::VAR_STRING,
@@ -1284,17 +1067,6 @@ return [
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('search'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 16384,
'signed' => true,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('owner'),
'type' => Database::VAR_STRING,
@@ -1319,13 +1091,6 @@ return [
],
],
'indexes' => [
[
'$id' => ID::custom('_key_search'),
'type' => Database::INDEX_FULLTEXT,
'attributes' => ['search'],
'lengths' => [],
'orders' => [],
],
[
'$id' => ID::custom('_key_domain'),
'type' => Database::INDEX_UNIQUE,
@@ -1348,59 +1113,24 @@ return [
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_type',
'$id' => '_key_resourceInternalId',
'type' => Database::INDEX_KEY,
'attributes' => ['type'],
'lengths' => [32],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_trigger',
'type' => Database::INDEX_KEY,
'attributes' => ['trigger'],
'lengths' => [32],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentResourceType',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentResourceType'],
'lengths' => [32],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentResourceId',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentResourceId'],
'attributes' => ['resourceInternalId'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentResourceInternalId',
'$id' => '_key_resourceId',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentResourceInternalId'],
'attributes' => ['resourceId'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentId',
'$id' => '_key_resourceType',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentId'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentInternalId',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentInternalId'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => '_key_deploymentVcsProviderBranch',
'type' => Database::INDEX_KEY,
'attributes' => ['deploymentVcsProviderBranch'],
'lengths' => [Database::LENGTH_KEY],
'attributes' => ['resourceType'],
'lengths' => [],
'orders' => [Database::ORDER_ASC],
],
[
@@ -1417,13 +1147,6 @@ return [
'lengths' => [16],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => ID::custom('_key_piid_riid_rt'),
'type' => Database::INDEX_KEY,
'attributes' => ['projectInternalId', 'deploymentInternalId', 'deploymentResourceType'],
'lengths' => [],
'orders' => [],
],
],
],
@@ -1719,14 +1442,7 @@ return [
'attributes' => ['resourceType'],
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => ID::custom('_key_piid_riid_rt'),
'type' => Database::INDEX_KEY,
'attributes' => ['projectInternalId', 'resourceInternalId', 'resourceType'],
'lengths' => [],
'orders' => [],
],
]
],
],
@@ -1874,13 +1590,6 @@ return [
'lengths' => [Database::LENGTH_KEY],
'orders' => [Database::ORDER_ASC],
],
[
'$id' => ID::custom('_key_piid_prid_rt'),
'type' => Database::INDEX_KEY,
'attributes' => ['projectInternalId', 'providerRepositoryId'],
'lengths' => [],
'orders' => [],
],
],
],
@@ -1890,5 +1599,5 @@ return [
'name' => 'vcsCommentLocks',
'attributes' => [],
'indexes' => []
],
]
];
File diff suppressed because it is too large Load Diff
+4 -6
View File
@@ -5,13 +5,13 @@
*/
use Appwrite\Auth\Auth;
use Appwrite\Network\Platform;
use Appwrite\Network\Validator\Origin;
use Utopia\Database\Helpers\ID;
use Utopia\System\System;
$console = [
'$id' => ID::custom('console'),
'$sequence' => ID::custom('console'),
'$internalId' => ID::custom('console'),
'name' => 'Appwrite',
'$collection' => ID::custom('projects'),
'description' => 'Appwrite core engine',
@@ -23,7 +23,7 @@ $console = [
[
'$collection' => ID::custom('platforms'),
'name' => 'Localhost',
'type' => Platform::TYPE_WEB,
'type' => Origin::CLIENT_TYPE_WEB,
'hostname' => 'localhost',
], // Current host is added on app init
],
@@ -39,8 +39,7 @@ $console = [
'invites' => System::getEnv('_APP_CONSOLE_INVITES', 'enabled') === 'enabled',
'limit' => (System::getEnv('_APP_CONSOLE_WHITELIST_ROOT', 'enabled') === 'enabled') ? 1 : 0, // limit signup to 1 user
'duration' => Auth::TOKEN_EXPIRATION_LOGIN_LONG, // 1 Year in seconds
'sessionAlerts' => System::getEnv('_APP_CONSOLE_SESSION_ALERTS', 'disabled') === 'enabled',
'invalidateSessions' => true
'sessionAlerts' => System::getEnv('_APP_CONSOLE_SESSION_ALERTS', 'disabled') === 'enabled'
],
'authWhitelistEmails' => (!empty(System::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null))) ? \explode(',', System::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null)) : [],
'authWhitelistIPs' => (!empty(System::getEnv('_APP_CONSOLE_WHITELIST_IPS', null))) ? \explode(',', System::getEnv('_APP_CONSOLE_WHITELIST_IPS', null)) : [],
@@ -49,7 +48,6 @@ $console = [
'githubSecret' => System::getEnv('_APP_CONSOLE_GITHUB_SECRET', ''),
'githubAppid' => System::getEnv('_APP_CONSOLE_GITHUB_APP_ID', '')
],
'smtpBaseTemplate' => APP_BRANDED_EMAIL_BASE_TEMPLATE,
];
return $console;
+8 -314
View File
@@ -69,14 +69,9 @@ return [
'description' => 'The request contains one or more invalid arguments. Please refer to the endpoint documentation.',
'code' => 400,
],
Exception::GENERAL_ATTRIBUTE_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_ATTRIBUTE_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current attribute.',
'code' => 400,
],
Exception::GENERAL_COLUMN_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_COLUMN_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current column.',
Exception::GENERAL_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited.',
'code' => 400,
],
Exception::GENERAL_QUERY_INVALID => [
@@ -86,7 +81,7 @@ return [
],
Exception::GENERAL_ROUTE_NOT_FOUND => [
'name' => Exception::GENERAL_ROUTE_NOT_FOUND,
'description' => 'Route not found. Please ensure the endpoint is configured correctly and that the API route is valid for this SDK version. Refer to the API docs for more details.',
'description' => 'The requested route was not found. Please refer to the API docs and try again.',
'code' => 404,
],
Exception::GENERAL_CURSOR_NOT_FOUND => [
@@ -211,11 +206,6 @@ return [
'description' => 'User with the requested ID could not be found.',
'code' => 404,
],
Exception::USER_EMAIL_NOT_FOUND => [
'name' => Exception::USER_EMAIL_NOT_FOUND,
'description' => 'User email could not be found.',
'code' => 400,
],
Exception::USER_EMAIL_ALREADY_EXISTS => [
'name' => Exception::USER_EMAIL_ALREADY_EXISTS,
'description' => 'A user with the same email already exists in the current project.',
@@ -317,21 +307,11 @@ return [
'description' => 'OAuth2 provider returned some error.',
'code' => 424,
],
Exception::USER_EMAIL_NOT_VERIFIED => [
'name' => Exception::USER_EMAIL_NOT_VERIFIED,
'description' => 'User email is not verified',
'code' => 400,
],
Exception::USER_EMAIL_ALREADY_VERIFIED => [
'name' => Exception::USER_EMAIL_ALREADY_VERIFIED,
'description' => 'User email is already verified',
'code' => 409,
],
Exception::USER_PHONE_NOT_VERIFIED => [
'name' => Exception::USER_PHONE_NOT_VERIFIED,
'description' => 'User phone is not verified',
'code' => 400,
],
Exception::USER_PHONE_ALREADY_VERIFIED => [
'name' => Exception::USER_PHONE_ALREADY_VERIFIED,
'description' => 'User phone is already verified',
@@ -395,13 +375,6 @@ return [
'code' => 409,
],
/** Console */
Exception::RESOURCE_ALREADY_EXISTS => [
'name' => Exception::RESOURCE_ALREADY_EXISTS,
'description' => 'Resource with the requested ID already exists. Please choose a different ID and try again.',
'code' => 409,
],
/** Membership */
Exception::MEMBERSHIP_NOT_FOUND => [
'name' => Exception::MEMBERSHIP_NOT_FOUND,
@@ -413,16 +386,6 @@ return [
'description' => 'Membership is already confirmed.',
'code' => 409,
],
Exception::MEMBERSHIP_DELETION_PROHIBITED => [
'name' => Exception::MEMBERSHIP_DELETION_PROHIBITED,
'description' => 'Membership deletion is prohibited.',
'code' => 400,
],
Exception::MEMBERSHIP_DOWNGRADE_PROHIBITED => [
'name' => Exception::MEMBERSHIP_DOWNGRADE_PROHIBITED,
'description' => 'Membership role downgrade is prohibited.',
'code' => 400,
],
/** Avatars */
Exception::AVATAR_SET_NOT_FOUND => [
@@ -450,11 +413,6 @@ return [
'description' => 'The requested favicon could not be found.',
'code' => 404,
],
Exception::AVATAR_SVG_SANITIZATION_FAILED => [
'name' => Exception::AVATAR_SVG_SANITIZATION_FAILED,
'description' => 'SVG sanitization failed.',
'code' => 400,
],
/** Storage */
Exception::STORAGE_FILE_ALREADY_EXISTS => [
@@ -522,28 +480,6 @@ return [
'description' => 'The requested file is not publicly readable.',
'code' => 403,
],
Exception::STORAGE_BUCKET_TRANSFORMATIONS_DISABLED => [
'name' => Exception::STORAGE_BUCKET_TRANSFORMATIONS_DISABLED,
'description' => 'Image transformations are disabled for the requested bucket.',
'code' => 403,
],
/** Tokens */
Exception::TOKEN_NOT_FOUND => [
'name' => Exception::TOKEN_NOT_FOUND,
'description' => 'The requested file token could not be found.',
'code' => 404,
],
Exception::TOKEN_EXPIRED => [
'name' => Exception::TOKEN_EXPIRED,
'description' => 'The requested file token has expired.',
'code' => 401,
],
Exception::TOKEN_RESOURCE_TYPE_INVALID => [
'name' => Exception::TOKEN_RESOURCE_TYPE_INVALID,
'description' => 'The resource type for the token is invalid.',
'code' => 400,
],
/** VCS */
Exception::INSTALLATION_NOT_FOUND => [
@@ -583,13 +519,8 @@ return [
'description' => 'The requested runtime is either inactive or unsupported. Please check the value of the _APP_FUNCTIONS_RUNTIMES environment variable.',
'code' => 404,
],
Exception::FUNCTION_ALREADY_EXISTS => [
'name' => Exception::FUNCTION_ALREADY_EXISTS,
'description' => 'Function with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::FUNCTION_ENTRYPOINT_MISSING => [
'name' => Exception::FUNCTION_ENTRYPOINT_MISSING,
'name' => Exception::FUNCTION_RUNTIME_UNSUPPORTED,
'description' => 'Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function\'s "Settings" > "Configuration" > "Entrypoint".',
'code' => 404,
],
@@ -603,28 +534,6 @@ return [
'description' => 'Function Template with the requested ID could not be found.',
'code' => 404,
],
Exception::FUNCTION_RUNTIME_NOT_DETECTED => [
'name' => Exception::FUNCTION_RUNTIME_NOT_DETECTED,
'description' => 'Function runtime could not be detected.',
'code' => 400,
],
Exception::FUNCTION_EXECUTE_PERMISSION_MISSING => [
'name' => Exception::FUNCTION_EXECUTE_PERMISSION_MISSING,
'description' => 'To execute function using domain, execute permissions must include "any" or "guests".',
'code' => 401,
],
/** Sites */
Exception::SITE_NOT_FOUND => [
'name' => Exception::SITE_NOT_FOUND,
'description' => 'Site with the requested ID could not be found.',
'code' => 404,
],
Exception::SITE_TEMPLATE_NOT_FOUND => [
'name' => Exception::SITE_TEMPLATE_NOT_FOUND,
'description' => 'Site Template with the requested ID could not be found.',
'code' => 404,
],
/** Builds */
Exception::BUILD_NOT_FOUND => [
@@ -647,16 +556,6 @@ return [
'description' => 'Build with the requested ID is already completed and cannot be canceled.',
'code' => 400,
],
Exception::BUILD_CANCELED => [
'name' => Exception::BUILD_CANCELED,
'description' => 'Build with the requested ID has been canceled.',
'code' => 400,
],
Exception::BUILD_FAILED => [
'name' => Exception::BUILD_FAILED,
'description' => 'Build with the requested ID failed. Please check the logs for more information.',
'code' => 400,
],
/** Deployments */
Exception::DEPLOYMENT_NOT_FOUND => [
@@ -678,13 +577,6 @@ return [
'code' => 400,
],
/** Logs */
Exception::LOG_NOT_FOUND => [
'name' => Exception::LOG_NOT_FOUND,
'description' => 'Log with the requested ID could not be found.',
'code' => 404,
],
/** Databases */
Exception::DATABASE_NOT_FOUND => [
'name' => Exception::DATABASE_NOT_FOUND,
@@ -701,11 +593,6 @@ return [
'description' => 'Database timed out. Try adjusting your queries or adding an index.',
'code' => 408
],
Exception::DATABASE_QUERY_ORDER_NULL => [
'name' => Exception::DATABASE_QUERY_ORDER_NULL,
'description' => 'The order attribute/column had a null value. Cursor pagination requires all documents/rows order attribute/column values are non-null.',
'code' => 400,
],
/** Collections */
Exception::COLLECTION_NOT_FOUND => [
@@ -724,23 +611,6 @@ return [
'code' => 400,
],
/** Tables */
Exception::TABLE_NOT_FOUND => [
'name' => Exception::TABLE_NOT_FOUND,
'description' => 'Table with the requested ID could not be found.',
'code' => 404,
],
Exception::TABLE_ALREADY_EXISTS => [
'name' => Exception::TABLE_ALREADY_EXISTS,
'description' => 'A table with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::TABLE_LIMIT_EXCEEDED => [
'name' => Exception::TABLE_LIMIT_EXCEEDED,
'description' => 'The maximum number of tables has been reached.',
'code' => 400,
],
/** Documents */
Exception::DOCUMENT_NOT_FOUND => [
'name' => Exception::DOCUMENT_NOT_FOUND,
@@ -778,43 +648,6 @@ return [
'code' => 403,
],
/** Rows */
Exception::ROW_NOT_FOUND => [
'name' => Exception::ROW_NOT_FOUND,
'description' => 'Row with the requested ID could not be found.',
'code' => 404,
],
Exception::ROW_INVALID_STRUCTURE => [
'name' => Exception::ROW_INVALID_STRUCTURE,
'description' => 'The row structure is invalid. Please ensure the columns match the table definition.',
'code' => 400,
],
Exception::ROW_MISSING_DATA => [
'name' => Exception::ROW_MISSING_DATA,
'description' => 'The row data is missing. Try again with row data populated',
'code' => 400,
],
Exception::ROW_MISSING_PAYLOAD => [
'name' => Exception::ROW_MISSING_PAYLOAD,
'description' => 'The row data and permissions are missing. You must provide either row data or permissions to be updated.',
'code' => 400,
],
Exception::ROW_ALREADY_EXISTS => [
'name' => Exception::ROW_ALREADY_EXISTS,
'description' => 'Row with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::ROW_UPDATE_CONFLICT => [
'name' => Exception::ROW_UPDATE_CONFLICT,
'description' => 'Remote row is newer than local.',
'code' => 409,
],
Exception::ROW_DELETE_RESTRICTED => [
'name' => Exception::ROW_DELETE_RESTRICTED,
'description' => 'Row cannot be deleted because it is referenced by another row.',
'code' => 403,
],
/** Attributes */
Exception::ATTRIBUTE_NOT_FOUND => [
'name' => Exception::ATTRIBUTE_NOT_FOUND,
@@ -861,81 +694,16 @@ return [
'description' => 'The attribute type is invalid.',
'code' => 400,
],
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
'description' => 'Existing data is too large for new size, truncate your existing data then try again.',
'code' => 400,
],
Exception::ATTRIBUTE_TYPE_NOT_SUPPORTED => [
'name' => Exception::ATTRIBUTE_TYPE_NOT_SUPPORTED,
'description' => 'Attribute type is not supported.',
'code' => 400,
],
/** Exists for both Attributes & Columns */
Exception::RELATIONSHIP_VALUE_INVALID => [
'name' => Exception::RELATIONSHIP_VALUE_INVALID,
'description' => 'The relationship value is invalid.',
'code' => 400,
],
/** Columns */
Exception::COLUMN_NOT_FOUND => [
'name' => Exception::COLUMN_NOT_FOUND,
'description' => 'Column with the requested ID could not be found.',
'code' => 404,
],
Exception::COLUMN_UNKNOWN => [
'name' => Exception::COLUMN_UNKNOWN,
'description' => 'The column required for the index could not be found. Please confirm all your columns are in the available state.',
'code' => 400,
],
Exception::COLUMN_NOT_AVAILABLE => [
'name' => Exception::COLUMN_NOT_AVAILABLE,
'description' => 'The requested column is not yet available. Please try again later.',
'code' => 400,
],
Exception::COLUMN_FORMAT_UNSUPPORTED => [
'name' => Exception::COLUMN_FORMAT_UNSUPPORTED,
'description' => 'The requested column format is not supported.',
'code' => 400,
],
Exception::COLUMN_DEFAULT_UNSUPPORTED => [
'name' => Exception::COLUMN_DEFAULT_UNSUPPORTED,
'description' => 'Default values cannot be set for array or required columns.',
'code' => 400,
],
Exception::COLUMN_ALREADY_EXISTS => [
'name' => Exception::COLUMN_ALREADY_EXISTS,
'description' => 'Column with the requested key already exists. Column keys must be unique, try again with a different key.',
'code' => 409,
],
Exception::COLUMN_LIMIT_EXCEEDED => [
'name' => Exception::COLUMN_LIMIT_EXCEEDED,
'description' => 'The maximum number or size of columns for this table has been reached.',
'code' => 400,
],
Exception::COLUMN_VALUE_INVALID => [
'name' => Exception::COLUMN_VALUE_INVALID,
'description' => 'The column value is invalid. Please check the type, range and value of the column.',
'code' => 400,
],
Exception::COLUMN_TYPE_INVALID => [
'name' => Exception::COLUMN_TYPE_INVALID,
'description' => 'The column type is invalid.',
'code' => 400,
],
Exception::COLUMN_INVALID_RESIZE => [
'name' => Exception::COLUMN_INVALID_RESIZE,
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
'description' => "Existing data is too large for new size, truncate your existing data then try again.",
'code' => 400,
],
Exception::COLUMN_TYPE_NOT_SUPPORTED => [
'name' => Exception::COLUMN_TYPE_NOT_SUPPORTED,
'description' => 'Column type is not supported.',
'code' => 400,
],
/** Indexes */
Exception::INDEX_NOT_FOUND => [
@@ -964,75 +732,6 @@ return [
'code' => 409,
],
/** Column Indexes, same as Indexes but with different type */
Exception::COLUMN_INDEX_NOT_FOUND => [
'name' => Exception::COLUMN_INDEX_NOT_FOUND,
'description' => 'Index with the requested ID could not be found.',
'code' => 404,
],
Exception::COLUMN_INDEX_LIMIT_EXCEEDED => [
'name' => Exception::COLUMN_INDEX_LIMIT_EXCEEDED,
'description' => 'The maximum number of indexes has been reached.',
'code' => 400,
],
Exception::COLUMN_INDEX_ALREADY_EXISTS => [
'name' => Exception::COLUMN_INDEX_ALREADY_EXISTS,
'description' => 'Index with the requested key already exists. Try again with a different key.',
'code' => 409,
],
Exception::COLUMN_INDEX_INVALID => [
'name' => Exception::COLUMN_INDEX_INVALID,
'description' => 'Index invalid.',
'code' => 400,
],
Exception::COLUMN_INDEX_DEPENDENCY => [
'name' => Exception::COLUMN_INDEX_DEPENDENCY,
'description' => 'Column cannot be renamed or deleted. Please remove the associated index first.',
'code' => 409,
],
/** Transactions */
Exception::TRANSACTION_NOT_FOUND => [
'name' => Exception::TRANSACTION_NOT_FOUND,
'description' => 'Transaction with the requested ID could not be found.',
'code' => 404,
],
Exception::TRANSACTION_ALREADY_EXISTS => [
'name' => Exception::TRANSACTION_ALREADY_EXISTS,
'description' => 'Transaction with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::TRANSACTION_INVALID => [
'name' => Exception::TRANSACTION_INVALID,
'description' => 'The transaction is invalid. Please check the transaction state and try again.',
'code' => 400,
],
Exception::TRANSACTION_FAILED => [
'name' => Exception::TRANSACTION_FAILED,
'description' => 'The transaction has errored. Please check the transaction data and try again.',
'code' => 400,
],
Exception::TRANSACTION_EXPIRED => [
'name' => Exception::TRANSACTION_EXPIRED,
'description' => 'The transaction has expired. Please create a new transaction and try again.',
'code' => 410,
],
Exception::TRANSACTION_CONFLICT => [
'name' => Exception::TRANSACTION_CONFLICT,
'description' => 'The transaction has a conflict. Please resolve the conflict and try again.',
'code' => 409,
],
Exception::TRANSACTION_LIMIT_EXCEEDED => [
'name' => Exception::TRANSACTION_LIMIT_EXCEEDED,
'description' => 'The maximum number of operations per transaction has been exceeded.',
'code' => 400,
],
Exception::TRANSACTION_NOT_READY => [
'name' => Exception::TRANSACTION_NOT_READY,
'description' => 'The transaction is not ready yet. Please try again later.',
'code' => 400,
],
/** Project Errors */
Exception::PROJECT_NOT_FOUND => [
'name' => Exception::PROJECT_NOT_FOUND,
@@ -1102,7 +801,7 @@ return [
Exception::RULE_VERIFICATION_FAILED => [
'name' => Exception::RULE_VERIFICATION_FAILED,
'description' => 'Domain verification failed. Please check if your DNS records are correct and try again.',
'code' => 400,
'code' => 401,
'publish' => true
],
Exception::PROJECT_SMTP_CONFIG_INVALID => [
@@ -1145,11 +844,6 @@ return [
'description' => 'Variable with the same ID already exists in this project. Try again with a different ID.',
'code' => 409,
],
Exception::VARIABLE_CANNOT_UNSET_SECRET => [
'name' => Exception::VARIABLE_CANNOT_UNSET_SECRET,
'description' => 'Secret variables cannot be marked as non-secret. Please re-create the variable if this is your intention.',
'code' => 400,
],
Exception::GRAPHQL_NO_QUERY => [
'name' => Exception::GRAPHQL_NO_QUERY,
'description' => 'Param "query" is not optional.',
+10 -106
View File
@@ -95,65 +95,6 @@ return [
'$model' => Response::MODEL_DATABASE,
'$resource' => true,
'$description' => 'This event triggers on any database event.',
'tables' => [
'$model' => Response::MODEL_TABLE,
'$resource' => true,
'$description' => 'This event triggers on any table event.',
'rows' => [
'$model' => Response::MODEL_ROW,
'$resource' => true,
'$description' => 'This event triggers on any rows event.',
'create' => [
'$description' => 'This event triggers when a row is created.',
],
'update' => [
'$description' => 'This event triggers when a row is updated.'
],
'upsert' => [
'$description' => 'This event triggers when a document is upserted.',
],
'delete' => [
'$description' => 'This event triggers when a row is deleted.'
],
],
'indexes' => [
'$model' => Response::MODEL_COLUMN_INDEX,
'$resource' => true,
'$description' => 'This event triggers on any indexes event.',
'create' => [
'$description' => 'This event triggers when an index is created.',
],
'update' => [
'$description' => 'This event triggers when an index is updated.',
],
'delete' => [
'$description' => 'This event triggers when an index is deleted.'
]
],
'columns' => [
'$model' => Response::MODEL_COLUMN,
'$resource' => true,
'$description' => 'This event triggers on any columns event.',
'create' => [
'$description' => 'This event triggers when a column is created.',
],
'delete' => [
'$description' => 'This event triggers when an column is deleted.'
],
'update' => [
'$description' => 'This event triggers when a column is created.',
],
],
'create' => [
'$description' => 'This event triggers when a table is created.'
],
'update' => [
'$description' => 'This event triggers when a table is updated.',
],
'delete' => [
'$description' => 'This event triggers when a table is deleted.',
],
],
'collections' => [
'$model' => Response::MODEL_COLLECTION,
'$resource' => true,
@@ -165,15 +106,12 @@ return [
'create' => [
'$description' => 'This event triggers when a document is created.',
],
'update' => [
'$description' => 'This event triggers when a document is updated.'
],
'upsert' => [
'$description' => 'This event triggers when a document is upserted.',
],
'delete' => [
'$description' => 'This event triggers when a document is deleted.'
],
'update' => [
'$description' => 'This event triggers when a document is updated.'
],
],
'indexes' => [
'$model' => Response::MODEL_INDEX,
@@ -184,10 +122,7 @@ return [
],
'delete' => [
'$description' => 'This event triggers when an index is deleted.'
],
'update' => [
'$description' => 'This event triggers when a column is created.',
],
]
],
'attributes' => [
'$model' => Response::MODEL_ATTRIBUTE,
@@ -196,9 +131,6 @@ return [
'create' => [
'$description' => 'This event triggers when an attribute is created.',
],
'update' => [
'$description' => 'This event triggers when a column is created.',
],
'delete' => [
'$description' => 'This event triggers when an attribute is deleted.'
]
@@ -206,22 +138,22 @@ return [
'create' => [
'$description' => 'This event triggers when a collection is created.'
],
'update' => [
'$description' => 'This event triggers when a collection is updated.',
],
'delete' => [
'$description' => 'This event triggers when a collection is deleted.',
],
'update' => [
'$description' => 'This event triggers when a collection is updated.',
]
],
'create' => [
'$description' => 'This event triggers when a database is created.'
],
'update' => [
'$description' => 'This event triggers when a database is updated.',
],
'delete' => [
'$description' => 'This event triggers when a database is deleted.',
],
'update' => [
'$description' => 'This event triggers when a database is updated.',
]
],
'buckets' => [
'$model' => Response::MODEL_BUCKET,
@@ -285,34 +217,6 @@ return [
],
]
],
'sites' => [
'$model' => Response::MODEL_SITE,
'$resource' => true,
'$description' => 'This event triggers on any sites event.',
'deployments' => [
'$model' => Response::MODEL_DEPLOYMENT,
'$resource' => true,
'$description' => 'This event triggers on any deployments event.',
'create' => [
'$description' => 'This event triggers when a deployment is created.',
],
'delete' => [
'$description' => 'This event triggers when a deployment is deleted.'
],
'update' => [
'$description' => 'This event triggers when a deployment is updated.'
],
],
'create' => [
'$description' => 'This event triggers when a site is created.'
],
'delete' => [
'$description' => 'This event triggers when a site is deleted.',
],
'update' => [
'$description' => 'This event triggers when a site is updated.',
]
],
'functions' => [
'$model' => Response::MODEL_FUNCTION,
'$resource' => true,
-338
View File
@@ -1,338 +0,0 @@
<?php
/**
* List of Appwrite Sites supported frameworks
*/
use Utopia\Config\Config;
$templateRuntimes = Config::getParam('template-runtimes');
function getVersions(array $versions, string $prefix)
{
return array_map(function ($version) use ($prefix) {
return $prefix . '-' . $version;
}, $versions);
}
return [
'analog' => [
'key' => 'analog',
'name' => 'Analog',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/analog/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/analog/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/analog',
'startCommand' => 'bash helpers/analog/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/analog/public',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
]
]
],
'angular' => [
'key' => 'angular',
'name' => 'Angular',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/angular/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/angular/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/angular',
'startCommand' => 'bash helpers/angular/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/angular/browser',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.csr.html'
]
]
],
'nextjs' => [
'key' => 'nextjs',
'name' => 'Next.js',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/next-js/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/next-js/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './.next',
'startCommand' => 'bash helpers/next-js/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './out',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'react' => [
'key' => 'react',
'name' => 'React',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
]
]
],
'nuxt' => [
'key' => 'nuxt',
'name' => 'Nuxt',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/nuxt/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/nuxt/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './.output',
'startCommand' => 'bash helpers/nuxt/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run generate',
'installCommand' => 'npm install',
'outputDirectory' => './output/public',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'vue' => [
'key' => 'vue',
'name' => 'Vue.js',
'screenshotSleep' => 5000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
]
]
],
'sveltekit' => [
'key' => 'sveltekit',
'name' => 'SvelteKit',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/sveltekit/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/sveltekit/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './build',
'startCommand' => 'bash helpers/sveltekit/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './build',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'astro' => [
'key' => 'astro',
'name' => 'Astro',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/astro/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/astro/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/astro/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'tanstack-start' => [
'key' => 'tanstack-start',
'name' => 'TanStack Start',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/tanstack-start/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/tanstack-start/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/tanstack-start/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/client',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'remix' => [
'key' => 'remix',
'name' => 'Remix',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/remix/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/remix/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './build',
'startCommand' => 'bash helpers/remix/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './build/client',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'lynx' => [
'key' => 'lynx',
'name' => 'Lynx',
'screenshotSleep' => 5000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
]
]
],
'flutter' => [
'key' => 'flutter',
'name' => 'Flutter',
'screenshotSleep' => 5000,
'buildRuntime' => 'flutter-3.35',
'runtimes' => getVersions($templateRuntimes['FLUTTER']['versions'], 'flutter'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'flutter build web --release -t lib/main.dart',
'installCommand' => 'flutter pub get',
'outputDirectory' => './build/web',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
],
],
],
'react-native' => [
'key' => 'react-native',
'name' => 'React Native',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
'fallbackFile' => 'index.html'
]
]
],
'vite' => [
'key' => 'vite',
'name' => 'Vite',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/server.sh',
],
]
],
'other' => [
'key' => 'other',
'name' => 'Other',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'adapters' => [
'static' => [
'key' => 'static',
'buildCommand' => '',
'installCommand' => '',
'outputDirectory' => './',
'startCommand' => 'bash helpers/server.sh',
],
]
],
];
@@ -1,8 +1,39 @@
<?php
use Utopia\Config\Config;
$templateRuntimes = Config::getParam('template-runtimes');
const TEMPLATE_RUNTIMES = [
'NODE' => [
'name' => 'node',
'versions' => ['22', '21.0', '20.0', '19.0', '18.0', '16.0', '14.5']
],
'PYTHON' => [
'name' => 'python',
'versions' => ['3.12', '3.11', '3.10', '3.9', '3.8']
],
'DART' => [
'name' => 'dart',
'versions' => ['3.5', '3.3', '3.1', '3.0', '2.19', '2.18', '2.17', '2.16']
],
'GO' => [
'name' => 'go',
'versions' => ['1.23']
],
'PHP' => [
'name' => 'php',
'versions' => ['8.3', '8.2', '8.1', '8.0']
],
'DENO' => [
'name' => 'deno',
'versions' => ['2.0', '1.46', '1.40', '1.35', '1.24', '1.21']
],
'BUN' => [
'name' => 'bun',
'versions' => ['1.1', '1.0']
],
'RUBY' => [
'name' => 'ruby',
'versions' => ['3.3', '3.2', '3.1', '3.0']
],
];
function getRuntimes($runtime, $commands, $entrypoint, $providerRootDirectory, $versionsDenyList = [])
{
@@ -23,7 +54,6 @@ return [
'icon' => 'icon-lightning-bolt',
'id' => 'starter',
'name' => 'Starter function',
'score' => 5,
'tagline' =>
'A simple function to get started. Edit this function to explore endless possibilities with Appwrite Functions.',
'permissions' => ['any'],
@@ -32,24 +62,24 @@ return [
'timeout' => 15,
'useCases' => ['starter'],
'runtimes' => [
...getRuntimes($templateRuntimes['NODE'], 'npm install', 'src/main.js', 'node/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['NODE'], 'npm install', 'src/main.js', 'node/starter'),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/starter'
),
...getRuntimes($templateRuntimes['DART'], 'dart pub get', 'lib/main.dart', 'dart/starter'),
...getRuntimes($templateRuntimes['GO'], '', 'main.go', 'go/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['DART'], 'dart pub get', 'lib/main.dart', 'dart/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['GO'], '', 'main.go', 'go/starter'),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/starter'
),
...getRuntimes($templateRuntimes['DENO'], 'deno cache src/main.ts', 'src/main.ts', 'deno/starter'),
...getRuntimes($templateRuntimes['BUN'], 'bun install', 'src/main.ts', 'bun/starter'),
...getRuntimes($templateRuntimes['RUBY'], 'bundle install', 'lib/main.rb', 'ruby/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['DENO'], 'deno cache src/main.ts', 'src/main.ts', 'deno/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['BUN'], 'bun install', 'src/main.ts', 'bun/starter'),
...getRuntimes(TEMPLATE_RUNTIMES['RUBY'], 'bundle install', 'lib/main.rb', 'ruby/starter'),
],
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/starter">file</a>.',
'vcsProvider' => 'github',
@@ -63,7 +93,6 @@ return [
'icon' => 'icon-upstash',
'id' => 'query-upstash-vector',
'name' => 'Query Upstash Vector',
'score' => 4,
'tagline' => 'Vector database that stores text embeddings and context retrieval for LLMs',
'permissions' => ['any'],
'events' => [],
@@ -72,7 +101,7 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/query-upstash-vector'
@@ -108,7 +137,6 @@ return [
'icon' => 'icon-redis',
'id' => 'query-redis-labs',
'name' => 'Query Redis Labs',
'score' => 4,
'tagline' => 'Key-value database with advanced caching capabilities.',
'permissions' => ['any'],
'events' => [],
@@ -117,7 +145,7 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/query-redis-labs'
@@ -152,7 +180,6 @@ return [
'icon' => 'icon-neo4j',
'id' => 'query-neo4j-auradb',
'name' => 'Query Neo4j AuraDB',
'score' => 4,
'tagline' => 'Graph database with focus on relations between data.',
'permissions' => ['any'],
'events' => [],
@@ -161,7 +188,7 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/query-neo4j-auradb'
@@ -204,7 +231,6 @@ return [
'icon' => 'icon-mongodb',
'id' => 'query-mongo-atlas',
'name' => 'Query MongoDB Atlas',
'score' => 4,
'tagline' =>
'Realtime NoSQL document database with geospecial, graph, search, and vector suport.',
'permissions' => ['any'],
@@ -214,7 +240,7 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/query-mongo-atlas'
@@ -242,7 +268,6 @@ return [
'icon' => 'icon-neon',
'id' => 'query-neon-postgres',
'name' => 'Query Neon Postgres',
'score' => 4,
'tagline' =>
'Reliable SQL database with replication, point-in-time recovery, and pgvector support.',
'permissions' => ['any'],
@@ -252,7 +277,7 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/query-neon-postgres'
@@ -311,7 +336,6 @@ return [
'icon' => 'icon-open-ai',
'id' => 'prompt-chatgpt',
'name' => 'Prompt ChatGPT',
'score' => 7,
'tagline' => 'Ask questions and let OpenAI GPT-3.5-turbo answer.',
'permissions' => ['any'],
'events' => [],
@@ -320,25 +344,25 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/prompt-chatgpt'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/prompt_chatgpt'
),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/prompt-chatgpt'
),
...getRuntimes(
$templateRuntimes['DART'],
TEMPLATE_RUNTIMES['DART'],
'dart pub get',
'lib/main.dart',
'dart/prompt_chatgpt'
@@ -373,7 +397,6 @@ return [
'icon' => 'icon-discord',
'id' => 'discord-command-bot',
'name' => 'Discord Command Bot',
'score' => 6,
'tagline' => 'Simple command using Discord Interactions.',
'permissions' => ['any'],
'events' => [],
@@ -382,19 +405,19 @@ return [
'useCases' => ['messaging'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/discord-command-bot'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt && python src/setup.py',
'src/main.py',
'python/discord_command_bot'
),
...getRuntimes(
$templateRuntimes['GO'],
TEMPLATE_RUNTIMES['GO'],
'',
'main.go',
'go/discord-command-bot'
@@ -437,7 +460,6 @@ return [
'icon' => 'icon-perspective-api',
'id' => 'analyze-with-perspectiveapi',
'name' => 'Analyze with PerspectiveAPI',
'score' => 5,
'tagline' => 'Automate moderation by getting toxicity of messages.',
'permissions' => ['any'],
'events' => [],
@@ -446,7 +468,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/analyze-with-perspectiveapi'
@@ -473,7 +495,6 @@ return [
'icon' => 'icon-pangea',
'id' => 'censor-with-redact',
'name' => 'Censor with Redact',
'score' => 5,
'tagline' =>
'Censor sensitive information from a provided text string using Redact API by Pangea.',
'permissions' => ['any'],
@@ -483,19 +504,19 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/censor-with-redact'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/censor_with_redact'
),
...getRuntimes(
$templateRuntimes['DART'],
TEMPLATE_RUNTIMES['DART'],
'dart pub get',
'lib/main.dart',
'dart/censor_with_redact'
@@ -522,7 +543,6 @@ return [
'icon' => 'icon-document',
'id' => 'generate-pdf',
'name' => 'Generate PDF',
'score' => 7,
'tagline' => 'Document containing sample invoice in PDF format.',
'permissions' => ['any'],
'events' => [],
@@ -530,7 +550,7 @@ return [
'timeout' => 15,
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes($templateRuntimes['NODE'], 'npm install', 'src/main.js', 'node/generate-pdf')
...getRuntimes(TEMPLATE_RUNTIMES['NODE'], 'npm install', 'src/main.js', 'node/generate-pdf')
],
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-pdf">file</a>.',
'vcsProvider' => 'github',
@@ -544,7 +564,6 @@ return [
'icon' => 'icon-github',
'id' => 'github-issue-bot',
'name' => 'GitHub issue bot',
'score' => 4,
'tagline' =>
'Automate the process of responding to newly opened issues in a GitHub repository.',
'permissions' => ['any'],
@@ -554,7 +573,7 @@ return [
'useCases' => ['dev-tools'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/github-issue-bot'
@@ -589,7 +608,6 @@ return [
'icon' => 'icon-bookmark',
'id' => 'url-shortener',
'name' => 'URL shortener',
'score' => 3,
'tagline' => 'Generate URL with short ID and redirect to the original URL when visited.',
'permissions' => ['any'],
'events' => [],
@@ -598,7 +616,7 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/url-shortener'
@@ -635,13 +653,12 @@ return [
'type' => 'url'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write']
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
],
[
'icon' => 'icon-algolia',
'id' => 'sync-with-algolia',
'name' => 'Sync with Algolia',
'score' => 4,
'tagline' => 'Intuitive search bar for any data in Appwrite Databases.',
'permissions' => ['any'],
'events' => [],
@@ -650,19 +667,19 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/sync-with-algolia'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/sync_with_algolia'
),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/sync-with-algolia'
@@ -717,13 +734,12 @@ return [
'type' => 'password'
],
],
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-meilisearch',
'id' => 'sync-with-meilisearch',
'name' => 'Sync with Meilisearch',
'score' => 4,
'tagline' => 'Intuitive search bar for any data in Appwrite Databases.',
'permissions' => ['any'],
'events' => [],
@@ -732,31 +748,31 @@ return [
'useCases' => ['databases'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/sync-with-meilisearch'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/sync-with-meilisearch'
),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/sync-with-meilisearch'
),
...getRuntimes(
$templateRuntimes['BUN'],
TEMPLATE_RUNTIMES['BUN'],
'bun install',
'src/main.ts',
'bun/sync-with-meilisearch'
),
...getRuntimes(
$templateRuntimes['RUBY'],
TEMPLATE_RUNTIMES['RUBY'],
'bundle install',
'lib/main.rb',
'ruby/sync-with-meilisearch'
@@ -811,13 +827,12 @@ return [
'type' => 'text'
],
],
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-vonage',
'id' => 'whatsapp-with-vonage',
'name' => 'WhatsApp with Vonage',
'score' => 6,
'tagline' => 'Simple bot to answer WhatsApp messages.',
'permissions' => ['any'],
'events' => [],
@@ -826,37 +841,37 @@ return [
'useCases' => ['messaging'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/whatsapp-with-vonage'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/whatsapp_with_vonage'
),
...getRuntimes(
$templateRuntimes['DART'],
TEMPLATE_RUNTIMES['DART'],
'dart pub get',
'lib/main.dart',
'dart/whatsapp-with-vonage'
),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/whatsapp-with-vonage'
),
...getRuntimes(
$templateRuntimes['BUN'],
TEMPLATE_RUNTIMES['BUN'],
'bun install',
'src/main.ts',
'bun/whatsapp-with-vonage'
),
...getRuntimes(
$templateRuntimes['RUBY'],
TEMPLATE_RUNTIMES['RUBY'],
'bundle install',
'lib/main.rb',
'ruby/whatsapp-with-vonage'
@@ -904,7 +919,6 @@ return [
'icon' => 'icon-bell',
'id' => 'push-notification-with-fcm',
'name' => 'Push notification with FCM',
'score' => 4,
'tagline' => 'Send push notifications to your users using Firebase Cloud Messaging (FCM).',
'permissions' => ['any'],
'events' => [],
@@ -913,7 +927,7 @@ return [
'useCases' => ['messaging'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/push-notification-with-fcm'
@@ -961,7 +975,6 @@ return [
'icon' => 'icon-mail',
'id' => 'email-contact-form',
'name' => 'Email contact form',
'score' => 7,
'tagline' => 'Sends an email with the contents of a HTML form.',
'permissions' => ['any'],
'events' => [],
@@ -970,19 +983,19 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/email-contact-form'
),
...getRuntimes(
$templateRuntimes['PYTHON'],
TEMPLATE_RUNTIMES['PYTHON'],
'pip install -r requirements.txt',
'src/main.py',
'python/email_contact_form'
),
...getRuntimes(
$templateRuntimes['PHP'],
TEMPLATE_RUNTIMES['PHP'],
'composer install',
'src/index.php',
'php/email-contact-form'
@@ -1045,7 +1058,6 @@ return [
'icon' => 'icon-stripe',
'id' => 'subscriptions-with-stripe',
'name' => 'Subscriptions with Stripe',
'score' => 6,
'tagline' => 'Receive recurring card payments and grant subscribers extra permissions.',
'permissions' => ['any'],
'events' => [],
@@ -1054,7 +1066,7 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/subscriptions-with-stripe'
@@ -1087,7 +1099,6 @@ return [
'icon' => 'icon-stripe',
'id' => 'payments-with-stripe',
'name' => 'Payments with Stripe',
'score' => 8,
'tagline' => 'Receive card payments and store paid orders.',
'permissions' => ['any'],
'events' => [],
@@ -1096,7 +1107,7 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/payments-with-stripe'
@@ -1139,13 +1150,12 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write']
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
],
[
'icon' => 'icon-chat',
'id' => 'text-generation-with-huggingface',
'name' => 'Text generation',
'score' => 5,
'tagline' => 'Generate text using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => [],
@@ -1154,7 +1164,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/text-generation-with-huggingface'
@@ -1180,7 +1190,6 @@ return [
'icon' => 'icon-translate',
'id' => 'language-translation-with-huggingface',
'name' => 'Language translation',
'score' => 5,
'tagline' => 'Translate text using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => [],
@@ -1189,7 +1198,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/language-translation-with-huggingface'
@@ -1215,7 +1224,6 @@ return [
'icon' => 'icon-eye',
'id' => 'image-classification-with-huggingface',
'name' => 'Image classification',
'score' => 5,
'tagline' => 'Classify images using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => ['buckets.*.files.*.create'],
@@ -1224,7 +1232,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/image-classification-with-huggingface'
@@ -1268,13 +1276,12 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-eye',
'id' => 'object-detection-with-huggingface',
'name' => 'Object detection',
'score' => 5,
'tagline' => 'Detect objects in images using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => ['buckets.*.files.*.create'],
@@ -1283,7 +1290,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/object-detection-with-huggingface'
@@ -1327,13 +1334,12 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-text',
'id' => 'speech-recognition-with-huggingface',
'name' => 'Speech recognition',
'score' => 5,
'tagline' => 'Transcribe audio to text using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => ['buckets.*.files.*.create'],
@@ -1342,7 +1348,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/speech-recognition-with-huggingface'
@@ -1386,25 +1392,21 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-chat',
'id' => 'text-to-speech-with-huggingface',
'name' => 'Text to speech',
'score' => 5,
'tagline' => 'Convert text to speech using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => [
'databases.*.tables.*.rows.*.create',
'databases.*.collections.*.documents.*.create',
],
'events' => ['databases.*.collections.*.documents.*.create'],
'cron' => '',
'timeout' => 15,
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/text-to-speech-with-huggingface'
@@ -1454,7 +1456,6 @@ return [
'icon' => 'icon-chip',
'id' => 'generate-with-replicate',
'name' => 'Generate with Replicate',
'score' => 5,
'tagline' => "Generate text, audio and images using Replicate's API.",
'permissions' => ['any'],
'events' => [],
@@ -1463,7 +1464,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/generate-with-replicate'
@@ -1490,7 +1491,6 @@ return [
'icon' => 'icon-chip',
'id' => 'generate-with-together-ai',
'name' => 'Generate with Together AI',
'score' => 5,
'tagline' => "Generate text and images using Together AI's API.",
'permissions' => ['any'],
'events' => [],
@@ -1499,7 +1499,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/generate-with-together-ai'
@@ -1533,7 +1533,6 @@ return [
'icon' => 'icon-chip',
'id' => 'chat-with-perplexity-ai',
'name' => 'Chat with Perplexity AI',
'score' => 5,
'tagline' => 'Create a chatbot using the Perplexity AI API.',
'permissions' => ['any'],
'events' => [],
@@ -1542,7 +1541,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/chat-with-perplexity-ai'
@@ -1575,7 +1574,6 @@ return [
'icon' => 'icon-chip',
'id' => 'generate-with-replicate',
'name' => 'Generate with Replicate',
'score' => 5,
'tagline' => "Generate text, audio and images using Replicate's API.",
'permissions' => ['any'],
'events' => [],
@@ -1584,7 +1582,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/generate-with-replicate'
@@ -1611,7 +1609,6 @@ return [
'icon' => 'icon-document-search',
'id' => 'sync-with-pinecone',
'name' => 'Sync with Pinecone',
'score' => 4,
'tagline' => "Sync your Appwrite database with Pinecone's vector database.",
'permissions' => ['any'],
'events' => [],
@@ -1620,7 +1617,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/sync-with-pinecone'
@@ -1669,13 +1666,12 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-chip',
'id' => 'rag-with-langchain',
'name' => 'RAG with LangChain',
'score' => 6,
'tagline' => 'Generate text using a LangChain RAG model',
'permissions' => ['any'],
'events' => [],
@@ -1684,7 +1680,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/rag-with-langchain'
@@ -1733,13 +1729,12 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-chat',
'id' => 'speak-with-elevenlabs',
'name' => 'Speak with ElevenLabs',
'score' => 5,
'tagline' => 'Convert text to speech using the ElevenLabs API.',
'permissions' => ['any'],
'cron' => '',
@@ -1748,7 +1743,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/speak-with-elevenlabs'
@@ -1795,7 +1790,6 @@ return [
'icon' => 'icon-chip',
'id' => 'speak-with-lmnt',
'name' => 'Speak with LMNT',
'score' => 5,
'tagline' => 'Convert text to speech using the LMNT API.',
'permissions' => ['any'],
'cron' => '',
@@ -1804,7 +1798,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/speak-with-lmnt'
@@ -1837,7 +1831,6 @@ return [
'icon' => 'icon-chip',
'id' => 'chat-with-anyscale',
'name' => 'Chat with AnyScale',
'score' => 5,
'tagline' => 'Create a chatbot using the AnyScale API.',
'permissions' => ['any'],
'cron' => '',
@@ -1846,7 +1839,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/chat-with-anyscale'
@@ -1879,7 +1872,6 @@ return [
'icon' => 'icon-music-note',
'id' => 'music-generation-with-huggingface',
'name' => 'Music generation',
'score' => 4,
'tagline' => 'Generate music from a text prompt using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => [],
@@ -1888,7 +1880,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install && npm run setup',
'src/main.js',
'node/music-generation-with-huggingface'
@@ -1922,7 +1914,6 @@ return [
'icon' => 'icon-chip',
'id' => 'generate-with-fal-ai',
'name' => 'Generate with fal.ai',
'score' => 5,
'tagline' => "Generate images using fal.ai's API.",
'permissions' => ['any'],
'events' => [],
@@ -1931,7 +1922,7 @@ return [
'useCases' => ['ai'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/generate-with-fal-ai'
@@ -1958,7 +1949,6 @@ return [
'icon' => 'icon-currency-dollar',
'id' => 'subscriptions-with-lemon-squeezy',
'name' => 'Subscriptions with Lemon Squeezy',
'score' => 6,
'tagline' => 'Receive recurring card payments and grant subscribers extra permissions.',
'permissions' => ['any'],
'events' => [],
@@ -1967,7 +1957,7 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/subscriptions-with-lemon-squeezy'
@@ -2014,7 +2004,6 @@ return [
'icon' => 'icon-currency-dollar',
'id' => 'payments-with-lemon-squeezy',
'name' => 'Payments with Lemon Squeezy',
'score' => 6,
'tagline' => 'Receive card payments and store paid orders.',
'permissions' => ['any'],
'events' => [],
@@ -2023,7 +2012,7 @@ return [
'useCases' => ['utilities'],
'runtimes' => [
...getRuntimes(
$templateRuntimes['NODE'],
TEMPLATE_RUNTIMES['NODE'],
'npm install',
'src/main.js',
'node/payments-with-lemon-squeezy'
@@ -2080,61 +2069,6 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
],
[
'icon' => 'icon-apple',
'id' => 'sign-in-with-apple',
'name' => 'Sign in with Apple',
'score' => 6,
'tagline' => 'Use native Apple sign-in APIs on Apple devices with Appwrite Auth',
'permissions' => ['any'],
'events' => [],
'cron' => '',
'timeout' => 15,
'useCases' => ['auth'],
'runtimes' => [
...getRuntimes($templateRuntimes['DART'], 'dart pub get', 'lib/main.dart', 'dart/sign_in_with_apple')
],
'instructions' => 'For documentation and instructions, check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/dart/sign_in_with_apple">file</a>.',
'vcsProvider' => 'github',
'providerRepositoryId' => 'templates',
'providerOwner' => 'appwrite',
'providerVersion' => '0.2.*',
'variables' => [
[
'name' => 'BUNDLE_ID',
'description' => 'Bundle ID of the app. <a class="u-bold" target="_blank" href="https://developer.apple.com/documentation/xcode/preparing-your-app-for-distribution/#Set-the-bundle-ID">Learn more</a>.',
'value' => '',
'placeholder' => 'com.companyname.appname',
'required' => true,
'type' => 'text'
],
[
'name' => 'TEAM_ID',
'description' => 'Team ID of the Apple Developer account.',
'value' => '',
'placeholder' => '6K3...5PH',
'required' => true,
'type' => 'text'
],
[
'name' => 'KEY_ID',
'description' => 'Key ID required to communicate with Apple Developer services. <a class="u-bold" target="_blank" href="https://developer.apple.com/help/account/keys/get-a-key-identifier/">Learn more</a>.',
'value' => '',
'placeholder' => '9G8...6YF',
'required' => true,
'type' => 'text'
],
[
'name' => 'KEY_CONTENTS_ENCODED',
'description' => 'Contents of Key required to communicated with Apple Developer services, encoded in Base64. <a class="u-bold" target="_blank" href="https://developer.apple.com/help/account/keys/revoke-edit-and-download-keys">Learn more</a>.',
'value' => '',
'placeholder' => '7x8aA...Ab7c',
'required' => true,
'type' => 'password'
]
],
'scopes' => ['users.read', 'users.write']
]
];
@@ -1,56 +1,9 @@
<!doctype html>
<html>
<head>
<link rel="preconnect" href="https://assets.appwrite.io/" crossorigin>
<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">
<style type="text/css">
:root {
color-scheme: light dark;
supported-color-schemes: light dark;
}
@media (prefers-color-scheme: dark ) {
body {
color: #616b7c !important;
background-color: #ffffff !important;
}
a {
color: currentColor !important;
}
a.button {
color: #ffffff !important;
background-color: {{accentColor}} !important;
border-color: {{accentColor}} !important;
}
h1, h2, h3 {
color: #373b4d !important;
}
h4 {
color: #4f5769 !important;
}
p.security-phrase:not(:empty), hr {
border-color: #e8e9f0 !important;
}
}
</style>
<style>
@font-face {
font-family: 'Inter';
src: url('https://assets.appwrite.io/fonts/inter/Inter-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'DM Sans';
src: url('https://assets.appwrite.io/fonts/dm-sans/dm-sans-v16-latin-600.woff2') format('woff2');
font-weight: 600;
font-style: normal;
font-display: swap;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Poppins:wght@500;600&display=swap">
<style>
@media (max-width:500px) {
.mobile-full-width {
@@ -69,6 +22,7 @@
font-family: "Inter", sans-serif;
background-color: #ffffff;
margin: 0;
padding: 0;
}
a {
color: currentColor;
@@ -125,17 +79,16 @@
<style>
a.button {
display: inline-block;
background: {{accentColor}};
background: #fd366e;
color: #ffffff;
border-radius: 8px;
height: 48px;
line-height: 24px;
padding: 12px 20px;
box-sizing: border-box;
cursor: pointer;
text-align: center;
text-decoration: none;
border-color: {{accentColor}};
border-color: #fd366e;
border-style: solid;
border-width: 1px;
margin-right: 24px;
@@ -163,31 +116,17 @@
.social-icon > img {
margin: auto;
}
p.security-phrase:not(:empty) {
opacity: 0.7;
margin: 0;
padding: 0;
margin-top: 32px;
padding-top: 32px;
border-top: 1px solid #e8e9f0;
}
</style>
</head>
<body>
<div style="display: none; overflow: hidden; max-height: 0; max-width: 0; opacity: 0; line-height: 1px;">
{{preview}}
<div>{{previewWhitespace}}</div>
</div>
<div class="main">
<table>
<tr>
<td>
<img
height="26px"
src="{{logoUrl}}"
alt="Appwrite logo"
height="32px"
src="https://cloud.appwrite.io/images/mails/logo.png"
/>
</td>
</tr>
@@ -196,12 +135,12 @@
<table style="margin-top: 32px">
<tr>
<td>
<h1>{{heading}}</h1>
<h1>{{subject}}</h1>
</td>
</tr>
</table>
<table style="margin-top: 16px">
<table style="margin-top: 32px">
<tr>
<td>
{{body}}
@@ -225,7 +164,7 @@
<tr>
<td style="padding-left: 4px; padding-right: 4px">
<a
href="{{twitterUrl}}"
href="https://twitter.com/appwrite"
class="social-icon"
title="Twitter"
>
@@ -234,7 +173,7 @@
</td>
<td style="padding-left: 4px; padding-right: 4px">
<a
href="{{discordUrl}}"
href="https://appwrite.io/discord"
class="social-icon"
>
<img src="https://cloud.appwrite.io/images/mails/discord.png" height="24" width="24" />
@@ -242,7 +181,7 @@
</td>
<td style="padding-left: 4px; padding-right: 4px">
<a
href="{{githubUrl}}"
href="https://github.com/appwrite/appwrite"
class="social-icon"
>
<img src="https://cloud.appwrite.io/images/mails/github.png" height="24" width="24" />
@@ -252,11 +191,11 @@
</table>
<table style="width: auto; margin: 0 auto; margin-top: 60px">
<tr>
<td><a href="{{termsUrl}}">Terms</a></td>
<td><a href="https://appwrite.io/terms">Terms</a></td>
<td style="color: #e8e9f0">
<div style="margin: 0 8px">|</div>
</td>
<td><a href="{{privacyUrl}}">Privacy</a></td>
<td><a href="https://appwrite.io/privacy">Privacy</a></td>
</tr>
</table>
<p style="text-align: center" align="center">
+52 -91
View File
@@ -1,64 +1,9 @@
<!doctype html>
<html>
<head>
<link rel="preconnect" href="https://assets.appwrite.io/" crossorigin>
<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">
<style type="text/css">
:root {
color-scheme: light dark;
supported-color-schemes: light dark;
}
@media (prefers-color-scheme: dark ) {
body {
color: #616b7c !important;
background-color: #ffffff !important;
}
a {
color: currentColor !important;
}
a.button {
color: #ffffff !important;
background-color: #2D2D31 !important;
border-color: #414146 !important;
}
h1, h2, h3 {
color: #373b4d !important;
}
h4 {
color: #4f5769 !important;
}
p.security-phrase:not(:empty), hr {
border-color: #e8e9f0 !important;
}
}
</style>
<style>
@font-face {
font-family: 'Inter';
src: url('https://assets.appwrite.io/fonts/inter/Inter-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'DM Sans';
src: url('https://assets.appwrite.io/fonts/dm-sans/dm-sans-v16-latin-600.woff2') format('woff2');
font-weight: 600;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Poppins';
src: url('https://assets.appwrite.io/fonts/poppins/poppins-v23-latin-regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Poppins:wght@500;600&display=swap">
<style>
body {
padding: 32px;
@@ -70,27 +15,11 @@
background-color: #ffffff;
margin: 0;
padding: 0;
line-height: 150%;
}
a {
color: currentColor;
word-break: break-all;
}
a.button {
box-sizing: border-box;
display: inline-block;
text-align: center;
text-decoration: none;
padding: 9px 14px;
color: #ffffff;
background-color: #2D2D31;
border: 1px solid #414146;
border-radius: 8px;
}
a.button:hover,
a.button:focus {
opacity: 0.8;
}
table {
width: 100%;
border-spacing: 0 !important;
@@ -138,27 +67,59 @@
border: none;
border-top: 1px solid #e8e9f0;
}
h* {
font-family: 'Poppins', sans-serif;
}
p {
margin-bottom: 10px;
}
p.security-phrase:not(:empty) {
opacity: 0.7;
margin-top: 32px;
padding-top: 32px;
border-top: 1px solid #e8e9f0;
}
</style>
</head>
<body style="direction: {{direction}}">
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Poppins:wght@500;600&display=swap"
rel="stylesheet">
<style>
a { color:currentColor; word-break: break-all; }
body {
background-color: #ffffff;
padding: 32px;
color: #616B7C;
font-size: 15px;
font-family: 'Inter', sans-serif;
line-height: 150%;
}
<div style="display: none; overflow: hidden; max-height: 0; max-width: 0; opacity: 0; line-height: 1px;">
{{preview}}
<div>{{previewWhitespace}}</div>
</div>
table {
width: 100%;
border-spacing: 0 !important;
}
table,
tr,
th,
td {
margin: 0;
padding: 0;
}
td {
vertical-align: top;
}
h* {
font-family: 'Poppins', sans-serif;
}
hr {
border: none;
border-top: 1px solid #E8E9F0;
}
p {
margin-bottom: 10px;
}
</style>
</head>
<body style="direction: {{direction}}">
<div style="max-width:650px; word-wrap: break-word; overflow-wrap: break-word;
word-break: normal; margin:0 auto;">
@@ -1,8 +0,0 @@
<p>{{hello}}</p>
<p>{{body}}</p>
<p>{{footer}}</p>
<p style="margin-bottom: 32px">
{{thanks}}
<br/>
{{signature}}
</p>
@@ -1,6 +1,6 @@
<p>{{hello}}</p>
<p>{{body}}</p>
<p><a href="{{redirect}}" target="_blank" class="button">{{buttonText}}</a></p>
<p><a href="{{redirect}}" target="_blank">{{redirect}}</a></p>
<p>{{footer}}</p>
<p style="margin-bottom: 32px">
{{thanks}}
@@ -5,7 +5,7 @@
<table border="0" cellspacing="0" cellpadding="0" style="padding-top: 10px; padding-bottom: 10px; display: inline-block;">
<tr>
<td align="center" style="border-radius: 8px; background-color: #19191D;">
<a rel="noopener" target="_blank" href="{{redirect}}" class="button">{{buttonText}}</a>
<a rel="noopener" target="_blank" href="{{redirect}}" style="font-size: 14px; font-family: Inter; color: #ffffff; text-decoration: none; border-radius: 8px; padding: 9px 14px; border: 1px solid #19191D; display: inline-block;">{{buttonText}}</a>
</td>
</tr>
</table>
@@ -5,7 +5,7 @@
<table border="0" cellspacing="0" cellpadding="0" style="padding-top: 10px; padding-bottom: 10px; display: inline-block;">
<tr>
<td align="center" style="border-radius: 8px; background-color: #ffffff;">
<p style="font-size: 24px; text-indent: 18px; letter-spacing: 18px; font-family: 'Inter', sans-serif; color: #414146; text-decoration: none; border-radius: 8px; margin-top: 0px; margin-bottom: 0px; padding: 24px 12px; border: 1px solid #EDEDF0; display: inline-block; font-weight: bold;">{{otp}}</p>
<p style="font-size: 24px; text-indent: 18px; letter-spacing: 18px; font-family: 'Inter', sans-serif; color: #414146; text-decoration: none; border-radius: 8px; padding: 24px 12px; border: 1px solid #EDEDF0; display: inline-block; font-weight: bold; ">{{otp}}</p>
</td>
</tr>
</table>
+4 -2
View File
@@ -5,7 +5,7 @@
<table border="0" cellspacing="0" cellpadding="0" style="padding-top: 10px; padding-bottom: 10px; display: inline-block;">
<tr>
<td align="center" style="border-radius: 8px; background-color: #ffffff;">
<p style="font-size: 24px; text-indent: 18px; letter-spacing: 18px; font-family: 'Inter', sans-serif; color: #414146; text-decoration: none; border-radius: 8px; margin-top: 0px; margin-bottom: 0px; padding: 24px 12px; border: 1px solid #EDEDF0; display: inline-block; font-weight: bold; ">{{otp}}</p>
<p style="font-size: 24px; text-indent: 18px; letter-spacing: 18px; font-family: Inter; color: #414146; text-decoration: none; border-radius: 8px; padding: 24px 12px; border: 1px solid #EDEDF0; display: inline-block; font-weight: bold; ">{{otp}}</p>
</td>
</tr>
</table>
@@ -15,4 +15,6 @@
<p style="margin-bottom: 0px;">{{thanks}}</p>
<p style="margin-top: 0px;">{{signature}}</p>
<p class="security-phrase">{{securityPhrase}}</p>
<hr style="margin-block-start: 1rem; margin-block-end: 1rem;">
<p style="opacity: 0.7;">{{securityPhrase}}</p>
@@ -9,4 +9,4 @@
<p>If you have trouble with the sender's image, ensure it is set in the <a href="https://gravatar.com/">Gravatar database</a>.</p>
<p style="margin-block-end: 0;">Best regards,</p>
<p style="margin-block-start: 0;">Appwrite team</p>
<p style="margin-block-start: 0;">Appwrtite team</p>
@@ -14,7 +14,7 @@
<table border="0" cellspacing="0" cellpadding="0" style="padding-top: 10px; padding-bottom: 10px; margin-top: 32px">
<tr>
<td style="border-radius: 8px; display: block; width: 100%;">
<a class="mobile-full-width" rel="noopener" target="_blank" href="{{host}}{{path}}" style="font-size: 14px; font-family: Inter; color: #ffffff; text-decoration: none; background-color: #2D2D31; border-radius: 8px; padding: 9px 14px; border: 1px solid #414146; display: inline-block; text-align:center; box-sizing: border-box;">Webhook settings</a>
<a class="mobile-full-width" rel="noopener" target="_blank" href="{{host}}{{path}}" style="font-size: 14px; font-family: Inter; color: #ffffff; text-decoration: none; background-color: #FD366E; border-radius: 8px; padding: 9px 14px; border: 1px solid #FD366E; display: inline-block; text-align:center; box-sizing: border-box;">Webhook settings</a>
</td>
</tr>
</table>
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Wie nie waag nie, sal nie wen nie.\"",
"settings.locale": "af",
"settings.direction": "ltr",
"emails.sender": "{{project}} span",
"emails.sender": "%s span",
"emails.verification.subject": "Rekening Bevestiging",
"emails.verification.hello": "Goeie dag {{user}},",
"emails.verification.body": "Volg hierdie skakel om u e-pos adres te bevestig.",
"emails.verification.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om u adres te bevestig nie.",
"emails.verification.thanks": "Baie dankie,",
"emails.verification.buttonText": "Bevestig e-posadres",
"emails.verification.signature": "Die {{project}} span",
"emails.magicSession.subject": "Teken aan",
"emails.magicSession.hello": "Goeie dag,",
"emails.magicSession.body": "Volg hierdie skakel om in te teken.",
"emails.magicSession.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om met die' adres in te teken nie.",
"emails.magicSession.thanks": "Baie dankie,",
"emails.magicSession.signature": "Die {{project}} span",
"emails.recovery.subject": "Herstel Wagwoord",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Volg hierdie skakel om u {{project}} wagwoord te herstel.",
"emails.recovery.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om u wagwoord te herstel nie.",
"emails.recovery.thanks": "Baie dankie,",
"emails.recovery.buttonText": "Stel wagwoord terug",
"emails.recovery.signature": "Die {{project}} span",
"emails.invitation.subject": "Uitnodiging om by die {{team}} span aan te sluit by {{project}}",
"emails.invitation.subject": "Uitnodiging om by die %s span aan te sluit by %s",
"emails.invitation.hello": "Goeie dag,",
"emails.invitation.body": "Hierdie boodskap is aan u gestuur omdat {{owner}} u uitnooi om 'n lid van die {{team}} groep by die {{project}} projek te wees.",
"emails.invitation.footer": "As u nie belang stel nie, kan u gerus hierdie boodskap ignoreer.",
"emails.invitation.thanks": "Baie dankie,",
"emails.invitation.buttonText": "Aanvaar uitnodiging na {{team}}",
"emails.invitation.signature": "Die {{project}} span",
"locale.country.unknown": "Onbekend",
"countries.af": "Afghanistan",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"الفن ديال الحكمة هو الفن ديال أنك تعرف أش تنخّل.\"",
"settings.locale": "ar-ma",
"settings.direction": "rtl",
"emails.sender": "فرقة {{project}}",
"emails.sender": "فرقة %s",
"emails.verification.subject": "التيْقان ديال الحساب",
"emails.verification.hello": "السلام {{user}}،",
"emails.verification.body": "تبّع هاد الوصلة باش تيقّن لادريسة تاع ليميل ديالك.",
"emails.verification.footer": "إلا ماشي نتا اللي طلبتي تيقّن هاد لادريسة تاع ليميل، ممكن تنخّل هاد البرية.",
"emails.verification.thanks": "شكرا،",
"emails.verification.buttonText": "تأكيد عنوان البريد الإلكتروني",
"emails.verification.signature": "فرقة {{project}}",
"emails.magicSession.subject": "تكونيكطا",
"emails.magicSession.hello": "السلام،",
"emails.magicSession.body": "تبّع هاد الوصلة باش تتكونيكطا.",
"emails.magicSession.footer": "إلا ماشي نتا اللي طلبتي تتكونيكطا بهاد ليميل، ممكن تنخّل هاد البرية.",
"emails.magicSession.thanks": "شكرا،",
"emails.magicSession.signature": "فرقة {{project}}",
"emails.recovery.subject": "تبدال كلمة السر",
@@ -19,16 +20,14 @@
"emails.recovery.body": "تبّع هاد الوصلة باش تبدّل كلمة السر تاع {{project}}.",
"emails.recovery.footer": "إلا ماشي نتا اللي طلبتي تبدّل كلمة السر، ممكن تنخّل هاد البرية.",
"emails.recovery.thanks": "شكرا،",
"emails.recovery.buttonText": "إعادة تعيين كلمة السر",
"emails.recovery.signature": "فرقة {{project}}",
"emails.invitation.subject": "عراضة ل فرقة {{team}} ف {{project}}",
"emails.invitation.subject": "عراضة ل فرقة %s ف %s",
"emails.invitation.hello": "السلام،",
"emails.invitation.body": "هاد البرية تصيفطات ليك حيت {{owner}} بغى يعرض عليك تولّي عضو ف فرقة {{team}} عند {{project}}.",
"emails.invitation.footer": "إلا كنتي ما مسوّقش, ممكن تنخّل هاد البرية.",
"emails.invitation.thanks": "شكرا،",
"emails.invitation.buttonText": "اقبل الدعوة إلى {{team}}",
"emails.invitation.signature": "فرقة {{project}}",
"emails.certificate.subject": "السرتافيكة فشلات ل {{domain}}",
"emails.certificate.subject": "السرتافيكة فشلات ل %s",
"emails.certificate.hello": "السلام،",
"emails.certificate.body": "السرتافيكة ديال الضومين ديالك '{{domain}}' ما قدّاتش تجينيرا. هادي هي المحاولة نمرة {{attempt}}, السبب ديال هاد الفشل هو: {{error}}",
"emails.certificate.footer": "السرتافيكة الفايتة ديالك غاتبقى مزيانة لمدة 30 يوم من عند أول فشل. كانشجعوك بزاف أنك تبقشش فهاد الموضوع, وا إلّا الضومين ديالك ما غايبقاش خدّام فيه الـ SSL.",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"فن الحكمة هو فن معرفة ما يجب التغاضي عنه.\"",
"settings.locale": "ar",
"settings.direction": "rtl",
"emails.sender": "فريق {{project}}",
"emails.sender": "فريق %s",
"emails.verification.subject": "تأكيد الحساب",
"emails.verification.hello": "مرحبا {{user}}،",
"emails.verification.body": "برجاء اتباع الرابط التالي لتأكيد بريدك الإلكتروني",
"emails.verification.footer": "لو لم تطلب تأكيد هذا البريد الإلكتروني، يمكنك تجاهل هذه الرسالة",
"emails.verification.thanks": "شكرا،",
"emails.verification.buttonText": "تأكيد عنوان البريد الإلكتروني",
"emails.verification.signature": "فريق {{project}}",
"emails.magicSession.subject": "تسجيل الدخول",
"emails.magicSession.hello": "أهلا،",
"emails.magicSession.body": "اتبع هذا الرابط لتسجيل الدخول",
"emails.magicSession.footer": "لو لم تطلب تسجيل الدخول بهذا البريد الاكتروني ، يمكنك تجاهل هذه الرسالة",
"emails.magicSession.thanks": "شكرا،",
"emails.magicSession.signature": "فريق {{project}}",
"emails.recovery.subject": "تغيير كلمة السر",
@@ -19,14 +20,12 @@
"emails.recovery.body": "برجاء اتباع الراط التالي لتغيير كلمة السر الخاصة بـ{{project}}",
"emails.recovery.footer": "لولم تطلب تغيير كلمة السر، يمكنك تجاهل هذه الرسالة",
"emails.recovery.thanks": "شكرا،",
"emails.recovery.buttonText": "إعادة تعيين كلمة المرور",
"emails.recovery.signature": "فريق {{project}}",
"emails.invitation.subject": "دعوة لفريق {{team}} في {{project}}",
"emails.invitation.subject": "دعوة لفريق %s في %s",
"emails.invitation.hello": "أهلا،",
"emails.invitation.body": "هذة الرسالة تم ارسالها لك لأن {{owner}} ارسل لك دعوة لتكون عضوا بفريق {{team}} في {{project}}",
"emails.invitation.footer": "اذا كنت غير مهتم، يمكنك تجاهل هذه الرسالة",
"emails.invitation.thanks": "شكرا،",
"emails.invitation.buttonText": "قبول الدعوة إلى {{team}}",
"emails.invitation.signature": "فريق {{project}}",
"locale.country.unknown": "مجهول",
"countries.af": "أفغانستان",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"জ্ঞানী হোৱাৰ কলা হৈছে কি উপেক্ষা কৰিব লাগে জনাৰ কলা।\"",
"settings.locale": "as",
"settings.direction": "ltr",
"emails.sender": "{{project}} দল",
"emails.sender": "%s দল",
"emails.verification.subject": "একাউণ্ট প্ৰমাণীকৰণ",
"emails.verification.hello": "নমস্কাৰ {{user}},",
"emails.verification.body": "আপোনাৰ ইমেইল ঠিকনা প্ৰমাণিত কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।",
"emails.verification.footer": "যদি আপুনি এই ঠিকনাটো সত্যাপিত কৰিবলৈ কোৱা নাই, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।",
"emails.verification.thanks": "ধন্যবাদ,",
"emails.verification.buttonText": "ইমেইল ঠিকনা নিশ্চিত কৰক",
"emails.verification.signature": "{{project}} দল",
"emails.magicSession.subject": "লগইন",
"emails.magicSession.hello": "নমস্কাৰ,",
"emails.magicSession.body": "লগইন কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।",
"emails.magicSession.footer": "যদি আপুনি এই ইমেইল ব্যৱহাৰ কৰি লগইন কৰিবলৈ কোৱা নাছিল, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।",
"emails.magicSession.thanks": "ধন্যবাদ,",
"emails.magicSession.signature": "{{project}} দল",
"emails.recovery.subject": "পাছৱাৰ্ড ৰিছেট",
@@ -19,14 +20,12 @@
"emails.recovery.body": "আপোনাৰ {{project}} পাছৱৰ্ড ৰিছেট কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।.",
"emails.recovery.footer": "যদি আপুনি আপোনাৰ পাছৱৰ্ড ৰিছেট কৰিবলৈ কোৱা নাছিল, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।",
"emails.recovery.thanks": "ধন্যবাদ,",
"emails.recovery.buttonText": "পাছৱৰ্ড ৰিছেট কৰক",
"emails.recovery.signature": "{{project}} দল",
"emails.invitation.subject": "{{team}} বছৰত {{project}} দললৈ নিমন্ত্ৰণ",
"emails.invitation.subject": "%s বছৰত %s দললৈ নিমন্ত্ৰণ",
"emails.invitation.hello": "নমস্কাৰ,",
"emails.invitation.body": "এই মেইলটো আপোনালৈ প্ৰেৰণ কৰা হৈছিল কাৰণ {{owner}} জনে আপোনাক {{project}} বছৰবয়সত {{team}} দলৰ সদস্য হ'বলৈ আমন্ত্ৰণ জনাব বিচাৰিছিল।",
"emails.invitation.footer": "যদি আপুনি আগ্ৰহী নহয়, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।",
"emails.invitation.thanks": "ধন্যবাদ,",
"emails.invitation.buttonText": "{{team}}-লৈ নিমন্ত্ৰণ গ্ৰহণ কৰক",
"emails.invitation.signature": "{{project}} দল",
"locale.country.unknown": "অজ্ঞাত ",
"countries.af": "আফগানিস্তান ",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "এই ইমেইলৰ সুৰক্ষা বাক্যটো হৈছে {{phrase}}। আপুনি এই ইমেইলটোত আস্থা ৰাখিব পাৰে যদি প্ৰবেশৰ সময়ত দেখুৱাই থকা বাক্যটোৰ লগত এই বাক্যটো মেলে।",
"emails.otpSession.thanks": "ধন্যবাদ,",
"emails.otpSession.signature": "{{project}} দল",
"emails.certificate.subject": "{{domain}}ৰ বাবে প্ৰমাণপত্ৰ ব্যৰ্থতা",
"emails.certificate.subject": "%sৰ বাবে প্ৰমাণপত্ৰ ব্যৰ্থতা",
"emails.certificate.hello": "নমস্কাৰ,",
"emails.certificate.body": "আপোনাৰ ডোমেইন '{{domain}}' ৰ বাবে প্ৰমাণপত্ৰটো উত্‌পন্ন কৰিব পৰা নগ'ল। এয়া প্ৰচেষ্টা নম্বৰ {{attempt}}, আৰু বিফলতাৰ কাৰণ হ'ল: {{error}}",
"emails.certificate.footer": "আপোনাৰ পূৰ্বৰ প্ৰমাণপত্ৰটো প্ৰথম ব্ৰিফল হোৱাৰ দিনৰ পৰা ৩০ দিনলৈ বৈধ থাকিব। আমি এই ঘটনাটোৰ তদন্ত কৰিবলৈ উচ্চ পৰামৰ্শ দিয়ে, অন্যথা আপোনাৰ ডোমেইনটো অবৈধ SSL যোগাযোগ অবিহনে থাকিব।",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Ağıllı olmaq sənəti, nəyi gözdən qaçıracağını bilmək sənətidir.\"",
"settings.locale": "az",
"settings.direction": "ltr",
"emails.sender": "{{project}} Komandası",
"emails.sender": "%s Komandası",
"emails.verification.subject": "Hesab Doğrulama",
"emails.verification.hello": "Salam {{user}},",
"emails.verification.body": "E-poçt ünvanınızı təsdiq etmək üçün bu linki izləyin.",
"emails.verification.footer": "Bu ünvanı doğrulamağı xahiş etməmisinizsə, bu mesajı gözardı edə bilərsiniz.",
"emails.verification.thanks": "Təşəkkürlər,",
"emails.verification.buttonText": "E-poçt ünvanını təsdiqlə",
"emails.verification.signature": "{{project}} komandası",
"emails.magicSession.subject": "Daxil Olmaq",
"emails.magicSession.hello": "Salam,",
"emails.magicSession.body": "Daxil olmaq üçün bu linki izləyin.",
"emails.magicSession.footer": "Bu e-poçtdan istifadə edərək giriş istəməmisinizsə, bu mesajı görməməzlikdən gələ bilərsiniz.",
"emails.magicSession.thanks": "Təşəkkürlər,",
"emails.magicSession.signature": "{{project}} komandası",
"emails.recovery.subject": "Şifrə Sıfırlanması",
@@ -19,14 +20,12 @@
"emails.recovery.body": "{{project}} şifrənizi sıfırlamaq üçün bu linki izləyin.",
"emails.recovery.footer": "Şifrənizi sıfırlamağı xahiş etməmisinizsə, bu mesajı gözardı edə bilərsiniz.",
"emails.recovery.thanks": "Təşəkkürlər,",
"emails.recovery.buttonText": "Şifrəni sıfırla",
"emails.recovery.signature": "{{project}} komandası",
"emails.invitation.subject": "{{team}} Komandasına Dəvət {{project}}də",
"emails.invitation.subject": "%s Komandasına Dəvət %sdə",
"emails.invitation.hello": "Salam,",
"emails.invitation.body": "{{owner}}, {{project}}də {{team}} komandasına üzv olmağa dəvət etmək istədiyi üçün bu məktub sizə göndərildi.",
"emails.invitation.footer": "Əgər maraqlanmırsınızsa, bu mesajı gözardı edə bilərsiniz.",
"emails.invitation.thanks": "Təşəkkürlər,",
"emails.invitation.buttonText": "{{team}} dəvətini qəbul et",
"emails.invitation.signature": "{{project}} komandası",
"locale.country.unknown": "Naməlum",
"countries.af": "Əfqanıstan",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Мастацтва быць мудрым - гэта мастацтва ведаць, на што нельга звярнуць увагу.\"",
"settings.locale": "be",
"settings.direction": "ltr",
"emails.sender": "Каманда {{project}}",
"emails.sender": "Каманда %s",
"emails.verification.subject": "Верыфікацыя акаўнта",
"emails.verification.hello": "Прывітанне {{user}},",
"emails.verification.body": "Перайдзіце па гэтай спасылцы, каб пацвердзіць свой адрас электроннай пошты",
"emails.verification.footer": "Калі вы не запытвалі пацвярджэнне гэтага адрасу, праігнаруйце гэтае паведамленне.",
"emails.verification.thanks": "Дзякуем,",
"emails.verification.buttonText": "Пацвердзіць адрас электроннай пошты",
"emails.verification.signature": "каманда {{project}}",
"emails.magicSession.subject": "Лагін",
"emails.magicSession.hello": "Прывітанне,",
"emails.magicSession.body": "Перайдзіце па спасылцы, каб увайсці.",
"emails.magicSession.footer": "Калі вы не прасілі ўвайсці, выкарыстоўваючы гэты адрас электроннай пошты, праігнаруйце гэтае паведамленне.",
"emails.magicSession.thanks": "Дзякуем,",
"emails.magicSession.signature": "каманда {{project}}",
"emails.recovery.subject": "Скід пароля",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Перайдзіце па гэтай спасылцы, каб скінуць пароль для праекта {{project}}.",
"emails.recovery.footer": "Калі вы не прасілі скінуць пароль, вы можаце праігнараваць гэта паведамленне.",
"emails.recovery.thanks": "Дзякуем,",
"emails.recovery.buttonText": "Аднавіць пароль",
"emails.recovery.signature": "каманда {{project}}",
"emails.invitation.subject": "Запрошення до Команди {{team}} у {{project}}",
"emails.invitation.subject": "Запрошення до Команди %s у %s",
"emails.invitation.hello": "Прывітанне,",
"emails.invitation.body": "Гэта паведамленне было адпраўлена вам, таму што {{owner}} хацеў запрасіць вас стаць членам каманды {{team}} у {{project}}.",
"emails.invitation.footer": "Калі вам гэта не цікава, вы можаце праігнараваць гэтае паведамленне.",
"emails.invitation.thanks": "Дзякуем,",
"emails.invitation.buttonText": "Прыняць запрашэнне ў {{team}}",
"emails.invitation.signature": "каманда {{project}}",
"locale.country.unknown": "Невядомы",
"countries.af": "Афганістан",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "Фраза бяспекі для гэтага ліста - {{phrase}}. Вы можаце давяраць гэтаму лісту, калі гэтая фраза супадае з фразай, паказанай пры ўваходзе.",
"emails.otpSession.thanks": "Дзякуй,",
"emails.otpSession.signature": "каманда {{project}}",
"emails.certificate.subject": "Сведчанне няўдалае для {{domain}}",
"emails.certificate.subject": "Сведчанне няўдалае для %s",
"emails.certificate.hello": "Прывітанне,",
"emails.certificate.body": "Сертыфікат для вашага дамена '{{domain}}' не можа быць створаны. Гэта спроба нумар {{attempt}}, і прычынай няўдачы з'яўляецца: {{error}}",
"emails.certificate.footer": "Ваш папярэдні сертыфікат будзе дзейнічаць 30 дзён з моманту першай няўдачы. Мы высока рэкамендуем расследаваць гэтую сітуацыю, інакш ваш дамен апынецца без дзейнага сертыфіката SSL-злучэння.",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Изкуството да бъдеш мъдър е изкуството да знаеш какво да пренебрегнеш.\"",
"settings.locale": "bg",
"settings.direction": "ltr",
"emails.sender": "{{project}} Екип",
"emails.sender": "%s Екип",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"बुद्धिमान होइत क कला ई जाने क कला अछि जे की अनदेखा कर्मा चाहि| \"",
"settings.locale": "bh",
"settings.direction": "ltr",
"emails.sender": "{{project}} टीम",
"emails.sender": "%s टीम",
"emails.verification.subject": "खाता प्रमाणिकरण",
"emails.verification.hello": "नमस्ते {{user}},",
"emails.verification.body": "ईमेल प्रमाणिकरण करे क लेल दिहल गइल लिंक फॉलो करें|",
"emails.verification.footer": "अगर ई पता को सत्यापित करे के लिए ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।",
"emails.verification.thanks": "धन्यवाद,",
"emails.verification.buttonText": "ईमेल पता के पुष्टि करीं",
"emails.verification.signature": "{{project}} टीम",
"emails.magicSession.subject": "लॉग इन करीं|",
"emails.magicSession.hello": "प्रणाम,",
"emails.magicSession.body": "लॉग इन करें लेल दिहल गइल लिंक फॉलो करें|",
"emails.magicSession.footer": "अगर लॉग इन करे के लिए ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।",
"emails.magicSession.thanks": "धन्यवाद,",
"emails.magicSession.signature": "{{project}} टीम",
"emails.recovery.subject": "पासवर्ड बदल क लेल|",
@@ -19,14 +20,12 @@
"emails.recovery.body": "पासवर्ड बदल क लेल दिहल गइल लिंक फॉलो करें|",
"emails.recovery.footer": "अगर पासवर्ड बदल क लेल ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।",
"emails.recovery.thanks": "धन्यवाद,",
"emails.recovery.buttonText": "पासवर्ड रीसेट करीं",
"emails.recovery.signature": "{{project}} टीम",
"emails.invitation.subject": "{{team}} टीम क {{project}} पे न्योता देवे क लेल|",
"emails.invitation.subject": "%s टीम क %s पे न्योता देवे क लेल|",
"emails.invitation.hello": "प्रणाम,",
"emails.invitation.body": "ई मेल आपके एही लेल भेजल गईल रहल काहे क {{owner}} आपके {{project}} क {{team}} टीम का सदस्य बनावे चाहित रहे|",
"emails.invitation.footer": "अगर आवे क इच्छा ना होवत, तो आप ई संदेश क अनदेखा कर सकत अछि।",
"emails.invitation.thanks": "धन्यवाद,",
"emails.invitation.buttonText": "{{team}} में नेवता स्वीकार करीं",
"emails.invitation.signature": "{{project}} टीम",
"locale.country.unknown": "अनजान",
"countries.af": "अफ़ग़ानिस्तान",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "एही ईमेल खातिर सुरक्षा वाक्य {{phrase}} हऽ। अगर ई वाक्य साइन इन कइला के समय देखावल गेल वाक्य से मेल खाता, त एह ईमेल पर भरोसा कर सकैत छी।",
"emails.otpSession.thanks": "धन्यवाद,",
"emails.otpSession.signature": "{{project}} टीम",
"emails.certificate.subject": "{{domain}} लेल प्रमाणपत्र असफलता",
"emails.certificate.subject": "%s लेल प्रमाणपत्र असफलта",
"emails.certificate.hello": "नमस्ते,",
"emails.certificate.body": "आपके डोमेन '{{domain}}' के लिए प्रमाणपत्र नहीं बनाया जा सका। ई प्रयास संख्या {{attempt}} है, और ई असफलता के कारण रहे: {{error}}",
"emails.certificate.footer": "तोहार पिछलका प्रमाणपत्र पहिल असफलता से 30 दिन धरी मान्य होईत। हम बहुत जोर देके सलाह देतानी कि एह मामला के जांच करीं, नहीं त तोहार डोमेन बिना कोनो मान्य SSL संवाद के रहि जाईत।",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"জ্ঞানী হওয়ার শিল্প হলো কোন বিষয়টিকে উপেক্ষা করা উচিত তা জানার শিল্প\"",
"settings.locale": "bn",
"settings.direction": "ltr",
"emails.sender": "{{project}} টীম",
"emails.sender": "%s টীম",
"emails.verification.subject": "বিষয়",
"emails.verification.hello": "নমস্কার {{user}},",
"emails.verification.body": "এই লিঙ্কের মাধ্যমে ইমেইল যাচাই করুন।",
"emails.verification.footer": "আপনি যদি এই ঠিকানা যাচাই করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।",
"emails.verification.thanks": "ধন্যবাদ,",
"emails.verification.buttonText": "ইমেইল ঠিকানা নিশ্চিত করুন",
"emails.verification.signature": "{{project}} টীম",
"emails.magicSession.subject": "লগ ইন",
"emails.magicSession.hello": "নমস্কার,",
"emails.magicSession.body": "এই লিঙ্কের মাধ্যমে লগ ইন করুন।",
"emails.magicSession.footer": "আপনি যদি এই ইমেলটি ব্যবহার করে লগইন করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।",
"emails.magicSession.thanks": "ধন্যবাদ,",
"emails.magicSession.signature": "{{project}} টীম",
"emails.recovery.subject": "পাসওয়ার্ড রিসেট",
@@ -19,14 +20,12 @@
"emails.recovery.body": "এই লিঙ্কের মাধ্যমে আপনার {{project}} পাসওয়ার্ড পুনরায় সেট করুন।",
"emails.recovery.footer": "আপনি যদি আপনার পাসওয়ার্ড পুনরায় সেট করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।",
"emails.recovery.thanks": "ধন্যবাদ,",
"emails.recovery.buttonText": "পাসওয়ার্ড রিসেট করুন",
"emails.recovery.signature": "{{project}} টীম",
"emails.invitation.subject": "{{team}} টিমকে {{project}} তে আমন্ত্রণ জানান",
"emails.invitation.subject": "%s টিমকে %s তে আমন্ত্রণ জানান",
"emails.invitation.hello": "নমস্কার,",
"emails.invitation.body": "এই মেইলটি আপনাকে পাঠানো হয়েছে কারণ {{owner}} আপনাকে {{project}} এর সাথে যুক্ত {{team}} টিমের সদস্য হওয়ার জন্য আমন্ত্রণ জানাতে চেয়েছিলেন।",
"emails.invitation.footer": "যদি এটি আপনার জন্য প্রয়োজনীয় না হয়, আপনি এই বার্তাটি উপেক্ষা করতে পারেন।",
"emails.invitation.thanks": "ধন্যবাদ,",
"emails.invitation.buttonText": "{{team}}-এর আমন্ত্রণ গ্রহণ করুন",
"emails.invitation.signature": "{{project}} টীম",
"locale.country.unknown": "অজানা",
"countries.af": "আফগানিস্তান",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Umjetnost mudrosti je umjetnost znanja o tome šta zanemariti.\"",
"settings.locale": "bs",
"settings.direction": "ltr",
"emails.sender": "{{project}} Tim",
"emails.sender": "%s Tim",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"L'art de ser savi és l'art de saber què passar per alt\"",
"settings.locale": "ca",
"settings.direction": "ltr",
"emails.sender": "{{project}} Equip",
"emails.sender": "%s Equip",
"emails.verification.subject": "Verificació del compte",
"emails.verification.hello": "Hola {{user}},",
"emails.verification.body": "Accedeix a aquest enllaç per tal de verificar la teva adreça electrònica.",
"emails.verification.footer": "Si no has sol·licitat la verificació d'aquesta adreça electrònica, pots ignorar aquest missatge.",
"emails.verification.thanks": "Gràcies,",
"emails.verification.buttonText": "Confirma l'adreça electrònica",
"emails.verification.signature": "Equip {{project}}",
"emails.magicSession.subject": "Entrar",
"emails.magicSession.hello": "Hola,",
"emails.magicSession.body": "Accedeix a aquest enllaç per a entrar.",
"emails.magicSession.footer": "Si no has sol·licitat entrar amb aquesta adreça electrònica, pots ignorar aquest missatge.",
"emails.magicSession.thanks": "Gràcies,",
"emails.magicSession.signature": "Equip {{project}}",
"emails.recovery.subject": "Reinicialitzar contrasenya",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Accedeix a aquest enllaç per a reinicialitzar la teva contrasenya de {{project}}.",
"emails.recovery.footer": "Si no has sol·licitat reinicialitzar la teva contrasenya, pots ignorar aquest missatge.",
"emails.recovery.thanks": "Gràcies,",
"emails.recovery.buttonText": "Restableix la contrasenya",
"emails.recovery.signature": "Equip {{project}}",
"emails.invitation.subject": "Invitació a l'equip {{team}} a {{project}}",
"emails.invitation.subject": "Invitació a l'equip %s a s%",
"emails.invitation.hello": "Hola,",
"emails.invitation.body": "Aquest correu se t'ha enviat perquè {{owner}} vol convidar-te a formar part de l'equip {{team}} al {{project}}.",
"emails.invitation.footer": "Si no és del teu interès, pots ignorar aquest missatge.",
"emails.invitation.thanks": "Gràcies,",
"emails.invitation.buttonText": "Accepta la invitació a {{team}}",
"emails.invitation.signature": "Equip {{project}}",
"locale.country.unknown": "Desconegut",
"countries.af": "Afganistan",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Umění moudrosti je umění vědět, co přehlédnout.\"",
"settings.locale": "cs",
"settings.direction": "ltr",
"emails.sender": "{{project}} tým",
"emails.sender": "%s tým",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Kunsten at være klog er kunsten at vide, hvad man skal overse.\"",
"settings.locale": "da",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Konto Verifikation",
"emails.verification.hello": "Hej {{user}},",
"emails.verification.body": "Følg dette link, for at verificere din email adresse.",
"emails.verification.footer": "Hvis du ikke har bedt om at verificere denne adresse, ignorer venligst denne besked.",
"emails.verification.thanks": "Tak,",
"emails.verification.buttonText": "Bekræft e-mailadresse",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Hej,",
"emails.magicSession.body": "Følg dette link for at logge ind.",
"emails.magicSession.footer": "Hvis du ikke har bedt om at logge ind med denne email, ignorer venligst denne besked.",
"emails.magicSession.thanks": "Tak,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Nulstil Password",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Følg dette link for at nulstille koden til {{project}}.",
"emails.recovery.footer": "Hvis du ikke har bedt om at nulstille dit password, ignorer venligst denne besked.",
"emails.recovery.thanks": "Tak,",
"emails.recovery.buttonText": "Nulstil adgangskode",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Invitation til {{team}} Team på {{project}}",
"emails.invitation.subject": "Invitation til %s Team på %s",
"emails.invitation.hello": "Hej,",
"emails.invitation.body": "Denne mail blev sendt til dig, fordi {{owner}} vil invitere dig til at blive medlem af {{team}} teamet på {{project}}.",
"emails.invitation.footer": "Hvis du ikke er interesseret, ignorer venligst denne besked.",
"emails.invitation.thanks": "Tak,",
"emails.invitation.buttonText": "Accepter invitation til {{team}}",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Ukendt",
"countries.af": "Afghanistan",
+5 -7
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Die Kunst, weise zu sein, ist die Kunst, zu wissen, was zu übersehen ist.\"",
"settings.locale": "de",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Kontoverifizierung",
"emails.verification.hello": "Hey {{user}},",
"emails.verification.body": "Folge diesem Link, um deine E-Mail-Adresse zu bestätigen.",
"emails.verification.footer": "Solltest du keine Verifizierung dieser E-Mail-Adresse angefordert haben, kannst du diese Nachricht ignorieren.",
"emails.verification.thanks": "Danke,",
"emails.verification.buttonText": "E-Mail-Adresse bestätigen",
"emails.verification.signature": "{{project}}-Team",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Hey,",
"emails.magicSession.body": "Folge diesem Link, um dich einzuloggen.",
"emails.magicSession.footer": "Solltest du keinen Login für diese E-Mail-Adresse angefordert haben, kannst du diese Nachricht ignorieren.",
"emails.magicSession.thanks": "Danke,",
"emails.magicSession.signature": "{{project}}-Team",
"emails.recovery.subject": "Kennwort zurücksetzen",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Folge diesem Link, um dein {{project}}-Kennwort zurückzusetzen.",
"emails.recovery.footer": "Solltest du keine Kennwort-Zurücksetzung angefordert haben, kannst du diese Nachricht ignorieren.",
"emails.recovery.thanks": "Danke,",
"emails.recovery.buttonText": "Passwort zurücksetzen",
"emails.recovery.signature": "{{project}}-Team",
"emails.invitation.subject": "Einladung zum {{team}}-Team auf {{project}}",
"emails.invitation.subject": "Einladung zum %s-Team auf %s",
"emails.invitation.hello": "Hello,",
"emails.invitation.body": "Du erhälst diese E-Mail, weil {{owner}} dich in das Team {{team}} auf {{project}} eingeladen hat.",
"emails.invitation.footer": "Wenn du nicht interessiert bist, kannst du diese Nachricht ignorieren.",
"emails.invitation.thanks": "Danke,",
"emails.invitation.buttonText": "Einladung zu {{team}} annehmen",
"emails.invitation.signature": "{{project}}-Team",
"locale.country.unknown": "Unbekannt",
"countries.af": "Afghanistan",
@@ -245,6 +244,5 @@
"emails.otpSession.clientInfo": "Diese Anmeldung wurde über {{agentClient}} auf {{agentDevice}} {{agentOs}} angefordert. Wenn Sie die Anmeldung nicht angefordert haben, können Sie diese E-Mail getrost ignorieren.",
"emails.otpSession.securityPhrase": "Die Sicherheitsphrase für diese E-Mail lautet {{phrase}}. Sie können dieser E-Mail vertrauen, wenn diese Phrase mit der Phrase übereinstimmt, die beim Anmelden angezeigt wird.",
"emails.otpSession.thanks": "Danke,",
"emails.otpSession.signature": "{{project}} Team",
"mock": "Eine Beispielübersetzung für Testzwecke."
"emails.otpSession.signature": "{{project}} Team"
}
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Η τέχνη του να είσαι σοφός, είναι η τέχνη να ξέρεις τι πρέπει να παραβλέψεις.\"",
"settings.locale": "gr",
"settings.direction": "ltr",
"emails.sender": "Ομάδα {{project}}",
"emails.sender": "Ομάδα %s",
"emails.verification.subject": "Επαλήθευση Λογαριασμού",
"emails.verification.hello": "Γεια σου {{user}},",
"emails.verification.body": "Ακολουθήστε αυτό το link για να επαληθεύσετε τη δ/νση του email σας",
"emails.verification.footer": "Εάν δεν ζητήσατε επαλήθευση αυτής της δ/νσης email, μπορείτε να αγνοήσετε αυτό το μήνυμα",
"emails.verification.thanks": "Ευχαριστούμε,",
"emails.verification.buttonText": "Επιβεβαιώστε διεύθυνση email",
"emails.verification.signature": "Η ομάδα του {{project}}",
"emails.magicSession.subject": "Είσοδος",
"emails.magicSession.hello": "Γεια σου,",
"emails.magicSession.body": "Ακολουθήστε αυτό το link για να συνδεθείτε",
"emails.magicSession.footer": "Εάν δεν ζητήσατε να συνδεθείτε χρησιμοποιώντας αυτό το email, μπορείτε να αγνοήσετε αυτό το μήνυμα.",
"emails.magicSession.thanks": "Ευχαριστούμε,",
"emails.magicSession.signature": "Η ομάδα του {{project}}",
"emails.recovery.subject": "Αλλαγή κωδικού πρόσβασης",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Ακολουθήστε αυτό το link για να αλλάξετε τον {{project}} κωδικό σας",
"emails.recovery.footer": "Εάν δεν ζητήσατε αλλαγή του κωδικού σας πρόσβασης, μπορείτε να αγνοήσετε αυτό το μήνυμα",
"emails.recovery.thanks": "Ευχαριστούμε,",
"emails.recovery.buttonText": "Επαναφορά κωδικού πρόσβασης",
"emails.recovery.signature": "Η ομάδα του {{project}}",
"emails.invitation.subject": "Πρόσκληση στην {{team}} Ομάδα στον {{project}}",
"emails.invitation.subject": "Πρόσκληση στην %s Ομάδα στον %s",
"emails.invitation.hello": "Γεια σου,",
"emails.invitation.body": "Αυτό το email στάλθηκε επειδή ο/η {{owner}} θέλει να σας προσκαλέσει να γίνετε μέλος της ομάδας {{team}} του {{project}}.",
"emails.invitation.footer": "Εάν δεν ενδιαφέρεστε, μπορείτε να αγνοήσετε αυτό το μήνυμα.",
"emails.invitation.thanks": "Ευχαριστούμε,",
"emails.invitation.buttonText": "Αποδεχόμενος την πρόσκληση στην {{team}}",
"emails.invitation.signature": "Η ομάδα του {{project}}",
"locale.country.unknown": "Άγνωστο",
"countries.af": "Αφγανιστάν",
+8 -38
View File
@@ -2,18 +2,14 @@
"settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"",
"settings.locale": "en",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.verification.subject": "Account Verification for {{project}}",
"emails.verification.preview": "Verify your email to activate your {{project}} account.",
"emails.verification.heading": "Verify your email to start using {{project}}",
"emails.sender": "%s Team",
"emails.verification.subject": "Account Verification",
"emails.verification.hello": "Hello {{user}},",
"emails.verification.body": "Follow this link to verify your email address to your {{b}}{{project}}{{/b}} account.",
"emails.verification.footer": "If you didnt ask to verify this address, you can ignore this message.",
"emails.verification.thanks": "Thanks,",
"emails.verification.buttonText": "Confirm email address",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "{{project}} Login",
"emails.magicSession.preview": "Sign in to {{project}} with your secure link. Expires in 1 hour.",
"emails.magicSession.hello": "Hello {{user}},",
"emails.magicSession.optionButton": "Click the button below to securely sign in to your {{b}}{{project}}{{/b}} account. This link will expire in 1 hour.",
"emails.magicSession.buttonText": "Sign in to {{project}}",
@@ -23,7 +19,6 @@
"emails.magicSession.thanks": "Thanks,",
"emails.magicSession.signature": "{{project}} team",
"emails.sessionAlert.subject": "Security alert: new session on your {{project}} account",
"emails.sessionAlert.preview": "New login detected on {{project}} at {{time}} UTC.",
"emails.sessionAlert.hello": "Hello {{user}},",
"emails.sessionAlert.body": "A new session has been created on your {{b}}{{project}}{{/b}} account, {{b}}on {{date}}, {{year}} at {{time}} UTC{{/b}}.\nHere are the details of the new session: ",
"emails.sessionAlert.listDevice": "Device: {{b}}{{device}}{{/b}}",
@@ -33,8 +28,6 @@
"emails.sessionAlert.thanks": "Thanks,",
"emails.sessionAlert.signature": "{{project}} team",
"emails.otpSession.subject": "OTP for {{project}} Login",
"emails.otpSession.preview": "Use OTP {{otp}} to sign in to {{project}}. Expires in 15 minutes.",
"emails.otpSession.heading": "Login with OTP to use {{project}}",
"emails.otpSession.hello": "Hello {{user}},",
"emails.otpSession.description": "Enter the following verification code when prompted to securely sign in to your {{b}}{{project}}{{/b}} account. This code will expire in 15 minutes.",
"emails.otpSession.clientInfo": "This sign in was requested using {{b}}{{agentClient}}{{/b}} on {{b}}{{agentDevice}}{{/b}} {{b}}{{agentOs}}{{/b}}. If you didn't request the sign in, you can safely ignore this email.",
@@ -42,46 +35,24 @@
"emails.otpSession.thanks": "Thanks,",
"emails.otpSession.signature": "{{project}} team",
"emails.mfaChallenge.subject": "Verification Code for {{project}}",
"emails.mfaChallenge.preview": "Use code {{otp}} for two-step verification in {{project}}. Expires in 15 minutes.",
"emails.mfaChallenge.heading": "Complete two-step verification to use {{project}}",
"emails.mfaChallenge.hello": "Hello {{user}},",
"emails.mfaChallenge.description": "Enter the following code to confirm your two-step verification in {{b}}{{project}}{{/b}}. This code will expire in 15 minutes.",
"emails.mfaChallenge.description": "Enter the following verification code to verify your email and activate two-step verification in {{b}}{{project}}{{/b}}. This code will expire in 15 minutes.",
"emails.mfaChallenge.clientInfo": "This verification code was requested using {{b}}{{agentClient}}{{/b}} on {{b}}{{agentDevice}}{{/b}} {{b}}{{agentOs}}{{/b}}. If you didn't request the verification code, you can safely ignore this email.",
"emails.mfaChallenge.thanks": "Thanks,",
"emails.mfaChallenge.signature": "{{project}} team",
"emails.recovery.subject": "Password Reset for {{project}}",
"emails.recovery.preview": "Reset your {{project}} password using the link.",
"emails.recovery.subject": "Password Reset",
"emails.recovery.hello": "Hello {{user}},",
"emails.recovery.body": "Follow this link to reset your {{b}}{{project}}{{/b}} password.",
"emails.recovery.footer": "If you didn't ask to reset your password, you can ignore this message.",
"emails.recovery.thanks": "Thanks,",
"emails.recovery.buttonText": "Reset password",
"emails.recovery.signature": "{{project}} team",
"emails.csvExport.success.subject": "Your CSV export is ready",
"emails.csvExport.success.preview": "Your data export has been completed successfully.",
"emails.csvExport.success.hello": "Hello {{user}},",
"emails.csvExport.success.body": "Your CSV export is ready to download. Click the button below to download your data export.",
"emails.csvExport.success.footer": "This download link will expire in 1 hour.",
"emails.csvExport.success.thanks": "Thanks,",
"emails.csvExport.success.buttonText": "Download CSV",
"emails.csvExport.success.signature": "Appwrite team",
"emails.csvExport.failure.subject": "Your CSV export failed - file too large",
"emails.csvExport.failure.preview": "Your data export failed because the file size exceeds your plan limit.",
"emails.csvExport.failure.hello": "Hello {{user}},",
"emails.csvExport.failure.body": "Your CSV export could not be completed because the export file size ({{size}}MB) exceeds your plan limit. Please consider upgrading your plan or exporting a smaller dataset.",
"emails.csvExport.failure.footer": "If you have any questions, please contact our support team.",
"emails.csvExport.failure.thanks": "Thanks,",
"emails.csvExport.failure.signature": "{{project}} team",
"emails.invitation.subject": "Invitation to {{team}} Team at {{project}}",
"emails.invitation.preview": "{{owner}} invited you to join {{team}} at {{project}}",
"emails.invitation.subject": "Invitation to %s Team at %s",
"emails.invitation.hello": "Hello {{user}},",
"emails.invitation.body": "This mail was sent to you because {{b}}{{owner}}{{/b}} invited you to become a member of the {{b}}{{team}}{{/b}} team at {{b}}{{project}}{{/b}}.",
"emails.invitation.body": "This mail was sent to you because {{b}}{{owner}}{{/b}} wanted to invite you to become a member of the {{b}}{{team}}{{/b}} team at {{b}}{{project}}{{/b}}.",
"emails.invitation.footer": "If you are not interested, you can ignore this message.",
"emails.invitation.thanks": "Thanks,",
"emails.invitation.buttonText": "Accept invite to {{team}}",
"emails.invitation.signature": "{{project}} team",
"emails.certificate.subject": "Certificate failure for {{domain}}",
"emails.certificate.preview": "Your domain {{domain}} certificate generation has failed.",
"emails.certificate.subject": "Certificate failure for %s",
"emails.certificate.hello": "Hello,",
"emails.certificate.body": "Certificate for your domain '{{domain}}' could not be generated. This is attempt no. {{attempt}}, and the failure was caused by: {{error}}",
"emails.certificate.footer": "Your previous certificate will be valid for 30 days since the first failure. We highly recommend investigating this case, otherwise your domain will end up without a valid SSL communication.",
@@ -292,6 +263,5 @@
"continents.eu": "Europe",
"continents.na": "North America",
"continents.oc": "Oceania",
"continents.sa": "South America",
"mock": "A mock translation for testing purposes."
"continents.sa": "South America"
}
+4 -5
View File
@@ -1,16 +1,17 @@
{
"settings.locale": "eo",
"settings.direction": "ltr",
"emails.sender": "Teamo {{project}}",
"emails.sender": "Teamo %s",
"emails.verification.subject": "Konta Konfirmo",
"emails.verification.hello": "Saluton {{user}},",
"emails.verification.body": "Alklaku ĉi tiun ligon por kontroli vian retpoŝtan adreson.",
"emails.verification.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.",
"emails.verification.thanks": "Dankegon.,",
"emails.verification.buttonText": "Konfirmi retadreson",
"emails.verification.signature": "Teamo {{project}}",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Saluton,",
"emails.magicSession.body": "Alklaku ĉi tiun ligon por eniri.",
"emails.magicSession.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.",
"emails.magicSession.thanks": "Dankegon,",
"emails.magicSession.signature": "Teamo {{project}}",
"emails.recovery.subject": "Parsvorta Restarigo",
@@ -18,14 +19,12 @@
"emails.recovery.body": "Alklaku ĉi tiun ligon por reagordi vian pasvorton. {{project}}",
"emails.recovery.footer": "Se vi ne petis reagordi vian pasvorton, vi povas ignori ĉi tiun mesaĝon.",
"emails.recovery.thanks": "Dankegon,",
"emails.recovery.buttonText": "Pasvorton restarigi",
"emails.recovery.signature": "Teamo {{project}}",
"emails.invitation.subject": "Invito al la Teamo {{team}} em {{project}}",
"emails.invitation.subject": "Invito al la Teamo %s em %s",
"emails.invitation.hello": "Dankegon,",
"emails.invitation.body": "Ĉi tiu retpoŝto estis sendita ĉar la {{owner}} volas inviti vin fariĝi membro de la Teamo {{team}} en {{project}}.",
"emails.invitation.footer": "Se vi ne interesiĝas, vi povas ignori ĉi tiun mesaĝon.",
"emails.invitation.thanks": "Dankegon,",
"emails.invitation.buttonText": "Akcepti inviton al {{team}}",
"emails.invitation.signature": "Teamo {{project}}",
"locale.country.unknown": "Unknown",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"El arte de ser sabio es el arte de saber qué pasar por alto\"",
"settings.locale": "es",
"settings.direction": "ltr",
"emails.sender": "El equipo de {{project}}",
"emails.sender": "El equipo de %s",
"emails.verification.subject": "Verificación de cuenta",
"emails.verification.hello": "Hola, {{name}}.,",
"emails.verification.body": "Haz clic en este enlace para verificar tu correo:",
"emails.verification.footer": "Si no has solicitado verificar este correo, puedes ignorar este mensaje.",
"emails.verification.thanks": "Gracias.,",
"emails.verification.buttonText": "Confirmar dirección de correo",
"emails.verification.signature": "El equipo de {{project}}.",
"emails.magicSession.subject": "Inicio de sesión",
"emails.magicSession.hello": "Hola,",
"emails.magicSession.body": "Haz clic en este enlace para iniciar sesión:",
"emails.magicSession.footer": "Si no has solicitado iniciar sesión usando este correo, puedes ignorar este mensaje.",
"emails.magicSession.thanks": "Gracias.,",
"emails.magicSession.signature": "El equipo de {{project}}",
"emails.recovery.subject": "Restablecer contraseña",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Haz clic en este enlace para restablecer la contraseña de {{project}}:",
"emails.recovery.footer": "Si no has solicitado restablecer la contraseña, puedes ignorar este mensaje.",
"emails.recovery.thanks": "Gracias.,",
"emails.recovery.buttonText": "Restablecer contraseña",
"emails.recovery.signature": "El equipo de {{project}}",
"emails.invitation.subject": "Invitación al equipo {{team}} en {{project}}",
"emails.invitation.subject": "Invitación al equipo %s en %s",
"emails.invitation.hello": "Hola,",
"emails.invitation.body": "Este correo ha sido enviado a petición de {{owner}} quién quiere invitarte a formar parte del equipo {{team}} en {{project}}.",
"emails.invitation.footer": "Si no estás interesado, puedes ignorar este mensaje.",
"emails.invitation.thanks": "Gracias.,",
"emails.invitation.buttonText": "Aceptar invitación a {{team}}",
"emails.invitation.signature": "El equipo de {{project}}",
"locale.country.unknown": "Desconocido",
"countries.af": "Afganistán",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"هنر خردمند بودن این است که بدانید چه چیزی را نادیده بگیرید.\"",
"settings.locale": "fa",
"settings.direction": "rtl",
"emails.sender": "تیم {{project}}",
"emails.sender": "تیم %s",
"emails.verification.subject": "تأیید حساب",
"emails.verification.hello": "سلام {{user}}،",
"emails.verification.body": "برای تأیید ایمیل‌تان پیوند زیر را دنبال کنید.",
"emails.verification.footer": "اگر شما درخواست تأیید حساب نداده‌اید، می‌توانید این پیام را نادیده بگیرید.",
"emails.verification.thanks": "سپاس فراوان،",
"emails.verification.buttonText": "آدرس ایمیل را تایید کنید",
"emails.verification.signature": "تیم {{user}}",
"emails.magicSession.subject": "ورود به حساب کاربری",
"emails.magicSession.hello": "سلام،",
"emails.magicSession.body": "برای ورود به حساب‌تان پیوند زیر را دنبال کنید.",
"emails.magicSession.footer": "اگر شما درخواست ورود به حساب کاربری با استفاده از این ایمیل را نداد‌ه‌اید، می‌توانید این پیام را نادیده بگیرید.",
"emails.magicSession.thanks": "سپاس فراوان،",
"emails.magicSession.signature": "تیم {{user}}",
"emails.recovery.subject": "بازیابی گذرواژه",
@@ -19,14 +20,12 @@
"emails.recovery.body": "برای بازیابی گذرواژه‌تان پیوند زیر را دنبال کنید.",
"emails.recovery.footer": "اگر شما درخواست بازیابی گذرواژه نداده‌اید، می‌توانید این پیام را نادیده بگیرید.",
"emails.recovery.thanks": "سپاس فراوان،",
"emails.recovery.buttonText": "بازنشانی رمز عبور",
"emails.recovery.signature": "تیم {{user}}",
"emails.invitation.subject": "دعوت به تیم {{team}} در {{project}}",
"emails.invitation.subject": "دعوت به تیم %s در %s",
"emails.invitation.hello": "سلام،",
"emails.invitation.body": "این ایمیل برای شما فرستاده شده‌است زیرا {{owner}} می‌خواهد شما را به تیم {{team}} در پروژه‌ی {{project}} بیفزاید.",
"emails.invitation.footer": "اگر علاقه ندارید، می‌توانید این پیام را نادیده بگیرید.",
"emails.invitation.thanks": "سپاس فراوان،",
"emails.invitation.buttonText": "دعوت را به {{team}} بپذیرید",
"emails.invitation.signature": "تیم {{user}}",
"locale.country.unknown": "ناشناخته",
"countries.af": "افغانستان",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"",
"settings.locale": "fi",
"settings.direction": "ltr",
"emails.sender": "{{project}} Tiimi",
"emails.sender": "%s Tiimi",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Kunstin om at vera vís er at vita hvat man skal misrøkja.\"",
"settings.locale": "fo",
"settings.direction": "ltr",
"emails.sender": "{{project}} Lið",
"emails.sender": "%s Lið",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"L'art d'être sage est l'art de savoir quoi négliger.\"",
"settings.locale": "fr",
"settings.direction": "ltr",
"emails.sender": "Équipe {{project}}",
"emails.sender": "Équipe %s",
"emails.verification.subject": "Vérification du compte",
"emails.verification.hello": "Bonjour {{user}},",
"emails.verification.body": "Suivez ce lien pour vérifier votre adresse e-mail.",
"emails.verification.footer": "Si vous n'avez pas demandé à vérifier cette adresse, vous pouvez ignorer ce message.",
"emails.verification.thanks": "Merci,",
"emails.verification.buttonText": "Confirmez l'adresse e-mail",
"emails.verification.signature": "Équipe {{project}}",
"emails.magicSession.subject": "Connexion",
"emails.magicSession.hello": "Bonjour,",
"emails.magicSession.body": "Suivez ce lien pour vous connecter.",
"emails.magicSession.footer": "Si vous n'avez pas demandé à vous connecter en utilisant cet e-mail, vous pouvez ignorer ce message.",
"emails.magicSession.thanks": "Merci,",
"emails.magicSession.signature": "L'équipe {{project}}",
"emails.recovery.subject": "Réinitialisation du mot de passe",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Suivez ce lien pour réinitialiser votre mot de passe pour {{project}}.",
"emails.recovery.footer": "Si vous n'avez pas demandé à réinitialiser votre mot de passe, vous pouvez ignorer ce message.",
"emails.recovery.thanks": "Merci,",
"emails.recovery.buttonText": "Réinitialisation du mot de passe",
"emails.recovery.signature": "L'équipe {{project}}",
"emails.invitation.subject": "Invitation à l'équipe {{team}} de {{project}}",
"emails.invitation.subject": "Invitation à l'équipe %s de %s",
"emails.invitation.hello": "Bonjour,",
"emails.invitation.body": "Cet e-mail vous a été envoyé parce que {{owner}} souhaite vous inviter à devenir membre de l'équipe {{team}} pour {{project}}.",
"emails.invitation.footer": "Si vous n'êtes pas intéressé, vous pouvez ignorer ce message.",
"emails.invitation.thanks": "Merci,",
"emails.invitation.buttonText": "Accepter l'invitation à {{team}}",
"emails.invitation.signature": "L'équipe {{project}}",
"locale.country.unknown": "Inconnu",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Is í ealaín na críonnachta ná rudaí a aithint chun cluas bhodhar a thabhairt dóibh.\"",
"settings.locale": "ga",
"settings.direction": "ltr",
"emails.sender": "{{project}} Foireann",
"emails.sender": "%s Foireann",
"emails.verification.subject": "Fíoraithe cuntais",
"emails.verification.hello": "Haigh {{user}},",
"emails.verification.body": "Lean an nasc seo chun do ríomhphost a fhíorú.",
"emails.verification.footer": "Mura ndearna tú iarratas an seoladh seo a fhíoru, déan neamhaird den teachtaireacht seo.",
"emails.verification.thanks": "Go raibh maith agat,",
"emails.verification.buttonText": "Deimhnigh seoladh ríomhphoist",
"emails.verification.signature": "{{project}} foireann",
"emails.magicSession.subject": "Logáil isteach",
"emails.magicSession.hello": "Haigh,",
"emails.magicSession.body": "Lean an nasc seo chun logáil isteach.",
"emails.magicSession.footer": "Mura ndearna tú iarratas logáil isteach leis an ríomhphost seo, déan neamhaird den teachtaireacht seo.",
"emails.magicSession.thanks": "Go raibh maith agat,",
"emails.magicSession.signature": "{{project}} foireann",
"emails.recovery.subject": "Athshocrú pasfhocail",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Lean an nasc seo chun do pasfhocal {{project}} a athshocrú.",
"emails.recovery.footer": "Mura ndearna tú iarratas do pasfhocal a athshocrú, déan neamhaird den teachtaireacht seo.",
"emails.recovery.thanks": "Go raibh maith agat,",
"emails.recovery.buttonText": "Athshocraigh focal faire",
"emails.recovery.signature": "{{project}} foireann",
"emails.invitation.subject": "Cuireadh do {{team}} foireann ag {{project}}",
"emails.invitation.subject": "Cuireadh do %s foireann ag %s",
"emails.invitation.hello": "Haigh,",
"emails.invitation.body": "Seoladh an ríomhphost seo chugat mar ba mhaith le {{owner}} cuireadh a thabhairt duit bheith mar bhall den fhoireann {{team}} ag obair ar {{project}}.",
"emails.invitation.footer": "Is cuma leat? Déan neamhaird den teachtaireacht seo.",
"emails.invitation.thanks": "Go raibh maith agat,",
"emails.invitation.buttonText": "Glac le cuireadh chuig {{team}}",
"emails.invitation.signature": "{{project}} foireann",
"locale.country.unknown": "Neamhaithnid",
"countries.af": "An Afganastáin",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"સ્માર્ટ બનવાની કળા એ છે કે શું અવગણવું તે જાણવાની કળા છે.\"",
"settings.locale": "gu",
"settings.direction": "ltr",
"emails.sender": "{{project}} ટીમ",
"emails.sender": "%s ટીમ",
"emails.verification.subject": "ખાતાની ચકાસણી",
"emails.verification.hello": "નમસ્કાર {{user}},",
"emails.verification.body": "તમારું ઇમેઇલ સરનામું ચકાસવા માટે આ લિંકને અનુસરો.",
"emails.verification.footer": "જો તમે આ સરનામાંની ચકાસણી કરવાનું ન કહ્યું હોય, તો તમે આ સંદેશને અવગણી શકો છો.",
"emails.verification.thanks": "આભાર,",
"emails.verification.buttonText": "ઇમેઇલ સરનામું ખાતરી કરો",
"emails.verification.signature": "{{project}} ટીમ",
"emails.magicSession.subject": "પ્રવેશ કરો",
"emails.magicSession.hello": "નમસ્કાર,",
"emails.magicSession.body": "પ્રવેશ કરવા માટે આ લિંકને અનુસરો.",
"emails.magicSession.footer": "જો તમે આ ઇમેઇલનો ઉપયોગ કરીને પ્રવેશ કરવાનું ન કહ્યું હોય, તો તમે આ સંદેશને અવગણી શકો છો.",
"emails.magicSession.thanks": "આભાર,",
"emails.magicSession.signature": "{{project}} ટીમ",
"emails.recovery.subject": "પાસવર્ડ ફરીથી સેટ કરો",
@@ -19,14 +20,12 @@
"emails.recovery.body": "તમારો {{project}} પાસવર્ડ ફરીથી સેટ કરવા માટે આ લિંકને અનુસરો.",
"emails.recovery.footer": "જો તમે તમારો પાસવર્ડ ફરીથી સેટ કરવાનું ન કહ્યું હોય, તો તમે આ સંદેશને અવગણી શકો છો.",
"emails.recovery.thanks": "આભાર,",
"emails.recovery.buttonText": "પાસવર્ડ રીસેટ કરો",
"emails.recovery.signature": "{{project}} ટીમ",
"emails.invitation.subject": "{{team}} ટીમને {{project}} પર આમંત્રણ",
"emails.invitation.subject": "%s ટીમને %s પર આમંત્રણ",
"emails.invitation.hello": "નમસ્કાર,",
"emails.invitation.body": "આ મેઇલ તમને મોકલવામાં આવ્યો હતો કારણ કે {{owner}} તમને {{project}} માં {{team}} ટીમના સભ્ય બનવા માટે આમંત્રિત કરવા માંગતા હતો.",
"emails.invitation.footer": "જો તમને રસ નથી, તો તમે આ સંદેશને અવગણી શકો છો.",
"emails.invitation.thanks": "આભાર,",
"emails.invitation.buttonText": "{{team}} નું આમંત્રણ સ્વીકારો",
"emails.invitation.signature": "{{project}} ટીમ",
"locale.country.unknown": "અજાણ",
"countries.af": "અફઘાનિસ્તાન",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"להיות חכם זה לדעת ממה להתעלם.\"",
"settings.locale": "he",
"settings.direction": "rtl",
"emails.sender": "צוות {{project}}",
"emails.sender": "צוות %s",
"emails.verification.subject": "אימות חשבון",
"emails.verification.hello": "שלום {{user}},",
"emails.verification.body": "לחץ על קישור זה כדי לאמת את כתובת הדוא\"ל שלך.",
"emails.verification.footer": "אם לא ביקשת לאמת כתובת זו, תוכל להתעלם מהודעה זו.",
"emails.verification.thanks": "תודה,",
"emails.verification.buttonText": "אשר כתובת דוא\"ל",
"emails.verification.signature": "צוות {{project}}",
"emails.magicSession.subject": "כניסה למערכת",
"emails.magicSession.hello": "שלום,",
"emails.magicSession.body": "לחץ על קישור זה כדי להיכנס.",
"emails.magicSession.footer": "אם לא ביקשת להיכנס באמצעות דוא\"ל זה, תוכל להתעלם מהודעה זו.",
"emails.magicSession.thanks": "תודה,",
"emails.magicSession.signature": "צוות {{project}}",
"emails.recovery.subject": "איפוס סיסמא",
@@ -19,14 +20,12 @@
"emails.recovery.body": "עקוב אחר קישור זה כדי לאפס את סיסמתך ב-{{project}}.",
"emails.recovery.footer": "אם לא ביקשת לאפס את הסיסמה, תוכל להתעלם מהודעה זו.",
"emails.recovery.thanks": "תודה,",
"emails.recovery.buttonText": "סיסמא איפוס",
"emails.recovery.signature": "צוות {{project}}",
"emails.invitation.subject": "הזמנה לצוות {{team}} ב- {{project}}",
"emails.invitation.subject": "הזמנה לצוות %s ב- %s",
"emails.invitation.hello": "שלום,",
"emails.invitation.body": "דואר זה נשלח אליך מכיוון ש {{owner}} רצה להזמין אותך להיות חבר בצוות {{team}} ב-{{project}}.",
"emails.invitation.footer": "אם אינך מעוניין, תוכל להתעלם מהודעה זו.",
"emails.invitation.thanks": "תודה,",
"emails.invitation.buttonText": "אשר הזמנה ל-{{team}}",
"emails.invitation.signature": "צוות {{project}}",
"locale.country.unknown": "לא ידוע",
"countries.af": "אפגניסטן",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"बुद्धिमान होने की कला यह जानने की कला है कि क्या अनदेखा किया जाए |\"",
"settings.locale": "hi",
"settings.direction": "ltr",
"emails.sender": "{{project}} टीम",
"emails.sender": "%s टीम",
"emails.verification.subject": "अकाउंट वेरिफिकेशन ",
"emails.verification.hello": "नमस्ते {{user}},",
"emails.verification.body": "इस लिंक के माध्यम से अपने ईमेल को सत्यापित कीजिये।",
"emails.verification.footer": "यदि आप इस पते को सत्यापित नहीं करना चाहते हैं, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।",
"emails.verification.thanks": "धन्यवाद,",
"emails.verification.buttonText": "ईमेल पता सत्यापित करें",
"emails.verification.signature": "{{project}} टीम",
"emails.magicSession.subject": "लॉग इन",
"emails.magicSession.hello": "नमस्ते,",
"emails.magicSession.body": "इस लिंक के माध्यम से लॉग-इन करें।",
"emails.magicSession.footer": "यदि आप इस ईमेल द्वारा लॉगिन नहीं करना चाहते हैं, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।",
"emails.magicSession.thanks": "धन्यवाद,",
"emails.magicSession.signature": "{{project}} टीम",
"emails.recovery.subject": "पासवर्ड रीसेट",
@@ -19,14 +20,12 @@
"emails.recovery.body": "इस लिंक के माध्यम से अपना {{project}} पासवर्ड रीसेट करें।",
"emails.recovery.footer": "यदि आप अपना पासवर्ड रीसेट नहीं करना चाहते हैं, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।",
"emails.recovery.thanks": "धन्यवाद,",
"emails.recovery.buttonText": "पासवर्ड रीसेट करें",
"emails.recovery.signature": "{{project}} टीम",
"emails.invitation.subject": "{{team}} टीम का यहाँ {{project}} पर आमंत्रण",
"emails.invitation.subject": "%s टीम का यहाँ %s पर आमंत्रण",
"emails.invitation.hello": "नमस्ते,",
"emails.invitation.body": "यह मेल आपको इसलिए भेजा गया है क्योंकि {{owner}} आपको {{team}} टीम का सदस्य बनाना चाहते है, जो {{project}} से जुड़ा हुआ है।",
"emails.invitation.footer": "यदि आप इसमें रूचि नहीं रखते, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।",
"emails.invitation.thanks": "धन्यवाद,",
"emails.invitation.buttonText": "{{team}} का निमंत्रण स्वीकार करें",
"emails.invitation.signature": "{{project}} टीम",
"locale.country.unknown": "अज्ञात",
"countries.af": "अफ़ग़ानिस्तान",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Umjetnost mudrosti je umjetnost znanja o tome što zanemariti.\"",
"settings.locale": "hr",
"settings.direction": "ltr",
"emails.sender": "{{project}} Tim",
"emails.sender": "%s Tim",
"emails.verification.subject": "Verifikacija računa",
"emails.verification.hello": "Pozdrav {{user}},",
"emails.verification.body": "Slijedite ovu poveznicu da biste potvrdili svoju adresu e-pošte.",
"emails.verification.footer": "Ukoliko niste zatražili potvrdu ove adrese, možete zanemariti ovu poruku.",
"emails.verification.thanks": "Hvala,",
"emails.verification.buttonText": "Potvrdi adresu e-pošte",
"emails.verification.signature": "{{project}} tim",
"emails.magicSession.subject": "Prijavite se",
"emails.magicSession.hello": "Pozdrav,",
"emails.magicSession.body": "Slijedite ovu poveznicu za prijavu.",
"emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.",
"emails.magicSession.thanks": "Hvala,",
"emails.magicSession.signature": "{{project}} tim",
"emails.recovery.subject": "Ponovno postavljanje lozinke",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Slijedite ovu poveznicu za ponovno postavljanje {{project}} lozinke.",
"emails.recovery.footer": "Ako niste zatražili ponovno postavljanje Vaše lozinke, možete zanemariti ovu poruku.",
"emails.recovery.thanks": "Hvala,",
"emails.recovery.buttonText": "Resetiraj lozinku",
"emails.recovery.signature": "{{project}} tim",
"emails.invitation.subject": "Pozivnica za {{team}} tim na {{project}}",
"emails.invitation.subject": "Pozivnica za %s tim na %s",
"emails.invitation.hello": "Pozdrav,",
"emails.invitation.body": "Ova poruka Vam je poslana jer Vas je {{owner}} htio pozvati da postanete član {{team}} tima na {{project}}.",
"emails.invitation.footer": "Ukoliko niste zainteresirani, možete zanemariti ovu poruku.",
"emails.invitation.thanks": "Hvala,",
"emails.invitation.buttonText": "Prihvati pozivnicu za {{team}}",
"emails.invitation.signature": "{{project}} tim",
"locale.country.unknown": "Nepoznato",
"countries.af": "Afganistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"",
"settings.locale": "hu",
"settings.direction": "ltr",
"emails.sender": "{{project}} Csapat",
"emails.sender": "%s Csapat",
"emails.verification.subject": "Fiók Megerősítése",
"emails.verification.hello": "Szia {{user}},",
"emails.verification.body": "Kattints a linkre, hogy megerősítsd az email címedet.",
"emails.verification.footer": "Ha nem te kérted a címed megerősítését, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.",
"emails.verification.thanks": "Köszönettel,",
"emails.verification.buttonText": "E-mail-cím megerősítése",
"emails.verification.signature": "a {{project}} csapat",
"emails.magicSession.subject": "Bejelentkezés",
"emails.magicSession.hello": "Szia,",
"emails.magicSession.body": "Kattints a linkre a bejelentkezéshez.",
"emails.magicSession.footer": "Ha nem te szerettél volna bejelentkezni ezzel az email címmel, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.",
"emails.magicSession.thanks": "Köszönettel,",
"emails.magicSession.signature": "a {{project}} csapat",
"emails.recovery.subject": "Jelszó Visszaállítása",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Kattints a linkre a {{project}} jelszavad visszaállításához.",
"emails.recovery.footer": "Ha nem te kezdeményezted a jelszavad visszaállítását, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.",
"emails.recovery.thanks": "Köszönettel,",
"emails.recovery.buttonText": "Jelszó visszaállítása",
"emails.recovery.signature": "a {{project}} csapat",
"emails.invitation.subject": "Meghívó a(z) {{team}} csapatba, a(z) {{project}} projektbe",
"emails.invitation.subject": "Meghívó a(z) %s csapatba, a(z) %s projektbe",
"emails.invitation.hello": "Szia,",
"emails.invitation.body": "Ezt a levelet azért kaptad, mert {{owner}} meghívott, hogy légy a {{team}} csapat tagja a {{project}} projektben.",
"emails.invitation.footer": "Ha nem érdekel a lehetőség, nyugodtan hagyd figyelmen kívül ezt az üzenetet.",
"emails.invitation.thanks": "Köszönettel,",
"emails.invitation.buttonText": "Elfogadni meghívást a {{team}-re",
"emails.invitation.signature": "a {{project}} csapat",
"locale.country.unknown": "Ismeretlen",
"countries.af": "Afganisztán",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Искусство быть мудрым — это искусство знать, чем можно пренебречь.\"",
"settings.locale": "ru",
"settings.direction": "ltr",
"emails.sender": "Թիմ {{project}}",
"emails.sender": "Թիմ %s",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Seni menjadi bijak adalah seni mengetahui apa yang harus diabaikan.\"",
"settings.locale": "id",
"settings.direction": "ltr",
"emails.sender": "Tim {{project}}",
"emails.sender": "Tim %s",
"emails.verification.subject": "Verifikasi Akun",
"emails.verification.hello": "Hai {{user}},",
"emails.verification.body": "Ikuti tautan ini untuk memverifikasi alamat email Anda.",
"emails.verification.footer": "Jika Anda tidak meminta untuk memverifikasi alamat email ini, Anda dapat mengabaikan pesan ini.",
"emails.verification.thanks": "Terima kasih,",
"emails.verification.buttonText": "Konfirmasi alamat email",
"emails.verification.signature": "Tim {{project}}",
"emails.magicSession.subject": "Masuk",
"emails.magicSession.hello": "Hai,",
"emails.magicSession.body": "Ikuti tautan ini untuk masuk.",
"emails.magicSession.footer": "Jika Anda tidak meminta untuk masuk menggunakan email ini, Anda dapat mengabaikan pesan ini.",
"emails.magicSession.thanks": "Terima kasih,",
"emails.magicSession.signature": "Tim {{project}}",
"emails.recovery.subject": "Atur Ulang Kata Sandi",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Ikuti tautan ini untuk menyetel ulang kata sandi {{project}} Anda.",
"emails.recovery.footer": "Jika Anda tidak meminta untuk menyetel ulang kata sandi, Anda dapat mengabaikan pesan ini.",
"emails.recovery.thanks": "Terima kasih,",
"emails.recovery.buttonText": "Atur ulang kata sandi",
"emails.recovery.signature": "Tim {{project}}",
"emails.invitation.subject": "Undangan ke Tim {{team}} di {{project}}",
"emails.invitation.subject": "Undangan ke Tim %s di %s",
"emails.invitation.hello": "Halo,",
"emails.invitation.body": "Email ini dikirimkan kepada Anda karena {{owner}} ingin mengundang Anda untuk menjadi anggota tim {{team}} di {{project}}.",
"emails.invitation.footer": "Jika Anda tidak tertarik, Anda dapat mengabaikan pesan ini.",
"emails.invitation.thanks": "Terima kasih,",
"emails.invitation.buttonText": "Terima undangan ke {{team}}",
"emails.invitation.signature": "Tim {{project}}",
"locale.country.unknown": "Tidak diketahui",
"countries.af": "Afganistan",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"Listin að vera vitur er listin að vita hvað á að líta framhjá.\"",
"settings.locale": "is",
"settings.direction": "ltr",
"emails.sender": "{{project}} Teymi",
"emails.sender": "%s Teymi",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"L'arte di essere saggi è l'arte di saper cosa trascurare.\"",
"settings.locale": "it",
"settings.direction": "ltr",
"emails.sender": "Team {{project}}",
"emails.sender": "Team %s",
"emails.verification.subject": "Verifica account",
"emails.verification.hello": "Ciao {{user}},",
"emails.verification.body": "Clicca questo link per verificare il tuo indirizzo email.",
"emails.verification.footer": "Se non hai richiesto la verifica dellindirizzo email, puoi ignorare questo messaggio.",
"emails.verification.thanks": "Grazie,",
"emails.verification.buttonText": "Confermare l'indirizzo email",
"emails.verification.signature": "Il team {{project}}",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Ciao,",
"emails.magicSession.body": "Clicca questo link per accedere.",
"emails.magicSession.footer": "Se non hai richiesto di effettuare laccesso, puoi ignorare questo messaggio.",
"emails.magicSession.thanks": "Grazie,",
"emails.magicSession.signature": "Il team {{project}}",
"emails.recovery.subject": "Reimpostazione password",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Clicca questo link per reimpostare la tua password di {{project}}.",
"emails.recovery.footer": "Se non hai richiesto la reimpostazione della password, puoi ignorare questo messaggio.",
"emails.recovery.thanks": "Grazie,",
"emails.recovery.buttonText": "Reimposta password",
"emails.recovery.signature": "Il team {{project}}",
"emails.invitation.subject": "Invito al Team {{team}} per {{project}}",
"emails.invitation.subject": "Invito al Team %s per %s",
"emails.invitation.hello": "Ciao,",
"emails.invitation.body": "Hai ricevuto questa email perché {{owner}} ti ha invitato a diventare un membro del team {{team}} di {{project}}.",
"emails.invitation.footer": "Ignora questo messaggio se non sei interessatə.",
"emails.invitation.thanks": "Grazie,",
"emails.invitation.buttonText": "Accetta invito a {{team}}",
"emails.invitation.signature": "Il team {{project}}",
"locale.country.unknown": "Sconosciuto",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"賢明になる術は何を捨てるべきかを心得る術である。\"",
"settings.locale": "ja",
"settings.direction": "ltr",
"emails.sender": "{{project}} チーム",
"emails.sender": "%s チーム",
"emails.verification.subject": "アカウント認証",
"emails.verification.hello": "こんにちは{{user}}さん、",
"emails.verification.body": "メールアドレスを有効化するためには下記リンクをクリックして下さい。",
"emails.verification.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。",
"emails.verification.thanks": "ご利用いただきありがとうございます。、",
"emails.verification.buttonText": "メールアドレスを確認する",
"emails.verification.signature": "{{project}}チーム",
"emails.magicSession.subject": "ログイン",
"emails.magicSession.hello": "こんにちは、",
"emails.magicSession.body": "ログインするためには下記リンクをクリックしてください。",
"emails.magicSession.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。",
"emails.magicSession.thanks": "ご利用いただきありがとうございます。、",
"emails.magicSession.signature": "{{project}}チーム",
"emails.recovery.subject": "パスワードリセット",
@@ -19,14 +20,12 @@
"emails.recovery.body": "パスワードをリセットするためには下記リンクをクリックしてください。",
"emails.recovery.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。",
"emails.recovery.thanks": "ご利用いただきありがとうございます。、",
"emails.recovery.buttonText": "パスワードをリセット",
"emails.recovery.signature": "{{project}}チーム",
"emails.invitation.subject": "{{team}}チームへの招待が{{project}}から来ました。",
"emails.invitation.subject": "%sチームへの招待が%sから来ました。",
"emails.invitation.hello": "こんにちは、",
"emails.invitation.body": "{{owner}}さんが{{project}}の{{team}}チームにあなたを招待しています。",
"emails.invitation.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。",
"emails.invitation.thanks": "ご利用いただきありがとうございます。、",
"emails.invitation.buttonText": "{{team}}への招待を承諾する",
"emails.invitation.signature": "{{project}}チーム",
"locale.country.unknown": "不明",
"countries.af": "アフガニスタン",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Kesenian sing wicaksana yaiku seni sing ngerti apa sing kudu dilalekake.\"",
"settings.locale": "jv",
"settings.direction": "ltr",
"emails.sender": "Tim {{project}}",
"emails.sender": "Tim %s",
"emails.verification.subject": "Verifikasi Akun",
"emails.verification.hello": "Hai {{user}},",
"emails.verification.body": "Klik link iki kanggo verifikasi alamat email sampeyan.",
"emails.verification.footer": "Yen sampeyan ora njaluk verifikasi alamat iki, sampeyan iso nglirwakake pesen iki.",
"emails.verification.thanks": "Matur nuwun,",
"emails.verification.buttonText": "Konfirmasi alamat email",
"emails.verification.signature": "Tim {{project}}",
"emails.magicSession.subject": "Masuk",
"emails.magicSession.hello": "Hai,",
"emails.magicSession.body": "Klik link iki kanggo masuk.",
"emails.magicSession.footer": "Yen sampeyan ora njaluk masuk nggunakake alamat email iki, sampeyan iso nglirwakake pesen iki.",
"emails.magicSession.thanks": "Matur nuwun,",
"emails.magicSession.signature": "Tim {{project}}",
"emails.recovery.subject": "Setel ulang sandi",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Klik link iki kanggo setel ulang sandi {{project}}.",
"emails.recovery.footer": "Yen sampeyan ora njaluk setel ulang sandi, sampeyan iso nglirwakake pesen iki.",
"emails.recovery.thanks": "Matur nuwun,",
"emails.recovery.buttonText": "Reset sandhi",
"emails.recovery.signature": "Tim {{project}}",
"emails.invitation.subject": "Undangan ke Tim {{team}} di {{project}}",
"emails.invitation.subject": "Undangan ke Tim %s di %s",
"emails.invitation.hello": "Halo,",
"emails.invitation.body": "Email iki dikirim menyang sampeyan amarga {{owner}} pengin ngajak sampeyan dadi anggota tim {{team}} di {{project}}.",
"emails.invitation.footer": "Yen sampeyan ora tertarik, sampeyan iso nglirwakake pesen iki.",
"emails.invitation.thanks": "Matur nuwun,",
"emails.invitation.buttonText": "Tampa undhangan menyang {{team}}",
"emails.invitation.signature": "Tim {{project}}",
"locale.country.unknown": "Ora dingerteni",
"countries.af": "Afghanistan",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"សិល្បៈនៃប្រាជ្ញាគឺជាសិល្បៈនៃការស្គាល់ពីអ្វីដែលត្រូវមើលរំលង។\"",
"settings.locale": "km",
"settings.direction": "ltr",
"emails.sender": "ក្រុម {{project}}",
"emails.sender": "ក្រុម %s",
"emails.verification.subject": "",
"emails.verification.hello": "",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": "",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": "",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+5 -6
View File
@@ -1,17 +1,18 @@
{
"settings.inspire": "\"ಬುದ್ಧಿವಂತಿಕೆಯ ಕಲೆ ಏನು ಕಡೆಗಣಿಸಬೇಕೆಂದು ತಿಳಿಯುವ ಕಲೆ.\"",
"settings.locale": "kn",
"settings.locale": "ka",
"settings.direction": "ltr",
"emails.sender": "{{project}} ತಂಡ",
"emails.sender": "%s ತಂಡ",
"emails.verification.subject": "ಖಾತೆ ಪರಿಶೀಲನೆ",
"emails.verification.hello": "ನಮಸ್ಕಾರ {{user}},",
"emails.verification.body": "ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸ ಪರಿಶೀಲನೆಗೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ",
"emails.verification.footer": "ನೀವು ಇಮೇಲ್ ವಿಳಾಸ ಪರಿಶೀಲನೆಗೆ ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ",
"emails.verification.thanks": "ಧನ್ಯವಾದಗಳು,",
"emails.verification.buttonText": "ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ದೃಢೀಕರಿಸಿ",
"emails.verification.signature": "{{project}} ತಂಡ",
"emails.magicSession.subject": "ಲಾಗಿನ್",
"emails.magicSession.hello": "ನಮಸ್ಕಾರ,",
"emails.magicSession.body": "ಲಾಗಿನ್ ಮಾಡಲಿಕ್ಕೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ",
"emails.magicSession.footer": "ನೀವು ಈ ಇಮೇಲನಿಂದ ಲಾಗಿನ್ ಮಾಡಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ",
"emails.magicSession.thanks": "ಧನ್ಯವಾದಗಳು,",
"emails.magicSession.signature": "{{project}} ತಂಡ",
"emails.recovery.subject": "ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಿ",
@@ -19,14 +20,12 @@
"emails.recovery.body": "ನಿಮ್ಮ {{project}} ಗುಪ್ತಪದವನ್ನು ಮರುಹೊಂದಿಸಲು ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ",
"emails.recovery.footer": "ನೀವು ಗುಪ್ತಪದವನ್ನು ಮರುಹೊಂದಿಸಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ",
"emails.recovery.thanks": "ಧನ್ಯವಾದಗಳು,",
"emails.recovery.buttonText": "ಗುಪ್ತಪದವನ್ನು ಮರುಸೆಟ್ ಮಾಡಿ",
"emails.recovery.signature": "{{project}} ತಂಡ",
"emails.invitation.subject": "{{team}} ತಂಡಕ್ಕೆ {{project}} ರಲ್ಲಿ ಆಹ್ವಾನ",
"emails.invitation.subject": "%s ತಂಡಕ್ಕೆ %s ರಲ್ಲಿ ಆಹ್ವಾನ",
"emails.invitation.hello": "ನಮಸ್ಕಾರ,",
"emails.invitation.body": "ಈ ಇಮೇಲ್ ನಿಮಗೆ ಬಂದಿದೆ ಏಕೆಂದರೆ {{owner}} ನಿಮ್ಮನ್ನು {{team}} ತಂಡದ {{project}}ರಲ್ಲಿ ಸದಸ್ಯ ಆಗಲಿಕ್ಕೆ ಆಹ್ವಾನಿಸಿದ್ದಾರೆ",
"emails.invitation.footer": "ನಿಮಗೆ ಆಸಕ್ತಿಯಿಲ್ಲದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ",
"emails.invitation.thanks": "ಧನ್ಯವಾದಗಳು,",
"emails.invitation.buttonText": "{{team}} ಗೆ ಆಹ್ವಾನವನ್ನು ಸ್ವೀಕರಿಸಿ",
"emails.invitation.signature": "{{project}} ತಂಡ",
"locale.country.unknown": "Unknown",
"countries.af": "ಅಫ್ಘಾನಿಸ್ತಾನ",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"지혜롭게 되는 묘책은 그동안 간과했던 것을 알아내는 것에 있다\"",
"settings.locale": "ko",
"settings.direction": "ltr",
"emails.sender": "{{project}} 팀",
"emails.sender": "%s 팀",
"emails.verification.subject": "계정 인증",
"emails.verification.hello": "안녕하세요 {{user}}님、",
"emails.verification.body": "이메일 인증을 위해 링크를 클릭하여주세요.",
"emails.verification.footer": "이메일 인증을 부탁하지 않으셨다면 이 메시지를 무시하여주세요.",
"emails.verification.thanks": "감사합니다、",
"emails.verification.buttonText": "이메일 주소를 확인합니다",
"emails.verification.signature": "{{project}} 팀",
"emails.magicSession.subject": "로그인",
"emails.magicSession.hello": "안녕하세요、",
"emails.magicSession.body": "로그인 하시려면 링크를 클릭하여주세요.",
"emails.magicSession.footer": "이 이메일 계정으로 로그인 신청을 하지 않으셨다면 이 메세지를 무시하여주세요.",
"emails.magicSession.thanks": "감사합니다、",
"emails.magicSession.signature": "{{project}} 팀",
"emails.recovery.subject": "비밀번호 재설정",
@@ -19,14 +20,12 @@
"emails.recovery.body": "{{project}}의 비밀번호 재설정을 위해 링크를 클릭하여주세요.",
"emails.recovery.footer": "비밀번호 재설정 신청을 하지 않으셨다면 이 메세지를 무시하여주세요.",
"emails.recovery.thanks": "감사합니다、",
"emails.recovery.buttonText": "비밀번호 재설정",
"emails.recovery.signature": "{{project}} 팀",
"emails.invitation.subject": "초대장 {{team}} 팀 - {{project}}",
"emails.invitation.subject": "초대장 %s 팀 - %s",
"emails.invitation.hello": "안녕하세요、",
"emails.invitation.body": "{{owner}}님이 귀하를 {{project}}의 {{team}} 팀으로 초대합니다.",
"emails.invitation.footer": "팀에 합류할 의사가 없으시면 이 메세지를 무시하여주세요.",
"emails.invitation.thanks": "감사합니다、",
"emails.invitation.buttonText": "{{team}} 초대를 수락하기",
"emails.invitation.signature": "{{project}} 팀",
"locale.country.unknown": "알려지지 않은",
"countries.af": "아프가니스탄",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Ars sapiendi est ars sciendi quid negligat.\"",
"settings.locale": "la",
"settings.direction": "ltr*",
"emails.sender": "{{project}} team",
"emails.sender": "%s team",
"emails.verification.subject": "Ratio comprobatio",
"emails.verification.hello": "Salve ibi {{user}},",
"emails.verification.body": "Sequere hanc nexum ut quin inscriptionem tuum.",
"emails.verification.footer": "Si verificationem huius inscriptionis non postulasti, nuntium hunc ignorare potes.",
"emails.verification.thanks": "Gratias,",
"emails.verification.buttonText": "Confirma inscriptionem electronicam",
"emails.verification.signature": "{{project}} Team",
"emails.magicSession.subject": "Log in",
"emails.magicSession.hello": "Salve ibi,",
"emails.magicSession.body": "Hanc nexum cum login",
"emails.magicSession.footer": "Si verificationem huius inscriptionis non postulasti, nuntium hunc ignorare potes.",
"emails.magicSession.thanks": "Gratias,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Recuperet password",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Sequere hanc conjunctionem ut recipias project password {{project}}",
"emails.recovery.footer": "Si tesseram tuam recuperare non petis, nuntium hunc ignorare potes",
"emails.recovery.thanks": "Gratias,",
"emails.recovery.buttonText": "Reset password",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Invitatio pro {{team}} in quadrigis {{project}}",
"emails.invitation.subject": "Invitatio pro %s in quadrigis %s",
"emails.invitation.hello": "Salve ibi,",
"emails.invitation.body": "Haec inscriptio ad te missa est quia dominus incepto {{owner}} te invitare vult ut membrum {{team}} quadrigis fias ad {{project}}",
"emails.invitation.footer": "Si non quaero, potes hunc nuntium ignorare",
"emails.invitation.thanks": "Gratias,",
"emails.invitation.buttonText": "Accipe invitare ad {{team}}",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Ignotum",
"countries.af": "Afghanistan",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "Sententia securitatis huius epistulae est {{phrase}}. Epistulae confidere potes si haec sententia cum ea quae ostensa est in signo ingressus convenit.",
"emails.otpSession.thanks": "Gratias,",
"emails.otpSession.signature": "{{project}} team -> {{project}} grex",
"emails.certificate.subject": "Defectio testimonii pro {{domain}}",
"emails.certificate.subject": "Defectio testimonii pro %s",
"emails.certificate.hello": "Salve,",
"emails.certificate.body": "Certificatum pro dominio tuo '{{domain}}' generari non potuit. Hoc conatus num. {{attempt}} est, et defectus causatus est ab: {{error}}",
"emails.certificate.footer": "Praeclarum tuum testificationem valet ad XXX dies a primo defectu. Magnopere suademus ut hoc casum investiges, alioquin dominium tuum sine valida SSL communicatione erit.",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"",
"settings.locale": "lb",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Kont Verifikatioun",
"emails.verification.hello": "Hey {{user}},",
"emails.verification.body": "Follegt dëse Link fir Är E -Mail Adress z'iwwerpréiwen.",
"emails.verification.footer": "Wann Dir net gefrot hutt dës Adress z'iwwerpréiwen, kënnt Dir dëse Message ignoréieren.",
"emails.verification.thanks": "Merci,",
"emails.verification.buttonText": "E-Mail-Adress bestätegen",
"emails.verification.signature": "{{project}} équipe",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Hey,",
"emails.magicSession.body": "Follegt dëse Link fir umellen.",
"emails.magicSession.footer": "Wann Dir net gefrot hutt Iech mat dëser E -Mail anzemelden, kënnt Dir dëse Message ignoréieren.",
"emails.magicSession.thanks": "Merci,",
"emails.magicSession.signature": "{{project}} équipe",
"emails.recovery.subject": "Password Reset",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Follegt dëse Link fir Äert {{project}} Passwuert zréckzesetzen.",
"emails.recovery.footer": "Wann Dir net gefrot hutt Äert Passwuert zréckzesetzen, kënnt Dir dëse Message ignoréieren.",
"emails.recovery.thanks": "Merci,",
"emails.recovery.buttonText": "Passwuert zrécksetzen",
"emails.recovery.signature": "{{project}} équipe",
"emails.invitation.subject": "Invitatioun un {{team}} équipe bei {{project}}",
"emails.invitation.subject": "Invitatioun un %s équipe bei %s",
"emails.invitation.hello": "Hallo,",
"emails.invitation.body": "Dës E -Mail gouf un Iech geschéckt well {{owner}} Iech invitéiere wëllt fir Member vum {{team}} Team bei {{project}} ze ginn.",
"emails.invitation.footer": "Wann Dir net interesséiert sidd, kënnt Dir dëse Message ignoréieren.",
"emails.invitation.thanks": "Merci,",
"emails.invitation.buttonText": "Invitatioun bei {{team}} akzeptéieren",
"emails.invitation.signature": "{{project}} équipe",
"locale.country.unknown": "Onbekannt",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Menas būti išmintingu — tai menas žinoti, ko galima nepamatyti.\"",
"settings.locale": "lt",
"settings.direction": "ltr",
"emails.sender": "{{project}} komanda",
"emails.sender": "%s komanda",
"emails.verification.subject": "Paskyros Patvirtinimas",
"emails.verification.hello": "Labas {{user}},",
"emails.verification.body": "Spauskite šią nuorodą, kad patvirtintumėte savo el. paštą.",
"emails.verification.footer": "Jei neprašėte patvirtinti šio el. pašto, galite ignoruoti šį pranešimą.",
"emails.verification.thanks": "Ačiū,",
"emails.verification.buttonText": "Patvirtinti el. pašto adresą",
"emails.verification.signature": "{{project}} komanda",
"emails.magicSession.subject": "Prisijungti",
"emails.magicSession.hello": "Labas,",
"emails.magicSession.body": "Spauskite šią nuorodą, kad prisijungtumėte.",
"emails.magicSession.footer": "Jei neprašėte prisijungti naudojantis šiuo el. paštu, galite ignoruoti šį pranešimą.",
"emails.magicSession.thanks": "Ačiū,",
"emails.magicSession.signature": "{{project}} komanda",
"emails.recovery.subject": "Slaptažodžio Atkūrimas",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Spauskite šią nuorodą, kad atkurtumėte projekto {{project}} slaptažodį.",
"emails.recovery.footer": "Jei neprašėte atkurti savo slaptažodzio, galite ignoruoti šį pranešimą.",
"emails.recovery.thanks": "Ačiū,",
"emails.recovery.buttonText": "Atstatyti slaptažodį",
"emails.recovery.signature": "{{project}} komanda",
"emails.invitation.subject": "Pakvietimas į {{team}} komandą {{project}} projekte",
"emails.invitation.subject": "Pakvietimas į %s komandą %s projekte",
"emails.invitation.hello": "Labas,",
"emails.invitation.body": "Šis el. laiškas buvo atsiųstas jums, nes {{owner}} norėjo jus pakviesti tapti projekto {{project}} dalimi {{team}} komandoje.",
"emails.invitation.footer": "Jei jūsų tai nedomina, galite ignoruoti šį pranešimą.",
"emails.invitation.thanks": "Ačiū,",
"emails.invitation.buttonText": "Priimti kvietimą į {{team}}",
"emails.invitation.signature": "{{project}} komanda",
"locale.country.unknown": "Nežinoma",
"countries.af": "Afganistanas",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Māksla būt gudram ir māksla zināt, ko aizmirst.\"",
"settings.locale": "lv",
"settings.direction": "ltr",
"emails.sender": "{{project}} komanda",
"emails.sender": "%s komanda",
"emails.verification.subject": "Konta verifikācija",
"emails.verification.hello": "Sveicināti, {{user}},",
"emails.verification.body": "Sekojiet saitei, lai apstiprinātu savu e-pasta adresi.",
"emails.verification.footer": "Ja Jūs nepieprasījāt šīs adreses apstiprinājumu, lūdzu, ignorējiet šo ziņu.",
"emails.verification.thanks": "Paldies,",
"emails.verification.buttonText": "Apstiprināt e-pasta adresi",
"emails.verification.signature": "{{project}} komanda",
"emails.magicSession.subject": "Ieiet",
"emails.magicSession.hello": "Sveicināti,",
"emails.magicSession.body": "Sekojiet saitei, lai ieietu.",
"emails.magicSession.footer": "Ja Jūs nepieprasījāt ieiet ar šo e-pasta adresi, lūdzu, ignorējiet šo ziņu.",
"emails.magicSession.thanks": "Paldies,",
"emails.magicSession.signature": "{{project}} komanda",
"emails.recovery.subject": "Paroles atjaunināšana",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Sekojiet saitei, lai atjauninātu {{project}} paroli.",
"emails.recovery.footer": "Ja Jūs nepieprasījāt paroles atjaunināšanu, lūdzu, ignorējiet šo ziņu.",
"emails.recovery.thanks": "Paldies,",
"emails.recovery.buttonText": "Atiestatīt paroli",
"emails.recovery.signature": "{{project}} komanda",
"emails.invitation.subject": "Ielūgums piebiedroties {{team}} komandai {{project}} projektā.",
"emails.invitation.subject": "Ielūgums piebiedroties %s komandai %s projektā.",
"emails.invitation.hello": "Labdien,",
"emails.invitation.body": "Šis e-pasts tika nosūtīts Jums, jo {{owner}} vēlējās Jūs ielūgt kļūt par {{team}} komandas biedru {{project}} projektā.",
"emails.invitation.footer": "Ja Jūs neesat ieinteresēts, lūdzu, ignorējiet šo ziņu.",
"emails.invitation.thanks": "Paldies,",
"emails.invitation.buttonText": "Pieņemt ielūgumu uz {{team}}",
"emails.invitation.signature": "{{project}} komanda",
"locale.country.unknown": "Nav zināms",
"countries.af": "Afganistāna",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"എന്താണ് അവഗണിക്കേണ്ടതെന്ന് അറിയാനുള്ള കലയാണ് ബുദ്ധിമാനായിരിക്കുക എന്നത്.\"",
"settings.locale": "ml",
"settings.direction": "ltr",
"emails.sender": "{{project}} ടീം",
"emails.sender": "%s ടീം",
"emails.verification.subject": "അക്കൗണ്ട് സ്ഥിരീകരണം",
"emails.verification.hello": "നമസ്കാരം {{user}},",
"emails.verification.body": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക.",
"emails.verification.footer": "ഈ വിലാസം സ്ഥിരീകരിക്കാന്‍ നിങ്ങൾ ആവശ്യപ്പെട്ടില്ലെങ്കിൽ, നിങ്ങൾക്ക് ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.",
"emails.verification.thanks": "നന്ദി,",
"emails.verification.buttonText": "ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുക",
"emails.verification.signature": "{{project}} ടീം",
"emails.magicSession.subject": "ലോഗിൻ",
"emails.magicSession.hello": "നമസ്കാരം,",
"emails.magicSession.body": "ലോഗിൻ ചെയ്യുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക.",
"emails.magicSession.footer": "ഈ ഇമെയിൽ ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാൻ നിങ്ങൾ ആവശ്യപ്പെട്ടില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.",
"emails.magicSession.thanks": "നന്ദി,",
"emails.magicSession.signature": "{{project}} ടീം",
"emails.recovery.subject": "രഹസ്യവാക്ക് പുനക്രമീകരണം",
@@ -19,14 +20,12 @@
"emails.recovery.body": "നിങ്ങളുടെ {{Project}} രഹസ്യവാക്ക് പുനക്രമീകരിക്കുന്നതിന് ഈ ലിങ്ക് പിന്തുടരുക.",
"emails.recovery.footer": "നിങ്ങളുടെ രഹസ്യവാക്ക് പുനക്രമീകരിക്കാന്‍ നിങ്ങൾ ആവശ്യപ്പെട്ടില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.",
"emails.recovery.thanks": "നന്ദി,",
"emails.recovery.buttonText": "പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുക",
"emails.recovery.signature": "{{project}} ടീം",
"emails.invitation.subject": "{{project}} -ലെ {{team}} ടീമിലേക്കുള്ള ക്ഷണം",
"emails.invitation.subject": "%s -ലെ %s ടീമിലേക്കുള്ള ക്ഷണം",
"emails.invitation.hello": "നമസ്കാരം,",
"emails.invitation.body": "നിങ്ങളെ {{project}} -ലെ {{team}} ടീമിലെ അംഗമാകുവാന്‍ ക്ഷണിക്കാൻ {{owner}} ആഗ്രഹിക്കുന്നതിനാലാണ് ഈ മെയിൽ നിങ്ങൾക്ക് അയക്കുന്നത്.",
"emails.invitation.footer": "നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.",
"emails.invitation.thanks": "നന്ദി,",
"emails.invitation.buttonText": "{{team}} ലേക്കുള്ള ക്ഷണം സ്വീകരിക്കുക",
"emails.invitation.signature": "{{project}} ടീം",
"locale.country.unknown": "Unknown",
"countries.af": "അഫ്ഗാനിസ്ഥാൻ",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "ഈ ഇമെയിലിന്റെ സുരക്ഷാ വാചകം {{phrase}} ആണ്. സൈൻ ഇൻ ചെയ്യുമ്പോൾ കാണിച്ച വാചകവുമായി ഈ വാചകം പൊരുത്തപ്പെടുന്നുണ്ടെങ്കിൽ ഈ ഇമെയിലിന് വിശ്വസിക്കാം.",
"emails.otpSession.thanks": "നന്ദി,",
"emails.otpSession.signature": "പ്രോജക്ട് ടീം",
"emails.certificate.subject": "{{domain}} ന് സർട്ടിഫിക്കറ്റ് പരാജയപ്പെട്ടു",
"emails.certificate.subject": "%s ന് സർട്ടിഫിക്കറ്റ് പരാജയപ്പെട്ടു",
"emails.certificate.hello": "ഹലോ,",
"emails.certificate.body": "നിങ്ങളുടെ ഡൊമൈൻ '{{domain}}'നു വേണ്ടിയുള്ള സർട്ടിഫിക്കറ്റ് ഉണ്ടാക്കാനായില്ല. ഇത് ശ്രമം നമ്പർ {{attempt}} ആണ്, പരാജയപ്പെട്ടത് ഇതു മൂലമാണ്: {{error}}",
"emails.certificate.footer": "നിങ്ങളുടെ മുൻപത്തെ സർട്ടിഫിക്കറ്റ് ആദ്യ പരാജയത്തിനു ശേഷം 30 ദിവസം വരെ സാധുവായിരിക്കും. ഈ കേസ് അന്വേഷിച്ചു നോക്കുന്നത് ഞങ്ങൾ ശക്തമായി ശുപാർശ ചെയ്യുന്നു, അല്ലെങ്കിൽ നിങ്ങളുടെ ഡൊമെയ്‌ൻ സാധുവായ SSL കമ്മ്യൂണിക്കേഷനില്ലാത്ത ഒരു അവസ്ഥയിലാകും.",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"हुशार असण्याची कला म्हणजे कोणत्या गोष्टीकडे दुर्लक्ष करावे हे जाणून घेण्याची कला.\"",
"settings.locale": "mr",
"settings.direction": "ltr",
"emails.sender": "{{project}} टीम",
"emails.sender": "%s टीम",
"emails.verification.subject": "खाते सत्यापन",
"emails.verification.hello": "नमस्कार {{user}},",
"emails.verification.body": "आपला ईमेल पत्ता सत्यापित करण्यासाठी या दुव्याचे अनुसरण करा.",
"emails.verification.footer": "आपण या पत्त्याची पडताळणी करण्यास सांगितले नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.",
"emails.verification.thanks": "धन्यवाद,",
"emails.verification.buttonText": "ईमेल पत्ता सत्यापित करा",
"emails.verification.signature": "{{project}} संघ",
"emails.magicSession.subject": "लॉगिन करा",
"emails.magicSession.hello": "नमस्कार ,",
"emails.magicSession.body": "लॉगिन करण्यासाठी या लिंकचे अनुसरण करा.",
"emails.magicSession.footer": "आपण या ईमेलचा वापर करून लॉगिन करण्यास सांगितले नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.",
"emails.magicSession.thanks": "धन्यवाद,",
"emails.magicSession.signature": "{{project}} संघ",
"emails.recovery.subject": "पासवर्ड रीसेट",
@@ -19,14 +20,12 @@
"emails.recovery.body": "आपला {{project}}चे पासवर्ड रीसेट करण्यासाठी या लिंकचे अनुसरण करा",
"emails.recovery.footer": "आपण आपला पासवर्ड रीसेट करण्यास सांगितले नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.",
"emails.recovery.thanks": "धन्यवाद,",
"emails.recovery.buttonText": "पासवर्ड रीसेट करा",
"emails.recovery.signature": "{{project}} संघ",
"emails.invitation.subject": "{{team}} संघ {{project}} येथे सामील होण्यासाठी आमंत्रण",
"emails.invitation.subject": "%s संघ %s येथे सामील होण्यासाठी आमंत्रण",
"emails.invitation.hello": "नमस्कार,",
"emails.invitation.body": "हा मेल तुम्हाला पाठवला होता कारण {{owner}} तुम्हाला {{project}} येथे {{team}} टीमचे सदस्य होण्यासाठी आमंत्रित करू इच्छित होते.",
"emails.invitation.footer": "आपल्याला स्वारस्य नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.",
"emails.invitation.thanks": "धन्यवाद,",
"emails.invitation.buttonText": "{{team}} साठी आमंत्रण स्वीकारा",
"emails.invitation.signature": "{{project}} संघ",
"locale.country.unknown": "अज्ञात",
"countries.af": "अफगानिस्तान",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Seni menjadi pandai adalah seni mengetahui apa yang dilihatnya.\"",
"settings.locale": "ms",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Pengesahan Akaun",
"emails.verification.hello": "Hey {{user}},",
"emails.verification.body": "Tekan pautan ini untuk mengesahkan alamat email anda.",
"emails.verification.footer": "Sekiranya anda tidak membuat permintaan untuk mengesahkan email ini, sila abaikan mesej ini.",
"emails.verification.thanks": "Terima kasih,",
"emails.verification.buttonText": "Sahkan alamat email",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "Log masuk",
"emails.magicSession.hello": "Hey,",
"emails.magicSession.body": "Tekan pautan ini untuk log masuk.",
"emails.magicSession.footer": "Sekiranya anda tidak membuat permintaan untuk log masuk menggunakan email ini, sila abaikan mesej ini.",
"emails.magicSession.thanks": "Terima kasih,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Menetap semula Kata Laluan",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Tekan pautan ini untuk menetapkan semula kata laluan {{project}}.",
"emails.recovery.footer": "Sekiranya anda tidak membuat permintaan menetap semula kata laluan, sila abaikan mesej ini.",
"emails.recovery.thanks": "Terima kasih,",
"emails.recovery.buttonText": "Tetapkan semula kata laluan",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Jemputan ke pasukan {{team}} di {{project}}",
"emails.invitation.subject": "Jemputan ke pasukan %s di %s",
"emails.invitation.hello": "Hello,",
"emails.invitation.body": "Anda menerima mel ini kerana {{owner}} ingin menjemput anda untuk menjadi ahli pasukan {{team}} di {{project}}.",
"emails.invitation.footer": "Sekiranya anda tidak berminat, sila abaikan mesej ini.",
"emails.invitation.thanks": "Terima kasih,",
"emails.invitation.buttonText": "Terima jemputan ke {{team}}",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Tidak Diketahui",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"",
"settings.locale": "nb",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Kontobekreftelse",
"emails.verification.hello": "Hei {{user}},",
"emails.verification.body": "Følg denne lenken for å bekrefte din e-postadresse.",
"emails.verification.footer": "Dersom du ikke ba om å bekrefte e-postadressen, kan du se bort fra denne meldingen.",
"emails.verification.thanks": "Takk,",
"emails.verification.buttonText": "Bekreft e-postadresse",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "Pålogging",
"emails.magicSession.hello": "Hei,",
"emails.magicSession.body": "Følg denne lenken for å logge på.",
"emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-postadressen, kan du se bort fra denne meldingen.",
"emails.magicSession.thanks": "Takk,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Nullstille passord",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Følg denne lenken for å nullstille ditt {{project}} passord.",
"emails.recovery.footer": "Dersom du ikke ba om å nullstille passordet ditt, kan du se bort fra denne meldingen.",
"emails.recovery.thanks": "Takk,",
"emails.recovery.buttonText": "Tilbakestill passord",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Invitasjon til {{team}} Team ved {{project}}",
"emails.invitation.subject": "Invitasjon til %s Team ved %s",
"emails.invitation.hello": "Hei,",
"emails.invitation.body": "Denne meldingen ble sendt til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team ved {{project}}.",
"emails.invitation.footer": "Dersom du ikke er interessert, kan du se bort fra denne meldingen.",
"emails.invitation.thanks": "Takk,",
"emails.invitation.buttonText": "Godta invitasjon til {{team}}",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Ukjent",
"countries.af": "Afghanistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"के लाई बेवास्ता गर्ने भन्ने जान्नुनै बुद्धिमान हुनुको कला हो ।\"",
"settings.locale": "ne",
"settings.direction": "ltr",
"emails.sender": "{{project}} समूह",
"emails.sender": "%s समूह",
"emails.verification.subject": "खाता प्रमाणिकरण",
"emails.verification.hello": "नमस्ते {{user}},",
"emails.verification.body": "इमेल ठेगाना प्रमाणित गर्नको लागी यो लिंकमा जानुहोस।",
"emails.verification.footer": "यदि तपाइँले आफ्नो खाता प्रमाणित गर्न सोध्नु भएको छैन भने तपाइँले यो सन्देश लाई बेवास्ता गर्न सक्नुहुन्छ।",
"emails.verification.thanks": "धन्यवाद,",
"emails.verification.buttonText": "इमेल ठेगाना पुष्टि गर्नुहोस्",
"emails.verification.signature": "{{project}} समूह",
"emails.magicSession.subject": "लगइन",
"emails.magicSession.hello": "नमस्ते,",
"emails.magicSession.body": "लगइन गर्नको लागी यो लिंकमा जानुहोस।",
"emails.magicSession.footer": "यदि तपाइँले यो इमेल प्रयोग गरेर लगइन गर्न सोध्नु भएको छैन भने तपाइँले यो सन्देश लाई बेवास्ता गर्न सक्नुहुन्छ।",
"emails.magicSession.thanks": "धन्यवाद,",
"emails.magicSession.signature": "{{project}} समूह",
"emails.recovery.subject": "पासवर्ड रिसेट",
@@ -19,14 +20,12 @@
"emails.recovery.body": "{{project}}को पासवर्ड रिसेट गर्नको लागी यो लिंकमा जानुहोस।",
"emails.recovery.footer": "यदि तपाइँले आफ्नो पासवर्ड रिसेट गर्न सोध्नु भएको छैन भने तपाइँले यो सन्देश लाई बेवास्ता गर्न सक्नुहुन्छ।",
"emails.recovery.thanks": "धन्यवाद,",
"emails.recovery.buttonText": "रिसेट पासवर्ड",
"emails.recovery.signature": "{{project}} समूह",
"emails.invitation.subject": "{{team}} समूहको लागि {{project}} मा निमन्त्रणा",
"emails.invitation.subject": "%s समूहको लागि %s मा निमन्त्रणा",
"emails.invitation.hello": "नमस्ते,",
"emails.invitation.body": "{{owner}}ले तपाइँलाई {{project}}मा {{team}}को सदस्य बन्न आमन्त्रित गर्न चाहनु भएको छ। त्येसैले तपाइँलाई यो सन्देश पठाइएको हो।",
"emails.invitation.footer": "यदि तपाइँ इच्छुक हुनुहुन्न भने, तपाइँले यो सन्देशलाई बेवास्ता गर्न सक्नुहुन्छ।",
"emails.invitation.thanks": "धन्यवाद,",
"emails.invitation.buttonText": "{{team}} मा निमन्त्रणा स्वीकार गर्नुहोस्",
"emails.invitation.signature": "{{project}} समूह",
"locale.country.unknown": "अज्ञात",
"countries.af": "अफगानिस्तान",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"De kunst om wijs te zijn is de kunst om te weten wat over het hoofd gezien moet worden.\"",
"settings.locale": "nl",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Account Verificatie",
"emails.verification.hello": "Hoi {{user}},",
"emails.verification.body": "Volg deze link om uw e-mail te verifieren",
"emails.verification.footer": "Als u geen aanvraag voor verificatie heeft gemaakt, kan u deze mail negeren",
"emails.verification.thanks": "Bedankt,",
"emails.verification.buttonText": "Bevestig e-mailadres",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Hoi,",
"emails.magicSession.body": "Volg deze link om in te loggen",
"emails.magicSession.footer": "Als u geen aanvraag heeft gemaakt om met deze mail in te loggen, kan u deze mail negeren",
"emails.magicSession.thanks": "Bedankt,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Wachtwoord Herinstellen",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Volg deze link om het wachtwoord van uw project {{project}} te wijzigen",
"emails.recovery.footer": "Als u geen aanvraag heeft gemaakt om uw wachtwoord te wijzigen, kan u deze mail negeren",
"emails.recovery.thanks": "Bedankt,",
"emails.recovery.buttonText": "Wachtwoord opnieuw instellen",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Uitnodiging van {{team}} Team uit {{project}}",
"emails.invitation.subject": "Uitnodiging van %s Team uit %s",
"emails.invitation.hello": "Hallo,",
"emails.invitation.body": "U ontvangt deze mail want u was uitgenodig door {{owner}} om lid van het {{team}} team te worden in {{project}} ",
"emails.invitation.footer": "Als u niet geintereseerd bent, kan u deze mail negeren.",
"emails.invitation.thanks": "Bedankt,",
"emails.invitation.buttonText": "Uitnodiging voor {{team}} accepteren",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Onbekend",
"countries.af": "Afghanistan",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Kunsten å væra klok er kunsten å vita kva man skal oversjå.\"",
"settings.locale": "nn",
"settings.direction": "ltr",
"emails.sender": "{{project}} Team",
"emails.sender": "%s Team",
"emails.verification.subject": "Kontostadfesting",
"emails.verification.hello": "Hallo {{user}},",
"emails.verification.body": "Følg denne lenkja for å bekrefta din e-postadresse.",
"emails.verification.footer": "Om du ikkje bad om å bekrefta e-postadressa, kan du ignorera denne meldinga.",
"emails.verification.thanks": "Takk,",
"emails.verification.buttonText": "Stadfest e-postadresse",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "Pålogging",
"emails.magicSession.hello": "Hei,",
"emails.magicSession.body": "Følg denne lenkja for å logge på.",
"emails.magicSession.footer": "Om du ikkje ba om å logge på med denne e-postadressa, kan du ignorera denne meldinga.",
"emails.magicSession.thanks": "Takk,",
"emails.magicSession.signature": "{{project}} team",
"emails.recovery.subject": "Nullstilla passord",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Følg denne lenkja for å nullstilla ditt {{project}} passord.",
"emails.recovery.footer": "Om du ikkje ba om å nullstilla passordet ditt, kan du ignorera denne meldinga.",
"emails.recovery.thanks": "Takk,",
"emails.recovery.buttonText": "Nullstill passord",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Innbyding til {{team}} Team ved {{project}}",
"emails.invitation.subject": "Innbyding til %s Team ved %s",
"emails.invitation.hello": "Hallo,",
"emails.invitation.body": "Denne meldinga ble sendt til deg fordi {{owner}} ynskja å invitera deg til å bli medlem av {{team}} team i {{project}}.",
"emails.invitation.footer": "Om du ikkje er interessert, kan du ignorera denne meldinga.",
"emails.invitation.thanks": "Takk,",
"emails.invitation.buttonText": "Godta invitasjon til {{team}}",
"emails.invitation.signature": "{{project}} team",
"locale.country.unknown": "Ukjend",
"countries.af": "Afghanistan",
@@ -245,7 +244,7 @@
"emails.otpSession.securityPhrase": "Tryggingsfrasen for denne e-posten er {{phrase}}. Du kan stole på denne e-posten om frasen stemmer med frasen vist under pålogging.",
"emails.otpSession.thanks": "Takk,",
"emails.otpSession.signature": "{{project}}-laget",
"emails.certificate.subject": "Sertifikatfeil for {{domain}}",
"emails.certificate.subject": "Sertifikatfeil for %s",
"emails.certificate.hello": "Hei,",
"emails.certificate.body": "Sertifikatet for domenet ditt '{{domain}}' kunne ikkje opprettast. Dette er forsøk nr. {{attempt}}, og feilen blei forårsaka av: {{error}}",
"emails.certificate.footer": "Førre sertifikatet ditt vil vere gyldig i 30 dagar sidan den første feilen. Vi rår sterkt til at du undersøkjer denne saka, elles vil domenet ditt ende opp utan gyldig SSL-kommunikasjon.",
+5 -6
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"ବୁଦ୍ଧିମାନ ହେବାର କଳା ହେଉଛି କ’ଣ ଅଣଦେଖା କରାଯିବ ଜାଣିବାର କଳା |\"",
"settings.locale": "or",
"settings.direction": "ltr",
"emails.sender": "{{project}} ଦଳ",
"emails.sender": "%s ଦଳ",
"emails.verification.subject": "ଖାତା ଯାଞ୍ଚ",
"emails.verification.hello": "ନମସ୍କାର {{user}},",
"emails.verification.body": "ଆପଣଙ୍କର ଇମେଲ୍ ଠିକଣା ଯାଞ୍ଚ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |",
"emails.verification.footer": "ଯଦି ଆପଣ ଏହି ଠିକଣା ଯାଞ୍ଚ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |",
"emails.verification.thanks": "ଧନ୍ୟବାଦ,",
"emails.verification.buttonText": "ଇମେଲ ଠିକଣା ନିଶ୍ଚିତ କରନ୍ତୁ",
"emails.verification.signature": "{{project}} ଦଳ",
"emails.magicSession.subject": "ଲଗଇନ୍ କରନ୍ତୁ",
"emails.magicSession.hello": "ନମସ୍କାର,",
"emails.magicSession.body": "ଲଗଇନ୍ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |",
"emails.magicSession.footer": "ଯଦି ଆପଣ ଏହି ଇମେଲ୍ ବ୍ୟବହାର କରି ଲଗଇନ୍ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |",
"emails.magicSession.thanks": "ଧନ୍ୟବାଦ,",
"emails.magicSession.signature": "{{project}} ଦଳ",
"emails.recovery.subject": "ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରନ୍ତୁ |",
@@ -19,14 +20,12 @@
"emails.recovery.body": "ଆପଣଙ୍କର {{project}} ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରିବାକୁ ଏହି ଲିଙ୍କକୁ ଅନୁସରଣ କରନ୍ତୁ |",
"emails.recovery.footer": "ଯଦି ଆପଣ ଆପଣଙ୍କର ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |",
"emails.recovery.thanks": "ଧନ୍ୟବାଦ,",
"emails.recovery.buttonText": "ପାସୱାର୍ଡ ପୁନଃସେଟ୍ କରନ୍ତୁ",
"emails.recovery.signature": "{{project}} ଦଳ",
"emails.invitation.subject": "{{team}} ରେ {{project}} ଦଳକୁ ନିମନ୍ତ୍ରଣ |",
"emails.invitation.subject": "%s ରେ %s ଦଳକୁ ନିମନ୍ତ୍ରଣ |",
"emails.invitation.hello": "ନମସ୍କାର,",
"emails.invitation.body": "ଏହି ମେଲ୍ ଆପଣଙ୍କୁ ପଠାଯାଇଥିଲା କାରଣ {{owner}} ଆପଣଙ୍କୁ {{project}} ରେ {{team}} ଦଳର ସଦସ୍ୟ ହେବାକୁ ଆମନ୍ତ୍ରଣ କରିବାକୁ ଚାହୁଁଥିଲେ |",
"emails.invitation.body": "ଏହି ମେଲ୍ ଆପଣଙ୍କୁ ପଠାଯାଇଥିଲା କାରଣ {{owner}} ଆପଣଙ୍କୁ {{project} ରେ {{team}} ଦଳର ସଦସ୍ୟ ହେବାକୁ ଆମନ୍ତ୍ରଣ କରିବାକୁ ଚାହୁଁଥିଲେ |",
"emails.invitation.footer": "ଯଦି ଆପଣ ଆଗ୍ରହୀ ନୁହଁନ୍ତି, ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଅଣଦେଖା କରିପାରିବେ |",
"emails.invitation.thanks": "ଧନ୍ୟବାଦ,",
"emails.invitation.buttonText": "{{team}} ପାଇଁ ଆମନ୍ତ୍ରଣ ଗ୍ରହଣ କରନ୍ତୁ",
"emails.invitation.signature": "{{project}} ଦଳ",
"locale.country.unknown": "ଅଜ୍ଞାତ",
"countries.af": "ଆଫଗାନିସ୍ତାନ",
+3 -1
View File
@@ -2,7 +2,7 @@
"settings.inspire": "\"ਬੁੱਧੀਮਾਨ ਬਣਨ ਦੀ ਕਲਾ ਇਹ ਜਾਣਨ ਦੀ ਕਲਾ ਹੈ ਕਿ ਕਿਸ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰਨਾ ਹੈ.\"",
"settings.locale": "pa",
"settings.direction": "ltr",
"emails.sender": "{{project}} ਟੀਮ",
"emails.sender": "%s ਟੀਮ",
"emails.verification.subject": "",
"emails.verification.hello": ",",
"emails.verification.body": "",
@@ -11,6 +11,8 @@
"emails.verification.signature": "",
"emails.magicSession.subject": "",
"emails.magicSession.hello": ",",
"emails.magicSession.body": "",
"emails.magicSession.footer": "",
"emails.magicSession.thanks": ",",
"emails.magicSession.signature": "",
"emails.recovery.subject": "",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Sztuka bycia mądrym to sztuka wiedzieć, co przeoczyć.\"",
"settings.locale": "pl",
"settings.direction": "ltr",
"emails.sender": "Zespół {{project}}",
"emails.sender": "Zespół %s",
"emails.verification.subject": "Weryfikacja konta",
"emails.verification.hello": "Cześć {{user}},",
"emails.verification.body": "Przejdź do tego linku, aby zweryfikować swój adres e-mail.",
"emails.verification.footer": "Jeśli to nie Ty prosiłeś o zweryfikowanie tego adresu, zignoruj tę wiadomość.",
"emails.verification.thanks": "Dziękujemy,",
"emails.verification.buttonText": "Potwierdź adres e-mail",
"emails.verification.signature": "Zespół {{project}}",
"emails.magicSession.subject": "Logowanie",
"emails.magicSession.hello": "Cześć,",
"emails.magicSession.body": "Kliknij w ten link, aby zalogować się.",
"emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, zignoruj tę wiadomość.",
"emails.magicSession.thanks": "Dziękujemy,",
"emails.magicSession.signature": "Zespół {{project}}",
"emails.recovery.subject": "Resetowanie hasła",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Przejdź do tego linku, aby zresetować hasło dla {{project}}.",
"emails.recovery.footer": "Jeśli to nie Ty prosiłeś o zresetowanie swojego hasła, zignoruj tę wiadomość.",
"emails.recovery.thanks": "Dziękujemy,",
"emails.recovery.buttonText": "Zresetuj hasło",
"emails.recovery.signature": "Zespół {{project}}",
"emails.invitation.subject": "Zaproszenie do zespołu {{team}} w {{project}}",
"emails.invitation.subject": "Zaproszenie do zespołu %s w %s",
"emails.invitation.hello": "Cześć,",
"emails.invitation.body": "Otrzymujesz tę wiadomość, ponieważ {{owner}} zaprasza Cię do grona członków zespołu {{team}} w projekcie {{project}}.",
"emails.invitation.footer": "Jeśli nie jesteś zainteresowany, zignoruj tę wiadomość.",
"emails.invitation.thanks": "Dziękujemy,",
"emails.invitation.buttonText": "Zaakceptuj zaproszenie do {{team}}",
"emails.invitation.signature": "Zespół {{project}}",
"locale.country.unknown": "Nieznany",
"countries.af": "Afganistan",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"A arte de ser sábio é a arte de saber o que deixar passar.\"",
"settings.locale": "pt-br",
"settings.direction": "ltr",
"emails.sender": "Time {{project}}",
"emails.sender": "Time %s",
"emails.verification.subject": "Verificação da Conta",
"emails.verification.hello": "Olá {{user}},",
"emails.verification.body": "Clique neste link para verificar o seu endereço de e-mail.",
"emails.verification.footer": "Se você não solicitou a verificação deste e-mail, ignore essa mensagem.",
"emails.verification.thanks": "Muito obrigado,",
"emails.verification.buttonText": "Confirmar endereço de e-mail",
"emails.verification.signature": "Time {{project}}",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Olá,",
"emails.magicSession.body": "Clique neste link para entrar.",
"emails.magicSession.footer": "Se você não solicitou conectar-se com este e-mail, ignore essa mensagem.",
"emails.magicSession.thanks": "Muito obrigado,",
"emails.magicSession.signature": "Time {{project}}",
"emails.recovery.subject": "Redefinição de senha",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Clique neste link para redefinir sua senha do {{project}}.",
"emails.recovery.footer": "Se você não solicitou a redefinição da sua senha, você pode ignorar essa mensagem.",
"emails.recovery.thanks": "Muito obrigado,",
"emails.recovery.buttonText": "Redefinir senha",
"emails.recovery.signature": "Time {{project}}",
"emails.invitation.subject": "Convite para o Time {{team}} em {{project}}",
"emails.invitation.subject": "Convite para o Time %s em %s",
"emails.invitation.hello": "Olá,",
"emails.invitation.body": "Este e-mail foi enviado porque {{owner}} deseja convidar você a se tornar membro do Time {{team}} em {{project}}.",
"emails.invitation.footer": "Caso não tenha interesse, ignore essa mensagem.",
"emails.invitation.thanks": "Muito obrigado,",
"emails.invitation.buttonText": "Aceitar convite para {{team}}",
"emails.invitation.signature": "Time {{project}}",
"locale.country.unknown": "Desconhecido",
"countries.af": "Afeganistão",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"A arte de ser sábio é a arte de saber o que ultrapassar.\"",
"settings.locale": "pt-pt",
"settings.direction": "ltr",
"emails.sender": "Equipa {{project}}",
"emails.sender": "Equipa %s",
"emails.verification.subject": "Verificação de contas",
"emails.verification.hello": "Hey {{user}},",
"emails.verification.body": "Siga esta ligação para verificar o seu endereço de correio electrónico.",
"emails.verification.footer": "Se não pediu para verificar este endereço, pode ignorar esta mensagem.",
"emails.verification.thanks": "Obrigado,",
"emails.verification.buttonText": "Confirmar endereço de email",
"emails.verification.signature": "Equipa {{project}}",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Olá ,",
"emails.magicSession.body": "Siga esta ligação para iniciar sessão.",
"emails.magicSession.footer": "Se não pediu para entrar usando este e-mail, pode ignorar esta mensagem.",
"emails.magicSession.thanks": "Obrigado,",
"emails.magicSession.signature": "Equipa {{project}}",
"emails.recovery.subject": "Redefinição de senha",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Utilize este link para redefinir a palavra-passe do seu projecto {{project}}",
"emails.recovery.footer": "Se não pediu para redefinir a sua palavra-passe, pode ignorar esta mensagem.",
"emails.recovery.thanks": "Obrigado,",
"emails.recovery.buttonText": "Repor palavra-passe",
"emails.recovery.signature": "Equipa {{project}}",
"emails.invitation.subject": "Convite à equipa de {{team}} às {{project}}",
"emails.invitation.subject": "Convite à equipa de %s às %s",
"emails.invitation.hello": "Olá,",
"emails.invitation.body": "Este correio foi-lhe enviado porque {{owner}} queria convidá-lo a tornar-se membro da equipa {{team}} da {{project}}.",
"emails.invitation.footer": "Se não estiver interessado, pode ignorar esta mensagem.",
"emails.invitation.thanks": "Obrigado,",
"emails.invitation.buttonText": "Aceitar convite para o {{team}}",
"emails.invitation.signature": "Equipa {{project}}",
"locale.country.unknown": "Desconhecido",
"countries.af": "Afeganistão",
+4 -5
View File
@@ -2,16 +2,17 @@
"settings.inspire": "\"Arta de a fi înţelept este arta de a intui ce trebuie trecut cu vederea.\"",
"settings.locale": "ro",
"settings.direction": "ltr",
"emails.sender": "{{project}} Echipa",
"emails.sender": "%s Echipa",
"emails.verification.subject": "Verificare cont",
"emails.verification.hello": "Bună ziua, {{user}},",
"emails.verification.body": "Click pe acest link pentru a valida adresa de email.",
"emails.verification.footer": "Dacă nu ai cerut validarea adresei de email, poți ignora acest mesaj.",
"emails.verification.thanks": "Mulțumim,",
"emails.verification.buttonText": "Confirmă adresa de email",
"emails.verification.signature": "Echipa {{project}}",
"emails.magicSession.subject": "Login",
"emails.magicSession.hello": "Bună ziua,",
"emails.magicSession.body": "Urmează acest link pentru logare.",
"emails.magicSession.footer": "Dacă nu ai incercat să te loghezi folosing această adresa de email, poți ignora acest mesaj.",
"emails.magicSession.thanks": "Mulțumim,",
"emails.magicSession.signature": "Echipa {{project}}",
"emails.recovery.subject": "Resetare parolă",
@@ -19,14 +20,12 @@
"emails.recovery.body": "Click aici pentru a reseta parola pentru {{project}}",
"emails.recovery.footer": "Dacă nu ai cerut să îți schimbi parola, ignoră acest mesaj.",
"emails.recovery.thanks": "Mulțumim,",
"emails.recovery.buttonText": "Resetează parola",
"emails.recovery.signature": "Echipa {{project}}",
"emails.invitation.subject": "Invitatie catre {{team}} Echipa la {{project}}",
"emails.invitation.subject": "Invitatie catre %s Echipa la %s",
"emails.invitation.hello": "Bună ziua,",
"emails.invitation.body": "Acest email a fost trimis pentru că {{owner}} a vrut ca tu să devii membru al echipei {{team}} la {{project}}.",
"emails.invitation.footer": "Dacă nu esti interesat, poți ignora acest email.",
"emails.invitation.thanks": "Mulțumim,",
"emails.invitation.buttonText": "Acceptă invitația la {{team}}",
"emails.invitation.signature": "Echipa {{project}}",
"locale.country.unknown": "Necunoscut",
"countries.af": "Afghanistan",

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