更新前端i18n
This commit is contained in:
@@ -8,5 +8,23 @@
|
|||||||
"back": "Back",
|
"back": "Back",
|
||||||
"photo_count": "{count} photos",
|
"photo_count": "{count} photos",
|
||||||
"view_photo": "View Photo",
|
"view_photo": "View Photo",
|
||||||
"load_more": "All loaded"
|
"load_more": "All loaded",
|
||||||
|
"no_photos": "No photos yet",
|
||||||
|
"no_data": "No data",
|
||||||
|
"load_failed": "Load failed",
|
||||||
|
"retry": "Retry",
|
||||||
|
"view_original": "View Original",
|
||||||
|
"original": "Original",
|
||||||
|
"high_quality": "High",
|
||||||
|
"thumbnail": "Thumbnail",
|
||||||
|
"loaded_all": "✓ Loaded all {count} photos",
|
||||||
|
"double_click_zoom": "Double-click to zoom",
|
||||||
|
"pinch_zoom": "Pinch to zoom",
|
||||||
|
"keyboard_zoom": "+/− to zoom",
|
||||||
|
"reset_zoom": "0 to reset",
|
||||||
|
"previous_photo": "Previous photo",
|
||||||
|
"next_photo": "Next photo",
|
||||||
|
"reset": "Reset",
|
||||||
|
"zoom_in": "Zoom in",
|
||||||
|
"zoom_out": "Zoom out"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,5 +8,23 @@
|
|||||||
"back": "返回",
|
"back": "返回",
|
||||||
"photo_count": "{count} 张照片",
|
"photo_count": "{count} 张照片",
|
||||||
"view_photo": "查看照片",
|
"view_photo": "查看照片",
|
||||||
"load_more": "已全部加载"
|
"load_more": "已全部加载",
|
||||||
|
"no_photos": "暂无照片",
|
||||||
|
"no_data": "暂无数据",
|
||||||
|
"load_failed": "加载失败",
|
||||||
|
"retry": "重试",
|
||||||
|
"view_original": "查看原图",
|
||||||
|
"original": "原图",
|
||||||
|
"high_quality": "高清",
|
||||||
|
"thumbnail": "缩略",
|
||||||
|
"loaded_all": "✓ 已加载全部 {count} 张照片",
|
||||||
|
"double_click_zoom": "🖱️ 双击放大",
|
||||||
|
"pinch_zoom": "🤏 捏合缩放",
|
||||||
|
"keyboard_zoom": "⌨️ +/− 缩放",
|
||||||
|
"reset_zoom": "⌨️ 0 重置",
|
||||||
|
"previous_photo": "上一张",
|
||||||
|
"next_photo": "下一张",
|
||||||
|
"reset": "重置",
|
||||||
|
"zoom_in": "放大",
|
||||||
|
"zoom_out": "缩小"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import AlbumCard from './AlbumCard.svelte';
|
import AlbumCard from './AlbumCard.svelte';
|
||||||
import { Empty } from '$lib/components/ui';
|
import { Empty } from '$lib/components/ui';
|
||||||
|
import { m } from '$lib/paraglide/messages';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {Object} AlbumListProps
|
* @typedef {Object} AlbumListProps
|
||||||
@@ -12,7 +13,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if albums.length === 0}
|
{#if albums.length === 0}
|
||||||
<Empty message="暂无相册" icon="📁" />
|
<Empty message={m.no_albums()} icon="📁" />
|
||||||
{:else}
|
{:else}
|
||||||
<div class="album-grid">
|
<div class="album-grid">
|
||||||
{#each albums as album (album.id)}
|
{#each albums as album (album.id)}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import PhotoCard from './PhotoCard.svelte';
|
import PhotoCard from './PhotoCard.svelte';
|
||||||
import { Empty, Loading } from '$lib/components/ui';
|
import { Empty, Loading } from '$lib/components/ui';
|
||||||
|
import { m } from '$lib/paraglide/messages';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {Object} PhotoGridProps
|
* @typedef {Object} PhotoGridProps
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if photos.length === 0 && !hasMore}
|
{#if photos.length === 0 && !hasMore}
|
||||||
<Empty message="暂无照片" icon="📷" />
|
<Empty message={m.no_photos()} icon="📷" />
|
||||||
{:else}
|
{:else}
|
||||||
<div class="photo-scroll-container" bind:this={scrollContainer}>
|
<div class="photo-scroll-container" bind:this={scrollContainer}>
|
||||||
<div class="photo-grid">
|
<div class="photo-grid">
|
||||||
@@ -43,15 +44,15 @@
|
|||||||
|
|
||||||
{#if isLoading}
|
{#if isLoading}
|
||||||
<div class="loading-trigger">
|
<div class="loading-trigger">
|
||||||
<Loading message="加载中..." size="small" />
|
<Loading message={m.loading()} size="small" />
|
||||||
</div>
|
</div>
|
||||||
{:else if displayedCount < photos.length || hasMore}
|
{:else if displayedCount < photos.length || hasMore}
|
||||||
<div class="load-more-trigger" bind:this={loadMoreTrigger}>
|
<div class="load-more-trigger" bind:this={loadMoreTrigger}>
|
||||||
<div class="loading-more">加载中...</div>
|
<div class="loading-more">{m.loading()}</div>
|
||||||
</div>
|
</div>
|
||||||
{:else if photos.length > 0}
|
{:else if photos.length > 0}
|
||||||
<div class="load-complete">
|
<div class="load-complete">
|
||||||
✓ 已加载全部 {totalPhotos || photos.length} 张照片
|
{m.loaded_all({ count: totalPhotos || photos.length })}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import { m } from '$lib/paraglide/messages';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {Object} EmptyProps
|
* @typedef {Object} EmptyProps
|
||||||
* @property {string} [message]
|
* @property {string} [message]
|
||||||
@@ -7,7 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/** @type {EmptyProps} */
|
/** @type {EmptyProps} */
|
||||||
let { message = '暂无数据', icon = '📭', children } = $props();
|
let { message = m.no_data(), icon = '📭', children } = $props();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="empty">
|
<div class="empty">
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { page } from '$app/state';
|
import { page } from '$app/state';
|
||||||
|
import { m } from '$lib/paraglide/messages';
|
||||||
import { albums, back, photo_count, loading } from '$lib/paraglide/messages';
|
import { albums, back, photo_count, loading } from '$lib/paraglide/messages';
|
||||||
import { resolve } from '$app/paths';
|
import { resolve } from '$app/paths';
|
||||||
import { SvelteSet } from 'svelte/reactivity';
|
import { SvelteSet } from 'svelte/reactivity';
|
||||||
@@ -147,7 +148,7 @@
|
|||||||
</PageHeader>
|
</PageHeader>
|
||||||
|
|
||||||
{#if !album || (allPhotos.length === 0 && !hasMore)}
|
{#if !album || (allPhotos.length === 0 && !hasMore)}
|
||||||
<Empty message="暂无照片" icon="📷" />
|
<Empty message={m.no_photos()} icon="📷" />
|
||||||
{:else}
|
{:else}
|
||||||
<PhotoGrid
|
<PhotoGrid
|
||||||
photos={allPhotos}
|
photos={allPhotos}
|
||||||
|
|||||||
@@ -653,12 +653,12 @@
|
|||||||
|
|
||||||
{#if loadError}
|
{#if loadError}
|
||||||
<div class="error-toast">
|
<div class="error-toast">
|
||||||
<span>加载失败</span>
|
<span>{m.load_failed()}</span>
|
||||||
<button
|
<button
|
||||||
onclick={() => {
|
onclick={() => {
|
||||||
loadError = false;
|
loadError = false;
|
||||||
loadStage = 'thumbnail';
|
loadStage = 'thumbnail';
|
||||||
}}>重试</button
|
}}>{m.retry()}</button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -687,7 +687,7 @@
|
|||||||
<path d="M11 8v6" />
|
<path d="M11 8v6" />
|
||||||
<path d="M8 11h6" />
|
<path d="M8 11h6" />
|
||||||
</svg>
|
</svg>
|
||||||
<span>查看原图</span>
|
<span>{m.view_original()}</span>
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
@@ -702,11 +702,11 @@
|
|||||||
{#if photo && !photo.mimeType?.startsWith('video/')}
|
{#if photo && !photo.mimeType?.startsWith('video/')}
|
||||||
<span class="quality-indicator">
|
<span class="quality-indicator">
|
||||||
{#if loadStage === 'full'}
|
{#if loadStage === 'full'}
|
||||||
原图
|
{m.original()}
|
||||||
{:else if loadStage === 'preview'}
|
{:else if loadStage === 'preview'}
|
||||||
高清
|
{m.high_quality()}
|
||||||
{:else}
|
{:else}
|
||||||
缩略
|
{m.thumbnail()}
|
||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -717,7 +717,7 @@
|
|||||||
class="nav-button prev"
|
class="nav-button prev"
|
||||||
onclick={goToPrevious}
|
onclick={goToPrevious}
|
||||||
disabled={!hasPrev || isNavigating}
|
disabled={!hasPrev || isNavigating}
|
||||||
aria-label="Previous photo"
|
aria-label={m.previous_photo()}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
@@ -781,7 +781,7 @@
|
|||||||
class="nav-button next"
|
class="nav-button next"
|
||||||
onclick={goToNext}
|
onclick={goToNext}
|
||||||
disabled={!hasNext || isNavigating}
|
disabled={!hasNext || isNavigating}
|
||||||
aria-label="Next photo"
|
aria-label={m.next_photo()}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
@@ -797,7 +797,7 @@
|
|||||||
onclick={zoomOut}
|
onclick={zoomOut}
|
||||||
disabled={targetScaleRef <= minScale + 0.01}
|
disabled={targetScaleRef <= minScale + 0.01}
|
||||||
type="button"
|
type="button"
|
||||||
aria-label="缩小"
|
aria-label={m.zoom_out()}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@@ -817,7 +817,7 @@
|
|||||||
onclick={zoomIn}
|
onclick={zoomIn}
|
||||||
disabled={targetScaleRef >= maxScale - 0.01}
|
disabled={targetScaleRef >= maxScale - 0.01}
|
||||||
type="button"
|
type="button"
|
||||||
aria-label="放大"
|
aria-label={m.zoom_in()}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
<path d="M8 11h6" />
|
<path d="M8 11h6" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<button onclick={resetZoom} type="button" aria-label="重置">
|
<button onclick={resetZoom} type="button" aria-label={m.reset()}>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
fill="none"
|
fill="none"
|
||||||
@@ -868,10 +868,10 @@
|
|||||||
|
|
||||||
<!-- 快捷键提示 -->
|
<!-- 快捷键提示 -->
|
||||||
<div class="shortcut-hints">
|
<div class="shortcut-hints">
|
||||||
<span>🖱️ 双击放大</span>
|
<span>{m.double_click_zoom()}</span>
|
||||||
<span>🤏 捏合缩放</span>
|
<span>{m.pinch_zoom()}</span>
|
||||||
<span>⌨️ +/− 缩放</span>
|
<span>{m.keyboard_zoom()}</span>
|
||||||
<span>⌨️ 0 重置</span>
|
<span>{m.reset_zoom()}</span>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,7 +8,11 @@ export default defineConfig({
|
|||||||
plugins: [
|
plugins: [
|
||||||
sveltekit(),
|
sveltekit(),
|
||||||
devtoolsJson(),
|
devtoolsJson(),
|
||||||
paraglideVitePlugin({ project: './project.inlang', outdir: './src/lib/paraglide' })
|
paraglideVitePlugin({
|
||||||
|
project: './project.inlang',
|
||||||
|
outdir: './src/lib/paraglide',
|
||||||
|
strategy: ['cookie', 'globalVariable', 'preferredLanguage', 'baseLocale']
|
||||||
|
})
|
||||||
],
|
],
|
||||||
server: {
|
server: {
|
||||||
proxy: {
|
proxy: {
|
||||||
|
|||||||
Reference in New Issue
Block a user