Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
5e8b69c
WIP: Added i18n translation for platform modal header. Only key is sh…
ebkr Jul 31, 2025
707e38c
Translations now show correctly
ebkr Jul 31, 2025
594f295
GameSelectionScreen supports i18n for English and French
ebkr Aug 1, 2025
d9e67ba
Added English translation for Splash.vue
ebkr Aug 1, 2025
16595bc
Fixed styling with FAQ section
ebkr Aug 1, 2025
5a9c84a
WIP: Translated the main content view of the Splash screen to French
ebkr Aug 1, 2025
b1b0df0
Added remaining Splash translations in French
ebkr Aug 1, 2025
f74f2b2
Formatted translation value to match formatting of en equivalent
ebkr Aug 1, 2025
af2ac21
Split translations into clearer modules
ebkr Aug 1, 2025
8a87cf5
Added translations for main view of Profiles.vue
ebkr Aug 4, 2025
d9e746f
Added i18n support for CreateProfileModal and DeleteProfileModal
ebkr Aug 4, 2025
5bd17d6
Added support for RenameProfileModal
ebkr Aug 5, 2025
b415fc0
Added English translations for ImportProfileModal
ebkr Aug 6, 2025
e01dee1
Added French translations for ImportProfileModal
ebkr Aug 7, 2025
d511cbc
WIP: Fixed new import progress text changes from develop
ebkr Aug 27, 2025
fb5cefc
Added English i18n support for NavigationMenu and update banner
ebkr Aug 7, 2025
a0fda7e
Added English i18n support for the empty mod list message and update …
ebkr Aug 7, 2025
c5b194d
Added i18n support for the SearchAndSort component
ebkr Aug 7, 2025
5b506fe
WIP: Added Date formatting support. Need to finish porting LocalModCa…
ebkr Aug 7, 2025
592dc3e
Ported LocalModCard and DonateButton to use i18n
ebkr Aug 7, 2025
cbe4208
Added ExpandableCard translation
ebkr Aug 7, 2025
7c29cee
Used translation in application update banner. Fixed visual regression.
ebkr Aug 7, 2025
0b575a9
Reverted visual regression change as it breaks scrolling
ebkr Aug 7, 2025
8cd2411
Added i18n support for loose modals in Manager.vue
ebkr Aug 8, 2025
394f289
Added i18n support for category filter modal
ebkr Aug 8, 2025
172905a
Added i18n support for sort modal
ebkr Aug 8, 2025
726288f
Added i18n support for local import modal
ebkr Aug 8, 2025
073b46e
Added i18n support for code export modal
ebkr Aug 11, 2025
7f98838
Added i18n support to DownloadProgressModal.vue
ebkr Aug 11, 2025
9705d16
Added i18n support to DownloadModVersionSelectModal
ebkr Aug 11, 2025
3c1b7e3
Added i18n support to UpdateAllInstalledModsModal
ebkr Aug 11, 2025
c13e7dc
Added i18n support to LaunchTypeModal
ebkr Aug 11, 2025
f6aea1a
Added i18n support for executable selection actions in Manager.vue
ebkr Aug 11, 2025
3dedfaf
Added i18n support for OnlinePreviewPanel
ebkr Aug 12, 2025
9620aff
Added i18n support for OnlineModView
ebkr Aug 12, 2025
90216b1
Added i18n support for OnlineModList
ebkr Aug 12, 2025
def1500
Added French translations for online view
ebkr Aug 12, 2025
9e12e77
Fixed issue after rebase in LaunchTypeModal and improved "Par" capita…
ebkr Aug 27, 2025
5c6f0cd
Fixed imports and duplicate text after rebase
ebkr Sep 12, 2025
8015c92
Added i18n support for Help.vue
ebkr Aug 13, 2025
0267e2a
Added French translation for Help.vue
ebkr Aug 13, 2025
6cf6a9e
Added missing Hero translations
ebkr Aug 13, 2025
b706bfd
Fixed issue after rebase in Help.vue
ebkr Aug 27, 2025
e7cbdf7
WIP: Adding i18n support for SettingsView
ebkr Aug 14, 2025
c645899
Added 'profiles' English translations
ebkr Aug 28, 2025
287498d
Added i18n support for conditional settings
ebkr Aug 28, 2025
f7f9fca
WIP: Adding i18n support for "Other" section
ebkr Aug 28, 2025
cbb7e40
Added i18n support for "other" and "modpacks" categories
ebkr Aug 29, 2025
e96f734
Added i18n support for settings tabs
ebkr Aug 29, 2025
0834b2c
Added French i18n translation file and fixed non-reactive titles
ebkr Sep 5, 2025
81e7d31
Added missing translations for SettingsView
ebkr Nov 17, 2025
1c9a74a
Added English/French translations for the ConfigEditor screen
ebkr Nov 28, 2025
7590dcb
Added English/French translations for the Profile Switcher modal
ebkr Nov 28, 2025
5cea6f5
Added English/French translations for DownloadMonitor.vue
ebkr Dec 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import { NodeFsImplementation } from './providers/node/fs/NodeFsImplementation';
import { useRouter } from 'vue-router';
import { ProtocolProviderImplementation } from './providers/generic/protocol/ProtocolProviderImplementation';
import { provideProtocolImplementation } from './providers/generic/protocol/ProtocolProvider';
import { useI18n } from 'vue-i18n';

const store = baseStore;
const router = useRouter();
Expand Down Expand Up @@ -143,6 +144,19 @@ onMounted(async () => {
watchEffect(() => {
document.documentElement.classList.toggle('html--dark', quasar.dark.isActive);
})

const { locale } = useI18n();

document.addEventListener('keydown', (e: KeyboardEvent) => {
if (e.altKey && ['l', '¬'].includes(e.key.toLowerCase())) {
console.log("Switch lang");
if (locale.value === 'en') {
locale.value = 'fr';
} else {
locale.value = 'en';
}
}
})
</script>

<style lang="scss">
Expand Down
5 changes: 3 additions & 2 deletions src/boot/i18n.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { createI18n } from 'vue-i18n';
import messages from '../i18n';
import messages, { datetimeFormats } from '../i18n';
import { defineBoot } from '#q-app/wrappers';
// You'll need to create the src/i18n/index.js/.ts file too

const i18n = createI18n({
locale: 'en-US',
locale: 'en',
globalInjection: true,
allowComposition: true,
legacy: false,
messages,
datetimeFormats
})

// @ts-ignore
Expand Down
12 changes: 7 additions & 5 deletions src/components/ExpandableCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@
<header class='card-header is-shadowless' :id='id'>
<div class='card-header-icon mod-logo' v-if="image !== ''">
<figure class='image is-48x48 image-parent'>
<img :src='image' alt='Mod Logo' class='image-overlap'/>
<img v-if="store.state.profile.funkyMode" src='../assets/funky_mode.png' alt='Mod Logo' class='image-overlap'/>
<img :src='image' :alt="t('translations.pages.manager.installed.expandableCard.imageAltText')" class='image-overlap'/>
<img v-if="store.state.profile.funkyMode" src='../assets/funky_mode.png' :alt="t('translations.pages.manager.installed.expandableCard.funkyModeAltText')" class='image-overlap'/>
</figure>
</div>
<span ref="title" class='card-header-title'><slot name='title'></slot></span>
<slot name='other-icons'></slot>
<!-- Allow movement of mod order -->
<a v-if='showSort' class='card-header-icon handle'>
<i class="fas fa-grip-vertical" v-tooltip.left="'Drag to reorder'"></i>
<i class="fas fa-grip-vertical" :v-tooltip.left="t('translations.pages.manager.installed.expandableCard.tooltips.dragToReorder')"></i>
</a>
<a class='card-header-icon'>
<span class='icon'>
<i class='fas fa-angle-right' aria-hidden='true' v-if='!visible' v-tooltip.left="'Expand'"></i>
<i class='fas fa-angle-down' aria-hidden='true' v-if='visible' v-tooltip.left="'Collapse'"></i>
<i class='fas fa-angle-right' aria-hidden='true' v-if='!visible' v-tooltip.left="t('translations.pages.manager.installed.expandableCard.tooltips.expand')"></i>
<i class='fas fa-angle-down' aria-hidden='true' v-if='visible' v-tooltip.left="t('translations.pages.manager.installed.expandableCard.tooltips.collapse')"></i>
</span>
</a>
</header>
Expand All @@ -43,8 +43,10 @@
import { computed, onMounted, ref, watchEffect } from 'vue';
import { getStore } from '../providers/generic/store/StoreProvider';
import { State } from '../store';
import { useI18n } from "vue-i18n";

const store = getStore<State>();
const { t } = useI18n();

type ExpandableCardProps = {
image?: string;
Expand Down
7 changes: 5 additions & 2 deletions src/components/buttons/DonateButton.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@
<ExternalLink v-if="mod && mod.getDonationLink()"
:url="mod.getDonationLink()"
class="card-footer-item"
v-tooltip.left="{content: 'Donate to the mod author', distance: 0}">
v-tooltip.left="{content: t('translations.pages.manager.installed.localModCard.tooltips.donate'), distance: 0}">
<i class='fas fa-heart margin-right margin-right--half-width'></i>
Donate
{{ t('translations.pages.manager.installed.localModCard.actions.donate') }}
</ExternalLink>
</template>

<script lang="ts" setup>
import ThunderstoreMod from '../../model/ThunderstoreMod';
import { ExternalLink } from '../../components/all';
import { useI18n } from 'vue-i18n';

const { t } = useI18n();

type DonateButtonProps = {
mod: ThunderstoreMod;
Expand Down
23 changes: 16 additions & 7 deletions src/components/config-components/ConfigEditLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,20 @@
<div>
<Hero
:title="configFile.getName()"
subtitle="Editing config file"
:subtitle="t('translations.pages.configEditor.editConfig.subtitle')"
hero-type="primary"
/>
<br/>
<div class="sticky-top sticky-top--buttons margin-right">
<button class="button is-info margin-right margin-right--half-width" @click="save">Save</button>
<button class="button is-danger" @click="cancel">Cancel</button>
<button class="button is-info margin-right margin-right--half-width" @click="save">
{{ t('translations.pages.configEditor.editConfig.actions.save') }}
</button>
<button class="button is-danger" @click="cancel">
{{ t('translations.pages.configEditor.editConfig.actions.cancel') }}
</button>
</div>
<div v-if="configFile.getPath().toLowerCase().endsWith('.cfg')" class="margin-right non-selectable">
<h3 class='subtitle is-3'>Sections</h3>
<h3 class='subtitle is-3'>{{ t('translations.pages.configEditor.editConfig.sections') }}</h3>
<ul>
<li v-for="(value, key) in dumpedConfigVariables" :key="`${key}-${value.toString()}-tab`">
<a :href="`#${key}`">{{ key }}</a>
Expand All @@ -30,8 +34,10 @@
<span class="pre selectable" v-if="!line.commentsExpanded">{{getCommentDisplayShort(line.comments)}}</span>
<span class="pre selectable" v-else>{{getCommentDisplay(line.comments)}}</span>
<a @click="toggleEntryExpansion(key, variable)">
<span v-if="!line.commentsExpanded">Show more</span>
<span v-else>Show less</span>
<span v-if="!line.commentsExpanded">
{{ t('translations.pages.configEditor.editConfig.actions.showMore') }}
</span>
<span v-else>{{ t('translations.pages.configEditor.editConfig.actions.showLess') }}</span>
</a>
</template>
<span class="pre" v-else>{{getCommentDisplay(line.comments)}}</span>
Expand Down Expand Up @@ -79,15 +85,18 @@
import ConfigLine from '../../model/file/ConfigLine';
import FsProvider from '../../providers/generic/file/FsProvider';
import ConfigFile from '../../model/file/ConfigFile';
import { DeferredInput, Hero } from '../all';
import { Hero } from '../all';
import QuillEditor from '../QuillEditor.vue';
import BepInExConfigUtils from '../../utils/BepInExConfigUtils';
import { onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';

type ConfigEditLayoutProps = {
configFile: ConfigFile;
}

const { t, d, messages, locale } = useI18n();

const props = defineProps<ConfigEditLayoutProps>();
const emits = defineEmits<{
(e: 'changed'): void;
Expand Down
31 changes: 16 additions & 15 deletions src/components/config-components/ConfigSelectionLayout.vue
Original file line number Diff line number Diff line change
@@ -1,42 +1,40 @@
<template>
<div>
<Hero
title="Config editor"
subtitle="Select a configuration file to edit"
:title="t('translations.pages.configEditor.hero.title')"
:subtitle="t('translations.pages.configEditor.hero.subtitle')"
hero-type="primary"
/>
<div class="notification is-warning is-square">
<div class="container">
<p>
Configuration files are generated after launching the game, with the mod installed, at least once.
</p>
<p>{{ t('translations.pages.configEditor.warning.content') }}</p>
</div>
</div>
<div class='is-shadowless'>
<div class='no-padding-left card-header-title'>

<div class="input-group input-group--flex margin-right">
<label for="config-search" class="non-selectable">Search</label>
<label for="config-search" class="non-selectable">{{ t('translations.pages.configEditor.actions.search.label') }}</label>
<input
v-model="filterText"
id="config-search"
class="input margin-right"
type="text"
placeholder="Search for config files"
:placeholder="t('translations.pages.configEditor.actions.search.placeholder')"
autocomplete="off"
/>
</div>

<div class="input-group margin-right">
<label for="config-sort-order" class="non-selectable">Sort</label>
<label for="config-sort-order" class="non-selectable">{{ t('translations.pages.configEditor.actions.sort.label') }}</label>
<select id="config-sort-order" class="select select--content-spacing margin-right margin-right--half-width" v-model="sortOrder">
<option v-for="(key, index) in getSortOrderOptions()" :key="`${index}-deprecated-position-option`">
{{key}}
<option v-for="(key, index) in SortConfigFile" :key="`${index}-deprecated-position-option`" :value="key">
{{ t(`translations.enums.sortConfigFile.${EnumResolver.from(SortConfigFile, key)}`) }}
</option>
</select>
<select id="config-sort-direction" class="select select--content-spacing" v-model="sortDirection">
<option v-for="(key, index) in getSortDirectionOptions()" :key="`${index}-deprecated-position-option`">
{{key}}
<option v-for="(key, index) in SortDirection" :key="`${index}-deprecated-position-option`" :value="key">
{{ t(`translations.enums.sortDirection.${EnumResolver.from(SortDirection, key)}`) }}
</option>
</select>
</div>
Expand All @@ -51,9 +49,9 @@
<template v-slot:title>
<span>{{file.getName()}}</span>
</template>
<a class='card-footer-item' @click="editConfig(file)">Edit Config</a>
<a class='card-footer-item' @click="openConfig(file)">Open File</a>
<a class='card-footer-item' @click="deleteConfig(file)">Delete</a>
<a class='card-footer-item' @click="editConfig(file)">{{ t('translations.pages.configEditor.actions.editConfig' )}}</a>
<a class='card-footer-item' @click="openConfig(file)">{{ t('translations.pages.configEditor.actions.openFile' )}}</a>
<a class='card-footer-item' @click="deleteConfig(file)">{{ t('translations.pages.configEditor.actions.delete' )}}</a>
</ExpandableCard>
</div>
</div>
Expand All @@ -76,8 +74,11 @@ import { computed, onMounted, ref, watch, watchEffect } from 'vue';
import { getStore } from '../../providers/generic/store/StoreProvider';
import { State } from '../../store';
import path from '../../providers/node/path/path';
import { useI18n } from 'vue-i18n';
import EnumResolver from '../../model/enums/_EnumResolver';

const store = getStore<State>();
const { t, d, messages, locale } = useI18n();

const emits = defineEmits<{
(e: 'edit', file: ConfigFile): void;
Expand Down
Loading