diff --git a/resources/party.ts b/resources/party.ts index 3f303b845a..60a79a8659 100644 --- a/resources/party.ts +++ b/resources/party.ts @@ -1,6 +1,7 @@ import { Party } from '../types/event'; import { Job, Role } from '../types/job'; import { PartyMemberParamObject, PartyTrackerOptions } from '../types/party'; +import { LocaleText } from '../types/trigger'; import Util from './util'; @@ -15,6 +16,414 @@ const emptyRoleToPartyNames = () => { }; }; +const roleLocalized: Record = { + tank: { + en: 'tank', + ja: 'タンク', + cn: '坦克', + }, + healer: { + en: 'healer', + ja: 'ヒーラー', + cn: '治疗', + }, + dps: { + en: 'dps', + ja: 'DPS', + cn: '输出', + }, + crafter: { + en: 'crafter', + ja: 'クラフター', + cn: '能工巧匠', + }, + gatherer: { + en: 'gatherer', + ja: 'ギャザラー', + cn: '大地使者', + }, + none: { + en: 'none', + ja: 'すっぴん士', + cn: '冒险者', + }, +}; + +const jobLocalizedAbbr: Record = { + NONE: { + en: 'NONE', + cn: '冒险', + }, + GLA: { + en: 'GLA', + cn: '剑术', + }, + PGL: { + en: 'PGL', + cn: '格斗', + }, + MRD: { + en: 'MRD', + cn: '斧术', + }, + LNC: { + en: 'LNC', + cn: '枪术', + }, + ARC: { + en: 'ARC', + cn: '弓箭', + }, + CNJ: { + en: 'CNJ', + cn: '幻术', + }, + THM: { + en: 'THM', + cn: '咒术', + }, + CRP: { + en: 'CRP', + cn: '刻木', + }, + BSM: { + en: 'BSM', + cn: '锻铁', + }, + ARM: { + en: 'ARM', + cn: '铸甲', + }, + GSM: { + en: 'GSM', + cn: '雕金', + }, + LTW: { + en: 'LTW', + cn: '制革', + }, + WVR: { + en: 'WVR', + cn: '裁衣', + }, + ALC: { + en: 'ALC', + cn: '炼金', + }, + CUL: { + en: 'CUL', + cn: '烹调', + }, + MIN: { + en: 'MIN', + cn: '采矿', + }, + BTN: { + en: 'BTN', + cn: '园艺', + }, + FSH: { + en: 'FSH', + cn: '捕鱼', + }, + PLD: { + en: 'PLD', + cn: '骑士', + }, + MNK: { + en: 'MNK', + cn: '武僧', + }, + WAR: { + en: 'WAR', + cn: '战士', + }, + DRG: { + en: 'DRG', + cn: '龙骑', + }, + BRD: { + en: 'BRD', + cn: '诗人', + }, + WHM: { + en: 'WHM', + cn: '白魔', + }, + BLM: { + en: 'BLM', + cn: '黑魔', + }, + ACN: { + en: 'ACN', + cn: '秘术', + }, + SMN: { + en: 'SMN', + cn: '召唤', + }, + SCH: { + en: 'SCH', + cn: '学者', + }, + ROG: { + en: 'ROG', + cn: '双剑', + }, + NIN: { + en: 'NIN', + cn: '忍者', + }, + MCH: { + en: 'MCH', + cn: '机工', + }, + DRK: { + en: 'DRK', + cn: '暗骑', + }, + AST: { + en: 'AST', + cn: '占星', + }, + SAM: { + en: 'SAM', + cn: '武士', + }, + RDM: { + en: 'RDM', + cn: '赤魔', + }, + BLU: { + en: 'BLU', + cn: '青魔', + }, + GNB: { + en: 'GNB', + cn: '绝枪', + }, + DNC: { + en: 'DNC', + cn: '舞者', + }, + RPR: { + en: 'RPR', + cn: '钐镰', + }, + SGE: { + en: 'SGE', + cn: '贤者', + }, +}; + +const jobLocalizedFull: Record = { + NONE: { + en: 'Adventurer', + ja: 'すっぴん士', + cn: '冒险者', + }, + GLA: { + en: 'Gladiator', + ja: '剣術士', + cn: '剑术师', + }, + PGL: { + en: 'Pugilist', + ja: '格闘士', + cn: '格斗家', + }, + MRD: { + en: 'Marauder', + ja: '斧術士', + cn: '斧术师', + }, + LNC: { + en: 'Lancer', + ja: '槍術士', + cn: '枪术师', + }, + ARC: { + en: 'Archer', + ja: '弓術士', + cn: '弓箭手', + }, + CNJ: { + en: 'Conjurer', + ja: '幻術士', + cn: '幻术师', + }, + THM: { + en: 'Thaumaturge', + ja: '呪術士', + cn: '咒术师', + }, + CRP: { + en: 'Carpenter', + ja: '木工師', + cn: '刻木匠', + }, + BSM: { + en: 'Blacksmith', + ja: '鍛冶師', + cn: '锻铁匠', + }, + ARM: { + en: 'Armorer', + ja: '甲冑師', + cn: '铸甲匠', + }, + GSM: { + en: 'Goldsmith', + ja: '彫金師', + cn: '雕金匠', + }, + LTW: { + en: 'Leatherworker', + ja: '革細工師', + cn: '制革匠', + }, + WVR: { + en: 'Weaver', + ja: '裁縫師', + cn: '裁衣匠', + }, + ALC: { + en: 'Alchemist', + ja: '錬金術師', + cn: '炼金术士', + }, + CUL: { + en: 'Culinarian', + ja: '調理師', + cn: '烹调师', + }, + MIN: { + en: 'Miner', + ja: '採掘師', + cn: '采矿工', + }, + BTN: { + en: 'Botanist', + ja: '園芸師', + cn: '园艺工', + }, + FSH: { + en: 'Fisher', + ja: '漁師', + cn: '捕鱼人', + }, + PLD: { + en: 'Paladin', + ja: 'ナイト', + cn: '骑士', + }, + MNK: { + en: 'Monk', + ja: 'モンク', + cn: '武僧', + }, + WAR: { + en: 'Warrior', + ja: '戦士', + cn: '战士', + }, + DRG: { + en: 'Dragoon', + ja: '竜騎士', + cn: '龙骑士', + }, + BRD: { + en: 'Bard', + ja: '吟遊詩人', + cn: '吟游诗人', + }, + WHM: { + en: 'White Mage', + ja: '白魔道士', + cn: '白魔法师', + }, + BLM: { + en: 'Black Mage', + ja: '黒魔道士', + cn: '黑魔法师', + }, + ACN: { + en: 'Arcanist', + ja: '巴術士', + cn: '秘术师', + }, + SMN: { + en: 'Summoner', + ja: '召喚士', + cn: '召唤师', + }, + SCH: { + en: 'Scholar', + ja: '学者', + cn: '学者', + }, + ROG: { + en: 'Rogue', + ja: '双剣士', + cn: '双剑师', + }, + NIN: { + en: 'Ninja', + ja: '忍者', + cn: '忍者', + }, + MCH: { + en: 'Machinist', + ja: '機工士', + cn: '机工士', + }, + DRK: { + en: 'Dark Knight', + ja: '暗黒騎士', + cn: '暗黑骑士', + }, + AST: { + en: 'Astrologian', + ja: '占星術師', + cn: '占星术士', + }, + SAM: { + en: 'Samurai', + ja: '侍', + cn: '武士', + }, + RDM: { + en: 'Red Mage', + ja: '赤魔道士', + cn: '赤魔法师', + }, + BLU: { + en: 'Blue Mage', + ja: '青魔道士', + cn: '青魔法师', + }, + GNB: { + en: 'Gunbreaker', + ja: 'ガンブレイカー', + cn: '绝枪战士', + }, + DNC: { + en: 'Dancer', + ja: '踊り子', + cn: '舞者', + }, + RPR: { + en: 'Reaper', + ja: 'リーパー', + cn: '钐镰客', + }, + SGE: { + en: 'Sage', + ja: '賢者', + cn: '贤者', + }, +}; + export default class PartyTracker { details: Party[] = []; partyNames_: string[] = []; @@ -181,12 +590,17 @@ export default class PartyTracker { nick: nick, }; } else { - const jobName = Util.jobEnumToJob(partyMember.job); - const role = Util.jobToRole(jobName); + const lang = this.options.DisplayLanguage; + const job = Util.jobEnumToJob(partyMember.job); + const jobAbbr = jobLocalizedAbbr[job]?.[lang] ?? job; + const jobFull = jobLocalizedFull[job]?.[lang] ?? job; + const role = Util.jobToRole(job); + const roleName = roleLocalized[role]?.[lang] ?? role; ret = { id: partyMember.id, - job: jobName, - role: role, + job: jobAbbr, + jobFull: jobFull, + role: roleName, name: name, nick: nick, }; diff --git a/types/party.d.ts b/types/party.d.ts index 30935286ce..e4bb91e3a1 100644 --- a/types/party.d.ts +++ b/types/party.d.ts @@ -1,9 +1,10 @@ -import { Job, Role } from './job'; +import { BaseOptions } from './data'; import { OutputStringsParamObject } from './trigger'; export type BasePartyMemberParamObject = { - role?: Role; - job?: Job; + role?: string; + job?: string; + jobFull?: string; id?: string; name: string; nick: string; @@ -17,7 +18,7 @@ export interface PartyMemberParamObject } // This is a partial interface of both RaidbossOptions and OopsyOptions. -export interface PartyTrackerOptions { +export interface PartyTrackerOptions extends BaseOptions { DefaultPlayerLabel: PartyMemberParamObjectKeys; PlayerNicks: { [gameName: string]: string }; } diff --git a/ui/jobs/jobs.ts b/ui/jobs/jobs.ts index 44b8f31d8c..07ed0eba5c 100644 --- a/ui/jobs/jobs.ts +++ b/ui/jobs/jobs.ts @@ -33,7 +33,11 @@ UserConfig.getUserConfigLocation('jobs', defaultOptions, () => { const emitter = new JobsEventEmitter(); // Jobs doesn't have a need for PartyTracker.member support and so just passes in dummy options. - const dummyOptions: PartyTrackerOptions = { DefaultPlayerLabel: 'nick', PlayerNicks: {} }; + const dummyOptions: PartyTrackerOptions = { + ...options, + DefaultPlayerLabel: 'nick', + PlayerNicks: {}, + }; const partyTracker = new PartyTracker(dummyOptions); const player = new Player(emitter, partyTracker, ffxivVersion); const bars = new Bars(options, { emitter, player }); diff --git a/ui/oopsyraidsy/oopsyraidsy_config.ts b/ui/oopsyraidsy/oopsyraidsy_config.ts index 7c18cbc272..1e2ccad7c2 100644 --- a/ui/oopsyraidsy/oopsyraidsy_config.ts +++ b/ui/oopsyraidsy/oopsyraidsy_config.ts @@ -288,13 +288,15 @@ const templateOptions: OptionsTemplate = { 'Nickname (Tini)': 'nick', 'Role (Tank)': 'role', 'Job (WAR)': 'job', + 'Full Job (Warrior)': 'jobFull', 'Full Name (Tini Poutini)': 'name', }, cn: { - '昵称 (Tini)': 'nick', + '昵称 (弗雷)': 'nick', '职能 (坦克)': 'role', - '职业 (战士)': 'job', - '全名 (Tini Poutini)': 'name', + '职业简称 (暗骑)': 'job', + '职业全称 (暗黑骑士)': 'jobFull', + '全名 (弗雷)': 'name', }, ko: { '닉네임 (Tini)': 'nick', diff --git a/ui/raidboss/raidboss_config.ts b/ui/raidboss/raidboss_config.ts index 0386b8cf2b..493b11dfae 100644 --- a/ui/raidboss/raidboss_config.ts +++ b/ui/raidboss/raidboss_config.ts @@ -2174,13 +2174,15 @@ const templateOptions: OptionsTemplate = { 'Nickname (Tini)': 'nick', 'Role (Tank)': 'role', 'Job (WAR)': 'job', + 'Full Job (Warrior)': 'jobFull', 'Full Name (Tini Poutini)': 'name', }, cn: { - '昵称 (Tini)': 'nick', + '昵称 (弗雷)': 'nick', '职能 (坦克)': 'role', - '职业 (战士)': 'job', - '全名 (Tini Poutini)': 'name', + '职业简称 (暗骑)': 'job', + '职业全称 (暗黑骑士)': 'jobFull', + '全名 (弗雷)': 'name', }, ko: { '닉네임 (Tini)': 'nick',