feat(bisaya-course): enhance German course content and localization support
All checks were successful
Deploy to production / deploy (push) Successful in 2m47s

- Updated the create-german-for-bisaya-course-content.js script to improve lesson pattern retrieval by introducing a new function for generating a lesson pattern pool.
- Added new exercises for various topics including 'Wohnung & Nachbarn', 'Besuch empfangen', 'Arzt, Apotheke, Termin', and 'Amt, Dokumente, Anmeldung', enhancing practical language skills for learners.
- Improved localization by integrating translation keys for various UI elements and error messages across multiple components, ensuring a consistent user experience in both German and Bisaya.
- Enhanced the main.js file to recognize Bisaya language preferences in browser settings, improving accessibility for users.
This commit is contained in:
Torsten Schulz (local)
2026-03-31 17:40:03 +02:00
parent b1990334b9
commit c6caeefb5f
49 changed files with 3468 additions and 262 deletions

View File

@@ -10,76 +10,76 @@
class="app-section-bar__back"
@click="navigateBack"
>
Zurück
{{ $t('general.general.back') }}
</button>
</section>
</template>
<script>
const SECTION_LABELS = [
{ test: (path) => path.startsWith('/falukant'), label: 'Falukant' },
{ test: (path) => path.startsWith('/socialnetwork/vocab'), label: 'Vokabeltrainer' },
{ test: (path) => path.startsWith('/socialnetwork/forum'), label: 'Forum' },
{ test: (path) => path.startsWith('/socialnetwork'), label: 'Community' },
{ test: (path) => path.startsWith('/friends'), label: 'Community' },
{ test: (path) => path.startsWith('/settings'), label: 'Einstellungen' },
{ test: (path) => path.startsWith('/admin'), label: 'Administration' },
{ test: (path) => path.startsWith('/minigames'), label: 'Minispiele' },
{ test: (path) => path.startsWith('/personal'), label: 'Persönlich' },
{ test: (path) => path.startsWith('/blogs'), label: 'Blog' }
{ test: (path) => path.startsWith('/falukant'), labelKey: 'general.sectionBar.sections.falukant' },
{ test: (path) => path.startsWith('/socialnetwork/vocab'), labelKey: 'general.sectionBar.sections.vocab' },
{ test: (path) => path.startsWith('/socialnetwork/forum'), labelKey: 'general.sectionBar.sections.forum' },
{ test: (path) => path.startsWith('/socialnetwork'), labelKey: 'general.sectionBar.sections.community' },
{ test: (path) => path.startsWith('/friends'), labelKey: 'general.sectionBar.sections.community' },
{ test: (path) => path.startsWith('/settings'), labelKey: 'general.sectionBar.sections.settings' },
{ test: (path) => path.startsWith('/admin'), labelKey: 'general.sectionBar.sections.administration' },
{ test: (path) => path.startsWith('/minigames'), labelKey: 'general.sectionBar.sections.minigames' },
{ test: (path) => path.startsWith('/personal'), labelKey: 'general.sectionBar.sections.personal' },
{ test: (path) => path.startsWith('/blogs'), labelKey: 'general.sectionBar.sections.blog' }
];
const TITLE_MAP = {
Friends: 'Freunde',
Guestbook: 'Gästebuch',
'Search users': 'Suche',
Gallery: 'Galerie',
Forum: 'Forum',
ForumTopic: 'Thema',
Diary: 'Tagebuch',
VocabTrainer: 'Sprachen',
VocabNewLanguage: 'Neue Sprache',
VocabSubscribe: 'Sprache abonnieren',
VocabLanguage: 'Sprache',
VocabChapter: 'Kapitel',
VocabCourses: 'Kurse',
VocabCourse: 'Kurs',
VocabLesson: 'Lektion',
FalukantCreate: 'Charakter erstellen',
FalukantOverview: 'Übersicht',
BranchView: 'Niederlassung',
MoneyHistoryView: 'Geldverlauf',
FalukantFamily: 'Familie',
HouseView: 'Haus',
NobilityView: 'Adel',
ReputationView: 'Ansehen',
ChurchView: 'Kirche',
EducationView: 'Bildung',
BankView: 'Bank',
DirectorView: 'Direktoren',
HealthView: 'Gesundheit',
PoliticsView: 'Politik',
UndergroundView: 'Untergrund',
'Personal settings': 'Persönliche Daten',
'View settings': 'Ansicht',
'Sexuality settings': 'Sexualität',
'Flirt settings': 'Flirt',
'Account settings': 'Account',
'Language assistant settings': 'Sprachassistent',
Interests: 'Interessen',
AdminInterests: 'Interessenverwaltung',
AdminUsers: 'Benutzer',
AdminUserStatistics: 'Benutzerstatistik',
AdminContacts: 'Kontaktanfragen',
AdminUserRights: 'Rechte',
AdminForums: 'Forumverwaltung',
AdminChatRooms: 'Chaträume',
AdminFalukantEditUserView: 'Falukant-Nutzer',
AdminFalukantMapRegionsView: 'Falukant-Karte',
AdminFalukantCreateNPCView: 'NPC erstellen',
AdminMinigames: 'Match3-Verwaltung',
AdminTaxiTools: 'Taxi-Tools',
AdminServicesStatus: 'Service-Status'
Friends: 'general.sectionBar.titles.friends',
Guestbook: 'general.sectionBar.titles.guestbook',
'Search users': 'general.sectionBar.titles.search',
Gallery: 'general.sectionBar.titles.gallery',
Forum: 'general.sectionBar.titles.forum',
ForumTopic: 'general.sectionBar.titles.topic',
Diary: 'general.sectionBar.titles.diary',
VocabTrainer: 'general.sectionBar.titles.languages',
VocabNewLanguage: 'general.sectionBar.titles.newLanguage',
VocabSubscribe: 'general.sectionBar.titles.subscribeLanguage',
VocabLanguage: 'general.sectionBar.titles.language',
VocabChapter: 'general.sectionBar.titles.chapter',
VocabCourses: 'general.sectionBar.titles.courses',
VocabCourse: 'general.sectionBar.titles.course',
VocabLesson: 'general.sectionBar.titles.lesson',
FalukantCreate: 'general.sectionBar.titles.createCharacter',
FalukantOverview: 'general.sectionBar.titles.overview',
BranchView: 'general.sectionBar.titles.branch',
MoneyHistoryView: 'general.sectionBar.titles.moneyHistory',
FalukantFamily: 'general.sectionBar.titles.family',
HouseView: 'general.sectionBar.titles.house',
NobilityView: 'general.sectionBar.titles.nobility',
ReputationView: 'general.sectionBar.titles.reputation',
ChurchView: 'general.sectionBar.titles.church',
EducationView: 'general.sectionBar.titles.education',
BankView: 'general.sectionBar.titles.bank',
DirectorView: 'general.sectionBar.titles.directors',
HealthView: 'general.sectionBar.titles.health',
PoliticsView: 'general.sectionBar.titles.politics',
UndergroundView: 'general.sectionBar.titles.underground',
'Personal settings': 'general.sectionBar.titles.personalSettings',
'View settings': 'general.sectionBar.titles.viewSettings',
'Sexuality settings': 'general.sectionBar.titles.sexualitySettings',
'Flirt settings': 'general.sectionBar.titles.flirtSettings',
'Account settings': 'general.sectionBar.titles.accountSettings',
'Language assistant settings': 'general.sectionBar.titles.languageAssistantSettings',
Interests: 'general.sectionBar.titles.interests',
AdminInterests: 'general.sectionBar.titles.adminInterests',
AdminUsers: 'general.sectionBar.titles.adminUsers',
AdminUserStatistics: 'general.sectionBar.titles.adminUserStatistics',
AdminContacts: 'general.sectionBar.titles.adminContacts',
AdminUserRights: 'general.sectionBar.titles.adminUserRights',
AdminForums: 'general.sectionBar.titles.adminForums',
AdminChatRooms: 'general.sectionBar.titles.adminChatRooms',
AdminFalukantEditUserView: 'general.sectionBar.titles.adminFalukantUsers',
AdminFalukantMapRegionsView: 'general.sectionBar.titles.adminFalukantMap',
AdminFalukantCreateNPCView: 'general.sectionBar.titles.adminCreateNpc',
AdminMinigames: 'general.sectionBar.titles.adminMinigames',
AdminTaxiTools: 'general.sectionBar.titles.adminTaxiTools',
AdminServicesStatus: 'general.sectionBar.titles.adminServicesStatus'
};
export default {
@@ -93,10 +93,11 @@ export default {
},
sectionLabel() {
const found = SECTION_LABELS.find((entry) => entry.test(this.routePath));
return found?.label || 'Bereich';
return this.$t(found?.labelKey || 'general.sectionBar.sections.default');
},
pageTitle() {
return TITLE_MAP[this.$route?.name] || this.sectionLabel;
const titleKey = TITLE_MAP[this.$route?.name];
return titleKey ? this.$t(titleKey) : this.sectionLabel;
},
backTarget() {
const params = this.$route?.params || {};

View File

@@ -173,13 +173,14 @@ export default {
this.fetchSettings();
} catch (err) {
console.error('Error updating setting:', err);
showApiError(this, err, 'Änderung konnte nicht gespeichert werden.');
showApiError(this, err, 'tr:settings.feedback.updateError');
}
},
languagesList() {
return [
{ value: 'en', captionTr: 'settings.personal.languages.en' },
{ value: 'de', captionTr: 'settings.personal.languages.de' },
{ value: 'en', captionTr: 'settings.personal.language.en' },
{ value: 'de', captionTr: 'settings.personal.language.de' },
{ value: 'ceb', captionTr: 'settings.personal.language.ceb' },
];
},
convertToInt(value) {
@@ -207,7 +208,7 @@ export default {
});
} catch (err) {
console.error('Error updating visibility:', err);
showApiError(this, err, 'Sichtbarkeit konnte nicht aktualisiert werden.');
showApiError(this, err, 'tr:settings.feedback.visibilityUpdateError');
}
},
openContactDialog() {

View File

@@ -4,8 +4,8 @@
<div class="form-field">
<label for="password-reset-email">{{ $t("passwordReset.email") }}</label>
<input id="password-reset-email" type="email" v-model="email" required :class="{ 'field-error': emailTouched && !isEmailValid }" />
<span class="form-hint">Wir senden den Link an die hinterlegte E-Mail-Adresse.</span>
<span v-if="emailTouched && !isEmailValid" class="form-error">Bitte eine gültige E-Mail-Adresse eingeben.</span>
<span class="form-hint">{{ $t("passwordReset.emailHint") }}</span>
<span v-if="emailTouched && !isEmailValid" class="form-error">{{ $t("passwordReset.validation.invalidEmail") }}</span>
</div>
</div>
</DialogWidget>

View File

@@ -6,23 +6,23 @@
<div class="form-field">
<label for="register-email">{{ $t("register.email") }}</label>
<input id="register-email" type="email" v-model="email" :class="{ 'field-error': emailTouched && !isEmailValid }" />
<span v-if="emailTouched && !isEmailValid" class="form-error">Bitte eine gültige E-Mail-Adresse eingeben.</span>
<span v-if="emailTouched && !isEmailValid" class="form-error">{{ $t("register.validation.invalidEmail") }}</span>
</div>
<div class="form-field">
<label for="register-username">{{ $t("register.username") }}</label>
<input id="register-username" type="text" v-model="username" :class="{ 'field-error': usernameTouched && !isUsernameValid }" />
<span v-if="usernameTouched && !isUsernameValid" class="form-error">Der Benutzername sollte mindestens 3 Zeichen haben.</span>
<span v-if="usernameTouched && !isUsernameValid" class="form-error">{{ $t("register.validation.usernameTooShort") }}</span>
</div>
<div class="form-field">
<label for="register-password">{{ $t("register.password") }}</label>
<input id="register-password" type="password" v-model="password" :class="{ 'field-error': passwordTouched && !isPasswordValid }" />
<span class="form-hint">Mindestens 8 Zeichen.</span>
<span v-if="passwordTouched && !isPasswordValid" class="form-error">Das Passwort ist noch zu kurz.</span>
<span class="form-hint">{{ $t("register.validation.passwordHint") }}</span>
<span v-if="passwordTouched && !isPasswordValid" class="form-error">{{ $t("register.validation.passwordTooShort") }}</span>
</div>
<div class="form-field">
<label for="register-repeat-password">{{ $t("register.repeatPassword") }}</label>
<input id="register-repeat-password" type="password" v-model="repeatPassword" :class="{ 'field-error': repeatPasswordTouched && !doPasswordsMatch }" />
<span v-if="repeatPasswordTouched && !doPasswordsMatch" class="form-error">Die Passwörter stimmen nicht überein.</span>
<span v-if="repeatPasswordTouched && !doPasswordsMatch" class="form-error">{{ $t("register.passwordMismatch") }}</span>
</div>
<SelectDropdownWidget labelTr="settings.personal.label.language" :v-model="language"
tooltipTr="settings.personal.tooltip.language" :list="languages" :value="language" />
@@ -104,7 +104,9 @@ export default {
async getBrowserLanguage() {
const browserLanguage = navigator.language || navigator.languages[0];
let short = '';
if (browserLanguage.startsWith('de')) {
if (browserLanguage.startsWith('ceb') || browserLanguage.startsWith('bis')) {
short = 'ceb';
} else if (browserLanguage.startsWith('de')) {
short = 'de';
} else {
short = 'en';

View File

@@ -19,6 +19,23 @@ import enBlog from './locales/en/blog.json';
import enMinigames from './locales/en/minigames.json';
import enMessage from './locales/en/message.json';
import enPersonal from './locales/en/personal.json';
import cebGeneral from './locales/ceb/general.json';
import cebHeader from './locales/ceb/header.json';
import cebNavigation from './locales/ceb/navigation.json';
import cebHome from './locales/ceb/home.json';
import cebRegister from './locales/ceb/register.json';
import cebActivate from './locales/ceb/activate.json';
import cebError from './locales/ceb/error.json';
import cebMessage from './locales/ceb/message.json';
import cebSettings from './locales/ceb/settings.json';
import cebPasswordReset from './locales/ceb/passwordReset.json';
import cebSocialNetwork from './locales/ceb/socialnetwork.json';
import cebFriends from './locales/ceb/friends.json';
import cebChat from './locales/ceb/chat.json';
import cebPersonal from './locales/ceb/personal.json';
import cebFalukant from './locales/ceb/falukant.json';
import cebBlog from './locales/ceb/blog.json';
import cebMinigames from './locales/ceb/minigames.json';
import deGeneral from './locales/de/general.json';
import deHeader from './locales/de/header.json';
@@ -79,6 +96,43 @@ const messages = {
...enMessage,
...enPersonal,
},
ceb: {
...enGeneral,
...enHeader,
...enNavigation,
...enHome,
...enChat,
...enRegister,
...enPasswordReset,
...enError,
...enActivate,
...enSettings,
...enAdmin,
...enSocialNetwork,
...enFriends,
...enFalukant,
...enBlog,
...enMinigames,
...enMessage,
...enPersonal,
...cebGeneral,
...cebHeader,
...cebNavigation,
...cebHome,
...cebRegister,
...cebActivate,
...cebError,
...cebMessage,
...cebSettings,
...cebPasswordReset,
...cebSocialNetwork,
...cebFriends,
...cebChat,
...cebPersonal,
...cebFalukant,
...cebBlog,
...cebMinigames,
},
de: {
'Ok': 'Ok',
...deGeneral,

View File

@@ -0,0 +1,9 @@
{
"activate": {
"title": "I-activate ang access",
"message": "Kumusta {username}. Palihog isulod ang code nga among gipadala pinaagi sa email.",
"token": "Token:",
"submit": "Ipadala",
"failure": "Wala molampos ang activation."
}
}

View File

@@ -0,0 +1,61 @@
{
"blog": {
"posts": "Mga post",
"noPosts": "Walay mga post.",
"newPost": "Pagsulat og bag-ong post",
"title": "Pamagat",
"publish": "I-publish",
"pickImage": "Pilia ang hulagway",
"uploadImage": "I-upload ang hulagway",
"list": {
"eyebrow": "Mga community blog",
"title": "Mga blog",
"intro": "Mga artikulo, update sa proyekto ug personal nga mga panan-aw gikan sa komunidad sa YourPart.",
"create": "Paghimo og bag-ong blog",
"loading": "Nag-load…",
"empty": "Walay blog nga nakit-an.",
"by": "gikan kang",
"unknownAuthor": "Wala mailhi",
"open": "Ablihi ang blog",
"fallbackExcerpt": "Mga public nga entry, hunahuna ug update sa proyekto gikan sa komunidad."
},
"view": {
"loading": "Nag-load…",
"edit": "Usba",
"entriesCount": "{count} ka entry",
"empty": "Walay mga entry.",
"fallbackDescription": "Public nga community blog sa YourPart.",
"notFoundTitle": "Wala makit-i ang blog | YourPart",
"notFoundDescription": "Dili ma-load ang gipangayong blog."
},
"editor": {
"createTitle": "Paghimo og blog",
"editTitle": "Usba ang blog",
"description": "Deskripsyon",
"visibility": "Visibility",
"visibilityPublic": "Public",
"visibilityLoggedIn": "Mga naka-login nga user lang",
"ageRange": "Sakop sa edad",
"gender": "Gender",
"genderMale": "Lalaki",
"genderFemale": "Babaye",
"save": "I-save",
"newPostTitle": "Bag-ong post",
"addPost": "Idugang ang post",
"shareTitle": "Ipaambit ang blog",
"url": "URL",
"copyLink": "Kopyaha ang link",
"shareToFriends": "Ipadala sa mga higala",
"emailAddresses": "Mga e-mail address (bulag sa comma)",
"send": "Ipadala",
"restrictedHint": "Pahimangno: dili public kini nga blog. Basin magkinahanglan og login ug hustong edad/gender permissions ang makadawat.",
"invalidAgeRange": "Dili balido ang sakop sa edad.",
"copySuccess": "Nakopya ang link",
"copyError": "Napakyas ang pagkopya",
"shareError": "Napakyas ang pagpaambit",
"emailError": "Napakyas ang pagpadala sa e-mail",
"friendsSent": "Napadala sa {count} ka higala.",
"emailsSent": "{count} ka e-mail ang napadala."
}
}
}

View File

@@ -0,0 +1,158 @@
{
"chat": {
"multichat": {
"title": "Multi Chat",
"eroticTitle": "Erotic chat",
"autoscroll": "Auto scroll",
"options": "Mga kapilian",
"send": "Ipadala",
"shout": "Singgit",
"action": "Aksyon",
"roll": "Roll",
"colorpicker": "Pilia ang kolor",
"colorpicker_preview": "Preview: kini nga mensahe mogamit sa napiling kolor.",
"hex": "HEX",
"invalid_hex": "Dili balido nga HEX value",
"hue": "Hue",
"saturation": "Saturation",
"lightness": "Lightness",
"ok": "Ok",
"cancel": "I-cancel",
"placeholder": "Isulat ang mensahe…",
"action_select_user": "Palihog pagpili og user",
"action_to": "Aksyon ngadto kang {to}",
"action_phrases": {
"left_room": "mibalhin sa room",
"leaves_room": "mibiya sa room",
"left_chat": "mibiya na sa chat."
},
"system": {
"room_entered": "Misulod ka sa room nga \"{room}\".",
"user_entered_room": "Misulod si {user} sa room.",
"user_left_room": "Mibiya si {user} sa room.",
"color_changed_self": "Giusab nimo ang imong kolor ngadto sa {color}.",
"color_changed_user": "Giusab ni {user} ang iyang kolor ngadto sa {color}."
},
"status": {
"connecting": "Nagkonektar…",
"connected": "Nakakonektar",
"disconnected": "Naputol ang koneksyon",
"error": "Sayop sa koneksyon"
},
"reloadRooms": "I-reload ang mga room",
"createRoom": {
"toggleShowChat": "Ipakita ang chat",
"toggleCreateRoom": "Paghimo og room",
"title": "Paghimo og bag-ong room",
"commandPrefix": "Command",
"labels": {
"roomName": "Ngalan sa room",
"visibility": "Visibility",
"gender": "Gender",
"minAge": "Pinakagamay nga edad",
"maxAge": "Pinakadako nga edad",
"password": "Password",
"rightId": "Gikinahanglang right",
"typeId": "Room type",
"friendsOnly": "friends_only=true"
},
"placeholders": {
"roomName": "pananglitan Lounge",
"password": "walay spaces"
},
"options": {
"none": "(wala)",
"visibilityPublic": "Public",
"visibilityPrivate": "Private",
"genderMale": "Lalaki",
"genderFemale": "Babaye",
"genderAny": "Bisan kinsa / walay limitasyon"
},
"actions": {
"create": "Paghimo og room",
"reset": "I-reset"
},
"validation": {
"roomNameRequired": "Gikinahanglan ang ngalan sa room.",
"minAgeInvalid": "Ang min_age kinahanglan >= 0.",
"maxAgeInvalid": "Ang max_age kinahanglan >= 0.",
"ageRangeInvalid": "Dili puwede nga mas dako ang min_age kaysa max_age.",
"passwordSpaces": "Ang password dili puwedeng adunay spaces.",
"rightIdInvalid": "Ang right_id kinahanglan > 0.",
"typeIdInvalid": "Ang type_id kinahanglan > 0."
},
"messages": {
"noConnection": "Walay koneksyon sa chat server.",
"invalidForm": "Palihog ayuha ang mga input sa room form.",
"roomNameMissing": "Palihog isulod ang ngalan sa room.",
"sent": "Napadala na ang room creation: {command}",
"created": "Malampuson nga nahimo ang room nga \"{room}\".",
"createNotConfirmed": "Ang room nga \"{room}\" wala pa makumpirma. Palihog susiha ang room list."
},
"ownedRooms": {
"title": "Akong mga nahimong room",
"hint": "Tangtanga pinaagi sa daemon command: /dr <roomname> (alias: /delete_room <roomname>)",
"empty": "Wala ka pay kaugalingong room.",
"public": "public",
"private": "private",
"confirmDelete": "Tinuod ba nga gusto nimong tangtangon ang room nga \"{room}\"?",
"deleteSent": "Napadala na ang delete command: /dr {room}",
"deleteError": "Dili matangtang ang room."
},
"rights": {
"mainadmin": "Pangunang administrador",
"contactrequests": "Mga request sa kontak",
"users": "Mga user",
"userrights": "Mga katungod sa user",
"forum": "Forum",
"interests": "Mga interes",
"falukant": "Falukant",
"minigames": "Mini games",
"match3": "Match3",
"taxiTools": "Taxi tools",
"chatrooms": "Chat rooms",
"servicesStatus": "Status sa serbisyo"
},
"types": {}
},
"password": {
"title": "Gikinahanglan ang password",
"inputLabel": "Isulod ang password",
"submit": "Sulod sa room",
"cancel": "I-cancel",
"requiredPrompt": "Ang room nga \"{room}\" gi-protektahan og password. Palihog isulod ang password:",
"invalidPrompt": "Sayop ang password para sa \"{room}\". Palihog sulayi pag-usab:",
"cancelled": "Nakansela ang pagsulod sa \"{room}\".",
"empty": "Dili puwedeng walay sulod ang password."
}
},
"randomchat": {
"title": "Random Chat",
"close": "Isira",
"age": "Edad",
"gender": {
"title": "Gender",
"female": "Babaye",
"male": "Lalaki"
},
"agerange": "Sakop sa edad",
"gendersearch": "Pagpangita sumala sa gender",
"camonly": "Cam lang",
"showcam": "Ipakita ang cam",
"addfriend": "Idugang isip higala",
"autosearch": "Auto search",
"input": "Input",
"start": "Sugdi",
"waitingForMatch": "Naghulat og ka-match...",
"chatpartner": "Nakig-chat ka karon sa usa ka <gender> nga tawo nga <age> ka tuig ang panuigon.",
"partnergenderm": "lalaki",
"partnergenderf": "babaye",
"self": "Ikaw",
"partner": "Kaatbang",
"jumptonext": "Tapusa kining chat",
"userleftchat": "Mibiya na ang ka-chat sa panag-istorya.",
"startsearch": "Pangita sa sunod nga panag-istorya",
"selfstopped": "Mibiya ka sa panag-istorya."
}
}
}

View File

@@ -0,0 +1,7 @@
{
"error": {
"title": "Adunay nahitabo nga sayop",
"close": "Isira",
"credentialsinvalid": "Dili husto ang imong login data."
}
}

View File

@@ -0,0 +1,509 @@
{
"falukant": {
"weather": {
"sunny": "Adlawon",
"cloudy": "Dag-um",
"rainy": "Ulanon",
"stormy": "Bagyo",
"snowy": "Nag-niyebe",
"foggy": "Mahaw-ang",
"windy": "Mahangin",
"clear": "Klaro"
},
"debtorsPrison": {
"actionBlocked": "Kini nga aksyon gi-block samtang naa ka sa debtors' prison.",
"globalWarning": "Ang imong kalangan sa utang nagsugod na og limit sa imong mga aksyon. Posible nga mosunod dayon ang pinugos nga mga lakang.",
"globalLocked": "Naa ka sa debtors' prison. Hapit tanan aktibong aksyon sa Falukant karon gi-block."
},
"messages": {
"title": "Mga mensahe",
"tooltip": "Mga mensahe",
"empty": "Walay mga mensahe.",
"markAllRead": "Timan-i tanan isip nabasa"
},
"notifications": {
"notify_election_created": "Giskedyul ang usa ka bag-ong eleksiyon.",
"director_death": "Namatay si {characterName} sa edad nga {ageYears}. Isip amo, kinahanglan kang magtudlo og bag-ong direktor.{regionLabel}{spouses}{children}{lovers}",
"relationship_death": "Namatay si {characterName} sa edad nga {ageYears}.{regionLabel}{spouses}{children}{lovers}",
"child_death": "Namatay ang imong anak nga si {characterName} sa edad nga {ageYears}.{regionLabel}",
"production": {
"overproduction": "Sobra nga produksyon: ang imong produksyon kay {value}% mas taas kaysa panginahanglan."
},
"transport": {
"waiting": "Naghulat ang transport",
"modes": {
"land": "Yuta",
"water": "Tubig",
"unknown": "Wala mailhi"
},
"speed": {
"1": "Hinay",
"2": "Katamtaman",
"3": "Paspas",
"4": "Pinakapaspas",
"unknown": "Wala mailhi"
}
},
"random_event": {
"windfall": {
"title": "Kalit nga swerte",
"description": "Nakakita ka og nakalimtang pitaka sa dalan. Nadawat nimo ang {amount}."
},
"theft": {
"title": "Kawat",
"description": "Adunay kawatan nga nagkuha sa bahin sa imong kuwarta. Kawala: {amount}."
},
"warehouse_fire": {
"title": "Sunog sa bodega",
"description": "Ang sunog nakadaot sa bahin sa imong bodega.{damagePercent}{destructionPercent}"
},
"character_illness": {
"title": "Sakit",
"description": "Nagsakit si {characterName} ug nawad-an og {healthChange} health."
},
"character_recovery": {
"title": "Pagkamaayo",
"description": "Naayo si {characterName} gikan sa sakit ug nabawi ang {healthChange} health."
},
"character_accident": {
"title": "Aksidente",
"description": "Ang grabe nga aksidente nakapasakit pag-ayo kang {characterName}. Health: {healthChange}."
},
"sudden_infant_death": {
"title": "Kalit nga pagkamatay sa masuso",
"description": "Kalit nga namatay si {characterName}."
},
"regional_storm": {
"title": "Bagyo sa rehiyon",
"description": "Grabe nga bagyo ang miigo sa rehiyon nga {regionName}."
},
"regional_festival": {
"title": "Pista sa rehiyon",
"description": "Adunay dakong pista sa rehiyon nga {regionName}."
},
"regional_epidemic": {
"title": "Epidemya",
"description": "Naigo sa epidemya ang rehiyon nga {regionName}."
},
"earthquake": {
"title": "Linog",
"description": "Naigo sa linog ang rehiyon nga {regionName}."
}
}
},
"statusbar": {
"age": "Edad",
"wealth": "Kadato",
"health": "Panglawas",
"events": "Mga panghitabo",
"relationship": "Relasyon",
"children": "Mga anak",
"children_unbaptised": "Mga anak nga wala pa mabunyagi"
},
"overview": {
"title": "Falukant - Overview",
"heroIntro": "Ang imong kahimtang sa ekonomiya, pamilya ug kabtangan sa usa ka mubo ug klarong overview.",
"heirSelection": {
"title": "Pagpili og manununod",
"description": "Dili na magamit ang imong daang karakter. Pagpili og manununod gikan sa lista aron magpadayon sa duwa.",
"loading": "Nag-load sa posibleng mga manununod…",
"noHeirs": "Walay available nga mga manununod.",
"select": "Pilia isip play character",
"error": "Sayop sa pagpili sa manununod."
},
"metadata": {
"title": "Personal",
"name": "Ngalan",
"money": "Kadato",
"age": "Edad",
"years": "Tuig",
"days": "Adlaw",
"mainbranch": "Pulong-balay nga siyudad",
"nobleTitle": "Titulo",
"certificate": "Sertipiko"
},
"certificate": {
"title": "Progreso sa sertipiko",
"description": "Nagpakita sa imong karon nga level ug sa mga kinahanglanon para sa sunod nga promotion.",
"current": "Karon",
"next": "Sunod nga level",
"levelMatrix": "Mga produkto per certificate level",
"levelLabel": "Level {level}",
"score": "Puntos",
"ready": "Andam na para sa sunod nga promotion",
"notReady": "Wala pa maabot ang mga kinahanglanon",
"factors": "Karon nga mga bili",
"requirements": "Mga kinahanglanon sa sunod nga level"
},
"summary": {
"certificateHint": "Mao kini ang nagbuot kung unsang mga kategoriya sa produkto ang pwede nimong himuon karon.",
"branches": "Mga branch",
"branchesHint": "Direktang access sa imong labing importante nga mga lokasyon sa negosyo.",
"productions": "Aktibong mga produksyon",
"productionsHint": "Mga produksyon nga nagdagan ug hapit nang mahuman o manginahanglan og pagtan-aw.",
"stock": "Mga posisyon sa stock",
"stockHint": "Mubo nga tan-aw sa mga baligya ug stock sa tanang rehiyon.",
"open": "Ablihi"
}
},
"health": {
"amazing": "Maayo kaayo",
"good": "Maayo",
"normal": "Normal",
"bad": "Dili maayo",
"very_bad": "Daotan kaayo"
},
"moneyHistory": {
"title": "Kasaysayan sa kuwarta",
"filter": "Filter",
"search": "I-apply ang filter",
"activity": "Kalihokan",
"moneyBefore": "Kuwarta sa wala pa ang transaksyon",
"moneyAfter": "Kuwarta human sa transaksyon",
"changeValue": "Kausaban sa bili",
"time": "Oras",
"prev": "Nangagi",
"next": "Sunod",
"graph": {
"open": "Ipakita ang graph",
"title": "Kuwarta sa paglabay sa panahon",
"close": "Isira",
"loading": "Nag-load sa history...",
"noData": "Walay entry sa napiling panahon.",
"yesterday": "Kagahapon",
"range": {
"label": "Sakop",
"today": "Karon",
"24h": "Kataposang 24 ka oras",
"week": "Kataposang semana",
"month": "Kataposang bulan",
"year": "Kataposang tuig",
"all": "Tibuok history"
}
},
"activities": {
"Product sale": "Pagbaligya sa produkto",
"Production cost": "Gasto sa produksyon",
"Sell all products": "Ibaligya ang tanang produkto",
"sell products": "Ibaligya ang mga produkto",
"director starts production": "Nagsugod ang direktor og produksyon",
"director payed out": "Nabayran ang sweldo sa direktor",
"create_branch": "Nahimo ang branch",
"buy_vehicles": "Napamalit ang transport vehicles",
"build_vehicles": "Nabuhat ang transport vehicles",
"transport": "Transport",
"Marriage cost": "Gasto sa kasal",
"marriage_gift": "Regalo sa asawa/bana",
"Gift cost": "Gasto sa regalo",
"lover maintenance": "Maintenance sa karelasyon",
"servants_monthly": "Nabayran ang mga sulugoon",
"servants_hired": "Nakuha ang mga sulugoon",
"household_order": "Gi-order ang household",
"housebuy": "Pagpalit og balay",
"Baptism": "Bunyag",
"credit taken": "Nakuhaan og credit",
"new nobility title": "Bag-ong titulo sa kadungganan",
"partyOrder": "Gi-order ang party",
"renovation_all": "Kompleto nga gi-renovate ang balay"
}
},
"house": {
"title": "Balay",
"debtorsPrison": {
"houseWarning": "Samtang nagkadako ang kalangan sa utang, nagkataas ang risgo sa pagsakmit ug pinugos nga pagkawala sa balay.",
"houseRisk": "Ang imong balay apil na karon sa posibleng pinugos nga liquidation."
},
"statusreport": "Kondisyon sa balay",
"element": "Elemento",
"state": "Kondisyon",
"buyablehouses": "Pagpalit og balay",
"buy": "Palita",
"price": "Presyo sa pagpalit",
"worth": "Nabiling bili",
"sell": "Ibaligya",
"sellConfirm": "Tinuod ba nga gusto nimong ibaligya ang imong balay?",
"sellSuccess": "Nabaligya na ang balay.",
"sellError": "Dili mabaligya ang balay.",
"buySuccess": "Napamalit na ang balay.",
"buyError": "Dili mapalit ang balay.",
"renovate": "Renovate",
"renovateAll": "I-renovate tanan",
"servants": {
"title": "Mga sulugoon",
"description": "Dumala sa household staff, kahapsay ug balik-balik nga gasto sa imong panimalay.",
"count": "Ihap sa mga sulugoon",
"expectedRange": "Gipaabot nga sakop",
"monthlyCost": "Binuwan nga gasto",
"quality": "Kalidad",
"householdOrder": "Household order",
"payLevel": "Antas sa bayad"
},
"status": {
"roofCondition": "Atop",
"wallCondition": "Mga bungbong",
"floorCondition": "Salog",
"windowCondition": "Mga bintana"
},
"type": {
"backyard_room": "Kuwarto sa likod-balay",
"wooden_house": "Kahoyng balay",
"straw_hut": "Payag nga kugon",
"family_house": "Balay-pamilya",
"townhouse": "Townhouse"
}
},
"newdirector": {
"title": "Bag-ong direktor",
"age": "Edad",
"salary": "Sweldo",
"skills": "Kahanas",
"product": "Produkto",
"knowledge": "Kahibalo",
"hire": "Kuhon",
"noProposals": "Walay available nga mga kandidato alang sa direktor."
},
"branch": {
"title": "Branch",
"heroEyebrow": "Branch",
"heroIntro": "Produksyon, storage, pagbaligya ug transport sa usa ka control area nga naa sa kalibotan sa duwa.",
"debtorsPrison": {
"branchLocked": "Samtang naa sa debtors' prison, gi-block ang bag-ong mga lakang pang-ekonomiya.",
"branchRisk": "Ang imong kalangan sa utang nagbutang sa imong mga branch, sakyanan ug gitigom nga mga butang sa peligro.",
"selectionBlocked": "Gi-block ang bag-ong pagpamuhunan samtang napriso tungod sa utang."
},
"currentCertificate": "Karon nga sertipiko",
"certificate": {
"title": "Mga product unlock",
"description": "Nagpakita kung unsang mga produkto ang ma-unlock sa imong karon nga sertipiko ug unsa ang madugang sa sunod nga level.",
"currentUnlocks": "Karon nga na-unlock",
"nextUnlocks": "Bag-o sa level {level}"
},
"selection": {
"title": "Pagpili sa branch",
"selected": "Napiling branch",
"placeholder": "Wala pay napiling branch",
"selectedcity": "Napiling siyudad",
"weather": "Karon nga panahon"
},
"director": {
"income": "Kita",
"incomeUpdated": "Malampuson nga na-update ang sweldo.",
"starttransport": "Makapagsugod og transport"
},
"sale": {
"runningGuards": "Mga guwardiya"
},
"production": {
"title": "Produksyon",
"info": "Mga detalye bahin sa produksyon sa branch.",
"selectProduct": "Pilia ang produkto",
"quantity": "Kadaghanon",
"storageAvailable": "Libre nga storage",
"cost": "Gasto",
"duration": "Kadugayon",
"revenue": "Kita",
"start": "Sugdi ang produksyon",
"success": "Malampuson nga nasugdan ang produksyon!",
"error": "Sayop sa pagsugod sa produksyon.",
"minutes": "Mga minuto",
"ending": "Matapos sa:",
"time": "Oras",
"current": "Nagpadagan nga mga produksyon",
"product": "Produkto",
"remainingTime": "Nabiling oras (segundo)",
"status": "Status",
"sleep": "Gi-pause",
"active": "Aktibo",
"noProductions": "Walay nagdagan nga produksyon."
},
"columns": {
"city": "Siyudad",
"type": "Type"
},
"types": {
"production": "Produksyon",
"store": "Pagbaligya",
"fullstack": "Produksyon uban sa pagbaligya"
},
"revenue": {
"title": "Kita sa produkto",
"product": "Produkto",
"absolute": "Kita (absoluto)",
"perMinute": "Kita kada minuto",
"expand": "Ipakita ang kita",
"collapse": "Tagoa ang kita",
"knowledge": "Kahibalo sa produkto",
"profitAbsolute": "Tibuok ganansya",
"profitPerMinute": "Ganansya kada minuto",
"betterPrices": "Mas maayong presyo sa ubang lugar"
},
"vehicles": {
"cargo_cart": "Cargo cart",
"ox_cart": "Kariton nga baka",
"small_carriage": "Gamayang karwahe",
"large_carriage": "Dako nga karwahe",
"four_horse_carriage": "Upat-ka-kabayo nga karwahe",
"raft": "Balsa",
"sailing_ship": "Barko nga layag"
},
"transport": {
"guardCount": "Mga guwardiya",
"guardHint": "Dugang nga gasto para sa mga guwardiya: {cost}"
},
"tabs": {
"director": "Direktor",
"inventory": "Inventory",
"production": "Produksyon",
"storage": "Storage",
"transport": "Transport",
"taxes": "Mga buhis"
}
},
"nobility": {
"highestPoliticalOffice": "Pinakataas nga politikal nga opisina",
"highestOfficeAny": "Pinakataas nga opisina sa kinatibuk-an",
"none": "wala",
"cooldown": "Makapaningkamot ka pag-usab sa {date}."
},
"mood": {
"happy": "Malipayon",
"sad": "Masulub-on",
"angry": "Masuko",
"calm": "Kalma",
"nervous": "Nerbiyos",
"excited": "Excited",
"bored": "Gikapoy",
"fearful": "Nahadlok",
"confident": "Masaligon",
"curious": "Interesado"
},
"character": {
"brave": "Maisog",
"kind": "Maayo",
"greedy": "Hakog",
"wise": "Maalamon",
"loyal": "Matinumanon",
"cunning": "Tig-ihap",
"generous": "Mapinanggaon",
"arrogant": "Mapahitas-on",
"honest": "Matinuoron",
"ambitious": "Ambisyoso"
},
"healthview": {
"title": "Panglawas",
"age": "Edad",
"status": "Status sa panglawas",
"measuresTaken": "Mga gihimong lakang",
"measure": "Lakang",
"date": "Petsa",
"cost": "Gasto",
"success": "Kalampusan",
"selectMeasure": "Pilia ang lakang",
"perform": "Buhata",
"choose": "Palihog pagpili",
"nextMeasureAt": "Sunod nga lakang gikan sa"
},
"branchProduction": {
"storageAvailable": "Libre nga storage"
},
"politics": {
"title": "Politika",
"tabs": {
"current": "Karon nga posisyon",
"upcoming": "Umaabot nga mga posisyon",
"elections": "Mga eleksiyon"
},
"bookmarkCandidate": "Timan-i kining kandidatura",
"voteError": "Sayop sa paghatag sa boto",
"voteAllError": "Sayop sa paghatag sa mga boto",
"applyError": "Dili mapadala ang aplikasyon."
},
"family": {
"title": "Pamilya",
"heroIntro": "Mga relasyon, mga anak ug pag-uswag — gihikay pinaagi sa seksyon sa ubos.",
"summary": {
"partnerChip": "Kapikas",
"childrenChip": "Mga anak",
"loversChip": "Mga affair",
"proposalsAvailable": "Adunay proposal",
"noPartner": "Walay kapikas"
},
"tabs": {
"partner": "Kapikas ug kasal",
"children": "Mga anak",
"lovers": "Mga affair"
}
},
"church": {
"title": "Simbahan",
"tabs": {
"baptism": "Bunyag",
"current": "Karon nga mga posisyon",
"available": "Available nga mga posisyon",
"applications": "Mga aplikasyon"
}
},
"bank": {
"title": "Bangko",
"account": {
"title": "Account",
"balance": "Balanse",
"totalDebt": "Tibuok utang",
"maxCredit": "Pinakataas nga credit",
"availableCredit": "Available nga credit"
},
"credits": {
"title": "Mga credit",
"none": "Wala kay mga credit karon.",
"amount": "Kantidad",
"remaining": "Nabilin",
"interestRate": "Interest rate"
}
},
"reputation": {
"title": "Reputasyon",
"overview": {
"title": "Overview",
"current": "Karon nga reputasyon"
},
"actions": {
"title": "Mga aksyon sa reputasyon",
"description": "Makabuhat ka og lainlaing aksyon aron mapauswag ang imong reputasyon.",
"none": "Walay available nga aksyon sa reputasyon.",
"action": "Aksyon",
"cost": "Gasto",
"gain": "Nadugang",
"timesUsed": "Gigamit",
"execute": "Buhata"
},
"party": {
"title": "Mga party",
"totalCost": "Tibuok gasto",
"order": "Umara og party",
"inProgress": "Mga party nga giandam",
"completed": "Nahuman nga mga party"
}
},
"underground": {
"title": "Underground",
"tabs": {
"activities": "Mga kalihokan",
"attacks": "Mga pag-atake"
},
"activities": {
"none": "Walay available nga kalihokan.",
"create": "Paghimo og bag-ong kalihokan",
"type": "Type sa kalihokan",
"victim": "Target nga tawo",
"cost": "Gasto",
"status": "Status"
},
"attacks": {
"target": "Tig-atake",
"date": "Petsa",
"success": "Kalampusan",
"none": "Walay natala nga mga pag-atake."
}
}
}
}

View File

@@ -0,0 +1,23 @@
{
"friends": {
"title": "Mga higala",
"tabs": {
"existing": "Naa na",
"rejected": "Gibalibaran",
"pending": "Naghulat",
"requested": "Gihangyo"
},
"actions": {
"end": "Tapusa",
"accept": "Dawata",
"reject": "Balibari",
"withdraw": "Bawia"
},
"headers": {
"name": "Ngalan",
"age": "Edad",
"gender": "Gender",
"actions": "Mga aksyon"
}
}
}

View File

@@ -0,0 +1,117 @@
{
"welcome": "Maayong pag-abot sa YourPart",
"imprint": {
"title": "Imprint",
"button": "Imprint"
},
"dataPrivacy": {
"title": "Patakaran sa pagpanalipod sa datos",
"button": "Pagpanalipod sa datos"
},
"contact": {
"title": "Kontak",
"button": "Kontak"
},
"error-title": "Sayop",
"warning-title": "Pasidaan",
"info-title": "Impormasyon",
"general": {
"loading": "Nagkarga...",
"back": "Balik",
"cancel": "Kanselahon",
"ok": "OK",
"yes": "Oo",
"no": "Dili"
},
"OK": "Ok",
"Cancel": "Kanselahon",
"yes": "Oo",
"no": "Dili",
"message": {
"close": "Isira"
},
"gender": {
"male": "Lalaki",
"female": "Babaye",
"transmale": "Trans nga lalaki",
"transfemale": "Trans nga babaye",
"nonbinary": "Dili binaryo"
},
"common": {
"edit": "Usba",
"delete": "Tangtanga",
"create": "Paghimo",
"update": "I-update",
"save": "I-save",
"add": "Idugang",
"cancel": "Kanselahon",
"yes": "Oo",
"no": "Dili"
},
"sectionBar": {
"sections": {
"default": "Seksyon",
"falukant": "Falukant",
"vocab": "Trainer sa bokabularyo",
"forum": "Forum",
"community": "Komunidad",
"settings": "Mga setting",
"administration": "Administrasyon",
"minigames": "Mga minigame",
"personal": "Personal",
"blog": "Blog"
},
"titles": {
"friends": "Mga higala",
"guestbook": "Guestbook",
"search": "Pagpangita",
"gallery": "Galeriya",
"forum": "Forum",
"topic": "Hilisgutan",
"diary": "Talaarawan",
"languages": "Mga pinulongan",
"newLanguage": "Bag-ong pinulongan",
"subscribeLanguage": "Mag-subscribe sa pinulongan",
"language": "Pinulongan",
"chapter": "Kapitulo",
"courses": "Mga kurso",
"course": "Kurso",
"lesson": "Leksiyon",
"createCharacter": "Paghimo og karakter",
"overview": "Kinatibuk-an",
"branch": "Sangang opisina",
"moneyHistory": "Kasaysayan sa kuwarta",
"family": "Pamilya",
"house": "Balay",
"nobility": "Kadungganan",
"reputation": "Dungog",
"church": "Simbahan",
"education": "Edukasyon",
"bank": "Bangko",
"directors": "Mga direktor",
"health": "Panglawas",
"politics": "Politika",
"underground": "Ilalom nga kalibutan",
"personalSettings": "Personal nga datos",
"viewSettings": "Panagway",
"sexualitySettings": "Sekswalidad",
"flirtSettings": "Flirt",
"accountSettings": "Account",
"languageAssistantSettings": "Language assistant",
"interests": "Mga interes",
"adminInterests": "Pagdumala sa interes",
"adminUsers": "Mga user",
"adminUserStatistics": "Estadistika sa user",
"adminContacts": "Mga hangyo sa kontak",
"adminUserRights": "Mga katungod",
"adminForums": "Pagdumala sa forum",
"adminChatRooms": "Mga chat room",
"adminFalukantUsers": "Mga user sa Falukant",
"adminFalukantMap": "Mapa sa Falukant",
"adminCreateNpc": "Paghimo og NPC",
"adminMinigames": "Pagdumala sa Match3",
"adminTaxiTools": "Mga himan sa taxi",
"adminServicesStatus": "Status sa serbisyo"
}
}
}

View File

@@ -0,0 +1,5 @@
{
"logo": "Logo",
"title": "YourPart",
"advertisement": "Anunsyo"
}

View File

@@ -0,0 +1,46 @@
{
"home": {
"betaNoticeLabel": "Pahibalo sa beta:",
"betaNoticeText": "Ang YourPart padayon pang gihimo. Adunay mga feature nga wala pa mahuman, adunay impormasyon nga kulang pa, ug posible pa nga adunay mga kausaban.",
"nologin": {
"welcome": "Maayong pag-abot sa yourPart",
"description": "Ang yourPart usa ka social network diin makapangita ka og mga higala ug makaila og bag-ong mga tawo. Makapaambit ka og mga hulagway ug makapili kinsa ang makakita niini. Makapadala usab ka og mga mensahe ug makig-chat sa dagkong public rooms o sa gamay nga random chat.",
"introHtml": "Ang YourPart usa ka nagtubo nga plataporma nga naghiusa sa community features, real-time chat, forum, social network nga adunay photo gallery, ug sa city-builder game nga <em>Falukant</em>. Beta pa karon ang site ug padayon pa namong palapdan ang features, sulod ug kalig-on.",
"expected": {
"title": "Unsa ang imong mapaabot",
"items": {
"chat": "<strong>Chat</strong>: Mga public room, random nga panagkita ug mga color adjustment.",
"social": "<strong>Social network</strong>: Profile, mga higala, photo gallery nga adunay visibility controls.",
"forum": "<strong>Forum</strong>: Paghimo og mga topic, pagsulat og mga post, role-based moderation.",
"falukant": "<strong>Falukant</strong>: Ekonomiya ug kinabuhi - pagdumala sa mga sanga, paghimo, pagtipig ug pagbaligya.",
"minigames": "<strong>Mini games</strong>: pananglitan Match-3 levels para sa mubo nga kalingawan.",
"multilingual": "<strong>Daghang pinulongan</strong>: Aleman/Iningles - padayon pang gidugangan ang sulod."
}
},
"falukantShort": {
"title": "Falukant - sa mubo",
"text": "Sa Falukant, magdumala ka og negosyo, motukod og kahibalo, mo-optimize sa produksyon ug baligya, motan-aw sa presyo ug motubag sa mga panghitabo. Ang mga notification motug-an sa mga kausaban sa status sa tinuod nga oras."
},
"privacyBeta": {
"title": "Privacy ug beta status",
"text": "Beta pa ang YourPart. Posible pa ang mga kausaban, outage ug kulang nga mga hubad. Importante kanamo ang privacy ug transparency; dugang impormasyon moabot samtang nagpadayon ang beta."
},
"getStarted": {
"title": "Sugdi na",
"text": "Pwede na nimo gamiton, sulayan ug hatagan og feedback. Pagrehistro pinaagi sa “{register}” o sugdi ang random chat."
},
"randomchat": "Random chat",
"startrandomchat": "Sugdi ang random chat",
"login": {
"name": "Login name",
"namedescription": "Isulod ang imong username",
"password": "Password",
"passworddescription": "Isulod ang imong password",
"lostpassword": "Nakalimot sa password",
"register": "Pagrehistro sa yourPart",
"stayLoggedIn": "Magpabiling naka-login",
"submit": "Mo-login"
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"message": {
"title": "Mensahe",
"close": "Isira",
"test": "Nagtrabaho ang test",
"success": "Malampuson ang aksyon."
}
}

View File

@@ -0,0 +1,107 @@
{
"minigames": {
"title": "Minigames",
"description": "Susiha ang koleksiyon sa makalingaw nga minigames!",
"play": "Dula",
"backToGames": "Balik sa mga dula",
"comingSoon": {
"title": "Moabot na",
"description": "Mas daghang nindot nga mga dula ang gihimo pa!"
},
"match3": {
"title": "Match 3 - Kampanya sa mga hiyas",
"description": "Ipahiusa ang tulo o labaw pa ka magkaparehong hiyas aron makakuha og puntos!",
"campaignDescription": "Dulaa ang tanang level ug tigoma ang mga bituon!",
"gameStats": "Mga estadistika sa dula",
"score": "Puntos",
"moves": "Mga lihok",
"currentLevel": "Karon nga level",
"level": "Level",
"stars": "Mga bituon",
"movesLeft": "Nabiling mga lihok",
"restartLevel": "Sugdi pag-usab ang level",
"pause": "Pause",
"resume": "Padayona",
"paused": "Gi-pause ang dula",
"levelComplete": "Nahuman ang level!",
"levelScore": "Puntos sa level",
"movesUsed": "Gigamit nga mga lihok",
"starsEarned": "Nakuha nga mga bituon",
"nextLevel": "Sunod nga level",
"campaignComplete": "Nahuman ang kampanya!",
"totalScore": "Kinatibuk-ang puntos",
"totalStars": "Kinatibuk-ang mga bituon",
"levelsCompleted": "Nahuman nga mga level",
"restartCampaign": "Sugdi pag-usab ang kampanya",
"nextStep": "Sunod nga lakang",
"objectivesCollapse": "I-collapse ang mga tumong",
"objectivesShow": "Ipakita ang mga tumong",
"objectives": "Mga tumong",
"loadingBoard": "Ginaandam ang game board...",
"loadingHint": "Ang datos sa level, mga tumong ug layout sa board gi-sync pa."
},
"taxi": {
"title": "Taxi Simulator",
"description": "Pagdrayb sa mga pasahero palibot sa siyudad ug pagpangwarta!",
"gameStats": "Mga estadistika sa dula",
"score": "Puntos",
"money": "Kuwarta",
"passengers": "Mga pasahero",
"currentLevel": "Karon nga level",
"level": "Level",
"fuel": "Gasolina",
"fuelLeft": "Nabiling gasolina",
"restartLevel": "Sugdi pag-usab ang level",
"pause": "Pause",
"resume": "Padayona",
"paused": "Gi-pause ang dula",
"levelComplete": "Nahuman ang level!",
"levelScore": "Puntos sa level",
"moneyEarned": "Nakwarta",
"passengersDelivered": "Nahatud nga mga pasahero",
"nextLevel": "Sunod nga level",
"campaignComplete": "Nahuman ang kampanya!",
"totalScore": "Kinatibuk-ang puntos",
"totalMoney": "Kinatibuk-ang kuwarta",
"levelsCompleted": "Nahuman nga mga level",
"restartCampaign": "Sugdi pag-usab ang kampanya",
"pickupPassenger": "Sakya ang pasahero",
"deliverPassenger": "Ihatod ang pasahero",
"refuel": "Magpuno og gasolina",
"startEngine": "Paandara ang makina",
"stopEngine": "Patya ang makina",
"controls": "Kontrol",
"accelerate": "Paspasa",
"brake": "Prino",
"steerRight": "Liko sa tuo",
"steerLeft": "Liko sa wala",
"goals": "Mga tumong",
"avoidCollisions": "Likayi ang bangga sa ubang sakyanan",
"streetNames": "Mga ngalan sa dalan",
"remainingVehicles": "Nabiling mga sakyanan",
"fuelTitle": "Gasolina",
"pointsTitle": "Puntos",
"speedViolations": "Mga lapas sa speed limit",
"redLightsPassed": "Mga pulang suga nga nalapas",
"highscore": "Highscore",
"topPlayers": "Top 20 nga mga player",
"loadingHighscore": "Nag-load sa highscore...",
"noHighscore": "Wala pay highscore",
"pointsShort": "pts",
"backToGame": "Balik sa dula",
"minimap": "Minimap",
"loadedPassengers": "Mga pasahero sulod sa taxi",
"waitingPassengers": "Naghulat nga mga pasahero",
"noPassengersInTaxi": "Walay pasahero sulod sa taxi",
"noWaitingPassengers": "Walay naghulat nga pasahero",
"name": "Ngalan",
"destination": "Padulngan",
"bonus": "Bonus",
"time": "Oras",
"crash": {
"title": "Bangga!",
"message": "Naaksidente ka! Mga crash: {crashes}"
}
}
}
}

View File

@@ -0,0 +1,119 @@
{
"navigation": {
"home": "Sinugdanan",
"logout": "Pag-logout",
"friends": "Mga higala",
"socialnetwork": "Tigomanan",
"chats": "Mga chat",
"falukant": "Falukant",
"minigames": "Mga minigame",
"personal": "Personal",
"settings": "Mga setting",
"administration": "Pagdumala",
"m-chats": {
"multiChat": "Multiuser chat",
"randomChat": "Random single chat",
"eroticChat": "Erotik chat"
},
"m-socialnetwork": {
"guestbook": "Guestbook",
"blog": "Blog",
"usersearch": "Pagpangita og user",
"forum": "Forum",
"gallery": "Galeriya",
"sprachenlernen": "Pagtuon og pinulongan",
"blockedUsers": "Mga gi-block nga user",
"oneTimeInvitation": "Usa ka higayon nga imbitasyon",
"diary": "Talaarawan",
"erotic": "Erotik",
"m-erotic": {
"pictures": "Mga hulagway",
"videos": "Mga video"
},
"m-sprachenlernen": {
"vocabtrainer": "Trainer sa bokabularyo",
"sprachkurse": "Mga kurso sa pinulongan",
"m-vocabtrainer": {
"newLanguage": "Bag-ong pinulongan"
}
}
},
"m-minigames": {
"match3": "Match 3 - Hiyas",
"taxi": "Taxi simulator"
},
"m-personal": {
"sprachenlernen": "Pagtuon og pinulongan",
"calendar": "Kalendaryo",
"m-sprachenlernen": {
"vocabtrainer": "Trainer sa bokabularyo",
"sprachkurse": "Mga kurso sa pinulongan",
"m-vocabtrainer": {
"newLanguage": "Bag-ong pinulongan"
}
}
},
"m-settings": {
"homepage": "Sinugdanan",
"account": "Account",
"personal": "Personal",
"view": "Panagway",
"flirt": "Flirt",
"interests": "Mga interes",
"notifications": "Mga pahibalo",
"sexuality": "Sekswalidad",
"languageAssistant": "Language assistant"
},
"m-administration": {
"contactrequests": "Mga hangyo sa kontak",
"users": "Mga user",
"userrights": "Mga katungod sa user",
"m-users": {
"userlist": "Lista sa user",
"adultverification": "Mga erotik nga pag-apruba",
"eroticmoderation": "Erotik nga moderasyon",
"userstatistics": "Estadistika sa user",
"userrights": "Mga katungod sa user"
},
"forum": "Forum",
"interests": "Mga interes",
"falukant": "Falukant",
"m-falukant": {
"logentries": "Mga log entry",
"edituser": "Usba ang user",
"database": "Database",
"mapEditor": "Editor sa mapa",
"createNPC": "Paghimo og NPC"
},
"minigames": "Mga minigame",
"m-minigames": {
"match3": "Mga level sa Match3",
"taxiTools": "Mga himan sa taxi"
},
"chatrooms": "Mga chat room",
"servicesStatus": "Status sa serbisyo"
},
"m-friends": {
"manageFriends": "Dumala sa mga higala",
"chat": "Makig-chat",
"profile": "Profile"
},
"m-falukant": {
"create": "Paghimo",
"overview": "Kinatibuk-an",
"towns": "Mga sangang opisina",
"factory": "Produksyon",
"family": "Pamilya",
"house": "Balay",
"darknet": "Ilalom nga kalibutan",
"reputation": "Dungog",
"moneyhistory": "Agos sa kuwarta",
"nobility": "Sosyal nga kahimtang",
"politics": "Politika",
"education": "Edukasyon",
"health": "Panglawas",
"bank": "Bangko",
"church": "Simbahan"
}
}
}

View File

@@ -0,0 +1,13 @@
{
"passwordReset": {
"title": "I-reset ang password",
"email": "Email",
"reset": "I-reset",
"success": "Kung naa ang email, nagpadala kami og mga instruksyon sa pag-reset.",
"failure": "Napakyas ang pag-reset sa password. Palihog sulayi pag-usab unya.",
"emailHint": "Among ipadala ang link sa naka-save nga email address.",
"validation": {
"invalidEmail": "Palihog isulod ang sakto nga email address."
}
}
}

View File

@@ -0,0 +1,79 @@
{
"personal": {
"calendar": {
"title": "Kalendaryo",
"today": "Karon",
"newEntry": "Bag-ong entry",
"editEntry": "Usba ang entry",
"selectedDays": "{count} ka adlaw ang napili",
"createEventForSelection": "Paghimo og event",
"clearSelection": "Hawanon ang pinili",
"allDay": "Tibuok adlaw",
"views": {
"month": "Bulan",
"week": "Semana",
"workweek": "Semana sa trabaho",
"day": "Adlaw"
},
"weekdays": {
"mon": "Lun",
"tue": "Mar",
"wed": "Miy",
"thu": "Huw",
"fri": "Biy",
"sat": "Sab",
"sun": "Dom"
},
"weekdaysFull": {
"mon": "Lunes",
"tue": "Martes",
"wed": "Miyerkules",
"thu": "Huwebes",
"fri": "Biyernes",
"sat": "Sabado",
"sun": "Domingo"
},
"months": {
"jan": "Enero",
"feb": "Pebrero",
"mar": "Marso",
"apr": "Abril",
"may": "Mayo",
"jun": "Hunyo",
"jul": "Hulyo",
"aug": "Agosto",
"sep": "Setyembre",
"oct": "Oktubre",
"nov": "Nobyembre",
"dec": "Disyembre"
},
"categories": {
"personal": "Personal",
"work": "Trabaho",
"family": "Pamilya",
"health": "Panglawas",
"birthday": "Adlawng natawhan",
"holiday": "Holiday",
"reminder": "Pahinumdom",
"other": "Uban pa"
},
"form": {
"title": "Pamagat",
"titlePlaceholder": "Isulod ang pamagat...",
"category": "Kategorya",
"startDate": "Petsa sa pagsugod",
"startTime": "Oras sa pagsugod",
"endDate": "Petsa sa pagtapos",
"endTime": "Oras sa pagtapos",
"allDay": "Tibuok adlaw",
"description": "Deskripsyon",
"descriptionPlaceholder": "Opsyonal nga deskripsyon...",
"save": "I-save",
"cancel": "I-cancel",
"delete": "Tangtanga",
"saveError": "Sayop sa pagsave sa event",
"deleteError": "Sayop sa pagtangtang sa event"
}
}
}
}

View File

@@ -0,0 +1,28 @@
{
"register": {
"title": "Pagrehistro sa yourPart",
"email": "E-mail address",
"username": "Username",
"password": "Password",
"repeatPassword": "Usba ang password",
"language": "Pinulongan",
"languages": {
"en": "Iningles",
"de": "Aleman",
"ceb": "Bisaya"
},
"register": "Pagrehistro",
"close": "Isira",
"failure": "Adunay nahitabo nga sayop.",
"success": "Malampuson kang narehistro. Palihog susiha ang imong email aron ma-activate ang imong account.",
"passwordMismatch": "Dili magkapareho ang mga password.",
"emailinuse": "Gigamit na daan ang email address.",
"usernameinuse": "Dili magamit ang username.",
"validation": {
"invalidEmail": "Palihog isulod ang sakto nga email address.",
"usernameTooShort": "Ang username kinahanglan adunay labing menos 3 ka karakter.",
"passwordHint": "Kinahanglan labing menos 8 ka karakter.",
"passwordTooShort": "Mubo ra ang password."
}
}
}

View File

@@ -0,0 +1,58 @@
{
"settings": {
"personal": {
"title": "Personal nga datos",
"label": {
"language": "Pinulongan"
},
"tooltip": {
"language": "Pinulongan"
},
"language": {
"de": "Aleman",
"en": "Iningles",
"ceb": "Bisaya"
}
},
"view": {
"title": "Panagway"
},
"sexuality": {
"title": "Sekswalidad"
},
"account": {
"title": "Account",
"heroEyebrow": "Settings",
"heroIntro": "Atimana ang username, email, password ug visibility sa usa ka lugar.",
"language": "Pinulongan",
"username": "Username",
"email": "E-mail address",
"newpassword": "Password",
"newpasswordretype": "Usba ang password",
"showinsearch": "Ipakita sa user search",
"changeaction": "Usba ang datos sa user",
"oldpassword": "Karaan nga password (gikinahanglan)",
"validation": {
"newPasswordTooShort": "Ang bag-ong password kinahanglan adunay labing menos 8 ka karakter.",
"passwordMismatch": "Dili magkapareho ang mga password.",
"oldPasswordRequired": "Aron mausab ang password, gikinahanglan ang karon nga password."
},
"feedback": {
"saved": "Malampuson nga nasave ang account settings.",
"saveError": "Adunay sayop sa pagsave sa account settings."
}
},
"flirt": {
"title": "Flirt"
},
"interests": {
"title": "Mga interes",
"new": "Bag-ong interes",
"add": "Idugang"
},
"feedback": {
"updateError": "Dili masave ang kausaban.",
"visibilityUpdateError": "Dili ma-update ang visibility."
}
}
}

View File

@@ -0,0 +1,196 @@
{
"socialnetwork": {
"usersearch": {
"title": "Pagpangita og user",
"username": "Username",
"age_from": "Edad gikan sa",
"age_to": "hangtod",
"gender": "Gender",
"search_button": "Pangita",
"no_results": "Walay nakit-an nga resulta",
"results_title": "Mga resulta sa pagpangita:",
"result": {
"nick": "Nickname",
"gender": "Gender",
"age": "Edad"
}
},
"profile": {
"pretitle": "Nag-load sa datos. Palihog hulat...",
"error_title": "Wala makit-i ang user",
"title": "Profile ni <username>",
"tab": {
"general": "Kinatibuk-an",
"sexuality": "Sekswalidad",
"images": "Gallery",
"guestbook": "Guestbook"
},
"values": {
"bool": {
"true": "Oo",
"false": "Dili"
},
"smokes": {
"never": "Wala gayud",
"socially": "Kung kauban",
"often": "Kanunay",
"daily": "Adlaw-adlaw"
},
"drinks": {
"never": "Wala gayud",
"socially": "Kung kauban",
"often": "Kanunay",
"daily": "Adlaw-adlaw"
},
"interestedInGender": {
"male": "Lalaki",
"female": "Babaye"
},
"sexualpreference": {
"straight": "Heterosexual",
"gay": "Homosexual",
"bi": "Bisexual",
"pan": "Pansexual",
"asexual": "Asexual"
},
"gender": {
"male": "Lalaki",
"female": "Babaye",
"transmale": "Trans-Female",
"transfemale": "Trans-Male",
"nonbinary": "Non-binary"
},
"language": {
"de": "Aleman",
"en": "Iningles",
"ceb": "Bisaya"
}
},
"guestbook": {
"showInput": "Ipakita ang bag-ong entry",
"hideInput": "Tagoa ang bag-ong entry",
"imageUpload": "Hulagway",
"submit": "Ipadala ang entry",
"noEntries": "Walay entry nga nakit-an"
},
"interestedInGender": "Interesado sa",
"hasChildren": "Naay mga anak",
"smokes": "Pagpanigarilyo",
"drinks": "Alak",
"willChildren": "Gusto og anak",
"sexualpreference": "Sekswal nga oryentasyon",
"language": "Pinulongan",
"gender": "Gender",
"birthdate": "Petsa sa pagkatawo",
"age": "Edad",
"town": "Lungsod",
"bodyheight": "Gitas-on",
"weight": "Timbang"
},
"gallery": {
"title": "Gallery",
"folders": "Mga folder",
"create_folder": "Paghimo og folder",
"upload": {
"title": "I-upload ang hulagway",
"image_title": "Pamagat",
"image_file": "File",
"visibility": "Makita sa",
"upload_button": "I-upload",
"selectvisibility": "Palihog pagpili"
},
"images": "Mga hulagway",
"visibility": {
"everyone": "Tanan",
"friends": "Mga higala",
"adults": "Mga hamtong",
"friends-and-adults": "Mga higala ug mga hamtong",
"selected-users": "Piniling mga user",
"none": "Wala"
},
"create_folder_dialog": {
"title": "Paghimo og folder",
"parent_folder": "Pagabuhaton sulod sa",
"folder_title": "Ngalan sa folder",
"visibility": "Makita sa",
"select_visibility": "Palihog pagpili"
},
"noimages": "Wala pay mga hulagway niining foldera",
"imagedialog": {
"image_title": "Pamagat",
"edit_visibility": "Makita sa",
"save_changes": "I-save ang mga kausaban",
"close": "Isira",
"edit_visibility_placeholder": "Palihog pagpili"
},
"delete_folder_confirmation_title": "Tangtanga ang folder",
"delete_folder_confirmation_message": "Tinuod ba nga gusto nimong tangtangon ang folder nga '%%folderName%%'?",
"edit_image_dialog": {
"title": "Usba ang datos sa hulagway"
},
"show_image_dialog": {
"title": "Hulagway"
}
},
"guestbook": {
"title": "Guestbook",
"prevPage": "Balik",
"nextPage": "Sunod",
"page": "Panid"
},
"diary": {
"title": "Diary",
"noEntries": "Wala ka pay nahimong diary entries.",
"newEntry": "Bag-ong diary entry",
"editEntry": "Usba ang diary entry",
"save": "I-save",
"update": "I-update",
"cancel": "I-cancel",
"edit": "Usba",
"delete": "Tangtanga",
"confirmDelete": "Tinuod ba nga gusto nimong tangtangon ang entry?",
"prevPage": "Balik",
"nextPage": "Sunod",
"page": "Panid"
},
"forum": {
"title": "Forum",
"showNewTopic": "Paghimo og bag-ong topic",
"hideNewTopic": "I-cancel ang paghimo",
"noTitles": "Walay topic nga available",
"topic": "Topic",
"createNewTopic": "Paghimo og topic",
"createdBy": "Gihimo ni",
"createdAt": "Gihimo sa",
"reactions": "Reaksiyon",
"lastReaction": "Kataposang reaksiyon ni",
"createNewMesssage": "Ipadala ang tubag"
},
"friendship": {
"error": {
"alreadyexists": "Anaa na daan ang friendship request"
},
"state": {
"none": "Dili pa higala",
"waiting": "Napadala na ang friendship request pero wala pa natubag",
"open": "Gihangyo ang friendship",
"denied": "Gibalibaran ang friendship request",
"withdrawn": "Gibawi ang friendship request",
"accepted": "Mga higala"
},
"added": "Nagpadala ka og friendship request.",
"withdrawn": "Gibawi nimo ang friendship request.",
"denied": "Gibalibaran nimo ang friendship request.",
"accepted": "Natukod na ang panaghigala."
},
"erotic": {
"eyebrow": "Erotic",
"accessTitle": "I-unlock ang erotic area",
"accessIntro": "Ang mga hulagway, video ug mga chat area sa ulahi makita lang sa edad 18 pataas ug magkinahanglan usab og moderator approval.",
"lockedShort": "Magamit ra kini nga area human sa moderator approval.",
"requestVerification": "Mangayo og access",
"requestSent": "Napadala na ang access request.",
"requestError": "Wala mapadala ang access request."
}
}
}

View File

@@ -6,6 +6,56 @@
"title": "Titel",
"publish": "Veröffentlichen",
"pickImage": "Bild auswählen",
"uploadImage": "Bild hochladen"
"uploadImage": "Bild hochladen",
"list": {
"eyebrow": "Community-Blogs",
"title": "Blogs",
"intro": "Artikel, Projektstände und persönliche Einblicke aus der YourPart-Community.",
"create": "Neuen Blog erstellen",
"loading": "Laden…",
"empty": "Keine Blogs gefunden.",
"by": "von",
"unknownAuthor": "Unbekannt",
"open": "Zum Blog",
"fallbackExcerpt": "Öffentliche Einträge, Gedanken und Projektstände aus der Community."
},
"view": {
"loading": "Laden…",
"edit": "Bearbeiten",
"entriesCount": "{count} Einträge",
"empty": "Keine Einträge vorhanden.",
"fallbackDescription": "Öffentlicher Community-Blog auf YourPart.",
"notFoundTitle": "Blog nicht gefunden | YourPart",
"notFoundDescription": "Der angeforderte Blog konnte nicht geladen werden."
},
"editor": {
"createTitle": "Blog erstellen",
"editTitle": "Blog bearbeiten",
"description": "Beschreibung",
"visibility": "Sichtbarkeit",
"visibilityPublic": "Öffentlich",
"visibilityLoggedIn": "Nur eingeloggte Nutzer",
"ageRange": "Altersbereich",
"gender": "Geschlecht",
"genderMale": "Männlich",
"genderFemale": "Weiblich",
"save": "Speichern",
"newPostTitle": "Neuer Beitrag",
"addPost": "Beitrag hinzufügen",
"shareTitle": "Blog teilen",
"url": "URL",
"copyLink": "Link kopieren",
"shareToFriends": "An Freunde senden",
"emailAddresses": "E-Mail-Adressen (Kommagetrennt)",
"send": "Senden",
"restrictedHint": "Hinweis: Dieser Blog ist nicht öffentlich. Empfänger benötigen ggf. ein Login und passende Alters/Geschlechts-Berechtigung.",
"invalidAgeRange": "Ungültiger Altersbereich",
"copySuccess": "Link kopiert",
"copyError": "Kopieren fehlgeschlagen",
"shareError": "Teilen fehlgeschlagen",
"emailError": "E-Mail-Versand fehlgeschlagen",
"friendsSent": "An {count} Freund(e) gesendet.",
"emailsSent": "{count} E-Mail(s) versendet."
}
}
}

View File

@@ -122,6 +122,7 @@
},
"overview": {
"title": "Falukant - Übersicht",
"heroIntro": "Dein Stand in Wirtschaft, Familie und Besitz in einer verdichteten Ü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.",
@@ -171,6 +172,16 @@
"two_of": "Mindestens zwei Statusbedingungen"
}
},
"summary": {
"certificateHint": "Bestimmt, welche Produktkategorien du derzeit herstellen darfst.",
"branches": "Niederlassungen",
"branchesHint": "Direkter Zugriff auf deine wichtigsten Geschäftsstandorte.",
"productions": "Produktionen aktiv",
"productionsHint": "Laufende Produktionen, die zeitnah Abschluss oder Kontrolle brauchen.",
"stock": "Lagerpositionen",
"stockHint": "Verdichteter Blick auf Warenbestand über alle Regionen.",
"open": "Öffnen"
},
"productions": {
"title": "Produktionen"
},
@@ -258,6 +269,8 @@
},
"branch": {
"title": "Filiale",
"heroEyebrow": "Niederlassung",
"heroIntro": "Produktion, Lager, Verkauf und Transport in einer spielweltbezogenen Steuerfläche.",
"debtorsPrison": {
"branchLocked": "Im Schuldturm sind neue wirtschaftliche Schritte blockiert. Geschlossene oder gepfändete Standorte werden hier ebenfalls sichtbar.",
"branchRisk": "Dein Kreditverzug gefährdet Niederlassungen, Fahrzeuge und Lagerbestände.",
@@ -1321,6 +1334,10 @@
"upcoming": "Anstehende Neuwahl-Positionen",
"elections": "Wahlen"
},
"bookmarkCandidate": "Für diese Kandidatur vormerken",
"voteError": "Fehler beim Abgeben der Stimme",
"voteAllError": "Fehler beim Abgeben der Stimmen",
"applyError": "Bewerbung konnte nicht eingereicht werden.",
"current": {
"office": "Amt",
"region": "Region",

View File

@@ -58,5 +58,71 @@
"cancel": "Abbrechen",
"yes": "Ja",
"no": "Nein"
},
"sectionBar": {
"sections": {
"default": "Bereich",
"falukant": "Falukant",
"vocab": "Vokabeltrainer",
"forum": "Forum",
"community": "Community",
"settings": "Einstellungen",
"administration": "Administration",
"minigames": "Minispiele",
"personal": "Persönlich",
"blog": "Blog"
},
"titles": {
"friends": "Freunde",
"guestbook": "Gästebuch",
"search": "Suche",
"gallery": "Galerie",
"forum": "Forum",
"topic": "Thema",
"diary": "Tagebuch",
"languages": "Sprachen",
"newLanguage": "Neue Sprache",
"subscribeLanguage": "Sprache abonnieren",
"language": "Sprache",
"chapter": "Kapitel",
"courses": "Kurse",
"course": "Kurs",
"lesson": "Lektion",
"createCharacter": "Charakter erstellen",
"overview": "Übersicht",
"branch": "Niederlassung",
"moneyHistory": "Geldverlauf",
"family": "Familie",
"house": "Haus",
"nobility": "Adel",
"reputation": "Ansehen",
"church": "Kirche",
"education": "Bildung",
"bank": "Bank",
"directors": "Direktoren",
"health": "Gesundheit",
"politics": "Politik",
"underground": "Untergrund",
"personalSettings": "Persönliche Daten",
"viewSettings": "Ansicht",
"sexualitySettings": "Sexualität",
"flirtSettings": "Flirt",
"accountSettings": "Account",
"languageAssistantSettings": "Sprachassistent",
"interests": "Interessen",
"adminInterests": "Interessenverwaltung",
"adminUsers": "Benutzer",
"adminUserStatistics": "Benutzerstatistik",
"adminContacts": "Kontaktanfragen",
"adminUserRights": "Rechte",
"adminForums": "Forumverwaltung",
"adminChatRooms": "Chaträume",
"adminFalukantUsers": "Falukant-Nutzer",
"adminFalukantMap": "Falukant-Karte",
"adminCreateNpc": "NPC erstellen",
"adminMinigames": "Match3-Verwaltung",
"adminTaxiTools": "Taxi-Tools",
"adminServicesStatus": "Service-Status"
}
}
}

View File

@@ -32,7 +32,13 @@
"totalScore": "Gesamtpunktzahl",
"totalStars": "Gesamtsterne",
"levelsCompleted": "Abgeschlossene Level",
"restartCampaign": "Kampagne neu starten"
"restartCampaign": "Kampagne neu starten",
"nextStep": "Nächster Schritt",
"objectivesCollapse": "Ziele einklappen",
"objectivesShow": "Ziele anzeigen",
"objectives": "Ziele",
"loadingBoard": "Spielbrett wird vorbereitet...",
"loadingHint": "Leveldaten, Ziele und Feldlayout werden gerade synchronisiert."
},
"taxi": {
"title": "Taxi Simulator",
@@ -64,6 +70,34 @@
"refuel": "Tanken",
"startEngine": "Motor starten",
"stopEngine": "Motor stoppen",
"controls": "Steuerung",
"accelerate": "Gas geben",
"brake": "Bremsen",
"steerRight": "Rechts lenken",
"steerLeft": "Links lenken",
"goals": "Ziele",
"avoidCollisions": "Vermeide Kollisionen mit anderen Fahrzeugen",
"streetNames": "Straßennamen",
"remainingVehicles": "Verbleibende Fahrzeuge",
"fuelTitle": "Treibstoff",
"pointsTitle": "Punkte",
"speedViolations": "Geschwindigkeitsverstöße",
"redLightsPassed": "Rote Ampeln überfahren",
"highscore": "Highscore",
"topPlayers": "Top 20 Spieler",
"loadingHighscore": "Lade Highscore...",
"noHighscore": "Noch keine Highscores vorhanden",
"pointsShort": "Pkt",
"backToGame": "Zurück zum Spiel",
"minimap": "Minimap",
"loadedPassengers": "Geladene Passagiere",
"waitingPassengers": "Wartende Passagiere",
"noPassengersInTaxi": "Keine Passagiere im Taxi",
"noWaitingPassengers": "Keine wartenden Passagiere",
"name": "Name",
"destination": "Ziel",
"bonus": "Bonus",
"time": "Zeit",
"crash": {
"title": "Unfall!",
"message": "Du hattest einen Unfall! Crashes: {crashes}"

View File

@@ -4,6 +4,10 @@
"email": "E-Mail",
"reset": "Zurücksetzen",
"success": "Falls die E-Mail existiert, wurde eine Anleitung zum Zurücksetzen gesendet.",
"failure": "Passwort-Zurücksetzen fehlgeschlagen. Bitte später erneut versuchen."
"failure": "Passwort-Zurücksetzen fehlgeschlagen. Bitte später erneut versuchen.",
"emailHint": "Wir senden den Link an die hinterlegte E-Mail-Adresse.",
"validation": {
"invalidEmail": "Bitte eine gültige E-Mail-Adresse eingeben."
}
}
}

View File

@@ -8,7 +8,8 @@
"language": "Sprache",
"languages": {
"en": "Englisch",
"de": "Deutsch"
"de": "Deutsch",
"ceb": "Bisaya"
},
"register": "Registrieren",
"close": "Schließen",
@@ -16,6 +17,12 @@
"success": "Du wurdest erfolgreich registriert. Bitte schaue jetzt in Dein E-Mail-Postfach zum Aktivieren Deines Zugangs.",
"passwordMismatch": "Die Passwörter stimmen nicht überein.",
"emailinuse": "Die E-Mail-Adresse wird bereits verwendet.",
"usernameinuse": "Der Benutzername ist nicht verfügbar."
"usernameinuse": "Der Benutzername ist nicht verfügbar.",
"validation": {
"invalidEmail": "Bitte eine gültige E-Mail-Adresse eingeben.",
"usernameTooShort": "Der Benutzername sollte mindestens 3 Zeichen haben.",
"passwordHint": "Mindestens 8 Zeichen.",
"passwordTooShort": "Das Passwort ist noch zu kurz."
}
}
}

View File

@@ -56,7 +56,8 @@
},
"language": {
"de": "Deutsch",
"en": "Englisch"
"en": "Englisch",
"ceb": "Bisaya"
},
"eyecolor": {
"blue": "Blau",
@@ -140,6 +141,8 @@
},
"account": {
"title": "Account",
"heroEyebrow": "Einstellungen",
"heroIntro": "Benutzername, E-Mail, Passwort und Sichtbarkeit an einer Stelle pflegen.",
"username": "Benutzername",
"email": "E-Mail-Adresse",
"newpassword": "Passwort",
@@ -149,6 +152,15 @@
"showinsearch": "In Usersuchen anzeigen",
"changeaction": "Benutzerdaten ändern",
"oldpassword": "Altes Passwort (benötigt)",
"validation": {
"newPasswordTooShort": "Das neue Passwort sollte mindestens 8 Zeichen haben.",
"passwordMismatch": "Die Passwörter stimmen nicht überein.",
"oldPasswordRequired": "Zum Passwortwechsel wird das aktuelle Passwort benötigt."
},
"feedback": {
"saved": "Account-Einstellungen erfolgreich gespeichert.",
"saveError": "Ein Fehler ist beim Speichern der Account-Einstellungen aufgetreten."
},
"adultAccessTitle": "Erotikbereich",
"adultAccessIntro": "Der Erotikbereich ist nur für volljährige Nutzer gedacht und wird zusätzlich durch Moderatoren freigeschaltet.",
"requestAdultVerification": "Freischaltung anfragen",
@@ -216,6 +228,10 @@
"AdultsOnly": "Nur Erwachsenen anzeigen",
"All": "Jedem zeigen"
},
"feedback": {
"updateError": "Änderung konnte nicht gespeichert werden.",
"visibilityUpdateError": "Sichtbarkeit konnte nicht aktualisiert werden."
},
"flirt": {
"title": "Flirt"
},

View File

@@ -6,6 +6,56 @@
"title": "Title",
"publish": "Publish",
"pickImage": "Pick an image",
"uploadImage": "Upload image"
"uploadImage": "Upload image",
"list": {
"eyebrow": "Community blogs",
"title": "Blogs",
"intro": "Articles, project updates and personal insights from the YourPart community.",
"create": "Create new blog",
"loading": "Loading…",
"empty": "No blogs found.",
"by": "by",
"unknownAuthor": "Unknown",
"open": "Open blog",
"fallbackExcerpt": "Public entries, thoughts and project updates from the community."
},
"view": {
"loading": "Loading…",
"edit": "Edit",
"entriesCount": "{count} entries",
"empty": "No entries available.",
"fallbackDescription": "Public community blog on YourPart.",
"notFoundTitle": "Blog not found | YourPart",
"notFoundDescription": "The requested blog could not be loaded."
},
"editor": {
"createTitle": "Create blog",
"editTitle": "Edit blog",
"description": "Description",
"visibility": "Visibility",
"visibilityPublic": "Public",
"visibilityLoggedIn": "Logged-in users only",
"ageRange": "Age range",
"gender": "Gender",
"genderMale": "Male",
"genderFemale": "Female",
"save": "Save",
"newPostTitle": "New post",
"addPost": "Add post",
"shareTitle": "Share blog",
"url": "URL",
"copyLink": "Copy link",
"shareToFriends": "Send to friends",
"emailAddresses": "Email addresses (comma-separated)",
"send": "Send",
"restrictedHint": "Note: This blog is not public. Recipients may need a login and matching age/gender permissions.",
"invalidAgeRange": "Invalid age range",
"copySuccess": "Link copied",
"copyError": "Copy failed",
"shareError": "Sharing failed",
"emailError": "Email sending failed",
"friendsSent": "Sent to {count} friend(s).",
"emailsSent": "{count} email(s) sent."
}
}
}

View File

@@ -103,6 +103,7 @@
},
"overview": {
"title": "Falukant - Overview",
"heroIntro": "Your status in economy, family and property in a condensed overview.",
"heirSelection": {
"title": "Heir Selection",
"description": "Your previous character is no longer available. Choose an heir from the list to continue playing.",
@@ -151,6 +152,16 @@
"one_of": "At least one status condition",
"two_of": "At least two status conditions"
}
},
"summary": {
"certificateHint": "Determines which product categories you may currently produce.",
"branches": "Branches",
"branchesHint": "Direct access to your most important business locations.",
"productions": "Active productions",
"productionsHint": "Ongoing productions that will soon need completion or review.",
"stock": "Storage positions",
"stockHint": "Condensed view of goods across all regions.",
"open": "Open"
}
},
"health": {
@@ -312,6 +323,9 @@
"noProposals": "No director candidates available."
},
"branch": {
"title": "Branch",
"heroEyebrow": "Branch",
"heroIntro": "Production, storage, sales and transport in one world-related control area.",
"debtorsPrison": {
"branchLocked": "While in debtors' prison, new economic steps are blocked. Closed or seized branches will also become visible here.",
"branchRisk": "Your delinquency puts branches, vehicles and stored goods at risk.",
@@ -539,6 +553,10 @@
"upcoming": "Upcoming Positions",
"elections": "Elections"
},
"bookmarkCandidate": "Bookmark this candidacy",
"voteError": "Error while submitting the vote",
"voteAllError": "Error while submitting the votes",
"applyError": "Application could not be submitted.",
"current": {
"office": "Office",
"region": "Region",

View File

@@ -58,5 +58,71 @@
"cancel": "Cancel",
"yes": "Yes",
"no": "No"
},
"sectionBar": {
"sections": {
"default": "Section",
"falukant": "Falukant",
"vocab": "Vocabulary trainer",
"forum": "Forum",
"community": "Community",
"settings": "Settings",
"administration": "Administration",
"minigames": "Minigames",
"personal": "Personal",
"blog": "Blog"
},
"titles": {
"friends": "Friends",
"guestbook": "Guestbook",
"search": "Search",
"gallery": "Gallery",
"forum": "Forum",
"topic": "Topic",
"diary": "Diary",
"languages": "Languages",
"newLanguage": "New language",
"subscribeLanguage": "Subscribe to language",
"language": "Language",
"chapter": "Chapter",
"courses": "Courses",
"course": "Course",
"lesson": "Lesson",
"createCharacter": "Create character",
"overview": "Overview",
"branch": "Branch",
"moneyHistory": "Money history",
"family": "Family",
"house": "House",
"nobility": "Nobility",
"reputation": "Reputation",
"church": "Church",
"education": "Education",
"bank": "Bank",
"directors": "Directors",
"health": "Health",
"politics": "Politics",
"underground": "Underground",
"personalSettings": "Personal data",
"viewSettings": "View",
"sexualitySettings": "Sexuality",
"flirtSettings": "Flirt",
"accountSettings": "Account",
"languageAssistantSettings": "Language assistant",
"interests": "Interests",
"adminInterests": "Interest administration",
"adminUsers": "Users",
"adminUserStatistics": "User statistics",
"adminContacts": "Contact requests",
"adminUserRights": "Rights",
"adminForums": "Forum administration",
"adminChatRooms": "Chat rooms",
"adminFalukantUsers": "Falukant users",
"adminFalukantMap": "Falukant map",
"adminCreateNpc": "Create NPC",
"adminMinigames": "Match3 administration",
"adminTaxiTools": "Taxi tools",
"adminServicesStatus": "Service status"
}
}
}
}

View File

@@ -32,7 +32,13 @@
"totalScore": "Total Score",
"totalStars": "Total Stars",
"levelsCompleted": "Levels Completed",
"restartCampaign": "Restart Campaign"
"restartCampaign": "Restart Campaign",
"nextStep": "Next step",
"objectivesCollapse": "Collapse objectives",
"objectivesShow": "Show objectives",
"objectives": "Objectives",
"loadingBoard": "Preparing game board...",
"loadingHint": "Level data, objectives and board layout are being synchronized."
},
"taxi": {
"title": "Taxi Simulator",
@@ -64,6 +70,34 @@
"refuel": "Refuel",
"startEngine": "Start Engine",
"stopEngine": "Stop Engine",
"controls": "Controls",
"accelerate": "Accelerate",
"brake": "Brake",
"steerRight": "Steer right",
"steerLeft": "Steer left",
"goals": "Goals",
"avoidCollisions": "Avoid collisions with other vehicles",
"streetNames": "Street names",
"remainingVehicles": "Remaining vehicles",
"fuelTitle": "Fuel",
"pointsTitle": "Points",
"speedViolations": "Speed violations",
"redLightsPassed": "Red lights crossed",
"highscore": "Highscore",
"topPlayers": "Top 20 players",
"loadingHighscore": "Loading highscore...",
"noHighscore": "No highscores yet",
"pointsShort": "pts",
"backToGame": "Back to game",
"minimap": "Minimap",
"loadedPassengers": "Loaded passengers",
"waitingPassengers": "Waiting passengers",
"noPassengersInTaxi": "No passengers in the taxi",
"noWaitingPassengers": "No waiting passengers",
"name": "Name",
"destination": "Destination",
"bonus": "Bonus",
"time": "Time",
"crash": {
"title": "Crash!",
"message": "You had an accident! Crashes: {crashes}"

View File

@@ -4,6 +4,10 @@
"email": "Email",
"reset": "Reset",
"success": "If the email exists, we've sent reset instructions.",
"failure": "Password reset failed. Please try again later."
"failure": "Password reset failed. Please try again later.",
"emailHint": "We send the link to the stored email address.",
"validation": {
"invalidEmail": "Please enter a valid email address."
}
}
}

View File

@@ -8,7 +8,8 @@
"language": "Language",
"languages": {
"en": "English",
"de": "German"
"de": "German",
"ceb": "Bisaya"
},
"register": "Register",
"close": "Close",
@@ -16,6 +17,12 @@
"success": "You have been successfully registered. Please check your email to activate your account.",
"passwordMismatch": "The passwords do not match.",
"emailinuse": "The email address is already in use.",
"usernameinuse": "The username is not available."
"usernameinuse": "The username is not available.",
"validation": {
"invalidEmail": "Please enter a valid email address.",
"usernameTooShort": "The username should have at least 3 characters.",
"passwordHint": "At least 8 characters.",
"passwordTooShort": "The password is still too short."
}
}
}
}

View File

@@ -56,7 +56,8 @@
},
"language": {
"de": "German",
"en": "English"
"en": "English",
"ceb": "Bisaya"
},
"eyecolor": {
"blue": "Blue",
@@ -140,6 +141,8 @@
},
"account": {
"title": "Account",
"heroEyebrow": "Settings",
"heroIntro": "Manage username, email, password and visibility in one place.",
"username": "Username",
"email": "Email Address",
"newpassword": "Password",
@@ -149,6 +152,15 @@
"showinsearch": "Show in User Search",
"changeaction": "Change User Data",
"oldpassword": "Old Password (required)",
"validation": {
"newPasswordTooShort": "The new password should have at least 8 characters.",
"passwordMismatch": "The passwords do not match.",
"oldPasswordRequired": "To change the password, the current password is required."
},
"feedback": {
"saved": "Account settings saved successfully.",
"saveError": "An error occurred while saving the account settings."
},
"adultAccessTitle": "Erotic area",
"adultAccessIntro": "The erotic area is intended only for adult users and also requires moderator approval.",
"requestAdultVerification": "Request access",
@@ -216,6 +228,10 @@
"AdultsOnly": "Show only to adults",
"All": "Show to everyone"
},
"feedback": {
"updateError": "The change could not be saved.",
"visibilityUpdateError": "The visibility could not be updated."
},
"flirt": {
"title": "Flirt"
},

View File

@@ -58,5 +58,71 @@
"cancel": "Cancelar",
"yes": "Sí",
"no": "No"
},
"sectionBar": {
"sections": {
"default": "Sección",
"falukant": "Falukant",
"vocab": "Entrenador de vocabulario",
"forum": "Foro",
"community": "Comunidad",
"settings": "Configuración",
"administration": "Administración",
"minigames": "Minijuegos",
"personal": "Personal",
"blog": "Blog"
},
"titles": {
"friends": "Amigos",
"guestbook": "Libro de visitas",
"search": "Buscar",
"gallery": "Galería",
"forum": "Foro",
"topic": "Tema",
"diary": "Diario",
"languages": "Idiomas",
"newLanguage": "Nuevo idioma",
"subscribeLanguage": "Suscribirse al idioma",
"language": "Idioma",
"chapter": "Capítulo",
"courses": "Cursos",
"course": "Curso",
"lesson": "Lección",
"createCharacter": "Crear personaje",
"overview": "Resumen",
"branch": "Sucursal",
"moneyHistory": "Historial de dinero",
"family": "Familia",
"house": "Casa",
"nobility": "Nobleza",
"reputation": "Reputación",
"church": "Iglesia",
"education": "Educación",
"bank": "Banco",
"directors": "Directores",
"health": "Salud",
"politics": "Política",
"underground": "Submundo",
"personalSettings": "Datos personales",
"viewSettings": "Vista",
"sexualitySettings": "Sexualidad",
"flirtSettings": "Coqueteo",
"accountSettings": "Cuenta",
"languageAssistantSettings": "Asistente de idiomas",
"interests": "Intereses",
"adminInterests": "Administración de intereses",
"adminUsers": "Usuarios",
"adminUserStatistics": "Estadísticas de usuarios",
"adminContacts": "Solicitudes de contacto",
"adminUserRights": "Permisos",
"adminForums": "Administración del foro",
"adminChatRooms": "Salas de chat",
"adminFalukantUsers": "Usuarios de Falukant",
"adminFalukantMap": "Mapa de Falukant",
"adminCreateNpc": "Crear NPC",
"adminMinigames": "Administración de Match3",
"adminTaxiTools": "Herramientas de taxi",
"adminServicesStatus": "Estado del servicio"
}
}
}

View File

@@ -56,7 +56,8 @@
},
"language": {
"de": "Alemán",
"en": "Inglés"
"en": "Inglés",
"ceb": "Bisaya"
},
"eyecolor": {
"blue": "Azul",

View File

@@ -12,6 +12,10 @@ import feedbackPlugin from './utils/feedback';
function getBrowserLanguage() {
// Prüfe zuerst die bevorzugte Sprache
const browserLanguage = navigator.language || navigator.languages[0];
if (browserLanguage.startsWith('ceb') || browserLanguage.startsWith('bis')) {
return 'ceb';
}
// Deutschsprachige Länder: Deutschland, Österreich, Schweiz, Liechtenstein
const germanSpeakingCountries = ['de', 'at', 'ch', 'li'];
@@ -24,6 +28,9 @@ function getBrowserLanguage() {
// Prüfe alle verfügbaren Sprachen für deutschsprachige Länder
const allLanguages = navigator.languages || [navigator.language];
for (const lang of allLanguages) {
if (lang.startsWith('ceb') || lang.startsWith('bis')) {
return 'ceb';
}
// Prüfe auf de-XX Format (z.B. de-DE, de-AT, de-CH, de-LI)
if (lang.startsWith('de-')) {
const countryCode = lang.split('-')[1]?.toLowerCase();

View File

@@ -54,6 +54,11 @@ const store = createStore({
language: (() => {
// Verwende die gleiche Logik wie in main.js
const browserLanguage = navigator.language || navigator.languages[0];
if (browserLanguage.startsWith('ceb') || browserLanguage.startsWith('bis')) {
return 'ceb';
}
const germanSpeakingCountries = ['de', 'at', 'ch', 'li'];
if (browserLanguage.startsWith('de')) {
@@ -62,6 +67,9 @@ const store = createStore({
const allLanguages = navigator.languages || [navigator.language];
for (const lang of allLanguages) {
if (lang.startsWith('ceb') || lang.startsWith('bis')) {
return 'ceb';
}
if (lang.startsWith('de-')) {
const countryCode = lang.split('-')[1]?.toLowerCase();
if (germanSpeakingCountries.includes(countryCode)) {
@@ -104,6 +112,12 @@ const store = createStore({
// Setze die Sprache auf die Browser-Sprache zurück
const browserLanguage = navigator.language || navigator.languages[0];
if (browserLanguage.startsWith('ceb') || browserLanguage.startsWith('bis')) {
state.language = 'ceb';
return;
}
const germanSpeakingCountries = ['de', 'at', 'ch', 'li'];
if (browserLanguage.startsWith('de')) {
@@ -112,6 +126,10 @@ const store = createStore({
const allLanguages = navigator.languages || [navigator.language];
let isGerman = false;
for (const lang of allLanguages) {
if (lang.startsWith('ceb') || lang.startsWith('bis')) {
state.language = 'ceb';
return;
}
if (lang.startsWith('de-')) {
const countryCode = lang.split('-')[1]?.toLowerCase();
if (germanSpeakingCountries.includes(countryCode)) {

View File

@@ -1,61 +1,61 @@
<template>
<div class="blog-editor">
<h1>{{ isEdit ? 'Blog bearbeiten' : 'Blog erstellen' }}</h1>
<h1>{{ isEdit ? $t('blog.editor.editTitle') : $t('blog.editor.createTitle') }}</h1>
<form @submit.prevent="save">
<div>
<label>Titel</label>
<label>{{ $t('blog.title') }}</label>
<input v-model="form.title" required />
</div>
<div>
<label>Beschreibung</label>
<label>{{ $t('blog.editor.description') }}</label>
<textarea v-model="form.description"></textarea>
</div>
<div>
<label>Sichtbarkeit</label>
<label>{{ $t('blog.editor.visibility') }}</label>
<select v-model="form.visibility">
<option value="public">Öffentlich</option>
<option value="logged_in">Nur eingeloggte Nutzer</option>
<option value="public">{{ $t('blog.editor.visibilityPublic') }}</option>
<option value="logged_in">{{ $t('blog.editor.visibilityLoggedIn') }}</option>
</select>
</div>
<div v-if="form.visibility === 'logged_in'">
<label>Altersbereich</label>
<label>{{ $t('blog.editor.ageRange') }}</label>
<div class="row">
<input type="number" min="0" v-model.number="form.ageMin" placeholder="min" />
<input type="number" min="0" v-model.number="form.ageMax" placeholder="max" />
</div>
<label>Geschlecht</label>
<label>{{ $t('blog.editor.gender') }}</label>
<div class="row">
<label><input type="checkbox" value="m" v-model="genderSel"> Männlich</label>
<label><input type="checkbox" value="f" v-model="genderSel"> Weiblich</label>
<label><input type="checkbox" value="m" v-model="genderSel"> {{ $t('blog.editor.genderMale') }}</label>
<label><input type="checkbox" value="f" v-model="genderSel"> {{ $t('blog.editor.genderFemale') }}</label>
</div>
</div>
<button class="btn" type="submit">Speichern</button>
<button class="btn" type="submit">{{ $t('blog.editor.save') }}</button>
</form>
<div v-if="isEdit" class="post-editor">
<h2>Neuer Beitrag</h2>
<h2>{{ $t('blog.editor.newPostTitle') }}</h2>
<form @submit.prevent="addPost">
<input v-model="post.title" placeholder="Titel" required />
<input v-model="post.title" :placeholder="$t('blog.title')" required />
<RichTextEditor v-model="post.content" :blog-id="$route.params.id" />
<button class="btn" type="submit">Beitrag hinzufügen</button>
<button class="btn" type="submit">{{ $t('blog.editor.addPost') }}</button>
</form>
</div>
<div v-if="isEdit" class="share-section">
<h2>Blog teilen</h2>
<h2>{{ $t('blog.editor.shareTitle') }}</h2>
<div class="share-url">
<label>URL</label>
<label>{{ $t('blog.editor.url') }}</label>
<input :value="currentShareUrl" readonly @focus="$event.target.select()" />
<button class="btn" type="button" @click="copyUrl">Link kopieren</button>
<button class="btn" type="button" @click="copyUrl">{{ $t('blog.editor.copyLink') }}</button>
</div>
<div class="share-actions">
<button class="btn" type="button" @click="shareToFriends">An Freunde senden</button>
<button class="btn" type="button" @click="shareToFriends">{{ $t('blog.editor.shareToFriends') }}</button>
</div>
<div class="share-email">
<label>E-Mail-Adressen (Kommagetrennt)</label>
<label>{{ $t('blog.editor.emailAddresses') }}</label>
<input v-model="emailInput" placeholder="name@example.com, second@example.org" />
<button class="btn" type="button" @click="shareToEmails">Senden</button>
<p v-if="form.visibility !== 'public'" class="hint">Hinweis: Dieser Blog ist nicht öffentlich. Empfänger benötigen ggf. ein Login und passende Alters/Geschlechts-Berechtigung.</p>
<button class="btn" type="button" @click="shareToEmails">{{ $t('blog.editor.send') }}</button>
<p v-if="form.visibility !== 'public'" class="hint">{{ $t('blog.editor.restrictedHint') }}</p>
</div>
<p v-if="shareStatus" class="status">{{ shareStatus }}</p>
</div>
@@ -108,7 +108,7 @@ export default {
async save() {
if (this.form.visibility === 'logged_in') {
if (this.form.ageMin != null && this.form.ageMax != null && this.form.ageMin > this.form.ageMax) {
showError(this, 'Ungültiger Altersbereich');
showError(this, 'tr:blog.editor.invalidAgeRange');
return;
}
}
@@ -152,9 +152,9 @@ export default {
const url = this.currentShareUrl || this.blogAbsoluteUrl();
try {
await navigator.clipboard.writeText(url);
this.shareStatus = 'Link kopiert';
this.shareStatus = this.$t('blog.editor.copySuccess');
} catch {
this.shareStatus = 'Kopieren fehlgeschlagen';
this.shareStatus = this.$t('blog.editor.copyError');
}
setTimeout(() => (this.shareStatus = ''), 2000);
},
@@ -162,9 +162,9 @@ export default {
try {
const res = await shareBlog(this.$route.params.id, { toFriends: true });
if (res.url) this.currentShareUrl = res.url;
this.shareStatus = `An ${res.notifiedFriends || 0} Freund(e) gesendet.`;
this.shareStatus = this.$t('blog.editor.friendsSent', { count: res.notifiedFriends || 0 });
} catch (e) {
this.shareStatus = 'Teilen fehlgeschlagen';
this.shareStatus = this.$t('blog.editor.shareError');
}
setTimeout(() => (this.shareStatus = ''), 3000);
},
@@ -174,9 +174,9 @@ export default {
try {
const res = await shareBlog(this.$route.params.id, { emails });
if (res.url) this.currentShareUrl = res.url;
this.shareStatus = `${res.emailsSent || 0} E-Mail(s) versendet.`;
this.shareStatus = this.$t('blog.editor.emailsSent', { count: res.emailsSent || 0 });
} catch (e) {
this.shareStatus = 'E-Mail-Versand fehlgeschlagen';
this.shareStatus = this.$t('blog.editor.emailError');
}
setTimeout(() => (this.shareStatus = ''), 3000);
}

View File

@@ -2,23 +2,23 @@
<div class="blog-list">
<section class="blog-list__hero surface-card">
<div>
<span class="blog-list__kicker">Community-Blogs</span>
<h1>Blogs</h1>
<p>Artikel, Projektstände und persönliche Einblicke aus der YourPart-Community.</p>
<span class="blog-list__kicker">{{ $t('blog.list.eyebrow') }}</span>
<h1>{{ $t('blog.list.title') }}</h1>
<p>{{ $t('blog.list.intro') }}</p>
</div>
<div class="toolbar">
<router-link v-if="$store.getters.isLoggedIn" class="btn" to="/blogs/create">Neuen Blog erstellen</router-link>
<router-link v-if="$store.getters.isLoggedIn" class="btn" to="/blogs/create">{{ $t('blog.list.create') }}</router-link>
</div>
</section>
<div v-if="loading" class="blog-list__state surface-card">Laden</div>
<div v-else-if="!blogs.length" class="blog-list__state surface-card">Keine Blogs gefunden.</div>
<div v-if="loading" class="blog-list__state surface-card">{{ $t('blog.list.loading') }}</div>
<div v-else-if="!blogs.length" class="blog-list__state surface-card">{{ $t('blog.list.empty') }}</div>
<div v-else class="blog-grid">
<article v-for="b in blogs" :key="b.id" class="blog-card surface-card">
<div class="blog-card__meta">von {{ b.owner?.username || 'Unbekannt' }}</div>
<div class="blog-card__meta">{{ $t('blog.list.by') }} {{ b.owner?.username || $t('blog.list.unknownAuthor') }}</div>
<h2><router-link :to="blogUrl(b)">{{ b.title }}</router-link></h2>
<p>{{ blogExcerpt(b) }}</p>
<router-link class="blog-card__link" :to="blogUrl(b)">Zum Blog</router-link>
<router-link class="blog-card__link" :to="blogUrl(b)">{{ $t('blog.list.open') }}</router-link>
</article>
</div>
</div>
@@ -39,7 +39,7 @@ export default {
return slug ? `/blogs/${encodeURIComponent(slug)}` : `/blogs/${blog.id}`;
},
blogExcerpt(blog) {
const source = blog?.description || 'Öffentliche Einträge, Gedanken und Projektstände aus der Community.';
const source = blog?.description || this.$t('blog.list.fallbackExcerpt');
return source.length > 150 ? `${source.slice(0, 147)}...` : source;
},
},

View File

@@ -1,6 +1,6 @@
<template>
<div class="blog-view">
<div v-if="loading" class="blog-view__state surface-card">Laden</div>
<div v-if="loading" class="blog-view__state surface-card">{{ $t('blog.view.loading') }}</div>
<div v-else-if="blog" class="blog-layout">
<section class="blog-hero surface-card">
<div>
@@ -9,16 +9,16 @@
<p v-if="blog.description" class="blog-description">{{ blog.description }}</p>
</div>
<div v-if="$store.getters.isLoggedIn" class="actions">
<router-link class="editbutton" v-if="isOwner" :to="{ name: 'BlogEdit', params: { id: blog.id } }">Bearbeiten</router-link>
<router-link class="editbutton" v-if="isOwner" :to="{ name: 'BlogEdit', params: { id: blog.id } }">{{ $t('blog.view.edit') }}</router-link>
</div>
</section>
<div class="blog-content">
<section class="posts surface-card">
<div class="posts__header">
<h2>{{ $t('blog.posts') }}</h2>
<span class="posts__count">{{ total }} Einträge</span>
<span class="posts__count">{{ $t('blog.view.entriesCount', { count: total }) }}</span>
</div>
<div v-if="!items.length" class="blog-view__state">Keine Einträge vorhanden.</div>
<div v-if="!items.length" class="blog-view__state">{{ $t('blog.view.empty') }}</div>
<article v-for="p in items" :key="p.id" class="post">
<h3>{{ p.title }}</h3>
<div class="content" v-html="sanitize(p.content)" />
@@ -89,7 +89,7 @@ export default {
.map((item) => `${item.title || ''} ${stripHtml(item.content || '')}`.trim())
.filter(Boolean)
.join(' ');
const summarySource = this.blog.description || plainTextPosts || 'Öffentlicher Community-Blog auf YourPart.';
const summarySource = this.blog.description || plainTextPosts || this.$t('blog.view.fallbackDescription');
const description = truncateText(summarySource, 160);
const canonicalPath = this.canonicalBlogPath();
@@ -146,8 +146,8 @@ export default {
console.error('Blog konnte nicht geladen werden:', e);
// this.$router.replace('/blogs');
applySeo({
title: 'Blog nicht gefunden | YourPart',
description: 'Der angeforderte Blog konnte nicht geladen werden.',
title: this.$t('blog.view.notFoundTitle'),
description: this.$t('blog.view.notFoundDescription'),
canonicalPath: '/blogs',
robots: 'noindex, nofollow',
});

View File

@@ -1,9 +1,9 @@
<template>
<div class="account-settings">
<section class="account-settings__hero surface-card">
<span class="account-settings__eyebrow">Einstellungen</span>
<span class="account-settings__eyebrow">{{ $t("settings.account.heroEyebrow") }}</span>
<h2>{{ $t("settings.account.title") }}</h2>
<p>Benutzername, E-Mail, Passwort und Sichtbarkeit an einer Stelle pflegen.</p>
<p>{{ $t("settings.account.heroIntro") }}</p>
</section>
<section class="account-settings__panel surface-card">
@@ -22,7 +22,7 @@
<span>{{ $t("settings.account.newpassword") }}</span>
<input type="password" v-model="newpassword" :placeholder="$t('settings.account.newpassword')"
autocomplete="new-password" :class="{ 'field-error': newpassword && !isNewPasswordValid }" />
<span v-if="newpassword && !isNewPasswordValid" class="form-error">Das neue Passwort sollte mindestens 8 Zeichen haben.</span>
<span v-if="newpassword && !isNewPasswordValid" class="form-error">{{ $t("settings.account.validation.newPasswordTooShort") }}</span>
</label>
<label class="account-settings__field">
@@ -30,14 +30,14 @@
<input type="password" v-model="newpasswordretype"
:placeholder="$t('settings.account.newpasswordretype')" autocomplete="new-password"
:class="{ 'field-error': newpasswordretype && !passwordsMatch }" />
<span v-if="newpasswordretype && !passwordsMatch" class="form-error">Die Passwörter stimmen nicht überein.</span>
<span v-if="newpasswordretype && !passwordsMatch" class="form-error">{{ $t("settings.account.validation.passwordMismatch") }}</span>
</label>
<label class="account-settings__field account-settings__field--full">
<span>{{ $t("settings.account.oldpassword") }}</span>
<input type="password" v-model="oldpassword" :placeholder="$t('settings.account.oldpassword')"
autocomplete="current-password" :class="{ 'field-error': requiresOldPassword && !oldpassword.trim() }" />
<span v-if="requiresOldPassword && !oldpassword.trim()" class="form-error">Zum Passwortwechsel wird das aktuelle Passwort benötigt.</span>
<span v-if="requiresOldPassword && !oldpassword.trim()" class="form-error">{{ $t("settings.account.validation.oldPasswordRequired") }}</span>
</label>
</div>
@@ -149,18 +149,18 @@ export default {
if (hasNewPassword) {
if (!this.isNewPasswordValid) {
showError(this, 'Das neue Passwort ist noch zu kurz.');
showError(this, 'tr:settings.account.validation.newPasswordTooShort');
return;
}
// Validiere Passwort-Wiederholung nur wenn ein neues Passwort eingegeben wurde
if (!this.passwordsMatch) {
showError(this, 'Die Passwörter stimmen nicht überein.');
showError(this, 'tr:settings.account.validation.passwordMismatch');
return;
}
// Prüfe ob das alte Passwort eingegeben wurde
if (!this.oldpassword || this.oldpassword.trim() === '') {
showError(this, 'Bitte geben Sie Ihr aktuelles Passwort ein, um das Passwort zu ändern.');
showError(this, 'tr:settings.account.validation.oldPasswordRequired');
return;
}
}
@@ -184,7 +184,7 @@ export default {
// API-Aufruf zum Speichern der Account-Einstellungen
await apiClient.post('/api/settings/set-account', accountData);
showSuccess(this, 'Account-Einstellungen erfolgreich gespeichert.');
showSuccess(this, 'tr:settings.account.feedback.saved');
// Leere die Passwort-Felder nach erfolgreichem Speichern
this.newpassword = '';
@@ -193,7 +193,7 @@ export default {
} catch (error) {
console.error('Fehler beim Speichern der Account-Einstellungen:', error);
showApiError(this, error, 'Ein Fehler ist beim Speichern der Account-Einstellungen aufgetreten.');
showApiError(this, error, 'tr:settings.account.feedback.saveError');
}
},

View File

@@ -188,6 +188,7 @@ export default {
try {
// Mappe UI-Sprache zu vocab_language Name
const languageMap = {
'ceb': 'Bisaya',
'de': 'Deutsch',
'en': 'Englisch',
'es': 'Spanisch',
@@ -489,51 +490,45 @@ export default {
.course-actions button {
padding: 6px 14px;
border: 1px solid #ddd;
border: 1px solid transparent;
border-radius: 4px;
background: white;
background: var(--color-primary);
color: #2b1f14;
box-shadow: 0 6px 14px rgba(248, 162, 43, 0.18);
cursor: pointer;
font-size: 0.9em;
white-space: nowrap;
transition: background-color 0.2s, border-color 0.2s;
transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;
}
.course-actions button:hover {
background: #f5f5f5;
border-color: #bbb;
background: var(--color-primary-hover);
box-shadow: 0 10px 18px rgba(248, 162, 43, 0.22);
}
.btn-enroll {
background: #4CAF50 !important;
color: white !important;
border-color: #4CAF50 !important;
}
.btn-enroll:hover {
background: #45a049 !important;
border-color: #45a049 !important;
background: var(--color-primary) !important;
color: #2b1f14 !important;
border-color: transparent !important;
}
.btn-continue {
background: #2196F3 !important;
color: white !important;
border-color: #2196F3 !important;
}
.btn-continue:hover {
background: #0b7dda !important;
border-color: #0b7dda !important;
background: var(--color-primary) !important;
color: #2b1f14 !important;
border-color: transparent !important;
}
.btn-edit {
background: #FF9800 !important;
color: white !important;
border-color: #FF9800 !important;
background: rgba(255, 255, 255, 0.9) !important;
color: var(--color-text-primary) !important;
border-color: var(--color-border) !important;
box-shadow: none !important;
}
.btn-edit:hover {
background: #e68900 !important;
border-color: #e68900 !important;
background: rgba(255, 255, 255, 0.98) !important;
border-color: var(--color-border-strong) !important;
box-shadow: none !important;
}
.dialog-overlay {

View File

@@ -526,20 +526,20 @@ export default {
.btn-current-lesson {
padding: 12px 24px;
background: var(--color-primary-orange);
color: #000000;
border: 1px solid var(--color-primary-orange);
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
font-weight: 600;
transition: background 0.05s;
transition: background 0.2s, box-shadow 0.2s;
box-shadow: 0 6px 14px rgba(248, 162, 43, 0.18);
}
.btn-current-lesson:hover {
background: #FFF4F0;
color: #5D4037;
border: 1px solid #5D4037;
background: var(--color-primary-hover);
box-shadow: 0 10px 18px rgba(248, 162, 43, 0.22);
}
.lesson-cards {
@@ -675,20 +675,20 @@ export default {
.btn-start {
padding: 8px 16px;
background: var(--color-primary-orange);
color: #000000;
border: 1px solid var(--color-primary-orange);
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 0.9em;
font-weight: 500;
transition: background 0.05s;
transition: background 0.2s, box-shadow 0.2s;
box-shadow: 0 6px 14px rgba(248, 162, 43, 0.18);
}
.btn-start:hover:not(:disabled) {
background: #FFF4F0;
color: #5D4037;
border: 1px solid #5D4037;
background: var(--color-primary-hover);
box-shadow: 0 10px 18px rgba(248, 162, 43, 0.22);
}
.btn-start:disabled {
@@ -701,26 +701,26 @@ export default {
.btn-edit {
padding: 6px 12px;
background: var(--color-primary-orange);
color: #000000;
border: 1px solid var(--color-primary-orange);
background: rgba(255, 255, 255, 0.9);
color: var(--color-text-primary);
border: 1px solid var(--color-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.85em;
transition: background 0.05s;
transition: background 0.2s, border-color 0.2s;
box-shadow: none;
}
.btn-edit:hover {
background: #FFF4F0;
color: #5D4037;
border: 1px solid #5D4037;
background: rgba(255, 255, 255, 0.98);
border: 1px solid var(--color-border-strong);
}
.btn-delete {
padding: 6px 12px;
background: #dc3545;
background: rgba(177, 59, 53, 0.92);
color: white;
border: none;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 0.85em;
@@ -728,7 +728,7 @@ export default {
}
.btn-delete:hover {
background: #c82333;
background: var(--color-danger-hover);
}
.dialog-overlay {

View File

@@ -947,6 +947,14 @@ export default {
return;
}
this.activeTab = 'exercises';
this.$nextTick(() => {
const scrollEl = document.querySelector('.app-content__scroll.contentscroll');
if (scrollEl) {
scrollEl.scrollTop = 0;
} else {
window.scrollTo(0, 0);
}
});
},
updateExerciseUnlockState() {
if (this.exercisePreparationCompleted) {
@@ -2353,10 +2361,12 @@ export default {
.btn-back {
padding: 8px 16px;
border: 1px solid #ddd;
border: 1px solid var(--color-border);
border-radius: 4px;
background: white;
background: rgba(255, 255, 255, 0.92);
color: var(--color-text-primary);
cursor: pointer;
box-shadow: none;
}
.lesson-description {
@@ -2447,18 +2457,20 @@ export default {
.exercise-item button {
padding: 10px 20px;
background: #4CAF50;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
margin-top: 10px;
transition: background-color 0.2s;
transition: background-color 0.2s, box-shadow 0.2s;
box-shadow: 0 6px 14px rgba(248, 162, 43, 0.18);
}
.exercise-item button:hover:not(:disabled) {
background: #45a049;
background: var(--color-primary-hover);
box-shadow: 0 10px 18px rgba(248, 162, 43, 0.22);
}
.exercise-item button:disabled {
@@ -2513,24 +2525,26 @@ export default {
.tab-button {
padding: 10px 20px;
border: none;
background: transparent;
border: 1px solid transparent;
background: rgba(255, 255, 255, 0.72);
cursor: pointer;
font-size: 1em;
color: #666;
color: var(--color-text-secondary);
border-bottom: 2px solid transparent;
margin-bottom: -2px;
transition: all 0.2s;
box-shadow: none;
}
.tab-button:hover:not(:disabled) {
color: #333;
background: #f5f5f5;
color: var(--color-text-primary);
background: rgba(255, 255, 255, 0.92);
}
.tab-button.active {
color: #007bff;
border-bottom-color: #007bff;
color: #2b1f14;
background: var(--color-primary);
border-bottom-color: var(--color-primary);
font-weight: bold;
}
@@ -2687,17 +2701,18 @@ export default {
.btn-start-trainer {
padding: 10px 20px;
background: #4CAF50;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
margin-top: 10px;
box-shadow: 0 6px 14px rgba(248, 162, 43, 0.18);
}
.btn-start-trainer:hover {
background: #45a049;
background: var(--color-primary-hover);
}
.vocab-trainer-stats {
@@ -2733,8 +2748,8 @@ export default {
}
.mode-badge.mode-active {
background: #007bff;
color: white;
background: var(--color-primary);
color: #2b1f14;
font-weight: bold;
}
@@ -2745,16 +2760,16 @@ export default {
.btn-stop-trainer {
padding: 5px 15px;
background: #dc3545;
background: rgba(177, 59, 53, 0.92);
color: white;
border: none;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 0.9em;
}
.btn-stop-trainer:hover {
background: #c82333;
background: var(--color-danger-hover);
}
.vocab-question {
@@ -2802,20 +2817,20 @@ export default {
.btn-switch-mode {
padding: 8px 16px;
background: var(--color-primary-orange);
color: #000000;
border: 1px solid var(--color-primary-orange);
background: rgba(255, 255, 255, 0.92);
color: var(--color-text-primary);
border: 1px solid var(--color-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9em;
font-weight: 500;
transition: background 0.05s;
transition: background 0.2s, border-color 0.2s;
box-shadow: none;
}
.btn-switch-mode:hover {
background: var(--color-primary-orange-light);
color: var(--color-text-secondary);
border: 1px solid var(--color-text-secondary);
background: rgba(255, 255, 255, 0.98);
border: 1px solid var(--color-border-strong);
}
.vocab-answer-area.multiple-choice {
@@ -2842,14 +2857,14 @@ export default {
}
.choice-button:hover {
border-color: #007bff;
background: #f0f8ff;
border-color: var(--color-primary);
background: rgba(248, 162, 43, 0.08);
}
.choice-button.selected {
border-color: #007bff;
background: #007bff;
color: white;
border-color: var(--color-primary);
background: var(--color-primary);
color: #2b1f14;
}
.vocab-input {
@@ -2862,16 +2877,16 @@ export default {
.btn-check {
padding: 10px 20px;
background: #4CAF50;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
}
.btn-check:hover:not(:disabled) {
background: #45a049;
background: var(--color-primary-hover);
}
.btn-check:disabled {
@@ -2903,16 +2918,16 @@ export default {
.vocab-next button {
padding: 10px 20px;
background: #007bff;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
}
.vocab-next button:hover {
background: #0056b3;
background: var(--color-primary-hover);
}
.vocab-info-text {
@@ -2936,9 +2951,9 @@ export default {
.btn-continue {
padding: 12px 24px;
background: #007bff;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
font-size: 1.1em;
cursor: pointer;
@@ -2946,7 +2961,7 @@ export default {
}
.btn-continue:hover {
background: #0056b3;
background: var(--color-primary-hover);
}
/* Reading Aloud & Speaking From Memory Styles */
@@ -2981,12 +2996,12 @@ export default {
}
.btn-record {
background: #28a745;
color: white;
background: var(--color-primary);
color: #2b1f14;
}
.btn-record:hover:not(:disabled) {
background: #218838;
background: var(--color-primary-hover);
}
.btn-record:disabled {
@@ -2995,26 +3010,26 @@ export default {
}
.btn-stop-record {
background: #dc3545;
background: rgba(177, 59, 53, 0.92);
color: white;
}
.btn-stop-record:hover {
background: #c82333;
background: var(--color-danger-hover);
}
.btn-check {
padding: 10px 20px;
background: #007bff;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 6px;
cursor: pointer;
margin-top: 15px;
}
.btn-check:hover {
background: #0056b3;
background: var(--color-primary-hover);
}
.recording-status {
@@ -3150,16 +3165,16 @@ export default {
.dialog-button {
padding: 8px 16px;
background: #007bff;
color: white;
border: none;
background: var(--color-primary);
color: #2b1f14;
border: 1px solid transparent;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
}
.dialog-button:hover {
background: #0056b3;
background: var(--color-primary-hover);
}
@media (max-width: 900px) {