Crowdin 应用程序 JS
Crowdin Apps JS 是一个 JavaScript 库,可实现您的应用与 Crowdin UI 之间的通信。 由于所有 Crowdin 应用都在沙盒 \<iframe> 中运行,它们是隔离的,无法直接访问 Crowdin 主页面的内容或代码。
该库通过提供安全的跨窗口消息传递(postMessage())桥接来解决这一问题。 引入库后,您将可以访问全局 AP(App Project)对象。 该对象是调用方法(如 AP.getContext())和订阅事件(如 AP.events.on())的唯一入口点。
要使用 AP 对象,必须在应用 HTML 页面的 \<head> 中引入 iframe.js 脚本。
<script src="https://cdn.crowdin.com/apps/dist/iframe.js"></script>全局操作在您的应用可以加载的每种上下文中均可用(例如,在模态窗口、项目”工具”标签页或编辑器侧边栏中)。 所有动作均可直接从根 AP 对象调用。
这些方法允许您的应用获取有关其运行环境的基本信息,例如当前项目、用户和活动 UI 主题。
检索包含应用当前运行环境关键信息的 ContextDataObject(例如项目 ID、用户和文件数据)。
示例:
AP.getContext(function(contextData) { if (contextData) { console.log("Current project ID:", contextData.project_id); if(contextData.editor) { console.log("Current file name:", contextData.editor.fileData.name); } }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
{ "project_id": 123, "organization_id": 100001, "editor": { "mode": "translate", "theme": "dark", "source_language_id": "en", "target_language_id": "fr", // Present in "translate" and "proofread" "target_language_ids": ["fr", "uk"], // Present only in "multilingual" "active_target_language_id": "fr", // The currently active target language in the Editor "task_id": 327, // Present only if Task-based access control is enabled10 collapsed lines
"task": { "id": 327, "type": 2, "status": 0, "title": "New task", "description": "Task description", "created": "2025-01-01 10:30:00", "to_language": "French", "workflow_step_id": 0, "workflow_step_title": "", "language_id": "fr" }, "file": 987,35 collapsed lines
"fileData": { "id": "987", "is_plain_text": true, "type": "android", "status": "1", "parent_id": "0", "node_type": "1", "created": "2025-01-01 10:30:00", "extension": "xml", "priority": "1", "name": "example_file.xml", "upload_ready": 1, "export_ready": 1, "export_xliff_ready": 1, "can_change": 1, "plural_support": 1, "excluded_languages": [], "html_preview": 0, "identifier_required": 1, "total": 50, "translated": 10, "approved": 5, "preTranslated": 0, "translated_percent": 20, "approved_percent": 10, "progress": { "total": 50, "translated": 10, "approved": 5, "translated_percent": 20, "approved_percent": 10, "pre_translated": 0, "file_id": 987, "language_id": 2, "translation_link": "/editor/project-name/987/en-fr" } },3 collapsed lines
"workflow_step": { "id": 7777, "title": "Translation", "type": "Translate" } }}project_id | 类型: 描述: 当前项目的唯一数字 ID。 |
organization_id | 类型: 描述: 组织的唯一数字 ID(仅限 Crowdin Enterprise)。 |
editor | 类型: 描述: 包含编辑器上下文的对象。 如果应用不在编辑器中,则为 |
editor.mode | 类型: 允许值: 描述: 编辑器的当前模式。 |
editor.theme | 类型: 允许值: 描述: 编辑器当前的 UI 主题。 |
editor.source_language_id | 类型: 描述: 源语言的 ID(例如, |
editor.target_language_id | 类型: 描述: 当前目标语言的 ID(例如, |
editor.target_language_ids | 类型: 描述: 目标语言 ID 的数组。 |
editor.active_target_language_id | 类型: 描述: 编辑器中当前活动目标语言的 ID(例如, |
editor.task_id | 类型: 描述: 当前任务的数字 ID。 |
editor.task | 类型: 描述: 包含当前任务元数据的详细对象(例如标题、状态、描述)。 仅与 |
editor.file | 类型: 描述: 编辑器中当前打开文件的数字 ID。 |
editor.fileData | 类型: 描述: 包含已打开文件数据的详细对象。 (此对象与 |
editor.fileData.id | 类型: 描述: 文件 ID(字符串形式)。 |
editor.fileData.name | 类型: 描述: 文件名称。 |
editor.fileData.node_type | 类型: 描述: 节点类型( |
editor.fileData.total | 类型: 描述: 文件中字符串的总数。 |
editor.fileData.progress | 类型: 描述: 包含当前语言翻译进度数据的对象。 |
editor.fileData.progress.translation_link | 类型: 描述: 编辑器中文件的相对 URL 路径。 |
editor.workflow_step | 类型: 描述: 仅限 Crowdin Enterprise。 当前工作流步骤的详细信息。
如果没有活动的工作流,则为 |
editor.workflow_step.id | 类型: 描述: 工作流步骤的数字 ID。 |
editor.workflow_step.title | 类型: 描述: 工作流步骤的显示名称。 |
editor.workflow_step.type | 类型: 描述: 工作流步骤的类型(例如, |
检索当前活动用户界面(UI)主题的名称。
示例:
AP.getTheme(function(themeName) { console.log("Current theme:", themeName); // e.g., 'light', 'dark', or 'auto'});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 string。
"light"类型: string
允许值: light、dark、auto
检索包含所有活动 Crowdin CSS 变量的对象。 这允许您的应用将其元素样式设置为与用户的 UI 主题匹配,以实现无缝的外观和体验。
示例:
AP.getCssVariables(function(variables) { if (variables) { // Set our app's text color to match Crowdin's document.body.style.color = variables['--crowdin-body-color']; }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
{ "--crowdin-level-1-bg": "#f5f7f8", "--crowdin-level-2-bg": "#ffffff", "--crowdin-body-bg": "#f5f7f8", "--crowdin-title-color": "rgba(38, 50, 56, 1)", "--crowdin-body-color": "rgba(38, 50, 56, 0.87)", "--crowdin-text-muted": "rgba(38, 50, 56, 0.54)", "--crowdin-primary": "rgba(67, 160, 71, 1)", "..." : "..."}返回一个对象,其中每个键是 CSS 变量名(例如,"--crowdin-primary"),值是其当前计算值(例如,"rgba(67, 160, 71, 1)")。
检索当前用户的身份验证 JWT 令牌。 此令牌可用于代表用户发出 Crowdin API v2 请求。
示例:
AP.getJwtToken(function(token) { if (token) { console.log("My JWT:", token); } else { console.log("Token is not available in this context."); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 string,即 JWT 令牌,或 null。
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkw...SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"这组方法允许您的应用获取有关其 iframe 尺寸和位置的信息,并请求尺寸变更。
检索应用 iframe 的当前可见尺寸。 这对于了解用户滚动时实际可见的应用内容非常有用。
示例:
AP.getViewportSize(function(viewport) { console.log("Visible iframe width:", viewport.width); console.log("Visible iframe height:", viewport.height);});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
{ "width": 800, "height": 250}width | 类型: 描述: iframe 的可见宽度,以像素为单位。 |
height | 类型: 描述: iframe 的可见高度,以像素为单位,已针对 Crowdin 主标题和滚动进行调整。 |
检索整个浏览器窗口(top 窗口)的尺寸,而不仅仅是应用的 iframe。
示例:
AP.getWindowSize(function(windowSize) { console.log("Browser window width:", windowSize.width); console.log("Browser window height:", windowSize.height);});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
{ "width": 1440, "height": 900}width | 类型: 描述: 浏览器窗口的总宽度,以像素为单位。 |
height | 类型: 描述: 浏览器窗口的总高度,以像素为单位。 |
检索应用 iframe 相对于主窗口视口顶部的垂直滚动位置。
如果应用顶部可见,则返回 0。 如果用户向下滚动页面,该值将是一个正数,表示应用有多少像素滚出了视野。
示例:
AP.getScrollPosition(function(scrollPosition) { console.log("App is scrolled by:", scrollPosition, "pixels"); // Example output: 150});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
此方法返回纯 integer,表示像素数。
150更新应用 iframe 的尺寸。 这是控制应用视图大小的主要方法。
示例:
// Request to resize the iframe to 400px wide and 500px tallAP.resize('400px', '500px');
// You can also use percentagesAP.resize('100%', '300px');width | 类型: 必填: 是 描述: 所需宽度(例如, |
height | 类型: 必填: 是 描述: 所需高度(例如, |
检索应用 iframe 的当前尺寸。
示例:
const currentSize = AP.size();console.log("Current width:", currentSize.w);console.log("Current height:", currentSize.h);{ "w": "100%", "h": 926}w | 类型: 描述: iframe 的当前宽度(例如, |
h | 类型: 描述: iframe 的当前高度,以像素为单位。 |
AP.registerIntersectionObserver(elementId, callback)
Section titled “AP.registerIntersectionObserver(elementId, callback)”为应用 iframe 中的某个元素注册交叉观察器。 这允许您检测当用户滚动时元素何时变为可见或隐藏。
示例:
// Assuming you have an element: <div id="my-element"></div>AP.registerIntersectionObserver('my-element', function(entry) { if (entry.isIntersecting) { console.log('Element is now visible!'); } else { console.log('Element is hidden.'); }});elementId | 类型: 必填: 是 描述: 要观察的 DOM 元素的 |
callback | 类型: 必填: 是 描述: 当元素可见性改变时触发的回调函数。 该函数接收一个 |
这些方法允许您的应用控制 Crowdin 内的导航,例如将用户重定向到新页面或关闭应用视图。
将用户的整个浏览器窗口重定向到 Crowdin 内的不同页面。
示例(Crowdin):
// Redirects to the user's account settingsAP.redirect('/settings#account');
// Redirects to a project's Activity tabAP.redirect('/project/my-project/activity-stream');
// Redirects to the Store with queryParamsAP.redirect('/store/apps', {'a': 123});示例(Crowdin Enterprise):
// Redirects to the user's account settingsAP.redirect('/u/user_settings');
// Redirects to a project's Activity tabAP.redirect('/u/projects/15/activity');
// Redirects to the Store with queryParamsAP.redirect('u/marketplace/apps', {'a': 123});path | 类型: 必填: 是 描述: 要重定向到的 Crowdin 内相对路径。 Crowdin 和 Crowdin Enterprise 的路径不同。 |
queryParams | 类型: 必填: 否 描述: 可选的键值对对象,将作为 URL 搜索参数添加。 |
关闭应用当前运行所在的模态窗口。
示例:
// Close the modal this app is running inAP.closeAppModal();当应用从顶部导航栏(“navbar”)打开时,关闭应用的视图。
示例:
// Close the app's panelAP.closeNavbarExtension();这些方法由渲染自定义表单或需要基于 schema 数据的应用使用,例如 Crowdin Enterprise 中的自定义工作流步骤。
检索应用表单中的当前数据。 当用户尝试从自定义应用界面继续时,Crowdin 通常会调用此方法。
示例:
AP.getFormData(function(formData) { if (formData) { console.log("Current form data:", formData); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收表单数据对象或 |
有效载荷完全取决于应用的表单数据。
{ "custom_field": "some-value", "another_setting": true}此对象的结构由您的应用定义。
通知 Crowdin 应用表单中的数据已更改。
示例:
// Call this inside your app when a form field changesconst myFormData = { custom_field: "new-value" };AP.formDataUpdated(myFormData);detail | 类型: 必填: 是 描述: 包含表单数据新状态的对象。 |
检索 Crowdin 提供的用于渲染应用 UI 的初始数据。 这通常用于需要任务特定数据的自定义工作流步骤。
示例:
AP.getRenderData(function(renderData) { if (renderData) { console.log("Initial data for rendering:", renderData); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收渲染数据对象或空对象 |
有效载荷是动态的,取决于应用的上下文。
{ "task_id": 123, "file_ids": [10, 11, 12]}此对象的结构是动态的,由启动应用的上下文定义。
检索为应用定义的表单 schema。 这通常由基于 Crowdin 提供的 schema 渲染 UI 的应用使用。
示例:
AP.getSchema(function(schema) { if (schema) { console.log("Form schema:", schema); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 schema 对象或 |
有效载荷是表单 schema 对象,通常采用 JSON Schema 格式。
{ "type": "object", "properties": { "custom_field": { "type": "string", "title": "Custom Field" } }}此对象的结构是动态的,由应用的配置定义。
这些方法允许您的应用从编辑器 UI 获取信息并在其中执行操作。 这些方法仅在应用加载到 Crowdin 编辑器(例如侧边面板)中时可用,所有方法均通过 AP.editor 对象调用。
这组方法允许您的应用读取编辑器中当前正在查看的字符串和文件的相关信息,以及更改文件选择。
检索编辑器中当前活动(高亮)源字符串的数据对象。
示例:
AP.editor.getString(function(stringData) { if (stringData) { console.log("Active string ID:", stringData.id); } else { console.log("No string is currently active."); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
{ "id": 1568759, "identifier": "welcome.key", "text": "Welcome!", "context": "Main screen welcome message", "max_length": 0, "file": { "id": 15385, "name": "google_play.xml" }}id | 类型: 描述: 源字符串的唯一数字 ID。 |
identifier | 类型: 描述: 字符串的键或标识符(例如, |
text | 类型: 描述: 源字符串的完整文本。 |
context | 类型: 描述: 与字符串关联的上下文。 |
max_length | 类型: 描述: 翻译允许的最大长度( |
file | 类型: 描述: 包含此字符串所属文件信息的对象。 |
file.id | 类型: 描述: 文件的唯一 ID。 |
file.name | 类型: 描述: 文件名称。 |
检索当前字符串列表中所有可见字符串的数据对象数组(遵循当前文件、过滤器和页面设置)。
示例:
AP.editor.getStringsList(function(strings) { if (strings && strings.length > 0) { console.log("Total strings in list:", strings.length); console.log("First string:", strings[0]); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "id": 1569759, "project_id": "844514", "text": "Welcome!", "key": "welcome", "file_id": 15411 }, { "id": 1569761, "project_id": "844514", "text": "Save as...", "key": "save_as", "file_id": 15411 }]id | 类型: 描述: 源字符串的唯一数字 ID。 |
project_id | 类型: 描述: 此字符串所属项目的 ID。 |
text | 类型: 描述: 源字符串的文本。 |
key | 类型: 描述: 字符串的键或标识符。 |
file_id | 类型: 描述: 此字符串所属文件的唯一 ID。 |
检索用户在编辑器列表中当前选中(勾选)的字符串的相关信息。
示例:
AP.editor.getSelectedStrings(function(selectedData, selectedCount) { if (selectedData === 'all') { console.log(`All ${selectedCount} strings are selected.`); } else { console.log(`Selected ${selectedCount} individual strings:`, selectedData); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收两个参数(按此顺序):
|
[ { "string": { "id": 1569759, "identifier": "welcome", "text": "Welcome!", "context": "welcome", "max_length": 0, "file": { "id": 15411, "name": "crowdin_sample_android.xml" } }, "translations": { "fr": [] } }, { "string": { "id": 1569761, "identifier": "save_as", "text": "Save as...", "context": "save_as", "max_length": 0, "file": { "id": 15411, "name": "crowdin_sample_android.xml" } }, "translations": { "fr": [ { "id": 690949, "text": "Sauvegarder sous..." } ] } }]如果项目中的所有字符串都被选中,回调的第一个参数返回:
"all"当 selectedData 为数组时,以下字段适用于返回的 SelectedStringObject 项:
string | 类型: 描述: 源字符串对象。 请参阅 |
translations | 类型: 描述: 包含字符串翻译的对象,以语言 ID 为键。 |
translations.[language_id] | 类型: 描述: 指定目标语言(例如, |
检索文件树中当前选中(勾选)的所有文件的数据对象数组。
示例:
AP.editor.getSelectedFiles(function(files) { if (files && files.length > 0) { console.log("Selected files count:", files.length); console.log("First selected file:", files[0].name); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "id": "15411", "is_plain_text": true, "type": "android10", "status": "1", "parent_id": "0", "node_type": "1", "created": "2025-11-07 14:53:28", "extension": "xml", "priority": "1", "name": "crowdin_sample_android.xml", "upload_ready": 1, "export_ready": 1, "export_xliff_ready": 1, "can_change": 1, "plural_support": 1, "excluded_languages": [], "html_preview": false, "identifier_required": 1, "total": 45, "translated": 0, "approved": 0, "preTranslated": 0, "translated_percent": 0, "approved_percent": 0 }]id | 类型: 描述: 文件的唯一 ID。 |
name | 类型: 描述: 文件名称。 |
type | 类型: 描述: 文件类型标识符(例如, |
node_type | 类型: 描述: 文件树中节点的类型(例如, |
total | 类型: 描述: 文件中字符串的总数。 |
translated | 类型: 描述: 文件中已翻译的字符串数(针对当前语言)。 |
approved | 类型: 描述: 文件中已审核的字符串数(针对当前语言)。 |
AP.editor.isMultipleFilesSelected(callback)
Section titled “AP.editor.isMultipleFilesSelected(callback)”检查文件树中当前是否有多个文件被选中(勾选)。
示例:
AP.editor.isMultipleFilesSelected(function(isMultiple) { if (isMultiple) { console.log("Multiple files are selected."); } else { console.log("Only one file (or no files) is selected."); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
此方法返回纯 boolean。
true更改编辑器视图以聚焦于单个不同的文件。
示例:
// Switch the Editor to show strings from file with ID 15409AP.editor.changeFile('15409');fileId | 类型: 必填: 是 描述: 要切换到的文件的 ID。 |
在文件树中选择多个文件。 这是用户勾选多个文件复选框的程序等效操作。
示例:
// Select two specific files in the file listAP.editor.changeFiles(['15409', '15411']);fileIds | 类型: 必填: 是 描述: 要选择的文件 ID 数组(字符串或整数形式)。 |
AP.editor.getUnsavedSourceStrings(callback)
Section titled “AP.editor.getUnsavedSourceStrings(callback)”检索有未保存更改的源字符串列表。
示例:
AP.editor.getUnsavedSourceStrings(function(unsavedStrings) { if (unsavedStrings) { console.log("Unsaved strings:", unsavedStrings); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收未保存字符串对象的数组或 |
这组方法允许您读取翻译建议,以及在编辑器翻译区域中写入或修改文本。
检索当前活动源字符串的所有翻译和建议(来自用户、翻译记忆和 MT)的数组。
示例:
AP.editor.getTranslations(function(translations) { if (translations && translations.length > 0) { console.log("Total translations/suggestions:", translations.length); console.log("First translation author:", translations[0].author.login); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "id": 690949, "string_id": 1569689, "text": "Translation text", "target_language_id": "fr", "votes_rating": 0, "approved": false, "author": { "id": "12729493", "login": "example_user", "name": "Example User", "avatar_url": "https://.../avatar.png" }, "created_at": "2025-11-07T08:19:10-05:00" }]id | 类型: 描述: 翻译的唯一数字 ID。 |
string_id | 类型: 描述: 此翻译所属源字符串的 ID。 |
text | 类型: 描述: 翻译文本。 |
target_language_id | 类型: 描述: 此翻译所针对语言的 ID(例如, |
votes_rating | 类型: 描述: 此翻译当前的投票得分。 |
approved | 类型: 描述: 如果翻译已审核,则为 |
author | 类型: 描述: 包含翻译作者用户信息的对象。 |
author.id | 类型: 描述: 作者的唯一 ID。 |
author.login | 类型: 描述: 作者的登录名。 |
created_at | 类型: 描述: 翻译创建时间的 ISO 8601 时间戳。 |
检索当前活动字符串”顶部”翻译的单个 TranslationObject(例如,已批准的翻译或获得最多票数的翻译)。
示例:
AP.editor.getTopTranslation(function(topTranslation) { if (topTranslation) { console.log("Top translation text:", topTranslation.text); } else { console.log("No translations exist for this string yet."); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
{ "id": 690949, "string_id": 1569689, "text": "This is the top translation.", "target_language_id": "fr", "votes_rating": 1, "approved": true, "author": { "id": "12729493", "login": "example_user" }, "created_at": "2025-11-07T08:19:10-05:00"}此方法返回单个 TranslationObject。 完整属性列表请参阅 AP.editor.getTranslations 的结构表。
为活动字符串设置或覆盖编辑器主翻译文本区域中的文本。
示例:
// Set the translation text to "Hello world"AP.editor.setTranslation("Hello world");text | 类型: 必填: 是 描述: 要插入翻译区域的文本。 |
将文本追加到编辑器翻译文本区域中现有文本的末尾。
示例:
// If the text area contains "Hello", this will change it to "Hello world"AP.editor.appendTranslation(" world");text | 类型: 必填: 是 描述: 要追加的文本。 |
清除活动字符串编辑器翻译文本区域中的所有文本。
示例:
AP.editor.clearTranslation();将浏览器焦点设置到编辑器的翻译文本区域。
示例:
AP.editor.setFocus();AP.editor.setUnsavedSuggestion(suggestion)
Section titled “AP.editor.setUnsavedSuggestion(suggestion)”为特定字符串设置”未保存的建议”。 这用于以编程方式添加翻译而不保存,通常在多语言视图中使用。
示例:
AP.editor.setUnsavedSuggestion({ id: 1569759, // The numeric or string ID of the phrase text: 'My unsaved suggestion', // The translation text languageId: 'fr', // Target language code pluralId: 1, // Optional: Specific plural form ID translationId: 45678 // Optional: ID if editing an existing translation});suggestion | 类型: 必填: 是 描述: 包含建议详细信息的对象。 请参阅下方的 |
id | 类型: 必填: 是 描述: 源字符串(短语)的数字或字符串 ID。 |
text | 类型: 必填: 是 描述: 翻译文本。 |
languageId | 类型: 必填: 是 描述: 目标语言的 ID(例如, |
pluralId | 类型: 必填: 否 描述: 复数形式的 ID(例如, |
translationId | 类型: 必填: 否 描述: 如果您正在编辑现有翻译,则为该翻译的 ID。 |
AP.editor.setUnsavedSuggestions(suggestions)
Section titled “AP.editor.setUnsavedSuggestions(suggestions)”一次设置多个”未保存的建议”。
示例:
AP.editor.setUnsavedSuggestions([ { id: 1569759, text: 'Suggestion 1', languageId: 'fr', pluralId: '1' }, { id: 1569761, text: 'Suggestion 2', languageId: 'fr', pluralId: null }]);suggestions | 类型: 必填: 是 描述: 建议对象的数组。 请参阅 |
AP.editor.removeUnsavedSuggestions(suggestions)
Section titled “AP.editor.removeUnsavedSuggestions(suggestions)”删除一个或多个”未保存的建议”。
示例:
// Remove a specific unsaved suggestionAP.editor.removeUnsavedSuggestions([ { id: 1569759, text: 'Suggestion 1', languageId: 'fr', pluralId: '1' }]);suggestions | 类型: 必填: 是 描述: 要删除的建议对象数组。 格式与 |
AP.editor.applyUnsavedTranslations(method, data)
Section titled “AP.editor.applyUnsavedTranslations(method, data)”根据提供的方法应用(保存)所有未保存的翻译。
示例:
// Apply unsaved translations only for the selected stringsAP.editor.applyUnsavedTranslations('selectedStrings', null);
// Apply unsaved translations for a specific list of string IDsAP.editor.applyUnsavedTranslations('providedStrings', [1569759, 1569761]);method | 类型: 必填: 是 描述: 用于应用翻译的方法。 允许值: |
data | 类型: 必填: 是 描述: 数字字符串 ID 的数组。 仅当 |
这组方法允许您的应用读取和控制编辑器中使用的字符串过滤器,包括基本过滤器、高级筛选器和 CroQL 查询。
检索所有可用基本过滤器的完整列表,包括其名称和数字 ID。
示例:
AP.editor.getFiltersList(function(filters) { console.log("Available filters:", filters);});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "name": "Show All", "value": 3 }, { "name": "Untranslated", "value": 2 }, { "name": "Not Approved", "value": 5 }, { "name": "Approved", "value": 4 }, { "name": "Machine Translations" }, { "name": "All", "value": 10 }, { "name": "All, Untranslated First", "value": 0 }]name | 类型: 描述: 过滤器的显示名称(例如,“Untranslated”)。 |
value | 类型: 描述: 过滤器的数字 ID。 此值供 |
检索当前活动基本筛选器的数字 ID(例如,“未翻译”、“已批准”)。
示例:
AP.editor.getFilter(function(filterId) { console.log("Current filter ID:", filterId); // Example output: 0 (for "All, Untranslated First")});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 integer。
0使用数字 ID 将基本过滤器应用于字符串列表。
示例:
// Filter the list to show only "Untranslated" strings (ID 2)AP.editor.setFilter(2);filterNumber | 类型: 必填: 是 描述: 要应用的过滤器的数字 ID。 请参阅 |
以下是一些最常用的默认过滤器 ID:
- 0:全部,未翻译优先
- 2:未翻译
- 3:显示全部
- 4:已审核
- 5:已翻译,未审核
- 7:有评论
- 10:由翻译记忆或 MT 翻译
- 12:高级筛选器
- 30:由翻译记忆翻译
- 31:由 MT 翻译
检索表示”高级筛选器”当前状态的对象。
示例:
AP.editor.getCustomFilter(function(customFilter) { if (customFilter) { console.log("Current advanced filter settings:", customFilter); console.log("Filtering by translation status:", customFilter.translations); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
{ "translations": "untranslated", "labels": [123, 456], "label_match_rule": "any", "comments": "have_comments", "croql_expression": "", "ai_query": ""}CustomFilterObject 包含编辑器高级筛选器对话框中所有可用字段。 以下是一些关键属性:
translations | 类型: 允许值: 描述: 根据翻译状态过滤字符串。 |
comments | 类型: 允许值: 描述: 根据是否有评论过滤字符串。 |
labels | 类型: 描述: 要过滤的标签 ID 数组。 |
croql_expression | 类型: 描述: 用于高级过滤的自定义 CroQL 表达式。 |
通过提供筛选器对象,将”高级筛选器”应用于字符串列表。
示例:
// Filter for untranslated strings with specific labelsAP.editor.setCustomFilter({ translations: 'untranslated', labels: [123, 456], label_match_rule: 'any'});customFilter | 类型: 必填: 是 描述: 包含过滤条件的 |
点击查看所有可用的过滤器属性
{ added_from: '', added_to: '', updated_from: '', updated_to: '', translations: '', // 'translated', 'untranslated' duplicates: '', tm_and_mt: '', pre_translation: '', approvals: '', comments: '', // 'have_comments', 'no_comments' screenshots: '', visibility: '', qa_issues: '', labels: [], label_match_rule: 'any', // 'all', 'any' exclude_labels: [], exclude_label_match_rule: 'all', string_type: '', votes: '', votes_count: null, approvals_count_select: '', approvals_count: null, translated_by_user: '', not_translated_by_user: '', approved_by_user: '', not_approved_by_user: '', sort_method: 0, sort_ascending: 1, croql_expression: '', ai_query: ''}将”高级筛选器”重置为默认(空)状态。
示例:
AP.editor.resetCustomFilter();以字符串形式检索当前活动的 CroQL 过滤器查询。
示例:
AP.editor.getCroqlFilter(function(croqlQuery) { if (croqlQuery) { console.log("Current CroQL query:", croqlQuery); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
此方法返回纯 string。
"text = "Welcome!""将 CroQL 过滤器应用于字符串列表。
示例:
// Filter strings where the text is "Welcome!"AP.editor.setCroqlFilter("text = 'Welcome!'");croql | 类型: 必填: 是 描述: 有效的 CroQL 查询字符串。 |
将 CroQL 过滤器重置为默认(空)状态。
示例:
AP.editor.resetCroqlFilter();这组方法允许您读取和控制编辑器的状态,例如当前视图模式、页面、选定语言或搜索查询。
检索当前活动编辑器模式的名称。
示例:
AP.editor.getMode(function(modeName) { console.log("Current mode:", modeName); // Example output: "translate"});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 string。
"translate"类型: string
允许值: translate、proofread、review、multilingual
将编辑器切换到不同的模式。
示例:
// Switch the Editor to Proofreading modeAP.editor.setMode('proofread');modeName | 类型: 必填: 是 描述: 要切换到的模式名称。 允许值: |
检索字符串列表的当前页码。
示例:
AP.editor.getPage(function(pageNumber) { console.log("Current page:", pageNumber); // Example output: 1});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 integer。
1将字符串列表切换到特定页码。
示例:
// Go to the second page of stringsAP.editor.setPage(2);pageNumber | 类型: 必填: 是 描述: 要导航到的页码。 |
AP.editor.getProjectTargetLanguages(callback)
Section titled “AP.editor.getProjectTargetLanguages(callback)”检索编辑器中当前用户可用的项目目标语言列表。
示例:
AP.editor.getProjectTargetLanguages(function(languages) { if (languages && languages.length > 0) { console.log("Available languages:", languages); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "id": "2", "name": "French", "internal_code": "fr", "code": "fr", "preferred": false }, { "id": "3", "name": "German", "internal_code": "de", "code": "de", "preferred": true }]id | 类型: 描述: 语言的唯一 ID(例如, |
name | 类型: 描述: 语言的显示名称(例如,“French”)。 |
code | 类型: 描述: 语言代码(例如, |
AP.editor.setTargetLanguage(languageIds, [callback])
Section titled “AP.editor.setTargetLanguage(languageIds, [callback])”在并排和舒适模式下将编辑器切换到不同的目标语言,或在多语言模式下设置活动语言。
示例(并排和舒适模式):
// Switch the Editor to German (ID "11")AP.editor.setTargetLanguage('11');示例(多语言模式):
// Set the active languages to German (ID "11") and French (ID "2")AP.editor.setTargetLanguage(['11', '2']);languageIds | 类型: 必填: 是 描述: 字符串 ID(例如, |
callback | 类型: 必填: 否 描述: 可选回调,如果任何请求的语言 ID 未找到,则返回错误消息。 |
在编辑器中对指定文本执行搜索。
示例:
// Perform a simple search for the word "Welcome"AP.editor.search("Welcome");
// Perform a case-sensitive searchAP.editor.search("Welcome", { caseSensitive: true, search_option: 1 });text | 类型: 必填: 是 描述: 要搜索的文本。 |
options | 类型: 必填: 否 描述: 包含搜索选项的对象。 请参阅下方的 |
searchStrict | 类型: 描述: 如果为 |
searchFullMatch | 类型: 描述: 如果为 |
caseSensitive | 类型: 描述: 如果为 |
search_option | 类型: 描述: 定义搜索范围。 |
这组方法允许您的应用向用户显示反馈消息(例如通知、成功或错误消息),并管理应用图标上的通知徽章。
在编辑器顶部显示黄色”通知”消息栏。
示例:
AP.editor.noticeMessage("This is a test notification.");message | 类型: 必填: 是 描述: 要在消息栏中显示的文本。 |
在编辑器顶部显示绿色”成功”消息栏。
示例:
AP.editor.successMessage("The operation was successful!");message | 类型: 必填: 是 描述: 要在消息栏中显示的文本。 |
在编辑器顶部显示红色”错误”消息栏。
示例:
AP.editor.errorMessage("An error occurred. Please try again.");message | 类型: 必填: 是 描述: 要在消息栏中显示的文本。 |
AP.editor.setApplicationNotification(count)
Section titled “AP.editor.setApplicationNotification(count)”在编辑器侧边面板中应用图标上设置带有数字的蓝色通知徽章。
示例:
AP.editor.setApplicationNotification(2);count | 类型: 必填: 是 描述: 要在通知徽章中显示的数字。 |
从应用图标上移除通知徽章。
示例:
AP.editor.clearApplicationNotification();这组方法允许您的应用读取有关项目工作流的信息,并控制用户在该工作流中的状态。
检索当前项目中用户可用的所有工作流步骤列表。
示例:
AP.editor.getWorkflowSteps(function(steps) { if (steps && steps.length > 0) { console.log("Available workflow steps:", steps); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收 |
[ { "id": 752, "title": "Translation", "type": "Translate", "editor_mode": "translate", "approving_available": true, "source_language": { "id": 52, "name": "English", "code": "en" } }, { "id": 753, "title": "Proofreading", "type": "Proofread", "editor_mode": "proofread", "approving_available": true, "source_language": { "id": 52, "name": "English", "code": "en" } }]id | 类型: 描述: 工作流步骤的唯一数字 ID。 |
title | 类型: 描述: 工作流步骤的显示名称(例如,“Translation”)。 |
type | 类型: 描述: 步骤的类型(例如,“Translate”、“Proofread”)。 |
editor_mode | 类型: 描述: 此步骤对应的编辑器模式。 |
approving_available | 类型: 描述: 如果可以在此步骤审核翻译,则为 |
source_language | 类型: 描述: 包含源语言详细信息的对象。 |
AP.editor.getWorkflowStepStatusFilter(callback)
Section titled “AP.editor.getWorkflowStepStatusFilter(callback)”检索当前工作流步骤处于当前状态的活动过滤器。
示例:
AP.editor.getWorkflowStepStatusFilter(function(status) { console.log("Current step status filter:", status); // Example output: "ALL"});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个 |
此方法返回纯 string。
"ALL"类型: string
允许值: ALL、ToDo、Pending、Done
将编辑器切换到不同的工作流步骤。
示例:
// Switch the Editor to workflow step with ID 753AP.editor.setWorkflowStep(753);stepId | 类型: 必填: 是 描述: 要切换到的工作流步骤的 ID。 请参阅 |
AP.editor.setWorkflowStepStatusFilter(status)
Section titled “AP.editor.setWorkflowStepStatusFilter(status)”设置当前工作流步骤的状态过滤器。
示例:
// Filter to show only strings that are "DONE"AP.editor.setWorkflowStepStatusFilter('DONE');status | 类型: 必填: 是 描述: 要过滤的状态。 允许值: |
这些方法允许您的应用获取用户光标在源字符串区域或翻译文本区域中当前选中的文本。
AP.editor.source.getSelectedText(callback)
Section titled “AP.editor.source.getSelectedText(callback)”检索用户光标在源字符串区域中当前选中的文本。
示例:
AP.editor.source.getSelectedText(function(selectedText) { if (selectedText) { console.log("User selected this source text:", selectedText); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回选中文本的纯 string,如果未选中任何文本则返回 null。
"Selected source text"AP.editor.textarea.getSelectedText(callback)
Section titled “AP.editor.textarea.getSelectedText(callback)”检索用户光标在翻译文本区域中当前选中的文本。
示例:
AP.editor.textarea.getSelectedText(function(selectedText) { if (selectedText) { console.log("User selected this translation text:", selectedText); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回选中文本的纯 string,如果未选中任何文本则返回 null。
"My selected translation"这组方法提供了用于自定义编辑器原生行为的高级集成点,例如添加自定义上下文菜单、管理快捷键以及应用自定义样式。
AP.editor.registerContextMenuAction(action, callback)
Section titled “AP.editor.registerContextMenuAction(action, callback)”在编辑器的上下文菜单中注册一个自定义项目(右键单击时出现的菜单)。
您必须定义 action 对象,callback 将返回同一对象,并附加 eventSubscriptionId。 然后使用 AP.events.on 监听该 ID 上的点击事件。
示例:
// 1. Define and register the context menu itemAP.editor.registerContextMenuAction({ type: 'textarea-context-menu', name: 'My Custom Action'}, function(action) {
// 2. Listen for clicks on this specific item AP.events.on(action.eventSubscriptionId, function() { console.log(`'${action.name}' was clicked!`); AP.editor.noticeMessage("Custom action triggered!"); });});action | 类型: 必填: 是 描述: 动作的配置对象。 请参阅下方的 |
callback | 类型: 必填: 是 描述: 一个回调函数,接收返回的动作对象,现在包含用于事件处理的 |
type | 类型: 必填: 是 描述: 将显示该动作的上下文菜单类型。 可能的值:
|
name | 类型: 必填: 是 描述: 将在上下文菜单中显示的文本标签。 |
children | 类型: 必填: 否 描述: 可选的子 |
回调接收返回的 action 对象,并附加 eventSubscriptionId。
{ "type": "textarea-context-menu", "name": "My Test Action", "eventSubscriptionId": "context.menu.click:GGChNhE"}eventSubscriptionId | 类型: 描述: 此菜单项的唯一 ID。 使用此 ID 配合 |
…加上您提供的 | |
源字符串上下文菜单的简单动作
AP.editor.registerContextMenuAction({ type: 'source-string-context-menu', name: 'Run custom action'}, function(action) { AP.events.on(action.eventSubscriptionId, () => { // Run custom logic when clicked console.log('Custom action triggered.'); });});带子菜单的动作
AP.editor.registerContextMenuAction({ type: 'source-string-context-menu', name: 'My Actions', children: [ { name: 'Explain selection' }, { name: 'Check grammar' } ]}, function(action) { // Handle the child menu items if (action.children) { action.children.forEach((childAction) => { AP.events.on(childAction.eventSubscriptionId, () => { // Add the logic that should happen on click console.log(`'${childAction.name}' was clicked.`); }); }); }});翻译区域中选定文本的动作
AP.editor.registerContextMenuAction({ type: 'textarea-context-menu', name: 'Log selected text'}, function(action) { AP.events.on(action.eventSubscriptionId, () => { // Get the selected text and process it AP.editor.textarea.getSelectedText(function(text) { if (text) { console.log('Selected text:', text); } }); });});检索包含编辑器中当前活动所有快捷键的字符串。
示例:
AP.editor.getHotKeys(function(hotkeys) { console.log("Active hotkeys:", hotkeys);});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收一个参数: |
此方法返回纯 string,快捷键以逗号分隔。
"Command+Enter,Command+[,Command+],Control+Shift+C,……"AP.editor.propagateHotKeyPress(hotKeyPressed)
Section titled “AP.editor.propagateHotKeyPress(hotKeyPressed)”手动将快捷键按下事件从应用的 iframe 传播到主编辑器。 如果您的应用捕获了某个按键事件(例如”Enter”),并且您也希望编辑器对此作出响应,此功能将非常有用。
示例:
// Tell the Editor that the "Command+Enter" hotkey was pressedAP.editor.propagateHotKeyPress('Command+Enter');hotKeyPressed | 类型: 必填: 是 描述: 被按下的快捷键字符串(例如, |
AP.editor.applyCustomThemeStyle(theme, callback)
Section titled “AP.editor.applyCustomThemeStyle(theme, callback)”将自定义主题配置应用于编辑器 UI。 这允许对颜色、背景和元素高亮进行深度自定义。
示例:
AP.editor.applyCustomThemeStyle({ themeMode: 'dark', // Context mode ('light' or 'dark') primaryAccent: '#35a1ff', base: { baseBackground: '#16191d', stringStatus: { translated: '#74bb02', approved: '#35a1ff' }, highlights: { placeholderColor: '#35a1ff', placeholderBg: 'rgba(53, 161, 255, 0.1)', tagColor: '#74bb02', tagBg: 'rgba(116, 187, 2, 0.1)', nonePrintableCharacterColor: '#3eb17f', findAndReplaceHighlightBg: '#cc9a06', specialLightColor: '#35a1ff', specialLightBg: 'rgba(53, 161, 255, 0.05)' } }, accents: { info: { accentColor: '#35a1ff' }, danger: { accentColor: '#ff4444' }, warning: { accentColor: '#cc9a06' }, success: { accentColor: '#74bb02' } }}, (result) => { if (result) { console.error('Error applying theme:', result); } else { console.log('Theme applied successfully'); }});theme | 类型: 必填: 是 描述: 包含 UI 颜色和样式配置的 |
callback | 类型: 必填: 否 描述: 处理响应的回调函数。 如果应用失败,则接收错误消息字符串;成功时接收 |
移除 AP.editor.applyCustomThemeStyle 应用的所有自定义 CSS。
示例:
AP.editor.resetCustomThemeStyle();这些方法允许您的应用在编辑器中打开和关闭模态窗口。
打开应用中已定义的某个”模态”模块。
示例:
// Open a modal moduleAP.editor.openModal({ resource: 'my-modal-key', size: 'medium'}, function(success) { if (success) { console.log("Modal opened successfully."); }});options | 类型: 必填: 是 描述: 模态框的配置对象。 请参阅下方的 |
callback | 类型: 必填: 否 描述: 可选回调函数,成功时接收 |
resource | 类型: 必填: 是 描述: 要打开的模态模块的 |
size | 类型: 必填: 否 描述: 模态窗口的大小。 允许值: |
onClose | 类型: 必填: 否 描述: 模态框关闭时将执行的可选回调函数。 |
关闭当前打开的模态框,但仅当它是由您的应用使用 AP.editor.openModal 打开时。
示例:
// Close the modalAP.editor.closeModal();这组方法允许您的应用与 Crowdin 项目进行交互,例如导航到不同的项目页面或打开编辑器。 所有方法均通过 AP.project 对象调用。
将用户重定向到当前项目中的不同页面。
示例:
// Redirects to the project's Activity tabAP.project.redirect('/activity-stream');
// Forces a full-page reload to the project's rootAP.project.redirect('/', true);path | 类型: 必填: 是 描述: 项目内要重定向到的相对路径(例如, |
hardRedirect | 类型: 必填: 否 描述: 如果设置为 |
打开内置的 Crowdin 模态对话框。
示例:
// Open the "Pre-translation via MT" modalAP.project.openModal('mt-pre-translation');modalName | 类型: 必填: 是 描述: 要打开的内置模态框的名称。 允许值: |
AP.project.openEditor(fileId, [view], [languageCode])
Section titled “AP.project.openEditor(fileId, [view], [languageCode])”为特定文件打开 Crowdin 编辑器。
示例:
// Open a specific file in the default viewAP.project.openEditor('15411');
// Open a file in Multilingual mode for a specific languageAP.project.openEditor('15411', 'multilingual', 'de');fileId | 类型: 必填: 是 描述: 要打开的文件的 ID。 |
view | 类型: 必填: 否 描述: 要打开的编辑器模式(例如, |
languageCode | 类型: 必填: 否 描述: 要打开的语言代码(例如, |
根据项目类型将用户导航到相应的选项卡(文件型项目的翻译或字符串型项目的下载),并触发预览下载(CSV 或 XLSX 格式)。
示例:
// Trigger a preview download in CSV formatAP.project.previewTranslations('csv');action | 类型: 必填: 是 描述: 要下载的预览格式。 允许值: |
检索项目选项卡的配置对象,指示项目上下文中哪些选项卡当前可见或隐藏。
示例:
AP.project.getTabsConfiguration(function(config) { if (config) { console.log("Current tabs configuration:", config); }});callback | 类型: 必填: 是 描述: 处理响应的回调函数。 该函数接收选项卡配置对象的 |
此方法返回对象的 array。
[ { "identifier": "home", "visible": true }, { "identifier": "sources", "visible": true },41 collapsed lines
{ "identifier": "translations", "visible": true }, { "identifier": "screenshots", "visible": true }, { "identifier": "tasks", "visible": true }, { "identifier": "members", "visible": true }, { "identifier": "integrations", "visible": true }, { "identifier": "reports", "visible": false }, { "identifier": "activity-stream", "visible": true }, { "identifier": "discussions", "visible": true }, { "identifier": "tools", "visible": true }, { "identifier": "test_app¦test_app-project-menu", "visible": true }, { "identifier": "settings", "visible": true }]AP.project.saveTabsConfiguration(params, callback)
Section titled “AP.project.saveTabsConfiguration(params, callback)”保存项目选项卡的新配置。 这允许您以编程方式在项目上下文中显示或隐藏特定选项卡。
示例:
const newConfig = [ { "identifier": "home", "visible": true }, { "identifier": "sources", "visible": true },40 collapsed lines
{ "identifier": "translations", "visible": true }, { "identifier": "screenshots", "visible": true }, { "identifier": "tasks", "visible": false }, { "identifier": "members", "visible": false }, { "identifier": "integrations", "visible": true }, { "identifier": "reports", "visible": false }, { "identifier": "activity-stream", "visible": true }, { "identifier": "discussions", "visible": true }, { "identifier": "tools", "visible": true }, { "identifier": "test_app¦test_app-project-menu", "visible": true }, { "identifier": "settings", "visible": true }];
AP.project.saveTabsConfiguration({ tabs_configuration: newConfig }, function(success) { if (success) { console.log("Configuration saved successfully."); }});params | 类型: 必填: 是 描述: 包含新配置的对象。 请参阅下方的 |
callback | 类型: 必填: 否 描述: 可选回调函数,成功时接收 |
tabs_configuration | 类型: 必填: 是 描述: 选项卡配置对象的数组。 请参阅 |
这组方法允许您的应用与用户的账户个人资料页面进行交互,在项目之外。 所有方法均通过 AP.profile 对象调用。
将用户重定向到其”个人资料”区域内的其他页面。
示例:
// Redirects the user to their "Tasks" pageAP.profile.redirect('/tasks');path | 类型: 必填: 是 描述: 用户个人资料中要重定向到的相对路径(例如, |
这些方法用于控制模态窗口(例如,从模态框自身的 iframe 内设置模态框的大小)。
更新应用当前运行所在模态窗口的尺寸和滚动行为。
示例:
// Update the modal size and scroll behaviorAP.modal.setSize({ width: "600px", height: "600px", hideXScrolls: true, // Optional, default: true hideYScrolls: false // Optional, default: false});options | 类型: 必填: 是 描述: 包含尺寸和滚动设置的对象。 请参阅下方的 |
width | 类型: 必填: 是 描述: 所需宽度(例如, |
height | 类型: 必填: 是 描述: 所需高度(例如, |
hideXScrolls | 类型: 必填: 否 描述: 是否隐藏水平滚动条。 默认值为 |
hideYScrolls | 类型: 必填: 否 描述: 是否隐藏垂直滚动条。 默认值为 |
这些方法允许您的应用监听并响应 Crowdin UI 中发生的事件(例如,当用户更改字符串或保存翻译时),以及触发自己的自定义事件。 所有方法均通过 AP.events 对象调用。
详细了解支持的事件。
为事件订阅一个监听器。 这是监听 Crowdin UI 事件(例如 string.change)以及应用或库发出的自定义内部事件的主要方法。
示例:
// Listen for the 'string.change' event from CrowdinAP.events.on('string.change', function(stringData) { console.log("User switched to string ID:", stringData.id);});eventName | 类型: Required: 是 描述: 要监听的事件名称(例如, |
callback | 类型: 必填: 是 描述: 事件触发时执行的函数。 该函数接收特定于事件的数据有效载荷对象。 |
为事件订阅一个监听器,但该监听器在执行一次后会自动移除。
示例:
// Run this code only the next time a translation is addedAP.events.once('translation.added', function(translation) { console.log("A translation was added:", translation.text);});eventName | 类型: 必填: 是 描述: 要监听的事件名称。 |
callback | 类型: 必填: 是 描述: 事件触发时执行一次的函数。 |
移除之前通过 AP.events.on 或 AP.events.once 注册的特定事件监听器。
示例:
const myListener = function(data) { console.log(data); };
// Start listeningAP.events.on('string.change', myListener);
// Stop listeningAP.events.off('string.change', myListener);eventName | 类型: 必填: 是 描述: 要取消订阅的事件名称。 |
callback | 类型: 必填: 是 描述: 用于注册监听器的完全相同的函数对象。 |
移除特定事件的所有事件监听器。
示例:
// Stop all listeners for the 'string.change' eventAP.events.offAll('string.change');eventName | 类型: 必填: 是 描述: 要移除所有监听器的事件名称。 |
订阅一个针对任何事件都会触发的监听器。 这对于调试以查看通过系统传递的所有事件非常有用。
示例:
AP.events.onAny(function(eventName, eventData) { console.log("Event fired:", eventName, "with data:", eventData);});callback | 类型: 必填: 是 描述: 接收两个参数的回调函数: |
移除通过 AP.events.onAny 注册的特定监听器。
示例:
const myDebugListener = function(eventName, eventData) { /* ... */ };AP.events.onAny(myDebugListener);
// Later, to stop listeningAP.events.offAny(myDebugListener);callback | 类型: 必填: 是 描述: 用于注册监听器的完全相同的函数对象。 |
在您的应用中触发自定义事件。 所有通过 AP.events.on 注册的监听器都将被触发。
示例:
// Fire a custom event with some dataAP.events.emit('my-custom-event', { status: 'updated' });eventName | 类型: 必填: 是 描述: 要触发的自定义事件的名称。 |
data | 类型: 必填: 否 描述: 发送给事件监听器的可选数据负载。 |
使用这些事件名称与 AP.events.on() 方法,以监听 Crowdin UI 中发生的操作。
| 事件 | 详情与负载 |
|---|---|
string.change | 当用户从一个原文字符串切换到另一个时触发。 负载: 一个 |
string.selected | 当用户选择或取消选择字符串时触发(使用并排视图中的复选框)。 负载: 一个由 |
textarea.edited | 当用户在译文文本区域进行任何更改(输入、删除、粘贴)时触发。 负载: 一个包含字符串数据、 |
translation.added | 当用户保存新译文时触发。 负载: 新保存译文的 |
translation.deleted | 当用户删除译文时触发。 负载: 一个包含已删除译文的 |
translation.restored | 当用户恢复已删除的译文时触发。 负载: 已恢复的 |
translation.vote | 当用户对译文进行投票(赞或踩)时触发。 负载: 更新后的 |
translation.approve | 当用户批准译文时触发。 负载: 更新后的 |
translation.disapprove | 当用户撤销对译文的批准时触发。 负载: 更新后的 |
language.change | 当用户在编辑器中更改目标语言时触发。 负载: 完整的 |
file.change | 当用户在编辑器中切换到不同文件时触发。 负载: 完整的 |
theme.changed | 当用户更改 UI 主题时触发。 负载: 一个包含新主题名称的 |
asset.source.preview | 当在编辑器中选择源资源文件时触发(适用于基于资源的项目)。 负载: |
asset.suggestion.preview | 当在编辑器中选择建议资源文件时触发(适用于基于资源的项目)。 负载: 一个包含 |