sanity-plugin-transifex 5.0.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -75,6 +75,8 @@ import {DefaultDocumentNodeResolver} from 'sanity/desk'
|
|
|
75
75
|
import {TranslationsTab, defaultDocumentLevelConfig} from 'sanity-plugin-transifex'
|
|
76
76
|
//if you are using field-level translations, you can import the field-level config instead:
|
|
77
77
|
//import {TranslationsTab, defaultFieldLevelConfig} from 'sanity-plugin-transifex'
|
|
78
|
+
//if your fields use sanity-plugin-internationalized-array, use the internationalized array config:
|
|
79
|
+
//import {TranslationsTab, defaultI18nArrayConfig} from 'sanity-plugin-transifex'
|
|
78
80
|
//if you're not sure which, please look at the document-level and field-level sections below
|
|
79
81
|
|
|
80
82
|
export const defaultDocumentNode: DefaultDocumentNodeResolver = (S, {schemaType}) => {
|
|
@@ -112,9 +114,45 @@ For example, on a document you don't want to be translated, you may have a "titl
|
|
|
112
114
|
}
|
|
113
115
|
```
|
|
114
116
|
|
|
117
|
+
If your fields use [sanity-plugin-internationalized-array](https://github.com/sanity-io/plugins/tree/main/plugins/sanity-plugin-internationalized-array), use the `defaultI18nArrayConfig` configuration instead. Both data formats of that plugin are supported -- v4 and below, where the language lives in the item's `_key`:
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
{
|
|
121
|
+
//...other document fields,
|
|
122
|
+
title: [
|
|
123
|
+
{_key: 'en', _type: 'internationalizedArrayStringValue', value: 'My title is here.'},
|
|
124
|
+
{_key: 'es', _type: 'internationalizedArrayStringValue', value: 'Mi título está aquí.'},
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
and v5 and above, where the language lives in a dedicated `language` field:
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
{
|
|
133
|
+
//...other document fields,
|
|
134
|
+
title: [
|
|
135
|
+
{
|
|
136
|
+
_key: 'abc123',
|
|
137
|
+
_type: 'internationalizedArrayStringValue',
|
|
138
|
+
language: 'en',
|
|
139
|
+
value: 'My title is here.',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
_key: 'def456',
|
|
143
|
+
_type: 'internationalizedArrayStringValue',
|
|
144
|
+
language: 'es',
|
|
145
|
+
value: 'Mi título está aquí.',
|
|
146
|
+
},
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Imported translations will be written back in whichever format the document already uses.
|
|
152
|
+
|
|
115
153
|
### Document level translations
|
|
116
154
|
|
|
117
|
-
Since we often find users want to use the [Document internationalization plugin](https://www.sanity.io/plugins/document-internationalization) if they're using document-level translations, we assume that any documents you want in different languages will be present in a `translation.metadata` document.
|
|
155
|
+
Since we often find users want to use the [Document internationalization plugin](https://www.sanity.io/plugins/document-internationalization) if they're using document-level translations, we assume that any documents you want in different languages will be present in a `translation.metadata` document. Both metadata formats are read transparently: version 5 and below of that plugin, where the language lives in the `_key` of each entry in the `translations` array, and version 6 and above, where the language lives in a dedicated `language` field. Existing metadata documents keep their detected format when written to; brand-new metadata documents default to the v6 format, configurable via the `newMetadataFormat` option (set it to `'legacy'` if you are still on v5 or below).
|
|
118
156
|
|
|
119
157
|
_Important_: The above is true if you are using the Document Internationalization Plugin at version 2 or above. If you are using version 1 please use the `legacyDocumentLevelConfig` configuration exported from this plugin. This configuration assumes your translations follow the pattern `{id-of-base-language-document}__i18n_{locale}`
|
|
120
158
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Adapter, BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationFunctionContext, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, legacyDocumentLevelPatch } from "sanity-translations-tab";
|
|
1
|
+
import { Adapter, BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationFunctionContext, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelPatch } from "sanity-translations-tab";
|
|
2
2
|
declare const TransifexAdapter: Adapter;
|
|
3
3
|
interface ConfigOptions {
|
|
4
4
|
adapter: Adapter;
|
|
@@ -9,5 +9,6 @@ interface ConfigOptions {
|
|
|
9
9
|
declare const defaultDocumentLevelConfig: ConfigOptions;
|
|
10
10
|
declare const legacyDocumentLevelConfig: ConfigOptions;
|
|
11
11
|
declare const defaultFieldLevelConfig: ConfigOptions;
|
|
12
|
-
|
|
12
|
+
declare const defaultI18nArrayConfig: ConfigOptions;
|
|
13
|
+
export { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TransifexAdapter, TranslationsTab, customSerializers, defaultDocumentLevelConfig, defaultFieldLevelConfig, defaultI18nArrayConfig, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelConfig, legacyDocumentLevelPatch };
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/transifexAdapter/index.ts","../src/index.ts"],"mappings":";cAOa,gBAAA,EAAkB,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/transifexAdapter/index.ts","../src/index.ts"],"mappings":";cAOa,gBAAA,EAAkB,OAAA;AAAA,UCiBrB,aAAA;EACR,OAAA,EAAS,OAAA;EACT,gBAAA;EACA,oBAAA,GACE,EAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA,CAAQ,MAAA;EACb,iBAAA,GACE,EAAA,UACA,QAAA,UACA,GAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA;AAAA;AAAA,cAED,0BAAA,EAA4B,aAAA;AAAA,cAM5B,yBAAA,EAA2B,aAAA;AAAA,cAM3B,uBAAA,EAAyB,aAAA;AAAA,cAOzB,sBAAA,EAAwB,aAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { baseDocumentLevelConfig, baseFieldLevelConfig, legacyDocumentLevelConfig as legacyDocumentLevelConfig$1 } from "sanity-translations-tab";
|
|
2
|
-
import { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, legacyDocumentLevelPatch } from "sanity-translations-tab";
|
|
1
|
+
import { baseDocumentLevelConfig, baseFieldLevelConfig, baseI18nArrayConfig, legacyDocumentLevelConfig as legacyDocumentLevelConfig$1 } from "sanity-translations-tab";
|
|
2
|
+
import { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelPatch } from "sanity-translations-tab";
|
|
3
3
|
const baseTransifexUrl = "https://rest.api.transifex.com", getHeaders = (secrets) => ({
|
|
4
4
|
Authorization: `Bearer ${secrets?.token}`,
|
|
5
5
|
"Content-Type": "application/vnd.api+json"
|
|
@@ -189,6 +189,10 @@ const baseTransifexUrl = "https://rest.api.transifex.com", getHeaders = (secrets
|
|
|
189
189
|
...baseFieldLevelConfig,
|
|
190
190
|
adapter: TransifexAdapter,
|
|
191
191
|
secretsNamespace: "transifex"
|
|
192
|
+
}, defaultI18nArrayConfig = {
|
|
193
|
+
...baseI18nArrayConfig,
|
|
194
|
+
adapter: TransifexAdapter,
|
|
195
|
+
secretsNamespace: "transifex"
|
|
192
196
|
};
|
|
193
197
|
export {
|
|
194
198
|
BaseDocumentDeserializer,
|
|
@@ -199,10 +203,12 @@ export {
|
|
|
199
203
|
customSerializers,
|
|
200
204
|
defaultDocumentLevelConfig,
|
|
201
205
|
defaultFieldLevelConfig,
|
|
206
|
+
defaultI18nArrayConfig,
|
|
202
207
|
defaultStopTypes,
|
|
203
208
|
documentLevelPatch,
|
|
204
209
|
fieldLevelPatch,
|
|
205
210
|
findLatestDraft,
|
|
211
|
+
i18nArrayPatch,
|
|
206
212
|
legacyDocumentLevelConfig,
|
|
207
213
|
legacyDocumentLevelPatch
|
|
208
214
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import type {Secrets} from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null): Record<string, string> => ({\n 'Authorization': `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null): string =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n let locales = []\n if (secrets) {\n const response = await fetch(`${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`, {\n headers: getHeaders(secrets),\n })\n\n if (!response.ok) {\n throw Error(`Failed to retrieve locales from Transifex. Status: ${response.status}`)\n }\n\n locales = await response.json().then((res) =>\n res.data.map((lang: Record<string, any>) => ({\n enabled: true,\n description: lang['attributes']['name'],\n localeId: lang['attributes']['code'],\n })),\n )\n }\n return locales\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getLocales} from './getLocales'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n return {\n taskId: documentId,\n documentId: documentId,\n locales: [],\n }\n }\n const projectFilter = `filter[project]=${projOrgSlug(secrets)}`\n const resourceFilter = `filter[resource]=${projOrgSlug(secrets)}:r:${documentId}`\n const task = await fetch(\n `${baseTransifexUrl}/resource_language_stats?${projectFilter}&${resourceFilter}`,\n {headers: getHeaders(secrets)},\n )\n .then((res) => {\n if (res.ok) {\n return res.json()\n }\n //normal -- just means that this task doesn't exist yet.\n else if (res.status === 404) {\n return {data: []}\n }\n throw Error(`Failed to retrieve tasks from Transifex. Status: ${res.status}`)\n })\n .then((res) => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => {\n const reviewedStrings = Number(locale['attributes']['reviewed_strings'])\n const totalStrings = Number(locale['attributes']['total_strings'])\n\n return {\n localeId: locale['relationships']['language']['data']['id'].split(':')[1],\n progress:\n Number.isFinite(reviewedStrings) && Number.isFinite(totalStrings) && totalStrings > 0\n ? Math.floor((100 * reviewedStrings) / totalStrings)\n : 0,\n }\n }),\n }))\n\n const locales = await getLocales(secrets)\n const localeIds = locales.map((l: Record<string, any>) => l['localeId'])\n const validLocales = task.locales.filter((locale: Record<string, any>) =>\n localeIds.find((id: string) => id === locale['localeId']),\n )\n task.locales = validLocales\n\n return task\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getTranslationTask} from './getTranslationTask'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nconst createResource = async (\n doc: Record<string, any>,\n documentId: string,\n secrets: Secrets | null,\n) => {\n const resourceCreateBody = {\n data: {\n attributes: {\n accept_translations: true,\n name: doc['name'],\n slug: documentId,\n },\n relationships: {\n i18n_format: {\n data: {\n id: 'HTML_FRAGMENT',\n type: 'i18n_formats',\n },\n },\n project: {\n data: {\n id: projOrgSlug(secrets),\n type: 'projects',\n },\n },\n },\n type: 'resources',\n },\n }\n\n const response = await fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n\n if (!response.ok) {\n throw Error(`Failed to create Transifex resource. Status: ${response.status}`)\n }\n\n const res = await response.json()\n const resourceId = res?.data?.id\n\n if (!resourceId) {\n throw Error('Failed to create Transifex resource. Missing resource id in response.')\n }\n\n return resourceId\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n _localeIds: string[],\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n throw Error('Missing documentId or Transifex secrets.')\n }\n\n const resourceResponse = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n {headers: getHeaders(secrets)},\n )\n let resourceId: string | null = null\n\n if (resourceResponse.status === 404) {\n resourceId = null\n } else if (!resourceResponse.ok) {\n throw Error(`Failed to retrieve Transifex resource. Status: ${resourceResponse.status}`)\n } else {\n const resource = await resourceResponse.json()\n resourceId = resource.data ? resource.data.id : null\n }\n\n if (!resourceId) {\n resourceId = await createResource(document, documentId, secrets)\n }\n\n const resourceUploadUrl = `${baseTransifexUrl}/resource_strings_async_uploads`\n const resourceUploadBody = {\n data: {\n attributes: {\n content: document['content'],\n content_encoding: 'text',\n },\n relationships: {\n resource: {\n data: {\n id: resourceId,\n type: 'resources',\n },\n },\n },\n type: 'resource_strings_async_uploads',\n },\n }\n\n const uploadResponse = await fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n })\n\n if (!uploadResponse.ok) {\n throw Error(`Failed to upload resource strings to Transifex. Status: ${uploadResponse.status}`)\n }\n\n return getTranslationTask(documentId, secrets)\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, getHeaders} from './helpers'\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>,\n retryCount = 0,\n maxRetries = 20,\n): Promise<string> => {\n const response = await fetch(`${resourceDownloadUrl}/${translationDownloadId}`, {\n headers: headers,\n })\n\n if (retryCount >= maxRetries) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId} after ${maxRetries} retries.`,\n )\n }\n\n if (response.status === 500) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received 500 for translation download ID ${translationDownloadId}. Trying to reconnect...`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.redirected) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received redirect for translation download ID ${translationDownloadId}. Following redirect now for file download.`,\n )\n return response.url\n } else if (response.status === 200) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId}. Location is still pending, trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.status === 401 || response.status === 403) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId}. Status: ${response.status}`,\n )\n }\n console.error(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId} but received error code ${response.status}. Waiting and trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n}\n\nconst handleFileDownload = (url: string) => {\n return fetch(url).then((res) => res.text())\n}\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets) {\n throw Error('Missing Transifex secrets.')\n }\n\n const resourceDownloadBody = {\n data: {\n attributes: {\n content_encoding: 'text',\n },\n relationships: {\n language: {\n data: {\n id: `l:${localeId}`,\n type: 'languages',\n },\n },\n resource: {\n data: {\n id: taskId,\n type: 'resources',\n },\n },\n },\n type: 'resource_translations_async_downloads',\n },\n }\n\n const resourceDownloadUrl = `${baseTransifexUrl}/resource_translations_async_downloads`\n const downloadResponse = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n\n if (!downloadResponse.ok) {\n throw Error(\n `Failed to create translation download request in Transifex. Status: ${downloadResponse.status}`,\n )\n }\n\n const download = await downloadResponse.json()\n const translationDownloadId = download?.data?.id\n\n if (!translationDownloadId) {\n throw Error('Failed to create translation download request in Transifex. Missing download id.')\n }\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n )\n return handleFileDownload(location)\n}\n","import type {Adapter} from 'sanity-translations-tab'\n\nimport {createTask} from './createTask'\nimport {getLocales} from './getLocales'\nimport {getTranslation} from './getTranslation'\nimport {getTranslationTask} from './getTranslationTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n} from 'sanity-translations-tab'\nimport type {Adapter, TranslationFunctionContext} from 'sanity-translations-tab'\n\nimport {TransifexAdapter} from './transifexAdapter'\n\nexport {\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationsTab,\n} from 'sanity-translations-tab'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext,\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n legacyDocumentLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","token","projOrgSlug","organization","project","getLocales","locales","response","fetch","headers","ok","Error","status","json","then","res","data","map","lang","enabled","description","localeId","getTranslationTask","documentId","taskId","projectFilter","resourceFilter","task","locale","reviewedStrings","Number","totalStrings","split","progress","isFinite","Math","floor","localeIds","l","validLocales","filter","find","id","createResource","doc","resourceCreateBody","attributes","accept_translations","name","slug","relationships","i18n_format","type","method","body","JSON","stringify","resourceId","createTask","document","_localeIds","resourceResponse","resource","resourceUploadUrl","resourceUploadBody","content","content_encoding","uploadResponse","pollForFileDownloadLocation","resourceDownloadUrl","translationDownloadId","retryCount","maxRetries","console","info","Promise","resolve","setTimeout","redirected","url","error","handleFileDownload","text","getTranslation","resourceDownloadBody","language","downloadResponse","location","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import type {Secrets} from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null): Record<string, string> => ({\n 'Authorization': `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null): string =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n let locales = []\n if (secrets) {\n const response = await fetch(`${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`, {\n headers: getHeaders(secrets),\n })\n\n if (!response.ok) {\n throw Error(`Failed to retrieve locales from Transifex. Status: ${response.status}`)\n }\n\n locales = await response.json().then((res) =>\n res.data.map((lang: Record<string, any>) => ({\n enabled: true,\n description: lang['attributes']['name'],\n localeId: lang['attributes']['code'],\n })),\n )\n }\n return locales\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getLocales} from './getLocales'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n return {\n taskId: documentId,\n documentId: documentId,\n locales: [],\n }\n }\n const projectFilter = `filter[project]=${projOrgSlug(secrets)}`\n const resourceFilter = `filter[resource]=${projOrgSlug(secrets)}:r:${documentId}`\n const task = await fetch(\n `${baseTransifexUrl}/resource_language_stats?${projectFilter}&${resourceFilter}`,\n {headers: getHeaders(secrets)},\n )\n .then((res) => {\n if (res.ok) {\n return res.json()\n }\n //normal -- just means that this task doesn't exist yet.\n else if (res.status === 404) {\n return {data: []}\n }\n throw Error(`Failed to retrieve tasks from Transifex. Status: ${res.status}`)\n })\n .then((res) => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => {\n const reviewedStrings = Number(locale['attributes']['reviewed_strings'])\n const totalStrings = Number(locale['attributes']['total_strings'])\n\n return {\n localeId: locale['relationships']['language']['data']['id'].split(':')[1],\n progress:\n Number.isFinite(reviewedStrings) && Number.isFinite(totalStrings) && totalStrings > 0\n ? Math.floor((100 * reviewedStrings) / totalStrings)\n : 0,\n }\n }),\n }))\n\n const locales = await getLocales(secrets)\n const localeIds = locales.map((l: Record<string, any>) => l['localeId'])\n const validLocales = task.locales.filter((locale: Record<string, any>) =>\n localeIds.find((id: string) => id === locale['localeId']),\n )\n task.locales = validLocales\n\n return task\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getTranslationTask} from './getTranslationTask'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nconst createResource = async (\n doc: Record<string, any>,\n documentId: string,\n secrets: Secrets | null,\n) => {\n const resourceCreateBody = {\n data: {\n attributes: {\n accept_translations: true,\n name: doc['name'],\n slug: documentId,\n },\n relationships: {\n i18n_format: {\n data: {\n id: 'HTML_FRAGMENT',\n type: 'i18n_formats',\n },\n },\n project: {\n data: {\n id: projOrgSlug(secrets),\n type: 'projects',\n },\n },\n },\n type: 'resources',\n },\n }\n\n const response = await fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n\n if (!response.ok) {\n throw Error(`Failed to create Transifex resource. Status: ${response.status}`)\n }\n\n const res = await response.json()\n const resourceId = res?.data?.id\n\n if (!resourceId) {\n throw Error('Failed to create Transifex resource. Missing resource id in response.')\n }\n\n return resourceId\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n _localeIds: string[],\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n throw Error('Missing documentId or Transifex secrets.')\n }\n\n const resourceResponse = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n {headers: getHeaders(secrets)},\n )\n let resourceId: string | null = null\n\n if (resourceResponse.status === 404) {\n resourceId = null\n } else if (!resourceResponse.ok) {\n throw Error(`Failed to retrieve Transifex resource. Status: ${resourceResponse.status}`)\n } else {\n const resource = await resourceResponse.json()\n resourceId = resource.data ? resource.data.id : null\n }\n\n if (!resourceId) {\n resourceId = await createResource(document, documentId, secrets)\n }\n\n const resourceUploadUrl = `${baseTransifexUrl}/resource_strings_async_uploads`\n const resourceUploadBody = {\n data: {\n attributes: {\n content: document['content'],\n content_encoding: 'text',\n },\n relationships: {\n resource: {\n data: {\n id: resourceId,\n type: 'resources',\n },\n },\n },\n type: 'resource_strings_async_uploads',\n },\n }\n\n const uploadResponse = await fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n })\n\n if (!uploadResponse.ok) {\n throw Error(`Failed to upload resource strings to Transifex. Status: ${uploadResponse.status}`)\n }\n\n return getTranslationTask(documentId, secrets)\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, getHeaders} from './helpers'\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>,\n retryCount = 0,\n maxRetries = 20,\n): Promise<string> => {\n const response = await fetch(`${resourceDownloadUrl}/${translationDownloadId}`, {\n headers: headers,\n })\n\n if (retryCount >= maxRetries) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId} after ${maxRetries} retries.`,\n )\n }\n\n if (response.status === 500) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received 500 for translation download ID ${translationDownloadId}. Trying to reconnect...`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.redirected) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received redirect for translation download ID ${translationDownloadId}. Following redirect now for file download.`,\n )\n return response.url\n } else if (response.status === 200) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId}. Location is still pending, trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.status === 401 || response.status === 403) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId}. Status: ${response.status}`,\n )\n }\n console.error(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId} but received error code ${response.status}. Waiting and trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n}\n\nconst handleFileDownload = (url: string) => {\n return fetch(url).then((res) => res.text())\n}\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets) {\n throw Error('Missing Transifex secrets.')\n }\n\n const resourceDownloadBody = {\n data: {\n attributes: {\n content_encoding: 'text',\n },\n relationships: {\n language: {\n data: {\n id: `l:${localeId}`,\n type: 'languages',\n },\n },\n resource: {\n data: {\n id: taskId,\n type: 'resources',\n },\n },\n },\n type: 'resource_translations_async_downloads',\n },\n }\n\n const resourceDownloadUrl = `${baseTransifexUrl}/resource_translations_async_downloads`\n const downloadResponse = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n\n if (!downloadResponse.ok) {\n throw Error(\n `Failed to create translation download request in Transifex. Status: ${downloadResponse.status}`,\n )\n }\n\n const download = await downloadResponse.json()\n const translationDownloadId = download?.data?.id\n\n if (!translationDownloadId) {\n throw Error('Failed to create translation download request in Transifex. Missing download id.')\n }\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n )\n return handleFileDownload(location)\n}\n","import type {Adapter} from 'sanity-translations-tab'\n\nimport {createTask} from './createTask'\nimport {getLocales} from './getLocales'\nimport {getTranslation} from './getTranslation'\nimport {getTranslationTask} from './getTranslationTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n baseI18nArrayConfig,\n} from 'sanity-translations-tab'\nimport type {Adapter, TranslationFunctionContext} from 'sanity-translations-tab'\n\nimport {TransifexAdapter} from './transifexAdapter'\n\nexport {\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n i18nArrayPatch,\n TranslationsTab,\n} from 'sanity-translations-tab'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext,\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\n//for documents using sanity-plugin-internationalized-array fields\nconst defaultI18nArrayConfig: ConfigOptions = {\n ...baseI18nArrayConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n defaultI18nArrayConfig,\n legacyDocumentLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","token","projOrgSlug","organization","project","getLocales","locales","response","fetch","headers","ok","Error","status","json","then","res","data","map","lang","enabled","description","localeId","getTranslationTask","documentId","taskId","projectFilter","resourceFilter","task","locale","reviewedStrings","Number","totalStrings","split","progress","isFinite","Math","floor","localeIds","l","validLocales","filter","find","id","createResource","doc","resourceCreateBody","attributes","accept_translations","name","slug","relationships","i18n_format","type","method","body","JSON","stringify","resourceId","createTask","document","_localeIds","resourceResponse","resource","resourceUploadUrl","resourceUploadBody","content","content_encoding","uploadResponse","pollForFileDownloadLocation","resourceDownloadUrl","translationDownloadId","retryCount","maxRetries","console","info","Promise","resolve","setTimeout","redirected","url","error","handleFileDownload","text","getTranslation","resourceDownloadBody","language","downloadResponse","location","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig","defaultI18nArrayConfig","baseI18nArrayConfig"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-transifex",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "This plugin provides an in-studio integration with Transifex. It allows your editors to send any document to Transifex with the click of a button, monitor ongoing translations, and import partial or complete translations back into the studio.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"sanity-translations-tab": "6.
|
|
30
|
+
"sanity-translations-tab": "6.1.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@sanity/pkg-utils": "^10.5.0",
|