Compare commits
2 Commits
a1ea192a73
...
a7688e4ed5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7688e4ed5 | ||
|
|
9c91d99bed |
@@ -58,6 +58,10 @@ class FalukantController {
|
||||
if (!page) page = 1;
|
||||
return this.service.moneyHistory(userId, page, filter);
|
||||
});
|
||||
this.moneyHistoryGraph = this._wrapWithUser((userId, req) => {
|
||||
const { range } = req.body || {};
|
||||
return this.service.moneyHistoryGraph(userId, range || '24h');
|
||||
});
|
||||
this.getStorage = this._wrapWithUser((userId, req) => this.service.getStorage(userId, req.params.branchId));
|
||||
this.buyStorage = this._wrapWithUser((userId, req) => {
|
||||
const { branchId, amount, stockTypeId } = req.body;
|
||||
@@ -123,6 +127,9 @@ class FalukantController {
|
||||
});
|
||||
|
||||
this.getTitlesOfNobility = this._wrapWithUser((userId) => this.service.getTitlesOfNobility(userId));
|
||||
this.getReputationActions = this._wrapWithUser((userId) => this.service.getReputationActions(userId));
|
||||
this.executeReputationAction = this._wrapWithUser((userId, req) =>
|
||||
this.service.executeReputationAction(userId, req.body?.actionTypeId), { successStatus: 201 });
|
||||
this.getHouseTypes = this._wrapWithUser((userId) => this.service.getHouseTypes(userId));
|
||||
this.getMoodAffect = this._wrapWithUser((userId) => this.service.getMoodAffect(userId));
|
||||
this.getCharacterAffect = this._wrapWithUser((userId) => this.service.getCharacterAffect(userId));
|
||||
@@ -142,6 +149,17 @@ class FalukantController {
|
||||
const { characterId: childId, firstName } = req.body;
|
||||
return this.service.baptise(userId, childId, firstName);
|
||||
});
|
||||
this.getChurchOverview = this._wrapWithUser((userId) => this.service.getChurchOverview(userId));
|
||||
this.getAvailableChurchPositions = this._wrapWithUser((userId) => this.service.getAvailableChurchPositions(userId));
|
||||
this.getSupervisedApplications = this._wrapWithUser((userId) => this.service.getSupervisedApplications(userId));
|
||||
this.applyForChurchPosition = this._wrapWithUser((userId, req) => {
|
||||
const { officeTypeId, regionId } = req.body;
|
||||
return this.service.applyForChurchPosition(userId, officeTypeId, regionId);
|
||||
});
|
||||
this.decideOnChurchApplication = this._wrapWithUser((userId, req) => {
|
||||
const { applicationId, decision } = req.body;
|
||||
return this.service.decideOnChurchApplication(userId, applicationId, decision);
|
||||
});
|
||||
|
||||
this.getEducation = this._wrapWithUser((userId) => this.service.getEducation(userId));
|
||||
this.sendToSchool = this._wrapWithUser((userId, req) => {
|
||||
@@ -154,25 +172,20 @@ class FalukantController {
|
||||
this.takeBankCredits = this._wrapWithUser((userId, req) => this.service.takeBankCredits(userId, req.body.height));
|
||||
|
||||
this.getNobility = this._wrapWithUser((userId) => this.service.getNobility(userId));
|
||||
this.advanceNobility = this._wrapWithUser(async (userId) => {
|
||||
this.advanceNobility = this._wrapWithUser((userId) => this.service.advanceNobility(userId));
|
||||
|
||||
this.getHealth = this._wrapWithUser((userId) => this.service.getHealth(userId));
|
||||
this.healthActivity = this._wrapWithUser(async (userId, req) => {
|
||||
try {
|
||||
return await this.service.advanceNobility(userId);
|
||||
return await this.service.healthActivity(userId, req.body.measureTr);
|
||||
} catch (e) {
|
||||
if (e && e.name === 'PreconditionError') {
|
||||
if (e.message === 'nobilityTooSoon') {
|
||||
throw { status: 412, message: 'nobilityTooSoon', retryAt: e.meta?.retryAt };
|
||||
}
|
||||
if (e.message === 'nobilityRequirements') {
|
||||
throw { status: 412, message: 'nobilityRequirements', unmet: e.meta?.unmet || [] };
|
||||
}
|
||||
if (e && e.name === 'PreconditionError' && e.message === 'tooClose') {
|
||||
throw { status: 412, message: 'tooClose', retryAt: e.meta?.retryAt };
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
|
||||
this.getHealth = this._wrapWithUser((userId) => this.service.getHealth(userId));
|
||||
this.healthActivity = this._wrapWithUser((userId, req) => this.service.healthActivity(userId, req.body.measureTr));
|
||||
|
||||
this.getPoliticsOverview = this._wrapWithUser((userId) => this.service.getPoliticsOverview(userId));
|
||||
this.getOpenPolitics = this._wrapWithUser((userId) => this.service.getOpenPolitics(userId));
|
||||
this.getElections = this._wrapWithUser((userId) => this.service.getElections(userId));
|
||||
@@ -189,6 +202,13 @@ class FalukantController {
|
||||
}
|
||||
return this.service.getProductPriceInRegion(userId, productId, regionId);
|
||||
});
|
||||
this.getAllProductPricesInRegion = this._wrapWithUser((userId, req) => {
|
||||
const regionId = parseInt(req.query.regionId, 10);
|
||||
if (Number.isNaN(regionId)) {
|
||||
throw new Error('regionId is required');
|
||||
}
|
||||
return this.service.getAllProductPricesInRegion(userId, regionId);
|
||||
});
|
||||
this.getProductPricesInCities = this._wrapWithUser((userId, req) => {
|
||||
const productId = parseInt(req.query.productId, 10);
|
||||
const currentPrice = parseFloat(req.query.currentPrice);
|
||||
@@ -198,6 +218,16 @@ class FalukantController {
|
||||
}
|
||||
return this.service.getProductPricesInCities(userId, productId, currentPrice, currentRegionId);
|
||||
});
|
||||
this.getProductPricesInCitiesBatch = this._wrapWithUser((userId, req) => {
|
||||
const body = req.body || {};
|
||||
const items = Array.isArray(body.items) ? body.items : [];
|
||||
const currentRegionId = body.currentRegionId != null ? parseInt(body.currentRegionId, 10) : null;
|
||||
const valid = items.map(i => ({
|
||||
productId: parseInt(i.productId, 10),
|
||||
currentPrice: parseFloat(i.currentPrice)
|
||||
})).filter(i => !Number.isNaN(i.productId) && !Number.isNaN(i.currentPrice));
|
||||
return this.service.getProductPricesInCitiesBatch(userId, valid, Number.isNaN(currentRegionId) ? null : currentRegionId);
|
||||
});
|
||||
this.renovate = this._wrapWithUser((userId, req) => this.service.renovate(userId, req.body.element));
|
||||
this.renovateAll = this._wrapWithUser((userId) => this.service.renovateAll(userId));
|
||||
|
||||
@@ -205,6 +235,7 @@ class FalukantController {
|
||||
this.getNotifications = this._wrapWithUser((userId) => this.service.getNotifications(userId));
|
||||
this.getAllNotifications = this._wrapWithUser((userId, req) => this.service.getAllNotifications(userId, req.query.page, req.query.size));
|
||||
this.markNotificationsShown = this._wrapWithUser((userId) => this.service.markNotificationsShown(userId), { successStatus: 202 });
|
||||
this.getDashboardWidget = this._wrapWithUser((userId) => this.service.getDashboardWidget(userId));
|
||||
this.getUndergroundTargets = this._wrapWithUser((userId) => this.service.getPoliticalOfficeHolders(userId));
|
||||
|
||||
this.searchUsers = this._wrapWithUser((userId, req) => {
|
||||
@@ -279,7 +310,13 @@ class FalukantController {
|
||||
} catch (error) {
|
||||
console.error('Controller error:', error);
|
||||
const status = error.status && typeof error.status === 'number' ? error.status : 500;
|
||||
res.status(status).json({ error: error.message || 'Internal error' });
|
||||
// Wenn error ein Objekt mit status ist, alle Felder außer status übernehmen
|
||||
if (error && typeof error === 'object' && error.status && typeof error.status === 'number') {
|
||||
const { status: errorStatus, ...errorData } = error;
|
||||
res.status(errorStatus).json({ error: error.message || errorData.message || 'Internal error', ...errorData });
|
||||
} else {
|
||||
res.status(status).json({ error: error.message || 'Internal error' });
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -15,17 +15,7 @@ ProductType.init({
|
||||
allowNull: false},
|
||||
sellCost: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false}
|
||||
,
|
||||
sellCostMinNeutral: {
|
||||
type: DataTypes.DECIMAL,
|
||||
allowNull: true,
|
||||
field: 'sell_cost_min_neutral'
|
||||
},
|
||||
sellCostMaxNeutral: {
|
||||
type: DataTypes.DECIMAL,
|
||||
allowNull: true,
|
||||
field: 'sell_cost_max_neutral'
|
||||
allowNull: false
|
||||
}
|
||||
}, {
|
||||
sequelize,
|
||||
|
||||
@@ -11,6 +11,7 @@ router.get('/character/affect', falukantController.getCharacterAffect);
|
||||
router.get('/name/randomfirstname/:gender', falukantController.randomFirstName);
|
||||
router.get('/name/randomlastname', falukantController.randomLastName);
|
||||
router.get('/info', falukantController.getInfo);
|
||||
router.get('/dashboard-widget', falukantController.getDashboardWidget);
|
||||
router.get('/branches/types', falukantController.getBranchTypes);
|
||||
router.get('/branches/:branch', falukantController.getBranch);
|
||||
router.get('/branches', falukantController.getBranches);
|
||||
@@ -28,6 +29,7 @@ router.get('/inventory/?:branchId', falukantController.getInventory);
|
||||
router.post('/sell/all', falukantController.sellAllProducts);
|
||||
router.post('/sell', falukantController.sellProduct);
|
||||
router.post('/moneyhistory', falukantController.moneyHistory);
|
||||
router.post('/moneyhistory/graph', falukantController.moneyHistoryGraph);
|
||||
router.get('/storage/:branchId', falukantController.getStorage);
|
||||
router.post('/storage', falukantController.buyStorage);
|
||||
router.delete('/storage', falukantController.sellStorage);
|
||||
@@ -50,6 +52,8 @@ router.get('/family/children', falukantController.getChildren);
|
||||
router.post('/family/gift', falukantController.sendGift);
|
||||
router.get('/family', falukantController.getFamily);
|
||||
router.get('/nobility/titels', falukantController.getTitlesOfNobility);
|
||||
router.get('/reputation/actions', falukantController.getReputationActions);
|
||||
router.post('/reputation/actions', falukantController.executeReputationAction);
|
||||
router.get('/houses/types', falukantController.getHouseTypes);
|
||||
router.get('/houses/buyable', falukantController.getBuyableHouses);
|
||||
router.get('/houses', falukantController.getUserHouse);
|
||||
@@ -61,6 +65,11 @@ router.post('/party', falukantController.createParty);
|
||||
router.get('/party', falukantController.getParties);
|
||||
router.get('/family/notbaptised', falukantController.getNotBaptisedChildren);
|
||||
router.post('/church/baptise', falukantController.baptise);
|
||||
router.get('/church/overview', falukantController.getChurchOverview);
|
||||
router.get('/church/positions/available', falukantController.getAvailableChurchPositions);
|
||||
router.get('/church/applications/supervised', falukantController.getSupervisedApplications);
|
||||
router.post('/church/positions/apply', falukantController.applyForChurchPosition);
|
||||
router.post('/church/applications/decide', falukantController.decideOnChurchApplication);
|
||||
router.get('/education', falukantController.getEducation);
|
||||
router.post('/education', falukantController.sendToSchool);
|
||||
router.get('/bank/overview', falukantController.getBankOverview);
|
||||
@@ -72,13 +81,14 @@ router.get('/health', falukantController.getHealth);
|
||||
router.post('/health', falukantController.healthActivity);
|
||||
router.get('/politics/overview', falukantController.getPoliticsOverview);
|
||||
router.get('/politics/open', falukantController.getOpenPolitics);
|
||||
router.post('/politics/open', falukantController.applyForElections);
|
||||
router.get('/politics/elections', falukantController.getElections);
|
||||
router.post('/politics/elections', falukantController.vote);
|
||||
router.get('/politics/open', falukantController.getOpenPolitics);
|
||||
router.post('/politics/open', falukantController.applyForElections);
|
||||
router.get('/cities', falukantController.getRegions);
|
||||
router.get('/products/price-in-region', falukantController.getProductPriceInRegion);
|
||||
router.get('/products/prices-in-region', falukantController.getAllProductPricesInRegion);
|
||||
router.get('/products/prices-in-cities', falukantController.getProductPricesInCities);
|
||||
router.post('/products/prices-in-cities-batch', falukantController.getProductPricesInCitiesBatch);
|
||||
router.get('/branches/:branchId/taxes', falukantController.getBranchTaxes);
|
||||
router.get('/vehicles/types', falukantController.getVehicleTypes);
|
||||
router.post('/vehicles', falukantController.buyVehicles);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -210,6 +210,14 @@ export default {
|
||||
},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
branchId: {
|
||||
immediate: false,
|
||||
handler() {
|
||||
this.loadDirector();
|
||||
},
|
||||
},
|
||||
},
|
||||
async mounted() {
|
||||
await this.loadDirector();
|
||||
},
|
||||
@@ -256,11 +264,17 @@ export default {
|
||||
},
|
||||
|
||||
speedLabel(value) {
|
||||
const key = value == null ? 'unknown' : String(value);
|
||||
if (value == null) return this.$t('falukant.branch.transport.speed.unknown') || '—';
|
||||
if (typeof value === 'object') {
|
||||
const k = value.tr ?? value.id ?? 'unknown';
|
||||
const tKey = `falukant.branch.transport.speed.${k}`;
|
||||
const t = this.$t(tKey);
|
||||
return (t && t !== tKey) ? t : String(k);
|
||||
}
|
||||
const key = String(value);
|
||||
const tKey = `falukant.branch.transport.speed.${key}`;
|
||||
const translated = this.$t(tKey);
|
||||
if (!translated || translated === tKey) return value;
|
||||
return translated;
|
||||
return (!translated || translated === tKey) ? key : translated;
|
||||
},
|
||||
|
||||
openNewDirectorDialog() {
|
||||
|
||||
@@ -251,13 +251,6 @@
|
||||
return new Date(a.eta).getTime() - new Date(b.eta).getTime();
|
||||
});
|
||||
},
|
||||
speedLabel(value) {
|
||||
const key = value == null ? 'unknown' : String(value);
|
||||
const tKey = `falukant.branch.transport.speed.${key}`;
|
||||
const translated = this.$t(tKey);
|
||||
if (!translated || translated === tKey) return value;
|
||||
return translated;
|
||||
},
|
||||
},
|
||||
async mounted() {
|
||||
await this.loadInventory();
|
||||
@@ -274,6 +267,19 @@
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
speedLabel(value) {
|
||||
if (value == null) return this.$t('falukant.branch.transport.speed.unknown') || '—';
|
||||
if (typeof value === 'object') {
|
||||
const k = value.tr ?? value.id ?? 'unknown';
|
||||
const tKey = `falukant.branch.transport.speed.${k}`;
|
||||
const t = this.$t(tKey);
|
||||
return (t && t !== tKey) ? t : String(k);
|
||||
}
|
||||
const key = String(value);
|
||||
const tKey = `falukant.branch.transport.speed.${key}`;
|
||||
const translated = this.$t(tKey);
|
||||
return (!translated || translated === tKey) ? key : translated;
|
||||
},
|
||||
async loadInventory() {
|
||||
try {
|
||||
const response = await apiClient.get(`/api/falukant/inventory/${this.branchId}`);
|
||||
@@ -287,25 +293,24 @@
|
||||
}
|
||||
},
|
||||
async loadPricesForInventory() {
|
||||
for (const item of this.inventory) {
|
||||
const itemKey = `${item.region.id}-${item.product.id}-${item.quality}`;
|
||||
if (this.loadingPrices.has(itemKey)) continue;
|
||||
this.loadingPrices.add(itemKey);
|
||||
try {
|
||||
// Aktueller Preis basierend auf sellCost
|
||||
const currentPrice = item.product.sellCost || 0;
|
||||
const { data } = await apiClient.get('/api/falukant/products/prices-in-cities', {
|
||||
params: {
|
||||
productId: item.product.id,
|
||||
currentPrice: currentPrice
|
||||
}
|
||||
});
|
||||
this.$set(item, 'betterPrices', data || []);
|
||||
} catch (error) {
|
||||
console.error(`Error loading prices for item ${itemKey}:`, error);
|
||||
this.$set(item, 'betterPrices', []);
|
||||
} finally {
|
||||
this.loadingPrices.delete(itemKey);
|
||||
if (this.inventory.length === 0) return;
|
||||
const currentRegionId = this.inventory[0]?.region?.id ?? null;
|
||||
const items = this.inventory.map(item => ({
|
||||
productId: item.product.id,
|
||||
currentPrice: item.product.sellCost || 0
|
||||
}));
|
||||
try {
|
||||
const { data } = await apiClient.post('/api/falukant/products/prices-in-cities-batch', {
|
||||
currentRegionId,
|
||||
items
|
||||
});
|
||||
for (const item of this.inventory) {
|
||||
item.betterPrices = data && data[item.product.id] ? data[item.product.id] : [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading prices for inventory:', error);
|
||||
for (const item of this.inventory) {
|
||||
item.betterPrices = [];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -39,6 +39,25 @@ import deMinigames from './locales/de/minigames.json';
|
||||
import deMessage from './locales/de/message.json';
|
||||
import dePersonal from './locales/de/personal.json';
|
||||
|
||||
import esGeneral from './locales/es/general.json';
|
||||
import esHeader from './locales/es/header.json';
|
||||
import esNavigation from './locales/es/navigation.json';
|
||||
import esHome from './locales/es/home.json';
|
||||
import esChat from './locales/es/chat.json';
|
||||
import esRegister from './locales/es/register.json';
|
||||
import esError from './locales/es/error.json';
|
||||
import esActivate from './locales/es/activate.json';
|
||||
import esSettings from './locales/es/settings.json';
|
||||
import esAdmin from './locales/es/admin.json';
|
||||
import esSocialNetwork from './locales/es/socialnetwork.json';
|
||||
import esFriends from './locales/es/friends.json';
|
||||
import esFalukant from './locales/es/falukant.json';
|
||||
import esPasswordReset from './locales/es/passwordReset.json';
|
||||
import esBlog from './locales/es/blog.json';
|
||||
import esMinigames from './locales/es/minigames.json';
|
||||
import esMessage from './locales/es/message.json';
|
||||
import esPersonal from './locales/es/personal.json';
|
||||
|
||||
const messages = {
|
||||
en: {
|
||||
...enGeneral,
|
||||
@@ -80,6 +99,26 @@ const messages = {
|
||||
...deMinigames,
|
||||
...deMessage,
|
||||
...dePersonal,
|
||||
},
|
||||
es: {
|
||||
...esGeneral,
|
||||
...esHeader,
|
||||
...esNavigation,
|
||||
...esHome,
|
||||
...esChat,
|
||||
...esRegister,
|
||||
...esPasswordReset,
|
||||
...esError,
|
||||
...esActivate,
|
||||
...esSettings,
|
||||
...esAdmin,
|
||||
...esSocialNetwork,
|
||||
...esFriends,
|
||||
...esFalukant,
|
||||
...esBlog,
|
||||
...esMinigames,
|
||||
...esMessage,
|
||||
...esPersonal,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -114,12 +114,21 @@
|
||||
},
|
||||
"overview": {
|
||||
"title": "Falukant - Übersicht",
|
||||
"heirSelection": {
|
||||
"title": "Erben-Auswahl",
|
||||
"description": "Dein bisheriger Charakter ist nicht mehr verfügbar. Wähle einen Erben aus der Liste, um mit diesem weiterzuspielen.",
|
||||
"loading": "Lade mögliche Erben…",
|
||||
"noHeirs": "Keine Erben verfügbar.",
|
||||
"select": "Als Spielcharakter wählen",
|
||||
"error": "Fehler beim Auswählen des Erben."
|
||||
},
|
||||
"metadata": {
|
||||
"title": "Persönliches",
|
||||
"name": "Name",
|
||||
"money": "Vermögen",
|
||||
"age": "Alter",
|
||||
"years": "Jahre",
|
||||
"days": "Tage",
|
||||
"mainbranch": "Heimatstadt",
|
||||
"nobleTitle": "Stand"
|
||||
},
|
||||
@@ -138,32 +147,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"genderAge": {
|
||||
"ageGroups": "infant:2|toddler:4|child:12|teen:18|youngAdult:25|adult:50|mature:70|elder:999",
|
||||
"neutral": {
|
||||
"child": "Kind"
|
||||
},
|
||||
"male": {
|
||||
"infant": "Säugling",
|
||||
"toddler": "Bübchen",
|
||||
"child": "Knabe",
|
||||
"teen": "Jüngling",
|
||||
"youngAdult": "Junker",
|
||||
"adult": "Mann",
|
||||
"mature": "Herr",
|
||||
"elder": "Greis"
|
||||
},
|
||||
"female": {
|
||||
"infant": "Säugling",
|
||||
"toddler": "Mädel",
|
||||
"child": "Göre",
|
||||
"teen": "Dirn",
|
||||
"youngAdult": "Jungfrau",
|
||||
"adult": "Frau",
|
||||
"mature": "Dame",
|
||||
"elder": "Greisin"
|
||||
}
|
||||
},
|
||||
"titles": {
|
||||
"male": {
|
||||
"noncivil": "Leibeigener",
|
||||
@@ -334,6 +317,9 @@
|
||||
"current": "Laufende Produktionen",
|
||||
"product": "Produkt",
|
||||
"remainingTime": "Verbleibende Zeit (Sekunden)",
|
||||
"status": "Status",
|
||||
"sleep": "Pausiert",
|
||||
"active": "Aktiv",
|
||||
"noProductions": "Keine laufenden Produktionen."
|
||||
},
|
||||
"columns": {
|
||||
@@ -605,6 +591,23 @@
|
||||
"time": "Zeit",
|
||||
"prev": "Zurück",
|
||||
"next": "Weiter",
|
||||
"graph": {
|
||||
"open": "Verlauf anzeigen",
|
||||
"title": "Geldentwicklung",
|
||||
"close": "Schließen",
|
||||
"loading": "Lade Verlauf...",
|
||||
"noData": "Für den gewählten Zeitraum liegen keine Buchungen vor.",
|
||||
"yesterday": "Gestern",
|
||||
"range": {
|
||||
"label": "Zeitraum",
|
||||
"today": "Heute",
|
||||
"24h": "Letzte 24 Stunden",
|
||||
"week": "Letzte Woche",
|
||||
"month": "Letzter Monat",
|
||||
"year": "Letztes Jahr",
|
||||
"all": "Gesamter Verlauf"
|
||||
}
|
||||
},
|
||||
"activities": {
|
||||
"Product sale": "Produkte verkauft",
|
||||
"Production cost": "Produktionskosten",
|
||||
@@ -675,6 +678,7 @@
|
||||
"happy": "Glücklich",
|
||||
"sad": "Traurig",
|
||||
"angry": "Wütend",
|
||||
"calm": "Ruhig",
|
||||
"nervous": "Nervös",
|
||||
"excited": "Aufgeregt",
|
||||
"bored": "Gelangweilt",
|
||||
@@ -765,17 +769,39 @@
|
||||
"advance": {
|
||||
"confirm": "Aufsteigen beantragen"
|
||||
},
|
||||
"cooldown": "Du kannst frühestens wieder am {date} aufsteigen.",
|
||||
"errors": {
|
||||
"tooSoon": "Aufstieg zu früh.",
|
||||
"unmet": "Folgende Voraussetzungen fehlen:",
|
||||
"generic": "Der Aufstieg ist fehlgeschlagen."
|
||||
}
|
||||
"cooldown": "Du kannst frühestens wieder am {date} aufsteigen."
|
||||
},
|
||||
"reputation": {
|
||||
"title": "Reputation",
|
||||
"overview": {
|
||||
"title": "Übersicht"
|
||||
"title": "Übersicht",
|
||||
"current": "Aktuelle Reputation"
|
||||
},
|
||||
"actions": {
|
||||
"title": "Reputations-Aktionen",
|
||||
"description": "Du kannst verschiedene Aktionen durchführen, um deine Reputation zu verbessern.",
|
||||
"none": "Keine Reputations-Aktionen verfügbar.",
|
||||
"action": "Aktion",
|
||||
"cost": "Kosten",
|
||||
"gain": "Gewinn",
|
||||
"timesUsed": "Verwendet",
|
||||
"execute": "Ausführen",
|
||||
"running": "Läuft...",
|
||||
"dailyLimit": "Tägliches Limit: {remaining} von {cap} Aktionen übrig",
|
||||
"cooldown": "Cooldown: Noch {minutes} Minuten",
|
||||
"type": {
|
||||
"soup_kitchen": "Suppenküche",
|
||||
"library_donation": "Bibliotheksspende",
|
||||
"scholarships": "Stipendien",
|
||||
"church_hospice": "Kirchenhospiz",
|
||||
"school_funding": "Schulfinanzierung",
|
||||
"orphanage_build": "Waisenhaus bauen",
|
||||
"bridge_build": "Brücke bauen",
|
||||
"hospital_donation": "Krankenhausspende",
|
||||
"patronage": "Mäzenatentum",
|
||||
"statue_build": "Statue errichten",
|
||||
"well_build": "Brunnen bauen"
|
||||
}
|
||||
},
|
||||
"party": {
|
||||
"title": "Feste",
|
||||
@@ -826,6 +852,53 @@
|
||||
},
|
||||
"church": {
|
||||
"title": "Kirche",
|
||||
"tabs": {
|
||||
"current": "Aktuelle Positionen",
|
||||
"available": "Verfügbare Positionen",
|
||||
"applications": "Bewerbungen"
|
||||
},
|
||||
"current": {
|
||||
"office": "Amt",
|
||||
"region": "Region",
|
||||
"holder": "Inhaber",
|
||||
"supervisor": "Vorgesetzter",
|
||||
"none": "Keine aktuellen Positionen vorhanden."
|
||||
},
|
||||
"available": {
|
||||
"office": "Amt",
|
||||
"region": "Region",
|
||||
"supervisor": "Vorgesetzter",
|
||||
"seats": "Verfügbare Plätze",
|
||||
"action": "Aktion",
|
||||
"apply": "Bewerben",
|
||||
"applySuccess": "Bewerbung erfolgreich eingereicht.",
|
||||
"applyError": "Fehler beim Einreichen der Bewerbung.",
|
||||
"none": "Keine verfügbaren Positionen."
|
||||
},
|
||||
"applications": {
|
||||
"office": "Amt",
|
||||
"region": "Region",
|
||||
"applicant": "Bewerber",
|
||||
"date": "Datum",
|
||||
"action": "Aktion",
|
||||
"approve": "Annehmen",
|
||||
"reject": "Ablehnen",
|
||||
"approveSuccess": "Bewerbung angenommen.",
|
||||
"rejectSuccess": "Bewerbung abgelehnt.",
|
||||
"decideError": "Fehler bei der Entscheidung.",
|
||||
"none": "Keine Bewerbungen vorhanden."
|
||||
},
|
||||
"offices": {
|
||||
"lay-preacher": "Laienprediger",
|
||||
"village-priest": "Dorfgeistlicher",
|
||||
"parish-priest": "Pfarrer",
|
||||
"dean": "Dekan",
|
||||
"archdeacon": "Erzdiakon",
|
||||
"bishop": "Bischof",
|
||||
"archbishop": "Erzbischof",
|
||||
"cardinal": "Kardinal",
|
||||
"pope": "Papst"
|
||||
},
|
||||
"baptism": {
|
||||
"title": "Taufen",
|
||||
"table": {
|
||||
@@ -927,7 +1000,12 @@
|
||||
"drunkOfLife": "Trunk des Lebens",
|
||||
"barber": "Barbier"
|
||||
},
|
||||
"choose": "Bitte auswählen"
|
||||
"choose": "Bitte auswählen",
|
||||
"errors": {
|
||||
"tooClose": "Du kannst nicht so oft Maßnahmen durchführen.",
|
||||
"generic": "Ein Fehler ist aufgetreten."
|
||||
},
|
||||
"nextMeasureAt": "Nächste Maßnahme ab"
|
||||
},
|
||||
"politics": {
|
||||
"title": "Politik",
|
||||
@@ -951,9 +1029,13 @@
|
||||
"region": "Region",
|
||||
"date": "Datum",
|
||||
"candidacy": "Kandidatur",
|
||||
"candidacyWithAge": "Kandidatur (ab 16 Jahren)",
|
||||
"none": "Keine offenen Positionen.",
|
||||
"apply": "Für ausgewählte Positionen kandidieren"
|
||||
"apply": "Für ausgewählte Positionen kandidieren",
|
||||
"minAgeHint": "Kandidatur erst ab 16 Jahren möglich.",
|
||||
"ageRequirement": "Für alle politischen Ämter gilt: Kandidatur erst ab 16 Jahren."
|
||||
},
|
||||
"too_young": "Dein Charakter ist noch zu jung. Eine Bewerbung ist erst ab 16 Jahren möglich.",
|
||||
"upcoming": {
|
||||
"office": "Amt",
|
||||
"region": "Region",
|
||||
|
||||
@@ -94,29 +94,24 @@
|
||||
"children_unbaptised": "Unbaptised children"
|
||||
},
|
||||
"overview": {
|
||||
"metadata": {
|
||||
"years": "years"
|
||||
}
|
||||
},
|
||||
"genderAge": {
|
||||
"ageGroups": "infant:2|toddler:5|child:13|maidenhood:20|adult:50|mature:70|elder:999",
|
||||
"male": {
|
||||
"infant": "babe",
|
||||
"toddler": "wee one",
|
||||
"child": "lad",
|
||||
"maidenhood": "youth",
|
||||
"adult": "man",
|
||||
"mature": "goodman",
|
||||
"elder": "old fellow"
|
||||
"title": "Falukant - Overview",
|
||||
"heirSelection": {
|
||||
"title": "Heir Selection",
|
||||
"description": "Your previous character is no longer available. Choose an heir from the list to continue playing.",
|
||||
"loading": "Loading potential heirs…",
|
||||
"noHeirs": "No heirs available.",
|
||||
"select": "Select as play character",
|
||||
"error": "Error selecting heir."
|
||||
},
|
||||
"female": {
|
||||
"infant": "babe",
|
||||
"toddler": "wee one",
|
||||
"child": "lass",
|
||||
"maidenhood": "maiden",
|
||||
"adult": "woman",
|
||||
"mature": "goodwife",
|
||||
"elder": "old dame"
|
||||
"metadata": {
|
||||
"title": "Personal",
|
||||
"name": "Name",
|
||||
"money": "Wealth",
|
||||
"age": "Age",
|
||||
"years": "Years",
|
||||
"days": "Days",
|
||||
"mainbranch": "Home city",
|
||||
"nobleTitle": "Title"
|
||||
}
|
||||
},
|
||||
"health": {
|
||||
@@ -137,6 +132,23 @@
|
||||
"time": "Time",
|
||||
"prev": "Previous",
|
||||
"next": "Next",
|
||||
"graph": {
|
||||
"open": "Show graph",
|
||||
"title": "Money over time",
|
||||
"close": "Close",
|
||||
"loading": "Loading history...",
|
||||
"noData": "No entries for the selected period.",
|
||||
"yesterday": "Yesterday",
|
||||
"range": {
|
||||
"label": "Range",
|
||||
"today": "Today",
|
||||
"24h": "Last 24 hours",
|
||||
"week": "Last week",
|
||||
"month": "Last month",
|
||||
"year": "Last year",
|
||||
"all": "All history"
|
||||
}
|
||||
},
|
||||
"activities": {
|
||||
"Product sale": "Product sale",
|
||||
"Production cost": "Production cost",
|
||||
@@ -191,6 +203,29 @@
|
||||
"income": "Income",
|
||||
"incomeUpdated": "Salary has been successfully updated."
|
||||
},
|
||||
"production": {
|
||||
"title": "Production",
|
||||
"info": "Details about production in the branch.",
|
||||
"selectProduct": "Select product",
|
||||
"quantity": "Quantity",
|
||||
"storageAvailable": "Free storage",
|
||||
"cost": "Cost",
|
||||
"duration": "Duration",
|
||||
"revenue": "Revenue",
|
||||
"start": "Start production",
|
||||
"success": "Production started successfully!",
|
||||
"error": "Error starting production.",
|
||||
"minutes": "Minutes",
|
||||
"ending": "Ending:",
|
||||
"time": "Time",
|
||||
"current": "Running productions",
|
||||
"product": "Product",
|
||||
"remainingTime": "Remaining time (seconds)",
|
||||
"status": "Status",
|
||||
"sleep": "Paused",
|
||||
"active": "Active",
|
||||
"noProductions": "No running productions."
|
||||
},
|
||||
"vehicles": {
|
||||
"cargo_cart": "Cargo cart",
|
||||
"ox_cart": "Ox cart",
|
||||
@@ -222,13 +257,87 @@
|
||||
}
|
||||
},
|
||||
"nobility": {
|
||||
"cooldown": "You can only advance again on {date}.",
|
||||
"cooldown": "You can only advance again on {date}."
|
||||
},
|
||||
"mood": {
|
||||
"happy": "Happy",
|
||||
"sad": "Sad",
|
||||
"angry": "Angry",
|
||||
"calm": "Calm",
|
||||
"nervous": "Nervous",
|
||||
"excited": "Excited",
|
||||
"bored": "Bored",
|
||||
"fearful": "Fearful",
|
||||
"confident": "Confident",
|
||||
"curious": "Curious",
|
||||
"hopeful": "Hopeful",
|
||||
"frustrated": "Frustrated",
|
||||
"lonely": "Lonely",
|
||||
"grateful": "Grateful",
|
||||
"jealous": "Jealous",
|
||||
"guilty": "Guilty",
|
||||
"apathetic": "Apathetic",
|
||||
"relieved": "Relieved",
|
||||
"proud": "Proud",
|
||||
"ashamed": "Ashamed"
|
||||
},
|
||||
"character": {
|
||||
"brave": "Brave",
|
||||
"kind": "Kind",
|
||||
"greedy": "Greedy",
|
||||
"wise": "Wise",
|
||||
"loyal": "Loyal",
|
||||
"cunning": "Cunning",
|
||||
"generous": "Generous",
|
||||
"arrogant": "Arrogant",
|
||||
"honest": "Honest",
|
||||
"ambitious": "Ambitious",
|
||||
"patient": "Patient",
|
||||
"impatient": "Impatient",
|
||||
"selfish": "Selfish",
|
||||
"charismatic": "Charismatic",
|
||||
"empathetic": "Empathetic",
|
||||
"timid": "Timid",
|
||||
"stubborn": "Stubborn",
|
||||
"resourceful": "Resourceful",
|
||||
"reckless": "Reckless",
|
||||
"disciplined": "Disciplined",
|
||||
"optimistic": "Optimistic",
|
||||
"pessimistic": "Pessimistic",
|
||||
"manipulative": "Manipulative",
|
||||
"independent": "Independent",
|
||||
"dependent": "Dependent",
|
||||
"adventurous": "Adventurous",
|
||||
"humble": "Humble",
|
||||
"vengeful": "Vengeful",
|
||||
"pragmatic": "Pragmatic",
|
||||
"idealistic": "Idealistic"
|
||||
},
|
||||
"healthview": {
|
||||
"title": "Health",
|
||||
"age": "Age",
|
||||
"status": "Health Status",
|
||||
"measuresTaken": "Measures Taken",
|
||||
"measure": "Measure",
|
||||
"date": "Date",
|
||||
"cost": "Cost",
|
||||
"success": "Success",
|
||||
"selectMeasure": "Select Measure",
|
||||
"perform": "Perform",
|
||||
"measures": {
|
||||
"pill": "Pill",
|
||||
"doctor": "Doctor Visit",
|
||||
"witch": "Witch",
|
||||
"drunkOfLife": "Elixir of Life",
|
||||
"barber": "Barber"
|
||||
},
|
||||
"choose": "Please select",
|
||||
"errors": {
|
||||
"tooSoon": "Advancement too soon.",
|
||||
"unmet": "The following requirements are not met:",
|
||||
"generic": "Advancement failed."
|
||||
}
|
||||
},
|
||||
"tooClose": "You cannot perform measures so often.",
|
||||
"generic": "An error occurred."
|
||||
},
|
||||
"nextMeasureAt": "Next measure from"
|
||||
},
|
||||
"branchProduction": {
|
||||
"storageAvailable": "Free storage"
|
||||
},
|
||||
@@ -254,9 +363,13 @@
|
||||
"region": "Region",
|
||||
"date": "Date",
|
||||
"candidacy": "Candidacy",
|
||||
"candidacyWithAge": "Candidacy (from age 16)",
|
||||
"none": "No open positions.",
|
||||
"apply": "Apply for selected positions"
|
||||
"apply": "Apply for selected positions",
|
||||
"minAgeHint": "Candidacy is only possible from age 16.",
|
||||
"ageRequirement": "All political offices require candidates to be at least 16 years old."
|
||||
},
|
||||
"too_young": "Your character is too young. Applications are only possible from age 16.",
|
||||
"upcoming": {
|
||||
"office": "Office",
|
||||
"region": "Region",
|
||||
@@ -353,6 +466,143 @@
|
||||
"success": "The gift has been given.",
|
||||
"nextGiftAt": "Next gift from"
|
||||
}
|
||||
},
|
||||
"church": {
|
||||
"title": "Church",
|
||||
"tabs": {
|
||||
"current": "Current Positions",
|
||||
"available": "Available Positions",
|
||||
"applications": "Applications"
|
||||
},
|
||||
"current": {
|
||||
"office": "Office",
|
||||
"region": "Region",
|
||||
"holder": "Holder",
|
||||
"supervisor": "Supervisor",
|
||||
"none": "No current positions available."
|
||||
},
|
||||
"available": {
|
||||
"office": "Office",
|
||||
"region": "Region",
|
||||
"supervisor": "Supervisor",
|
||||
"seats": "Available Seats",
|
||||
"action": "Action",
|
||||
"apply": "Apply",
|
||||
"applySuccess": "Application submitted successfully.",
|
||||
"applyError": "Error submitting application.",
|
||||
"none": "No available positions."
|
||||
},
|
||||
"applications": {
|
||||
"office": "Office",
|
||||
"region": "Region",
|
||||
"applicant": "Applicant",
|
||||
"date": "Date",
|
||||
"action": "Action",
|
||||
"approve": "Approve",
|
||||
"reject": "Reject",
|
||||
"approveSuccess": "Application approved.",
|
||||
"rejectSuccess": "Application rejected.",
|
||||
"decideError": "Error making decision.",
|
||||
"none": "No applications available."
|
||||
},
|
||||
"offices": {
|
||||
"lay-preacher": "Lay Preacher",
|
||||
"village-priest": "Village Priest",
|
||||
"parish-priest": "Parish Priest",
|
||||
"dean": "Dean",
|
||||
"archdeacon": "Archdeacon",
|
||||
"bishop": "Bishop",
|
||||
"archbishop": "Archbishop",
|
||||
"cardinal": "Cardinal",
|
||||
"pope": "Pope"
|
||||
},
|
||||
"baptism": {
|
||||
"title": "Baptism",
|
||||
"table": {
|
||||
"name": "First Name",
|
||||
"gender": "Gender",
|
||||
"age": "Age",
|
||||
"baptise": "Baptize (50)",
|
||||
"newName": "Suggest Name"
|
||||
},
|
||||
"gender": {
|
||||
"male": "Boy",
|
||||
"female": "Girl"
|
||||
},
|
||||
"success": "The child has been baptized.",
|
||||
"error": "The child could not be baptized."
|
||||
}
|
||||
},
|
||||
"reputation": {
|
||||
"title": "Reputation",
|
||||
"overview": {
|
||||
"title": "Overview",
|
||||
"current": "Current Reputation"
|
||||
},
|
||||
"actions": {
|
||||
"title": "Reputation Actions",
|
||||
"description": "You can perform various actions to improve your reputation.",
|
||||
"none": "No reputation actions available.",
|
||||
"action": "Action",
|
||||
"cost": "Cost",
|
||||
"gain": "Gain",
|
||||
"timesUsed": "Used",
|
||||
"execute": "Execute",
|
||||
"running": "Running...",
|
||||
"dailyLimit": "Daily limit: {remaining} of {cap} actions remaining",
|
||||
"cooldown": "Cooldown: {minutes} minutes remaining",
|
||||
"type": {
|
||||
"soup_kitchen": "Soup Kitchen",
|
||||
"library_donation": "Library Donation",
|
||||
"scholarships": "Scholarships",
|
||||
"church_hospice": "Church Hospice",
|
||||
"school_funding": "School Funding",
|
||||
"orphanage_build": "Build Orphanage",
|
||||
"bridge_build": "Build Bridge",
|
||||
"hospital_donation": "Hospital Donation",
|
||||
"patronage": "Patronage",
|
||||
"statue_build": "Build Statue",
|
||||
"well_build": "Build Well"
|
||||
}
|
||||
},
|
||||
"party": {
|
||||
"title": "Parties",
|
||||
"totalCost": "Total Cost",
|
||||
"order": "Order Party",
|
||||
"inProgress": "Parties in Preparation",
|
||||
"completed": "Completed Parties",
|
||||
"newpartyview": {
|
||||
"open": "Create New Party",
|
||||
"close": "Hide New Party",
|
||||
"type": "Party Type"
|
||||
},
|
||||
"music": {
|
||||
"label": "Music",
|
||||
"none": "No Music",
|
||||
"bard": "A Bard",
|
||||
"villageBand": "A Village Band",
|
||||
"chamberOrchestra": "A Chamber Orchestra",
|
||||
"symphonyOrchestra": "A Symphony Orchestra",
|
||||
"symphonyOrchestraWithChorusAndSolists": "A Symphony Orchestra with Chorus and Soloists"
|
||||
},
|
||||
"banquette": {
|
||||
"label": "Food",
|
||||
"bread": "Bread",
|
||||
"roastWithBeer": "Roast with Beer",
|
||||
"poultryWithVegetablesAndWine": "Poultry with Vegetables and Wine",
|
||||
"extensiveBuffet": "Festive Meal"
|
||||
},
|
||||
"servants": {
|
||||
"label": "One servant per ",
|
||||
"perPersons": " persons"
|
||||
},
|
||||
"esteemedInvites": {
|
||||
"label": "Invited Estates"
|
||||
},
|
||||
"type": "Party Type",
|
||||
"cost": "Cost",
|
||||
"date": "Date"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
frontend/src/i18n/locales/es/activate.json
Normal file
9
frontend/src/i18n/locales/es/activate.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"activate": {
|
||||
"title": "Activar",
|
||||
"message": "Hola {username}. Introduce aquí el código que te hemos enviado por correo electrónico.",
|
||||
"token": "Token:",
|
||||
"submit": "Enviar",
|
||||
"failure": "La activación no se ha realizado correctamente."
|
||||
}
|
||||
}
|
||||
349
frontend/src/i18n/locales/es/admin.json
Normal file
349
frontend/src/i18n/locales/es/admin.json
Normal file
@@ -0,0 +1,349 @@
|
||||
{
|
||||
"admin": {
|
||||
"interests": {
|
||||
"title": "[Admin] - Interessen verwalten",
|
||||
"newinterests": {
|
||||
"name": "Name des Interesses",
|
||||
"status": "Freigegeben",
|
||||
"adultonly": "Nur für Erwachsene",
|
||||
"translations": "Übersetzungen",
|
||||
"isactive": "Aktiviert",
|
||||
"isadult": "Nur für Erwachsene",
|
||||
"delete": "Löschen"
|
||||
}
|
||||
},
|
||||
"contacts": {
|
||||
"title": "[Admin] - Kontaktanfragen",
|
||||
"date": "Datum",
|
||||
"from": "Absender",
|
||||
"actions": "Aktionen",
|
||||
"open": "Bearbeiten",
|
||||
"finished": "Abschließen"
|
||||
},
|
||||
"editcontactrequest": {
|
||||
"title": "[Admin] - Kontaktanfrage bearbeiten"
|
||||
},
|
||||
"user": {
|
||||
"name": "Benutzername",
|
||||
"active": "Aktiv",
|
||||
"blocked": "Gesperrt",
|
||||
"actions": "Aktionen",
|
||||
"search": "Suchen"
|
||||
},
|
||||
"rights": {
|
||||
"add": "Recht hinzufügen",
|
||||
"select": "Bitte wählen",
|
||||
"current": "Aktuelle Rechte"
|
||||
},
|
||||
"forum": {
|
||||
"title": "[Admin] - Forum",
|
||||
"currentForums": "Existierende Foren",
|
||||
"edit": "Ändern",
|
||||
"delete": "Löschen",
|
||||
"createForum": "Anlegen",
|
||||
"forumName": "Titel",
|
||||
"create": "Anlegen",
|
||||
"permissions": {
|
||||
"label": "Berechtigungen",
|
||||
"all": "Jeder",
|
||||
"admin": "Nur Admins",
|
||||
"teammember": "Nur Teammitglieder",
|
||||
"user": "Nur bestimmte Benutzer",
|
||||
"age": "Nur ab Alter 14"
|
||||
},
|
||||
"selectPermissions": "Bitte auswählen",
|
||||
"confirmDeleteMessage": "Soll das Forum wirklich gelöscht werden?",
|
||||
"confirmDeleteTitle": "Forum löschen"
|
||||
},
|
||||
"falukant": {
|
||||
"edituser": {
|
||||
"title": "Falukant Benutzer bearbeiten",
|
||||
"username": "Benutzername",
|
||||
"characterName": "Charaktername",
|
||||
"user": "Benutzer",
|
||||
"success": "Die Änderungen wurden gespeichert.",
|
||||
"error": "Die Änderungen konnten nicht gespeichert werden.",
|
||||
"errorLoadingBranches": "Fehler beim Laden der Niederlassungen.",
|
||||
"errorUpdatingStock": "Fehler beim Aktualisieren des Lagers.",
|
||||
"stockUpdated": "Lager erfolgreich aktualisiert.",
|
||||
"search": "Suchen",
|
||||
"tabs": {
|
||||
"userdata": "Benutzerdaten",
|
||||
"branches": "Niederlassungen"
|
||||
},
|
||||
"branches": {
|
||||
"title": "Niederlassungen & Lager",
|
||||
"noStocks": "Kein Lager vorhanden",
|
||||
"noBranches": "Keine Niederlassungen gefunden",
|
||||
"addStock": "Lager hinzufügen",
|
||||
"stockType": "Lagertyp",
|
||||
"selectStockType": "Lagertyp auswählen",
|
||||
"quantity": "Menge",
|
||||
"allStocksAdded": "Alle verfügbaren Lagertypen sind bereits vorhanden"
|
||||
},
|
||||
"errorLoadingStockTypes": "Fehler beim Laden der Lagertypen.",
|
||||
"errorAddingStock": "Fehler beim Hinzufügen des Lagers.",
|
||||
"stockAdded": "Lager erfolgreich hinzugefügt.",
|
||||
"invalidStockData": "Bitte gültige Lagertyp- und Mengenangaben eingeben."
|
||||
},
|
||||
"map": {
|
||||
"title": "Falukant Karten-Editor (Regionen)",
|
||||
"description": "Zeichne Rechtecke auf der Falukant-Karte und weise sie Städten zu.",
|
||||
"tabs": {
|
||||
"regions": "Positionen",
|
||||
"distances": "Entfernungen"
|
||||
},
|
||||
"regionList": "Städte",
|
||||
"noCoords": "Keine Koordinaten gesetzt",
|
||||
"currentRect": "Aktuelles Rechteck",
|
||||
"hintDraw": "Wähle eine Stadt und ziehe mit der Maus ein Rechteck auf der Karte, um die Position festzulegen.",
|
||||
"saveAll": "Alle geänderten Städte speichern",
|
||||
"connectionsTitle": "Verbindungen (region_distance)",
|
||||
"source": "Von",
|
||||
"target": "Nach",
|
||||
"selectSource": "Quellstadt wählen",
|
||||
"selectTarget": "Zielstadt wählen",
|
||||
"mode": "Transportart",
|
||||
"modeLand": "Land",
|
||||
"modeWater": "Wasser",
|
||||
"modeAir": "Luft",
|
||||
"distance": "Entfernung",
|
||||
"saveConnection": "Verbindung speichern",
|
||||
"pickOnMap": "Auf Karte wählen",
|
||||
"errorSaveConnection": "Die Verbindung konnte nicht gespeichert werden.",
|
||||
"errorDeleteConnection": "Die Verbindung konnte nicht gelöscht werden.",
|
||||
"confirmDeleteConnection": "Verbindung wirklich löschen?"
|
||||
},
|
||||
"createNPC": {
|
||||
"title": "NPCs erstellen",
|
||||
"region": "Stadt",
|
||||
"allRegions": "Alle Städte",
|
||||
"ageRange": "Altersbereich",
|
||||
"to": "bis",
|
||||
"years": "Jahre",
|
||||
"titleRange": "Titel-Bereich",
|
||||
"count": "Anzahl pro Stadt-Titel-Kombination",
|
||||
"countHelp": "Diese Anzahl wird für jede Kombination aus gewählter Stadt und Titel erstellt.",
|
||||
"create": "NPCs erstellen",
|
||||
"creating": "Erstelle...",
|
||||
"result": "Ergebnis",
|
||||
"createdCount": "{count} NPCs wurden erstellt.",
|
||||
"combinationInfo": "{perCombination} NPCs pro Kombination × {combinations} Kombinationen = {count} NPCs insgesamt",
|
||||
"age": "Alter",
|
||||
"errorLoadingRegions": "Fehler beim Laden der Städte.",
|
||||
"errorLoadingTitles": "Fehler beim Laden der Titel.",
|
||||
"errorCreating": "Fehler beim Erstellen der NPCs.",
|
||||
"invalidAgeRange": "Ungültiger Altersbereich.",
|
||||
"invalidTitleRange": "Ungültiger Titel-Bereich.",
|
||||
"invalidCount": "Ungültige Anzahl (1-500).",
|
||||
"progress": "Fortschritt",
|
||||
"progressDetails": "{current} von {total} NPCs erstellt",
|
||||
"timeRemainingSeconds": "Verbleibende Zeit: {seconds} Sekunden",
|
||||
"timeRemainingMinutes": "Verbleibende Zeit: {minutes} Minuten {seconds} Sekunden",
|
||||
"almostDone": "Fast fertig...",
|
||||
"jobNotFound": "Job nicht gefunden oder abgelaufen."
|
||||
}
|
||||
},
|
||||
"chatrooms": {
|
||||
"title": "[Admin] - Chaträume verwalten",
|
||||
"roomName": "Raumname",
|
||||
"create": "Chatraum anlegen",
|
||||
"edit": "Chatraum bearbeiten",
|
||||
"type": "Typ",
|
||||
"isPublic": "Öffentlich sichtbar",
|
||||
"actions": "Aktionen",
|
||||
"genderRestriction": {
|
||||
"show": "Geschlechtsbeschränkung aktivieren",
|
||||
"label": "Geschlechtsbeschränkung"
|
||||
},
|
||||
"minAge": {
|
||||
"show": "Mindestalter angeben",
|
||||
"label": "Mindestalter"
|
||||
},
|
||||
"maxAge": {
|
||||
"show": "Höchstalter angeben",
|
||||
"label": "Höchstalter"
|
||||
},
|
||||
"password": {
|
||||
"show": "Passwortschutz aktivieren",
|
||||
"label": "Passwort"
|
||||
},
|
||||
"friendsOfOwnerOnly": "Nur Freunde des Besitzers",
|
||||
"requiredUserRight": {
|
||||
"show": "Benötigtes Benutzerrecht angeben",
|
||||
"label": "Benötigtes Benutzerrecht"
|
||||
},
|
||||
"roomtype": {
|
||||
"chat": "Reden",
|
||||
"dice": "Würfeln",
|
||||
"poker": "Poker",
|
||||
"hangman": "Hangman"
|
||||
},
|
||||
"rights": {
|
||||
"talk": "Reden",
|
||||
"scream": "Schreien",
|
||||
"whisper": "Flüstern",
|
||||
"start game": "Spiel starten",
|
||||
"open room": "Raum öffnen",
|
||||
"systemmessage": "Systemnachricht"
|
||||
},
|
||||
"confirmDelete": "Soll dieser Chatraum wirklich gelöscht werden?"
|
||||
},
|
||||
"match3": {
|
||||
"title": "Match3 Level verwalten",
|
||||
"newLevel": "Neues Level erstellen",
|
||||
"editLevel": "Level bearbeiten",
|
||||
"deleteLevel": "Level löschen",
|
||||
"confirmDelete": "Möchtest du dieses Level wirklich löschen?",
|
||||
"levelName": "Name",
|
||||
"levelDescription": "Beschreibung",
|
||||
"boardWidth": "Breite",
|
||||
"boardHeight": "Höhe",
|
||||
"moveLimit": "Zug-Limit",
|
||||
"levelOrder": "Reihenfolge",
|
||||
"boardLayout": "Board-Layout",
|
||||
"tileTypes": "Verfügbare Tile-Typen",
|
||||
"actions": "Aktionen",
|
||||
"edit": "Bearbeiten",
|
||||
"delete": "Löschen",
|
||||
"save": "Speichern",
|
||||
"cancel": "Abbrechen",
|
||||
"update": "Aktualisieren",
|
||||
"create": "Erstellen",
|
||||
"boardControls": {
|
||||
"fillAll": "Alle aktivieren",
|
||||
"clearAll": "Alle deaktivieren",
|
||||
"invert": "Invertieren"
|
||||
},
|
||||
"loading": "Lade Level...",
|
||||
"retry": "Erneut versuchen",
|
||||
"availableLevels": "Verfügbare Level: {count}",
|
||||
"levelFormat": "Level {number}: {name}",
|
||||
"levelObjectives": "Level-Objekte",
|
||||
"objectivesTitle": "Siegvoraussetzungen",
|
||||
"addObjective": "Objektiv hinzufügen",
|
||||
"removeObjective": "Entfernen",
|
||||
"objectiveType": "Typ",
|
||||
"objectiveTypeScore": "Punkte sammeln",
|
||||
"objectiveTypeMatches": "Matches machen",
|
||||
"objectiveTypeMoves": "Züge verwenden",
|
||||
"objectiveTypeTime": "Zeit einhalten",
|
||||
"objectiveTypeSpecial": "Spezialziel",
|
||||
"objectiveOperator": "Operator",
|
||||
"operatorGreaterEqual": "Größer oder gleich (≥)",
|
||||
"operatorLessEqual": "Kleiner oder gleich (≤)",
|
||||
"operatorEqual": "Gleich (=)",
|
||||
"operatorGreater": "Größer als (>)",
|
||||
"operatorLess": "Kleiner als (<)",
|
||||
"objectiveTarget": "Zielwert",
|
||||
"objectiveTargetPlaceholder": "z.B. 100",
|
||||
"objectiveOrder": "Reihenfolge",
|
||||
"objectiveOrderPlaceholder": "1, 2, 3...",
|
||||
"objectiveDescription": "Beschreibung",
|
||||
"objectiveDescriptionPlaceholder": "z.B. Sammle 100 Punkte",
|
||||
"objectiveRequired": "Erforderlich für Level-Abschluss",
|
||||
"noObjectives": "Keine Siegvoraussetzungen definiert. Klicke auf 'Objektiv hinzufügen' um welche zu erstellen."
|
||||
},
|
||||
"userStatistics": {
|
||||
"title": "[Admin] - Benutzerstatistiken",
|
||||
"totalUsers": "Gesamtanzahl Benutzer",
|
||||
"genderDistribution": "Geschlechterverteilung",
|
||||
"ageDistribution": "Altersverteilung"
|
||||
},
|
||||
"taxiTools": {
|
||||
"title": "Taxi-Tools",
|
||||
"description": "Verwalte Taxi-Maps, Level und Konfigurationen",
|
||||
"mapEditor": {
|
||||
"title": "Map bearbeiten",
|
||||
"availableMaps": "Verfügbare Maps: {count}",
|
||||
"newMap": "Neue Map erstellen",
|
||||
"mapFormat": "{name} (Position: {x},{y})",
|
||||
"mapName": "Map-Name",
|
||||
"mapDescription": "Beschreibung",
|
||||
"mapWidth": "Breite",
|
||||
"mapHeight": "Höhe",
|
||||
"tileSize": "Tile-Größe",
|
||||
"positionX": "X-Position",
|
||||
"positionY": "Y-Position",
|
||||
"mapType": "Map-Typ",
|
||||
"mapLayout": "Map-Layout",
|
||||
"tilePalette": "Tile-Palette",
|
||||
"streetNames": "Straßennamen",
|
||||
"extraElements": "Zusätzliche Elemente",
|
||||
"streetNameHorizontal": "Straßenname (horizontal)",
|
||||
"streetNameVertical": "Straßenname (vertikal)",
|
||||
"continueHorizontal": "In anderer Richtung fortführen (→)",
|
||||
"continueVertical": "In anderer Richtung fortführen (↓)",
|
||||
"continueOther": "In anderer Richtung fortführen",
|
||||
"position": "Position",
|
||||
"fillAllRoads": "Alle Straßen",
|
||||
"clearAll": "Alle löschen",
|
||||
"generateRandom": "Zufällig generieren",
|
||||
"delete": "Löschen",
|
||||
"update": "Aktualisieren",
|
||||
"cancel": "Abbrechen",
|
||||
"create": "Erstellen",
|
||||
"createSuccess": "Map wurde erfolgreich erstellt!",
|
||||
"updateSuccess": "Map wurde erfolgreich aktualisiert!",
|
||||
"deleteSuccess": "Map wurde erfolgreich gelöscht!"
|
||||
}
|
||||
},
|
||||
"servicesStatus": {
|
||||
"title": "Service-Status",
|
||||
"description": "Überwache den Status von Backend, Chat und Daemon",
|
||||
"status": {
|
||||
"connected": "Verbunden",
|
||||
"connecting": "Verbinde...",
|
||||
"disconnected": "Nicht verbunden",
|
||||
"error": "Fehler",
|
||||
"unknown": "Unbekannt"
|
||||
},
|
||||
"backend": {
|
||||
"title": "Backend",
|
||||
"connected": "Backend-Service ist erreichbar und verbunden"
|
||||
},
|
||||
"chat": {
|
||||
"title": "Chat",
|
||||
"connected": "Chat-Service ist erreichbar und verbunden"
|
||||
},
|
||||
"daemon": {
|
||||
"title": "Daemon",
|
||||
"connected": "Daemon-Service ist erreichbar und verbunden",
|
||||
"connections": {
|
||||
"title": "Aktive Verbindungen",
|
||||
"none": "Keine aktiven Verbindungen",
|
||||
"userId": "Benutzer-ID",
|
||||
"username": "Benutzername",
|
||||
"connections": "Verbindungen",
|
||||
"duration": "Verbindungsdauer",
|
||||
"lastPong": "Zeit seit letztem Pong",
|
||||
"pingTimeouts": "Ping-Timeouts",
|
||||
"pongReceived": "Pong empfangen",
|
||||
"yes": "Ja",
|
||||
"no": "Nein",
|
||||
"notConnected": "Daemon nicht verbunden",
|
||||
"sendError": "Fehler beim Senden der Anfrage",
|
||||
"error": "Fehler beim Abrufen der Verbindungen"
|
||||
},
|
||||
"websocketLog": {
|
||||
"title": "WebSocket-Log",
|
||||
"showLog": "WebSocket-Log anzeigen",
|
||||
"refresh": "Aktualisieren",
|
||||
"loading": "Lädt...",
|
||||
"close": "Schließen",
|
||||
"entryCount": "{count} Einträge",
|
||||
"noEntries": "Keine Log-Einträge vorhanden",
|
||||
"notConnected": "Daemon nicht verbunden",
|
||||
"sendError": "Fehler beim Senden der Anfrage",
|
||||
"parseError": "Fehler beim Verarbeiten der Antwort",
|
||||
"timestamp": "Zeitstempel",
|
||||
"direction": "Richtung",
|
||||
"peer": "Peer",
|
||||
"connUser": "Verbindungs-User",
|
||||
"targetUser": "Ziel-User",
|
||||
"event": "Event"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
frontend/src/i18n/locales/es/blog.json
Normal file
11
frontend/src/i18n/locales/es/blog.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"blog": {
|
||||
"posts": "Publicaciones",
|
||||
"noPosts": "No hay publicaciones.",
|
||||
"newPost": "Escribir nueva publicación",
|
||||
"title": "Blog",
|
||||
"publish": "Publicar",
|
||||
"pickImage": "Seleccionar imagen",
|
||||
"uploadImage": "Subir imagen"
|
||||
}
|
||||
}
|
||||
71
frontend/src/i18n/locales/es/chat.json
Normal file
71
frontend/src/i18n/locales/es/chat.json
Normal file
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"chat": {
|
||||
"multichat": {
|
||||
"title": "Multi-Chat",
|
||||
"autoscroll": "Desplazamiento automático",
|
||||
"options": "Opciones",
|
||||
"send": "Enviar",
|
||||
"shout": "Gritar",
|
||||
"action": "Acción",
|
||||
"roll": "Tirar dados",
|
||||
"colorpicker": "Elegir color",
|
||||
"colorpicker_preview": "Vista previa: Este mensaje usa el color elegido.",
|
||||
"hex": "HEX",
|
||||
"invalid_hex": "Valor HEX no válido",
|
||||
"hue": "Tono",
|
||||
"saturation": "Saturación",
|
||||
"lightness": "Luminosidad",
|
||||
"ok": "Ok",
|
||||
"cancel": "Cancelar",
|
||||
"placeholder": "Escribe un mensaje...",
|
||||
"action_select_user": "Selecciona un usuario",
|
||||
"action_to": "Acción a {to}",
|
||||
"action_phrases": {
|
||||
"left_room": "cambia a la sala",
|
||||
"leaves_room": "sale de la sala",
|
||||
"left_chat": "ha salido del chat."
|
||||
},
|
||||
"system": {
|
||||
"room_entered": "Has entrado en la sala \"{room}\".",
|
||||
"user_entered_room": "{user} ha entrado en la sala.",
|
||||
"user_left_room": "{user} ha salido de la sala.",
|
||||
"color_changed_self": "Has cambiado tu color a {color}.",
|
||||
"color_changed_user": "{user} ha cambiado su color a {color}."
|
||||
},
|
||||
"status": {
|
||||
"connecting": "Conectando…",
|
||||
"connected": "Conectado",
|
||||
"disconnected": "Desconectado",
|
||||
"error": "Error de conexión"
|
||||
}
|
||||
},
|
||||
"randomchat": {
|
||||
"title": "Chat aleatorio",
|
||||
"age": "Edad",
|
||||
"gender": {
|
||||
"title": "Tu género",
|
||||
"male": "Masculino",
|
||||
"female": "Femenino"
|
||||
},
|
||||
"start": "Empezar",
|
||||
"agerange": "Edad",
|
||||
"gendersearch": "Géneros",
|
||||
"camonly": "Solo con cámara",
|
||||
"showcam": "Mostrar mi cámara",
|
||||
"addfriend": "Añadir a amigos",
|
||||
"close": "Terminar chat",
|
||||
"autosearch": "Buscar automáticamente",
|
||||
"input": "Tu texto",
|
||||
"waitingForMatch": "Esperando a un participante...",
|
||||
"chatpartner": "Ahora estás chateando con una persona <gender> de <age> años.",
|
||||
"partnergenderm": "masculina",
|
||||
"partnergenderf": "femenina",
|
||||
"self": "Tú",
|
||||
"partner": "Partner",
|
||||
"jumptonext": "Finalizar este chat",
|
||||
"userleftchat": "La otra persona ha salido del chat.",
|
||||
"startsearch": "Buscar la siguiente charla",
|
||||
"selfstopped": "Has salido de la conversación."
|
||||
}
|
||||
}
|
||||
}
|
||||
7
frontend/src/i18n/locales/es/error.json
Normal file
7
frontend/src/i18n/locales/es/error.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"error": {
|
||||
"title": "Error",
|
||||
"close": "Cerrar",
|
||||
"credentialsinvalid": "Las credenciales no son correctas."
|
||||
}
|
||||
}
|
||||
1041
frontend/src/i18n/locales/es/falukant.json
Normal file
1041
frontend/src/i18n/locales/es/falukant.json
Normal file
File diff suppressed because it is too large
Load Diff
23
frontend/src/i18n/locales/es/friends.json
Normal file
23
frontend/src/i18n/locales/es/friends.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"friends": {
|
||||
"title": "Amigos",
|
||||
"tabs": {
|
||||
"existing": "Actuales",
|
||||
"rejected": "Rechazadas",
|
||||
"pending": "Pendientes",
|
||||
"requested": "Solicitadas"
|
||||
},
|
||||
"actions": {
|
||||
"end": "Finalizar",
|
||||
"accept": "Aceptar",
|
||||
"reject": "Rechazar",
|
||||
"withdraw": "Retirar"
|
||||
},
|
||||
"headers": {
|
||||
"name": "Nombre",
|
||||
"age": "Edad",
|
||||
"gender": "Género",
|
||||
"actions": "Acciones"
|
||||
}
|
||||
}
|
||||
}
|
||||
61
frontend/src/i18n/locales/es/general.json
Normal file
61
frontend/src/i18n/locales/es/general.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"welcome": "Bienvenido a YourPart",
|
||||
"imprint": {
|
||||
"title": "Aviso legal",
|
||||
"button": "Aviso legal"
|
||||
},
|
||||
"dataPrivacy": {
|
||||
"title": "Política de privacidad",
|
||||
"button": "Política de privacidad"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contacto",
|
||||
"button": "Contacto"
|
||||
},
|
||||
"error-title": "Error",
|
||||
"warning-title": "Advertencia",
|
||||
"info-title": "Información",
|
||||
"dialog": {
|
||||
"contact": {
|
||||
"email": "Dirección de correo electrónico",
|
||||
"name": "Nombre",
|
||||
"message": "Tu mensaje",
|
||||
"accept": "Tu dirección de correo electrónico se guardará temporalmente en nuestro sistema. Una vez gestionada tu solicitud, se eliminará de nuevo.",
|
||||
"acceptdatasave": "Acepto el almacenamiento temporal de mi dirección de correo electrónico.",
|
||||
"accept2": "Sin este consentimiento no podemos responderte."
|
||||
}
|
||||
},
|
||||
"general": {
|
||||
"datetimelong": "dd.MM.yyyy HH:mm:ss",
|
||||
"loading": "Cargando...",
|
||||
"back": "Atrás",
|
||||
"cancel": "Cancelar",
|
||||
"yes": "Sí",
|
||||
"no": "No"
|
||||
},
|
||||
"OK": "Ok",
|
||||
"Cancel": "Cancelar",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"message": {
|
||||
"close": "Cerrar"
|
||||
},
|
||||
"gender": {
|
||||
"male": "Masculino",
|
||||
"female": "Femenino",
|
||||
"transmale": "Hombre trans",
|
||||
"transfemale": "Mujer trans",
|
||||
"nonbinary": "No binario"
|
||||
},
|
||||
"common": {
|
||||
"edit": "Editar",
|
||||
"delete": "Eliminar",
|
||||
"create": "Crear",
|
||||
"update": "Actualizar",
|
||||
"save": "Guardar",
|
||||
"add": "Añadir",
|
||||
"cancel": "Cancelar",
|
||||
"yes": "Sí",
|
||||
"no": "No"
|
||||
}
|
||||
}
|
||||
5
frontend/src/i18n/locales/es/header.json
Normal file
5
frontend/src/i18n/locales/es/header.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"logo": "Logo",
|
||||
"title": "YourPart",
|
||||
"advertisement": "Publicidad"
|
||||
}
|
||||
46
frontend/src/i18n/locales/es/home.json
Normal file
46
frontend/src/i18n/locales/es/home.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"home": {
|
||||
"betaNoticeLabel": "Aviso beta:",
|
||||
"betaNoticeText": "YourPart está en desarrollo activo. Algunas funciones pueden estar incompletas, pueden faltar contenidos y puede haber cambios.",
|
||||
"nologin": {
|
||||
"welcome": "Bienvenido a yourPart",
|
||||
"description": "yourPart es una red social donde puedes hacer amistades y conocer gente nueva. Aquí puedes mostrar tus imágenes y decidir quién puede verlas. Por supuesto, también puedes intercambiar mensajes y chatear: en grande, con muchos a la vez, o en un chat aleatorio 1 a 1. Y no lo olvides: también puedes usar la cámara.",
|
||||
"introHtml": "YourPart es una plataforma en línea en crecimiento que combina funciones de comunidad, chat en tiempo real, foros, una red social con galería de imágenes y el juego de estrategia <em>Falukant</em>. Actualmente el sitio está en fase beta: ampliamos continuamente funciones, contenidos y estabilidad.",
|
||||
"expected": {
|
||||
"title": "Qué te espera",
|
||||
"items": {
|
||||
"chat": "<strong>Chat</strong>: Salas públicas, encuentros aleatorios (chat aleatorio) y personalización de colores.",
|
||||
"social": "<strong>Red social</strong>: Perfil, amistades, galería de imágenes con configuraciones de visibilidad.",
|
||||
"forum": "<strong>Foro</strong>: Crear temas, escribir mensajes, permisos de moderación (por roles).",
|
||||
"falukant": "<strong>Falukant</strong>: Economía y vida cotidiana: gestionar sucursales, producir, almacenar y vender.",
|
||||
"minigames": "<strong>Minijuegos</strong>: por ejemplo, niveles de Match-3 para entretenimiento rápido.",
|
||||
"multilingual": "<strong>Multilingüe</strong>: Alemán/inglés; el contenido se amplía continuamente."
|
||||
}
|
||||
},
|
||||
"falukantShort": {
|
||||
"title": "Falukant: en breve",
|
||||
"text": "En Falukant diriges negocios, desarrollas conocimiento, optimizas producción y ventas, vigilas precios y reaccionas a eventos. Las notificaciones te informan en tiempo real sobre cambios de estado."
|
||||
},
|
||||
"privacyBeta": {
|
||||
"title": "Privacidad y estado beta",
|
||||
"text": "YourPart está en beta. Puede haber cambios, interrupciones y traducciones incompletas. Valoramos la privacidad y la transparencia; habrá más información a lo largo de la beta."
|
||||
},
|
||||
"getStarted": {
|
||||
"title": "Participa",
|
||||
"text": "Ya puedes usar la plataforma, probarla y darnos tu opinión. Regístrate mediante “{register}” o inicia el chat aleatorio sin compromiso."
|
||||
},
|
||||
"randomchat": "Chat aleatorio",
|
||||
"startrandomchat": "Iniciar chat aleatorio",
|
||||
"login": {
|
||||
"name": "Nombre de usuario",
|
||||
"namedescription": "Introduce tu nombre de usuario",
|
||||
"password": "Contraseña",
|
||||
"passworddescription": "Introduce tu contraseña",
|
||||
"lostpassword": "He olvidado la contraseña",
|
||||
"register": "Registrarse en yourPart",
|
||||
"stayLoggedIn": "Mantener la sesión iniciada",
|
||||
"submit": "Iniciar sesión"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
8
frontend/src/i18n/locales/es/message.json
Normal file
8
frontend/src/i18n/locales/es/message.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"message": {
|
||||
"title": "Mensaje",
|
||||
"close": "Cerrar",
|
||||
"test": "La prueba funciona",
|
||||
"success": "La acción se ha realizado correctamente."
|
||||
}
|
||||
}
|
||||
73
frontend/src/i18n/locales/es/minigames.json
Normal file
73
frontend/src/i18n/locales/es/minigames.json
Normal file
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"minigames": {
|
||||
"title": "Minijuegos",
|
||||
"description": "¡Descubre una colección de divertidos minijuegos!",
|
||||
"play": "Jugar",
|
||||
"backToGames": "Volver a los juegos",
|
||||
"comingSoon": {
|
||||
"title": "Próximamente",
|
||||
"description": "¡Más juegos emocionantes están en desarrollo!"
|
||||
},
|
||||
"match3": {
|
||||
"title": "Match 3 - Juwelen Kampagne",
|
||||
"description": "¡Combina tres o más gemas iguales para sumar puntos!",
|
||||
"campaignDescription": "¡Juega todos los niveles y consigue estrellas!",
|
||||
"gameStats": "Estadísticas del juego",
|
||||
"score": "Puntos",
|
||||
"moves": "Movimientos",
|
||||
"currentLevel": "Nivel actual",
|
||||
"level": "Level",
|
||||
"stars": "Estrellas",
|
||||
"movesLeft": "Movimientos restantes",
|
||||
"restartLevel": "Reiniciar nivel",
|
||||
"pause": "Pause",
|
||||
"resume": "Reanudar",
|
||||
"paused": "Juego en pausa",
|
||||
"levelComplete": "¡Nivel completado!",
|
||||
"levelScore": "Puntuación del nivel",
|
||||
"movesUsed": "Movimientos usados",
|
||||
"starsEarned": "Estrellas conseguidas",
|
||||
"nextLevel": "Siguiente nivel",
|
||||
"campaignComplete": "¡Campaña completada!",
|
||||
"totalScore": "Puntuación total",
|
||||
"totalStars": "Estrellas totales",
|
||||
"levelsCompleted": "Niveles completados",
|
||||
"restartCampaign": "Reiniciar campaña"
|
||||
},
|
||||
"taxi": {
|
||||
"title": "Taxi Simulator",
|
||||
"description": "¡Lleva pasajeros por la ciudad y gana dinero!",
|
||||
"gameStats": "Estadísticas del juego",
|
||||
"score": "Puntos",
|
||||
"money": "Dinero",
|
||||
"passengers": "Pasajeros",
|
||||
"currentLevel": "Nivel actual",
|
||||
"level": "Level",
|
||||
"fuel": "Combustible",
|
||||
"fuelLeft": "Combustible restante",
|
||||
"restartLevel": "Reiniciar nivel",
|
||||
"pause": "Pause",
|
||||
"resume": "Reanudar",
|
||||
"paused": "Juego en pausa",
|
||||
"levelComplete": "¡Nivel completado!",
|
||||
"levelScore": "Puntuación del nivel",
|
||||
"moneyEarned": "Dinero ganado",
|
||||
"passengersDelivered": "Pasajeros entregados",
|
||||
"nextLevel": "Siguiente nivel",
|
||||
"campaignComplete": "¡Campaña completada!",
|
||||
"totalScore": "Puntuación total",
|
||||
"totalMoney": "Dinero total",
|
||||
"levelsCompleted": "Niveles completados",
|
||||
"restartCampaign": "Reiniciar campaña",
|
||||
"pickupPassenger": "Recoger pasajero",
|
||||
"deliverPassenger": "Dejar pasajero",
|
||||
"refuel": "Repostar",
|
||||
"startEngine": "Arrancar motor",
|
||||
"stopEngine": "Parar motor",
|
||||
"crash": {
|
||||
"title": "¡Accidente!",
|
||||
"message": "¡Has tenido un accidente! Choques: {crashes}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
116
frontend/src/i18n/locales/es/navigation.json
Normal file
116
frontend/src/i18n/locales/es/navigation.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"navigation": {
|
||||
"home": "Inicio",
|
||||
"logout": "Cerrar sesión",
|
||||
"friends": "Amigos",
|
||||
"socialnetwork": "Punto de encuentro",
|
||||
"chats": "Chats",
|
||||
"falukant": "Falukant",
|
||||
"minigames": "Minijuegos",
|
||||
"personal": "Personal",
|
||||
"settings": "Ajustes",
|
||||
"administration": "Administración",
|
||||
"m-chats": {
|
||||
"multiChat": "Chat multiusuario",
|
||||
"randomChat": "Chat aleatorio (1 a 1)",
|
||||
"eroticChat": "Chat erótico"
|
||||
},
|
||||
"m-socialnetwork": {
|
||||
"guestbook": "Libro de visitas",
|
||||
"blog": "Blog",
|
||||
"usersearch": "Búsqueda de usuarios",
|
||||
"forum": "Forum",
|
||||
"gallery": "Galería",
|
||||
"sprachenlernen": "Aprender idiomas",
|
||||
"blockedUsers": "Usuarios bloqueados",
|
||||
"oneTimeInvitation": "Invitaciones de un solo uso",
|
||||
"diary": "Diario",
|
||||
"erotic": "Erotik",
|
||||
"m-erotic": {
|
||||
"pictures": "Imágenes",
|
||||
"videos": "Videos"
|
||||
},
|
||||
"m-sprachenlernen": {
|
||||
"vocabtrainer": "Entrenador de vocabulario",
|
||||
"sprachkurse": "Cursos de idiomas",
|
||||
"m-vocabtrainer": {
|
||||
"newLanguage": "Nuevo idioma"
|
||||
}
|
||||
}
|
||||
},
|
||||
"m-minigames": {
|
||||
"match3": "Match 3 - Juwelen",
|
||||
"taxi": "Taxi Simulator"
|
||||
},
|
||||
"m-personal": {
|
||||
"sprachenlernen": "Aprender idiomas",
|
||||
"calendar": "Calendario",
|
||||
"m-sprachenlernen": {
|
||||
"vocabtrainer": "Entrenador de vocabulario",
|
||||
"sprachkurse": "Cursos de idiomas",
|
||||
"m-vocabtrainer": {
|
||||
"newLanguage": "Nuevo idioma"
|
||||
}
|
||||
}
|
||||
},
|
||||
"m-settings": {
|
||||
"homepage": "Página de inicio",
|
||||
"account": "Account",
|
||||
"personal": "Personal",
|
||||
"view": "Apariencia",
|
||||
"flirt": "Flirt",
|
||||
"interests": "Interessen",
|
||||
"notifications": "Notificaciones",
|
||||
"sexuality": "Sexualidad"
|
||||
},
|
||||
"m-administration": {
|
||||
"contactrequests": "Solicitudes de contacto",
|
||||
"users": "Usuarios",
|
||||
"userrights": "Permisos de usuario",
|
||||
"m-users": {
|
||||
"userlist": "Lista de usuarios",
|
||||
"userstatistics": "Estadísticas de usuarios",
|
||||
"userrights": "Permisos de usuario"
|
||||
},
|
||||
"forum": "Forum",
|
||||
"interests": "Interessen",
|
||||
"falukant": "Falukant",
|
||||
"m-falukant": {
|
||||
"logentries": "Entradas de registro",
|
||||
"edituser": "Editar usuario",
|
||||
"database": "Datenbank",
|
||||
"mapEditor": "Editor de mapas",
|
||||
"createNPC": "Crear NPCs"
|
||||
},
|
||||
"minigames": "Minispiele",
|
||||
"m-minigames": {
|
||||
"match3": "Match3 Level",
|
||||
"taxiTools": "Taxi-Tools"
|
||||
},
|
||||
"chatrooms": "Salas de chat",
|
||||
"servicesStatus": "Service-Status"
|
||||
},
|
||||
"m-friends": {
|
||||
"manageFriends": "Gestionar amigos",
|
||||
"chat": "Chatear",
|
||||
"profile": "Profil"
|
||||
},
|
||||
"m-falukant": {
|
||||
"create": "Crear",
|
||||
"overview": "Resumen",
|
||||
"towns": "Sucursales",
|
||||
"factory": "Producción",
|
||||
"family": "Familia",
|
||||
"house": "Haus",
|
||||
"darknet": "Untergrund",
|
||||
"reputation": "Reputation",
|
||||
"moneyhistory": "Flujo de dinero",
|
||||
"nobility": "Estatus social",
|
||||
"politics": "Politik",
|
||||
"education": "Bildung",
|
||||
"health": "Gesundheit",
|
||||
"bank": "Bank",
|
||||
"church": "Kirche"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
frontend/src/i18n/locales/es/passwordReset.json
Normal file
9
frontend/src/i18n/locales/es/passwordReset.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"passwordReset": {
|
||||
"title": "Restablecer contraseña",
|
||||
"email": "E-Mail",
|
||||
"reset": "Restablecer",
|
||||
"success": "Si el correo electrónico existe, se ha enviado una guía para restablecer la contraseña.",
|
||||
"failure": "No se pudo restablecer la contraseña. Inténtalo de nuevo más tarde."
|
||||
}
|
||||
}
|
||||
79
frontend/src/i18n/locales/es/personal.json
Normal file
79
frontend/src/i18n/locales/es/personal.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"personal": {
|
||||
"calendar": {
|
||||
"title": "Calendario",
|
||||
"today": "Hoy",
|
||||
"newEntry": "Nueva entrada",
|
||||
"editEntry": "Editar entrada",
|
||||
"selectedDays": "{count} días seleccionados",
|
||||
"createEventForSelection": "Crear evento",
|
||||
"clearSelection": "Borrar selección",
|
||||
"allDay": "Todo el día",
|
||||
"views": {
|
||||
"month": "Mes",
|
||||
"week": "Semana",
|
||||
"workweek": "Semana laboral",
|
||||
"day": "Día"
|
||||
},
|
||||
"weekdays": {
|
||||
"mon": "Lu",
|
||||
"tue": "Ma",
|
||||
"wed": "Mi",
|
||||
"thu": "Ju",
|
||||
"fri": "Vi",
|
||||
"sat": "Sa",
|
||||
"sun": "Do"
|
||||
},
|
||||
"weekdaysFull": {
|
||||
"mon": "Lunes",
|
||||
"tue": "Martes",
|
||||
"wed": "Miércoles",
|
||||
"thu": "Jueves",
|
||||
"fri": "Viernes",
|
||||
"sat": "Sábado",
|
||||
"sun": "Domingo"
|
||||
},
|
||||
"months": {
|
||||
"jan": "Enero",
|
||||
"feb": "Febrero",
|
||||
"mar": "Marzo",
|
||||
"apr": "Abril",
|
||||
"may": "Mayo",
|
||||
"jun": "Junio",
|
||||
"jul": "Julio",
|
||||
"aug": "Agosto",
|
||||
"sep": "Septiembre",
|
||||
"oct": "Octubre",
|
||||
"nov": "Noviembre",
|
||||
"dec": "Diciembre"
|
||||
},
|
||||
"categories": {
|
||||
"personal": "Personal",
|
||||
"work": "Trabajo",
|
||||
"family": "Familia",
|
||||
"health": "Salud",
|
||||
"birthday": "Cumpleaños",
|
||||
"holiday": "Vacaciones",
|
||||
"reminder": "Recordatorio",
|
||||
"other": "Otros"
|
||||
},
|
||||
"form": {
|
||||
"title": "Título",
|
||||
"titlePlaceholder": "Introduce un título...",
|
||||
"category": "Categoría",
|
||||
"startDate": "Fecha de inicio",
|
||||
"startTime": "Hora de inicio",
|
||||
"endDate": "Fecha de fin",
|
||||
"endTime": "Hora de fin",
|
||||
"allDay": "Todo el día",
|
||||
"description": "Descripción",
|
||||
"descriptionPlaceholder": "Descripción opcional...",
|
||||
"save": "Guardar",
|
||||
"cancel": "Cancelar",
|
||||
"delete": "Eliminar",
|
||||
"saveError": "Error al guardar el evento",
|
||||
"deleteError": "Error al eliminar el evento"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
21
frontend/src/i18n/locales/es/register.json
Normal file
21
frontend/src/i18n/locales/es/register.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"register": {
|
||||
"title": "Registrarse",
|
||||
"email": "Dirección de correo electrónico",
|
||||
"username": "Nombre de usuario",
|
||||
"password": "Contraseña",
|
||||
"repeatPassword": "Repetir contraseña",
|
||||
"language": "Idioma",
|
||||
"languages": {
|
||||
"en": "Inglés",
|
||||
"de": "Alemán"
|
||||
},
|
||||
"register": "Registrarse",
|
||||
"close": "Cerrar",
|
||||
"failure": "Se ha producido un error.",
|
||||
"success": "Te has registrado correctamente. Revisa tu correo electrónico para activar tu cuenta.",
|
||||
"passwordMismatch": "Las contraseñas no coinciden.",
|
||||
"emailinuse": "La dirección de correo electrónico ya está en uso.",
|
||||
"usernameinuse": "El nombre de usuario no está disponible."
|
||||
}
|
||||
}
|
||||
180
frontend/src/i18n/locales/es/settings.json
Normal file
180
frontend/src/i18n/locales/es/settings.json
Normal file
@@ -0,0 +1,180 @@
|
||||
{
|
||||
"settings": {
|
||||
"personal": {
|
||||
"title": "Datos personales",
|
||||
"label": {
|
||||
"language": "Idioma",
|
||||
"birthdate": "Fecha de nacimiento",
|
||||
"gender": "Género",
|
||||
"town": "Ciudad",
|
||||
"zip": "Código postal",
|
||||
"eyecolor": "Color de ojos",
|
||||
"haircolor": "Color de pelo",
|
||||
"hairlength": "Longitud del pelo",
|
||||
"skincolor": "Color de piel",
|
||||
"freckles": "Pecas",
|
||||
"weight": "Peso",
|
||||
"bodyheight": "Altura",
|
||||
"piercings": "Piercings",
|
||||
"tattoos": "Tatuajes",
|
||||
"sexualpreference": "Orientación",
|
||||
"pubichair": "Vello púbico",
|
||||
"penislength": "Longitud del pene",
|
||||
"brasize": "Talla de sujetador",
|
||||
"willChildren": "Quiero hijos",
|
||||
"smokes": "Fuma",
|
||||
"drinks": "Bebe alcohol",
|
||||
"hasChildren": "Tengo hijos",
|
||||
"interestedInGender": "Interesado/a en"
|
||||
},
|
||||
"tooltip": {
|
||||
"language": "Idioma",
|
||||
"birthdate": "Fecha de nacimiento",
|
||||
"gender": "Género",
|
||||
"town": "Ciudad",
|
||||
"zip": "Código postal",
|
||||
"eyecolor": "Color de ojos",
|
||||
"haircolor": "Color de pelo",
|
||||
"hairlength": "Longitud del pelo",
|
||||
"skincolor": "Color de piel",
|
||||
"freckles": "Pecas",
|
||||
"weight": "Peso",
|
||||
"bodyheight": "Altura",
|
||||
"piercings": "Piercings",
|
||||
"tattoos": "Tatuajes",
|
||||
"sexualpreference": "Orientación",
|
||||
"pubichair": "Vello púbico",
|
||||
"penislength": "Longitud del pene",
|
||||
"brasize": "Talla de sujetador"
|
||||
},
|
||||
"gender": {
|
||||
"male": "Masculino",
|
||||
"female": "Femenino",
|
||||
"transmale": "Hombre trans",
|
||||
"transfemale": "Mujer trans",
|
||||
"nonbinary": "No binario"
|
||||
},
|
||||
"language": {
|
||||
"de": "Alemán",
|
||||
"en": "Inglés"
|
||||
},
|
||||
"eyecolor": {
|
||||
"blue": "Azul",
|
||||
"green": "Verde",
|
||||
"brown": "Marrón",
|
||||
"black": "Negro",
|
||||
"grey": "Gris",
|
||||
"hazel": "Avellana",
|
||||
"amber": "Ámbar",
|
||||
"red": "Rojo",
|
||||
"other": "Otro"
|
||||
},
|
||||
"haircolor": {
|
||||
"black": "Negro",
|
||||
"brown": "Castaño",
|
||||
"blonde": "Rubio",
|
||||
"red": "Rojo",
|
||||
"grey": "Gris",
|
||||
"white": "Blanco",
|
||||
"other": "Otro"
|
||||
},
|
||||
"hairlength": {
|
||||
"short": "Corto",
|
||||
"medium": "Medio",
|
||||
"long": "Largo",
|
||||
"bald": "Calvo",
|
||||
"other": "Otro"
|
||||
},
|
||||
"skincolor": {
|
||||
"light": "Clara",
|
||||
"medium": "Media",
|
||||
"dark": "Oscura",
|
||||
"other": "Otra"
|
||||
},
|
||||
"freckles": {
|
||||
"much": "Muchas",
|
||||
"medium": "Medias",
|
||||
"less": "Pocas",
|
||||
"none": "Ninguna"
|
||||
},
|
||||
"sexualpreference": {
|
||||
"straight": "Heterosexual",
|
||||
"gay": "Homosexual",
|
||||
"bi": "Bisexual",
|
||||
"asexual": "Asexual",
|
||||
"pan": "Pansexual"
|
||||
},
|
||||
"pubichair": {
|
||||
"none": "Ninguno",
|
||||
"short": "Corto",
|
||||
"medium": "Medio",
|
||||
"long": "Largo",
|
||||
"hairy": "Natural",
|
||||
"waxed": "Depilación con cera",
|
||||
"landingstrip": "Franja",
|
||||
"bikinizone": "Solo zona bikini",
|
||||
"other": "Otro"
|
||||
},
|
||||
"interestedInGender": {
|
||||
"male": "Hombres",
|
||||
"female": "Mujeres"
|
||||
},
|
||||
"smokes": {
|
||||
"often": "A menudo",
|
||||
"socially": "Socialmente",
|
||||
"daily": "A diario",
|
||||
"never": "Nunca"
|
||||
},
|
||||
"drinks": {
|
||||
"often": "A menudo",
|
||||
"socially": "Socialmente",
|
||||
"daily": "A diario",
|
||||
"never": "Nunca"
|
||||
}
|
||||
},
|
||||
"view": {
|
||||
"title": "Apariencia"
|
||||
},
|
||||
"sexuality": {
|
||||
"title": "Sexualidad"
|
||||
},
|
||||
"account": {
|
||||
"title": "Account",
|
||||
"username": "Nombre de usuario",
|
||||
"email": "Dirección de correo electrónico",
|
||||
"newpassword": "Contraseña",
|
||||
"newpasswordretype": "Repetir contraseña",
|
||||
"deleteAccount": "Eliminar cuenta",
|
||||
"language": "Idioma",
|
||||
"showinsearch": "Mostrar en búsquedas de usuarios",
|
||||
"changeaction": "Actualizar datos de usuario",
|
||||
"oldpassword": "Contraseña anterior (obligatoria)"
|
||||
},
|
||||
"interests": {
|
||||
"title": "Intereses",
|
||||
"new": "Nuevo interés",
|
||||
"add": "Añadir",
|
||||
"added": "El nuevo interés se ha añadido y está en revisión. Hasta finalizar, no será visible en la lista de intereses.",
|
||||
"adderror": "Se produjo un error al añadir el interés.",
|
||||
"errorsetinterest": "No se pudo asignar el interés."
|
||||
},
|
||||
"visibility": {
|
||||
"Invisible": "No mostrar",
|
||||
"OnlyFriends": "Solo amigos",
|
||||
"FriendsAndAdults": "Amigos y adultos",
|
||||
"AdultsOnly": "Solo adultos",
|
||||
"All": "Mostrar a todos"
|
||||
},
|
||||
"flirt": {
|
||||
"title": "Flirt"
|
||||
},
|
||||
"immutable": {
|
||||
"tooltip": "Este campo no se puede modificar. Para cambios, contacta con soporte.",
|
||||
"supportContact": "Contactar con soporte",
|
||||
"supportMessage": {
|
||||
"general": "Hola,\n\nquiero solicitar un cambio en mis datos de perfil que no se pueden modificar.\n\nPor favor, contactad conmigo para más detalles.\n\nUn saludo",
|
||||
"specific": "Hola,\n\nquiero solicitar un cambio en los siguientes datos de perfil que no se pueden modificar: {fields}\n\nPor favor, contactad conmigo para más detalles.\n\nUn saludo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
415
frontend/src/i18n/locales/es/socialnetwork.json
Normal file
415
frontend/src/i18n/locales/es/socialnetwork.json
Normal file
@@ -0,0 +1,415 @@
|
||||
{
|
||||
"socialnetwork": {
|
||||
"usersearch": {
|
||||
"title": "Búsqueda de usuarios",
|
||||
"username": "Nombre de usuario",
|
||||
"age_from": "Edad desde",
|
||||
"age_to": "bis",
|
||||
"gender": "Género",
|
||||
"search_button": "Buscar",
|
||||
"no_results": "No se han encontrado resultados",
|
||||
"results_title": "Resultados de la búsqueda:",
|
||||
"result": {
|
||||
"nick": "Apodo",
|
||||
"gender": "Género",
|
||||
"age": "Edad"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"pretitle": "Cargando datos. Por favor espera...",
|
||||
"error_title": "Usuario no encontrado",
|
||||
"title": "Profil von <username>",
|
||||
"tab": {
|
||||
"general": "General",
|
||||
"sexuality": "Sexualidad",
|
||||
"images": "Galería",
|
||||
"guestbook": "Libro de visitas"
|
||||
},
|
||||
"values": {
|
||||
"bool": {
|
||||
"true": "Sí",
|
||||
"false": "No"
|
||||
},
|
||||
"smokes": {
|
||||
"never": "Nunca",
|
||||
"socially": "Socialmente",
|
||||
"often": "A menudo",
|
||||
"daily": "A diario"
|
||||
},
|
||||
"drinks": {
|
||||
"never": "Nunca",
|
||||
"socially": "Socialmente",
|
||||
"often": "A menudo",
|
||||
"daily": "A diario"
|
||||
},
|
||||
"interestedInGender": {
|
||||
"male": "hombres",
|
||||
"female": "mujeres"
|
||||
},
|
||||
"sexualpreference": {
|
||||
"straight": "Heterosexual",
|
||||
"gay": "Homosexual",
|
||||
"bi": "Bisexual",
|
||||
"pan": "Pansexual",
|
||||
"asexual": "Asexual"
|
||||
},
|
||||
"pubichair": {
|
||||
"none": "Ninguno",
|
||||
"short": "Corto",
|
||||
"medium": "Medio",
|
||||
"long": "Largo",
|
||||
"hairy": "Natural",
|
||||
"waxed": "Depilado",
|
||||
"landingstrip": "Franja",
|
||||
"other": "Otro",
|
||||
"bikinizone": "Zona bikini"
|
||||
},
|
||||
"gender": {
|
||||
"male": "Masculino",
|
||||
"female": "Femenino",
|
||||
"transmale": "Hombre trans",
|
||||
"transfemale": "Mujer trans",
|
||||
"nonbinary": "No binario"
|
||||
},
|
||||
"language": {
|
||||
"de": "Alemán",
|
||||
"en": "Inglés"
|
||||
},
|
||||
"eyecolor": {
|
||||
"blue": "Azul",
|
||||
"green": "Verde",
|
||||
"brown": "Marrón",
|
||||
"black": "Negro",
|
||||
"grey": "Gris",
|
||||
"hazel": "Avellana",
|
||||
"amber": "Ámbar",
|
||||
"red": "Rojo",
|
||||
"other": "Otro"
|
||||
},
|
||||
"haircolor": {
|
||||
"black": "Negro",
|
||||
"brown": "Castaño",
|
||||
"blonde": "Rubio",
|
||||
"red": "Rojo",
|
||||
"grey": "Gris",
|
||||
"white": "Blanco",
|
||||
"other": "Otro"
|
||||
},
|
||||
"hairlength": {
|
||||
"short": "Corto",
|
||||
"medium": "Medio",
|
||||
"long": "Largo",
|
||||
"bald": "Calvo",
|
||||
"other": "Otro"
|
||||
},
|
||||
"skincolor": {
|
||||
"light": "Clara",
|
||||
"medium": "Media",
|
||||
"dark": "Oscura",
|
||||
"other": "Otra"
|
||||
},
|
||||
"freckles": {
|
||||
"much": "Muchas",
|
||||
"medium": "Medias",
|
||||
"less": "Pocas",
|
||||
"none": "Ninguna"
|
||||
}
|
||||
},
|
||||
"guestbook": {
|
||||
"showInput": "Mostrar nueva entrada",
|
||||
"hideInput": "Ocultar nueva entrada",
|
||||
"imageUpload": "Imagen",
|
||||
"submit": "Enviar entrada",
|
||||
"noEntries": "No se han encontrado entradas"
|
||||
},
|
||||
"interestedInGender": "Interesado/a en",
|
||||
"hasChildren": "Tiene hijos",
|
||||
"smokes": "Fuma",
|
||||
"drinks": "Alcohol",
|
||||
"willChildren": "Quiere hijos",
|
||||
"sexualpreference": "Orientación sexual",
|
||||
"pubichair": "Vello púbico",
|
||||
"penislength": "Longitud del pene",
|
||||
"brasize": "Talla de sujetador",
|
||||
"piercings": "Piercings",
|
||||
"tattoos": "Tatuajes",
|
||||
"language": "Idioma",
|
||||
"gender": "Género",
|
||||
"eyecolor": "Color de ojos",
|
||||
"haircolor": "Color de pelo",
|
||||
"hairlength": "Longitud del pelo",
|
||||
"freckles": "Pecas",
|
||||
"skincolor": "Color de piel",
|
||||
"birthdate": "Fecha de nacimiento",
|
||||
"age": "Edad",
|
||||
"town": "Ciudad",
|
||||
"bodyheight": "Altura",
|
||||
"weight": "Peso"
|
||||
},
|
||||
"gallery": {
|
||||
"title": "Galería",
|
||||
"folders": "Carpetas",
|
||||
"create_folder": "Crear carpeta",
|
||||
"upload": {
|
||||
"title": "Subir imagen",
|
||||
"image_title": "Título",
|
||||
"image_file": "Archivo",
|
||||
"visibility": "Visible para",
|
||||
"upload_button": "Subir",
|
||||
"selectvisibility": "Selecciona"
|
||||
},
|
||||
"images": "Imágenes",
|
||||
"visibility": {
|
||||
"everyone": "Todos",
|
||||
"friends": "Amigos",
|
||||
"adults": "Adultos",
|
||||
"friends-and-adults": "Amigos y adultos",
|
||||
"selected-users": "Usuarios seleccionados",
|
||||
"none": "Nadie"
|
||||
},
|
||||
"create_folder_dialog": {
|
||||
"title": "Crear carpeta",
|
||||
"parent_folder": "Se crea en",
|
||||
"folder_title": "Nombre de la carpeta",
|
||||
"visibility": "Visible para",
|
||||
"select_visibility": "Selecciona"
|
||||
},
|
||||
"noimages": "Actualmente no hay imágenes en esta carpeta",
|
||||
"imagedialog": {
|
||||
"image_title": "Título",
|
||||
"edit_visibility": "Visible para",
|
||||
"save_changes": "Guardar cambios",
|
||||
"close": "Cerrar",
|
||||
"edit_visibility_placeholder": "Selecciona"
|
||||
},
|
||||
"delete_folder_confirmation_title": "Eliminar carpeta",
|
||||
"delete_folder_confirmation_message": "¿De verdad quieres eliminar la carpeta '%%folderName%%'?",
|
||||
"edit_image_dialog": {
|
||||
"title": "Editar datos de la imagen"
|
||||
},
|
||||
"show_image_dialog": {
|
||||
"title": "Imagen"
|
||||
}
|
||||
},
|
||||
"guestbook": {
|
||||
"title": "Libro de visitas",
|
||||
"prevPage": "Atrás",
|
||||
"nextPage": "Siguiente",
|
||||
"page": "Página"
|
||||
},
|
||||
"diary": {
|
||||
"title": "Diario",
|
||||
"noEntries": "Aún no has escrito ninguna entrada en el diario.",
|
||||
"newEntry": "Nueva entrada",
|
||||
"editEntry": "Editar entrada",
|
||||
"save": "Guardar",
|
||||
"update": "Actualizar",
|
||||
"cancel": "Cancelar",
|
||||
"edit": "Editar",
|
||||
"delete": "Eliminar",
|
||||
"confirmDelete": "¿Seguro que quieres eliminar la entrada?",
|
||||
"prevPage": "Atrás",
|
||||
"nextPage": "Siguiente",
|
||||
"page": "Página"
|
||||
},
|
||||
"forum": {
|
||||
"title": "Forum",
|
||||
"showNewTopic": "Crear nuevo tema",
|
||||
"hideNewTopic": "Cancelar creación",
|
||||
"noTitles": "No hay temas",
|
||||
"topic": "Tema",
|
||||
"createNewTopic": "Crear tema",
|
||||
"createdBy": "Creado por",
|
||||
"createdAt": "Creado el",
|
||||
"reactions": "Respuestas",
|
||||
"lastReaction": "Última respuesta de",
|
||||
"pagination": {
|
||||
"first": "Primera página",
|
||||
"previous": "Página anterior",
|
||||
"next": "Página siguiente",
|
||||
"last": "Última página",
|
||||
"page": "Seite <<page>> von <<of>>"
|
||||
},
|
||||
"createNewMesssage": "Enviar respuesta"
|
||||
},
|
||||
"friendship": {
|
||||
"error": {
|
||||
"alreadyexists": "La solicitud de amistad ya existe"
|
||||
},
|
||||
"state": {
|
||||
"none": "No sois amigos",
|
||||
"waiting": "Solicitud enviada, aún sin respuesta",
|
||||
"open": "Solicitud recibida",
|
||||
"denied": "Solicitud rechazada",
|
||||
"withdrawn": "Solicitud retirada",
|
||||
"accepted": "Amigos"
|
||||
},
|
||||
"added": "Has enviado una solicitud de amistad.",
|
||||
"withdrawn": "Has retirado tu solicitud de amistad.",
|
||||
"denied": "Has rechazado la solicitud de amistad.",
|
||||
"accepted": "Se ha aceptado la amistad."
|
||||
},
|
||||
"vocab": {
|
||||
"title": "Entrenador de vocabulario",
|
||||
"description": "Crea idiomas (o suscríbete) y compártelos con tus amigos.",
|
||||
"newLanguage": "Nuevo idioma",
|
||||
"newLanguageTitle": "Crear nuevo idioma",
|
||||
"languageName": "Nombre del idioma",
|
||||
"create": "Crear",
|
||||
"saving": "Guardando...",
|
||||
"created": "El idioma se ha creado.",
|
||||
"createdTitle": "Entrenador de vocabulario",
|
||||
"createdMessage": "El idioma se ha creado. El menú se actualizará.",
|
||||
"createError": "No se pudo crear el idioma.",
|
||||
"openLanguage": "Abrir",
|
||||
"none": "Aún no has creado ni te has suscrito a ningún idioma.",
|
||||
"owner": "Propio",
|
||||
"subscribed": "Suscrito",
|
||||
"languageTitle": "Entrenador de vocabulario: {name}",
|
||||
"notFound": "Idioma no encontrado o sin acceso.",
|
||||
"shareCode": "Código para compartir",
|
||||
"shareHint": "Puedes compartir este código con tus amigos para que se suscriban al idioma.",
|
||||
"subscribeByCode": "Suscribirse con código",
|
||||
"subscribeTitle": "Suscribirse a un idioma",
|
||||
"subscribeHint": "Introduce el código para compartir que te ha dado un amigo.",
|
||||
"subscribe": "Suscribirse",
|
||||
"subscribeSuccess": "Suscripción correcta. El menú se actualizará.",
|
||||
"subscribeError": "Fallo en la suscripción. Código inválido o sin acceso.",
|
||||
"trainerPlaceholder": "Las funciones del entrenador (vocabulario/pruebas) serán el siguiente paso.",
|
||||
"chapters": "Capítulos",
|
||||
"newChapter": "Nuevo capítulo",
|
||||
"createChapter": "Crear capítulo",
|
||||
"createChapterError": "No se pudo crear el capítulo.",
|
||||
"noChapters": "Aún no hay capítulos.",
|
||||
"chapterTitle": "Capítulo: {title}",
|
||||
"addVocab": "Añadir vocabulario",
|
||||
"learningWord": "Idioma de aprendizaje",
|
||||
"referenceWord": "Referencia",
|
||||
"add": "Añadir",
|
||||
"addVocabError": "No se pudo añadir el vocabulario.",
|
||||
"noVocabs": "Aún no hay vocabulario en este capítulo.",
|
||||
"practice": {
|
||||
"open": "Practicar",
|
||||
"title": "Practicar vocabulario",
|
||||
"allVocabs": "Todo el vocabulario",
|
||||
"simple": "Práctica simple",
|
||||
"noPool": "No hay vocabulario para practicar.",
|
||||
"dirLearningToRef": "Aprendizaje → Referencia",
|
||||
"dirRefToLearning": "Referencia → Aprendizaje",
|
||||
"check": "Comprobar",
|
||||
"next": "Siguiente",
|
||||
"skip": "Saltar",
|
||||
"correct": "¡Correcto!",
|
||||
"wrong": "Incorrecto.",
|
||||
"acceptable": "Traducciones correctas posibles:",
|
||||
"stats": "Estadísticas",
|
||||
"success": "Éxito",
|
||||
"fail": "Fallo"
|
||||
},
|
||||
"search": {
|
||||
"open": "Buscar",
|
||||
"title": "Buscar vocabulario",
|
||||
"term": "Término de búsqueda",
|
||||
"motherTongue": "Lengua materna",
|
||||
"learningLanguage": "Idioma de aprendizaje",
|
||||
"lesson": "Lección",
|
||||
"search": "Buscar",
|
||||
"noResults": "Sin resultados.",
|
||||
"error": "La búsqueda ha fallado."
|
||||
},
|
||||
"courses": {
|
||||
"title": "Cursos de idiomas",
|
||||
"create": "Crear curso",
|
||||
"myCourses": "Mis cursos",
|
||||
"allCourses": "Todos los cursos",
|
||||
"none": "No se han encontrado cursos.",
|
||||
"owner": "Propietario",
|
||||
"enrolled": "Inscrito",
|
||||
"public": "Público",
|
||||
"difficulty": "Dificultad",
|
||||
"lessons": "Lecciones",
|
||||
"enroll": "Inscribirse",
|
||||
"continue": "Continuar",
|
||||
"edit": "Editar",
|
||||
"addLesson": "Añadir lección",
|
||||
"completed": "Completado",
|
||||
"score": "Puntuación",
|
||||
"review": "Repasar",
|
||||
"start": "Empezar",
|
||||
"noLessons": "Este curso aún no tiene lecciones.",
|
||||
"lessonNumber": "Número de lección",
|
||||
"chapter": "Capítulo",
|
||||
"selectChapter": "Seleccionar capítulo",
|
||||
"selectLanguage": "Seleccionar idioma",
|
||||
"confirmDelete": "¿Eliminar la lección?",
|
||||
"titleLabel": "Título",
|
||||
"descriptionLabel": "Descripción",
|
||||
"languageLabel": "Idioma",
|
||||
"findByCode": "Buscar curso por código",
|
||||
"shareCode": "Share-Code",
|
||||
"searchPlaceholder": "Buscar curso...",
|
||||
"allLanguages": "Todos los idiomas",
|
||||
"targetLanguage": "Idioma objetivo",
|
||||
"nativeLanguage": "Lengua materna",
|
||||
"allNativeLanguages": "Todas las lenguas maternas",
|
||||
"myNativeLanguage": "Mi lengua materna",
|
||||
"forAllLanguages": "Para todos los idiomas",
|
||||
"optional": "Opcional",
|
||||
"invalidCode": "Código inválido",
|
||||
"courseNotFound": "Curso no encontrado",
|
||||
"grammarExercises": "Prueba de gramática",
|
||||
"noExercises": "No hay prueba disponible",
|
||||
"enterAnswer": "Introduce la respuesta",
|
||||
"checkAnswer": "Comprobar respuesta",
|
||||
"correct": "¡Correcto!",
|
||||
"wrong": "Incorrecto",
|
||||
"explanation": "Explicación",
|
||||
"learn": "Aprender",
|
||||
"exercises": "Prueba del capítulo",
|
||||
"learnVocabulary": "Aprender vocabulario",
|
||||
"lessonDescription": "Descripción de la lección",
|
||||
"culturalNotes": "Notas culturales",
|
||||
"grammarExplanations": "Explicaciones gramaticales",
|
||||
"importantVocab": "Términos importantes",
|
||||
"vocabInfoText": "Estos términos se usarán en la prueba. Apréndelos aquí antes de pasar a la prueba del capítulo.",
|
||||
"noVocabInfo": "Lee la descripción de arriba y las explicaciones de la prueba para aprender los términos más importantes.",
|
||||
"vocabTrainer": "Entrenador de vocabulario",
|
||||
"vocabTrainerDescription": "Practica los términos clave de esta lección de forma interactiva.",
|
||||
"startVocabTrainer": "Iniciar entrenador",
|
||||
"stopTrainer": "Detener entrenador",
|
||||
"translateTo": "Traduce al alemán",
|
||||
"translateFrom": "Traduce desde bisaya",
|
||||
"next": "Siguiente",
|
||||
"totalAttempts": "Intentos",
|
||||
"successRate": "Tasa de acierto",
|
||||
"modeMultipleChoice": "Multiple Choice",
|
||||
"modeTyping": "Texteingabe",
|
||||
"currentLesson": "Lección actual",
|
||||
"mixedReview": "Repaso",
|
||||
"lessonCompleted": "¡Lección completada!",
|
||||
"goToNextLesson": "¿Pasar a la siguiente lección?",
|
||||
"allLessonsCompleted": "¡Todas las lecciones completadas!",
|
||||
"startExercises": "Ir a la prueba del capítulo",
|
||||
"correctAnswer": "Respuesta correcta",
|
||||
"alternatives": "Respuestas alternativas",
|
||||
"notStarted": "No empezado",
|
||||
"continueCurrentLesson": "Continuar lección actual",
|
||||
"previousLessonRequired": "Primero completa la lección anterior",
|
||||
"lessonNumberShort": "#",
|
||||
"readingAloudInstruction": "Lee el texto en voz alta. Haz clic en 'Iniciar grabación' y comienza a hablar.",
|
||||
"speakingFromMemoryInstruction": "Habla de memoria. Usa las palabras clave mostradas.",
|
||||
"startRecording": "Iniciar grabación",
|
||||
"stopRecording": "Detener grabación",
|
||||
"startSpeaking": "Empezar a hablar",
|
||||
"recording": "Grabando",
|
||||
"listening": "Escuchando...",
|
||||
"recordingStopped": "Grabación finalizada",
|
||||
"recordingError": "Error de grabación",
|
||||
"recognizedText": "Texto reconocido",
|
||||
"speechRecognitionNotSupported": "El reconocimiento de voz no es compatible con este navegador. Usa Chrome o Edge.",
|
||||
"keywords": "Palabras clave",
|
||||
"switchBackToMultipleChoice": "Volver a opción múltiple"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -360,6 +360,7 @@ export default {
|
||||
vehicles: [],
|
||||
activeTab: 'production',
|
||||
productPricesCache: {}, // Cache für regionale Preise: { productId: price }
|
||||
productPricesCacheRegionId: null, // regionId, für die der Cache gültig ist
|
||||
tabs: [
|
||||
{ value: 'production', label: 'falukant.branch.tabs.production' },
|
||||
{ value: 'inventory', label: 'falukant.branch.tabs.inventory' },
|
||||
@@ -569,30 +570,46 @@ export default {
|
||||
async loadProductPricesForCurrentBranch() {
|
||||
if (!this.selectedBranch || !this.selectedBranch.regionId) {
|
||||
this.productPricesCache = {};
|
||||
this.productPricesCacheRegionId = null;
|
||||
return;
|
||||
}
|
||||
|
||||
// Lade Preise für alle Produkte in der aktuellen Region
|
||||
const prices = {};
|
||||
for (const product of this.products) {
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/products/price-in-region', {
|
||||
params: {
|
||||
productId: product.id,
|
||||
regionId: this.selectedBranch.regionId
|
||||
}
|
||||
});
|
||||
prices[product.id] = data.price;
|
||||
} catch (error) {
|
||||
console.error(`Error loading price for product ${product.id}:`, error);
|
||||
// Fallback auf Standard-Berechnung
|
||||
const knowledgeFactor = product.knowledges?.[0]?.knowledge || 0;
|
||||
const maxPrice = product.sellCost;
|
||||
const minPrice = maxPrice * 0.6;
|
||||
prices[product.id] = minPrice + (maxPrice - minPrice) * (knowledgeFactor / 100);
|
||||
}
|
||||
if (this.productPricesCacheRegionId === this.selectedBranch.regionId && Object.keys(this.productPricesCache).length > 0) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/products/prices-in-region', {
|
||||
params: {
|
||||
regionId: this.selectedBranch.regionId
|
||||
}
|
||||
});
|
||||
this.productPricesCache = data.prices || {};
|
||||
this.productPricesCacheRegionId = this.selectedBranch.regionId;
|
||||
} catch (error) {
|
||||
console.error(`Error loading product prices for region ${this.selectedBranch.regionId}:`, error);
|
||||
// Fallback: Lade Preise einzeln (alte Methode)
|
||||
console.warn('[BranchView] Falling back to individual product price requests');
|
||||
const prices = {};
|
||||
for (const product of this.products) {
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/products/price-in-region', {
|
||||
params: {
|
||||
productId: product.id,
|
||||
regionId: this.selectedBranch.regionId
|
||||
}
|
||||
});
|
||||
prices[product.id] = data.price;
|
||||
} catch (err) {
|
||||
console.error(`Error loading price for product ${product.id}:`, err);
|
||||
// Fallback auf Standard-Berechnung
|
||||
const knowledgeFactor = product.knowledges?.[0]?.knowledge || 0;
|
||||
const maxPrice = product.sellCost;
|
||||
const minPrice = maxPrice * 0.6;
|
||||
prices[product.id] = minPrice + (maxPrice - minPrice) * (knowledgeFactor / 100);
|
||||
}
|
||||
}
|
||||
this.productPricesCache = prices;
|
||||
this.productPricesCacheRegionId = this.selectedBranch?.regionId ?? null;
|
||||
}
|
||||
this.productPricesCache = prices;
|
||||
},
|
||||
|
||||
formatPercent(value) {
|
||||
@@ -704,13 +721,17 @@ export default {
|
||||
},
|
||||
|
||||
speedLabel(value) {
|
||||
// Expect numeric speeds 1..4; provide localized labels as fallback to raw value
|
||||
const key = value == null ? 'unknown' : String(value);
|
||||
if (value == null) return this.$t('falukant.branch.transport.speed.unknown') || '—';
|
||||
if (typeof value === 'object') {
|
||||
const k = value.tr ?? value.id ?? 'unknown';
|
||||
const tKey = `falukant.branch.transport.speed.${k}`;
|
||||
const t = this.$t(tKey);
|
||||
return (t && t !== tKey) ? t : String(k);
|
||||
}
|
||||
const key = String(value);
|
||||
const tKey = `falukant.branch.transport.speed.${key}`;
|
||||
const translated = this.$t(tKey);
|
||||
// If translation returns the key (no translation found), fall back to the numeric value
|
||||
if (!translated || translated === tKey) return value;
|
||||
return translated;
|
||||
return (!translated || translated === tKey) ? key : translated;
|
||||
},
|
||||
|
||||
transportModeLabel(mode) {
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ $t('falukant.family.spouse.mood') }}</td>
|
||||
<td>{{ $t(`falukant.mood.${relationships[0].character2.mood.tr}`) }}</td>
|
||||
<td>{{ relationships[0].character2.mood?.tr ? $t(`falukant.mood.${relationships[0].character2.mood.tr}`) : '—' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ $t('falukant.family.spouse.status') }}</td>
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
<button @click="fetchMoneyHistory(1)">{{ $t('falukant.moneyHistory.search') }}</button>
|
||||
</div>
|
||||
|
||||
<div class="graph-section">
|
||||
<button @click="openGraphDialog">
|
||||
{{ $t('falukant.moneyHistory.graph.open') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -42,17 +48,21 @@
|
||||
{{ $t('falukant.moneyHistory.next') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<MoneyHistoryGraphDialog ref="graphDialog" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import StatusBar from '@/components/falukant/StatusBar.vue'
|
||||
import MoneyHistoryGraphDialog from '@/dialogues/falukant/MoneyHistoryGraphDialog.vue'
|
||||
import apiClient from '@/utils/axios.js';
|
||||
|
||||
export default {
|
||||
name: 'MoneyHistoryView',
|
||||
components: {
|
||||
StatusBar,
|
||||
MoneyHistoryGraphDialog,
|
||||
},
|
||||
computed: {
|
||||
locale() {
|
||||
@@ -97,6 +107,9 @@ export default {
|
||||
}
|
||||
return translation !== key ? translation : activity;
|
||||
},
|
||||
openGraphDialog() {
|
||||
this.$refs.graphDialog.open();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -106,6 +119,10 @@ export default {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.graph-section {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="pos in currentPositions" :key="pos.id">
|
||||
<tr v-for="pos in currentPositions" :key="pos.id" :class="{ 'own-position': isOwnPosition(pos) }">
|
||||
<td>{{ $t(`falukant.politics.offices.${pos.officeType.name}`) }}</td>
|
||||
<td>{{ pos.region.name }}</td>
|
||||
<td>
|
||||
@@ -57,6 +57,7 @@
|
||||
|
||||
<!-- OPEN Tab: hier zeigen wir 'openPolitics' -->
|
||||
<div v-else-if="activeTab === 'openPolitics'" class="tab-pane">
|
||||
<p class="politics-age-requirement">{{ $t('falukant.politics.open.ageRequirement') }}</p>
|
||||
<div v-if="loading.openPolitics" class="loading">{{ $t('loading') }}</div>
|
||||
<div v-else class="table-scroll">
|
||||
<table class="politics-table">
|
||||
@@ -65,7 +66,7 @@
|
||||
<th>{{ $t('falukant.politics.open.office') }}</th>
|
||||
<th>{{ $t('falukant.politics.open.region') }}</th>
|
||||
<th>{{ $t('falukant.politics.open.date') }}</th>
|
||||
<th>{{ $t('falukant.politics.open.candidacy') }}</th>
|
||||
<th>{{ $t('falukant.politics.open.candidacyWithAge') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -74,13 +75,13 @@
|
||||
<td>{{ e.region.name }}</td>
|
||||
<td>{{ formatDate(e.date) }}</td>
|
||||
<!-- Checkbox ganz am Ende -->
|
||||
<td>
|
||||
<td :title="e.canApplyByAge === false ? $t('falukant.politics.open.minAgeHint') : null">
|
||||
<input
|
||||
type="checkbox"
|
||||
:id="`apply-${e.id}`"
|
||||
v-model="selectedApplications"
|
||||
:value="e.id"
|
||||
:disabled="e.alreadyApplied"
|
||||
:disabled="e.alreadyApplied || e.canApplyByAge === false"
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -193,6 +194,7 @@ export default {
|
||||
elections: [],
|
||||
selectedCandidates: {},
|
||||
selectedApplications: [],
|
||||
ownCharacterId: null,
|
||||
loading: {
|
||||
current: false,
|
||||
openPolitics: false,
|
||||
@@ -210,6 +212,7 @@ export default {
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadOwnCharacterId();
|
||||
this.loadCurrentPositions();
|
||||
},
|
||||
methods: {
|
||||
@@ -229,9 +232,12 @@ export default {
|
||||
this.loading.current = true;
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/politics/overview');
|
||||
console.log('[PoliticsView] loadCurrentPositions - API response:', data);
|
||||
console.log('[PoliticsView] loadCurrentPositions - ownCharacterId at load time:', this.ownCharacterId);
|
||||
this.currentPositions = data;
|
||||
console.log('[PoliticsView] loadCurrentPositions - Loaded', data.length, 'positions');
|
||||
} catch (err) {
|
||||
console.error('Error loading current positions', err);
|
||||
console.error('[PoliticsView] Error loading current positions', err);
|
||||
} finally {
|
||||
this.loading.current = false;
|
||||
}
|
||||
@@ -241,10 +247,10 @@ export default {
|
||||
this.loading.openPolitics = true;
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/politics/open');
|
||||
this.openPolitics = data;
|
||||
this.openPolitics = Array.isArray(data) ? data : [];
|
||||
// Bereits beworbene Positionen vorselektieren, damit die Checkbox
|
||||
// sichtbar markiert bleibt.
|
||||
this.selectedApplications = data
|
||||
this.selectedApplications = this.openPolitics
|
||||
.filter(e => e.alreadyApplied)
|
||||
.map(e => e.id);
|
||||
} catch (err) {
|
||||
@@ -330,6 +336,44 @@ export default {
|
||||
});
|
||||
},
|
||||
|
||||
async loadOwnCharacterId() {
|
||||
try {
|
||||
const { data } = await apiClient.get('/api/falukant/info');
|
||||
console.log('[PoliticsView] loadOwnCharacterId - API response:', data);
|
||||
console.log('[PoliticsView] loadOwnCharacterId - data.character:', data.character);
|
||||
console.log('[PoliticsView] loadOwnCharacterId - data.character?.id:', data.character?.id);
|
||||
if (data.character && data.character.id) {
|
||||
this.ownCharacterId = data.character.id;
|
||||
console.log('[PoliticsView] loadOwnCharacterId - Set ownCharacterId to:', this.ownCharacterId);
|
||||
} else {
|
||||
console.warn('[PoliticsView] loadOwnCharacterId - No character ID found in response', {
|
||||
hasCharacter: !!data.character,
|
||||
characterKeys: data.character ? Object.keys(data.character) : null,
|
||||
characterId: data.character?.id
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[PoliticsView] Error loading own character ID', err);
|
||||
}
|
||||
},
|
||||
|
||||
isOwnPosition(pos) {
|
||||
console.log('[PoliticsView] isOwnPosition - Checking position:', {
|
||||
posId: pos.id,
|
||||
posCharacter: pos.character,
|
||||
posCharacterId: pos.character?.id,
|
||||
ownCharacterId: this.ownCharacterId,
|
||||
match: pos.character?.id === this.ownCharacterId
|
||||
});
|
||||
if (!this.ownCharacterId || !pos.character) {
|
||||
console.log('[PoliticsView] isOwnPosition - Returning false (missing ownCharacterId or pos.character)');
|
||||
return false;
|
||||
}
|
||||
const isMatch = pos.character.id === this.ownCharacterId;
|
||||
console.log('[PoliticsView] isOwnPosition - Result:', isMatch);
|
||||
return isMatch;
|
||||
},
|
||||
|
||||
async submitApplications() {
|
||||
try {
|
||||
const response = await apiClient.post(
|
||||
@@ -346,6 +390,10 @@ export default {
|
||||
.map(e => e.id);
|
||||
} catch (err) {
|
||||
console.error('Error submitting applications', err);
|
||||
const msg = err?.response?.data?.error === 'too_young'
|
||||
? this.$t('falukant.politics.too_young')
|
||||
: (err?.response?.data?.error || err?.message || this.$t('falukant.politics.applyError'));
|
||||
this.$root.$refs?.messageDialog?.open?.(msg, this.$t('falukant.politics.title'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -384,6 +432,13 @@ h2 {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.politics-age-requirement {
|
||||
flex: 0 0 auto;
|
||||
margin: 0 0 10px 0;
|
||||
font-size: 0.95em;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.table-scroll {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
@@ -411,6 +466,11 @@ h2 {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.politics-table tbody tr.own-position {
|
||||
background-color: #e0e0e0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.loading {
|
||||
text-align: center;
|
||||
font-style: italic;
|
||||
|
||||
Reference in New Issue
Block a user