mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33fae9cce8 | ||
|
|
917677a002 | ||
|
|
25d7b37ee0 |
@@ -1,31 +0,0 @@
|
||||
# PR Workflow for Appwrite
|
||||
|
||||
## Branch Targeting
|
||||
|
||||
**Important:** Appwrite does NOT use `main` as the primary development branch.
|
||||
|
||||
PRs should target the **current version branch** (e.g., `1.8.x`, `1.9.x`), not `main`.
|
||||
|
||||
### How to determine the correct target branch
|
||||
|
||||
1. Check which version branch you're currently on: `git branch --show-current`
|
||||
2. Look for branches matching the pattern `X.Y.x` (e.g., `1.8.x`, `1.9.x`)
|
||||
3. The current active development branch is typically the highest version number with the `.x` suffix
|
||||
|
||||
### When creating PRs
|
||||
|
||||
Always use the version branch as the base:
|
||||
|
||||
```bash
|
||||
# Correct - targets the version branch
|
||||
gh pr create --base 1.8.x --title "Your PR title" --body "..."
|
||||
|
||||
# Wrong - do not target main
|
||||
gh pr create --base main ...
|
||||
```
|
||||
|
||||
### Branch naming convention
|
||||
|
||||
- `X.Y.x` branches (e.g., `1.8.x`) - Active development branches for each minor version
|
||||
- `main` - Not used for regular PRs; reserved for release management
|
||||
- Feature branches should be created from and merged back into the current version branch
|
||||
@@ -2,7 +2,6 @@ _APP_ENV=development
|
||||
_APP_EDITION=self-hosted
|
||||
_APP_LOCALE=en
|
||||
_APP_WORKER_PER_CORE=6
|
||||
_APP_COMPRESSION_ENABLED=enabled
|
||||
_APP_COMPRESSION_MIN_SIZE_BYTES=1024
|
||||
_APP_CONSOLE_WHITELIST_ROOT=disabled
|
||||
_APP_CONSOLE_WHITELIST_EMAILS=
|
||||
@@ -10,7 +9,6 @@ _APP_CONSOLE_SESSION_ALERTS=enabled
|
||||
_APP_CONSOLE_WHITELIST_IPS=
|
||||
_APP_CONSOLE_COUNTRIES_DENYLIST=AQ
|
||||
_APP_CONSOLE_HOSTNAMES=localhost,appwrite.io,*.appwrite.io
|
||||
_APP_MIGRATION_HOST=appwrite
|
||||
_APP_SYSTEM_EMAIL_NAME=Appwrite
|
||||
_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io
|
||||
_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io
|
||||
@@ -23,16 +21,13 @@ _APP_OPTIONS_ROUTER_PROTECTION=disabled
|
||||
_APP_OPTIONS_FORCE_HTTPS=disabled
|
||||
_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled
|
||||
_APP_OPENSSL_KEY_V1=your-secret-key
|
||||
_APP_DNS=172.16.238.100 # CoreDNS
|
||||
_APP_DOMAIN=appwrite.test
|
||||
_APP_DOMAIN=traefik
|
||||
_APP_CONSOLE_DOMAIN=localhost
|
||||
_APP_CONSOLE_TRUSTED_PROJECTS=trusted-project,another-trusted-project
|
||||
_APP_DOMAIN_FUNCTIONS=functions.localhost
|
||||
_APP_DOMAIN_SITES=sites.localhost,rebranded.localhost
|
||||
_APP_DOMAIN_TARGET_CNAME=cname.localhost
|
||||
_APP_DOMAIN_TARGET_A=203.0.0.1
|
||||
_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_RULES_FORMAT=md5
|
||||
_APP_REDIS_HOST=redis
|
||||
_APP_REDIS_PORT=6379
|
||||
@@ -72,8 +67,8 @@ _APP_STORAGE_ANTIVIRUS_PORT=3310
|
||||
_APP_SMTP_HOST=maildev
|
||||
_APP_SMTP_PORT=1025
|
||||
_APP_SMTP_SECURE=
|
||||
_APP_SMTP_USERNAME=user
|
||||
_APP_SMTP_PASSWORD=password
|
||||
_APP_SMTP_USERNAME=
|
||||
_APP_SMTP_PASSWORD=
|
||||
_APP_SMS_PROVIDER=sms://username:password@mock
|
||||
_APP_SMS_FROM=+123456789
|
||||
_APP_SMS_PROJECTS_DENY_LIST=
|
||||
@@ -90,9 +85,8 @@ _APP_COMPUTE_MAINTENANCE_INTERVAL=600
|
||||
_APP_COMPUTE_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_FUNCTIONS_RUNTIMES=php-8.0,node-18.0,python-3.9,ruby-3.1
|
||||
_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.32
|
||||
_APP_MAINTENANCE_INTERVAL=86400
|
||||
_APP_MAINTENANCE_START_TIME=12:00
|
||||
_APP_MAINTENANCE_RETENTION_CACHE=2592000
|
||||
@@ -104,12 +98,8 @@ _APP_USAGE_AGGREGATION_INTERVAL=30
|
||||
_APP_STATS_RESOURCES_INTERVAL=30
|
||||
_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000
|
||||
_APP_MAINTENANCE_RETENTION_SCHEDULES=86400
|
||||
_APP_INTERVAL_DOMAIN_VERIFICATION=120
|
||||
_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300
|
||||
_APP_USAGE_STATS=enabled
|
||||
_APP_LOGGING_CONFIG=
|
||||
_APP_LOGGING_CONFIG_REALTIME=
|
||||
_APP_GRAPHQL_INTROSPECTION=enabled
|
||||
_APP_GRAPHQL_MAX_BATCH_SIZE=10
|
||||
_APP_GRAPHQL_MAX_COMPLEXITY=250
|
||||
_APP_GRAPHQL_MAX_DEPTH=4
|
||||
@@ -130,6 +120,4 @@ _APP_MESSAGE_PUSH_TEST_DSN=
|
||||
_APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10
|
||||
_APP_PROJECT_REGIONS=default
|
||||
_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000
|
||||
_APP_STATS_USAGE_DUAL_WRITING_DBS=database_db_main
|
||||
_APP_TRUSTED_HEADERS=x-forwarded-for
|
||||
_APP_POOL_ADAPTER=stack
|
||||
_APP_STATS_USAGE_DUAL_WRITING_DBS=database_db_main
|
||||
@@ -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
|
||||
@@ -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)"
|
||||
@@ -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 }}
|
||||
@@ -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 }}
|
||||
@@ -64,9 +64,8 @@ jobs:
|
||||
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'
|
||||
run: 'oha -z 180s http://localhost/v1/health/version -j > benchmark.json'
|
||||
- name: Cleaning
|
||||
run: docker compose down -v
|
||||
- name: Installing latest version
|
||||
@@ -79,7 +78,7 @@ jobs:
|
||||
docker compose up -d
|
||||
sleep 10
|
||||
- name: Benchmark Latest
|
||||
run: oha -z 180s http://localhost/v1/health/version --output-format json > benchmark-latest.json
|
||||
run: oha -z 180s http://localhost/v1/health/version -j > benchmark-latest.json
|
||||
- name: Prepare comment
|
||||
run: |
|
||||
echo '## :sparkles: Benchmark results' > benchmark.txt
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,115 +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
|
||||
|
||||
# Add stricter error-detection patterns so issue text doesn't trigger agent error detection.
|
||||
# After merging this file run `gh aw compile` to regenerate the lock file.
|
||||
env:
|
||||
GH_AW_ERROR_PATTERNS: >-
|
||||
[
|
||||
{"id":"gh-action-error","pattern":"^::(error)(?:\\\\s+[^:]*)?::(.+)","level_group":1,"message_group":2,"description":"GitHub Actions workflow command - error"},
|
||||
{"id":"gh-action-warning","pattern":"^::(warning)(?:\\\\s+[^:]*)?::(.+)","level_group":1,"message_group":2,"description":"GitHub Actions workflow command - warning"},
|
||||
{"id":"bracketed-level","pattern":"^\\[(ERROR|CRITICAL|WARNING|WARN)\\]\\s+(.+)","level_group":1,"message_group":2,"description":"Bracketed log level at start of line"},
|
||||
{"id":"timestamped-copilot","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z\\s+\\[(ERROR|WARN|WARNING|CRITICAL)\\]\\s+(.+)","level_group":1,"message_group":3,"description":"Timestamped Copilot CLI messages"}
|
||||
]
|
||||
|
||||
network: defaults
|
||||
|
||||
safe-outputs:
|
||||
add-labels:
|
||||
max: 100
|
||||
target: "*"
|
||||
add-comment:
|
||||
max: 10
|
||||
target: "*"
|
||||
|
||||
tools:
|
||||
web-fetch:
|
||||
web-search:
|
||||
github:
|
||||
toolsets:
|
||||
- default
|
||||
- labels
|
||||
|
||||
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 that were either created in the last 24 hours or updated (with a new comment) 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 or updated in the last 24 hours. The `since` parameter filters by the issue's `updated_at` timestamp, which includes both newly created issues and recently commented issues. Calculate the timestamp from 24 hours ago (example: 2025-11-06T20:27:14Z for reference) and use it for the `since` parameter.
|
||||
|
||||
2. For each issue found, perform the following triage tasks:
|
||||
|
||||
3. Use the `get_comments` tool to retrieve all the comments on the issue.
|
||||
|
||||
4. Check for spam and quality issue descriptions and comments first:
|
||||
|
||||
- **Non-English Content**: If the issue is primarily written in a non-English language, add a respectful and appreciative comment explaining that while you appreciate their contribution, the majority of the community communicates in English and kindly ask them to repost in English so everyone can follow along and help. Provide a friendly translation of your message in their language if possible.
|
||||
- **Multiple Topics**: If the issue discusses multiple unrelated topics or problems, add a comment explaining that each issue should focus on one clear topic so the team can effectively solve the right problem. Politely ask them to split it into separate issues.
|
||||
- **Obvious Spam or Bot-Generated Content**: If the issue/comment is obviously spam, generated by a bot, or something that is not an actual issue to be worked on, add an issue comment with a one-sentence analysis and move to the next issue.
|
||||
|
||||
5. Retrieve the issue content using the `get_issue` tool for any issues that pass the spam checks.
|
||||
|
||||
6. Next, use the GitHub tools to gather additional context about the issue:
|
||||
|
||||
- Fetch the list of labels available in this repository using the `list_label` tool with `owner: "appwrite"` and `repo: "appwrite"` parameters. This will give you the labels you can use for triaging issues.
|
||||
- Fetch any comments on the issue using the `get_issue_comments` tool to understand recent activity
|
||||
- **Search for duplicate and related issues (repo first, then org-wide)**:
|
||||
- First search in this repository using the `search_issues` tool with a query like: `repo:appwrite/appwrite is:issue (is:open OR is:closed) <key terms>`.
|
||||
- Then perform an org-wide search across the entire Appwrite organization using: `org:appwrite is:issue (is:open OR is:closed) <key terms>`.
|
||||
- Prefer linking to OPEN issues when identifying potential duplicates; include CLOSED ones as related history when useful.
|
||||
|
||||
7. 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
|
||||
|
||||
8. Write notes, ideas, nudges, resource links, debugging strategies and/or reproduction steps for the team to consider relevant to the issue.
|
||||
|
||||
9. Select appropriate labels from the available labels list:
|
||||
|
||||
- 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. If you find a duplicate of another OPEN issue in THIS repository, you may use a "duplicate" label (if available) and reference the canonical issue.
|
||||
- If the closest match is in another repository within the Appwrite org, do NOT mark as duplicate here; instead, link it in your comment under a "Cross‑repo related issues" section.
|
||||
- Only select labels from the provided list
|
||||
- Don't apply the `good first issue` or `help wanted` labels
|
||||
- It's okay to not add any labels if none are clearly applicable
|
||||
|
||||
10. 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
|
||||
|
||||
11. 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 sections listing them with links:
|
||||
- "### 🔗 Potentially Related Issues (this repo)" – bullet list of same-repo issues with titles and links
|
||||
- If applicable: "### 🌐 Cross-repo related issues (org: appwrite)" – bullet list including `owner/repo#number` with 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 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. For bolded section titles, wrap the text with `<strong>` and `</strong>` to make it bold.
|
||||
- Do not indicate/encourage a community member to submit a PR for the issue.
|
||||
|
||||
12. After processing all issues, provide a summary of how many issues were triaged (created or updated in the last 24 hours). If no issues matched the criteria, simply note that no issues needed triage.
|
||||
@@ -42,7 +42,6 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
target: production
|
||||
build-args: |
|
||||
VERSION=${{ steps.meta.outputs.version }}
|
||||
VITE_APPWRITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1
|
||||
|
||||
@@ -20,10 +20,10 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
@@ -46,7 +46,6 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
target: production
|
||||
build-args: |
|
||||
VERSION=${{ steps.meta.outputs.version }}
|
||||
push: true
|
||||
|
||||
@@ -13,9 +13,4 @@ jobs:
|
||||
- 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"
|
||||
"composer install --profile --ignore-platform-reqs && composer check"
|
||||
@@ -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": ""
|
||||
}
|
||||
+17
-176
@@ -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:
|
||||
@@ -108,10 +100,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
|
||||
@@ -143,18 +132,7 @@ jobs:
|
||||
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 +145,7 @@ jobs:
|
||||
Account,
|
||||
Avatars,
|
||||
Console,
|
||||
Databases/Legacy,
|
||||
Databases/TablesDB,
|
||||
Databases,
|
||||
Functions,
|
||||
FunctionsSchedule,
|
||||
GraphQL,
|
||||
@@ -201,7 +178,6 @@ 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
|
||||
|
||||
@@ -222,16 +198,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 abuseEnabled,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 --exclude-group devKeys
|
||||
|
||||
e2e_shared_mode_test:
|
||||
name: E2E Shared Mode Service Test
|
||||
@@ -246,8 +213,7 @@ jobs:
|
||||
Account,
|
||||
Avatars,
|
||||
Console,
|
||||
Databases/Legacy,
|
||||
Databases/TablesDB,
|
||||
Databases,
|
||||
Functions,
|
||||
FunctionsSchedule,
|
||||
GraphQL,
|
||||
@@ -311,21 +277,14 @@ 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 abuseEnabled,screenshots
|
||||
appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-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_abuse_enabled:
|
||||
name: E2E Service Test (Abuse enabled)
|
||||
e2e_dev_keys:
|
||||
name: E2E Service Test (Dev Keys)
|
||||
runs-on: ubuntu-latest
|
||||
needs: setup
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -344,7 +303,7 @@ jobs:
|
||||
docker compose up -d
|
||||
sleep 30
|
||||
|
||||
- name: Run Projects tests in dedicated table mode
|
||||
- name: Run Projects tests with dev keys in dedicated table mode
|
||||
run: |
|
||||
echo "Using project tables"
|
||||
export _APP_DATABASE_SHARED_TABLES=
|
||||
@@ -353,19 +312,10 @@ 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/Projects --debug --group=abuseEnabled
|
||||
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_abuse_enabled_shared_mode:
|
||||
name: E2E Shared Mode Service Test (Abuse enabled)
|
||||
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'
|
||||
@@ -394,7 +344,7 @@ jobs:
|
||||
docker compose up -d
|
||||
sleep 30
|
||||
|
||||
- name: Run Projects tests in ${{ matrix.tables-mode }} table mode
|
||||
- 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"
|
||||
@@ -409,113 +359,4 @@ 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/Projects --debug --group=abuseEnabled
|
||||
|
||||
- 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:
|
||||
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
|
||||
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
|
||||
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
|
||||
appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=devKeys
|
||||
|
||||
+1
-1
@@ -16,5 +16,5 @@ app/sdks
|
||||
dev/yasd_init.php
|
||||
.phpunit.result.cache
|
||||
Makefile
|
||||
appwrite.config.json
|
||||
appwrite.json
|
||||
/.zed/
|
||||
@@ -1,77 +0,0 @@
|
||||
# AGENTS.md
|
||||
|
||||
Appwrite is an end-to-end backend server for web, mobile, native, and backend apps. This guide provides context and instructions for AI coding agents working on the Appwrite codebase.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Appwrite is a self-hosted Backend-as-a-Service (BaaS) platform that provides developers with a set of APIs and tools to build secure, scalable applications. The project uses a hybrid monolithic-microservice architecture built with PHP, running on Swoole for high performance.
|
||||
|
||||
**Key Technologies:**
|
||||
- **Backend:** PHP 8.3+, Swoole
|
||||
- **Libraries:** Utopia PHP
|
||||
- **Database:** MariaDB, Redis
|
||||
- **Cache:** Redis
|
||||
- **Queue:** Redis
|
||||
- **Containers:** Docker
|
||||
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
# Run Appwrite
|
||||
docker compose up -d --force-recreate --build
|
||||
|
||||
# Run specific test
|
||||
docker compose exec appwrite test /usr/src/code/tests/e2e/Services/[ServiceName] --filter=[FunctionName]
|
||||
|
||||
# Format code
|
||||
composer format
|
||||
```
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
- Follow [PSR-12](https://www.php-fig.org/psr/psr-12/) coding standard
|
||||
- Use PSR-4 autoloading
|
||||
- Strict type declarations where applicable
|
||||
- Comprehensive PHPDoc comments
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
#### `resourceType` Naming Rule
|
||||
|
||||
When a collection has a combination of `resourceType`, `resourceId`, and/or `resourceInternalId`, the value of `resourceType` MUST always be **plural** - for example: `functions`, `sites`, `deployments`.
|
||||
|
||||
Examples:
|
||||
```php
|
||||
'resourceType' => 'functions'
|
||||
'resourceType' => 'sites'
|
||||
'resourceType' => 'deployments'
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Critical Security Practices
|
||||
|
||||
- **Never hardcode credentials** - Use environment variables
|
||||
- **Rate limiting** - Respect abuse prevention mechanisms
|
||||
|
||||
## Dependencies
|
||||
|
||||
Avoid introducing new dependencies other than utopia-php.
|
||||
|
||||
## Adding new endpoints
|
||||
|
||||
When adding new endpoints, make sure to use modules and follow its patterns. Find instruction in [Modules AGENTS.md](src/Appwrite/Platform/AGENTS.md) file.
|
||||
|
||||
## Pull Request Guidelines
|
||||
### Before Submitting
|
||||
|
||||
- Run `composer format`
|
||||
- Update documentation if adding features
|
||||
- Add/update tests for your changes
|
||||
- Check that Docker build succeeds
|
||||
`docs/specs/authentication.drawio.svg`
|
||||
|
||||
## Known Issues and Gotchas
|
||||
|
||||
- **Hot Reload:** Code changes require container restart in some cases
|
||||
- **Logging:** There is no central place for logs, so when debugging, ensure to check all possibly relevant containers
|
||||
+251
-737
File diff suppressed because it is too large
Load Diff
+1
-25
@@ -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: Don’t 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
|
||||
|
||||
We’re 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 don’t 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
|
||||
|
||||
|
||||
+20
-35
@@ -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.11.5 AS base
|
||||
FROM appwrite/base:0.10.1 AS final
|
||||
|
||||
LABEL maintainer="team@appwrite.io"
|
||||
|
||||
@@ -24,9 +24,11 @@ ENV _APP_VERSION=$VERSION \
|
||||
_APP_HOME=https://appwrite.io
|
||||
|
||||
RUN \
|
||||
if [ "$DEBUG" == "true" ]; then \
|
||||
if [ "$DEBUG" == "true" ]; then \
|
||||
apk add boost boost-dev; \
|
||||
fi
|
||||
fi
|
||||
|
||||
RUN apk add libwebp
|
||||
|
||||
WORKDIR /usr/src/code
|
||||
|
||||
@@ -36,7 +38,9 @@ COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor
|
||||
COPY ./app /usr/src/code/app
|
||||
COPY ./public /usr/src/code/public
|
||||
COPY ./bin /usr/local/bin
|
||||
COPY ./docs /usr/src/code/docs
|
||||
COPY ./src /usr/src/code/src
|
||||
COPY ./dev /usr/src/code/dev
|
||||
|
||||
# Set Volumes
|
||||
RUN mkdir -p /storage/uploads && \
|
||||
@@ -46,18 +50,17 @@ RUN mkdir -p /storage/uploads && \
|
||||
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/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
|
||||
|
||||
# Executables
|
||||
RUN chmod +x /usr/local/bin/doctor && \
|
||||
chmod +x /usr/local/bin/install && \
|
||||
chmod +x /usr/local/bin/interval && \
|
||||
chmod +x /usr/local/bin/maintenance && \
|
||||
chmod +x /usr/local/bin/migrate && \
|
||||
chmod +x /usr/local/bin/realtime && \
|
||||
@@ -77,11 +80,9 @@ RUN chmod +x /usr/local/bin/doctor && \
|
||||
chmod +x /usr/local/bin/queue-count-success && \
|
||||
chmod +x /usr/local/bin/worker-audits && \
|
||||
chmod +x /usr/local/bin/worker-builds && \
|
||||
chmod +x /usr/local/bin/worker-screenshots && \
|
||||
chmod +x /usr/local/bin/worker-certificates && \
|
||||
chmod +x /usr/local/bin/worker-databases && \
|
||||
chmod +x /usr/local/bin/worker-deletes && \
|
||||
chmod +x /usr/local/bin/worker-executions && \
|
||||
chmod +x /usr/local/bin/worker-functions && \
|
||||
chmod +x /usr/local/bin/worker-mails && \
|
||||
chmod +x /usr/local/bin/worker-messaging && \
|
||||
@@ -91,30 +92,14 @@ RUN chmod +x /usr/local/bin/doctor && \
|
||||
chmod +x /usr/local/bin/stats-resources && \
|
||||
chmod +x /usr/local/bin/worker-stats-resources
|
||||
|
||||
# Letsencrypt Permissions
|
||||
RUN mkdir -p /etc/letsencrypt/live/ && chmod -Rf 755 /etc/letsencrypt/live/
|
||||
|
||||
FROM base AS production
|
||||
|
||||
RUN rm -rf /usr/src/code/app/config/specs && \
|
||||
rm -f /usr/local/lib/php/extensions/no-debug-non-zts-20240924/xdebug.so && \
|
||||
find /usr -name '*.a' -delete 2>/dev/null || true && \
|
||||
find /usr -type d -name '__pycache__' -exec rm -rf {} + 2>/dev/null || true && \
|
||||
find /usr -name '*.pyc' -delete 2>/dev/null || true
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
CMD [ "php", "app/http.php" ]
|
||||
|
||||
FROM base AS development
|
||||
|
||||
COPY ./docs /usr/src/code/docs
|
||||
COPY ./dev /usr/src/code/dev
|
||||
|
||||
RUN if [ "$DEBUG" = "true" ]; then \
|
||||
cp /usr/src/code/dev/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini && \
|
||||
mkdir -p /tmp/xdebug && \
|
||||
apk add --update --no-cache openssh-client github-cli; \
|
||||
fi
|
||||
# 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" = "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
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
|
||||
+30
-29
@@ -2,7 +2,7 @@
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner, with logo and text saying "The Developer's Cloud""></a>
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner with logo and slogan build like a team of hundreds""></a>
|
||||
<br />
|
||||
<br />
|
||||
<b>适用于[Flutter/Vue/Angular/React/iOS/Android/* 等等平台 *]的完整后端服务</b>
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
[**Appwrite 云公开测试版!立即注册!**](https://cloud.appwrite.io)
|
||||
|
||||
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,原生应用,以及后端。它既包含后端服务器,也提供了用于部署静态和服务器端渲染前端的完全集成托管解决方案。Appwrite 通过视觉化界面简化了从零开始构建现代应用的复杂性和重复性,让您能够更快地构建安全的全栈应用。
|
||||
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面简化了从零开始编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。
|
||||
|
||||
Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存,图像处理,云函数计算,[等多种服务](https://appwrite.io/docs).
|
||||
|
||||
@@ -36,6 +36,7 @@ Appwrite 可以提供给开发者用户验证,外部授权,用户数据读
|
||||
|
||||
内容:
|
||||
|
||||
|
||||
- [开始](#开始)
|
||||
- [安装](#安装)
|
||||
- [Unix](#unix)
|
||||
@@ -56,8 +57,7 @@ Appwrite 可以提供给开发者用户验证,外部授权,用户数据读
|
||||
- [版权说明](#版权说明)
|
||||
|
||||
## 开始
|
||||
|
||||
要轻松开始使用 Appwrite,您可以[**免费注册 Appwrite Cloud**](https://cloud.appwrite.io/)。在 Appwrite Cloud 公开测试版期间,您可以完全免费使用 Appwrite,而且我们不会收集您的信用卡信息。
|
||||
要轻松开始使用Appwrite,您可以[**免费注册Appwrite Cloud**](https://cloud.appwrite.io/)。在Appwrite Cloud公开测试版期间,您可以完全免费使用Appwrite,而且我们不会收集您的信用卡信息。
|
||||
|
||||
## 安装
|
||||
|
||||
@@ -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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
### 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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
#### 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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。
|
||||
@@ -119,16 +119,22 @@ docker run -it --rm `
|
||||
<br /><sub><b>DigitalOcean</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
<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>
|
||||
</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>
|
||||
@@ -173,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)。
|
||||
|
||||
### 开发套件
|
||||
@@ -182,28 +186,25 @@ docker run -it --rm `
|
||||
以下是当前支持的平台和语言列表。如果您想帮助我们为您选择的平台添加支持,您可以访问我们的 [SDK 生成器](https://github.com/appwrite/sdk-generator) 项目并查看我们的 [贡献指南](https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md)。
|
||||
|
||||
#### 客户端
|
||||
|
||||
- :white_check_mark: [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护)
|
||||
|
||||
#### 服务器
|
||||
|
||||
- :white_check_mark: [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Dart](https://github.com/appwrite/sdk-for-dart) - (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Deno](https://github.com/appwrite/sdk-for-deno) - **公测** (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Kotlin](https://github.com/appwrite/sdk-for-kotlin) - **公测** (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
- :white_check_mark: [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Dart](https://github.com/appwrite/sdk-for-dart) - (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Deno](https://github.com/appwrite/sdk-for-deno) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Kotlin](https://github.com/appwrite/sdk-for-kotlin) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护)
|
||||
|
||||
#### 开发者社区
|
||||
|
||||
- :white_check_mark: [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
|
||||
- :white_check_mark: [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
* :white_check_mark: [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
|
||||
* :white_check_mark: [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
|
||||
找不到需要的的 SDK? - 欢迎通过发起 PR 来帮助我们完善 Appwrite 的软件生态环境 [SDK 生成器](https://github.com/appwrite/sdk-generator)!
|
||||
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
> 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)
|
||||
> [Join the Init kick off event 19th of May: The future of Appwrite with Founder & CEO Eldad Fux](https://www.youtube.com/watch?v=1g8tuogsp7A)
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner, with logo and text saying "The Developer's Cloud"></a>
|
||||
<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 a best-in-class, developer-first platform that gives builders everything they need to create scalable, stable, and production-ready software, fast.</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,17 +25,24 @@
|
||||
|
||||
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).
|
||||
|
||||
<p align="center">
|
||||
<br />
|
||||
<a href="https://www.producthunt.com/posts/appwrite-2?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-appwrite-2" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=360315&theme=light&period=daily" alt="Appwrite - 100% open source alternative for Firebase | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||
<br />
|
||||
<br />
|
||||
</p>
|
||||
|
||||

|
||||
|
||||
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)
|
||||
@@ -58,9 +62,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
|
||||
|
||||
@@ -75,7 +78,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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
### Windows
|
||||
@@ -87,7 +90,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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
#### PowerShell
|
||||
@@ -97,7 +100,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.1
|
||||
appwrite/appwrite:1.7.4
|
||||
```
|
||||
|
||||
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.
|
||||
@@ -122,16 +125,22 @@ Choose from one of the providers below:
|
||||
<br /><sub><b>DigitalOcean</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
<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>
|
||||
</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>
|
||||
@@ -177,8 +186,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).
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+14
-60
@@ -9,7 +9,6 @@ use Appwrite\Event\StatsResources;
|
||||
use Appwrite\Event\StatsUsage;
|
||||
use Appwrite\Platform\Appwrite;
|
||||
use Appwrite\Runtimes\Runtimes;
|
||||
use Appwrite\Utopia\Database\Documents\User;
|
||||
use Executor\Executor;
|
||||
use Swoole\Runtime;
|
||||
use Swoole\Timer;
|
||||
@@ -30,9 +29,6 @@ use Utopia\Pools\Group;
|
||||
use Utopia\Queue\Broker\Pool as BrokerPool;
|
||||
use Utopia\Queue\Publisher;
|
||||
use Utopia\Registry\Registry;
|
||||
use Utopia\Span\Exporter;
|
||||
use Utopia\Span\Span;
|
||||
use Utopia\Span\Storage;
|
||||
use Utopia\System\System;
|
||||
use Utopia\Telemetry\Adapter\None as NoTelemetry;
|
||||
|
||||
@@ -44,7 +40,8 @@ Config::setParam('runtimes', (new Runtimes('v5'))->getAll(supported: false));
|
||||
// require controllers after overwriting runtimes
|
||||
require_once __DIR__ . '/controllers/general.php';
|
||||
|
||||
global $register;
|
||||
Authorization::disable();
|
||||
|
||||
CLI::setResource('register', fn () => $register);
|
||||
|
||||
CLI::setResource('cache', function ($pools) {
|
||||
@@ -62,13 +59,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;
|
||||
@@ -82,12 +73,9 @@ CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) {
|
||||
$dbForPlatform = new Database($adapter, $cache);
|
||||
|
||||
$dbForPlatform
|
||||
->setDatabase(APP_DATABASE)
|
||||
->setAuthorization($authorization)
|
||||
->setNamespace('_console')
|
||||
->setMetadata('host', \gethostname())
|
||||
->setMetadata('project', 'console');
|
||||
$dbForPlatform->setDocumentType('users', User::class);
|
||||
|
||||
// Ensure tables exist
|
||||
$collections = Config::getParam('collections', [])['console'];
|
||||
@@ -109,21 +97,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;
|
||||
}
|
||||
@@ -156,7 +139,6 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform
|
||||
|
||||
$adapter = new DatabasePool($pools->get($dsn->getHost()));
|
||||
$database = new Database($adapter, $cache);
|
||||
|
||||
$databases[$dsn->getHost()] = $database;
|
||||
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
|
||||
|
||||
@@ -173,19 +155,17 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform
|
||||
}
|
||||
|
||||
$database
|
||||
->setDatabase(APP_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());
|
||||
return $database;
|
||||
@@ -195,8 +175,6 @@ CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorizatio
|
||||
$database = new Database($adapter, $cache);
|
||||
|
||||
$database
|
||||
->setDatabase(APP_DATABASE)
|
||||
->setAuthorization($authorization)
|
||||
->setSharedTables(true)
|
||||
->setNamespace('logsV1')
|
||||
->setTimeout(APP_DATABASE_TIMEOUT_MILLISECONDS_TASK)
|
||||
@@ -209,31 +187,17 @@ CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorizatio
|
||||
|
||||
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']);
|
||||
}, ['pools', 'cache']);
|
||||
|
||||
CLI::setResource('queueForStatsUsage', function (Publisher $publisher) {
|
||||
return new StatsUsage($publisher);
|
||||
}, ['publisher']);
|
||||
CLI::setResource('queueForStatsResources', function (Publisher $publisher) {
|
||||
return new StatsResources($publisher);
|
||||
}, ['publisher']);
|
||||
CLI::setResource('publisher', function (Group $pools) {
|
||||
return new BrokerPool(publisher: $pools->get('publisher'));
|
||||
}, ['pools']);
|
||||
CLI::setResource('queueForFunctions', function (Publisher $publisher) {
|
||||
return new Func($publisher);
|
||||
}, ['publisher']);
|
||||
@@ -272,14 +236,6 @@ CLI::setResource('logError', function (Registry $register) {
|
||||
$log->addExtra('trace', $error->getTraceAsString());
|
||||
$log->addExtra('detailedTrace', $error->getTrace());
|
||||
|
||||
if ($error->getPrevious() !== null) {
|
||||
if ($error->getPrevious()->getMessage() != $error->getMessage()) {
|
||||
$log->addExtra('previousMessage', $error->getPrevious()->getMessage());
|
||||
}
|
||||
$log->addExtra('previousFile', $error->getPrevious()->getFile());
|
||||
$log->addExtra('previousLine', $error->getPrevious()->getLine());
|
||||
}
|
||||
|
||||
$log->setAction($action);
|
||||
|
||||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
@@ -329,6 +285,4 @@ $cli
|
||||
$cli->shutdown()->action(fn () => Timer::clearAll());
|
||||
|
||||
Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
|
||||
Span::setStorage(new Storage\Coroutine());
|
||||
Span::addExporter(new Exporter\Stdout());
|
||||
run($cli->run(...));
|
||||
|
||||
@@ -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 |
@@ -26,8 +26,8 @@ unset($common['files']);
|
||||
$collections = [
|
||||
'buckets' => $buckets,
|
||||
'databases' => $databases,
|
||||
'projects' => array_merge_recursive($projects, $common),
|
||||
'console' => array_merge_recursive($platform, $common),
|
||||
'projects' => array_merge($projects, $common),
|
||||
'console' => array_merge($platform, $common),
|
||||
'logs' => $logs,
|
||||
];
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Utopia\Auth\Hashes\Argon2;
|
||||
use Appwrite\Auth\Auth;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
|
||||
@@ -173,7 +173,7 @@ return [
|
||||
'size' => 256,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => (new Argon2())->getName(),
|
||||
'default' => Auth::DEFAULT_ALGO,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
@@ -184,7 +184,7 @@ return [
|
||||
'size' => 65535,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => (new Argon2())->getOptions(),
|
||||
'default' => Auth::DEFAULT_ALGO_OPTIONS,
|
||||
'array' => false,
|
||||
'filters' => ['json'],
|
||||
],
|
||||
@@ -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' => [
|
||||
[
|
||||
@@ -1288,17 +1233,6 @@ return [
|
||||
'array' => false,
|
||||
'filters' => ['json'],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('labels'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => true,
|
||||
'filters' => [],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
@@ -1593,17 +1527,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,
|
||||
|
||||
@@ -6,7 +6,7 @@ use Utopia\Database\Helpers\ID;
|
||||
|
||||
$providers = Config::getParam('oAuthProviders', []);
|
||||
|
||||
$platformCollections = [
|
||||
return [
|
||||
'projects' => [
|
||||
'$collection' => ID::custom(Database::METADATA),
|
||||
'$id' => ID::custom('projects'),
|
||||
@@ -330,18 +330,7 @@ $platformCollections = [
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => ['datetime'],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('labels'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => [],
|
||||
'array' => true,
|
||||
'filters' => [],
|
||||
],
|
||||
]
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
@@ -418,7 +407,7 @@ $platformCollections = [
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
@@ -633,35 +622,24 @@ $platformCollections = [
|
||||
'name' => 'keys',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('resourceType'),
|
||||
'$id' => ID::custom('projectInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('resourceId'),
|
||||
'$id' => ID::custom('projectId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('resourceInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'default' => 0,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
@@ -734,14 +712,14 @@ $platformCollections = [
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => ID::custom('_key_resource'),
|
||||
'$id' => ID::custom('_key_project'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['resourceType', 'resourceInternalId'],
|
||||
'lengths' => [],
|
||||
'orders' => [],
|
||||
'attributes' => ['projectInternalId'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('_key_accessedAt'),
|
||||
'$id' => '_key_accessedAt',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['accessedAt'],
|
||||
'lengths' => [],
|
||||
@@ -1339,17 +1317,6 @@ $platformCollections = [
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('logs'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 1000000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
@@ -1384,21 +1351,21 @@ $platformCollections = [
|
||||
'$id' => '_key_type',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['type'],
|
||||
'lengths' => [],
|
||||
'lengths' => [32],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_trigger',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['trigger'],
|
||||
'lengths' => [],
|
||||
'lengths' => [32],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_deploymentResourceType',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['deploymentResourceType'],
|
||||
'lengths' => [],
|
||||
'lengths' => [32],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
@@ -1440,20 +1407,20 @@ $platformCollections = [
|
||||
'$id' => ID::custom('_key_owner'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['owner'],
|
||||
'lengths' => [],
|
||||
'lengths' => [16],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('_key_piid_diid_drt'),
|
||||
'$id' => ID::custom('_key_region'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['projectInternalId', 'deploymentInternalId', 'deploymentResourceType'],
|
||||
'lengths' => [],
|
||||
'orders' => [],
|
||||
'attributes' => ['region'],
|
||||
'lengths' => [16],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_region_status_createdAt',
|
||||
'$id' => ID::custom('_key_piid_riid_rt'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['region', 'status', '$createdAt'],
|
||||
'attributes' => ['projectInternalId', 'deploymentInternalId', 'deploymentResourceType'],
|
||||
'lengths' => [],
|
||||
'orders' => [],
|
||||
],
|
||||
@@ -1925,31 +1892,3 @@ $platformCollections = [
|
||||
'indexes' => []
|
||||
],
|
||||
];
|
||||
|
||||
// Organization API keys subquery
|
||||
$platformCollections['teams']['attributes'][] = [
|
||||
'$id' => ID::custom('keys'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 16384,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => ['subQueryOrganizationKeys'],
|
||||
];
|
||||
|
||||
// Account API keys subquery
|
||||
$platformCollections['users']['attributes'][] = [
|
||||
'$id' => ID::custom('keys'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 16384,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => ['subQueryAccountKeys'],
|
||||
];
|
||||
|
||||
return $platformCollections;
|
||||
|
||||
@@ -51,16 +51,6 @@ return [
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('type'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => 128,
|
||||
'required' => false,
|
||||
'default' => 'tablesdb',
|
||||
'signed' => true,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
@@ -567,17 +557,6 @@ return [
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('deploymentRetention'),
|
||||
'type' => Database::VAR_INTEGER,
|
||||
'format' => '',
|
||||
'size' => 0,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => 0,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('deploymentInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
@@ -776,17 +755,6 @@ return [
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('startCommand'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 20000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('specification'),
|
||||
@@ -798,28 +766,6 @@ return [
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('buildSpecification'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => false,
|
||||
'required' => false,
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('runtimeSpecification'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => false,
|
||||
'required' => false,
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('scopes'),
|
||||
'type' => Database::VAR_STRING,
|
||||
@@ -1079,17 +1025,6 @@ return [
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('startCommand'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 20000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('fallbackFile'),
|
||||
'type' => Database::VAR_STRING,
|
||||
@@ -1101,17 +1036,6 @@ return [
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('deploymentRetention'),
|
||||
'type' => Database::VAR_INTEGER,
|
||||
'format' => '',
|
||||
'size' => 0,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => 0,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('deploymentInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
@@ -1266,28 +1190,6 @@ return [
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('buildSpecification'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => false,
|
||||
'required' => false,
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('runtimeSpecification'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 128,
|
||||
'signed' => false,
|
||||
'required' => false,
|
||||
'default' => APP_COMPUTE_SPECIFICATION_DEFAULT,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('buildRuntime'),
|
||||
'type' => Database::VAR_STRING,
|
||||
@@ -1445,17 +1347,6 @@ return [
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('startCommand'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 20000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'array' => false,
|
||||
'$id' => ID::custom('buildOutput'),
|
||||
@@ -2026,7 +1917,7 @@ return [
|
||||
'$id' => ID::custom('errors'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => APP_FUNCTION_ERROR_LENGTH_LIMIT,
|
||||
'size' => 1000000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
@@ -2037,7 +1928,7 @@ return [
|
||||
'$id' => ID::custom('logs'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => APP_FUNCTION_LOG_LENGTH_LIMIT,
|
||||
'size' => 1000000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
@@ -2197,13 +2088,6 @@ return [
|
||||
'lengths' => [],
|
||||
'orders' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('_key_resourceType'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['resourceType'],
|
||||
'lengths' => [],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
@@ -2451,7 +2335,7 @@ return [
|
||||
'$id' => ID::custom('errors'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 1_000_000,
|
||||
'size' => 65535,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
@@ -2627,128 +2511,4 @@ return [
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'transactions' => [
|
||||
'$collection' => ID::custom(Database::METADATA),
|
||||
'$id' => ID::custom('transactions'),
|
||||
'name' => 'Transactions',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('status'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => 16, // pending | committing | committed | failed
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => 'pending',
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('operations'),
|
||||
'type' => Database::VAR_INTEGER,
|
||||
'size' => 0,
|
||||
'signed' => false,
|
||||
'required' => true,
|
||||
'default' => 0,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('expiresAt'),
|
||||
'type' => Database::VAR_DATETIME,
|
||||
'size' => 0,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => ['datetime'],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => ID::custom('_key_expiresAt'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['expiresAt'],
|
||||
'lengths' => [],
|
||||
'orders' => [Database::ORDER_DESC],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'transactionLogs' => [
|
||||
'$collection' => ID::custom(Database::METADATA),
|
||||
'$id' => ID::custom('transactionLogs'),
|
||||
'name' => 'Transaction Logs',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('transactionInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('databaseInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('collectionInternalId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('documentId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('action'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => 32, // create | update | upsert | increment | decrement | delete | bulkCreate | bulkUpdate | bulkUpsert | bulkDelete
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('data'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'size' => 5_000_000, // Allow large payloads for bulk operations
|
||||
'signed' => false,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => ['json'],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => ID::custom('_key_transaction'),
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['transactionInternalId'],
|
||||
'lengths' => [],
|
||||
'orders' => [],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
* Initializes console project document.
|
||||
*/
|
||||
|
||||
use Appwrite\Network\Platform;
|
||||
use Appwrite\Auth\Auth;
|
||||
use Appwrite\Network\Validator\Origin;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
use Utopia\System\System;
|
||||
|
||||
@@ -22,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
|
||||
],
|
||||
@@ -37,9 +38,8 @@ $console = [
|
||||
'mockNumbers' => [],
|
||||
'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' => TOKEN_EXPIRATION_LOGIN_LONG, // 1 Year in seconds
|
||||
'sessionAlerts' => System::getEnv('_APP_CONSOLE_SESSION_ALERTS', 'disabled') === 'enabled',
|
||||
'invalidateSessions' => true
|
||||
'duration' => Auth::TOKEN_EXPIRATION_LOGIN_LONG, // 1 Year in seconds
|
||||
'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)) : [],
|
||||
@@ -48,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;
|
||||
|
||||
+24
-276
@@ -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 => [
|
||||
@@ -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',
|
||||
@@ -357,11 +337,6 @@ return [
|
||||
'description' => 'API key and session used in the same request. Use either `setSession` or `setKey`. Learn about which authentication method to use in the SSR docs: https://appwrite.io/docs/products/auth/server-side-rendering',
|
||||
'code' => 403,
|
||||
],
|
||||
Exception::USER_JWT_AND_COOKIE_SET => [
|
||||
'name' => Exception::USER_JWT_AND_COOKIE_SET,
|
||||
'description' => 'JWT and cookie used in the same request. Use either `setJWT` or `setCookie`. Learn about which authentication method to use in the SSR docs: https://appwrite.io/docs/products/auth/server-side-rendering',
|
||||
'code' => 403,
|
||||
],
|
||||
Exception::API_KEY_EXPIRED => [
|
||||
'name' => Exception::API_KEY_EXPIRED,
|
||||
'description' => 'The dynamic API key has expired. Please don\'t use dynamic API keys for more than duration of the execution.',
|
||||
@@ -455,11 +430,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 => [
|
||||
@@ -527,11 +497,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 => [
|
||||
@@ -588,11 +553,6 @@ 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,
|
||||
'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".',
|
||||
@@ -693,12 +653,12 @@ return [
|
||||
/** Databases */
|
||||
Exception::DATABASE_NOT_FOUND => [
|
||||
'name' => Exception::DATABASE_NOT_FOUND,
|
||||
'description' => 'Database with the requested ID \'%s\' could not be found.',
|
||||
'description' => 'Database not found',
|
||||
'code' => 404
|
||||
],
|
||||
Exception::DATABASE_ALREADY_EXISTS => [
|
||||
'name' => Exception::DATABASE_ALREADY_EXISTS,
|
||||
'description' => 'Database with the requested ID \'%s\' already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
|
||||
'description' => 'Database already exists',
|
||||
'code' => 409
|
||||
],
|
||||
Exception::DATABASE_TIMEOUT => [
|
||||
@@ -708,48 +668,31 @@ return [
|
||||
],
|
||||
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.',
|
||||
'description' => 'The order attribute had a null value. Cursor pagination requires all documents order attribute values are non-null.',
|
||||
'code' => 400,
|
||||
],
|
||||
|
||||
/** Collections */
|
||||
Exception::COLLECTION_NOT_FOUND => [
|
||||
'name' => Exception::COLLECTION_NOT_FOUND,
|
||||
'description' => 'Collection with the requested ID \'%s\' could not be found.',
|
||||
'description' => 'Collection with the requested ID could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::COLLECTION_ALREADY_EXISTS => [
|
||||
'name' => Exception::COLLECTION_ALREADY_EXISTS,
|
||||
'description' => 'A collection with the requested ID \'%s\' already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
|
||||
'description' => 'A collection with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
|
||||
'code' => 409,
|
||||
],
|
||||
Exception::COLLECTION_LIMIT_EXCEEDED => [
|
||||
'name' => Exception::COLLECTION_LIMIT_EXCEEDED,
|
||||
'description' => 'The maximum number of collections for database \'%s\' has been reached.',
|
||||
'code' => 400,
|
||||
],
|
||||
|
||||
/** Tables */
|
||||
Exception::TABLE_NOT_FOUND => [
|
||||
'name' => Exception::TABLE_NOT_FOUND,
|
||||
'description' => 'Table with the requested ID \'%s\' could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::TABLE_ALREADY_EXISTS => [
|
||||
'name' => Exception::TABLE_ALREADY_EXISTS,
|
||||
'description' => 'A table with the requested ID \'%s\' 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 for database \'%s\' has been reached.',
|
||||
'description' => 'The maximum number of collections has been reached.',
|
||||
'code' => 400,
|
||||
],
|
||||
|
||||
/** Documents */
|
||||
Exception::DOCUMENT_NOT_FOUND => [
|
||||
'name' => Exception::DOCUMENT_NOT_FOUND,
|
||||
'description' => 'Document with the requested ID \'%s\' could not be found.',
|
||||
'description' => 'Document with the requested ID could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::DOCUMENT_INVALID_STRUCTURE => [
|
||||
@@ -769,7 +712,7 @@ return [
|
||||
],
|
||||
Exception::DOCUMENT_ALREADY_EXISTS => [
|
||||
'name' => Exception::DOCUMENT_ALREADY_EXISTS,
|
||||
'description' => 'Document with the requested ID \'%s\' already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
|
||||
'description' => 'Document with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
|
||||
'code' => 409,
|
||||
],
|
||||
Exception::DOCUMENT_UPDATE_CONFLICT => [
|
||||
@@ -783,57 +726,20 @@ return [
|
||||
'code' => 403,
|
||||
],
|
||||
|
||||
/** Rows */
|
||||
Exception::ROW_NOT_FOUND => [
|
||||
'name' => Exception::ROW_NOT_FOUND,
|
||||
'description' => 'Row with the requested ID \'%s\' 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 \'%s\' 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,
|
||||
'description' => 'Attribute with the requested key \'%s\' could not be found.',
|
||||
'description' => 'Attribute with the requested ID could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::ATTRIBUTE_UNKNOWN => [
|
||||
'name' => Exception::ATTRIBUTE_UNKNOWN,
|
||||
'description' => 'The attribute \'%s\' required for the index could not be found. Please confirm all your attributes are in the available state.',
|
||||
'description' => 'The attribute required for the index could not be found. Please confirm all your attributes are in the available state.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::ATTRIBUTE_NOT_AVAILABLE => [
|
||||
'name' => Exception::ATTRIBUTE_NOT_AVAILABLE,
|
||||
'description' => 'The requested attribute \'%s\' is not yet available. Please try again later.',
|
||||
'description' => 'The requested attribute is not yet available. Please try again later.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::ATTRIBUTE_FORMAT_UNSUPPORTED => [
|
||||
@@ -848,12 +754,12 @@ return [
|
||||
],
|
||||
Exception::ATTRIBUTE_ALREADY_EXISTS => [
|
||||
'name' => Exception::ATTRIBUTE_ALREADY_EXISTS,
|
||||
'description' => 'Attribute with the requested key \'%s\' already exists. Attribute keys must be unique, try again with a different key.',
|
||||
'description' => 'Attribute with the requested key already exists. Attribute keys must be unique, try again with a different key.',
|
||||
'code' => 409,
|
||||
],
|
||||
Exception::ATTRIBUTE_LIMIT_EXCEEDED => [
|
||||
'name' => Exception::ATTRIBUTE_LIMIT_EXCEEDED,
|
||||
'description' => 'The maximum number or size of attributes for collection \'%s\' has been reached.',
|
||||
'description' => 'The maximum number or size of attributes for this collection has been reached.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::ATTRIBUTE_VALUE_INVALID => [
|
||||
@@ -863,99 +769,34 @@ return [
|
||||
],
|
||||
Exception::ATTRIBUTE_TYPE_INVALID => [
|
||||
'name' => Exception::ATTRIBUTE_TYPE_INVALID,
|
||||
'description' => 'The attribute \'%s\' type is invalid.',
|
||||
'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 \'%s\' 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 key \'%s\' could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::COLUMN_UNKNOWN => [
|
||||
'name' => Exception::COLUMN_UNKNOWN,
|
||||
'description' => 'The column \'%s\' 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 \'%s\' 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 \'%s\' 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 table \'%s\' 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 \'%s\' 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 \'%s\' is not supported.',
|
||||
'code' => 400,
|
||||
],
|
||||
|
||||
/** Indexes */
|
||||
Exception::INDEX_NOT_FOUND => [
|
||||
'name' => Exception::INDEX_NOT_FOUND,
|
||||
'description' => 'Index with the requested key \'%s\' could not be found.',
|
||||
'description' => 'Index with the requested ID could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::INDEX_LIMIT_EXCEEDED => [
|
||||
'name' => Exception::INDEX_LIMIT_EXCEEDED,
|
||||
'description' => 'The maximum number of indexes for collection \'%s\' has been reached.',
|
||||
'description' => 'The maximum number of indexes has been reached.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::INDEX_ALREADY_EXISTS => [
|
||||
'name' => Exception::INDEX_ALREADY_EXISTS,
|
||||
'description' => 'Index with the requested key \'%s\' already exists. Try again with a different key.',
|
||||
'description' => 'Index with the requested key already exists. Try again with a different key.',
|
||||
'code' => 409,
|
||||
],
|
||||
Exception::INDEX_INVALID => [
|
||||
@@ -965,79 +806,10 @@ return [
|
||||
],
|
||||
Exception::INDEX_DEPENDENCY => [
|
||||
'name' => Exception::INDEX_DEPENDENCY,
|
||||
'description' => 'Attribute \'%s\' cannot be renamed or deleted. Please remove the associated index first.',
|
||||
'description' => 'Attribute cannot be renamed or deleted. Please remove the associated index first.',
|
||||
'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 key \'%s\' could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::COLUMN_INDEX_LIMIT_EXCEEDED => [
|
||||
'name' => Exception::COLUMN_INDEX_LIMIT_EXCEEDED,
|
||||
'description' => 'The maximum number of indexes for table \'%s\' has been reached.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::COLUMN_INDEX_ALREADY_EXISTS => [
|
||||
'name' => Exception::COLUMN_INDEX_ALREADY_EXISTS,
|
||||
'description' => 'Index with the requested key \'%s\' 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 \'%s\' 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 \'%s\' could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::TRANSACTION_ALREADY_EXISTS => [
|
||||
'name' => Exception::TRANSACTION_ALREADY_EXISTS,
|
||||
'description' => 'Transaction with the requested ID \'%s\' 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,
|
||||
@@ -1079,11 +851,6 @@ return [
|
||||
'description' => 'The project key has expired. Please generate a new key using the Appwrite console.',
|
||||
'code' => 401,
|
||||
],
|
||||
Exception::ACCOUNT_KEY_EXPIRED => [
|
||||
'name' => Exception::ACCOUNT_KEY_EXPIRED,
|
||||
'description' => 'The account API key has expired. Please generate a new key using the Appwrite console.',
|
||||
'code' => 401,
|
||||
],
|
||||
Exception::ROUTER_HOST_NOT_FOUND => [
|
||||
'name' => Exception::ROUTER_HOST_NOT_FOUND,
|
||||
'description' => 'Host is not trusted. This could occur because you have not configured a custom domain. Add a custom domain to your project first and try again.',
|
||||
@@ -1113,6 +880,7 @@ return [
|
||||
'name' => Exception::RULE_VERIFICATION_FAILED,
|
||||
'description' => 'Domain verification failed. Please check if your DNS records are correct and try again.',
|
||||
'code' => 400,
|
||||
'publish' => true
|
||||
],
|
||||
Exception::PROJECT_SMTP_CONFIG_INVALID => [
|
||||
'name' => Exception::PROJECT_SMTP_CONFIG_INVALID,
|
||||
@@ -1139,11 +907,6 @@ return [
|
||||
'description' => 'Key with the requested ID could not be found.',
|
||||
'code' => 404,
|
||||
],
|
||||
Exception::KEY_ALREADY_EXISTS => [
|
||||
'name' => Exception::KEY_ALREADY_EXISTS,
|
||||
'description' => 'Key with the same ID already exists. Try again with a different ID.',
|
||||
'code' => 409,
|
||||
],
|
||||
Exception::PLATFORM_NOT_FOUND => [
|
||||
'name' => Exception::PLATFORM_NOT_FOUND,
|
||||
'description' => 'Platform with the requested ID could not be found.',
|
||||
@@ -1343,19 +1106,4 @@ return [
|
||||
'description' => 'Target has an invalid provider type.',
|
||||
'code' => 400,
|
||||
],
|
||||
Exception::USER_ID_MISSING => [
|
||||
'name' => Exception::USER_ID_MISSING,
|
||||
'description' => 'When using account API key, make sure to pass x-appwrite-user header with your user ID.',
|
||||
'code' => 403,
|
||||
],
|
||||
Exception::ORGANIZATION_ID_MISSING => [
|
||||
'name' => Exception::ORGANIZATION_ID_MISSING,
|
||||
'description' => 'When using organization API key, make sure to pass x-appwrite-organization header with your organization ID.',
|
||||
'code' => 403,
|
||||
],
|
||||
Exception::PROJECT_ID_MISSING => [
|
||||
'name' => Exception::PROJECT_ID_MISSING,
|
||||
'description' => 'When using project API key, make sure to pass x-appwrite-project header with your project ID.',
|
||||
'code' => 403,
|
||||
],
|
||||
];
|
||||
|
||||
+10
-78
@@ -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,
|
||||
|
||||
+22
-41
@@ -8,13 +8,20 @@ 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' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -40,7 +47,7 @@ return [
|
||||
'name' => 'Angular',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -66,7 +73,7 @@ return [
|
||||
'name' => 'Next.js',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -91,7 +98,7 @@ return [
|
||||
'name' => 'React',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -108,7 +115,7 @@ return [
|
||||
'name' => 'Nuxt',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -133,7 +140,7 @@ return [
|
||||
'name' => 'Vue.js',
|
||||
'screenshotSleep' => 5000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -150,7 +157,7 @@ return [
|
||||
'name' => 'SvelteKit',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -175,7 +182,7 @@ return [
|
||||
'name' => 'Astro',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -195,37 +202,12 @@ return [
|
||||
]
|
||||
]
|
||||
],
|
||||
'tanstack-start' => [
|
||||
'key' => 'tanstack-start',
|
||||
'name' => 'TanStack Start',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['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' => './.output',
|
||||
'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' => $templateRuntimes['NODE'],
|
||||
'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' => [
|
||||
@@ -250,7 +232,7 @@ return [
|
||||
'name' => 'Lynx',
|
||||
'screenshotSleep' => 5000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -266,8 +248,8 @@ return [
|
||||
'key' => 'flutter',
|
||||
'name' => 'Flutter',
|
||||
'screenshotSleep' => 5000,
|
||||
'buildRuntime' => 'flutter-3.35',
|
||||
'runtimes' => $templateRuntimes['FLUTTER'],
|
||||
'buildRuntime' => 'flutter-3.29',
|
||||
'runtimes' => getVersions($templateRuntimes['FLUTTER']['versions'], 'flutter'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -275,7 +257,6 @@ return [
|
||||
'installCommand' => 'flutter pub get',
|
||||
'outputDirectory' => './build/web',
|
||||
'startCommand' => 'bash helpers/server.sh',
|
||||
'fallbackFile' => 'index.html'
|
||||
],
|
||||
],
|
||||
],
|
||||
@@ -284,7 +265,7 @@ return [
|
||||
'name' => 'React Native',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -301,7 +282,7 @@ return [
|
||||
'name' => 'Vite',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
@@ -317,7 +298,7 @@ return [
|
||||
'name' => 'Other',
|
||||
'screenshotSleep' => 3000,
|
||||
'buildRuntime' => 'node-22',
|
||||
'runtimes' => $templateRuntimes['NODE'],
|
||||
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
|
||||
'adapters' => [
|
||||
'static' => [
|
||||
'key' => 'static',
|
||||
|
||||
@@ -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;
|
||||
@@ -129,7 +83,6 @@
|
||||
color: #ffffff;
|
||||
border-radius: 8px;
|
||||
height: 48px;
|
||||
line-height: 24px;
|
||||
padding: 12px 20px;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
@@ -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"
|
||||
height="32px"
|
||||
src="{{logoUrl}}"
|
||||
alt="{{platform}} logo"
|
||||
/>
|
||||
</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="{{twitter}}"
|
||||
href="{{twitterUrl}}"
|
||||
class="social-icon"
|
||||
title="Twitter"
|
||||
>
|
||||
@@ -234,7 +173,7 @@
|
||||
</td>
|
||||
<td style="padding-left: 4px; padding-right: 4px">
|
||||
<a
|
||||
href="{{discord}}"
|
||||
href="{{discordUrl}}"
|
||||
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="{{github}}"
|
||||
href="{{githubUrl}}"
|
||||
class="social-icon"
|
||||
>
|
||||
<img src="https://cloud.appwrite.io/images/mails/github.png" height="24" width="24" />
|
||||
@@ -252,15 +191,15 @@
|
||||
</table>
|
||||
<table style="width: auto; margin: 0 auto; margin-top: 60px">
|
||||
<tr>
|
||||
<td><a href="{{terms}}">Terms</a></td>
|
||||
<td><a href="{{termsUrl}}">Terms</a></td>
|
||||
<td style="color: #e8e9f0">
|
||||
<div style="margin: 0 8px">|</div>
|
||||
</td>
|
||||
<td><a href="{{privacy}}">Privacy</a></td>
|
||||
<td><a href="{{privacyUrl}}">Privacy</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="text-align: center" align="center">
|
||||
© {{year}} {{platform}} | 251 Little Falls Drive, Wilmington 19808,
|
||||
© {{year}} Appwrite | 251 Little Falls Drive, Wilmington 19808,
|
||||
Delaware, United States
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1,61 +1,11 @@
|
||||
<!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>
|
||||
<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>
|
||||
@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>
|
||||
<style>
|
||||
.main {
|
||||
max-width: 650px;
|
||||
margin: 0 auto;
|
||||
margin-top: 32px;
|
||||
body {
|
||||
padding: 32px;
|
||||
line-height: 1.5;
|
||||
color: #616b7c;
|
||||
@@ -63,26 +13,13 @@
|
||||
font-weight: 400;
|
||||
font-family: "Inter", sans-serif;
|
||||
background-color: #ffffff;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.main a {
|
||||
a {
|
||||
color: currentColor;
|
||||
word-break: break-all;
|
||||
}
|
||||
.main 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;
|
||||
}
|
||||
.main a.button:hover,
|
||||
.main a.button:focus {
|
||||
opacity: 0.8;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
border-spacing: 0 !important;
|
||||
@@ -94,6 +31,11 @@
|
||||
td {
|
||||
vertical-align: top;
|
||||
}
|
||||
.main {
|
||||
max-width: 650px;
|
||||
margin: 0 auto;
|
||||
margin-top: 32px;
|
||||
}
|
||||
h1 {
|
||||
font-size: 22px;
|
||||
margin-bottom: 0px;
|
||||
@@ -125,34 +67,70 @@
|
||||
border: none;
|
||||
border-top: 1px solid #e8e9f0;
|
||||
}
|
||||
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>
|
||||
|
||||
<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%;
|
||||
}
|
||||
|
||||
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="display: none; overflow: hidden; max-height: 0; max-width: 0; opacity: 0; line-height: 1px;">
|
||||
{{preview}}
|
||||
<div>{{previewWhitespace}}</div>
|
||||
</div>
|
||||
|
||||
<div class="main" style="max-width:650px; word-wrap: break-word; overflow-wrap: break-word; word-break: normal; margin:0 auto;">
|
||||
<table style="margin-top: 32px">
|
||||
<tr>
|
||||
<td>
|
||||
{{body}}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="max-width:650px; word-wrap: break-word; overflow-wrap: break-word;
|
||||
word-break: normal; margin:0 auto;">
|
||||
<table style="margin-top: 32px">
|
||||
<tr>
|
||||
<td>
|
||||
{{body}}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -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" style="font-size: 14px; font-family: Inter, sans-serif; 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;">{{buttonText}}</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>
|
||||
|
||||
@@ -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>
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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": "تبّع هاد الوصلة باش تيقّن لادريسة تاع ليميل ديالك.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "تبدال كلمة السر",
|
||||
@@ -21,14 +23,14 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"فن الحكمة هو فن معرفة ما يجب التغاضي عنه.\"",
|
||||
"settings.locale": "ar",
|
||||
"settings.direction": "rtl",
|
||||
"emails.sender": "فريق {{project}}",
|
||||
"emails.sender": "فريق %s",
|
||||
"emails.verification.subject": "تأكيد الحساب",
|
||||
"emails.verification.hello": "مرحبا {{user}}،",
|
||||
"emails.verification.body": "برجاء اتباع الرابط التالي لتأكيد بريدك الإلكتروني",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "تغيير كلمة السر",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "اذا كنت غير مهتم، يمكنك تجاهل هذه الرسالة",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"জ্ঞানী হোৱাৰ কলা হৈছে কি উপেক্ষা কৰিব লাগে জনাৰ কলা।\"",
|
||||
"settings.locale": "as",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} দল",
|
||||
"emails.sender": "%s দল",
|
||||
"emails.verification.subject": "একাউণ্ট প্ৰমাণীকৰণ",
|
||||
"emails.verification.hello": "নমস্কাৰ {{user}},",
|
||||
"emails.verification.body": "আপোনাৰ ইমেইল ঠিকনা প্ৰমাণিত কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "পাছৱাৰ্ড ৰিছেট",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "যদি আপুনি আগ্ৰহী নহয়, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।",
|
||||
@@ -245,7 +247,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 যোগাযোগ অবিহনে থাকিব।",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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ı",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"Мастацтва быць мудрым - гэта мастацтва ведаць, на што нельга звярнуць увагу.\"",
|
||||
"settings.locale": "be",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "Каманда {{project}}",
|
||||
"emails.sender": "Каманда %s",
|
||||
"emails.verification.subject": "Верыфікацыя акаўнта",
|
||||
"emails.verification.hello": "Прывітанне {{user}},",
|
||||
"emails.verification.body": "Перайдзіце па гэтай спасылцы, каб пацвердзіць свой адрас электроннай пошты",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "Скід пароля",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "Калі вам гэта не цікава, вы можаце праігнараваць гэтае паведамленне.",
|
||||
@@ -245,7 +247,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-злучэння.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"बुद्धिमान होइत क कला ई जाने क कला अछि जे की अनदेखा कर्मा चाहि| \"",
|
||||
"settings.locale": "bh",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} टीम",
|
||||
"emails.sender": "%s टीम",
|
||||
"emails.verification.subject": "खाता प्रमाणिकरण",
|
||||
"emails.verification.hello": "नमस्ते {{user}},",
|
||||
"emails.verification.body": "ईमेल प्रमाणिकरण करे क लेल दिहल गइल लिंक फॉलो करें|",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "पासवर्ड बदल क लेल|",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "अगर आवे क इच्छा ना होवत, तो आप ई संदेश क अनदेखा कर सकत अछि।",
|
||||
@@ -245,7 +247,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 संवाद के रहि जाईत।",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"জ্ঞানী হওয়ার শিল্প হলো কোন বিষয়টিকে উপেক্ষা করা উচিত তা জানার শিল্প\"",
|
||||
"settings.locale": "bn",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} টীম",
|
||||
"emails.sender": "%s টীম",
|
||||
"emails.verification.subject": "বিষয়",
|
||||
"emails.verification.hello": "নমস্কার {{user}},",
|
||||
"emails.verification.body": "এই লিঙ্কের মাধ্যমে ইমেইল যাচাই করুন।",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "পাসওয়ার্ড রিসেট",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "যদি এটি আপনার জন্য প্রয়োজনীয় না হয়, আপনি এই বার্তাটি উপেক্ষা করতে পারেন।",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
@@ -245,6 +247,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"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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 σας",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "Αλλαγή κωδικού πρόσβασης",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "Εάν δεν ενδιαφέρεστε, μπορείτε να αγνοήσετε αυτό το μήνυμα.",
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
"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 didn’t ask to verify this address, you can ignore this message.",
|
||||
@@ -13,7 +11,6 @@
|
||||
"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 +20,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 +29,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 +36,26 @@
|
||||
"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 +266,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"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"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.",
|
||||
@@ -11,6 +11,8 @@
|
||||
"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",
|
||||
@@ -20,7 +22,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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:",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"هنر خردمند بودن این است که بدانید چه چیزی را نادیده بگیرید.\"",
|
||||
"settings.locale": "fa",
|
||||
"settings.direction": "rtl",
|
||||
"emails.sender": "تیم {{project}}",
|
||||
"emails.sender": "تیم %s",
|
||||
"emails.verification.subject": "تأیید حساب",
|
||||
"emails.verification.hello": "سلام {{user}}،",
|
||||
"emails.verification.body": "برای تأیید ایمیلتان پیوند زیر را دنبال کنید.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "بازیابی گذرواژه",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "اگر علاقه ندارید، میتوانید این پیام را نادیده بگیرید.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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ú.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"સ્માર્ટ બનવાની કળા એ છે કે શું અવગણવું તે જાણવાની કળા છે.\"",
|
||||
"settings.locale": "gu",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} ટીમ",
|
||||
"emails.sender": "%s ટીમ",
|
||||
"emails.verification.subject": "ખાતાની ચકાસણી",
|
||||
"emails.verification.hello": "નમસ્કાર {{user}},",
|
||||
"emails.verification.body": "તમારું ઇમેઇલ સરનામું ચકાસવા માટે આ લિંકને અનુસરો.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "પાસવર્ડ ફરીથી સેટ કરો",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "જો તમને રસ નથી, તો તમે આ સંદેશને અવગણી શકો છો.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"להיות חכם זה לדעת ממה להתעלם.\"",
|
||||
"settings.locale": "he",
|
||||
"settings.direction": "rtl",
|
||||
"emails.sender": "צוות {{project}}",
|
||||
"emails.sender": "צוות %s",
|
||||
"emails.verification.subject": "אימות חשבון",
|
||||
"emails.verification.hello": "שלום {{user}},",
|
||||
"emails.verification.body": "לחץ על קישור זה כדי לאמת את כתובת הדוא\"ל שלך.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "איפוס סיסמא",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "אם אינך מעוניין, תוכל להתעלם מהודעה זו.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"बुद्धिमान होने की कला यह जानने की कला है कि क्या अनदेखा किया जाए |\"",
|
||||
"settings.locale": "hi",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} टीम",
|
||||
"emails.sender": "%s टीम",
|
||||
"emails.verification.subject": "अकाउंट वेरिफिकेशन ",
|
||||
"emails.verification.hello": "नमस्ते {{user}},",
|
||||
"emails.verification.body": "इस लिंक के माध्यम से अपने ईमेल को सत्यापित कीजिये।",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "पासवर्ड रीसेट",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "यदि आप इसमें रूचि नहीं रखते, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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 l’accesso, puoi ignorare questo messaggio.",
|
||||
"emails.magicSession.thanks": "Grazie,",
|
||||
"emails.magicSession.signature": "Il team {{project}}",
|
||||
"emails.recovery.subject": "Reimpostazione password",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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ə.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"賢明になる術は何を捨てるべきかを心得る術である。\"",
|
||||
"settings.locale": "ja",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} チーム",
|
||||
"emails.sender": "%s チーム",
|
||||
"emails.verification.subject": "アカウント認証",
|
||||
"emails.verification.hello": "こんにちは{{user}}さん、",
|
||||
"emails.verification.body": "メールアドレスを有効化するためには下記リンクをクリックして下さい。",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "パスワードリセット",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "このメールに心当たりが無い場合は破棄をお願いいたします。",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"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": "ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸ ಪರಿಶೀಲನೆಗೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಿ",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "ನಿಮಗೆ ಆಸಕ್ತಿಯಿಲ್ಲದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"지혜롭게 되는 묘책은 그동안 간과했던 것을 알아내는 것에 있다\"",
|
||||
"settings.locale": "ko",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} 팀",
|
||||
"emails.sender": "%s 팀",
|
||||
"emails.verification.subject": "계정 인증",
|
||||
"emails.verification.hello": "안녕하세요 {{user}}님、",
|
||||
"emails.verification.body": "이메일 인증을 위해 링크를 클릭하여주세요.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "비밀번호 재설정",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "팀에 합류할 의사가 없으시면 이 메세지를 무시하여주세요.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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",
|
||||
@@ -245,7 +247,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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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ą.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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ą.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"എന്താണ് അവഗണിക്കേണ്ടതെന്ന് അറിയാനുള്ള കലയാണ് ബുദ്ധിമാനായിരിക്കുക എന്നത്.\"",
|
||||
"settings.locale": "ml",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} ടീം",
|
||||
"emails.sender": "%s ടീം",
|
||||
"emails.verification.subject": "അക്കൗണ്ട് സ്ഥിരീകരണം",
|
||||
"emails.verification.hello": "നമസ്കാരം {{user}},",
|
||||
"emails.verification.body": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "രഹസ്യവാക്ക് പുനക്രമീകരണം",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.",
|
||||
@@ -245,7 +247,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 കമ്മ്യൂണിക്കേഷനില്ലാത്ത ഒരു അവസ്ഥയിലാകും.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"हुशार असण्याची कला म्हणजे कोणत्या गोष्टीकडे दुर्लक्ष करावे हे जाणून घेण्याची कला.\"",
|
||||
"settings.locale": "mr",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} टीम",
|
||||
"emails.sender": "%s टीम",
|
||||
"emails.verification.subject": "खाते सत्यापन",
|
||||
"emails.verification.hello": "नमस्कार {{user}},",
|
||||
"emails.verification.body": "आपला ईमेल पत्ता सत्यापित करण्यासाठी या दुव्याचे अनुसरण करा.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "पासवर्ड रीसेट",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "आपल्याला स्वारस्य नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"के लाई बेवास्ता गर्ने भन्ने जान्नुनै बुद्धिमान हुनुको कला हो ।\"",
|
||||
"settings.locale": "ne",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} समूह",
|
||||
"emails.sender": "%s समूह",
|
||||
"emails.verification.subject": "खाता प्रमाणिकरण",
|
||||
"emails.verification.hello": "नमस्ते {{user}},",
|
||||
"emails.verification.body": "इमेल ठेगाना प्रमाणित गर्नको लागी यो लिंकमा जानुहोस।",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "पासवर्ड रिसेट",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "यदि तपाइँ इच्छुक हुनुहुन्न भने, तपाइँले यो सन्देशलाई बेवास्ता गर्न सक्नुहुन्छ।",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
@@ -245,7 +247,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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"ବୁଦ୍ଧିମାନ ହେବାର କଳା ହେଉଛି କ’ଣ ଅଣଦେଖା କରାଯିବ ଜାଣିବାର କଳା |\"",
|
||||
"settings.locale": "or",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} ଦଳ",
|
||||
"emails.sender": "%s ଦଳ",
|
||||
"emails.verification.subject": "ଖାତା ଯାଞ୍ଚ",
|
||||
"emails.verification.hello": "ନମସ୍କାର {{user}},",
|
||||
"emails.verification.body": "ଆପଣଙ୍କର ଇମେଲ୍ ଠିକଣା ଯାଞ୍ଚ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରନ୍ତୁ |",
|
||||
@@ -21,9 +23,9 @@
|
||||
"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}} ପାଇଁ ଆମନ୍ତ୍ରଣ ଗ୍ରହଣ କରନ୍ତୁ",
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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ść.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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ă",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"Искусство быть мудрым — это искусство знать, чем можно пренебречь.\"",
|
||||
"settings.locale": "ru",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "Команда {{project}}",
|
||||
"emails.sender": "Команда %s",
|
||||
"emails.verification.subject": "Верификация аккаунта",
|
||||
"emails.verification.hello": "Здравствуйте, {{user}},",
|
||||
"emails.verification.body": "Перейдите по ссылке, чтобы подтвердить свой адрес электронной почты.",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "Сброс пароля",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "Если вы не заинтересованы, проигнорируйте это сообщение.",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings.inspire": "\"किं हेयमित्यस्य ज्ञानमेव ज्ञानिलक्षणम्।\"",
|
||||
"settings.locale": "sa",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "{{project}} गणः",
|
||||
"emails.sender": "%s गणः",
|
||||
"emails.verification.subject": "पञ्जिकानिर्णायनम्",
|
||||
"emails.verification.hello": "अयि {{user}},",
|
||||
"emails.verification.body": "ई-पत्रनिर्णायनार्थमिदं संयोगसूत्रमनुसरतु।",
|
||||
@@ -12,6 +12,8 @@
|
||||
"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": "कूटशब्दपुनयाेजनम्",
|
||||
@@ -21,7 +23,7 @@
|
||||
"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": "यदि भवदनिच्छा तर्हि वात्र्तामिमामुपेक्षताम्।",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user