`,
- watch:{
- 'searchsettings.searchstr': function (newSearchValue) {
- if(this.searchoptions.origin){
- sessionStorage.setItem(`${this.searchoptions.origin}_searchstr`,newSearchValue);
+ watch: {
+ "searchsettings.searchstr": function (newSearchValue) {
+ if (this.searchoptions.origin) {
+ sessionStorage.setItem(
+ `${this.searchoptions.origin}_searchstr`,
+ newSearchValue,
+ );
}
},
- 'searchsettings.types'(newValue) {
+ "searchsettings.types"(newValue) {
if (Array.isArray(newValue) && newValue.length === 0) {
this.searchsettings.types = [...this.types];
}
// stores the search types in the localstorage, only if the newValue is also an array
if (Array.isArray(newValue) && this.searchoptions.origin) {
- localStorage.setItem(`${this.searchoptions.origin}_searchtypes`, JSON.stringify(newValue));
+ localStorage.setItem(
+ `${this.searchoptions.origin}_searchtypes`,
+ JSON.stringify(newValue),
+ );
}
this.search();
- }
- },
- mounted(){
+ },
+ },
+ mounted() {
this.settingsDropdown = new bootstrap.Collapse(this.$refs.settings, {
- toggle: false
+ toggle: false,
});
- if (!this.searchoptions.origin){
- console.warn("No origin defined in the searchoptions for the searchbar, please define the origin property in the searchbaroptions to allow reliable storage of searchstr and searchtypes accross applications.");
+ if (!this.searchoptions.origin) {
+ console.warn(
+ "No origin defined in the searchoptions for the searchbar, please define the origin property in the searchbaroptions to allow reliable storage of searchstr and searchtypes accross applications.",
+ );
}
},
updated() {
- if(this.showresult) {
+ if (this.showresult) {
Vue.nextTick(() => {
this.calcSearchResultHeight();
});
@@ -249,32 +270,34 @@ export default {
getInitiallySelectedTypes() {
let result = false;
if (this.searchoptions.origin) {
- let localStorageValue = localStorage.getItem(`${this.searchoptions.origin}_searchtypes`);
+ let localStorageValue = localStorage.getItem(
+ `${this.searchoptions.origin}_searchtypes`,
+ );
if (localStorageValue) {
result = JSON.parse(localStorageValue);
}
}
- if (result)
- return result;
- if (!this.searchoptions.types)
- return [];
+ if (result) return result;
+ if (!this.searchoptions.types) return [];
if (Array.isArray(this.searchoptions.types))
return [...this.searchoptions.types];
return Object.keys(this.searchoptions.types);
},
- getSearchStr: function(){
- if (!this.searchoptions.origin)
- return '';
- return sessionStorage.getItem(`${this.searchoptions.origin}_searchstr`) ?? '';
+ getSearchStr: function () {
+ if (!this.searchoptions.origin) return "";
+ return (
+ sessionStorage.getItem(
+ `${this.searchoptions.origin}_searchstr`,
+ ) ?? ""
+ );
},
- checkSettingsVisibility: function(event) {
+ checkSettingsVisibility: function (event) {
// hides the settings collapsible if the user clicks somewhere else
- if (!this.$refs.settings.contains(event.target))
- {
+ if (!this.$refs.settings.contains(event.target)) {
this.settingsDropdown.hide();
}
},
- handleShowSettings: function() {
+ handleShowSettings: function () {
// adds the event listener checkSettingsVisibility only when the collapsible is shown
document.addEventListener("click", this.checkSettingsVisibility);
},
@@ -282,183 +305,208 @@ export default {
// removes the event listener checkSettingsVisibility when the collapsible is hidden
document.removeEventListener("click", this.checkSettingsVisibility);
},
- calcSearchResultHeight: function() {
+ calcSearchResultHeight: function () {
const rect = this.$refs.results.getBoundingClientRect();
- if( rect.height > 0 && rect.height < (window.innerHeight * 0.8) ) {
- this.$refs.result.style.height = Math.ceil(rect.height + 16) + 'px';
+ if (rect.height > 0 && rect.height < window.innerHeight * 0.8) {
+ this.$refs.result.style.height =
+ Math.ceil(rect.height + 16) + "px";
} else {
- this.$refs.result.style.height = Math.floor(window.innerHeight * 0.8) + 'px';
+ this.$refs.result.style.height =
+ Math.floor(window.innerHeight * 0.8) + "px";
}
},
- calcSearchResultExtent: function() {
- if(!this.showresult) {
+ calcSearchResultExtent: function () {
+ if (!this.showresult) {
return;
}
- if(this.searchoptions?.calcheightonly === undefined
- || this.searchoptions.calcheightonly === false) {
+ if (
+ this.searchoptions?.calcheightonly === undefined ||
+ this.searchoptions.calcheightonly === false
+ ) {
var rect = this.$refs.searchbox.getBoundingClientRect();
- this.$refs.result.style.top = Math.floor(rect.bottom + 3) + 'px';
- this.$refs.result.style.right = Math.floor(rect.right) + 'px';
- this.$refs.result.style.width = Math.floor(rect.width) + 'px';
+ this.$refs.result.style.top =
+ Math.floor(rect.bottom + 3) + "px";
+ this.$refs.result.style.right = Math.floor(rect.right) + "px";
+ this.$refs.result.style.width = Math.floor(rect.width) + "px";
}
- this.calcSearchResultHeight();
- },
- search: function() {
- if(this.searchoptions?.nolivesearch === true) return;
+ this.calcSearchResultHeight();
+ },
+ search: function () {
+ if (this.searchoptions?.nolivesearch === true) return;
- this.abort();
- if( this.searchsettings.searchstr.length >= 2 ) {
- this.calcSearchResultExtent();
- this.searchtimer = setTimeout(
- this.callsearchapi,
- 500
- );
- } else {
- this.showresult = false;
- }
- },
- abort() {
- if (this.searchtimer !== null) {
- clearTimeout(this.searchtimer);
- }
- if (this.abortController) {
- this.abortController.abort();
- this.abortController = null;
- }
- this.searchresult = [];
- },
- callsearchapi: function() {
- this.error = null;
- this.searchresult.splice(0, this.searchresult.length);
- this.searching = true;
- this.showsearchresult();
- if(this.searchsettings.types.length === 0) {
- this.error = this.$p.t('search/error_missing_type');
- this.searching = false;
- return;
- }
-
- if (this.abortController)
- this.abortController.abort();
- this.abortController = new AbortController();
-
- this.searchfunction(this.searchsettings, { timeout: 50000, signal: this.abortController.signal })
- .then(response=>{
- if (!response.data) {
- this.error = this.$p.t('search/error_general');
- } else {
- let res = response.data.map(el => el.data ? {...el, ...JSON.parse(el.data)} : el);
- this.lastQuery = response.meta.searchstring;
- if (this.searchoptions.mergeResults) {
- let counter = 0;
- let mergeTypes = [];
- let mergedType = 'merged-';
- let mergeKey = '';
-
- switch (this.searchoptions.mergeResults) {
- case 'student':
- mergeTypes = ['student', 'prestudent'];
- mergedType += this.searchoptions.mergeResults;
- mergeKey = 'uid';
- break;
- case 'person':
- mergeTypes = ['person', 'employee', 'student', 'prestudent'];
- mergedType += this.searchoptions.mergeResults;
- mergeKey = 'person_id';
- break;
- }
-
- if (mergeTypes.length) {
- res = Object.values(res.reduce((a, c) => {
- if (!mergeTypes.includes(c.renderer)) {
- a['nomerge' + counter++] = c;
- } else if (c[mergeKey] === null) {
- a['nomerge' + counter++] = c;
- } else if (a[c[mergeKey]] === undefined) {
- a[c[mergeKey]] = {
- rank: c.rank,
- renderer: mergedType,
- type: mergedType,
- list: [c]
- };
- } else {
- a[c[mergeKey]].list.push(c);
- if (c.rank > a[c[mergeKey]].rank)
- a[c[mergeKey]].rank = c.rank;
- }
- return a;
- }, {})).sort((a, b) => b.rank - a.rank);
- }
- }
- this.searchresult = res;
- this.searchmode = response.meta.mode;
- }
- this.searching = false;
- this.retry = 0;
- })
- .catch(error=> {
- if (error.code == "ERR_CANCELED") {
- return this.retry = 0;
- }
- if (error.code == "ECONNABORTED" && this.retry) {
- this.retry--;
- return this.callsearchapi();
- }
-
- this.error = this.$p.t('search/error_general', error);
- this.searching = false;
- this.retry = 0;
- });
- },
- refreshsearch: function() {
- this.search();
- this.togglesettings();
- },
- hideresult: function() {
- this.showresult = false;
- window.removeEventListener('resize', this.calcSearchResultExtent);
- },
- showsearchresult: function() {
- if(this.searchoptions?.nolivesearch === true) return;
-
- if( this.searchsettings.searchstr.length >= 2 ) {
- this.showresult = true;
- window.addEventListener('resize', this.calcSearchResultExtent);
+ this.abort();
+ if (this.searchsettings.searchstr.length >= 2) {
this.calcSearchResultExtent();
- }
- },
- searchfocusin: function(e) {
- e.preventDefault();
- e.stopPropagation();
- if( this.hidetimer !== null ) {
- clearTimeout(this.hidetimer);
- }
- if (this.searchsettings.searchstr.length >= 2
- && this.searchresult.length === 0) {
+ this.searchtimer = setTimeout(this.callsearchapi, 500);
+ } else {
+ this.showresult = false;
+ }
+ },
+ abort() {
+ if (this.searchtimer !== null) {
+ clearTimeout(this.searchtimer);
+ }
+ if (this.abortController) {
+ this.abortController.abort();
+ this.abortController = null;
+ }
+ this.searchresult = [];
+ },
+ callsearchapi: function () {
+ this.error = null;
+ this.searchresult.splice(0, this.searchresult.length);
+ this.searching = true;
+ this.showsearchresult();
+ if (this.searchsettings.types.length === 0) {
+ this.error = this.$p.t("search/error_missing_type");
+ this.searching = false;
+ return;
+ }
+
+ if (this.abortController) this.abortController.abort();
+ this.abortController = new AbortController();
+
+ this.searchfunction(this.searchsettings, {
+ timeout: 50000,
+ signal: this.abortController.signal,
+ })
+ .then((response) => {
+ if (!response.data) {
+ this.error = this.$p.t("search/error_general");
+ } else {
+ let res = response.data.map((el) =>
+ el.data ? { ...el, ...JSON.parse(el.data) } : el,
+ );
+ this.lastQuery = response.meta.searchstring;
+ if (this.searchoptions.mergeResults) {
+ let counter = 0;
+ let mergeTypes = [];
+ let mergedType = "merged-";
+ let mergeKey = "";
+
+ switch (this.searchoptions.mergeResults) {
+ case "student":
+ mergeTypes = ["student", "prestudent"];
+ mergedType +=
+ this.searchoptions.mergeResults;
+ mergeKey = "uid";
+ break;
+ case "person":
+ mergeTypes = [
+ "person",
+ "employee",
+ "student",
+ "prestudent",
+ ];
+ mergedType +=
+ this.searchoptions.mergeResults;
+ mergeKey = "person_id";
+ break;
+ }
+
+ if (mergeTypes.length) {
+ res = Object.values(
+ res.reduce((a, c) => {
+ if (!mergeTypes.includes(c.renderer)) {
+ a["nomerge" + counter++] = c;
+ } else if (c[mergeKey] === null) {
+ a["nomerge" + counter++] = c;
+ } else if (
+ a[c[mergeKey]] === undefined
+ ) {
+ a[c[mergeKey]] = {
+ rank: c.rank,
+ renderer: mergedType,
+ type: mergedType,
+ list: [c],
+ };
+ } else {
+ a[c[mergeKey]].list.push(c);
+ if (c.rank > a[c[mergeKey]].rank)
+ a[c[mergeKey]].rank = c.rank;
+ }
+ return a;
+ }, {}),
+ ).sort((a, b) => b.rank - a.rank);
+ }
+ }
+ this.searchresult = res;
+ this.searchmode = response.meta.mode;
+ }
+ this.searching = false;
+ this.retry = 0;
+ })
+ .catch((error) => {
+ if (error.code == "ERR_CANCELED") {
+ return (this.retry = 0);
+ }
+ if (error.code == "ECONNABORTED" && this.retry) {
+ this.retry--;
+ return this.callsearchapi();
+ }
+
+ this.error = this.$p.t("search/error_general", error);
+ this.searching = false;
+ this.retry = 0;
+ });
+ },
+ refreshsearch: function () {
+ this.search();
+ this.togglesettings();
+ },
+ hideresult: function () {
+ this.showresult = false;
+ window.removeEventListener("resize", this.calcSearchResultExtent);
+ },
+ showsearchresult: function () {
+ if (this.searchoptions?.nolivesearch === true) return;
+
+ if (this.searchsettings.searchstr.length >= 2) {
+ this.showresult = true;
+ window.addEventListener("resize", this.calcSearchResultExtent);
+ this.calcSearchResultExtent();
+ }
+ },
+ searchfocusin: function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (this.hidetimer !== null) {
+ clearTimeout(this.hidetimer);
+ }
+ if (
+ this.searchsettings.searchstr.length >= 2 &&
+ this.searchresult.length === 0
+ ) {
this.search();
}
- },
- searchfocusout: function(e) {
- e.preventDefault();
- e.stopPropagation();
- this.hidetimer = setTimeout(
- this.hideresult,
- 100
- );
- },
- dash2camelCase(string) {
- return string.replace(/-([a-z])/g, g => g[1].toUpperCase());
- },
- isValidRenderer(renderer) {
- const camelCaseRenderer = this.dash2camelCase(renderer);
- return Object.keys(this.$.components).includes(camelCaseRenderer);
- },
+ },
+ searchfocusout: function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.hidetimer = setTimeout(this.hideresult, 100);
+ },
+ dash2camelCase(string) {
+ return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
+ },
+ isValidRenderer(renderer) {
+ const camelCaseRenderer = this.dash2camelCase(renderer);
+ return Object.keys(this.$.components).includes(camelCaseRenderer);
+ },
getActions(res) {
- let actions = this.searchoptions.actions[this.dash2camelCase(res.renderer)];
+ let actions =
+ this.searchoptions.actions[this.dash2camelCase(res.renderer)];
if (actions) {
return actions;
}
return this.searchoptions.actions[res.type];
- }
- }
+ },
+ getMaxWidthOfSearchbarInMobileView() {
+ // body width - hardcoded chevron width; necessary for accurate collapse transition transition
+ return (
+ document.querySelector("body").getBoundingClientRect().width -
+ 27 +
+ "px"
+ );
+ },
+ },
};
diff --git a/public/js/composables/Dashboard/CachedWidgetLoader.js b/public/js/composables/Dashboard/CachedWidgetLoader.js
deleted file mode 100644
index 4bc2d4992..000000000
--- a/public/js/composables/Dashboard/CachedWidgetLoader.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import ApiWidget from "../../api/factory/dashboard/widget.js";
-
-const promises = Vue.ref([]);
-const stateRef = Vue.ref([]);
-const state = Vue.readonly(stateRef);
-
-export function useCachedWidgetLoader() {
- const $api = Vue.inject('$api');
- const $fhcAlert = Vue.inject('$fhcAlert');
-
- function load(id) {
- if (state.value[id])
- return Promise.resolve(state.value[id]);
-
- if (!promises.value[id])
- promises.value[id] = new Promise((resolve, reject) => {
- $api
- .call(ApiWidget.get(id))
- .then(res => {
- stateRef.value[id] = res.data;
- promises.value[id] = undefined;
- resolve(state.value[id]);
- })
- .catch($fhcAlert.handleSystemError);
- });
-
- return promises.value[id];
- }
-
- return {
- state,
- actions: {
- load
- }
- };
-}
\ No newline at end of file
diff --git a/public/js/composables/EventLoader.js b/public/js/composables/EventLoader.js
index 7360d0286..5c6b08b8a 100644
--- a/public/js/composables/EventLoader.js
+++ b/public/js/composables/EventLoader.js
@@ -7,6 +7,12 @@ export function useEventLoader(rangeInterval, getPromiseFunc) {
const allEvents = Vue.computed(() => events.value.concat(loadingEvents.value));
const lv = Vue.ref(null);
const eventsLoaded = [];
+ const reservierbarMap = Vue.ref({});
+
+ const mergeReservierbarMap = (incoming) => {
+ if (!incoming) return;
+ reservierbarMap.value = { ...reservierbarMap.value, ...incoming };
+ };
const mergePromiseArr = (n, o) => {
if (Array.isArray(n))
@@ -111,7 +117,7 @@ export function useEventLoader(rangeInterval, getPromiseFunc) {
return mergePromiseArr(getPromiseFunc(start, end), result);
};
- Vue.watchEffect(() => {
+ const reload = () => {
const range = Vue.toValue(rangeInterval);
if (!(range instanceof luxon.Interval))
return;
@@ -128,11 +134,23 @@ export function useEventLoader(rangeInterval, getPromiseFunc) {
lv.value = res.value.meta.lv;
events.value = events.value.concat(res.value.data);
+ mergeReservierbarMap(res.value.data?.reservierbarMap);
loadingEvents.value = [];
}
})
});
- })
+ };
- return { events: allEvents, lv }
-}
\ No newline at end of file
+ Vue.watchEffect(reload);
+
+ const reset = () => {
+ loading_id = 0;
+ events.value = [];
+ loadingEvents.value = [];
+ reservierbarMap.value = {};
+ eventsLoaded.splice(0, eventsLoaded.length);
+ reload();
+ }
+
+ return { events: allEvents, lv, reservierbarMap, reset }
+}
diff --git a/public/js/composables/GridLogic.js b/public/js/composables/GridLogic.js
index ff8ae0c39..46159dffb 100644
--- a/public/js/composables/GridLogic.js
+++ b/public/js/composables/GridLogic.js
@@ -1,4 +1,10 @@
-// TODO(chris): Comments
+/**
+ * This class arranges rectangular items on a grid with a defined width and
+ * a potential infinite height. It calculates repositioning of already placed
+ * items if a new item would overlap one or more of said placed items.
+ * This can be manipulated by adding weights to the items or by defining an
+ * item as pinned.
+ */
const DIR_UP = 0;
const DIR_LEFT = 1;
@@ -23,33 +29,23 @@ class GridLogic {
const i = y*this.w + x;
return !this.grid[i] && this.grid[i] !== 0;
}
- getMaxY(){
- return this.data.reduce((acc, item) => {
- if (item?.y > acc) {
- acc = item.y;
- }
- return acc;
- }, 0);
- }
getFreeSlots() {
const freeSlots = [];
- let biggestY = this.getMaxY();
- let totalSpaces = this.w * (biggestY+1);
- for(let i=0; i < totalSpaces; i++){
- if (!this.grid[i] && this.grid[i] !== 0){
- this.grid[i] = undefined;
- }
- }
- for(let i =0; i < this.grid.length; i++){
- if (!this.grid[i] && this.grid[i] !== 0){
+ let i = this.w * this.h;
+
+ while (i--) {
+ if (!this.grid[i] && this.grid[i] !== 0) {
let x = i % this.w;
let y = Math.floor(i / this.w);
freeSlots.push({x, y});
}
}
+
return freeSlots;
}
add(item, prefer) {
+ if (!item.frame)
+ item.frame = this.getItemFrame(item);
let occupiers = this.getItemsInFrame(item.frame);
if (!occupiers.length) {
item.frame.forEach(f => this.grid[f] = item.index);
@@ -61,6 +57,16 @@ class GridLogic {
item.frame.forEach(f => intermGrid.grid[f] = -1);
+ intermGrid.data.forEach(currItem => {
+ if (!currItem)
+ return;
+ if (currItem.pinned) {
+ if (!currItem.frame)
+ currItem.frame = intermGrid.getItemFrame(currItem);
+ currItem.frame.forEach(f => intermGrid.grid[f] = -1);
+ }
+ });
+
const possiblities = intermGrid.tryMoving(occupiers, prefer);
if (possiblities.length) {
const bestOption = possiblities.sort((a,b) => {
@@ -83,7 +89,9 @@ class GridLogic {
result[move.index] = {
index: currItem.index,
x: currItem.x,
- y: currItem.y
+ y: currItem.y,
+ w: currItem.w,
+ h: currItem.h
};
});
item.frame.forEach(f => this.grid[f] = item.index);
@@ -91,12 +99,12 @@ class GridLogic {
return result;
} else {
- console.error('FATAL', "can't arrange item on grid");
+ return null;
}
}
}
move(item, x, y) {
- if (item.data.place[this.w]?.pinned)
+ if (item.pinned)
return [];
if (item.x == x && item.y == y)
return [];
@@ -116,8 +124,6 @@ class GridLogic {
prefer = DIR_RIGHT;
}
- const originalFrame = Array.isArray(item.frame) ? [...item.frame] : [item.frame];
-
const currItem = {...item};
currItem.x = x;
currItem.y = y;
@@ -125,33 +131,60 @@ class GridLogic {
let occupiers = this.getItemsInFrame(currItem.frame);
// does not update if the target conatins pinned widgets
- if (occupiers.some(frame => this.data[frame]?.data.place[this.w]?.pinned)) {
+ if (occupiers.some(frame => this.data[frame]?.pinned)) {
return [];
}
-
- // checks if target contains widget with the same high and width
- let occupiersData = occupiers.map(occupier => this.data[occupier]);
- let occupiersFrame = occupiersData.map(occupier => occupier.frame).flat();
- if (!occupiersFrame.some(frame => !currItem.frame.includes(frame)) && !occupiersFrame.some(frame => originalFrame.includes(frame))){
- let replaceUpdate = [];
- let newOccupierFrames = [];
- for(let f of originalFrame){
- if(newOccupierFrames.includes(f)){
- continue;
- }
- let occ = occupiersData.shift();
- if(occ){
- newOccupierFrames = [...newOccupierFrames, ...this.getItemFrame({ ...occ, ...this.getSingleFramePosition(f) })];
- replaceUpdate[occ.index] = { index: occ.index, ...this.getSingleFramePosition(f)}
- }
- }
- replaceUpdate[item.index] = { index: item.index, x, y };
+
+ // checks if target contains moving widgets start position
+ // so swapping should be avoided
+ const targetAndItemOverlap = this.getItemFrame(item).some(frame => currItem.frame.includes(frame))
+ if (!targetAndItemOverlap) {
+
+ // checks if target contains widget with the same high and width
+ // so swapping is possible
+ const occupiersFrame = occupiers.map(occupier => this.data[occupier].frame).flat();
+ const occupiersInsideMovingItem = occupiersFrame.every(frame => currItem.frame.includes(frame));
+
+ if (occupiersInsideMovingItem) {
+ // every slot of all items in the target zone is inside said zone
+ const replaceUpdate = [];
- return replaceUpdate;
+ const diffX = item.x - x;
+ const diffY = item.y - y;
+
+ occupiers.forEach(occupier => {
+ const data = { ...this.data[occupier] };
+ data.x += diffX;
+ data.y += diffY;
+ data.frame = this.getItemFrame(data);
+ this.remove(data);
+ this.add(data);
+ replaceUpdate[occupier] = {
+ index: data.index,
+ x: data.x,
+ y: data.y,
+ w: data.w,
+ h: data.h
+ };
+ });
+
+ this.add({ ...item, x, y });
+ replaceUpdate[item.index] = {
+ index: item.index,
+ x,
+ y,
+ w: item.w,
+ h: item.h
+ };
+
+ return replaceUpdate;
+ }
}
const updates = this.add(currItem, prefer);
- updates[item.index] = {index: item.index, x, y};
+ if (updates)
+ updates[item.index] = { index: item.index, x, y, w: item.w, h: item.h };
+
return updates;
}
resize(item, w, h) {
@@ -166,7 +199,7 @@ class GridLogic {
const updates = this.add(currItem);
if(updates)
- updates[item.index] = {index: item.index, w, h, x:item.x, y:item.y, resize:true};
+ updates[item.index] = { index: item.index, w, h, x: item.x, y: item.y };
return updates;
}
@@ -205,13 +238,13 @@ class GridLogic {
let targetframe;
switch(dir) {
case DIR_UP:
- if (this.data[index].data?.place[this.w]?.pinned || this.data[index].y - amount < 0)
+ if (this.data[index].pinned || this.data[index].y - amount < 0)
return false;
targetframe = this.data[index].frame.map(i => i-this.w*amount);
move.y = -amount;
break;
case DIR_DOWN:
- if (this.data[index].data?.place[this.w]?.pinned)
+ if (this.data[index].pinned)
return false;
if (this.data[index].y + this.data[index].h + amount > this.h)
cost += .4;
@@ -219,13 +252,13 @@ class GridLogic {
move.y = amount;
break;
case DIR_LEFT:
- if (this.data[index].data?.place[this.w]?.pinned || this.data[index].x - amount < 0)
+ if (this.data[index].pinned || this.data[index].x - amount < 0)
return false;
targetframe = this.data[index].frame.map(i => i-amount);
move.x = -amount;
break;
case DIR_RIGHT:
- if (this.data[index].data?.place[this.w]?.pinned || this.data[index].x + this.data[index].w + amount > this.w)
+ if (this.data[index].pinned || this.data[index].x + this.data[index].w + amount > this.w)
return false;
targetframe = this.data[index].frame.map(i => i+amount);
move.x = amount;
@@ -262,9 +295,6 @@ class GridLogic {
frame.push(i + item.x + (j + item.y) * this.w);
return frame;
}
- getSingleFramePosition(frame){
- return { x: frame % this.w, y: Math.floor(frame / this.w)};
- }
debug() {
return this.grid;
}
diff --git a/public/js/composables/Pseudostore/DashboardWidget/UrlStore.js b/public/js/composables/Pseudostore/DashboardWidget/UrlStore.js
new file mode 100644
index 000000000..3d2c5a657
--- /dev/null
+++ b/public/js/composables/Pseudostore/DashboardWidget/UrlStore.js
@@ -0,0 +1,78 @@
+import ApiBookmark from '../../../api/factory/widget/bookmark.js';
+
+const bookmarksRef = Vue.ref([]);
+const tags = Vue.computed(() => {
+ return bookmarksRef.value
+ .map(bookmark => JSON.parse(bookmark.tag))
+ .flat()
+ .filter((v, i, a) => v && a.indexOf(v) === i);
+});
+const state = Vue.readonly(bookmarksRef);
+
+export function useUrlStore() {
+ const $api = Vue.inject('$api');
+ const $fhcAlert = Vue.inject('$fhcAlert');
+
+ async function fetch() {
+ try {
+ bookmarksRef.value = (await $api.call(ApiBookmark.getBookmarks())).data;
+ } catch(error) {
+ $fhcAlert.handleSystemError(error);
+ return error;
+ }
+ }
+
+ async function insert(title, url, tag, sort) {
+ try {
+ await $api.call(ApiBookmark.insert({ title, url, tag, sort }));
+ await fetch();
+ } catch(error) {
+ $fhcAlert.handleSystemError(error);
+ return error;
+ }
+ }
+
+ async function update(bookmark_id, title, url, tag) {
+ try {
+ await $api.call(ApiBookmark.update({ bookmark_id, title, url, tag }));
+ await fetch();
+ } catch(error) {
+ $fhcAlert.handleSystemError(error);
+ return error;
+ }
+ }
+
+ async function swap(bookmark_id_1, bookmark_id_2) {
+ try {
+ await $api.call(ApiBookmark.changeOrder(bookmark_id_1, bookmark_id_2));
+ await fetch();
+ } catch(error) {
+ $fhcAlert.handleSystemError(error);
+ return error;
+ }
+ }
+
+ async function remove(bookmark_id) {
+ try {
+ await $api.call(ApiBookmark.delete(bookmark_id));
+ await fetch();
+ } catch(error) {
+ $fhcAlert.handleSystemError(error);
+ return error;
+ }
+ }
+
+ return {
+ bookmarks: state,
+ getters: {
+ tags
+ },
+ actions: {
+ fetch,
+ insert,
+ update,
+ swap,
+ remove
+ }
+ };
+}
\ No newline at end of file
diff --git a/public/js/composables/Renderers.js b/public/js/composables/Renderers.js
new file mode 100644
index 000000000..c250c27b5
--- /dev/null
+++ b/public/js/composables/Renderers.js
@@ -0,0 +1,50 @@
+import ApiRenderers from '../api/factory/renderers.js';
+
+/**
+ * @return object { renderers: Object }
+ */
+export function useRenderers() {
+ /* Result Vars */
+ const renderers = Vue.ref(null);
+
+ /* Helper Vars */
+ const $api = Vue.inject('$api');
+ const $fhcAlert = Vue.inject('$fhcAlert');
+
+ /* Main Logic */
+ $api
+ .call(ApiRenderers.loadRenderers())
+ .then(res => {
+ const head = document.head;
+ for (const rendertype of Object.keys(res.data)) {
+ const renderersForType = {};
+ for (const name of Object.keys(res.data[rendertype])) {
+ const rendererUrl = res.data[rendertype][name];
+ if (rendererUrl.substr(-4) == ".css") {
+ // add to head
+ if (!head.querySelector(`link[href="${rendererUrl}"]`)) {
+ var link = document.createElement("link");
+ link.type = "text/css";
+ link.rel = "stylesheet";
+ link.href = rendererUrl;
+ head.appendChild(link);
+ }
+ } else {
+ renderersForType[name] = Vue.markRaw(
+ Vue.defineAsyncComponent(() => import(rendererUrl))
+ );
+ }
+ }
+ if (Object.keys(renderersForType).length) {
+ if (renderers.value === null)
+ renderers.value = {};
+ renderers.value[rendertype] = renderersForType;
+ }
+ }
+ })
+ .catch($fhcAlert.handleSystemErrors);
+
+ return {
+ renderers
+ };
+}
\ No newline at end of file
diff --git a/public/js/directives/dragClick.js b/public/js/directives/dragClick.js
index 5603eb93f..9e6048c9a 100644
--- a/public/js/directives/dragClick.js
+++ b/public/js/directives/dragClick.js
@@ -1,5 +1,12 @@
import { bindDragEnterLeave } from '../helpers/DragAndDrop.js';
+import { enableDragDropTouch } from "../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
+
+if (!document.dragDropTouchActive) {
+ enableDragDropTouch();
+ document.dragDropTouchActive = true;
+}
+
export default {
mounted(el, binding) {
const delay = parseInt(binding.arg) || 300;
diff --git a/public/js/directives/draggable.js b/public/js/directives/draggable.js
index 64747c15a..d534b9703 100644
--- a/public/js/directives/draggable.js
+++ b/public/js/directives/draggable.js
@@ -1,5 +1,12 @@
import { setTransferData, convertToValidDragObject } from '../helpers/DragAndDrop.js';
+import { enableDragDropTouch } from "../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
+
+if (!document.dragDropTouchActive) {
+ enableDragDropTouch();
+ document.dragDropTouchActive = true;
+}
+
const EFFECTS = [
'none',
'copy',
diff --git a/public/js/directives/drop.js b/public/js/directives/drop.js
index 4c50e1b8e..4e14c5296 100644
--- a/public/js/directives/drop.js
+++ b/public/js/directives/drop.js
@@ -1,5 +1,12 @@
import { getValidTransferData, eventHasTypes, bindDragEnterLeave } from '../helpers/DragAndDrop.js';
+import { enableDragDropTouch } from "../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
+
+if (!document.dragDropTouchActive) {
+ enableDragDropTouch();
+ document.dragDropTouchActive = true;
+}
+
const EFFECTS = [
'move',
'copy',
diff --git a/public/js/helpers/StringHelpers.js b/public/js/helpers/StringHelpers.js
index a67d0138f..16f8c3dbf 100644
--- a/public/js/helpers/StringHelpers.js
+++ b/public/js/helpers/StringHelpers.js
@@ -1,4 +1,19 @@
export function capitalize(string) {
if (!string) return '';
- return string[0].toUpperCase() + string.slice(1);
+
+ // ref unwrap if we receive such
+ if (Vue.isRef(string)) {
+ return Vue.computed(() => {
+ const val = Vue.unref(string);
+ return (val && typeof val === 'string') ? val.charAt(0).toUpperCase() + val.slice(1) : '';
+ });
+ }
+
+ // just a plain string, return a plain string
+ if (typeof string === 'string') {
+ return string.charAt(0).toUpperCase() + string.slice(1);
+ }
+
+ return '';
+
}
\ No newline at end of file
diff --git a/public/js/helpers/debounce.js b/public/js/helpers/debounce.js
new file mode 100644
index 000000000..09529b07c
--- /dev/null
+++ b/public/js/helpers/debounce.js
@@ -0,0 +1,9 @@
+export function debounce(fn, delay) {
+ let timeoutId;
+ return (...args) => {
+ clearTimeout(timeoutId);
+ timeoutId = setTimeout(() => {
+ fn(...args)
+ }, delay);
+ };
+}
diff --git a/public/js/lehre/pruefungsprotokoll.js b/public/js/lehre/pruefungsprotokoll.js
index 8af7d6f21..7261e7aff 100644
--- a/public/js/lehre/pruefungsprotokoll.js
+++ b/public/js/lehre/pruefungsprotokoll.js
@@ -11,11 +11,6 @@ $("document").ready(function() {
$("#saveProtocolBtn, #freigebenProtocolBtn").click(
function() {
- var freigebendata = {
- freigeben: false,
- password: null
- }
-
var data = {
abschlussbeurteilung_kurzbz: $("#abschlussbeurteilung_kurzbz").val(),
protokoll: $("#protokoll").val(),
@@ -25,11 +20,16 @@ $("document").ready(function() {
if ($(this).prop("id") === 'freigebenProtocolBtn')
{
- freigebendata.freigeben = true;
- freigebendata.password = $("#password").val();
+ Pruefungsprotokoll.freigebendata.freigeben = true;
+ Pruefungsprotokoll.freigebendata.password = $("#password").val();
+ }
+ else
+ {
+ Pruefungsprotokoll.freigebendata.freigeben = false;
+ Pruefungsprotokoll.freigebendata.password = null;
}
- var checkFields = Pruefungsprotokoll.checkFields(data, freigebendata, $("#verfCheck").prop('checked'));
+ var checkFields = Pruefungsprotokoll.checkFields(data, $("#verfCheck").prop('checked'));
$("#protocolform td").removeClass('has-error');
if (checkFields.length > 0)
{
@@ -50,7 +50,7 @@ $("document").ready(function() {
return;
}
- Pruefungsprotokoll.saveProtokoll($("#abschlusspruefung_id").val(), freigebendata, data);
+ Pruefungsprotokoll.saveProtokoll($("#abschlusspruefung_id").val(), data);
}
)
@@ -71,6 +71,10 @@ $("document").ready(function() {
var Pruefungsprotokoll = {
abschlussbeurteilung_kurzbz: '',
+ freigebendata: {
+ freigeben: false,
+ password: null
+ },
checkVerfassung: function()
{
// if student not mentally and physically fit (checkbox), no grade can be set
@@ -85,11 +89,11 @@ var Pruefungsprotokoll = {
$("#verfNotice").html(FHC_PhrasesLib.t("abschlusspruefung", "verfNotice"));
}
},
- checkFields: function(data, freigebendata, verfChecked)
+ checkFields: function(data, verfChecked)
{
var errors = [];
- if (data.abschlussbeurteilung_kurzbz == "" && freigebendata.freigeben === true && verfChecked)
+ if (data.abschlussbeurteilung_kurzbz == "" && Pruefungsprotokoll.freigebendata.freigeben === true && verfChecked)
errors.push({"abschlussbeurteilung_kurzbz": FHC_PhrasesLib.t("abschlusspruefung", "abschlussbeurteilungLeer")});
var zeitregex = /^[0-2][0-9]:[0-5][0-9]$/;
@@ -115,15 +119,19 @@ var Pruefungsprotokoll = {
return errors;
},
+ setSaveButtonDisabled: function()
+ {
+ $("#saveProtocolBtn").prop("disabled", true).prop("title", FHC_PhrasesLib.t("abschlusspruefung", "bereitsFreigegeben"));
+ },
// ajax calls
// -----------------------------------------------------------------------------------------------------------------
- saveProtokoll: function(abschlusspruefung_id, freigeben, data)
+ saveProtokoll: function(abschlusspruefung_id, data)
{
FHC_AjaxClient.ajaxCallPost(
CALLED_PATH + '/saveProtokoll',
{
abschlusspruefung_id: abschlusspruefung_id,
- freigebendata: freigeben,
+ freigebendata: Pruefungsprotokoll.freigebendata,
protocoldata: data
},
{
@@ -133,7 +141,7 @@ var Pruefungsprotokoll = {
var dataresponse = FHC_AjaxClient.getData(data);
if (dataresponse.freigabedatum)
{
- $("#saveProtocolBtn").prop("disabled", true);
+ Pruefungsprotokoll.setSaveButtonDisabled();
$("#freigegebenText").html(' ' + FHC_PhrasesLib.t("abschlusspruefung", "freigegebenAm") +
' ' + dataresponse.freigabedatum)
}
diff --git a/public/js/tabulator/formatter/centered.js b/public/js/tabulator/formatter/centered.js
new file mode 100644
index 000000000..3c38f4d4d
--- /dev/null
+++ b/public/js/tabulator/formatter/centered.js
@@ -0,0 +1,5 @@
+export function centeredFormatter (cell)
+{
+ const val = cell.getValue()
+ return '
'+val+'
'
+}
\ No newline at end of file
diff --git a/system/checksystem.php b/system/checksystem.php
index 4af8bc56d..1f7968282 100644
--- a/system/checksystem.php
+++ b/system/checksystem.php
@@ -150,6 +150,7 @@ $berechtigungen = array(
array('lehre','Berechtigung fuer CIS-Seite'),
array('lehre/abgabetool','Projektabgabetool, Studentenansicht'),
array('lehre/abgabetool:download','Download von Projektarbeitsabgaben'),
+ array('lehre/benotungstool','Cis4 Gesamtnoteneingabe'),
array('lehre/freifach','Freifachverwaltung'),
array('lehre/lehrfach','Lehrfachverwaltung'),
array('lehre/lehrfach:begrenzt','Lehrfachverwaltung - nur aktiv aenderbar, nur aktive LF werden angezeigt'),
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index 8b6af9f2d..007cd04dd 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -94,6 +94,9 @@ require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php');
require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php');
require_once('dbupdate_3.4/70376_lohnguide.php');
+require_once('dbupdate_3.4/76150_perm_other_lv_plan.php');
+require_once('dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php');
+require_once('dbupdate_3.4/68530_Dashboard_Cleanup.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '
Pruefe Tabellen und Attribute!
';
@@ -467,7 +470,7 @@ $tabellen=array(
"wawi.tbl_rechnungsbetrag" => array("rechnungsbetrag_id","rechnung_id","mwst","betrag","bezeichnung","ext_id"),
"wawi.tbl_aufteilung" => array("aufteilung_id","bestellung_id","oe_kurzbz","anteil","insertamum","insertvon","updateamum","updatevon"),
"wawi.tbl_aufteilung_default" => array("aufteilung_id","kostenstelle_id","oe_kurzbz","anteil","insertamum","insertvon","updateamum","updatevon"),
- "dashboard.tbl_bookmark" => array("bookmark_id","uid","url","title","tag","insertamum","insertvon","updateamum","updatevon"),
+ "dashboard.tbl_bookmark" => array("bookmark_id","uid","url","title","tag","insertamum","insertvon","updateamum","updatevon","sort"),
);
diff --git a/system/dbupdate_3.4/60873_gesamtnoteneingabe_cis4.php b/system/dbupdate_3.4/60873_gesamtnoteneingabe_cis4.php
new file mode 100644
index 000000000..4ae2e38d5
--- /dev/null
+++ b/system/dbupdate_3.4/60873_gesamtnoteneingabe_cis4.php
@@ -0,0 +1,17 @@
+db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'Notenfreigabe'"))
+{
+ if($db->db_num_rows($result) === 0)
+ {
+ $qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
+ VALUES ('Notenfreigabe', 'Notenfreigabe', null, 'text/html')
+ ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
+
+ if(!$db->db_query($qry))
+ echo '
system.tbl_vorlage: '.$db->db_last_error().'';
+ else
+ echo "
system.tbl_vorlage Notenfreigabe hinzugefuegt";
+ }
+}
\ No newline at end of file
diff --git a/system/dbupdate_3.4/68530_Dashboard_Cleanup.php b/system/dbupdate_3.4/68530_Dashboard_Cleanup.php
new file mode 100644
index 000000000..918711211
--- /dev/null
+++ b/system/dbupdate_3.4/68530_Dashboard_Cleanup.php
@@ -0,0 +1,91 @@
+,
+ *
+ * Description:
+ * Cleanup Dashboard DB data
+ */
+if (! defined('DB_NAME')) exit('No direct script access allowed');
+
+// Cleanup presets
+if ($result = @$db->db_query("
+ SELECT 1
+ FROM dashboard.tbl_dashboard_preset
+ WHERE preset ? COALESCE(funktion_kurzbz, 'general')
+ OR preset ? 'custom'
+ LIMIT 1
+")) {
+ if ($db->db_num_rows($result)) {
+ $qry = "
+ UPDATE dashboard.tbl_dashboard_preset
+ SET preset = COALESCE(preset->COALESCE(funktion_kurzbz, 'general'), preset->'custom')->'widgets'
+ WHERE preset ? COALESCE(funktion_kurzbz, 'general')
+ OR preset ? 'custom'
+ ";
+
+ $result = $db->db_query($qry);
+
+ if (!$result) {
+ echo '
dashboard.tbl_dashboard_preset '.$db->db_last_error().'';
+ } else {
+ $affected_rows = $db->db_affected_rows($result);
+ echo 'dashboard.tbl_dashboard_preset: ' . $affected_rows . ' rows migrated
';
+ }
+ }
+}
+
+// Cleanup user overrides
+if ($result = @$db->db_query("
+ SELECT 1
+ FROM dashboard.tbl_dashboard_benutzer_override
+ WHERE EXISTS (
+ SELECT 1
+ FROM jsonb_each(override)
+ WHERE value ? 'widgets'
+ LIMIT 1
+ ) AND override <> '[]'::jsonb
+ LIMIT 1
+")) {
+ if ($db->db_num_rows($result)) {
+ $qry = "
+ UPDATE dashboard.tbl_dashboard_benutzer_override
+ SET override = COALESCE((
+ SELECT json_object_agg(key, value) FROM (
+ SELECT value->'widgets' AS widgets
+ FROM jsonb_each(override)
+ WHERE jsonb_typeof(value->'widgets') = 'object'
+ ) x, jsonb_each(widgets)
+ ), '[]')
+ WHERE EXISTS (
+ SELECT 1
+ FROM jsonb_each(override)
+ WHERE value ? 'widgets'
+ LIMIT 1
+ ) AND override <> '[]'::jsonb
+ ";
+
+ $result = $db->db_query($qry);
+
+ if (!$result) {
+ echo '
dashboard.tbl_dashboard_benutzer_override '.$db->db_last_error().'';
+ } else {
+ $affected_rows = $db->db_affected_rows($result);
+ echo 'dashboard.tbl_dashboard_benutzer_override: ' . $affected_rows . ' rows migrated
';
+ }
+ }
+}
diff --git a/system/dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php b/system/dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php
new file mode 100644
index 000000000..ccef52686
--- /dev/null
+++ b/system/dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php
@@ -0,0 +1,57 @@
+db_query("SELECT sort FROM dashboard.tbl_bookmark LIMIT 1")) {
+ $qry = "ALTER TABLE dashboard.tbl_bookmark ADD COLUMN sort integer DEFAULT NULL;
+ COMMENT ON COLUMN dashboard.tbl_bookmark.sort IS 'Sort Index for Bookmark.';
+ ";
+
+ if (!$db->db_query($qry))
+ echo '
dashboard.tbl_bookmark ' . $db->db_last_error() . '';
+ else
+ echo '
Spalte sort zu Tabelle dashboard.tbl_bookmark hinzugefügt';
+
+ //add preliminary Sort for all bookmarks if NULL
+ if(@$db->db_query("SELECT sort FROM dashboard.tbl_bookmark LIMIT 1")) {
+ $qry = "WITH ranked AS (
+ SELECT
+ t1.bookmark_id,
+ (
+ SELECT COUNT(*)
+ FROM dashboard.tbl_bookmark t2
+ WHERE t2.uid = t1.uid
+ AND t2.bookmark_id <= t1.bookmark_id
+ ) AS rn
+ FROM dashboard.tbl_bookmark t1
+ )
+ UPDATE dashboard.tbl_bookmark t
+ SET sort = ranked.rn
+ FROM ranked
+ WHERE t.bookmark_id = ranked.bookmark_id
+ AND t.sort IS NULL;";
+
+ if (!$db->db_query($qry))
+ echo '
dashboard.tbl_bookmark ' . $db->db_last_error() . '';
+ else
+ echo '
Tabelle dashboard.tbl_bookmark: Spalte sort mit vorläufiger Sortierung befüllt';
+ }
+}
+
+//set column tag to type JSONB
+if($result = @$db->db_query("SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='dashboard'
+ AND TABLE_NAME='tbl_bookmark' AND COLUMN_NAME = 'tag'
+ AND DATA_TYPE='character varying' AND character_maximum_length='255';"))
+{
+ $qry = "
+ ALTER TABLE dashboard.tbl_bookmark
+ ALTER COLUMN tag TYPE jsonb
+ USING tag::jsonb;
+ ";
+
+ if (!$db->db_query($qry))
+ echo '
dashboard.tbl_bookmark ' . $db->db_last_error() . '';
+ else
+ echo '
Tabelle dashboard.tbl_bookmark: Spalte tag auf Typ JSONB geändert';
+
+}
\ No newline at end of file
diff --git a/system/dbupdate_3.4/76150_perm_other_lv_plan.php b/system/dbupdate_3.4/76150_perm_other_lv_plan.php
new file mode 100644
index 000000000..9a23a4cb2
--- /dev/null
+++ b/system/dbupdate_3.4/76150_perm_other_lv_plan.php
@@ -0,0 +1,41 @@
+,
+ *
+ * Beschreibung:
+ * Permission basis/other_lv_plan
+ */
+if (! defined('DB_NAME')) exit('No direct script access allowed');
+
+// Add permission: basis/gehaelter
+if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/other_lv_plan';"))
+{
+ if($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('basis/other_lv_plan', 'Permission holder can view other users timetables (LV plans)');";
+
+ if(!$db->db_query($qry))
+ {
+ echo '
system.tbl_berechtigung '.$db->db_last_error().'';
+ }
+ else
+ {
+ echo 'system.tbl_berechtigung: Added permission "basis/other_lv_plan"
';
+ }
+ }
+}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 05bdfbbef..b46d0a2d6 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -29582,6 +29582,126 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Persönlichen LV-Plan abonnieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Subscribe to personal schedule',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync_instructions',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anleitung LV-Plan Synchronisation',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Instructions for synchronizing your schedule',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync_cal_dav',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync_cal_dav_principal',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'CalDAV Principal URL (MacOS, iOS)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'CalDAV Principal URL (MacOS, iOS)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync_i_cal',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'iCAL URL (Google)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'iCAL URL (Google)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'profil',
+ 'phrase' => 'calendar_sync_clipboard_copy_confirmation',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'URL in die Zwischenablage kopiert.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'URL copied to clipboard.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
//Profil Phrasen ende
// LvPlan Phrasen start
array(
@@ -31409,6 +31529,88 @@ array(
),
//ProfilUpdate Phrasen ende
+ //Studium Phrasen start
+ array(
+ 'app' => 'core',
+ 'category' => 'studium',
+ 'phrase' => 'studium',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studium',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Study',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studium',
+ 'phrase' => 'studienordnung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studienordnung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Study regulation',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studium',
+ 'phrase' => 'lektoren',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lektoren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Lecturers',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studium',
+ 'phrase' => 'studiensemester',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studiensemester',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Study semester',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // Studium Phrasen Ende
array(
'app' => 'core',
'category' => 'global',
@@ -35540,6 +35742,227 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'editFilter',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Filter bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'edit Filter',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'filterByTags',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nach Tags Filtern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'filter by Tags',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'sortDownwards',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nach unten verschieben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'sort downwards',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'sortToTop',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nach oben verschieben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'sort to top',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'deleteBookmark',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lesezeichen löschen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'delete Bookmark',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'editBookmark',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lesezeichen bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'edit Bookmark',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'filterUpdated',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Filteraktion erfolgreich durchgeführt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'filter updated successfully',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'errorInputNecessary',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Eingabe eines Zeichens erforderlich',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'One character must be entered',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'noFilter',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kein Filter für Lesezeichen ausgewählt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No bookmark filter entered',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'headerFilterBookmark',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lesezeichen filtern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Filter Bookmarks',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bookmark',
+ 'phrase' => 'adminMode',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Inhalt kann nicht im Administrator Modus angezeigt werden.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Content can not be displayed in administrator mode.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // BOOKMARK PHRASEN END ----------------------------------------------------------------------
array(
'app' => 'core',
'category' => 'global',
@@ -38121,6 +38544,26 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'lvUebersicht',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lehrveranstaltungs Übersicht',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Course Overview',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'lehre',
@@ -47126,6 +47569,26 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'edit',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dashboard bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit dashboard',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'dashboard',
@@ -47146,6 +47609,46 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'createWidget',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Neues Widget hinzufügen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Create new widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'noWidgetsAvailable',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine Widgets verfügbar',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No Widgets available',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'dashboard',
@@ -47226,6 +47729,266 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widgetFromGeneralSection',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dieses Widget ist für das Dashboard vordefiniert',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'This is a predefined widget of this dashboard',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widgetFromCustomSection',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dieses Widget wurde von Ihnen hinzugefügt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'This widget has been added by you',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widgetFromFunktionSection',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dieses Widget wurde hinzugefügt weil Sie der "{0}" Funktion zugewiesen wurden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'This widget has been added because you have been assigned to the "{0}" function',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_pin',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Pin Widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Pin widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_unpin',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Unpin Widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Unpin widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_toggle_visiblity',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Sichtbarkeit des Widgets umschalten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Toggle widget visibility',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_move',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Widget verschieben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Move widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_resize',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Widgetgröße anpassen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Resize widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_delete',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Widget löschen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Delete widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_configure',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Widget konfigurieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Configure widget',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_config_title',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '"{name}" konfigurieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Configure "{name}"',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'widget_link',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Widget link',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Widget link',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'dashboard',
+ 'phrase' => 'kurzbz',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Name',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Identifier',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
// CIS4 phrases from legacy code end
// FHC4 Phrases Abschlusspruefung
array(
@@ -49336,6 +50099,46 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'special_group',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Spezialgruppe',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Special group',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'new_reservierung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Neue Reservierung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'New reservation',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
// feature-55614 end
array(
'app' => 'softwarebereitstellung',
@@ -58297,6 +59100,2316 @@ I have been informed that I am under no obligation to consent to the transmissio
)
),
// ### Phrases Dashboard Admin END
+ // ### LvPlanStgOrg START ###
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'noStgProvided',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'kein Studiengang hinterlegt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'no degree-program provided',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'headerLvPlanLvVerband',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lv-Plan Lehrverband',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Course-Plan Teaching Association',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'chooseStg',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studiengang auswählen...',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select a degree-program...',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'loadLvPlan',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lehrverband laden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Load Course-Plan',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'backToDropdown',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zurück zum Auswahl-Dropdown',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Back to Dropdown',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'error_SemMissing',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Semester wählen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select a semester',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'LvPlan',
+ 'phrase' => 'error_VerbandMissing',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Verband wählen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select a verband',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // ### LvPlanStgOrg END ###
+ // DMS-Link Phrasen Start
+ array(
+ 'app' => 'core',
+ 'category' => 'DMS-Link',
+ 'phrase' => 'lvplanSyncFAQ',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '7188',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '7188',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // DMS-Link Phrasen End
+ // ### Start Notenstatistik
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'hinweis',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Hinweis',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Notice',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'noticeAverage',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Bitte beachten Sie, dass außercurriculare Lehrveranstaltungen (zB Freifächer) den errechneten Notendurchschnitt verfälschen können.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Please note that extracurricular courses (e.g., electives) can distort the calculated grade point average.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'noticeWeightedAverage',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Der gewichtete Notendurchschnitt errechnet sich aus der Note der Lehrveranstaltung, multipliziert mit deren ECTS, dividiert durch die Summe aller ECTS.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'The weighted average grade is calculated by multiplying the grade of the course by its ECTS credits and dividing by the sum of all ECTS credits.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'headerAverage',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Notendurchschnitt* der Zeugnisnote',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Average grade* of report card grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'headerWeightedAverage',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gewichteter** Notendurchschnitt* der Zeugnisnote',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Weighted** average grade* of report card grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'notenstatistik',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Leistungsübersicht',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Performance overview',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'lehre',
+ 'phrase' => 'info_noGradesYet',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Es wurden noch keine Beurteilungen eingetragen.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No grades have been entered yet.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // ### End Notenstatistik
+ //**************************** CIS Projektabgabeuebersicht start
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'projektabgabeUebersicht',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Projektabgabe Übersicht',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Project work submission overview',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'studiengang',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studiengang',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'study program',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'studiengangWaehlen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studiengang auswählen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select study program',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'abgabetypWaehlen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Abgabetyp auswählen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select type of submission',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'terminWaehlen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Termin auswählen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Select due date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'personsuche',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Personsuche',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'person search',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'anzeigen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Abgaben anzeigen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Show submissions',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'zipDownload',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'ZIP herunterladen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Download ZIP',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'paabgabeid',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Projektabgabe ID',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'thesis submission ID',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'projektarbeitid',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Projektarbeit ID',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'projekt work ID',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'termin',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Termin',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'due date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'personStatus',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Personstatus',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'person status',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'nichtsAusgewaehlt',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nichts ausgewählt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No selection',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'keineDateienVorhanden',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine Dateien vorhanden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No files available',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ //**************************** CIS Projektabgabeuebersicht ende
+ // CIS4 GESAMTNOTENEINGABE START -----------------------------------------------------------------------------------
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'benotungstoolTitle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gesamtnote',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Final Grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4mail',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kontakt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Email',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4vorname',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Vorname',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'First Name',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4antrittCountv2',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Antritte',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attempts',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4nachname',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nachname',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Last Name',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4mobility',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Mobilität',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Mobility',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4positiv',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Positiv',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'positive',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4negativ',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Negativ',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Negative',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4noteEmpty',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Unbenotet',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Ungraded',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4notenImportieren',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Noten Import',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Import Grades',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4import',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Importieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Import',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4teilnoten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Teilnoten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Partial Grades',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4notenvorschlag',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Notenvorschlag',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grade Suggestion',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4lvnote',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'LV-Note',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Subject grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4freigabe',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Freigabe',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Approval',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4password',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Passwort',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Password',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4zeugnisnote',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zeugnisnote',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Transcript Grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4date',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datum',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4grade',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Note',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4termin1',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Nachprüfung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Re-examination',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4termin2',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '2. Nebenprüfungstermin',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '2nd subsidiary examination date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4kommPruef',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kommissionelle Prüfung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Oral Examination',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4anlegen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anlegen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Create',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4change',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Ändern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Change',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4import',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Importieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Import',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4changedGradesAvailable',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Es sind geänderte Noten vorhanden. Geben Sie diese frei, um die Assistenz zu informieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'There are changed grades. Please send the changes to the assistant by clicking "Approval"',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4gradeListExcel',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Notenliste für den LV-Noten-Import (Excel)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grade list for the subject grade import (Excel)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'passwort',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Passwort',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Password',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'pruefungNr',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung Nr. {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Examination No. {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'freigabecounterPositiv',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Sie können {0} Noten freigeben!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'You are able to approve {0} grades!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noteneingabeSpeichern',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Noteneingabe speichern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Save note entry',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noteneingabeSpeichern',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Noteneingabe speichern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Save note entry',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noteneingabeBestätigen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Noten bestätigen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Confirm grades',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'createPruefungFor',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung erstellen für',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Create examination for',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'editPruefungFor',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung bearbeiten für',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit examination for',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'approveGradesv2',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '{0} Noten freigeben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Approve {0} Grades',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4originalZnote',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Ursprüngliche Zeugnisnote',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Original Transcript Grade',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4addNewPruefung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Neues Prüfungsdatum anlegen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Create new exam date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'prueflingSelectionv2',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studierende',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Examinees',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'notenImportSuccessAlert',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Noten erfolgreich importiert',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grades successfully imported',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'pruefungImportSuccessAlert',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfungen erfolgreich importiert und gespeichert',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Exams successfully imported and saved',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'changePruefungButtonText',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Ändern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Change',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'addPruefungButtonText',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Hinzufügen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Create',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'pruefungSaveForUid',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung für Studierenden {0} gespeichert',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Exam for student {0} has been saved',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'pruefungAngelegtAn',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung an {0} angelegt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Exam on {0} has been created',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noValidLvFoundForId',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine gültige Lehrveranstaltung gefunden für ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No valid course found for ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noValidStudiengangFoundForId',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kein gültiger Studiengang gefunden für ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No valid study program found for ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'noValidPersonFoundForId',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine gültige Person gefunden für ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No Valid Person found for ID: {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'wrongPruefungType',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfung für Studierenden {0} konnte nicht bearbeitet werden, {1} ist keine gültiger Prüfungstyp.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Exam for Student {0} was not saved, {1} is not a valid exam type.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'notenfreigabe',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Notenfreigabe',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grades Approval',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'notenfreigabeHinweistextv4',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '
+ Wenn alle einzutragenden Noten vermerkt sind (Nachtragung jederzeit möglich) können diese per Klick auf Freigabe für die Studiengangsassistenz freigegeben werden.
+
+ Aus Gründen der erhöhten Sicherheit ist bei der Freigabe der Noten die Eingabe Ihres Passwortes erforderlich.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '
+ Once all grades to be entered have been recorded (additions are possible at any time), they can be released to the program assistant by clicking on "Confirm Grades"
+
+ For increased security reasons, you will be required to enter your password when releasing grades.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'notenimportHinweistextv5',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '• Laden Sie sich die Notenliste im Excel-Format unter CIS → Lehrveranstaltungen → Anwesenheits- und Notenlisten → Notenliste herunter.
+ • Tragen Sie die Noten in das Dokument und speichern Sie dieses.
+ • Markieren Sie im Excel-Dokument die Inhalte der Spalten Personenkennzeichen und Note für jene Studierende, deren Noten Sie importieren möchten (ohne Überschrift !)
+ • Kopieren Sie die markierten Inhalte mittels strg + c oder Bearbeiten → Kopieren in die Zwischenablage
+ • Einfügen der Inhalte mittels strg + v oder Bearbeiten → Einfügen
+ • Mit einem Klick auf Import werden die Noten übernommen.
',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '• Download the grade list in Excel format from CIS → Courses → Attendance and Grade Lists → Grade List.
+ • Enter the grades into the document and save it.
+ • In the Excel document, select the contents of the Person ID and Grade columns for the students whose grades you want to import (without headings!).
+ • Copy the selected content to the clipboard using Ctrl + c or Edit → Copy.
+ • Paste the content using Ctrl + v or Edit → Paste.
+ • Click Import to import the grades.
',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4anwesenheitsquote',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheit',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attendance',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4keineLvNoteEingetragen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine LV Note eingetragen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No Subject Grade entered',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4pruefungAnlageError',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Prüfungstermin anlegen für {0} fehlgeschlagen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Not possible to allocate exam on {0}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4punkte',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Punkte',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Points',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4notenvorschlagUebernehmen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Vorschlag übernehmen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'apply suggestion',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4importNoStudentFoundForIdInRow',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine StudentIn gefunden für ID {0} in Zeile Nr. {1}. Die Zeile wurde übersprungen.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No student found for ID {0} in row no. {1}. The row has been skipped.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4importNoGradeFoundForIdInRow',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine Note gefunden für ID {0} in Zeile Nr. {1}. Die Zeile wurde übersprungen.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No grade found for ID {0} in row no. {1}. The row has been skipped.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'benotungstool',
+ 'phrase' => 'c4importInvalidDateFoundForIdInRow',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Ungültiges Datumformat für ID {0} in Zeile Nr. {1}. Bitte verwenden Sie das Format "DD.MM.YYYY". Die Zeile wurde übersprungen.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Invalid date found for ID {0} in row no. {1}. Please use the format "DD.MM.YYYY". The row has been skipped.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // CIS4 GESAMTNOTENEINGABE ENDE ------------------------------------------------------------------------------------
+ //**************************** Pruefungsprotokolle start
+ array(
+ 'app' => 'core',
+ 'category' => 'abschlusspruefung',
+ 'phrase' => 'bereitsFreigegeben',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Protokoll ist bereits freigegeben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Record of examination already approved',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'abschlusspruefung',
+ 'phrase' => 'spracheDerArbeit',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Sprache der',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Language of',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ //**************************** Pruefungsprotokolle end
+ //// ### ZEITSPERREN START
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'eheschliessung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Eigene Eheschließung oder Verpartnerung (3 Tage)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Own marriage or civil partnership (3 days)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'geburt',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Geburt eines Kindes der Ehefrau/Lebensgefährtin (2 Tage)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Birth of a child of the wife/partner (2 days)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'heirat',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Eheschließung oder Verpartnerung eines Kindes/eigener Geschwister (1 Tag)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Marriage or civil partnership of a child or own sibling (1 day)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'sponsion',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Teilnahme an eigener Sponsion/Promotion (1 Tag)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Participation in own graduation/promotion ceremony (1 day)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'erkrankung_lebensbedr',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Lebensbedrohliche Erkrankung Partner/Kinder/Eltern (3 Tage)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Life-threatening illness of partner/children/parents (3 days)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'ableben',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Ableben Partner/Kinder/Elternteil (3 Tage)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Death of partner/children/parent (3 days)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'bestattung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Teilnahme an Bestattung Geschwister/Schwiegereltern/eigener Großeltern (1 Tag)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attendance at the funeral of siblings/parents-in-law/own grandparents (1 day)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'umzug',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Wohnungswechsel in eigenen Haushalt (2 Tage)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Moving to your own home (2 days)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'bundesheer',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Einberufung Bundesheer',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Conscription of the Austrian Armed Forces',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'volksschultag',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'erster Volksschultag (1 Tag)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'First day of primary school (1 day)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'error_VonDatumGroesserAlsBisDatum',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'VonDatum ist größer als BisDatum',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'The start date is greater than the end date.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'error_zeitraumAuffallendHoch',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Achtung, eingegebener Zeitraum ist auffallend hoch. \nWollen Sie die Daten dennoch speichern?',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attention, the entered time period is unusually long. Do you still want to save the data?',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'stunde',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Stunde(inklusive)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Hour(inclusive)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'stunde_von',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Stunde(von)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'hour(from)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'stunde_bis',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Stunde(bis)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'hour(to)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'addZeitsperre',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zeitsperre hinzufügen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'add Timelock',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'saveZeitsperre',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zeitsperre speichern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'save Timelock',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'noAdmin',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Für diese Aktion benötigen Sie Administratorenrechte',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'You need administrator rights to perform this action.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'noPermission',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Sie haben keine Berechtigung, für einen anderen User einen Datensatz anzulegen, zu bearbeiten oder zu löschen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'You do not have permission to create, edit, or delete a record for another user.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'info_zeitsperrenMoreDays',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Es werden alle eingegebenen Tage bei der Berechnung berücksichtigt. Daher müssen mehrtägige Zeitsperren an Unterbrechungen wie Wochenenden oder Feiertagen unterteilt werden!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'All entered days will be included in the calculation. Therefore, multi-day time blocks must be broken down by breaks such as weekends or holidays!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'header_zeitsperren',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Meine Zeitsperren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'My timelocks',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'error_existingZeitaufzeichnung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Es existiert mindestens eine Zeitaufzeichnung im angegebenen Zeitraum',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'At least one time recording exists within the specified period.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'zeitsperren',
+ 'phrase' => 'error_existingZeitsperre',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zeitsperre vom Typ {typ} vorhanden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Time lock of type {type} exists',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ /// ### ZEITSPERREN END
array(
'app' => 'core',
'category' => 'stv',