diff --git a/lang/en.json b/lang/en.json
index 41441b61..a2c3dc79 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -210,7 +210,10 @@
"type": { "label": "Type" }
},
"hordeDamage": "Horde Damage",
- "horderHp": "Horde/HP"
+ "horderHp": "Horde/HP",
+ "adversaryReactionRoll": {
+ "headerTitle": "Adversary Reaction Roll"
+ }
},
"Character": {
"advantageSources": {
@@ -333,7 +336,8 @@
"minor": "MIN",
"major": "MAJ",
"severe": "SEV"
- }
+ },
+ "triggerRestContent": "This will trigger a dialog to players make their downtime moves. Are you sure?"
}
},
"APPLICATIONS": {
@@ -467,6 +471,10 @@
"defaultOwnershipTooltip": "The default player ownership of countdowns",
"hideNewCountdowns": "Hide New Countdowns"
},
+ "CreateItemDialog": {
+ "createItem": "Create Item",
+ "browseCompendium": "Browse Compendium"
+ },
"DaggerheartMenu": {
"title": "GM Tools",
"refreshFeatures": "Refresh Features",
@@ -681,6 +689,12 @@
"noPlayers": "No players to assign ownership to",
"default": "Default Ownership"
},
+ "PendingReactionsDialog": {
+ "title": "Pending Reaction Rolls Found",
+ "unfinishedRolls": "Some Tokens still need to roll their Reaction Roll.",
+ "confirmation": "Are you sure you want to continue ?",
+ "warning": "Undone reaction rolls will be considered as failed"
+ },
"ReactionRoll": {
"title": "Reaction Roll: {trait}"
},
@@ -735,11 +749,11 @@
},
"GroupRollSelect": {
"title": "Group Roll",
+ "aidingCharacters": "Aiding Characters",
"leader": "Leader",
"leaderRoll": "Leader Roll",
"openDialogForAll": "Open Dialog For All",
"startGroupRoll": "Start Group Roll",
- "cancelGroupRoll": "Cancel",
"finishGroupRoll": "Finish Group Roll",
"cancelConfirmTitle": "Cancel Group Roll",
"cancelConfirmText": "Are you sure you want to cancel the Group Roll? This will close it for all other players too."
@@ -764,6 +778,11 @@
"session": "Next Session",
"custom": "Custom"
},
+ "ActionAutomationChoices": {
+ "never": "Never",
+ "showDialog": "Show Dialog Only",
+ "always": "Always"
+ },
"AdversaryTrait": {
"relentless": {
"name": "Relentless",
@@ -1293,6 +1312,11 @@
"on": "On",
"onWithToggle": "On With Toggle"
},
+ "SceneRangeMeasurementTypes": {
+ "disable": "Disable Daggerheart Range Measurement",
+ "default": "Default",
+ "custom": "Custom"
+ },
"SelectAction": {
"selectType": "Select Action Type",
"selectAction": "Action Selection"
@@ -2404,6 +2428,7 @@
"multiclass": "Multiclass",
"newCategory": "New Category",
"newThing": "New {thing}",
+ "next": "Next",
"none": "None",
"noTarget": "No current target",
"partner": "Partner",
@@ -2435,6 +2460,7 @@
"scalable": "Scalable",
"scars": "Scars",
"situationalBonus": "Situational Bonus",
+ "searchPlaceholder": "Search...",
"spent": "Spent",
"step": "Step",
"stress": "Stress",
@@ -3010,6 +3036,9 @@
"resourceRoll": {
"playerMessage": "{user} rerolled their {name}"
},
+ "saveRoll": {
+ "reactionRollAllTargets": "Reaction Roll All Targets"
+ },
"tagTeam": {
"title": "Tag Team",
"membersTitle": "Members"
@@ -3040,7 +3069,6 @@
"title": "Daggerheart Compendium Browser",
"hint": "Select a Folder in sidebar to start browsing through the compendium",
"browserSettings": "Browser Settings",
- "searchPlaceholder": "Search...",
"columnName": "Name",
"tooltipFilters": "Filters",
"tooltipErase": "Erase",
@@ -3076,7 +3104,7 @@
"weapons": "Weapons",
"armors": "Armors",
"consumables": "Consumables",
- "loots": "Loots"
+ "loots": "Loot"
}
},
"Notifications": {
@@ -3171,6 +3199,7 @@
"companion": "Level {level} - {partner}",
"companionNoPartner": "No Partner",
"duplicateToNewTier": "Duplicate to New Tier",
+ "createAdversary": "Create Adversary",
"pickTierTitle": "Pick a new tier for this adversary"
},
"daggerheartMenu": {
diff --git a/module/applications/dialogs/groupRollDialog.mjs b/module/applications/dialogs/groupRollDialog.mjs
index 2a7be791..a47dd0a8 100644
--- a/module/applications/dialogs/groupRollDialog.mjs
+++ b/module/applications/dialogs/groupRollDialog.mjs
@@ -116,7 +116,7 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
initializationPart.insertAdjacentHTML('afterend', '
');
initializationPart.insertAdjacentHTML(
'afterend',
- `${game.i18n.localize('Aiding Characters')}
`
+ `${game.i18n.localize('DAGGERHEART.APPLICATIONS.GroupRollSelect.aidingCharacters')}
`
);
const teamContainer = this.element.querySelector('.team-container');
diff --git a/module/applications/settings/appearanceSettings.mjs b/module/applications/settings/appearanceSettings.mjs
index 151648e1..64e5a076 100644
--- a/module/applications/settings/appearanceSettings.mjs
+++ b/module/applications/settings/appearanceSettings.mjs
@@ -118,8 +118,13 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App
break;
case 'footer':
partContext.buttons = [
- { type: 'button', action: 'reset', icon: 'fa-solid fa-arrow-rotate-left', label: 'Reset' },
- { type: 'submit', icon: 'fa-solid fa-floppy-disk', label: 'Save Changes' }
+ {
+ type: 'button',
+ action: 'reset',
+ icon: 'fa-solid fa-arrow-rotate-left',
+ label: game.i18n.localize('ACTIONS.Reset')
+ },
+ { type: 'submit', icon: 'fa-solid fa-floppy-disk', label: game.i18n.localize('EDITOR.Save') }
];
break;
}
diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs
index d8a3df29..04be3efb 100644
--- a/module/applications/sheets/actors/adversary.mjs
+++ b/module/applications/sheets/actors/adversary.mjs
@@ -217,8 +217,8 @@ export default class AdversarySheet extends DHBaseActorSheet {
static #reactionRoll(event) {
const config = {
event,
- title: `Reaction Roll: ${this.actor.name}`,
- headerTitle: 'Adversary Reaction Roll',
+ title: game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll'),
+ headerTitle: game.i18n.localize('DAGGERHEART.ACTORS.Adversary.adversaryReactionRoll.headerTitle'),
roll: {
type: 'trait'
},
diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs
index d4545f63..a7eeccdf 100644
--- a/module/applications/sheets/actors/party.mjs
+++ b/module/applications/sheets/actors/party.mjs
@@ -288,7 +288,7 @@ export default class Party extends DHBaseActorSheet {
title: game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${button.dataset.type}.title`),
icon: button.dataset.type === 'shortRest' ? 'fa-solid fa-utensils' : 'fa-solid fa-bed'
},
- content: 'This will trigger a dialog to players make their downtime moves, are you sure?',
+ content: game.i18n.localize('DAGGERHEART.ACTORS.Party.triggerRestContent'),
classes: ['daggerheart', 'dialog', 'dh-style']
});
diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs
index 64f62405..e93ce774 100644
--- a/module/applications/sheets/api/application-mixin.mjs
+++ b/module/applications/sheets/api/application-mixin.mjs
@@ -644,12 +644,12 @@ export default function DHApplicationMixin(Base) {
buttons: [
{
action: 'create',
- label: 'Create Item',
+ label: game.i18n.localize('DAGGERHEART.APPLICATIONS.CreateItemDialog.createItem'),
icon: 'fa-solid fa-plus'
},
{
action: 'browse',
- label: 'Browse Compendium',
+ label: game.i18n.localize('DAGGERHEART.APPLICATIONS.CreateItemDialog.browseCompendium'),
icon: 'fa-solid fa-book'
}
]
diff --git a/module/applications/sidebar/tabs/actorDirectory.mjs b/module/applications/sidebar/tabs/actorDirectory.mjs
index 9d8f16e1..e9484553 100644
--- a/module/applications/sidebar/tabs/actorDirectory.mjs
+++ b/module/applications/sidebar/tabs/actorDirectory.mjs
@@ -76,7 +76,7 @@ export default class DhActorDirectory extends foundry.applications.sidebar.tabs.
window: { title: 'DAGGERHEART.UI.Sidebar.actorDirectory.pickTierTitle' },
content,
ok: {
- label: 'Create Adversary',
+ label: 'DAGGERHEART.UI.Sidebar.actorDirectory.createAdversary',
callback: (event, button, dialog) => Number(button.form.elements.tier.value)
}
});
diff --git a/module/applications/ui/fearTracker.mjs b/module/applications/ui/fearTracker.mjs
index 82dda215..4e5e1132 100644
--- a/module/applications/ui/fearTracker.mjs
+++ b/module/applications/ui/fearTracker.mjs
@@ -22,7 +22,7 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
tag: 'div',
window: {
frame: true,
- title: 'Fear',
+ title: 'DAGGERHEART.GENERAL.fear',
positioned: true,
resizable: true,
minimizable: false
diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs
index 2d2e8cdc..9ca328a0 100644
--- a/module/applications/ui/itemBrowser.mjs
+++ b/module/applications/ui/itemBrowser.mjs
@@ -207,8 +207,23 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
label: game.i18n.localize(col.label)
}));
+ const splitPath = folderId?.split('.') ?? [];
+ const { pathLabels } = splitPath.reduce(
+ (acc, curr) => {
+ acc.currentPath = !acc.currentPath ? curr : [acc.currentPath, curr].join('.');
+ if (curr === 'folder') return acc;
+
+ const label = foundry.utils.getProperty(this.config, acc.currentPath)?.label;
+ if (label) acc.pathLabels.push(game.i18n.localize(label));
+
+ return acc;
+ },
+ { pathLabels: [], currentPath: '' }
+ );
+
this.selectedMenu = {
- path: folderId?.split('.') ?? [],
+ path: splitPath,
+ pathLabels: pathLabels,
data: {
...folderData,
columns: columns
diff --git a/module/applications/ux/filter-menu.mjs b/module/applications/ux/filter-menu.mjs
index 065d08f9..791c0e1f 100644
--- a/module/applications/ux/filter-menu.mjs
+++ b/module/applications/ux/filter-menu.mjs
@@ -188,7 +188,7 @@ export default class FilterMenu extends foundry.applications.ux.ContextMenu {
}));
const damageTypeFilter = Object.values(CONFIG.DH.GENERAL.damageTypes).map(({ id, abbreviation }) => ({
- group: 'Damage Type', //TODO localize
+ group: game.i18n.localize('DAGGERHEART.GENERAL.damageType'),
name: game.i18n.localize(abbreviation),
filter: {
field: 'system.damage.type',
diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs
index 4a3d672d..58a9dff9 100644
--- a/module/config/generalConfig.mjs
+++ b/module/config/generalConfig.mjs
@@ -955,15 +955,15 @@ export const countdownAppMode = {
export const sceneRangeMeasurementSetting = {
disable: {
id: 'disable',
- label: 'Disable Daggerheart Range Measurement'
+ label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.disable'
},
default: {
id: 'default',
- label: 'Default'
+ label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.default'
},
custom: {
id: 'custom',
- label: 'Custom'
+ label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.custom'
}
};
diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs
index 3b10409c..c2e87c20 100644
--- a/module/config/itemBrowserConfig.mjs
+++ b/module/config/itemBrowserConfig.mjs
@@ -7,7 +7,8 @@ export const typeConfig = {
},
{
key: 'system.type',
- label: 'DAGGERHEART.GENERAL.type'
+ label: 'DAGGERHEART.GENERAL.type',
+ format: type => (type ? `DAGGERHEART.CONFIG.AdversaryType.${type}.label` : '-')
}
],
filters: [
@@ -318,7 +319,12 @@ export const typeConfig = {
},
{
key: 'system.domains',
- label: 'DAGGERHEART.GENERAL.Domain.plural'
+ label: 'DAGGERHEART.GENERAL.Domain.plural',
+ format: domains =>
+ domains
+ .map(x => (!x ? null : game.i18n.localize(`DAGGERHEART.GENERAL.Domain.${x}.label`)))
+ .filter(x => x)
+ .join(', ')
}
],
filters: [
@@ -367,7 +373,8 @@ export const typeConfig = {
},
{
key: 'system.spellcastingTrait',
- label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait'
+ label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait',
+ format: trait => (trait ? `DAGGERHEART.CONFIG.Traits.${trait}.name` : '-')
}
],
filters: [
diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs
index de4d96be..74315a8b 100644
--- a/module/config/settingsConfig.mjs
+++ b/module/config/settingsConfig.mjs
@@ -46,18 +46,14 @@ export const gameSettings = {
export const actionAutomationChoices = {
never: {
id: 'never',
- label: 'Never'
+ label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.never'
},
showDialog: {
id: 'showDialog',
- label: 'Show Dialog only'
+ label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.showDialog'
},
- // npcOnly: {
- // id: "npcOnly",
- // label: "Always for non-characters"
- // },
always: {
id: 'always',
- label: 'Always'
+ label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.always'
}
};
diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs
index 7839bf5a..30a5ad7c 100644
--- a/module/data/fields/action/damageField.mjs
+++ b/module/data/fields/action/damageField.mjs
@@ -320,7 +320,7 @@ export class DHDamageData extends DHResourceData {
required: true
}),
{
- label: 'Type'
+ label: game.i18n.localize('DAGGERHEART.GENERAL.type')
}
)
};
diff --git a/module/data/tagTeamData.mjs b/module/data/tagTeamData.mjs
index 25158606..640c2f6c 100644
--- a/module/data/tagTeamData.mjs
+++ b/module/data/tagTeamData.mjs
@@ -33,7 +33,7 @@ export class MemberData extends foundry.abstract.DataModel {
required: true,
choices: CONFIG.DH.GENERAL.tagTeamRollTypes,
initial: CONFIG.DH.GENERAL.tagTeamRollTypes.trait.id,
- label: 'Roll Type'
+ label: game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.rollType')
}),
rollChoice: new fields.StringField({ nullable: true, initial: null }),
rollData: new fields.JSONField({ nullable: true, initial: null }),
diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs
index 307677bb..ad64336f 100644
--- a/module/documents/chatMessage.mjs
+++ b/module/documents/chatMessage.mjs
@@ -178,8 +178,8 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
const pendingingSaves = targets.filter(t => t.saved.success === null);
if (pendingingSaves.length) {
const confirm = await foundry.applications.api.DialogV2.confirm({
- window: { title: 'Pending Reaction Rolls found' },
- content: `Some Tokens still need to roll their Reaction Roll.
Are you sure you want to continue ?
Undone reaction rolls will be considered as failed
`
+ window: { title: game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.title') },
+ content: `${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.unfinishedRolls')}
${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.confirmation')}
${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.warning')}
`
});
if (!confirm) return;
}
diff --git a/templates/characterCreation/footer.hbs b/templates/characterCreation/footer.hbs
index 95b86cfb..51eef110 100644
--- a/templates/characterCreation/footer.hbs
+++ b/templates/characterCreation/footer.hbs
@@ -1,8 +1,8 @@
\ No newline at end of file
diff --git a/templates/dialogs/characterReset.hbs b/templates/dialogs/characterReset.hbs
index 298826e5..59f88437 100644
--- a/templates/dialogs/characterReset.hbs
+++ b/templates/dialogs/characterReset.hbs
@@ -28,6 +28,6 @@
-
+
\ No newline at end of file
diff --git a/templates/dialogs/deathMove.hbs b/templates/dialogs/deathMove.hbs
index 341659df..97900022 100644
--- a/templates/dialogs/deathMove.hbs
+++ b/templates/dialogs/deathMove.hbs
@@ -17,7 +17,7 @@