Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
27 changes: 26 additions & 1 deletion cmd/opensave-app/frontend/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,5 +186,30 @@
"home.welcome.intro": "Keep your game saves in sync across every device — no accounts, no cloud lock-in. Start by finding your saves:",
"home.welcome.scanForSaves": "Scan for saves",
"home.welcome.title": "Welcome to OpenSave",
"home.welcome.trackManually": "Track a folder manually"
"home.welcome.trackManually": "Track a folder manually",
"home.trackGame": "Track game",
"home.trackGameTitle": "Find a game by name, or choose its program or save folder",
"home.addGame.recognisedAs": "Recognised as \"{name}\" — its cover art comes from the game database.",
"home.findGame.title": "Track a game from the game database",
"home.findGame.findByName": "Find by name",
"home.findGame.searchPlaceholder": "e.g. Crimson Desert",
"home.findGame.searching": "Searching…",
"home.findGame.noSavesHere": "no saves found on this PC",
"home.findGame.trackedAs": "tracked as \"{name}\"",
"home.findGame.nothingFound": "Nothing by that name in the game database.",
"home.findGame.chooseProgram": "Choose the game’s program…",
"home.findGame.chooseSaveFolder": "Choose its save folder…",
"home.findGame.programDialog": "Choose the game’s program",
"home.findGame.saveFolderDialog": "Choose the game’s save folder",
"home.findGame.saveFolderOf": "Save folder of \"{name}\"",
"home.findGame.theGame": "the game",
"home.findGame.notKnown": "Not in the game database — give it a name, and pick its save folder if it is not set.",
"home.findGame.saveFolder": "Save folder",
"home.findGame.noSavesYet": "No saves of it found on this PC yet. Choose where it saves, or play it once and track it then.",
"home.findGame.otherSaveFolder": "Choose another save folder…",
"home.findGame.program": "Program",
"home.findGame.pickAnother": "← Pick another game",
"home.findGame.already": "Already tracked here as \"{tracked}\". Tracking it again would sync the same files twice; link that entry to {name} instead, so it gets the game database’s name, App ID and cover art.",
"home.findGame.link": "Link \"{tracked}\" to {name}",
"home.findGame.linked": "\"{tracked}\" is now {name}"
}
27 changes: 26 additions & 1 deletion cmd/opensave-app/frontend/src/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -165,5 +165,30 @@
"home.welcome.intro": "让你的游戏存档在所有设备间保持同步——无需账号,不被云端绑架。先找到你的存档:",
"home.welcome.scanForSaves": "扫描存档",
"home.welcome.title": "欢迎使用 OpenSave",
"home.welcome.trackManually": "手动跟踪文件夹"
"home.welcome.trackManually": "手动跟踪文件夹",
"home.trackGame": "跟踪游戏",
"home.trackGameTitle": "按名称查找游戏,或选择其程序或存档文件夹",
"home.addGame.recognisedAs": "已识别为“{name}”——封面来自游戏数据库。",
"home.findGame.title": "从游戏数据库跟踪游戏",
"home.findGame.findByName": "按名称查找",
"home.findGame.searchPlaceholder": "例如:Crimson Desert",
"home.findGame.searching": "搜索中…",
"home.findGame.noSavesHere": "此电脑上未找到存档",
"home.findGame.trackedAs": "已作为“{name}”跟踪",
"home.findGame.nothingFound": "游戏数据库中没有这个名称的游戏。",
"home.findGame.chooseProgram": "选择游戏程序…",
"home.findGame.chooseSaveFolder": "选择其存档文件夹…",
"home.findGame.programDialog": "选择游戏程序",
"home.findGame.saveFolderDialog": "选择游戏的存档文件夹",
"home.findGame.saveFolderOf": "“{name}”的存档文件夹",
"home.findGame.theGame": "该游戏",
"home.findGame.notKnown": "不在游戏数据库中——请为它命名;如果尚未设置存档文件夹,请选择一个。",
"home.findGame.saveFolder": "存档文件夹",
"home.findGame.noSavesYet": "此电脑上尚未找到它的存档。请选择它的存档位置,或先玩一次再跟踪。",
"home.findGame.otherSaveFolder": "选择其他存档文件夹…",
"home.findGame.program": "程序",
"home.findGame.pickAnother": "← 选择其他游戏",
"home.findGame.already": "此处已作为“{tracked}”跟踪。再次跟踪会将相同的文件同步两次;请改为将该条目关联到 {name},使其获得游戏数据库中的名称、App ID 和封面。",
"home.findGame.link": "将“{tracked}”关联到 {name}",
"home.findGame.linked": "“{tracked}”现在是 {name}"
}
8 changes: 8 additions & 0 deletions cmd/opensave-app/frontend/src/views/Home.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import { gameStatus, conflictedIds } from '../lib/gamestatus.js';
import OfferedGames from './home/OfferedGames.svelte';
import AddGameCard from './home/AddGameCard.svelte';
import TrackGameDialog from './home/TrackGameDialog.svelte';
import ScanDialog from './home/ScanDialog.svelte';
import HomeSummary from './home/HomeSummary.svelte';
import LibraryGrid from './home/LibraryGrid.svelte';
Expand All @@ -31,6 +32,8 @@
// on the params object, so each request — the sidebar's +, Ctrl+K — opens
// it once, and not again on every re-render.
let showAdd = false;
// Tracking a game the game database knows (TrackGameDialog).
let showTrackGame = false;
let addPath = '';
let handledAdd = null;
$: if (params.add && params !== handledAdd) {
Expand Down Expand Up @@ -109,6 +112,7 @@
</button>
<button class="btn" on:click={syncAll} disabled={$gameList.length === 0 || $syncPause.paused} title={$syncPause.paused ? $t('home.syncPaused') : ''}><RefreshCw size={15} />{$t('home.syncAll')}</button>
<PauseButton />
<button class="btn" on:click={() => (showTrackGame = true)} title={$t('home.trackGameTitle')}><Gamepad2 size={16} />{$t('home.trackGame')}</button>
<button class="btn" on:click={trackFolder} title={$t('home.trackFolderTitle')}><FolderPlus size={16} />{$t('home.trackFolder')}</button>
</div>
</div>
Expand All @@ -119,6 +123,10 @@
<AddGameCard path={addPath} on:close={() => (showAdd = false)} />
{/if}

{#if showTrackGame}
<TrackGameDialog on:close={() => (showTrackGame = false)} />
{/if}

<ScanDialog bind:this={scanner} bind:scanning />

{#if !$stateLoaded}
Expand Down
25 changes: 22 additions & 3 deletions cmd/opensave-app/frontend/src/views/home/AddGameCard.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
export let path = '';

let name = '';
// The game the folder is a save location of, in the game database: its
// name and App ID (cover art, launching).
let appId = '';
let knownAs = '';
let typed = false; // once typed in, a late suggestion must not replace it
let adding = false;
let nameInput;
Expand All @@ -32,10 +36,24 @@
suggestedFor = p;
if (!p) return;
let guess = folderName(p);
appId = '';
knownAs = '';
try {
guess = (await api.get(`/api/suggest-name?path=${encodeURIComponent(p)}`)).name || guess;
const id = await api.get(`/api/gamedb/identify?path=${encodeURIComponent(p)}`);
if (id.found && p === path) {
appId = id.game.appId ?? '';
knownAs = id.game.name;
guess = id.game.name;
}
} catch {
// The folder's own name will do.
// Named from the path instead.
}
if (!knownAs) {
try {
guess = (await api.get(`/api/suggest-name?path=${encodeURIComponent(p)}`)).name || guess;
} catch {
// The folder's own name will do.
}
}
if (p !== path || typed) return;
name = guess;
Expand Down Expand Up @@ -65,7 +83,7 @@
if (!name.trim() || !path || adding) return;
adding = true;
try {
const game = await api.post('/api/games', { name: name.trim(), savePath: path });
const game = await api.post('/api/games', { name: name.trim(), savePath: path, appId });
toast($t('common.nowTracking', { name: game.name ?? name }), 'success');
dispatch('close');
navigate('game', { gameId: game.id });
Expand Down Expand Up @@ -102,6 +120,7 @@
on:keydown={(e) => e.key === 'Enter' && add()}
/>
<span class="hint">{$t('home.addGame.nameHint')}</span>
{#if knownAs}<span class="hint">{$t('home.addGame.recognisedAs', { name: knownAs })}</span>{/if}
</div>
</div>
<ModalFoot>
Expand Down
Loading
Loading