Skip to content

Consolidate duplicate Collate translations into OSS locale catalogs #32174

Description

@shah-harshit

Goal

Make OpenMetadata the canonical owner of every generic translation key shared by OSS and Collate, then remove the duplicate definitions from Collate. This supersedes the original severity-only scope.

Collate must retain only Collate-specific keys. A key already defined by OSS must not be redefined in the Collate locale overlay unless an explicitly documented, temporary exception exists.

Why this is needed

Collate loads the OSS locale bundle first, then deep-merges its own bundle with overwrite enabled. Any shared key in Collate silently replaces the OSS value at runtime.

That caused the AUT failure behind the original report: OSS CI expected the OSS Russian severity text, while AUT rendered Collate's override. The same mechanism affects hundreds of other keys and can produce:

  • behavior that differs between OSS PR/main CI and packaged Collate AUT; - generic keys becoming feature-specific, or feature-specific copy leaking into unrelated screens; - inconsistent capitalization, punctuation, and terminology; - placeholder contracts changing at runtime; - translation fixes being made in one repository while the other remains stale.

Inventory

Baseline: OpenMetadata with the first correction from #32175 applied, compared with the current Collate origin/main locale catalogs.

  • 14 Collate locales overlap OSS.
  • 278 unique keys are duplicated in every Collate locale.
  • 3,892 duplicate locale entries exist in total.
  • 2,506 entries currently have identical values.
  • 1,386 entries have different values.
  • 22 keys are identical across all 14 locales and can be removed from Collate without copy changes.
  • 256 keys differ in at least one locale and require review before removal.
    • 33 keys differ in en-us, meaning the source copy or semantics diverge.
    • 223 additional keys share the same English source but differ in one or more translations.
  • 2,010 Collate-only scalar keys per locale are not duplicates and are outside this cleanup. | Locale | Duplicate keys | Identical values | Different values | Collate-only keys |
    |---|---:|---:|---:|---:|
    | de-de | 278 | 188 | 90 | 2010 |
    | en-us | 278 | 245 | 33 | 2010 |
    | es-es | 278 | 170 | 108 | 2010 |
    | fr-fr | 278 | 164 | 114 | 2010 |
    | gl-es | 278 | 179 | 99 | 2010 |
    | he-he | 278 | 166 | 112 | 2010 |
    | ja-jp | 278 | 198 | 80 | 2010 |
    | nl-nl | 278 | 163 | 115 | 2010 |
    | pr-pr | 278 | 156 | 122 | 2010 |
    | pt-br | 278 | 189 | 89 | 2010 |
    | pt-pt | 278 | 175 | 103 | 2010 |
    | ru-ru | 278 | 170 | 108 | 2010 |
    | th-th | 278 | 163 | 115 | 2010 |
    | zh-cn | 278 | 180 | 98 | 2010 |

High-risk placeholder mismatch

label.entity-type-plural contains the {{entity}} placeholder in OSS, but Collate removes that placeholder in all 14 locales, including English:

  • OSS English: {{entity}} Type
  • Collate English: Entity types

This cannot be resolved by blindly deleting the Collate value. Audit the call sites and either preserve the OSS interpolation contract or introduce a distinct Collate-owned key for the static wording.

English-source conflicts

These 33 keys have different English values, so they require a product/call-site decision before translations are consolidated. Casing-only differences can adopt the OSS style; semantic differences may require improving OSS copy or splitting a Collate-specific key.

Key OSS English Collate English
label.created-by Created By Created by
label.created-on Created On Created on
label.data-marketplace Marketplace Data Marketplace
label.depth Depth Depth count to propagate. Root is at depth 0.
label.drag-and-drop-nodes Drag and drop nodes Drag and Drop Nodes
label.entity-type-plural {{entity}} Type Entity types
label.every Every Every:
label.execution-time Execution Time Execution time
label.no-data-products-yet No Data Products Yet No data products yet
label.not-scheduled Not scheduled Not Scheduled
label.pin-conversation Pin Conversation Pin conversation
label.pinned-chat Pinned Pinned Chat
label.recent-chat Recent Recent Chat
label.related-article-plural Related articles Related Articles
label.save-and-next Save and next Save and Next
label.save-changes Save changes Save Changes
label.thinking Thinking... Thinking
label.true TRUE True
label.unpin-conversation Unpin Conversation Unpin conversation
label.view-less View less View Less
message.are-you-sure-to-delete-scim-token Are you sure you want to delete this SCIM token? Are you sure you want to delete this token? This action cannot be undone.
message.automate-your-tasks-by-creating-custom-workflows Automate your tasks by creating custom workflows. Automate Your Tasks by Creating Custom Workflows
message.connection-test-failed Test connection failed, please validate your connection and permissions for the failed steps. Connection test failed. Please check your configuration.
message.data-access-request-already-exists A pending data access request already exists for this asset. You already have an active or approved data access request for this table
message.enable-reading-sample-data-description Allows {{brandName}} to read the sample data. This setting won't save the sample data but sample data will temporarily be brought in {{brandName}} infrastructure for processing. If reading is disabled but storing is enabled, reading will be enabled by default. Allows {{brandName}} to read the sample data. This setting won't save the sample data, but sample data will temporarily be brought into the runner's infrastructure for processing. When using the Hybrid Runner, this processing happens within your own environment (e.g. your data center or cloud account) and the sample data does not leave your infrastructure. If reading is disabled but storing is enabled, reading will be enabled by default.
message.image-upload-after-asset-creation You can upload files after the asset is created. Image can be uploaded after assets is created.
message.image-upload-error Image upload is not supported. Please use Markdown syntax for images available via URL. You can only upload image files!
message.notification-template-description Manage alert templates used across notifications. Edit, preview messages. Select your preferred template or create a new template.
message.scim-allows-automatic-user-and-group-management-directly-from-your-sso-provider SCIM allows automatic user and group management directly from your SSO provider. SCIM allows automatic user and group management from any SCIM-capable identity provider, independent of your SSO configuration.
message.testing-connection Testing connection Testing connection...
message.unsaved-change-in-page You have unsaved changes. If you leave, all your progress will be lost. You have unsaved changes, are you sure you want to leave?
message.unsaved-changes-warning You may have unsaved changes which will be discarded upon close. You've made changes that haven't been saved. If you cancel now, all your edits will be lost.
message.workflow-subtitle Create and manage governance workflows for metadata automation. Automate tasks, approvals, and governance workflows

Keys identical in every locale

label.bookmark-plural, label.condition, label.context, label.daily, label.definition, label.description, label.no, label.note, label.percentage-symbol, label.pii-uppercase, label.reload, label.size, label.sla, label.system, label.team, label.user, label.value, label.yes, message.minute, message.no-pipelines-yet, message.no-results-for-filters, message.no-results-for-filters-description

Complete duplicate-key inventory

278 shared keys
  • label.access-token
  • label.access-type
  • label.action-plural
  • label.active
  • label.active-uppercase
  • label.activity
  • label.add
  • label.add-entity
  • label.add-row
  • label.add-to-table
  • label.advance-filter
  • label.agent
  • label.agent-plural
  • label.all
  • label.analyzing
  • label.application-plural
  • label.approve
  • label.approver
  • label.article
  • label.article-amp-quick-link-plural
  • label.article-plural
  • label.asset
  • label.authentication
  • label.authentication-type
  • label.back
  • label.batch-size
  • label.beta
  • label.bookmark-plural
  • label.cancel
  • label.cancelled
  • label.category
  • label.change
  • label.clear
  • label.click-to-upload
  • label.collapse
  • label.collate-ai
  • label.collate-ai-agent-plural
  • label.column-level
  • label.comment
  • label.condition
  • label.condition-plural
  • label.confirm
  • label.connect
  • label.connection-details
  • label.content
  • label.context
  • label.cost
  • label.create
  • label.create-entity
  • label.create-new-workflow
  • label.created-by
  • label.created-on
  • label.critical
  • label.current
  • label.daily
  • label.dashboard-plural
  • label.data-access-request
  • label.data-access-request-plural
  • label.data-asset
  • label.data-asset-filter
  • label.data-dimensions
  • label.data-health
  • label.data-health-overview
  • label.data-marketplace
  • label.definition
  • label.delete
  • label.delete-entity
  • label.delete-node
  • label.depth
  • label.description
  • label.disabled
  • label.display-name
  • label.documentation
  • label.domain
  • label.domain-plural
  • label.download
  • label.draft
  • label.drag-and-drop-nodes
  • label.duration
  • label.edit
  • label.edit-connection
  • label.enabled
  • label.end
  • label.entity-status
  • label.entity-type-plural
  • label.error-plural
  • label.event-plural
  • label.event-type
  • label.every
  • label.execution-date
  • label.execution-time
  • label.expand
  • label.explore-with-query
  • label.expression
  • label.failed
  • label.failure-plural
  • label.false
  • label.feedback-type
  • label.format
  • label.generate-token
  • label.get-started
  • label.grant-access
  • label.graph
  • label.hybrid-search-weight-plural
  • label.incident-metrics
  • label.info
  • label.ingestion-runner
  • label.is
  • label.is-not
  • label.is-not-set
  • label.is-set
  • label.last-24-hours
  • label.last-30-days
  • label.last-7-days
  • label.last-edited-by
  • label.last-run
  • label.last-updated
  • label.lineage
  • label.link
  • label.list
  • label.live
  • label.loading
  • label.location
  • label.manual
  • label.min
  • label.monthly
  • label.new-chat
  • label.new-entity
  • label.new-workflow
  • label.no
  • label.no-data-products-yet
  • label.no-description
  • label.no-dimension
  • label.no-results-for-filters
  • label.no-tags-added
  • label.node
  • label.not-scheduled
  • label.note
  • label.notification-template
  • label.of
  • label.of-lowercase
  • label.on-demand
  • label.overview
  • label.owner
  • label.owner-plural
  • label.owners
  • label.page-lowercase
  • label.partial-success
  • label.percentage-symbol
  • label.persona
  • label.pii-uppercase
  • label.pin-conversation
  • label.pinned-chat
  • label.pipeline
  • label.pipeline-name
  • label.policy
  • label.policy-plural
  • label.processing
  • label.quick-link
  • label.quick-link-plural
  • label.re-test-connection
  • label.recent-chat
  • label.recognizer
  • label.reject
  • label.related-article-plural
  • label.related-column
  • label.relation-type
  • label.relationship
  • label.reload
  • label.request-data-access
  • label.requested-by
  • label.reset
  • label.reviewers
  • label.running-now
  • label.sample-data
  • label.save
  • label.save-and-next
  • label.save-changes
  • label.save-entity
  • label.schedule
  • label.scheduled
  • label.scim-token
  • label.scope
  • label.score
  • label.sender-email
  • label.sensitive
  • label.service
  • label.service-plural
  • label.severity
  • label.share
  • label.shared
  • label.show-help-text
  • label.show-hint
  • label.show-less
  • label.show-more
  • label.size
  • label.sla
  • label.slack
  • label.sso
  • label.start
  • label.status
  • label.status-failed
  • label.status-running
  • label.status-success
  • label.success
  • label.successful
  • label.summary
  • label.system
  • label.tag-plural
  • label.task-plural
  • label.team
  • label.test-case-status
  • label.thinking
  • label.title
  • label.tool-plural
  • label.total
  • label.total-entity
  • label.trigger
  • label.true
  • label.type
  • label.unpin-conversation
  • label.untitled
  • label.update
  • label.url-uppercase
  • label.usage
  • label.user
  • label.user-plural
  • label.validate
  • label.value
  • label.verified
  • label.view
  • label.view-all
  • label.view-less
  • label.welcome-to
  • label.workflow
  • label.workflow-description
  • label.workflow-name
  • label.workflow-name-is-required
  • label.workflow-name-placeholder
  • label.yes
  • message.are-you-sure-to-delete-scim-token
  • message.automate-provisioning-with-scim
  • message.automate-your-tasks-by-creating-custom-workflows
  • message.choose-how-the-workflow-should-be-triggered
  • message.choose-which-assets-this-workflow-can-act-on
  • message.click-here-to-view-assets-on-explore
  • message.connection-test-failed
  • message.data-access-request-already-exists
  • message.data-access-request-message
  • message.data-dimensions-sub-header
  • message.data-health-sub-header
  • message.define-when-the-workflow-should-run
  • message.delete-scim-token
  • message.enable-reading-sample-data-description
  • message.entity-details-updated
  • message.filters-applied-to-assets
  • message.image-upload-after-asset-creation
  • message.image-upload-error
  • message.incident-metrics-sub-header
  • message.minimum-count-error
  • message.minute
  • message.no-data-available
  • message.no-pipelines-yet
  • message.no-results-for-filters
  • message.no-results-for-filters-description
  • message.not-bookmark-anything
  • message.notification-template-description
  • message.number-of-entities-to-process-in-each-batch
  • message.read-setup-docs
  • message.scim-allows-automatic-user-and-group-management-directly-from-your-sso-provider
  • message.test-case-status-sub-header
  • message.testing-connection
  • message.unsaved-change-in-page
  • message.unsaved-changes-warning
  • message.workflow-name-invalid-characters
  • message.workflow-name-max-length
  • message.workflow-name-min-length
  • message.workflow-subtitle

Implementation approach

  1. Audit every shared key's OSS and Collate call sites.
  2. Classify each duplicate:
    • exact duplicate: remove it from all Collate locale files;
    • better generic Collate translation: port the corrected value to OSS first, then remove Collate's copy;
    • intentionally different feature semantics: create a distinct Collate-owned key and update only the Collate call sites;
    • placeholder mismatch: preserve the caller contract or split the key before removing the override.
  3. Keep the OSS en-us.json value generic whenever the key is used across products or features.
  4. Update every affected OSS locale and any exact-text tests before deleting the corresponding Collate entries.
  5. Remove resolved duplicates from all 14 Collate locale files together so sync-i18n remains consistent.
  6. Add a Collate validation check that fails when a Collate locale key also exists in the configured OSS locale bundle, with a narrow documented allowlist only if migration must be incremental.

Acceptance criteria

  • All 278 duplicate keys are reviewed and classified.
  • The 33 English-source conflicts have an explicit canonical-copy or key-split decision.
  • Placeholder sets are identical between each translation and its English source.
  • Correct generic translations are committed to OSS before dependent Collate removals.
  • All resolved shared keys are removed from every Collate locale bundle.
  • Collate-only keys remain unchanged unless a call-site split requires a new key.
  • OSS and Collate locale synchronization checks pass.
  • Exact-text and affected UI tests are updated and pass in OSS and packaged AUT.
  • A validation check prevents new undocumented OSS/Collate locale collisions.
  • Final inventory reports zero unapproved overlapping keys.

Related work

  • OpenMetadata fix(ui): use generic severity translations #32175: first correction, making label.severity generic in Russian and Dutch and updating the Russian E2E expectation.
  • open-metadata/openmetadata-collate#6220: removes the corresponding Collate label.severity overrides after the OSS correction is available.

Metadata

Metadata

Assignees

Labels

UIUI specific issues

Type

No type

Projects

Status
No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions