{{ storageMigrationMessage }}

Select Game Version

SDEditor is a translation editor for Path of Exile StatDescriptions files, with Google sign-in for personal settings backup, shared language dictionaries, and collaboration on matching source versions.

Choose the Path of Exile version you are translating. Source files, workspace data, and history are stored separately for each version.

Privacy policy

Move Existing Data?

We found SDEditor data from before PoE1/PoE2 split storage. It looks like {{ formatGameVersion(pendingSingleVersionMigration.detectedVersion) }} data.

This copies your old source, workspace, and revision history into the new {{ formatGameVersion(pendingSingleVersionMigration.detectedVersion) }} storage. The old data is left untouched as a backup.

Source files: {{ pendingSingleVersionMigration.sourceCount }}
Workspace files: {{ pendingSingleVersionMigration.workspaceCount }}
History entries: {{ pendingSingleVersionMigration.revisionCount }}

Copying your old data into the new {{ formatGameVersion(pendingSingleVersionMigration.detectedVersion) }} storage…

⚠️ Multiple Instances Detected

You have more than one instance of SDEditor open in your browser. This can cause data loss or conflicts if you save translations simultaneously across multiple tabs or windows.

Warning: Each instance maintains its own in-memory state and may have outdated translations from IndexedDB. Concurrent edits can cause data loss.

What should I do?

  • Use only one instance at a time and close other tabs/windows before editing
  • Save frequently and reload before switching instances
  • Consider exporting translations between instances to avoid conflicts

You can close this message, but please be careful about data loss.

Resolve Duplicate Language Entries

{{ duplicateLangImportWarning.fileName }} contains duplicated lang blocks. Choose the entry SDEditor should keep for each duplicate group, then confirm to continue importing.

Review every language listed, even if it is not your selected translation language. SDEditor will keep the selected entries for this import and ignore the other duplicated blocks.

Duplicate groups ({{ duplicateLangImportWarning.groups.length }})

{{ group.lang }} {{ group.filepath }}

Select one entry for each duplicate group to enable Confirm. Remaining: {{ duplicateLangResolutionRemainingCount() }}.

{{ cloudCanAccessAllLanguages ? 'Manage version' : 'Choose a source version' }}

{{ gameVersionLabel }}{{ gameVersionLabel }} · {{ cloudCanAccessAllLanguages ? (cloudUser?.isAdmin ? 'Admin' : 'Manager') : (cloudUser?.language || lang) }}

Online

Your account needs a team language assignment before online versions are available.

Offline

Your local import workflow. Start with the previous ZIP, then import the next update as usual.

Loading offline workspace…

No offline workspace is stored for this game.

{{ managedSelectedVersion.name }} HEAD

{{ managedFormatDeadline(managedSelectedVersion.deadlineAt) }}

ZIP {{ managedSelectedVersion.zipHash?.slice(0, 16) }}

This version was withdrawn. Its work and history remain available for reference and recovery.

OnlineActions
{{ row.label }}Ended{{ row.team.counts?.loaded ?? 0 }} {{ row.contentMode === 'clienttext' ? 'IDs' : 'files' }}Changes since collection
{{ ctAssignmentProgress(row).total ? ctAssignmentProgress(row).saved + ' / ' + ctAssignmentProgress(row).total : '—' }}{{ ctAssignmentProgress(row).percent }}%
—

Loading team details…

No assignments are available for this version.

StatDescription progress shows Saved / (Missing + Saved). Revised is included in Saved; intentionally blank saves can also be Missing. Collections contain server-accepted Saved files; unsaved drafts and pending offline uploads remain outside the collected ZIP.

{{ ctUploadLocal ? 'Import ClientText locally' : ctUploadVersion ? 'Add content groups to '+ctUploadVersion.name : 'Publish a new version' }}

Original fileTeamRole
{{ candidate.file.name }}StatDescription
StatDescription team assignments
Admin: required ClientText workbook roles

Each team requires a complete group. Changing the policy applies to future groups.

{{ group.contentMode }} · {{ group.language || group.assignments.join(', ') }}

{{ group.units.length.toLocaleString() }} IDs · {{ group.assets.length }} workbook(s)

{{ warning.message || warning }}

Published

{{ [ctProgress.phase,ctProgress.workbook,ctProgress.sheet].filter(Boolean).join(' · ') }} {{ Math.round(ctProgress.completed || 0) }} / {{ ctProgress.total || '…' }}
{{ duplicate.filepath }} · {{ duplicate.language || duplicate.lang }} · choose one duplicated block

🧾 Translation

📁 Filepath: {{ ctCurrentUnit?.role }} / {{ ctCurrentUnit?.sheet }} / {{ ctCurrentUnit?.recordId }}

{{ ctCurrentUnit?.recordId }}

{{ ctNotice }}

Initializing workspace

{{ workspaceInitializationLabel }}

{{ workspaceInitializationElapsed }}
Overall progress{{ workspaceInitializationProgress.label }}
{{ row.status === 'running' ? 'In progress: ' : row.status === 'done' ? 'Completed: ' : row.status === 'failed' ? 'Failed: ' : 'Stopped: ' }}{{ row.label }}{{ row.detail }}{{ row.error }}{{ workspaceInitializationTaskProgress(row).label }}

Welcome to SDEditor!

Read the Editor guide for more information.

Privacy policy

* It is recommended to import the last version of StatDescriptions.zip first.

Initializing...

Please wait while we initialize the workspace. This can take a moment.

Loading: {{ loadingProgress.toFixed(2) }}%

🧾 Translation EndedWithdrawn

Warning: {{ editorDiagnosticWarningCount }} Error: {{ editorDiagnosticErrorCount }}

📁 Filepath: {{ editorCurrentEditingDesc.filepath }} {{ editorFilePathCopied ? 'File path copied' : '' }}

{{ collaborationState.error || 'Conflicting dropped copies need review before these files can be shared.' }} {{ collaborationStatusLabel }} {{ collaborationState.error }} · Align entries {{ collaborationState.error }}
{{ collaborationPeerName(peer) }} · Editing this file

{{ collaborationEditorNotice }}

{{ consistencyResolutionNotice }}
{{ editorCompareTitle }}

Your saved result remains local. Review this translation, then Save & close to share it.

Dropped translation · {{ editorDroppedCandidate.reason || 'Source changed' }}
Compare dropped version → current version

English source

The original English source was not preserved in this older workspace.

Translation

The source entry count changed. Review the dropped copy and save a replacement.