diff --git a/.github/workflows/audit-glossaries.yml b/.github/workflows/audit-glossaries.yml new file mode 100644 index 00000000000..ea18abeb98d --- /dev/null +++ b/.github/workflows/audit-glossaries.yml @@ -0,0 +1,115 @@ +# Weekly audit of translation glossaries against source-of-truth localization +# files in the platform and SDK repos. +# +# Compares scripts/glossaries/*.json against the actual UI translations in +# the Braze platform dashboard, Android SDK, Swift SDK, and GrapesJS editor +# to surface terminology drift. +# +# Creates a GitHub Issue when mismatches or missing terms are detected. +name: Audit glossaries + +on: + schedule: + - cron: '0 6 * * 0' # Every Sunday at 06:00 UTC + workflow_dispatch: + +permissions: + contents: read + issues: write + +jobs: + audit: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout braze-docs + uses: actions/checkout@v4 + + - name: Clone reference repos + env: + GH_TOKEN: ${{ secrets.REFERENCE_REPO_TOKEN }} + run: | + # Clone repos needed for localization comparison. + # Public repos use HTTPS; private repos use the PAT. + clone_repo() { + local org=$1 repo=$2 + echo "Cloning $org/$repo..." + git clone --depth 1 --filter=blob:none --sparse \ + "https://x-access-token:${GH_TOKEN}@github.com/${org}/${repo}.git" \ + "../${repo}" 2>/dev/null || \ + git clone --depth 1 \ + "https://github.com/${org}/${repo}.git" \ + "../${repo}" 2>/dev/null || \ + echo " WARNING: Could not clone ${org}/${repo} — skipping" + } + + clone_repo Appboy platform + clone_repo braze-inc braze-android-sdk + clone_repo braze-inc braze-swift-sdk + clone_repo braze-inc grapesjs + + # Sparse-checkout only the locale directories we need + for repo in platform braze-android-sdk braze-swift-sdk grapesjs; do + if [ -d "../${repo}" ]; then + cd "../${repo}" + git sparse-checkout init --cone 2>/dev/null || true + case $repo in + platform) + git sparse-checkout set dashboard/config/locales 2>/dev/null || true ;; + braze-android-sdk) + git sparse-checkout set android-sdk-ui/src/main/res 2>/dev/null || true ;; + braze-swift-sdk) + git sparse-checkout set Sources/BrazeUI/Resources/Localization 2>/dev/null || true ;; + grapesjs) + git sparse-checkout set src/i18n/locale 2>/dev/null || true ;; + esac + cd "$GITHUB_WORKSPACE" + fi + done + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Run glossary audit + id: audit + run: | + python scripts/audit_glossaries.py \ + --platform-repo ../platform \ + --android-repo ../braze-android-sdk \ + --swift-repo ../braze-swift-sdk \ + --grapesjs-repo ../grapesjs \ + --output glossary_audit_report.json || true + + # Read stats for the issue + if [ -f glossary_audit_report.json ]; then + mismatches=$(python3 -c "import json; r=json.load(open('glossary_audit_report.json')); print(r['stats']['total_mismatches'])") + missing=$(python3 -c "import json; r=json.load(open('glossary_audit_report.json')); print(r['stats']['total_missing'])") + echo "mismatches=${mismatches}" >> "$GITHUB_OUTPUT" + echo "missing=${missing}" >> "$GITHUB_OUTPUT" + echo "has_findings=$([ $mismatches -gt 0 ] || [ $missing -gt 0 ] && echo true || echo false)" >> "$GITHUB_OUTPUT" + else + echo "has_findings=false" >> "$GITHUB_OUTPUT" + fi + + - name: Create or update issue + if: steps.audit.outputs.has_findings == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + DATE=$(date +%Y-%m-%d) + TITLE="Glossary audit: ${{ steps.audit.outputs.mismatches }} mismatches, ${{ steps.audit.outputs.missing }} missing terms ($DATE)" + + BODY=$(cat glossary_audit_report.md) + + # Close any previous open audit issues + gh issue list --label "glossary-audit" --state open --json number -q '.[].number' | while read num; do + gh issue close "$num" --comment "Superseded by new audit run on $DATE." + done + + gh issue create \ + --title "$TITLE" \ + --body "$BODY" \ + --label "glossary-audit" diff --git a/.github/workflows/auto-translate.yml b/.github/workflows/auto-translate.yml index c7f7d5fe5f1..b51abfbfffe 100644 --- a/.github/workflows/auto-translate.yml +++ b/.github/workflows/auto-translate.yml @@ -94,6 +94,13 @@ jobs: if: steps.changes.outputs.count != '0' run: python scripts/auto_translate.py translate --changed-files changed_files.txt + # ------------------------------------------------------------------ + # Quality checks + # ------------------------------------------------------------------ + - name: Run translation QC checks + if: steps.changes.outputs.count != '0' + run: python scripts/auto_translate.py qc + # ------------------------------------------------------------------ # Build verification + auto-fix loop # ------------------------------------------------------------------ @@ -104,9 +111,12 @@ jobs: ruby-version: '3.3' bundler-cache: true - - name: Clean up orphaned translations - if: steps.changes.outputs.count != '0' - run: python scripts/clean_orphaned_translations.py + # Orphaned translation cleanup is temporarily disabled while the + # clean_orphaned_translations.py script is validated to avoid + # accidental deletions. Re-enable once confirmed safe in production. + # - name: Clean up orphaned translations + # if: steps.changes.outputs.count != '0' + # run: python scripts/clean_orphaned_translations.py - name: Verify builds and fix errors if: steps.changes.outputs.count != '0' diff --git a/.gitignore b/.gitignore index ebfb7823e76..290f2ca87b6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,9 @@ braze-docs.iml # Braze scripts scripts/temp node_modules + +# Generated translation/audit artifacts +translation_results.json +translation_pr_body.md +qc_results.json +glossary_audit_report.* diff --git a/scripts/audit_glossaries.py b/scripts/audit_glossaries.py new file mode 100644 index 00000000000..bfb82968207 --- /dev/null +++ b/scripts/audit_glossaries.py @@ -0,0 +1,559 @@ +#!/usr/bin/env python3 +""" +Audit braze-docs glossaries against source-of-truth localization files. + +Compares scripts/glossaries/*.json against: + - Platform dashboard locale files (dashboard/config/locales/*.{lang}.braze.json) + - Android SDK strings (android-sdk-ui/src/main/res/values*/strings.xml) + - Swift SDK strings (Sources/BrazeUI/Resources/Localization/*.lproj/*.strings) + - GrapesJS locale files (src/i18n/locale/{lang}.js) + +Usage: + python audit_glossaries.py [--platform-repo ../platform] [--output report.json] +""" + +import argparse +import json +import os +import re +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent +GLOSSARY_DIR = REPO_ROOT / "scripts" / "glossaries" + +LANG_MAP = { + "de": {"platform": "de", "android": "values-de", "swift": "de", "grapesjs": "de"}, + "es": {"platform": "es", "android": "values-es", "swift": "es", "grapesjs": "es"}, + "fr": {"platform": "fr", "android": "values-fr", "swift": "fr", "grapesjs": "fr"}, + "ja": {"platform": "ja", "android": "values-ja", "swift": "ja", "grapesjs": None}, + "ko": {"platform": "ko", "android": "values-ko", "swift": "ko", "grapesjs": "ko"}, + "pt-br": {"platform": "pt-br", "android": "values-pt", "swift": "pt", "grapesjs": "pt"}, +} + +# --------------------------------------------------------------------------- +# Parsers for each source repo +# --------------------------------------------------------------------------- + +def _extract_leaves(obj): + """Recursively extract leaf string values from nested dicts.""" + for v in obj.values(): + if isinstance(v, dict): + yield from _extract_leaves(v) + elif isinstance(v, str): + yield v + + +def parse_platform(repo_path, lang_key): + """Parse platform dashboard locale files. Returns {english: translation}.""" + locales = Path(repo_path) / "dashboard" / "config" / "locales" + if not locales.is_dir(): + return {} + + en_files = sorted(locales.glob("*.en.braze.json")) + pairs = {} + + for en_file in en_files: + namespace = en_file.name.rsplit(".en.braze.json", 1)[0] + lang_file = locales / f"{namespace}.{lang_key}.braze.json" + if not lang_file.exists(): + continue + + try: + en_data = json.loads(en_file.read_text()) + lang_data = json.loads(lang_file.read_text()) + except (json.JSONDecodeError, OSError): + continue + + # Strip the top-level language key so flattened paths match + # Structure: {"en": {"braze": {"ns": ...}}} -> {"braze": {"ns": ...}} + en_inner = next(iter(en_data.values())) if en_data else {} + lang_inner = next(iter(lang_data.values())) if lang_data else {} + + en_leaves = _flatten_keys(en_inner) + lang_leaves = _flatten_keys(lang_inner) + + for key, en_val in en_leaves.items(): + lang_val = lang_leaves.get(key) + if lang_val and isinstance(en_val, str) and isinstance(lang_val, str): + pairs[en_val] = lang_val + + return pairs + + +def _flatten_keys(obj, prefix=""): + """Flatten nested dict to {dotted.key: leaf_value}.""" + result = {} + for k, v in obj.items(): + full = f"{prefix}.{k}" if prefix else k + if isinstance(v, dict): + result.update(_flatten_keys(v, full)) + else: + result[full] = v + return result + + +def parse_android_sdk(repo_path, locale_dir): + """Parse Android strings.xml. Returns {english: translation}.""" + res = Path(repo_path) / "android-sdk-ui" / "src" / "main" / "res" + en_file = res / "values" / "strings.xml" + lang_file = res / locale_dir / "strings.xml" + if not en_file.exists() or not lang_file.exists(): + return {} + + en_strings = _parse_android_strings(en_file) + lang_strings = _parse_android_strings(lang_file) + + return { + en_strings[k]: lang_strings[k] + for k in en_strings + if k in lang_strings + } + + +def _parse_android_strings(path): + """Parse Android strings.xml into {name: value}.""" + try: + tree = ET.parse(path) + except ET.ParseError: + return {} + result = {} + for elem in tree.findall(".//string"): + name = elem.get("name", "") + if elem.get("translatable") == "false": + continue + text = elem.text or "" + result[name] = text.replace("\\n", "\n") + return result + + +def parse_swift_sdk(repo_path, locale): + """Parse Swift SDK .strings files. Returns {english: translation}.""" + base = Path(repo_path) / "Sources" / "BrazeUI" / "Resources" / "Localization" + en_dir = base / "en.lproj" + lang_dir = base / f"{locale}.lproj" + if not en_dir.is_dir() or not lang_dir.is_dir(): + return {} + + pairs = {} + for en_file in en_dir.glob("*.strings"): + lang_file = lang_dir / en_file.name + if not lang_file.exists(): + continue + en_strings = _parse_dot_strings(en_file) + lang_strings = _parse_dot_strings(lang_file) + for k in en_strings: + if k in lang_strings: + pairs[en_strings[k]] = lang_strings[k] + return pairs + + +def _parse_dot_strings(path): + """Parse Apple .strings file into {key: value}.""" + result = {} + for line in path.read_text(errors="replace").splitlines(): + m = re.match(r'^"(.+?)"\s*=\s*"(.+?)"\s*;', line) + if m: + result[m.group(1)] = m.group(2) + return result + + +def parse_grapesjs(repo_path, locale): + """Parse GrapesJS JS locale file. Returns {english: translation}.""" + if locale is None: + return {} + base = Path(repo_path) / "src" / "i18n" / "locale" + en_file = base / "en.js" + lang_file = base / f"{locale}.js" + if not en_file.exists() or not lang_file.exists(): + return {} + + en_strings = _parse_grapesjs_strings(en_file) + lang_strings = _parse_grapesjs_strings(lang_file) + + return { + en_strings[k]: lang_strings[k] + for k in en_strings + if k in lang_strings + } + + +def _parse_grapesjs_strings(path): + """Extract key-value string assignments from a GrapesJS locale JS file.""" + result = {} + text = path.read_text(errors="replace") + for m in re.finditer(r"(\w+)\s*:\s*['\"](.+?)['\"]", text): + result[m.group(1)] = m.group(2) + return result + + +# --------------------------------------------------------------------------- +# Comparison engine +# --------------------------------------------------------------------------- + +def find_mismatches(glossary, source_pairs, source_name): + """Compare glossary entries against source localization pairs. + + For each glossary English term, look for exact matches in the source + English strings. Substring matches are only reported when the source + string is a close variant (e.g. plural, "Edit X") rather than a full + sentence that happens to contain the term. + + Returns list of mismatch dicts. + """ + mismatches = [] + source_en_lower = {k.lower(): k for k in source_pairs} + + for gloss_en, gloss_trans in glossary.items(): + gloss_en_lower = gloss_en.lower() + + # 1) Exact match (case-insensitive on English, case-sensitive on translation) + if gloss_en_lower in source_en_lower: + original_key = source_en_lower[gloss_en_lower] + source_trans = source_pairs[original_key] + if not _translations_match(gloss_trans, source_trans): + mismatches.append({ + "term": gloss_en, + "match_type": "exact", + "glossary_value": gloss_trans, + "source_value": source_trans, + "source": source_name, + }) + continue + + # 2) Substring: only for short source strings that are close variants + # (at most 2x the glossary term length to avoid sentence matches) + if len(gloss_en) < 4: + continue + max_src_len = max(len(gloss_en) * 2.5, len(gloss_en) + 15) + for src_en, src_trans in source_pairs.items(): + if len(src_en) > max_src_len: + continue + if gloss_en_lower in src_en.lower() and src_en.lower() != gloss_en_lower: + if not _translations_match(gloss_trans, src_trans): + mismatches.append({ + "term": gloss_en, + "match_type": "substring", + "glossary_value": gloss_trans, + "source_value": src_trans, + "source_english": src_en, + "source": source_name, + }) + break + + return mismatches + + +def _translations_match(glossary_val, source_val): + """Check if a glossary translation is consistent with the source. + + Handles glossaries that list alternatives with 'or' (e.g. "放棄カート or カート放棄"). + Also does substring and case-insensitive checks since UI context may + capitalize differently than docs prose. + """ + gv = glossary_val.strip() + sv = source_val.strip() + if gv.lower() == sv.lower(): + return True + alternatives = [a.strip() for a in re.split(r'\s+or\s+', gv)] + for alt in alternatives: + if alt.lower() == sv.lower() or alt.lower() in sv.lower() or sv.lower() in alt.lower(): + return True + if gv.lower() in sv.lower() or sv.lower() in gv.lower(): + return True + return False + + +COMMON_WORDS = frozenset({ + "a", "an", "the", "is", "it", "in", "on", "or", "and", "to", "of", "for", + "by", "at", "as", "if", "no", "not", "but", "so", "do", "be", "we", "he", + "me", "my", "up", "go", "am", "us", "all", "new", "one", "two", "get", + "set", "can", "use", "add", "see", "try", "run", "end", "has", "had", + "did", "was", "are", "may", "its", "our", "out", "off", "you", "yes", + "with", "from", "that", "this", "will", "have", "been", "they", "them", + "then", "than", "when", "what", "some", "more", "also", "only", "just", + "back", "here", "each", "like", "make", "your", "into", "over", "such", + "done", "true", "false", "none", "null", "save", "edit", "copy", "date", + "time", "name", "type", "data", "sent", "open", "next", "last", "show", + "hide", "note", "test", "text", "link", "file", "list", "view", "size", + "both", "same", "live", "line", +}) + + +def find_missing_terms(source_pairs, glossary, docs_path, min_occurrences=5): + """Find source terms that appear in docs but aren't in the glossary. + + Filters aggressively to surface only genuinely useful terminology: + - 6+ characters or multi-word (contains a space) + - Not a common English word + - Appears at least min_occurrences times in docs + """ + glossary_lower = {k.lower() for k in glossary} + candidates = {} + + for en_val, trans_val in source_pairs.items(): + if len(en_val) > 50: + continue + if en_val.lower() in glossary_lower: + continue + if re.match(r'^[\d\s{}\-_.]+$', en_val): + continue + if en_val.lower() in COMMON_WORDS: + continue + has_space = " " in en_val.strip() + if not has_space and len(en_val) < 6: + continue + if en_val == trans_val: + continue + candidates[en_val] = trans_val + + if not candidates: + return [] + + docs_content = _load_docs_content(docs_path) + docs_lower = docs_content.lower() + + missing = [] + for en_val, trans_val in candidates.items(): + count = docs_lower.count(en_val.lower()) + if count >= min_occurrences: + missing.append({ + "term": en_val, + "source_translation": trans_val, + "frequency_in_docs": count, + }) + + missing.sort(key=lambda x: -x["frequency_in_docs"]) + return missing[:200] + + +_docs_cache = {} + +def _load_docs_content(docs_path): + """Load and cache all English docs content as one big string.""" + key = str(docs_path) + if key in _docs_cache: + return _docs_cache[key] + + parts = [] + for md in Path(docs_path).rglob("*.md"): + try: + parts.append(md.read_text(errors="replace")) + except OSError: + pass + content = "\n".join(parts) + _docs_cache[key] = content + return content + + +# --------------------------------------------------------------------------- +# Report generation +# --------------------------------------------------------------------------- + +def generate_markdown_report(report): + """Generate a human-readable markdown summary from the audit report.""" + lines = ["# Glossary Audit Report\n"] + + stats = report["stats"] + lines.append(f"**Languages audited:** {stats['languages_audited']}") + lines.append(f"**Glossary entries checked:** {stats['total_glossary_entries']}") + lines.append(f"**Source strings scanned:** {stats['total_source_strings']}") + lines.append(f"**Mismatches found:** {stats['total_mismatches']}") + lines.append(f"**Missing high-value terms:** {stats['total_missing']}") + lines.append("") + + for lang_key, lang_data in sorted(report["languages"].items()): + mismatches = lang_data.get("mismatches", []) + missing = lang_data.get("missing", []) + if not mismatches and not missing: + continue + + lines.append(f"## {lang_key}\n") + + if mismatches: + exact = [m for m in mismatches if m["match_type"] == "exact"] + substr = [m for m in mismatches if m["match_type"] == "substring"] + + if exact: + lines.append("### Exact mismatches\n") + lines.append("| Term | Glossary | Source (UI) | Source repo |") + lines.append("|------|----------|-------------|-------------|") + for m in exact: + lines.append( + f"| {m['term']} | {m['glossary_value']} " + f"| {m['source_value']} | {m['source']} |" + ) + lines.append("") + + if substr: + lines.append("### Substring mismatches\n") + lines.append("| Term | Glossary | Source English | Source Translation | Source repo |") + lines.append("|------|----------|---------------|-------------------|-------------|") + for m in substr[:30]: + lines.append( + f"| {m['term']} | {m['glossary_value']} " + f"| {m.get('source_english', '')} " + f"| {m['source_value']} | {m['source']} |" + ) + if len(substr) > 30: + lines.append(f"\n*...and {len(substr) - 30} more*\n") + lines.append("") + + if missing: + lines.append("### Missing terms (appear in docs but not in glossary)\n") + lines.append("| Term | Source Translation | Docs occurrences |") + lines.append("|------|--------------------|-----------------|") + for m in missing[:50]: + lines.append( + f"| {m['term']} | {m['source_translation']} " + f"| {m['frequency_in_docs']} |" + ) + if len(missing) > 50: + lines.append(f"\n*...and {len(missing) - 50} more*\n") + lines.append("") + + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +def run_audit(args): + docs_path = REPO_ROOT / "_docs" + + # Resolve repo paths -- default to sibling directories of braze-docs + parent = REPO_ROOT.parent + platform_repo = Path(args.platform_repo or os.environ.get( + "PLATFORM_REPO", str(parent / "platform"))) + android_repo = Path(args.android_repo or os.environ.get( + "ANDROID_SDK_REPO", str(parent / "braze-android-sdk"))) + swift_repo = Path(args.swift_repo or os.environ.get( + "SWIFT_SDK_REPO", str(parent / "braze-swift-sdk"))) + grapesjs_repo = Path(args.grapesjs_repo or os.environ.get( + "GRAPESJS_REPO", str(parent / "grapesjs"))) + + report = {"languages": {}, "stats": {}} + total_mismatches = 0 + total_missing = 0 + total_glossary_entries = 0 + total_source_strings = 0 + + for lang_key, mappings in LANG_MAP.items(): + glossary_path = GLOSSARY_DIR / f"{lang_key}.json" + if not glossary_path.exists(): + print(f" SKIP {lang_key}: no glossary file") + continue + + glossary = json.loads(glossary_path.read_text()) + total_glossary_entries += len(glossary) + + print(f"\nAuditing {lang_key} ({len(glossary)} glossary entries)...") + + all_source_pairs = {} + all_mismatches = [] + + # Platform + if platform_repo.is_dir(): + print(f" Parsing platform ({mappings['platform']})...") + pairs = parse_platform(platform_repo, mappings["platform"]) + print(f" {len(pairs)} string pairs loaded") + total_source_strings += len(pairs) + all_source_pairs.update(pairs) + mismatches = find_mismatches(glossary, pairs, "platform") + all_mismatches.extend(mismatches) + if mismatches: + print(f" {len(mismatches)} mismatches found") + else: + print(f" SKIP platform: {platform_repo} not found") + + # Android SDK + if android_repo.is_dir(): + pairs = parse_android_sdk(android_repo, mappings["android"]) + total_source_strings += len(pairs) + all_source_pairs.update(pairs) + mismatches = find_mismatches(glossary, pairs, "android-sdk") + all_mismatches.extend(mismatches) + if pairs: + print(f" Android SDK: {len(pairs)} pairs, {len(mismatches)} mismatches") + + # Swift SDK + if swift_repo.is_dir(): + pairs = parse_swift_sdk(swift_repo, mappings["swift"]) + total_source_strings += len(pairs) + all_source_pairs.update(pairs) + mismatches = find_mismatches(glossary, pairs, "swift-sdk") + all_mismatches.extend(mismatches) + if pairs: + print(f" Swift SDK: {len(pairs)} pairs, {len(mismatches)} mismatches") + + # GrapesJS + if grapesjs_repo.is_dir() and mappings["grapesjs"]: + pairs = parse_grapesjs(grapesjs_repo, mappings["grapesjs"]) + total_source_strings += len(pairs) + all_source_pairs.update(pairs) + mismatches = find_mismatches(glossary, pairs, "grapesjs") + all_mismatches.extend(mismatches) + if pairs: + print(f" GrapesJS: {len(pairs)} pairs, {len(mismatches)} mismatches") + + # Missing terms (use the already-loaded source pairs) + if all_source_pairs: + print(f" Scanning docs for missing high-value terms...") + missing = find_missing_terms(all_source_pairs, glossary, docs_path) + print(f" {len(missing)} missing terms found") + else: + missing = [] + + report["languages"][lang_key] = { + "glossary_entries": len(glossary), + "source_pairs": len(all_source_pairs), + "mismatches": all_mismatches, + "missing": missing, + } + total_mismatches += len(all_mismatches) + total_missing += len(missing) + + report["stats"] = { + "languages_audited": len(report["languages"]), + "total_glossary_entries": total_glossary_entries, + "total_source_strings": total_source_strings, + "total_mismatches": total_mismatches, + "total_missing": total_missing, + } + + # Write JSON report + output = Path(args.output) + output.write_text(json.dumps(report, indent=2, ensure_ascii=False)) + print(f"\nJSON report written to {output}") + + # Write markdown report + md_output = output.with_suffix(".md") + md_output.write_text(generate_markdown_report(report)) + print(f"Markdown report written to {md_output}") + + print(f"\nAudit complete:") + print(f" Languages: {report['stats']['languages_audited']}") + print(f" Mismatches: {total_mismatches}") + print(f" Missing: {total_missing}") + + return 1 if total_mismatches > 0 or total_missing > 0 else 0 + + +def main(): + parser = argparse.ArgumentParser(description="Audit glossaries against source repos") + parser.add_argument("--platform-repo", help="Path to platform repo") + parser.add_argument("--android-repo", help="Path to braze-android-sdk repo") + parser.add_argument("--swift-repo", help="Path to braze-swift-sdk repo") + parser.add_argument("--grapesjs-repo", help="Path to grapesjs repo") + parser.add_argument( + "--output", default="glossary_audit_report.json", + help="Output path for the JSON report (default: glossary_audit_report.json)", + ) + args = parser.parse_args() + sys.exit(run_audit(args)) + + +if __name__ == "__main__": + main() diff --git a/scripts/auto_translate.py b/scripts/auto_translate.py index b55d20e3fa4..c2d7fe412f5 100755 --- a/scripts/auto_translate.py +++ b/scripts/auto_translate.py @@ -4,6 +4,7 @@ Usage: python auto_translate.py translate --changed-files changed_files.txt + python auto_translate.py qc python auto_translate.py verify --max-attempts 3 python auto_translate.py summary """ @@ -15,14 +16,18 @@ import subprocess import sys import time +from collections import Counter from concurrent.futures import ThreadPoolExecutor, as_completed from pathlib import Path -try: - from anthropic import Anthropic -except ImportError: - print("ERROR: Install the Anthropic SDK: pip install anthropic") - sys.exit(1) +def _get_anthropic_client(): + """Lazy-import Anthropic so commands like qc/summary work without the SDK.""" + try: + from anthropic import Anthropic + except ImportError: + print("ERROR: Install the Anthropic SDK: pip install anthropic") + sys.exit(1) + return Anthropic() LANGUAGES = { @@ -35,11 +40,30 @@ } MODEL = os.environ.get("TRANSLATION_MODEL", "claude-opus-4-6") -MAX_TOKENS = 16384 +MAX_TOKENS = int(os.environ.get("TRANSLATION_MAX_TOKENS", "65536")) +MAX_FILE_KB = int(os.environ.get("TRANSLATION_MAX_FILE_KB", "130")) MAX_WORKERS = int(os.environ.get("TRANSLATION_WORKERS", "6")) REPO_ROOT = Path(os.environ.get("GITHUB_WORKSPACE", Path.cwd())) RESULTS_FILE = REPO_ROOT / "translation_results.json" GLOSSARY_DIR = REPO_ROOT / "scripts" / "glossaries" +STYLEGUIDE_DIR = REPO_ROOT / "scripts" / "styleguides" +QC_RESULTS_FILE = REPO_ROOT / "qc_results.json" + +NON_TRANSLATABLE_FM_KEYS = frozenset({ + "page_order", "layout", "page_type", "channel", "platform", "tool", + "link", "image", "permalink", "hidden", "noindex", "config_only", + "search_rank", "page_layout", +}) + +BRAZE_PRODUCT_NAMES = [ + "Content Cards", "Content Blocks", "Push Stories", "In-App Messages", + "REST API", "News Feed", "Canvases", "Canvas", "Currents", "Campaigns", + "Campaign", "Segments", "Segment", "Braze", "Liquid", "SDK", "API", +] + +COMPLETENESS_MIN_RATIO = float(os.environ.get("QC_MIN_RATIO", "0.6")) +COMPLETENESS_MAX_RATIO = float(os.environ.get("QC_MAX_RATIO", "1.6")) +UNTRANSLATED_BLOCK_THRESHOLD = 200 def load_prompt(): @@ -47,6 +71,16 @@ def load_prompt(): return (REPO_ROOT / "scripts" / "translation_prompt.md").read_text() +def load_styleguide(lang_key): + """Load the style guide for a language. Returns '' if not found.""" + sg_path = STYLEGUIDE_DIR / f"{lang_key}.md" + if sg_path.exists(): + content = sg_path.read_text().strip() + if content: + return f"\n\n## Style guide for this language\n\n{content}" + return "" + + def load_glossary(lang_key): """Load the terminology glossary for a language. Returns {} if not found.""" glossary_path = GLOSSARY_DIR / f"{lang_key}.json" @@ -96,17 +130,26 @@ def strip_code_fences(text): def call_claude(client, system_prompt, user_message, retries=3): - """Call the Claude API with exponential-backoff retry.""" + """Call the Claude API via streaming with exponential-backoff retry.""" for attempt in range(retries): try: - response = client.messages.create( + text_chunks = [] + stop_reason = None + with client.messages.stream( model=MODEL, max_tokens=MAX_TOKENS, temperature=0, system=system_prompt, messages=[{"role": "user", "content": user_message}], - ) - return strip_code_fences(response.content[0].text) + ) as stream: + for text in stream.text_stream: + text_chunks.append(text) + stop_reason = stream.get_final_message().stop_reason + full_text = "".join(text_chunks) + if stop_reason == "max_tokens": + print(f" WARNING: output truncated (hit {MAX_TOKENS} token limit). " + "Consider increasing TRANSLATION_MAX_TOKENS.") + return strip_code_fences(full_text) except Exception as exc: if attempt < retries - 1: wait = 2 ** (attempt + 1) @@ -116,9 +159,9 @@ def call_claude(client, system_prompt, user_message, retries=3): raise -def translate_file(client, prompt, english_content, existing_translation, language_name, glossary_section=""): +def translate_file(client, prompt, english_content, existing_translation, language_name, extra_context=""): """Translate a single English file into the target language.""" - system = prompt + glossary_section + system = prompt + extra_context user_msg = f"## Target language\n{language_name}\n\n" user_msg += f"## English source (translate this)\n\n{english_content}\n\n" @@ -164,9 +207,8 @@ def fix_file(client, prompt, translated_content, build_error, language_name): (Canvas, Currents, Content Cards, etc.) must stay in English. 4. **Preservation**: Verify that Liquid tags, code blocks, URLs, front matter keys, \ HTML tags, and markdown formatting are intact and unmodified. -5. **Gender**: In Portuguese, "Braze" is feminine (a Braze, da Braze, para a Braze — \ -never o Braze, do Braze, para o Braze). In French, Spanish, and German, follow the \ -existing article conventions for the brand name. +5. **Style guide**: Follow all rules in the language-specific style guide appended \ +below (gender conventions, register, terminology preferences, etc.). 6. **Consistency**: Ensure consistent terminology and tone throughout the file. Return ONLY the improved translated file — no explanations, no code fences, \ @@ -174,9 +216,9 @@ def fix_file(client, prompt, translated_content, build_error, language_name): """ -def review_file(client, english_content, translated_content, language_name, glossary_section=""): +def review_file(client, english_content, translated_content, language_name, extra_context=""): """Second-pass review of a translation for quality improvement.""" - system = REVIEW_PROMPT + glossary_section + system = REVIEW_PROMPT + extra_context user_msg = f"## Target language\n{language_name}\n\n" user_msg += f"## English source\n\n{english_content}\n\n" @@ -206,22 +248,23 @@ def save_results(results): # --------------------------------------------------------------------------- def translate_one(client, prompt, fpath, relative, english_content, - lang_key, lang_info, glossary): + lang_key, lang_info, glossary, styleguide): """Translate + review a single file into one language. Returns a result dict.""" target = translation_path(relative, lang_info["dir"]) existing = target.read_text() if target.exists() else None filtered = filter_glossary(glossary, english_content) glossary_section = format_glossary_for_prompt(filtered) + extra_context = styleguide + glossary_section try: translated = translate_file( client, prompt, english_content, existing, - lang_info["name"], glossary_section, + lang_info["name"], extra_context, ) translated = review_file( client, english_content, translated, - lang_info["name"], glossary_section, + lang_info["name"], extra_context, ) target.parent.mkdir(parents=True, exist_ok=True) target.write_text(translated) @@ -258,18 +301,40 @@ def cmd_translate(args): print("No English .md files changed. Nothing to translate.") return - total_tasks = len(md_files) * len(LANGUAGES) - print(f"Translating {len(md_files)} file(s) into {len(LANGUAGES)} language(s) " - f"({total_tasks} tasks, {MAX_WORKERS} workers)\n") + skipped = [] + translatable = [] + for fpath in md_files: + size_kb = (REPO_ROOT / fpath).stat().st_size / 1024 + if size_kb > MAX_FILE_KB: + skipped.append({"source": fpath, "size_kb": round(size_kb)}) + print(f" SKIP: {fpath} ({round(size_kb)} KB exceeds {MAX_FILE_KB} KB limit)") + else: + translatable.append(fpath) + + if not translatable: + print("All changed files exceed the size limit. Nothing to translate.") + results = load_results() + results["skipped"] = skipped + save_results(results) + return + + total_tasks = len(translatable) * len(LANGUAGES) + print(f"Translating {len(translatable)} file(s) into {len(LANGUAGES)} language(s) " + f"({total_tasks} tasks, {MAX_WORKERS} workers)") + if skipped: + print(f" ({len(skipped)} file(s) skipped — too large for single-pass translation)") + print() - client = Anthropic() + client = _get_anthropic_client() prompt = load_prompt() results = load_results() + results["skipped"] = skipped glossaries = {lang: load_glossary(lang) for lang in LANGUAGES} + styleguides = {lang: load_styleguide(lang) for lang in LANGUAGES} futures = {} with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool: - for fpath in md_files: + for fpath in translatable: relative = str(Path(fpath).relative_to("_docs")) english_content = (REPO_ROOT / fpath).read_text() @@ -277,7 +342,7 @@ def cmd_translate(args): future = pool.submit( translate_one, client, prompt, fpath, relative, english_content, lang_key, lang_info, - glossaries[lang_key], + glossaries[lang_key], styleguides[lang_key], ) futures[future] = (relative, lang_info["name"]) @@ -310,6 +375,336 @@ def cmd_translate(args): print(f"\nTranslation complete: {ok} succeeded, {fail} failed") +# --------------------------------------------------------------------------- +# QC checks and repairs +# --------------------------------------------------------------------------- + +def _extract_front_matter(content): + """Extract YAML front matter and body from a markdown file.""" + match = re.match(r'^---\s*\n(.*?)\n---\s*\n', content, re.DOTALL) + if match: + return match.group(1), content[match.end():] + return None, content + + +def _extract_fm_block(fm_str, key): + """Extract a full YAML block for a key (key line + indented continuation).""" + lines = fm_str.split('\n') + block_lines = [] + in_block = False + for line in lines: + if not in_block and re.match(rf'^{re.escape(key)}\s*:', line): + in_block = True + block_lines.append(line) + elif in_block: + if line and line[0] in (' ', '\t'): + block_lines.append(line) + else: + break + return '\n'.join(block_lines) if block_lines else None + + +def repair_front_matter(english_content, translated_content): + """Ensure non-translatable front matter values match the English source.""" + en_fm, _ = _extract_front_matter(english_content) + tr_fm, tr_body = _extract_front_matter(translated_content) + + if not en_fm or not tr_fm: + return translated_content, [] + + repairs = [] + repaired_fm = tr_fm + + for key in sorted(NON_TRANSLATABLE_FM_KEYS): + en_block = _extract_fm_block(en_fm, key) + tr_block = _extract_fm_block(repaired_fm, key) + + if en_block and tr_block and en_block != tr_block: + repaired_fm = repaired_fm.replace(tr_block, en_block) + repairs.append(f"front_matter:{key} — restored from English") + elif en_block and not tr_block: + repaired_fm = repaired_fm.rstrip() + '\n' + en_block + repairs.append(f"front_matter:{key} — re-added missing key") + + if repairs: + translated_content = f"---\n{repaired_fm}\n---\n{tr_body}" + + return translated_content, repairs + + +def _extract_code_blocks(content): + """Extract fenced code blocks with positions.""" + pattern = re.compile(r'(^```[^\n]*\n)(.*?)(^```\s*$)', re.MULTILINE | re.DOTALL) + return [ + (m.start(), m.end(), m.group(0), m.group(2)) + for m in pattern.finditer(content) + ] + + +def repair_code_blocks(english_content, translated_content): + """Replace translated code block contents with English originals.""" + en_blocks = _extract_code_blocks(english_content) + tr_blocks = _extract_code_blocks(translated_content) + + if not en_blocks: + return translated_content, [] + + if len(en_blocks) != len(tr_blocks): + return translated_content, [ + f"code_blocks — count mismatch (English: {len(en_blocks)}, " + f"translated: {len(tr_blocks)}); skipped auto-repair" + ] + + repairs = [] + repaired = translated_content + for i in range(len(en_blocks) - 1, -1, -1): + en_full = en_blocks[i][2] + tr_full = tr_blocks[i][2] + if en_full != tr_full: + repaired = ( + repaired[:tr_blocks[i][0]] + en_full + repaired[tr_blocks[i][1]:] + ) + repairs.append(f"code_block[{i}] — restored English content") + + return repaired, repairs + + +def _extract_md_link_urls(content): + """Extract markdown link/image URLs in order.""" + return re.findall(r'\[(?:[^\]]*)\]\(([^)]+)\)', content) + + +def repair_urls(english_content, translated_content): + """Ensure markdown link URLs match the English source.""" + en_urls = _extract_md_link_urls(english_content) + tr_urls = _extract_md_link_urls(translated_content) + + if not en_urls: + return translated_content, [] + + if len(en_urls) != len(tr_urls): + return translated_content, [ + f"urls — count mismatch (English: {len(en_urls)}, " + f"translated: {len(tr_urls)}); skipped auto-repair" + ] + + repairs = [] + repaired = translated_content + for i, (en_url, tr_url) in enumerate(zip(en_urls, tr_urls)): + if en_url != tr_url: + repaired = repaired.replace(f"]({tr_url})", f"]({en_url})", 1) + repairs.append(f"url[{i}] — restored '{en_url}'") + + return repaired, repairs + + +def check_liquid_tags(english_content, translated_content): + """Check that Liquid tags are preserved between source and translation.""" + warnings = [] + + en_exprs = set(re.findall(r'\{\{.*?\}\}', english_content)) + tr_exprs = set(re.findall(r'\{\{.*?\}\}', translated_content)) + for expr in sorted(en_exprs - tr_exprs): + warnings.append(f"liquid_expr — missing: {expr}") + + en_tags = re.findall(r'\{%[-\s]*(.*?)[-\s]*%\}', english_content) + tr_tags = re.findall(r'\{%[-\s]*(.*?)[-\s]*%\}', translated_content) + + def tag_name(t): + return t.strip().split()[0] if t.strip() else "" + + en_counts = Counter(tag_name(t) for t in en_tags) + tr_counts = Counter(tag_name(t) for t in tr_tags) + + for tag, count in en_counts.items(): + tr_count = tr_counts.get(tag, 0) + if tr_count < count: + warnings.append( + f"liquid_tag — '{tag}' appears {count}x in English but " + f"{tr_count}x in translation" + ) + + return warnings + + +def check_glossary_compliance(english_content, translated_content, lang_key): + """Check that Braze product names are kept in English.""" + _, en_body = _extract_front_matter(english_content) + _, tr_body = _extract_front_matter(translated_content) + + code_re = re.compile(r'```.*?```', re.DOTALL) + en_clean = code_re.sub('', en_body) + tr_clean = code_re.sub('', tr_body) + + warnings = [] + for name in BRAZE_PRODUCT_NAMES: + en_count = en_clean.lower().count(name.lower()) + if en_count < 2: + continue + tr_count = tr_clean.lower().count(name.lower()) + if tr_count < en_count * 0.5: + warnings.append( + f"glossary — '{name}' appears {en_count}x in English but " + f"only {tr_count}x in translation" + ) + + return warnings + + +def check_completeness(english_content, translated_content): + """Flag translations whose length deviates significantly from the source.""" + en_len = len(english_content) + if en_len == 0: + return [] + + ratio = len(translated_content) / en_len + if ratio < COMPLETENESS_MIN_RATIO: + return [ + f"completeness — translation is {ratio:.0%} of English length " + f"(min threshold: {COMPLETENESS_MIN_RATIO:.0%}); possible truncation" + ] + if ratio > COMPLETENESS_MAX_RATIO: + return [ + f"completeness — translation is {ratio:.0%} of English length " + f"(max threshold: {COMPLETENESS_MAX_RATIO:.0%}); possible hallucination" + ] + return [] + + +def check_untranslated(english_content, translated_content): + """Detect large blocks of English prose left verbatim in the translation.""" + _, en_body = _extract_front_matter(english_content) + _, tr_body = _extract_front_matter(translated_content) + + strip_patterns = [ + (re.compile(r'```.*?```', re.DOTALL), ''), + (re.compile(r'\{[%{].*?[%}]\}'), ''), + (re.compile(r'`[^`]+`'), ''), + (re.compile(r'\]\([^)]+\)'), ''), + (re.compile(r'https?://\S+'), ''), + ] + + en_clean = en_body + tr_clean = tr_body + for pattern, repl in strip_patterns: + en_clean = pattern.sub(repl, en_clean) + tr_clean = pattern.sub(repl, tr_clean) + + warnings = [] + for para in re.split(r'\n\s*\n', en_clean): + text = para.strip() + if len(text) < UNTRANSLATED_BLOCK_THRESHOLD: + continue + if text in tr_clean: + preview = text[:80].replace('\n', ' ') + warnings.append( + f"untranslated — {len(text)}-char English block found verbatim: " + f"\"{preview}...\"" + ) + + return warnings + + +def qc_check_file(english_path, translated_path, lang_key): + """Run all QC checks on one file pair. Auto-repairs are written back.""" + english_content = Path(english_path).read_text() + translated_content = Path(translated_path).read_text() + + findings = { + "file": str(translated_path), + "lang": lang_key, + "repairs": [], + "warnings": [], + } + + translated_content, fm_repairs = repair_front_matter( + english_content, translated_content + ) + findings["repairs"].extend(fm_repairs) + + translated_content, cb_repairs = repair_code_blocks( + english_content, translated_content + ) + findings["repairs"].extend(cb_repairs) + + translated_content, url_repairs = repair_urls( + english_content, translated_content + ) + findings["repairs"].extend(url_repairs) + + if findings["repairs"]: + Path(translated_path).write_text(translated_content) + + findings["warnings"].extend( + check_liquid_tags(english_content, translated_content) + ) + findings["warnings"].extend( + check_glossary_compliance(english_content, translated_content, lang_key) + ) + findings["warnings"].extend( + check_completeness(english_content, translated_content) + ) + findings["warnings"].extend( + check_untranslated(english_content, translated_content) + ) + + return findings + + +def cmd_qc(_args): + """Run deterministic quality checks on all translated files.""" + results = load_results() + translated = results.get("translated", []) + + if not translated: + print("No translations to QC.") + return + + print(f"Running QC checks on {len(translated)} translated file(s)...\n") + + all_findings = [] + repair_count = 0 + warning_count = 0 + + for entry in translated: + source_path = REPO_ROOT / entry["source"] + target_path = REPO_ROOT / entry["target"] + + if not source_path.exists() or not target_path.exists(): + print(f" Skipping {entry['target']} — file not found") + continue + + findings = qc_check_file(source_path, target_path, entry["lang"]) + + n_repairs = len(findings["repairs"]) + n_warnings = len(findings["warnings"]) + repair_count += n_repairs + warning_count += n_warnings + + if n_repairs or n_warnings: + all_findings.append(findings) + parts = [] + if n_repairs: + parts.append(f"{n_repairs} repaired") + if n_warnings: + parts.append(f"{n_warnings} warnings") + print(f" {entry['target']} — {', '.join(parts)}") + else: + print(f" {entry['target']} — passed") + + qc_data = { + "total_files": len(translated), + "files_with_issues": len(all_findings), + "total_repairs": repair_count, + "total_warnings": warning_count, + "findings": all_findings, + } + QC_RESULTS_FILE.write_text(json.dumps(qc_data, indent=2)) + + print(f"\nQC complete: {len(translated)} files checked, " + f"{repair_count} auto-repairs, {warning_count} warnings") + + # --------------------------------------------------------------------------- # verify (build + fix loop) # --------------------------------------------------------------------------- @@ -334,7 +729,7 @@ def extract_error_files(error_output, lang_dir): def cmd_verify(args): """Build each translated language; auto-fix errors up to N times.""" - client = Anthropic() + client = _get_anthropic_client() prompt = load_prompt() results = load_results() @@ -408,6 +803,7 @@ def cmd_summary(_args): results = load_results() translated = results.get("translated", []) failed = results.get("failed", []) + skipped = results.get("skipped", []) build = results.get("build_results", {}) lines = ["## Auto-translation summary\n"] @@ -417,8 +813,18 @@ def cmd_summary(_args): lines.append(f"**Translation files created/updated:** {len(translated)} ") if failed: lines.append(f"**Translation API failures:** {len(failed)} ") + if skipped: + lines.append(f"**Files skipped (too large):** {len(skipped)} ") lines.append("") + if skipped: + lines.append("### Skipped files (exceed size limit)\n") + lines.append("These files are too large for single-pass LLM translation and " + "need manual translation or a chunked approach.\n") + for item in sorted(skipped, key=lambda x: -x["size_kb"]): + lines.append(f"- `{item['source']}` ({item['size_kb']} KB)") + lines.append("") + # Build verification table if build: lines.append("### Build verification\n") @@ -442,6 +848,61 @@ def cmd_summary(_args): lines.append(f"```\n{item.get('error', 'No error details available')}\n```\n") lines.append("\n") + # QC checks + if QC_RESULTS_FILE.exists(): + qc = json.loads(QC_RESULTS_FILE.read_text()) + total_repairs = qc.get("total_repairs", 0) + total_warnings = qc.get("total_warnings", 0) + + if total_repairs or total_warnings: + lines.append("### Quality checks\n") + + lang_stats = {} + for f in qc.get("findings", []): + lang = f["lang"] + if lang not in lang_stats: + lang_stats[lang] = {"repairs": 0, "warnings": 0, "details": []} + lang_stats[lang]["repairs"] += len(f.get("repairs", [])) + lang_stats[lang]["warnings"] += len(f.get("warnings", [])) + for r in f.get("repairs", []): + lang_stats[lang]["details"].append(f"[repaired] {r}") + for w in f.get("warnings", []): + lang_stats[lang]["details"].append(f"[warning] {w}") + + lines.append("| Language | Repairs | Warnings | Status |") + lines.append("|----------|---------|----------|--------|") + for lang_key in sorted(LANGUAGES): + if lang_key not in lang_stats: + lines.append( + f"| {LANGUAGES[lang_key]['name']} | 0 | 0 | Passed |" + ) + continue + s = lang_stats[lang_key] + if s["warnings"]: + status = "Needs review" + elif s["repairs"]: + status = "Auto-repaired" + else: + status = "Passed" + lines.append( + f"| {LANGUAGES[lang_key]['name']} | {s['repairs']} | " + f"{s['warnings']} | {status} |" + ) + lines.append("") + + for lang_key in sorted(lang_stats): + s = lang_stats[lang_key] + if not s["details"]: + continue + name = LANGUAGES[lang_key]["name"] + count = len(s["details"]) + lines.append( + f"
{name} — {count} finding(s)\n" + ) + for d in s["details"]: + lines.append(f"- {d}") + lines.append("\n
\n") + # Translated files grouped by source if translated: lines.append("### Files translated\n") @@ -482,6 +943,9 @@ def main(): ) vp.set_defaults(func=cmd_verify) + qp = sub.add_parser("qc", help="Run deterministic quality checks on translations") + qp.set_defaults(func=cmd_qc) + sp = sub.add_parser("summary", help="Generate a PR body from translation results") sp.set_defaults(func=cmd_summary) diff --git a/scripts/glossaries/de.json b/scripts/glossaries/de.json index ad03fb90e93..c7d271fc717 100644 --- a/scripts/glossaries/de.json +++ b/scripts/glossaries/de.json @@ -5,21 +5,26 @@ "ABKContentCard": "ABKContentCard", "About Us": "Über uns", "accelerated mobile pages": "Accelerated Mobile Pages", + "Account": "Konto", "account manager": "Account Manager", "Accuweather": "Accuweather", "ace tip": "ACE-Tipp", "acquisition cost": "Akquisitionskosten", "acquisition form": "Eingabeformular", + "Action": "Aktion", "action button": "Aktions-Button", "action path": "Aktions-Pfad", - "Action Paths": "Aktions-Pfade", + "Action Paths": "Aktionspfade", "action-based delivery": "aktionsbasierte Zustellung", "actionable insights": "umsetzbare Insights", "ActionRocket": "ActionRocket", + "Actions": "Aktionen", "actionType": "Aktionstyp", + "Active": "Aktiv", "Active User": "aktive:r Nutzer:in", "ad serving": "Adserving", "ad technology": "Werbetechnologie", + "Address": "Adresse", "Adjust": "Adjust", "ADM": "ADM", "administrative tool": "Admin-Tool", @@ -28,6 +33,7 @@ "advancement": "Fortschritt", "advancement behavoir": "Fortschrittsverhalten", "affinity": "Affinität", + "Age is": "Alter ist", "agile": "agil", "agility": "Agilität", "AI": "KI", @@ -51,6 +57,7 @@ "anonymous users": "anonyme Nutzer:innen", "anti-spam filtering": "Anti-Spam-Filter", "API": "API", + "API ID": "API-ID", "API key": "API-Schlüssel", "APIs": "APIs", "APN": "APN", @@ -64,18 +71,25 @@ "Application Programming Interface (API)": "Application Programming Interface, API", "Appsflyer": "Appsflyer", "Apteligent": "Apteligent", + "Archive": "Archivieren", "array of strings": "String-Array", + "Article": "Artikel", "artificial intelligence": "künstliche Intelligenz", + "Assign": "Zuweisen", + "at a": "bei", "attribute": "Attribut", + "Attributes": "Attribute", "attribution": "Attribution", "attrition": "Abwanderung", "audience": "Zielgruppe", "audience builder": "Audience-Builder", "audience filter": "Zielgruppen-Filter", - "audience path": "Zielgruppen-Pfad", - "Audience Paths": "Zielgruppen-Pfade", + "audience path": "Zielgruppenpfad", + "Audience Paths": "Zielgruppenpfade", "audiences": "Zielgruppen", "audio file": "Audio-Datei", + "Authentication": "Authentifizierung", + "Authorization": "Autorisierung", "automation": "Automatisierung", "AWS": "AWS", "AWS Personalize": "AWS Personalize", @@ -84,20 +98,27 @@ "Azure": "Azure", "Azure Active Directory": "Azure Active Directory", "backend": "Backend", + "Background": "Hintergrund", "badge": "Badge", "Baidu": "Baidu", "banner content card": "Banner-Content-Card", "Barbarian": "Barbarian", "BCC": "BCC", + "Before": "Vor", + "Behavior": "Verhalten", "behavior-based automation": "verhaltensbasierte Automatisierung", "behavioral analytics": "Verhaltensanalysen", "behavioral data": "Verhaltensdaten", "beta service": "Beta-Service", "blank": "leer", + "Blocks": "Blöcke", "Bluedot": "Bluedot", "Bonfire": "Bonfire", + "Boolean": "Boolescher Wert", "boolean value": "boolescher Wert", + "Border": "Rahmen", "Bottle Rocket": "Bottle Rocket", + "Bounce": "Absprung", "bounce rate": "Absprungrate", "Branch": "Branch", "Brandenburg": "Brandenburg", @@ -117,10 +138,12 @@ "breakdown": "Aufschlüsselung", "BroadcastReceiver": "BroadcastReceiver", "Broken vs Brilliant": "Flop-Top-Vergleich", + "Browse": "Durchsuchen", "BSD": "BSD", "bucket": "Bucket", "bucket name": "Bucket-Name", "build relationships": "Beziehungen aufbauen", + "Business": "Unternehmen", "business goal": "Geschäftsziel", "business intelligence": "Business-Intelligence", "button": "Button", @@ -131,6 +154,7 @@ "calendar": "Kalender", "callback": "Callback", "campaign": "Kampagne", + "Campaign or Canvas": "Kampagne oder Canvas", "campaign variant": "Kampagnenvariante", "campaigns": "Kampagnen", "Canvas": "Canvas", @@ -145,15 +169,21 @@ "cart": "Warenkorb", "cart abandonment": "abgebrochener Einkauf", "Case Study": "Anwendungsbeispiel", + "Catalog": "Katalog", + "Catalogs": "Kataloge", + "Category": "Kategorie", "CC": "CC", "CDN": "CDN", "Census": "Census", + "Center": "Zentriert", "Certona": "Certona", "Changelog": "Changelog", "channel": "Kanal", "channel agnostic": "kanalagnostisch", "channel enhancement": "Kanalverbesserung", "channel-centric messaging": "kanalorientiertes Messaging", + "Channel:": "Kanal:", + "Channels": "Kanäle", "chart": "Chart", "churn": "abwandern", "Churn Automation": "Abwanderungs-Automatisierung", @@ -173,6 +203,8 @@ "click": "Klick", "click rate": "Klickrate", "click-through": "Click-through", + "Clicked": "Angeklickt", + "Clicks": "Klicks", "client": "Client", "client database": "Client-Datenbank", "client ID": "Client-ID", @@ -189,13 +221,27 @@ "cohort": "Kohorte", "cohort import": "Kohortenimport", "Cohorts": "Kohorten", + "Column": "Spalte", "comment": "Kommentar", "community": "Community", + "Company": "Unternehmen", + "Complete": "Fertig", + "Component": "Komponente", + "Components": "Komponenten", + "Compose": "Verfassen", "computer": "Computer", "conditional logic": "bedingte Logik", + "Configuration": "Konfiguration", + "Confirm": "Bestätigen", + "Connect": "Verbinden", + "Connected": "Verbunden", "connected content": "Connected-Content", + "Connection": "Verbindung", "connector": "Konnektor", "consumer": "Verbraucher:in", + "Contact": "Kontaktieren Sie", + "Contains": "Enthält", + "Content": "Inhalt", "content block": "Content-Block", "content blocks": "Content-Blöcke", "content card": "Content-Card", @@ -205,20 +251,28 @@ "ContentCardable": "ContentCardable", "ContentCardsFragment": "ContentCardsFragment", "Contentful": "Contentful", + "Context": "Kontext", "contextual": "kontextuell", "contextual coupon": "kontextueller Gutschein", + "Control": "Kontrollgruppe", "control group": "Kontrollgruppe", "conversion": "Konversion", "conversion event": "Konversions-Event", "conversion funnel": "Konversionstrichter", "conversion rate": "Konversionsrate", + "Conversions": "Konversionen", "Convz": "Convz", "Cookie": "Cookie", "cookies": "Cookies", "cordova": "cordova", "Core Competency": "Kernkompetenz", "core value": "zentraler Wert", + "Country": "Land", + "Create": "Erstellen", "create new report": "Neuen Bericht erstellen", + "Created": "Erstellt", + "Creating": "Wird erstellt …", + "Credential": "Zugangsdaten", "credential error": "Zugangsdaten-Fehler", "credentials": "Zugangsdaten", "CRM": "CRM", @@ -235,6 +289,8 @@ "Currents": "Currents", "currents integration": "Currents-Integration", "custom": "angepasst", + "Custom Attribute": "Angepasstes Attribut", + "Custom Attributes": "Angepasste Attribute", "custom code in-app message": "In-App-Nachricht mit angepasstem Code", "custom event": "angepasstes Event", "custom events": "angepasste Events", @@ -311,6 +367,7 @@ "data stream from": "Daten-Stream von", "data stream to": "Daten-Stream zu", "data transformation": "Datentransformation", + "Data Type": "Datentyp", "data warehouse": "Data Warehouse", "data-driven": "datengestützt", "data-driven marketing": "datengestütztes Marketing", @@ -322,27 +379,37 @@ "deep linking": "Deeplinking", "default": "Standard", "default attribute": "Standardattribut", + "Delete": "Löschen", "deliverability": "Zustellbarkeit", "delivered": "zugestellt", "delivery": "Zustellung", "Deloitte Digital": "Deloitte Digital", "DEM": "DEM", + "Description": "Beschreibung", + "Description:": "Beschreibung:", + "Design": "Entwerfen", + "Destination": "Ziel", "destinations": "Ziele", "developer": "Entwickler:in", "developer console": "Entwicklungskonsole", "device": "Gerät", "device data": "Gerätedaten", + "Devices": "Geräte", "dialog field": "Dialogfeld", "dictionary": "Wörterbuch", "Digioh": "Digioh", "digital experience": "digitales Erlebnis", "Digital Experience Management": "Digital-Experience-Management", "Digitas": "Digitas", + "DIRECT": "DIREKT", "direct mail": "Direkt-Mailing", "discount code": "Rabattcode", "discount codes": "Rabattcodes", + "Display": "Anzeige", "display ad": "Display-Anzeige", "DNS": "DNS", + "Do not": "kein(e/n)", + "Document": "Dokument", "documentation": "Dokumentation", "domain": "Domain", "domains": "Domains", @@ -353,6 +420,7 @@ "drag & drop": "per Drag-and-Drop", "drag & drop editor": "Drag-and-Drop-Editor", "drop-down": "Dropdown-", + "Duplicate": "Duplizieren", "dynamic": "dynamisch", "dynamic content": "dynamischer Content", "dynamic email marketing": "dynamisches E-Mail-Marketing", @@ -366,6 +434,7 @@ "editor block": "Editor-Block", "Edume": "EduMe", "email": "E-Mail", + "Email Address": "E-Mail-Adresse", "email builder": "E-Mail-Builder", "email delivery": "E-Mail-Zustellung", "email list": "E-Mail-Liste", @@ -377,13 +446,18 @@ "email sending volume": "E-Mail-Versandvolumen", "Email Service Provider": "E-Mail-Anbieter", "email strategy": "E-Mail-Strategie", + "Email Template": "E-Mail-Template", "Email Uplers": "Email Uplers", "emailing": "mailen", + "Emails": "E-Mails", "empty field": "leeres Feld", + "Enable": "Aktivieren", + "Enabled": "Aktiviert", "enablement": "Enablement", "end-to-end": "End-to-End", "end-user": "Endnutzer:in", "endpoint": "Endpunkt", + "Endpoints": "Endpunkte", "engagement": "Engagement", "Engagement Maturity framework": "Engagement-Reifegrad-Framework", "engagement rate": "Engagement-Rate", @@ -396,18 +470,22 @@ "Entry Properties": "Eingangs-Eigenschaften", "enum": "enum", "error code": "Fehlercode", + "Errors": "Fehler", "ESP": "ESP", "ETL": "ETL", "event properties": "Event-Eigenschaften", + "Event Type": "Event-Typ", "event user log": "Event-Benutzerprotokoll", "EventStream": "EventStream", + "Everyone Else": "Alle anderen", "exception event": "Ausnahme-Event", "exception events": "Ausnahme-Events", "experiment path": "Experiment-Pfad", - "Experiment Paths Step": "Experiment-Pfad-Schritt", + "Experiment Paths Step": "Experimentpfad-Schritt", "experimentation loop": "Experiment-Loop", "expiry": "Ablauf", "exponential backoff": "exponentielles Backoff", + "Export": "Exportieren", "export code": "Exportcode", "external ID": "externe ID", "external ID migration": "externe ID-Migration", @@ -421,7 +499,9 @@ "feature": "Feature", "feature flag": "Feature-Flag", "Features": "Features", + "Fields": "Felder", "filter": "Filter", + "Filters": "Filter", "Financial Services": "Finanzdienstleistungen", "first name": "Vorname", "First-party data": "First-Party-Daten", @@ -430,10 +510,12 @@ "flash sales": "Flash-Sales", "float": "Gleitkommazahl", "Flutter": "Flutter", + "For You": "Für Sie", "forge connections": "Verbindungen herstellen", "Fortune 500": "Fortune 500", "Foursquare": "Foursquare", "Free Trial": "kostenlose Demo", + "Frequency": "Häufigkeit", "frequency capping": "Frequency-Capping", "fueled by": "powered by", "full access": "Vollzugriff", @@ -449,6 +531,8 @@ "GCM": "GCM", "GDPR": "DSGVO", "gear icon": "Zahnradsymbol", + "General": "Allgemein", + "Generate": "Generieren", "geofence": "Geofence", "geofencing": "Geofencing", "geolocation": "Geolocation", @@ -485,8 +569,10 @@ "IDFA": "Identifier for Advertisers (IDFA)", "IDFV": "Identifier for Vendors (IDFV)", "iHeartRadio": "iHeartRadio", + "images": "Bilder", "Impersonation": "Identitätswechsel", "Implicit Cost": "implizite Kosten", + "Import": "Importieren", "Impression": "Impression", "impressions": "Impressionen", "IMPROVE ACQUISITION": "AKQUISE VERBESSERN", @@ -498,6 +584,7 @@ "InAppMessageViewWrapperFactory": "InAppMessageViewWrapperFactory", "inbound": "eingehend", "inbox": "Posteingang", + "includes": "enthält", "INCREASE ENGAGEMENT": "ENGAGEMENT STEIGERN", "independent": "unabhängig", "Independent Software Vendor": "unabhängiger Software-Anbieter", @@ -508,6 +595,7 @@ "inject": "einspeisen", "Inkit": "Inkit", "inputted string": "eingegebener String", + "Insert": "Einfügen", "Inside Labs": "Inside Labs", "insight": "Insight", "insights": "Insights", @@ -516,6 +604,7 @@ "integrated data solutions": "integrierte Datenlösungen", "integration": "Integration", "integration code": "Integrationscode", + "Integrations": "Integrationen", "intelligence suite": "Intelligence Suite", "intelligent channel": "intelligenter Kanal", "intelligent selection": "intelligente Auswahl", @@ -527,9 +616,11 @@ "Internet Service Provider": "Internet-Provider", "interstitials": "Interstitials", "intuitive tool": "intuitives Tool", + "Invalid": "Ungültig", "Invisible open tracking pixel": "unsichtbarer Tracking-Pixel für Öffnungsrate", "ip warming": "IP-Warming", "Iris": "Iris", + "is not": "ist nicht", "ISP": "ISP", "ISV": "ISV", "item": "Artikel", @@ -552,12 +643,16 @@ "Kognitiv": "Kognitiv", "KPI": "KPI", "Kubit": "Kubit", + "Landing Page": "Landing-Page", + "Language": "Sprache", "lapsing users": "passive Nutzer:innen", "lasped user": "passive:r Nutzer:in", "Laughlin Constable": "Laughlin Constable", + "Launch": "Starten", "launch campaign": "Kampagne starten", "Leadfront": "Leadfront", "lean-back viewing": "Lean-Back-Medium", + "Learn more": "Mehr erfahren", "Learning": "Lernangebote", "Learning course": "Lernkurs", "legacy platform": "Legacy-Plattform", @@ -569,7 +664,7 @@ "Lifetime session": "Lifetime-Sitzung", "lifetime value": "Lifetime-Value", "Liftigniter": "Liftigniter", - "link aliasing": "Link-Aliasing", + "link aliasing": "Link Aliasing", "liquid": "Liquid", "Liquid tag": "Liquid-Tag", "Lister Digital": "Lister Digital", @@ -601,10 +696,12 @@ "mail privacy protection": "E-Mail-Datenschutz", "Mailbakery": "Mailbakery", "malicious code": "Schadcode", + "Manage": "Verwalten", "manage settings": "Einstellungen verwalten", "management tool": "Management-Tool", "Manager": "Manager:in", "mandatory": "Pflichtfeld", + "Manual": "Manuell", "mapping": "Abbildung", "marketer": "Marketer", "marketing": "Marketing", @@ -631,6 +728,8 @@ "messaging experience": "Messaging-Erlebnis", "Messaging experiences": "Messaging-Erlebnisse", "Messenger": "Messenger", + "Method": "Methode", + "Metric": "Metrik", "metrics": "Metriken", "microsoft azure": "Microsoft Azure", "mid-likelihood user": "Nutzer:in mit mittlerer Abschlusswahrscheinlichkeit", @@ -639,6 +738,7 @@ "Miltton": "Miltton", "Mixpanel": "Mixpanel", "MMS": "MMS", + "Mobile": "Mobilgerät", "MOBILE & WEB PUSH": "MOBILE UND WEB PUSH", "mobile conversations": "Mobile-Konversationen", "mobile marketing": "Mobile-Marketing", @@ -650,6 +750,9 @@ "monetization": "Monetarisierung", "monthly active user": "monatlich aktive:r Nutzer:in", "monthly report": "Monatsbericht", + "More info": "Mehr Infos", + "More Information": "Weitere Informationen", + "more than": "mehr als", "Most Used Events": "meistgenutzte Events", "Movable Ink": "Movable Ink", "Movableink": "Movableink", @@ -661,6 +764,7 @@ "multi-channel campaign": "Multichannel-Kampagne", "multichannel messaging": "Multichannel-Messaging", "multilingual emails": "Multichannel-E-Mails", + "Multiple": "Mehrere", "multivariante": "multivariant", "multivariante testing": "multivarianter Test", "Nested Custom Attributes": "verschachtelte angepasste Attribute", @@ -673,12 +777,16 @@ "Nexla": "Nexla", "niche plus heat": "persönliches, zeitnahes Marketing", "Notable Growth": "Notable Growth", + "Notification": "Benachrichtigung", "notification group": "Benachrichtigungsgruppe", + "Notifications": "Benachrichtigungen", "NPAW": "NPAW", "NuGet": "NuGet", + "Number": "Zahl", "Number of sessions per user": "Sitzungen pro Nutzer:in", "nurturing channel": "Nurturing-Kanal", "nurturing channels": "Nurturing-Kanäle", + "Object": "Objekt", "object array": "Objekt-Array", "Objective C": "Objective C", "OBJECTIVE-C": "OBJECTIVE-C", @@ -701,12 +809,14 @@ "opt-out link": "Opt-out-Link", "Optilyz": "Optilyz", "OPTIMIZE ONBOARDING": "ONBOARDING OPTIMIEREN", + "Options": "Optionen", "orchestration": "Orchestrierung", "Order Status": "Auftragsstatus", "Origin": "Herkunft", "OTT": "OTT", "out-of-the-box data": "Vorlagedaten", "outbound": "ausgehend", + "Output": "Ausgabe", "overages": "Mehrkosten", "overlay": "Overlay", "overview": "Übersicht", @@ -725,19 +835,25 @@ "Passkit": "Passkit", "password": "Passwort", "Payomatic": "Payomatic", + "Pending": "Ausstehend", "performance": "Performance", "performance marketing": "Performance-Marketing", + "Permissions": "Berechtigungen", "persistent": "persistent", "persistent banner": "persistentes Banner", "Persistent Entry Property": "persistente Eingangs-Eigenschaft", + "Personal": "Persönlich", "personalization": "Personalisierung", "personalized": "personalisiert", "Phiture": "Phiture", + "Phone Number": "Telefonnummer", "Phrasee": "Phrasee", "PII": "PII", "pinned card": "gepinnte Karte", "Pinned Cards": "gepinnte Karten", "placeholder": "Platzhalter", + "Platform": "Plattform", + "Platforms": "Plattformen", "Playable": "Playable", "Podfile": "Podfile", "policy": "Richtlinie", @@ -755,7 +871,9 @@ "predictive suite": "Predictive Suite", "predictive tool": "Prognose-Tool", "preheader": "Preheader", + "Prerequisites": "Voraussetzungen", "preview": "Vorschau", + "Previous": "Zurück", "primary conversion": "primäre Konversion", "primary conversion event": "primäres Konversions-Event", "priming for push": "Priming for Push", @@ -765,25 +883,32 @@ "Product Portal": "Produktportal", "product recommendation": "Produktempfehlung", "Product recommendations": "Produktempfehlungen", + "Products": "Produkte", "profile": "Profil", + "Profiles": "Profile", "profit": "Gewinn", "Profits": "Gewinne", "promotion": "Aktion", "promotion code": "Aktionscode", "promotion codes": "Aktionscodes", "propensity score": "Propensity Score", + "Properties": "Eigenschaften", "property": "Eigenschaft", "proprietary": "proprietär", + "Provider": "Anbieter", "Public Key": "Public Key", "public-private key pair": "Public-Private-Key-Paar", "Publicare": "Publicare", "Publicis": "Publicis", + "Purchase": "Kauf", "purchase event": "Kauf-Event", "purchase object": "Kauf-Objekt", "purchase properties": "Kauf-Details", + "Purchases": "Käufe", "push": "Push", "push action button": "Push-Action-Button", "push notification": "Push-Benachrichtigung", + "Push notifications": "Push-Benachrichtigungen", "push stories": "Push-Storys", "push time to live": "Push-Time-to-Live", "Push Token": "Push-Token", @@ -806,38 +931,54 @@ "real-time": "Realtime", "real-time bubble": "Realtime-Bubble", "real-time data": "Echtzeitdaten", + "Received": "Erhalten", "recipient": "Empfänger:in", "Recipients": "Empfänger:innen", + "Recommendation": "Empfehlung", "recommendation engine": "Empfehlungssystem", + "Recommendations": "Empfehlungen", + "Recommended": "Empfohlen", "REDUCE CHURN": "ABWANDERUNG VERRINGERN", "reference": "referenzieren", "referral": "Empfehlung", "regex": "Regex", + "Register": "Anmelden", "regular expression": "regulärer Ausdruck", "relationship marketing": "Beziehungsmarketing", "Remerge": "Remerge", + "Remove": "Entfernen", "repeat buyer": "Wiederholungskäufer:in", "repeat buyers": "Wiederholungskäufer:innen", "repeat purchase rate": "Wiederkaufrate", + "Replace": "Ersetzen", "reply-to email": "Antwort-E-Mail", "repo": "repo", + "Report": "Bericht", "report builder": "Berichts-Builder", + "Reports": "Berichte", "representational state transfer": "Representational State Transfer", "representative": "Vertretung", "request": "Anfrage", "request header": "Anfrage-Header", + "Requests": "Anfragen", + "Required": "Erforderlich", "reserved": "reserviert", + "Response": "Antwort", "responsive": "responsiv", "REST API": "REST API", "REST API Key": "REST-API-Schlüssel", "resubscription rate": "Verlängerungsquote", + "Results": "Ergebnisse", "RETAIL & ECOMMERCE": "EINZELHANDEL und E-COMMERCE", "retailing": "Einzelhandel", "retarget": "Retarget", "retargeting": "Retargeting", "retention": "Bindung", "retention rate": "Bindungsrate", + "Return": "Zurück", "return on investment": "Kapitalrendite", + "Revenue": "Umsatz", + "Review": "Überprüfen", "Rewards": "Rewards", "Rich Notification": "Rich-Benachrichtigung", "rich push": "Rich-Push-Benachrichtigung", @@ -858,6 +999,7 @@ "SAML SSO": "SAML SSO", "scalable platform": "skalierbare Plattform", "schedule": "Zeitplan", + "Scheduled": "Geplant", "SCHMACK": "SCHMACK", "SDK": "SDK", "SDK API Key": "SDK-API-Schlüssel", @@ -866,12 +1008,14 @@ "SDKs_deeplink": "SDKs_deeplink", "SDWebImage": "SDWebImage", "seamlessly": "nahtlos", + "Search": "Suchen", "secondary purchase": "Folgekauf", + "Section": "Abschnitt", "seed group": "Seed-Gruppe", "Seed Groups": "Seed-Gruppen", "segment": "Segment", - "Segment Extension": "Segment-Erweiterung", - "segment extensions": "Segment-Erweiterungen", + "Segment Extension": "Segmenterweiterung", + "segment extensions": "Segmenterweiterungen", "segment insights": "Segment-Insights", "segmentation": "Segmentierung", "segmentation criteria": "Segmentierungskriterien", @@ -879,18 +1023,23 @@ "Segments": "Segmente", "select": "auswählen", "Select a category...": "Kategorie auswählen …", + "Selected": "Ausgewählt", + "Selecting": "Wird ausgewählt", + "Selection": "Auswahl", "SELECTOR": "SELEKTOR", "self-guided section": "Self-Service-Bereich", "sender": "Sender", "sender reputation": "Absender-Reputation", "Senders": "Absender", "sendgrid": "SendGrid", + "Sending": "Wird gesendet", "sense of belonging": "Zugehörigkeitsgefühl", "server": "Server", "service": "Dienst", "service worker": "Service-Teammitglied", "Services": "Serviceleistungen; Dienste", "set up campaigns": "Kampagnen einrichten", + "Settings": "Einstellungen", "setup task": "Setup-Aufgabe", "sharedInstance": "sharedInstance", "Shaw/Scott": "Shaw/Scott", @@ -906,6 +1055,7 @@ "siloed data": "Silodaten", "siloed messaging": "isoliertes Messaging", "silos": "Silos", + "Single": "Einzeilig", "single sign-on": "Single Sign-on", "single-channel approach": "Singlechannel-Ansatz", "Singular": "Singular", @@ -928,6 +1078,8 @@ "solution": "Lösung", "solutions partner": "Lösungspartner", "sorry": "Sorry", + "Source": "Quelle", + "Sources": "Quellen", "SP": "SP", "spam report": "Spam-Bericht", "spam testing": "Spam-Test", @@ -941,6 +1093,8 @@ "Stacked Collective": "Stacked Collective", "stats": "Statistik", "Stensul": "Stensul", + "Step 1": "1. Schritt", + "Step 2": "2. Schritt", "store": "Shop", "Story": "Story", "Storytel": "Storytel", @@ -955,6 +1109,8 @@ "StyleRyde": "StyleRyde", "Sub-category": "Unterkategorie", "subject line": "Betreffzeile", + "Submit": "Senden", + "Subscribed": "Abonniert", "subscriber": "Abonnent:in", "subscriber calendars": "Abo-Kalender", "Subscribers": "Abonnent:innen", @@ -963,8 +1119,10 @@ "subscription group status": "Abo-Gruppenstatus", "subscription groups": "Abo-Gruppen", "subscription management": "Abo-Management", + "Success": "Erfolg", "suite": "Suite", "sunsetting": "Sunsetting", + "support": "Support", "survey": "Umfrage", "surveys": "Umfragen", "SWIFT": "SWIFT", @@ -974,6 +1132,7 @@ "tags": "Tags", "Talon.one": "Talon.One", "TAP London": "TAP London", + "Target": "Zielgruppe", "Target Population": "Zielpopulation", "target user": "Zielgruppe zusammenstellen", "targeting": "Targeting", @@ -998,6 +1157,8 @@ "third-party cookies": "Drittanbieter-Cookies", "third-party data": "Drittanbieter-Daten", "ticketing": "Ticketing", + "Time Zone": "Zeitzone", + "Timestamp": "Zeitstempel", "Tinuiti": "Tinuiti", "Tinyclues": "Tinyclues", "TLS": "TLS", @@ -1019,11 +1180,13 @@ "Transcend": "Transcend", "transformation": "Transformation", "Transifex": "Transifex", + "Translation": "Übersetzung", "TRAVEL & HOSPITALITY": "REISEN UND HOSPITALITY", "Treasure Data": "Treasure Data", "trigger": "triggern", "trigger action": "Aktion triggern", "trigger based email marketing": "Trigger-E-Mail-Marketing", + "Triggered": "Getriggert", "triggered message": "getriggerte Nachricht", "troubleshooting": "Fehlerbehebung", "troubleshooting tool": "Fehlerbehebungs-Tool", @@ -1045,10 +1208,13 @@ "unix": "Unix", "unread indicators": "Ungelesen-Anzeige", "Unreal Engine": "Unreal Engine", + "UNSUBS": "ABMELDUNGEN", "unsubscribe": "abmelden", - "Unsubscribe Rate": "Abmelderate", + "Unsubscribe Rate": "Abmeldungsrate", "update": "Update", + "Updated": "Aktualisiert", "upgrade": "upgraden", + "Upload": "Hochladen", "Upsell Strategy": "Upselling-Strategie", "uptime": "Uptime", "URI": "URI", @@ -1059,6 +1225,7 @@ "user archival": "Nutzerarchivierung", "user base": "Nutzerbasis", "user data": "Nutzerdaten", + "User ID": "Nutzer-ID", "user import": "Nutzerimport", "user info": "Nutzerinfo", "user interface": "Benutzeroberfläche", @@ -1068,7 +1235,11 @@ "user search": "Nutzersuche", "users": "Nutzer:innen", "UTM tag": "UTM Tag", + "Values": "Werte", + "Variables": "Variablen", "variant": "Variante", + "Variants": "Varianten", + "Variation": "Variante", "Venntifact": "Venntifact", "verify": "überprüfen", "Vertical Stack Series": "Vertical Stack Series", @@ -1092,6 +1263,8 @@ "Weekly Report": "Wochenbericht", "whitelabel": "Whitelabel", "win-back": "Rückgewinnung", + "Window": "Fenster", + "Within": "Innerhalb", "Workforce Success": "Workforce Success", "workspace": "Workspace", "wrapper": "Wrapper", @@ -1100,8 +1273,9 @@ "Xamarin": "Xamarin", "yearly report": "Jahresbericht", "Yodel Mobile": "Yodel Mobile", + "Your message": "Ihre Nachricht", "Zapier": "Zapier", "Zendesk": "Zendesk", "zeotap": "Zeotap", "zero-party data": "Zero-Party-Daten" -} \ No newline at end of file +} diff --git a/scripts/glossaries/es.json b/scripts/glossaries/es.json index 57761e726c2..1d6fba25667 100644 --- a/scripts/glossaries/es.json +++ b/scripts/glossaries/es.json @@ -3,26 +3,33 @@ "A/B Testing": "pruebas A/B", "ABKContentCard": "ABKContentCard", "accelerated mobile pages": "páginas móviles aceleradas", + "Account": "Cuenta", "account manager": "director de cuentas", "Accuweather": "Accuweather", "ace tip": "consejo de as", "acquisition cost": "costo de adquisición", "acquisition form": "formulario de adquisición", + "Action": "Acción", "action button": "botón de acción", "action path": "ruta de acción", "action-based delivery": "entrega basada en acciones", "actionable insights": "información accionable", "ActionRocket": "ActionRocket", + "Actions": "Acciones", "actionType": "actionType", + "Active": "Activos", "active user": "usuario activo", "ad technology": "tecnología de anuncios", "ADB": "ADB", + "Address": "Dirección", "Adjust": "Adjust", "ADM": "ADM", "administrative tool": "herramienta de administración", + "Advance": "Avanzar", "advance audience": "avanzar audiencia", "advancement": "avance", "affinity": "afinidad", + "Age is": "La edad es", "Airbridge": "Airbridge", "alias label": "etiqueta de alias", "Alite International": "Alite International", @@ -40,6 +47,7 @@ "anonymous user": "usuario anónimo", "anti-spam filtering": "filtro anti-spam", "API": "API", + "API ID": "ID de API", "API key": "clave de API", "APN": "APN", "app": "aplicación", @@ -52,11 +60,16 @@ "Application Programming Interface (API)": "Interfaz para la programación de aplicaciones (API)", "Appsflyer": "Appsflyer", "Apteligent": "Apteligent", + "Archive": "Archivar", "array of strings": "matriz de cadenas", + "Article": "Artículo", "artificial intelligence": "inteligencia artificial", "asset": "activo", + "Assets": "Activos", "assign": "asignar", + "at a": "a las", "attribute": "atributo", + "Attributes": "Atributos", "attribution": "atribución", "attrition": "desgaste", "audience": "audiencia", @@ -64,6 +77,8 @@ "audience filter": "filtro de audiencia", "audience path": "ruta de audiencia", "audio file": "archivo de audio", + "Authentication": "Autenticación", + "Authorization": "Autorización", "automation": "automatización", "AWS": "AWS", "AWS Personalize": "AWS Personalize", @@ -72,18 +87,23 @@ "Azure": "Azure", "Azure Active Directory": "Azure Active Directory", "backend": "backend", + "Background": "Fondo", "badge": "señal", "Baidu": "Baidu", "banner content card": "tarjeta de contenido de banner", "Barbarian": "Barbarian", "Be Absolutely Engaging": "Be Absolutely Engaging", + "Before": "Antes de", + "Behavior": "Comportamiento", "behavior-based automation": "automatización basada en el comportamiento", "behavioral analytics": "análisis del comportamiento", "behavioral data": "datos de comportamiento", "beta service": "servicio beta", "blacklist": "lista negra", + "Blocks": "Bloques", "Bluedot": "Bluedot", "Bonfire": "Bonfire", + "Boolean": "Booleano", "boolean value": "valor booleano", "Bottle Rocket": "Bottle Rocket", "bounce": "rebotar", @@ -101,10 +121,12 @@ "Braze Support": "soporte de Braze", "Braze to Braze webhook": "Webhook Braze to Braze", "BroadcastReceiver": "BroadcastReceiver", + "Browse": "Examinar", "BSD": "BSD", "bucket": "contenedor", "bucket name": "nombre de contenedor", "build relationships": "establecer relaciones", + "Business": "Empresa", "business goal": "objetivo de negocio", "business intelligence": "inteligencia empresarial", "button": "botón", @@ -114,11 +136,14 @@ "calendar": "calendario", "callback": "devolución de llamada", "campaign": "campaña", + "Campaign or Canvas": "Campaña o Canvas", "campaign variant": "variante de campaña", + "Campaigns": "Campañas", "Canvas": "Canvas", "canvas experiment": "experimento en Canvas", "canvas step": "paso en Canvas", "canvas variant": "variante en Canvas", + "Canvases": "Canvas", "captioned content card": "tarjeta de contenido subtitulado", "card": "tarjeta", "card analytics": "análisis de tarjeta", @@ -127,15 +152,19 @@ "carrier": "operador", "cart abandonment": "abandono del carrito de compras", "case study": "caso de estudio", + "Catalog": "Catálogo", + "Catalogs": "Catálogos", "CDN": "CDN", "CDP": "CDP", "Census": "Census", + "Center": "Centro", "certificate": "certificado", "Certona": "Certona", "changelog": "registro de cambios", "channel": "canal", "channel enhancement": "mejora del canal", "channel-centric messaging": "mensajería centrada en los canales", + "Channels": "Canales", "churn": "abandono", "churn automation": "automatización de abandonos", "churn barometer": "barómetro de abandono", @@ -152,6 +181,7 @@ "click": "clic", "click rate": "tasa de clics", "click-through": "click-through", + "Clicks": "Clics", "client": "cliente", "client database": "base de datos de clientes", "cloud storage": "almacenamiento en la nube", @@ -162,17 +192,34 @@ "Cognizant": "Cognizant", "cohort": "cohorte", "cohort import": "importación de cohortes", + "Column": "Columna", + "Company": "Empresa", + "Complete": "Completado", + "Component": "Componente", + "Components": "Componentes", + "Compose": "Redactar", "computer": "computadora", "conditional logic": "lógica condicional", + "Configuration": "Configuración", + "Confirm": "Confirmar", + "Connect": "Conectar", + "Connected": "Conectado", "connected content": "contenido conectado", + "Connection": "Conexión", "connector": "conector", "consumer": "consumidor", + "Contact": "Ponte en contacto", + "Contain": "Contener", + "Contains": "Contiene", + "Content": "Contenido", "content block": "bloque de contenido", "content card": "tarjeta de contenido", "content card campaign": "campaña de tarjeta de contenido", + "Content Cards": "Tarjetas de contenido", "content-type": "tipo de contenido", "ContentCardable": "ContentCardable", "ContentCardsFragment": "ContentCardsFragment", + "Context": "Contexto", "contextual": "contextual", "contextual coupon": "cupón contextual", "control group": "grupo de control", @@ -185,7 +232,11 @@ "Cordova": "Cordova", "Core Competency": "competencia básica", "core value": "valor fundamental", + "Country": "País", + "Create": "Crear", "create new report": "crear informe nuevo", + "Created": "Creada", + "Creating": "Creando", "credential": "credencial", "credential error": "error de credencial", "credentials": "credenciales", @@ -204,8 +255,10 @@ "currents integration": "integración de Currents", "custom": "personalizado", "custom attribute": "atributo personalizado", + "Custom Attributes": "Atributos personalizados", "custom code in-app message": "mensaje dentro de la aplicación de código personalizado", "custom event": "evento personalizado", + "Custom Events": "Eventos personalizados", "custom object": "objeto personalizado", "custom styling": "estilo personalizado", "customer acquisition cost": "costo de adquisición de clientes", @@ -245,7 +298,7 @@ "D3": "D3", "daily active user": "usuario activo diario", "dark mode": "modo oscuro", - "dashboard": "panel", + "dashboard": "dashboard", "data & infrastructure agility": "agilidad de datos e infraestructuras", "data allotment": "asignación de datos", "data augmentation": "aumento de datos", @@ -256,11 +309,12 @@ "data ingestion channel": "canal de ingesta de datos", "data integration": "integración de datos", "data point": "punto de datos", - "data point usage": "uso de punto de datos", + "data point usage": "Uso de puntos de datos", "data privacy": "privacidad de datos", "data protection advisor": "asesor sobre protección de datos", "data source": "origen de datos", "data stream": "transmisión de datos", + "Data Type": "Tipo de datos", "data warehouse": "almacén de datos", "data-driven": "basado en datos", "data-driven marketing": "marketing basado en datos", @@ -272,22 +326,33 @@ "deep linking": "vinculación en profundidad", "default": "predeterminado", "default attribute": "atributo predeterminado", + "Delete": "Eliminar", "deliver": "entregar", "deliverability": "capacidad de entrega", "delivery": "entrega", "Deloitte Digital": "Deloitte Digital", + "Description": "Descripción", + "Description:": "Descripción:", + "Design": "Diseñar", + "Destination": "Destino", + "Details": "Detalles", "developer": "desarrollador", "developer console": "consola para desarrolladores", "device": "dispositivo", "device data": "datos de dispositivo", + "Devices": "Dispositivos", "Digioh": "Digioh", "digital experience": "experiencia digital", "Digitas": "Digitas", + "DIRECT": "CONTACTOS DIRECTOS", "direct mail": "correo directo", "Direct Opens": "Direct Opens", + "Display": "Mostrar", "DNS": "DNS", "DNS provider": "proveedor de DNS", "DNS record": "registro de DNS", + "Do not": "No hacen", + "Document": "Documentación", "documentation": "documentación", "domain": "dominio", "domain provider": "proveedor de dominios", @@ -307,11 +372,13 @@ "e-mail marketing": "marketing por correo electrónico", "e-mail marketing campaign": "campaña de marketing por correo electrónico", "eBook": "eBook", + "eCommerce": "Comercio electrónico", "editor block": "bloque de editor", "editor view": "vista de edición", "EduMe": "EduMe", "eligible": "elegible", "email": "correo electrónico", + "Email Address": "Dirección de correo electrónico", "email builder": "creador de correo electrónico", "email list": "lista de correo electrónico", "email list hygiene services": "servicios de higiene de la lista de correo electrónico", @@ -323,12 +390,16 @@ "email strategy": "estrategia de correo electrónico", "Email Uplers": "Email Uplers", "emailing": "envío por correo electrónico", + "Emails": "Correos electrónicos", "empty field": "campo vacío", "enable": "habilitar", + "Enabled": "habilitadas", "enablement": "habilitación", "end user": "usuario final", "end-point": "punto final", "end-to-end": "de extremo a extremo", + "Endpoint": "Punto de conexión", + "Endpoints": "Puntos finales", "engagement": "interacción", "Engagement Maturity framework": "modelo de madurez de la interacción", "engagement rate": "tasa de interacción", @@ -340,16 +411,23 @@ "entry audience": "audiencia de entrada", "enum": "enumeración", "error code": "código de error", + "Errors": "Errores", "ETL": "ETL", + "Event B": "Evento B", "event properties": "propiedades del evento", + "Event Type": "Tipo de evento", "event user log": "registro de usuarios del evento", + "Events": "Eventos", "EventStream": "EventStream", + "Everyone Else": "El resto", "exception event": "evento de excepción", + "Experiment": "Experimento", "experiment path": "ruta de experimentos", "experiment paths step": "paso de ruta de experimentos", "experimentation loop": "bucle de experimentos", "expiry": "caducidad", "exponential backoff": "retirada exponencial", + "Export": "Exportar", "export code": "código de exportación", "external ID": "ID externo", "external ID migration": "migración de ID externo", @@ -364,7 +442,9 @@ "feature flag": "conmutador de características", "feature flags": "conmutadores de características", "feed": "fuente", + "Fields": "Campos", "filter": "filtrar", + "Filters": "Filtros", "Firebase": "Firebase", "first name": "nombre", "first-party data": "datos propios", @@ -372,6 +452,7 @@ "Fivetran": "Fivetran", "flash sales": "ventas flash", "Flutter": "Flutter", + "For You": "Para ti", "forge connections": "forjar conexiones", "Fortune 500": "Fortune 500", "Foursquare": "Foursquare", @@ -390,6 +471,7 @@ "GDPR": "RGPD", "gear": "engranaje", "gear icon": "ícono de engranaje", + "Generate": "Generar", "geofence": "geovalla", "geofencing": "geovallado", "geolocation": "geolocalización", @@ -413,6 +495,7 @@ "hard bounce": "rebote duro", "Hathway": "Hathway", "Hawke Media": "Hawke Media", + "Header": "Encabezado", "heat map/heatmap": "mapa de calor", "Hightouch": "Hightouch", "HIPAA": "HIPAA", @@ -426,13 +509,19 @@ "IDFV": "IDFV", "iHeartRadio": "iHeartRadio", "IInAppMessageViewWrapperFactory": "IInAppMessageViewWrapperFactory", + "images": "imágenes", "Impersonation": "suplantación de identidad", "Implicit Cost": "costo implícito", + "Import": "Importar", "Impression": "impresión", + "In-App": "Dentro de la aplicación", "in-app message": "mensaje dentro de la aplicación", + "In-App Messages": "Mensajes dentro de la aplicación", "in-browser message": "mensaje en el explorador", "inactive customer": "cliente inactivo", + "Inbound": "De entrada", "inbox": "buzón de entrada", + "includes": "incluye", "independent": "independiente", "independent software vendor": "proveedor de software independiente", "Indicia Worldwide": "Indicia Worldwide", @@ -442,6 +531,7 @@ "infrastructure": "infraestructura", "Inkit": "Inkit", "inputted string": "cadena introducida", + "Insert": "Insertar", "Inside Labs": "Inside Labs", "insight": "información", "install attribution": "atribución de instalación", @@ -449,6 +539,7 @@ "integrated data solutions": "soluciones de datos integradas", "integration": "integración", "integration code": "código de integración", + "Integrations": "Integraciones", "intelligence suite": "Intelligence Suite", "intelligent channel": "canal inteligente", "Intelligent Selection": "Intelligent Selection", @@ -458,10 +549,12 @@ "internal group": "grupo interno", "internet service provider": "proveedor de servicios de Internet", "intuitive tool": "herramienta intuitiva", + "Invalid": "No válido", "Invisible open tracking pixel": "píxel de seguimiento invisible y abierto", "IP": "IP", "IP warming": "calentamiento de IP", "Iris": "Iris", + "is not": "no es", "ISP": "ISP", "IT team": "equipo de TI", "item title": "título del elemento", @@ -482,7 +575,10 @@ "Kochava": "Kochava", "Kognitiv": "Kognitiv", "Kubit": "Kubit", + "Landing Page": "Página de inicio", + "Language": "Idioma", "Laughlin Constable": "Laughlin Constable", + "Launch": "Lanzar", "launch campaigns": "lanzar campañas", "layout": "diseño", "Leadfront": "Leadfront", @@ -526,6 +622,7 @@ "Mailbakery": "Mailbakery", "mailbox provider/MBP": "proveedor/MBP de buzón de correo", "malicious code": "código malicioso", + "Manage": "Administrar", "manage settings": "administrar configuración", "manager": "administrador", "mapping": "mapeado", @@ -542,6 +639,7 @@ "message composer": "creador de mensajes", "message segment": "segmento del mensaje", "message value": "valor del mensaje", + "Messages": "Mensajes", "messages per second": "mensajes por segundo", "messaging": "mensajería", "messaging campaign": "campaña de mensajería", @@ -549,13 +647,16 @@ "messaging experience": "experiencia de mensajería", "messaging history": "historial de mensajes", "Messenger": "Messenger", + "Method": "Método", "metric": "métrica", + "Metrics": "Métricas", "Microsoft Azure": "Microsoft Azure", "migration": "migración", "milestone": "hito", "Miltton": "Miltton", "Mixpanel": "Mixpanel", "MMS": "MMS", + "Mobile": "Móvil", "mobile marketing": "marketing móvil", "mobile marketing automation": "automatización del marketing móvil", "mobile moment": "momento de uso del marketing móvil", @@ -563,6 +664,8 @@ "mobile-first": "principalmente móvil", "monetization": "monetización", "monthly active user": "usuarios activos al mes", + "More info": "Más información", + "More Information": "Más información", "most used event": "evento más utilizado", "Movable Ink": "Movable Ink", "mParticle": "mParticle", @@ -573,6 +676,7 @@ "multi-channel campaign": "campaña multicanal", "multichannel messaging": "mensajería multicanal", "multilingual emails": "correos electrónicos multilingües", + "Multiple": "Múltiples", "multivariate": "multivariante", "multivariate testing": "pruebas multivariante", "native": "nativo", @@ -589,10 +693,13 @@ "notification": "notificación", "notification center": "centro de notificaciones", "notification group": "grupo de notificaciones", + "Notifications": "Notificaciones", "NPAW": "NPAW", "NuGet": "NuGet", + "Number": "Número", "number of sessions per user": "cantidad de sesiones por usuario", "nurturing channel": "canal de consolidación", + "Object": "Objeto", "object array": "matriz de objetos", "Objective C": "Objective-C", "OfferFit": "OfferFit", @@ -608,6 +715,8 @@ "opt-in prompt": "mensaje de adhesión voluntaria", "opt-out link": "enlace de cancelación", "Optilyz": "Optilyz", + "Optional": "Opcional", + "Options": "Opciones", "orchestration": "orquestación", "order status": "estado del pedido", "Origin": "Origin", @@ -629,17 +738,22 @@ "password": "contraseña", "payload": "carga útil", "Payomatic": "Payomatic", + "Pending": "Pendientes", "performance": "rendimiento", "performance marketing": "marketing del rendimiento", "permission": "permiso", + "Permissions": "Permisos", "persistent banner": "banner persistente", "persistent entry property": "propiedad de entrada persistente", "personalization": "personalización", + "Personalized": "Personalizado", "Phiture": "Phiture", + "Phone Number": "Número de teléfono", "Phrasee": "Phrasee", "PII": "PII", "pinned card": "tarjeta anclada", "placeholder": "marcador de posición", + "Platform": "Plataforma", "Playable": "Playable", "podfile": "archivo de bibliotecas", "potential customer": "cliente potencial", @@ -651,7 +765,9 @@ "predictive suite": "Predictive Suite", "predictive tool": "herramienta predictiva", "preheader": "preencabezado", + "Prerequisites": "Requisitos previos", "Preview": "vista previa", + "Previous": "Anterior", "primary conversion": "conversión primaria", "primary conversion event": "evento de conversión primaria", "priming for push": "preparación para las notificaciones push", @@ -661,17 +777,24 @@ "product portal": "portal de productos", "product recommendation": "recomendación de productos", "profile": "perfil", + "Profiles": "Perfiles", "profit": "ganancia", + "Promotion": "Promoción", "promotion code": "código promocional", "propensity score": "puntuación de propensión", + "Properties": "Propiedades", "Property": "propiedad", + "Provider": "Proveedor", "public key": "clave pública", "Publicare": "Publicare", "Publicis": "Publicis", + "Purchase": "Compra", "purchase properties": "propiedades de la compra", + "Purchases": "Compras", "push": "push", "push action button": "botón de acción para notificación push", "push notification": "notificación push", + "Push notifications": "Notificaciones push", "push service provider": "proveedor de servicios de notificaciones push", "push story": "historias push", "push time to live": "TTL para notificación push", @@ -692,36 +815,49 @@ "re-engagement": "reactivación de la interacción", "React Native": "React Native", "real-time data": "datos en tiempo real", + "Received": "Recibido", "recipient": "destinatario", + "Recommendation": "Recomendación", "recommendation engine": "herramienta de recomendaciones", + "Recommendations": "Recomendaciones", "REDUCE CHURN": "REDUCIR TASA DE ABANDONOS", + "Reference": "Referencia", "referral": "referidos", "regex": "regex", "register": "registro", "regular expression": "expresión regular", "relationship marketing": "marketing relacional", "Remerge": "Remerge", + "Remove": "Quitar", "repeat buyer": "comprador recurrente", "repeat purchase rate": "tasa de compras recurrentes", "reply-to": "responder a", "repo": "repositorio", + "Report": "Informe", "report builder": "generador de informes", + "Reports": "Informes", "representational state transfer": "transferencia de estado representacional", "representative": "representante", "request header": "encabezado de solicitud", + "Requests": "Solicitudes", + "Required": "Obligatoria", "reserved": "reservado", + "Response": "Respuesta", "responsive": "receptivo", "REST": "REST", "REST API": "API REST", "REST API Key": "clave de API REST", "resubscription rate": "tasa de resuscripción", + "Results": "Resultados", "retail": "comercio minorista", "retailing": "minorista", "retarget": "reorientar", "retention": "retención", "retention rate": "tasa de retención", + "Return": "Volver", "return on investment": "retorno de la inversión", "revenue": "ingresos", + "Review": "Revisar", "reward": "recompensa", "Rich Notification": "notificación enriquecida", "rich push": "notificaciones push enriquecidas", @@ -739,15 +875,20 @@ "SAML": "SAML", "SAML SSO": "SAML SSO", "scalable platform": "plataforma escalable", + "Schedule": "Planificación", + "Scheduled": "Planificada", + "Schema": "Esquema", "SCHMACK": "SCHMACK", "SDK": "SDK", "SDK API Key": "clave de API de SDK", - "SDK endpoint": "punto final SDK", + "SDK endpoint": "Punto final de SDK", "SDK integration": "integración de SDK", "SDKs_deeplink": "SDKs_deeplink", "SDWebImage": "SDWebImage", "seamlessly": "fácilmente", + "Search": "Buscar", "secondary purchase": "compra secundaria", + "Section": "Sección", "seed group": "grupo semilla", "segment": "segmento", "segment extensions": "extensiones de segmento", @@ -755,11 +896,16 @@ "segmentation": "segmentación", "segmentation criteria": "criterios de segmentación", "segmentation tool": "herramienta de segmentación", + "Segments": "Segmentos", + "Select": "Seleccionar", + "Selected": "Seleccionado", + "Selection": "Selección", "SELECTOR": "SELECTOR", "self-guided section": "sección autoguiada", "sender": "remitente", "sender reputation": "reputación del remitente", "SendGrid": "SendGrid", + "Sending": "Enviando", "sense of belonging": "sentido de pertenencia", "server": "servidor", "service": "servicio", @@ -779,6 +925,7 @@ "silo": "silo", "siloed data": "datos aislados", "siloed messaging": "mensajes aislados", + "Single": "Único", "single sign-on": "inicio de sesión único", "single-channel approach": "enfoque de canal único", "Singular": "Singular", @@ -801,6 +948,8 @@ "software-as-a-service": "software como servicio (SaaS)", "solution": "solución", "solutions partner": "socio de soluciones", + "Source": "Fuente", + "Sources": "Fuentes", "spam": "correo no deseado", "spam report": "informe de correos no deseados", "spam testing": "pruebas de correo no deseado", @@ -810,9 +959,12 @@ "SSL": "SSL", "SSO sign-on": "inicio de sesión único (SSO)", "Stacked Collective": "Stacked Collective", + "Standard": "Estándar", "standard attribute": "atributo estándar", "status": "estado", "Stensul": "Stensul", + "Step 1": "Paso 1", + "Step 2": "Paso 2", "stickiness": "adherencia", "Story": "historia", "Storytel": "Storytel", @@ -827,22 +979,28 @@ "StyleRyde": "StyleRyde", "Sub-category": "subcategoría", "subject line": "línea del asunto", + "Submit": "Enviar", + "Subscribed": "Suscrito", "subscriber": "suscriptor", "subscriber calendars": "calendarios de suscripción", "subscription": "suscripción", "subscription group": "grupo de suscripción", "subscription group status": "estado del grupo de suscripción", "subscription management": "gestión de suscripciones", + "Success": "Correcto", "suite": "línea de productos", + "Support": "Soporte", "support team": "equipo de soporte", "support ticket": "ticket de soporte", "survey": "cuestionario", "SWIFT": "SWIFT", "Swift Package Manager": "Swift Package Manager", + "System": "Sistema", "tab": "pestaña", "tag": "etiqueta", "Talon.One": "Talon.One", "TAP London": "TAP London", + "Target": "Objetivo", "target audience": "audiencia objetivo", "target population": "población objetivo", "Taxi for Email": "Taxi for Email", @@ -857,6 +1015,7 @@ "technology partner page": "página de socios tecnológicos", "technology stack": "stack tecnológico", "template": "plantilla", + "Templates": "Plantillas", "templates & media": "plantillas y medios", "test segment": "segmento de prueba", "test user": "usuario de prueba", @@ -867,6 +1026,8 @@ "third-party data": "datos de terceros", "ticketing": "creación de tickets", "time to live": "tiempo de vida", + "Time Zone": "Zona horaria", + "Timestamp": "Marca de tiempo", "Tinuiti": "Tinuiti", "Tinyclues": "Tinyclues", "TLS": "TLS", @@ -881,10 +1042,12 @@ "Transcend": "Transcend", "transient": "transitorio", "Transifex": "Transifex", + "Translation": "Traducción", "Treasure Data": "Treasure Data", "trigger": "desencadenar", "trigger action": "acción desencadenante", "trigger based email marketing": "marketing por correo electrónico basado en desencadenantes", + "Triggered": "Desencadenados", "triggered message": "mensaje desencadenado", "troubleshooting": "solución de problemas", "troubleshooting tool": "herramienta para la solución de problemas", @@ -898,13 +1061,17 @@ "Uninstall Tracking": "Uninstall Tracking", "unique": "único", "unique buyer win-back": "recuperación de compradores únicos", - "unique opens": "Unique Opens", + "unique opens": "Aperturas únicas", "Unity": "Unity", "unix": "unix", "unread indicators": "indicadores no leídos", "Unreal Engine": "Unreal Engine", + "UNSUBS": "CANCELACIONES DE SUSCRIPCIONES", "unsubscribe": "cancelar suscripción", - "Unsubscribe Rate": "tasa de cancelación de suscripciones", + "Unsubscribe Rate": "Tasa de cancelaciones", + "Update": "Actualizar", + "Updated": "Actualizado", + "Upload": "Cargar", "Upsell Strategy": "estrategia de upselling", "uptime": "tiempo de actividad", "URI": "URI", @@ -915,6 +1082,7 @@ "user archival": "archivado de usuarios", "user base": "base de usuarios", "user data": "datos de usuario", + "User ID": "ID de usuario", "user import": "importación de usuarios", "User Nurture": "UserNurture", "user orphaning": "asignar usuarios huérfanos", @@ -923,7 +1091,9 @@ "user search": "búsqueda de usuarios", "UTM": "UTM", "UTM tag": "etiqueta UTM", + "Values": "Valores", "variant": "variante", + "Variation": "Variación", "Venntifact": "Venntifact", "Vertical Stack Series": "Vertical Stack Series", "Verticurl": "Verticurl", @@ -945,6 +1115,8 @@ "whitelabel": "etiqueta sin marca", "whitelist": "lista blanca", "win-back": "recuperación", + "Window": "Ventana", + "Within": "En", "Workforce Success": "Workforce Success", "workspace": "espacio de trabajo", "wrapper": "envoltorio", @@ -953,8 +1125,9 @@ "Wyng": "Wyng", "Xamarin": "Xamarin", "Yodel Mobile": "Yodel Mobile", + "Your message": "Tu mensaje", "Zapier": "Zapier", "Zendesk": "Zendesk", "Zeotap": "Zeotap", "zero-party data": "zero-party data" -} \ No newline at end of file +} diff --git a/scripts/glossaries/fr.json b/scripts/glossaries/fr.json index 65f42757e88..440cdb20e42 100644 --- a/scripts/glossaries/fr.json +++ b/scripts/glossaries/fr.json @@ -3,6 +3,7 @@ "A/B Testing": "test A/B", "ABKContentCard": "ABKContentCard", "accelerated mobile pages": "pages mobiles accélérées", + "Account": "Compte", "account manager": "gestionnaire de compte", "Accuweather": "Accuweather", "ace tip": "conseil de pro", @@ -13,10 +14,14 @@ "action-based delivery": "livraison par événement", "actionable insights": "informations exploitables", "actionType": "type d'action", + "Active": "Actif", + "Address": "Adresse", "Adjust": "Adjust", "ADM": "ADM", + "Advance": "Avancée", "advance audience": "audience avancée", "advancement": "avancement", + "Age is": "L’âge est", "AI": "intelligence artificielle", "Airbridge": "Airbridge", "alias label": "libellé d'alias", @@ -32,6 +37,7 @@ "anonymous user": "utilisateur anonyme", "anti-spam filtering": "filtrage anti-spam", "API": "API", + "API ID": "ID de l’API", "API key": "clé API", "APN": "APN", "app experience": "expérience sur l'application", @@ -40,28 +46,42 @@ "application programming interface": "interface de programmation d'applications", "Appsflyer": "Appsflyer", "Apteligent": "Apteligent", + "Archive": "Archiver", "array of strings": "tableau de chaînes de caractères", "artificial intelligence": "IA", "aspect ratio": "rapport hauteur/largeur", "asset": "ressource", + "Assets": "Actifs", + "Assign": "Affecter", + "at a": "à un(e)", + "Attribute": "Attribut", + "Attributes": "Attributs", "attrition": "attrition", "audience": "audience", "audience builder": "segmentation d'audience", "audience filter": "filtre d'audience", "audience path": "parcours d'audience", + "Authentication": "Authentification", + "Authorization": "Autorisation", "AWS S3": "AWS S3", "Azure Active Directory": "azure active directory", "badge": "badge", "Baidu": "baidu", + "Banner": "Bannière", "banner content card": "carte de contenu de type bannière", "BCC": "CCI", + "Before": "Avant", + "Behavior": "Comportement", "behavior-based automation": "automatisation basée sur le comportement", "behavioral data": "données comportementales", "beta service": "service bêta", "blacklist/black list": "liste noire", "blocklist/block list": "liste de blocage", + "Blocks": "Blocs", "Bluedot": "Bluedot", + "Boolean": "Valeur booléenne", "boolean value": "valeur booléenne", + "Bounce": "Rebond", "bounce rate": "taux de rebond", "Braze": "Braze", "Braze Alloys": "Braze Alloys", @@ -71,12 +91,14 @@ "BrazeAI": "BrazeAI", "broadcast receiver": "récepteur de diffusion", "BroadcastReceiver": "broadcastreceiver", + "Browse": "Parcourir", "BSD": "BSD", "bucket": "compartiment", "bucket name": "nom du compartiment", "build": "créer", "build relationships": "développer des relations", "builder": "générateur", + "Business": "Entreprises", "business goal": "objectif métier", "business intelligence": "aide à la décision", "business settings": "paramètres", @@ -87,23 +109,31 @@ "calendar": "calendrier", "callback": "rappel", "campaign": "campagne", + "Campaign or Canvas": "Campagne ou canvas", "campaign variant": "variante de campagne", + "Campaigns": "Campagnes", "canvas": "canvas", "canvas experiment": "expérience Canvas", "canvas step": "étape du canvas", "canvas variant": "variante du canvas", + "Canvases": "Canvas", "captioned content card": "carte de contenu de type image légendée", "card analytics": "analyse des cartes", "card dismissal": "fermeture de la carte de contenu", "carousel view": "vue carrousel", "cart abandonment": "abandon de panier", + "Catalog": "Catalogue", + "Catalogs": "Catalogues", "CDN": "réseau de diffusion de contenu", "CDP": "CDP", "Census": "Census", + "Center": "Centre", "Certona": "Certona", "changelog": "journal des modifications", + "Channel": "Canal", "channel-centric messaging": "messages centrés sur les canaux", - "churn": "se désabonner", + "Channels": "Canaux", + "churn": "Attrition", "churn barometer": "baromètre de clients désabonnés", "churn rate": "taux d'attrition", "churned customer": "client désabonné", @@ -114,6 +144,7 @@ "class_type": "class_type", "classic content card": "carte de contenu classique", "click rate": "taux de clics", + "Clicks": "Clics", "client database": "base de données clients", "CLV": "CLV", "CNIL": "CNIL", @@ -122,15 +153,32 @@ "cognitive bias": "biais cognitif", "cohort": "cohorte", "cohort import": "importation de la cohorte", + "Column": "Colonne", + "Company": "Société", + "Complete": "Terminé", + "Component": "Composant", + "Components": "Composants", + "Compose": "Rédiger", "conditional logic": "logique conditionnelle", + "Confirm": "Confirmer", + "Connect": "Nous contacter", + "Connected": "Connecté", "connected content": "contenu connecté", + "Connection": "Connexion", "connector": "connecteur", + "Contact": "Contactez le", + "Contain": "Contenir", + "Contains": "Contient", + "Content": "Contenu", "content block": "bloc de contenu", "content card": "carte de contenu", "content card campaign": "campagne de cartes de contenu", + "Content Cards": "Cartes de contenu", "Content-Type": "Content-Type", "ContentCardable": "contentcardable", "ContentCardsFragment": "contentcardsfragment", + "Context": "Contexte", + "Control": "Contrôle", "control group": "groupe de contrôle", "conversion": "conversion", "conversion event": "événement de conversion", @@ -138,7 +186,10 @@ "conversion rate": "taux de conversion", "cookies": "cookies", "cordova": "cordova", + "Create": "Créer", "create new report": "créer un rapport", + "Created": "Créé", + "Creating": "Création en cours...", "CRM": "CRM", "cross-channel": "cross-canal", "cross-channel marketing": "marketing cross-canal", @@ -150,9 +201,10 @@ "currents integration": "intégration currents", "custom": "personnalisé", "custom attribute": "attribut personnalisé", + "Custom Attributes": "Attributs personnalisés", "Custom Code In-App Message": "message in-app avec code personnalisé", "custom event": "événement personnalisé", - "custom events": "custom events", + "custom events": "Événements personnalisés", "custom object": "objet personnalisé", "custom styling": "style personnalisé", "customer acquisition cost": "coût d'acquisition de la clientèle", @@ -191,6 +243,7 @@ "data point": "point de donnée", "data privacy": "confidentialité des données", "data protection advisor": "conseiller à la protection des données", + "Data Type": "Type de données", "data warehouse": "entrepôt de données", "data-driven marketing": "marketing axé sur les données", "datalake": "datalake", @@ -199,15 +252,23 @@ "decision split step": "étape de l'arbre décisionnel", "deep link": "lien profond", "deep linking": "création de liens profonds", + "Default": "Par défaut", "default attribute": "attribut par défaut", + "Delete": "Supprimer", "deliverability": "livrabilité", "delivery": "réception/distribution", + "Description:": "Description :", + "Design": "Conception", + "Details": "Détails", "developer console": "console de développement", "device": "appareil", + "Devices": "Appareils", "dictionary": "dictionnaire", "Digioh": "Digioh", "direct mail": "publipostage", + "Display": "Affichage", "DNS": "dns", + "Do not": "font pas", "docs": "documentation", "domain": "domaine", "dormant user": "utilisateur dormant", @@ -225,11 +286,16 @@ "e-mail strategy": "stratégie d’e-mailing", "e-mailing": "e-mailing/envoi", "edit": "modifier", + "Editor": "Format du bloc de contenu", "editor block": "bloc éditeur", "Edume": "Edume", "email": "e-mail", + "Email Address": "Adresse e-mail", "email reputation and deliverability": "réputation et livrabilité de l'e-mail", "email service provider": "fournisseur de services d'e-mailing", + "Emails": "E-mails", + "Enable": "Activer", + "Enabled": "Activé", "end user": "utilisateur final", "endpoint": "endpoint", "engagement rate": "taux d'engagement", @@ -237,16 +303,23 @@ "engagement tool": "outil d'engagement", "enum": "enum", "error code": "code d'erreur", + "Errors": "Erreurs", "ETL": "extraire, transformer, charger", + "Event B": "Événement B", "event properties": "propriétés d'événement", "event stream": "flux d'événements", + "Event Type": "Type d’événement", "event user": "événement utilisateur", "event user log": "journal des événements utilisateurs", + "Events": "Événements", "EventStream": "eventstream", + "Everyone Else": "Tous les autres", "exception event": "événement d'exception", + "Experiment": "Expérience", "experiment path": "chemin d’expérience", "Experiment Paths Step": "étape des chemins d'expérience", "exponential backoff": "délais exponentiels", + "Export": "Exporter", "export code": "code d'exportation", "external ID": "ID externe", "external ID migration": "migration de l'ID externe", @@ -256,10 +329,14 @@ "FB messenger": "FB messenger", "FCM": "FCM", "feature": "fonctionnalité", + "Fields": "Champs", + "Filter": "Filtre", + "Filters": "Filtres", "First-party data": "données first-party", "Fivetran": "Fivetran", "float": "float", "Flutter": "Flutter", + "For You": "Pour vous", "forge connections": "nouer des liens", "Foursquare": "Foursquare", "frequency capping": "limite de fréquence", @@ -274,6 +351,8 @@ "GDPR": "RGPD", "gear": "engrenage", "gear icon": "icône d'engrenage", + "General": "Général", + "Generate": "Générer", "geofence": "géorepérage", "geolocation": "géolocalisation", "Gimbal": "Gimbal", @@ -286,23 +365,32 @@ "growth practice": "growth practice", "growth stack": "outils de croissance", "hard bounce": "échec d'envoi définitif", + "Header": "En-tête", "Hightouch": "Hightouch", "HIPAA": "HIPAA", "ID": "ID", + "Identifier": "Identifiant", "IDFA": "IDFA", "IDFV": "IDFV", + "Import": "Importer", + "In-App": "in-app", "in-app message": "message in-app", + "In-App Messages": "Messages in-app", "in-browser message": "message dans le navigateur", "inactive customer": "client inactif", "inappmessageviewwrapperfactory": "iinappmessageviewwrapperfactory", + "Inbound": "Entrant", "inbox": "boîte de réception", + "includes": "inclut", "independent software vendor": "éditeur de logiciels indépendant", "Inkit": "Inkit", + "Insert": "Insérer", "insights": "informations", "install attribution": "attribution d'installation", "instance": "instance", "integration": "intégration", "integration code": "code d'intégration", + "Integrations": "Intégration", "intelligence suite": "intelligence suite", "intelligent channel": "canal intelligent", "intelligent selection": "sélection intelligente", @@ -313,6 +401,7 @@ "interstitials": "interstitiels", "intuitive tool": "outil intuitif", "ip warming": "réchauffement d’adresses IP", + "is not": "n’est pas", "item title": "titre de l'élément", "Iterate": "Iterate", "Jampp": "Jampp", @@ -325,8 +414,12 @@ "Kochava": "Kochava", "KPI": "indicateur clé de performance", "Kubit": "Kubit", + "Landing Page": "Page d’accueil", + "Language": "Langue", "lasped user": "utilisateur inactif", + "Launch": "Lancer", "launch campaigns": "lancer des campagnes", + "Layout": "Disposition", "Learning course": "cours d'apprentissage", "legacy platform": "plateforme traditionnelle", "lifecycle campaign": "campagne basée sur le cycle de vie client", @@ -351,6 +444,7 @@ "machine learning": "machine learning", "Mailbakery": "Mailbakery", "malicious code": "code malveillant", + "Manage": "Gérer", "manage settings": "gérer les paramètres", "management tool": "outil de gestion", "Manager": "gestionnaire", @@ -369,12 +463,15 @@ "messaging campaign": "campagne de communication", "messaging channel": "canal de communication", "messaging experience": "expérience de communication", + "Method": "Méthode", + "Metric": "Indicateur", "metrics": "indicateurs", "microsoft azure": "Microsoft azure", "migration": "migration", "milestone": "jalon", "Mixpanel": "Mixpanel", "MMS": "MMS", + "Mobile": "Appareil mobile", "mobile marketing": "marketing mobile", "mobile marketing automation": "automatisation du marketing mobile", "mobile moment": "moment mobile", @@ -384,11 +481,14 @@ "monetization": "monétisation", "monthly active user": "utilisateur actif par mois", "monthly active user / MAU": "Utilisateurs actifs mensuels / MAU", + "More info": "En savoir plus", + "More Information": "Plus d’informations", "Movableink": "Movableink", "mParticle": "mParticle", "MPP": "protection de la confidentialité dans Mail", "multi-channel campaign": "campagne multicanal", "multichannel messaging": "communication multicanale", + "Multiple": "Plusieurs", "multivariate testing": "test multivarié", "nested event properties": "propriétés de l'événement imbriqué", "net promoter score": "NPS", @@ -401,8 +501,10 @@ "NPAW": "NPAW", "NPS": "Net Promoter Score", "NuGet": "NuGet", + "Number": "Nombre", "number of sessions per user": "nombre de sessions par utilisateur", "nurturing channel": "canal de nurturing", + "Object": "Objet", "object array": "tableau d'objets", "OfferFit": "OfferFit", "omnichannel": "omnicanal", @@ -413,6 +515,7 @@ "opt-in prompt": "demande d'abonnement", "opt-out link": "lien de désabonnement", "Optilyz": "Optilyz", + "Optional": "Facultatif", "orchestration": "orchestration", "Order Status": "statut de la commande", "OTT": "OTT", @@ -426,13 +529,20 @@ "partner page": "page partenaire", "Passkit": "Passkit", "password": "mot de passe", + "Payload": "PAYLOAD", + "Pending": "En attente", + "Permissions": "Autorisations", "persistent banner": "bannière continuelle", "Persistent Entry Property": "propriétés d'entrées persistantes", + "Personal": "Personnel", "personalization": "personnalisation", + "Personalized": "Personnalisé", "personnaly indentifiable information": "données d'identification", + "Phone Number": "Numéro de téléphone", "Phrasee": "Phrasee", "pinned card": "carte épinglée", "placeholder": "marque substitutive", + "Platform": "Plateforme", "Playable": "Playable", "Podfile": "Podfile", "potential customer": "client potentiel", @@ -444,21 +554,33 @@ "Predictive Suite": "Predictive Suite", "predictive tool": "outil prédictif", "preheader": "accroche", + "Prerequisites": "Conditions préalables", + "Preview": "Prévisualiser", + "Previous": "Précédent", "primary conversion event": "événement de conversion principal", "priming for push": "amorçage de push", "product": "produit", "product lifecycle": "cycle de vie des produits", "Product Portal": "portail du produit", "product recommendation": "recommandation produit", + "Profile": "Profil", + "Profiles": "Profils", "profit": "bénéfice", "promotion card": "carte de promotion", "promotion code": "code de promotion", "propensity score": "score de propension", + "Properties": "Propriétés", + "Property": "Propriété", + "Provider": "Fournisseur", + "Purchase": "Achat", "purchase properties": "propriétés d'achat", + "Purchases": "Achats", "push action buttons": "boutons d'action push", "push notification": "notification push", + "Push notifications": "Notifications push", "push stories": "contenu push", "push time to live": "durée de vie des notifications push", + "Push Token": "Jeton de notification push", "push TTL": "TTL des notifications push", "Pypstream": "Pypstream", "qsr and delivery": "restauration rapide et livraison", @@ -472,26 +594,40 @@ "re-engagement": "réengagement", "React native": "React native", "real-time data": "données en temps réel", + "Received": "Reçu", "recipient": "destinataire", + "Recommendation": "Recommandation", + "Recommendations": "Recommandations", + "Reference": "Article de référence", "referral": "recommandation", "refresh": "actualiser", "regex": "expression régulière", "relationship marketing": "marketing relationnel", "Remerge": "Remerge", + "Remove": "Supprimer", "repeat buyer": "acheteur régulier", "repeat purchase rate": "taux de réachat", "repo": "dépôt", + "Report": "Rapport", "report builder": "générateur de rapports", + "Reports": "Rapports", "representational state transfer": "api rest", "representative": "conseiller", + "Requests": "Demandes", + "Required": "Requis", + "Response": "Réponse", "REST": "REST", + "REST API": "API REST", "resubscription rate": "taux de réabonnement", + "Results": "Résultats", "retailing": "retailing", "retarget": "recibler", "retargeting": "reciblage", "retention rate": "taux de rétention", + "Return": "Retour", "return on investment": "retour sur investissement", "revenue": "chiffre d'affaires", + "Review": "Vérifier", "rich push": "push riche", "ROI": "ROI", "Rokt": "Rokt", @@ -506,10 +642,13 @@ "save": "enregistrer", "scalable platform": "plateforme évolutive", "schedule": "planification", + "Scheduled": "Planification", + "Schema": "Schéma", "SDK": "SDK", "SDK integration": "intégration SDK", "SDWebImage": "SDwebimage", "seamlessly": "de façon fluide/sans heurts/de façon homogène, etc.", + "Search": "Rechercher", "second party data": "données second-party", "secondary purchase": "achat secondaire", "seed": "initiateur", @@ -519,15 +658,20 @@ "segment insights": "statistiques des segments", "segmentation": "segmentation", "segmentation criteria": "critères de segmentation", + "Select": "Sélectionner", + "Selected": "Sélectionné", + "Selection": "Sélection", "SELECTOR": "sélecteur", "sender": "expéditeur", "sender reputation": "réputation de l’expéditeur", "sendgrid": "Sendgrid", + "Sending": "Envoi en cours", "sense of belonging": "sentiment d’appartenance", "server": "serveur", "service": "service", "service worker": "service de traitement", "set up campaigns": "implémenter des campagnes", + "Settings": "Paramètres", "setup": "configuration", "sharedInstance": "sharedinstance", "short code": "code court", @@ -536,6 +680,7 @@ "sign-up": "inscription", "siloed data": "données en silo", "siloed messaging": "messages envoyés en silo", + "Single": "Unique", "single sign-on": "authentification unique", "single-channel approach": "approche monocanale", "Singular": "Singular", @@ -557,7 +702,10 @@ "sql queries": "requêtes SQL", "Sripo": "Sripo", "SSL": "SSL", + "Status": "État", "Stensul": "Stensul", + "Step 1": "Étape 1", + "Step 2": "Étape 2", "stickiness": "adhérence", "stream data from": "transmettre des données de", "stream data to": "transmettre des données à", @@ -565,35 +713,46 @@ "string": "chaîne de caractères", "string value": "valeur de chaîne de caractères", "subject line": "ligne d'objet", + "Submit": "Envoyer", "subscribe": "s'abonner", + "Subscribed": "Abonné", "subscriber": "utilisateur abonné", + "Subscription": "Abonnement", "subscription group": "groupe d'abonnement", "subscription group status": "statut du groupe d'abonnement", - "subscription groups": "subscription groups", + "subscription groups": "Groupes d'abonnement", "subscription management": "gestion des abonnements", + "Success": "Réussi", "suite": "suite", "sunsetting": "temporisation", + "Support": "Assistance", "Swift Package Manager": "gestionnaire de paquets swift", + "System": "Système", "tab": "onglet", "tag": "étiquette", - "tags": "tags", + "tags": "Étiquettes", "Talon.one": "Talon.one", + "Target": "Cibler", "targeting": "ciblage", "Taxi": "Taxi", "Taxi for email": "Taxi for email", "Tealium": "Tealium", - "Teams": "Teams", + "Teams": "Équipes", "technical resources": "ressources techniques", "technology ecosystem": "écosystème technologique", "technology partner": "partenaire technologique", "technology partner page": "page de partenaire technologique", "technology stack": "pile technologique", + "Template": "Modèle", + "Templates": "Modèles", "templates & media": "modèles et médias", "test segment": "segment d'essai", "test user": "utilisateur test", "third-party cookies": "cookie tiers", "third-party data": "données third-party", "time to live": "durée de vie", + "Time Zone": "Fuseau horaire", + "Timestamp": "Horodatage", "Tinyclues": "Tinyclues", "TLS": "TLS (sécurité de la couche de transport)", "toggle": "basculer", @@ -603,9 +762,11 @@ "Transaction": "transaction", "Transcend": "Transcend", "Transifex": "Transifex", + "Translation": "Traduction", "Treasure data": "Treasure data", "trigger": "déclencheur", "trigger action": "action de déclenchement", + "Triggered": "Déclenché(e)", "triggered message": "message déclenché", "troubleshooting": "résolution des problèmes", "trust score": "score de confiance", @@ -615,20 +776,27 @@ "two-way communication": "communication bidirectionnelle", "unique": "unique", "unique buyer win-back": "réengagement des acheteurs uniques", - "unique opens": "ouverture unique", + "unique opens": "Ouvertures uniques", "Unity": "Unity", "unix": "unix", "unread indicators": "indicateur de messages non lus", + "UNSUBS": "DÉSABONNEMENTS", + "Unsubscribe": "Se désabonner", + "Update": "Mettre à jour", + "Updated": "Mis à jour", "uptime": "disponibilité du serveur", "URI": "URI", + "Use Cases": "Cas d’utilisation", "user alias": "alias d'utilisateur", "user aliasing": "aliasing de l'utilisateur", "user archival": "archivage de l'utilisateur", + "User ID": "ID utilisateur", "user import": "importation d'utilisateurs", "user profile": "profil utilisateur", "user profile lifecycle": "cycle de vie du profil utilisateur", "user search": "recherche d'utilisateurs", "UTM tag": "balises UTM", + "Values": "valeurs", "variant": "variante", "view_type": "view_type", "Vizbee": "Vizbee", @@ -638,10 +806,14 @@ "webhook": "webhook", "whitelabel": "marque blanche", "win-back": "taux de reconquête", + "Window": "Fenêtre", + "Within": "Période", + "Workspace": "Espace de travail", "wrapper": "wrapper", "Xamarin": "Xamarin", + "Your message": "Votre message", "Zapier": "Zapier", "Zendesk": "Zendesk", "zeotap": "Zeotap", "zero-party data": "données zero-party" -} \ No newline at end of file +} diff --git a/scripts/glossaries/ja.json b/scripts/glossaries/ja.json index a35ea2035e6..d949a4d70cb 100644 --- a/scripts/glossaries/ja.json +++ b/scripts/glossaries/ja.json @@ -3,14 +3,18 @@ "A/B Testing": "AB テスト", "abandoned cart": "放棄カート or カート放棄", "About Us": "会社概要", + "Account": "アカウント", "account manager": "アカウントマネージャー", "accuweather": "AccuWeather", "action": "アクション", "action path": "アクションパス", "ActionRocket": "ActionRocket", + "Actions": "アクション", "actionType": "actionType", + "Active": "アクティブ", "active user": "アクティブユーザー", "ad technology": "アドテクノロジー", + "Address": "住所", "Adjust": "Adjust", "administrative tool": "管理ツール", "affinity": "アフィニティ", @@ -38,13 +42,20 @@ "Application Programming Interface": "API", "Appsflyer": "AppsFlyer", "Apteligent": "Apteligent", + "Archive": "アーカイブ", + "Article": "記事", + "Assets": "アセット", + "Assign": "割り当てる", + "at a": "リスクレベル:", "attribute": "属性", + "Attributes": "属性", "attribution": "アトリビューション", "audience": "オーディエンス", "audience path": "オーディエンスパス", "Audience Sync Pro": "Audience Sync Pro", "audio file": "オーディオファイル", "authentication": "認証", + "Authorization": "許可", "automation": "オートメーション", "AWS": "AWS", "AWS Personalize": "AWS Personalize", @@ -53,12 +64,18 @@ "Azure": "Azure", "Azure Active Directory": "Azure Active Directory", "background": "バックグラウンド", + "Banner": "バナー", "Barbarian": "Barbarian", + "Before": "導入前", + "Behavior": "動作", "behavioral analytics": "行動分析", "block": "ブロック", + "Blocks": "ブロック", "Bluedot": "Bluedot", "Bonfire": "Bonfire", + "Boolean": "ブール値", "Bottle Rocket": "Bottle Rocket", + "Bounce": "バウンス", "bounce rate": "バウンス率", "Branch": "Branch", "Brandenburg": "ブランデンブルク州", @@ -73,28 +90,39 @@ "BrazeAI": "BrazeAI", "broken vs brilliant": "Broken vs Brilliant", "BSD": "BSD", + "Bucket": "バケット", + "Business": "ビジネス", "business intelligence": "ビジネスインテリジェンス", + "Button": "ボタン", "byte london": "Byte London", "CACI": "CACI", "campaign": "キャンペーン", + "Campaigns": "キャンペーン", "cancel": "キャンセル", "canvas": "キャンバス", "canvas flow": "キャンバスフロー", + "Canvas Step": "キャンバスステップ", + "Canvases": "キャンバス", "capping": "キャップ", "card": "カード", "cart abandonment": "カート放棄", "case study": "ケーススタディ", "catalog": "カタログ", + "Catalogs": "カタログ", "Census": "Census", + "Center": "中央揃え", "certificate": "証明書", "Certona": "Certona", + "Changelog": "変更ログ", "channel": "チャネル", "channel enhancement": "チャネルの強化", + "Channels": "チャネル", "churn automation": "チャーンオートメーション", "City": "市区町村", "cleargoals": "CLEARGOALS", "click rate": "クリック率", "click-through": "クリックスルー", + "Clicks": "クリック数", "client": "クライアント", "Clone": "複製", "cloud storge": "クラウドストレージ", @@ -102,12 +130,28 @@ "code": "コード", "Cognizant": "Cognizant", "cohort": "コホート", + "Company": "会社", + "Complete": "完了", + "Component": "コンポーネント", + "Components": "コンポーネント", + "Compose": "作成", "computer": "コンピューター", + "Configuration": "設定", + "Confirm": "確認", + "Connect": "接続", + "Connected": "接続済み", "connected content": "コネクテッドコンテンツ", + "Connection": "接続", "consumer": "消費者", + "Contact": "このページが引き続き表示される場合は、", "contact card": "連絡先カード", + "Contain": "収める", + "Contains": "次を含む", + "Content": "コンテンツ", "content block": "コンテンツブロック", "content card": "コンテンツカード", + "Content Cards": "コンテンツカード", + "Context": "コンテキスト", "contextual": "文脈に応じた or 状況に即した", "contextual coupon": "文脈に応じたクーポン", "control": "コントロール", @@ -119,6 +163,9 @@ "Cordova": "Cordova", "core competency": "コアコンピタンス", "core value": "コアバリュー", + "Create": "作成", + "Created": "作成済み", + "Creating": "作成中...", "credential": "認証情報", "credential error": "認証エラー", "CRM": "CRM", @@ -132,8 +179,11 @@ "curate": "キュレート", "curation": "キュレーション", "Currents": "Currents", + "Custom": "カスタム", "custom attribute": "カスタム属性", + "Custom Attributes": "カスタム属性", "custom event": "カスタムイベント", + "Custom Events": "カスタムイベント", "customer": "顧客", "customer behavior": "顧客行動", "customer data": "顧客データ", @@ -164,6 +214,7 @@ "data point": "データポイント", "data point usage": "データポイント使用量", "data source": "データソース", + "Data Type": "データタイプ", "data warehouse": "データウェアハウス", "data-driven": "データドリブン型の", "Datadog": "Datadog", @@ -172,15 +223,26 @@ "declared data": "ディクレアードデータ", "deep linking": "ディープリンク", "default": "デフォルト", + "Delete": "削除", + "Delivery": "配信", "deloitte digital": "Deloitte Digital", + "Description": "説明", + "Description:": "説明:", + "Design": "デザイン", "destination": "送信先", + "Details": "詳細", "developer": "開発者", + "Device": "デバイス", "device data": "デバイスデータ", "Digioh": "Digioh", "digital experience": "デジタルエクスペリエンス", "Digitas": "Digitas", + "DIRECT": "直接", + "Display": "表示", "DNS": "DNS", + "Document": "文書", "documentation": "ドキュメント", + "Domain": "ドメイン", "dormant": "休止状態", "dormant user": "休眠ユーザー", "down-funnel": "ダウンファネル", @@ -192,8 +254,10 @@ "Dyspatch.io": "Dyspatch.io", "ebook": "eBook", "ecommerce": "e コマース", + "Editor": "エディター", "edume": "EduMe", "email": "メール", + "Email Address": "メールアドレス", "email builder": "メールビルダー", "email list hygiene service": "メールリストクリーニングサービス", "email must-knows": "Email Must-Knows", @@ -201,20 +265,31 @@ "email reputation and deliverability": "メールの信頼度および配信到達性", "email rest api": "メール REST API", "email uplers": "Email Uplers", + "Emails": "メール", "empty field": "空のフィールド", + "Enable": "有効", + "Enabled": "有効", "enablement": "イネーブルメント", "end-to-end": "エンドツーエンドの", "endpoint": "エンドポイント", + "Endpoints": "エンドポイント", "engagement": "エンゲージメント", "engagement maturity framework": "エンゲージメント成熟度フレームワーク", - "engineering": "開発", + "engineering": "エンジニアリング", "entertainment": "エンターテイメント", "entry": "エントリ", "error": "エラー", + "Errors": "エラー数", "ESP": "メールサービスプロバイダー (ESP)", + "Event B": "イベント B", + "Event Type": "イベントタイプ", + "Events": "イベント", + "Everyone Else": "その他のユーザー", "exception event": "例外イベント", + "Experiment": "実験", "experimentation loop": "実験ループ", "expiry": "有効期限", + "Export": "エクスポート", "external id": "external ID", "external user": "外部ユーザー", "Facebook Audience": "Facebook オーディエンス", @@ -223,13 +298,16 @@ "feed": "フィード", "feedback": "フィードバック", "field": "フィールド", + "Fields": "フィールド", "filter": "フィルター", + "Filters": "フィルター", "financial service": "金融サービス", "first name": "名", "FIVE": "FIVE", "Fivetran": "Fivetran", "flash sale": "フラッシュセール", "Flutter": "Flutter", + "For You": "自分宛", "Fortune 500": "フォーチュン500社", "Foursquare": "Foursquare", "frequency capping": "フリークエンシーキャップ", @@ -239,6 +317,7 @@ "full access key": "フルアクセスキー", "full-service": "サービス全般を取り扱う", "gamification": "ゲーミフィケーション", + "Generate": "生成", "geofence": "ジオフェンス", "geolocation marketing": "ジオロケーションマーケティング", "Gimbal": "Gimbal", @@ -261,22 +340,29 @@ "identifier": "識別子", "iHeartRadio": "iHeartRadio", "image": "画像, 写真", + "images": "画像", "impersonation": "偽装 or なりすまし", "implicit cost": "暗黙的なコスト", + "Import": "インポート", "impression": "インプレッション", "improve acquisition": "獲得の向上", + "In-App": "アプリ内", "in-app message": "アプリ内メッセージ", + "In-App Messages": "アプリ内メッセージ", "inbox": "受信トレイ", + "includes": "次を含む", "increase engagement": "エンゲージメント向上", "independent": "独立系", "Indicia Worldwide": "Indicia Worldwide", "individual consumer": "エンドユーザー", "influencer marketing": "インフルエンサーマーケティング", "infrastructure": "インフラ", + "Insert": "挿入", "Inside Labs": "Inside Labs", "insight": "インサイト", "install attribution": "インストールアトリビューション", "integrated data solution": "統合データソリューション", + "Integrations": "統合", "intelligent channel": "インテリジェントチャネル", "intelligent selection": "インテリジェントセレクション", "intelligent timing": "インテリジェントタイミング", @@ -285,6 +371,7 @@ "Invisible open tracking pixel": "非表示のオープントラッキングピクセル", "IP warmup": "IP ウォームアップ", "Iris": "Iris", + "is not": "該当しない", "Iterate": "Iterate", "iX.co": "iX.co", "Jampp": "Jampp", @@ -298,8 +385,12 @@ "Kochava": "Kochava", "Kognitiv": "Kognitiv", "Kubit": "Kubit", + "Landing Page": "ランディングページ", + "Language": "言語", "lapsing user": "離脱ユーザー", "laughlin constable": "Laughlin Constable", + "Launch": "起動", + "Layout": "レイアウト", "Leadfront": "Leadfront", "lean-back viewing": "リーンバック型の視聴", "Learning": "学習", @@ -312,6 +403,7 @@ "Lob": "Lob", "local time zone": "ローカルタイムゾーン", "localization": "ローカライゼーション", + "Location": "ロケーション", "location based push notifications": "ロケーションベースプッシュ通知", "Location tracking": "位置情報の追跡", "Location Tracking Event": "ロケーション追跡イベント", @@ -325,6 +417,7 @@ "lunar solar group": "Lunar Solar Group", "macos": "MacOS", "mailbakery": "MailBakery", + "Manage": "管理", "manage setting": "設定の管理", "manager": "マネージャー", "marketer": "マーケター", @@ -334,22 +427,31 @@ "massive rocket": "Massive Rocket", "media & entertainment": "メディア&エンターテイメント", "Merkle": "Merkle", + "Message": "メッセージ", "message composer": "メッセージ作成画面", + "Messages": "メッセージ", "messaging": "メッセージング", "Messenger": "Messenger", + "Method": "方法", + "Metric": "指標", + "Metrics": "指標", "miltton": "Miltton", "mixpanel": "Mixpanel", + "Mobile": "モバイル", "mobile & web push": "モバイル&Web プッシュ", "mobile marketing": "モバイルマーケティング", "mobile marketing automation": "モバイルマーケティングオートメーション", "mobile moment": "モバイルモメント", "modal": "モーダル", + "More info": "詳細", + "More Information": "詳細情報", "most used event": "最も使用されたイベント", "Movable Ink": "Movable Ink", "MRM": "MRM", "mscale.io": "mscale.io", "multichannel messaging": "マルチチャネルメッセージング", "multilingual email": "多言語メール", + "Multiple": "複数", "multivariate": "多変量", "multivariate testing": "多変量テスト", "nested custom attribute": "階層化カスタム属性", @@ -358,6 +460,9 @@ "news feed": "ニュースフィード", "notable growth": "Notable Growth", "notification": "通知", + "Notifications": "通知", + "Number": "数値", + "Object": "オブジェクト", "Objective C": "Objective C", "OBJECTIVE-C": "OBJECTIVE-C", "OfferFit": "OfferFit", @@ -369,25 +474,34 @@ "open rate": "開封率", "operating system": "オペレーティングシステム", "opportunity cost": "機会コスト", + "Opt-In": "オプトイン", "opt-in prompt": "オプトインプロンプト", "optilyz": "optilyz", "optimize onboarding": "オンボーディング最適化", + "Optional": "オプション", + "Options": "オプション", "orchestration": "オーケストレーション", "Origin": "Origin", "OTT": "OTT", "out-of-the-box data": "SDKによる自動取得のデータ", "overage": "超過料金", + "Overview": "概要", "paid media": "有料メディア", "parenthese": "かっこ", "partner integration": "パートナー連携", "path": "パス", + "Payload": "ペイロード", "Payomatic": "Payomatic", + "Pending": "保留中", "performance": "パフォーマンス", "performance marketing": "パフォーマンスマーケティング", "permission to": "権限", + "Permissions": "権限", + "Personal": "パーソナル", "personalization": "パーソナライゼーション", - "personalized": "パーソナライズされた", + "personalized": "パーソナライズ済み", "phiture": "Phiture", + "Phone Number": "電話番号", "phrasee": "Phrasee", "platform": "プラットフォーム", "Playable": "Playable", @@ -398,18 +512,28 @@ "predictive purchase": "購入予測", "predictive suite": "Predictive Suite", "preference center": "ユーザー設定センター", + "Prerequisites": "前提条件", "preview": "プレビュー", + "Previous": "前へ", "primary conversion": "1次コンバージョン", "primary conversion rate": "1 次コンバージョン率", "priming for push": "プッシュのオプトイン促進", "private key": "秘密キー", + "Product": "製品", "profile": "プロファイル", + "Profiles": "プロファイル", + "Promotion": "プロモーション", + "Properties": "プロパティ", "property": "プロパティ", + "Provider": "プロバイダー", "public key": "公開キー", "Publicare": "Publicare", "Publicis": "Publicis", + "Purchase": "購入", + "Purchases": "購入", "push action button": "プッシュアクションボタン", "push notification": "プッシュ通知", + "Push notifications": "プッシュ通知", "push time to live": "プッシュTTL", "push token": "プッシュトークン", "R/GA": "R/GA", @@ -418,25 +542,37 @@ "Ragnarok": "Ragnarok", "rate limit": "レート制限", "react native": "React Native", + "Received": "受信済み", "recipient": "受信者", + "Recommendation": "おすすめ", "recommendation engine": "レコメンデーションエンジン", "Redpoint": "Redpoint", "reduce churn": "解約防止", + "Reference": "参照", "relationship marketing": "リレーションシップマーケティング", "Remerge": "Remerge", + "Remove": "削除", "reply-to": "返信先", "report": "レポート", + "Reports": "レポート", "request header": "リクエストヘッダー", + "Requests": "リクエスト", + "Required": "必須", "reserved": "予約", + "Response": "応答", "responsive": "レスポンシブ", "REST": "REST", "rest api": "REST API", "rest api key": "REST APIキー", + "Results": "結果", "retail": "小売 (店)", "retail & ecommerce": "リテール&E コマース", "retarget": "リターゲティングする", "retargeting": "リターゲティング", "retention": "リテンション", + "Return": "戻る", + "Revenue": "収益", + "Review": "確認", "reward": "報酬", "rich notification": "リッチプッシュ通知", "rich push": "リッチプッシュ", @@ -447,63 +583,86 @@ "SAML": "SAML", "schedule": "スケジュール", "scheduled": "スケジュールされた", + "Schema": "スキーマ", "SCHMACK": "SCHMACK", "SDK": "SDK", "SDK API Key": "SDK APIキー", - "SDK endpoint": "SDKエンドポイント", + "SDK endpoint": "SDK エンドポイント", "SDKs_deeplink": "SDKs_deeplink", "seamlessly": "シームレスに", + "Search": "検索", + "Section": "セクション", "segment": "Segment", "segment extensions": "セグメントエクステンション", "segmentation": "セグメンテーション", "segmentation tool": "セグメンテーションツール", + "Segments": "セグメント", + "Select": "選択", "Select a category...": "カテゴリーを選択...", + "Selected": "選択済み", + "Selection": "セレクション", "self-guided section": "セルフガイドセクション", "SendGrid": "SendGrid", + "Sending": "送信中", + "Service": "サービス", "session": "セッション", "setting": "設定", + "Settings": "設定", "setup task": "セットアップタスク", "Shaw/Scott": "Shaw/Scott", "Shine": "Shine", "Shopify": "Shopify", "silo": "サイロ", "silos": "サイロ化", + "Single": "単一", "Singular": "Singular", "Slalom": "Slalom", "Snowflake": "Snowflake", "solution": "ソリューション", + "Source": "ソース", + "Sources": "ソース", "SP": "サービスプロバイダー", "spam": "スパム", "spam testing": "スパムテスト", "SparkPost": "SparkPost", "SSO sign-on": "シングルサインオン", "Stacked Collective": "Stacked Collective", + "Standard": "標準", "standard attribute": "標準属性項目", "stats": "統計", "status": "ステータス", "Stensul": "Stensul", "step": "ステップ", + "Step 1": "ステップ 1", + "Step 2": "ステップ 2", "stickiness": "スティッキネス", "Story": "ストーリー", "Storytel": "Storytel", "strategist": "ストラテジスト", "strategy": "戦略", + "String": "文字列", "Stripo": "Stripo", "StyleRyde": "StyleRyde", "Sub-category": "サブカテゴリー", + "Submit": "送信", + "Subscribed": "購読中", "subscriber": "サブスクライバー", "subscriber calendars": "サブスクライバーカレンダー", "subscription": "サブスクリプション", "subscription group": "サブスクリプショングループ", + "Success": "成功", "sunsetting": "Sunsetting (配信停止)", + "Support": "サポート", "survey": "調査", "surveys": "アンケート", "SWIFT": "SWIFT", "switch": "切り替える", + "System": "システム", "tag": "タグ", "Talon.one": "Talon.One", "Tangerine": "Tangerine", "TAP London": "TAP London", + "Target": "ターゲット", "target population": "ターゲット層", "Taxi for email": "Taxi for Email", "Tealium": "Tealium", @@ -511,11 +670,14 @@ "technical tool": "テクニカルツール", "technology partner": "テクノロジーパートナー", "template": "テンプレート", + "Templates": "テンプレート", "test user": "テストユーザー", "The ASO Co": "The ASO Co", "The Growth Practice": "The Growth Practice", "The Lumery": "The Lumery", "ticketing": "チケット発行", + "Time Zone": "タイムゾーン", + "Timestamp": "タイムスタンプ", "Tinuiti": "Tinuiti", "token": "トークン", "touchpoint": "タッチポイント", @@ -523,27 +685,33 @@ "train": "トレーニング", "Transcend": "Transcend", "Transifex": "Transifex", + "Translation": "翻訳", "TRAVEL & HOSPITALITY": "旅行&ホスピタリティ", "treasure data": "トレジャーデータ", "trigger": "トリガー", "trigger based email marketing": "トリガーベースメールマーケティング", + "Triggered": "トリガー済み", "triggered message": "トリガーメッセージ", "troubleshooting tool": "トラブルシューティングツール", "TWG": "TWG", "two-factor authentication": "2 要素認証", "UK": "英国", "uninstall tracking": "アンインストール追跡", + "Unique": "ユニーク", "unique click rate": "ユニーククリック率", "Unity": "Unity", "unreal engine": "Unreal Engine", + "UNSUBS": "購読解除", "unsubscribe": "配信停止", "unsubscribe rate": "配信停止率", "update": "更新", + "Updated": "更新済み", "upgrade": "アップグレード", "upload": "アップロード", "upsell": "アップセル", "upsell strategy": "アップセル戦略", "use case": "ユースケース", + "Use Cases": "ユースケース", "user": "ユーザー", "user archival": "ユーザーアーカイブ", "user base": "ユーザー群", @@ -551,7 +719,9 @@ "user ID": "ユーザー ID", "User Nurture": "ユーザーナーチャリング", "user profile": "ユーザープロファイル", + "Values": "値", "variant": "バリアント", + "Variation": "バリエーション", "Venntifact": "Venntifact", "Vertical Stack Series": "Vertical Stack Series", "Verticurl": "Verticurl", @@ -572,13 +742,16 @@ "WhatsApp": "WhatsApp", "whitelabel": "Whitelabel (独自ドメイン利用)", "win back": "奪還", + "Window": "時間枠", "winning path": "勝者パス", "winning variant": "勝者バリアント", + "Within": "Within (範囲内)", "workforce success": "ワークフォースサクセス", "workspace": "ワークスペース", "wunderman thompson": "Wunderman Thompson", "Wyng": "Wyng", "Yodel Mobile": "Yodel Mobile", + "Your message": "メッセージ", "Zapier": "Zapier", "Zeotap": "Zeotap" -} \ No newline at end of file +} diff --git a/scripts/glossaries/ko.json b/scripts/glossaries/ko.json index de1d97de9ba..20efadbd773 100644 --- a/scripts/glossaries/ko.json +++ b/scripts/glossaries/ko.json @@ -3,19 +3,24 @@ "A/B Testing": "A/B 테스트", "abandoned cart": "유기한 장바구니", "Accelerated Mobile Pages": "가속 모바일 페이지", + "Account": "계정", "account manager": "계정 매니저", "Accuweather": "Accuweather", "ace tip": "Ace 팁", "acquisition cost": "획득 비용", "acquisition form": "획득 양식", + "Action": "동작", "action button": "실행 버튼", "action path": "행동 경로", "action-based delivery": "실행 기반 전달", "actionable insights": "유용한 인사이트", "ActionRocket": "ActionRocket", + "Actions": "행동", "actionType": "actionType", + "Active": "활성", "Active User": "활성 사용자", "ad technology": "광고 기술", + "Address": "주소", "ADM": "ADM", "advancement": "진행", "affinity": "친밀도", @@ -48,11 +53,17 @@ "Application Programming Interface (API)": "애플리케이션 프로그램 인터페이스(API)", "Appsflyer": "Appsflyer", "Apteligent": "Apteligent", + "Archive": "아카이브", "array of strings": "문자열 배열", + "Article": "문서", "artificial intelligence": "인공지능", "aspect ratio": "종횡비", "asset": "자산", + "Assets": "자산", + "Assign": "할당", + "at a": "다음 시간에", "attribute": "속성", + "Attributes": "속성", "attribution": "기여도", "attrition": "이탈", "audience": "오디언스", @@ -60,6 +71,8 @@ "audience filter": "오디언스 필터", "audience path": "오디언스 경로", "audio file": "오디오 파일", + "Authentication": "인증", + "Authorization": "승인", "automation": "자동화", "AWS": "AWS", "AWS Personalize": "AWS Personalize", @@ -69,19 +82,25 @@ "Azure Active Directory": "Azure 액티브 디렉토리", "badge": "배지", "Baidu": "Baidu", + "Banner": "배너", "Banner Content Card": "배너 콘텐츠 카드", "Barbarian": "Barbarian", "BCC": "BCC", + "Before": "이전", + "Behavior": "동작", "behavior-based automation": "행동 기반 자동화", "behavioral analytics": "행동 분석", "behavioral data": "행동 데이터", "beta service": "베타 서비스", "black list": "블랙리스트", "block list": "차단 목록", + "Blocks": "블록", "Bluedot": "Bluedot", "Bonfire": "Bonfire", + "Boolean": "부울", "boolean value": "부울 값", "Bottle Rocket": "Bottle Rocket", + "Bounce": "반송", "bounce rate": "반송률", "Braze": "Braze", "Braze Alloys": "Braze Alloys", @@ -97,6 +116,7 @@ "bucket name": "버킷 이름", "build": "구축", "builder": "빌더", + "Business": "비즈니스", "business goal": "비즈니스 목표", "business intelligence": "비즈니스 인텔리전스", "business settings": "비즈니스 설정", @@ -108,21 +128,27 @@ "callback": "콜백", "campaign": "캠페인", "campaign variant": "캠페인 배리언트", + "Campaigns": "캠페인", "canvas": "캔버스", "canvas experiment": "캔버스 실험", "canvas step": "캔버스 단계", "canvas variant": "캔버스 배리언트", + "Canvases": "캔버스", "captioned content card": "자막 콘텐츠 카드", "card analytics": "카드 분석", "card dismissal": "카드 방출", "cart abandonment": "장바구니 유기", "Case Study": "사례 연구", + "Catalog": "카탈로그", + "Catalogs": "카탈로그", "CDN": "CDN", "Census": "Census", + "Center": "가운데", "Certona": "Certona", "Changelog": "체인지로그", "channel": "채널", "channel-centric messaging": "채널 중심 메시징", + "Channels": "채널", "churn": "고객이탈", "churn barometer": "이탈 지표", "churn rate": "이탈률", @@ -132,6 +158,7 @@ "classic content card": "클래식 콘텐츠 카드", "click": "클릭", "click rate": "클릭률", + "Clicks": "클릭 수", "client": "클라이언트", "client database": "클라이언트 데이터베이스", "Clone": "복제", @@ -143,15 +170,32 @@ "Cognizant": "Cognizant", "cohort": "코호트", "cohort import": "코호트 가져오기", + "Company": "회사", + "Complete": "완료", + "Component": "구성요소", + "Components": "구성요소", + "Compose": "작성", "conditional logic": "조건 로직", + "Configuration": "구성", + "Confirm": "확인", + "Connect": "문의", + "Connected": "연결됨", "connected content": "연결된 콘텐츠", + "Connection": "연결", "connector": "커넥터", "consumer": "소비자", + "Contact": "연락처", + "Contain": "포함", + "Contains": "포함", + "Content": "콘텐츠", "content block": "콘텐츠 블록", "content card": "콘텐츠 카드", "content card campaign": "콘텐츠 카드 캠페인", + "Content Cards": "콘텐츠 카드", + "Context": "컨텍스트", "contextual": "상황별", "contextual coupon": "상황별 쿠폰", + "Control": "제어", "control group": "대조군", "conversion": "전환", "conversion event": "전환 이벤트", @@ -162,7 +206,10 @@ "Cordova": "Cordova", "Core Competency": "핵심 역량", "core value": "핵심 가치", + "Create": "생성", "create new report": "새 보고서 생성", + "Created": "생성됨", + "Creating": "생성 중", "credential": "자격 증명", "CRM": "CRM", "CRM system": "고객 관계 관리 시스템", @@ -177,8 +224,10 @@ "Currents": "커런츠", "currents integration": "커런츠 통합", "custom": "커스텀", + "Custom Attribute": "커스텀 속성", "Custom Attributes": "커스텀 속성", "Custom Code In-App Message": "사용자 지정 코드 인앱 메시지", + "Custom Event": "커스텀 이벤트", "custom events": "커스텀 이벤트", "custom object": "커스텀 오브젝트", "custom styling": "커스텀 스타일", @@ -230,6 +279,7 @@ "data privacy": "데이터 프라이버시", "data protection advisor": "데이터 보호 어드바이저", "data source": "데이터 소스", + "Data Type": "데이터 유형", "data warehouse": "데이터 웨어하우스", "data-driven": "데이터 중심", "data-driven marketing": "데이터 중심 마케팅", @@ -241,10 +291,14 @@ "deep linking": "딥링킹", "default": "기본값", "default attribute": "기본 속성", + "Delete": "삭제", "deliverability": "전달 가능성", "delivery": "전달", "Deloitte Digital": "Deloitte Digital", + "Description": "설명", + "Description:": "설명:", "destination": "대상", + "Details": "세부 정보", "developer": "개발자", "developer console": "개발자 콘솔", "device": "기기", @@ -252,9 +306,12 @@ "Digioh": "Digioh", "digital experience": "디지털 경험", "Digitas": "Digitas", + "DIRECT": "직접", "direct mail": "다이렉트 메일", + "Display": "표시", "DNS": "DNS", "docs": "문서", + "Document": "문서", "documentation": "설명서", "domain": "도메인", "dormant user": "휴면 사용자", @@ -270,18 +327,24 @@ "e-mail strategy": "이메일 전략", "eBook": "전자책", "edit": "편집", + "Editor": "콘텐츠 블록 형식", "editor block": "편집기 블록", "Edume": "EduMe", "email": "이메일", + "Email Address": "이메일 주소", "email builder": "이메일 작성기", "email list": "이메일 목록", "email reputation and deliverability": "이메일 평판 및 전달 가능성", "email sending volume": "이메일 발송량", "Email Uplers": "Email Uplers", + "Emails": "이메일", "empty field": "비어 있는 필드", + "Enable": "활성화", + "Enabled": "활성화됨", "enablement": "인에이블먼트", "end user": "최종 사용자", "endpoint": "엔드포인트", + "Endpoints": "엔드포인트", "engagement": "참여", "engagement rate": "참여율", "engagement reports": "참여 보고서", @@ -290,18 +353,25 @@ "entertainment": "엔터테인먼트", "enum": "열거형", "error code": "오류 코드", + "Errors": "오류 수", "ESP": "이메일 서비스 공급자", "ETL": "ETL", + "Event B": "이벤트 B", "event property": "이벤트 속성정보", "event stream": "이벤트 스트림", + "Event Type": "이벤트 유형", "event user": "이벤트 사용자", "event user log": "이벤트 사용자 로그", + "Events": "이벤트", + "Everyone Else": "다른 모든 사용자", "exception events": "예외 이벤트", + "Experiment": "실험", "experiment path": "실험 경로", "experiment path step": "실험 경로 단계", "experimentation loop": "실험 루프", "expiry": "만료", "exponential backoff": "지수 백오프", + "Export": "내보내기", "export code": "코드 내보내기", "external ID": "외부 ID", "external ID migration": "외부 ID 마이그레이션", @@ -312,12 +382,15 @@ "FB messenger": "FB Messenger", "FCM": "FCM", "feature": "기능", + "Fields": "필드", "filter": "필터", + "Filters": "필터", "First-party data": "퍼스트파티 데이터", "Fivetran": "Fivetran", "flash sales": "반짝 세일", "float": "플로트", "Flutter": "Flutter", + "For You": "당신을 위한", "forge connections": "연결 구축", "Fortune 500": "Fortune 500", "Foursquare": "Foursquare", @@ -333,6 +406,7 @@ "gamification": "게임화", "GCM": "GCM", "GDPR": "GDPR", + "Generate": "생성", "geofence": "지오펜스", "geofencing": "지오펜싱", "geolocation": "지리 위치", @@ -352,9 +426,10 @@ "growth practice": "Growth Practice", "growth stack": "성장 스택", "handler": "핸들러", - "hard bounce": "하드 바운스", + "hard bounce": "하드바운스", "Hathway": "Hathway", "Hawke Media": "Hawke Media", + "Header": "헤더", "Hightouch": "Hightouch", "HIPAA": "HIPAA(미국의료정보보호법)", "Horizon Media": "Horizon Media", @@ -362,18 +437,24 @@ "identifier": "식별자", "IDFA": "IDFA", "IDFV": "IDFV", + "images": "이미지", "impersonation": "가장", "implicit cost": "잠재 비용", + "Import": "가져오기", "impression": "노출 횟수", + "In-App": "인앱", "in-app message": "인앱 메시지", + "In-App Messages": "인앱 메시지", "in-browser message": "인브라우저 메시지", "inactive customer": "비활성 고객", "inbox": "받은편지함", + "includes": "포함", "independent": "독립", "independent software vendor": "독립 소프트웨어 제공업체", "influencer marketing": "인플루언서 마케팅", "infrastructure": "인프라", "Inkit": "Inkit", + "Insert": "삽입", "Inside Labs": "Inside Labs", "insight": "인사이트", "install attribution": "설치 경로", @@ -381,6 +462,7 @@ "integrated data solutions": "통합 데이터 솔루션", "integration": "통합", "integration code": "통합 코드", + "Integrations": "통합", "intelligence suite": "Intelligence Suite", "intelligent channel": "인텔리전트 채널", "intelligent selection": "지능형 선택", @@ -392,6 +474,7 @@ "interstitials": "전면광고", "intuitive tool": "직관적인 툴", "ip warming": "IP 워밍", + "is not": "다음이 아님", "ISP": "ISP", "Iterate": "Iterate", "iX.co": "iX.co", @@ -408,7 +491,10 @@ "Kognitiv": "Kognitiv", "KPI": "KPI", "Kubit": "Kubit", + "Language": "언어", "Laughlin Constable": "Laughlin Constable", + "Launch": "시작", + "Layout": "레이아웃", "Leadfront": "Leadfront", "Learning course": "학습 코스", "legacy platform": "레거시 플랫폼", @@ -426,6 +512,7 @@ "Lob.com": "Lob.com", "local time delivery": "현지 시간 전달", "localization": "현지화", + "Location": "위치", "Location tracking": "위치 추적", "login": "로그인", "long code": "긴 코드", @@ -440,6 +527,7 @@ "mail privacy protection": "MPP", "Mailbakery": "Mailbakery", "malicious code": "악성코드", + "Manage": "관리", "manage settings": "설정 관리", "management tool": "관리 툴", "manager": "매니저", @@ -455,12 +543,15 @@ "message composer": "메시지 작성기", "message engagement event": "메시지 참여 이벤트", "message segment": "메시지 세그먼트", + "Messages": "메시지", "messages per second": "초당 메시지 수", "messaging": "메시징", "messaging campaign": "메시징 캠페인", "messaging channel": "메시징 채널", "messaging experience": "메시징 경험", "Messenger": "메신저", + "Method": "방법", + "Metric": "측정기준", "metrics": "측정기준", "microsoft azure": "Microsoft Azure", "migration": "마이그레이션", @@ -468,6 +559,7 @@ "Miltton": "Miltton", "Mixpanel": "Mixpanel", "MMS": "MMS", + "Mobile": "모바일", "mobile marketing": "모바일 마케팅", "mobile marketing automation": "모바일 마케팅 자동화", "mobile moment": "모바일 모멘트", @@ -477,6 +569,8 @@ "monetization": "수익 창출", "monthly active user": "월간 활성 사용자", "monthly active user / MAU": "MAU", + "More info": "추가 정보", + "More Information": "더 많은 정보", "most used events": "최다 사용 이벤트", "Movable Ink": "Movable Ink", "Movableink": "MovableInk", @@ -486,6 +580,7 @@ "multi-channel campaign": "멀티채널 캠페인", "multichannel messaging": "멀티 채널 메시징", "multilingual emails": "다국어 이메일", + "Multiple": "다중", "multivariate testing": "다변량 테스트", "nested custom attribute": "중첩 고객 속성", "nested event property": "중첩된 이벤트 속성정보", @@ -495,22 +590,28 @@ "Nexla": "Nexla", "niche plus heat": "타겟팅과 적합성", "Notable Growth": "Notable Growth", + "Notification": "알림", "notification group": "알림 그룹", + "Notifications": "알림", "NPAW": "NPAW", "NPS": "순고객추천지수", "NuGet": "NuGet", + "Number": "숫자", "number of sessions per user": "사용자당 세션 수", + "Object": "오브젝트", "object array": "오브젝트 배열", "OfferFit": "OfferFit", "Ogilvy": "Ogilvy", "omnichannel": "옴니채널", "onboarding": "온보딩", - "open rate": "열람율", - "operating system": "운영 체제", + "open rate": "열람률", + "operating system": "운영체제", "opt-in": "옵트인", "opt-in prompt": "옵트인 안내", "opt-out link": "옵트아웃 링크", "Optilyz": "Optilyz", + "Optional": "선택 사항", + "Options": "옵션", "orchestration": "오케스트레이션", "order status": "주문 상태", "OTT": "OTT", @@ -524,19 +625,24 @@ "partner page": "파트너 페이지", "Passkit": "Passkit", "password": "비밀번호", + "Payload": "페이로드", "Payomatic": "Payomatic", "performance": "성능/성과", "performance marketing": "성과 마케팅", + "Permissions": "권한", "persistent banner": "지속 배너", "Persistent Entry Property": "지속성 항목 속성정보", + "Personal": "개인", "personalization": "개인화", "personalized": "개인화된", "personnaly indentifiable information": "개인 식별 정보", "Phiture": "Phiture", + "Phone Number": "전화번호", "Phrasee": "Phrasee", "pii": "PII", "pinned card": "고정 카드", "placeholder": "입력 안내", + "Platform": "플랫폼", "Playable": "Playable", "Podfile": "Podfile", "potential customer": "잠재고객", @@ -548,6 +654,9 @@ "Predictive Suite": "Predictive Suite", "predictive tool": "예측 기반 툴", "preheader": "프리헤더", + "Prerequisites": "필수 조건", + "Preview": "미리보기", + "Previous": "이전", "primary conversion event": "주요 전환 이벤트", "priming for push": "푸시 준비", "private key": "비공개 키", @@ -556,16 +665,23 @@ "Product Portal": "제품 포털", "product recommendation": "제품 추천", "profile": "프로필", + "Profiles": "프로필", + "Promotion": "프로모션", "promotion card": "프로모션 카드", "promotion code": "프로모션 코드", "propensity score": "성향 점수", + "Properties": "등록정보", + "Property": "등록정보", "public key": "공개 키", "Publicare": "Publicare", "Publicis": "Publicis", + "Purchase": "구매", "purchase properties": "구매 속성정보", + "Purchases": "구매", "push": "푸시", "push action buttons": "푸시 실행 버튼", "push notification": "푸시 알림", + "Push notifications": "푸시 알림", "push stories": "푸시 스토리", "push token": "푸시 토큰", "push TTL": "푸시 TTL", @@ -576,32 +692,45 @@ "Radar": "Radar", "Ragnarok": "Ragnarok", "random bucket number": "무작위 버킷 번호", + "Rate Limit": "사용량 제한", "re-engagement": "재참여", "React Native": "React Native", "real-time data": "실시간 데이터", + "Received": "수신", "recipient": "수신자", + "Recommendation": "추천", "recommendation engine": "추천 엔진", + "Reference": "참조", "referral": "추천", "refresh": "새로고침", "regex": "정규식", "regular expression": "정규표현식", "relationship marketing": "관계 마케팅", "Remerge": "Remerge", + "Remove": "제거", "repeat buyer": "재구매 고객", "repeat purchase rate": "재구매율", "repo": "리포지토리", + "Report": "보고서", "report builder": "보고서 빌더", + "Reports": "보고서", "representative": "담당자", "request header": "요청 헤더", + "Requests": "요청", + "Required": "필수", "reserved": "예약", + "Response": "응답", "REST": "REST", "REST API": "REST API", "resubscription rate": "재구독률", + "Results": "결과", "retarget": "리타겟", "retargeting": "리타겟팅", "retention rate": "유지율", + "Return": "돌아가기", "return on investment": "투자수익률", "revenue": "매출", + "Review": "검토", "rich notification": "리치 알림", "rich push": "리치 푸시", "ROI": "ROI", @@ -616,12 +745,16 @@ "SAML SSO": "SAML SSO", "save": "저장", "scalable platform": "확장 가능한 플랫폼", - "SDK": "소프트웨어 개발 키트", + "Schedule": "스케줄", + "Scheduled": "스케줄", + "SDK": "SDK", "SDK endpoint": "SDK 엔드포인트", "SDK integration": "SDK 통합", "SDWebImage": "SDWebImage", + "Search": "검색", "second party data": "세컨드파티 데이터", "secondary purchase": "2차 구매", + "Section": "섹션", "seed": "시드", "seed group": "시드 그룹", "segment": "세그먼트", @@ -630,14 +763,20 @@ "segmentation": "세분화", "segmentation criteria": "세분화 기준", "segmentation tool": "세분화 툴", + "Segments": "세그먼트", + "Select": "선택", + "Selected": "선택됨", + "Selection": "선택", "sender": "발신자", "sender reputation": "발신자 평판", "sendgrid": "SendGrid", + "Sending": "발송 중", "sense of belonging": "소속감", "server": "서버", "service": "서비스", "service worker": "서비스 종사자", "set up campaigns": "캠페인 설정", + "Settings": "설정", "setup": "설정", "Shine": "Shine", "Shopify": "Shopify", @@ -648,6 +787,7 @@ "silo": "사일로", "siloed data": "사일로화된 데이터", "siloed messaging": "사일로화된 메시징", + "Single": "단일", "single-channel approach": "단일채널 접근법", "Singular": "Singular", "SKU": "SKU", @@ -661,9 +801,11 @@ "social data": "소셜 데이터", "social media": "소셜 미디어", "social proof": "소셜 프루프", - "soft bounce": "소프트 바운스", + "soft bounce": "소프트바운스", "software-as-a-service": "SaaS(software-as-a-service)", "solutions partner": "솔루션 파트너", + "Source": "소스", + "Sources": "소스", "SP": "SP", "spam report": "스팸 신고", "spam testing": "스팸 테스트", @@ -673,8 +815,12 @@ "SSL": "SSL", "SSO": "SSO", "Stacked Collective": "Stacked Collective", + "Standard": "표준", "standard attribute": "표준 속성", + "Status": "상태", "Stensul": "Stensul", + "Step 1": "1단계", + "Step 2": "2단계", "stickiness": "사용자 고착도", "Storytel": "Storytel", "strategist": "전략가", @@ -686,16 +832,22 @@ "Sub-category": "하위 카테고리", "subject line": "제목란", "subscribe": "가입하다", + "Subscribed": "가입됨", "subscriber": "가입자", + "Subscription": "구독", "subscription group": "구독 그룹", "subscription group status": "구독 그룹 상태", "subscription management": "구독 관리", + "Success": "성공", "sunsetting": "서비스 종료", + "Support": "고객지원", "survey": "설문조사", "Swift Package Manager": "스위프트 패키지 매니저", + "System": "시스템", "tab": "탭", "tag": "태그", "Talon.one": "Talon.One", + "Target": "타겟", "target population": "대상 집단", "targeting": "타겟팅", "Taxi for email": "Taxi for email", @@ -707,12 +859,16 @@ "technology ecosystem": "기술 생태계", "technology partner": "기술 파트너", "technology stack": "기술 스택", + "Template": "템플릿", + "Templates": "템플릿", "templates & media": "템플릿 및 미디어", "test segment": "테스트 세그먼트", "test user": "테스트 사용자", "third-party cookies": "서드파티 쿠키", "third-party data": "서드파티 데이터", "time to live": "유지 시간", + "Time Zone": "시간대", + "Timestamp": "타임스탬프", "Tinuiti": "Tinuiti", "Tinyclues": "Tinyclues", "TLS": "TLS", @@ -726,9 +882,11 @@ "transactional email": "트랜잭션 이메일", "Transcend": "Transcend", "Transifex": "Transifex", + "Translation": "번역", "Treasure data": "Treasure Data", "trigger": "트리거", "trigger action": "트리거 동작", + "Triggered": "트리거됨", "triggered message": "트리거된 메시지", "troubleshooting": "문제 해결", "troubleshooting tool": "문제 해결 툴", @@ -740,27 +898,35 @@ "Two-factor authentication": "2단계 인증", "two-way communication": "양방향 소통", "uninstall tracking": "제거 추적", + "Unique": "고유", "unique open": "고유 열람", "Unity": "Unity", "Unix": "Unix", "unread indicators": "미열람 표시기", "Unreal Engine": "언리얼 엔진", + "UNSUBS": "가입 취소", "unsubscribe": "탈퇴", "unsubscribe rate": "탈퇴율", + "Update": "업데이트", + "Updated": "업데이트됨", "upsell": "업셀", "uptime": "가동 시간", "URI": "URI", "use case": "사용 사례", + "Use Cases": "활용 사례", "user alias": "사용자 별칭", "user aliasing": "사용자 별칭 지정", "user base": "사용자 기반", "user data": "사용자 데이터", + "User ID": "사용자 ID", "user import": "사용자 가져오기", "user profile": "고객 프로필", "user profile lifecycle": "고객 프로필 수명주기", "user search": "사용자 검색", "UTM tag": "UTM 태그", + "Values": "값", "variant": "배리언트", + "Variation": "변형", "Venntifact": "Venntifact", "Verticurl": "Verticurl", "Vizbee": "Vizbee", @@ -775,12 +941,16 @@ "white label": "화이트 라벨", "white list": "화이트리스트", "win back": "윈백", + "Window": "기간", + "Within": "범위", + "Workspace": "워크스페이스", "wrapper": "래퍼", "Wyng": "Wyng", "Xamarin": "Xamarin", "Yodel Mobile": "Yodel Mobile", + "Your message": "귀하의 메시지", "Zapier": "Zapier", "Zendesk": "Zendesk", "zeotap": "Zeotap", "zero-party data": "제로파티 데이터" -} \ No newline at end of file +} diff --git a/scripts/glossaries/pt-br.json b/scripts/glossaries/pt-br.json index 30ec1178112..a6101d98354 100644 --- a/scripts/glossaries/pt-br.json +++ b/scripts/glossaries/pt-br.json @@ -2,16 +2,21 @@ "2FA": "2FA", "A/B Testing": "Testes A/B", "Accelerated Mobile Pages": "Accelerated Mobile Pages", + "Account": "Conta", "Accuweather": "Accuweather", "ace tip": "dica", "acquisition cost": "custo de aquisição", "acquisition form": "forma de aquisição", + "Action": "Ação", "action paths": "jornadas de ação", "action-based delivery": "entrega baseada em ação", "actionable insights": "insights práticos", "ActionRocket": "ActionRocket", + "Actions": "Ações", + "Active": "Ativo", "ad technology": "tecnologia de anúncios", "ADB": "ADB", + "Address": "Endereço", "administrative tool": "ferramenta administrativa", "affinity": "afinidade", "agile": "ágil", @@ -30,6 +35,7 @@ "annual data point allotment": "cota anual de pontos de dados", "anti-spam filtering": "filtro anti-spam", "API": "API", + "API ID": "ID da API", "API key": "chave de API", "app": "app", "app group": "grupo de app", @@ -40,25 +46,37 @@ "application programming interface": "interface de programação de aplicativo", "Appsflyer": "Appsflyer", "Apteligent": "Apteligent", + "Archive": "Arquivar", "Are you sure you want to": "Quer mesmo", + "Article": "Artigo", "asset": "ativo", + "Assets": "Ativos", "assign": "atribuir", + "at a": "em", + "Attribute": "Atributo", + "Attributes": "Atributos", "attribution": "atribuição", "attrition": "atrito", "audience": "público", "audience builder": "construtor de público", "audience path": "jornada do público", "audio file": "arquivo de áudio", + "Authentication": "Autenticação", + "Authorization": "Autorização", "AWS": "AWS", "AWS Personalize": "AWS Personalize", "AYM Commerce": "AYM Commerce", "Azure": "Azure", "banner content card": "cartão de conteúdo de banner", "Barbarian": "Barbarian", + "Before": "Antes", + "Behavior": "Comportamento", "beta service": "serviço beta", "blacklist": "lista de proibições", + "Blocks": "Blocos", "Bluedot": "Bluedot", "Bonfire": "Bonfire", + "Boolean": "booleano", "Bottle Rocket": "Bottle Rocket", "bounce": "bounce", "bounce rate": "taxa de bounce", @@ -75,13 +93,17 @@ "bucket name": "nome do bucket", "build relationships": "construir relacionamentos", "bulk": "em massa", + "Business": "Negócios", "business goal": "meta comercial", "business intelligence": "business intelligence", + "Button": "Botão", "buying frequency": "frequência de compra", "Byte London": "Byte London", "CACI": "CACI", "callback": "retorno de chamada", + "Campaign": "Campanha", "campaign variant": "variante de campanha", + "Campaigns": "Campanhas", "canvas": "canva", "canvas experiment": "experimento do canva", "Canvas Flow": "Canvas Flow", @@ -92,12 +114,16 @@ "carrier": "operadora", "cart abandonment": "abandono de carrinho", "case study": "estudo de caso", + "Catalog": "Catálogo", + "Catalogs": "Catálogos", "Census": "Census", + "Center": "Centro", "certificate": "certificado", "changelog": "changelog", "channel": "canal", "channel enhancement": "aprimoramento de canal", "channel-centric messaging": "mensagem centrada no canal", + "Channels": "Canais", "churn": "churn", "churn barometer": "medidor de churn", "churn rate": "taxa de churn", @@ -106,26 +132,51 @@ "classic content card": "cartão de conteúdo clássico", "CLEARGOALS": "CLEARGOALS", "click-through": "cliques", + "Clicks": "Cliques", "client database": "banco de dados de cliente", "Cognizant": "Cognizant", "cohort": "coorte", + "Company": "Empresa", + "Complete": "Concluir", + "Component": "Componente", + "Components": "Componentes", + "Compose": "Redigir", "composer": "criador", + "Configuration": "Configuração", + "Confirm": "Confirmar", + "Connect": "Fale com a Braze", + "Connected": "Conectado", + "Connected Content": "Conteúdo conectado", + "Connection": "Conexão", "connector": "conector", + "Contact": "Fale com", + "Contain": "Contém", + "Content": "Conteúdo", "content block": "bloco de conteúdo", "content card": "cartão de conteúdo", + "Content Cards": "Cartões de conteúdo", + "Context": "Contexto", "contextual coupon": "cupom contextual", + "Control": "Controle", "control group": "grupo de controle", + "Conversion": "Conversão", "Convz": "Convz", "Copywriting Assistant": "Assistente de Copywriting", "Cordova": "Cordova", "core competency": "competências essenciais", "core value": "valor essencial", + "Create": "Criar", + "Created": "Criação", + "Creating": "Criando...", "CSV file": "arquivo CSV", "curation": "curadoria", "Currents": "Currents", + "Custom": "Personalizado", "custom attribute": "atributo personalizado", + "Custom Attributes": "Atributos personalizados", "custom code in-app message": "mensagem no app com código personalizado", "custom event": "evento personalizado", + "Custom Events": "Eventos personalizados", "customer ambassador": "cliente embaixador", "customer data": "dados de cliente", "customer data management": "gestão de dados de cliente", @@ -159,19 +210,31 @@ "deep learning": "deep learning", "deep link": "deep link", "deep linking": "deep linking", + "Default": "Padrão", "delay": "postergação", + "Delete": "Excluir", "deliverability": "entregabilidade", + "Delivery": "Entrega", "Deloitte Digital": "Deloitte Digital", + "Description": "Descrição", + "Description:": "Descrição:", + "Destination": "Destino", "destinations": "destinos", + "Details": "Informações", "developer console": "console de desenvolvedor", "device": "dispositivo", "Digioh": "Digioh", "Digitas": "Digitas", + "DIRECT": "DIRETOS", "direct mail": "mala direta", "direct opens": "aberturas diretas", + "Display": "Tela", "DNS provider": "provedor DNS", "DNS record": "registro DNS", "docs": "documentos", + "Document": "Documento", + "Documentation": "Documentação", + "Domain": "Domínio", "domain provider": "provedor de domínio", "dormant": "inativo", "download": "baixar", @@ -187,6 +250,7 @@ "EduMe": "EduMe", "eligible": "elegível", "email": "e-mail", + "Email Address": "Endereço de e-mail", "email list hygiene services": "serviços de higiene para listas de e-mail", "Email Must-Knows": "Tudo sobre e-mails", "email provider": "provedor de e-mail", @@ -195,8 +259,10 @@ "Email subscription group": "grupo de inscrições para e-mail", "Email Uplers": "Email Uplers", "emailing": "envio de e-mail", + "Emails": "E-mails", "employee": "colaborador", "enable": "ativar", + "Enabled": "Ativado", "enablement": "capacitação", "end-to-end": "de ponta a ponta", "engagement": "engajamento", @@ -204,13 +270,21 @@ "engagement rate": "taxa de engajamento", "engagement report": "relatório de engajamento", "Entertainment": "entretenimento", + "Errors": "Erros", + "Event B": "Evento B", + "Event Type": "Tipo de evento", "event user log": "registro de usuários de eventos", + "Events": "Eventos", "EventStream": "EventStream", + "Everyone Else": "Restante do público", + "Experiment": "Experimento", "experiment path": "jornada experimental", "experiment paths step": "etapa da jornada experimental", "experimentation loop": "ciclo de experimentação", "expiration date": "data de expiração", "expiry": "vencimento", + "Export": "Exportar", + "External ID": "ID externo", "Facebook": "Facebook", "Facebook Audience": "público do Facebook", "Fallback": "fallback", @@ -218,6 +292,9 @@ "FB Messenger": "FB Messenger", "Feature Flag": "Feature Flag", "feed": "feed", + "Fields": "Campos", + "Filter": "Filtrar", + "Filters": "Filtros", "Firebase": "Firebase", "first name": "nome", "first-party data": "dados primários", @@ -225,6 +302,7 @@ "Fivetran": "Fivetran", "flash sales": "promoção relâmpago", "For more information": "Para saber mais", + "For You": "Para você", "forge connections": "criar conexões", "Fortune 500": "Fortune 500", "Foursquare": "Foursquare", @@ -234,6 +312,7 @@ "full-service partner": "parceiro full-service", "gamification": "gamificação", "GDPR": "GDPR", + "Generate": "Gerar", "geofence": "geofence", "geofencing": "geofencing", "geolocation": "geolocalização", @@ -255,6 +334,7 @@ "hard bounce": "hard bounce", "Hathway": "Hathway", "Hawke Media": "Hawke Media", + "Header": "Cabeçalho", "health": "integridade", "heatmap": "mapa de calor", "Hightouch": "Hightouch", @@ -263,31 +343,40 @@ "holdout test": "teste de holdout", "Horizon Media": "Horizon Media", "HTML editor": "editor de HTML", + "Identifier": "Identificador", "identity provider": "provedor de identidade", "idle": "sem atividades", "iHeartRadio": "iHeartRadio", + "images": "imagens", "impersonation": "simulação", "implicit cost": "custo implícito", + "Import": "Importar", "impression": "impressão", + "In-App": "No app", "in-app experience": "experiência no app", "in-app message": "mensagem no app", + "In-App Messages": "Mensagens no app", "in-browser message": "mensagem no navegador", "inactive customer": "cliente inativo", + "includes": "inclui", "independent software vendor": "fornecedor de software independente", "Indicia Worldwide": "Indicia Worldwide", "individual consumer": "consumidor individual", "influenced opens": "aberturas por influência", "influencer marketing": "marketing de influência", "Inkit": "Inkit", + "Insert": "Inserir", "Inside Labs": "Inside Labs", "insight": "insight", "install attribution": "atribuição da instalação", + "Integrations": "Integrações", "Intelligent Timing": "Intelligent Timing", "interstitials": "intersticiais", "Invisible open tracking pixel": "pixel de rastreamento de abertura invisível", "IP pool": "pool de IP", "IP warming": "aquecimento de IP", "Iris": "Iris", + "is not": "não é", "ISP": "provedor de acesso à internet", "IT team": "equipe de TI", "Iterate": "Iterate", @@ -305,8 +394,10 @@ "Kognitiv": "Kognitiv", "Kubit": "Kubit", "landing page": "landing page", + "Language": "Idioma", "last touch": "último ponto de contato", "Laughlin Constable": "Laughlin Constable", + "Launch": "Lançamento", "Leadfront": "Leadfront", "lean-back viewing": "assistir com foco", "learning course": "curso", @@ -320,7 +411,7 @@ "Lister Digital": "Lister Digital", "live campaign": "campanha ativa", "Lob": "Lob", - "local time": "fuso local", + "local time": "Horário local", "local time delivery": "entrega no horário local", "localization": "localização", "location": "local", @@ -341,6 +432,7 @@ "mail privacy protection": "proteção de privacidade de e-mail", "Mailbakery": "Mailbakery", "mailbox provider": "provedor de caixa de e-mail", + "Manage": "Gerenciar", "management tool": "ferramenta de gestão", "marketer": "profissional de marketing", "marketing technology": "tecnologia de marketing", @@ -349,27 +441,35 @@ "MAU": "MAU", "maximum number of elements": "número máximo de elementos", "Merkle": "Merkle", - "message composer": "criador de mensagem", + "Message": "Mensagem", + "message composer": "Criador de mensagens", "message engagement": "engajamento com mensagem", "message segment": "segmento de mensagem", "message value": "valor da mensagem", + "Messages": "Mensagens", "messaging": "envio de mensagens", "messaging campaign": "campanha de mensagens", "messaging channel": "canal de envio de mensagens", "messaging experience": "experiência de mensagens", "messaging history": "histórico de mensagens", "Messenger": "Messenger", + "Method": "Método", + "Metric": "Métrica", + "Metrics": "Métricas", "Microsoft Azure": "Microsoft Azure", "milestone": "marco", "Miltton": "Miltton", "Mixpanel": "Mixpanel", "MMS": "MMS", + "Mobile": "Celular", "MOBILE & WEB PUSH": "push para mobile e web", "mobile marketing": "marketing para mobile", "mobile marketing automation": "automação de marketing para mobile", "mobile moment": "momento de uso do dispositivo móvel", "mobile SEO": "SEO para mobile", "mobile-first": "prioridade para dispositivo móvel", + "More info": "Mais informações", + "More Information": "Mais informações", "most used events": "eventos mais usados", "Movable Ink": "Movable Ink", "MovableInk": "MovableInk", @@ -378,6 +478,7 @@ "multi-channel campaign": "campanha multicanais", "multichannel messaging": "mensagens em vários canais", "multilingual emails": "e-mails em vários idiomas", + "Multiple": "Múltiplas", "multivariate": "multivariante", "multivariate testing": "testes multivariantes", "Net Promoter Score": "Net Promoter Score", @@ -386,10 +487,14 @@ "Nexla": "Nexla", "Notable Growth": "Notable Growth", "note": "nota", + "Notification": "Notificação", "notification center": "central de notificações", + "Notifications": "Notificações", "NPAW": "NPAW", "NuGet": "NuGet", + "Number": "Número", "nurturing channel": "canal de nutrição de leads", + "Object": "Objeto", "object array": "vetor de objeto", "Objective C": "Objective C", "OfferFit": "OfferFit", @@ -405,10 +510,13 @@ "opt-in prompt": "pedido de aceitação", "Optilyz": "Optilyz", "optimal messaging times": "melhores horários para envio", + "Optional": "Opcional", + "Options": "Opções", "Origin": "Origin", "orphaned user": "usuário órfão", "out-of-the-box data": "dados com captura automática", "overage": "excedente", + "Overview": "Visão geral", "owned channel": "canal proprietário", "paid media": "mídia paga", "partner integration": "integração com parceiros", @@ -418,12 +526,18 @@ "Payomatic": "Payomatic", "performance": "performance", "performance marketing": "marketing de performance", + "Permissions": "Permissões", "persistent banner": "banner persistente", "persistent entry property": "propriedade de entrada persistente", + "Personal": "Pessoal", + "Personalization": "Personalização", + "Personalized": "Personalizado", "Phiture": "Phiture", + "Phone Number": "Número de telefone", "Phrasee": "Phrasee", "PII": "IPI", "pinned card": "cartão fixado", + "Platform": "Plataforma", "Playable": "Playable", "prediction": "previsão", "prediction analytics": "análises de previsão", @@ -432,13 +546,22 @@ "Preference Center": "Central de Preferências", "preheader": "pré-cabeçalho", "Premier Support": "suporte Premier", + "Prerequisites": "Pré-requisitos", "preview": "prévia", "Primary Conversion": "conversão primária", + "Product": "Produto", "product portal": "portal do produto", "product recommendation": "recomendação do produto", + "Profile": "Perfil", + "Profiles": "Perfis", + "Promotion": "Promoção", + "Properties": "Propriedades", + "Property": "Propriedade", "Publicare": "Publicare", "Publicis": "Publicis", + "Purchase": "Compra", "purchase properties": "propriedades de compra", + "Purchases": "Compras", "push": "push", "push action button": "botão de ação por push", "push action buttons": "botões de ação por push", @@ -454,20 +577,33 @@ "Radar": "Radar", "Ragnarok": "Ragnarok", "ranking segment": "segmento de classificação", - "rate limit": "limite de frequência", + "rate limit": "Limite de taxa", "React Native": "React Native", + "Received": "Recebeu", + "Recommendation": "Recomendação", + "Reference": "Referência", "regex": "regex", "regular expression": "expressão regular", "relationship marketing": "marketing de relacionamento", "Remerge": "Remerge", + "Remove": "Remover", "repeat purchase rate": "taxa de repetição de compra", "reply to address": "endereço de resposta", "repo": "repositório", + "Report": "relatório", "representational state transfer": "transferir estado representacional", + "Requests": "Solicitações", + "Required": "Obrigatória", + "Response": "Resposta", + "REST API": "API REST", "REST API Key": "chave da API REST", + "Results": "Resultados", "retarget": "redirecionar", "retargeting": "redirecionamento", + "Return": "Voltar", "return on investment": "retorno sobre o investimento", + "Revenue": "Receita", + "Review": "Revisão", "rewards": "recompensas", "Rich notification": "notificação Rich", "ride-sharing app": "viagem por aplicativo", @@ -476,20 +612,31 @@ "Roku SDK": "Roku SDK", "S3 bucket": "bucket S3", "sales revenue": "receita de vendas", + "Schedule": "Programar", + "Scheduled": "Agendado", "SCHMACK": "SCHMACK", "SDK API Key": "Chave da API SDK", "SDK authentication": "autenticação do SDK", "SDK endpoint": "endpoint de SDK", "SDK integration": "integração de SDK", "SDWebImage": "SDWebImage", + "Search": "Pesquisar", "secondary purchase": "aquisição secundária", + "Section": "Seção", "seed group": "grupo de teste", + "Segment": "Segmento faturável", "segment builder": "criador de segmentos", "Segment Extension": "extensão de segmento", "segment extensions": "extensões de segmento", "segment insights": "insights de segmento", + "Segments": "Segmentos", + "Select": "Selecionar", + "Selected": "Selecionada", "sender reputation": "reputação do remetente", + "Sending": "Enviando", + "Service": "Atendimento", "service provider": "prestador de serviço", + "Settings": "Configurações", "sharedInstance": "sharedInstance", "Shine": "Shine", "Shopify": "Shopify", @@ -499,7 +646,8 @@ "sign up": "inscrever-se", "siloed data": "dados em silos", "siloed messaging": "mensagens em silos", - "single sign-on": "logon único", + "Single": "Individual", + "single sign-on": "login único", "single-channel approach": "abordagem de canal único", "Singular": "Singular", "Slack": "Slack", @@ -517,6 +665,8 @@ "software development kit": "kit de desenvolvimento de software", "software-as-a-service": "software como serviço", "solutions partner": "parceira de solução", + "Source": "Origem", + "Sources": "Fontes", "spam report": "relatório de spam", "SQL queries": "consultas de SQL", "Sripo": "Sripo", @@ -524,6 +674,8 @@ "Stacked Collective": "Stacked Collective", "Stensul": "Stensul", "step": "etapa", + "Step 1": "Etapa 1", + "Step 2": "Etapa 2", "Story": "story", "Storytel": "Storytel", "stream data to": "enviar dados para", @@ -531,16 +683,21 @@ "string": "string", "string value": "valor da string", "StyleRyde": "StyleRyde", + "Subscribed": "Inscreveu-se", "subscriber calendars": "calendários dos assinantes", "subscription": "inscrição", "subscription group": "grupo de inscrições", + "Success": "Deu certo", "sunsetting": "sunsetting", + "Support": "Suporte", "SWIFT": "SWIFT", "swift package manager": "Swift Package Manager", + "System": "Sistema", "tab": "guia", "tag": "tag", "Talon.One": "Talon.One", "TAP London": "TAP London", + "Target": "Alvo", "target population": "público-alvo", "targeting": "direcionamento", "Taxi for Email": "Taxi for Email", @@ -548,6 +705,7 @@ "technical integrator": "integrador técnico", "technology stack": "stack de tecnologia", "template": "modelo", + "Templates": "Modelos", "templates & media": "modelos e mídias", "test user": "usuário teste", "The ASO Co": "The ASO Co", @@ -557,6 +715,7 @@ "third-party data": "dados de terceiros", "ticketing": "criação de tickets", "time to live": "TTL", + "Time Zone": "Fuso horário", "timeframe": "período", "Tinuiti": "Tinuiti", "Tinyclues": "Tinyclues", @@ -566,32 +725,44 @@ "transactional email": "e-mail de transação", "Transcend": "Transcend", "Transifex": "Transifex", + "Translation": "Tradução", "TRAVEL & HOSPITALITY": "viagens e hospitalidade", "treatment group": "grupo de tratamento", "treatment group sample": "amostra do grupo de tratamento", - "trigger": "disparar", + "trigger": "Gatilho", "trigger action": "ação-gatilho", "trigger based email marketing": "e-mail marketing baseado em gatilhos", "Trigger Event": "evento de gatilho", + "Triggered": "Disparados", "troubleshooting tool": "ferramenta de resolução de problemas", "turnkey partner integrations": "integrações de parceiro de turnkey", "TWG": "TWG", "Twilio": "Twilio", "Two-factor authentication": "autenticação de dois fatores", "UID": "ID do usuário", + "Unique": "Únicas", "unique buyer win-back": "reconquista de comprador exclusivo", "Unity": "Unity", "Unreal Engine": "Unreal Engine", + "UNSUBS": "CANCELAMENTOS DE ASSINATURA", "unsubscribe": "cancelar inscrição", "unsubscribe link": "link de cancelamento de inscrição", "unsubscribe rate": "taxa de cancelamento de inscrição", + "Update": "Atualizar", + "Updated": "Atualizado", "upgrade": "fazer upgrade", "upload": "fazer upload", "upsell strategy": "estratégia de upsell", + "Use Cases": "Casos de uso", "user aliasing": "aliasing de usuário", "user data": "dados de usuários", + "User ID": "ID do usuário", "user import": "importação de usuário", + "User Profile": "Perfil de usuário", "UTM tag": "tag UTM", + "Values": "valores", + "Variant": "Variante", + "Variation": "Variação", "Venntifact": "Venntifact", "Vertical Stack Series": "Vertical Stack Series", "Verticurl": "Verticurl", @@ -602,11 +773,13 @@ "Waterfall": "Waterfall", "WDMP": "WDMP", "web messaging": "mensagens pela internet", - "web push": "web push", + "web push": "Push para a web", "WhatsApp Business": "WhatsApp Business", "whitelabel": "marca branca", "whitelist": "lista de permissões", "win-back": "recuperar", + "Window": "Período", + "Within": "Entre", "Workforce Success": "Workforce Success", "workspace": "espaço de trabalho", "wrapper SDK": "wrapper SDK", @@ -614,8 +787,9 @@ "Wyng": "Wyng", "Xamarin": "Xamarin", "Yodel Mobile": "Yodel Mobile", + "Your message": "Sua mensagem", "Zapier": "Zapier", "Zendesk": "Zendesk", "Zeotap": "Zeotap", "zero-party data": "dados voluntários" -} \ No newline at end of file +} diff --git a/scripts/styleguides/de.md b/scripts/styleguides/de.md new file mode 100644 index 00000000000..06cefbe35ec --- /dev/null +++ b/scripts/styleguides/de.md @@ -0,0 +1,12 @@ +# German style guide + +## Grammatical gender for "Braze" + +Omit articles before "Braze" unless grammar requires one. When an article is needed, use the gender of the head noun in the compound: + +- "das Braze SDK" (because "das SDK") + +## Register and tone + +- Use formal German (Sie) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/styleguides/es.md b/scripts/styleguides/es.md new file mode 100644 index 00000000000..359a8ffa084 --- /dev/null +++ b/scripts/styleguides/es.md @@ -0,0 +1,16 @@ +# Spanish style guide + +## Grammatical gender for "Braze" + +Avoid gendered articles directly before "Braze" when possible (prefer "de Braze", "con Braze"). When an article is required, match the gender of the head noun: + +- "el Braze SDK" (because "el SDK") + +## Terminology + +- "Feature Flags" should be translated as **conmutador de características** (plural: conmutadores de características) to match the Braze product UI in Spanish. Do not use "banderas de características". + +## Register and tone + +- Use formal Spanish (usted) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/styleguides/fr.md b/scripts/styleguides/fr.md new file mode 100644 index 00000000000..0da6483bbfa --- /dev/null +++ b/scripts/styleguides/fr.md @@ -0,0 +1,13 @@ +# French style guide + +## Grammatical gender for "Braze" + +Avoid gendered articles directly before "Braze" when possible (prefer "de Braze", "avec Braze"). When an article is required in a compound name, match the gender of the head noun: + +- "la Braze Intelligence Suite" (because "la suite") +- "le Braze SDK" (because "le SDK") + +## Register and tone + +- Use formal French (vous) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/styleguides/ja.md b/scripts/styleguides/ja.md new file mode 100644 index 00000000000..e3244b6101c --- /dev/null +++ b/scripts/styleguides/ja.md @@ -0,0 +1,6 @@ +# Japanese style guide + +## Register and tone + +- Use polite/formal Japanese (です/ます form) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/styleguides/ko.md b/scripts/styleguides/ko.md new file mode 100644 index 00000000000..d56b61f6c80 --- /dev/null +++ b/scripts/styleguides/ko.md @@ -0,0 +1,6 @@ +# Korean style guide + +## Register and tone + +- Use polite/formal Korean (합니다 form) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/styleguides/pt-br.md b/scripts/styleguides/pt-br.md new file mode 100644 index 00000000000..e6880457412 --- /dev/null +++ b/scripts/styleguides/pt-br.md @@ -0,0 +1,13 @@ +# Portuguese (Brazil) style guide + +## Grammatical gender for "Braze" + +"Braze" is **feminine** in Portuguese (the implied noun is "a empresa/plataforma"). Always use feminine articles and contractions: + +- **Correct**: a Braze, da Braze, na Braze, para a Braze +- **Incorrect**: o Braze, do Braze, no Braze, para o Braze + +## Register and tone + +- Use formal Portuguese (você) appropriate for technical documentation +- Maintain a professional, instructional tone diff --git a/scripts/translation_prompt.md b/scripts/translation_prompt.md index 865460e5d24..462dae4bbb6 100644 --- a/scripts/translation_prompt.md +++ b/scripts/translation_prompt.md @@ -63,13 +63,11 @@ An "Approved terminology" table may be appended to the end of these instructions ## Grammatical gender for brand names -"Braze" is a company name and must always remain in English — never translate or transliterate it. In languages with grammatical gender, apply the gender of the implied noun (e.g., "the company" / "the platform") when articles or prepositions are required: +"Braze" is a company name and must always remain in English — never translate or transliterate it. In languages with grammatical gender, apply the gender of the implied noun (e.g., "the company" / "the platform") when articles or prepositions are required. Refer to the language-specific style guide appended below for details. -- **Portuguese (pt-br)**: "Braze" is **feminine** (the implied noun is "a empresa/plataforma"). Always use feminine articles and contractions: "a Braze", "da Braze", "na Braze", "para a Braze". Never use masculine forms like "o Braze", "do Braze", "no Braze", "para o Braze" when referring to the company or platform. -- **French**: Avoid gendered articles directly before "Braze" when possible (prefer "de Braze", "avec Braze"). When an article is required in a compound name, match the gender of the head noun (e.g., "la Braze Intelligence Suite" because "la suite", "le Braze SDK" because "le SDK"). -- **Spanish**: Avoid gendered articles directly before "Braze" when possible (prefer "de Braze", "con Braze"). When an article is required, match the gender of the head noun (e.g., "el Braze SDK" because "el SDK"). -- **German**: Omit articles before "Braze" unless grammar requires one. When an article is needed, use the gender of the head noun in the compound (e.g., "das Braze SDK" because "das SDK"). +## Language-specific style rules +A style guide for the target language may be appended to the end of these instructions. When present, follow all rules in the style guide — they take precedence over general guidance when there is a conflict. ## Formatting rules