mirror of
https://github.com/photoprism/photoprism.git
synced 2025-09-26 21:01:58 +08:00
Compare commits
54 Commits
7e419f7419
...
scratch/fr
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dd3c80bd62 | ||
![]() |
fb65bb7935 | ||
![]() |
78698abcfa | ||
![]() |
c81890f86a | ||
![]() |
9cb7be07d0 | ||
![]() |
d834e5058b | ||
![]() |
05b9bab4e3 | ||
![]() |
b3d8448927 | ||
![]() |
6fc66dec36 | ||
![]() |
8f531d5a56 | ||
![]() |
334185bb0f | ||
![]() |
b84505f5d6 | ||
![]() |
312d230f02 | ||
![]() |
fdd92d3a0a | ||
![]() |
feb2402c0a | ||
![]() |
df892d1f81 | ||
![]() |
5ef580fc42 | ||
![]() |
d52c17da7a | ||
![]() |
fba42f21d1 | ||
![]() |
38cea8dc09 | ||
![]() |
2a14a8d958 | ||
![]() |
3d3d170e33 | ||
![]() |
6882d0ce14 | ||
![]() |
62e1ff9f48 | ||
![]() |
26500ee80e | ||
![]() |
6c90fb5b81 | ||
![]() |
4dfa6d9062 | ||
![]() |
3ff71ebb00 | ||
![]() |
2fcfc702a9 | ||
![]() |
5c4dcbcce4 | ||
![]() |
6848a5cbee | ||
![]() |
d6a6fa2ed9 | ||
![]() |
0369121421 | ||
![]() |
63528d1090 | ||
![]() |
afe5034772 | ||
![]() |
5e32205bda | ||
![]() |
81a8dd28f8 | ||
![]() |
68084bb365 | ||
![]() |
24f4705351 | ||
![]() |
0b9719fc44 | ||
![]() |
bcae07ae46 | ||
![]() |
7d950cb269 | ||
![]() |
9fee538925 | ||
![]() |
a01317fa1a | ||
![]() |
6f36a9913d | ||
![]() |
173f6a065c | ||
![]() |
0449e4cc8c | ||
![]() |
e9a9e9f436 | ||
![]() |
c7cbc920e8 | ||
![]() |
7cf730ff20 | ||
![]() |
1345d471eb | ||
![]() |
81e0502bdd | ||
![]() |
746729607b | ||
![]() |
df7df30161 |
43
frontend/gettext.config.js
Normal file
43
frontend/gettext.config.js
Normal file
@@ -0,0 +1,43 @@
|
||||
const glob = require("glob");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
// Find all .po files in the frontend/src/locales
|
||||
const poFiles = glob.sync("src/locales/*.po");
|
||||
if (poFiles.length === 0) {
|
||||
console.error("No .po files found in src/locales");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Find output folder or create the new one in assets/static/locales
|
||||
const outputDir = path.resolve(__dirname, "../assets/static/locales");
|
||||
if (!fs.existsSync(outputDir)) {
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
}
|
||||
|
||||
// Copy .po files from frontend/src/locales to assets/static/locales
|
||||
poFiles.forEach((filePath) => {
|
||||
const fileName = path.basename(filePath);
|
||||
const destinationPath = path.join(outputDir, fileName);
|
||||
fs.copyFileSync(filePath, destinationPath);
|
||||
});
|
||||
|
||||
// Find all languages codes from .po files (cut file names without .po)
|
||||
const languageCodes = poFiles.map((filePath) => {
|
||||
const fileName = path.basename(filePath);
|
||||
return fileName.replace(".po", "");
|
||||
});
|
||||
|
||||
// Transform files from .po to .json in the assets/static/locales
|
||||
module.exports = {
|
||||
input: {
|
||||
path: path.resolve(__dirname, "../assets/static/locales"),
|
||||
include: ["**/*.po"],
|
||||
},
|
||||
output: {
|
||||
path: path.resolve(__dirname, "../assets/static/locales"),
|
||||
jsonPath: "",
|
||||
locales: languageCodes,
|
||||
splitJson: true,
|
||||
},
|
||||
};
|
@@ -71,7 +71,7 @@ window.$isMobile = $isMobile;
|
||||
|
||||
$config.progress(50);
|
||||
|
||||
$config.update().finally(() => {
|
||||
$config.update().finally(async () => {
|
||||
// Initialize libs and framework.
|
||||
$config.progress(66);
|
||||
|
||||
@@ -114,9 +114,6 @@ $config.update().finally(() => {
|
||||
});
|
||||
};
|
||||
|
||||
// Create Vue 3 Gettext instance.
|
||||
const gettext = createGettext($config);
|
||||
|
||||
// Create Vuetify 3 instance.
|
||||
const vuetify = createVuetify({
|
||||
defaults,
|
||||
@@ -139,7 +136,10 @@ $config.update().finally(() => {
|
||||
// Use Vuetify 3.
|
||||
app.use(vuetify);
|
||||
|
||||
// Use Vue 3 Gettext.
|
||||
await $config.loadLanguageAsync($config.getLanguageLocale());
|
||||
|
||||
// Create and use Vue 3 Gettext instance.
|
||||
const gettext = createGettext($config);
|
||||
app.use(gettext);
|
||||
|
||||
// Use HTML sanitizer with v-sanitize directive.
|
||||
|
@@ -26,7 +26,6 @@ Additional information can be found in our Developer Guide:
|
||||
import Photos from "page/photos.vue";
|
||||
import Albums from "page/albums.vue";
|
||||
import AlbumPhotos from "page/album/photos.vue";
|
||||
import Places from "page/places.vue";
|
||||
import Browse from "page/library/browse.vue";
|
||||
import Errors from "page/library/errors.vue";
|
||||
import Labels from "page/labels.vue";
|
||||
@@ -278,13 +277,13 @@ export default [
|
||||
{
|
||||
name: "places",
|
||||
path: "/places",
|
||||
component: Places,
|
||||
component: () => import(/* webpackChunkName: "places-page" */ "page/places.vue"),
|
||||
meta: { title: $gettext("Places"), requiresAuth: true },
|
||||
},
|
||||
{
|
||||
name: "places_view",
|
||||
path: "/places/view/:s",
|
||||
component: Places,
|
||||
component: () => import(/* webpackChunkName: "places-page" */ "page/places.vue"),
|
||||
meta: { title: $gettext("Places"), requiresAuth: true },
|
||||
},
|
||||
{
|
||||
|
@@ -26,7 +26,6 @@ Additional information can be found in our Developer Guide:
|
||||
import $api from "common/api";
|
||||
import $event from "common/event";
|
||||
import * as themes from "options/themes";
|
||||
import translations from "locales/translations.json";
|
||||
import { Languages } from "options/options";
|
||||
import { Photo } from "model/photo";
|
||||
import { onInit, onSetTheme } from "common/hooks";
|
||||
@@ -48,7 +47,7 @@ export default class Config {
|
||||
this.updating = false;
|
||||
|
||||
this.$vuetify = null;
|
||||
this.translations = translations;
|
||||
this.translations = null;
|
||||
|
||||
if (!values || !values.siteTitle) {
|
||||
// Omit warning in unit tests.
|
||||
@@ -417,6 +416,20 @@ export default class Config {
|
||||
return !this.allowAny(resource, perm);
|
||||
}
|
||||
|
||||
// getLanguageJson loading the json file by language abbreviation (e.g. "en" or "zh_TW" (minimum 2 letters).)
|
||||
async loadLanguageAsync (locale) {
|
||||
try {
|
||||
// Dynamically import the translation JSON file based on the selected language
|
||||
const file = await import(/* webpackChunkName: "[request]" */`../../../assets/static/locales/${locale}.json`);
|
||||
|
||||
// Apply translations
|
||||
this.translations = file.default;
|
||||
this.setLanguage(locale, true);
|
||||
} catch (error) {
|
||||
console.error(`Error loading language file for ${locale}:`, error);
|
||||
}
|
||||
};
|
||||
|
||||
// setLanguage sets the ISO/IEC 15897 locale,
|
||||
// e.g. "en" or "zh_TW" (minimum 2 letters).
|
||||
setLanguage(locale, apply) {
|
||||
|
1
frontend/src/locales/af.json
Normal file
1
frontend/src/locales/af.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ar.json
Normal file
1
frontend/src/locales/ar.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/be.json
Normal file
1
frontend/src/locales/be.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/bg.json
Normal file
1
frontend/src/locales/bg.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ca.json
Normal file
1
frontend/src/locales/ca.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/cs.json
Normal file
1
frontend/src/locales/cs.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/da.json
Normal file
1
frontend/src/locales/da.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/de.json
Normal file
1
frontend/src/locales/de.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/el.json
Normal file
1
frontend/src/locales/el.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/en.json
Normal file
1
frontend/src/locales/en.json
Normal file
@@ -0,0 +1 @@
|
||||
{"en":{"Next":"Next"}}
|
1
frontend/src/locales/es.json
Normal file
1
frontend/src/locales/es.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/et.json
Normal file
1
frontend/src/locales/et.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/eu.json
Normal file
1
frontend/src/locales/eu.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/fa.json
Normal file
1
frontend/src/locales/fa.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/fi.json
Normal file
1
frontend/src/locales/fi.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/fr.json
Normal file
1
frontend/src/locales/fr.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ga.json
Normal file
1
frontend/src/locales/ga.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/he.json
Normal file
1
frontend/src/locales/he.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/hi.json
Normal file
1
frontend/src/locales/hi.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/hr.json
Normal file
1
frontend/src/locales/hr.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/hu.json
Normal file
1
frontend/src/locales/hu.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/id.json
Normal file
1
frontend/src/locales/id.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/it.json
Normal file
1
frontend/src/locales/it.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ja.json
Normal file
1
frontend/src/locales/ja.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ko.json
Normal file
1
frontend/src/locales/ko.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ku.json
Normal file
1
frontend/src/locales/ku.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/lt.json
Normal file
1
frontend/src/locales/lt.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ms.json
Normal file
1
frontend/src/locales/ms.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/nb.json
Normal file
1
frontend/src/locales/nb.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/nl.json
Normal file
1
frontend/src/locales/nl.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/pl.json
Normal file
1
frontend/src/locales/pl.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/pt.json
Normal file
1
frontend/src/locales/pt.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/pt_BR.json
Normal file
1
frontend/src/locales/pt_BR.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ro.json
Normal file
1
frontend/src/locales/ro.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/ru.json
Normal file
1
frontend/src/locales/ru.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/sk.json
Normal file
1
frontend/src/locales/sk.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/sl.json
Normal file
1
frontend/src/locales/sl.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/sv.json
Normal file
1
frontend/src/locales/sv.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/th.json
Normal file
1
frontend/src/locales/th.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/tr.json
Normal file
1
frontend/src/locales/tr.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
1
frontend/src/locales/uk.json
Normal file
1
frontend/src/locales/uk.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/vi.json
Normal file
1
frontend/src/locales/vi.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/zh.json
Normal file
1
frontend/src/locales/zh.json
Normal file
File diff suppressed because one or more lines are too long
1
frontend/src/locales/zh_TW.json
Normal file
1
frontend/src/locales/zh_TW.json
Normal file
File diff suppressed because one or more lines are too long
@@ -64,6 +64,16 @@ const config = {
|
||||
devtool: isDev ? "inline-source-map" : false,
|
||||
optimization: {
|
||||
minimize: !isDev,
|
||||
splitChunks: {
|
||||
cacheGroups: {
|
||||
places: {
|
||||
test: /[\\/]page[\\/]places\.vue$/,
|
||||
name: "places-page",
|
||||
enforce: true,
|
||||
},
|
||||
vendors: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
entry: {
|
||||
app: PATHS.app,
|
||||
@@ -72,17 +82,15 @@ const config = {
|
||||
},
|
||||
output: {
|
||||
path: PATHS.build,
|
||||
publicPath: PATHS.public,
|
||||
filename: "[name].[contenthash].js",
|
||||
filename: '[name].[contenthash].js',
|
||||
clean: true,
|
||||
chunkFilename: 'locales/[name].json',
|
||||
},
|
||||
resolve: {
|
||||
modules: isCustom ? [PATHS.custom, PATHS.src, PATHS.modules] : [PATHS.src, PATHS.modules],
|
||||
preferRelative: true,
|
||||
alias: {
|
||||
// TODO: change it
|
||||
vue$: "vue/dist/vue.runtime.esm-bundler.js",
|
||||
// vue: isDev ? "vue/dist/vue.js" : "vue/dist/vue.min.js",
|
||||
vue$: isDev ? "vue/dist/vue.esm-bundler.js" : "vue/dist/vue.runtime.esm-bundler.js",
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
|
Reference in New Issue
Block a user