Service - Translations: Difference between revisions
No edit summary |
No edit summary |
||
Line 38: | Line 38: | ||
== [[Service - Translations Graph]] == | == [[Service - Translations Graph]] == | ||
* {textTag} is the name of the text being translated, eg a Catalog subject node will have a textTag "catalogName" | |||
=== Nodes === | === Nodes === | ||
Line 51: | Line 53: | ||
translationLinkId: { | translationLinkId: { | ||
identifier: true, // create unique id from request details | identifier: true, // create unique id from request details | ||
} | |||
languageId: { | |||
immutable: true, | |||
} | |||
textTag: { | |||
immutable: true, // tag of what text is being translated | |||
} | |||
weight: { | |||
} | } | ||
}, | }, | ||
Line 57: | Line 67: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* creates a link between a subject node and a translation text | * creates a link between a subject node and a translation text | ||
* when recalculating current translation for a languageCode we add the calculated weighted value to this node as a property | * when recalculating current translation for a languageCode we add the calculated weighted value to this node as a property | ||
Line 86: | Line 95: | ||
=== Relationships === | === Relationships === | ||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | { | ||
relationshipType: "{TranslationSharedLib.TRANSLATION_HAS_LINK_GRAPH_REL_TYPE_PREFIX}{ | relationshipType: "{TranslationSharedLib.TRANSLATION_HAS_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: has_translationLink | ||
schema: { | schema: { | ||
immutable: true, | immutable: true, | ||
Line 103: | Line 109: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* every translationLink will have this relationship | * every translationLink will have this relationship | ||
* is never removed, but those with low weighted links can be ignored over time | |||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | { | ||
relationshipType: "{TranslationSharedLib. | relationshipType: "{TranslationSharedLib.TRANSLATION_DEFAULT_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: default_translationLink | ||
schema: { | schema: { | ||
elementCanBeRemoved: true, | elementCanBeRemoved: true, | ||
Line 138: | Line 130: | ||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | { | ||
relationshipType: "{TranslationSharedLib.TRANSLATION_CURRENT_LINK_GRAPH_REL_TYPE_PREFIX}{ | relationshipType: "{TranslationSharedLib.TRANSLATION_CURRENT_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: current_translationLink | ||
schema: { | schema: { | ||
elementCanBeRemoved: true, | elementCanBeRemoved: true, | ||
Line 148: | Line 140: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* the currently used translationLink for the | * the currently used translationLink for the language the link points to | ||
* only one should exist per subject node/textTag | * only one should exist per subject node and textTag/languageCode combination, but each language for each textTag will have it's own current relationship | ||
* languages that have no translations | * this relationship will not exist for languages that have no translations | ||
* can be removed/added when RecalculateCurrentTranslation | * can be removed/added when RecalculateCurrentTranslation | ||
Revision as of 04:45, 21 August 2021
Overview
Service manages language translations.
Repository
https://bitbucket.org/stb_working/translations/src/master/
DynamoDB tables
Standard Config Table Per Service
Configuration tags
{
configKey: "TranslationsGraphServiceName"
configTag: "TranslationsGraphServiceName"
configValue: xxx // eg: "TranslationsGraph"
}
LogicalResults
Stores results for any requests to perform logical searches on media links
{
resultId: xxx // eg: filterMainId for a single logical element
dataId: xxx // one translationId
}
- partition key: resultId
- sort key: dataId
Graph database
Service - Translations Graph
- {textTag} is the name of the text being translated, eg a Catalog subject node will have a textTag "catalogName"
Nodes
{
nodeLabel: "{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", //eg: translationLink
schema: {
identifier: true,
restrictProperties: true,
restrictRelationships: true,
properties: {
translationLinkId: {
identifier: true, // create unique id from request details
}
languageId: {
immutable: true,
}
textTag: {
immutable: true, // tag of what text is being translated
}
weight: {
}
},
}
}
- creates a link between a subject node and a translation text
- when recalculating current translation for a languageCode we add the calculated weighted value to this node as a property
{
nodeLabel: {TranslationLib.TRANSLATION_GRAPH_NODE_LABEL},
schema: {
identifier: true,
restrictProperties: true,
restrictRelationships: true,
properties: {
text: {
identifier: true,
},
},
}
}
(subject nodes)
Subject node schemas are managed by each service that needs translations, normally as a basic schema with identifier properties only.
- nodeIdentifierLabels: matches that specific object being translated, eg: catalog
- nodeIdentifierProperties: matches that specific object being translated, eg: catalogId
- nodeProperties: Can store additional properties, not set by translation service
- node schema should set identifier = true, immutable = true (which includes elementCanBeRemoved = false)
Relationships
{
relationshipType: "{TranslationSharedLib.TRANSLATION_HAS_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: has_translationLink
schema: {
immutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
- every translationLink will have this relationship
- is never removed, but those with low weighted links can be ignored over time
{
relationshipType: "{TranslationSharedLib.TRANSLATION_DEFAULT_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: default_translationLink
schema: {
elementCanBeRemoved: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
- sets the default translationLink to use when no translationLink for the requested language/s exist
- can be changed but each subject/textTag must have 1
- initially set to the first translation created, later can move it around eg to English if English gets added later
- could create logic that goes through a sorted list of languages and applies the first languageCode found as the default
{
relationshipType: "{TranslationSharedLib.TRANSLATION_CURRENT_LINK_GRAPH_REL_TYPE_PREFIX}{TranslationLib.TRANSLATION_GRAPH_NODE_LABEL}{TranslationSharedLib.TRANSLATION_LINK_GRAPH_TAG}", // eg: current_translationLink
schema: {
elementCanBeRemoved: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
- the currently used translationLink for the language the link points to
- only one should exist per subject node and textTag/languageCode combination, but each language for each textTag will have it's own current relationship
- this relationship will not exist for languages that have no translations
- can be removed/added when RecalculateCurrentTranslation
{
relationshipType: "{RelationshipLib.TRANSLATION_IS_TRANSLATION_GRAPH_REL_TYPE}",
schema: {
elementCanBeRemoved: false,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
SQS queues
RecalculateCurrentTranslation
Add to this queue the subject nodeIdentifierLabels, subject nodeIdentifierProperties, languageCode
- subject nodeIdentifierLabels
- subject nodeIdentifierProperties
- languageCode: see below
This queue does not have a Lambda trigger, we could poll it when resource costs really cheap as it is low importance (and/or have an API endpoint that polls and processes a batch).
Language codes
Considering using ISO 639-3 codes and designing a way to substring them to automatically go up the hierarchy if no lower level variants match, an alternative would be to allow users to create ordered lists of preferred translations and share these.
How translations are found for users
Plan is to allow users to create ordered lists of prefered languages (and perhaps optionally automatic translating as a last option?), and new users are automatically set to a list depending on their location when signing up.
For each text to translate: work through the list and find the first matching translation, if none found fall back onto the default option.
cache results for efficient resource use.
System text translations
System text follows the same Label + UniqueIdProperty system to identify specific translation subjects (one system text output), the labels and unique ids can set in npm modules.
- Label example: hard coded or as a constant in NavBar service: "sysTxtNavBar"
- UniqueIdProperty example: "sysTxtTag", value: "SignOut" (can set as a constant in NavBar service)
- Label example: NPM module - izara-market-shared#CatalogManagerLib.constants.sysTxtCatalogManager ("sysTxtCatalogManager")
- UniqueIdProperty example: "CatalogName", value: NPM module - izara-market-shared#CatalogManagerLib.constants.CatalogStandard.catalogName