diff --git a/documentation/changelog.html b/documentation/changelog.html index 9844bafc7f..5fe445c94d 100755 --- a/documentation/changelog.html +++ b/documentation/changelog.html @@ -110,6 +110,412 @@ +
+ +

Chamilo 1.11.28 - Alcatraz, 21/10/2024

+

Release notes - summary

+

Chamilo 1.11.28 is a security fix release on top of 1.11.26.

+

Release name

+

Alcatraz (United States) is famous for its time as a federal prison with high security. This version of Chamilo will probably remain just as famous as it is filled with security improvements. A vast community of white hat hackers has undertaken the task of finding any little issue that could lead to harm being done to your users, your servers, your institution, and this has resulted in this new version.

+

Security fixes

+ +

Notable new Features

+

For end-users, teachers and Chamilo admins

+ These features are immediately available to users through the web interface.
+ +

For developers and sysadmins

+ Although most features here will be used by teachers or Chamilo admins, they require sysadmin privileges to enable them on the server. + +

Improvements (minor features) and debug

+ In reverse chronological order... + +

Stylesheets and theming

+ +

Web services

+ +

Removals

+ +

Known issues

+ +
+

Chamilo 1.11.26 - Florenville, 27/09/2023

diff --git a/main/inc/ajax/session_clock.ajax.php b/main/inc/ajax/session_clock.ajax.php new file mode 100644 index 0000000000..2ecc8afda8 --- /dev/null +++ b/main/inc/ajax/session_clock.ajax.php @@ -0,0 +1,75 @@ +getConfigurationFile())) { + require_once $kernel->getConfigurationFile(); + $alreadyInstalled = true; + } + + // Load the API library BEFORE loading the Chamilo configuration + require_once $_configuration['root_sys'].'main/inc/lib/api.lib.php'; + + if (api_get_configuration_value('session_lifetime_controller')) { + // Get the session + session_name('ch_sid'); + session_start(); + + $session = new ChamiloSession(); + + $endTime = 0; + $isExpired = false; + $timeLeft = -1; + + $currentTime = time(); + + // Existing code for time action + if ($alreadyInstalled && api_get_user_id()) { + $endTime = $session->end_time(); + $isExpired = $session->is_expired(); + } else { + // Chamilo not installed or user not logged in + $endTime = $currentTime + 315360000; // This sets a default end time far in the future + $isExpired = false; + } + + $timeLeft = $endTime - $currentTime; + } + else { + $endTime = 999999; + $isExpired = false; + $timeLeft = 999999; + } + + if ($endTime > 0) { + echo json_encode(['sessionEndDate' => $endTime, 'sessionTimeLeft' => $timeLeft, 'sessionExpired' => $isExpired]); + } else { + http_response_code(500); + echo json_encode(['error' => 'Error retrieving data from the current session']); + } + } elseif ($action == 'logout') { + require_once __DIR__.'/../../../main/inc/global-min.inc.php'; + + $userId = api_get_user_id(); + online_logout($userId, false); + echo json_encode(['message' => 'Logged out successfully']); + } else { + // Handle unexpected action value + http_response_code(400); + echo json_encode(['error' => 'Invalid action parameter']); + } +} else { + // No action provided + http_response_code(400); + echo json_encode(['error' => 'No action parameter provided']); +} \ No newline at end of file diff --git a/main/inc/lib/banner.lib.php b/main/inc/lib/banner.lib.php index bf1cad05de..e59369c065 100755 --- a/main/inc/lib/banner.lib.php +++ b/main/inc/lib/banner.lib.php @@ -89,19 +89,22 @@ function get_tabs($courseId = null) $navigation['session_my_space']['key'] = 'my-space'; $navigation['session_my_space']['icon'] = 'my-space.png'; } else { - $navigation['session_my_progress']['url'] = api_get_path(WEB_CODE_PATH); - // Link to my progress - switch (api_get_setting('gamification_mode')) { - case 1: - $navigation['session_my_progress']['url'] .= 'gamification/my_progress.php'; - break; - default: - $navigation['session_my_progress']['url'] .= 'auth/my_progress.php'; - } + $hideMyProgressTab = api_get_configuration_value('hide_my_progress_tab'); + if (true !== $hideMyProgressTab) { + $navigation['session_my_progress']['url'] = api_get_path(WEB_CODE_PATH); + // Link to my progress + switch (api_get_setting('gamification_mode')) { + case 1: + $navigation['session_my_progress']['url'] .= 'gamification/my_progress.php'; + break; + default: + $navigation['session_my_progress']['url'] .= 'auth/my_progress.php'; + } - $navigation['session_my_progress']['title'] = get_lang('MyProgress'); - $navigation['session_my_progress']['key'] = 'my-progress'; - $navigation['session_my_progress']['icon'] = 'my-progress.png'; + $navigation['session_my_progress']['title'] = get_lang('MyProgress'); + $navigation['session_my_progress']['key'] = 'my-progress'; + $navigation['session_my_progress']['icon'] = 'my-progress.png'; + } } } diff --git a/main/inc/lib/display.lib.php b/main/inc/lib/display.lib.php index 4596916409..089cf495d1 100755 --- a/main/inc/lib/display.lib.php +++ b/main/inc/lib/display.lib.php @@ -1572,6 +1572,11 @@ class Display $row = Database::fetch_array($result, 'ASSOC'); $latestDate = $row['access_date']; } + // Get a timestamp format copy, for use in c_lp_item_view below + $originalTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $latestTimestamp = strtotime($latestDate); + date_default_timezone_set($originalTimeZone); $sessionCondition = api_get_session_condition( $sessionId, @@ -1596,6 +1601,7 @@ class Display $group_ids[] = 0; //add group 'everyone' $notifications = []; if ($tools) { + $latestLocalDate = $latestDate; foreach ($tools as $tool) { $toolName = $tool['name']; $toolName = Database::escape_string($toolName); @@ -1604,6 +1610,13 @@ class Display if ($toolName == 'student_publication' || $toolName == 'work') { $toolCondition = " (tool = 'work' OR tool = 'student_publication') AND "; } + if ($toolName == 'learnpath') { + // Make sure c_lp_item_view is considered in the latestDate calculation for LPs + $lpLatest = self::getLatestLpView($course_id, $user_id, $sessionId, $latestTimestamp); + if (!empty($lpLatest)) { + $latestLocalDate = $lpLatest; + } + } $toolName = addslashes($toolName); @@ -1614,7 +1627,7 @@ class Display lastedit_type NOT LIKE '%Deleted%' AND lastedit_type NOT LIKE '%deleted%' AND lastedit_type NOT LIKE '%DocumentInvisible%' AND - lastedit_date > '$latestDate' AND + lastedit_date > '$latestLocalDate' AND lastedit_user_id != $user_id $sessionCondition AND visibility != 2 AND (to_user_id IN ('$user_id', '0') OR to_user_id IS NULL) AND @@ -3071,4 +3084,40 @@ HTML; return "$header
$percentHtml"; } + + /** + * Get the latest view (later than given date) in any LP in this course/session + * as datetime format, or null + * @param int $courseId + * @param int $userId + * @param int $sessionId + * @param int $latestTimestamp The latest time for the tool in general, as obtained through track_e_access + * @return string|null The latest view if later than $latestTimestamp, or null otherwise + */ + public static function getLatestLpView(int $courseId, int $userId, int $sessionId, int $latestTimestamp): ?string + { + // Control if the latest view in c_lp_view is more recent than in track_e_access + // Use case: a user skipped the course home page by following a direct link to a LP in an email + // $latestDate is in datetime format, while c_lp_item_view.start_time is in EPOCH + $t_lp_item_view = Database::get_course_table(TABLE_LP_ITEM_VIEW); + $t_lp_view = Database::get_course_table(TABLE_LP_VIEW); + $sql = "SELECT cliv.start_time FROM $t_lp_item_view cliv + INNER JOIN $t_lp_view clv ON cliv.lp_view_id = clv.id + WHERE + clv.c_id = $courseId AND + clv.user_id = $userId AND + clv.session_id = $sessionId AND + cliv.start_time > $latestTimestamp + ORDER BY cliv.start_time DESC + LIMIT 1"; + $resultItems = Database::query($sql); + if (Database::num_rows($resultItems)) { + $rowItems = Database::fetch_assoc($resultItems); + $controlDate = $rowItems['start_time']; + // convert to date + return date('Y-m-d H:i:s', $controlDate); + } + + return null; + } } diff --git a/main/inc/lib/message.lib.php b/main/inc/lib/message.lib.php index 21c380d3c8..584e370c7c 100755 --- a/main/inc/lib/message.lib.php +++ b/main/inc/lib/message.lib.php @@ -3049,6 +3049,57 @@ class MessageManager return $userList; } + /** + * Retrieves a list of users with whom the specified user has exchanged messages within an optional date range. + * + * @param int $userId The user ID for whom to retrieve message exchange. + * @param string|null $startDate Start date to filter the messages (optional). + * @param string|null $endDate End date to filter the messages (optional). + * + * @return array Array of user information for each user with whom the specified user has exchanged messages. + */ + public static function getMessageExchangeWithUser($userId, $startDate = null, $endDate = null) + { + $messagesTable = Database::get_main_table(TABLE_MESSAGE); + $userId = (int) $userId; + + if ($startDate !== null) { + $startDate = Database::escape_string($startDate); + } + if ($endDate !== null) { + $endDate = Database::escape_string($endDate); + } + + $sql = "SELECT DISTINCT user_sender_id AS user_id + FROM $messagesTable + WHERE user_receiver_id = $userId" . + ($startDate ? " AND send_date >= '$startDate'" : "") . + ($endDate ? " AND send_date <= '$endDate'" : "") . + " UNION + SELECT DISTINCT user_receiver_id + FROM $messagesTable + WHERE user_sender_id = $userId" . + ($startDate ? " AND send_date >= '$startDate'" : "") . + ($endDate ? " AND send_date <= '$endDate'" : ""); + + $result = Database::query($sql); + $users = Database::store_result($result); + + $userList = []; + foreach ($users as $userData) { + $userId = $userData['user_id']; + if (empty($userId)) { + continue; + } + $userInfo = api_get_user_info($userId); + if ($userInfo) { + $userList[$userId] = $userInfo; + } + } + + return $userList; + } + /** * @param int $userId * @param int $otherUserId diff --git a/main/inc/lib/moodleexport/MoodleExport.php b/main/inc/lib/moodleexport/MoodleExport.php index 825f559512..2abe944a03 100644 --- a/main/inc/lib/moodleexport/MoodleExport.php +++ b/main/inc/lib/moodleexport/MoodleExport.php @@ -117,6 +117,9 @@ class MoodleExport $siteHash = md5(uniqid(mt_rand(), true)); $wwwRoot = api_get_path(WEB_PATH); + $courseStartDate = strtotime($courseInfo['creation_date']); + $courseEndDate = $courseStartDate + (365 * 24 * 60 * 60); + // Build the XML content for the backup $xmlContent = '' . PHP_EOL; $xmlContent .= '' . PHP_EOL; @@ -137,8 +140,8 @@ class MoodleExport $xmlContent .= ' ' . get_lang('Topics') . '' . PHP_EOL; $xmlContent .= ' ' . htmlspecialchars($courseInfo['title']) . '' . PHP_EOL; $xmlContent .= ' ' . htmlspecialchars($courseInfo['code']) . '' . PHP_EOL; - $xmlContent .= ' ' . $courseInfo['startdate'] . '' . PHP_EOL; - $xmlContent .= ' ' . $courseInfo['enddate'] . '' . PHP_EOL; + $xmlContent .= ' ' . $courseStartDate . '' . PHP_EOL; + $xmlContent .= ' ' . $courseEndDate . '' . PHP_EOL; $xmlContent .= ' ' . $courseInfo['real_id'] . '' . PHP_EOL; $xmlContent .= ' ' . api_get_current_access_url_id() . '' . PHP_EOL; diff --git a/main/inc/lib/moodleexport/QuizExport.php b/main/inc/lib/moodleexport/QuizExport.php index a226194593..a41a91393f 100644 --- a/main/inc/lib/moodleexport/QuizExport.php +++ b/main/inc/lib/moodleexport/QuizExport.php @@ -52,6 +52,10 @@ class QuizExport extends ActivityExport $quizResources = $this->course->resources[RESOURCE_QUIZ]; foreach ($quizResources as $quiz) { + if ($quiz->obj->iid == -1) { + continue; + } + if ($quiz->obj->iid == $quizId) { $contextid = $quiz->obj->c_id; diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index 4753e922bd..6f30c81d01 100755 --- a/main/inc/lib/sessionmanager.lib.php +++ b/main/inc/lib/sessionmanager.lib.php @@ -8085,16 +8085,31 @@ class SessionManager $form->addElement('checkbox', 'show_description', null, get_lang('ShowDescription')); + $visibilityOptions = [ + SESSION_VISIBLE_READ_ONLY => get_lang('SessionReadOnly'), + SESSION_VISIBLE => get_lang('SessionAccessible'), + SESSION_INVISIBLE => api_ucfirst(get_lang('SessionNotAccessible')), + ]; + + $visibilityOptionsConfiguration = api_get_configuration_value('session_visibility_after_end_date_options_configuration'); + if (!empty($visibilityOptionsConfiguration)) { + foreach ($visibilityOptionsConfiguration['visibility_options_to_hide'] as $option) { + $option = trim($option); + if (defined($option)) { + $constantValue = constant($option); + if (isset($visibilityOptions[$constantValue])) { + unset($visibilityOptions[$constantValue]); + } + } + } + } + $visibilityGroup = []; $visibilityGroup[] = $form->createElement( 'select', 'session_visibility', null, - [ - SESSION_VISIBLE_READ_ONLY => get_lang('SessionReadOnly'), - SESSION_VISIBLE => get_lang('SessionAccessible'), - SESSION_INVISIBLE => api_ucfirst(get_lang('SessionNotAccessible')), - ] + $visibilityOptions ); $form->addGroup( $visibilityGroup, diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index 0d98f2b01d..80d3faf564 100644 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -990,6 +990,9 @@ $_configuration['gradebook_badge_sidebar'] = [ // Block access to any user to "my progress" page //$_configuration['block_my_progress_page'] = false; +// Hides the "my progress" tab from the navigation menu +//$_configuration['hide_my_progress_tab'] = false; + // Add user extra fields in report: main/mySpace/exercise_category_report.php //$_configuration['exercise_category_report_user_extra_fields'] = ['fields' => ['skype', 'rssfeeds']]; @@ -2389,6 +2392,14 @@ INSERT INTO `extra_field` (`extra_field_type`, `field_type`, `variable`, `displa // they are only accessible during the active duration). //$_configuration['session_coach_access_after_duration_end'] = false; +// Hide visibility options for session visibility after end date. +// Admitted options: SESSION_VISIBLE_READ_ONLY, SESSION_VISIBLE, SESSION_INVISIBLE +/*$_configuration['session_visibility_after_end_date_options_configuration'] = [ + 'visibility_options_to_hide' => [ + 'SESSION_VISIBLE_READ_ONLY ' + ] +];*/ + // Restrict the list of students to subscribe in the course session. And disable // registration for users in all courses from Resume Session page //$_configuration['session_course_users_subscription_limited_to_session_users'] = false; @@ -2588,3 +2599,6 @@ INSERT INTO extra_field_options (field_id, option_value, display_text, priority, // is '$1EdTech-CC-FILEBASE$' (the latest), but previous versions of the standard // recommended '$IMS-CC-FILEBASE$', so you might want to use that for greater compatibility. //$_configuration['commoncartridge_path_token'] = '$IMS-CC-FILEBASE$'; + +// Set the following parameter to true to enable a session lifetime controller that notifies users that their session is about to expire +//$_configuration['session_lifetime_controller'] = false; diff --git a/main/install/version.php b/main/install/version.php index 218cddb133..693d690a3f 100755 --- a/main/install/version.php +++ b/main/install/version.php @@ -13,7 +13,7 @@ /** * Variables used from the main/install/index.php. */ -$new_version = '1.11.26'; +$new_version = '1.11.28'; $new_version_status = 'stable'; $new_version_last_id = 0; $new_version_stable = true; diff --git a/main/lang/english/trad4all.inc.php b/main/lang/english/trad4all.inc.php index bb9fcff2b7..5302fdbbe1 100644 --- a/main/lang/english/trad4all.inc.php +++ b/main/lang/english/trad4all.inc.php @@ -9073,4 +9073,9 @@ $MoodleVersion = "Moodle version"; $CreateExport = "Create export file"; $MoodleExportAdminIDComment = "Moodle requires a user identification to be stored inside some XML files of the .mbz format. Please provide an internal (integer) ID of the user exporting this course or Moodle's internal user ID of the user that will be the owner of the imported resources. If you're in doubt, just write '1' and some fake data ton continue."; $DropboxVulnerabilityWarning = "Remember to only download files sent by people you trust. If in doubt, please use a anti-virus tool on your computer to mitigate the risk of harm to your data."; +$SessionExpiredAt = "Session expired at"; +$DueToInactivityTheSessionIsGoingToClose = "Due to your inactivity, this session is going to close in"; +$KeepGoing = "Keep going"; +$SessionIsClosing = "Your session is closing"; +$CannotChangeVisibilityOfBaseCourseResourceX = "The visibility of %s from the base course cannot be changed from the session."; ?> \ No newline at end of file diff --git a/main/lang/finnish/trad4all.inc.php b/main/lang/finnish/trad4all.inc.php index 84850605c9..4c69c0e8d6 100644 --- a/main/lang/finnish/trad4all.inc.php +++ b/main/lang/finnish/trad4all.inc.php @@ -2,241 +2,6 @@ /* for more information: see languages.txt in the lang folder. */ -$DesignANewBadgeComment = "Luo uusi rintamerkki, lataa se design-työkalusta ja lähetä se sovellukseen."; -$TheBadgesWillBeSentToThatBackpack = "Rintamerkit lähetetään tähän reppuun."; -$BackpackDetails = "Repun yksityiskohdat"; -$CriteriaToEarnTheBadge = "Kriteerit rintamerkin ansaitsemiseen"; -$BadgePreview = "Rintamerkin esikatselu"; -$DesignNewBadge = "Suunnittele uusi rintamerkki"; -$TotalX = "Yhteensä %"; -$DownloadBadges = "Lataa rintamerkkejä"; -$CreateBadge = "Luo rintamerkki"; -$Badges = "Rintamerkit"; -$SkillsReport = "Osaamisraportti"; -$AssignedUsersListToStudentBoss = "Esimiehelle nimetyt käyttäjät"; -$AssignUsersToBoss = "Nimeä käyttäjiä esimiehelle"; -$RoleStudentBoss = "Opiskelijan esimies"; -$YouAcceptCookies = "Jatkamalla sivun käyttöä, hyväksyt evästeiden käytön."; -$TemplateCertificateComment = "Esimerkki todistuksen muodosta"; -$TemplateCertificateTitle = "Todistus"; -$ResultsVisibility = "Tulosten näkyvyys"; -$DownloadCertificate = "Lataa todistus"; -$RequestAccess = "Pyydä pääsyä"; -$Formula = "Kaava"; -$MultipleConnectionsAreNotAllow = "Käyttäjä on jo kirjautunut sisään"; -$Listen = "Kuunnella"; -$LastUpload = "Viimeksi ladattu"; -$EditUserListCSV = "Muokkaa käyttäjälistaa"; -$NumberOfCoursesHidden = "Piilotettujen kurssien määrä"; -$Post = "Posti"; -$Write = "Kirjoita"; -$YouHaveNotYetAchievedSkills = "Et ole vielä saavuttanut taitoja"; -$Corn = "Jyvä"; -$Gray = "Harmaa"; -$LightBlue = "Vaaleansininen"; -$Black = "Musta"; -$White = "Valkoinen"; -$DisplayOptions = "Näytä vaihtoehdot"; -$EnterTheSkillNameToSearch = "Kirjoita etsitty osaaminen hakuun"; -$SkillsSearch = "Osaamisen haku"; -$ChooseABackgroundColor = "Valitse taustaväri"; -$SocialWriteNewComment = "Kirjoita uusi kommentti"; -$SocialWallWhatAreYouThinkingAbout = "Mitä mietit?"; -$SocialMessageDelete = "Poista kommentti"; -$SocialWall = "Keskusteluseinä"; -$BuyCourses = "Osta kursseja"; -$MySessions = "Istuntoni"; -$ActivateAudioRecorder = "Aktivoi ääninauhuri"; -$StartSpeaking = "Aloita puhuminen"; -$AssignedCourses = "Nimetyt kurssit"; -$QuestionEditionNotAvailableBecauseItIsAlreadyAnsweredHoweverYouCanCopyItAndModifyTheCopy = "Kysymyksen muokkaus ei ole mahdollista, koska kysymykseen on jo vastattu. Voit kuitenkin kopioida sen ja muokata sitä."; -$SessionDurationTitle = "Istunnon kesto"; -$CoachAndStudent = "Valmentaja ja opiskelija"; -$Serie = "Sarjat"; -$TeacherTimeReport = "Opettajien aikaraportti"; -$YourLanguageNotThereContactUs = "Etkö löydä kieliversiotasi listasta? Jos haluat kääntäjäksi, ota yhteys info@chamilo.org."; -$SubscribeToSessionRequest = "Pyydä pääsyä istuntoon"; -$SearchActiveSessions = "Etsi aktiiviset istunnot"; -$UserNameHasDash = "Käyttäjänimi ei voi sisältää '-' merkkiä"; -$GiveAnswerVariations = "Kuinka monta kysymysvariaatiota haluat"; -$GiveFormula = "Kirjoita kaava"; -$SignatureFormula = "Ystävällisin terveisin,"; -$UserIsCurrentlySubscribed = "Käyttäjä on ilmoittautunut"; -$SessionName = "Istunnon nimi"; -$MobilePhoneNumberWrong = "Matkapuhelinnumero on väärä tai sisältää epäkelpoja merkkejä"; -$CountryDialCode = "Sisällytä maakoodi"; -$FieldTypeMobilePhoneNumber = "Matkapuhelinnumero"; -$EmailUsedTwice = "Sähköposti ei ole saatavilla"; -$TotalPostsInAllForums = "Viestejä yhteensä kaikissa foorumeissa."; -$AddMeAsCoach = "Lisää minut valmentajaksi"; -$AddMeAsTeacherInCourses = "Lisää minut opettajaksi tuotuihin kursseihin."; -$CourseTimeInfo = "Kurssilla vietetty aika"; -$SessionDurationEdit = "Muokkaa istunnon kestoa"; -$NextTopic = "Seuraava aihe"; -$CurrentTopic = "Nykyinen aihe"; -$ShowFullCourseAdvance = "Näytä kurssin suunnittelu"; -$RedirectToCourseHome = "Ohjaa uudelleen kurssin kotisivulle"; -$LpReturnLink = "Oppimispolun paluulinkki"; -$LearningPathList = "Oppimispolkulista"; -$UsersWithoutTask = "Oppilaat, jotka eivät lähettäneet töitään"; -$UsersWithTask = "Oppilaat, jotka lähettivät työnsä"; -$UploadFromTemplate = "Lataa mallista"; -$DocumentAlreadyAdded = "Tiedosto on jo lisätty"; -$AddDocument = "Lisää dokumentti"; -$ExportToDoc = "Vie .doc"; -$SortByTitle = "Järjestä otsikon mukaan"; -$SortByUpdatedDate = "Järjestä muokkauspäivän mukaan"; -$SortByCreatedDate = "Järjestä luomispäivän mukaan"; -$ViewTable = "Taulukkonäkymä"; -$ViewList = "Listanäkymä"; -$DRH = "Henkilöstöjohtaja"; -$Global = "Globaalinen"; -$QuestionTitle = "Kysymyksen otsikko"; -$QuestionId = "Kysymys ID"; -$ExerciseId = "TehtäväID"; -$ExportExcel = "Excel vienti"; -$CompanyReportResumed = "Yritysraportti, lyhyt versio"; -$CompanyReport = "Yritysraportti"; -$Report = "Raportti"; -$TraceIP = "Jäljitä IP"; -$UserMustHaveTheDrhRole = "Käyttäjillä tulee olla HR-johtajan rooli"; -$NothingToAdd = "Ei lisättävää"; -$NoStudentsFoundForSession = "Opiskelijoita ei löydetty tähän istuntoon"; -$CheckDates = "Vahvista päivät"; -$CreateACategory = "Luo kategoria"; -$PriorityOfMessage = "Viestin tyyppi"; -$ModifyDate = "Muokkauspäivä"; -$LatestChanges = "Viimmeisimmät muutokset"; -$FinalScore = "Lopputulos"; -$DeleteAttachment = "Poista liite"; -$EditingThisEventWillRemoveItFromTheSerie = "Tapahtuman muokkaus poistaa sen tapahtumasarjoista, joihin se kuuluu"; -$EnterTheCharactersYouReadInTheImage = "Kirjaa merkit, jotka näet kuvassa"; -$YouDontHaveAnInstitutionAccount = "Sinulla ei ole institutionaalista tiliä"; -$LoginWithYourAccount = "Kirjaudu sisään tililläsi"; -$YouHaveAnInstitutionalAccount = "Sinulla on jo institutionaalinen tili"; -$NoActionAvailable = "Ei saatavilla olevaa toimintoa"; -$Coaches = "Valmentajat"; -$ShowDescription = "Näytä kuvaus"; -$CleanAndUpdateCourseCoaches = "Poista ja päivitä kurssin valmentajat"; -$PDFsMustLookLike = "PDF:n tulee näyttää kuin:"; -$YouMustImportAZipFile = "SInun pitää tuoda ZIP-tiedosto"; -$SubscribeTeachersToSession = "Merkitse opettajia istuntoon"; -$SubscribeStudentsToSession = "Merkitse opiskelijoita istuntoon"; -$ManageCourseCategories = "Hallitse kurssikategorioita"; -$CourseCategoryInPlatform = "Kurssikategoriat käytettävissä"; -$UserGroupBelongURL = "Ryhmä kuuluu nyt valitulle sivulle"; -$AtLeastOneUserGroupAndOneURL = "Valitse vähintään yksi ryhmä ja sivu"; -$Calendar = "Kalenteri"; -$ThisWeek = "Tällä viikolla"; -$SendToUsersInSessions = "Lähetä tämän kurssin kaikkien istuntojen käyttäjille"; -$ParametersNotFound = "Parametrejä ei löytynyt"; -$DocumentsAdded = "Dokumentit lisätty"; -$NoUsersToAdd = "Ei lisättäviä käyttäjiä"; -$StartSurvey = "Aloita kysely"; -$Subgroup = "Alaryhmä"; -$Subgroups = "Alaryhmät"; -$EnterTheLettersYouSee = "Kirjoita näkyvissä olevissa kirjaimet"; -$ClickOnTheImageForANewOne = "Klikkaa kuvaa ladataksesi uusi kuva."; -$CatchScreenCasts = "Ota kuvaruutukaappaus"; -$View = "Näkymä"; -$DeleteAllItems = "Poista kaikki osiot"; -$DeleteThisItem = "Poista tämä osio"; -$RecordYourVoice = "Tallenna äänesi"; -$RecordIsNotAvailable = "Äänitteitä ei ole saatavilla"; -$WorkNumberSubmitted = "Vastaanotetut työt"; -$ClassIdDoesntExists = "Luokka-ID ei ole olemassa"; -$WithoutCategory = "Ilman kategoriaa"; -$IncorrectScore = "Väärä tulos"; -$CorrectScore = "Oikea tulos"; -$YouShouldAddItemsBeforeAttachAudio = "Sinun tulee lisätä osioita oppimispolkuusi, muuten et voi lisätä niihin äänitiedostoja."; -$InactiveDays = "Toimettomat päivät"; -$FollowedHumanResources = "Seuratut HR-johtajat"; -$TheTextYouEnteredDoesNotMatchThePicture = "Kirjoittamasi teksti ei sovi kuvaan."; -$RemoveOldRelationships = "Poista aikaisemmat suhteet"; -$ImportSessionDrhList = "Tuo istuntoon henkilöstöpäällikkölista"; -$FollowedStudents = "Seuratut opiskelijat"; -$FollowedTeachers = "Seuratut opettajat"; -$AllowOnlyFiles = "Salli vain tiedostot"; -$AllowOnlyText = "Salli vain teksti"; -$AllowFileOrText = "Salli tiedostot tai online-teksti"; -$DocumentType = "Dokumenttityyppi"; -$SendOnlyAnEmailToMySelfToTest = "Lähetä minulle sähköposti testausta varten."; -$DeleteAllSelectedAttendances = "Poista kaikki valitut osallistujat"; -$AvailableClasses = "Saatavilla olevat luokat"; -$RegisteredClasses = "Rekisteröidyt luokat"; -$DeleteItemsNotInFile = "Poista osiot, jotka eivät ole kansiossa"; -$ImportGroups = "Tuo ryhmiä"; -$HereIsYourFeedback = "Tässä on palautteesi"; -$SearchSessions = "Istuntohaku"; -$ShowSystemFolders = "Näytä systeemikansiot"; -$SelectADateOnTheCalendar = "Valitse päivä kalenterista"; -$AreYouSureDeleteTestResultBeforeDateD = "Haluatko varmasti poistaa tulokset ennen valittua päivää"; -$CleanStudentsResultsBeforeDate = "Poista kaikki tulokset ennen valittua päivää"; -$HGlossary = "Asiasanasto"; -$HForum = "Foorumin ohje"; -$LoginToGoToThisCourse = "Kirjaudu sisään päästäksesi tälle kurssille"; -$AreYouSureToEmptyAllTestResults = "Poista kaikkien käyttäjien tulokset kaikista harjoituksista"; -$CleanAllStudentsResultsForAllTests = "Haluatko varmasti poistaa kaikkien harjoitusten tulokset?"; -$LoginDate = "Sisäänkirjautumispäivä"; -$ChooseStartDateAndEndDate = "Valitse alkamis- ja päättymispäivät"; -$TestFeedbackNotShown = "Tämä harjoitus on määritelty niin ettei palaute näy käyttäjille. Kommentit ei näy harjoiutksen lopussa, mutta voivat olla avuksi opettajalle harjoitusta arvioitaessa."; -$InactiveUsers = "Käyttäjät, joiden tili on poistettu"; -$ActiveUsers = "Käyttäjät, joilla on aktiivinen tili"; -$SurveysProgress = "Kyselyn edistyminen"; -$SurveysLeft = "Keskeneräiset kyselyt"; -$SurveysDone = "Valmiit kyselyt"; -$SurveysTotal = "Kyselyjä yhteensä"; -$LearnpathsTotal = "Oppimispolut yhteensä"; -$SelectSurvey = "Valitse kysely"; -$SurveyCopied = "Kysely kopioitu"; -$NoSurveysAvailable = "Ei kyselyitä"; -$CopySurvey = "Kopioi kysely"; -$ChooseSession = "Valitse istunto"; -$SearchSession = "Etsi istuntoja"; -$ChooseStudent = "Valitse opiskelija"; -$SearchStudent = "Etsi käyttäjiä"; -$ChooseCourse = "Valitse kurssi"; -$DisplaySurveyOverview = "Yleiskuva kyselyistä"; -$YouMustUploadAZipOrTxtFile = "Lataa .txt- tai .zip-tiedosto"; -$ManageUserGroup = "Hallinnoi käyttäjäryhmiä"; -$YesImSure = "Kyllä, olen varma"; -$NoIWantToTurnBack = "En, haluan palata takaisin"; -$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "Jos jatkat, vastauksesi tallennetaan. Muutoksia ei sallita."; -$SpecialCourses = "Erikoiskurssit"; -$Roles = "Roolit"; -$ToolCurriculum = "Opetussuunnitelma"; -$ReturnToExerciseList = "Palaa harjoitukset-listaan"; -$Username = "Käyttäjätunnus"; -$YouAreReg = "Sinut on rekisteröity ympäristöön"; -$SelectRole = "Valitse rooli"; -$SelectAnOption = "Valitse vaihtoehto"; -$CurrentStatus = "Tämänhetkinen status"; -$MyCourseCategories = "Kurssikategoriani"; -$SessionsCategories = "Istuntokategoriat"; -$CourseSessionBlock = "Kurssit ja istunnot"; -$Committee = "Komitea"; -$AudioFile = "Äänitiedosto"; -$PasswordVeryStrong = "Erittäin vahva"; -$PasswordStrong = "Vahva"; -$PasswordMedium = "Kohtalainen"; -$PasswordNormal = "Normaali"; -$PasswordWeak = "Heikko"; -$PasswordIsTooShort = "Salasana on liian lyhyt"; -$SelectAnAnswerToContinue = "Valitse vastaus jatkaaksesi"; -$QuestionReused = "Kysymys lisätty tähän harjoitukseen"; -$QuestionCopied = "Kysymys on kopioitu harjoitukseen"; -$VersionUpToDate = "Versiosi on ajan tasalla"; -$LatestVersionIs = "Uusin versio on"; -$YourVersionNotUpToDate = "Versiosi ei ole ajantasalla"; -$ExerciseEndButtonDisconnect = "Kirjaudu ulos"; -$ExerciseEndButtonExerciseHome = "Harjoituslista."; -$ExerciseEndButtonCourseHome = "Kurssin aloitussivu"; -$HideQuestionTitle = "Piilota kysymyksen otsikko"; -$OrderedByUser = "Lajiteltu käyttäjän mukaan"; -$ToReview = "Odottaa tarkastamista"; -$Unanswered = "Vastaamatta"; -$CurrentQuestion = "Tämänhetkinen kysymys"; -$UserIsNotATeacher = "Käyttäjä ei ole opettaja"; $ShowAllEvents = "Näytä kaikki kalenterimerkinnät"; $Month = "Kuukausi"; $Hour = "Tunti"; @@ -246,7 +11,7 @@ $AgendaDeleteSuccess = "Merkintä on poistettu"; $NoAgendaItems = "Kalenterimerkintöjä ei ole"; $ClassName = "Luokkan nimi"; $ItemTitle = "Merkinnän otsikko"; -$Day = "päivä"; +$Day = "Päivä"; $month_default = "oletus kuukausi"; $year_default = "oletus vuosi"; $Hour = "Tunti"; @@ -257,7 +22,7 @@ $OldToNew = "vanhimmasta uusimpaan"; $NewToOld = "uusimmasta vanhimpaan"; $Now = "Nyt"; $AddEvent = "Lisää merkintä"; -$Detail = "yksityiskohdat"; +$Detail = "Yksityiskohdat"; $MonthView = "Kuukausinäkymä"; $WeekView = "Viikkonäkymä"; $DayView = "Päivänäkymä"; @@ -418,7 +183,7 @@ $ExpirationDate = "Vanhentumis pvm"; $LastEdit = "Viimeksi muokattu"; $LastVisit = "Viimeksi vierailtu"; $Subscription = "Kuvaus"; -$CourseAccess = "Kurssi pääsy"; +$CourseAccess = "Kurssille pääseminen"; $ConfirmBackup = "Haluatko todella tehdä kurssista varmuuskopion"; $CreateSite = "Luo kurssin sivusto"; $RestoreDescription = "Kurssi on varmuuskopiotiedostossa jonka voit valita alapuolelta.

Kun klikkaat \"Palauta\" varmuuskopio puretaan ja kurssi luodaan uudelleen."; @@ -431,7 +196,7 @@ $CsvPutIntoDocTool = "Tiedosto \"users.csv\" on ladatavissa Tiedostot työkalull $OtherCategory = "Muut"; $AllowedToUnsubscribe = "Käyttäjä voi peruuttaa osallistumisensa tältä kurssilta"; $NotAllowedToUnsubscribe = "Käyttäjät eivät itse voi peruuttaa osallistumistaan tältä kurssilta"; -$CourseVisibilityClosed = "Täysin suljettu; ainoastaan kurssin opettaja pääsee kurssille."; +$CourseVisibilityClosed = "Suljettu - ei pääsyä kurssille"; $CourseVisibilityClosed = "Suljettu - ei pääsyä kurssille"; $CourseVisibilityModified = "Muokattu (tarkemmat asetukset on määritetty roolien-oikeus asetuksilla)"; $WorkEmailAlert = "Hälytys sähköpostilla työn palautuksesta"; @@ -476,6 +241,11 @@ $CreatedSize = "Luotu, koko"; $AuthorTip = "VCARD muodossa"; $Format = "Muoto"; $FormatTip = "valitse listasta"; +$Statuses = ":luonnos:luonnos,, lopullinen:lopullinen,, tarkistettu:tarkistettu,, ei käytettävissä:ei käytettävissä"; +$Costs = ":ei:ilmainen, ei kustannuksia,, kyllä:ei ilmainen, kustannukset"; +$Copyrights = ":kyllä:tekijänoikeus,, ei:ei tekijänoikeus"; +$Formats = ":text/plain;iso-8859-1:text/plain;iso-8859-1,, text/plain;utf-8:text/plain;utf-8,, text/html;iso-8859-1:text/html;iso-8859-1,, text/html;utf-8:text/html;utf-8,, inode/directory: Folder,, application/msword:MsWord,, application/octet-stream:Octet stream,, application/pdf:PDF,, application/postscript:PostScript,, application/rtf:RTF,, application/vnd. ms-excel:MsExcel,, application/vnd.ms-powerpoint:MsPowerpoint,, application/xml;iso-8859-1:XML;iso-8859-1,, application/xml;utf-8:XML;utf-8,, application/zip:ZIP"; +$LngResTypes = ":exercise:harjoitus,, simulation:simulaatio,, questionnaire:kyselylomake,, diagram:kaavio,, figure:kaavio,, graph:kaavio,, index:kaavio,, index:indeksi,, slide:dia,, table:dia,, table:taulukko,, narrative text:kerrontateksti,, exam:tentti,, experiment:tentti,, experiment:kokeilu,, problem statement:ongelmanasettelun selvitys,, self-assessio:itsearviointi,, luento:luento"; $SelectOptionForBackup = "Valitse varmistuksen tyyppi"; $LetMeSelectItems = "Valitsen kurssin komponentit"; $CreateFullBackup = "Tee täydellinen varmistus kurssista"; @@ -574,10 +344,12 @@ $Elipse = "Ellipsi"; $Arrow = "Nuoli"; $DeleteChosenItem = "Poista valittu resurssi"; $ApplyForModeration = "Ilmoittaudu valvojaksi"; +$Apply = "Hae/käytä"; $BecomeModerator = "Ryhdy valvojaksi"; $Italic = "Kursiivi"; $Bold = "Lihavoitu"; $Waiting = "Odottaa"; +$AUserWantsToApplyForModeration = "Käyttäjä haluaa hakea moderointia:"; $Reject = "Hylätä"; $SendingRequestToFollowingUsers = "Lähetetään pyyntö seuraaville osallistujille"; $Accepted = "Hyväksytty"; @@ -598,9 +370,6 @@ $Disconnected = "Yhteys poikki"; $FineStroke = "Ohut"; $MediumStroke = "Keskikokoinen"; $ThickStroke = "Paksu"; -$IsOpenSession = "Avoin istunto"; -$AllowVisitors = "Salli vierailijat"; -$EnableIframeInclusionTitle = "Salli iframe HTML-editorissa"; $Explanation = "Kun klikkaat Ok, niin sivustolle luodaan foorumi, esityslista, dokumenttien hallinta yms. Voit muuttaa sivustoa omalla tunnuksellasi."; $CodeTaken = "Tämä kurssi on jo käytössä.
Mene takaisin ja yritä uudetaan."; $ExerciceEx = "Esimerkkitehtävä"; @@ -689,19 +458,17 @@ $CourseDescriptionAdded = "Kurssin kuvaus lisätty"; $NotebookAdded = "Muistiinpano lisätty"; $NotebookUpdated = "Muistiinpano päivitetty"; $NotebookDeleted = "Muistiinpano poistettu"; -$DeleteAllAttendances = "Poista kaikki valitut läsnäolot"; -$Upload = "Lähetä"; -$ShowFeedback = "Näytä palaute"; -$GiveFeedback = "Anna / muokkaa palautetta"; -$JustUploadInSelect = "Tallenna itsellesi"; -$MailingNothingFor = "Nenio por"; -$MailingFileNotRegistered = "(ei ole rekisteröitynyt tälle kurssille)"; -$MailingFileSentTo = "vastaanottaja"; -$MailingFileIsFor = "estas por XX"; +$ClickKw = "Valitse avainsana tai poista valinta napsauttamalla avainsanaa puussa."; +$KwHelp = "Klikkaa '+' painiketta avataksesi, '-' painiketta sulkeaksesi, '++' painiketta avataksesi kaikki, '--' painiketta sulkeaksesi kaikki.\r\n\r\nTyhjennä kaikki valitut avainsanat sulkemalla puu ja avaamalla se uudelleen '+' -painikkeella.\r\nAlt-painikkeella '+' haetaan alkuperäiset avainsanat puusta.\r\n\r\nAlt-klikka avainsana valitsee avainsanan ilman laajempia termejä tai poistaa avainsanan, jolla on laajempia termejä.\r\n\r\nJos muutat kuvauskielen, älä lisää avainsanoja samaan aikaan."; $SearchCrit = "Vain yksi sana riville!"; $NoKeywords = "Tällä kurssilla ei ole avainsanoja"; +$KwCacheProblem = "Avainsanavälimuistia ei voi avata"; $CourseKwds = "Tämä tiedosto sisältää kurssin avainsanat"; +$KwdsInMD = "MD:ssä käytetyt avainsanat"; +$KwdRefs = "avainsanaviittaukset"; +$NonCourseKwds = "Muut kuin kurssin avainsanat"; $KwdsUse = "Kurssin avainsanat (lihavoitu=käyttämätön)"; +$TotalMDEs = "Etäopetusmaisteri merkintä -linkkien kokonaismäärä:"; $ForumDeleted = "Keskustelualue poistettu"; $ForumCategoryDeleted = "Keskustelualue ryhmä poistettu"; $ForumLocked = "Keskustelualue lukittu"; @@ -713,6 +480,7 @@ $NoForumInThisCategory = "Tässä ryhmässä ei ole keskustelualueita"; $InForumCategory = "Luo ryhmään"; $AllowAnonymousPosts = "Salli nimettömät kirjoitukset?"; $StudentsCanEdit = "Voiko käyttäjä muokata omia kirjoituksiaan?"; +$ApprovalDirect = "Hyväksyntä / Suora postitus"; $AllowNewThreads = "Salli käyttäjän aloittaa uusi keskustelu"; $DefaultViewType = "Oletus asettelu"; $GroupSettings = "Ryhmä asetukset"; @@ -766,6 +534,7 @@ $PostVisibilityChanged = "Viestin näkyvyys muutettu"; $PostDeleted = "Viesti poistettu"; $ThreadCanBeFoundHere = "Viesti löytyy täältä"; $DeleteCompleteThread = "Poista koko keskustelu?"; +$PostDeletedSpecial = "Erikoisposti Poistettu"; $ThreadDeleted = "Keskustelu poistettu"; $NextMessage = "Seuraava viesti"; $PrevMessage = "Edellinen viesti"; @@ -778,26 +547,35 @@ $YouWillBeNotifiedOfNewPosts = "Uusista viesteista lähetetään sinulle sähkö $YouWillNoLongerBeNotifiedOfNewPosts = "Sinulle ei enää lähetetä ilmoituksia sähköpostilla uusista viesteistä"; $AddImage = "Lisää kuva"; $QualifyThread = "Merkitse keskustelu"; +$ThreadUsersList = "Langan käyttäjäluettelo"; $QualifyThisThread = "Merkitse tämä keskustelu"; +$CourseUsers = "Käyttäjät kurssilla"; $PostsNumber = "Viestien määrä"; $NumberOfPostsForThisUser = "Käyttäjän kirjoittamien viestien määrä"; $AveragePostPerUser = "Viestit käyttäjittäin"; +$QualificationChangesHistory = "Arviointimuutosten historia"; $MoreRecent = "uudemmat"; $Older = "vanhemmat"; $WhoChanged = "Kuka muutti"; $NoteChanged = "Muistiinpano muutettu"; $DateChanged = "Päiväys muutettu"; +$ViewComentPost = "Näytä viestejä koskevat kommentit"; $AllStudents = "Kaikki opiskelijat"; $StudentsQualified = "Pätevät oppilaat"; $StudentsNotQualified = "Epäpätevät oppilaat"; $NamesAndLastNames = "Etu- ja sukunimet"; $MaxScore = "Pisteet"; +$QualificationCanNotBeGreaterThanMaxScore = "Arvosana ei voi ylittää maksimipistemäärää"; $ThreadStatistics = "Keskustelun tilastot"; $Thread = "Keskustelu"; $NotifyMe = "Ilmoita minulle"; +$ConfirmUserQualification = "Vahvista merkintä"; $NotChanged = "Muuttamaton"; +$QualifyThreadGradebook = "Arvioi tämä lanka"; $QualifyNumeric = "Tulos"; +$AlterQualifyThread = "Arvioi tämä lanka"; $ForumMoved = "Keskustelualue on siirretty"; +$YouMustAssignWeightOfQualification = "Sinun on pisteytettävä tämä toiminto"; $DeleteAttachmentFile = "Poista liite tiedosto"; $EditAnAttachment = "Muokkaa liitettä"; $CreateForum = "Luo keskustelualue"; @@ -846,17 +624,24 @@ $LinkUpdated = "Linkki on päivitetty"; $OnHomepage = "Näytä linkki kotisivulla"; $ShowLinkOnHomepage = "Näytä tämä linkki kuvakkeena kurssin etusivulla"; $General = "Yleinen"; +$SearchFeatureDoIndexLink = "Indeksoi linkin otsikko ja kuvaus?"; $SaveLink = "Tallenna linkki"; $SaveCategory = "Tallenna kansio"; $BackToLinksOverview = "Palaa linkkien johdantoon"; +$AddTargetOfLinkOnHomepage = "Valitse \"kohde\", joka näyttää linkin kurssin etusivulla."; +$StatDB = "Tietokannan seuranta."; $EnableTracking = "Mahdollista seuranta"; $InstituteShortName = "Yrityksesi lyhenne"; +$WarningResponsible = "Käytä tätä komentosarjaa vasta varmuuskopioinnin jälkeen. Chamilon tiimi ei ole vastuussa kadonneista tai vioittuneista tiedoista."; +$AllowSelfRegProf = "Salli itserekisteröityminen kouluttajaksi"; $EG = "esim."; +$DBHost = "Tietokantaisäntä"; $DBLogin = "Tietokantaan kirjautuminen"; $DBPassword = "Tietokannan salasana"; $MainDB = "Chamilon päätietokanta"; $AllFieldsRequired = "Kaikki kentät vaaditaan"; $PrintVers = "Tulostettava versio"; +$LocalPath = "Vastaava paikallinen polku"; $AdminEmail = "Ylläpitäjän sähköposti"; $AdminName = "Ylläpitäjän nimi"; $AdminSurname = "Ylläpitäjän sukunimi"; @@ -864,6 +649,7 @@ $AdminLogin = "Ylläpitäjän login"; $AdminPass = "Ylläpitäjän salasana (haluat ehkä vaihtaa tämän)"; $EducationManager = "Projektipäällikkö"; $CampusName = "Portaalisi nimi"; +$DBSettingIntro = "Asennusskripti luo (tai käyttää) Chamilo-tietokannan käyttäen tässä annettua tietokannan nimeä. Varmista, että antamallasi käyttäjällä on oikeus luoda tietokanta tässä annetulla nimellä. Jos tällä nimellä oleva tietokanta on olemassa, se korvataan. Älä käytä pääkäyttäjää Chamilo-tietokannan käyttäjänä. Tämä voi johtaa vakaviin tietoturvaongelmiin."; $Step3 = "Vaihe 3"; $Step4 = "Vaihe 4"; $Step5 = "Vaihe 5"; @@ -873,9 +659,13 @@ $DBSetting = "MySQL tietokannan asetukset"; $MainLang = "Pääkieli"; $Licence = "Lisenssi"; $LastCheck = "Viimeinen tarkistus ennen asennusta"; +$DbPrefixForm = "MySQL-tietokannan etuliite"; $DbPrefixCom = "Jätä tyhjäksi, jos ei vaadita"; +$EncryptUserPass = "Salaa käyttäjien salasanat tietokannassa"; +$SingleDb = "Käytä yhtä tai useampaa tietokantaa Chamiloa varten"; $AllowSelfReg = "Salli itserekisteröinti"; $Recommended = "(suositeltu)"; +$ScormDB = "SCORM-TIETOKANTA"; $AdminLastName = "Ylläpitäjän sukunimi"; $AdminPhone = "Ylläpitäjän puhelinnumero"; $NewNote = "Uusi muistiinpano"; @@ -904,6 +694,10 @@ $NotebookManagement = "Muistion hallinta"; $BackToNotesList = "Takaisin muistio listaan"; $NotesSortedByTitleAsc = "Muistiot järjestettynä nimen mukaan (a-z)"; $NotesSortedByTitleDESC = "Muistiot järjestettynä nimen mukaan (z-a)"; +$NotesSortedByUpdateDateAsc = "Muistiinpanot lajiteltu päivityspäivämäärän mukaan nouseva"; +$NotesSortedByUpdateDateDESC = "Muistiinpanot lajiteltu päivityspäivän mukaan laskevasti"; +$NotesSortedByCreationDateAsc = "Muistiinpanot lajiteltu luontipäivämäärän mukaan nousevasti"; +$NotesSortedByCreationDateDESC = "Muistiinpanot lajiteltu luontipäivämäärän mukaan laskevasti"; $Titular = "Opettaja"; $AdministrationTools = "Ylläpitotyökalut"; $CatList = "Aihealueet"; @@ -962,14 +756,24 @@ $DocumentList = "Lista kaikista tiedostoista"; $OrganisationList = "Sisällysluettelo"; $EditTOC = "Muokkaa sisällysluetteloa"; $EditDocument = "Muokkaa"; +$CreateDocument = "Luo rich media -sivu/aktiviteetti"; $MissingImagesDetected = "Puuttuvia kuvia löytynyt"; $Publish = "Julkaise"; +$Scormcontentstudent = "Tämä on SCORM-kurssi. Voit toistaa sen klikkaamalla tästä :"; +$Scormcontent = "Tämä on SCORM-sisältöä "; +$DownloadAndZipEnd = "Zip-tiedosto ladattu ja purettu"; +$ZipNoPhp = "Zip-tiedosto ei saa sisältää .PHP-tiedostoja"; $GroupForumLink = "Ryhmäfoorumi"; +$NotScormContent = "Tämä ei ole kelvollinen SCORM ZIP-tiedosto !"; $NoText = "Kirjoita teksti/HTML-sisältö"; $NoFileName = "Kirjoita tiedoston nimi"; +$FileError = "Ladattava tiedosto ei ole kelvollinen."; $ViMod = "Näkyvyys muokattu"; $AddComment = "Lisää/muokkaa kommenttia"; +$Impossible = "Toiminta mahdoton"; +$NoSpace = "Lataus on epäonnistunut. Joko olet ylittänyt enimmäiskiintiösi tai levytila ei riitä."; $DownloadEnd = "Lataus valmis"; +$FileExists = "Toiminto on mahdoton, sillä saman niminen tiedosto on jo olemassa."; $DocCopied = "Dokumentti kopioitu"; $DocDeleted = "Dokumentti poistettu"; $ElRen = "Elementti nimetty uudelleen"; @@ -978,15 +782,22 @@ $ComMod = "Kommentti muokattu"; $Rename = "Nimeä uudelleen"; $NameDir = "Uuden kansion nimi"; $DownloadFile = "Lataa tiedosto"; +$Builder = "Luo kurssi (luontityökalu)"; +$ScormBuilder = "Luo kurssi (kirjoitustyökalu)"; +$CreateDoc = "Luo rich media -sivu/aktiviteetti"; $OrganiseDocuments = "Luo sisällysluettelo"; $Uncompress = "Pura zip"; +$ExportShort = "Vie SCORM-muodossa"; $WCAGGoMenu = "Mene valikkoon"; $WCAGGoContent = "Mene sisältöön"; $AdminBy = "Ylläpito"; $Statistiques = "Tilastot"; $VisioHostLocal = "Videokonferenssin isäntä"; +$VisioRTMPIsWeb = "Onko videoneuvotteluprotokolla verkkopohjainen (useimmiten ei ole)."; +$ShowBackLinkOnTopOfCourseTreeComment = "Näytä linkki, jonka avulla voit palata kurssihierarkiassa taaksepäin. Linkki on joka tapauksessa käytettävissä luettelon alareunassa."; $Used = "käytetty"; $Exist = "olemassa oleva"; +$ShowBackLinkOnTopOfCourseTree = "Näytä paluulinkit kategorioista/kursseista"; $ShowNumberOfCourses = "Näytä kurssin numero"; $DisplayTeacherInCourselistTitle = "Näytä opettaja kurssin otsikossa"; $DisplayTeacherInCourselistComment = "Näytä opettaja kurssilistan kommentissa"; @@ -994,6 +805,8 @@ $DisplayCourseCodeInCourselistComment = "Näytä kurssikoodi kurssilistan kommen $DisplayCourseCodeInCourselistTitle = "Näytä kurssikoodi kurssin otsikossa"; $ThereAreNoVirtualCourses = "Ei ole virtuaalikursseja alustassa"; $ConfigureHomePage = "Muokkaa portaalin kotisivua"; +$CourseCreateActiveToolsTitle = "Moduulit, jotka ovat aktiivisia kurssia luotaessa"; +$CourseCreateActiveToolsComment = "Mitkä työkalut on otettava oletusarvoisesti käyttöön (näkyviin), kun uusi kurssi luodaan?"; $CreateUser = "Luo käyttäjä"; $ModifyUser = "Muokkaa käyttäjää"; $buttonEditUserField = "Muokkaa käyttäjäkenttää"; @@ -1025,7 +838,7 @@ $ChangePicture = "Vaihda kuva"; $AddUsers = "Lisää käyttäjä"; $AddGroups = "Lisää ryhmiä"; $AddClasses = "Lisää luokkia"; -$ExportUsers = "Tuo käyttäjä lista"; +$ExportUsers = "Vie käyttäjälista"; $NumberOfParticipants = "Jäsenten määrä"; $NumberOfUsers = "Käyttäjien määrä"; $Participants = "Jäsenet"; @@ -1048,6 +861,7 @@ $AcceptedPictureFormats = "Sallitut tiedostomuodot ovat JPG, PNG ja GIF!"; $LoginAlreadyTaken = "Tämä käyttäjätunnus on jo käytössä!"; $ImportUserListXMLCSV = "Tuo käyttäjälista"; $ExportUserListXMLCSV = "Vie käyttäjälista"; +$OnlyUsersFromCourse = "Vain kurssin käyttäjät"; $AddClassesToACourse = "Lisää luokkia kurssiin"; $AddUsersToACourse = "Lisää käyttäjiä kurssiin"; $AddUsersToAClass = "Lisää käyttäjiä luokkaan"; @@ -1075,7 +889,10 @@ $NoNeededData = "Tiedosto ei sisällä kaikkia tarvittavia tietoja!"; $MaxImportUsers = "Voit tuoda vain 500 käyttäjää kerralla!"; $AdminDatabases = "Tietokannat (phpMyAdmin)"; $AdminUsers = "Käyttäjät"; +$AdminClasses = "Käyttäjäluokat"; +$AdminGroups = "Käyttäjäryhmät"; $AdminCourses = "Kurssit"; +$AdminCategories = "Kurssikategoriat"; $SubscribeUserGroupToCourse = "Ilmoita käyttäjä/ryhmä kurssille"; $NoCategories = "Täällä ei ole kategorioita"; $AllowCoursesInCategory = "Salli kurssien lisääminen tähän kategoriaan?"; @@ -1085,63 +902,127 @@ $EditNode = "Muokkaa tätä kategoriaa"; $OpenNode = "Avaa tämä kategoria"; $DeleteNode = "Poista tämä kategoria"; $AddChildNode = "Lisää alakategoria"; +$ViewChildren = "Näytä lapset"; +$TreeRebuildedIn = "Puu rakennettu uudelleen"; +$TreeRecountedIn = "Puu uudelleen laskettu"; +$RebuildTree = "Rakenna puu uudelleen"; +$RefreshNbChildren = "Päivitä lasten lukumäärä"; +$ShowTree = "Näytä puu"; $LogDeleteCat = "Kategoria poistettu"; +$RecountChildren = "Laske lapset uudelleen"; +$UpInSameLevel = "Samalla tasolla"; $MailTo = "Lähetä sähköposti:"; $AddAdminInApache = "Lisää ylläpitäjä"; $AddFaculties = "Lisää kategorioita"; $SearchACourse = "Etsi kurssia"; $SearchAUser = "Etsi käyttäjää"; +$TechnicalTools = "Tekniset"; +$Config = "Järjestelmän konfigurointi"; +$LogIdentLogoutComplete = "Kirjautumisluettelo (laajennettu)"; +$LimitUsersListDefaultMax = "Vieritysluettelossa näkyvien käyttäjien enimmäismäärä"; $NoTimeLimits = "Ei aikarajoja"; +$GeneralProperties = "Yleiset ominaisuudet"; $CourseCoach = "Kurssin valmentaja"; +$UsersNumber = "Käyttäjien määrä"; +$PublicAdmin = "Julkinen hallinto"; $PageAfterLoginTitle = "Kirjautumisen jälkeinen sivu"; +$PageAfterLoginComment = "Sivu, jonka alustalle tuleva käyttäjä näkee."; +$TabsMyProfile = "Oma profiili -välilehti"; $GlobalRole = "Yleinen rooli"; $NomOutilTodo = "Hallinnoi tehtävälistaa"; +$NomPageAdmin = "Hallinnointi"; +$SysInfo = "Tietoa järjestelmästä"; $DiffTranslation = "Vertaa käännöksiä"; +$StatOf = "Raportointi"; +$LogIdentLogout = "Sisäänkirjautumislista"; +$ServerStatus = "MySQL-palvelimen tila :"; $DataBase = "Tietokanta"; $Run = "toimii"; +$Client = "MySql-asiakas"; +$Server = "MySql-palvelin"; $titulary = "Omistaja"; +$UpgradeBase = "Päivitä tietokanta"; $ErrorsFound = "virheitä löydetty"; $Maintenance = "Backup"; +$Upgrade = "Päivitä Chamilo"; +$Website = "Verkkosivusto"; $Documentation = "Dokumentaatio"; +$Contribute = "Tue/osallistu"; +$InfoServer = "Palvelimen tiedot"; $SendMailToUsers = "Lähetä sähköposti käyttäjille"; +$CourseSystemCode = "Järjestelmäkoodi"; +$CourseVisualCode = "Näkyvä koodi"; +$SystemCode = "Järjestelmäkoodi"; +$VisualCode = "näkyvä koodi"; $AddCourse = "Luo kurssi"; $AdminManageVirtualCourses = "Hallinnoi virtuaalikursseja"; $AdminCreateVirtualCourse = "Luo virtuaalikurssi"; +$AdminCreateVirtualCourseExplanation = "Virtuaalikurssi jakaa tallennustilan (hakemiston ja tietokannan) olemassa olevan \"oikean\" kurssin kanssa."; +$RealCourseCode = "Todellinen kurssikoodi"; $CourseCreationSucceeded = "Kurssi luotiin onnistuneesti."; +$OnTheHardDisk = "kiintolevyllä"; $IsVirtualCourse = "Virtuaalikurssi?"; $AnnouncementUpdated = "Ilmoitus on päivitetty"; +$PermissionsForNewFiles = "Uusien tiedostojen käyttöoikeudet"; +$PermissionsForNewFilesComment = "Mahdollisuus määrittää käyttöoikeusasetukset, jotka annetaan jokaiselle äskettäin luodulle tiedostolle, antaa sinulle mahdollisuuden parantaa tietoturvaa vaarallista sisältöä portaaliin lataavien hakkereiden hyökkäyksiä vastaan. Oletusasetuksen (0550) pitäisi riittää antamaan palvelimellesi kohtuullisen suojaustason. Annettu muoto käyttää UNIX-terminologiaa Owner-Group-Others (Omistaja-Ryhmä-Muut), jossa on luku-kirjoitus-suoritusoikeudet. Jos käytät Oogieta, huolehdi siitä, että LibreOfficea käynnistävä käyttäjä voi kirjoittaa tiedostoja kurssikansioon."; $Guest = "Vieras"; +$LoginAsThisUserColumnName = "Kirjautuminen nimellä..."; $LoginAsThisUser = "Kirjaudu sisään"; $SelectPicture = "Valitse kuva..."; $DontResetPassword = "Älä nollaa salasanaasi"; $ParticipateInCommunityDevelopment = "Osallistu kehitystyöhön"; $CourseAdmin = "Opettaja"; $PlatformLanguageTitle = "Portaalin kieli"; +$ServerStatusComment = "Millainen palvelin tämä on? Tämä ottaa käyttöön tai poistaa käytöstä joitakin tiettyjä vaihtoehtoja. Kehityspalvelimella on käytössä käännösominaisuus, joka poistaa kääntämättömät merkkijonot."; $ServerStatusTitle = "Palvelin tyyppi"; $PlatformLanguages = "Chamilo portaalin kielet"; +$PlatformLanguagesExplanation = "Tämä työkalu hallinnoi kirjautumissivun kielivalikkoa. Alustan ylläpitäjänä voit päättää, mitkä kielet ovat käyttäjien käytettävissä."; $OriginalName = "Alkuperäinen nimi"; $EnglishName = "Englanninkielinen nimi"; $LMSFolder = "Chamilo kansio"; +$Properties = "Ominaisuudet"; +$PlatformConfigSettings = "Konfigurointiasetukset"; $SettingsStored = "Asetukset on tallennettu"; $InstitutionTitle = "Organisaation nimi"; +$InstitutionComment = "Organisaation nimi (näkyy oikealla olevassa otsikossa)."; $InstitutionUrlTitle = "Organisaation URL (web-osoite)"; +$InstitutionUrlComment = "Laitoksen URL-osoite (linkki, joka näkyy oikeanpuoleisessa otsikossa)."; +$SiteNameTitle = "Verkko-oppimisportaalin nimi"; +$SiteNameComment = "Chamilo-portaalin nimi (näkyy otsikossa)."; +$emailAdministratorTitle = "Portaalin ylläpitäjä: sähköposti"; +$emailAdministratorComment = "Alustan ylläpitäjän sähköpostiosoite (näkyy vasemmassa alatunnisteessa)."; +$administratorSurnameTitle = "Portaalin ylläpitäjä: Sukunimi"; +$administratorSurnameComment = "Alustan ylläpitäjän sukunimi (näkyy vasemmanpuoleisessa alatunnisteessa)."; +$administratorNameTitle = "Portaalin ylläpitäjä: Etunimi"; +$administratorNameComment = "Alustan ylläpitäjän etunimi (näkyy vasemmassa alatunnisteessa)."; +$ShowAdministratorDataTitle = "Alustan ylläpitäjän tiedot alatunnisteessa"; +$ShowAdministratorDataComment = "Näytä alustan ylläpitäjän tiedot alatunnisteessa?"; $HomepageViewTitle = "Kurssin kotisivun design"; $HomepageViewComment = "Miltä haluaisit kurssin kotisivun näyttävän?"; $HomepageViewDefault = "Kahden sarakkeen layout. Ei-aktiiviset työkalut ovat piilotettu."; $HomepageViewFixed = "Kolmen sarakkeen layout. Ei-aktiiviset työkalut ovat harmaita (kuvakkeet ovat omilla paikoillaan)"; +$ShowToolShortcutsTitle = "Työkalujen pikanäppäimet"; +$ShowToolShortcutsComment = "Näytä työkalujen pikavalinnat bannerissa?"; $ShowStudentViewTitle = "Opiskelijanäkymä"; -$ShowStudentViewComment = "Aktivoi opiskelijanäkymä? -Tämä ominaisuus mahdollistaa opettajan nähdä opiskelijanäkymä."; +$ShowStudentViewComment = "Aktivoi opiskelijanäkymä?\r\nTämä ominaisuus mahdollistaa opettajan nähdä opiskelijanäkymä."; +$AllowGroupCategories = "Ryhmäkategoriat"; +$AllowGroupCategoriesComment = "Sallitaanko opettajien luoda luokkia Ryhmät-työkalussa?"; +$PlatformLanguageComment = "Voit määrittää alustan kielet alustan hallinnan eri osassa, tässä tapauksessa: Chamilo Platform Languages"; $ProductionServer = "Tuotantopalvelin"; $TestServer = "Testipalvelin"; $ShowOnlineTitle = "Kuka on online"; +$AsPlatformLanguage = "alustakielisenä"; $ShowOnlineComment = "Näytä henkilöiden määrä, jotka ovat online?"; $AllowNameChangeTitle = "Mahdollista nimenvaihto profiilissa?"; $AllowNameChangeComment = "Saako käyttäjä vaihtaa etu- tai sukunimensä?"; +$DefaultDocumentQuotumTitle = "Kiintolevyn oletustila"; +$DefaultDocumentQuotumComment = "Mikä on kurssin käytettävissä oleva levytila? Voit ohittaa tietyn kurssin kiintiön seuraavasti: Alustan hallinta > Kurssit > Muokkaa."; $ProfileChangesTitle = "Profiili"; $ProfileChangesComment = "Mitkä profiilitiedot voidaan muuttaa?"; $RegistrationRequiredFormsTitle = "Rekisteröityminen: vaaditut kentät"; $RegistrationRequiredFormsComment = "Mitkä kentät vaaditaan (sukunimen, etunimen, käyttäjätunnuksen ja salasanan lisäksi)"; +$DefaultGroupQuotumTitle = "Ryhmän käytettävissä oleva levytila"; +$DefaultGroupQuotumComment = "Mikä on oletusarvoinen kiintolevytila, joka on käytettävissä ryhmien asiakirjatyökalulle?"; $AllowLostPasswordTitle = "Kadonnut salasana"; $AllowLostPasswordComment = "Saako käyttäjät pyytää unohtuneen salasanan?"; $AllowRegistrationTitle = "Rekisteröinti"; @@ -1149,151 +1030,692 @@ $AllowRegistrationComment = "Onko rekisteröinti uutena käyttäjänä sallittu? $AllowRegistrationAsTeacherTitle = "Rekisteröinti opettajaksi"; $AllowRegistrationAsTeacherComment = "Saako käyttäjä rekisteröityä opettajaksi (ja siten luoda kursseja)?"; $PlatformLanguage = "Portaalin kieli"; +$Tuning = "Tuunaus"; +$SplitUsersUploadDirectory = "Halkaise käyttäjien lataushakemisto"; +$SplitUsersUploadDirectoryComment = "Suuren kuormituksen portaaleissa, joissa monet käyttäjät ovat rekisteröityneet ja lähettävät kuviaan, lataushakemisto (main/upload/users/) saattaa sisältää liikaa tiedostoja, joita tiedostojärjestelmä ei pysty käsittelemään (Debian-palvelimella on raportoitu yli 36000 tiedostoa). Tämän vaihtoehdon muuttaminen mahdollistaa lataushakemiston hakemistojen jakamisen yhteen tasoon. Perushakemistossa käytetään 9 hakemistoa, ja kaikki seuraavien käyttäjien hakemistot tallennetaan johonkin näistä 9 hakemistosta. Tämän vaihtoehdon muuttaminen ei vaikuta hakemistorakenteeseen levyllä, mutta se vaikuttaa Chamilo-koodin käyttäytymiseen, joten jos muutat tätä vaihtoehtoa, sinun on luotava uudet hakemistot ja siirrettävä olemassa olevat hakemistot itse palvelimelle. Huomaa, että kun luot ja siirrät näitä hakemistoja, sinun on siirrettävä käyttäjien 1-9 hakemistot samannimisiin alihakemistoihin. Jos et ole varma tästä vaihtoehdosta, sitä ei kannata aktivoida."; +$CourseQuota = "Levytila"; $EditNotice = "Muokkaa ilmoitusta"; $InsertLink = "Lisää sivu (CMS)"; $EditNews = "Muokkaa uutisia"; $EditCategories = "Muokkaa kurssien kategorioita"; +$EditHomePage = "Muokkaa kotisivun keskiosaa"; +$AllowUserHeadingsComment = "Voiko opettaja määritellä oppilasprofiilin kenttiä lisätietojen hakemista varten?"; $Languages = "Kielet"; +$NoticeTitle = "Ilmoituksen otsikko"; +$NoticeText = "Ilmoituksen teksti"; $LinkURL = "Linkin URL"; $OpenInNewWindow = "Avaa uudessa ikkunassa"; +$LimitUsersListDefaultMaxComment = "Näkymissä, jotka mahdollistavat käyttäjien lisäämisen kursseihin tai luokkiin, jos ensimmäisessä suodattamattomassa luettelossa on enemmän kuin tämä määrä käyttäjiä, oletusarvo on ensimmäinen kirjain (A)."; +$HideDLTTMarkupComment = "Piilota [= ... =] merkintä, kun kielimuuttujaa ei ole käännetty."; $UserDeleted = "Käyttäjä on poistettu"; $NoClassesForThisCourse = "Tälle kurssille ei ole ilmoittautunut yhtään luokkaa"; +$CourseUsage = "Kurssin käyttö"; $NoCoursesForThisUser = "Tämä käyttäjä ei ole ilmoittautunut kursille"; $NoClassesForThisUser = "Tämä käyttäjä ei ole ilmoittautunut luokkaan"; $NoCoursesForThisClass = "Tätä luokkaa ei ole ilmoitettu kursille"; $Tool = "työkalu"; +$NumberOfItems = "kohteiden määrä"; $DocumentsAndFolders = "Tiedostot ja kansiot"; $Exercises = "Kokeet"; $AllowPersonalAgendaTitle = "Henkilökohtainen agenda"; $AllowPersonalAgendaComment = "Voiko opiskelija lisätä henkilökohtaisia tapahtumia agendaan?"; +$CurrentValue = "nykyinen arvo"; $UserPassword = "Salasana"; $SubscriptionAllowed = "Rekisteröityminen sallittu"; +$UnsubscriptionAllowed = "Rekisteröimätön sallittu"; $AddDummyContentToCourse = "Lisää mallisisältöä tähän kurssiin"; $DummyCourseCreator = "Luo mallisisältö kurssiin"; $DummyCourseDescription = "Tämä lisää malli-/esimerkkisisällön tähän kurssiin. Tämä on tarkoitettu vain testaukseen."; +$AvailablePlugins = "Nämä ovat järjestelmästäsi löytyneet laajennukset. Voit ladata lisää lisäosia osoitteesta http://www.chamilo.org/extensions/index.php?section=plugins"; $CreateVirtualCourse = "Luo virtuaalikurssi"; $DisplayListVirtualCourses = "Näytä lista virtuaalikursseista"; +$LinkedToRealCourseCode = "Linkitetty todelliseen kurssikoodiin"; +$AttemptedCreationVirtualCourse = "Virtuaalikurssin luomista yritetty..."; +$WantedCourseCode = "Halutun kurssin koodi"; $ResetPassword = "Nollaa salasana"; $CheckToSendNewPassword = "Merkitse uuden salasanan lähettämiseksi"; $AutoGeneratePassword = "Luo automaattisesti uusi salasana"; +$UseDocumentTitleTitle = "Käytä otsikkoa asiakirjan nimenä"; +$UseDocumentTitleComment = "Tämä mahdollistaa otsikon käytön asiakirjan nimissä asiakirjan_nimi.ext sijasta."; +$StudentPublications = "Tehtävät"; $PermanentlyRemoveFilesTitle = "Poistettuja tiedostoja ei voi palauttaa"; +$PermanentlyRemoveFilesComment = "Tiedoston poistaminen asiakirjatyökalussa poistaa sen pysyvästi. Tiedostoa ei voi palauttaa"; +$DropboxMaxFilesizeTitle = "Dropbox: Dokumentin enimmäistiedostokoko"; +$DropboxMaxFilesizeComment = "Kuinka suuri (MB) dropbox-dokumentti voi olla?"; +$DropboxAllowOverwriteTitle = "Dropbox: Dropbox: Voiko asiakirjoja korvata"; +$DropboxAllowOverwriteComment = "Voidaanko alkuperäinen asiakirja korvata, kun käyttäjä tai kouluttaja lataa asiakirjan, jonka nimi on jo olemassa olevan asiakirjan nimi? Jos vastaat kyllä, menetät versiointimekanismin."; +$DropboxAllowJustUploadTitle = "Dropbox: Lataa omaan dropbox-tilaan?"; +$DropboxAllowJustUploadComment = "Anna kouluttajien ja käyttäjien ladata asiakirjoja dropboxiinsa lähettämättä asiakirjoja itselleen."; +$DropboxAllowStudentToStudentTitle = "Dropbox: Oppilas <-> Oppilas"; +$DropboxAllowStudentToStudentComment = "Antaa käyttäjien lähettää asiakirjoja toisille käyttäjille (peer 2 peer). Käyttäjät voivat käyttää tätä myös vähemmän merkityksellisiin asiakirjoihin (mp3, testien ratkaisut, ...). Jos poistat tämän käytöstä, käyttäjät voivat lähettää asiakirjoja vain kouluttajalle."; +$DropboxAllowMailingTitle = "Dropbox: Salli postitus"; +$DropboxAllowMailingComment = "Postitustoiminnolla voit lähettää jokaiselle oppijalle henkilökohtaisen asiakirjan."; +$PermissionsForNewDirs = "Uusien hakemistojen käyttöoikeudet"; +$PermissionsForNewDirsComment = "Mahdollisuus määritellä jokaiselle vasta luodulle hakemistolle annettavat käyttöoikeusasetukset antaa sinulle mahdollisuuden parantaa tietoturvaa vaarallista sisältöä portaaliin lataavien hakkereiden hyökkäyksiä vastaan. Oletusasetuksen (0770) pitäisi riittää antamaan palvelimellesi kohtuullisen suojaustason. Annettu muoto käyttää UNIX-terminologiaa Owner-Group-Others (Omistaja-Ryhmä-Muut), jossa on luku-kirjoitus-suoritusoikeudet."; $UserListHasBeenExported = "Käyttäjälista on viety."; $ClickHereToDownloadTheFile = "Lataa tiedosto"; $administratorTelephoneTitle = "Portaalin ylläpitäjä: puhelin"; $administratorTelephoneComment = "Portaalin ylläpitäjän puhelinnumero"; $SendMailToNewUser = "Lähetä sähköposti uudelle käyttäjälle"; $ExtendedProfileTitle = "Laajennettu profiili"; +$ExtendedProfileComment = "Jos tämä asetus on päällä, käyttäjä voi täyttää seuraavat (valinnaiset) kentät: \"Henkilökohtainen avoin alueeni\", \"Osaamiseni\", \"Tutkintoni\", \"Mitä voin opettaa\"."; $Classes = "Luokat"; $UserUnsubscribed = "Käyttäjä on nyt poistettu"; $CannotUnsubscribeUserFromCourse = "Käyttäjää ei voi poistaa, koska hän on yksi opettajista."; +$InvalidStartDate = "Aloituspäivämäärä on virheellinen."; +$InvalidEndDate = "Virheellinen päättymispäivä."; +$DateFormatLabel = "(d/m/y h:m)"; +$HomePageFilesNotWritable = "Kotisivutiedostoihin ei voi kirjoittaa!"; +$PleaseEnterNoticeText = "Ilmoitusteksti, kiitos"; +$PleaseEnterNoticeTitle = "Ilmoituksen otsikko"; $PleaseEnterLinkName = "Anna linkin nimi"; $InsertThisLink = "Liitä tämä linkki"; +$FirstPlace = "Ensimmäinen sija"; +$DropboxAllowGroupTitle = "Dropbox: salli ryhmä"; $DropboxAllowGroupComment = "Käyttäjät voivat lähettää tiedostoja ryhmille"; $ClassDeleted = "Luokka on poistettu"; $ClassesDeleted = "Luokat on poistettu"; $NoUsersInClass = "Luokassa ei ole käyttäjiä"; +$UsersAreSubscibedToCourse = "Valitut käyttäjät on ilmoitettu valitulle kurssille."; $InvalidTitle = "Anna otsikko"; $CatCodeAlreadyUsed = "Tämä kategoria on jo käytössä"; $PleaseEnterCategoryInfo = "Kirjoita kategorian koodi ja nimi"; $RegisterYourPortal = "Rekisteröi portaalisi"; +$ShowNavigationMenuTitle = "Näytä kurssin navigointivalikko"; +$ShowNavigationMenuComment = "Näytä navigointivalikko, joka nopeuttaa työkaluihin pääsyä."; +$LoginAs = "Kirjaudu sisään nimellä"; +$ImportClassListCSV = "Tuo luokkaluettelo CSV:n kautta"; +$ShowOnlineWorld = "Näyttää kirjautumissivulla verkossa olevien käyttäjien määrän (näkyvissä koko maailmalle)."; +$ShowOnlineUsers = "Näytä käyttäjien määrä verkossa kaikilla sivuilla (näkyy kirjautuneille henkilöille)."; +$ShowOnlineCourse = "Näytä tällä kurssilla verkossa olevien käyttäjien määrä"; $ShowIconsInNavigationsMenuTitle = "Näytä kuvakkeet navigaatiovalikossa?"; +$SeeAllRightsAllRolesForSpecificLocation = "Painopisteenä sijainti"; +$ClassesSubscribed = "Valitut luokat merkittiin valitulle kurssille."; $RoleId = "Rooli ID"; $RoleName = "Roolinimi"; $RoleType = "Tyyppi"; +$MakeAvailable = "Aseta saataville"; +$MakeUnavailable = "Poista käytöstä"; +$Stylesheets = "Tyylitiedostot"; +$ShowIconsInNavigationsMenuComment = "Pitäisikö navigointivalikossa näyttää erilaisten työkalujen kuvakkeet?"; +$Plugin = "Lisäosa"; $MainMenu = "Päävalikko"; $MainMenuLogged = "Päävalikko sisään kirjautumisen jälkeen"; $Banner = "Banneri"; +$ImageResizeTitle = "Muuta ladattujen käyttäjäkuvien kokoa"; +$ImageResizeComment = "Käyttäjän kuvien kokoa voidaan muuttaa latauksen yhteydessä, jos PHP on käännetty GD-kirjaston kanssa. Jos GD ei ole käytettävissä, tämä asetus jätetään huomiotta."; +$MaxImageWidthTitle = "Käyttäjäkuvan enimmäisleveys"; +$MaxImageWidthComment = "Käyttäjän kuvan enimmäisleveys pikseleinä. Tätä asetusta sovelletaan vain, jos käyttäjäkuvien koko muutetaan latauksen yhteydessä."; +$MaxImageHeightTitle = "Käyttäjäkuvan enimmäiskorkeus"; +$MaxImageHeightComment = "Käyttäjän kuvan enimmäiskorkeus pikseleinä. Tätä asetusta sovelletaan vain, jos käyttäjäkuvien kokoa muutetaan latauksen yhteydessä."; $YourVersionIs = "Versiosi on"; +$ConnectSocketError = "Socket Connection Error (Yhteysvirhe)"; +$SocketFunctionsDisabled = "Socket-yhteydet on poistettu käytöstä"; $ShowEmailAddresses = "Näytä sähköpostiosoitteet"; $ShowEmailAddressesComment = "Näytä käyttäjille sähköpostiosoitteet"; $ActiveExtensions = "Aktivoi tämä palvelu"; $Visioconf = "Chamilo LIVE"; +$VisioconfDescription = "Chamilo LIVE on videokonferenssityökalu, joka tarjoaa: Diojen jakaminen, valkotaulu, jolla voit piirtää ja kirjoittaa diojen päälle, audio/video duplex ja chat. Se vaatii Flash® player 9+ ja tarjoaa kaksi tilaa: yksi monelle ja monta monelle."; +$Ppt2lp = "Chamilo RAPID"; +$Ppt2lpDescription = "Chamilo RAPID on nopean oppimisen työkalu, joka on saatavilla Chamilo Pro- ja Chamilo Medical -ohjelmissa. Sen avulla voit muuntaa Powerpoint- tai LibreOffice-esityksiä SCORM-yhteensopiviksi kursseiksi. Muuntamisen jälkeen päädyt kurssien kirjoitustyökaluun ja voit lisätä äänikommentteja dioihin ja sivuihin, testejä ja tehtäviä diojen tai sivujen väliin sekä vuorovaikutustoimintoja, kuten foorumikeskusteluja tai tehtävien lataamista. Jokaisesta vaiheesta tulee itsenäinen ja irrotettava oppimisobjekti. Ja koko kurssi tuottaa tarkan SCORM-raportoinnin jatkovalmennusta varten."; +$BandWidthStatistics = "Kaistanleveystilastot"; +$BandWidthStatisticsDescription = "MRTG:n avulla voit tarkastella kehittyneitä tilastoja palvelimen tilasta viimeisten 24 tunnin ajalta."; +$ServerStatistics = "Palvelimen tilastot"; +$ServerStatisticsDescription = "AWStatsin avulla voit tarkastella alustasi tilastoja: kävijät, sivulataukset, viittaukset..."; +$SearchEngine = "Chamilo KIRJASTO"; +$SearchEngineDescription = "Chamilo KIRJASTO on hakukone, joka tarjoaa monikriteeristä indeksointia ja tutkimusta. Se on osa Chamilo Medical -toimintoja."; $ListSession = "Lista harjoitusistunnoista"; $AddSession = "Lisää harjoitusistunto"; +$ImportSessionListXMLCSV = "Tuo istuntojen luettelo"; +$ExportSessionListXMLCSV = "Vie istuntojen luettelo"; $NbCourses = "Kurssit"; $DateStart = "Aloituspäivä"; $DateEnd = "Loppumispäivä"; $CoachName = "Valmentajan nimi"; $SessionNameIsRequired = "Istunnolla tulee olla nimi"; $NextStep = "Seuraava vaihe"; +$Confirm = "Vahvista"; $UnsubscribeUsersFromCourse = "Poista käyttäjät kurssista"; +$MissingClassName = "Puuttuva luokkanimi"; +$ClassNameExists = "Luokkanimi on jo olemassa"; +$ImportCSVFileLocation = "CSV-tiedoston tuonnin sijainti"; $ClassesCreated = "Luokat luotu"; +$ErrorsWhenImportingFile = "Virheitä tiedostoa tuotaessa"; $ServiceActivated = "Palvelu aktivoitu"; $ActivateExtension = "Aktivoi palvelu"; +$InvalidExtension = "Virheellinen laajennusosa"; +$VersionCheckExplanation = "Jotta voit ottaa käyttöön automaattisen version tarkistuksen, sinun on rekisteröitävä portaali chamilo.org-sivustolla. Tätä painiketta napsauttamalla saadut tiedot on tarkoitettu vain sisäiseen käyttöön, ja vain aggregoidut tiedot ovat julkisesti saatavilla (portaalien kokonaismäärä, chamilo-kurssin kokonaismäärä, chamilo-käyttäjien kokonaismäärä, ...) (ks. http://www.chamilo.org/stats/). Kun rekisteröidyt, ilmestyt myös maailmanlaajuiseen luetteloon(http://www.chamilo.org/community.php. Jos et halua näkyä tällä listalla, sinun on rastitettava alla oleva valintaruutu. Rekisteröityminen on niin helppoa kuin se vain voi olla: sinun tarvitsee vain klikata tätä painiketta:"; +$AfterApproval = "Hyväksymisen jälkeen"; $StudentViewEnabledTitle = "Aktivoi opiskelijanäkymä"; +$StudentViewEnabledComment = "Ota käyttöön oppilasnäkymä, jonka avulla opettaja tai ylläpitäjä näkee kurssin kuten oppilas näkisi sen."; +$TimeLimitWhosonlineTitle = "Kuka on verkossa -aikarajoitus"; +$TimeLimitWhosonlineComment = "Tämä aikaraja määrittelee, kuinka monta minuuttia viimeisen toimintansa jälkeen käyttäjän katsotaan olevan *online*."; $ExampleMaterialCourseCreationTitle = "Esimerkkimateriaalia kurssia luodessa"; $ExampleMaterialCourseCreationComment = "Luo automaattisesti esimerkkimateriaalia kun uusi kurssi luodaan"; +$AccountValidDurationTitle = "Tilin voimassaoloaika"; +$AccountValidDurationComment = "Käyttäjätili on voimassa tämän määrän päiviä tilin luomisen jälkeen."; +$UseSessionModeTitle = "Käytä koulutustilaisuuksia"; +$UseSessionModeComment = "Koulutustilaisuudet tarjoavat erilaisen tavan käsitellä koulutusta, jossa kursseilla on tekijä, valmentaja ja oppijat. Kukin valmentaja antaa kurssin tietyn ajanjakson ajan, jota kutsutaan *koulutustilaisuudeksi*, joukolle oppijoita, jotka eivät sekoitu muihin oppijaryhmiin, jotka on liitetty toiseen koulutustilaisuuteen."; $HomepageViewActivity = "Aktiviteettinäkymä"; $HomepageView2column = "Kahden sarakkeen näkymä"; $HomepageView3column = "Kolmen sarakkeen näkymä"; +$AllowUserHeadings = "Salli käyttäjien profilointi kurssien sisällä"; $IconsOnly = "Vain kuvakkeet"; $TextOnly = "Vain teksti"; $IconsText = "Kuvakkeet ja teksti"; $EnableToolIntroductionTitle = "Aktivoi työkalun esittely"; +$EnableToolIntroductionComment = "Ota käyttöön esittelyt kunkin työkalun etusivulla."; +$BreadCrumbsCourseHomepageTitle = "Kurssin kotisivun leivänmurunen"; +$BreadCrumbsCourseHomepageComment = "Breadcrumb on vaakasuora linkkien navigointijärjestelmä, joka on yleensä sivun vasemmassa yläkulmassa. Tällä valinnalla voit valita, mitä haluat näkyvän leivänmurussa kurssien etusivuilla."; +$LoginPageMainArea = "Kirjautumissivun pääalue"; +$LoginPageMenu = "Kirjautumissivun valikko"; +$CampusHomepageMainArea = "Portaalin kotisivun pääalue"; +$CampusHomepageMenu = "Portaalin kotisivun valikko"; +$MyCoursesMainArea = "Kurssieni pääalue"; $MyCoursesMenu = "Kurssien valikko"; +$Header = "Otsikko"; +$Footer = "Alatunniste"; +$PublicPagesComplyToWAITitle = "Julkisten sivujen WAI-vaatimustenmukaisuus"; +$PublicPagesComplyToWAIComment = "WAI (Web Accessibility Initiative) on aloite, jonka tavoitteena on parantaa verkon saavutettavuutta. Valitsemalla tämän vaihtoehdon, Chamilon julkisista sivuista tulee esteettömämpiä. Tämä tarkoittaa myös sitä, että osa portaalin julkisten sivujen sisällöstä saattaa näkyä eri tavalla."; +$VersionCheck = "Versiotarkistus"; +$SessionOverview = "Istunnon yleiskatsaus"; +$SubscribeUserIfNotAllreadySubscribed = "Lisää käyttäjä kurssille vain, jos hän ei ole vielä kurssilla."; +$UnsubscribeUserIfSubscriptionIsNotInFile = "Poista käyttäjät kaikista kursseista, joita ei ole erikseen mainittu tässä tiedostossa."; $DeleteSelectedSessions = "Poista valitut istunnot"; $CourseListInSession = "Kursseja tässä istunnossa"; +$UnsubscribeCoursesFromSession = "Poistaa valitut kurssit tästä istunnosta"; $NbUsers = "Käyttäjät"; +$SubscribeUsersToSession = "Rekisteröi käyttäjät tälle istunnolle"; +$UserListInPlatform = "Portaalin käyttäjäluettelo"; +$UserListInSession = "Luettelo tähän istuntoon rekisteröidyistä käyttäjistä"; +$CourseListInPlatform = "Kurssiluettelo"; +$Host = "Isäntä"; +$UserOnHost = "Sisäänkirjautuminen"; $FtpPassword = "FTP salasana"; +$PathToLzx = "Polku LZX-tiedostoihin"; $WCAGContent = "Teksti"; $SubscribeCoursesToSession = "Lisää kursseja tähän istuntoon"; +$DateStartSession = "Aloituspäivä (käytettävissä 00:00:00 alkaen tänä päivänä)"; +$DateEndSession = "Päättymispäivä (23:59:59 asti kyseisenä päivänä)"; $EditSession = "Muokkaa tätä istuntoa"; +$VideoConferenceUrl = "Polku live-konferenssiin"; +$VideoClassroomUrl = "Polku luokkahuoneen live-konferenssiin"; +$ReconfigureExtension = "Laajennuksen uudelleenkonfigurointi"; +$ServiceReconfigured = "Palvelu konfiguroitu uudelleen"; $ChooseNewsLanguage = "Valitse uutisten kieli"; +$Ajax_course_tracking_refresh = "Kurssilla vietetty kokonaisaika"; +$Ajax_course_tracking_refresh_comment = "tätä vaihtoehtoa käytetään laskemaan reaaliaikaisesti aika, jonka käyttäjä viettää kurssilla. Kentän arvo on päivitysväli sekunteina. Jos haluat poistaa tämän vaihtoehdon käytöstä, anna kentän oletusarvoksi 0."; +$FinishSessionCreation = "Lopeta istunnon luominen"; +$VisioRTMPPort = "Videokonferenssin RTMTP-protokollan portti"; $SessionNameAlreadyExists = "Istunnon nimi on jo olemassa"; +$NoClassesHaveBeenCreated = "Luokkia ei ole luotu"; $ThisFieldShouldBeNumeric = "Tämän kentän tulee olla numeerinen"; $UserLocked = "Käyttäjä lukittu"; +$UserUnlocked = "Käyttäjän lukitus poistettu"; $CannotDeleteUser = "Tätä käyttäjää et voi poistaa"; $SelectedUsersDeleted = "Valitut käyttäjät poistettu"; $SomeUsersNotDeleted = "Joitain käyttäjiä ei ole poistettu"; +$ExternalAuthentication = "Ulkoinen todentaminen"; $RegistrationDate = "Rekisteröitymispäivä"; $UserUpdated = "Käyttäjä päivitetty"; +$HomePageFilesNotReadable = "Kotisivutiedostot eivät ole luettavissa"; $Choose = "Valitse"; +$ModifySessionCourse = "Muokkaa istuntokurssia"; $CourseSessionList = "Kurssit tässä istunnossa"; $SelectACoach = "Valitse valmentaja"; +$UserNameUsedTwice = "Kirjautumista on käytetty kahdesti"; +$UserNameNotAvailable = "Käyttäjätunnus ei saatavilla"; +$UserNameTooLong = "Tämä käyttäjätunnus on liian pitkä"; +$WrongStatus = "Tätä tilaa ei ole olemassa"; +$ClassNameNotAvailable = "Tämä luokkanimi ei ole käytettävissä"; $FileImported = "Tiedosto tuotu"; +$WhichSessionToExport = "Valitse vietävä istunto"; +$AllSessions = "Kaikki istunnot"; +$CodeDoesNotExists = "Tätä koodia ei ole olemassa"; $UnknownUser = "Tuntematon käyttäjä"; $UnknownStatus = "Tuntematon status"; +$SessionDeleted = "Istunto on poistettu"; +$CourseDoesNotExist = "Tätä kurssia ei ole olemassa"; $UserDoesNotExist = "Tämä käyttäjä ei ole olemassa"; +$ButProblemsOccured = "mutta ilmeni ongelmia"; +$UsernameTooLongWasCut = "Tämä käyttäjätunnus lyhennettiin"; +$NoInputFile = "Mitään tiedostoa ei lähetetty"; +$StudentStatusWasGivenTo = "Oppilassatus annettu"; +$WrongDate = "Väärä päivämäärämuoto (yyyy-mm-dd)"; +$YouWillSoonReceiveMailFromCoach = "Saat pian sähköpostia valmentajaltasi."; +$SlideSize = "Diojen koko"; +$EphorusPlagiarismPrevention = "Ephorus plagioinnin esto"; $CourseTeachers = "Opettajat"; $UnknownTeacher = "Tuntematon opettaja"; +$HideDLTTMarkup = "Piilota DLTT-merkintä"; +$ListOfCoursesOfSession = "Luettelo istunnon kursseista"; +$UnsubscribeSelectedUsersFromSession = "Valittujen käyttäjien poistaminen istunnosta"; +$ShowDifferentCourseLanguageComment = "Näytä kunkin kurssin kieli kurssin otsikon vieressä etusivun kurssiluettelossa."; +$ShowEmptyCourseCategoriesComment = "Näytä kurssien luokat etusivulla, vaikka ne olisivat tyhjiä."; +$ShowEmptyCourseCategories = "Näytä tyhjät kurssikategoriat"; +$XMLNotValid = "XML-dokumentti ei ole kelvollinen"; +$ForTheSession = "istunnon ajaksi"; +$AllowEmailEditorTitle = "Online-sähköpostieditori käytössä"; +$AllowEmailEditorComment = "Jos tämä vaihtoehto on aktivoitu, sähköpostiosoitteen napsauttaminen avaa online-editorin."; +$AddCSVHeader = "Sisällytä otsikkorivi?"; +$YesAddCSVHeader = "Kyllä, lisää otsikot\r\nTämä laittaa kenttien nimet ensimmäiselle riville. Se on välttämätöntä, kun haluat tuoda tiedoston myöhemmin Chamilo-portaaliin."; +$ListOfUsersSubscribedToCourse = "Luettelo kurssille ilmoittautuneista käyttäjistä"; $NumberOfCourses = "Kurssit"; $ShowDifferentCourseLanguage = "Näytä kurssien kielet"; +$VisioRTMPTunnelPort = "Videokonferenssin RTMPT-protokollan tunneliportti"; +$Security = "Turvallisuus"; +$UploadExtensionsListType = "Asiakirjojen lataamisen suodatuksen tyyppi"; +$UploadExtensionsListTypeComment = "Haluatko käyttää mustan listan tai valkoisen listan suodatusta. Katso lisätietoja alla olevasta mustan tai valkoisen listan kuvauksesta."; +$Blacklist = "Musta lista"; +$Whitelist = "Valkoinen lista"; +$UploadExtensionsBlacklist = "Musta lista - asetukset"; +$UploadExtensionsWhitelist = "Valkoinen lista - asetukset"; +$UploadExtensionsBlacklistComment = "Mustaa listaa käytetään tiedostopäätteiden suodattamiseen poistamalla (tai nimeämällä uudelleen) kaikki tiedostot, joiden päätteet ovat alla olevassa mustassa listassa. Tiedostopäätteet on esitettävä ilman etumerkkiä (.) ja erotettava toisistaan puolipisteellä (;), kuten seuraavassa: exe;com;bat;scr;php. Tiedostot ilman tiedostopäätettä hyväksytään. Kirjainten isolla ja pienellä kirjaimella ei ole väliä."; +$UploadExtensionsWhitelistComment = "Valkoista listaa käytetään tiedostopäätteiden suodattamiseen poistamalla (tai nimeämällä uudelleen) kaikki tiedostot, joiden tiedostopääte *Ei* ole alla olevassa valkoisessa listassa. Sitä pidetään yleisesti turvallisempana mutta rajoittavampana lähestymistapana suodatukseen. Laajennusten tulisi esiintyä ilman etumerkkiä (.) ja ne tulisi erottaa toisistaan puolipisteellä (;), esimerkiksi seuraavasti: htm;html;txt;doc;xls;ppt;jpg;jpeg;gif;sxw. Tiedostot ilman tiedostopäätettä hyväksytään. Kirjainten isolla ja pienellä kirjaimella ei ole väliä."; +$UploadExtensionsSkip = "Suodatuskäyttäytyminen (ohita/uudelleen nimeä)"; +$UploadExtensionsSkipComment = "Jos valitset ohittamisen, mustan tai valkoisen listan kautta suodatettuja tiedostoja ei ladata järjestelmään. Jos päätät nimetä ne uudelleen, niiden tiedostopääte korvataan tiedostopäätteen korvausasetuksessa määritetyllä tiedostopäätteellä. Huomaa, että uudelleennimeäminen ei suojaa sinua, ja se voi aiheuttaa nimien törmäyksiä, jos on olemassa useita tiedostoja, joilla on sama nimi mutta eri laajennukset."; +$UploadExtensionsReplaceBy = "Korvaava tiedostopääte"; +$UploadExtensionsReplaceByComment = "Kirjoita tiedostopääte, jota haluat käyttää suodattimen havaitsemien vaarallisten tiedostopäätteiden korvaamiseen. Tarvitaan vain, jos olet valinnut suodattamisen korvaamalla."; +$ShowNumberOfCoursesComment = "Näytä kurssien määrä kussakin kategoriassa etusivun kurssikategorioissa."; +$EphorusDescription = "Start using the Ephorus anti plagiarism service in Chamilo.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWith Ephorus, you will prevent internet plagiarism without any additional effort.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t You can use our unique open standard webservice to build your own integration or you can use one of our Chamilo-integration modules."; +$EphorusLeadersInAntiPlagiarism = "plagioinnin torjunnan johtajat \t\t\t\t"; +$EphorusClickHereForInformationsAndPrices = "Klikkaa tästä saadaksesi lisätietoja ja hinnat\t\t\t"; $NameOfTheSession = "Istunnon nimi"; $NoSessionsForThisUser = "Tämä käyttäjä ei ole ilmoittautunut istuntoon"; +$DisplayCategoriesOnHomepageTitle = "Näytä kategoriat etusivulla"; +$DisplayCategoriesOnHomepageComment = "Tämä vaihtoehto näyttää tai piilottaa kurssikategoriat portaalin etusivulla."; +$ShowTabsTitle = "Välilehdet otsikkorivillä"; +$ShowTabsComment = "Valitse välilehdet, joiden haluat näkyvän otsikossa. Valitsemattomat välilehdet näkyvät portaalin etusivun oikeanpuoleisessa valikossa ja kurssini-sivulla, jos niiden on oltava näkyvissä."; +$DefaultForumViewTitle = "Foorumin oletusnäkymä"; +$DefaultForumViewComment = "Minkä pitäisi olla oletusvaihtoehto uutta foorumia luotaessa. Jokainen kouluttaja voi kuitenkin valita eri näkymän jokaiselle yksittäiselle foorumille."; +$TabsMyCourses = "Kurssit-välilehti"; +$TabsCampusHomepage = "Portaalin etusivun välilehti"; +$TabsReporting = "Raportointi-välilehti"; +$TabsPlatformAdministration = "Alustan hallinta -välilehti"; +$NoCoursesForThisSession = "Ei kurssia tälle istunnolle"; +$NoUsersForThisSession = "Ei käyttäjiä tällä istunnolla"; $LastNameMandatory = "Sukunimi ei voi olla tyhjä"; +$FirstNameMandatory = "Etunimi ei voi olla tyhjä"; $EmailMandatory = "Sähköposti ei voi olla tyhjä"; +$TabsMyAgenda = "Asialistan välilehti"; +$NoticeWillBeNotDisplayed = "Ilmoitusta ei näytetä etusivulla."; +$LetThoseFieldsEmptyToHideTheNotice = "Anna näiden kenttien olla tyhjiä ilmoituksen piilottamiseksi"; +$Ppt2lpVoiceRecordingNeedsRed5 = "Kurssieditorin äänentallennusominaisuus perustuu Red5:n suoratoistopalvelimeen. Palvelimen parametrit voidaan määrittää nykyisen sivun videoneuvotteluosiossa."; +$PlatformCharsetTitle = "Merkistö"; +$PlatformCharsetComment = "Merkistö ohjaa sitä, miten tietyt kielet voidaan näyttää Chamilossa. Jos käytät esimerkiksi venäläisiä tai japanilaisia merkkejä, saatat haluta muuttaa tätä. Kaikille englantilaisille, latinalaisille ja länsieurooppalaisille merkeille oletus UTF-8:n pitäisi olla hyvä."; +$ExtendedProfileRegistrationTitle = "Portfolion kentät rekisteröinnin yhteydessä"; +$ExtendedProfileRegistrationComment = "Mitkä seuraavista portfolion kentistä on oltava käytettävissä käyttäjän rekisteröintiprosessissa? Tämä edellyttää, että portfolio-vaihtoehto on otettu käyttöön (ks. edellä)."; +$ExtendedProfileRegistrationRequiredTitle = "Rekisteröinnissä vaadittavat portfoliokentät"; +$ExtendedProfileRegistrationRequiredComment = "Mitkä seuraavista portfolion kentistä ovat *pakollisia* käyttäjän rekisteröintiprosessissa? Tämä edellyttää, että portfolio-vaihtoehto on käytössä ja että kenttä on käytettävissä myös rekisteröintilomakkeessa (ks. edellä)."; $NoReplyEmailAddress = "No-reply sähköpostiosoite"; +$NoReplyEmailAddressComment = "Tätä sähköpostiosoitetta käytetään silloin, kun on lähetettävä sähköpostiviesti, jossa pyydetään erityisesti, ettei vastausta lähetetä. Yleensä tämä sähköpostiosoite on määritettävä palvelimellesi niin, että se hylkää/ei huomioi kaikki saapuvat sähköpostiviestit."; +$SurveyEmailSenderNoReply = "Kyselysähköpostin lähettäjä (ei vastausta)"; +$SurveyEmailSenderNoReplyComment = "Pitäisikö kyselykutsuissa käyttää valmentajan sähköpostiosoitetta vai pääasetuksissa määriteltyä ei-vastausosoitetta?"; $CourseCoachEmailSender = "Valmentajan sähköpostiosoite"; $NoReplyEmailSender = "No-reply sähköpostiosoite"; +$OpenIdAuthenticationComment = "Ota käyttöön OpenID URL-pohjainen todennus (näyttää ylimääräisen kirjautumislomakkeen etusivulla)."; +$VersionCheckEnabled = "Versiotarkistus käytössä"; +$InstallDirAccessibleSecurityThreat = "Chamilo-järjestelmän pää-/asennushakemisto on edelleen verkkokäyttäjien käytettävissä. Tämä saattaa olla turvallisuusuhka asennuksellesi. Suosittelemme, että poistat tämän hakemiston tai muutat sen käyttöoikeuksia niin, että verkkokäyttäjät eivät voi käyttää sen sisältämiä skriptejä."; +$GradebookActivation = "Arviointityökalun aktivointi"; +$GradebookActivationComment = "Arviointityökalun avulla voit arvioida organisaatiosi osaamista yhdistämällä luokkahuone- ja verkkotoimintojen arvioinnit suorituskykyraporteiksi. Haluatko aktivoida sen?"; +$UserTheme = "Teema (tyylitiedosto)"; +$UserThemeSelection = "Käyttäjäteeman valinta"; +$UserThemeSelectionComment = "Salli käyttäjien valita oma visuaalinen teema profiilissaan. Tämä muuttaa Chamilon ulkoasua heille, mutta jättää portaalin oletustyylin ennalleen. Jos tietylle kurssille tai istunnolle on määritetty tietty teema, sillä on etusija käyttäjän määrittämiin teemoihin nähden."; +$VisioHost = "Videokonferenssin suoratoistopalvelimen isäntänimi tai IP-osoite"; +$VisioPort = "Videoneuvottelun suoratoistopalvelimen portti"; +$VisioPassword = "Videoneuvottelun suoratoistopalvelimen salasana"; +$Port = "Portti"; +$EphorusClickHereForADemoAccount = "Napsauta tästä saadaksesi demo-tilin"; +$ManageUserFields = "Profilointi"; +$AddUserField = "Lisää profiilikenttä"; +$FieldLabel = "Kentän etiketti"; +$FieldType = "Kentän tyyppi"; +$FieldTitle = "Kentän otsikko"; +$FieldDefaultValue = "Oletusarvo"; +$FieldOrder = "Järjestys"; +$FieldVisibility = "Näkyvissä?"; +$FieldChangeability = "Muutettavissa"; $FieldTypeText = "Teksti"; $FieldTypeTextarea = "Tekstialue"; +$FieldTypeRadio = "Radionapit"; +$FieldTypeSelect = "Valitse vetovalikosta"; +$FieldTypeSelectMultiple = "Monivalintavetovalikko"; $FieldAdded = "Kenttä lisätty"; +$GradebookScoreDisplayColoring = "Arvosanat kynnysten väritys"; +$GradebookScoreDisplayColoringComment = "Ota merkkikynnykset käyttöön valitsemalla valintaruutu"; +$TabsGradebookEnableColoring = "Ota merkkikynnykset käyttöön"; +$GradebookScoreDisplayCustom = "Pätevyystasojen merkintä"; +$GradebookScoreDisplayCustomComment = "Valitse valintaruutu ottaaksesi osaamistasojen merkitsemisen käyttöön"; +$TabsGradebookEnableCustom = "Ota osaamistason merkintä käyttöön"; +$GradebookScoreDisplayColorSplit = "Kynnys"; +$GradebookScoreDisplayColorSplitComment = "Kynnys (prosentteina), jonka alapuolella pisteet värjätään punaisiksi"; +$GradebookScoreDisplayUpperLimit = "Näyttöpisteiden yläraja"; +$GradebookScoreDisplayUpperLimitComment = "Valitse ruutu näyttääksesi pistemäärän ylärajan"; +$TabsGradebookEnableUpperLimit = "Ota pisteiden ylärajan näyttö käyttöön"; +$AddUserFields = "Lisää profiilikenttä"; $FieldPossibleValues = "Mahdolliset arvot"; +$FieldPossibleValuesComment = "Annettu vain toistuville kentille, jaettuna puolisarakkeittain (;)"; +$FieldTypeDate = "Päivämäärä"; +$FieldTypeDatetime = "Päiväys ja aika"; +$UserFieldsAddHelp = "Käyttäjäkentän lisääminen on erittäin helppoa:\r\n- valitse yksisanainen, pienillä kirjaimilla oleva tunniste,\r\n- valitse tyyppi,\r\n- valitse teksti, jonka pitäisi näkyä käyttäjälle (jos käytät olemassa olevaa käännettyä nimeä, kuten Syntymäpäivä tai UserSex, se käännetään automaattisesti mille tahansa kielelle),\r\n- jos valitsit usean tyypin (radio, valinta, monivalinta), anna mahdolliset vaihtoehdot (jälleen se voi käyttää Chamilossa määritettyjä kielimuuttujia), jaettuna puolisarakemerkeillä,\r\n- tekstityypeille voit valita oletusarvon.\r\n\r\nKun olet valmis, lisää kenttä ja valitse, haluatko tehdä siitä näkyvän ja muokattavan. Sen tekeminen muokattavaksi, mutta ei näkyväksi on hyödytöntä.\r\nLähetä palautetta\r\nSiv"; +$AllowCourseThemeTitle = "Salli kurssiteemat"; +$AllowCourseThemeComment = "Mahdollistaa kurssin graafiset teemat ja mahdollistaa kurssin käyttämän tyylisivun vaihtamisen mihin tahansa Chamilon käytettävissä oleviin tyylisivuihin. Kun käyttäjä tulee kurssille, kurssin tyylisivulla on etusija käyttäjän omaan tyylisivuun ja alustan oletustyylisivuun nähden."; +$DisplayMiniMonthCalendarTitle = "Näytä pieni kuukausikalenteri esityslistatyökalussa"; +$DisplayMiniMonthCalendarComment = "Tämä asetus ottaa käyttöön tai poistaa käytöstä pienen kuukausikalenterin, joka näkyy esityslistatyökalun vasemmassa sarakkeessa"; +$DisplayUpcomingEventsTitle = "Näytä tulevat tapahtumat esityslistatyökalussa"; +$DisplayUpcomingEventsComment = "Tämä asetus ottaa käyttöön tai poistaa käytöstä tulevat tapahtumat, jotka näkyvät kurssin agendatyökalun vasemmassa sarakkeessa"; +$NumberOfUpcomingEventsTitle = "Tulevien tapahtumien määrä, jotka on näytettävä."; +$NumberOfUpcomingEventsComment = "Niiden tulevien tapahtumien määrä, jotka on näytettävä esityslistalla. Tämä edellyttää, että tulevan tapahtuman toiminto on aktivoitu (katso asetus yllä)."; +$ShowClosedCoursesTitle = "Näytetäänkö suljetut kurssit kirjautumissivulla ja portaalin aloitussivulla?"; +$ShowClosedCoursesComment = "Näytetäänkö suljetut kurssit kirjautumissivulla ja kurssien aloitussivulla? Portaalin aloitussivulla kurssien viereen ilmestyy kuvake, jonka avulla voit tilata kurssit nopeasti. Tämä näkyy vain portaalin aloitussivulla, kun käyttäjä on kirjautunut sisään ja kun käyttäjä ei ole vielä tilannut portaalia."; +$LDAPConnectionError = "LDAP-yhteysvirhe"; +$LDAP = "LDAP"; +$LDAPEnableTitle = "Ota LDAP käyttöön"; +$LDAPEnableComment = "Jos sinulla on LDAP-palvelin, sinun on määritettävä sen asetukset alla ja muokattava asetustiedostoa asennusoppaassa kuvatulla tavalla ja aktivoitava se sitten. Näin käyttäjät voivat todentaa käyttämällä LDAP-kirjautumistunnuksiaan. Jos et tiedä, mikä LDAP on, jätä se pois käytöstä"; +$LDAPMainServerAddressTitle = "LDAP-palvelimen pääosoite"; +$LDAPMainServerAddressComment = "Pääasiallisen LDAP-palvelimesi IP-osoite tai URL-osoite."; +$LDAPMainServerPortTitle = "LDAP-pääpalvelimen portti."; +$LDAPMainServerPortComment = "Portti, johon LDAP-pääpalvelin vastaa (yleensä 389). Tämä on pakollinen asetus."; +$LDAPDomainTitle = "LDAP-verkkotunnus"; +$LDAPDomainComment = "Tämä on LDAP-toimialue (dc), jota käytetään yhteystietojen etsimiseen LDAP-palvelimelta. Esimerkiksi: dc=xx, dc=yy, dc=zz"; +$LDAPReplicateServerAddressTitle = "Kopioi palvelimen osoite"; +$LDAPReplicateServerAddressComment = "Kun pääpalvelin ei ole käytettävissä, tätä palvelinta käytetään. Jätä tyhjäksi tai käytä samaa arvoa kuin pääpalvelin, jos sinulla ei ole kopiopalvelinta."; +$LDAPReplicateServerPortTitle = "Replikoi palvelimen portti"; +$LDAPReplicateServerPortComment = "Portti, johon replikointipalvelin vastaa."; +$LDAPSearchTermTitle = "Hakusana"; +$LDAPSearchTermComment = "Tätä termiä käytetään suodattamaan yhteystietojen haku LDAP-palvelimelta. Jos et ole varma, mitä tänne laitat, katso LDAP-palvelimesi dokumentaatiota ja asetuksia."; +$LDAPVersionTitle = "LDAP versio"; +$LDAPVersionComment = "Valitse LDAP-palvelimen versio, jota haluat käyttää. Oikean version käyttäminen riippuu LDAP-palvelimesi kokoonpanosta."; +$LDAPVersion2 = "LDAP 2"; +$LDAPVersion3 = "LDAP 3"; +$LDAPFilledTutorFieldTitle = "Ohjaajan tunnistekenttä"; +$LDAPFilledTutorFieldComment = "Tämä LDAP-yhteystietokenttä tarkistetaan, kun uusia käyttäjiä lisätään. Jos tämä kenttä ei ole tyhjä, käyttäjää pidetään ohjaajana ja lisätään Chamiloon sellaisenaan. Jos haluat, että kaikki käyttäjäsi tunnistetaan yksinkertaisiksi käyttäjiksi, jätä tämä kenttä tyhjäksi. Voit muuttaa tätä toimintaa muuttamalla koodia. Lue lisätietoja asennusoppaasta."; +$LDAPAuthenticationLoginTitle = "Todennus"; +$LDAPAuthenticationLoginComment = "Jos käytät LDAP-palvelinta, joka ei tue tai hyväksy anonyymiä pääsyä, täytä seuraava kenttä käytettävällä käyttäjätunnuksella. Älä sisällytä \"cn=\". Jätä tyhjäksi anonyymisti pääsyä varten."; +$LDAPAuthenticationPasswordTitle = "Todennuksen salasana"; +$LDAPAuthenticationPasswordComment = "Jos käytät LDAP-palvelinta, joka ei tue tai hyväksy anonyymiä pääsyä, täytä seuraava kenttä käytettävällä käyttäjän salasanalla."; +$LDAPImport = "LDAP-tuonti"; +$EmailNotifySubscription = "Ilmoita tilaajille sähköpostitse"; +$DontUncheck = "Älä poista valintaa"; +$AllSlashNone = "Kaikki/ei mitään"; +$LDAPImportUsersSteps = "LDAP-tuonti: Käyttäjät/vaiheet"; +$EnterStepToAddToYourSession = "Anna istuntoon lisättävä vaihe"; +$ToDoThisYouMustEnterYearDepartmentAndStep = "Tätä varten sinun on syötettävä vuosi, osasto ja vaihe"; +$FollowEachOfTheseStepsStepByStep = "Noudata jokaista näistä vaiheista vaihe vaiheelta"; +$RegistrationYearExample = "Rekisteröintivuosi. Esimerkki: %s lukuvuodelle %s-%s"; $SelectDepartment = "Valitse osasto"; $RegistrationYear = "Rekisteröitymisvuosi"; $SelectStepAcademicYear = "Valitse vaihe (akateeminen vuosi)"; +$ErrorExistingStep = "Virhe: tämä vaihe on jo olemassa"; +$ErrorStepNotFoundOnLDAP = "Virhe: vaihetta ei löydy LDAP-palvelimelta"; +$StepDeletedSuccessfully = "Vaihe poistettu onnistuneesti"; +$StepUsersDeletedSuccessfully = "Vaiheen käyttäjät poistettu onnistuneesti"; +$NoStepForThisSession = "Ei LO:ta tässä istunnossa"; +$DeleteStepUsers = "Poista käyttäjät vaiheesta"; +$ImportStudentsOfAllSteps = "Tuo kaikkien vaiheiden oppijat"; +$ImportLDAPUsersIntoPlatform = "Tuo LDAP-käyttäjät alustalle"; +$NoUserInThisSession = "Ei käyttäjää tässä istunnossa"; +$SubscribeSomeUsersToThisSession = "Tilaa joitain käyttäjiä tähän istuntoon"; +$EnterStudentsToSubscribeToCourse = "Anna opiskelijat, jotka haluat rekisteröidä kurssille"; +$ToDoThisYouMustEnterYearComponentAndComponentStep = "Tätä varten sinun on syötettävä vuosi, komponentti ja komponentin askel"; $SelectComponent = "Valitse komponentti"; $Component = "Komponentti"; $SelectStudents = "Valitse opiskelijat"; +$LDAPUsersAdded = "LDAP-käyttäjät lisätty"; +$NoUserAdded = "Käyttäjiä ei lisätty"; +$ImportLDAPUsersIntoCourse = "Tuo LDAP-käyttäjät kurssille"; +$ImportLDAPUsersAndStepIntoSession = "Tuo LDAP-käyttäjät ja siirry istuntoon"; +$LDAPSynchroImportUsersAndStepsInSessions = "LDAP-synkronointi: Tuo oppijat/vaiheet kurssin istuntoihin"; +$TabsMyGradebook = "Arviot-välilehti"; +$LDAPUsersAddedOrUpdated = "LDAP-käyttäjät lisätty tai päivitetty"; +$SearchLDAPUsers = "Etsi LDAP-käyttäjiä"; +$SelectCourseToImportUsersTo = "Valitse kurssi, jolle haluat rekisteröidä käyttäjät, jotka aiot valita seuraavaksi"; +$ImportLDAPUsersIntoSession = "Tuo LDAP-käyttäjät istuntoon"; +$LDAPSelectFilterOnUsersOU = "Valitse suodatin löytääksesi vastaavan merkkijonon OU-attribuutin lopusta"; +$LDAPOUAttributeFilter = "OU-määritesuodatin"; +$SelectSessionToImportUsersTo = "Valitse istunto, johon haluat tuoda nämä käyttäjät"; +$VisioUseRtmptTitle = "Käytä RTMPT-protokollaa"; +$VisioUseRtmptComment = "RTMPT-protokolla mahdollistaa pääsyn videoneuvotteluun palomuurin takaa ohjaamalla tiedonsiirtoa porttiin 80. Tämä kuitenkin hidastaa suoratoistoa, joten sen käyttöä suositellaan välttämään, ellei sitä vaadita."; +$UploadNewStylesheet = "Uusi tyylitaulukkotiedosto"; +$NameStylesheet = "Tyylitaulukon nimi"; +$StylesheetAdded = "Tyylitaulukko on lisätty"; +$LDAPFilledTutorFieldValueTitle = "Ohjaajan tunnistearvo"; +$LDAPFilledTutorFieldValueComment = "Kun yllä olevalle ohjaajakenttään on tehty tarkistus, tämän arvon on oltava jossakin ohjaajakentän alielementissä, jotta käyttäjää voidaan pitää kouluttajana. Jos jätät tämän kentän tyhjäksi, ainoa ehto on, että kenttä on olemassa, jotta tätä LDAP-käyttäjää voidaan pitää kouluttajana. Esimerkiksi kenttä voisi olla \"memberof\" ja haettava arvo voisi olla \"CN=G_TRAINER,OU=Trainer\"."; +$IsNotWritable = "ei ole kirjoitettava"; +$FieldMovedDown = "Kenttä siirrettiin onnistuneesti alas"; $CannotMoveField = "Kenttää ei voi poistaa."; +$FieldMovedUp = "Kenttä on siirretty ylöspäin onnistuneesti."; $FieldDeleted = "Kenttä on poistettu"; $CannotDeleteField = "Kenttää ei voi poistaa"; +$AddUsersByCoachTitle = "Lisää käyttäjät valmentajan mukaan"; +$AddUsersByCoachComment = "Valmentajan käyttäjät voivat luoda käyttäjiä alustalle ja tilata käyttäjiä istuntoon."; +$UserFieldsSortOptions = "Lajittele profilointikenttien asetukset"; +$FieldOptionMovedUp = "Vaihtoehtoa on siirretty ylöspäin."; +$CannotMoveFieldOption = "Vaihtoehtoa on siirretty ylöspäin."; +$FieldOptionMovedDown = "Vaihtoehto on siirretty alaspäin."; +$DefineSessionOptions = "Määritä valmentajan pääsyrajat"; +$DaysBefore = "päivää ennen istunnon alkua"; +$DaysAfter = "päivän kuluttua"; +$SessionAddTypeUnique = "Yksittäinen rekisteröinti"; +$SessionAddTypeMultiple = "Useita rekisteröintejä"; +$EnableSearchTitle = "Koko tekstin hakuominaisuus"; +$EnableSearchComment = "Ota tämä ominaisuus käyttöön valitsemalla \"Kyllä\". Se on erittäin riippuvainen PHP:n Xapian-laajennuksesta, joten tämä ei toimi, jos tätä laajennusta ei ole asennettu palvelimellesi, vähintään versiossa 1.x."; +$SearchASession = "Etsi koulutustilaisuus"; +$ActiveSession = "Session istunto"; $AddUrl = "Lisää Url"; $ShowSessionCoachTitle = "Näytä istunnon valmentaja"; +$ShowSessionCoachComment = "Näytä yleisen istunnon valmentajan nimi istunnon otsikkokentässä kurssiluettelossa"; +$ExtendRightsForCoachTitle = "Laajenna valmentajan oikeuksia"; +$ExtendRightsForCoachComment = "Tämän vaihtoehdon aktivointi antaa valmentajalle samat oikeudet kuin kouluttajalle luontityökaluissa"; +$ExtendRightsForCoachOnSurveyComment = "Aktivoi tämä vaihtoehto, jolloin valmentajat voivat luoda ja muokata kyselyjä"; +$ExtendRightsForCoachOnSurveyTitle = "Laajenna valmentajien oikeuksia kyselyihin"; +$CannotDeleteUserBecauseOwnsCourse = "Tätä käyttäjää ei voi poistaa, koska hän on edelleen kurssin opettaja. Voit joko poistaa hänen opettajan asemansa näiltä kursseilta ja sitten poistaa hänen tilinsä tai poistaa hänen tilin käytöstä sen poistamisen sijaan."; +$AllowUsersToCreateCoursesTitle = "Salli muiden kuin järjestelmänvalvojien luoda kursseja"; +$AllowUsersToCreateCoursesComment = "Salli muiden kuin järjestelmänvalvojien (opettajien) luoda uusia kursseja palvelimelle"; +$AllowStudentsToBrowseCoursesComment = "Salli opiskelijoiden selata kurssiluetteloa ja tilata saatavilla olevia kursseja"; +$YesWillDeletePermanently = "Kyllä (tiedostot poistetaan pysyvästi, eikä niitä voi palauttaa)"; +$NoWillDeletePermanently = "Ei (tiedostot poistetaan sovelluksesta, mutta palvelimesi järjestelmänvalvoja voi palauttaa ne manuaalisesti)"; $SelectAResponsible = "Valitse johtaja"; +$ThereIsNotStillAResponsible = "Henkilöstöpäällikköä ei ole saatavilla"; +$AllowStudentsToBrowseCoursesTitle = "Opiskelijoiden pääsy kurssiluetteloon"; +$SharedSettingIconComment = "Tämä on jaettu asetus"; +$GlobalAgenda = "Globaali agenda"; +$AdvancedFileManagerTitle = "Yleinen asialista"; +$AdvancedFileManagerComment = "Otetaanko edistynyt tiedostonhallinta käyttöön WYSIWYG-editorissa? Tämä lisää huomattavasti lisävaihtoehtoja tiedostonhallintaan, joka avautuu ponnahdusikkunassa, kun tiedostoja ladataan palvelimelle, mutta saattaa olla hieman monimutkaisempi käyttää loppukäyttäjälle."; +$ScormAndLPProgressTotalAverage = "Keskimääräinen edistyminen kursseilla"; +$MultipleAccessURLs = "Multiple access URL / Branding"; +$SearchShowUnlinkedResultsTitle = "Koko tekstihaku: näytä linkittämättömät tulokset"; +$SearchShowUnlinkedResultsComment = "Mitä tulee tehdä tuloksille, jotka eivät ole nykyisen käyttäjän saatavilla, kun näytät kokotekstihaun tuloksia?"; +$SearchHideUnlinkedResults = "Älä näytä niitä"; +$SearchShowUnlinkedResults = "Näytä ne, mutta ilman linkkiä resurssiin"; +$Templates = "Mallit"; +$EnableVersionCheck = "Ota version tarkistus käyttöön"; +$AllowMessageToolTitle = "Sisäinen viestintätyökalu"; $AllowReservationTitle = "Varaus"; +$AllowReservationComment = "Varausjärjestelmän avulla voit varata resursseja kursseillesi (huoneet, pöydät, kirjat, näytöt, ...). Sinun on otettava tämä työkalu käyttöön (järjestelmänvalvojan kautta), jotta se näkyy käyttäjävalikossa."; +$ConfigureResourceType = "Määritä"; +$ConfigureMultipleAccessURLs = "Määritä usean pääsyn URL-osoite"; $URLAdded = "URL on lisätty"; +$URLAlreadyAdded = "Tämä URL-osoite on jo olemassa, valitse toinen URL-osoite"; +$AreYouSureYouWantToSetThisLanguageAsThePortalDefault = "Haluatko varmasti asettaa tämän kielen portaalin oletukseksi?"; $CurrentLanguagesPortal = "Portaalin tämänhetkinen kieli"; +$EditUsersToURL = "Muokkaa käyttäjiä ja URL-osoitteita"; +$AddUsersToURL = "Lisää käyttäjiä URL-osoitteeseen"; +$URLList = "URL-luettelo"; +$AddToThatURL = "Lisää käyttäjiä kyseiseen URL-osoitteeseen"; $SelectUrl = "Valitse URL"; +$UserListInURL = "Käyttäjät tilasivat tämän URL-osoitteen"; +$UsersWereEdited = "Käyttäjätilit on päivitetty"; +$AtLeastOneUserAndOneURL = "Sinun on valittava vähintään yksi käyttäjä ja yksi URL-osoite"; +$UsersBelongURL = "Käyttäjätilit on nyt liitetty URL-osoitteeseen"; +$LPTestScore = "Kurssin pisteet"; +$ScormAndLPTestTotalAverage = "Oppimispolkujen testien keskiarvo"; $ImportUsersToACourse = "Tuo käyttäjälista"; +$ImportCourses = "Tuo kurssiluettelo"; $ManageUsers = "Hallinnoi käyttäjiä"; $ManageCourses = "Hallinnoi kursseja"; +$UserListIn = "Käyttäjät"; +$URLInactive = "URL-osoite on poistettu käytöstä"; +$URLActive = "URL-osoite on otettu käyttöön"; $EditUsers = "Muokkaa käyttäjiä"; $EditCourses = "Muokkaa kursseja"; +$CourseListIn = "Kurssit"; +$AddCoursesToURL = "Lisää kursseja URL-osoitteeseen"; +$EditCoursesToURL = "Muokkaa URL-osoitteen kursseja"; +$AddCoursesToThatURL = "Lisää kursseja kyseiseen URL-osoitteeseen"; +$EnablePlugins = "Ota valitut laajennukset käyttöön"; +$AtLeastOneCourseAndOneURL = "Vähintään yksi kurssi ja yksi URL-osoite"; +$ClickToRegisterAdmin = "Napsauta tätä rekisteröidäksesi järjestelmänvalvojan kaikille sivustoille"; +$AdminShouldBeRegisterInSite = "Admin-käyttäjän tulee rekisteröityä tänne"; +$URLNotConfiguredPleaseChangedTo = "URL-osoitetta ei ole vielä määritetty, lisää tämä URL-osoite:"; +$AdminUserRegisteredToThisURL = "Admin user assigned to this URL"; $CoursesWereEdited = "Kurssit päivitetty"; +$URLEdited = "URL-osoitetta on muokattu"; +$AddSessionToURL = "Lisää istunto URL-osoitteeseen"; +$FirstLetterSession = "Istunnon otsikon ensimmäinen kirjain"; $EditSessionToURL = "Muokkaa istuntoa"; +$AddSessionsToThatURL = "Lisää istuntoja kyseiseen URL-osoitteeseen"; +$SessionBelongURL = "Istuntoja on muokattu"; $ManageSessions = "Hallinnoi istuntoja"; -$SearchXapianModuleNotInstalled = "Xapian hakumodulia ei ole asennettu"; +$AllowMessageToolComment = "Sisäisen viestitystyökalun ottaminen käyttöön antaa käyttäjille mahdollisuuden lähettää viestejä muille alustan käyttäjille ja käyttää viestilaatikkoa."; +$AllowSocialToolTitle = "Sosiaalisen verkoston työkalu (Facebookin kaltainen)"; +$AllowSocialToolComment = "Sosiaalisen verkostotyökalun avulla käyttäjät voivat määritellä suhteita toisiin käyttäjiin ja näin määritellä kaveriporukoita. Yhdessä sisäisen viestitystyökalun kanssa tämä työkalu mahdollistaa tiiviin viestinnän ystävien kanssa portaaliympäristössä."; +$SetLanguageAsDefault = "Aseta kieli oletuskieleksi"; +$FieldFilter = "Suodata"; +$FilterOn = "Suodata päälle"; +$FilterOff = "Suodatin pois päältä"; +$FieldFilterSetOn = "Voit nyt käyttää tätä kenttää suodattimena"; +$FieldFilterSetOff = "Tätä kenttää ei voi käyttää suodattimena."; +$buttonAddUserField = "Lisää käyttäjäkenttä"; +$UsersSubscribedToFollowingCoursesBecauseOfVirtualCourses = "Käyttäjät on rekisteröity seuraaville kursseille, koska useilla kursseilla on sama visuaalinen koodi."; +$TheFollowingCoursesAlreadyUseThisVisualCode = "Tätä koodia käytetään jo seuraavilla kursseilla"; +$UsersSubscribedToBecauseVisualCode = "Käyttäjät on ilmoitettu seuraaville kursseille, koska useilla kursseilla on sama visuaalinen koodi."; +$UsersUnsubscribedFromBecauseVisualCode = "Käyttäjät on poistettu seuraavilta kursseilta, koska useilla kursseilla on sama visuaalinen koodi."; +$FilterUsers = "Suodattaa käyttäjiä"; +$SeveralCoursesSubscribedToSessionBecauseOfSameVisualCode = "Useita kursseja oli merkitty istuntoon päällekkäisen kurssikoodin vuoksi."; +$CoachIsRequired = "Sinun on valittava valmentaja"; +$EncryptMethodUserPass = "Salausmenetelmä"; +$AddTemplate = "Lisää mallipohja"; +$TemplateImageComment100x70 = "Tämä kuva edustaa mallia mallipohjien luettelossa. Sen ei pitäisi olla suurempi kuin 100x70 pikseliä."; +$TemplateAdded = "Mallipohja lisätty"; +$TemplateDeleted = "Mallipohja poistettu"; +$EditTemplate = "Mallipohjan versio"; +$FileImportedJustUsersThatAreNotRegistered = "Käyttäjät, joita ei rekisteröity alustalle, on tuotu"; +$YouMustImportAFileAccordingToSelectedOption = "Sinun on tuotava valittua muotoa vastaava tiedosto"; +$ShowEmailOfTeacherOrTutorTitle = "Näytä alatunnisteessa opettajan tai ohjaajan sähköpostiosoite"; +$ShowEmailOfTeacherOrTutorComent = "Näytäkö valmentajan tai ohjaajan sähköposti alatunnisteessa?"; +$AddSystemAnnouncement = "Lisää järjestelmäilmoitus"; +$EditSystemAnnouncement = "Muokkaa järjestelmän ilmoitusta"; +$LPProgressScore = "% vierailtuja oppimiskohteita"; +$TotalTimeByCourse = "Kokonaisaika kurssilla"; +$LastTimeTheCourseWasUsed = "Viimeisin kerta, kun oppija osallistui kurssille"; +$AnnouncementAvailable = "Ilmoitus on saatavilla"; +$AnnouncementNotAvailable = "Ilmoitus ei ole saatavilla"; +$Searching = "Etsintä"; +$AddLDAPUsers = "LDAP-käyttäjien lisääminen"; +$Academica = "Academica"; +$AddNews = "Lisää uutisia"; +$SearchDatabaseOpeningError = "Hakutietokantaa ei onnistuttu avaamaan"; +$SearchDatabaseVersionError = "Hakutietokanta käyttää tukematonta muotoa"; +$SearchDatabaseModifiedError = "Hakutietokantaa on muutettu/murtunut"; +$SearchDatabaseLockError = "Hakutietokannan lukitseminen epäonnistui"; +$SearchDatabaseCreateError = "Hakutietokannan luominen epäonnistui"; +$SearchDatabaseCorruptError = "Hakutietokanta on korruptoitunut"; +$SearchNetworkTimeoutError = "Yhteys katkesi yhteyden ollessa yhteydessä etähakutietokantaan."; +$SearchOtherXapianError = "Virhe hakukoneessa"; +$FieldRemoved = "Kenttä poistettu"; +$TheNewSubLanguageHasBeenAdded = "Uusi alakieli on lisätty"; +$DeleteSubLanguage = "Poista alakieli"; +$CreateSubLanguageForLanguage = "Luo tälle kielelle alakieli"; +$DeleteSubLanguageFromLanguage = "Poistetaan tämä alakieli"; +$CreateSubLanguage = "Luo alakieli"; +$RegisterTermsOfSubLanguageForLanguage = "Määritellään uusia termejä tätä alakieltä varten."; +$AddTermsOfThisSubLanguage = "Alikieliset termit"; +$LoadLanguageFile = "Lataa kielitiedosto"; +$AllowUseSubLanguageTitle = "Mahdollistaa alakielten määrittelyn ja käytön."; +$AllowUseSubLanguageComment = "Kun otat tämän vaihtoehdon käyttöön, voit määritellä muunnelmia kullekin alustan käyttöliittymässä käytetylle kielitermille uuden kielen muodossa, joka perustuu olemassa olevaan kieleen ja laajentaa sitä. Löydät tämän vaihtoehdon hallintapaneelin Kielet-osiosta."; +$AddWordForTheSubLanguage = "Termien lisääminen alakieleen"; +$TemplateEdited = "Mallia muokattu"; +$SubLanguage = "Alakieli"; +$LanguageIsNowVisible = "Kieli on tehty näkyväksi, ja sitä voidaan nyt käyttää koko foorumissa."; +$LanguageIsNowHidden = "Kieli on piilotettu. Sitä ei voi käyttää ennen kuin se tulee jälleen näkyviin."; +$LanguageDirectoryNotWriteableContactAdmin = "/main/lang-hakemisto, jota käytetään tässä portaalissa kielten tallentamiseen, ei ole kirjoitettavissa. Ota yhteyttä alustan ylläpitäjään ja ilmoita tästä viestistä."; +$ShowGlossaryInDocumentsTitle = "Näytä sanaston termit asiakirjoissa"; +$ShowGlossaryInDocumentsComment = "Täältä voit määrittää, miten asiakirjoista lisätään linkkejä sanaston termeihin."; +$ShowGlossaryInDocumentsIsAutomatic = "Automaattinen: lisää linkit kaikkiin asiakirjassa määriteltyihin sanastotermiin."; +$ShowGlossaryInDocumentsIsManual = "Manuaalinen: näyttää sanaston kuvakkeen online-editorissa, jotta voit merkitä sanastossa olevat termit, jotka haluat linkittää."; +$ShowGlossaryInDocumentsIsNone = "Ei mitään: ei lisää asiakirjoihin mitään sanastotermiä."; +$LanguageVariable = "Kielimuuttuja"; +$ToExportDocumentsWithGlossaryYouHaveToSelectGlossary = "Jos haluat viedä asiakirjan, jossa on sanaston termejä ja viittauksia sanastoon, sinun on varmistettava, että sanastotyökalu on mukana viennissä."; +$ShowTutorDataTitle = "Istunnon ohjaajan tiedot näkyvät alatunnisteessa."; +$ShowTutorDataComment = "Näytä istunnon ohjaajan viite (nimi ja sähköpostiosoite, jos saatavilla) alatunnisteessa?"; +$ShowTeacherDataTitle = "Näytä opettajan tiedot alatunnisteessa"; +$ShowTeacherDataComment = "Näytä opettajan viite (nimi ja sähköpostiosoite, jos saatavilla) alatunnisteessa?"; +$HTMLText = "HTML"; +$PageLink = "Sivun linkki"; +$DisplayTermsConditions = "Näytä käyttöehdot rekisteröintisivulla ja vaadi kävijää hyväksymään käyttöehdot rekisteröityäkseen."; +$AllowTermsAndConditionsTitle = "Ota käyttöön ehdot ja edellytykset"; +$AllowTermsAndConditionsComment = "Tämä vaihtoehto näyttää käyttöehdot rekisteröintilomakkeessa uusille käyttäjille. Se on määritettävä ensin portaalin hallintasivulla."; +$Load = "Lataa"; +$AllVersions = "Kaikki versiot"; +$EditTermsAndConditions = "Muokkaa ehtoja ja edellytyksiä"; +$ExplainChanges = "Selitä muutokset"; +$TermAndConditionNotSaved = "Termi ja ehto ei ole tallennettu"; +$TheSubLanguageHasBeenRemoved = "Alakieli on poistettu"; +$AddTermsAndConditions = "Lisää ehdot ja edellytykset"; +$TermAndConditionSaved = "Tallennettu termi ja ehto"; +$ListSessionCategory = "Istuntojen luokkien luettelo"; +$AddSessionCategory = "Lisää luokka"; +$SessionCategoryName = "Kategorian nimi"; +$EditSessionCategory = "Muokkaa istuntoluokkaa"; +$SessionCategoryAdded = "Luokka on lisätty"; +$SessionCategoryUpdate = "Luokan päivitys"; +$SessionCategoryDelete = "Valitut luokat on poistettu"; +$SessionCategoryNameIsRequired = "Anna nimi istuntoluokalle"; +$ThereIsNotStillASession = "Istuntoja ei ole saatavilla"; +$SelectASession = "Valitse istunto"; +$OriginCoursesFromSession = "Alkuperäisen istunnon kurssit"; +$DestinationCoursesFromSession = "Kohdeistunnon kurssit"; +$CopyCourseFromSessionToSessionExplanation = "Apua kurssien kopioimiseen istunnosta toiseen"; +$TypeOfCopy = "Kopiotyyppi"; +$CopyFromCourseInSessionToAnotherSession = "Kopioi istunnon kurssista toiseen istuntoon"; +$YouMustSelectACourseFromOriginalSession = "Sinun on valittava kurssi alkuperäisestä jaksosta"; +$MaybeYouWantToDeleteThisUserFromSession = "Ehkä haluat poistaa käyttäjän sen sijaan, että poistaisit hänen tilauksensa kaikilta kursseilta...?"; +$EditSessionCoursesByUser = "Muokkaa istuntokursseja käyttäjäkohtaisesti"; +$CoursesUpdated = "Päivitetyt kurssit"; +$CurrentCourses = "Nykyiset kurssit"; +$CoursesToAvoid = "Esteettömät kurssit"; +$EditSessionCourses = "Muokkaa istuntokursseja"; +$SessionVisibility = "Näkyvyys päättymispäivän jälkeen"; +$BlockCoursesForThisUser = "Estä käyttäjän pääsy kursseille tässä istunnossa"; +$LanguageFile = "Kielitiedosto"; +$ShowCoursesDescriptionsInCatalogTitle = "Näytä kurssien kuvaukset luettelossa"; +$ShowCoursesDescriptionsInCatalogComment = "Näytä kurssien kuvaukset integroituna ponnahdusikkunana, kun napsautat kurssitietokuvaketta kurssiluettelossa."; +$StylesheetNotHasBeenAdded = "Tyylitaulukkoa ei voitu lisätä"; +$AddSessionsInCategories = "Lisää istuntoja kategorioihin"; +$ItIsRecommendedInstallImagickExtension = "On suositeltavaa asentaa imagick php-laajennus parempiin suorituksiin resoluution tuottamiseksi pikkukuvia muuten ei näy hyvin, jos se ei ole asentaa oletusarvoisesti käyttää php-gd-laajennus."; +$EditSpecificSearchField = "Muokkaa tiettyä hakukenttää"; +$FieldName = "Kentän nimi"; +$SpecialExports = "Erityisvienti"; +$SpecialCreateFullBackup = "Erikoisluonnos luo täydellinen varmuuskopio"; +$SpecialLetMeSelectItems = "Special anna minun valita kohteita"; +$AllowCoachsToEditInsideTrainingSessions = "Salli valmentajien muokata kurssi-istuntojen sisällä"; +$AllowCoachsToEditInsideTrainingSessionsComment = "Salli valmentajien muokata kurssi-istuntojen sisällä"; +$ShowSessionDataTitle = "Näytä istuntotietojen otsikko"; +$ShowSessionDataComment = "Näytä istuntotietojen kommentti"; +$SubscribeSessionsToCategory = "Tilausistunnot luokassa"; +$SessionListInPlatform = "Luettelo alustan istunnoista"; +$SessionListInCategory = "Luettelo luokkien sesiones"; +$ToExportSpecialSelect = "Jos haluat viedä kursseja, jotka sisältävät istuntoja, joka varmistaa, että nämä seansido mukana viennissä johonkin, että on valittava luettelosta."; +$ErrorMsgSpecialExport = "Ei ollut kursseja rekisteröitynyt tai ei ehkä tehnyt yhdistyksen kanssa istuntoja"; +$ConfigureInscription = "Rekisteröintisivun asettaminen"; +$MsgErrorSessionCategory = "Valitse luokka ja istunnot"; +$NumberOfSession = "Istuntojen lukumäärä"; +$DeleteSelectedSessionCategory = "Poista vain valitut luokat ilman istuntoja"; +$DeleteSelectedFullSessionCategory = "Poista valitut luokat istuntoihin"; +$EditTopRegister = "Muokkaa huomautusta"; +$InsertTabs = "Lisää välilehtiä"; +$EditTabs = "Muokkaa välilehtiä"; $AnnEmpty = "Ilmoitusten lista on tyhjennetty"; $AnnouncementModified = "Ilmoituksia on muutettu"; $AnnouncementAdded = "Ilmoitus on lisätty"; @@ -1353,13 +1775,61 @@ $Tutor = "Tutor"; $Unreg = "Peruuta"; $GroupUserManagement = "Ryhmän hallinta"; $AddAUser = "Lisää käyttäjä"; +$UsersUnsubscribed = "Valitut käyttäjät on poistettu kurssilta."; +$ThisStudentIsSubscribeThroughASession = "Tämä oppija on ilmoittautunut tähän koulutukseen koulutustilaisuuden kautta. Et voi muokata hänen tietojaan"; $AddToFriends = "Haluatko varmasti lisätä tämän kontaktin ystäviisi?"; +$AddPersonalMessage = "Lisää henkilökohtainen viesti"; $Friends = "Ystävät"; +$PersonalData = "Profiili"; +$Contacts = "Yhteystiedot"; +$SocialInformationComment = "Tällä näytöllä voit järjestää yhteystietosi"; +$AttachContactsToGroup = "Tällä näytöllä voit järjestää yhteystietosi"; +$ContactsList = "Yhteystietoluettelo"; +$AttachToGroup = "Lisää ryhmään"; +$SelectOneContact = "Valitse yksi yhteyshenkilö"; +$SelectOneGroup = "Valitse yksi ryhmä"; +$AttachContactsPersonal = "Lisää henkilökohtaisia yhteystietoja"; +$AttachContactsToGroupSuccesfuly = "Onnistunut yhteystietojen lisääminen ryhmään"; +$AddedContactToList = "Yhteyshenkilö lisätty luetteloon"; +$ContactsGroupsComment = "Tämä näyttö on luettelo yhteystiedoista ryhmien mukaan lajiteltuna."; +$YouDontHaveContactsInThisGroup = "Yhteystietoja ei löytynyt"; +$SelectTheCheckbox = "Valitse valintaruutu"; +$YouDontHaveInvites = "Tyhjä"; +$SocialInvitesComment = "Vireillä olevat kutsut."; +$InvitationSentBy = "Kutsun on lähettänyt"; +$RequestContact = "Yhteydenottopyyntö"; +$SocialUnknow = "Tuntematon"; +$SocialParent = "Vanhempani"; +$SocialFriend = "Ystäväni"; +$SocialGoodFriend = "Oikeat ystäväni"; +$SocialEnemy = "Viholliseni"; +$SocialDeleted = "Yhteystiedot poistettu"; +$MessageOutboxComment = "Lähetetyt viestit."; +$MyPersonalData = "Henkilötietoni"; +$AlterPersonalData = "Henkilötietojen muuttaminen"; +$Invites = "Kutsut"; +$ContactsGroups = "Ryhmän yhteystiedot"; +$MyInbox = "Minun postilaatikkoni"; +$ViewSharedProfile = "Näytä jaettu profiili"; +$ImagesUploaded = "Ladatut kuvat"; +$ExtraInformation = "Lisätietoja"; +$SearchContacts = "Etsi yhteystietoja"; +$SocialSeeContacts = "Katso yhteystiedot"; +$SocialUserInformationAttach = "Kirjoita viesti ennen pyynnön lähettämistä"; +$MessageInvitationNotSent = "kutsuviestiäsi ei ole lähetetty"; $SocialAddToFriends = "Lisää yhteyshenkilöksi"; +$ChangeContactGroup = "Vaihda yhteystietoryhmää"; +$Friend = "Ystävä"; $ViewMySharedProfile = "Jaettu profiilini"; +$UserStatistics = "Tämän käyttäjän raportointi"; +$EditUser = "Muokkaa tätä käyttäjää"; +$ViewUser = "Näytä tämä käyttäjä"; +$RSSFeeds = "RSS-syöte"; $NoFriendsInYourContactList = "Yhteystiedoissasi ei ole ystäviä"; $TryAndFindSomeFriends = "Etsi ystäviä"; +$SendInvitation = "Lähetä kutsu"; $SocialInvitationToFriends = "Kutsu liittymään ystäviisi"; +$MyCertificates = "Minun todistukseni"; $NewGroupCreate = "Muodosta uusia ryhmiä"; $GroupCreation = "Uusien ryhmien muodostaminen"; $NewGroups = "uudet ryhmät"; @@ -1401,6 +1871,7 @@ $QtyOfUserCanSubscribe_PartBeforeNumber = "Käyttäjä voi kuulu maksimissaan"; $QtyOfUserCanSubscribe_PartAfterNumber = " ryhmään"; $GroupLimit = "Rajoitus"; $CreateGroup = "Luo ryhmä(t)"; +$ProceedToCreateGroup = "Jatka ryhmän (ryhmien) luomista"; $StudentRegAllowed = "Opiskelijat voivat itse rekisteröityä ryhmiin"; $GroupAllowStudentUnregistration = "Käyttäjät on sallitu itse poistua ryhmistä"; $AllGroups = "Kaikki ryhmät"; @@ -1416,8 +1887,30 @@ $SameForAll = "sama kaikille"; $NoLimit = "Ei rajoituksia"; $PleaseEnterValidNumber = "Montako ryhmää haluat muodostaa"; $CreateGroupsFromVirtualCourses = "Muodosta ryhmät kaikista kurssilla olijoista"; +$CreateGroupsFromVirtualCoursesInfo = "Tämä kurssi on yhdistelmä oikeasta kurssista ja yhdestä tai useammasta virtuaalikurssista. Jos painat seuraavaa painiketta, uusia ryhmiä luodaan näiden (virtuaalisten) kurssien mukaan. Kaikki oppijat tilataan ryhmiin."; +$NoGroupsAvailable = "Ei saatavilla olevia ryhmiä"; +$GroupsFromVirtualCourses = "Virtuaaliset kurssit"; +$CreateSubgroups = "Luo alaryhmiä"; +$CreateSubgroupsInfo = "Tämän vaihtoehdon avulla voit luoda uusia ryhmiä olemassa olevan ryhmän pohjalta. Anna haluamasi ryhmien määrä ja valitse olemassa oleva ryhmä. Annettu määrä ryhmiä luodaan ja kaikki olemassa olevan ryhmän jäsenet tilataan näihin uusiin ryhmiin. Olemassa oleva ryhmä säilyy ennallaan."; +$CreateNumberOfGroups = "Luo useita ryhmiä"; +$WithUsersFrom = "ryhmät, joissa on jäseniä"; $FillGroup = "Lisää käyttäjiä"; +$EmptyGroup = "peruuttaa kaikkien käyttäjien tilaukset"; +$MaxGroupsPerUserInvalid = "Toimittamasi käyttäjäkohtaisten ryhmien enimmäismäärä on virheellinen. Nyt on käyttäjiä, jotka ovat liittyneet useampaan ryhmään kuin ehdottamasi määrä."; +$GroupOverview = "Ryhmien yleiskatsaus"; +$GroupCategory = "Ryhmän luokka"; +$NoTitleGiven = "Anna otsikko"; +$InvalidMaxNumberOfMembers = "Kirjoita kelvollinen numero jäsenten enimmäismäärää varten."; +$CategoryOrderChanged = "Luokkien järjestystä muutettiin"; +$CategoryCreated = "Luokka luotu"; +$GroupTutors = "Valmentajat"; +$GroupWork = "Tehtävät"; +$GroupCalendar = "Esityslista"; $GroupAnnouncements = "Ilmoitukset"; +$NoCategoriesDefined = "Ei määriteltyjä luokkia"; +$GroupsFromClasses = "Ryhmät luokista"; +$GroupsFromClassesInfo = "Tämän vaihtoehdon avulla voit luoda ryhmiä kurssillesi tilattujen luokkien perusteella."; +$BackToGroupList = "Takaisin ryhmien luetteloon"; $NewForumCreated = "Uusi foorumi luotu"; $NewThreadCreated = "Uusi viestiketju luotu"; $AddHotpotatoes = "Lisää HotPotatoes"; @@ -1512,13 +2005,17 @@ $PrereqTestLimit2 = "pistettä"; $PrereqTestLimitNow = "Nyt sinulla on:"; $LearnpathExitFullScreen = "takaisin normaali näkymään"; $LearnpathFullScreen = "koko näyttö"; +$ItemMissing1 = "Siellä oli"; +$ItemMissing2 = "sivu (vaihe) tässä alkuperäisessä Chamilon oppimispolussa."; $NoItemSelected = "Valitse oppimisobjekti sisällysluettelosta"; $NewDocumentCreated = "Uusi dokumentti luotu"; $EditCurrentChapter = "Muokkaa nykyistä lukua"; $ditCurrentModule = "Muokkaa nykyistä osiota"; +$CreateTheDocument = "Luo uusi asiakirja"; $MoveTheCurrentDocument = "Siirrä nykyinen dokumentti"; $EditTheCurrentDocument = "Muokkaa nykyistä dokumenttia"; $Warning = "Varoitus!"; +$WarningEditingDocument = "Kun muokkaat olemassa olevaa asiakirjaa Kursseissa, asiakirjan uusi versio ei korvaa vanhaa versiota, vaan se tallennetaan uutena asiakirjana. Jos haluat muokata asiakirjaa lopullisesti, voit tehdä sen asiakirjatyökalulla."; $CreateTheExercise = "Luo harjoitus"; $MoveTheCurrentExercise = "Siirrä nykyinen testi"; $EditCurrentExecice = "Muokkaa nykyistä testiä"; @@ -1544,21 +2041,36 @@ $MoveCurrentStudentPublication = "Siirrä nykyinen tehtävä"; $EditCurrentStudentPublication = "Muokkaa nykyistä tehtävää"; $AllowMultipleAttempts = "Salli useita yrityksiä"; $PreventMultipleAttempts = "Estä useat yritykset"; +$MakeScormRecordingExtra = "Tee SCORM-tallenteista ylimääräisiä"; +$MakeScormRecordingNormal = "Tee SCORM-tallenteista normaaleja"; $DocumentHasBeenDeleted = "Dokumenttia ei voida näyttää koska se on poistettu"; $EditCurrentForum = "Muokkaa nykyistä keskustelualuetta"; $NoPrerequisites = "Ei edellytyksiä"; $NewExercise = "Uusi testi"; $CreateANewLink = "Luo uusi linkki"; $CreateANewForum = "Luo uusi keskustelualue"; +$WoogieConversionPowerPoint = "Woogie : Sanan muuntaminen"; +$WelcomeWoogieSubtitle = "MS Word kurssin muunnin"; +$WelcomeWoogieConverter = "Tervetuloa Woogie Rapid Learningiin"; +$WoogieError = "Virhe word-asiakirjan muuntamisen aikana. Tarkista, onko asiakirjan nimessäsi erikoismerkkejä..."; +$WordConvert = "MS Word muuntaminen"; +$InteractionID = "Vuorovaikutuksen tunnus"; +$TimeFinished = "Aika (päättyi...)"; $CorrectAnswers = "Oikeat vastaukset"; $StudentResponse = "Opiskelijan vastaukset"; $LatencyTimeSpent = "Käytetty aika"; +$SplitStepsPerPage = "Sivu, oppimisobjekti"; +$SplitStepsPerChapter = "Osio, oppimiskohde"; $TakeSlideName = "Käytä diojen nimiä kurssin oppimisobjektien niminä"; $CannotConnectToOpenOffice = "Yhteys tiedostomuuntimeen epäonnistui. Ota yhteyttä ympäristön ylläpitäjään."; $OogieConversionFailed = "Muunto epäonnistui. Jotkut tiedostot ovat liian monimutkaisia automaattiseen muunnokseen."; $OogieUnknownError = "Muunto epäonnistui tuntemattomasta syystä."; $OogieBadExtension = "Lataa ainoastaan esityksiä. Tiedoston tulisi olla tyypiltään joko .ppt tai .odp"; +$WoogieBadExtension = "Lataa vain tekstiasiakirjoja. Tiedostonimipäätteen on oltava .doc, .docx tai .odt."; +$ShowAudioRecorder = "Näytä äänitallennin"; +$SearchFeatureSearchExplanation = "Jos haluat tehdä haun kurssitietokannasta, käytä seuraavaa syntaksia: term tag tag:tag_name-exclude +include \"exact phrase\" Esimerkiksi: car tag:truck -ferrari +ford \"high consumption\". Tämä näyttää kaikki tulokset, jotka koskevat sanaa 'car', joka on merkitty tunnisteella 'truck', ei sisällä sanaa 'ferrari', mutta sisältää sanan 'ford' ja täsmällisen lauseen 'high consumption'."; $ViewLearningPath = "Näytä oppimispolku"; +$SearchFeatureDocumentTagsIfIndexing = "Asiakirjaan lisättävät tunnisteet, jos indeksointi on päällä."; $ReturnToLearningPaths = "Palaa kursseihin"; $UploadMp3audio = "Lataa mp3 äänitiedostoja"; $UpdateAllAudioFragments = "Lisää ääntä"; @@ -1582,10 +2094,19 @@ $ModifyPrerequisites = "Tallenna edellytys asetukset"; $CreateLearningPath = "Jatka >"; $AddExercise = "Lisää testi kurssiin"; $LPCreateDocument = "Lisää dokumentti tähän kurssiin"; +$ObjectiveID = "Tavoitteen tunnus"; +$ObjectiveStatus = "Tehtävän tila"; +$ObjectiveRawScore = "Tehtävän raakapisteet"; +$ObjectiveMaxScore = "Tehtävän maksimipistemäärä"; +$ObjectiveMinScore = "Tehtävän minimipistemäärä"; $LPName = "Kurssin nimi"; +$AuthoringOptions = "Kirjoittajan asetukset"; +$SaveSection = "Tallenna osio"; $AddLinkToCourse = "Lisää linkki kurssiin"; $AddAssignmentToCourse = "Lisää tehtävä kurssiin"; $AddForumToCourse = "Lisää keskustelualue kurssiin"; +$SaveAudioAndOrganization = "Tallenna ääni ja organisaatio"; +$UploadOnlyMp3Files = "Lataa vain mp3-tiedostoja"; $TypeMessage = "Kirjoita viestisi!"; $ConfirmReset = "Tahdotko varmasti poistaa kaikki viestit?"; $ClearList = "Tyhjennä lista"; @@ -1668,8 +2189,8 @@ $YourTotalScore = "Yhteispistemääräsi on"; $ReachedMaxAttemptsAdmin = "Olet saavuttanut yritysten maksimin."; $ExerciseAdded = "Harjoitus lisätty"; $EvalSet = "Pisteytys määritykset"; -$Active = "Toimiva"; -$Inactive = "Toimimaton"; +$Active = "Aktiivinen"; +$Inactive = "Epäaktiivinen"; $QuestCreate = "Kysymysten luominen"; $ExRecord = "Harjoituksesi on tallennettu"; $BackModif = "Takaisin harjoituksen muotoiluun"; @@ -1711,6 +2232,8 @@ $NoImg = "Testaa ilman kuvia"; $ImgNote_st = "
Sinun pitää vielä tallentaa"; $ImgNote_en = "kuva(t):"; $NameNotEqual = "ei ole oikea tiedosto !"; +$Indice = "Hakemisto"; +$Indices = "Hakemistot"; $DateExo = "Päiväys"; $ShowQuestion = "Näytä kysymys"; $UnknownExercise = "Tuntematon Harjoitus"; @@ -1720,6 +2243,7 @@ $CreateQuestion = "Luo kysymys"; $CreateAnswers = "Luo vastauksia"; $ModifyExercise = "Muokkaa harjoitusta"; $ModifyAnswers = "Muokkaa vastauksia"; +$ForExercise = "testiä varten"; $UseExistantQuestion = "Käytä valmista kysymystä"; $FreeAnswer = "Avoin kysymys"; $notCorrectedYet = "Tätä kysymystä ei ole vielä korjattu. Toistaiseksi pisteesi siitä ovat 0, joten kokonaispistemäärä ei ole vielä todellinen."; @@ -1747,10 +2271,13 @@ $HotspotValidateError2 = "klikkausta tarvitaan kuvaan) ennen tuloksen näyttämi $HotspotRequired = "Kuvaus ja arviointi tarvitaan jokaiselle interaktiiviselle alueelle. Palaute on vapaaehtoinen."; $HotspotChoose = "Tehdäksesi interaktiivisen alueen: valitse muoto värin vierestä ja piirrä alue. Siirtääksesi aluetta valitse väri klikkaa toista kohta kuvassa ja piirrä alue. Lisätäksesi uuden alueen paina Lisää alue painiketta. Sulkeaksesi monikulmion paina oikeaa nappia ja valitse sulje monikulmio."; $Fault = "Virheellinen"; -$HotSpot = "Interaktiiviset alueet"; +$HotSpot = "Interaktiivinen alue"; +$ClickNumber = "Klikkaa numeroa"; $HotspotGiveAnswers = "Anna vastaus"; +$Addlimits = "Lisää rajoituksia"; $AreYouSure = "Oletko varma"; $StudentScore = "Oppilaan pisteet"; +$backtoTesthome = "Takaisin testin kotisivuille"; $MarkIsUpdated = "Arvosana päivitetty"; $MarkInserted = "Arvosana lisätty"; $PleaseGiveAMark = "Anna arvosana"; @@ -1759,9 +2286,11 @@ $AddComments = "Lisää palaute"; $Number = "Nr."; $Weighting = "Tulos"; $ChooseQuestionType = "Tehdäksesi uuden kysymyksä valitse tyyppi yläpuolelta"; +$MatchesTo = "Vastaa kohdetta"; $CorrectTest = "Tarkista harjoitus"; $ViewTest = "Näytä"; $NotAttempted = "Ei aloittettu"; +$AddElem = "Lisää elementti"; $DelElem = "Poista elementti"; $PlusAnswer = "Lisää vastaus vaihtoehto"; $LessAnswer = "Poista vastaus vaihtoehto"; @@ -1770,27 +2299,127 @@ $Attempted = "Aloitettu"; $AssignMarks = "Määritä arvosana"; $ExerciseStored = "Harjoitus tallennettu"; $ChooseAtLeastOneCheckbox = "Valitse vähintään yksi hyväksyttävä vastaus"; +$ExerciseEdited = "Testin nimi ja asetukset on tallennettu."; $ExerciseDeleted = "Harjoitus poistettu"; +$ClickToCommentAndGiveFeedback = "Klikkaa tätä linkkiä tarkistaaksesi vastauksen ja/tai antaaksesi palautetta."; $OpenQuestionsAttempted = "Käyttäjä on vastannut avoimeen kysymykseen"; +$AttemptDetails = "Yrityksen yksityiskohdat"; $TestAttempted = "Harjoitusta yritetty"; $StudentName = "Oppilaan nimi"; $StudentEmail = "Sähköposti"; +$OpenQuestionsAttemptedAre = "Yritetty avoin kysymys on"; +$UploadJpgPicture = "Lataa kuva (jpg, png tai gif) hotspottien käyttämistä varten."; $HotspotDescription = "Nyt klikkaa: (...)"; $ExamSheetVCC = "Tehtävä tarkistettu"; $AttemptVCC = "Tehtäväsi on tarkistettu/kommentoitu."; +$ClickLinkToViewComment = "Klikkaa alla olevaa linkkiä päästäksesi tilillesi ja nähdäksesi kommentoidun koelomakkeen."; $Regards = "Terveisin"; $AttemptVCCLong = "Vastauksesi tehtävään %s on tarkastettu opettajan toimesta. Klikkaa alla olevaa linkkiä kirjautuaksesi oppimisympäristöön"; $DearStudentEmailIntroduction = "Hyvä Opiskelija,"; +$ResultsEnabled = "Tulokset oppilaiden käytössä"; +$ResultsDisabled = "Tulokset eivät ole oppijoiden käytössä"; +$ExportWithUserFields = "Sisällytä profilointi"; +$ExportWithoutUserFields = "Profiloinnin poissulkeminen"; $DisableResults = "Älä näytä tuloksia oppilaille"; $EnableResults = "Näytä tulokset oppilaille"; $ValidateAnswer = "Tarkista vastaukset"; +$FillInBlankSwitchable = "Salli vastausten järjestysvaihtoehdot"; $ReachedMaxAttempts = "Et voi tehdä harjoitusta %s koska olet saavuttanut rajan %s yritystä."; +$RandomQuestionsToDisplay = "Näytettävien satunnaisten kysymysten määrä"; +$RandomQuestionsHelp = "Satunnaistaaksesi kaikki kysymykset valitse 10. Jos haluat poistaa satunnaistamisen käytöstä, valitse \"Älä satunnaista\"."; +$ExerciseAttempts = "Yritysten enimmäismäärä"; +$DoNotRandomize = "Älä satunnaista"; +$Infinite = "Loputon"; +$BackToExercisesList = "Takaisin Testit-työkaluun"; +$NoStartDate = "Ei alkamispäivää"; +$ExeStartTime = "Aloituspäivä"; +$ExeEndTime = "Lopetuspäivä"; $DeleteAttempt = "Poista yritys"; +$WithoutComment = "Ilman kommentteja"; $QuantityQuestions = "Kysymyksiä"; +$FilterExercices = "Testien suodatus"; +$FilterByNotRevised = "Ainoastaan epäpätevät"; +$FilterByRevised = "Vain pätevät"; +$ReachedTimeLimit = "Aikaraja saavutettu"; $TryAgain = "Yritä uudelleen"; +$SeeTheory = "Teorialinkki"; +$EndActivity = "Toiminnan päättyminen"; +$NoFeedback = "Tentti (ei palautetta)"; +$DirectFeedback = "Mukautuva testi, jossa on välitön palaute"; +$FeedbackType = "Palaute"; +$Scenario = "Skenaario"; +$VisitUrl = "Vieraile tässä linkissä"; +$ExitTest = "Poistu testistä"; +$DurationFormat = "%1 sekuntia"; +$Difficulty = "Vaikeusaste"; +$NewScore = "Uusi pistemäärä"; +$NewComment = "Uusi kommentti"; +$ExerciseNoStartedYet = "Testi ei ole vielä alkanut"; +$ExerciseNoStartedAdmin = "Kouluttaja ei sallinut testin alkamista vielä."; +$SelectTargetLP = "Valitse kohdekurssi"; +$SelectTargetQuestion = "Valitse kohdekysymys"; +$DirectFeedbackCantModifyTypeQuestion = "Testityyppiä ei voi muuttaa, koska se on asetettu itsearviointiin. Itsearviointi antaa sinulle mahdollisuuden antaa suoraa palautetta käyttäjälle, mutta se ei ole yhteensopiva kaikkien kysymystyyppien kanssa, joten tämän tyyppistä tietovisaa ei voi muuttaa jälkikäteen."; +$CantShowResults = "Ei saatavilla"; +$CantViewResults = "Tuloksia ei voi tarkastella"; +$ShowCorrectedOnly = "Yksilöllisen palautteen avulla"; +$ShowUnCorrectedOnly = "Korjaamattomat tulokset"; +$HideResultsToStudents = "Piilota tulokset"; +$ShowResultsToStudents = "Näytä pisteet oppijalle"; +$ProcedToQuestions = "Siirry kysymyksiin"; +$AddQuestionToExercise = "Lisää tämä kysymys testiin"; +$PresentationQuestions = "Näyttö"; +$UniqueAnswer = "Monivalinta"; +$MultipleAnswer = "Useita vastauksia"; +$ReachedOneAttempt = "Et voi osallistua tähän kokeeseen, koska olet jo yrittänyt kerran."; $QuestionsPerPage = "Kysymys per sivu"; +$QuestionsPerPageOne = "Yksi"; +$QuestionsPerPageAll = "Kaikki"; +$EditIndividualComment = "Muokkaa yksittäistä palautetta"; +$ThankYouForPassingTheTest = "Kiitos testin läpäisystä"; +$ExerciseAtTheEndOfTheTest = "Testin lopussa"; +$EnrichQuestion = "Täydentävä kysymys"; +$DefaultUniqueQuestion = "Valitse hyvä perustelu"; +$DefaultUniqueAnswer1 = "A sitten B sitten C"; +$DefaultUniqueComment1 = "Maito on monien maitotuotteiden, kuten voin, juuston ja jogurtin, perusta."; +$DefaultUniqueAnswer2 = "A sitten C sitten B"; +$DefaultUniqueComment2 = "Kaura on yksi kattavimmista viljoista. Energiansa ja ravitsemuksellisten ominaisuuksiensa ansiosta se on ollut ihmisten ruokinnan perusraaka-aine."; +$DefaultMultipleQuestion = "Aliravitsemus on seurausta"; +$DefaultMultipleAnswer1 = "Kalsiumin puute"; +$DefaultMultipleComment1 = "Kalsium toimii ..."; +$DefaultMultipleAnswer2 = "A-vitamiinin puute"; +$DefaultMultipleComment2 = "A-vitamiini on vastuussa..."; +$DefaultFillBlankQuestion = "Kehon painoindeksin laskeminen"; +$DefaultMathingQuestion = "Järjestä operaatiot"; +$DefaultOpenQuestion = "Luettele, mitkä ovat mielestäsi hyvän projektipäällikön 10 tärkeintä ominaisuutta?"; $MoreHotspotsImage = "Lisää/muokkaa interaktiivista aluetta kuvassa"; -$HotspotDelineation = "Hahmotelma"; +$ReachedTimeLimitAdmin = "Aikaraja saavutettu ylläpitäjä"; +$LastScoreTest = "Harjoituksen viimeinen pistemäärä"; +$BackToResultList = "Takaisin tulosluetteloon"; +$EditingScoreCauseProblemsToExercisesInLP = "Jos muokkaat kysymyksen pistemäärää, muista, että tämä harjoitus lisättiin kurssilla"; +$SelectExercise = "Valitse harjoitus"; +$YouHaveToSelectATest = "Sinun on valittava testi"; +$HotspotDelineation = "Interaktiivisen alueen hahmotelma"; +$CreateQuestions = "Luo kysymyksiä"; +$MoreOAR = "Enemmän riskialueita"; +$LessOAR = "Vähemmän riskialueita"; +$LearnerIsInformed = "Tämä viesti sekä tulostaulukko näytetään oppijalle, jos hän epäonnistuu tässä vaiheessa."; +$MinOverlap = "Vähimmäis päällekkäisyys"; +$MaxExcess = "Enimmäis päällekkäisyys"; +$MaxMissing = "Enimmäismäärä puuttuu"; +$IfNoError = "Jos ei virheitä"; +$LearnerHasNoMistake = "Oppija ei tehnyt virhettä"; +$YourDelineation = "Sinun rajauksesi :"; +$ResultIs = "Tuloksesi on :"; +$Overlap = "Päällekkäinen alue"; +$Missing = "Puuttuva alue"; +$Excess = "Liian suuri alue"; +$Min = "Minimi"; +$Requirements = "Vaatimukset"; +$OARHit = "Yhdelle (tai useammalle) riskialueelle on kohdistunut klikkaus."; +$TooManyIterationsPleaseTryUsingMoreStraightforwardPolygons = "Liian monta iteraatiota vastausta laskettaessa. Yritä piirtää rajaus suoraviivaisemmin."; +$Thresholds = "Kynnysarvot"; +$Delineation = "Rajaus"; +$QuestionTypeDoesNotBelongToFeedbackTypeInExercise = "Kysymystyyppi ei kuulu harjoituksen palautetyyppiin."; $Title = "Otsikko"; $By = "Kirjoittaja"; $UsersOnline = "Käyttäjiä kirjautuneena"; @@ -1811,7 +2440,7 @@ $Group = "Ryhmä"; $Edit = "muokkaa"; $GroupForum = "Ryhmien foorumit"; $Language = "Kieli"; -$LoginName = "Kirjaudu"; +$LoginName = "Kirjautumisnimi"; $AutostartMp3 = "Haluatko että ääni soitetaan automaattisesti?"; $Assignments = "Oppilaan tehtävät"; $Forum = "Keskustelut"; @@ -1840,7 +2469,7 @@ $OfficialCode = "Virallinen koodi"; $FirstName = "Etunimi"; $LastName = "Sukunimi"; $Status = "Tila"; -$Email = "Sähköposti"; +$Email = "sähköposti"; $SlideshowConversion = "Esityksen muuntaminen"; $UploadFile = "Lataa tiedosto"; $AvailableFrom = "Saatavilla lähtien"; @@ -1929,7 +2558,25 @@ $AddResource = "Lisää"; $AddedResources = "Liitteet"; $NameOfLang['arabic'] = "Arabia"; $NameOfLang['brazilian'] = "brasilia"; +$NameOfLang['bulgarian'] = "bulgarialainen"; +$NameOfLang['catalan'] = "katalaani"; +$NameOfLang['croatian'] = "Kroatia"; +$NameOfLang['danish'] = "tanska"; +$NameOfLang['dutch'] = "hollanti"; +$NameOfLang['english'] = "englanti"; $NameOfLang['finnish'] = "suomi"; +$NameOfLang['french'] = "ranska"; +$NameOfLang['french_corporate'] = "french_corporate"; +$NameOfLang['french_KM'] = "french_KM"; +$NameOfLang['galician'] = "galicia"; +$NameOfLang['german'] = "saksa"; +$NameOfLang['greek'] = "kreikka"; +$NameOfLang['italian'] = "italia"; +$NameOfLang['japanese'] = "japani"; +$NameOfLang['polish'] = "puola"; +$NameOfLang['portuguese'] = "portugali"; +$NameOfLang['russian'] = "venäjä"; +$NameOfLang['simpl_chinese'] = "simpl_chinese"; $NameOfLang['spanish'] = "espanja"; $Close = "sulje"; $Platform = "Alusta"; @@ -1941,6 +2588,7 @@ $GroupList = "ryhmälista"; $Previous = "edellinen"; $DestDirectoryDoesntExist = "Kohde hakemistoa ei ole olemassa"; $Courses = "kurssit"; +$In = "in"; $ShowAll = "Näytä kaikki"; $Page = "Sivu"; $englishLangName = "englanti"; @@ -1952,6 +2600,15 @@ $WithSelected = "Valittujen kanssa"; $OnLine = "Kirjautuneena"; $Users = "Käyttäjät"; $PlatformAdmin = "Alustan ylläpito"; +$NameOfLang['hungarian'] = "unkari"; +$NameOfLang['indonesian'] = "indonesia"; +$NameOfLang['malay'] = "malaji"; +$NameOfLang['slovenian'] = "slovenia"; +$NameOfLang['spanish_latin'] = "spanish_latin"; +$NameOfLang['swedish'] = "ruotsi"; +$NameOfLang['thai'] = "thai"; +$NameOfLang['turkce'] = "turkki"; +$NameOfLang['vietnamese'] = "vietnami"; $UserInfo = "tietoja käyttäjästä"; $ModifyQuestion = "Muokkaa kysymystä"; $CheckAll = "Valitse kaikki"; @@ -2036,8 +2693,8 @@ $UplNoFileUploaded = "Yhtään tiedostoa ei tallennettu"; $UplSelectFileFirst = "Valitse tiedosto ennenkuin painat tallenna painiketta."; $UplNotAZip = "Valitsemasi tiedosto ei ollut zip-tiedosto."; $UplUploadSucceeded = "Tiedosto päivitetty onnistuneesti"; -$ExportAsCSV = "Tuo CSV-tiedosto"; -$ExportAsXLS = "Tuo xls-tiedosto"; +$ExportAsCSV = "Vie CSV-tiedosto"; +$ExportAsXLS = "Vie xls-tiedosto"; $Openarea = "Yleinen kuvaus"; $Done = "Valmis"; $Documents = "Dokumentit"; @@ -2045,7 +2702,6 @@ $DocumentAdded = "Dokumentti lisätty"; $DocumentUpdated = "Dokumentti päivitetty"; $DocumentInFolderUpdated = "Dokumentti päivitetty kansiossa"; $Course_description = "Kurssin kuvaus"; -$Average = "Keskiarvo"; $Document = "Document"; $Learnpath = "Oppimispolku"; $Link = "Link"; @@ -2069,7 +2725,7 @@ $YouWereCalled = "Sinut on kutsunut keskustelemaan"; $DoYouAccept = "Hyväksytkö sen ?"; $Everybody = "Kaikki"; $SentTo = "Nähtävillä"; -$Export = "Tuo"; +$Export = "Vie"; $Tools = "Työkalut"; $Everyone = "Kaikki"; $SelectGroupsUsers = "Valitse ryhmiä/käyttäjiä"; @@ -2100,6 +2756,7 @@ $DeleteRight = "Poista"; $OverviewCourseRights = "Roolien ja oikeuksien yhteenveto"; $SeeAllRightsAllLocationsForSpecificRole = "Katso roolin oikeudet"; $SeeAllRolesAllLocationsForSpecificRight = "Katso kaikki joilla oikeus"; +$Advanced = "Kirjoittaminen"; $RightValueModified = "Arvoa on muutettu."; $course_rights = "Roolien ja oikeuksien yhteenveto"; $Visio_conference = "Virtuaalitapaaminen"; @@ -2136,6 +2793,7 @@ $ActionNotAllowed = "Toiminto ei ole sallittu"; $SubTitle = "Alaotsikko"; $NoResourcesToRecycle = "Ei resursseja kierrätettäväksi"; $noOpen = "Ei voitu avata"; +$TempsFrequentation = "Toistuvuusaika"; $Progression = "Edistyminen"; $NoCourse = "Kurssia ei löytynyt"; $Teachers = "Kouluttajat"; @@ -2211,9 +2869,7 @@ $AccessToFaq = "Usein kysytyt kysymykset (FAQ)"; $Faq = "Usein kysytyt kysymykset (FAQ)"; $RemindInactivesLearnersSince = "Muistuta oppilaita,jotka ovat viimeksi kirjautuneet"; $RemindInactiveLearnersMailSubject = "Aktiivisuutesi kurssilla %s"; -$RemindInactiveLearnersMailContent = "Hyvä käyttäjä, - -et ole käynyt kurssilla %s %s päivään."; +$RemindInactiveLearnersMailContent = "Hyvä käyttäjä,\r\n\r\net ole käynyt kurssilla %s %s päivään."; $OpenIdAuthentication = "OpenID kirjautuminen"; $UploadMaxSize = "Tallennuksen maksimi koko"; $Unknown = "Tuntematon"; @@ -2226,6 +2882,9 @@ $UplGenericError = "Tiedoston lataus ei onnistunut. Ole hyvä ja kokeile uudelle $MyGradebook = "Arvioinnit"; $Gradebook = "Arvioinnit"; $OpenIDWhatIs = "Mikä on OpenID"; +$OpenIDDescription = "OpenID poistaa tarpeen useisiin eri verkkosivustoihin kirjautumiseen, mikä yksinkertaistaa verkkokokemusta. Voit valita OpenID-palveluntarjoajan, joka vastaa parhaiten tarpeitasi ja ennen kaikkea johon luotat. Samalla OpenID-tunnuksesi voi pysyä mukanasi riippumatta siitä, minkä palveluntarjoajan palveluun siirryt. Ja mikä parasta, OpenID-teknologia ei ole patentoitua ja täysin ilmaista. yrityksille tämä tarkoittaa, että salasanojen ja tilien hallinnointikustannukset ovat alhaisemmat, ja se houkuttelee samalla uutta verkkoliikennettä. OpenID vähentää käyttäjien turhautumista antamalla käyttäjille mahdollisuuden hallita kirjautumistaan. + +Lue lisää..."; $NoManager = "Ei ylläpitäjää"; $ExportiCal = "iCal vienti"; $ExportiCalPublic = "Vie iCal muodossa julkisena tapahtumana"; @@ -2296,6 +2955,7 @@ $UnableToConnectTo = "Ei voi yhdistää"; $NoUser = "Ei käyttäjää"; $SearchResultsFor = "Etsinnän tulokset:"; $SelectFile = "Valitse tiedosto"; +$WarningFaqFileNonWriteable = "Varoitus - Portaalin /home/-hakemistossa sijaitseva FAQ-tiedosto ei ole kirjoitettavissa. Tekstiäsi ei tallenneta, ennen kuin tiedoston käyttöoikeuksia muutetaan."; $AddCategory = "Lisää kategoria"; $NoExercises = "Ei harjoituksia"; $NotAllowedClickBack = "Valitettavasti pääsy tälle sivulle on estetty."; @@ -2307,10 +2967,12 @@ $FckMp3Autostart = "Aloita ääni automaattisesti"; $Learner = "Opiskelija"; $IntroductionTextUpdated = "Johdanto on päivitetty"; $Align = "Tasaus"; -$Width = "Leveys"; +$Width = "Width"; +$VSpace = "Pystysuuntainen tila"; +$HSpace = "Vaakasuuntainen tila"; $Border = "Raja"; $Alt = "Alt"; -$Height = "Korkeus"; +$Height = "Height"; $ImageManager = "Kuvien hallinta"; $ImageFile = "Kuvatiedosto"; $ConstrainProportions = "Kiinteät mittasuhteet"; @@ -2327,6 +2989,7 @@ $Owner = "Omistaja"; $DisplayOrder = "Järjestys"; $SearchFeatureDoIndexDocument = "Indeksoi dokumentin teksti?"; $SearchFeatureDocumentLanguage = "Dokumentin kieli indeksointia varten"; +$With = "kanssa"; $GeneralCoach = "Yleistutor"; $SaveDocument = "Tallenna dokumentti"; $CategoryDeleted = "Kategoria on poistettu"; @@ -2368,6 +3031,7 @@ $SessionNameAndCourseTitle = "Session ja kurssin nimi"; $CreationDate = "Luonti päivä"; $LastUpdateDate = "Viimeisin päivitys"; $ViewHistoryChange = "Näytä muutos historia"; +$NameOfLang['asturian'] = "asturian"; $SearchGoToLearningPath = "Mene kurssille"; $SearchLectureLibrary = "Luento kirjasto"; $SearchImagePreview = "Esikatselu kuva"; @@ -2376,8 +3040,7 @@ $SearchResetKeywords = "Tyhjennä avainsanat"; $SearchKeywords = "Avainsanat"; $IntroductionTextDeleted = "Johdanto on poistettu"; $SearchKeywordsHelpTitle = "Avainsana haun ohjeet"; -$SearchKeywordsHelpComment = "Valitse hakusanat yhdestä tai useammasta kentästä ja klikkaa etsi. -Valitaksesi useamman sanan paina Ctrl+hiiren oikea."; +$SearchKeywordsHelpComment = "Valitse hakusanat yhdestä tai useammasta kentästä ja klikkaa etsi.\r\nValitaksesi useamman sanan paina Ctrl+hiiren oikea."; $Validate = "Vahvista"; $SearchCombineSearchWith = "Yhdistä hakusanat"; $SearchFeatureNotEnabledComment = "Teksti haku ei ole käytössä Chamilossa. Ota yhteyttä ylläpitäjään."; @@ -2388,6 +3051,9 @@ $Notebook = "Muistio"; $FieldRequired = "Pakollinen kenttä"; $BookingSystem = "Varausjärjestelmä"; $Any = "Mikä tahansa"; +$SpecificSearchFields = "Erityiset hakukentät"; +$SpecificSearchFieldsIntro = "Tässä voit määrittää kentät, joita haluat käyttää sisällön indeksointiin. Kun indeksoit yhtä elementtiä, sinun tulisi lisätä yksi tai useampi termi jokaiseen kenttään pilkulla erotettuna."; +$AddSpecificSearchField = "Lisää erityinen hakukenttä"; $SaveSettings = "Tallenna asetukset"; $NoParticipation = "Osanottajia ei ole"; $Subscribers = "Tilaajat"; @@ -2399,6 +3065,8 @@ $Audio = "Ääni"; $GoToQuestion = "Mene kysymykseen"; $Level = "Taso"; $Duration = "Kesto"; +$SearchPrefilterPrefix = "Esisuodattimen erityinen kenttä"; +$SearchPrefilterPrefixComment = "Tämän vaihtoehdon avulla voit valita erityiskentän, jota käytetään esisuodattimen hakutyypissä."; $MaxTimeAllowed = "Maksimi aika (minuuttia)"; $Class = "Luokka"; $Select = "Vahvista"; @@ -2406,6 +3074,7 @@ $Booking = "Varaus"; $ManageReservations = "Varaus"; $DestinationUsers = "Kohde käyttäjät"; $AttachmentFileDeleteSuccess = "Liitetty tiedosto on poistettu"; +$AccountURLInactive = "Tämän URL-osoitteen tili ei ole aktiivinen"; $MaxFileSize = "Maksimi tiedoston koko"; $SendFileError = "Virhe ladattaessa tiedostoa. Tarkista ettei tiedosto ole viallinen ja kokeile uudelleen."; $Expired = "Vanhentunut"; @@ -2413,6 +3082,7 @@ $InvitationHasBeenSent = "Kutsu on lähetetty"; $InvitationHasBeenNotSent = "Kutsua ei lähetetty"; $Outbox = "Lähetetyt"; $Overview = "Yleiskuva"; +$ApiKeys = "API-avaimet"; $GenerateApiKey = "Luo API avain"; $MyApiKey = "Minun API avain"; $DateSend = "lähetyspäivä"; @@ -2463,6 +3133,170 @@ $Until = "Saakka"; $FirstPage = "Ensimmäinen sivu"; $LastPage = "Viimeinen sivu"; $Coachs = "Tutorit"; +$ModifyEvaluation = "Tallenna arviointi"; +$CreateLink = "Lisää tämä oppimistehtävä arviointiin"; +$AddResultNoStudents = "Ei ole oppilaita, joille voisi lisätä tuloksia"; +$ScoreEdit = "Taitojen ranking"; +$ScoreColor = "Osaamiskynnykset väritys"; +$ScoringSystem = "Taitojen ranking"; +$EnableScoreColor = "Ota käyttöön osaamiskynnykset"; +$Below = "Alla"; +$WillColorRed = "Merkki värjätään punaisella"; +$EnableScoringSystem = "Ota käyttöön taitojen ranking"; +$IncludeUpperLimit = "Sisällytä yläraja (esim. 0-20 sisältää 20)."; +$ScoreInfo = "Pistetiedot"; +$Between = "Välissä"; +$CurrentCategory = "Nykyinen kurssi"; +$RootCat = "Pääkansio"; +$NewCategory = "Uusi luokka"; +$NewEvaluation = "Lisää luokkahuonetoiminta"; +$Weight = "Paino"; +$PickACourse = "Valitse kurssi"; +$CourseIndependent = "Kurssista riippumaton"; +$CourseIndependentEvaluation = "Kurssista riippumaton arviointi"; +$EvaluationName = "Arviointi"; +$DateEval = "Arviointipäivä"; +$AddUserToEval = "Lisää käyttäjiä arviointiin"; +$NewSubCategory = "Uusi alakategoria"; +$MakeLink = "Lisää online-toiminta"; +$DeleteSelected = "Poista valittu"; +$SetVisible = "Aseta näkyväksi"; +$SetInvisible = "Aseta näkymättömäksi"; +$ChooseLink = "Valitse arvioitava toimintatyyppi"; +$LMSDropbox = "Dropbox"; +$ChooseExercise = "Valitse testi"; +$AddResult = "Arvioi oppilaat"; +$BackToOverview = "Takaisin kansionäkymään"; +$ExportPDF = "Vie PDF-tiedostoon"; +$ChooseOrientation = "Valitse orientaatio"; +$Portrait = "Pysty"; +$Landscape = "Vaaka"; +$FilterCategory = "Suodata kategoria"; +$ScoringUpdated = "Taitojen ranking päivitetty"; +$CertificateWCertifiesStudentXFinishedCourseYWithGradeZ = "%s todistaa, että\n\n %s \n\non suorittanut hyväksytysti kurssin \n\n '%s' \n\narvosanalla\n\n '%s'"; +$CertificateMinScore = "Sertifioinnin vähimmäispistemäärä"; +$InViMod = "Arvioinnit tehty näkymättömiksi"; +$ViewResult = "Arvioinnin yksityiskohdat"; +$NoResultsInEvaluation = "Arvioinnissa ei toistaiseksi ole tuloksia"; +$AddStudent = "Lisää oppilaita"; +$ImportResult = "Tuo merkinnät"; +$ImportFileLocation = "Tuo tiedosto"; +$FileType = "Tiedostotyyppi"; +$ExampleCSVFile = "Esimerkki CSV-tiedostosta"; +$ExampleXMLFile = "Esimerkki XML-tiedostosta"; +$OverwriteScores = "Pisteiden ylikirjoittaminen"; +$IgnoreErrors = "Jätä virheet huomiotta"; +$ItemsVisible = "Resurssit tulivat näkyviksi"; +$ItemsInVisible = "Resursseista tuli näkymättömiä"; +$NoItemsSelected = "Resurssia ei ole valittu"; +$DeletedCategories = "Poistetut kategoriat"; +$DeletedEvaluations = "Poistetut arvioinnit"; +$DeletedLinks = "Poistetut linkit"; +$TotalItems = "Resurssit yhteensä"; +$EditEvaluation = "Muokkaa arviointia"; +$DeleteResult = "Merkintöjen poistaminen"; +$Display = "Ranking"; +$ViewStatistics = "Graafinen näkymä"; +$ResultAdded = "Tulos lisätty"; +$EvaluationStatistics = "Arviointitilastot"; +$ExportResult = "PDF-raportti"; +$EditResult = "Arvioi opiskelijat"; +$GradebookWelcomeMessage = "Tervetuloa Arviointi-työkaluun. Tämän työkalun avulla voit arvioida organisaatiosi osaamista. Voit luoda osaamisraportteja yhdistämällä eri oppimistehtävien, kuten luokkahuone- ja verkkotehtävien, pisteet. Tämä sopii tyypillisesti yhdistettyyn oppimisympäristöön."; +$CreateAllCat = "Luo kaikki kurssikategoriat"; +$AddAllCat = "Lisätty kaikki kategoriat"; +$StatsStudent = "Tilastot"; +$Results = "Tulokset ja palaute"; +$Certificates = "Todistukset"; +$Certificate = "Todistus"; +$ChooseUser = "Valitse käyttäjät tätä arviointia varten"; +$ResultEdited = "Tulos muokattu"; +$ChooseFormat = "PDF-raportti"; +$OutputFileType = "Tulostustiedoston tyyppi"; +$OverMax = "Arvo ylittää pistemäärän."; +$MoreInfo = "Lisätietoja"; +$ResultsPerUser = "Tulokset käyttäjäkohtaisesti"; +$TotalUser = "Yhteensä käyttäjälle"; +$AverageTotal = "Keskimääräinen kokonaismäärä"; +$Evaluation = "Pisteet"; +$EvaluationAverage = "Arvioinnin keskiarvo"; +$EditAllWeights = "Paino raportissa"; +$GradebookQualificationTotal = "Yhteensä"; +$GradebookEvaluationDeleted = "Arviointi poistettu"; +$GradebookQualifyLog = "Arviointihistoria"; +$GradebookNameLog = "Arvioinnin nimi"; +$GradebookDescriptionLog = "Arvioinnin kuvaus"; +$GradebookVisibilityLog = "Arvioinnin näkyvyys"; +$ResourceType = "Kategoria"; +$GradebookWhoChangedItLog = "Kuka muutti sen"; +$EvaluationEdited = "Arviointia on onnistuneesti muokattu"; +$CategoryEdited = "Kategoria päivitetty"; +$IncorrectData = "Virheelliset tiedot"; +$Resource = "Arviointi"; +$PleaseEnableScoringSystem = "Ota Taidot-luokitus käyttöön"; +$AllResultDeleted = "Kaikki tulokset on poistettu"; +$ImportNoFile = "Tuotavaa tiedostoa ei ole"; +$ProblemUploadingFile = "Tiedoston lähettämisessä oli ongelma. Mitään ei ole vastaanotettu."; +$AllResultsEdited = "Kaikki tulokset on muokattu"; +$UserInfoDoesNotMatch = "Käyttäjätiedot eivät täsmää."; +$ScoreDoesNotMatch = "Pisteet eivät täsmää"; +$FileUploadComplete = "Tiedoston lähetys onnistui"; +$NoResultsAvailable = "Tuloksia ei ole saatavilla"; +$CannotChangeTheMaxNote = "Pistemäärää ei voi muuttaa"; +$GradebookWeightUpdated = "Painotukset päivitetty onnistuneesti"; +$ChooseItem = "Valitse arvioitava toiminta"; +$AverageResultsVsResource = "Keskimääräiset tulokset vs. resurssi"; +$ToViewGraphScoreRuleMustBeEnabled = "Graafin tarkastelemiseksi pistesäännön on oltava käytössä"; +$GradebookPreviousWeight = "Resurssin aiempi paino"; +$AddAssessment = "Lisää tämä luokkahuonetehtävä arviointiin"; +$FolderView = "Arvioinnin kotisivu"; +$GradebookSkillsRanking = "Taitojen ranking"; +$SaveScoringRules = "Tallenna painot raporttiin"; +$AttachCertificate = "Liitä todistus"; +$GradebookSeeListOfStudentsCertificates = "Katso luettelo oppilastodistuksista"; +$CreateCertificate = "Luo todistus"; +$UploadCertificate = "Lataa todistus"; +$CertificateName = "Todistuksen nimi"; +$CertificateOverview = "Todistuksen yleiskatsaus"; +$CreateCertificateWithTags = "Luo todistuksesi kopioimalla ja liittämällä seuraavat tunnisteet. Ne korvataan asiakirjassa opiskelijakohtaisella arvolla:"; +$ViewPresenceSheets = "Näytä läsnäololomakkeet"; +$ViewEvaluations = "Näytä arvioinnit"; +$NewPresenceSheet = "Uusi läsnäololomake"; +$NewPresenceStep1 = "Uusi läsnäololomake: vaihe 1/2 : täytä läsnäololomakkeen tiedot."; +$TitlePresenceSheet = "Toiminnan nimi"; +$PresenceSheetCreatedBy = "Läsnäololomakkeen on luonut"; +$SavePresence = "Tallenna läsnäololomake ja jatka vaiheeseen 2"; +$NewPresenceStep2 = "Uusi läsnäololomake: vaihe 2/2 : tarkista läsnä olevat opiskelijat."; +$NoCertificateAvailable = "Todistusta ei ole saatavilla"; +$SaveCertificate = "Tallenna todistus"; +$CertificateNotRemoved = "Todistusta ei voi poistaa"; +$CertificateRemoved = "Todistus poistettu"; +$NoDefaultCertificate = "Ei oletusarvoa"; +$DefaultCertificate = "Oletustodistus"; +$PreviewCertificate = "Todistuksen esikatselu"; +$IsDefaultCertificate = "Todistus asetettu oletusarvoksi"; +$ImportPresences = "Tuo läsnäolot"; +$AddPresences = "Lisää läsnäoloja"; +$DeletePresences = "Poista läsnäolot"; +$GradebookListOfStudentsCertificates = "Luettelo oppilastodistuksista"; +$NewPresence = "Uusi läsnäolo"; +$EditPresence = "Muokkaa läsnäoloa"; +$SavedEditPresence = "Läsnäolon muokkaus tallennettu"; +$PresenceSheetFormatExplanation = "Sinun tulisi käyttää läsnäololomaketta, jonka voit ladata yläpuolelta. Läsnäololomake sisältää luettelon kaikista kurssin oppijoista. XLS-tiedoston ensimmäinen sarake on oppijan virallinen koodi, jonka jälkeen tulevat sukunimi ja etunimi. Sinun tulee muuttaa vain neljäs sarake ja merkitä siihen 0 = poissa, 1 = läsnä."; +$ValidatePresenceSheet = "Vahvista läsnäololomake"; +$PresenceSheet = "Läsnäololomake"; +$PresenceSheets = "Läsnäololomakkeet"; +$Evaluations = "Arvioinnit"; +$SaveEditPresence = "Tallenna muutokset läsnäololomakkeeseen"; +$Training = "Kurssi"; +$Present = "Läsnäoleva"; +$Numero = "N"; +$PresentAbsent = "0 = poissa, 1 = läsnä"; +$ExampleXLSFile = "Esimerkki Excel-tiedostosta (XLS)"; +$NoResultsInPresenceSheet = "Ei rekisteröityjä läsnäoloja"; +$EditPresences = "Muokkaa läsnäoloja"; +$TotalWeightMustNotBeMoreThan = "Kokonaispaino saa olla enintään"; +$ThereIsNotACertificateAvailableByDefault = "Oletusarvoisesti todistuksia ei ole saatavilla"; +$CertificateMinimunScoreIsRequiredAndMustNotBeMoreThan = "Todistuksen vähimmäispistemäärä vaaditaan, eikä se saa olla yli"; $CourseProgram = "Kurssin kuvaus"; $ThisCourseDescriptionIsEmpty = "Kurssin kuvausta ei ole vielä tehty."; $QuestionPlan = "Kysymyksiä opettajalle"; @@ -2473,6 +3307,7 @@ $InvalidId = "Sisäänkirjautuminen epäonnistui. Jos et ole rekisteröitynyt, n $Pass = "Salasana"; $Advises = "Vinkit"; $CourseDoesntExist = "Varoitus:Tätä kurssia ei enää ole"; +$GetCourseFromOldPortal = "klikkaa tästä saadaksesi tämän kurssin vanhasta portaalistasi"; $SupportForum = "Tukifoorumi(eng)"; $BackToHomePage = "Takaisin etusivulle"; $LostPassword = "Salasana hukassa"; @@ -2480,14 +3315,15 @@ $Valvas = "Viimeinen ilmoitus"; $Helptwo = "Apua"; $EussMenu = "Valikko"; $Opinio = "Mielipide"; +$Intranet = "Intranet"; $Englin = "Englanti"; $InvalidForSelfRegistration = "Kirjautuminen epäonnistui - jos et ole vielä rekisteröitynyt, tee serekisteröintilomakkeella"; $MenuGeneral = "Yleiset"; $MenuUser = "Käyttäjä"; $MenuAdmin = "Ympäristön ylläpitäjä"; $UsersOnLineList = "Tällä hetkellä kirjautuneina"; -$TotalOnLine = "Tällä hetkellä käyttäjiä"; -$Refresh = "Järjestä"; +$TotalOnLine = "Käyttäjiä kirjautuneena yhteensä"; +$Refresh = "Päivitä"; $SystemAnnouncements = "Järjestelmän tiedotus"; $HelpMaj = "Apua"; $NotRegistered = "Rekisteröitymätön"; @@ -2501,6 +3337,10 @@ $Teach = "Mitä hän voi opettaa"; $Productions = "Tuotokset"; $SendChatRequest = "Lähetä keskustelupyyntö hänelle"; $RequestDenied = "Kutsu hylätty."; +$UsageDatacreated = "Käyttäjätiedot luotu"; +$SessionView = "Näytä kurssit koulutusistuntojen mukaan järjestettynä"; +$CourseView = "Näytä täydellinen luettelo kursseista"; +$DropboxFileAdded = "Dropbox-tiedosto lisätty"; $NewMessageInForum = "Uusi viesti keskustelualueella"; $FolderCreated = "Uusi kansio tehty"; $AgendaAdded = "Tapahtuma lisätty"; @@ -2532,6 +3372,9 @@ $DownloadUserList = "Lataa lista"; $UserAddExplanation = "Jokaisen rivin tiedostossa täytyy sisältää vähintään 5 kenttää: Etunimi Sukunimi Käyttäjätunnus Salasana Sähköposti eroteltuna tabulaattorilla tässä järjestyksessä. Käyttäjät saavat sähköpostivahvistuksen, jossa on käyttätunnus ja salasana."; $UserMany = "Tuo käyttäjälista"; $OneByOne = "Lisää käyttäjä manuaalisesti"; +$AddHereSomeCourses = "Muokkaa kurssiluetteloa + +Rastita ne kurssit, joita haluat seurata. Poista rasti niistä kursseista, joita et halua enää seurata. Napsauta sitten listan alareunassa Ok."; $ImportUserList = "Tuo lista käyttäjistä"; $AddAU = "Lisää käyttäjä"; $AddedU = "on lisätty. Sähköposti, jossa on hänen käyttäjänimensä, on lähetety hänelle"; @@ -2545,6 +3388,7 @@ $UserTaken = "Tämä käyttäjänimi on jo käytössä"; $Fields = "Jotkut kentät ovat tyhjiä"; $Again = "Yritä uudestaan!"; $PassTwo = "Kaksi eri salasanaa!"; +$ViewProfile = "Näytä e-portfolioni"; $ModifProfile = "Muokkaa profiiliani"; $IsReg = "Kursseille on rekisteröity"; $NowGoCreateYourCourse = "Nyt voit luoda oman kurssisi"; @@ -2553,7 +3397,7 @@ $MailHasBeenSent = "Sinulle on lähetetty sähköpostilla käyttäjätunnuksesi $PersonalSettings = "Henkilökohtaiset asetuksesi on rekisteröity ja sähköpostissa on lähetetty käyttäjänimesi ja salasanasi, jotta muistaisit ne.

Valitse listasta kurssit, joihin haluat pääsyn."; $Problem = "Jos sinulla on ongelmia, ota yhteyttä."; $Is = "on"; -$Address = "Osoite ympäristöön"; +$Address = "Osoite"; $YourReg = "Rekisteröintisi:"; $UserFree = "Tämä käyttäjänimi on jo käytössä. Mene takaisin ja yritä uudestaan."; $EmptyFields = "Jätit jotkut kentistä tyhjiksi. Mene takaisin ja yritä uudestaan."; @@ -2563,12 +3407,14 @@ $RegStudent = "Valitse kursseja (opiskelija)"; $Confirmation = "Vahvistus"; $Surname = "Etunimi"; $Registration = "Rekisteröinti"; +$YourAccountParam = "Nämä ovat tietosi yhteyden muodostamiseksi"; $LoginRequest = "Vaaditaan kirjautuminen"; $AdminOfCourse = "Kurssin ylläpitäjä"; $SimpleUserOfCourse = "Kurssin opiskelija"; $IsTutor = "Tutor"; $ParamInTheCourse = "Rooli kurssilla"; $HaveNoCourse = "ei kurssia"; +$UserProfileReg = "Käyttäjän e-portfolio on rekisteröity"; $Courses4User = "Käyttäjän kurssit"; $CoursesByUser = "Käyttäjien kurssit"; $SubscribeUserToCourse = "Lisää käyttäjiä kurssille"; @@ -2589,8 +3435,9 @@ $PasswordRequestFrom = "Tämä on salasanan pyyntö sähköpostiosoitteelle"; $CorrespondsToAccount = "Tämä sähköpostiosoite liittyy käyttäjätunnukseen"; $CorrespondsToAccounts = "Tämä sähköpostiosoite liittyy seuraaviin käyttäjätunnuksiin"; $AccountExternalAuthSource = "Chamilo ei voi käsitellä pyyntöä automaattisesti, koska käyttäjätunnukseen liittyy ulkopuolinen autentikointi lähde. Ole hyvä ja ilmoita käyttäjälle."; -$ProgressIntroduction = "Aloita valitsemalla haluamasi kurssi. -Sen jälkeen voit seurata edistymistäsi jokaisella kurssillasi."; +$AccountsExternalAuthSource = "Chamilo ei voi käsitellä pyyntöä automaattisesti, koska ainakin yhdellä tileistä on ulkoinen todennuslähde. Ryhdy asianmukaisiin toimenpiteisiin kaikkien tilien osalta (myös niiden, joilla on alustatodennus) ja ilmoita asiasta käyttäjälle."; +$RequestSentToPlatformAdmin = "Chamilo ei voi käsitellä tämäntyyppisen tilin pyyntöä automaattisesti. Pyyntösi on lähetetty alustan ylläpitäjälle, joka ryhtyy asianmukaisiin toimenpiteisiin ja ilmoittaa sinulle tuloksesta."; +$ProgressIntroduction = "Aloita valitsemalla haluamasi kurssi.\r\nSen jälkeen voit seurata edistymistäsi jokaisella kurssillasi."; $NeverExpires = "Ei vanhene koskaan"; $ActiveAccount = "Tunnus"; $YourAccountHasToBeApproved = "Tunnuksesi täytyy hyväksyä"; @@ -2598,20 +3445,29 @@ $ApprovalForNewAccount = "Uuden tunnuksen hyväksyminen"; $ManageUser = "Hallitse käyttäjää"; $SubscribeUserToCourseAsTeacher = "Rekisteröi kouluttajia"; $PasswordEncryptedForSecurity = "Salasanasi on salattu tietoturvan takaamiseksi. Painamalla linkkiä saat sähköpostiin uuden salasanan."; +$OpenIDCouldNotBeFoundPleaseRegister = "Tätä OpenID-tunnusta ei löydy tietokannastamme. Rekisteröi uusi tili. Jos sinulla on jo tili meillä, muokkaa profiiliasi tilisi sisällä ja lisää tämä OpenID."; $UsernameMaxXCharacters = "Tunnuksen pitää olla korkeintaan %s merkkiä pitkä"; $PictureUploaded = "Kuvasi on ladattu"; +$ProductionUploaded = "Opintosuoritustiedostosi on ladattu"; $UsersRegistered = "Käyttäjät on rekisteröity kurssille"; $UserAlreadyRegisterByOtherCreator = "Käyttäjä on rekisteröity jo toiselle kouluttajalle"; $UserCreatedPlatform = "Käyttäjä luotu sivustolle"; $UserInSession = "Käyttäjä lisätty istuntoon"; $UserNotAdded = "Käyttäjää ei lisätty."; +$NoSessionId = "Istuntoa ei tunnistettu"; $NoUsersRead = "Tarkista XML/CVS tiedoston rakenne."; +$UserImportFileMessage = "Jos XML/CVS-tiedostosta puuttuvat kirjautumistunnukset, etunimi ja sukunimi yhdistyvät ja luovat kirjautumistunnuksen, esimerkiksi Julio Montoya muuttuu jmontoyaksi."; $UserAlreadyRegisteredByOtherCreator = "Käyttäjän on jo rekisteröinyt toinen opettaja."; $NewUserInTheCourse = "Uusi käyttäjä kurssilla"; $MessageNewUserInTheCourse = "Kurssilla on uusi käyttäjä"; $EditExtendProfile = "Muokkaa laajennettua profiilia"; $EditInformation = "Muokkaa profiilia"; +$RegisterUser = "Rekisteröi"; +$IHaveReadAndAgree = "Olen lukenut ja hyväksyn"; +$ByClickingRegisterYouAgreeTermsAndConditions = "Klikkaamalla 'Rekisteröidy' hyväksyt käyttöehdot."; $LostPass = "Unohditko salasanasi?"; +$EnterEmailUserAndWellSendYouPassword = "Kirjoita käyttäjätunnus tai sähköpostiosoite, jolla rekisteröidyit, niin lähetämme salasanasi."; +$NoUserAccountWithThisEmailAddress = "Tällä käyttäjällä ja/tai sähköpostiosoitteella ei ole tiliä."; $InLnk = "Piilotetut työkalut ja linkit"; $DelLk = "Haluatko varmasti poistaa tämän linkin?"; $NameOfTheLink = "Linkin nimi"; @@ -2679,8 +3535,10 @@ $NotifyChanges = "Ilmoita minulle muutoksista"; $NotNotifyChanges = "Älä ilmoita minulle muutoksista"; $CancelNotifyByEmail = "Älä ilmoita minulle sähköpostilla kun tätä sivua on muutettu"; $MostRecentVersionBy = "Viimeisintä versiota muokkasi"; +$RatingMedia = "Sivun keskimääräinen luokitus on"; $NumComments = "Kommentteja tästä sivusta"; $NumCommentsScore = "Kommenttejen määrä tästä sivusta:"; +$AddPagesLocked = "Kouluttaja on tilapäisesti poistanut Lisää-vaihtoehdon käytöstä."; $LinksPages = "Lähteet"; $ShowLinksPages = "Näytä sivut joilta on linkki tähän sivuun"; $MoreWikiOptions = "Lisää Wiki asetuksia"; @@ -2690,10 +3548,17 @@ $EditPage = "Muokkaa"; $AddedBy = "Lisääjä:"; $EditedBy = "Muokkaaja:"; $DeletedBy = "poistaja:"; +$WikiStandardMode = "Wiki-tila"; +$GroupTutorAndMember = "Valmentaja ja ryhmän jäsen"; $GroupStandardMember = "Ryhmän jäsen"; +$AssignmentMode = "Yksilöllinen toimeksiantotila"; $ConfigDefault = "Oletus asetukset"; $UnlockPage = "Suojaamaton"; $LockPage = "Suojaa"; +$NotifyDiscussChanges = "Ilmoitus kommentista"; +$NotNotifyDiscussChanges = "Älä ilmoita kommenteista"; +$AssignmentWork = "Opiskelijan paperi"; +$AssignmentDesc = "Kouluttajan ehdottama tehtävä"; $WikiDiffAddedTex = "Teksti lisätty"; $WikiDiffDeletedTex = "Teksti poistettu"; $WordsDiff = "sana sanalta"; @@ -2703,21 +3568,332 @@ $Export2ZIP = "Vie ZIP-tiedostoon"; $HidePage = "Piilota sivu"; $ShowPage = "Näytä sivu"; $GoAndEditMainPage = "Aloittaaksesi Wiki mene ja muokkaa pääsivua"; +$UnlockDiscuss = "Avaa keskustelun lukitus"; +$LockDiscuss = "Lukitse keskustelu"; +$HideDiscuss = "Piilota keskustelu"; +$ShowDiscuss = "Näytä keskustelu"; +$UnlockRatingDiscuss = "Aktivoi keskusteluarviointi"; +$LockRatingDiscuss = "Keskusteluarvioinnin poistaminen käytöstä"; +$EditAssignmentWarning = "Voit muokata tätä sivua, mutta oppijoiden sivuja ei muuteta."; +$ExportToDocArea = "Vie tämän sivun uusin versio Dokumentteihin"; +$LockByTeacher = "Kouluttaja poistanut käytöstä"; $LinksPagesFrom = "Sivut jotka linkittävät tähän sivuun"; +$DefineAssignmentPage = "Määrittele tämä sivu yksilölliseksi tehtäväksi"; +$AssignmentDescription = "Tehtävän kuvaus"; +$UnlockRatingDiscussExtra = "Nyt kaikki jäsenet voivat arvioida tätä sivua"; +$LockRatingDiscussExtra = "Nyt vain kouluttajat voivat arvioida tätä sivua"; +$HidePageExtra = "Nyt sivu näkyy vain kouluttajalle"; +$ShowPageExtra = "Nyt sivu on kaikkien käyttäjien nähtävissä"; $OnlyEditPagesCourseManager = "Pääsivua voi muokata vain ohjaaja"; +$AssignmentLinktoTeacherPage = "Pääsy kouluttajan sivulle"; +$HideDiscussExtra = "Nyt keskustelu näkyy vain kouluttajille"; +$ShowDiscussExtra = "Nyt keskustelu on kaikkien käyttäjien nähtävissä"; +$LockDiscussExtra = "Nyt vain kouluttajat voivat lisätä kommentteja tähän keskusteluun."; +$UnlockDiscussExtra = "Nyt kaikki jäsenet voivat lisätä kommentteja tähän keskusteluun"; +$AssignmentDescExtra = "Tämä sivu on kouluttajan ehdottama tehtävä."; +$AssignmentWorkExtra = "Tämä sivu on oppijan työ"; +$NoAreSeeingTheLastVersion = "Varoitus et näe sivun uusinta versiota"; +$AssignmentFirstComToStudent = "Muuta tämä sivu kuulumaan ehdotettuun tehtävään"; +$AssignmentLinkstoStudentsPage = "Pääsy oppijoiden kirjoittamiin kirjoituksiin"; +$AllowLaterSends = "Salli viivästetty lähetys"; +$WikiStandBy = "Tämä Wiki on toistaiseksi jäädytetty. Kouluttajan on käynnistettävä se."; +$NotifyDiscussByEmail = "Sähköposti-ilmoitus uusista kommenteista tästä sivusta on sallittu"; +$CancelNotifyDiscussByEmail = "Sähköposti-ilmoitus tämän sivun uusista kommenteista on poistettu käytöstä."; +$EmailWikiChanges = "Ilmoita Wiki-muutoksista"; +$EmailWikipageModified = "Sivu on muutettu"; $EmailWikiPageAdded = "Sivu lisätty"; +$EmailWikipageDedeleted = "Yksi sivu on poistettu Wikistä"; +$EmailWikiPageDiscAdded = "Uusi kommentti sivun keskustelussa"; +$FullNotifyByEmail = "Sähköposti-ilmoitus joka kerta, kun Wikissä tapahtuu muutos."; +$FullCancelNotifyByEmail = "Lopeta sähköposti-ilmoitusten saaminen aina, kun Wikissä tapahtuu muutos."; +$EmailWikiChangesExt_1 = "Tämä ilmoitus on tehty sen vuoksi, että he haluavat seurata Wikissä tapahtuvia muutoksia. Tämä vaihtoehto tarkoittaa, että olet aktivoinut painikkeen"; +$EmailWikiChangesExt_2 = "Jos haluat lopettaa ilmoitusten saamisen Wikissä tapahtuvista muutoksista, valitse välilehdet Viimeisimmät muutokset, Nykyinen sivu, Keskustelu ja paina sitten painiketta"; +$OrphanedPages = "Orvot sivut"; +$WantedPages = "Halutut sivut"; +$MostVisitedPages = "Eniten vieraillut sivut"; +$MostChangedPages = "Eniten muutetut sivut"; +$Changes = "Muutokset"; +$MostActiveUsers = "Aktiivisimmat käyttäjät"; +$Contributions = "panostukset"; +$UserContributions = "Käyttäjien panostukset"; +$WarningDeleteMainPage = "Wikin etusivun poistaminen ei ole suositeltavaa, koska se on tärkein pääsy wikiin. Jos kuitenkin sinun on tehtävä niin, älä unohda luoda kotisivua uudelleen. Siihen asti muut käyttäjät eivät voi lisätä uusia sivuja."; +$ConvertToLastVersion = "Jos haluat asettaa tämän version viimeiseksi, napsauta painiketta"; $CurrentVersion = "Nykyinen versio"; +$LastVersion = "Uusin versio"; +$PageRestored = "Sivu on palautettu. Voit tarkastella sitä klikkaamalla"; +$RestoredFromVersion = "Palautettu versiosta"; +$HWiki = "Apua: wiki"; +$FirstSelectOnepage = "Valitse ensin sivu"; +$DefineTask = "Jos annat kuvauksen, tätä sivua pidetään erityissivuna, jonka avulla voit luoda tehtävän."; +$ThisPageisBeginEditedBy = "Tällä hetkellä tätä sivua muokkaavat seuraavat henkilöt"; +$ThisPageisBeginEditedTryLater = "Yritä myöhemmin uudelleen. Jos sivua parhaillaan muokkaava käyttäjä ei tallenna sitä, tämä sivu on käytettävissäsi noin"; +$EditedByAnotherUser = "Muutoksesi eivät tallennu, koska joku toinen käyttäjä on muokannut ja tallentanut sivun, sillä aikaa kun sinä muokkasit sitä itse."; +$WarningMaxEditingTime = "Sinulla on 20 minuuttia aikaa muokata tätä sivua. Jos et ole tallentanut sivua tämän ajan jälkeen, toinen käyttäjä voi muokata sitä, ja saatat menettää tekemäsi muutokset."; +$TheTaskDoesNotBeginUntil = "Vielä ei ole alkamispäivä"; +$TheDeadlineHasBeenCompleted = "Olet ylittänyt määräajan"; +$HasReachedMaxNumWords = "Olet ylittänyt sallitun sanamäärän"; +$HasReachedMaxiNumVersions = "Olet ylittänyt sallittujen versioiden määrän"; +$DescriptionOfTheTask = "Tehtävän kuvaus"; +$OtherSettings = "Muut vaatimukset"; +$NMaxWords = "Sanojen enimmäismäärä"; +$NMaxVersion = "Versioiden enimmäismäärä"; +$AddFeedback = "Lisää sivulla tapahtuvaan edistymiseen liittyviä ohjausviestejä."; +$Feedback1 = "Ensimmäinen viesti"; +$Feedback2 = "Toinen viesti"; +$Feedback3 = "Kolmas viesti"; +$FProgress = "Edistyminen"; +$PutATimeLimit = "Aseta aikaraja"; +$StandardTask = "Standarditehtävä"; $ToolName = "Käytön seuranta"; $TrackingDisabled = "Seuranta on kytketty pois päältä ylläpitäjän toimesta."; +$InactivesStudents = "Oppijat, jotka eivät ole olleet yhteydessä vähintään viikkoon"; +$AverageTimeSpentOnThePlatform = "Portaalissa käytetty aika"; +$AverageCoursePerStudent = "Niiden kurssien keskimääräinen määrä, joille oppijani ovat ilmoittautuneet."; +$AverageProgressInLearnpath = "Edistyminen kursseilla"; +$AverageResultsToTheExercices = "Testien pisteet"; +$SeeStudentList = "Katso oppijoiden luettelo"; +$NbActiveSessions = "Aktiiviset istunnot"; +$NbPastSessions = "Aiemmat istunnot"; +$NbFutureSessions = "Tulevat istunnot"; +$NbStudentPerSession = "Oppijoiden määrä istunnoittain"; +$NbCoursesPerSession = "Kurssien määrä istuntoa kohden"; +$SeeSessionList = "Katso istuntojen luettelo"; $CourseStats = "Kurssin tilastot"; $ToolsAccess = "Työkalujen käyttö"; $LinksAccess = "Linkit"; +$DocumentsAccess = "Dokumentit"; +$ScormAccess = "Kurssit"; +$LinksDetails = "Vieraillut linkit"; +$WorksDetails = "tehtävät ladattu"; +$LoginsDetails = "Klikkaa kuukauden nimeä saadaksesi lisätietoja"; +$DocumentsDetails = "Ladatut dokumentit"; +$ExercicesDetails = "Testien pisteet"; +$BackToList = "Takaisin käyttäjäluetteloon"; +$StatsOfCourse = "Kurssin raportointitiedot"; +$StatsOfUser = "Käyttäjän tilastot"; +$StatsOfCampus = "Portaalin tilastot"; +$CountUsers = "Käyttäjien määrä"; +$CountToolAccess = "Yhteyksien määrä tälle kurssille"; +$LoginsTitleMonthColumn = "Kuukausi"; +$LoginsTitleCountColumn = "Kirjautumisten määrä"; +$ToolTitleToolnameColumn = "Työkalun nimi"; +$ToolTitleUsersColumn = "Käyttäjien klikkaukset"; +$ToolTitleCountColumn = "Klikkauksia yhteensä"; +$LinksTitleLinkColumn = "Linkki"; +$LinksTitleUsersColumn = "Käyttäjien klikkaukset"; +$LinksTitleCountColumn = "Klikkauksia yhteensä"; $ExercicesTitleExerciceColumn = "Harjoitus"; +$ExercicesTitleScoreColumn = "Pisteet"; +$DocumentsTitleDocumentColumn = "Dokumentti"; +$DocumentsTitleUsersColumn = "Käyttäjien lataukset"; +$DocumentsTitleCountColumn = "Latauksia yhteensä"; +$ScormContentColumn = "Otsikko"; +$ScormStudentColumn = "Oppijat"; +$ScormTitleColumn = "Vaihe"; +$ScormStatusColumn = "Tila"; +$ScormScoreColumn = "Pisteet"; +$ScormTimeColumn = "Aika"; +$ScormNeverOpened = "Käyttäjä ei koskaan avannut kurssia."; +$WorkTitle = "Otsikko"; +$WorkAuthors = "Kirjoittajat"; +$WorkDescription = "Kuvaus"; +$informationsAbout = "Seuranta"; +$NoEmail = "Sähköpostiosoitetta ei ole määritetty"; $NoResult = "Tulosta ei vielä ole"; +$Hits = "Osumia"; +$LittleHour = "h."; +$Last31days = "Viimeisten 31 päivän aikana"; +$Last7days = "Viimeisten 7 päivän aikana"; +$ThisDay = "Tämä päivä"; +$Logins = "Kirjautumiset"; +$LoginsExplaination = "Tässä on luettelo viimeisimmistä kirjautumisistasi ja työkaluista, joissa vierailit näiden istuntojen aikana."; +$ExercicesResults = "Tehtyjen testien pistemäärä"; +$At = "@"; +$LoginTitleDateColumn = "Päivämäärä"; +$LoginTitleCountColumn = "Vierailut"; +$LoginsAndAccessTools = "Kirjautumiset ja työkalujen käyttöoikeus"; +$WorkUploads = "Panostusten lataaminen"; +$ErrorUserNotInGroup = "Virheellinen käyttäjä : tätä käyttäjää ei ole ryhmässäsi."; +$ListStudents = "Luettelo tämän ryhmän oppijoista"; +$PeriodHour = "Tunti"; +$PeriodDay = "Päivä"; +$PeriodWeek = "Viikko"; +$PeriodMonth = "Kuukausi"; +$PeriodYear = "Vuosi"; +$NextDay = "Seuraava päivä"; +$PreviousDay = "Edellinen päivä"; +$NextWeek = "Seuraava viikko"; +$PreviousWeek = "Edellinen viikko"; +$NextMonth = "Seuraava kuukausi"; +$PreviousMonth = "Edellinen kuukausi"; +$NextYear = "Seuraava vuosi"; +$PreviousYear = "Edellinen vuosi"; +$ViewToolList = "Näytä luettelo kaikista työkaluista"; +$ToolList = "Luettelo kaikista työkaluista"; +$PeriodToDisplay = "Jakso"; +$DetailView = "Näytä perustuen"; +$BredCrumpGroups = "Ryhmät"; +$BredCrumpGroupSpace = "Ryhmän alue"; +$BredCrumpUsers = "Käyttäjät"; +$AdminToolName = "Ylläpitäjän tilastot"; +$PlatformStats = "Portaalin tilastot"; +$StatsDatabase = "Tilastotietokanta"; +$PlatformAccess = "Pääsy portaaliin"; +$PlatformCoursesAccess = "Pääsy kursseille"; +$PlatformToolAccess = "Pääsy työkaluihin"; +$HardAndSoftUsed = "Maat Palveluntarjoajat Selaimet Käyttöj.viittaukset"; +$StrangeCases = "Ongelmalliset tapaukset"; +$StatsDatabaseLink = "Klikkaa tähän"; +$CountCours = "Kurssit"; +$CountCourseByFaculte = "Kurssien määrä kategorioittain"; +$CountCourseByLanguage = "Kurssien määrä kielittäin"; +$CountCourseByVisibility = "Kurssien määrä näkyvyyden mukaan"; +$CountUsersByCourse = "Käyttäjien määrä kursseittain"; +$CountUsersByFaculte = "Käyttäjien määrä kategorioittain"; +$CountUsersByStatus = "Käyttäjien määrä tilan mukaan"; +$Access = "Pääsy"; +$Countries = "Maat"; +$Providers = "Palveluntarjoajat"; +$OS = "Käyttöjär."; +$Browsers = "Selaimet"; +$Referers = "Viittaajat"; +$AccessExplain = "(Kun käyttäjä avaa portaalin indeksin)"; +$TotalPlatformAccess = "Yhteensä"; +$TotalPlatformLogin = "Yhteensä"; +$MultipleLogins = "Tilit, joilla on sama kirjautumistunnus"; +$MultipleUsernameAndPassword = "Tilit, joilla on sama käyttäjätunnus JA sama salasana"; +$MultipleEmails = "Tilit, joilla on sama sähköpostiosoite"; +$CourseWithoutProf = "Kurssit ilman opettajia"; +$CourseWithoutAccess = "Käyttämättömät kurssit"; +$LoginWithoutAccess = "Käyttämättömät kirjautumistunnukset"; +$AllRight = "Tässä ei ole kyse mistään oudosta tapauksesta"; +$Defcon = "Hups, ongelmallisia tapauksia havaittu !!!"; +$NULLValue = "Tyhjä (tai NULL)"; +$TrafficDetails = "Liikenteen tiedot"; +$SeeIndividualTracking = "Yksilöllisen seurannan löydät Käyttäjät-työkalusta."; +$PathNeverOpenedByAnybody = "Kukaan ei koskaan avannut tätä polkua."; +$SynthesisView = "Synteesinäkymä"; +$Visited = "Vierailtu"; +$FirstAccess = "Ensimmäinen sisäänpääsy"; +$LastAccess = "Viimeisin sisäänpääsy"; +$Probationers = "Oppija"; +$MoyenneTest = "Testien pisteet"; +$MoyCourse = "Kurssin keskiarvo"; +$MoyenneExamen = "Tentin keskiarvo"; +$MoySession = "Istunnon keskiarvo"; +$TakenSessions = "Otetut istunnot"; +$FollowUp = "Seuranta"; +$Trainers = "Opettajat"; +$Administrators = "Hallinnoijat"; +$Tracks = "Jäljet"; +$Success = "Menestys"; +$ExcelFormat = "Excel-muoto"; $MyLearnpath = "Oppimispolkuni"; +$LastConnexion = "Viimeisin kirjautuminen"; +$ConnectionTime = "Yhteyden kesto"; +$ConnectionsToThisCourse = "Yhteydet tähän kurssiin"; +$StudentTutors = "Oppijoiden valmentajat"; +$StudentSessions = "Oppijan istunnot"; +$StudentCourses = "Oppijan kurssit"; +$NoLearnpath = "Ei oppimispolkua"; $Correction = "Korjaus"; $NoExercise = "Ei harjoituksia"; +$LimitDate = "Rajapäivä"; +$SentDate = "Lähetetty päivämäärä"; +$Annotate = "Ilmoita"; +$DayOfDelay = "Viivästyspäivä"; +$NoProduction = "Ei tuotantoa"; +$NoComment = "Ei kommenttia"; +$LatestLogin = "Viimeisin kirjautuminen"; +$TimeSpentOnThePlatform = "Portaalissa vietetty aika"; +$AveragePostsInForum = "Viestit foorumissa"; +$AverageAssignments = "Keskimääräiset tehtävät oppijaa kohti"; +$StudentDetails = "Oppijan tiedot"; +$StudentDetailsInCourse = "Oppijan tiedot kurssilla"; +$OtherTools = "OTI (Online Training Interaction) -asetusten raportti"; +$DetailsStudentInCourse = "Oppijan tiedot kurssilla"; $CourseTitle = "Kurssin nimi"; +$NbStudents = "Oppijat"; +$TimeSpentInTheCourse = "Kurssilla vietetty aika"; +$AvgStudentsProgress = "Edistyminen"; +$AvgCourseScore = "Keskimääräinen pistemäärä oppimispoluilla"; +$AvgMessages = "Viestit oppijaa kohti"; +$AvgAssignments = "Tehtävät"; +$ToolsMostUsed = "Eniten käytetyt työkalut"; +$StudentsTracking = "Raportti oppijoista"; +$CourseTracking = "Kurssiraportti"; +$LinksMostClicked = "Eniten vieraillut linkit"; +$DocumentsMostDownloaded = "Eniten ladatut asiakirjat"; +$LearningPathDetails = "Oppimispolun tiedot"; +$NoConnexion = "Ei yhteyttä"; +$TeacherInterface = "Kouluttajan näkymä"; +$CoachInterface = "Valmentajan käyttöliittymä"; +$AdminInterface = "Ylläpitäjän näkymä"; +$NumberOfSessions = "Istuntojen lukumäärä"; +$YourCourseList = "Kurssisi"; +$YourStatistics = "Tilastosi"; +$CoachList = "Kouluttajien luettelo"; +$CoachStudents = "Kouluttajan oppijat"; +$NoLearningPath = "Oppimispolkua ei ole saatavilla"; +$SessionCourses = "Kurssin istunnot"; +$NoUsersInCourseTracking = "Seuranta tälle kurssille rekisteröityneille oppijoille"; +$AvgTimeSpentInTheCourse = "Aika"; +$RemindInactiveUser = "Muistuta epäaktiivista käyttäjää"; +$FirstLogin = "Ensimmäinen yhteys"; +$AccessDetails = "Pääsytiedot"; +$DateAndTimeOfAccess = "Sisäänpääsyn päivämäärä ja kellonaika"; +$WrongDatasForTimeSpentOnThePlatform = "Tätä käyttäjää koskevat tiedot rekisteröitiin, kun alustalla vietetyn ajan laskeminen ei ollut mahdollista."; +$DisplayCoaches = "Kouluttajien yleiskatsaus"; +$DisplayUserOverview = "Käyttäjän yleiskatsaus"; +$ExportUserOverviewOptions = "Käyttäjän yleiskatsauksen vientivaihtoehdot"; +$FollowingFieldsWillAlsoBeExported = "Myös seuraavat kentät viedään"; +$TotalExercisesScoreObtained = "Kokeiden kokonaispisteet"; +$TotalExercisesScorePossible = "Kokeiden suurin mahdollinen kokonaispistemäärä"; +$TotalExercisesAnswered = "Vastattujen testien määrä"; +$TotalExercisesScorePercentage = "Kokeiden kokonaispistemäärä prosentteina"; +$ForumForumsNumber = "Foorumien määrä"; +$ForumThreadsNumber = "Lankojen lukumäärä"; +$ForumPostsNumber = "Postausten lukumäärä"; +$ChatConnectionsDuringLastXDays = "Yhteydet chattiin viimeisten %s päivän aikana"; +$ChatLastConnection = "Viimeisin chat-yhteys"; +$CourseInformation = "Kurssin tiedot"; +$NoAdditionalFieldsWillBeExported = "Muita kenttiä ei viedä"; +$SendNotification = "Ilmoita"; +$TimeOfActiveByTraining = "Kurssilla olo aika"; +$AvgAllUsersInAllCourses = "Kaikkien kurssien kaikkien oppijoiden keskiarvo"; +$AvgExercisesScore = "Testien pisteet"; +$TrainingTime = "Aika"; +$CourseProgress = "Edistyminen"; +$ViewMinus = "Näytä miinukset"; +$ResourcesTracking = "Resurssiraportti"; +$MdCallingTool = "Dokumentit"; +$NotInDB = "ei ole tällaista Linkki-kategoriaa"; +$ManifestSyntax = "(syntaksivirhe manifestitiedostossa...)"; +$EmptyManifest = "(tyhjä manifestitiedosto...)"; +$NoManifest = "(ei manifestitiedostoa...)"; +$NotFolder = "eivät ole mahdollisia, se ei ole kansio..."; +$UploadHtt = "Lataa HTT-tiedosto"; +$HttFileNotFound = "Uutta HTT-tiedostoa ei voitu avata (esim. tyhjä, liian suuri)."; +$HttOk = "Uusi HTT-tiedosto on ladattu"; +$HttNotOk = "HTT-tiedoston lataus epäonnistui"; +$RemoveHtt = "Poista HTT-tiedosto"; +$HttRmvOk = "HTT-tiedosto on poistettu"; +$HttRmvNotOk = "HTT-tiedoston poistaminen epäonnistui"; +$AllRemovedFor = "Kaikki merkinnät poistettu kategoriasta"; +$Index = "Hakusanat"; +$MainMD = "Avaa pää-MDE"; +$Lines = "viivat"; +$Play = "Toista index.php"; +$NonePossible = "MD-toiminnot eivät ole mahdollisia"; +$OrElse = "Valitse Linkit-kategoria"; +$WorkWith = "Työskentely SCORM-hakemiston kanssa"; +$SDI = "... SCORM-hakemisto SD-tunnuksella (ja jaettu manifesti - tai jätä tyhjäksi)."; +$Root = "juuri"; +$SplitData = "Jaetut luettelot ja #MDe, jos sellaisia on:"; +$MffNotOk = "Manifest-tiedoston korvaaminen epäonnistui"; +$MffOk = "Manifest-tiedosto on korvattu"; +$MffFileNotFound = "Uutta manifestitiedostoa ei voitu avata (esim. tyhjä, liian suuri)."; +$UploadMff = "Korvaa manifestitiedosto"; $GroupSpaceLink = "Ryhmän alue"; $CreationSucces = "Sisällysluettelo onnistuneesti luotu"; $CanViewOrganisation = "Voit tarkastella organisaatiotasi"; @@ -2873,32 +4049,6 @@ $CreateFolder = "Luo kansio"; $HelpDefaultDirDocuments = "TÄMÄ NÄKYY VAIN OPETTAJILLE: Tämä kansio sisältää oletustiedostot. Voit poistaa tiedostoja tai lisätä uusia, mutta jos tiedosto on piilotettu ja se lisätään dokumenttiin se ei näy dokumentissa oppijoille. Jos lisäät tiedoston dokumenttiin muuta se ensin näkyväksi. Kansio voi olla piilotettu."; $HelpSharedFolder = "Tämä kansio sisältää tiedostoja joita muut oppijat (tai sinä) lähettää kurssille editorila. Oletuksena ne näkyvät kaikille oppijoille, mutta ne voidaan myös piilottaa toisilta. Jos teet yhden oppijan kansion näkyväksi toiset oppijat näkevät sen kaiken sisällön."; $TemplateImage = "Sivupohjan kuvake"; -$MailingFileRecipDup = "pli ol unu studento trovis XX"; -$MailingFileRecipNotFound = "neniu studento trovis XX"; -$MailingFileNoRecip = "ne adresito-id en la nomo"; -$MailingFileNoPostfix = "nomo ne finiĝas per"; -$MailingFileNoPrefix = "nomo ne komenciĝas per"; -$MailingFileFunny = "Neniu nomo, aŭ sufikso ne konsistanta el 1-4 literoj kaj ciferoj"; -$MailingZipDups = "Mesaĝa zip-dosiero enhavas duoblaĵojn - transsendo maleblas"; -$MailingZipPhp = "Mesaĝa zip-dosiero enhavas php-doiserojn - transsendo maleblas"; -$MailingZipEmptyOrCorrupt = "Mesaĝa zip-dosiero estas malplena aŭ difekta"; -$MailingWrongZipfile = "Sendotaĵo estu zip-dosiero kun STUDENTID aŭ LOGINNAME en la nomo"; -$MailingConfirmSend = "Ĉu sendi dokumentojn al iliaj individuaj adresitoj?"; -$MailingSend = "Sendi dokumentojn"; -$MailingNotYetSent = "Sendotaĵoj estas ankoraŭ ne senditaj..."; -$MailingInSelect = "--sähköpostilla--"; -$MailingAsUsername = "Sähköpostilla"; -$Sender = "lähettäjä"; -$FileSize = "tiedostokoko"; -$OverwriteFile = "Korvaa aiemmin lähetetty tiedosto?"; -$SendTo = "Vastaanottaja"; -$ErrorCreatingDir = "Tiedostorakennetta ei voitu luoda. Ota yhteyttä ylläpitoon."; -$NoFileSpecified = "Et valinnut tiedostoa tallennettavaksi."; -$NoUserSelected = "Valitse käyttäjä, jolle haluat tiedoston lähettää."; -$BadFormData = "Lähetys epäonnistui: datavirhe. Ota yhteyttä ylläpitäjään."; -$GeneralError = "VIrhe on tapahtunut. Ota yhteyttä ylläpitäjään."; -$ThereAreNoRegisteredDatetimeYet = "Päivää/aikaa ei ole vielä rekisteröity"; -$CalendarList = "Kalenteri lista tapaamisista"; $ReceivedFiles = "Vastaanotetut Tiedostot"; $SentFiles = "Lähetetyt Tiedostot"; $ReceivedTitle = "Nimi"; @@ -2933,6 +4083,7 @@ $AuthorFieldCannotBeEmpty = "Tekijä kenttä ei voi olla tyhjä"; $YouMustSelectAtLeastOneDestinee = "Valitse vähintään yksi vastaanottaja"; $DropboxFileTooBig = "Tiedosto on liian suuri."; $TheFileIsNotUploaded = "Tiedostoa ei ladattu."; +$MailingNonMailingError = "Postitusta ei voi korvata ei-postituksella ja päinvastoin."; $MailingSelectNoOther = "Sähköpostitukseen ei voi yhdistää useampia vastaanottajia"; $MailingJustUploadSelectNoOther = "Ainoastaan lataamista ei voi yhdistää muihin vastaanottajiin"; $NewDropboxFileUploaded = "Uusi tiedosto on lähetetty tiedostoihin"; @@ -2941,6 +4092,32 @@ $AddEdit = "Lisää / Muokkaa"; $ErrorNoFilesInFolder = "Tämä kansio on tyhjä"; $SentCatgoryDeleted = "Kansio poistettu"; $ReceivedCatgoryDeleted = "Kansio poistettu"; +$MdTitle = "Oppimiskohteen Otsikko"; +$MdDescription = "Jos haluat tallentaa nämä tiedot, paina Store"; +$MdCoverage = "esim. Bachelor of ..."; +$MdCopyright = "esim. edellyttäen, että lähde mainitaan."; +$NoScript = "Selaimessasi ei ole otettu skriptejä käyttöön, älä välitä tämän tekstin alla olevasta ruudun osasta, se ei toimi..."; +$LanguageTip = "kieli, jolla tämä oppimiskohde on tehty"; +$Identifier = "Tunniste"; +$IdentifierTip = "tämän oppimiskohteen yksilöllinen tunniste, joka koostuu kirjaimista, numeroista, _-.()'!*."; +$TitleTip = "nimike tai nimi ja nimikkeen tai nimen kieli"; +$DescriptionTip = "kuvaus tai kommentti sekä oppimiskohteen kuvailussa käytetty kieli."; +$Keyword = "Avainsanat"; +$KeywordTip = "pilkulla erotettu (kirjaimet, numerot, -.)"; +$Coverage = "Kattavuus"; +$CoverageTip = "esimerkiksi xxx:n kandidaatti: yyy"; +$KwNote = "Jos muutat kuvauksen kieltä, älä lisää avainsanoja samaan aikaan."; +$Location = "URL/URI"; +$LocationTip = "klikkaa avataksesi objektin"; +$Store = "Taltioi"; +$DeleteAll = "Poista kaikki"; +$ConfirmDelete = "Haluatko *todellakin* poistaa kaikki metatiedot?"; +$WorkOn = "on"; +$Continue = "Jatka"; +$Create = "Luo"; +$RemainingFor = "Kategoriasta on poistettu vanhentuneet merkinnät"; +$WarningDups = "- päällekkäiset kategorianimet on poistettu luettelosta!"; +$SLC = "Työskentele Linkit-kategorian kanssa nimeltä"; $TermAddNew = "Lisää uusi termi"; $TermName = "Termin nimi"; $TermDefinition = "Termin määritelmä"; @@ -2956,13 +4133,29 @@ $TermAdded = "Termi lisättty"; $YouMustEnterATermName = "Termille täytyy antaa nimi"; $YouMustEnterATermDefinition = "Termille täytyy antaa kuvaus"; $TableView = "Taulukko näkymä"; +$GlossaryTermAlreadyExistsYouShouldEditIt = "Tämä sanastotermi on jo olemassa. Vaihda termin nimi."; +$GlossaryManagement = "Sanaston hallinta"; +$TermMoved = "Termi on siirtynyt"; $HFor = "Apua - foorumit"; $ForContent = "

Foorumi on työkalu keskustelua varten, kirjoitettua ja ajasta riippumatonta. Sähköposti on kahden henkilön välistä keskustelua, sitä vastoin foorumi mahdollistaa julkisen tai puolijulkisen keskustelun.

Teknisestä näkökulmasta katsoen oppilaat tarvitsevat vain selaimen osallistuakseen Clarolinen foorumeihin.

Voit organisoida foorumin, klikkaa ylläpito-työkalua. Keskustelut on organisoitu sarjaksi seuraavalla tavalla:

Kategoria > Foorumi > Aihe > Vastaukset

Sinun kannatta järjestää oppilaiden keskusteluja etukäteen luomalla kategoriat ja foorumit. Jätä oppilaiden osaksi luoda aiheet ja vastaukset.

Oletuksena Claroline-foorumi sisältää vain kategorian 'julkinen', esimerkkifoorumin ja esimerkkiaiheen

Sinun täytyy ensiksi poistaa esimerkkiaihe ja muokata ensimmäisen foorumin nimeä. Sitten voit luoda 'julkiseen' kategoriaan muita foorumeita, ryhmittäin tai teemoittain. Tämä riippuu omista näkemyksistäsi opetuksen suhteen.

Älä sekoita kategorioita ja foorumeita. Tyhjä kategoria ilman foorumeita ei näy opiskelijoille.

Kuvaus foorumista voi olla lista sen jäsenistä, määritys tavoitteista kurssilla, tehtävä, teema ja niin edelleen.

"; +$HDropbox = "Dropbox-apu"; +$DropboxContent = "Dropbox-työkalu on sisällönhallintatyökalu, joka helpottaa peer-to-peer -tiedonvaihtoa. Se hyväksyy minkä tahansa tiedostotyypin (Word, Excel, PDF jne.). Se korvaa olemassa olevat samannimiset tiedostot vain, jos niin pyydetään."; $HHome = "Apua - Kotisivu"; $HomeContent = "

Mukavuuden vuoksi Claroline-työkalut eivät ilmesty tyhjinä. Jokaisen työkalun mukana pieni esimerkki, joka auttaa sinut nopeasti alkuun. Voit joko poistaa esiemrkin tai muokata sitä.

Esimerkiksi kurssin sivuston kotisivulla on lyhyt johdanto, jossa kerrotaan miten tekstiä voidaan muokata. Klikkaa muokkausta, muokkaa tekstiä ja vahvista teksti, niin yksinkertaista se on. Kaikissa työkaluissa on sama logiikka: lisää, poista, muokkaa. Näin dynaamiset sivustot toimivat.

Kun luot kurssin sivuston, useimmat työkaluista ovat toiminnassa. Jos haluat poistaa toimintoja sivustolta, niin klikkaa 'toimimaton'. Silloin toiminto näkyy sivuston harmaassa osassa. Toiminto ei näy opiskelijoille, mutta voit saada toiminnon takaisin milloin tahansa.

Voit lisätä omia sivuja kotisivulle. Näiden sivujen tulee olla HTML-muotoisia. Voit luoda tällaisia sivuja millä tahansa tekstinkäsittely-ohjelmalla tai selainten sivunteko-ohjelmilla. Käytä 'lisää sivu ja linkki kotisivulle'-toimintoa lisätäksesi sivun palvelimelle. Uuden dokumentin otsikoksi tulee sama kuin sivuston, voit keskittyä sivun sisältöön. Jos haluat linkittää minkä tahansa sivun missä tahansa käytä 'lisää linkki kotisivulle'-toimintoa. Voit poistaa sivuja, työkaluja voit tehdä vain toimimattomaksi.

Kun kurssin sivusto on valmis, käytä 'Muokkaa kurssin tietoja'-toimintaa ja päätä minkä tasoista luottamuksellisuutta haluat. Oletuksena kurssi on piilossa (koska työskentelet siinä).

"; +$HOnline = "Chamilo LIVE Ohje"; $HClar = "Apua - Claroline"; $HDoc = "Apua - Dokumentit"; $HUser = "Apua - Käyttäjä"; +$HExercise = "Testit Ohje"; +$HPath = "Oppimispolku Apua"; +$HDescription = "Kuvaus Ohje"; +$HLinks = "Linkit Ohje"; +$HMycourses = "Omat kurssit Ohje"; +$HAgenda = "Asialista Ohje"; +$HAnnouncements = "Ilmoitukset Apua"; +$HChat = "Chat Ohje"; +$HWork = "Tehtävät Ohje"; +$HTracking = "Raportit Ohje"; $PublishSurvey = "Julkaise kysely"; $CompareQuestions = "Vertaa kysymyksiä"; $InformationUpdated = "Tiedot päivitetty"; @@ -3135,7 +4328,9 @@ $Secondary = "Toissijainen"; $PleaseChooseACondition = "Valitse ehto"; $ChooseDifferentCategories = "Valitse toinen kategoria"; $Normal = "Normaali"; +$NoLogOfDuration = "Ei lokitietoja kestosta"; $AutoInviteLink = "Käyttäjät jotka on kutsuttu voivat käyttää tätä linkkiä vastatakseen kyselyyn:"; +$CompleteTheSurveysQuestions = "Täytä kyselyn kysymykset"; $SurveysDeleted = "Kyselyt poistettu"; $RemindUnanswered = "Muistuta vain käyttäjiä jotka eivät vastanneet"; $ModifySurvey = "Muokkaa kyselyä"; @@ -3146,11 +4341,26 @@ $UpdateInformation = "Päivitä tiedot"; $PleaseFillSurvey = "Ole hyvä ja täytä kysely"; $ReportingOverview = "Raportin yhteenveto"; $GeneralDescription = "Yleinen kuvaus"; +$GeneralDescriptionQuestions = "Mikä on kurssin tavoite? Onko kurssilla ennakkoehtoja? Miten tämä koulutus liittyy muihin kursseihin?"; +$GeneralDescriptionInformation = "Kuvaile kurssi (tuntimäärä, järjestysnumero, paikka) ja opettaja (nimi, toimisto, puhelin, sähköpostiosoite, aukioloajat ... ...)."; $Objectives = "Tavoitteet"; +$ObjectivesInformation = "Mitkä ovat kurssin tavoitteet (osaaminen, taidot, tulokset)?"; +$ObjectivesQuestions = "Millaisia lopputulosten pitäisi olla, kun oppija on suorittanut kurssin? Mitkä ovat kurssin aikana suoritettavat toiminnot?"; $Topics = "Aiheet"; +$TopicsInformation = "Luettelo koulutukseen sisältyvistä aiheista. Kunkin aiheen merkitys. Vaikeustaso. Eri osien rakenne ja keskinäinen riippuvuus."; +$TopicsQuestions = "Miten kurssi etenee? Mihin oppijan on kiinnitettävä erityistä huomiota? Onko eri osa-alueiden ymmärtämisessä havaittavissa ongelmia? Kuinka paljon aikaa kurssin eri osa-alueisiin tulisi käyttää?"; $Methodology = "Menetelmä"; +$MethodologyQuestions = "Mitkä menetelmät ja toimet auttavat saavuttamaan kurssin tavoitteet? Millainen olisi aikataulu?"; +$MethodologyInformation = "Toiminnan esittely (konferenssi, esitelmät, ryhmätutkimukset, laboratoriot jne.)."; $CourseMaterial = "Kurssimateriaali"; +$CourseMaterialQuestions = "Onko olemassa kurssikirja, artikkelikokoelma, kirjallisuusluettelo, luettelo Internetissä olevista linkeistä?"; +$CourseMaterialInformation = "Lyhyt kuvaus kurssimateriaalista."; +$HumanAndTechnicalResources = "Resurssit"; +$HumanAndTechnicalResourcesQuestions = "Harkitse käytettävissä olevia ohjaajia, valmentajia, teknistä tukipalvelua, kurssinjohtajia ja/tai materiaaleja."; +$HumanAndTechnicalResourcesInformation = "Tunnistetaan ja kuvataan eri yhteyshenkilöt ja käytettävissä olevat tekniset laitteet."; $Assessment = "Arviointi"; +$AssessmentQuestions = "Miten oppijat arvioidaan? Onko aiheen hallitsemiseksi kehitettäviä strategioita?"; +$AssessmentInformation = "Taitojen hankkimisen kriteerit."; $Height = "Height"; $ResizingComment = "resize the image to the following dimensions (in pixels)"; $Width = "Width"; @@ -3322,10 +4532,250 @@ $DirDelete = "Poista hakemisto"; $ValidateChanges = "Tallenna muutokset"; $FolderUpdated = "Kansio päivitetty"; $EndsAt = "Päättyy (täysin suljettu)"; +$QualificationOfAssignment = "Tehtävän pisteytys"; +$MakeQualifiable = "Lisää arvostelukirjaan"; +$QualificationNumberOver = "Pisteet"; +$WeightInTheGradebook = "Painotus arvioinnissa"; +$DatesAvailables = "Päivämäärärajat"; +$ExpiresAt = "Lähettämisen määräaika"; +$DirectoryCreated = "Hakemisto luotu"; +$Assignment = "Tehtävät"; +$ExpiryDateToSendWorkIs = "Tehtävien määräaika"; +$EnableExpiryDate = "Mahdollista tehtävien palautus määräajan jälkeen (oppijoiden nähtävissä)."; +$EnableEndDate = "Ota käyttöön lopullinen hyväksymispäivä (oppijoille näkymätön)."; +$ImpossibleToSaveTheDocument = "Asiakirjan tallentaminen mahdotonta"; +$EndDateCannotBeBeforeTheExpireDate = "Päättymispäivä ei voi olla ennen voimassaolopäivän loppua"; +$SelectAFilter = "Valitse suodatin"; +$FilterByNotExpired = "Suodata: ei vanhentuneet"; +$FilterAssignments = "Suodattimien määritykset"; +$WeightNecessary = "Odotetut vähimmäispisteet"; +$QualificationOver = "Pisteet"; +$ExpiryDateAlreadyPassed = "Viimeinen voimassaolopäivä on jo mennyt"; +$EndDateAlreadyPassed = "Päättymispäivä on jo mennyt umpeen"; +$MoveXTo = "Siirrä %s osoitteeseen"; +$QualificationMustNotBeMoreThanQualificationOver = "Pisteytys ei voi ylittää enimmäispistemäärää"; +$ModifyDirectory = "Validoi"; +$DeleteAllFiles = "Poista kaikki paperit"; +$BackToWorksList = "Takaisin Tehtävät-luetteloon"; +$EditMedia = "Muokkaa ja merkitse paperi"; +$AllFilesInvisible = "Kaikki paperit ovat nyt näkymättömiä"; +$FileInvisible = "Tiedosto on nyt näkymätön"; +$AllFilesVisible = "Kaikki paperit ovat nyt näkyvissä"; +$FileVisible = "Tiedosto on nyt näkyvissä"; $ButtonCreateAssignment = "Luo testi"; $AssignmentName = "Testin nimi"; $CreateAssignment = "Luo testi"; +$FolderEdited = "Kansiota muokattu"; +$UpdateWork = "Päivitä tämä tehtävä"; +$MakeAllPapersInvisible = "Tee kaikista papereista näkymättömiä"; +$MakeAllPapersVisible = "Kaikki paperit näkyviin"; +$AdminFirstName = "Järjestelmänvalvojan etunimi"; +$InstituteURL = "Tämän yrityksen URL-osoite"; +$UserDB = "Käyttäjän Tietokanta"; +$PleaseWait = "Jatka"; +$PleaseCheckTheseValues = "Tarkista nämä arvot"; +$PleasGoBackToStep1 = "Palaa vaiheeseen 1"; $UserContent = "

Roolit

Rooleilla ei ole mitään tekemistä tietokoneiden kanssa. Ne eivät anna oikeuksia järjestelmän suhteen. Ne tarkoittavat vain ihmisiä, kuka kukin on. Voit muokata niitä klikkamalla 'Muokkaa' 'roolin' alla. Voit kirjoittaa mitä tahansa rooliksi: opettaja, assistentti, vierailija, asiantuntija ja niin edelleen.


Ylläpito-oikeudet

Toisaalta ylläpito-oikeudet liittyy tekniseen oikeuteen muokata sisältöä ja järjestää kurssin sivustoa. Tällä hetkellä vaihtoehtoja on vain kaksi, kaikki tai ei mitään oikeuksia.

Jos haluat antaa apulaiselle oikeuden ylläpitää sivustoa, sinun täytyy rekisteröidä hänet(tai hänen pitää itse rekisteröityä), sitten klikkaat 'Muokkaa' 'Ylläpito-oikeudet' alla, sitten klikkaat 'kaikki',ja sitten vielä 'ok'.


Muut opettajat

Jos haluat mainita muita opettajia kurssille, käytä työkalua 'Muokkaa kurssin tietoja' (oranssit työkalut). Tämä muutos ei tee muista opettajista kurssin oppilaita, kenttä 'Opettajat' on täysin erillään käyttäjien listasta.


Lisää käyttäjä

Jos haluat lisätä oppilaita kurssillesi, niin tarkista että ovatko he rekisteröityneet. Jos oppilas on jo rekisteröitynyt, niin tarkista laatikko hänen nimensä vieressä ja klikkaa 'Ok'. Jos hän ei ole rekisteröitynyt, niin lisää hänet käsin. Kummassakin tapauksessa, henkilö saa sähköpostiviestin, jossa kerrotaan, että olet rekisteröinyt hänet. Lisäksi hän saa tai hänelle muistutetaan tunnuksesta ja salasanasta.

"; +$GroupContent = "Johdanto + +Tämän työkalun avulla voit luoda ja hallita työryhmiä. Ensimmäisen luomisen yhteydessä (Luo ryhmiä) ryhmät ovat \"tyhjiä\". On monia tapoja täyttää ne: +
+ * automaattisesti ('Täytä ryhmät (satunnainen)'),
+ * manuaalisesti ('Muokkaa'),
+ * käyttäjien itserekisteröityminen (Ryhmien asetukset: 'Oma rekisteröinti sallittu...'). +
+
+Nämä kolme tapaa voidaan yhdistää. Voit esimerkiksi pyytää käyttäjiä ensin rekisteröitymään itse. Jos sitten huomaat, että jotkut heistä eivät ole rekisteröityneet, päätä täyttää ryhmät automaattisesti (satunnaisesti) niiden täydentämiseksi. Voit myös muokata kutakin ryhmää määrittääksesi jäsenyyden käyttäjäkohtaisesti, itserekisteröinnin jälkeen tai ennen ja/tai automaattisesti rekisteröinnin yhteydessä. +
+
+Ryhmien täyttäminen, joko automaattisesti tai manuaalisesti, on mahdollista vain kurssille rekisteröityneille käyttäjille. Käyttäjäluettelo näkyy Käyttäjät-työkalussa. +
---- +
+Luo ryhmiä +
+Voit luoda uusia ryhmiä napsauttamalla Luo uusi ryhmä(t) ja päättämällä luotavien ryhmien lukumäärän. +
---- +
+Ryhmäasetukset +
+Voit määrittää ryhmän asetukset maailmanlaajuisesti (kaikille ryhmille). Käyttäjät voivat rekisteröityä itse ryhmiin: +
+Luot tyhjiä ryhmiä, käyttäjät rekisteröityvät itse.Jos olet määrittänyt enimmäismäärän, täydet ryhmät eivät ota uusia jäseniä. Tämä menetelmä on kätevä kouluttajille, jotka eivät tunne käyttäjäluetteloa ryhmiä luotaessa. +
+Työkalut: +Jokaiselle ryhmälle on määritetty joko foorumi (yksityinen tai julkinen) tai Dokumentit-alue (jaettu tiedostonhallinta) tai (useimmissa tapauksissa) molemmat. +
---- +
+Manuaalinen editointi +
+Kun ryhmät on luotu (Luo ryhmiä), näet sivun alareunassa luettelon ryhmistä sekä useita vaihtoehtoja: +
+
+Muokkaa - muokkaa manuaalisesti ryhmän nimeä, kuvausta, ohjaajaa, jäsenluetteloa. +Poista - Poista ryhmä."; +$ExerciseContent = "Testityökalun avulla voit luoda testejä, jotka sisältävät niin monta kysymystä kuin haluat. +Voit valita useista kysymysmuodoista, jotka näkyvät selvästi sivun yläosassa, kun luot testin, mukaan lukien (esimerkiksi): +• Monivalintakysymykset (yksi tai useampi vastaus) +• Vastaaminen +• Täytä tyhjät kohdat jne. +Testi voi sisältää minkä tahansa määrän ja yhdistelmän kysymyksiä ja kysymysmuotoja. +Testin luominen +Voit luoda testin napsauttamalla \"Uusi testi\" -linkkiä. +Kirjoita testille nimi ja valinnainen kuvaus. +Voit lisätä erilaisia elementtejä, kuten ääni- tai videotiedostoja esimerkiksi kuullun ymmärtämistä varten, mutta huolehdi siitä, että tiedostot ovat mahdollisimman pieniä latausajan optimoimiseksi (käytä esimerkiksi mp3- eikä wav-tiedostoja - ne ovat paljon pienempiä mutta täysin hyvälaatuisia). +Voit myös valita kahden esitystavan välillä: +• Kysymykset yhdellä sivulla +• Yksi kysymys per sivu (peräkkäin) +ja valita, että kysymykset järjestetään satunnaisesti, kun testi suoritetaan. +Tallenna lopuksi testi. Pääset kysymysten hallintaan. +Kysymyksen lisääminen +Voit nyt lisätä kysymyksen juuri luotuun testiin. Voit halutessasi lisätä kuvauksen ja/tai kuvan. Voit luoda edellä mainitut testityypit seuraavien ohjeiden mukaisesti: +Monivalinta
+Luodaksesi MAQ / MCQ : +• Määrittele kysymyksesi vastaukset. Voit lisätä tai poistaa vastauksen napsauttamalla oikeanpuoleista painiketta +• Tarkista oikean vastauksen (oikeiden vastausten) vasemmanpuoleinen ruutu.
+• Lisää valinnainen kommentti. Käyttäjä ei näe tätä kommenttia ennen kuin hän on vastannut kysymykseen
+• Anna painotus jokaiselle vastaukselle. Painotus voi olla mikä tahansa positiivinen tai negatiivinen kokonaisluku (tai nolla). +• Tallenna vastaukset +• Täytä tyhjät kohdat +• Tämän avulla voit luoda pätkän. Tarkoituksena on kehottaa käyttäjää etsimään sanoja, jotka olet poistanut tekstistä.
+• Jos haluat poistaa sanan tekstistä ja siten luoda tyhjän kohdan, laita sen ympärille sulkeet [näin].
+• Kun teksti on kirjoitettu ja tyhjät kohdat määritetty, voit lisätä kommentin, jonka oppija näkee sen mukaan, miten hän vastaa kysymykseen. +• Tallenna teksti, niin pääset seuraavaan vaiheeseen, jossa voit määrittää painotuksen kullekin tyhjälle kohdalle. Jos kysymys on esimerkiksi 10 pisteen arvoinen ja sinulla on 5 tyhjää kohtaa, voit antaa kullekin tyhjälle kohdalle 2 pisteen painoarvon. +• Matching +• Tämä vastaustyyppi voidaan valita, kun halutaan luoda kysymys, jossa käyttäjän on yhdistettävä luettelon A elementit luettelon B elementteihin. +• Sitä voidaan käyttää myös pyytämään käyttäjää järjestämään elementit tiettyyn järjestykseen. +• Määrittele ensin vaihtoehdot, joista käyttäjä voi valita parhaan vastauksen. Määrittele sitten kysymykset, jotka on yhdistettävä johonkin aiemmin määritellyistä vaihtoehdoista. Yhdistä lopuksi ensimmäisen luettelon elementit toisen luettelon elementteihin pudotusvalikon avulla. +• Huomautus: Useat ensimmäisen yksikön elementit saattavat viitata samaan elementtiin toisessa yksikössä. +• Määritä painotus jokaiselle oikealle vastaavuudelle ja tallenna vastaus. +• Testin muuttaminen +• Testiä muokattaessa periaate on sama kuin testiä luotaessa. Napsauta muutettavan testin vieressä olevaa kuvaa ja noudata yllä olevia ohjeita. +• Testin poistaminen +• Voit poistaa testin klikkaamalla testin vieressä olevaa kuvaa. +• Testin ottaminen käyttöön +• Jotta testiä voidaan käyttää, se on otettava käyttöön klikkaamalla testin nimen vieressä olevaa kuvaa. +• Testin suorittaminen +• Voit kokeilla testiäsi napsauttamalla sen nimeä testiluettelossa. +• Satunnaisia kysymyksiä +• Aina kun luot tai muokkaat testiä, voit päättää, haluatko, että kysymykset arvotaan satunnaisessa järjestyksessä kaikkien testikysymysten joukosta. +• Jos otat tämän vaihtoehdon käyttöön, kysymykset arvotaan eri järjestyksessä joka kerta, kun käyttäjä suorittaa testin. +• Jos sinulla on suuri määrä kysymyksiä, voit valita, että käytettävissä olevista kysymyksistä arvotaan satunnaisesti vain x-määrä kysymyksiä. +• Kysymykset allas +• Kun poistat testin, sen kysymyksiä ei poisteta tietokannasta, joten ne voidaan kierrättää takaisin toiseen testiin kysymyspoolista. +• Kysymyspooli mahdollistaa myös saman kysymyksen uudelleenkäytön useissa testeissä. +• Oletusarvoisesti kaikki kurssia koskevat kysymykset on piilotettu. Voit näyttää testiin liittyvät kysymykset valitsemalla 'suodattaa' avattavasta valikosta. +• Orvokysymykset ovat kysymyksiä, jotka eivät kuulu mihinkään testiin. +HotPotatoes Testit +Voit tuoda HotPotatoes-testejä Chamilo-portaaliin käytettäväksi Testit-työkalussa. Näiden testien tulokset tallennetaan samalla tavalla kuin Chamilo-testien tulokset, joten niitä voidaan helposti seurata raportointityökalun avulla. Yksinkertaisissa testeissä suosittelemme html- tai htm-muodossa; jos testi sisältää kuvia, zip-tiedoston lataaminen on kätevin tapa. +Huomautus: Voit myös sisällyttää HotPotatoes-testit oppimispolun vaiheeksi. +Tuontitapa +•
  • • Valitse tiedosto tietokoneeltasi näytön oikeassa reunassa olevalla Selaa-painikkeella \ton.
  • +• \t\t\t\t\t\t
  • \t\t\tKäynnistä lataus Upload napilla .\t\t
  • \t\t
  • \t\t\t\t +• \t\t\t\t\t\t\t
  • \t\t\tVoit avata testin klikkaamalla sen nimeä.\t\t
  • \t\t\t\t\t +• \t +Hyödyllinen linkki
    +• Hot Potatoesin kotisivu : http://web.uvic.ca/hrd/halfbaked/"; +$PathContent = "Kurssityökalu tukee kahta lähestymistapaa: +Luo uusi kurssi (jolloin voit laatia omaa sisältöäsi). +Tuo SCORM-kurssi +Mikä on oppimispolku? + +Oppimispolku mahdollistaa oppimiskokemusten tai -tehtävien esittämisen erillisiin osiin järjestettynä (tässä mielessä oppimispolku erottaa kurssin pelkistä satunnaisista asiakirjoista). Se voi olla sisältöpohjainen (joka toimii sisällysluettelona) tai toimintapohjainen, jolloin se toimii asialistana tai toimintaohjelmana, joka on tarpeen tietyn tiedon tai taidon ymmärtämiseksi ja soveltamiseksi. + +Sen lisäksi, että oppimispolku on jäsennelty, se voi olla myös peräkkäinen, mikä tarkoittaa, että tiettyjen vaiheiden suorittaminen on ennakkoedellytys muiden vaiheiden suorittamiselle (esim. \"et voi siirtyä oppimiskohteeseen 2 ennen oppimiskohdetta 1\"). Järjestys voi olla viitteellinen (jolloin vaiheet näytetään yksinkertaisesti peräkkäin) tai määräävä (jolloin oppijoiden on noudatettava vaiheita tietyssä järjestyksessä). + +Miten luon oman oppimispolun (kurssin)? + +Siirry 'Oppimispolku'-osioon. Siellä voit luoda niin monta kurssia/polkua kuin haluat klikkaamalla Luo uusi kurssi -työkalua. Sinun on valittava kurssille/polulle nimi (esim. Yksikkö 1, jos aiot luoda useita yksiköitä kokonaiskurssin sisällä). Aluksi kurssi on tyhjä ja odottaa, että voit lisätä siihen osioita ja oppimiskohteita. +Jos asetat kurssin näkyviin, se näkyy uutena työkaluna kurssin etusivulla. Näin se on helpompi ja selkeämpi opiskelijoille. + +Mitä oppimisobjekteja voin lisätä? + +Voit lisätä kaikki Chamilo-työkalut, aktiviteetit ja sisällön, jotka pidät hyödyllisinä ja merkityksellisinä kurssillesi: + +Erilliset asiakirjat (tekstit, kuvat, Office-dokumentit, ...). +Foorumit kokonaisuutena +Aiheet +Linkit +Chamilo Testit +HotPotatoes Testit +(Huomaa: testit, jotka on tehty näkymättömiksi etusivulla, mutta jotka sisältyvät polkuun, tulevat näkyviin oppijoille vasta, kun he työskentelevät kurssin aikana). +Tehtävät +Ulkoiset linkit + + +Muut ominaisuudet + +Oppijoita voidaan pyytää seuraamaan kurssia tietyssä järjestyksessä, koska voit asettaa ennakkoedellytyksiä. Tämä tarkoittaa esimerkiksi sitä, että oppijat eivät voi siirtyä esimerkiksi tehtävään 2, ennen kuin he ovat lukeneet esimerkiksi asiakirjan 1. Kaikilla oppimiskohteilla on tila: suoritettu tai keskeneräinen, joten oppijoiden edistyminen näkyy selkeästi. + +Jos muutat oppimiskohteen alkuperäistä nimeä, uusi nimi näkyy kurssilla, mutta alkuperäistä nimeä ei poisteta. Jos siis haluat, että test8.doc näkyy polussa nimellä 'Loppukoe', sinun ei tarvitse nimetä tiedostoa uudelleen, vaan voit käyttää polussa uutta nimeä. On myös hyödyllistä antaa uudet otsikot liian pitkille linkeille. + +Kun olet valmis, älä unohda tarkistaa näyttötilaa, (näyttää, kuten oppijanäkymässä, sisällysluettelon vasemmalla ja oppimiskohteet oikealla, yksi kerrallaan). +Mikä on SCORM-kurssi ja miten tuon sellaisen? + +Oppimispolku-työkalun avulla voit ladata SCORM-yhteensopivia kursseja. + +SCORM (Sharable Content Object Reference Model) on julkinen standardi, jota noudattavat suuret verkko-oppimisyritykset, kuten NETg, Macromedia, Microsoft, Skillsoft jne. Ne toimivat kolmella tasolla: + +Taloudellisuus : SCORM tekee kokonaisista kursseista tai pienistä sisältöyksiköistä uudelleenkäytettäviä eri oppimisen hallintajärjestelmissä (LMS) erottamalla sisällön ja kontekstin toisistaan, +Pedagogiikka : SCORM sisältää ennakkoedellytyksen tai jaksottamisen (esim. \"Et voi siirtyä lukuun 2 ennen kuin olet läpäissyt koe 1\"), +Teknologia : SCORM luo sisällysluettelon sisällön ja LMS:n ulkopuolella sijaitsevana abstraktiokerroksena. Se auttaa molempia kommunikoimaan keskenään. Pääasiassa kommunikoidaan kirjanmerkkien (\"Missä John on kurssilla?\"), pisteytyksen (\"Miten John läpäisi kokeen?\") ja ajan (\"Kuinka paljon aikaa John käytti lukuun 1?\") kanssa. +Miten voin luoda SCORM-yhteensopivan oppimispolun? + +Ilmeisin tapa on käyttää Chamilo Authoring -työkalua. Saatat kuitenkin mieluummin luoda täydelliset SCORM-yhteensopivat sivustot paikallisesti omalla tietokoneellasi ennen kuin lataat ne Chamilo-alustalle. Tässä tapauksessa suosittelemme käyttämään kehittynyttä työkalua, kuten Lectora®, eXe Learning® tai Reload®."; +$DescriptionContent = "Kurssin kuvaus -työkalu kehottaa sinua kuvaamaan kurssisi kattavasti ja järjestelmällisesti. Tätä kuvausta voidaan käyttää antamaan oppijoille yleiskuva siitä, mitä heitä odottaa, ja siitä voi olla apua, kun tarkastelet ja arvioit kurssia. + +Kohdat tarjoavat vain ehdotuksia. Jos haluat kirjoittaa oman kurssikuvauksen, luo vain omat otsikkosi ja kuvauksesi valitsemalla \"Muu\"-työkalu. Muussa tapauksessa voit täydentää kurssin kuvauksen napsauttamalla kutakin kuvaa, täyttämällä sen tekstillä/sisällölläsi ja lähettämällä sen."; +$LinksContent = "Linkit-työkalun avulla voit luoda kirjaston, jossa on resursseja oppilaille, erityisesti sellaisia resursseja, joita et ole itse luonut. + +Luettelon kasvaessa voi olla hyödyllistä järjestää se luokkiin, jotta oppilaat löytävät oikeat tiedot oikeasta paikasta. Voit muokata jokaista linkkiä ja määrittää sen uudelleen uuteen luokkaan (luokka on luotava ensin). + +Kuvaus-kenttää voidaan käyttää antamaan ennakkotietoja kohdesivuista, mutta myös kuvaamaan, mitä odotat opiskelijan tekevän linkin avulla. Jos esimerkiksi osoitat Aristoteleesta kertovalle verkkosivulle, kuvauskentässä voidaan pyytää oppilasta tutkimaan synteesin ja analyysin välistä eroa."; +$MycoursesContent = "Kun kirjaudut järjestelmään, pääset omalle pääsivullesi. Täällä näet seuraavat asiat: +- Omat kurssit sivun keskiosassa luetellaan kurssit, joille olet ilmoittautunut, ja voit luoda uusia kursseja (käyttämällä oikeassa valikossa olevaa painiketta)Otsikon osassa Oma profiili antaa sinulle mahdollisuuden vaihtaa salasanasi, ladata kuvasi järjestelmään tai vaihtaa käyttäjätunnuksesi, Oma kalenteri : sisältää tapahtumat niillä kursseilla, joille olet ilmoittautunut, oikeassa valikossa: Muokkaa kurssiluetteloani voit ilmoittautua kursseille oppijana, (edellyttäen, että kouluttaja/opettaja on valtuuttanut sisäänpääsyn. täällä voit myös peruuttaa kurssin, Linkit Tukifoorumi ja dokumentaatio viittaavat Chamilon pääsivustolle, jossa voit esittää kysymyksiä tai löytää ajantasaista tietoa Chamilosta. Pääset kurssille (näytön vasemmassa reunassa) klikkaamalla sen otsikkoa. Profiilisi voi vaihdella kurssikohtaisesti. Voi olla, että olet opettajana yhdellä kurssilla ja oppijana toisella kurssilla. Niillä kursseilla, joista olet vastuussa, sinulla on pääsy muokkaustyökaluihin, jotka on suunniteltu opiskelijoiden kirjoittamiseen ja hallintaan, kun taas kursseilla, joilla opit, sinulla on pääsy rajoitetumpaan valikoimaan kurssin suorittamiseen sopivia työkaluja. +Oman pääsivun muoto voi vaihdella alustasta toiseen järjestelmänvalvojan sallimien vaihtoehtojen mukaan. Näin ollen voi esimerkiksi olla tapauksia, joissa sinulla ei ole pääsyä kurssin luomiseen edes opettajana, koska tätä toimintoa hallinnoivat muut oppilaitoksessasi."; +$AgendaContent = "Agenda-työkalu näkyy sekä kalenterina kullakin kurssilla että kunkin opiskelijan henkilökohtaisena päiväkirjatyökaluna, joka antaa yleiskatsauksen niiden kurssien tapahtumiin, joille hän on ilmoittautunut. (Ryhmillä voi olla myös oma Agenda.) Käyttäjät voivat käyttää Agenda-työkalua, joka näyttää kurssin sisällön ja aktiviteetit, viitteellisenä työkaluna organisoidakseen päivittäistä tai viikoittaista oppimistaan. + +Sen lisäksi, että uudet tapahtumat näkyvät agendassa, ne ilmoitetaan oppijalle aina, kun hän kirjautuu sisään. Järjestelmä näkee, mitä on lisätty edellisen käynnin jälkeen, ja portaalin etusivulle ilmestyy kurssien viereen kuvakkeita, jotka ilmoittavat uusista tapahtumista ja ilmoituksista. + +Jos haluat järjestää opiskelijoiden työskentelyn ajallisesti, kannattaa käyttää oppimispolut-työkalua, jolla voidaan kartoittaa looginen eteneminen eri aktiviteettien ja sisällön läpi muodollisen sisällysluettelon esittämisen avulla."; +$AnnouncementsContent = "Ilmoitukset-työkalun avulla voit lähettää sähköpostiviestin joillekin tai kaikille opiskelijoille tai tietyille ryhmille. Voit halutessasi varoittaa heitä uuden asiakirjan lisäämisestä, muistuttaa heitä tehtävän jättämisen määräajasta tai korostaa ja jakaa erityisen hyvää työtä. Tällaisten sähköposti-ilmoitusten lähettäminen voi myös olla hyödyllinen kehotus saada oppilaat, jotka eivät ole käyneet sivustolla vähään aikaan, palaamaan sinne (kunhan sitä ei liioitella!). +
    +
    +Yhteydenotto tiettyihin käyttäjiin +
    +
    +Sen lisäksi, että lähetät yleisen sähköpostiviestin kaikille kurssin jäsenille, voit lähettää sähköpostiviestin yhdelle tai useammalle henkilölle/ryhmälle. Kun luot uutta ilmoitusta, valitse vain Näkyville ja valitse käyttäjät vasemmanpuoleisista luetteloista ja ja lisää heidät vastaanottajiksi nuolinäppäimillä."; +$ChatContent = "Chat-työkalun avulla voit keskustella oppilaiden kanssa reaaliaikaisesti. + +Toisin kuin useimmat kaupalliset chat-työkalut, Chamilon chat on verkkopohjainen eikä vaadi lisäasennusta (esim. MSN® Yahoo Messenger®, Skype® jne.) Tämän ratkaisun keskeinen etu on sen välitön saatavuus opiskelijoille, jolloin chat voidaan helposti integroida kurssiin. Lisäksi Chamilo-keskustelutyökalu arkistoi keskustelut automaattisesti ja tallentaa ne, jotta ne ovat myöhemmin helposti käytettävissä asiakirjatyökalun kautta. (Varoitetaan, että viestin päivittyminen voi kestää 1-5 sekuntia jokaisen viestinvaihdon yhteydessä - tämä ei tarkoita, että jokin on vialla!!!). +Jos oppijat ovat ladanneet profiilikuvan, se näkyy (pienennettynä) vasemmassa sarakkeessa - muussa tapauksessa näytetään oletuskuva. +Opettaja on vastuussa viestiketjujen poistamisesta aina, kun hän katsoo sen tarpeelliseksi. +Opetuskäyttö +Chatin lisääminen kurssillesi ei aina ole hyvä idea. Jos haluat hyödyntää tätä työkalua parhaalla mahdollisella tavalla, sinun on varmistettava, että keskustelut keskittyvät kurssin sisältöön. Voit esimerkiksi päättää pitää chat-toiminnon piilossa, kunnes on \"virallisen\" istunnon aika. Vaikka keskustelujen vapautta saatetaankin rajoittaa, voitte näin taata paremmin, että tällaisista live-kokouksista on hyötyä."; +$WorkContent = "Tehtävät-työkalu on hyvin yksinkertainen työkalu, jonka avulla opiskelijat voivat ladata dokumentteja kurssille.Sitä voidaan käyttää yksilöiden tai ryhmien vastausten vastaanottamiseen avoimiin kysymyksiin tai minkä tahansa muunlaisten dokumenttien lataamiseen. + +Voit asettaa tiedostot oletusarvoisesti kaikkien opiskelijoiden nähtäviksi tai vain itsellesi kurssin vaatimusten mukaisesti. Kaikkien tiedostojen asettaminen näkyviin on hyödyllistä esimerkiksi silloin, kun haluat pyytää opiskelijoita jakamaan mielipiteitä toistensa töistä tai kun haluat antaa opiskelijoille kokemusta tekstien julkaisemisesta maailmanlaajuisesti. Pidä tiedostot näkymättömissä esimerkiksi silloin, kun haluat kysyä kaikilta samaa kysymystä, mutta välttää \"huijaamisen\". Tekemällä asiakirjoista näkymättömiä voit myös kontrolloida, milloin asiakirja on kaikkien muiden opiskelijoiden saatavilla. + +Jos haluat, että opiskelijat toimittavat asiakirjan arvioitavaksi, sinun on parasta määrittää asiakirjat kansioon työkalusta käsin. + +Työkalun avulla voit asettaa määräajat ja ohjeet toimitukselle sekä enimmäisarvosanan/-pistemäärän."; +$TrackingContent = "Raportointityökalun avulla voit seurata oppilaiden läsnäoloa ja edistymistä: Milloin he liittyivät järjestelmään? Kuinka monta kertaa? Kuinka paljon he saivat pisteitä testeissä? Latasivatko he jo tehtäväpaperinsa? Milloin? Jos käytät SCORM-kursseja, voit jopa seurata, kuinka paljon aikaa opiskelija käytti tiettyyn moduuliin tai lukuun. Raportointi tarjoaa kaksitasoisia tietoja: + +Globaali: Kuinka monta opiskelijaa on käynyt kurssin? Mitkä ovat yleisimmin käytetyt sivut ja linkit? Konkreettiset: Millä sivuilla John Doe on käynyt? Minkä pistemäärän hän on saanut testeissä? Milloin hän on viimeksi ollut yhteydessä alustaan?"; +$HSettings = "Kurssiasetukset Ohje"; +$SettingsContent = "Kurssiasetusten avulla voit hallita kurssin yleisiä parametreja: Kurssin nimi, koodi, kieli, kouluttajan nimi jne. + +Sivun keskellä olevat vaihtoehdot käsittelevät luottamuksellisuusasetuksia: onko kurssi julkinen vai yksityinen? Voivatko käyttäjät rekisteröityä siihen? Voit käyttää näitä asetuksia dynaamisesti, esim. sallia itserekisteröitymisen viikon ajan > pyytää opiskelijoita rekisteröitymään > sulkea itserekisteröitymisen > poistaa mahdolliset tunkeilijat Käyttäjät-luettelon kautta. Näin voit valvoa, ketkä rekisteröityvät, ja samalla vältät itse rekisteröitymisen aiheuttaman hallinnollisen vaivan. +(Huomautus - jotkin organisaatiot eivät halua käyttää tätä menetelmää, vaan valitsevat rekisteröinnin keskittämisen.) Tällöin osallistujat eivät voi ilmoittautua kurssillesi lainkaan, vaikka sinä kouluttajana/opettajana haluaisit antaa heille pääsyn. Voit tarkistaa tämän katsomalla kampuksesi etusivulta (toisin kuin kurssisi etusivulta), onko \"Rekisteröidy\"-linkki näkyvissä). +Sivun alareunassa voit varmuuskopioida kurssin ja poistaa sen. Varmuuskopiointi luo tiedoston palvelimelle ja antaa sinun kopioida sen omalle kiintolevyllesi paikallisesti niin, että sinulla on kaksi varmuuskopiota kumpikin eri paikoissa. Jos varmuuskopioit kurssin ja poistat sen sitten, et voi itse palauttaa sitä, mutta järjestelmänvalvoja voi tehdä sen puolestasi, jos annat hänelle kurssisi koodin. Kurssin varmuuskopiointi on myös hyvä tapa saada kaikki asiakirjasi siirrettyä omalle koneellesi. Tarvitset työkalun, kuten Winzip®, jolla voit purkaa arkiston. Huomaa, että kurssin varmuuskopiointi ei poista sitä automaattisesti."; +$HExternal = "Lisää linkki ohje"; +$ExternalContent = "Chamilo on modulaarinen työkalu. Voit piilottaa ja näyttää työkaluja milloin haluat, projektin vaatimusten tai sen tietyn ajallisen osan mukaan. Voit kuitenkin lisätä etusivullesi myös työkaluja tai sivuja, jotka olet luonut itse tai jotka tulevat Chamilo-portaalisi ulkopuolelta. Näin voit muokata kurssisi etusivua omaksi. + +Tällöin haluat epäilemättä lisätä sivulle omia linkkejäsi. Linkkejä voi olla kahdenlaisia: +Ulkoinen linkki: luot etusivullesi linkin kurssialueesi ulkopuolella sijaitsevalle verkkosivustolle. Tässä tapauksessa valitset 'Target= In a new window' (Kohde= Uudessa ikkunassa), koska et halua, että kyseinen verkkosivusto korvaa Chamilo-ympäristösi. +Sisäinen linkki: linkität Chamilo-kurssisi sisällä olevaan sivuun tai työkaluun. Voit tehdä tämän menemällä ensin kyseiselle sivulle (tai asiakirjaan tai työkaluun), kopioimalla sen URL-osoitteen selaimesi osoiteriviltä (CTRL+C), sitten valitsemalla 'Lisää linkki' ja liittämällä tämän URL-osoitteen URL-kenttään ja antamalla sille haluamasi nimen. Tässä tapauksessa valitset 'Target=Same window' (Kohde=Sama ikkuna), koska haluat pitää Chamilo-bannerin ylhäällä ja linkkisivun samassa ympäristössä. +Kun linkit on kerran luotu, niitä ei voi muokata. Jos haluat muokata niitä, ainoa ratkaisu on poistaa ne käytöstä ja poistaa ne ja aloittaa sitten alusta."; $ClarContent3 = "

    Opetuksen teoriaa

    Opettajille: kurssin muokkaaminen internettiin on aina myös opetuksen teoriota koskettava kysymys.

    "; $ClarContent4 = "Claroline on käytössäsi auttaakseen sinua opetuksessasi.

    "; $ClarContent1 = "Virtuaalinen Kampus"; @@ -3337,32 +4787,286 @@ $YouShouldWriteAMessage = "Sinun pitäisi kirjoittaa viesti"; $MessageOfNewCourseToAdmin = "Tiedoksesi, että uusi kurssi on luotu oppimisympäristöön"; $NewCourseCreatedIn = "Uusi kurssi luotu:"; $ExplicationTrainers = "Sinut on nyt määritetty kouluttajaksi. Voit muuttaa tätä asetusta myöhemmin kurssin asetuksissa."; +$InstallationLanguage = "Asennuskieli"; +$ReadThoroughly = "Please read the following requirements thoroughly."; +$WarningExistingLMSInstallationDetected = "Varoitus! +Asennusohjelma on havainnut järjestelmässäsi olemassa olevan Chamilo-alustan."; +$NewInstallation = "Uusi asennus"; +$CheckDatabaseConnection = "Tarkista tietokantayhteys"; +$PrintOverview = "Näytä yleiskatsaus"; +$Installing = "Asenna"; +$of = "of"; +$MoreDetails = "Lisätietoja"; +$ServerRequirements = "Palvelimen vaatimukset"; +$ServerRequirementsInfo = "Palvelimellasi on oltava seuraavat kirjastot, jotta kaikki Chamilon ominaisuudet ovat käytettävissä. Oransseilla kirjaimilla merkityt puuttuvat kirjastot ovat valinnaisia, mutta jotkin Chamilon ominaisuudet saattavat olla poissa käytöstä, jos niitä ei ole asennettu. Voit silti asentaa nämä kirjastot myöhemmin ottaaksesi puuttuvat ominaisuudet käyttöön."; +$PHPVersion = "PHP versio"; +$Support = "Tuki"; +$PHPVersionOK = "PHP-versiosi vastaa vähimmäisvaatimusta:"; +$RecommendedSettings = "Suositellut asetukset"; +$RecommendedSettingsInfo = "Suositeltavat asetukset palvelinkokoonpanoa varten. Nämä asetukset asetetaan palvelimesi php.ini-konfiguraatiotiedostossa."; +$Actual = "Tällä hetkellä"; +$DirectoryAndFilePermissions = "Hakemistojen ja tiedostojen käyttöoikeudet"; +$DirectoryAndFilePermissionsInfo = "Joidenkin hakemistojen ja niiden sisältämien tiedostojen on oltava WWW-palvelimen kirjoitettavissa, jotta Chamilo voi toimia (käyttäjän lataamat tiedostot, kotisivun html-tiedostot, ...). Tämä saattaa edellyttää manuaalista muutosta palvelimellasi (tämän käyttöliittymän ulkopuolella)."; +$NotWritable = "Ei kirjoitettavissa"; +$Writable = "Kirjoitettavissa"; +$ExtensionLDAPNotAvailable = "LDAP-laajennus ei ole käytettävissä"; +$ExtensionGDNotAvailable = "GD Laajennus ei ole käytettävissä"; +$LMSLicenseInfo = "Chamilo on vapaa ohjelmisto, jota jaetaan GNU General Public License (GPL) -lisenssin alla."; +$IAccept = "Minä hyväksyn"; +$ConfigSettingsInfo = "Seuraavat arvot kirjoitetaan konfiguraatiotiedostoon."; +$GoToYourNewlyCreatedPortal = "Siirry äskettäin luotuun portaaliin."; +$FirstUseTip = "Kun pääset portaaliin ensimmäistä kertaa, paras tapa ymmärtää sitä on luoda kurssi valikossa olevan \"Luo kurssi\"-linkin avulla ja leikkiä hieman."; +$Version_ = "Versio"; +$UpdateFromLMSVersion = "Chamilon päivitys"; +$PleaseSelectInstallationProcessLanguage = "Valitse kieli, jota haluat käyttää asennuksen aikana."; +$HereAreTheValuesYouEntered = "Tässä ovat antamasi arvot"; +$PrintThisPageToRememberPassAndOthers = "Tulosta tämä sivu, jotta voit muistaa salasanasi ja muut asetukset."; +$TheInstallScriptWillEraseAllTables = "Asennusskripti poistaa kaikki valitun tietokannan taulut. Suosittelemme, että teet niistä täydellisen varmuuskopion ennen tämän viimeisen asennusvaiheen vahvistamista."; +$ReadWarningBelow = "lue varoitus alta"; +$SecurityAdvice = "Turvallisuusohjeet"; +$YouHaveMoreThanXCourses = "Sinulla on enemmän kuin %d kursseja Chamilo-alustallasi ! Vain %d kurssia on päivitetty. Voit päivittää muut kurssit, %klikkaa tästä %s"; +$ToProtectYourSiteMakeXAndYReadOnly = "Voit suojata sivustosi tekemällä %s:stä ja %s:stä (mutta ei niiden hakemistoista) vain lukuoikeudet (CHMOD 444)."; +$HasNotBeenFound = "ei ole löytynyt"; +$PleaseGoBackToStep1 = "Palaa vaiheeseen 1"; +$HasNotBeenFoundInThatDir = "ei ole löytynyt kyseisestä hakemistosta"; +$OldVersionRootPath = "Vanhan version juuripolku"; +$NoWritePermissionPleaseReadInstallGuide = "Joillakin tiedostoilla tai kansioilla ei ole kirjoitusoikeutta. Jotta voit asentaa Chamilon, sinun on ensin muutettava niiden käyttöoikeudet (käyttämällä CHMOD-ohjelmaa). Lue asennusopas %s %s"; +$DBServerDoesntWorkOrLoginPassIsWrong = "Tietokantapalvelin ei toimi tai kirjautuminen / salasana on huono."; +$PleaseGoBackToStep = "Palaa vaiheeseen"; +$DBSettingUpgradeIntro = "Päivitysskripti palauttaa ja päivittää Chamilo-tietokannan (tietokannat). Tätä varten tämä skripti käyttää alla määriteltyjä tietokantoja ja asetuksia. Koska ohjelmistomme toimii monenlaisissa järjestelmissä ja koska kaikkia niitä ei välttämättä ole testattu, suosittelemme, että teet tietokannoista täydellisen varmuuskopion ennen päivityksen aloittamista!"; +$ExtensionMBStringNotAvailable = "MBString-laajennus ei ole käytettävissä"; +$ExtensionMySQLNotAvailable = "MySQL-laajennus ei ole käytettävissä"; +$LMSMediaLicense = "Chamilon kuvissa ja mediagallerioissa käytetään kuvia Nuvolan, Crystal Clearin ja Tangon kuvagallerioista. Muut kuvat ja mediat, kuten kaaviot ja Flash-animaatiot, on lainattu Wikimedian sekä Ali Pakdelin ja Denis Hoan kursseilta heidän suostumuksellaan ja julkaistu BY-SA Creative Commons -lisenssillä. Löydät lisenssin yksityiskohdat CC websivustolta, jonka sivun alareunassa on linkki lisenssin koko tekstiin."; +$OptionalParameters = "Valinnaiset parametrit"; +$FailedConectionDatabase = "Tietokantayhteys on epäonnistunut. Tämä johtuu yleensä siitä, että edellä on asetettu väärä käyttäjä, väärä salasana tai väärä tietokannan etuliite. Tarkista nämä asetukset ja yritä uudelleen."; +$UpgradeFromLMS16x = "Päivitys Chamilo 1.6.x:stä"; +$UpgradeFromLMS18x = "Päivitys Chamilo 1.8.x:stä"; $GroupPendingInvitations = "Ryhmän odottavat kutsut"; $Compose = "Laadi"; +$BabyOrange = "Vauva oranssi"; +$BlueLagoon = "Sininen laguuni"; +$CoolBlue = "Viileä sininen"; +$Corporate = "Yritys"; +$CosmicCampus = "Cosmic campus"; +$DeliciousBordeaux = "Herkullinen Bordeaux"; +$EmpireGreen = "Empire vihreä"; +$FruityOrange = "Hedelmäinen appelsiini"; +$Medical = "Lääketieteellinen"; +$RoyalPurple = "Royal violetti"; +$SilverLine = "Hopeinen viiva"; +$SoberBrown = "Raitis ruskea"; +$SteelGrey = "Teräksen harmaa"; +$TastyOlive = "Maukas oliivi"; +$NameOfLang['bosnian'] = "bosnia"; +$NameOfLang['czech'] = "tsekki"; +$NameOfLang['dari'] = "dari"; +$NameOfLang['dutch_corporate'] = "hollantilainen yritys"; +$NameOfLang['english_org'] = "englanti järjestöille"; +$NameOfLang['friulian'] = "Friulian"; +$NameOfLang['georgian'] = "georgialainen"; +$NameOfLang['hebrew'] = "heprea"; +$NameOfLang['korean'] = "korea"; +$NameOfLang['latvian'] = "latvia"; +$NameOfLang['lithuanian'] = "liettua"; +$NameOfLang['macedonian'] = "makedonia"; +$NameOfLang['norwegian'] = "norja"; +$NameOfLang['pashto'] = "pashto"; +$NameOfLang['persian'] = "persia"; +$NameOfLang['quechua_cusco'] = "quechua Cuscosta"; +$NameOfLang['romanian'] = "romania"; +$NameOfLang['serbian'] = "serbia"; +$NameOfLang['slovak'] = "slovakia"; +$NameOfLang['swahili'] = "swahili"; +$NameOfLang['trad_chinese'] = "perinteinen kiina"; +$ChamiloInstallation = "Chamilon asennus"; $PendingInvitations = "Vahvistamattomat kutsut"; $SessionData = "Session tiedot"; +$SelectFieldToAdd = "Valitse lisättävä käyttäjäprofiilikenttä"; $MoveElement = "Siirrä elementtiä"; +$ShowGlossaryInExtraToolsTitle = "Näytä sanaston termit lisätyökaluissa"; +$ShowGlossaryInExtraToolsComment = "Täältä voit määrittää, miten sanaston termit lisätään ylimääräisiin työkaluihin, kuten oppimispolkuun ja harjoitustyökaluun."; +$HSurvey = "Survey Help"; +$SurveyContent = "On erittäin tärkeää saada asianmukaista palautetta kursseista. Erityinen kyselytyökalu on korvaamaton työkalu, jolla saat tehokasta palautetta käyttäjiltä. +Uuden kyselyn luominen + +Napsauta linkkiä \"Luo uusi kysely\" ja täytä kentät \"Kyselyn koodi\" ja \"Kyselyn nimi\". Kalenterin avulla voit hallita kyselyn kestoa. Sitä ei tarvitse pitää auki koko vuotta; salli pääsy muutamaksi päiväksi kurssiohjelman lopussa. Tekstikenttien 'Kyselyn johdanto' ja 'Kyselyn kiitokset' täyttäminen on myös hyvä käytäntö; tämä lisää selkeyttä ja tiettyä ystävällisyyttä kyselyyn. +Kysymysten lisääminen kyselyyn + +Kun kysely on luotu, on sinun tehtäväsi luoda kysymykset. Survey-työkalussa on monia kysymystyyppejä: avoimet/suljetut kysymykset, prosenttikysymykset, QCM, monivastaukset... Löydät varmasti kaiken, mitä tarvitset (jatkuvasti kasvaviin) palautevaatimuksiisi. +Kyselyn esikatselu + +Kun olet luonut kysymykset, voit tarkistaa, miltä kysely näyttää oppijoiden silmissä. Napsauta 'Esikatselu' -kuvaketta, ja esikatseluruutu näyttää juuri tämän. + +Kyselyn julkaiseminen + +Oletko tyytyväinen esikatseluun? Tarvitsetko muutoksia? Ei? Napsauta sitten kuvaketta \"Julkaise kysely\" lähettääksesi kyselyn valitulle vastaanottajaluettelolle. Kuten ryhmien luomisessa, käytä järjestämiseen vasemmalla olevaa listaa 'Tämän kurssin käyttäjät' ja oikealla olevaa listaa 'vastaanottajat'. Täytä seuraavaksi sähköpostin otsikko 'Sähköpostin otsikko' ja sisältö 'Sähköpostin teksti'. Mahdollisille kyselyyn osallistujille ilmoitetaan sähköpostitse, että kysely on saatavilla. Harkitse huolellisesti sähköpostiviestin sanamuotoa, koska sillä on suuri merkitys käyttäjien motivoimisessa osallistumaan kyselyyn. + +Tutkimusraportit + +Tutkimusten analysointi on työläs tehtävä. Kyselyn raportointityökalu auttaa analysoinnissa, sillä se lajittelee raportit kysymysten, käyttäjien, vertailujen jne. mukaan.... +Kyselyjen hallinta + +Kun hallinnoit kyselyitä, näet tavallisten \"Muokkaa\"- ja \"Poista\"-vaihtoehtojen lisäksi joitakin uusia kuvakkeita. Voit esikatsella, julkaista ja seurata kyselyitäsi ja vastauksia näiden avulla."; +$HBlogs = "Projektiapu"; +$BlogsContent = "Projektityökalu helpottaa yhteistoiminnallista projektityöskentelyä. + +Yksi tapa käyttää työkalua on määrittää sen avulla kirjoittajat, joiden tehtävänä on pitää kirjallisia raportteja päivän/viikon aikana tapahtuneista toimista. Tähän liittyy tehtävienhallintatyökalu, jonka avulla voit määrittää asiaankuuluvan tehtävän kenelle tahansa nimetyistä kirjoittajista (esim. raportoimaan turvallisuusstandardien kehityksestä yrityksessä). Uutta sisältöä edustavaa kohdetta kutsutaan artikkeliksi . Voit luoda uuden artikkelin seuraamalla valikon linkkiä, joka kehottaa sinua tekemään niin. Jos haluat muokata (jos olet artikkelin kirjoittaja) tai lisätä kommentin artikkeliin, napsauta artikkelin otsikkoa."; +$FirstSlide = "Ensimmäinen dia"; +$LastSlide = "Viimeinen dia"; +$TheDocumentHasBeenDeleted = "Asiakirja on poistettu."; +$YouAreNotAllowedToDeleteThisDocument = "Et saa poistaa tätä dokumenttia"; $AdditionalProfileField = "Lisää kenttä käyttäjäprofiiliin"; +$ExportCourses = "Vie kurssit"; +$IsAdministrator = "on ylläpitäjä"; +$IsNotAdministrator = "Ei ole ylläpitäjä"; +$AddTimeLimit = "Lisää aikaraja"; +$EditTimeLimit = "Muokkaa aikarajaa"; +$TheTimeLimitsAreReferential = "Luokan aikaraja on viitteellinen, se ei vaikuta harjoittelujakson rajoihin."; +$FieldTypeTag = "User tag"; +$SendEmailToAdminTitle = "Sähköpostihälytys kurssin luomisesta"; +$SendEmailToAdminComment = "Lähetä sähköpostiviesti alustan ylläpitäjälle aina, kun opettaja luo uuden kurssin."; +$UserTag = "Käyttäjän tunniste"; +$SelectSession = "Valitse istunto"; +$SpecialCourse = "Erikoiskurssi"; +$MathASCIImathMLTitle = "ASCIIMathML matemaattinen editori"; +$MathASCIImathMLComment = "ASCIIMathML-matemaattisen editorin ottaminen käyttöön"; +$YoutubeForStudentsTitle = "Salli oppijoiden lisätä videoita YouTubesta"; +$YoutubeForStudentsComment = "Ota käyttöön mahdollisuus, että oppijat voivat lisätä Youtube-videoita."; +$BlockCopyPasteForStudentsTitle = "Estä oppijan kopioi ja liitä"; +$BlockCopyPasteForStudentsComment = "Lohkon oppijat voivat kopioida ja liittää WYSIWYG-editoriin."; +$MoreButtonsForMaximizedModeTitle = "Painikepalkki laajennettu"; +$MoreButtonsForMaximizedModeComment = "Salli painikepalkkien laajentaminen, kun WYSIWYG-editori on maksimoitu."; +$Editor = "HTML Editori"; +$GoToCourseAfterLoginTitle = "Siirry suoraan kurssille kirjautumisen jälkeen"; +$GoToCourseAfterLoginComment = "Kun käyttäjä on rekisteröitynyt yhdelle kurssille, kirjautumisen jälkeen siirrytään suoraan kurssille."; +$AllowStudentsDownloadFoldersTitle = "Salli oppijoiden ladata hakemistoja"; +$AllowStudentsDownloadFoldersComment = "Salli oppijoiden pakata ja ladata dokumenttityökalulla täydellinen hakemisto."; +$AllowStudentsToCreateGroupsInSocialTitle = "Salli oppijoiden luoda ryhmiä sosiaalisessa verkostossa."; +$AllowStudentsToCreateGroupsInSocialComment = "Salli oppijoiden luoda ryhmiä sosiaalisessa verkostossa."; +$AllowSendMessageToAllPlatformUsersTitle = "Salli viestien lähettäminen mille tahansa alustan käyttäjälle"; +$AllowSendMessageToAllPlatformUsersComment = "Voit lähettää viestejä kenelle tahansa alustan käyttäjälle, ei vain ystävillesi tai niille, jotka ovat parhaillaan verkossa."; +$TabsSocial = "Sosiaalinen verkosto -välilehti"; +$MessageMaxUploadFilesizeTitle = "Tiedoston enimmäiskoko viesteissä"; +$MessageMaxUploadFilesizeComment = "Tiedoston lataamisen enimmäiskoko viestityökalussa (tavuina)."; +$ChamiloHomepage = "Chamilon kotisivu"; +$ChamiloForum = "Chamilo foorumi"; +$ChamiloExtensions = "Chamilon laajennukset"; +$ChamiloGreen = "Chamilon Vihreä"; +$ChamiloRed = "Chamilon punainen"; +$MessagesSent = "Lähetettyjen viestien määrä"; +$MessagesReceived = "Vastaanotettujen viestien määrä"; +$CountFriends = "Yhteyksien määrä"; +$ToChangeYourEmailMustTypeYourPassword = "Jotta voit vaihtaa sähköpostiosoitteesi, sinun on vahvistettava salasanasi."; $Invitations = "Kutsut"; +$MyGroups = "Ryhmäni"; +$Social = "Sosiaalinen"; $MyFriends = "Ystäväni"; +$CreateAgroup = "Luo ryhmä"; +$UsersGroups = "Käyttäjät, ryhmät"; +$SorryNoResults = "Valitettavasti ei tuloksia"; +$GroupPermissions = "Ryhmän oikeudet"; +$Closed = "Suljettu"; +$AddGroup = "Lisää ryhmä"; +$Privacy = "Yksityisyys"; +$ThisIsAnOpenGroup = "This is an open group"; +$YouShouldCreateATopic = "Sinun pitäisi luoda aihe"; +$IAmAnAdmin = "Olen ylläpitäjä"; +$MessageList = "Viestiluettelo"; +$MemberList = "Jäsenluettelo"; +$WaitingList = "Odotuslista"; $InviteFriends = "Kutsu ystäviä"; +$AttachmentFiles = "Liitteet"; +$AddOneMoreFile = "Lisää vielä yksi tiedosto"; +$MaximunFileSizeX = "Tiedoston maksimikoko: %s"; +$ModifyInformation = "Muokkaa tietoja"; +$GroupEdit = "Muokkaa ryhmää"; +$ThereAreNotUsersInTheWaitingList = "Odotuslistalla ei ole käyttäjiä"; +$SendInvitationTo = "Lähetä kutsu osoitteeseen"; +$InviteUsersToGroup = "Käyttäjien kutsuminen ryhmään"; +$PostIn = "Lähetetty"; +$Newest = "Uusimmat"; +$Popular = "Suosittu"; +$DeleteModerator = "Poista moderaattori"; +$UserChangeToModerator = "Käyttäjä päivitetty moderaattoriksi"; +$IAmAModerator = "Olen moderaattori"; +$ThisIsACloseGroup = "Tämä on suljettu ryhmä"; +$IAmAReader = "Olen lukija"; +$UserChangeToReader = "Käyttäjä päivitetty lukijaksi"; +$AddModerator = "Lisää moderaattoriksi"; +$JoinGroup = "Liity ryhmään"; +$YouShouldJoinTheGroup = "Sinun pitäisi liittyä ryhmään"; +$WaitingForAdminResponse = "Odotetaan ylläpitäjän vastausta"; +$Re = "Vastaus"; +$FilesAttachment = "Tiedostojen liitetiedostot"; +$GroupWaitingList = "Ryhmän jonotuslista"; +$UsersAlreadyInvited = "Jo kutsutut käyttäjät"; +$SubscribeUsersToGroup = "Subscribe users to group"; +$YouHaveBeenInvitedJoinNow = "Sinut on kutsuttu liittymään nyt"; +$DenyInvitation = "Kieltäytyä kutsusta"; +$AcceptInvitation = "Hyväksy kutsu"; +$GroupsWaitingApproval = "Hyväksyntää odottavat ryhmät"; +$GroupInvitationWasDeny = "Ryhmäkutsu evättiin"; +$UserIsSubscribedToThisGroup = "Käyttäjä on tilattu tähän ryhmään"; +$DeleteFromGroup = "Poista ryhmästä"; +$YouAreInvitedToGroupContent = "Sinua pyydetään liittymään ryhmän sisältöön"; +$YouAreInvitedToGroup = "Sinut kutsutaan ryhmään"; +$ToSubscribeClickInTheLinkBelow = "Tilausta varten klikkaa alla olevaa linkkiä"; +$ReturnToInbox = "Palaa postilaatikkoon"; +$ReturnToOutbox = "Palaa lähtevään postilaatikkoon"; +$EditNormalProfile = "Muokkaa normaalia profiilia"; +$LeaveGroup = "Jätä ryhmä"; +$UserIsNotSubscribedToThisGroup = "Käyttäjä ei ole tilannut tätä ryhmää"; +$InvitationReceived = "Saatu kutsu"; $InvitationSent = "Kutsu lähetetty"; +$YouAlreadySentAnInvitation = "Olet jo lähettänyt kutsun"; +$FilesSizeExceedsX = "Tiedostojen koko ylittää"; +$YouShouldWriteASubject = "Sinun pitäisi kirjoittaa aihe"; +$StatusInThisGroup = "Asema tässä ryhmässä"; $FriendsOnline = "Ystävät online"; +$MyProductions = "My productions"; +$YouHaveReceivedANewMessageInTheGroupX = "Olet saanut uuden viestin ryhmässä %s"; +$ClickHereToSeeMessageGroup = "Klikkaa tästä nähdäksesi ryhmän viestin"; +$OrCopyPasteTheFollowingUrl = "or copy paste the following url :"; +$ThereIsANewMessageInTheGroupX = "There is a new message in group %s"; +$UserIsAlreadySubscribedToThisGroup = "Käyttäjä on jo tilattu tähän ryhmään"; +$AddNormalUser = "Lisää yksinkertaisena käyttäjänä"; +$DenyEntry = "Kiellä pääsy"; $YouNeedToHaveFriendsInYourSocialNetwork = "Sosiaalisessa verkostossasi tulee olla ystäviä"; +$SeeAllMyGroups = "See all my groups"; +$EditGroupCategory = "Muokkaa ryhmäkategoriaa"; +$ModifyHotPotatoes = "Muokkaa hotpotatoes"; +$SaveHotpotatoes = "Tallenna hotpotatoes"; +$SessionIsReadOnly = "Istunto on vain luettavissa"; +$EnableTimerControl = "Aikaohjauksen käyttöönotto"; +$ExerciseTotalDurationInMinutes = "Testin kokonaiskesto minuutteina"; +$ToContinueUseMenu = "Jos haluat jatkaa kurssia, käytä sivuvalikkoa."; +$RandomAnswers = "Sekoita vastaukset"; +$NotMarkActivity = "Tätä toimintaa ei voi arvostella"; +$YouHaveToCreateAtLeastOneAnswer = "Sinun on luotava vähintään yksi vastaus"; +$ExerciseAttempted = "Oppija yritti harjoitusta"; +$MultipleSelectCombination = "Tarkka valinta"; +$MultipleAnswerCombination = "Tarkat vastaukset yhdistelmä"; +$ExerciseExpiredTimeMessage = "Harjoituksen määräaika on päättynyt"; +$NameOfLang['ukrainian'] = "ukraina"; +$NameOfLang['yoruba'] = "yoruba"; $New = "Uusi"; +$YouMustToInstallTheExtensionLDAP = "Sinun on asennettava LDAP-laajennus"; $AddAdditionalProfileField = "Lisää kenttä käyttäjäprofiiliin"; +$InvitationDenied = "Kutsu evätty"; $UserAdded = "Käyttäjä lisätty"; +$UpdatedIn = "Päivitetty"; $Metadata = "Metadata"; $AddMetadata = "Näytä/Muokkaa Metadataa"; $SendMessage = "Lähetä viesti"; $SeeForum = "Näytä keskustelualue"; $SeeMore = "Näytä lisää"; +$NoDataAvailable = "Tietoja ei ole saatavilla"; $Created = "Luotu"; $LastUpdate = "Viimeisin päivitys"; $UserNonRegisteredAtTheCourse = "Käyttäjä ei ole rekisteröitynyt kurssille"; $EditMyProfile = "Muokkaa profiiliani"; $Announcements = "Ilmoitukset"; -$Password = "salasana"; +$Password = "Salasana"; $DescriptionGroup = "Ryhmän kuvaus"; $Installation = "Asennus"; $ReadTheInstallationGuide = "Lue asennusohje"; @@ -3372,18 +5076,202 @@ $BlogPosts = "Blogi kirjoitukset"; $BlogComments = "Blogi kommentit"; $ThereAreNotExtrafieldsAvailable = "Lisäkenttiä ei ole saatavilla"; $StartToType = "Aloita kirjoittamalla ja klikkaa sitten tästä hyväksyäksesi tunnisteen"; +$InstallChamilo = "Asenna chamilo"; $ChamiloURL = "Chamilon URL-osoite"; +$YouDoNotHaveAnySessionInItsHistory = "Sinulla ei ole istuntoa istuntohistoriassasi"; +$PortalHomepageDefaultIntroduction = "Onnittelut! Olet onnistuneesti asentanut verkko-oppimisportaalisi! Voit nyt viimeistellä asennuksen noudattamalla kolmea helppoa vaihetta: Määritä portaalisi menemällä hallinto-osioon ja valitsemalla kohta Portal -> Configuration settings (portaali -> konfigurointiasetukset). Lisää portaaliin elämää luomalla käyttäjiä ja/tai koulutusta. Voit tehdä sen kutsumalla uusia henkilöitä luomaan tilinsä tai luomalla ne itse ylläpidon Käyttäjät- ja Koulutus-osiossa. Muokkaa tätä sivua ylläpidon osiossa olevan Muokkaa portaalin etusivua -merkinnän kautta. Löydät aina lisätietoja tästä ohjelmistosta verkkosivuiltamme: http://www.chamilo.org. + +Pidä hauskaa, äläkä epäröi liittyä yhteisöön ja antaa meille palautetta foorumin kautta."; $WithTheFollowingSettings = "seuraavilla tiedoilla:"; +$ThePageHasBeenExportedToDocArea = "Sivu on viety dokumenttityökaluun."; +$TitleColumnGradebook = "Osaamisraportin sarakeotsikko"; +$QualifyWeight = "Paino raportissa"; +$ConfigureExtensions = "Laajennusten määrittäminen"; $ThereAreNotQuestionsForthisSurvey = "Tässä kyselyssä ei ole kysymyksiä"; +$StudentAllowedToDeleteOwnPublication = "Salli oppijoiden poistaa omia julkaisujaan"; +$ConfirmYourChoiceDeleteAllfiles = "Vahvistakaa valintanne. Tämä poistaa kaikki tiedostot ilman palautusmahdollisuutta"; +$WorkName = "Tehtävän nimi"; +$ReminderToSubmitPendingTask = "Muistathan, että sinun on vielä lähetettävä tehtävä..."; +$MessageConfirmSendingOfTask = "Tämä on viesti, jossa vahvistetaan tehtävän hyvä vastaanotto."; +$DataSent = "Lähetetyt tiedot"; +$DownloadLink = "Lataa linkki"; +$ViewUsersWithTask = "Tehtäviä vastaanotettu"; +$ReminderMessage = "Lähetä muistutus"; +$DateSent = "Lähetyspäivä"; +$ViewUsersWithoutTask = "Näytä puuttuvat tehtävät"; +$SuggestionOnlyToEnableSubLanguageFeatureOrUpgradeProcess = "Tarvitaan vain alakielet-ominaisuuden tai version päivitysprosessin yhteydessä."; +$ThematicAdvance = "Temaattinen eteneminen"; $EditProfile = "Muokkaa profiilia"; +$TabsDashboard = "Ohjauspaneeli"; +$DashboardBlocks = "Ohjauspaneelin lohkot"; +$DashboardList = "Ohjauspaneelin lista"; +$YouHaveNotEnabledBlocks = "Et ole ottanut yhtään lohkoa käyttöön"; +$BlocksHaveBeenUpdatedSuccessfully = "Lohkot on päivitetty"; +$Dashboard = "Ohjauspaneeli"; +$DashboardPlugins = "Ohjauspaneelin laajennus"; +$ThisPluginHasbeenDeletedFromDashboardPluginDirectory = "Tämä laajennus on poistettu ohjauspaneelin laajennushakemistosta"; +$EnableDashboardPlugins = "Ota ohjauspaneelin laajennukset käyttöön"; +$SelectBlockForDisplayingInsideBlocksDashboardView = "Valitse halinntapaneelin lohkonäkymässä näytettävät lohkot"; $ColumnPosition = "Sijainti (sarake)"; +$EnableDashboardBlock = "Ota käyttöön ohjauspaneelin lohko"; +$ThereAreNoEnabledDashboardPlugins = "Ohjauspaneelin laajennusta ei ole käytössä"; +$Enabled = "Käytössä"; +$ThematicAdvanceQuestions = "Millaista edistystä olet saavuttanut oppijoiden kanssa kurssin sisällä? Kuinka paljon uskot olevan jäljellä koko ohjelmaan verrattuna?"; +$ThematicAdvanceHistory = "Ennakkohistoria"; $Homepage = "Kotisivu"; $Attendances = "Läsnä"; +$CountDoneAttendance = "# attended"; +$AssignUsers = "Käyttäjien määrittäminen"; +$AssignCourses = "Määritä kursseja"; +$AssignSessions = "Määritä istunnot"; +$CoursesListInPlatform = "Alustan kurssien luettelo"; +$AssignedCoursesListToHumanResourceManager = "Henkilöstöpäällikölle osoitetut kurssit"; +$AssignedCoursesTo = "Kurssit, jotka on osoitettu"; +$AssignCoursesToHumanResourcesManager = "Määritä kurssit henkilöstöpäällikölle"; +$TimezoneValueTitle = "Aikavyöhyke arvo"; +$TimezoneValueComment = "Tämän portaalin aikavyöhyke on asetettava samalle aikavyöhykkeelle kuin organisaation päämajan. Jos jätetään tyhjäksi, se käyttää palvelimen aikavyöhykettä.
    +Jos se on määritetty, kaikki järjestelmän kellonajat tulostetaan tämän aikavyöhykkeen mukaan. Tällä asetuksella on alhaisempi prioriteetti kuin käyttäjän aikavyöhykkeellä, jos se on käytössä ja käyttäjä on valinnut sen itse laajennetun profiilinsa kautta."; +$UseUsersTimezoneTitle = "Käyttäjien aikavyöhykkeiden käyttöönotto"; +$UseUsersTimezoneComment = "Ota käyttöön käyttäjien mahdollisuus valita oma aikavyöhykkeensä. Aikavyöhyke-kentän on oltava näkyvissä ja muutettavissa hallinto-osion Profilointi-valikossa, ennen kuin käyttäjät voivat valita omansa. Kun se on määritetty, käyttäjät näkevät tehtävien määräajat ja muut aikaviitteet omassa aikavyöhykkeessään, mikä vähentää virheitä toimitushetkellä."; +$FieldTypeTimezone = "Aikavyöhyke"; $Timezone = "Aikavyöhyke"; +$AssignedSessionsHaveBeenUpdatedSuccessfully = "Määritellyt istunnot on päivitetty"; +$AssignedCoursesHaveBeenUpdatedSuccessfully = "Määritellyt kurssit on päivitetty"; +$AssignedUsersHaveBeenUpdatedSuccessfully = "Määritetyt käyttäjät on päivitetty"; +$AssignUsersToX = "Määritä käyttäjä %s:lle"; +$AssignUsersToHumanResourcesManager = "Määritä käyttäjät henkilöstöpäällikölle"; +$AssignedUsersListToHumanResourcesManager = "Luettelo henkilöstöpäällikölle osoitetuista käyttäjistä"; +$AssignCoursesToX = "Määritä kurssit %s:lle"; +$SessionsListInPlatform = "Luettelo alustan istunnoista"; +$AssignSessionsToHumanResourcesManager = "Määritä istunnot henkilöstöpäällikölle"; +$AssignedSessionsListToHumanResourcesManager = "Luettelo henkilöstöpäällikölle osoitetuista istunnoista"; +$SessionsInformation = "Istuntoraportti"; +$YourSessionsList = "Istuntosi"; +$TeachersInformationsList = "Opettajien raportti"; +$YourTeachers = "Opettajasi"; +$StudentsInformationsList = "Oppijoiden raportti"; +$YourStudents = "Oppijasi"; +$GoToThematicAdvance = "Siirry temaattiseen etenemiseen"; +$TeachersInformationsGraph = "Opettajien raporttikaavio"; +$StudentsInformationsGraph = "Oppijoiden raporttikaavio"; +$Timezones = "Aikavyöhykkeet"; +$TimeSpentOnThePlatformLastWeekByDay = "Viime viikolla foorumilla vietetty aika päiväkohtaisesti"; +$AttendancesFaults = "Ei osallistunut"; +$EditingExerciseCauseProblemsInLP = "Harjoituksen muokkaaminen aiheuttaa ongelmia Oppimispolulla"; +$AreYouSureToCopy = "Oletko varma, että haluat kopioida"; +$ExerciseCopied = "Harjoitus kopioitu"; +$CouldNotResetPassword = "Salasanaa ei voitu palauttaa"; +$AreYouSureToDeleteResults = "Haluatko varmasti poistaa tulokset"; +$XResultsCleaned = "%d tuloksia puhdistettu"; +$Attendance = "Osallistuminen"; +$CreateANewAttendance = "Luo uusi läsnäololuettelo"; +$QualifyAttendanceGradebook = "Arvioi läsnäololuettelo arviointityökalussa"; +$AttendanceCalendar = "Läsnäolokalenteri"; +$GoToAttendanceCalendar = "Siirry läsnäolokalenteriin"; +$AttendanceSheet = "Läsnäololomake"; +$AddDateAndTime = "Lisää päivämäärä ja kellonaika"; +$CleanCalendar = "Puhdista kalenteri kaikista luetteloista"; +$AttendanceCalendarDescription = "Läsnäolokalenterin avulla voit rekisteröidä läsnäololistoja (yksi kutakin todellista istuntoa kohden, johon opiskelijoiden on osallistuttava). Lisää uusia läsnäololistoja täällä."; +$CalendarList = "Kalenteri lista tapaamisista"; +$ThereAreNoRegisteredDatetimeYet = "Päivää/aikaa ei ole vielä rekisteröity"; +$GeneralError = "VIrhe on tapahtunut. Ota yhteyttä ylläpitäjään."; +$BadFormData = "Lähetys epäonnistui: datavirhe. Ota yhteyttä ylläpitäjään."; +$NoUserSelected = "Valitse käyttäjä, jolle haluat tiedoston lähettää."; +$NoFileSpecified = "Et valinnut tiedostoa tallennettavaksi."; +$ErrorCreatingDir = "Tiedostorakennetta ei voitu luoda. Ota yhteyttä ylläpitoon."; +$SendTo = "Vastaanottaja"; +$SentOn = "on"; +$OverwriteFile = "Korvaa aiemmin lähetetty tiedosto?"; +$FileSize = "tiedostokoko"; +$Sender = "lähettäjä"; +$MailingAsUsername = "Sähköpostilla"; +$MailingInSelect = "--sähköpostilla--"; +$MailingNotYetSent = "Sendotaĵoj estas ankoraŭ ne senditaj..."; +$MailingSend = "Sendi dokumentojn"; +$MailingConfirmSend = "Ĉu sendi dokumentojn al iliaj individuaj adresitoj?"; +$MailingWrongZipfile = "Sendotaĵo estu zip-dosiero kun STUDENTID aŭ LOGINNAME en la nomo"; +$MailingZipEmptyOrCorrupt = "Mesaĝa zip-dosiero estas malplena aŭ difekta"; +$MailingZipPhp = "Mesaĝa zip-dosiero enhavas php-doiserojn - transsendo maleblas"; +$MailingZipDups = "Mesaĝa zip-dosiero enhavas duoblaĵojn - transsendo maleblas"; +$MailingFileFunny = "Neniu nomo, aŭ sufikso ne konsistanta el 1-4 literoj kaj ciferoj"; +$MailingFileNoPrefix = "nomo ne komenciĝas per"; +$MailingFileNoPostfix = "nomo ne finiĝas per"; +$MailingFileNoRecip = "ne adresito-id en la nomo"; +$MailingFileRecipNotFound = "neniu studento trovis XX"; +$MailingFileRecipDup = "pli ol unu studento trovis XX"; +$MailingFileIsFor = "estas por XX"; +$MailingFileSentTo = "vastaanottaja"; +$MailingFileNotRegistered = "(ei ole rekisteröitynyt tälle kurssille)"; +$MailingNothingFor = "Nenio por"; +$JustUploadInSelect = "Tallenna itsellesi"; +$GiveFeedback = "Anna / muokkaa palautetta"; +$ShowFeedback = "Näytä palaute"; +$Upload = "Lähetä"; +$AssignSessionsTo = "Määritä istunnot seuraavasti"; +$AttendanceSheetReport = "Raportti läsnäololomakkeista"; +$YouDoNotHaveDoneAttendances = "Sinulla ei ole läsnäoloja"; +$DashboardPluginsHaveBeenUpdatedSuccessfully = "Ohjauspaneelin laajennukset on päivitetty onnistuneesti"; +$ThereIsNoInformationAboutYourCourses = "Kursseistasi ei ole saatavilla tietoja"; +$ThereIsNoInformationAboutYourSessions = "Istunnoistasi ei ole saatavilla tietoja"; +$ThereIsNoInformationAboutYourTeachers = "Opettajistasi ei ole saatavilla tietoja"; +$ThereIsNoInformationAboutYourStudents = "Oppijoistasi ei ole saatavilla tietoja"; +$TimeSpentLastWeek = "Viime viikolla käytetty aika"; +$SystemStatus = "Järjestelmän tila"; +$IsWritable = "On kirjoitettavissa"; +$DirectoryExists = "Hakemisto on olemassa"; +$DirectoryMustBeWritable = "Verkkopalvelimen on voitava kirjoittaa hakemistoon."; +$DirectoryShouldBeRemoved = "Hakemisto pitäisi poistaa (se ei ole enää tarpeellinen)."; +$Section = "Osio"; +$Expected = "Odotettu"; +$Setting = "Asetus"; +$Current = "Nykyinen"; +$SessionGCMaxLifetimeInfo = "Istunnon roskienkerääjän enimmäiselinikä ilmoittaa, mikä enimmäisaika on kahden roskienkeräys ajon välillä."; +$PHPVersionInfo = "PHP-versio"; +$FileUploadsInfo = "Tiedostojen lataaminen näyttää, onko tiedostojen lataaminen sallittua lainkaan."; +$UploadMaxFilesizeInfo = "Ladatun tiedoston enimmäiskoko. Tämän asetuksen pitäisi useimmiten täsmätä post_max_size -muuttujan kanssa."; +$MagicQuotesRuntimeInfo = "Tämä on erittäin epäsuositeltava ominaisuus, joka muuntaa kaikkien ulkoisia arvoja palauttaneiden funktioiden palauttamat arvot slash-escaped-arvoiksi. Tätä ominaisuutta *ei* pitäisi ottaa käyttöön."; +$PostMaxSizeInfo = "Tämä on POST-menetelmää käyttävien lomakkeiden (eli klassisten tiedostojen latauslomakkeiden) enimmäiskoko."; +$SafeModeInfo = "Vikasietotila on PHP:n vanhentunut ominaisuus, joka rajoittaa (rankasti) PHP-skriptien pääsyä muihin resursseihin. On suositeltavaa jättää se pois käytöstä."; +$DisplayErrorsInfo = "Näytä virheet näytöllä. Kytke tämä päälle kehityspalvelimilla ja pois päältä tuotantopalvelimilla."; +$MaxInputTimeInfo = "Enimmäisaika, jonka palvelin voi käsitellä lomaketta. Jos se kestää kauemmin, prosessi keskeytetään ja palautetaan tyhjä sivu."; +$DefaultCharsetInfo = "Sivuja palautettaessa lähetettävä oletusmerkistö"; +$RegisterGlobalsInfo = "Käytetäänkö register globals -ominaisuutta vai ei. Sen käyttäminen aiheuttaa mahdollisia tietoturvariskejä tässä ohjelmistossa."; +$ShortOpenTagInfo = "Sallitaanko lyhyiden avoimien tunnisteiden käyttö vai ei. Tätä ominaisuutta ei pitäisi käyttää."; +$MemoryLimitInfo = "Enimmäismuistiraja yhdelle yksittäiselle komentosarja-ajolle. Jos muistin tarve on suurempi, prosessi pysähtyy, jotta se ei kuluttaisi kaikkea palvelimen käytettävissä olevaa muistia ja hidastaisi siten muiden käyttäjien toimintaa."; +$MagicQuotesGpcInfo = "Poistaako GET-, POST- ja COOKIES-matriisien arvot automaattisesti. Samanlainen ominaisuus tarjotaan tämän ohjelmiston sisällä tarvittaville tiedoille, joten sen käyttäminen aiheuttaa arvojen kaksinkertaisen slash-escapingin."; +$VariablesOrderInfo = "Ympäristö-, GET-, POST-, COOKIES- ja SESSION-muuttujien etusijajärjestys."; +$MaxExecutionTimeInfo = "Skriptin maksimiaika, joka skriptin suorittamiseen voi kulua. Jos komentosarjan käyttö ylittää tämän, komentosarja keskeytetään, jotta se ei hidastaisi muiden käyttäjien toimintaa."; +$ExtensionMustBeLoaded = "Tämä laajennus on ladattava."; +$MysqlProtoInfo = "MySQL-protokolla"; +$MysqlHostInfo = "MySQL-palvelimen isäntä"; +$MysqlServerInfo = "MySQL-palvelimen tiedot"; +$MysqlClientInfo = "MySQL asiakaskone"; +$ServerProtocolInfo = "Tämän palvelimen käyttämä protokolla"; +$ServerRemoteInfo = "Etäosoite (palvelimen vastaanottama osoitteesi)"; +$ServerAddessInfo = "Palvelimen osoite"; +$ServerNameInfo = "Palvelimen nimi (pyyntösi mukainen)"; +$ServerPortInfo = "Palvelimen portti"; +$ServerUserAgentInfo = "Palvelimen vastaanottama käyttäjäagenttisi"; +$ServerSoftwareInfo = "Verkkopalvelimena toimiva ohjelmisto"; +$UnameInfo = "Tietoja järjestelmästä, jossa nykyinen palvelin on käynnissä."; +$DashboardPluginsUpdatedSuccessfully = "Ohjauspaneelin laajennukset päivitetty onnistuneesti"; $LoginEnter = "Kirjaudu sisään"; +$AssignSessionsToX = "Määritä istunnot %s:lle"; $CopyExercise = "Kopioi tämä harjoitus uudeksi"; $CleanStudentResults = "Tyhjennä kaikki oppijoiden vastaukset tästä harjoituksesta"; +$AttendanceSheetDescription = "Läsnäololomakkeilla voit määrittää luettelon päivämääristä, jolloin ilmoitat läsnäolot kursseillesi."; $ThereAreNoRegisteredLearnersInsidetheCourse = "Kurssilla ei ole rekisteröityjä oppijoita"; +$GoToAttendanceCalendarList = "Siirry kalenteriluetteloon läsnäolopäivistä"; +$AssignCoursesToSessionsAdministrator = "Määritä kurssit istunnon ylläpitäjälle"; +$AssignCoursesToPlatformAdministrator = "Määritä kurssit alustan ylläpitäjälle"; +$AssignedCoursesListToPlatformAdministrator = "Määritetty kurssien luettelo alustan ylläpitäjälle"; +$AssignedCoursesListToSessionsAdministrator = "Määritetty kurssien luettelo istuntojen ylläpitäjälle"; +$AssignSessionsToPlatformAdministrator = "Määritä istunnot alustan ylläpitäjälle"; +$AssignSessionsToSessionsAdministrator = "määrittää istunnot istuntojen ylläpitäjälle"; +$AssignedSessionsListToPlatformAdministrator = "Määritetty istuntojen luettelo alustan ylläpitäjälle"; +$AssignedSessionsListToSessionsAdministrator = "Luettelo istunnoista on annettu istuntojen ylläpitäjälle"; +$EvaluationsGraph = "Arviointien kaavio"; +$Url = "URL"; $ToolCourseDescription = "Kurssin kuvaus"; $ToolDocument = "Dokumentit"; $ToolLearnpath = "Oppimispolku"; @@ -3407,19 +5295,84 @@ $ToolBlogManagement = "Projektit"; $ToolTracking = "Seuranta"; $ToolCourseSetting = "Asetukset"; $ToolCourseMaintenance = "Kurssin ylläpito"; +$ImportQtiQuiz = "Tuo harjoitukset Qti2"; $AreYouSureToDeleteAllDates = "Haluatko varmasti poistaa kaikki päiväykset"; +$ISOCode = "ISO-koodi"; +$TheSubLanguageForThisLanguageHasBeenAdded = "Tämän kielen alakieli on lisätty"; +$ReturnToLanguagesList = "Paluu kieliluetteloon"; $AddADateTime = "Lisää ajankohta"; +$DeleteAllAttendances = "Poista kaikki valitut läsnäolot"; +$ActivityCoach = "Istunnon valmentajalla on kaikki oikeudet ja etuoikeudet kaikilla istuntoon kuuluvilla kursseilla."; $AllowUserViewUserList = "Salli käyttäjän nähdä käyttäjä luettelo"; $AllowUserViewUserListActivate = "Aktivoi käyttäjä lista"; $AllowUserViewUserListDeactivate = "Poista käyttäjä lista"; +$ThematicControl = "Temaattinen valvonta"; +$ThematicDetails = "Temaattinen yksityiskotainen näkymä"; +$ThematicList = "Teemakohtainen näkymä luettelona"; +$Thematic = "Temaattinen"; +$ThematicPlan = "Temaattinen suunnitelma"; +$EditThematicPlan = "Muokkaa temaattista etenemistä"; +$EditThematicAdvance = "Muokkaa temaattista etenemistä"; +$ThereIsNoStillAthematicSection = "Temaattista osiota ei vielä ole"; +$NewThematicSection = "Uusi temaattinen osio"; +$DeleteAllThematics = "Poista kaikki teemat"; +$ThematicDetailsDescription = "Yksityiskohtaiset tiedot aiheista ja niiden suunnitelmista ja edistymisestä. Jos haluat ilmoittaa aiheen valmistuneeksi, valitse sen päivämäärä aikajärjestyksessä, jolloin järjestelmä näyttää kaikki aiemmat päivämäärät valmistuneina."; +$SkillToAcquireQuestions = "Mitä taitoja on tarkoitus hankkia tämän temaattisen jakson lopussa?"; +$SkillToAcquire = "Hankittavat taidot"; +$InfrastructureQuestions = "Mitä infrastruktuuria tarvitaan tämän aiheen tavoitteiden saavuttamiseksi yleensä?"; +$Infrastructure = "Infrastruktuuri"; +$AditionalNotesQuestions = "Mitä muita elementtejä tarvitaan?"; $DurationInHours = "Kesto tunteina"; $ThereAreNoAttendancesInsideCourse = "Tällä kurssilla ei ole läsnäololistoja"; $YouMustSelectAtleastAStartDate = "Valitse alku pvm"; $ReturnToLPList = "Palaa luetteloon"; +$EditTematicAdvance = "Muokkaa temaattista etenemistä"; +$AditionalNotes = "Lisähuomautukset"; +$StartDateFromAnAttendance = "Aloituspäivämäärä, joka on otettu läsnäolopäivämäärästä"; +$StartDateCustom = "Mukautettu alkamispäivä"; +$StartDateOptions = "Aloituspäivämäärän vaihtoehdot"; +$ThematicAdvanceConfiguration = "Temaattisen etenemisen konfigurointi"; +$InfoAboutAdvanceInsideHomeCourse = "Tietoa temaattisesta etenemisestä kurssin kotisivulla"; +$DisplayAboutLastDoneAdvance = "Näytä tiedot viimeksi valmistuneesta aiheesta"; +$DisplayAboutNextAdvanceNotDone = "Näyttää tietoja seuraavasta keskeneräisestä aiheesta"; +$InfoAboutLastDoneAdvance = "Tiedot viimeksi valmistuneesta aiheesta"; +$InfoAboutNextAdvanceNotDone = "Tietoa seuraavasta keskeneräisestä aiheesta"; +$ThereIsNoAThematicSection = "Temaattista osiota ei ole"; +$ThereIsNoAThematicAdvance = "Temaattista edistymistä ei ole"; +$StillDoNotHaveAThematicPlan = "Temaattista suunnitelmaa ei toistaiseksi ole"; +$NewThematicAdvance = "Uusi temaattinen eteneminen"; $DurationInHoursMustBeNumeric = "Keston pitää olla luku"; $DoNotDisplayAnyAdvance = "Älä näytä edistymistä"; +$EditThematicSection = "Muokkaa temaattista osiota"; +$CreateAThematicSection = "Luo temaattinen osio"; $ToolCourseProgress = "Kurssin edistyminen"; +$SelectAnAttendance = "Valitse läsnäolo"; +$ReUseACopyInCurrentTest = "Uudelleenkäytä kopioita nykyisen testin sisällä"; +$YouAlreadyInviteAllYourContacts = "Olet jo kutsunut kaikki yhteystietosi"; +$CategoriesNumber = "Kategoriat"; +$ResultsHiddenByExerciseSetting = "Harjoitusasetusten piilottamat tulokset"; +$LinkOpenSelf = "Avaa nykyiseen"; +$LinkOpenBlank = "Avaa tyhjään"; +$LinkOpenParent = "Avaa pääikkunaan"; +$LinkOpenTop = "Avaa ylös"; +$ThematicSectionHasBeenCreatedSuccessfull = "Teemakohtainen osio on luotu onnistuneesti"; +$NowYouShouldAddThematicPlanXAndThematicAdvanceX = "Nyt sinun pitäisi lisätä temaattinen suunnitelma %s ja temaattinen eteneminen %s."; +$LpPrerequisiteDescription = "Toisen oppimispolun valitseminen esivaatimukseksi piilottaa nykyisen esivaatimuksen, kunnes esivaatimuksessa oleva oppimispolku on kokonaan suoritettu (100 %)."; +$ExportAllCoursesList = "Vie kaikki kurssit"; +$ExportSelectedCoursesFromCoursesList = "Vie valitut kurssit seuraavasta luettelosta"; +$CoursesListHasBeenExported = "Kurssiluettelo on viety"; +$WhichCoursesToExport = "Vietävät kurssit"; $QualificationNumeric = "Maksimi pisteet"; +$AssignUsersToPlatformAdministrator = "Käyttäjien määrittäminen alustan ylläpitäjälle"; +$AssignedUsersListToPlatformAdministrator = "Alustan ylläpitäjälle osoitetut käyttäjät"; +$AssignedCoursesListToHumanResourcesManager = "Henkilöstöpäällikölle osoitetut kurssit"; +$ThereAreNotCreatedCourses = "Valittavanasi ei ole kursseja"; +$HomepageViewVerticalActivity = "Pystysuora toimintanäkymä"; +$ScoreAverageFromAllAttempts = "Pisteiden keskiarvo kaikista yrityksistä"; +$CoursesInformation = "Tietoa kursseista"; +$LearnpathVisible = "Oppimispolku tehty näkyväksi"; +$LinkInvisible = "Linkki tehty näkymättömäksi"; +$SpecialExportsIntroduction = "Erityisen vientitoiminnon tarkoituksena on auttaa opinto-ohjaajaa viemään kaikki kurssiasiakirjat yhdellä ainoalla askeleella. Toisen vaihtoehdon avulla voit valita kurssit, jotka haluat viedä, ja viedä myös näiden kurssien istunnoissa olevat asiakirjat. Tämä on erittäin raskas toiminto, ja suosittelemme, ettet käynnistä sitä portaalin normaalien käyttöaikojen aikana. Tee se hiljaisempana aikana. Jos et tarvitse kaikkea sisältöä kerralla, yritä viedä kurssien asiakirjat suoraan kurssin ylläpitotyökalusta itse kurssin sisällä."; $Literal0 = "Nolla"; $Literal1 = "Yksi"; $Literal2 = "Kaksi"; @@ -3435,27 +5388,114 @@ $Literal11 = "yksitoista"; $Literal12 = "kaksitoista"; $Literal13 = "kolmetoista"; $Literal14 = "neljätoista"; +$Literal15 = "viisitoista"; +$Literal16 = "kuusitoista"; +$Literal17 = "seitsemäntoista"; $Literal18 = "kahdeksantoista"; $Literal19 = "yhdeksäntoista"; $Literal20 = "kaksikymmentä"; +$AllowUserCourseSubscriptionByCourseAdminTitle = "Salli käyttäjän kurssitilaus kurssin ylläpitäjän toimesta"; +$AllowUserCourseSubscriptionByCourseAdminComment = "Tämän vaihtoehdon aktivointi antaa kurssin ylläpitäjälle mahdollisuuden tilata käyttäjiä kurssin sisällä."; $DateTime = "Päiväys ja aika"; +$Item = "Kohde"; +$ConfigureDashboardPlugin = "Konfiguroi ohjauspaneelilaajennus"; +$EditBlocks = "Muokkaa lohkoja"; $Never = "Ei koskaan"; $YourAccountIsActiveYouCanLoginAndCheckYourCourses = "Hyvä käyttäjä, käyttäjätunnuksesi on nyt aktivoitu ja voit nyt kirjautua ympäristöön."; +$ShowLinkBugNotificationTitle = "Näytä linkki vikailmoituksen tekemiseen"; +$ShowLinkBugNotificationComment = "Näytä otsikossa linkki, jonka avulla voit ilmoittaa virheestä tukialustallamme (http://support.chamilo.org). Kun käyttäjä klikkaa linkkiä, hänet lähetetään tukialustalle wikisivulle, jossa kuvataan vikailmoitusprosessi."; $ReportABug = "Ilmoita bugi"; +$Letters = "Kirjaimet"; $NewHomeworkEmailAlert = "Lähetä käyttäjille sähköpostia tehtävästä"; $NewHomeworkEmailAlertEnable = "Aktivoi sähköposti käyttäjille tehtävän annosta"; $NewHomeworkEmailAlertDisable = "Estä sähköposti käyttäjille tehtävän annosta"; +$MaximumOfParticipants = "Jäsenten enimmäismäärä"; +$HomeworkCreated = "Tehtävä on luotu"; +$HomeworkHasBeenCreatedForTheCourse = "Tehtävä on lisätty kurssille"; +$PleaseCheckHomeworkPage = "Tarkista tehtävät sivu."; $ScormNotEnoughSpaceInCourseToInstallPackage = "Kurssin jäljellä oleva tila ei ole riittävä tämän paketin purkamiseen."; $ScormPackageFormatNotScorm = "Paketti jota yrität viedä ei ilmeisesti ole Scorm -formaatissa. Tarkista että ZIP -tiedosto sisältää tiedoston nimeltä imsmanifest.xml"; +$GradebookActivateScoreDisplayCustom = "Ota käyttöön osaamistason merkintä, jotta voit asettaa mukautettuja pistetietoja."; +$GradebookScoreDisplayCustomValues = "Osaamistasot mukautetut arvot"; +$GradebookNumberDecimals = "Desimaalien määrä"; +$GradebookNumberDecimalsComment = "Voit määrittää sallittujen desimaalien määrän pistemäärälle."; $ContactInformation = "Yhteystiedot"; $PersonName = "Nimesi"; $CompanyName = "Yhtiön nimi:"; $PersonRole = "Tehtävän kuvaus"; +$HaveYouThePowerToTakeFinancialDecisions = "Onko sinulla valtuudet tehdä taloudellisia päätöksiä yrityksesi puolesta?"; +$CompanyCountry = "Yrityksenne kotimaa"; +$CompanyCity = "Yrityksen kaupunki"; +$WhichLanguageWouldYouLikeToUseWhenContactingYou = "Ensisijainen yhteydenottokieli"; $SendInformation = "Lähetä tiedot"; +$YouMustAcceptLicence = "Lisenssiehdot on hyväksyttävä"; $SelectOne = "Valitse yksi"; +$ContactInformationHasBeenSent = "Yhteystiedot on lähetetty"; +$ContactInformationDescription = "Hyvä käyttäjä,
    +\n
    +Olet aloittamassa yhden markkinoiden parhaan avoimen lähdekoodin verkko-oppimisalustan käytön. Kuten monet muutkin avoimen lähdekoodin hankkeet, myös tämä hanke on saanut tuekseen suuren yhteisön opiskelijoita, opettajia, kehittäjiä ja sisällöntuottajia, jotka haluaisivat edistää hanketta paremmin.
    +\n
    +\nTietämällä hieman enemmän sinusta, joka olet yksi tärkeimmistä käyttäjistämme ja joka hallinnoit tätä verkko-oppimisjärjestelmää, voimme kertoa ihmisille, että ohjelmistomme on käytössä, ja tiedottaa sinulle, kun järjestämme tapahtumia, jotka saattavat olla sinulle tärkeitä.
    +\n
    +\nTäyttämällä tämän lomakkeen hyväksyt sen, että Chamilo-yhdistys tai sen jäsenet saattavat lähettää sinulle sähköpostitse tietoa tärkeistä tapahtumista tai päivityksistä Chamilo-ohjelmistossa tai -yhteisössä. Tämä auttaa yhteisöä kasvamaan järjestäytyneenä kokonaisuutena, jossa tiedot kulkevat, kunnioittaen jatkuvasti aikaasi ja yksityisyyttäsi.
    +\n
    +\nHuomaa, että sinun ei tarvitse täyttää tätä lomaketta. Jos haluat pysyä nimettömänä, menetämme mahdollisuuden tarjota sinulle kaikki rekisteröidyn portaalin ylläpitäjän etuoikeudet, mutta kunnioitamme päätöstäsi. Jätä tämä lomake tyhjäksi ja klikkaa \"Seuraava\"."; +$CompanyActivity = "Yrityksenne toiminta"; +$DateLock = "Lukituspäivä"; +$DateUnLock = "Lukituksen avaus päivämäärä"; +$EditSessionsToURL = "URL-osoitteen istuntojen muokkaaminen"; +$AddSessionsToURL = "Lisää istuntoja URL-osoitteeseen"; +$SessionListIn = "Luettelo istunnoista"; +$GoToStudentDetails = "Siirry oppijan tietoihin"; $DisplayAboutNextAdvanceNotDoneAndLastDoneAdvance = "Näytä viimein tehty askel ja seuraava ei tehty askel"; +$DataFiller = "Tietojen täyttäjä"; +$FillUsers = "Täytä käyttäjät"; +$ThisSectionIsOnlyVisibleOnSourceInstalls = "Tämä osio on näkyvissä vain lähdekoodista tehdyissä asennuksissa, ei alustan paketoiduissa versioissa. Sen avulla voit nopeasti täyttää alustan testitiedoilla. Käytä varovasti (tiedot todella lisätään) ja vain kehitys- tai testausasennuksissa."; +$UsersFillingReport = "Käyttäjät täyttämässä raporttia"; +$RepeatDate = "Toistopäivä"; $EndDateMustBeMoreThanStartDate = "Päättymispäivän pitää olla myöhemmin kun alkamispäivän."; +$ToAttend = "Osallistua"; +$AllUsersAreAutomaticallyRegistered = "Kaikki käyttäjät rekisteröitiin automaattisesti"; +$AssignCoach = "Määritä valmentaja"; +$Off = "Off"; +$WebServer = "Verkkopalvelin"; +$NotInserted = "Ei lisätty"; +$YourAccountOnXHasJustBeenApprovedByOneOfOurAdministrators = "Yksi ylläpitäjistämme on juuri hyväksynyt tilisi %s-sivustolla."; +$YouCanNowLoginAtXUsingTheLoginAndThePasswordYouHaveProvided = "Voit nyt kirjautua sisään osoitteessa %s antamillasi tunnuksilla ja salasanalla."; +$HaveFun = "Pidä hauskaa,"; +$AreYouSureToEditTheUserStatus = "Oletko varma, että haluat muokata käyttäjän tilaa?"; +$YouShouldCreateAGroup = "Sinun pitäisi luoda ryhmä"; +$ResetLP = "Nollaa oppimispolku"; +$LPWasReset = "Oppimispolku nollattiin oppijan osalta"; +$AnnouncementVisible = "Ilmoitus näkyvissä"; +$AnnouncementInvisible = "Ilmoitus näkymätön"; +$GlossaryDeleted = "Sanasto poistettu"; +$SessionReadOnly = "Vain luku"; +$SessionAccessible = "Saavutettavissa"; +$SessionNotAccessible = "Ei sisäänpääsyä"; +$GroupAdded = "Ryhmä lisätty"; +$AddUsersToGroup = "Lisää käyttäjiä ryhmään"; +$ErrorReadingZip = "Virhe ZIP-tiedoston lukemisessa"; +$ErrorStylesheetFilesExtensionsInsideZip = "ZIP-tiedoston ainoat hyväksytyt laajennukset ovat .jp(e)g, .png, .gif ja .css."; +$ClearSearchResults = "Tyhjennä hakutulokset"; +$DisplayCourseOverview = "Kurssien yleiskatsaus"; +$DisplaySessionOverview = "Istuntojen yleiskatsaus"; +$TotalNumberOfMessages = "Viestien kokonaismäärä"; +$TotalNumberOfAssignments = "Tehtävien kokonaismäärä"; +$TestServerMode = "Testipalvelin -tila"; +$PageExecutionTimeWas = "Sivun suoritusaika oli"; $MemoryUsage = "Muistin käyttö"; +$MemoryUsagePeak = "Muistin käyttöpiikki"; +$Seconds = "sekuntia"; +$QualifyInGradebook = "Anna arvosana arviointityökalussa"; +$TheTutorOnlyCanKeepTrackOfStudentsRegisteredInTheCourse = "Avustaja voi seurata vain kurssille rekisteröityneiden oppijoiden edistymistä."; +$TheTeacherCanQualifyEvaluateAndKeepTrackOfAllStudentsEnrolledInTheCourse = "Opettaja voi arvostella, arvioida ja seurata kaikkia kurssille ilmoittautuneita oppijoita."; +$IncludedInEvaluation = "Sisältyvät arviointiin"; +$ExerciseEditionNotAvailableInSession = "Et voi muokata tätä kurssin harjoitusta istunnon sisällä."; +$SessionSpecificResource = "Istuntokohtainen resurssi"; +$EditionNotAvailableFromSession = "Painos ei ole saatavilla istunnosta, muokkaa sitä pääkurssista."; +$FieldTypeSocialProfile = "Sosiaalisen verkoston linkki"; +$HandingOverOfTaskX = "Tehtävän %s luovuttaminen"; $CopyToMyFiles = "Kopioi henkilökohtaiselle alueelleni"; $Export2PDF = "Vie PDF tiedostoksi"; $ResourceShared = "Resurssi jaettu"; @@ -3464,14 +5504,35 @@ $CopyFailed = "Kopiointi epäonnistui"; $CopyMade = "Kopioitu"; $OverwritenFile = "Tiedosto korvattu"; $MyFiles = "Tiedostoni"; +$AllowUsersCopyFilesTitle = "Salli käyttäjien kopioida tiedostoja kurssilta henkilökohtaiselle tiedostoalueellesi."; +$AllowUsersCopyFilesComment = "Mahdollistaa käyttäjien kopioida tiedostoja kurssilta henkilökohtaiselle tiedostoalueellesi, joka näkyy sosiaalisen verkoston tai HTML-editorin kautta, kun he ovat poissa kurssilta."; +$PreviewImage = "Esikatselukuva"; $UpdateImage = "Vaihda kuva"; +$EnableTimeLimits = "Ota aikarajat käyttöön"; +$ProtectedDocument = "Suojattu dokumentti"; +$LastLogins = "Viimeisimmät kirjautumiset"; +$AllLogins = "Kaikki kirjautumiset"; $Draw = "Piirä"; $ThereAreNoCoursesInThisCategory = "Tässä kategoriassa ei ole kursseja"; +$ConnectionsLastMonth = "Yhteydet viime kuussa"; $TotalStudents = "Oppijoita yhteensä"; +$FilteringWithScoreX = "Suodatus pistemäärällä %s"; +$ExamTaken = "Otettu"; +$ExamNotTaken = "Ei otettu"; +$ExamPassX = "Hyväksytty vähimmäismäärä %s"; $ExamFail = "Hylätty"; +$ExamTracking = "Tenttien seuranta"; $NoAttempt = "Ei yrityksiä"; $PassExam = "Hyväksytty"; +$CreateCourseRequest = "Luo kurssipyyntö"; +$TermsAndConditions = "Käyttöehdot"; +$ReadTermsAndConditions = "Lue käyttöehdot"; +$IAcceptTermsAndConditions = "Olen lukenut ja hyväksyn käyttöehdot."; +$YouHaveToAcceptTermsAndConditions = "Sinun on hyväksyttävä käyttöehtomme jatkaaksesi."; $CourseRequestCreated = "Pyyntösi uudesta kurssista on lähetetty onnistuneesti. Saat vastauksen lähipäivinä."; +$ReviewCourseRequests = "Saapuvien kurssipyyntöjen tarkastelu"; +$AcceptedCourseRequests = "Hyväksytyt kurssipyynnöt"; +$RejectedCourseRequests = "Hylätyt kurssipyynnöt"; $CreateThisCourseRequest = "Luo tämä kurssipyyntö"; $CourseRequestDate = "Pyynnön päiväys"; $AcceptThisCourseRequest = "Hyväksy tämä kurssi"; @@ -3479,6 +5540,7 @@ $ANewCourseWillBeCreated = "Uusi kurssi: %s on valmis luotavaksi. Tahdotko jatka $AdditionalInfoWillBeAsked = "Lisätietoa kurssista %s tullaan pyytämään sähköpostilla. Tahdotko jatkaa?"; $AskAdditionalInfo = "Kysy lisätietoja"; $BrowserDontSupportsSVG = "Selaimesi ei tue SVG-tiedostoja. Piirto-työkalun käyttöön suositellaan selaimeksi Firefox tai Chrome"; +$BrowscapInfo = "Browscap lataa browscap.ini-tiedoston, joka sisältää suuren määrän tietoja selaimesta ja sen ominaisuuksista, joten sitä voidaan käyttää funktiolla get_browser () PHP"; $DeleteThisCourseRequest = "Poista tämä kurssi pyyntö"; $ACourseRequestWillBeDeleted = "Kurssi pyyntö %s poistetaan. Tahdotko jatkaa?"; $RejectThisCourseRequest = "Hylkää tämä kurssipyyntö"; @@ -3499,13 +5561,17 @@ $CourseRequestMailOpening = "Olemme vastaanottaneet seuraavaan kurssipyynnön:"; $CourseRequestPageForApproval = "Tämän kurssipyynnön voi hyväksyä seuraavalla sivulla:"; $PleaseActivateCourseValidationFeature = "Kurssin hyväksyntä toiminto ei ole tällä hetkellä käytössä. Käyttääksesi tätä toimintoa ota se käytöön %s toiminnolla."; $CourseRequestLegalNote = "Tätä kurssipyyntöä koskevat tiedot ovat luottamuksellisia. Niitä voidaan käyttää vain uuden kurssin luomiseen meidän oppimisportaalissa, eikä niitä tule jakaa kolmannen osapuolen kanssa."; +$EnableCourseValidation = "Kurssien validointi"; +$EnableCourseValidationComment = "Kun 'Kurssien hyväksyntä' -ominaisuus on käytössä, opettaja ei voi luoda kurssia yksin. Hän täyttää kurssipyynnön. Alustan ylläpitäjä käy läpi pyynnön ja hyväksyy sen tai hylkää sen.
    +Tämä toiminto perustuu automaattiseen sähköpostiviestintään; aseta Chamilo käyttämään sähköpostipalvelinta ja omistettua sähköpostitiliä."; $CourseRequestAskInfoEmailSubject = "%s lisätietopyyntö uudesta kurssipyynnöstä %s"; -$CourseRequestAskInfoEmailText = "Olemme vastaanottaneet kurssipyynnön koodilla %s. Ennen hyväksymistä tarvitsemme lisätietoja. /n/n -Kerro lyhyesti kurssin sisällöstä, tavoitteista, oppijoista tai kurssin käyttäjistä. Jos mahdollista mainitse myös yksikkö, jonka puolesta teit pyynnön."; +$CourseRequestAskInfoEmailText = "Olemme vastaanottaneet kurssipyynnön koodilla %s. Ennen hyväksymistä tarvitsemme lisätietoja. /n/n\r\nKerro lyhyesti kurssin sisällöstä, tavoitteista, oppijoista tai kurssin käyttäjistä. Jos mahdollista mainitse myös yksikkö, jonka puolesta teit pyynnön."; $CourseRequestAcceptedEmailSubject = "%s Kurssipyyntö %s on hyväksytty"; $CourseRequestAcceptedEmailText = "Kurssipyyntösi %s on hyväksytty. Uusi kurssi %s on luotu ja sinut on rekisteröity sen ohjaajaksi. /n/n Pääset uudelle kurssille osoitteessa: %s"; $CourseRequestRejectedEmailSubject = "%s Kurssipyyntö %s on hylätty."; $CourseRequestRejectedEmailText = "Valitettavasti tekemäsi kurssipyyntö %s on hylätty."; +$CourseValidationTermsAndConditionsLink = "Kurssin validointi - linkki käyttöehtoihin."; +$CourseValidationTermsAndConditionsLinkComment = "Tämä on URL-osoite \"Käyttöehdot\" -asiakirjaan, joka on voimassa kurssipyyntöä tehtäessä. Jos osoite on asetettu tähän, käyttäjän on luettava ja hyväksyttävä nämä ehdot ennen kurssipyynnön lähettämistä. Jos otat käyttöön Chamilon \"Terms and Conditions\" -moduulin ja haluat, että sen URL-osoitetta käytetään, jätä tämä asetus tyhjäksi."; $CourseCreationFailed = "Kurssia ei luotu johtuen virheestä"; $CourseRequestCreationFailed = "Kurssipyyntöä ei tehty johtuen virheestä."; $CourseRequestEdit = "Muokkaa kurssipyyntöä"; @@ -3514,20 +5580,93 @@ $FileExistsChangeToSave = "Tämän niminen tiedosto on jo olemassa. Valitse toin $CourseRequestUpdateFailed = "Kurssipyyntöä ei päivitetty johtuen virheestä."; $CourseRequestUpdated = "Kurssipyyntö %s on päivitetty."; $FillWithExemplaryContent = "Täytä esittely sisällöllä"; +$EnableSSOTitle = "Yksittäinen kirjautuminen (SSO)"; +$EnableSSOComment = "Single Sign On -toiminnon ottaminen käyttöön mahdollistaa tämän alustan liittämisen todennuksen pääkäyttäjän orjaksi, esimerkiksi Drupal-verkkosivuston, jossa on Drupal-Chamilo-laajennus, tai muun vastaavan pääkäyttäjäasetelman orjaksi."; +$SSOServerDomainTitle = "Single Sign On -palvelimen toimialue"; +$SSOServerDomainComment = "Single Sign On -palvelimen verkkotunnus (toisen palvelimen verkko-osoite, joka mahdollistaa automaattisen rekisteröitymisen Chamiloon). Tämän pitäisi yleensä olla toisen palvelimen osoite ilman peräkkäistä vinoviivaa ja ilman protokollaa, esim. www.example.com."; +$SSOServerAuthURITitle = "Single Sign On -palvelimen todennuksen URL-osoite"; +$SSOServerAuthURIComment = "Sen sivun osoite, joka käsittelee todennuksen tarkistamista. Esimerkiksi /?q=user Drupalin tapauksessa."; +$SSOServerUnAuthURITitle = "Single Sign On -palvelimen uloskirjautumis-URL"; +$SSOServerUnAuthURIComment = "Sen palvelimella olevan sivun osoite, joka kirjaa käyttäjän ulos. Tämä vaihtoehto on hyödyllinen, jos haluat, että Chamilosta uloskirjautuvat käyttäjät kirjautuvat automaattisesti ulos todentamispalvelimelta."; +$SSOServerProtocolTitle = "Single Sign On -palvelimen protokolla"; +$SSOServerProtocolComment = "Single Sign On -palvelimen verkkotunnuksen etuliiteprotokollan merkkijono (suosittelemme käyttämään https://, jos palvelimesi pystyy tarjoamaan tämän ominaisuuden, sillä kaikki muut kuin suojatut protokollat ovat vaarallisia todennusasioissa)."; +$EnabledWirisTitle = "WIRIS matemaattinen editori"; +$EnabledWirisComment = "Ota käyttöön WIRIS-matemaattinen editori. Tämän lisäosan asentamalla saat WIRIS-editorin ja WIRIS CAS:n. Tämä aktivointi ei toteudu täysin, ellei sitä ennen ole ladattu PHP plugin for CKeditor WIRIS ja purettu sen sisältöä Chamilon hakemistossa main/inc/lib/javascript/ckeditor/plugins/. Tämä on välttämätöntä, koska Wiris on suojattu ohjelmisto ja sen palvelut ovat kaupallisia. Jos haluat tehdä lisäosan säätöjä, muokkaa configuration.ini-tiedostoa tai korvaa sen sisältö Chamilon mukana toimitetulla tiedostolla configuration.ini.default."; $FileSavedAs = "Tiedosto tallennettu nimellä"; $FileExportAs = "Vie tiedosto"; +$AllowSpellCheckTitle = "Oikeinkirjoituksen tarkistus"; +$AllowSpellCheckComment = "Ota oikeinkirjoituksen tarkistus käyttöön"; +$EnabledSVGTitle = "Luo ja muokkaa SVG-tiedostoja"; +$EnabledSVGComment = "Tämän vaihtoehdon avulla voit luoda ja muokata SVG (Scalable Vector Graphics) -monikerroksisia verkkokuvia sekä viedä ne png-muotoisiksi kuviksi."; +$ForceWikiPasteAsPlainTextTitle = "Pakottaminen liittäminen wikiin pelkkänä tekstinä (CTRL+V plain text)"; +$ForceWikiPasteAsPlainTextComment = "Tämä estää monet piilotetut, virheelliset tai epätyypilliset tunnisteet, jotka on kopioitu muista teksteistä, jotta wikin teksti ei turmeltuisi monien muutosten jälkeen; mutta se menettää joitakin ominaisuuksia muokkauksen aikana."; +$EnabledGooglemapsTitle = "Aktivoi Google maps"; +$EnabledGooglemapsComment = "Aktivoi painike Google-karttojen lisäämiseksi. Aktivointi ei ole täysin toteutunut, jos et ole aiemmin muokannut tiedostoa main/inc/lib/fckeditor/myconfig.php ja lisännyt Google maps API-avainta."; +$EnabledImageMapsTitle = "Aktivoi kuvakartat"; +$EnabledImageMapsComment = "Aktivoi painike lisätäksesi kuvakarttoja. Näin voit liittää URL-osoitteita kuvan alueisiin ja luoda hotspotteja."; +$RemoveSearchResults = "Pyyhi hakutulokset"; +$ExerciseCantBeEditedAfterAddingToTheLP = "Harjoitusta ei voi muokata sen jälkeen, kun se on lisätty oppimispolkuun."; +$CourseTool = "Kurssityökalu"; +$LPExerciseResultsBySession = "Oppimispolkuja koskevien harjoitusten tulokset istuntokohtaisesti"; +$LPQuestionListResults = "Oppimispolkujen harjoitusten tulosluettelo"; +$PleaseSelectACourse = "Valitse kurssi"; +$StudentScoreAverageIsCalculatedBaseInAllLPsAndAllAttempts = "Oppijan pistekeskiarvo lasketaan kaikkien oppimispolkujen ja kaikkien yritysten perusteella."; +$AverageScore = "Keskimääräinen koepistemäärä"; +$LastConnexionDate = "Viimeinen yhteydenottopäivä"; $ToolVideoconference = "Videoneuvottelu"; +$BigBlueButtonEnableTitle = "BigBlueButton-videokonferenssityökalu"; +$BigBlueButtonEnableComment = "Valitse, haluatko ottaa BigBlueButton-videokonferenssityökalun käyttöön. Kun se on otettu käyttöön, se näkyy ylimääräisenä kurssityökaluna kaikkien kurssien etusivulla, ja opettajat voivat käynnistää konferenssin milloin tahansa. Oppijat eivät voi käynnistää konferenssia, vaan ainoastaan liittyä siihen. Jos sinulla ei ole BigBlueButton-palvelinta, voit asentaa sen tai kysyä Chamilon virallisilta palveluntarjoajilta tarjousta. BigBlueButton on ilmainen (kuten vapaus *ja* olut), mutta sen asentaminen vaatii teknisiä taitoja, jotka eivät välttämättä ole heti kaikkien saatavilla. Voit asentaa sen itse tai hakea ammattiapua, joka auttaa sinua tai tekee sen puolestasi. Tämä apu aiheuttaa kuitenkin tiettyjä kustannuksia. Puhtaasti ilmaisen ohjelmiston logiikan mukaisesti tarjoamme sinulle työkaluja, jotka helpottavat työtäsi, ja suosittelemme ammattilaisia (Chamilon virallisia palveluntarjoajia), jotka voivat auttaa sinua, jos tämä olisi liian vaikeaa."; +$BigBlueButtonHostTitle = "BigBlueButton-palvelimen isäntä"; +$BigBlueButtonHostComment = "Tämä on sen palvelimen nimi, jossa BigBlueButton-palvelimesi toimii. Voi olla localhost, IP-osoite (esim. 192.168.13.54) tai verkkotunnus (esim. my.video.com)."; +$BigBlueButtonSecuritySaltTitle = "BigBlueButton-palvelimen turva-avain"; +$BigBlueButtonSecuritySaltComment = "Tämä on BigBlueButton-palvelimesi suojausavain, jonka avulla palvelimesi voi todentaa Chamilo-asennuksen. Katso BigBlueButtonin dokumentaatiota sen löytämiseksi."; $SelectSVGEditImage = "Valitse kuva"; +$OnlyAccessFromYourGroup = "Pääsee vain omasta ryhmästäsi"; +$CreateAssignmentPage = "Tämä luo erityisen wikisivun, jossa opettaja voi kuvata tehtävän ja joka linkitetään automaattisesti wikisivuille, joilla oppijat suorittavat tehtävän. Sekä opettajan että oppijoiden sivut luodaan automaattisesti. Näissä tehtävissä oppijat voivat vain muokata ja tarkastella omia sivujaan, mutta tätä voidaan tarvittaessa muuttaa helposti."; +$UserFolders = "Käyttäjien kansiot"; $UserFolder = "Käyttäjän kansio"; -$HelpFolderCertificates = "TÄMÄ NÄKYY VAIN OHJAAJILLE: +$HelpUsersFolder = "AINOASTAAN OPETTAJAN NÄHTÄVILLÄ OLEVAT TIEDOT:\nKäyttäjäkansio sisältää kansion jokaiselle käyttäjälle, joka on päässyt siihen käsiksi dokumenttityökalun kautta tai kun jokin tiedosto on lähetetty kurssilla verkkoeditorin kautta. Jos kumpaakaan tilannetta ei ole tapahtunut, käyttäjäkansiota ei ole luotu. Ryhmien tapauksessa editorin kautta lähetetyt tiedostot lisätään kunkin ryhmän kansioon, johon pääsevät käsiksi vain kyseisen ryhmän opiskelijat. -Tämä kansio sisältää todistuspohjia jotka on tehty arvostelutyökalua varten. Tätä ei kannata muuttaa näkyväksi kaikille."; +Käyttäjäkansio ja jokainen siihen sisältyvä kansio on oletusarvoisesti piilotettu kaikilta opiskelijoilta, mutta jokainen opiskelija näkee oman hakemistonsa sisällön verkkoeditorin kautta. Jos opiskelija kuitenkin tietää toisen opiskelijan tiedoston tai kansion osoitteen, hän voi päästä siihen käsiksi. + +Jos opiskelijan kansio on näkyvissä, muut opiskelijat voivat nähdä, mitä se sisältää. Tällöin kansion omistava oppilas voi myös (asiakirjatyökalusta ja vain omassa kansiossaan): luoda ja muokata verkkodokumentteja, muuntaa asiakirjan mallipohjaksi henkilökohtaiseen käyttöön, luoda ja muokata piirroksia SVG- ja PNG-muodossa, äänittää äänitiedostoja WAV-muodossa, tehdä tekstistä MP3-äänitiedostoja, tehdä webbikamerasta snapshoppeja, lähettää asiakirjoja, luoda kansioita, siirtää kansioita ja tiedostoja, poistaa kansioita ja tiedostoja sekä ladata varmuuskopion omasta kansiostaan. + +Lisäksi asiakirjatyökalu on synkronoitu onlineeditorin tiedostonhallinnan kanssa, joten jommassakummassa näistä käynnistetyt muutokset asiakirjoissa vaikuttavat molempiin. + +Näin ollen käyttäjäkansio ei ole pelkästään paikka tiedostojen tallentamiseen, vaan siitä tulee opiskelijoiden kurssin aikana käyttämien asiakirjojen täysi hallinnoija. Lisäksi muista, että mikä tahansa käyttäjä voi kopioida tiedoston, joka on näkyvissä missä tahansa kansiossa dokumenttityökalussa (riippumatta siitä, onko hän omistaja) omaan portfolioonsa tai henkilökohtaiseen dokumenttialueeseensa sosiaalisessa verkostossa. Tämä tiedosto on sen jälkeen hänelle käytettävissä muissa kursseissa."; +$HelpFolderChat = "AINOASTAAN OPETTAJAN NÄHTÄVISSÄ OLEVAT TIEDOT:\nTämä kansio sisältää kaikki istunnot, jotka on avattu chatissa. Vaikka chat-istunnot voivat usein olla vähäpätöisiä, toiset voivat olla todella mielenkiintoisia ja sen arvoisia, että ne liitetään ylimääräiseksi työasiakirjaksi. Jos haluat tehdä näin muuttamatta tämän kansion näkyvyyttä, tee tiedosto näkyväksi ja linkitä se sieltä, mistä katsot sen sopivaksi. Tätä kansiota ei ole suositeltavaa tehdä näkyväksi kaikille."; +$HelpFolderCertificates = "TÄMÄ NÄKYY VAIN OHJAAJILLE:\r\n\r\nTämä kansio sisältää todistuspohjia jotka on tehty arvostelutyökalua varten. Tätä ei kannata muuttaa näkyväksi kaikille."; $DestinationDirectory = "Kohde kansio"; +$CertificatesFiles = "Todistukset"; $ChatFiles = "Keskustelu historia"; $Flash = "Flash"; $Video = "Video"; $Images = "Kuvat"; +$Text2AudioTitle = "Ota käyttöön verkkopalvelut tekstistä puheeksi muuntamista varten"; +$Text2AudioComment = "Online-työkalu tekstin muuntamiseen puheeksi. Käyttää puhesynteesitekniikkaa kurssillesi tallennettujen äänitiedostojen tuottamiseen."; +$ShowUsersFoldersTitle = "Näytä käyttäjien kansiot Dokumentit-työkalussa"; +$ShowUsersFoldersComment = "Tämän vaihtoehdon avulla voit näyttää tai piilottaa opettajille kansiot, jotka järjestelmä luo jokaiselle käyttäjälle, joka vierailee työkalun asiakirjoissa tai lähettää tiedoston web-editorin kautta. Jos näytät nämä kansiot opettajille, he voivat tehdä ne näkyviksi tai olla näyttämättä oppijoille ja antaa jokaiselle oppijalle tietyn paikan kurssilla, jossa ei ainoastaan säilytetä asiakirjoja, vaan jossa he voivat myös luoda ja muokata verkkosivuja ja viedä niitä pdf-muotoon, tehdä piirroksia, tehdä henkilökohtaisia web-malleja, lähettää tiedostoja sekä luoda, siirtää ja poistaa hakemistoja ja tiedostoja ja tehdä turvakopioita kansioista. Jokaisella käyttäjällä on tietenkin täydellinen asiakirjahallinta. Muista myös, että kuka tahansa käyttäjä voi kopioida tiedoston, joka on näkyvissä mistä tahansa kansiosta asiakirjatyökalussa (riippumatta siitä, onko se omistaja) hänen portfolioihinsa tai henkilökohtaisten asiakirjojen alueeseen sosiaalisessa verkostossa, joka on käytettävissä hänen voi käyttää sitä muilla kursseilla."; +$ShowDefaultFoldersTitle = "Näytä oletusarvoisesti dokumenttityökalussa kaikki kansiot, jotka sisältävät lisättyjä multimediaresursseja."; +$ShowDefaultFoldersComment = "Multimediatiedostokansiot, jotka sisältävät oletusarvoisesti toimitettuja tiedostoja, jotka on järjestetty video-, ääni-, kuva- ja flash-animaatioluokkiin ja joita voi käyttää kursseilla. Vaikka teet sen näkymättömäksi dokumenttityökalussa, voit silti käyttää näitä resursseja alustan web-editorissa."; +$ShowChatFolderTitle = "Näytä chat-keskustelujen historiakansio"; +$ShowChatFolderComment = "Tämä näyttää opettajalle kansion, joka sisältää kaikki istunnot, jotka on tehty chatissa. Opettaja voi tehdä niistä näkyviä tai ei ja käyttää niitä resurssina."; +$EnabledStudentExport2PDFTitle = "Salli oppijoiden viedä verkkodokumentteja PDF-muotoon dokumentti- ja wikityökalujen avulla."; +$EnabledStudentExport2PDFComment = "Tämä ominaisuus on oletusarvoisesti käytössä, mutta jos palvelinta ylikuormitetaan, sitä tai tiettyjä oppimisympäristöjä voidaan käyttää väärin. Haluat ehkä poistaa käytöstä kaikkien kurssien osalta."; +$EnabledInsertHtmlTitle = "Salli widgettien lisääminen"; +$EnabledInsertHtmlComment = "Tämän avulla voit upottaa verkkosivuillesi suosikkivideoita ja sovelluksia, kuten vimeo tai slideshare, sekä kaikenlaisia widgettejä ja vempaimia."; +$CreateAudio = "Luo äänitiedosto"; +$InsertText2Audio = "Kirjoita teksti, jonka haluat muuntaa äänitiedostoksi."; +$HelpText2Audio = "Muunna teksti puheeksi"; $BuildMP3 = "Tee mp3"; +$Voice = "Ääni"; +$Female = "Nainen"; +$Male = "Mies"; +$IncludeAsciiMathMlTitle = "Lataa Mathjax-kirjasto kaikille järjestelmäsivuille."; +$IncludeAsciiMathMlComment = "Aktivoi tämä asetus, jos haluat näyttää MathML-pohjaisia matemaattisia kaavoja ja ASCIIsvg-pohjaisia matemaattisia grafiikoita \"Dokumentit\"-työkalussa sekä myös muualla järjestelmässä."; +$CourseHideToolsTitle = "Piilota työkalut opettajilta"; +$CourseHideToolsComment = "Ruksita työkalut, jotka haluat piilottaa opettajilta. Tämä estää työkalun käytön."; +$GoogleAudio = "Käytä Googlen äänipalveluja"; +$vozMe = "Käytä vozMe-äänipalveluja"; $HelpGoogleAudio = "Tukee 100 merkkiä usealla kielellä. Tiedosto luodaan ja tallennetaan siihen kansioon missä juuri olet."; $HelpvozMe = "Tukee useita tuhansia merkkiä pitkiä tekstejä. Voit myös valita mies- tai naisäänen. Tukee vähemmän eri kieliä ja äänen laatu on huonompi. Sinun pitää käsin kopioida tiedostot."; $SaveMP3 = "Tallenna mp3"; @@ -3540,45 +5679,175 @@ $SlowDown = "Hitaampi"; $Pediaphon = "Käytä Pediaphon äänipalvelua"; $HelpPediaphon = "Tukee useita tuhansia merkkejä pitkiä tekstejä. Erityyppisiä ääniä riippuen kielestä. Äänitiedostot luodaan ja tallennetaan Chamilo kansioon missä olet automaattisesti."; $FirstSelectALanguage = "Valitse kieli"; +$MoveUserStats = "Siirrä käyttäjien tuloksia istunnosta/istuntoon"; +$CompareUserResultsBetweenCoursesAndCoursesInASession = "Tämän kehittyneen työkalun avulla voit parantaa käyttäjien tulosten seurantaa manuaalisesti, kun siirryt kurssimenetelmästä istuntomenetelmään. Useimmissa tapauksissa sinun ei tarvitse käyttää sitä. Tässä näytössä voit vertailla käyttäjien tuloksia erillisen kurssin kontekstin ja saman kurssin kontekstin välillä istunnon sisällä. Kun olet varma siitä, mitä tehdä, voit valita, haluatko siirtää opiskelijoiden seurantatiedot (harjoitustulokset ja oppimispolkujen seuranta) kurssista istuntoon."; +$PDFExportWatermarkEnableTitle = "Ota vesileima käyttöön PDF-vientiä varten"; +$PDFExportWatermarkEnableComment = "Ottamalla tämän vaihtoehdon käyttöön voit ladata kuvan tai tekstin, joka lisätään automaattisesti vesileimaksi kaikkiin järjestelmässä oleviin PDF-asiakirjoihin."; +$AddWaterMark = "Lataa vesileimakuva"; +$PDFExportWatermarkByCourseTitle = "Vesileiman määrittely kurssikohtaisesti"; +$PDFExportWatermarkByCourseComment = "Kun tämä vaihtoehto on käytössä, opettajat voivat määritellä oman vesileiman kurssiensa dokumenteille."; +$PDFExportWatermarkTextTitle = "PDF-vesileiman teksti"; +$PDFExportWatermarkTextComment = "Tämä teksti lisätään vesileimana PDF-tiedostoihin."; +$ExerciseMinScoreTitle = "Harjoitusten vähimmäispisteet"; +$ExerciseMinScoreComment = "Määritä vähimmäispistemäärä (yleensä 0) kaikille alustan harjoituksille. Tämä määrittää, miten lopulliset tulokset näytetään käyttäjille ja opettajille."; +$ExerciseMaxScoreTitle = "Harjoitusten enimmäispisteet"; +$ExerciseMaxScoreComment = "Määritä maksimipistemäärä (yleensä 10,20 tai 100) kaikille alustan harjoituksille. Tämä määrittää, miten lopulliset tulokset näytetään käyttäjille ja opettajille."; $AddPicture = "lisää kuva"; $LPAutoLaunch = "Aktivoi oppimispolun automaattikäynnistys"; +$UseMaxScore100 = "Käytä oletusarvoista enimmäispistemäärää 100"; +$EnableLPAutoLaunch = "Ota oppimispolun automaattinen käynnistys käyttöön"; +$DisableLPAutoLaunch = "Poista oppimispolun automaattinen käynnistys käytöstä"; $TheLPAutoLaunchSettingIsONStudentsWillBeRedirectToAnSpecificLP = "Oppimispolun automaattikäynnistys on kytketty päälle. Kun opiskelija avaa kurssin hänet ohjataan automaattisesti oppimispolulle,joka on merkitty automaattisesti käynnistyväksi."; +$UniqueAnswerNoOption = "Uniikki vastaus \"ei tietoa\" -optiolla"; +$MultipleAnswerTrueFalse = "Monivastaukset tosi/epätosi/ei osaa sanoa"; +$MultipleAnswerCombinationTrueFalse = "Yhdistelmä tosi/epätosi/ei-tiedä."; $DontKnow = "En osaa sanoa"; +$ExamNotAvailableAtThisTime = "Tentti ei ole saatavilla tällä hetkellä"; $LoginOrEmailAddress = "Käyttäjätunnus tai sähköpostiosoite"; $Activate = "Ota käyttöön"; $Deactivate = "Poista käytöstä"; $ConfigLearnpath = "Oppimispolun asetukset"; +$CareersAndPromotions = "Urat ja ylennykset"; +$Careers = "Urat"; +$Promotions = "Ylennykset"; +$Updated = "Päivitys onnistui"; +$Career = "Ura"; +$SubscribeSessionsToPromotions = "Tilaa istuntoja ylennyksiin"; +$SessionsInPlatform = "Istuntoja ei ole tilattu"; +$FirstLetterSessions = "Istunnon nimen ensimmäinen kirjain"; +$SessionsInPromotion = "Tämän kampanjan istunnot"; +$SubscribeSessionsToPromotion = "Ilmoita istuntoja kampanjaan"; +$NoEndTime = "Ei päättymisaikaa"; +$SubscribeUsersToClass = "Ilmoita käyttäjät luokkaan"; +$SubscribeClassToCourses = "Ilmoita luokka kursseille"; +$SubscribeClassToSessions = "Ilmoita luokka istuntoihin"; +$SessionsInGroup = "Istunnot ryhmässä"; +$CoursesInGroup = "Kurssit ryhmässä"; +$UsersInGroup = "Käyttäjät ryhmässä"; +$UsersInPlatform = "Käyttäjät alustalla"; $Profile = "Profiili"; +$CreatedAt = "Luotu osoitteessa"; +$UpdatedAt = "Päivitetty osoitteessa"; +$CreatedOn = "Luotu"; +$UpdatedOn = "Päivitetty"; +$Paint = "Paint"; $MyResults = "Tulokseni"; $LearningPaths = "Oppimispolut"; $AllLearningPaths = "Kaikki oppimispolut"; +$ByCourse = "Kurssin mukaan"; +$MyQCM = "My MCQ"; +$LearnpathUpdated = "Oppimispolku päivitetty"; +$YouNeedToCreateACareerFirst = "Sinun on luotava ura, ennen kuin voit lisätä ylennyksiä (ylennykset ovat uran alaelementtejä)."; +$OutputBufferingInfo = "Lähtöpuskuriasetus on \"Päällä\", jos se on käytössä, tai \"Pois\", jos se on pois käytöstä. Tämä asetus voidaan ottaa käyttöön myös kokonaislukuarvolla (esimerkiksi 4096), joka on lähtöpuskurin koko."; +$LoadedExtension = "Laajennus ladattu"; $AddACourse = "Lisää kurssi"; +$PerWeek = "Viikossa"; +$SubscribeGroupToSessions = "Ilmoita ryhmä istuntoihin"; +$SubscribeGroupToCourses = "Ilmoita ryhmä kursseille"; +$CompareStats = "Vertaa tilastoja"; $RenameAndComment = "Nimeä uudellen ja kommentoi"; +$PhotoRetouching = "Valokuvien retusointi"; +$EnabledPixlrTitle = "Ota käyttöön ulkoiset Pixlr-palvelut"; +$EnabledPixlrComment = "Pixlr mahdollistaa valokuvien muokkaamisen, säätämisen ja suodattamisen Photoshopin kaltaisilla ominaisuuksilla. Se on ihanteellinen lisä bittikarttoihin perustuvien kuvien käsittelyyn."; +$PromotionXArchived = "%s-kampanja on arkistoitu. Tämän toimenpiteen seurauksena kaikki tähän kampanjaan rekisteröidyt istunnot muuttuvat näkymättömiksi. Voit peruuttaa tämän poistamalla tämän kampanjan arkistoinnin."; +$PromotionXUnarchived = "%s-kampanja on palautettu arkistosta. Tämän toimenpiteen seurauksena kaikki tähän kampanjaan rekisteröidyt istunnot tulevat näkyviin. Voit peruuttaa tämän arkistoimalla kampanjan."; +$CareerXArchived = "Ura %s on arkistoitu. Tämän toimenpiteen seurauksena ura, sen ylennykset ja kaikki tähän ylennykseen rekisteröidyt istunnot muuttuvat näkymättömiksi. Voit peruuttaa tämän poistamalla uran arkistoinnin."; +$CareerXUnarchived = "Ura %s on palautettu arkistosta. Tämän toimenpiteen seurauksena ura, sen ylennykset ja kaikki tähän ylennykseen rekisteröidyt istunnot tulevat näkyviin. Voit peruuttaa tämän toiminnon arkistoimalla uran."; $SeeAll = "Näytä kaikki"; +$SeeOnlyArchived = "Katso vain arkistoidut"; +$SeeOnlyUnarchived = "Katso vain arkistoimattomat"; $LatestAttempt = "Viimeisin yritys"; $PDFWaterMarkHeader = "Ylätunnisteen vesileima PDF-tiedostoissa"; $False = "Väärin"; +$DoubtScore = "En tiedä"; +$RegistrationByUsersGroups = "Ilmoittautuminen luokittain"; +$ContactInformationHasNotBeenSent = "Yhteystietojasi ei voitu lähettää. Tämä johtuu todennäköisesti tilapäisestä verkko-ongelmasta. Yritä uudelleen muutaman sekunnin kuluttua. Jos ongelma ei poistu, jätä tämä rekisteröintiprosessi huomiotta ja siirry seuraavaan vaiheeseen napsauttamalla painiketta."; +$FillCourses = "Täytä kurssit"; +$FillSessions = "Täytä istunnot"; $FileDeleted = "Tiedosto poistettu"; +$MyClasses = "Omat luokkani"; +$Archived = "Arkistoitu"; +$Unarchived = "Arkistoimattomat"; +$PublicationDate = "Julkaisupäivä"; $MySocialGroups = "Sosiaaliset ryhmäni"; $SocialGroups = "Sosiaaliset ryhmät"; $CreateASocialGroup = "Luo sosiaalinen ryhmä"; -$HotSpotDelineation = "Interaktiivisen alueen hahmotelma"; -$CorrectAndRate = "Korjaa ja arvioi"; +$StatsUsersDidNotLoginInLastPeriods = "Ei kirjautunut sisään vähään aikaan"; +$LastXMonths = "Viimeiset %d kuukautta"; +$NeverConnected = "Ei koskaan yhdistetty"; +$EnableAccessibilityFontResizeTitle = "Fontin koon muuttamisen saavutettavuusominaisuus"; +$EnableAccessibilityFontResizeComment = "Ota tämä vaihtoehto käyttöön, jotta kampuksen oikeassa yläkulmassa näkyy joukko fonttikokovaihtoehtoja. Näin näkövammaiset voivat lukea kurssin sisältöä helpommin."; +$AtOnce = "Vastaanoton yhteydessä"; +$Daily = "Kerran päivässä"; +$QuestionsAreTakenFromLPExercises = "Nämä kysymykset on otettu oppimispoluilta."; +$AllStudentsAttemptsAreConsidered = "Kaikki oppijoiden yritykset katsotaan"; +$ViewModeEmbedFrame = "Nykyinen näkymätila: ulkoinen upotus. Käytä vain ulkoisten sivustojen upottamiseen."; +$ItemAdded = "Kohde lisätty"; +$ItemDeleted = "Kohde poistettu"; +$ItemUpdated = "Kohde päivitetty"; +$ItemCopied = "Kohde kopioitu"; $MyStatistics = "Tilastoni"; +$PublishedExercises = "Käytettävissä olevat harjoitukset"; +$DoneExercises = "Suoritetut harjoitukset"; +$AverageExerciseResult = "Keskimääräinen harjoitustulos"; +$LPProgress = "Oppimispolun eteneminen"; +$Ranking = "Ranking"; +$BestResultInCourse = "Kurssin paras tulos"; +$ExerciseStartDate = "Julkaisupäivä"; +$FromDateXToDateY = "%s:stä %s:ään"; $RedirectToALearningPath = "Ohjaa valittuun oppimispolkuun"; $RedirectToTheLearningPathList = "Ohjaa oppimispolkujen listaukseen"; +$PropagateNegativeResults = "Negatiivisten tulosten levittäminen kysymysten väliin"; +$LPNotVisibleToStudent = "Oppijat eivät näe tätä oppimispolkua"; +$InsertALinkToThisQuestionInTheExercise = "Käytä tätä kysymystä testissä linkkinä (ei kopiona)."; +$CourseThematicAdvance = "Kurssin edistyminen"; +$OnlyShowScore = "Harjoitustila: Näytä vain pisteet, kategorioittain jos vähintään yksi kategoria on käytössä."; +$Clean = "Puhdista"; +$OnlyBestResultsPerStudent = "Jos yrityksiä on useita, näytetään vain kunkin oppijan paras tulos."; +$EditMembersList = "Muokkaa jäsenluetteloa"; +$BestAttempt = "Paras yritys"; +$ExercisesInTimeProgressChart = "Omien harjoitusten tulosten kehittyminen ajan mittaan verrattuna oppijoiden keskiarvoon."; $MailNotifyInvitation = "Ilmoita sähköpostilla uudesta kutsusta"; $MailNotifyMessage = "Ilmoita viestillä uudesta henkilökohtaisesta viestistä"; $MailNotifyGroupMessage = "Ilmoita sähköpostilla uudesta ryhmän saamasta viestistä"; +$CorrectAndRate = "Korjaa ja arvioi"; +$HotSpotDelineation = "Interaktiivisen alueen hahmotelma"; +$SearchXapianModuleNotInstalled = "Xapian hakumodulia ei ole asennettu"; +$SearchEnabledTitle = "Kokotekstihaku"; +$SearchEnabledComment = "Tämän ominaisuuden avulla voit indeksoida suurimman osan portaaliin ladatuista asiakirjoista ja tarjota sitten hakutoiminnon käyttäjille. Tämä ominaisuus ei indeksoi jo ladattuja asiakirjoja, joten se on tärkeää ottaa käyttöön (jos se halutaan) käyttöön heti käyttöönoton alussa. Kun ominaisuus on otettu käyttöön, hakukenttä ilmestyy jokaisen käyttäjän kurssiluetteloon. Tietyn termin haku tuo näkyviin luettelon vastaavista asiakirjoista, harjoituksista tai foorumin aiheista, jotka suodatetaan sen mukaan, onko käyttäjällä näitä sisältöjä saatavilla."; +$SpecificSearchFieldsAvailable = "Käytettävissä olevat mukautetut hakukentät"; +$XapianModuleInstalled = "Xapian-moduuli asennettu"; $ClickToSelectOrDragAndDropMultipleFilesOnTheUploadField = "Napsauta alla olevaa laatikkoa ja valitse tiedostot tietokoneeltasi (voit CTRL pohjassa valita useita tiedostoja), tai raahaa tiedostot työpöydältäsi tai kansioista suoraan alla olevaan laatikkoon."; +$Simple = "Yksinkertainen"; +$Multiple = "Monista"; $UploadFiles = "Klikkaa tähän tai raahaa tänne tiedostoja lähettääksesi ne"; +$ImportExcelQuiz = "Tuo tietokilpailu Excelistä"; +$DownloadExcelTemplate = "Lataa Excel-mallipohja"; +$YouAreCurrentlyUsingXOfYourX = "Käytät tällä hetkellä %s MB (%s) %s MB:stä."; +$AverageIsCalculatedBasedInAllAttempts = "Keskiarvo lasketaan kaikkien koeyritysten perusteella"; +$AverageIsCalculatedBasedInTheLatestAttempts = "Keskiarvo lasketaan viimeisimpien yritysten perusteella"; +$LatestAttemptAverageScore = "Viimeisimmän yrityksen keskimääräinen pistemäärä"; +$SupportedFormatsForIndex = "Tuetut indeksin muodot"; $Installed = "Asennettu"; $NotInstalled = "Ei asennettu"; $Settings = "Asetukset"; +$ProgramsNeededToConvertFiles = "Tiedostojen muuntamiseen tarvittavat ohjelmat"; +$YouAreUsingChamiloInAWindowsPlatformSadlyYouCantConvertDocumentsInOrderToSearchTheContentUsingThisTool = "Käytät Chamiloa Windows-alustalla, valitettavasti et voi muuntaa dokumentteja voidaksesi hakea sisältöä tämän työkalun avulla."; $OnlyLettersAndNumbers = "Vain kirjaimia (a-z) ja numeroita(0-9)"; +$HideCoursesInSessionsTitle = "Piilota kurssien luettelo istunnoissa"; +$HideCoursesInSessionsComment = "Kun näytät istuntolohkon kurssisivulla, piilota kyseisen istunnon sisällä olevien kurssien luettelo (näytä ne vain istunntoikkunassa)."; +$ShowGroupsToUsersTitle = "Näytä luokat käyttäjille"; +$ShowGroupsToUsersComment = "Näytä luokat käyttäjille. Luokat ovat ominaisuus, jonka avulla voit rekisteröidä/poistaa käyttäjäryhmiä suoraan istuntoon tai kurssille, mikä vähentää hallinnollista vaivaa. Kun valitset tämän vaihtoehdon, oppijat näkevät sosiaalisen verkoston käyttöliittymän kautta, missä luokassa he ovat."; +$ExerciseWillBeActivatedFromXToY = "Harjoitus on aktivoituna %s:stä %s:ään."; +$ExerciseAvailableFromX = "Harjoitus saatavilla alkaen %s"; +$ExerciseAvailableUntilX = "Harjoitus käytettävissä %s asti"; +$HomepageViewActivityBig = "Isojen kuvakkeiden näkymä"; $CheckFilePermissions = "Tarkista tiedoston käyttöoikeudet"; +$AddedToALP = "Lisätty Opintopolkuun"; $NotAvailable = "Ei saatavilla"; $ToolSearch = "Haku"; +$EnableQuizScenarioTitle = "Ota Quiz-skenaario käyttöön"; +$EnableQuizScenarioComment = "Täällä voit luoda harjoituksia, joissa ehdotetaan erilaisia kysymyksiä käyttäjän vastausten perusteella."; $NanogongNoApplet = "Sovellusta Nanogong ei löydy"; $NanogongRecordBeforeSave = "Äänitä ennen lähettämistä"; $NanogongGiveTitle = "Anna nimi tiedostolle"; @@ -3587,110 +5856,3318 @@ $NanogongSubmitted = "Äänitetty tiedosto lähetetty"; $RecordMyVoice = "Äänitä ääneni"; $PressRecordButton = "Aloittaaksesi äänityksen paina punaista nappia"; $VoiceRecord = "Äänitys"; +$BrowserNotSupportNanogongSend = "Selaimesi ei lähetä tallennusta alustalle, mutta voit tallentaa sen tietokoneen levylle ja lähettää sen myöhemmin. Jos haluat käyttää kaikkia ominaisuuksia, suosittelemme käyttämään kehittyneitä selaimia, kuten Firefoxia tai Chromea."; $FileExistRename = "Tämän niminen tiedosto on jo olemassa, anna toinen nimi"; +$EnableNanogongTitle = "Aktivoi nauhuri - Nanogong äänisoitin"; +$EnableNanogongComment = "Nanongong on nauhuri - äänisoitin, jonka avulla voit nauhoittaa äänesi ja lähettää sen alustalle tai ladata sen kiintolevyllesi. Sen avulla voit myös toistaa nauhoittamasi äänen. Oppijat tarvitsevat vain mikrofonin ja kaiuttimet ja hyväksyvät sovelluksen lataamisen, kun se ladataan ensimmäisen kerran. Se on erittäin hyödyllinen kielenoppijoille, jotta he voivat kuulla oman ääntämisensä kuunneltuaan ensin opettajan ehdottaman oikean ääntämisen wav-äänitiedostossa."; +$GradebookAndAttendances = "Arvioinnit ja läsnäolot"; +$ExerciseAndLPsAreInvisibleInTheNewCourse = "Harjoitukset ja oppimispolut ovat näkymättömiä uudessa kurssissa."; +$SelectADateRange = "Valitse päivämääräalue"; +$AreYouSureToLockedTheEvaluation = "Haluatko varmasti lukita arvioinnin?"; +$AreYouSureToUnLockedTheEvaluation = "Oletko varma, että haluat avata arvioinnin?"; +$EvaluationHasBeenUnLocked = "Arviointi on avattu"; +$EvaluationHasBeenLocked = "Arviointi on lukittu"; $AllDone = "Kaikki tehty"; +$AllNotDone = "Kaikkia ei ole tehty"; $IfYourLPsHaveAudioFilesIncludedYouShouldSelectThemFromTheDocuments = "Jos oppimispolkusi sisältää äänitiedostoja muista valita ne dokumenteista"; +$IfYouPlanToUpgradeFromOlderVersionYouMightWantToHaveAlookAtTheChangelog = "Jos aiot päivittää Chamilon vanhemmasta versiosta, kannattaa tutustua muutoslogiin, jotta tiedät, mikä on uutta ja mitä on muutettu."; +$UplUploadFailedSizeIsZero = "Asiakirjan lataamisessa oli ongelma: vastaanotetun tiedoston koko palvelimella oli 0 tavua. Tarkista paikallinen tiedostosi mahdollisten vikojen tai vaurioiden varalta ja yritä sitten uudelleen."; +$YouMustChooseARelationType = "Sinun on valittava relaatiotyyppi"; +$SelectARelationType = "Suhdetyypin valinta"; +$AddUserToURL = "Lisää käyttäjä tähän URL-osoitteeseen"; +$CourseBelongURL = "Kurssi rekisteröity URL-osoitteeseen"; +$AtLeastOneSessionAndOneURL = "Sinun on valittava vähintään yksi istunto ja yksi URL-osoite."; +$SelectURL = "Valitse URL-osoite"; +$SessionsWereEdited = "Istunnot on päivitetty."; +$URLDeleted = "URL-osoite poistettu."; +$CannotDeleteURL = "Tätä URL-osoitetta ei voi poistaa."; +$CoursesInPlatform = "Kurssit alustalla."; +$UsersEdited = "Käyttäjät päivitetty."; +$CourseHome = "Kurssin kotisivu"; +$ComingSoon = "Tulossa pian..."; +$DummyCourseOnlyOnTestServer = "Dummy-kurssisisältö - saatavilla vain testialustoilla."; +$ThereAreNotSelectedCoursesOrCoursesListIsEmpty = "Valittuja kursseja ei ole tai kurssiluettelo on tyhjä."; +$CodeTwiceInFile = "Koodia on käytetty kahdesti tiedostossa. Tämä ei ole sallittua. Kurssien koodien on oltava yksilöllisiä."; +$CodeExists = "Tämä koodi on jo olemassa"; +$UnkownCategoryCourseCode = "Kategoriaa ei löytynyt"; +$LinkedCourseTitle = "Aiheeseen liittyvän kurssin nimi"; +$LinkedCourseCode = "Linkitetyn kurssin koodi"; +$AssignUsersToSessionsAdministrator = "Käyttäjien osoittaminen istunnon valvojalle"; +$AssignedUsersListToSessionsAdministrator = "Käyttäjäluettelon määrittäminen istuntojen ylläpitäjälle"; +$GroupUpdated = "Luokka päivitetty."; +$GroupDeleted = "Luokka poistettu."; +$CannotDeleteGroup = "Luokkaa ei voitu poistaa."; +$SomeGroupsNotDeleted = "Joitakin luokkia ei voitu poistaa."; +$DontUnchek = "Älä poista rastia"; +$Modified = "Muokattu"; +$SessionsList = "Istuntojen luettelo"; +$Promotion = "Ylennys"; +$UpdateSession = "Päivitä istunto"; +$Path = "Polku"; +$Over100 = "Yli 100"; +$UnderMin = "Vähimmäismäärän alapuolella."; +$SelectOptionExport = "Valitse vientivaihtoehto"; +$FieldEdited = "Kenttä lisätty."; +$LanguageParentNotExist = "Ylätason kieltä ei ole olemassa."; +$TheSubLanguageHasNotBeenRemoved = "Alikieltä ei ole poistettu."; +$ShowOrHide = "Näytä/piilota"; +$StatusCanNotBeChangedToHumanResourcesManager = "Tämän käyttäjän statusta ei voi muuttaa henkilöstöpäälliköksi."; +$FieldTaken = "Kenttä varattu"; +$AuthSourceNotAvailable = "Tunnistuslähde ei ole käytettävissä."; +$UsersSubscribedToSeveralCoursesBecauseOfVirtualCourses = "Käyttäjät tilasivat useita kursseja virtuaalikurssien avulla."; +$NoUrlForThisUser = "Tällä käyttäjällä ei ole liittyvää URL-osoitetta."; +$ExtraData = "Lisätiedot"; +$ExercisesInLp = "Oppimispolkujen harjoitukset"; +$Id = "Id"; +$ThereWasAnError = "Tapahtui virhe."; +$CantMoveToTheSameSession = "Tätä ei voi siirtää samaan istuntoon."; +$StatsMoved = "Tilastot siirretty."; +$UserInformationOfThisCourse = "Käyttäjätiedot tälle kurssille"; +$OriginCourse = "Alkuperäinen kurssi"; +$OriginSession = "Alkuperäinen istunto"; +$DestinyCourse = "Määränpää kurssi"; +$DestinySession = "Kohdeistunto"; +$CourseDoesNotExistInThisSession = "Kurssia ei ole olemassa tässä istunnossa. Kopiointi toimii vain yhden istunnon kurssista toisen istunnon samaan kurssiin."; +$UserNotRegistered = "Käyttäjä ei ole rekisteröitynyt."; +$ViewStats = "Näytä tilastot"; +$Responsable = "Vastuullinen"; +$TheAttendanceSheetIsLocked = "Läsnäololista on lukittu."; +$Presence = "Osallistuminen"; +$ACourseCategoryWithThisNameAlreadyExists = "Samanniminen kurssiluokka on jo olemassa."; +$OpenIDRedirect = "OpenID-uudelleenohjaus"; $Blogs = "Blogit"; $SelectACourse = "Valitse kurssi"; +$PleaseSelectACourseOrASessionInTheLeftColumn = "Valitse kurssi tai istunto sivupalkista."; +$Others = "Muut"; +$BackToCourseDesriptionList = "Takaisin kurssikuvaukseen"; $Postpone = "Lykkää"; +$NotHavePermission = "Käyttäjällä ei ole oikeuksia suorittaa pyydettyä toimintoa."; +$CourseCodeAlreadyExistExplained = "Kun kurssikoodia kopioidaan, tietokantajärjestelmä havaitsee jo olemassa olevan kurssikoodin ja estää kaksoiskappaleen luomisen. Varmista, ettei kurssikoodeja ole päällekkäin."; $NewImage = "Uusi kuva"; +$Untitled = "Nimetön"; +$CantDeleteReadonlyFiles = "Ei voi poistaa tiedostoja, jotka on määritetty \"vain luku\" -tilaan."; +$InvalideUserDetected = "Virheellinen käyttäjä havaittu."; +$InvalideGroupDetected = "Virheellinen ryhmä havaittu."; +$OverviewOfFilesInThisZip = "Yleiskatsaus tämän Zip-tiedoston tiedostoista"; +$TestLimitsAdded = "Lisätty testien raja-arvot"; +$AddLimits = "Lisää rajoituksia"; +$Unlimited = "Rajoittamaton"; +$LimitedTime = "Rajoitettu aika"; +$LimitedAttempts = "Rajoitetut yritykset"; +$Times = "Kertaa"; +$Random = "Satunnainen"; +$ExerciseTimerControlMinutes = "Aktivoi harjoituksen ajastinohjain."; +$Numeric = "Numeerinen"; +$Acceptable = "Hyväksyttävä"; $Hotspot = "Interaktiivinen alue"; +$ChangeTheVisibilityOfTheCurrentImage = "Muuta nykyisen kuvan näkyvyyttä"; +$Steps = "Vaiheet"; +$OriginalValue = "Alkuperäinen arvo"; +$ChooseAnAnswer = "Valitse vastaus"; +$ImportExercise = "Tuo harjoitus"; +$MultipleChoiceMultipleAnswers = "Monivalinta, useita vastauksia"; +$MultipleChoiceUniqueAnswer = "Monivalinta, ainutkertainen vastaus"; +$HotPotatoesFiles = "HotPotatoes-tiedostot"; +$OAR = "Vältettävä alue"; +$TotalScoreTooBig = "Kokonaispistemäärä on liian suuri"; +$InvalidQuestionType = "Virheellinen kysymystyyppi"; +$InsertQualificationCorrespondingToMaxScore = "Lisää maksimipistemäärää vastaava kelpoisuus"; +$ThreadMoved = "Lanka siirretty"; +$MigrateForum = "Siirrä foorumi"; +$YouWillBeNotified = "Sinulle ilmoitetaan"; +$MoveWarning = "Varoitus: Arvosanakirjan elementtien siirtäminen voi olla vaarallista arvosanakirjan sisältämille tiedoille."; +$CategoryMoved = "Arvosanakirja on siirretty."; +$EvaluationMoved = "Arvosanakirjakomponentti on siirretty."; +$NoLinkItems = "Ei toisiinsa sidottuja komponentteja"; +$NoUniqueScoreRanges = "Ei ole olemassa uniikkia pistemäärän vaihteluväliä."; +$DidNotTakeTheExamAcronym = "Käyttäjä ei osallistunut kokeeseen."; +$DidNotTakeTheExam = "Käyttäjä ei osallistunut kokeeseen."; +$DeleteUser = "Poista käyttäjä"; +$ResultDeleted = "Tulos poistettu."; +$ResultsDeleted = "Tulokset poistettu."; +$OverWriteMax = "Korvaa enimmäisarvo."; +$ImportOverWriteScore = "Tuonnin pitäisi korvata pisteet."; +$NoDecimals = "Ei desimaaleja"; +$NegativeValue = "Negatiivinen arvo"; +$ToExportMustLockEvaluation = "Vientiä varten sinun on lukittava arviointi."; +$ShowLinks = "Näytä linkit"; +$TotalForThisCategory = "Tämän kategorian kokonaismäärä."; +$OpenDocument = "Avaa dokumentti"; +$LockEvaluation = "Lukitse arviointi"; +$UnLockEvaluation = "Arvioinnin avaaminen."; +$TheEvaluationIsLocked = "Arviointi on lukittu."; +$BackToEvaluation = "Takaisin arviointiin."; +$Uploaded = "Ladattu."; $Saved = "Tallennettu"; +$EmailSentFromLMS = "Alustalta lähetetty sähköposti"; +$InfoAboutLastDoneAdvanceAndNextAdvanceNotDone = "Tiedot viimeksi valmistuneesta vaiheesta ja seuraavasta keskeneräisestä vaiheesta."; +$LatexCode = "LaTeX-koodi"; +$LatexFormula = "LaTeX-kaava"; +$AreYouSureToLockTheAttendance = "Oletko varma, että haluat lukita läsnäolon?"; +$UnlockMessageInformation = "Läsnäoloa ei ole lukittu, mikä tarkoittaa, että opettajasi voi edelleen muokata sitä."; +$LockAttendance = "Lukitse läsnäolo"; +$AreYouSureToUnlockTheAttendance = "Oletko varma, että haluat avata läsnäolon?"; +$UnlockAttendance = "Avaa läsnäolo"; +$LockedAttendance = "Lukittu läsnäolo"; +$DecreaseFontSize = "Pienennä fonttikokoa"; +$ResetFontSize = "Nollaa fonttikoko"; +$IncreaseFontSize = "Suurenna fonttikokoa"; +$LoggedInAsX = "Kirjautunut sisään nimellä %s"; +$Quantity = "Määrä"; +$AttachmentUpload = "Liitteen lataaminen"; +$CourseAutoRegister = "Rekisteröidy automaattisesti kurssille"; +$ThematicAdvanceInformation = "Temaattisen etenemistyökalun avulla voit järjestää kurssisi ajallisesti."; +$RequestURIInfo = "URL-osoite, jota pyydetään tälle sivulle pääsemiseksi, on ilman verkkotunnuksen määritelmää."; +$DiskFreeSpace = "Vapaata tilaa levyllä"; +$ProtectFolder = "Suojattu kansio"; +$SomeHTMLNotAllowed = "Joitakin HTML-attribuutteja ei sallita."; +$MyOtherGroups = "Muut luokkani"; +$XLSFileNotValid = "Toimitettu XLS-tiedosto ei ole kelvollinen."; $YouAreRegisterToSessionX = "Sinut on liitetty istuntoon: %s."; $NextBis = "Seuraava"; $Prev = "Edellinen"; +$Configuration = "Konfigurointi"; +$WelcomeToTheChamiloInstaller = "Tervetuloa Chamilon asennusohjelmaan"; +$PHPVersionError = "PHP-versiosi ei vastaa tämän ohjelmiston vaatimuksia. Tarkista, että sinulla on uusin versio, ja yritä sitten uudelleen."; +$ExtensionSessionsNotAvailable = "Istuntojen laajennus ei ole käytettävissä"; +$ExtensionZlibNotAvailable = "Zlib-laajennus ei ole käytettävissä"; +$ExtensionPCRENotAvailable = "PCRE-laajennus ei ole käytettävissä"; +$ToGroup = "Sosiaaliseen ryhmään"; +$XWroteY = "%s kirjoitti:
    +%s"; +$BackToGroup = "Takaisin ryhmään"; +$GoAttendance = "Siirry osallistujamääriin"; +$GoAssessments = "Mene arviointeihin"; +$EditCurrentModule = "Muokkaa nykyistä moduulia"; +$SearchFeatureTerms = "Hakutoiminnon termit"; $UserRoles = "Käyttäjä roolit"; $GroupRoles = "Ryhmän roolit"; +$StorePermissions = "Säilytä käyttöoikeudet"; $PendingInvitation = "Odottava kutsu"; $MaximunFileSizeXMB = "Tiedoston suurin sallittu koko: % Mt."; $MessageHasBeenSent = "Viestisi on lähetetty"; $Tags = "Tunnisteet"; +$ErrorSurveyTypeUnknown = "Tutkimustyyppi tuntematon"; +$SurveyUndetermined = "Kysely määrittelemätön"; +$QuestionComment = "Kysymyksen kommentti"; +$UnknowQuestion = "Tuntematon kysymys"; +$DeleteSurveyGroup = "Poista kyselyryhmä"; +$ErrorOccurred = "Tapahtui virhe."; +$ClassesUnSubscribed = "Ei-tilatut luokat."; +$NotAddedToCourse = "Ei lisätty kurssille"; +$UsersNotRegistered = "Käyttäjät, jotka eivät rekisteröityneet."; +$ClearFilterResults = "Tyhjennä suodattimen tulokset"; +$SelectFilter = "Valitse suodatin"; +$MostLinkedPages = "Eniten linkitetyt sivut"; +$DeadEndPages = "Umpikuja sivut"; +$MostNewPages = "Uusimmat sivut"; +$MostLongPages = "Pisimmät sivut"; +$HiddenPages = "Piilotetut sivut"; +$MostDiscussPages = "Eniten keskustelua herättäneet sivut"; +$BestScoredPages = "Parhaat tulokset sivut"; +$MProgressPages = "Korkeimmat edistymiset sivut"; +$MostDiscussUsers = "Eniten keskustelua herättäneet käyttäjät"; +$RandomPage = "Satunnainen sivu"; +$DateExpiredNotBeLessDeadLine = "Työn lähettämisen tosiasiallinen estäminen ei voi tapahtua ennen näytettyä lähettämisen määräaikaa."; +$NotRevised = "Ei tarkistettu"; $DirExists = "Ei onnistu, tämän niminen kansio on jo olemassa."; $DocMv = "Tiedosto siirretty"; +$ThereIsNoClassScheduledTodayTryPickingAnotherDay = "Tänään ei ole oppituntia, yritä valita toinen päivä tai lisää läsnäolomerkintäsi itse toimintakuvakkeilla."; +$AddToCalendar = "Lisää kalenteriin"; +$TotalWeight = "Kokonaispainoarvo"; +$RandomPick = "Satunnainen valinta"; +$SumOfActivitiesWeightMustBeEqualToTotalWeight = "Kaikkien aktiviteettien painotusten summan on oltava yhtä suuri kuin arviointiasetuksissa ilmoitettu kokonaispaino, muuten oppijat eivät saavuta riittävää pistemäärää sertifioinnin saamiseksi."; +$TotalSumOfWeights = "Arvioinnin sisältämien toimintojen kaikkien painotusten summan on vastattava tätä lukua."; +$ShowScoreAndRightAnswer = "Automaattinen arviointitila: näytä pisteet ja odotetut vastaukset."; +$DoNotShowScoreNorRightAnswer = "Tenttitila: Älä näytä pistemäärää eikä vastauksia"; +$YouNeedToAddASessionCategoryFirst = "Olet käyttänyt %s"; +$YouHaveANewInvitationFromX = "Sinulla on uusi kutsu %s:ltä"; +$YouHaveANewMessageFromGroupX = "Sinulla on uusi viesti ryhmältä %s"; +$YouHaveANewMessageFromX = "Sinulle on tullut uusi viesti %s:ltä"; $SeeMessage = "Näytä viesti"; $SeeInvitation = "Näytä kutsu"; $YouHaveReceivedThisNotificationBecauseYouAreSubscribedOrInvolvedInItToChangeYourNotificationPreferencesPleaseClickHereX = "Olet saanut tämän viestin koska olet tilannut tai liityt siihen. Muuttaaksesi saamiasi viestejä klikkaa tästä: %s"; $Replies = "Vastaukset"; $Reply = "Vastaa"; +$InstallationGuide = "Asennusopas"; +$ChangesInLastVersion = "Muutokset viimeisimmässä versiossa"; +$ContributorsList = "Tekijöiden luettelo"; +$SecurityGuide = "Turvallisuusopas"; +$OptimizationGuide = "Optimointiopas"; +$FreeBusyCalendar = "Vapaa/Varattu kalenteri"; +$LoadUsersExtraData = "Käyttäjien ylimääräisten tietojen lataaminen"; $Broken = "Rikki"; $CheckURL = "Tarkista linkki"; +$PrerequisiteDeletedError = "Virhe: edellytykseksi määritelty elementti on poistettu."; +$NoItem = "Ei kohdetta vielä"; +$ProtectedPages = "Suojatut sivut"; +$LoadExtraData = "Lataa lisäkäyttäjäkenttien tiedot (ne on merkittävä 'Suodattimeksi', jotta ne näkyvät)."; +$CourseAssistant = "Avustaja"; +$TotalWeightMustBeX = "Kaikkien toimintojen painojen summan on oltava %s."; +$Step7 = "Vaihe 7"; +$MaxWeightNeedToBeProvided = "Maksimipainoarvo on ilmoitettava"; +$ExtensionCouldBeLoaded = "Laajennus voitiin ladata"; +$SupportedScormContentMakers = "SCORM-sisällöntuotantotyökalut tuettu"; +$DisableEndDate = "Päättymispäivän poistaminen käytöstä"; +$ForumCategories = "Foorumin kategoriat"; $Copy = "Kopioi"; +$ArchiveDirCleanup = "Välimuistin ja väliaikaistiedostojen puhdistaminen"; +$ArchiveDirCleanupDescr = "Chamilo säilyttää kopion useimmista luomistaan väliaikaisista tiedostoista (varmuuskopioita, vientiä, kopioita jne. varten) app/cache/-hakemistossaan. Jonkin ajan kuluttua tämä voi johtaa siihen, että levytilaa kuluu hyvin paljon turhaan. Siivoa arkistohakemistosi klikkaamalla alla olevaa painiketta. Tämä toiminto pitäisi automatisoida cron-prosessilla, mutta jos se ei ole mahdollista, voit tulla tälle sivulle säännöllisesti poistamaan kaikki väliaikaiset tiedostot hakemistosta. Tämä toiminto puhdistaa myös teeman välimuistitiedostot."; +$ArchiveDirCleanupProceedButton = "Jatka siivousta"; +$ArchiveDirCleanupSucceeded = "App/cache/-hakemiston puhdistus on suoritettu onnistuneesti."; +$ArchiveDirCleanupFailed = "Jostain syystä hakemistoa app/cache/ ei voitu tyhjentää. Siivoa se ottamalla manuaalisesti yhteys palvelimeen ja poistamalla kaikki tiedostot ja symboliset linkit hakemiston chamilo/app/cache/ alta, lukuun ottamatta .htaccess-tiedostoa. Linuxissa: # find app/cache/ \( -type f -tai -type l \) -not -name .htaccess -exec echo rm -v \{} \;"; +$EnableStartTime = "Ota aloitusaika käyttöön"; +$EnableEndTime = "Ota päättymisaika käyttöön"; +$LocalTimeUsingPortalTimezoneXIsY = "Paikallinen aika portaalin aikavyöhykkeessä (%s) on %s."; $AllEvents = "Kaikki tapahtumat"; $StartTest = "Aloita testi"; +$ExportAsDOC = "Vie .doc-muodossa"; $Wrong = "Väärä"; +$Certification = "Sertifiointi"; +$CertificateOnlineLink = "Online-linkki todistukseen"; $NewExercises = "Uudet harjoitukset"; $MyAverage = "Keskiarvoni"; $AllAttempts = "Kaikki yritykset"; -$NoCookies = "Evästeet eivät ole sallittuna selaimessasi. Kirjautuaksesi on selaimen asetuksissa sallittava evästeet (Cookies)."; +$QuestionsToReview = "Tarkastettavat kysymykset"; +$QuestionWithNoAnswer = "Kysymykset, joihin ei ole vastausta, on korostettu punaisella alla"; +$ValidateAnswers = "Validoi vastaukset"; +$ReviewQuestions = "Tarkasta valitut kysymykset"; +$YouTriedToResolveThisExerciseEarlier = "Olet yrittänyt ratkaista tämän tehtävän aiemmin"; +$NoCookies = "You do not have cookies support enabled in your browser. Chamilo relies on the feature called \"cookies\" to store your connection details. This means you will not be able to login if cookies are not enabled. Please change your browser configuration (generally in the Edit -> Preferences menu) and reload this page."; $NoJavascript = "Selaimessa ei ole JavaScript tukea. Chamilo käyttää JavaScriptiä tehdäksen käyttökokemuksesta dynaamisemman. Suurin osa toiminnoista toimii ilmankin mutta suosittelemme ottamaan selaimen asetuksista JavaScript tuen käyttöön."; $NoFlash = "Selaimessa ei ole Flash tukea. Tästä syystä kaikki toiminnot eivät ole välttämättä käytettävissä. Suosittelemme asentamaan Flash liitännäisen ja käynnistämään selaimen uudelleen."; +$ThereAreNoQuestionsForThisExercise = "Tässä harjoituksessa ei ole kysymyksiä"; +$Attempt = "Yritys"; +$SaveForNow = "Tallenna ja jatka"; +$ContinueTest = "Jatka testiin"; +$NoQuicktime = "Selaimessasi ei ole asennettuna QuickTime-lisäosaa. Voit silti käyttää alustaa, mutta jos haluat käyttää suurempaa määrää mediatiedostotyyppejä, suosittelemme, että asennat sen."; +$NoJavaSun = "Selaimessasi ei näytä olevan asennettuna Sun Java -lisäosaa. Voit silti käyttää alustaa, mutta menetät muutamia sen ominaisuuksia."; +$NoJava = "Selaimesi ei tue Javaa"; +$JavaSun24 = "Selaimessasi on Java-versio, jota tämä työkalu ei tue.\nKäyttääksesi työkalua sinun on asennettava Java Sun -versio, joka on korkeampi kuin versio 24."; +$NoMessageAnywere = "Jos et halua nähdä tätä viestiä enää tämän istunnon aikana, napsauta tästä."; +$IncludeAllVersions = "Etsi myös kunkin sivun vanhemmista versioista"; +$TotalHiddenPages = "Piilotettuja sivuja yhteensä"; +$TotalPagesEditedAtThisTime = "Yhteensä sivuja muokattu tällä hetkellä"; +$TotalWikiUsers = "Yhteensä käyttäjiä, jotka ovat osallistuneet tähän Wikiin"; +$StudentAddNewPages = "Oppijat voivat lisätä uusia sivuja wikiin"; +$DateCreateOldestWikiPage = "Vanhimman Wiki-sivun luontipäivämäärä"; +$DateEditLatestWikiVersion = "Wikin viimeisimmän muokkauksen päivämäärä"; +$AverageScoreAllPages = "Kaikkien sivujen keskimääräinen arvosana"; +$AverageMediaUserProgress = "Käyttäjien arvioitu keskimääräinen edistyminen sivuillaan"; +$TotalIpAdress = "Yhteensä eri IP-osoitteita, jotka ovat osallistuneet Wikiin"; +$Pages = "Sivut"; +$Versions = "Versiot"; +$EmptyPages = "Tyhjien sivujen kokonaismäärä"; +$LockedDiscussPages = "Estettyjen keskustelusivujen määrä"; +$HiddenDiscussPages = "Piilotettujen keskustelusivujen määrä"; +$TotalComments = "Sivujen eri versioita koskevat kommentit yhteensä"; +$TotalOnlyRatingByTeacher = "Vain opettaja voi pisteyttää sivujen kokonaismäärän."; +$TotalRatingPeers = "Sivuja, jotka muut oppijat voivat pisteyttää, yhteensä"; +$TotalTeacherAssignments = "Opettajan ehdottamien tehtävien sivujen määrä"; +$TotalStudentAssignments = "Yksittäisten tehtävien lukumäärä oppijan sivuilla"; +$TotalTask = "Tehtävien määrä"; +$PortfolioMode = "Portfoliotila"; +$StandardMode = "Tavallinen toimintatila"; +$ContentPagesInfo = "Sivujen sisältöä koskevat tiedot"; +$InTheLastVersion = "Viimeisimmässä versiossa"; +$InAllVersions = "Kaikissa versioissa"; +$NumContributions = "Tekijöiden määrä"; +$NumAccess = "Käyntien määrä"; +$NumWords = "Sanojen määrä"; +$NumlinksHtmlImagMedia = "Lisättyjen ulkoisten html-linkkien määrä (teksti, kuvat, ...)."; +$NumWikilinks = "Wiki-linkkien määrä"; +$NumImages = "Lisättyjen kuvien määrä"; +$NumFlash = "Lisättyjen flash-tiedostojen määrä"; +$NumMp3 = "Lisättyjen mp3-äänitiedostojen määrä"; +$NumFlvVideo = "Lisättyjen FLV-videotiedostojen määrä"; +$NumYoutubeVideo = "Upotettujen Youtube-videoiden määrä"; +$NumOtherAudioVideo = "Lisättyjen ääni- ja videotiedostojen määrä (paitsi ei mp3 eikä flv)"; +$NumTables = "Lisättyjen taulukoiden määrä"; +$Anchors = "Ankkurit"; +$NumProtectedPages = "Suojattujen sivujen määrä"; +$Attempts = "Yritykset"; +$SeeResults = "Katso tulokset"; +$Loading = "Ladataan"; +$AreYouSureToRestore = "Oletko varma, että haluat palauttaa tämän elementin?"; +$XQuestionsWithTotalScoreY = "%d kysymystä, jolloin kokonaispistemäärä (kaikki kysymykset) on %s."; +$ThisIsAutomaticEmailNoReply = "Tämä on automaattinen sähköpostiviesti. Älä vastaa siihen."; +$UploadedDocuments = "Ladatut dokumentit"; +$QuestionLowerCase = "kysymys"; +$QuestionsLowerCase = "kysymykset"; +$BackToTestList = "Takaisin kokeiden listaan"; +$CategoryDescription = "Kategorian kuvaus"; +$BackToCategoryList = "Takaisin kategorialuetteloon"; +$AddCategoryNameAlreadyExists = "Tämä kategorian nimi on jo olemassa. Käytä toista nimeä."; +$CannotDeleteCategory = "Kategoriaa ei voi poistaa"; +$CannotDeleteCategoryError = "Virhe: kategoriaa ei voitu poistaa"; +$CannotEditCategory = "Kategoriaa ei voitu muokata"; +$ModifyCategoryError = "Kategoriaa ei voitu päivittää"; +$AllCategories = "Kaikki kategoriat"; +$CreateQuestionOutsideExercice = "Luo kysymys harjoituksen ulkopuolella"; +$ChoiceQuestionType = "Valitse kysymystyyppi"; +$YesWithCategoriesSorted = "Kyllä, kategoriat järjestettyinä"; +$YesWithCategoriesShuffled = "Kyllä, mutta sekoitetuilla kategorioilla"; +$ManageAllQuestions = "Hallitse kaikkia kysymyksiä"; +$MustBeInATest = "Täytyy olla testissä"; +$PleaseSelectSomeRandomQuestion = "Valitse jokin satunnainen kysymys"; +$RemoveFromTest = "Poista testistä"; +$AddQuestionToTest = "Lisää kysymys testiin"; +$QuestionByCategory = "Kysymys kategorian mukaan"; +$QuestionUpperCaseFirstLetter = "Kysymys"; +$QuestionCategory = "Kysymysten kategoria"; +$AddACategory = "Lisää kategoria"; +$AddTestCategory = "Lisää testikategoria"; +$AddCategoryDone = "Kategoria lisätty"; +$NbCategory = "Nb-kategoriat"; +$DeleteCategoryAreYouSure = "Haluatko varmasti poistaa tämän kategorian?"; +$DeleteCategoryDone = "Kategoria poistettu"; +$ModifyCategoryDone = "Kategoria päivitetty"; +$NotInAGroup = "Ei ryhmässä"; +$DoFilter = "Suodata"; +$ByCategory = "Kategorioittain"; +$PersonalCalendar = "Henkilökohtainen kalenteri"; +$SkillsTree = "Taitopuu"; +$Skills = "Taidot"; +$SkillsProfile = "Taitoprofiili"; +$WithCertificate = "Todistuksen kanssa"; +$AdminCalendar = "Järjestelmävalvojan kalenteri"; +$CourseCalendar = "Kurssikalenteri"; +$Reports = "Raportit"; +$ResultsNotRevised = "Tulokset joita ei ole tarkastettu"; +$ResultNotRevised = "Tarkastamattomat tulokset"; +$dateFormatShortNumber = "%m/%d/%Y"; +$dateTimeFormatLong24H = "%B %d, %Y at %H:%M"; $ActivateLegal = "Aktivoi lakiteksti"; $ShowALegalNoticeWhenEnteringTheCourse = "Näytä lakiteksti kurssille tultaessa"; -$SearchUsers = "Etsi käyttäjiä"; -$AddAsAnnouncement = "Lisää ilmoitukseksi"; +$GradingModelTitle = "Arvosananantomalli"; +$AllowTeacherChangeGradebookGradingModelTitle = "Opettajat voivat muuttaa arviointien arvostelumallia."; +$AllowTeacherChangeGradebookGradingModelComment = "Jos otat tämän vaihtoehdon käyttöön, kukin opettaja voi valita kurssillaan käytettävän arvostelumallin. Opettajan on tehtävä tämä muutos kurssin arviointityökalusta."; +$NumberOfSubEvaluations = "Osa-arviointien määrä"; +$AddNewModel = "Lisää uusi malli"; +$NumberOfStudentsWhoTryTheExercise = "Harjoituksen suorittaneiden oppijoiden määrä"; +$LowestScore = "Alin pistemäärä"; +$HighestScore = "Korkein pistemäärä"; +$ContainsAfile = "Sisältää tiedoston"; +$Discussions = "Keskustelut"; +$ExerciseProgress = "Harjoituksen edistyminen"; +$GradeModel = "Arvosanan antamismalli"; +$SelectGradebook = "Valitse arviointi"; +$ViewSkillsTree = "Näytä taitopuu"; +$MySkills = "Minun Taitoni"; +$GroupParentship = "Ryhmän vanhemmuus"; +$NoParentship = "Ei vanhemmuutta"; +$NoCertificate = "Ei todistusta"; +$AllowTextAssignments = "Salli toimeksiantojen antaminen online editorin kautta"; +$SeeFile = "Katso tiedosto"; +$ShowDocumentPreviewTitle = "Näytä dokumentin esikatselu"; +$ShowDocumentPreviewComment = "Dokumenttien esikatselun näyttäminen dokumenttityökalussa vähentää uusien sivujen lataamisia dokumentin näyttämiseksi, mutta se voi aiheuttaa epävakaita tuloksia joillakin vanhemmilla selaimilla tai pienemmillä näytöillä."; +$YouAlreadySentAPaperYouCantUpload = "Olet jo lähettänyt tehtävän, et voi ladata uutta tehtävää."; +$CasMainActivateTitle = "CAS-todennuksen ottaminen käyttöön"; +$CasMainActivateComment = "CAS-todennuksen ottaminen käyttöön mahdollistaa käyttäjien todennuksen CAS-tunnuksillaan.\r\nSiirry kohtaan Plugin lisätäksesi konfiguroitavissa olevan 'CAS Login' -painikkeen Chamilo-kampuksellesi. Tai voit pakottaa CAS-todennuksen asettamalla cas[force_redirect] kohdassa app/config/auth.conf.php."; +$CasMainServerTitle = "Pää CAS-palvelin"; +$CasMainServerComment = "Tämä on tärkein CAS-palvelin, jota käytetään todennukseen (IP-osoite tai isäntänimi)."; +$CasMainServerURITitle = "CAS-pääpalvelimen URI"; +$CasMainServerURIComment = "Polku CAS-palveluun"; +$CasMainPortTitle = "CAS-pääpalvelimen portti"; +$CasMainPortComment = "Portti, jolla yhteys CAS-pääpalvelimeen muodostetaan."; +$CasMainProtocolTitle = "CAS-pääpalvelimen protokolla"; +$CAS1Text = "CAS 1"; +$CAS2Text = "CAS 2"; +$SAMLText = "SAML"; +$CasMainProtocolComment = "Protokolla, jolla muodostamme yhteyden CAS-palvelimeen."; +$CasUserAddActivateTitle = "CAS-käyttäjän lisäämisen salliminen"; +$CasUserAddActivateComment = "Ota CAS-käyttäjän lisääminen käyttöön. Jotta käyttäjätili voidaan luoda LDAP-hakemistosta, extldap_config- ja extldap_user_correspondance-taulukot on täytettävä app/config/auth.conf.php-tiedostossa."; +$CasUserAddLoginAttributeTitle = "Lisää CAS-käyttäjän kirjautuminen"; +$CasUserAddLoginAttributeComment = "Lisää CAS-käyttäjän kirjautumistiedot uutta käyttäjää rekisteröidessäsi."; +$CasUserAddEmailAttributeTitle = "Lisää CAS-käyttäjän sähköpostiosoite"; +$CasUserAddEmailAttributeComment = "Lisää CAS-käyttäjän sähköpostitiedot uutta käyttäjää rekisteröidessäsi."; +$CasUserAddFirstnameAttributeTitle = "Lisää CAS-käyttäjän etunimi"; +$CasUserAddFirstnameAttributeComment = "CAS-käyttäjän etunimen lisääminen uuden käyttäjän rekisteröinnin yhteydessä"; +$CasUserAddLastnameAttributeTitle = "Lisää CAS-käyttäjän sukunimi"; +$CasUserAddLastnameAttributeComment = "Lisää CAS-käyttäjän sukunimitiedot uutta käyttäjää rekisteröidessäsi"; +$SkillsAndGradebooks = "Taidot ja arvioinnit"; +$AddSkill = "Lisää taito"; +$AcceptLegal = "Hyväksy oikeudellinen sopimus"; +$CourseLegalAgreement = "Tätä kurssia koskeva oikeudellinen sopimus"; +$RandomQuestionByCategory = "Satunnaisia kysymyksiä kategorioittain"; +$QuestionDisplayCategoryName = "Näytä kysymysten kategoria"; +$ReviewAnswers = "Tarkista vastaukseni"; +$TextWhenFinished = "Testin lopussa näkyvä teksti"; +$Validated = "Validoitu"; +$NotValidated = "Ei validoitu"; +$Revised = "Tarkistettu"; +$SelectAQuestionToReview = "Valitse tarkistettava kysymys"; +$ReviewQuestionLater = "Tarkista kysymys myöhemmin"; +$QuestionsAlreadyAnswered = "Jo vastatut kysymykset"; +$NumberStudentWhoSelectedIt = "Sen valinneiden oppijoiden määrä"; +$SkillDoesNotExist = "Tällaista taitoa ei ole"; +$CheckYourGradingModelValues = "Tarkista arvosanan antamismallin arvot"; +$SkillsAchievedWhenAchievingThisGradebook = "Taidot, jotka saavutetaan näiden tehtävien suorittamisella"; +$AddGradebook = "Lisää arviointi"; +$NoStudents = "Ei oppijaa"; +$NoData = "Tietoja ei ole saatavilla"; +$IAmAHRM = "Olen henkilöstöpäällikkö"; +$SkillRootName = "Absoluuttinen taito"; +$Option = "Vaihtoehto"; +$NoSVGImagesInImagesGalleryPath = "Kuvagallerian hakemistossa ei ole SVG-kuvia."; +$NoSVGImages = "Ei SVG-kuvaa"; +$NumberOfStudents = "Oppilaiden määrä"; +$NumberStudentsAccessingCourse = "Kurssille osallistuvien oppijoiden määrä"; +$PercentageStudentsAccessingCourse = "Kurssille osallistuvien oppijoiden prosenttiosuus."; +$NumberStudentsCompleteAllActivities = "Kaikkien toimintojen loppuun suorittaneiden oppijoiden määrä (100 % edistyminen)."; +$PercentageStudentsCompleteAllActivities = "Kaikkien toimintojen loppuun suorittaneiden oppijoiden prosenttiosuus (100 % edistyminen)."; +$AverageOfActivitiesCompletedPerStudent = "Keskimääräinen suoritettujen toimintojen määrä oppijaa kohti"; +$TotalTimeSpentInTheCourse = "Kurssilla käytetty kokonaisaika"; +$AverageTimePerStudentInCourse = "Keskimääräinen oppilasta kohti kurssilla vietetty aika"; +$NumberOfDocumentsInLearnpath = "Dokumenttien määrä oppimispolulla"; +$NumberOfExercisesInLearnpath = "Oppimispolun harjoitusten määrä"; +$NumberOfLinksInLearnpath = "Oppimispolun linkkien määrä"; +$NumberOfForumsInLearnpath = "Foorumien määrä oppimispolulla"; +$NumberOfAssignmentsInLearnpath = "Oppimispolun tehtävien määrä"; +$NumberOfAnnouncementsInCourse = "Ilmoitusten määrä kurssilla"; +$CurrentCoursesReport = "Raportti nykyisistä kursseista"; $HideTocFrame = "Piilota sisällysluettelo"; +$Updates = "Päivitykset"; +$Teaching = "Opetus"; +$CoursesReporting = "Kurssien raportointi"; +$AdminReports = "Hallintaraportit"; +$ExamsReporting = "Tenttiraportit"; +$MyReporting = "Minun raportointi"; +$SearchSkills = "Etsi taitoja"; +$SaveThisSearch = "Tallenna tämä haku"; +$Matches = "Osumat"; +$WelcomeUserXToTheSiteX = "%s, tervetuloa kohteeseen %s"; +$CheckUsersWithId = "Käytä tiedostosta löytyviä käyttäjätunnuksia käyttäjien ilmoittautumisessa."; +$WhoAndWhere = "Kuka ja missä"; +$CantUploadDeleteYourPaperFirst = "Et voi ladata tätä tehtävää. Poista edellinen ensin."; +$MB = "MB"; +$ShowAdminToolbarTitle = "Näytä ylläpitäjän työkalurivi"; +$ShowAdminToolbarComment = "Näyttää määritetyille käyttäjärooleille yleisen työkalupalkin sivun yläosassa. Tämä työkalupalkki, joka on hyvin samankaltainen kuin Wordpressin ja Googlen mustat työkalupalkit, voi todella nopeuttaa monimutkaisia toimintoja ja parantaa oppimissisällölle käytettävissä olevaa ruututilaa, mutta se voi olla hämmentävä joillekin käyttäjille."; +$Average = "Keskiarvo"; +$YourGradebookFirstNeedsACertificateInOrderToBeLinkedToASkill = "Arvosanakirjasi tarvitsee ensin todistuksen, jotta se voidaan yhdistää taitoon."; +$AddAsAnnouncement = "Lisää ilmoitukseksi"; +$SearchUsers = "Etsi käyttäjiä"; +$Administration = "Hallinto"; +$UserList = "Käyttäjälista"; +$SessionList = "Istuntoluettelo"; +$StudentList = "Oppijoiden luettelo"; +$StudentsWhoAreTakingTheExerciseRightNow = "Oppijat, jotka osallistuvat harjoitukseen juuri nyt"; +$GroupReply = "Vastaa"; +$GroupReplies = "Vastaukset"; +$ReportByQuestion = "Raportti kysymyksittäin"; +$LiveResults = "Live-tulokset"; +$SkillNotFound = "Taitoa ei löydy"; +$IHaveThisSkill = "Minulla on tämä taito"; $Me = "Minä"; $Vote = "Äänestä"; $Votes = "Äänet"; $XStarsOutOf5 = "%s tähteä viidestä"; +$Visit = "Vieraile"; +$Visits = "Vierailut"; $YourVote = "Äänesi"; $HottestCourses = "Suosituimmat kurssit"; +$SentAtX = "Lähetetty: %s"; +$dateTimeFormatShort = "%b %d, %Y at %I:%M %p"; +$dateTimeFormatShortTimeFirst = "%I:%M %p, %b %d %Y"; $LoginToVote = "Kirjaudu äänestääksesi"; +$AddInMenu = "Lisää valikkoon"; +$AllowUsersToChangeEmailWithNoPasswordTitle = "Salli käyttäjien vaihtaa sähköpostia ilman salasanaa"; +$AllowUsersToChangeEmailWithNoPasswordComment = "Kun muutat tilitietoja"; +$EnableHelpLinkTitle = "Ota käyttöön apua-linkki"; +$EnableHelpLinkComment = "Apua-linkki sijaitsee näytön oikeassa yläkulmassa."; +$BackToAdmin = "Takaisin hallintoon"; +$AllowGlobalChatTitle = "Salli globaali keskustelu"; +$HeaderExtraContentTitle = "Ylimääräinen sisältö otsikossa"; +$HeaderExtraContentComment = "Voit lisätä HTML-koodia, kuten metatageja"; +$FooterExtraContentTitle = "Lisäsisältö alatunnisteessa"; +$AllowGlobalChatComment = "Käyttäjät voivat keskustella keskenään"; +$FooterExtraContentComment = "Voit lisätä HTML-koodia, kuten metatageja"; $DoNotShow = "Älä näytä"; $ShowToAdminsOnly = "Näytä vain ylläpitäjille"; $ShowToAdminsAndTeachers = "Näytä ylläpitäjille ja opettajille"; $ShowToAllUsers = "Näytä kaikille käyttäjille"; +$ImportGlossary = "Tuo sanasto"; +$ReplaceGlossary = "Korvaa sanasto"; +$CannotDeleteGlossary = "Sanastoa ei voi poistaa"; +$TermsImported = "Termit tuotu"; +$TermsNotImported = "Termit, joita ei ole tuotu"; +$ExportGlossaryAsCSV = "Vie sanasto CSV-tiedostona"; +$SelectAnAction = "Valitse toiminto"; $LoginX = "Kirjaudu käyttäjänä: %s"; +$DatabaseXWillBeCreated = "Tietokanta %s luodaan"; +$ADatabaseWithTheSameNameAlreadyExists = "Samanniminen tietokanta on jo olemassa."; +$UserXCantHaveAccessInTheDatabaseX = "Käyttäjällä %s ei ole pääsyä tietokantaan %s."; +$DatabaseXCantBeCreatedUserXDoestHaveEnoughPermissions = "Tietokantaa %s ei voida luoda, käyttäjällä %s ei ole tarpeeksi oikeuksia."; +$CopyOnlySessionItems = "Kopioi vain istunnon kohteita"; +$FirstLetterCourseTitle = "Kurssin nimen ensimmäinen kirjain"; +$NumberOfPublishedExercises = "# julkaistuja harjoituksia"; +$NumberOfPublishedLps = "# julkaistuja oppimispolkuja"; +$ChatConnected = "Chat (Yhdistetty)"; +$ChatDisconnected = "Chat (Yhteys katkaistu)"; $AddCourseDescription = "Lisää kurssin kuvaus"; +$ThingsToDo = "Ehdotetut jatkotoimet"; +$RecordAnswer = "Nauhoita vastaus"; +$UseTheMessageBelowToAddSomeComments = "Käytä alla olevaa viestitystä lisätäksesi kommentin"; +$SendRecord = "Lähetä tietue tai äänitallenne"; +$DownloadLatestRecord = "Lataa äänitallenne"; +$OralExpression = "Suullinen ilmaisu"; +$UsersFoundInOtherPortals = "Muista portaaleista löydetyt käyttäjät"; +$AddUserToMyURL = "Lisää käyttäjä portaaliini"; +$UsersDeleted = "Käyttäjät poistettu"; +$UsersAdded = "Käyttäjät lisätty"; +$PluginArea = "Liitännäisten alue"; +$NoConfigurationSettingsForThisPlugin = "Tälle lisäosalle ei löytynyt määritysasetuksia"; +$CoursesDefaultCreationVisibilityTitle = "Kurssin oletusnäkyvyys"; +$CoursesDefaultCreationVisibilityComment = "Kurssin oletusnäkyvyys uutta kurssia luotaessa"; +$YouHaveEnteredTheCourseXInY = "Olet sisällä kurssissa %s osoitteessa %s."; +$LoginIsEmailTitle = "Käytä sähköpostiosoitetta käyttäjätunnuksena"; +$LoginIsEmailComment = "Käytä sähköpostiosoitetta järjestelmään kirjautumiseen"; +$CongratulationsYouPassedTheTest = "Onnittelut, että läpäisit kokeen!"; +$YouDidNotReachTheMinimumScore = "Et saavuttanut vähimmäispistemäärää"; +$AllowBrowserSnifferTitle = "Aktivoi selaimen haistelija"; +$AllowBrowserSnifferComment = "Tämä antaa tutkijalle mahdollisuuden tutkia ominaisuuksia, jotka tukevat selaimia, jotka muodostavat yhteyden Chamiloon. Näin ollen käyttäjäkokemusta parannetaan mukauttamalla vastaukset yhteyden muodostavan selainalustan tyyppiin, mutta se hidastaa käyttäjien alkuperäisen sivun latautumista joka kerta, kun he siirtyvät alustalle."; $EndTest = "Tarkista vastaukset"; +$EnableWamiRecordTitle = "Aktivoi Wami-tallennin"; +$EnableWamiRecordComment = "Wami-tallennin on Flash-pohjainen äänitallennustyökalu"; +$EventType = "Tapahtuman tyyppi"; +$WamiFlashDialog = "Se näyttää valintaikkunan, jossa kysytään lupaa käyttää mikrofonia, vastaa kyllä ja sulje valintaikkuna (jos et halua, että se näkyy uudelleen, ennen sulkemista ruksita \"muista\")."; +$WamiStartRecorder = "Aloita äänitys painamalla mikrofonia ja lopeta se painamalla uudelleen. Joka kerta, kun teet tämän, syntyy tiedosto."; +$WamiNeedFilename = "Ennen kuin aktivoit tallennuksen, tarvitaan tiedostonimi."; +$InputNameHere = "Kirjoita tiedostonimi tähän"; +$Reload = "Lataa uudelleen"; +$SelectGradeModel = "Valitse arvosanan anto malli"; +$AllMustWeight100 = "Kaikkien arvojen summan on oltava 100"; +$Components = "Komponentit"; +$ChangeSharedSetting = "Muuta näkyvyyttä muille portaaleille"; +$OnlyActiveWhenThereAreAnyComponents = "Tämä vaihtoehto on käytössä, jos sinulla on arviointeja tai kategorioita."; +$AllowHRSkillsManagementTitle = "Sallia HR-taitojen hallinta"; +$AllowHRSkillsManagementComment = "Henkilöstöhallinto voi hallita taitoja"; +$GradebookDefaultWeightTitle = "Oletuspainoarvo Arvosanakirjassa"; +$GradebookDefaultWeightComment = "Tätä painoarvoa käytetään oletusarvoisesti kaikilla kursseilla."; +$TimeSpentLastXDays = "Viimeisten %s päivän aikana vietetty aika"; +$TimeSpentBetweenXAndY = "Aikaa käytetty %s:n ja %s:n välillä"; +$GoToCourse = "Siirry kurssiin"; +$Reset = "Nollaa"; +$TeachersCanChangeScoreSettingsTitle = "Opettajat voivat muuttaa Arvosanakirjan pisteytysasetuksia"; +$TeachersCanChangeScoreSettingsComment = "Kun muokataan Arvosanakirjan-asetuksia"; +$SubTotal = "Välisumma"; +$Configure = "Konfiguroi"; +$Regions = "Alueet"; +$CourseList = "Kurssilista"; +$NumberAbbreviation = "N°"; +$FirstnameAndLastname = "Etunimi ja sukunimi"; +$LastnameAndFirstname = "Sukunimi ja etunimi"; +$Plugins = "Liitännäiset"; +$Detailed = "Yksityiskohtaiset"; +$ResourceLockedByGradebook = "Tämä vaihtoehto ei ole käytettävissä, koska tämä toiminto sisältyy arviointiin, joka on tällä hetkellä lukittu. Voit avata arvioinnin lukituksen kysymällä alustan ylläpitäjältä."; +$GradebookLockedAlert = "Tämä arviointi on lukittu. Et voi avata sitä. Jos haluat todella avata lukituksen, ota yhteyttä alustan ylläpitäjään ja selitä syy, miksi sinun on tehtävä se (sitä voidaan muuten pitää petosyrityksenä)."; +$GradebookEnableLockingTitle = "Ota käyttöön Opettajat voivat lukita arvioinnin"; +$GradebookEnableLockingComment = "Kun tämä vaihtoehto on otettu käyttöön, kyseisen kurssin opettajat voivat lukita minkä tahansa arvioinnin. Tämä puolestaan estää opettajaa muuttamasta tuloksia arvioinnissa käytettyjen resurssien sisällä: tentit, oppimispolut, tehtävät jne. Ainoa rooli, jolla on oikeus avata lukitun arvioinnin lukitus, on ylläpitäjä. Opettajalle ilmoitetaan tästä mahdollisuudesta. Arvosanakirjojen lukitus ja lukituksen avaaminen kirjataan järjestelmän raporttiin tärkeistä toiminnoista."; +$LdapDescriptionComment = "LDAP authentication : käännä muuttuja LdapDescriptionComment"; +$ShibbolethMainActivateTitle = "Shibboleth authentication"; +$ShibbolethMainActivateComment = "Sinun pitää konfiguroida Shibboleth - Käännä muuttuja ShibbolethMainActivateComment"; +$LdapDescriptionTitle = "LDAP autentication"; +$FacebookMainActivateTitle = "Facebook-todennus"; +$FacebookMainActivateComment = "Luo Facebook aplikaatio - Käännä muuttuja FacebookMainActivateComment"; +$AnnouncementForGroup = "Ilmoitus ryhmälle"; +$AllGroups = "Kaikki ryhmät"; +$LanguagePriority1Title = "Kielen prioriteetti 1"; +$LanguagePriority2Title = "Kielen prioriteetti 2"; +$LanguagePriority3Title = "Kielen prioriteetti 3"; +$LanguagePriority4Title = "Kielen prioriteetti 4"; +$LanguagePriority5Title = "Kielen prioriteetti 5"; +$LanguagePriority1Comment = "Kieli, jolla on korkein prioriteetti"; +$LanguagePriority2Comment = "Toisen kielen prioriteetti"; +$LanguagePriority3Comment = "Kolmannen kielen prioriteetti"; +$LanguagePriority4Comment = "Neljännen kielen prioriteetti"; +$LanguagePriority5Comment = "Alin kieliprioriteetti"; +$UserLanguage = "Käyttäjän kieli"; +$UserSelectedLanguage = "Käyttäjän valitsema kieli"; +$TeachersCanChangeGradeModelSettingsTitle = "Opettajat voivat muuttaa Arvosanakirjamallin asetuksia"; +$TeachersCanChangeGradeModelSettingsComment = "Kun muokataan Arvosanakirjaa"; +$GradebookDefaultGradeModelTitle = "Oletusarvoinen Arvosanamalli"; +$GradebookDefaultGradeModelComment = "Tämä arvo valitaan oletusarvoisesti kurssia luotaessa."; +$GradebookEnableGradeModelTitle = "Ota käyttöön Arvosanakirjamalli"; +$GradebookEnableGradeModelComment = "Mahdollistaa arvosanakirjakategorioiden automaattisen luomisen kurssin sisällä riippuen arvosanakirjamalleista."; +$ConfirmToLockElement = "Haluatko varmasti lukita tämän kohteen? Tämän kohteen lukitsemisen jälkeen et voi muokata käyttäjän tuloksia. Voit poistaa lukituksen ottamalla yhteyttä alustan ylläpitäjään."; +$ConfirmToUnlockElement = "Oletko varma, että haluat avata tämän elementin?"; +$AllowSessionAdminsToSeeAllSessionsTitle = "Salli istunnon ylläpitäjien nähdä kaikki istunnot"; +$AllowSessionAdminsToSeeAllSessionsComment = "Kun tämä vaihtoehto ei ole käytössä (oletusarvo), istuntojen ylläpitäjät näkevät vain luomansa istunnot. Tämä on hämmentävää avoimessa ympäristössä, jossa istunnon ylläpitäjien on ehkä jaettava tukiaikaa kahden istunnon välillä."; +$PassPercentage = "Läpäisyprosentti"; +$AllowSkillsToolTitle = "Salli Taidot-työkalu"; +$AllowSkillsToolComment = "Käyttäjät näkevät taitonsa sosiaalisessa verkostossa ja etusivun lohkossa."; +$AllowPublicCertificatesTitle = "Salli julkiset varmenteet"; +$AllowPublicCertificatesComment = "Rekisteröimättömät käyttäjät voivat tarkastella todistuksia."; +$DragAndDropAnElementHere = "Vedä ja pudota elementti tähän"; +$PlatformUnsubscribeTitle = "Salli tilauksen peruuttaminen alustalta"; +$PlatformUnsubscribeComment = "Ottamalla tämän vaihtoehdon käyttöön annat kenelle tahansa käyttäjälle mahdollisuuden poistaa lopullisesti oman tilinsä ja kaikki siihen liittyvät tiedot alustalta. Tämä on melko radikaali toimenpide, mutta se on välttämätön yleisölle avatuissa portaaleissa, joissa käyttäjät voivat rekisteröityä automaattisesti. Käyttäjäprofiiliin ilmestyy lisämerkintä, jonka avulla voit peruuttaa tilauksen vahvistuksen jälkeen."; +$UnsubscribeFromPlatform = "Jos haluat peruuttaa tilauksen kokonaan tältä kampukselta ja saada kaikki tietosi poistettua tietokannastamme, klikkaa alla olevaa painiketta ja vahvista."; +$UnsubscribeFromPlatformConfirm = "Kyllä, haluan poistaa tämän tilin kokonaan. Mitään tietoja ei jää palvelimelle, enkä voi kirjautua uudelleen, ellen luo täysin uutta tiliä."; +$UnsubscribeFromPlatformSuccess = "Tilisi %s on poistettu kokonaan tästä portaalista. Kiitos, että pysyit kanssamme jonkin aikaa. Toivottavasti näemme sinut myöhemmin uudelleen."; +$UpdateRequire = "Päivitys vaaditaan"; +$ToPlayTheMediaYouWillNeedToUpdateYourBrowserToARecentVersionYouCanAlsoDownloadTheFile = "Jotta voit toistaa mediaa, sinun on joko päivitettävä selaimesi uusimpaan versioon tai päivitettävä Flash-lisäosa. Tarkista, onko tiedostolla oikea tiedostopääte."; +$AlreadyRegisteredToCourse = "Olet jo rekisteröitynyt kurssille"; +$Unsubscribe = "Peruuta tilaus"; +$MailTemplateRegistrationTitle = "Uusi käyttäjä ((sitename))"; +$MailTemplateRegistrationMessage = "Hyvä ((firstname)) ((lastname)),\n\nOlet rekisteröitynyt ((sitename)) seuraavilla asetuksilla:\n\nKäyttäjätunnus : ((username))\nPass : ((password))\n\nOsoite ((sitename)) on : ((url))\n\nOngelmatapauksissa ota meihin yhteyttä.\n\n\nTerveisin \n((admin_name)) ((admin_surname))."; +$EnableIframeInclusionTitle = "Salli iframe HTML-editorissa"; +$EnableIframeInclusionComment = "Mielivaltaisten iframe-kehysten salliminen HTML-editorissa parantaa käyttäjien muokkausmahdollisuuksia, mutta se voi olla turvallisuusriski. Varmista, että voit luottaa käyttäjiin (eli tiedät, keitä he ovat), ennen kuin otat tämän ominaisuuden käyttöön."; +$ThisItemIsInvisibleForStudentsButYouHaveAccessAsTeacher = "Tämä kohde on näkymätön oppijalle, mutta sinulla on siihen pääsy opettajana."; +$ShowHotCoursesTitle = "Näytä suositut kurssit"; +$ShowHotCoursesComment = "Suosituimpien kurssien luettelo lisätään kirjautumissivulle (julkinen) / hakemistosivulle."; +$AddedToLPCannotBeAccessed = "Tämä harjoitus on sisällytetty oppimispolkuun, joten opiskelijat eivät pääse siihen suoraan tästä. Jos haluat laittaa saman harjoituksen saataville harjoitustyökalun kautta, tee kopio nykyisestä harjoituksesta kopiointikuvakkeella."; +$UsersRegisteredInAnyGroup = "Mihin tahansa ryhmään rekisteröityneet käyttäjät"; +$DontForgetToSelectTheMediaFilesIfYourResourceNeedIt = "Älä unohda valita mediatiedostoja, jos resurssisi tarvitsee sitä."; +$NoStudentCertificatesAvailableYet = "Oppilastodistus ei ole vielä saatavilla. Huomaa, että saadakseen todistuksen oppijan on mentävä arviointityökaluun ja napsautettava todistuskuvaketta, joka tulee näkyviin vasta, kun hän on saavuttanut kurssin tavoitteet."; +$CertificateExistsButNotPublic = "Pyydetty todistus on olemassa tässä portaalissa, mutta sitä ei ole julkistettu. Kirjaudu sisään nähdäksesi sen."; +$Default = "Oletus"; +$CourseTestWasCreated = "Testikurssi on luotu onnistuneesti"; +$NoCategorySelected = "Kategoriaa ei valittuna"; +$ReturnToCourseHomepage = "Paluu kurssin kotisivulle"; +$ExerciseAverage = "Harjoituksen keskiarvo"; +$WebCamClip = "Webkamera klippi"; +$Snapshot = "Kuva"; +$TakeYourPhotos = "Ota valokuvasi"; +$LocalInputImage = "Lisää paikallinen kuva"; +$ClipSent = "Klippi lähetetty"; +$Auto = "Automaattinen"; +$Stop = "Stop"; +$EnableWebCamClipTitle = "Ota webkameran valokuvat käyttöön"; +$EnableWebCamClipComment = "Webcam valokuvan avulla käyttäjät voivat kaapata kuvia webbikamerastaan ja lähettää ne palvelimelle JPEG-muodossa (.jpg tai .jpeg)."; +$ResizingAuto = "AUTOMAATTINEN KOON MUUTTAMINEN (oletus)"; +$ResizingAutoComment = "Tämä diaesitys muuttaa kokoa automaattisesti näytön koon mukaan. Tämä on oletusvaihtoehto."; +$YouShouldCreateTermAndConditionsForAllAvailableLanguages = "Sinun on luotava \"Ehdot\" kaikille käytettävissä oleville kielille."; +$SelectAnAudioFileFromDocuments = "Valitse äänitiedosto dokumenteista"; +$ActivateEmailTemplateTitle = "Ota käyttöön sähköpostihälytysmallit"; +$ActivateEmailTemplateComment = "Määrittele omat sähköpostihälytykset, jotka lähetetään tietyistä tapahtumista (ja tietyille käyttäjille)."; +$SystemManagement = "Järjestelmän hallinta"; +$RemoveOldDatabaseMessage = "Poista vanha tietokanta"; +$RemoveOldTables = "Poista vanhat taulukot"; +$TotalSpaceUsedByPortalXLimitIsYMB = "Portaalin käyttämä kokonaistila: %s (määritetty raja on %sMB)."; +$EventMessageManagement = "Tapahtumien viestien hallinta"; +$ToBeWarnedUserList = "Varoitettavien käyttäjien lista"; +$YouHaveSomeUnsavedChanges = "Sinulla on joitakin tallentamattomia muutoksia. Haluatko hylätä ne?"; +$ActivateEvent = "Aktivoi tapahtuma"; +$AvailableEventKeys = "Käytettävissä olevat toimintonäppäimet. Käytä niitä (( )) välissä."; +$Events = "Tapahtumat"; +$EventTypeName = "Tapahtumatyypin nimi"; +$HideCampusFromPublicPlatformsList = "Piilota kampus julkisten alustojen luettelosta"; +$ChamiloOfficialServicesProviders = "Chamilon viralliset palvelun tarjoajat"; +$NoNegativeScore = "Ei negatiivista pistemäärää"; +$GlobalMultipleAnswer = "Globaali monivastaus"; +$Zombies = "Zombit"; +$ActiveOnly = "Vain aktiiviset"; +$AuthenticationSource = "Tunnistuslähde"; +$RegisteredDate = "Rekisteröitymispäivä"; +$NbInactiveSessions = "Epäaktiivisten istuntojen määrä"; +$AllQuestionsShort = "Kaikki"; +$FollowedUsers = "Seuratut käyttäjät"; +$FollowedCourses = "Seuratut kurssit"; +$FollowedSessions = "Seuratut istunnot"; +$Timeline = "Aikajana"; +$ExportToPDFOnlyHTMLAndImages = "Vie PDF-tiedostoksi verkkosivut ja kuvat"; $CourseCatalog = "Kurssikatalogi"; +$Go = "Mene"; +$ProblemsRecordingUploadYourOwnAudioFile = "Ongelmia tallentamisessa? Lataa oma äänitiedostosi."; +$ImportThematic = "Tuo kurssin edistyminen"; +$ExportThematic = "Vie kurssin edistyminen"; +$DeleteAllThematic = "Poista kaikki kurssin edistyminen"; +$FilterTermsTitle = "Suodata termit"; +$FilterTermsComment = "Anna rivi kerrallaan luettelo termeistä, jotka on suodatettava pois verkkosivuilta ja sähköposteista. Nämä termit korvataan sanalla ***."; +$UseCustomPagesTitle = "Käytä mukautettuja sivuja"; +$UseCustomPagesComment = "Ota tämä toiminto käyttöön määrittääksesi tietyt kirjautumissivut roolin mukaan."; +$StudentPageAfterLoginTitle = "Oppijan sivu kirjautumisen jälkeen"; +$StudentPageAfterLoginComment = "Tämä sivu tulee näkyviin kaikille oppijoille kirjautumisen jälkeen."; +$TeacherPageAfterLoginTitle = "Opettajan sivu kirjautumisen jälkeen"; +$TeacherPageAfterLoginComment = "Tämä sivu ladataan kirjautumisen jälkeen kaikille opettajille."; +$DRHPageAfterLoginTitle = "Henkilöstöpäällikön sivu kirjautumisen jälkeen"; +$DRHPageAfterLoginComment = "Tämä sivu latautuu kirjautumisen jälkeen kaikille henkilöstöpäälliköille."; +$StudentAutosubscribeTitle = "Oppijan automaattinen tilaus"; +$StudentAutosubscribeComment = "Oppijan automaattinen tilaus - ei vielä käytettävissä"; +$TeacherAutosubscribeTitle = "Opettajan automaattinen tilaus"; +$TeacherAutosubscribeComment = "Opettajan automaattinen tilaus - ei vielä saatavilla"; +$DRHAutosubscribeTitle = "Henkilöstöjohtajan automaattinen tilaus"; +$DRHAutosubscribeComment = "Henkilöstöjohtajan automaattinen tilaus - ei vielä saatavilla"; +$ScormCumulativeSessionTimeTitle = "SCORM-istunnon kumulatiivinen aika"; +$ScormCumulativeSessionTimeComment = "Kun tämä on käytössä, SCORM-oppimispolkujen istuntoaika on kumulatiivinen, muutoin se lasketaan vain viimeisimmästä päivitysajasta. Tämä on globaali asetus. Sitä käytetään uutta oppimispolkua luotaessa, mutta se voidaan määrittää uudelleen jokaiselle oppimispolulle."; +$SessionAdminPageAfterLoginTitle = "Istunnon hallinnoijan sivu kirjautumisen jälkeen"; +$SessionAdminPageAfterLoginComment = "Sivu, joka ladataan sisäänkirjautumisen jälkeen istunnon ylläpitäjille."; +$SessionadminAutosubscribeTitle = "Istunnon ylläpitäjän automaattinen tilaus"; +$SessionadminAutosubscribeComment = "Istunnon ylläpitäjän automaattinen tilaus - ei vielä käytettävissä"; +$ToolVisibleByDefaultAtCreationTitle = "Työkalu näkyy kurssin luomisessa"; +$ToolVisibleByDefaultAtCreationComment = "Valitse työkalut, jotka ovat näkyvissä kursseja luotaessa - ei vielä käytettävissä."; +$casAddUserActivatePlatform = "Luo käyttäjätili kaikille uusille CAS-tunnistautuneille käyttäjille alusta alkaen."; +$casAddUserActivateLDAP = "Luo LDAP:stä käyttäjätili kaikille uusille CAS-autentikoiduille käyttäjille."; +$UpdateUserInfoCasWithLdapTitle = "CAS-autentikoidun käyttäjätilin tietojen päivittäminen LDAP:stä"; +$UpdateUserInfoCasWithLdapComment = "Varmistaa, että käyttäjän etunimi, sukunimi ja sähköpostiosoite ovat samat kuin LDAP-hakemiston nykyiset arvot."; +$InstallExecution = "Asennusprosessin suorittaminen"; +$UpdateExecution = "Päivitysprosessin suorittaminen"; +$PleaseWaitThisCouldTakeAWhile = "Odottakaa. Tämä voi kestää jonkin aikaa..."; +$ThisPlatformWasUnableToSendTheEmailPleaseContactXForMoreInformation = "Tämä alusta ei pystynyt lähettämään sähköpostia. Ota yhteyttä %s:ään saadaksesi lisätietoja."; +$FirstLoginChangePassword = "Tämä on ensimmäinen kirjautumisesi. Päivitä salasanasi johonkin, jonka muistat."; +$NeedContactAdmin = "Ota yhteyttä ylläpitäjään klikkaamalla tästä"; +$ShowAllUsers = "Näytä kaikki käyttäjät"; +$ShowUsersNotAddedInTheURL = "Näytä käyttäjät, joita ei ole lisätty URL-osoitteeseen"; +$UserNotAddedInURL = "Käyttäjät, joita ei ole lisätty URL-osoitteeseen"; +$UsersRegisteredInNoSession = "Käyttäjät, jotka eivät ole rekisteröityneet mihinkään istuntoon"; +$CommandLineInterpreter = "Komentorivitulkki (CLI)"; +$PleaseVisitOurWebsite = "Vieraile verkkosivuillamme: https://chamilo.org/download"; +$SpaceUsedOnSystemCannotBeMeasuredOnWindows = "Levyllä käytettyä tilaa ei voida mitata kunnolla Windows-pohjaisissa järjestelmissä."; +$XOldTablesDeleted = "%d vanhoja taulukoita poistettu"; +$XOldDatabasesDeleted = "%d vanhoja tietokantoja poistettu"; +$List = "Lista"; +$MarkAll = "Valitse kaikki"; +$UnmarkAll = "Poista kaikki valinnat"; +$NotAuthorized = "Ei sallittu"; +$UnknownAction = "Tuntematon toiminta"; +$First = "Ensimmäinen"; +$Last = "Viimeinen"; +$YouAreNotAuthorized = "Sinulla ei ole lupaa tehdä tätä"; +$NoImplementation = "Tätä toimintoa ei ole vielä otettu käyttöön"; +$CourseDescriptions = "Kurssikuvaukset"; +$ReplaceExistingEntries = "Korvaa olemassa olevat merkinnät"; +$AddItems = "Lisää kohteita"; +$NotFound = "Ei löydy"; +$SentSuccessfully = "Onnistuneesti lähetetty"; +$SentFailed = "Lähettäminen epäonnistui"; +$PortalSessionsLimitReached = "Tämän portaalin istuntojen lukumäärän raja on saavutettu."; +$ANewSessionWasCreated = "Uusi istunto on luotu"; +$Online = "Online"; +$Offline = "Offline"; +$TimelineItemText = "Teksti"; +$TimelineItemMedia = "Media"; +$TimelineItemMediaCaption = "Kuvateksti"; +$TimelineItemMediaCredit = "Krediitit"; +$TimelineItemTitleSlide = "Liukusäätimen otsikko"; +$SSOError = "Single Sign On -virhe"; +$Sent = "Lähetetty"; +$TimelineItem = "Kohde"; +$Listing = "Luettelo"; +$CourseRssTitle = "Kurssi RSS"; +$CourseRssDescription = "RSS-syöte kaikille kurssi-ilmoituksille"; +$AllowPublicCertificates = "Oppijan todistukset ovat julkisia"; +$GlossaryTermUpdated = "Termi päivitetty"; +$DeleteAllGlossaryTerms = "Poista kaikki termit ennen tuontia."; +$PortalHomepageEdited = "Portaalin kotisivu päivitetty"; +$UserRegistrationTitle = "Käyttäjän rekisteröinti"; +$UserRegistrationComment = "Toiminnot, jotka käynnistetään, kun käyttäjä rekisteröityy alustalle."; +$ExtensionShouldBeLoaded = "Tämä laajennus pitäisi ladata."; +$Disabled = "Pois käytöstä"; +$Required = "Vaadittu"; +$CategorySaved = "Kategoria tallennettu"; +$CategoryRemoved = "Kategoria poistettu"; +$BrowserDoesNotSupportNanogongPlayer = "Selaimesi ei tue Nanogong-soitinta"; +$ImportCSV = "Tuo CSV"; +$DataTableLengthMenu = "Taulukon pituus"; +$DataTableZeroRecords = "Tietuetta ei löytynyt"; +$MalformedUrl = "Huonosti muotoiltu URL-osoite"; +$DataTableInfo = "Info"; +$DataTableInfoEmpty = "Tyhjä"; +$DataTableInfoFiltered = "Suodatettu"; +$DataTableSearch = "Etsi"; +$HideColumn = "Piilota sarake"; +$DisplayColumn = "Näytä sarake"; +$LegalAgreementAccepted = "Oikeudellinen sopimus hyväksytty"; +$TheXMLImportLetYouAddMoreInfoAndCreateResources = "XML-tuonnin avulla voit lisätä lisätietoja ja luoda resursseja (kursseja, käyttäjiä). CSV-tuonti luo vain istuntoja ja antaa sinun määrittää olemassa olevia resursseja niille."; +$GlobalPlatformInformation = "Globaalit alustan tiedot"; +$NumberOfUsersActive = "Aktiivisten käyttäjien määrä"; +$NumberOfCoursesTotal = "Kurssien kokonaismäärä"; +$NumberOfCoursesClosed = "Päättyneiden kurssien määrä"; +$NumberOfCoursesPrivate = "Yksityisten kurssien määrä"; +$NumberOfCoursesOpen = "Avoimien kurssien määrä"; +$NumberOfCoursesPublic = "Julkisten kurssien määrä"; +$ToProtectYourSiteMakeXReadOnlyAndDeleteY = "Voit suojata sivustosi asettamalla koko %s-hakemiston \"vain luku\" -tilaan (chmod -R 0555 Linuxissa) ja poistamalla %s-hakemiston."; +$YouWillBeRedirectedInXSeconds = "Hetkinen vain. Sinut ohjataan uudelleen %s sekunnin kuluttua..."; +$HelpFolderLearningPaths = "AINOASTAAN OPETTAJAN NÄHTÄVISSÄ OLEVAT TIEDOT:\nTämä kansio sisältää dokumentteja, jotka on luotu Oppimispolku-työkalulla. Tässä kansiossa voit muokata HTML-tiedostoa, jotka luodaan tuomalla sisältöä Oppimispolusta, kuten esimerkiksi Chamilo Rapid -ohjelman tuomia. Suosittelemme tämän kansion piilottamista opiskelijoilta."; +$ImportUsers = "Tuo käyttäjiä"; +$UnsubscribeUsersAlreadyAddedInCourse = "Poista jo lisättyjen käyttäjien tilaukset"; +$HelloXAsYouCanSeeYourCourseListIsEmpty = "Hei %s ja tervetuloa, Kurssilistasi on edelleen tyhjä, koska et ole rekisteröitynyt vielä millekään kurssille."; +$GoAheadAndBrowseOurCourseCatalogXOnceRegisteredYouWillSeeTheCourseHereX = "Siirry eteenpäin ja selaa kurssiluetteloamme %s rekisteröityäksesi mille tahansa haluamallesi kurssille. Kun olet rekisteröitynyt, näet kurssin oikealla %s, tämän viestin sijasta."; +$here = "täällä"; +$DirectLink = "Suora linkki"; +$CourseSettingsRegisterDirectLink = "Jos kurssisi on julkinen tai avoin, voit käyttää alla olevaa suoraa linkkiä lähettääksesi kutsun uusille käyttäjille, jotta he rekisteröitymisen jälkeen pääsevät suoraan kurssille. Voit myös lisätä URL-osoitteeseen e=1-parametrin ja korvata \"1\" harjoituksen tunnuksella, jolloin heidät lähetetään suoraan tiettyyn tenttiin. Harjoituksen ID näkyy URL-osoitteesta, kun klikkaat harjoitusta avataksesi sen. %s"; +$ProfileSearch = "Profiilihaku"; +$WhatSkillsAreYouLookingFor = "Mitä taitoja etsit?"; +$IsThisWhatYouWereLookingFor = "Tätäkö etsit?"; +$SearchProfileMatches = "Etsi profiilin osumia"; +$CreateChildSkill = "Luo alataito"; +$ShortCode = "Lyhyt koodi"; +$AddSkillToProfileSearch = "Lisää taito profiilihakuun"; +$SkillsAcquired = "Hankitut taidot"; +$CurrentlyLearning = "Tällä hetkellä oppimassa"; +$Rank = "Sijoitus"; +$MissingXStepsToMatch = "Puuttuvat %s vaihetta"; +$CompleteMatch = "Täydellinen osuma"; +$MissingOneStepToMatch = "Puuttuu yksi vaihe"; +$ViewSkillsWheel = "Näytä taitojen pyörä"; +$GetNewSkills = "Hanki uusia taitoja"; +$SkillInfo = "Taidon tiedot"; +$SkillRoot = "Juuri"; +$ManageSkills = "Hallinnoi taitoja"; +$YourSkillRankingX = "Taitosi ranking: %s"; +$ToGetToLearnXYouWillNeedToTakeOneOfTheFollowingCourses = "Jotta voisit oppia %s:n, sinun on suoritettava jokin seuraavista kursseista:"; +$SkillXWithCourseX = "%s %s kanssa"; +$ClickToZoom = "Klikkaa zoomataksesi"; +$Legend = "Selite"; +$SkillsYouCanLearn = "Taidot, joita voit oppia"; +$SkillsSearchedFor = "Etsityt Taidot"; +$SkillsYouAcquired = "Hankkimasi taidot"; +$SkillsWheel = "Taitopyörä"; +$SkillsImport = "Taitojen tuonti"; +$ImportSkillsListCSV = "Tuo taitoja CSV-tiedostosta"; +$SkillsRanking = "Taitojen ranking"; +$UserHasNoCourse = "Tämä käyttäjä ei ole tilannut mitään kurssia"; +$SessionDisplayStartDate = "Näytettävä aloituspäivämäärä"; +$SessionDisplayEndDate = "Näytettävä loppupäivä"; +$SessionStartDate = "Pääsyn alkamispäivä"; +$SessionEndDate = "Pääsyn päättymispäivä"; +$SessionCoachStartDate = "Valmentajien pääsyn alkamispäivä"; +$SessionCoachEndDate = "Valmentajien pääsyn päättymispäivä"; +$SessionDisplayStartDateComment = "Päivämäärä, joka näkyy istuntotiedoissa istunnon alkamispäivämääränä."; +$SessionDisplayEndDateComment = "Päivämäärä, joka näkyy istuntotiedoissa istunnon päättymispäivämääränä."; +$SessionStartDateComment = "Päivä, jolloin istunto on tehty kaikkien saataville."; +$SessionEndDateComment = "Päivä, jolloin istunto suljetaan"; +$SessionCoachStartDateComment = "Päivämäärä, jolloin istunto on valmentajien saatavilla, jotta he voivat valmistella sen ennen kuin oppilaat saavat yhteyden."; +$SessionCoachEndDateComment = "Päivämäärä, jolloin istunto suljetaan valmentajilta. Lisäviiveen ansiosta he voivat viedä kaikki asiaankuuluvat seurantatiedot."; +$CopyLabelSuffix = "Kopioi"; +$SessionFields = "Istunnon kentät"; +$Example = "Esimerkki"; +$ManageSessionFields = "Istunnon kenttien hallinta"; +$PleaseAllowUsALittleTimeToSubscribeYouToOneOfOurCourses = "Anna meille hieman aikaa ilmoittaa sinut jollekin kurssillemme. Jos luulet, että unohdimme sinut, ota yhteyttä portaalin ylläpitäjiin. Löydät heidän yhteystietonsa yleensä tämän sivun alalaidasta."; +$UserInactivedSinceX = "Käyttäjä epäaktiivinen %s alkaen"; +$ExerciseDescriptionLabel = "Kuvaus"; +$EditExtraFieldOptions = "Muokkaa lisäkentän vaihtoehtoja"; +$Order = "Järjestys"; +$SessionCalendar = "Istuntokalenteri"; +$UserAttendedSymbol = "L"; +$UserNotAttendedSymbol = "EL"; +$SessionTutorsCanSeeExpiredSessionsResultsTitle = "Istunnon ohjaajien raporttien näkyvyys"; +$SessionTutorsCanSeeExpiredSessionsResultsComment = "Voivatko istunnon ohjaajat nähdä istuntonsa raportit sen jälkeen, kun istunto on päättynyt?"; +$Admin = "Järjestelmänvalvoja"; +$SessionCourseCoach = "Istuntokurssin valmentaja"; +$SessionGeneralCoach = "Istunnon yleisvalmentaja"; +$StudentInCourse = "Opiskelija kurssilla"; +$StudentInSessionCourse = "Opiskelija istuntokurssilla"; +$CourseTutor = "Kurssin ohjaaja"; +$dateFormatShortNumberNoYear = "%d/%m"; +$ReturnToCourseList = "Palaa kurssiluetteloon"; +$dateFormatOnlyDayName = "%A"; +$dateFormatLongNoDay = "%d %B %Y"; +$DeleteAllCertificates = "Poista kaikki todistukset"; +$ExportAllCertificatesToPDF = "Vie kaikki todistukset PDF-muodossa"; +$GenerateCertificates = "Luo todistukset"; +$LowerCaseUser = "käyttäjä"; +$TotalAvailableUsers = "Käytettävissä olevat käyttäjät yhteensä"; +$ThisValueIsUsedInTheCourseURL = "Tätä arvoa käytetään kurssin URL-osoitteessa"; +$ThisValueCantBeChanged = "Tätä arvoa ei voi muuttaa."; +$ClickOnTheLearnerViewToSeeYourLearningPath = "Klikkaa [Oppijanäkymä]-painiketta nähdäksesi Oppimispolkusi."; +$EditSettings = "Muokkaa asetuksia"; +$EditQuestions = "Muokkaa kysymyksiä"; +$ManHours = "Miestyötunnit"; +$NotesObtained = "Saadut huomautukset"; +$Approved = "Hyväksytty"; +$TrainingHoursAccumulated = "Kertyneet koulutustunnit"; +$CountOfSubscribedUsers = "Ilmoittautuneiden käyttäjien määrä"; +$AverageHoursPerStudent = "Keskim. tunnit/opiskelija"; +$CountCertificates = "Todistusten määrä"; +$SessionPageEnabledTitle = "Ota istuntolinkki käyttöön kurssiluettelossa"; +$SessionPageEnabledComment = "Kun tämä vaihtoehto on käytössä, istunnon otsikko on linkki kyseiselle istuntosivulle. Kun se on poistettu käytöstä, se on vain tekstimuotoinen otsikko ilman linkkiä. Linkitetty istuntosivu saattaa hämmentää joitakin käyttäjiä, minkä vuoksi se kannattaa poistaa käytöstä."; +$StartDateMustBeBeforeTheEndDate = "Alkamispäivän on oltava ennen päättymispäivää"; +$SetPrerequisiteForEachItem = "Aseta edellinen vaihe kunkin vaiheen ennakkoedellytykseksi."; +$ClearAllPrerequisites = "Tyhjennä kaikki ennakkoedellytykset"; +$PrerequisitesOptions = "Ennakkoedellytysten vaihtoehdot"; +$Categories = "Kategoriat"; +$AbsoluteScore = "Absoluuttinen pistemäärä"; +$RelativeScore = "Suhteellinen pistemäärä"; +$OralQuestionsAttempted = "Oppija on yrittänyt yhtä tai useampaa suullista kysymystä."; +$OralQuestionsAttemptedAreX = "Yritettävät suulliset kysymykset ovat %s"; +$GenerateSurveyAccessLink = "Luo kyselyn pääsylinkki"; +$GenerateSurveyAccessLinkExplanation = "Kopioimalla alla olevan linkin ja liittämällä sen sähköpostiin tai verkkosivustolle annat kenelle tahansa nimettömälle henkilölle mahdollisuuden osallistua kyselyyn ja vastata siihen. Voit testata tätä ominaisuutta klikkaamalla yllä olevaa linkkiä ja vastaamalla kyselyyn. Tämä on erityisen hyödyllistä, jos haluat antaa kenen tahansa foorumilla olevan henkilön vastata kyselyyn etkä tiedä heidän sähköpostiosoitettaan."; +$PortalUsersLimitReached = "Valitettavasti tällä asennuksella on käyttäjäraja, joka on nyt saavutettu. Jos haluat lisätä tämän Chamilo-asennuksen sallittua käyttäjämäärää, ota yhteyttä hosting-palveluntarjoajaan tai, jos mahdollista, vaihda parempaan hosting-pakettiin."; +$PortalTeachersLimitReached = "Valitettavasti tällä asennuksella on opettajien raja, joka on nyt saavutettu. Jos haluat lisätä opettajien määrää tässä Chamilo-asennuksessa, ota yhteyttä hosting-palveluntarjoajaan tai, jos mahdollista, vaihda parempaan hosting-pakettiin."; +$PortalCoursesLimitReached = "Valitettavasti tällä asennuksella on kurssiraja, joka on nyt saavutettu. Jos haluat lisätä tässä Chamilo-asennuksessa sallittujen kurssien määrää, ota yhteyttä hosting-palveluntarjoajaan tai, jos mahdollista, vaihda parempaan hosting-pakettiin."; +$CheckThatYouHaveEnoughQuestionsInYourCategories = "Varmista, että kategorioissasi on riittävästi kysymyksiä."; +$QuestionGlobalCategory = "Globaali kategoria"; +$ConfigExercise = "Konfiguroi Harjoitukset -työkalu"; +$RedirectToExercise = "Ohjaa valittuun harjoitukseen"; +$RedirectToTheExerciseList = "Ohjaa harjoitusluetteloon"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToAnSpecificExercise = "Harjoitusten automaattisen käynnistysominaisuuden määritys on käytössä. Oppijat ohjataan automaattisesti valittuun harjoitukseen."; +$EnrollToCourseXSuccessful = "Sinut on rekisteröity kurssille: %s"; +$CountOfSubscriptions = "Ilmoittautuneiden lukumäärä"; +$CountOfUsers = "Käyttäjien määrä"; +$CertificateGenerated = "Generoitu todistus"; +$CourseAdvance = "Kurssin edistyminen"; +$SkillImportNoID = "Taito ID-tunnusta ei ole asetettu"; +$SkillImportNoParent = "Päätaitoa ei asetettu"; +$SkillImportNoName = "Taidolla ei ollut nimeä"; +$FileImportedJustSkillsThatAreNotRegistered = "Vain taitoja, joita ei ollut rekisteröity, tuotiin"; +$IPAddress = "IP-osoite"; +$Attended = "Osallistui"; +$NotAttended = "Ei osallistunut"; +$YouHaveBeenRegisteredToCourseX = "Olet rekisteröitynyt kurssille %s"; +$YouCanAccessTheExercise = "Mene testiin"; +$ForumCategory = "Foorumin kategoria"; +$RecoverDropboxFiles = "Palauta dropbox-tiedostot"; +$Recovered = "Palautettu"; +$Recover = "Palauta"; +$Filename = "Tiedostonimi"; +$UploadedDate = "Latauspäivämäärä"; +$ForceEditingExerciseInLPWarning = "Sinulla on oikeus muokata tätä harjoitusta, vaikka sitä on jo käytetty oppimispolulla. Jos muokkaat sitä, yritä välttää pistemäärän muuttamista ja keskity muokkaamaan sisältöä, älä arvoja tai kategoriaa, jotta et vaikuta aiempien käyttäjien tuloksiin, jotka ovat jo tehneet tämän kokeen."; +$Media = "Media"; +$ExamModeWithFinalScoreShowOnlyFinalScoreWithCategoriesIfAvailable = "Näytä vain lopullinen pistemäärä ja kategoriat jos saatavilla"; +$AttachToMedia = "Kiinnitä mediaan"; +$NoMedia = "Ei linkitetty mediaan"; +$GradebookFailed = "Epäonnistunut"; +$GradebookPoor = "Heikko"; +$GradebookFair = "Tyydyttävä"; +$GradebookGood = "Hyvä"; +$GradebookOutstanding = "Erinomainen"; +$GradebookExcellent = "Erinomainen"; +$Company = "Yritys"; +$YouHaveToAddXAsAFriendFirst = "Sinun on ensin lisättävä %s ystäväksi."; +$AllDay = "Koko päivä"; +$AdvancedEdit = "Edistynyt muokkaus"; +$MailSubjectReplyShort = "VS:"; +$SelectACategory = "Valitse kategoria"; +$AllowTeachersToCreateSessionsTitle = "Salli opettajien luoda istuntoja"; +$AllowTeachersToCreateSessionsComment = "Opettajat voivat luoda, muokata ja poistaa omia istuntojaan."; +$ViewModeImpress = "Nykyinen näkymätila: Vaikuttava"; +$MailMarkSelectedAsRead = "Merkitse luetuksi"; +$MailMarkSelectedAsUnread = "Merkitse lukemattomaksi"; +$SelectedMessagesRead = "Valitut viestit on merkitty luetuiksi"; +$SelectedMessagesUnRead = "Valitut viestit on merkitty lukemattomiksi"; +$PaginationXofY = "%s %s:sta"; +$AllQuestionsMustHaveACategory = "Kaikilla kysymyksillä on oltava kategoria, jotta voit käyttää satunnaisotanta-luokittain -tilaa."; +$FilterAll = "Suodatin: Kaikki"; +$FilterByGroup = "Suodata ryhmän mukaan"; +$FilterByUser = "Suodata käyttäjän mukaan"; +$AdminLoginAsAllowedTitle = "\"Kirjaudu sisään nimellä\" -toiminto"; +$AdminLoginAsAllowedComment = "Sallitaanko käyttäjille, joilla on asianmukaiset oikeudet, käyttää \"kirjaudu sisään nimellä\" -toimintoa yhteyden muodostamiseksi muiden käyttäjien tilillä? Tämä asetus on hyödyllisin usean URL-osoitteen konfiguroinnissa, kun et usko, että toissijaisen URL-osoitteen ylläpitäjän pitäisi voida muodostaa yhteys millä tahansa käyttäjällä. Huomaa, että konfigurointitiedostossa on myös toinen asetus, jolla estetään kaikkien mahdollisuus käyttää tätä ominaisuutta."; +$AdminsCanChangeUsersPassTitle = "Järjestelmänvalvojat voivat muuttaa käyttäjien salasanoja"; +$AdminsCanChangeUsersPassComment = "Tämä ominaisuus on hyödyllinen usean URL:n skenaariossa, jossa globaalin ylläpitäjän ja tavallisten ylläpitäjien välillä on ero. Tässä tapauksessa valitsemalla \"Ei\" estetään tavallisia ylläpitäjiä asettamasta muiden käyttäjien salasanoja ja sallitaan vain salasanan uusiminen (joka lähetetään sähköpostitse käyttäjälle). Globaali ylläpitäjä voi silti tehdä sen."; +$EmptyHeaderLine = "Valitun tiedoston otsikossa on tyhjiä rivejä."; +$UserIsNotATeacher = "Käyttäjä ei ole opettaja"; +$PromotionUpdated = "Kampanja päivitetty onnistuneesti"; +$CareerUpdated = "Ura päivitetty onnistuneesti"; +$CourseCategoriesAreGlobal = "Kurssikategoriat ovat globaaleja useiden portaalien kokoonpanoissa. Muutokset ovat sallittuja vain päähallintaportaalissa."; +$MediaQuestions = "Jakokelpoinen ilmaisu"; +$CurrentQuestion = "Tämänhetkinen kysymys"; +$Unanswered = "Vastaamatta"; +$ToReview = "Odottaa tarkastamista"; +$OrderedByUser = "Lajiteltu käyttäjän mukaan"; +$UsingCategories = "Kategorioiden käyttäminen"; +$OrderedCategoriesAlphabeticallyWithQuestionsOrdered = "Järjestetyt luokat aakkosjärjestyksessä ja järjestetyt kysymykset"; +$RandomCategoriesWithQuestionsOrdered = "Satunnaiset luokat ja järjestetyt kysymykset"; +$OrderedCategoriesAlphabeticallyWithRandomQuestions = "Järjestetyt luokat aakkosjärjestyksessä satunnaisilla kysymyksillä"; +$RandomCategoriesWithRandomQuestions = "Satunnaiset luokat satunnaisilla kysymyksillä"; +$RandomCategoriesWithQuestionsOrderedNoQuestionGrouped = "Satunnaiset luokat, joissa kysymykset on järjestetty (kysymyksiä ei ole ryhmitelty)."; +$RandomCategoriesWithRandomQuestionsNoQuestionGrouped = "Satunnaiset luokat ja satunnaiset kysymykset (kysymyksiä ei ole ryhmitelty)."; +$OrderedCategoriesByParentWithQuestionsOrdered = "Järjestetyt luokat emokategorian mukaan kysymykset järjestettyinä"; +$OrderedCategoriesByParentWithQuestionsRandom = "Järjestetyt luokat emokategorian mukaan satunnaiskysymyksillä"; +$QuestionSelection = "Kysymyksen valintatyyppi"; +$HideQuestionTitle = "Piilota kysymyksen otsikko"; +$ExerciseEndButton = "Harjoituksen lopetuspainike"; +$ExerciseEndButtonCourseHome = "Kurssin aloitussivu"; +$ExerciseEndButtonExerciseHome = "Harjoituslista."; +$ExerciseEndButtonDisconnect = "Kirjaudu ulos"; +$EmailNotificationTemplate = "Sähköposti-ilmoituspohja"; +$EmailNotificationTemplateDescription = "Voit mukauttaa käyttäjille lähetettävän sähköpostin, kun he ovat suorittaneet harjoituksen loppuun. Voit käyttää tällaisia tunnisteita: 1. {{ student.username }} 2. {{ student.firstname }} 3. {{ student.lastname }} 4. {{ student.official_code }} 5. {{ exercise.title }} 6. {{ exercise.start_time }} 7. {{ exercise.end_time }} 8. {{ course.title }} 9. {{ course.code }}"; +$ZeroMeansNoQuestionWillBeSelectedMinusOneMeansThatAllQuestionsWillBeSelected = "-1 = Kaikki kysymykset valitaan. 0 = Mitään kysymyksiä ei valita."; +$Hotpotatoes = "Hotpotatoes"; +$YourVersionNotUpToDate = "Versiosi ei ole ajantasalla"; +$LatestVersionIs = "Uusin versio on"; +$VersionUpToDate = "Versiosi on ajan tasalla"; +$ImpossibleToContactVersionServerPleaseTryAgain = "Versiopalvelimeen ei ole mahdollista saada yhteyttä juuri nyt. Yritä myöhemmin uudelleen."; +$AllowurlfopenIsSetToOff = "PHP:n asetus \"allow_url_fopen\" on pois päältä. Tämä estää rekisteröintimekanismia toimimasta kunnolla. Tämä asetus voidaan muuttaa PHP:n asetustiedostossa (php.ini) tai Apache Virtual Hostin asetuksissa käyttämällä php_admin_value -direktiiviä."; +$BreadcrumbNavigationDisplayTitle = "Leivänmuru-navigointi"; +$BreadcrumbNavigationDisplayComment = "Näytä tai piilota leivänmurupohjainen navigointi, joka näkyy suoraan päänavigointivälilehtien alapuolella. On erittäin suositeltavaa, että tämä navigointi näytetään käyttäjille, sillä sen avulla he voivat paikantaa nykyisen sijaintinsa ja siirtyä edellisille sivuille helposti. Joskus voi kuitenkin olla tarpeen piilottaa se (esimerkiksi tenttialustojen tapauksessa), jotta käyttäjät eivät navigoi sivuille, joita heidän ei pitäisi nähdä."; +$QuestionCopied = "Kysymys on kopioitu harjoitukseen"; +$QuestionReused = "Kysymys lisätty tähän harjoitukseen"; +$SelectAnAnswerToContinue = "Valitse vastaus jatkaaksesi"; +$BadCredentials = "Puutteelliset tunnistetiedot"; +$PasswordIsTooShort = "Salasana on liian lyhyt"; +$PasswordWeak = "Heikko"; +$PasswordNormal = "Normaali"; +$PasswordMedium = "Kohtalainen"; +$PasswordStrong = "Vahva"; +$PasswordVeryStrong = "Erittäin vahva"; +$CheckEasyPasswords = "Tarkista liian helposti arvattavat salasanat"; +$YourPasswordCannotBeTheSameAsYourUsername = "Salasanasi ei voi olla sama kuin käyttäjätunnuksesi."; +$ExerciseWasActivatedFromXToY = "Harjoitus aktivoitiin %s:stä %s:ään."; +$ApplyAllLanguages = "Käytä tätä muutosta kaikkiin käytettävissä oleviin kieliin"; +$HandOutDateLimit = "Määräpäivä"; +$HandedOut = "Luovutettu"; +$HandedOutDate = "Vastaanoton ajankohta"; +$CourseVisibilityHidden = "Piilotettu - Täysin piilotettu kaikilta käyttäjiltä paitsi ylläpitäjiltä."; +$AudioFile = "Äänitiedosto"; +$ExerciseWithFeedbackWithoutCorrectionComment = "Huomautus: Tämä testi on laadittu siten, että odotetut vastaukset on piilotettu."; +$ModelType = "Harjoitusmallityyppi"; +$Committee = "Komitea"; +$CourseSessionBlock = "Kurssit ja istunnot"; +$SessionsCategories = "Istuntokategoriat"; +$MyCourseCategories = "Kurssikategoriani"; +$CurrentStatus = "Tämänhetkinen status"; +$SelectAnOption = "Valitse vaihtoehto"; +$SelectRole = "Valitse rooli"; +$EditExtraFieldWorkFlow = "Muokkaa tämän kentän työkulkua"; +$FieldLoggeable = "Kenttämuutokset tulisi logata"; +$QuestionFields = "Kysymyskentät"; +$ManageQuestionFields = "Hallitse kysymysten lisäkenttiä"; +$ManageCourseFields = "Hallitse kurssien lisäkenttiä"; +$ManageQuestionCategories = "Hallitse globaalien kysymysten kategorioita"; +$YouAreReg = "Sinut on rekisteröity ympäristöön"; +$SignIn = "Kirjaudu sisään"; +$Username = "Käyttäjä"; +$AllowFastExerciseEdition = "Ota käyttöön harjoituksen nopea tila"; +$ExerciseAutoLaunch = "Automaattinen käynnistys harjoituksille"; +$ReturnToExerciseList = "Palaa harjoitukset-listaan"; +$ToReviewZ = "(%s) Tarkistettavia"; +$CurrentQuestionZ = "(%s) Nykyinen kysymys"; +$AnsweredZ = "(%s) Vastattu"; +$UnansweredZ = "(%s) Vastaamatta"; +$AnsweredXYZ = "%s vastattu (%s)+(%s)"; +$UnansweredXYZ = "%s vastaamattomia (%s)"; +$ToReviewXYZ = "%s tarkistettavia (%s)"; +$ToolCurriculum = "Opetussuunnitelma"; +$Roles = "Roolit"; +$SpecialCourses = "Erikoiskurssit"; +$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "Jos jatkat, vastauksesi tallennetaan. Muutoksia ei sallita."; +$NoIWantToTurnBack = "En, haluan palata takaisin"; +$YesImSure = "Kyllä, olen varma"; +$DateTimezoneSettingNotSet = "Olemme havainneet, että PHP-asennuksessasi ei määritellä date.timezone-asetusta. Tämä on Chamilon vaatimus. Varmista, että se on määritetty tarkistamalla php.ini-konfiguraatiosi, muuten kohtaat ongelmia. Olemme varoittaneet sinua!"; +$TeachersWillBeAddedAsCoachInAllCourseSessions = "Opettajat lisätään valmentajiksi kaikkiin kurssi-istuntoihin."; +$CasDirectCourseAccess = "Sisään kurssille CAS-tunnistautumisella"; +$RegistrationDisabled = "Pahoittelemme, yrität päästä tämän portaalin rekisteröintisivulle, mutta rekisteröinti on tällä hetkellä poissa käytöstä. Ota yhteyttä ylläpitäjään (katso yhteystiedot alatunnisteessa). Jos sinulla on jo tili tällä sivustolla."; +$FolderDoesntExistsInFileSystem = "Kohdekansiota ei ole palvelimella."; +$ManageUserGroup = "Hallinnoi käyttäjäryhmiä"; +$EditUserGroupToURL = "Muokkaa yhden URL-osoitteen ryhmiä"; +$UserGroupListInPlatform = "Alustan ryhmien luettelo"; +$UserGroupListInX = "Ryhmät %s:ssä"; +$AddUserGroupToURL = "Lisää ryhmä URL-osoitteeseen"; +$UserGroupList = "Käyttäjäryhmien luettelo"; +$FirstLetter = "Ensimmäinen kirjain"; +$AddUserGroupToThatURL = "Lisää käyttäjäryhmä tähän URL-osoitteeseen"; +$AddingStudentsFromSessionXToSessionY = "Opiskelijoiden lisääminen istunnosta %s istuntoon %s"; +$EnrollTrainersFromExistingSessions = "Rekisteröi kouluttajat olemassa olevista istunnoista"; +$EnrollStudentsFromExistingSessions = "Rekisteröi opiskelijat nykyisistä istunnoista"; +$CoachesSubscribedAsATeacherInCourseX = "Opettajiksi ilmoittautuneet valmentajat kurssilla %s"; +$NumberOfGroupsToCreate = "Luotavien ryhmien määrä"; +$GlobalLinkUseDoubleColumnPrivateToShowPrivately = "Käytä ::private linkin lopussa näyttääksesi sen vain kirjautuneille käyttäjille."; +$ImportAikenQuiz = "Tuo Aiken tietokilpailu"; +$NoTxtFileFoundInTheZip = ".txt-tiedostoa ei löytynyt zip-tiedostosta"; +$YouMustUploadAZipOrTxtFile = "Lataa .txt- tai .zip-tiedosto"; +$ThereWasAProblemWithYourFile = "Tiedostossasi oli tuntematon ongelma. Tarkista sen muoto ja yritä uudelleen."; +$SearchCourseBySession = "Etsi kurssia istunnon mukaan"; +$ExerciseAikenErrorNoCorrectAnswerDefined = "Tuodussa tiedostossa on vähintään yksi kysymys, johon ei ole määritelty oikeaa vastausta. Varmista, että kaikki kysymykset sisältävät VASTAUKSEN: [Kirjain] -rivi."; +$ExerciseAikenErrorNoAnswerOptionGiven = "Tuodussa tiedostossa on vähintään yksi kysymys ilman vastausta (tai vastauksissa ei ole vaadittua etukirjainta). Varmista, että jokaisella kysymyksellä on vähintään yksi vastaus ja että sen etuliitteenä on kirjain ja piste tai sulku, esimerkiksi näin: A. vastaus yksi"; +$ImportAikenQuizExplanation = "Aiken-muoto on yksinkertainen tekstitiedosto (.txt), jossa on useita kysymyslohkoja, jotka on erotettu toisistaan tyhjällä rivillä. Ensimmäinen rivi on kysymys, vastausrivien etuliitteenä on kirjain ja piste, ja oikea vastaus on seuraavana ANSWER: -etuliitteellä. Katso alla oleva esimerkki."; +$ImportAikenQuizExplanationExample = "Tämä on teksti kysymykselle 1 A. Vastaus 1 B. Vastaus 2 C. Vastaus 3 VASTAUS: B Tämä on teksti kysymykselle 2 A. Vastaus 1 B. Vastaus 2 C. Vastaus 3 D. Vastaus 4 VASTAUS: D ANSWER_EXPLANATION: Tämä on valinnainen palautekommentti, joka ilmestyy oikean vastauksen viereen. PISTEMÄÄRÄ: 20"; +$LoginWithExternalAccount = "Kirjaudu sisään ilman instituution tiliä"; +$CreatedByXYOnZ = "Luo %s osoitteessa %s"; +$IfSessionExistsUpdate = "Jos istunto on jo olemassa, päivitä se"; +$DeleteUsersNotInList = "Peruuta tilaus opiskelijoilta, jotka eivät ole tuodulla listalla."; +$WorkFileNotUploadedDirXDoesNotExist = "Tehtävää ei voitu ladata, koska kansiota %s ei ole olemassa."; +$AllowMemberLeaveGroup = "Salli jäsenten poistua ryhmästä"; +$DisplayAccessOverview = "Käyttäjäkohtaiset käyttöoikeudet"; +$DisplayExerciseProgress = "Yksityiskohtainen harjoitusten edistyminen"; +$DisplayLpProgressOverview = "Oppimispolkujen edistymisen yleiskatsaus"; +$DisplayProgressOverview = "Osallistumisen ja lukemisen edistymisen yleiskatsaus"; +$DisplaySurveyOverview = "Yleiskuva kyselyistä"; +$ChooseCourse = "Valitse kurssi"; +$SearchStudent = "Etsi käyttäjiä"; +$ChooseStudent = "Valitse opiskelija"; +$SearchSession = "Etsi istuntoja"; +$ChooseSession = "Valitse istunto"; +$TimeLoggedIn = "Yhteysaika (hh:mm)"; +$LearnpathsTotal = "Oppimispolut yhteensä"; +$LearnpathsDone = "Suoritetut oppimispolut"; +$LearnpathsLeft = "Keskeneräiset oppimispolut"; +$LearnpathsProgress = "Oppimispolkujen edistyminen"; +$ExercisesTotal = "Harjoituksia yhteensä"; +$ExercisesDone = "Suoritetut harjoitukset"; +$ExercisesLeft = "Keskeneräiset harjoitukset"; +$ExercisesProgress = "Harjoitusten edistyminen"; +$ForumsTotal = "Foorumeja yhteensä"; +$ForumsDone = "Luetut foorumit"; +$ForumsLeft = "Ei luettuja foorumeita"; +$ForumsProgress = "Foorumien edistyminen"; +$AssignmentsTotal = "Tehtäviä yhteensä"; +$AssignmentsDone = "Valmiit toimitetut"; +$AssignmentsLeft = "Puuttuvat tehtävät"; +$AssignmentsProgress = "Tehtävien edistyminen"; +$WikiTotal = "Wikisivuja yhteensä"; +$WikiRevisions = "Wiki-sivujen revisiot"; +$WikiRead = "Luetut Wiki-sivut"; +$WikiUnread = "Wikisivuja lukematta"; +$WikiProgress = "Wiki-sivujen lukemisen edistyminen"; +$SurveysTotal = "Kyselyjä yhteensä"; +$SurveysDone = "Valmiit kyselyt"; +$SurveysLeft = "Keskeneräiset kyselyt"; +$SurveysProgress = "Kyselyn edistyminen"; +$ActiveUsers = "Käyttäjät, joilla on aktiivinen tili"; +$InactiveUsers = "Käyttäjät, joiden tili on poistettu"; +$FeedbackDisplayOptions = "Miten palaute/kommentti pitäisi näyttää kunkin kysymyksen kohdalla? Tässä vaihtoehdossa määritetään, miten se näytetään oppilaalle, kun hän suorittaa testin. Suosittelemme kokeilemaan eri vaihtoehtoja muokkaamalla testin asetuksia, ennen kuin oppilaat tekevät testin."; +$WorkAdded = "Työ lisätty"; +$TestFeedbackNotShown = "Tämä harjoitus on määritelty niin ettei palaute näy käyttäjille. Kommentit ei näy harjoiutksen lopussa, mutta voivat olla avuksi opettajalle harjoitusta arvioitaessa."; +$ChooseStartDateAndEndDate = "Valitse alkamis- ja päättymispäivät"; +$LoginDate = "Sisäänkirjautumispäivä"; +$AdditionalMailWasSentToSelectedUsers = "Lisäksi on luotu uusi ilmoitus, joka on lähetetty valituille käyttäjille."; +$CleanAllStudentsResultsForAllTests = "Haluatko varmasti poistaa kaikkien harjoitusten tulokset?"; +$AreYouSureToEmptyAllTestResults = "Poista kaikkien käyttäjien tulokset kaikista harjoituksista"; +$LoginToGoToThisCourse = "Kirjaudu sisään päästäksesi tälle kurssille"; +$HForum = "Foorumin ohje"; +$ForumContent = "Foorumi on keskusteluväline asynkronista kirjallista työskentelyä varten. Toisin kuin sähköposti, foorumi on tarkoitettu julkiseen tai puolijulkiseen ryhmäkeskusteluun.\r\nChamilon foorumin käyttämiseen jäsenet voivat yksinkertaisesti käyttää selainta - he eivät tarvitse mitään erillistä asiakasohjelmistoa.\r\nVoit järjestää foorumeita napsauttamalla Foorumit-työkalua. Keskustelut järjestetään hierarkkisesti seuraavan rakenteen mukaisesti: Kategoria> Foorumi> Aihe> Viesti Jotta jäsenet voivat osallistua foorumiin siististi ja tehokkaasti, on tärkeää luoda ensin kategoriat ja foorumit; sen jälkeen osallistujien tehtävänä on luoda aiheita ja viestejä. Oletusarvoisesti foorumi sisältää yhden (julkisen) kategorian, esimerkkiaiheen ja esimerkkipostauksen. Voit lisätä kategoriaan foorumeita, muuttaa sen otsikkoa tai luoda muita kategorioita, joiden sisällä voit sitten luoda uusia foorumeita. (Älä sekoita kategorioita ja foorumeita keskenään ja muista, että kategoria, joka ei sisällä foorumia, on hyödytön eikä sitä näytetä).\r\n\r\n\n\r\n\r\nFoorumin kuvaukseen voi sisältyä luettelo foorumin jäsenistä, sen tarkoituksen määrittely, tavoite, tehtävä, teema jne.\r\nRyhmäfoorumeita ei tulisi luoda Foorumityökalun kautta vaan Ryhmät-työkalun kautta, jossa voit määrittää, ovatko ryhmäfoorumit yksityisiä vai julkisia, ja samalla tarjota paikan asiakirjaryhmien jakamiselle.\r\nOpetusvinkkejä Oppimisfoorumi ei ole aivan samanlainen kuin foorumit, joita olet tottunut näkemään internetissä. Oppijoiden ei ole mahdollista muuttaa viestejään sen jälkeen, kun ne on julkaistu, sillä kurssi on loogisesti arkistoitu, jotta voidaan seurata, mitä aiemmin on sanottu. Lisäksi Chamilon foorumit mahdollistavat opetuksen kannalta tärkeät erityiskäytöt. Esimerkiksi jotkut opettajat/kouluttajat julkaisevat korjauksia suoraan foorumeilla seuraavalla tavalla:\r\nOpettaja korjaa sen napsauttamalla Muokkaa (keltainen kynä) ja merkitsemällä sen käyttämällä grafiikkaeditoria (väri, alleviivaus jne.) Lopuksi muut oppijat hyötyvät katsomalla korjaukset tehtiin yhden heistä tuotantoon, Huomaa, että samaa periaatetta voidaan soveltaa oppijoiden välillä, mutta vaatii hänen kopioida / liittää viestin hänen kollegansa oppilas, koska opiskelijat / harjoittelijat eivät voi muokata toistensa viestejä. <. li>"; +$GlossaryContent = "Tämän työkalun avulla voit luoda kurssia varten sanastotermit, joita voidaan sitten käyttää dokumenttityökalussa."; +$HGlossary = "Asiasanasto"; +$CleanStudentsResultsBeforeDate = "Poista kaikki tulokset ennen valittua päivää"; +$AreYouSureDeleteTestResultBeforeDateD = "Haluatko varmasti poistaa tulokset ennen valittua päivää"; +$SelectADateOnTheCalendar = "Valitse päivä kalenterista"; +$ShowSystemFolders = "Näytä systeemikansiot"; +$SearchSessions = "Istuntohaku"; +$HereIsYourFeedback = "Tässä on palautteesi"; +$ImportGroups = "Tuo ryhmiä"; +$DeleteItemsNotInFile = "Poista osiot, jotka eivät ole kansiossa"; +$RegisteredClasses = "Rekisteröidyt luokat"; +$AvailableClasses = "Saatavilla olevat luokat"; +$DeleteAllSelectedAttendances = "Poista kaikki valitut osallistujat"; +$SendOnlyAnEmailToMySelfToTest = "Lähetä minulle sähköposti testausta varten."; +$DocumentType = "Dokumenttityyppi"; +$AllowFileOrText = "Salli tiedostot tai online-teksti"; +$AllowOnlyText = "Salli vain teksti"; +$AllowOnlyFiles = "Salli vain tiedostot"; +$SendToAllUsers = "Lähetä kaikille käyttäjille"; +$FollowedTeachers = "Seuratut opettajat"; +$FollowedStudents = "Seuratut opiskelijat"; +$ImportSessionDrhList = "Tuo istuntoon henkilöstöpäällikkölista"; +$RemoveOldRelationships = "Poista aikaisemmat suhteet"; +$TheTextYouEnteredDoesNotMatchThePicture = "Kirjoittamasi teksti ei sovi kuvaan."; +$FollowedHumanResources = "Seuratut HR-johtajat"; +$InactiveDays = "Toimettomat päivät"; +$YouShouldAddItemsBeforeAttachAudio = "Sinun tulee lisätä osioita oppimispolkuusi, muuten et voi lisätä niihin äänitiedostoja."; +$CorrectScore = "Oikea tulos"; +$IncorrectScore = "Väärä tulos"; +$UseCustomScoreForAllQuestions = "Käytä mukautettua pistemäärää kaikille kysymyksille"; +$WithoutCategory = "Ilman kategoriaa"; +$ClassIdDoesntExists = "Luokka-ID ei ole olemassa"; +$WorkNumberSubmitted = "Vastaanotetut työt"; +$RecordIsNotAvailable = "Äänitteitä ei ole saatavilla"; +$RecordYourVoice = "Tallenna äänesi"; +$DeleteThisItem = "Poista tämä osio"; +$DeleteAllItems = "Poista kaikki osiot"; +$FieldTypeFile = "Tiedoston lataaminen"; +$ExportSettingsAsXLS = "Vie asetukset XLS-muodossa"; +$AfterX = "%s jälkeen"; +$BeforeX = "Ennen %s:ää"; +$InstallWarningCouldNotInterpretPHP = "Varoitus: Asennusohjelma havaitsi virheen yrittäessään tavoittaa testitiedostoa osoitteessa %s. Näyttää siltä, että PHP-skriptiä ei voitu tulkita. Tämä voi olla varoitusmerkki tulevista ongelmista kursseja luotaessa. Tarkista asennusoppaasta lisätietoja käyttöoikeuksista. Jos olet asentamassa sivustoa, jonka URL-osoite ei vielä toimi, voit todennäköisesti jättää tämän viestin huomiotta."; +$AmountSubmitted = "Toimitettu määrä"; +$View = "Näkymä"; +$CatchScreenCasts = "Ota kuvaruutukaappaus"; +$AccountBlockedByCaptcha = "Tili on estetty captchalla."; +$ClickOnTheImageForANewOne = "Klikkaa kuvaa ladataksesi uusi kuva."; +$EnterTheLettersYouSee = "Kirjoita näkyvissä olevissa kirjaimet"; +$Subgroups = "Alaryhmät"; +$Subgroup = "Alaryhmä"; +$StartSurvey = "Aloita kysely"; +$NoUsersToAdd = "Ei lisättäviä käyttäjiä"; +$DocumentsAdded = "Dokumentit lisätty"; +$UsersToAdd = "Lisättävät käyttäjät"; +$ParametersNotFound = "Parametrejä ei löytynyt"; +$SendToUsersInSessions = "Lähetä tämän kurssin kaikkien istuntojen käyttäjille"; +$ThisWeek = "Tällä viikolla"; +$CustomRange = "Mukautettu alue"; +$Calendar = "Kalenteri"; +$AgendaList = "Asialista"; +$AtLeastOneUserGroupAndOneURL = "Valitse vähintään yksi ryhmä ja sivu"; +$UserGroupBelongURL = "Ryhmä kuuluu nyt valitulle sivulle"; +$CourseCategoryInPlatform = "Kurssikategoriat käytettävissä"; +$CourseCategoryListInX = "Kurssikategoriat %s-sivustolla:"; +$ManageCourseCategories = "Hallitse kurssikategorioita"; +$SubscribeStudentsToSession = "Merkitse opiskelijoita istuntoon"; +$SubscribeTeachersToSession = "Merkitse opettajia istuntoon"; +$ImportPDFIntroToCourses = "Tuo PDF-esittelyt kursseille"; +$YouMustImportAZipFile = "SInun pitää tuoda ZIP-tiedosto"; +$ImportZipFileLocation = "Tuodun zip-tiedoston sijainti"; +$PDFsMustLookLike = "PDF:n tulee näyttää kuin:"; +$NoPDFFoundAtRoot = "PDF-tiedostoa ei löytynyt juuresta: varmista, että PDF-tiedostot ovat zip-tiedoston juuressa (ei välikansiota)"; +$CleanAndUpdateCourseCoaches = "Poista ja päivitä kurssin valmentajat"; +$HumanResourcesManagerShouldNotBeRegisteredToCourses = "Henkilöstöpäälliköitä ei pitäisi rekisteröidä kursseille. Vastaavia valitsemiasi käyttäjiä ei ole rekisteröity."; +$ShowDescription = "Näytä kuvaus"; +$Coaches = "Valmentajat"; +$NoActionAvailable = "Ei saatavilla olevaa toimintoa"; +$YouHaveAnInstitutionalAccount = "Sinulla on jo institutionaalinen tili"; +$LoginWithYourAccount = "Kirjaudu sisään tililläsi"; +$YouDontHaveAnInstitutionAccount = "Sinulla ei ole institutionaalista tiliä"; +$EnterTheCharactersYouReadInTheImage = "Kirjaa merkit, jotka näet kuvassa"; +$EditingThisEventWillRemoveItFromTheSerie = "Tapahtuman muokkaus poistaa sen tapahtumasarjoista, joihin se kuuluu"; +$DeleteAttachment = "Poista liite"; +$TeacherXInSession = "Opettaja istunnossa: %s"; +$ErrorWritingXMLFile = "XML-tiedoston kirjoittamisessa tapahtui virhe. Pyydä järjestelmänvalvojaa tarkistamaan virhelokit."; +$FinalScore = "Lopputulos"; +$LatestChanges = "Viimmeisimmät muutokset"; +$Weep = "Itke"; +$ModifyDate = "Muokkauspäivä"; +$PriorityOfMessage = "Viestin tyyppi"; +$CreateACategory = "Luo kategoria"; +$CheckDates = "Vahvista päivät"; +$SessionXSkipped = "Istunto %s ohitettiin"; +$NoDestinationSessionProvided = "Kohdeistuntoa ei ole annettu"; +$NoStudentsFoundForSession = "Opiskelijoita ei löydetty tähän istuntoon"; +$NothingToAdd = "Ei lisättävää"; +$UserMustHaveTheDrhRole = "Käyttäjillä tulee olla HR-johtajan rooli"; +$NoSessionProvided = "Ei istuntoa tarjolla"; +$TraceIP = "Jäljitä IP"; +$Report = "Raportti"; +$CompanyReport = "Yritysraportti"; +$CompanyReportResumed = "Yritysraportti, lyhyt versio"; +$ExportExcel = "Excel vienti"; +$ExerciseId = "TehtäväID"; +$QuestionId = "Kysymys ID"; +$QuestionTitle = "Kysymyksen otsikko"; +$Global = "Globaalinen"; +$DRH = "Henkilöstöpäällikkö"; +$ViewList = "Listanäkymä"; +$ViewTable = "Taulukkonäkymä"; +$SortByCreatedDate = "Järjestä luomispäivän mukaan"; +$SortByUpdatedDate = "Järjestä muokkauspäivän mukaan"; +$SortByTitle = "Järjestä otsikon mukaan"; +$ExportToDoc = "Vie .doc"; +$AddDocument = "Lisää dokumentti"; +$DocumentAlreadyAdded = "Tiedosto on jo lisätty"; +$UploadFromTemplate = "Lataa mallipohjasta"; +$UsersWithTask = "Oppilaat, jotka lähettivät työnsä"; +$UsersWithoutTask = "Oppilaat, jotka eivät lähettäneet töitään"; +$LearningPathList = "Oppimispolkulista"; +$LpReturnLink = "Oppimispolun paluulinkki"; +$RedirectToCourseHome = "Ohjaa uudelleen kurssin kotisivulle"; +$ShowFullCourseAdvance = "Näytä kurssin suunnittelu"; +$CurrentTopic = "Nykyinen aihe"; +$NextTopic = "Seuraava aihe"; +$SessionDurationXDaysLeft = "Tällä istunnolla on enimmäiskesto. Vain %s päivää jäljellä."; +$EditUserSessionDuration = "Käyttäjän istunnon keston mittaus"; +$SessionDurationEdit = "Muokkaa istunnon kestoa"; +$UserNeverAccessedSessionDefaultDurationIsX = "Tämä käyttäjä ei ole koskaan aiemmin käyttänyt tätä istuntoa. Kesto on tällä hetkellä asetettu %s päivään (ensimmäisestä käyttöpäivästä)"; +$FirstAccessWasXSessionDurationYEndDateInZDays = "Tämän käyttäjän ensimmäinen käyttöoikeus istuntoon oli %s. Kun istunnon kesto on %s päivää, lopetuspäivämäärä on %s päivää"; +$FirstAccessWasXSessionDurationYEndDateWasZ = "Tämän käyttäjän ensimmäinen käyttöoikeus istuntoon oli %s. Kun istunnon kesto on %s päivää, tämän istunnon käyttöoikeus päättyi jo %s"; +$DurationIsSameAsDefault = "Annettu istunnon kesto on sama kuin istunnon oletusaika. Ohitetaan."; +$UserXSessionY = "Käyttäjä: %s - Istunto: %s"; +$ExtraDurationForUser = "Lisäkäyttöpäivät tälle käyttäjälle"; +$ExerciseAverageInfo = "Jokaisen harjoitusyrityksen parhaiden arvosanojen keskiarvo"; +$CourseTimeInfo = "Kurssilla vietetty aika"; +$ExerciseProgressInfo = "Opiskelijan tekemien harjoitusten eteneminen"; +$AddMeAsTeacherInCourses = "Lisää minut opettajaksi tuotuihin kursseihin."; +$AddMeAsCoach = "Lisää minut valmentajaksi"; +$TotalPostsInAllForums = "Viestejä yhteensä kaikissa foorumeissa."; +$EmailUsedTwice = "Sähköposti ei ole saatavilla"; +$CheckUniqueEmail = "Tarkista yksilöllinen sähköposti"; +$FieldTypeMobilePhoneNumber = "Matkapuhelinnumero"; +$CountryDialCode = "Sisällytä maakoodi"; +$MobilePhoneNumberWrong = "Matkapuhelinnumero on väärä tai sisältää epäkelpoja merkkejä"; +$SessionName = "Istunnon nimi"; +$HostingWarningReached = "Hosting-varoitus saavutettu"; +$IncludeAllUsers = "Sisällytä kaikki käyttäjät"; +$OnlyBestAttempts = "Vain parhaat yritykset"; +$UserIsCurrentlySubscribed = "Käyttäjä on ilmoittautunut"; +$CalculatedAnswer = "Laskettu kysymys"; +$ExampleValue = "Alueen arvo"; +$VariableRanges = "Muuttuja-alueet"; +$FormulaExample = "Kaavaesimerkki: sqrt( [x] / [y] ) * ( e ^ ( ln(pi) ) )"; +$SignatureFormula = "Ystävällisin terveisin,"; +$GiveFormula = "Kirjoita kaava"; +$AnswerVariations = "Kysymysvariaatiot"; +$GiveAnswerVariations = "Kuinka monta kysymysvariaatiota haluat"; +$IfYouWantOnlyIntegerValuesWriteBothLimitsWithoutDecimals = "Jos haluat vain kokonaislukuja, kirjoita molemmat rajat ilman desimaaleja"; +$UserNameHasDash = "Käyttäjänimi ei voi sisältää '-' merkkiä"; +$SearchActiveSessions = "Etsi aktiiviset istunnot"; +$PleaseSubscribeMeToSession = "Harkitse istunnon tilaamista"; +$SubscribeToSessionRequest = "Pyydä pääsyä istuntoon"; +$NotationList = "Kaavan merkintä"; +$SummationPlus = "Summa:\t\t\t+"; +$SubstractionMinus = "Vähennys:\t\t\t-"; +$MultiplicationStar = "Kertolasku:\t\t\t*"; +$DivisionSlash = "Jako:\t\t\t/"; +$ExponentiationCircumflex = "Eksponentti:\t\t\t^"; +$SquareRootSqrt = "Neliöjuuri:\t\t\tsqrt(x)"; +$AbsoluteValueAbs = "Absoluuttinen arvo:\t\t\tabs(x)"; +$NaturalLogarithmLn = "Luonnollinen logaritmi:\t\tln(x)"; +$LogarithmLog = "Logaritmi:\t\t\tlog(x)"; +$ENumberE = "Kymmenen potenssiluku:\t\t\te"; +$PiNumberPi = "Pii-luku:\t\t\tpi"; +$SineSin = "Sini:\t\t\t\tsin(x)"; +$HyperbolicSineSinh = "Hyperbolinen sini:\t\tsinh(x)"; +$ArcsineArcsin = "Arkussini:\t\t\tarcsin(x)"; +$HyperbolicArcsineArcsinh = "Hyperbolinen arcsini:\t\tarcsinh(x)"; +$CosineCos = "Kosini:\t\t\t\tcos(x)"; +$HyperbolicCosineCosh = "Hyperbolinen kosini:\t\tcosh(x)"; +$ArccosineArccos = "Arkussini:\t\t\tarccos(x)"; +$HyperbolicArccosineArccosh = "Hyperbolinen arkosiini:\t\tarccosh(x)"; +$TangentTan = "Tangentti:\t\t\ttan(x)"; +$HyperbolicTangentTanh = "Hyperbolinen tangetti:\t\ttanh(x)"; +$ArctangentArctan = "arkustangentti:\t\t\tarctan(x)"; +$HyperbolicArctangentArctanh = "Hyperbolinen arktangentti:\t\tarctanh(x)"; +$QuestionEditionNotAvailableBecauseItIsAlreadyAnsweredHoweverYouCanCopyItAndModifyTheCopy = "Kysymyksen muokkaus ei ole mahdollista, koska kysymykseen on jo vastattu. Voit kuitenkin kopioida sen ja muokata sitä."; +$AssignedCourses = "Nimetyt kurssit"; +$StartSpeaking = "Aloita puhuminen"; +$ActivateAudioRecorder = "Aktivoi ääninauhuri"; +$MySessions = "Istuntoni"; +$BuyCourses = "Osta kursseja"; +$SocialWall = "Keskusteluseinä"; +$SocialMessageDelete = "Poista kommentti"; +$SocialWallWhatAreYouThinkingAbout = "Mitä mietit?"; +$SocialWriteNewComment = "Kirjoita uusi kommentti"; +$ChooseABackgroundColor = "Valitse taustaväri"; +$SkillsSearch = "Osaamisen haku"; +$EnterTheSkillNameToSearch = "Kirjoita etsitty osaaminen hakuun"; +$DisplayOptions = "Näytä vaihtoehdot"; +$White = "Valkoinen"; +$Black = "Musta"; +$LightBlue = "Vaaleansininen"; +$Gray = "Harmaa"; +$Corn = "Jyvä"; +$YouHaveNotYetAchievedSkills = "Et ole vielä saavuttanut taitoja"; +$Write = "Kirjoita"; +$Post = "Posti"; +$NumberOfCoursesHidden = "Piilotettujen kurssien määrä"; +$EditUserListCSV = "Muokkaa käyttäjälistaa"; +$LastUpload = "Viimeksi ladattu"; +$ThereIsANewWorkFeedback = "Työssä on uusi palaute: %s"; +$ThereIsANewWorkFeedbackInWorkXHere = "Uusi palaute työssä: %s Klikkaa tästä nähdäksesi sen."; +$AudioFileForItemX = "Äänitiedosto kohdetta %s varten"; +$Listen = "Kuunnella"; +$MultipleConnectionsAreNotAllow = "Käyttäjä on jo kirjautunut sisään"; +$Formula = "Kaava"; +$RequestAccess = "Pyydä pääsyä"; +$WelcomeToSiteName = "Tervetuloa %s"; +$WelcomeToInstitution = "Tervetuloa %s kampukselle"; +$PortalActiveCoursesLimitReached = "Valitettavasti tällä asennuksella on aktiivisten kurssien raja, joka on nyt saavutettu. Voit edelleen luoda uusia kursseja, mutta vain jos piilotat/poistat käytöstä vähintään yhden aktiivisen kurssin. Voit tehdä tämän muokkaamalla kurssia hallintakurssien luettelosta ja muuttamalla näkyvyyden arvoksi \"piilotettu\" ja yrittämällä sitten luoda kurssin uudelleen. Jos haluat lisätä tässä Chamilo-asennuksessa sallittujen aktiivisten kurssien enimmäismäärää, ota yhteyttä hosting-palveluntarjoajaan tai, jos mahdollista, päivitä parempaan hosting-pakettiin."; +$DownloadCertificate = "Lataa todistus"; +$ResultsVisibility = "Tulosten näkyvyys"; +$TemplateCertificateTitle = "Todistus"; +$TemplateCertificateComment = "Esimerkki todistuksen muodosta"; +$YouAcceptCookies = "Jatkamalla sivun käyttöä, hyväksyt evästeiden käytön."; +$HelpCookieUsageValidation = "Jotta tämä sivusto voisi toimia ja mitata sisällön käyttöä, se käyttää evästeitä.\r\n\r\n\nTarvittaessa, selaimesi Ohje-osiossa kerrotaan, miten evästeet määritetään.\r\n\r\n\nLisätietoja evästeistä saat About Cookies -sivustolta."; +$HyperbolicArccotangentArccoth = "Hyperbolinen arkuskotangentti:\t\tarccoth(x)"; +$ArccotangentArccot = "Arkuskotangentti:\t\t\t\tarccot(x)"; +$HyperbolicCotangentCoth = "Hyperbolinen kotangentti:\t\tcoth(x)"; +$CotangentCot = "Kotangentti:\t\t\t\tcot(x)"; +$HyperbolicArcsecantArcsech = "Hyperbolinen arkussekantti:\t\tarcsech(x)"; +$ArcsecantArcsec = "arkussekantti:\t\t\t\tarcsec(x)"; +$HyperbolicSecantSech = "Hyperbolinen sekantti:\t\tsech(x)"; +$SecantSec = "Sekantti:\t\t\t\tsec(x)"; +$HyperbolicArccosecantArccsch = "Hyperbolinen arkkosekantti:\t\tarccsch(x)"; +$ArccosecantArccsc = "Arkuskosekantti:\t\t\tarccsc(x)"; +$HyperbolicCosecantCsch = "Hyperbolinen kosekantti:\t\tcsch(x)"; +$CosecantCsc = "Kosekantti:\t\t\t\tcsc(x)"; +$YourLanguageNotThereContactUs = "Etkö löydä kieliversiotasi listasta? Jos haluat kääntäjäksi, ota yhteys info@chamilo.org."; +$TeacherTimeReport = "Opettajien aikaraportti"; +$TimeReportForCourseX = "Aikaraportti kurssille %s"; +$TimeReportForSessionX = "Aikaraportti istunnolle %s"; +$TimeReportForTeacherX = "Aikaraportti opettajalle %s"; +$TotalTime = "Kokonaisaika"; +$TimeReportIncludingAllCoursesAndSessionsByTeacher = "Aikaraportti, joka sisältää kaikki kurssit ja istunnot opettajakohtaisesti"; +$CoachAndStudent = "Valmentaja ja opiskelija"; +$Serie = "Sarjat"; +$SessionDurationTitle = "Istunnon kesto"; +$SessionDurationDescription = "Istunnon keston avulla voit asettaa käyttöpäivien määrän laskennan käyttäjän ensimmäisestä käyttökerrasta alkaen. Tällä tavalla voit asettaa istunnon kestämään 15 päivää sen sijaan, että se alkaisi kaikille opiskelijoille kiinteästä päivämäärästä."; +$RoleStudentBoss = "Opiskelijan esimies"; +$AssignUsersToBoss = "Nimeä käyttäjiä esimiehelle"; +$AssignedUsersListToStudentBoss = "Esimiehelle nimetyt käyttäjät"; +$SkillsReport = "Osaamisraportti"; +$AchievedSkillInCourseX = "Kurssilla %s hankitut taidot"; +$StudentsWhoAchievedTheSkillX = "Opiskelijat, jotka ovat hankkineet taidon %s"; +$Badges = "Rintamerkit"; +$CreateBadge = "Luo rintamerkki"; +$IssuerDetails = "Merkkien myöntäjän tiedot"; +$DownloadBadges = "Lataa rintamerkkejä"; +$TotalX = "Yhteensä %"; +$DesignNewBadge = "Suunnittele uusi rintamerkki"; +$BadgePreview = "Rintamerkin esikatselu"; +$CriteriaToEarnTheBadge = "Kriteerit rintamerkin ansaitsemiseen"; +$BackpackDetails = "Repun yksityiskohdat"; +$TheBadgesWillBeSentToThatBackpack = "Rintamerkit lähetetään tähän reppuun."; +$DesignANewBadgeComment = "Luo uusi rintamerkki, lataa se design-työkalusta ja lähetä se sovellukseen."; +$OpenBadgesIntroduction = "Voit nyt suunnitella rintamerkkejä kursseillesi tällä virtuaalikampuksella."; +$OpenBadgesBannerText = "Voit luoda käyttäjille rintamerkkejä heidän oppimista taidoista, jotta he saavat tunnustusta heidän panoksestaan. Niiden avulla he voivat esitellä hankkimiaan taitojaan ja pätevyyksiään kuvakkeilla, jotka näkyvät heidän käyttäjäprofiilissaan. Lisätietoja OpenBadgesista on osoitteessa http://openbadges.org/."; +$ConvertToMultipleAnswer = "Muunna monivastaukseksi"; +$ConvertToUniqueAnswer = "Muunna yksilölliseksi vastaukseksi"; +$PreventSessionAdminsToManageAllUsersTitle = "Estä istunnon ylläpitäjiä hallitsemasta kaikkia käyttäjiä"; +$PreventSessionAdminsToManageAllUsersComment = "Jos otat tämän vaihtoehdon käyttöön, istunnon ylläpitäjät näkevät hallintasivulla vain itse luomansa käyttäjät."; +$InProcess = "Käynnissä"; +$Area = "Alue"; +$TeachingHours = "Luentotunnit"; +$Cost = "Kustannukset"; +$Vacancies = "Avoimet työpaikat"; +$RecommendedNumberOfParticipants = "Suositeltu osallistujamäärä"; +$Place = "Paikka/sijainti"; +$Schedule = "Aikataulu"; +$Mode = "Toimintatila"; +$ShowStatus = "Näytä tila"; +$PublicationStartDate = "Julkaistu aloituspäivä"; +$PublicationEndDate = "Julkaistu päättymispäivä"; +$Brochure = "Esite"; +$TargetAudience = "Kohdeyleisö"; +$ShortDescription = "Lyhyt kuvaus"; +$AllowVisitors = "Salli vierailijat"; +$IsInductionSession = "Perehdyttämistyyppinen istunto"; +$IsOpenSession = "Avoin istunto"; +$SessionBanner = "Istunnon banneri"; +$ChooseEitherDurationOrTimeLimit = "Valitse joko kesto tai aikaraja"; +$LearningPathGradebookWarning = "Varoitus: Arvosanakirjassa on mahdollista käyttää testejä, jotka ovat osa oppimispolkuja. Jos itse oppimispolku on jo mukana, tämä testi saattaa olla jo osa arvosanakirjassa. Oppimispolkujen arviointi tehdään edistymisprosentin perusteella, kun taas testien arviointi tehdään pistemäärän perusteella. Kyselyn arviointi perustuu siihen, onko käyttäjä vastannut (1) vai ei (0). Varmista, että testaat arvosanakirja-arviointien yhdistelmiä, jotta vältät hämmentävät tilanteet."; +$ExerciseAndLearningPath = "Harjoitus ja oppimispolku"; +$MailCronCourseExpirationReminderSubject = "Kiireellinen: %s kurssin päättymisen muistutus"; +$MailCronCourseExpirationReminderBody = "Hyvä %s, Olemme huomanneet, että et ole suorittanut kurssia %s loppuun, vaikka sen päättymispäiväksi oli asetettu %s, joten sinulla on jäljellä %s päivää aikaa suorittaa se loppuun. Muistutamme sinua siitä, että sinulla on mahdollisuus osallistua tälle kurssille vain kerran vuodessa, minkä vuoksi kehotamme sinua painokkaasti suorittamaan kurssin loppuun ajoissa. Voit palata kurssille liittymällä alustaan tämän osoitteen kautta: %s Terveisin, %s Team"; +$NoPosts = "Ei viestejä"; +$WithoutAchievedSkills = "Ilman saavutettuja taitoja"; +$OpenBadgesTitle = "Chamilo tukee OpenBadges-standardia."; +$OpenBadgesActionCall = "Muunna virtuaalikampuksesi taitopohjaiseksi oppimiskokemukseksi."; +$QuestionsOverallReport = "Kysymysten yleisraportti"; +$QuestionsOverallReportDetail = "Tässä raportissa näet kaikkien kysymysten tulokset."; +$CopySurvey = "Kopioi kysely"; +$DescriptionCopySurvey = "Kopioi tyhjä kyselytutkimus toiseen kurssiin. Tarvitset 2 kurssia tämän ominaisuuden käyttämiseen: alkuperäisen kurssin ja kohdekurssin."; +$NoSurveysAvailable = "Ei kyselyitä"; +$SurveyCopied = "Kysely kopioitu"; +$SelectSurvey = "Valitse kysely"; +$SignUp = "Ilmoittaudu mukaan!"; +$EnableMathJaxTitle = "Ota käyttöön MathJax"; +$EnableMathJaxComment = "Ota MathJax-kirjasto käyttöön matemaattisten kaavojen visualisointia varten. Tämä on hyödyllistä vain, jos joko ASCIIMathML- tai ASCIISVG-asetukset on otettu käyttöön."; +$UpgradeFromLMS19x = "Päivitys LMS v1.9.* -versiosta"; +$CalendarYear = "Kalenterivuosi"; +$AlreadyRegisteredToSession = "Olet jo rekisteröitynyt istuntoon"; +$MetaTwitterSiteTitle = "Twitter-sivuston tili"; +$MetaTwitterSiteComment = "Twitter-sivusto on Twitter-tili (esim. @chamilo_news), joka liittyy sivustoosi. Se on yleensä tilapäisempi tili kuin Twitterin luoja-tili, tai se edustaa yhteisöä (henkilön sijaan). Tämä kenttä vaaditaan, jos haluat, että Twitter-kortin metakentät näkyvät."; +$MetaTwitterCreatorTitle = "Twitter Creator-tili"; +$MetaTwitterCreatorComment = "Twitter Creator on Twitter-tili (esim. @ywarnier), joka edustaa *henkilöä*, joka loi sivuston. Tämä kenttä on valinnainen."; +$MetaTitleTitle = "OpenGraph-sisällönkuvausotsikko"; +$MetaTitleComment = "Tämä näyttää OpenGraph-otsikon metasisällön (og:title) sivustosi otsikoissa"; +$MetaDescriptionTitle = "Meta kuvaus"; +$MetaDescriptionComment = "Tämä näyttää OpenGraph-kuvauksen sisällönkuvauskentän (og:description) sivustosi otsikoissa"; +$MetaImagePathTitle = "Meta-kuvan polku"; +$MetaImagePathComment = "Tämä Meta-kuvan polku on polku tiedostoon Chamilon hakemiston sisällä (esim. home/image.png), jonka pitäisi näkyä Twitter-kortissa tai OpenGraph-kortissa, kun näytetään linkki LMS:ään. Twitter suosittelee 120 x 120 pikselin kokoista kuvaa, joka saatetaan joskus rajata 120x90 kokoiseksi."; +$WorkEmailAlertActivateOnlyForTeachers = "Lähetä opettajille sähköpostia vain opiskelijoiden uusista tehtävien palautuksista."; +$WorkEmailAlertActivateOnlyForStudents = "Lähetä opiskelijoille sähköpostia vain uuden tehtävän lähettämisestä (vahvistussähköposti)."; +$Uncategorized = "Ei kategorisoitu"; +$NaturalYear = "Luonnollinen vuosi"; +$AutoWeight = "Automaattinen painotus"; +$AutoWeightExplanation = "Käytä automaattista painonjakoa nopeuttaaksesi asioita. Järjestelmä jakaa sitten kokonaispainon tasaisesti alla olevien arviointikohteiden kesken."; +$EditWeight = "Muokkaa painoa-arvoa"; +$TheSkillHasBeenCreated = "Taito on luotu"; +$CreateSkill = "Luo taito"; +$CannotCreateSkill = "Ei voi luoda taitoa"; +$SkillEdit = "Muokkaa taitoa"; +$TheSkillHasBeenUpdated = "Taito on päivitetty"; +$CannotUpdateSkill = "Taitoa ei voi päivittää"; +$BadgesManagement = "Merkkien hallinta"; +$CurrentBadges = "Nykyiset merkit"; +$SaveBadge = "Tallenna merkki"; +$BadgeMeasuresXPixelsInPNG = "Merkin koko on 200x200 pikseliä PNG-muodossa."; +$ConvertToCourseAssistant = "Muunna assistentiksi"; +$UniqueAnswerImage = "Ainutlaatuinen vastaus kuva"; +$ErrorWhileBuildingReport = "Raporttia rakennettaessa tapahtui virhe"; +$UnknownFormat = "Tuntematon muoto"; +$PleaseFillFormToBuildReport = "Täytä lomake raportin laatimiseksi"; +$PleaseChooseReportType = "Valitse raporttityyppi"; +$ReportType = "Raportin tyyppi"; +$ReportFormat = "Raportin muoto"; +$ShowWizard = "Näytä velho"; +$ReportsRequiresNoSetting = "Tämä raporttityyppi ei vaadi asetuksia"; +$Published = "Julkaistu"; +$AutoEvaluation = "Automaattinen arviointi"; +$TimeSpentByStudentsInCourses = "Opiskelijoiden kursseihin käyttämä aika"; +$TimeSpentByStudentsInCoursesGroupedByCode = "Opiskelijoiden kursseilla viettämä aika, ryhmiteltynä koodin mukaan."; +$TestResultsByStudentsGroupesByCode = "Testien tulokset opiskelijaryhmittäin, koodeittain"; +$TestResultsByStudents = "Testien tulokset opiskelijoittain"; +$SystemCouldNotLogYouIn = "Järjestelmä ei pystynyt kirjaamaan sinua sisään. Ota yhteyttä järjestelmänvalvojaan."; +$ShibbolethLogin = "Shibboleth kirjautuminen"; +$NewStatus = "Uusi tila"; +$Reason = "Syy"; +$RequestStatus = "Pyydä uutta tilaa"; +$StatusRequestMessage = "Olet kirjautunut sisään oletusoikeuksilla. Voit pyytää lisää oikeuksia lähettämällä seuraavan pyynnön."; +$ReasonIsMandatory = "Syy-kenttä on pakollinen. Täytä se ennen lähettämistä."; +$RequestSubmitted = "Pyyntösi on lähetetty."; +$RequestFailed = "Emme pysty täyttämään pyyntöäsi tällä hetkellä. Ota yhteyttä ylläpitäjään."; +$InternalLogin = "Sisäinen kirjautuminen"; +$AlreadyLoggedIn = "Olet jo kirjautunut sisään"; +$Draggable = "Sekvenssijärjestys"; +$Incorrect = "Virheellinen"; +$YouNotYetAchievedCertificates = "Et ole vielä saavuttanut yhtään todistusta. Jatka oppimispolkua saadaksesi sellaisen!"; +$SearchCertificates = "Etsi todistuksia"; +$TheUserXNotYetAchievedCertificates = "Käyttäjä %s ei ole vielä hankkinut todistusta"; +$CertificatesNotPublic = "Todistukset eivät ole julkisesti saatavilla"; +$MatchingDraggable = "Yhdistä vetämällä"; +$ForumThreadPeerScoring = "Vertaisten pisteyttämä lanka"; +$ForumThreadPeerScoringComment = "Jos tämä vaihtoehto valitaan, jokaisen opiskelijan on arvioitava vähintään kaksi muuta opiskelijaa, jotta hänen pistemääränsä olisi suurempi kuin 0 arvosanakirjassa."; +$ForumThreadPeerScoringStudentComment = "Saadaksesi odotetun pistemäärän tällä foorumilla, toisen opiskelijan on pisteytettävä oma kirjoituksesi, ja sinun on pisteytettävä vähintään kaksi muiden opiskelijoiden kirjoitusta. Ennen kuin saavutat tämän tavoitteen, vaikka saisitkin pisteitä, osallistumisesi näkyy 0 pisteenä tämän kurssin yleisarvosanoissa."; +$Readable = "Luettavissa"; +$NotReadable = "Ei luettavissa"; +$DefaultInstallAdminFirstname = "Urho"; +$DefaultInstallAdminLastname = "Kekkonen"; +$AttendanceUpdated = "Osallistujamäärät päivitetty"; +$HideHomeTopContentWhenLoggedInText = "Piilota etusivun yläpalkin sisältö, kun olet kirjautunut sisään"; +$HideHomeTopContentWhenLoggedInComment = "Alustan etusivulla voit tämän vaihtoehdon avulla piilottaa esittelylohkon (esimerkiksi jättää vain ilmoitukset) kaikille käyttäjille, jotka ovat jo kirjautuneet sisään. Yleinen esittelylohko näkyy edelleen käyttäjille, jotka eivät ole jo kirjautuneet sisään."; +$HideGlobalAnnouncementsWhenNotLoggedInText = "Piilota globaalit ilmoitukset anonyymeiltä"; +$HideGlobalAnnouncementsWhenNotLoggedInComment = "Piilota alustan ilmoitukset anonyymeiltä käyttäjiltä ja näytä ne vain todennetuille käyttäjille."; +$CourseCreationUsesTemplateText = "Käytä mallipohjia uusille kursseille"; +$CourseCreationUsesTemplateComment = "Aseta tämä käyttämään samaa mallikurssia (joka tunnistetaan tietokannassa olevan kurssin numeerisen tunnuksen perusteella) kaikille uusille kursseille, jotka luodaan alustalle. Huomaa, että jos tätä asetusta ei ole suunniteltu oikein, sillä voi olla valtava vaikutus tilan käyttöön. Mallikurssia käytetään ikään kuin opettaja tekisi kurssista kopion kurssin varmuuskopiointityökaluilla, joten käyttäjän sisältöä ei kopioida, ainoastaan opettajan materiaalia. Kaikkia muita kurssin varmuuskopiointisääntöjä sovelletaan. Jätä tyhjäksi (tai aseta arvoksi 0), jos haluat poistaa sen käytöstä."; +$EnablePasswordStrengthCheckerText = "Salasanan vahvuuden tarkistusohjelma"; +$EnablePasswordStrengthCheckerComment = "Ota tämä vaihtoehto käyttöön, jos haluat lisätä salasanan vahvuuden visuaalisen ilmaisimen, kun käyttäjä vaihtaa salasanaansa. Tämä EI estä huonojen salasanojen lisäämistä, vaan toimii vain visuaalisena apuna."; +$EnableCaptchaText = "CAPTCHA"; +$EnableCaptchaComment = "Ota CAPTCHA käyttöön kirjautumislomakkeessa, ilmoittautumislomakkeessa ja kadonneen salasanan lomakkeessa salasanan murtamisyritysten välttämiseksi."; +$CaptchaNumberOfMistakesBeforeBlockingAccountText = "CAPTCHA-virheiden sallittu määrä"; +$CaptchaNumberOfMistakesBeforeBlockingAccountComment = "Kuinka monta kertaa käyttäjä voi tehdä virheen CAPTCHA-ruudussa ennen kuin hänen tilinsä lukitaan."; +$CaptchaTimeAccountIsLockedText = "CAPTCHA-tilin lukitusaika"; +$CaptchaTimeAccountIsLockedComment = "Jos käyttäjä saavuttaa sisäänkirjautumisvirheiden enimmäismäärän (CAPTCHA:ta käytettäessä), hänen tilinsä lukitaan kyseiseksi määräksi minuutteja."; +$DRHAccessToAllSessionContentText = "Henkilöstöjohtajat pääsevät käsiksi koko istunnon sisältöön"; +$DRHAccessToAllSessionContentComment = "Jos tämä on käytössä, henkilöstöjohtajat pääsevät käsiksi kaikkeen sisältöön ja käyttäjiin istunnoista, joita he seuraavat."; +$ShowGroupForaInGeneralToolText = "Näytä ryhmäfoorumit yleisellä foorumilla"; +$ShowGroupForaInGeneralToolComment = "Näytä ryhmäfoorumit foorumityökalussa kurssitasolla. Tämä vaihtoehto on oletusarvoisesti käytössä (tällöin ryhmäfoorumien yksilölliset näkyvyydet toimivat edelleen lisäkriteereinä). Jos se poistetaan käytöstä, ryhmäfoorumit näkyvät vain ryhmätyökalun kautta, olivat ne sitten julkisia tai eivät."; +$TutorsCanAssignStudentsToSessionsText = "Opettajat voivat jakaa opiskelijoita istuntoihin"; +$TutorsCanAssignStudentsToSessionsComment = "Kun tämä on käytössä, istuntojen kurssivalmentajat/tuutorit voivat tilata uusia käyttäjiä istuntoonsa. Tämä vaihtoehto on muuten ainoastaan ylläpitäjien ja istunnon ylläpitäjien käytettävissä."; +$UniqueAnswerImagePreferredSize200x150 = "Kuvien kokoa muutetaan (ylös- tai alaspäin) 200x150 pikseliin. Jotta kysymys voidaan esittää paremmin, suosittelemme, että lataat vain tämän kokoisia kuvia."; +$AllowLearningPathReturnLinkTitle = "Näytä oppimispolut paluulinkki"; +$AllowLearningPathReturnLinkComment = "Poista tämä vaihtoehto käytöstä, jos haluat piilottaa 'Palaa kotisivulle' -painikkeen oppimispoluissa."; +$HideScormExportLinkTitle = "Piilota SCORM-vienti"; +$HideScormExportLinkComment = "Piilota SCORM Export -kuvake Oppimispolut-luettelosta."; +$HideScormCopyLinkTitle = "Piilota SCORM-kopionti"; +$HideScormCopyLinkComment = "Piilota oppimispolun kopiointikuvake oppimispolut-luettelosta."; +$HideScormPdfLinkTitle = "Piilota oppimispolun PDF-vienti"; +$HideScormPdfLinkComment = "Piilota oppimispolun PDF-vientikuvake oppimispolut-luettelosta."; +$SessionDaysBeforeCoachAccessTitle = "Valmentajan oletusarvoinen pääsy x päivää ennen istuntoa"; +$SessionDaysBeforeCoachAccessComment = "Valmentajan oletusarvoisten päivien määrä, jolloin valmentaja voi käyttää istuntoa ennen virallista istunnon alkamispäivää."; +$SessionDaysAfterCoachAccessTitle = "Valmentajan oletusarvoinen pääsy x päivää istunnon jälkeen"; +$SessionDaysAfterCoachAccessComment = "Valmentajan oletusarvoisten päivien määrä, jonka valmentaja voi käyttää istuntoaan virallisen istunnon päättymispäivän jälkeen."; +$PdfLogoHeaderTitle = "PDF-otsikon logo"; +$PdfLogoHeaderComment = "Käytetäänkö css/themes/[your-css]/images/pdf_logo_header.png:ssä olevaa kuvaa PDF-otsikon logona kaikissa PDF-vienteissä (normaalin portaalin logon sijasta)?"; +$OrderUserListByOfficialCodeTitle = "Järjestä käyttäjät virallisen koodin mukaan"; +$OrderUserListByOfficialCodeComment = "Käytä 'virallista koodia' lajitellaksesi opiskelijalistat heidän sukunimensä tai etunimensä sijasta."; +$AlertManagerOnNewQuizTitle = "Sähköpostihälytyksen oletusasetus uudessa tietokilpailussa"; +$AlertManagerOnNewQuizComment = "Haluatko, että kurssin hallinnoijille (opettajille) ilmoitetaan sähköpostitse, kun opiskelija on vastannut tietovisaan. Tämä on oletusarvo, joka annetaan kaikille uusille kursseille, mutta jokainen opettaja voi silti muuttaa tätä asetusta omalla kurssillaan."; +$ShowOfficialCodeInExerciseResultListTitle = "Näytä virallinen koodi harjoitusten tuloksissa"; +$ShowOfficialCodeInExerciseResultListComment = "Näytetäänkö opiskelijoiden virallinen koodi harjoitusten tulosraporteissa?"; +$HidePrivateCoursesFromCourseCatalogTitle = "Piilota yksityiset kurssit luettelosta"; +$HidePrivateCoursesFromCourseCatalogComment = "Haluatko piilottaa yksityiset kurssit kurssiluettelosta. Tämä on järkevää silloin, kun käytät kurssiluetteloa pääasiassa siihen, että opiskelijat voivat tilata kursseja automaattisesti."; +$CoursesCatalogueShowSessionsTitle = "Istuntojen ja kurssien luettelo"; +$CoursesCatalogueShowSessionsComment = "Haluatko näyttää kurssiluettelossa vain kurssit, vain istunnot vai kurssit *ja* istunnot."; +$AutoDetectLanguageCustomPagesTitle = "Ota käyttöön kielen automaattinen tunnistus mukautetuilla sivuilla"; +$AutoDetectLanguageCustomPagesComment = "Jos käytät mukautettuja sivuja, ota tämä käyttöön jos haluat, että kielentunnistin esittää sivun käyttäjän selaimen kielellä, tai poista käytöstä, jos haluat pakottaa kielen alustan oletuskieleksi."; +$LearningPathShowReducedReportTitle = "Oppimispolut: näytä supistettu raportti"; +$LearningPathShowReducedReportComment = "Kun käyttäjä tarkastelee omaa edistymistään oppimispolut-työkalun sisällä (tilastokuvakkeen kautta), näytä lyhennetty (vähemmän yksityiskohtainen) versio edistymisraportista."; +$AllowSessionCourseCopyForTeachersTitle = "Opettajien istunto-istuntoon kopioinnin salliminen"; +$AllowSessionCourseCopyForTeachersComment = "Ota tämä vaihtoehto käyttöön, jotta opettajat voivat kopioida sisältöä yhdestä istunnon kurssista toisen istunnon kurssille. Oletusarvoisesti tämä vaihtoehto on vain alustan ylläpitäjien käytettävissä."; +$HideLogoutButtonTitle = "Piilota uloskirjautumispainike"; +$HideLogoutButtonComment = "Piilota uloskirjautumispainike. Tämä on yleensä kiinnostavaa vain silloin, kun käytetään ulkoista kirjautumis- ja uloskirjautumismenetelmää, esimerkiksi kun käytetään jonkinlaista Single Sign On -järjestelmää."; +$RedirectAdminToCoursesListTitle = "Ohjaa ylläpitäjä kurssien luetteloon"; +$RedirectAdminToCoursesListComment = "Oletusarvoisesti ylläpitäjät lähetetään suoraan hallintapaneeliin (kun taas opettajat ja opiskelijat lähetetään kurssiluetteloon tai alustan etusivulle). Ota käyttöön mahdollisuus ohjata ylläpitäjä myös kurssiluetteloonsa."; +$CourseImagesInCoursesListTitle = "Kurssien mukautetut kuvakkeet"; +$CourseImagesInCoursesListComment = "Käytä kurssikuvia kurssin kuvakkeena kurssiluetteloissa (oletusarvoisen vihreän taulun kuvakkeen sijaan)."; +$StudentPublicationSelectionForGradebookTitle = "Arvostelukirjassa huomioitu tehtävä"; +$StudentPublicationSelectionForGradebookComment = "Opiskelijat voivat ladata Tehtävät-työkalussa useamman kuin yhden tiedoston. Jos yhteen tehtävään on liitetty useampi kuin yksi tiedosto, mikä niistä olisi otettava huomioon, kun ne asetetaan paremmuusjärjestykseen arvosanakirjassa? Tämä riippuu menetelmästäsi. Käytä sanaa \"ensimmäinen\" painottaaksesi yksityiskohtien huomioimista (kuten oikea-aikaista käsittelyä ja oikean työn käsittelyä ensin). Käytä \"viimeistä\" korostaaksesi yhteistyöhön perustuvaa ja mukautuvaa työskentelyä."; +$FilterCertificateByOfficialCodeTitle = "Todistusten suodatus virallisen koodin mukaan"; +$FilterCertificateByOfficialCodeComment = "Lisää opiskelijoiden virallisen koodin suodatin todistusten luetteloon."; +$MaxCKeditorsOnExerciseResultsPageTitle = "Max editorit harjoituksen tulosnäytössä"; +$MaxCKeditorsOnExerciseResultsPageComment = "Koska harjoituksessa saattaa esiintyä suuri määrä kysymyksiä, korjausnäyttö, jossa opettaja voi lisätä kommentteja kuhunkin vastaukseen, saattaa latautua hyvin hitaasti. Aseta tämä luku arvoon 5, jos haluat pyytää alustaa näyttämään WYSIWYG-editorit vain tiettyyn määrään vastauksia asti näytöllä. Tämä nopeuttaa korjaussivun latautumisaikaa huomattavasti, mutta poistaa WYSIWYG-editorit ja jättää vain tavallisen tekstieditorin."; +$DocumentDefaultOptionIfFileExistsTitle = "Dokumentin oletuslataustila"; +$DocumentDefaultOptionIfFileExistsComment = "Oletusarvoinen lataustapa kurssien asiakirjoissa. Tätä asetusta voidaan muuttaa kaikkien käyttäjien osalta latauksen yhteydessä. Se on vain oletusasetus."; +$GradebookCronTaskGenerationTitle = "Todistusten automaattinen luominen WS-kutsun yhteydessä"; +$GradebookCronTaskGenerationComment = "Kun tämä vaihtoehto on käytössä ja kun käytät WSCertificatesList-verkkopalvelua, se varmistaa, että todistukset on luotu vain jos he ovat saavuttaneet riittävän pistemäärän kaikissa kurssien ja istuntojen arvostelukirjoissa määritellyissä tehtävissä (tämä saattaa kuluttaa huomattavasti palvelimesi käsittelyresursseja)."; +$OpenBadgesBackpackUrlTitle = "OpenBadges repun URL"; +$OpenBadgesBackpackUrlComment = "OpenBadges-reppupalvelimen URL-osoite, jota käytetään oletusarvoisesti kaikille käyttäjille, jotka haluavat viedä merkkinsä. Tämä on oletusarvoisesti Mozilla Foundationin avoin ja ilmainen reppuvarasto: https://backpack.openbadges.org/."; +$CookieWarningTitle = "Evästeiden tietosuojailmoitus"; +$CookieWarningComment = "Jos tämä vaihtoehto on käytössä, alustan yläosassa näkyy banneri, jossa käyttäjiä pyydetään hyväksymään, että alusta käyttää evästeitä, jotka ovat tarpeen käyttäjäkokemuksen tarjoamiseksi. Käyttäjä voi helposti kuitata ja piilottaa bannerin. Näin Chamilo voi noudattaa EU:n web-evästeasetuksia."; +$HideCourseGroupIfNoToolAvailableTitle = "Piilota kurssiryhmä, jos työkalua ei ole"; +$HideCourseGroupIfNoToolAvailableComment = "Jos ryhmässä ei ole käytettävissä työkalua eikä käyttäjä itse ole rekisteröitynyt ryhmään, piilota ryhmä kokonaan ryhmäluettelosta."; +$CatalogueAllowSessionAutoSubscriptionTitle = "Automaattinen ilmoittautuminen istuntojen luettelossa"; +$SoapRegistrationDecodeUtf8Title = "Verkkopalvelut: UTF-8:n dekoodaus"; +$SoapRegistrationDecodeUtf8Comment = "UTF-8-koodin purkaminen verkkopalvelukutsuista. Ota tämä vaihtoehto käyttöön (välitetään SOAP-parserille), jos sinulla on ongelmia otsikoiden ja nimien koodauksen kanssa, kun ne lisätään verkkopalvelujen kautta."; +$AttendanceDeletionEnableTitle = "Läsnäolot: salli poistaminen"; +$AttendanceDeletionEnableComment = "Chamilon oletusasetus on, että läsnäololomakkeet piilotetaan sen sijaan, että ne poistettaisiin, siltä varalta, että opettaja tekisi sen vahingossa. Ota tämä vaihtoehto käyttöön, jotta opettajat voivat *todella* poistaa läsnäololomakkeet."; +$GravatarPicturesTitle = "Gravatar-käyttäjäkuvat"; +$GravatarPicturesComment = "Ota tämä vaihtoehto käyttöön, jotta Gravatar-arkistosta voidaan etsiä nykyisen käyttäjän kuvia, jos käyttäjä ei ole määritellyt kuvaa paikallisesti. Tämä on hyvä tapa täyttää kuvia sivustollasi automaattisesti, erityisesti jos käyttäjät ovat aktiivisia internetin käyttäjiä. Gravatar-kuvat voidaan määrittää helposti käyttäjän sähköpostiosoitteen perusteella osoitteessa http://en.gravatar.com/."; +$GravatarPicturesTypeTitle = "Gravatar avatarin tyyppi"; +$GravatarPicturesTypeComment = "Jos Gravatar-vaihtoehto on käytössä ja käyttäjällä ei ole kuvaa määritetty Gravatariin, voit valita tämän vaihtoehdon avulla avatarin tyypin, jonka Gravatar luo kullekin käyttäjälle. Katso http://en.gravatar.com/site/implement/images#default-image avatar-tyyppien esimerkkejä."; +$SessionAdminPermissionsLimitTitle = "Rajoita istunnon ylläpitäjien oikeuksia"; +$SessionAdminPermissionsLimitComment = "Jos tämä on käytössä, istuntojen ylläpitäjät näkevät vain Käyttäjä-lohkon, jossa on 'Lisää käyttäjä' -vaihtoehto, ja Istunnot-lohkon, jossa on 'Istuntojen luettelo' -vaihtoehto."; +$ShowSessionDescriptionTitle = "Näytä istunnon kuvaus"; +$ShowSessionDescriptionComment = "Näytä istunnon kuvaus aina, kun tämä vaihtoehto on käytettävissä (istuntojen seurantasivut jne.)."; +$CertificateHideExportLinkStudentTitle = "Todistukset: piilota vientilinkki opiskelijoilta"; +$CertificateHideExportLinkStudentComment = "Jos tämä on käytössä, opiskelijat eivät voi viedä todistuksiaan PDF-muodossa. Tämä vaihtoehto on käytettävissä, koska todistuksen mallin tarkasta HTML-rakenteesta riippuen PDF-vienti voi olla heikkolaatuista. Tässä tapauksessa on parasta näyttää opiskelijoille vain HTML-todistus."; +$CertificateHideExportLinkTitle = "Todistukset: piilota PDF-vientilinkki kaikilta"; +$CertificateHideExportLinkComment = "Poista kokonaan mahdollisuus viedä varmenteet PDF-muodossa (kaikilta käyttäjiltä). Jos tämä on käytössä, se piilotetaan myös opiskelijoilta."; +$DropboxHideCourseCoachTitle = "Dropbox: piilota kurssivalmentaja"; +$DropboxHideCourseCoachComment = "Piilota istuntokurssin valmentaja dropboxissa, kun valmentaja lähettää asiakirjan opiskelijoille."; +$SSOForceRedirectTitle = "Single Sign On: pakota uudelleenohjaus"; +$SSOForceRedirectComment = "Ota tämä vaihtoehto käyttöön, jos haluat pakottaa käyttäjät todennukseen päätodennusportaalissa, kun Single Sign On -menetelmä on käytössä. Ota käyttöön vasta sitten, kun olet varma, että Single Sign On -menettelysi on määritetty oikein, sillä muuten saatat estää itseäsi kirjautumasta sisään uudelleen (tässä tapauksessa muuta SSO-asetuksia settings_current-taulussa tietokannan suoran pääsyn kautta, jotta voit poistaa lukituksen)."; +$SessionCourseOrderingTitle = "Istuntokurssien manuaalinen tilaaminen"; +$SessionCourseOrderingComment = "Ota tämä vaihtoehto käyttöön, jotta istunnon ylläpitäjät voivat järjestää istunnon sisällä olevat kurssit manuaalisesti. Jos tämä asetus poistetaan käytöstä, kurssit järjestetään aakkosjärjestyksessä kurssin otsikon mukaan."; +$CatalogueAllowSessionAutoSubscriptionComment = "Jos se on käytössä *ja* istuntoluettelo on käytössä, käyttäjät voivat itse tilata aktiivisia istuntoja \"Tilaa\"-painikkeella ilman minkäänlaisia rajoituksia."; +$AddLPCategory = "Lisää oppimispolun kategoria"; +$WithOutCategory = "Ilman kategoriaa"; +$ItemsTheReferenceDependsOn = "Kohteet, joista viittaus riippuu"; +$UseAsReference = "Käytä viitteenä"; +$Dependencies = "Viitteestä riippuvaiset kohteet"; +$SetAsRequirement = "Asetetaan vaatimukseksi"; +$AddSequence = "Lisää uusi sekvenssi"; +$ResourcesSequencing = "Resurssien sekvensointi"; +$GamificationModeTitle = "Pelillistämistila"; +$GamificationModeComment = "Aktivoi tähtisaavutukset oppimispoluilla"; +$LevelX = "Taso %s"; +$SeeCourse = "Näytä kurssi"; $XPoints = "% pisteet"; +$FromXUntilY = "alkaen %s ja päättyen %s"; +$SubscribeUsersToLp = "Tilaa käyttäjät oppimispolulle"; +$SubscribeGroupsToLp = "Tilaa ryhmät oppimispolulle"; +$CreateForumForThisLearningPath = "Luo foorumi tätä oppimispolkua varten"; +$ByDate = "Päivämäärän mukaan"; +$ByTag = "Tunnisteen mukaan"; +$GoToCourseInsideSession = "Siirry kurssille istunnon sisällä"; +$MyCoursesSessionView = "Omat kurssit istuntonäkymä"; +$MyCoursesDefaultView = "Kurssieni oletusnäkymä"; +$EnableGamificationMode = "Ota pelimuotoisuus käyttöön"; +$DisableGamificationMode = "Poista pelitila käytöstä"; +$CatalogueShowOnlyCourses = "Näytä vain luettelossa olevat kurssit"; +$CatalogueShowOnlySessions = "Näytä vain luettelossa olevat istunnot"; +$CatalogueShowCoursesAndSessions = "Näytä sekä kurssit että istunnot luettelossa"; +$SequenceSelection = "Sekvenssin valinta"; +$SequenceConfiguration = "Sekvenssin konfigurointi"; +$SequencePreview = "Sekvenssin esikatselu"; +$DisplayDates = "Näytetyt päivämäärät"; +$AccessDates = "Pääsyoikeus päivämäärät opiskelijoille"; +$CoachDates = "Valmentajien pääsypäivämäärät"; +$ChatWithXUser = "Keskustele %s:n kanssa"; +$StartVideoChat = "Aloita videopuhelu"; +$FieldTypeVideoUrl = "Videon URL-osoite"; +$InsertAValidUrl = "Lisää kelvollinen URL-osoite"; +$SeeInformation = "Katso tiedot"; $ShareWithYourFriends = "Jaa ystäviesi kanssa"; +$ChatRoomName = "Chat-huoneen nimi"; +$TheVideoChatRoomXNameAlreadyExists = "Videokeskusteluhuone %s on jo olemassa"; +$ChatRoomNotCreated = "Chat-huonetta ei voitu luoda"; +$TheXUserBrowserDoesNotSupportWebRTC = "Selain %s ei tue natiivia videolähetystä. Sori siitä."; +$FromDateX = "%s:sta"; +$UntilDateX = "Kunnes %s"; +$GraphDependencyTree = "Riippuvuuspuu"; +$CustomizeIcons = "Mukauta kuvakkeita"; +$GradebookListOfStudentsReports = "Opiskelijaluettelon arvosanakirjaraportti"; +$ExportAllToPDF = "Vie kaikki PDF-muodossa"; +$GradeGeneratedOnX = "Arvosana luotu kohteessa %s"; +$ExerciseAvailableSinceX = "Harjoitus saatavilla alkaen %s"; +$ExerciseIsActivatedFromXToY = "Testi on käytössä %s:stä %s:ään."; +$SelectSomeOptions = "Valitse joitakin vaihtoehtoja"; +$AddCustomCourseIntro = "Voit lisätä tämän kurssin esittelyn klikkaamalla painos-kuvaketta."; $SocialGroup = "Sosiaalinen ryhmä"; +$RequiredSessions = "Vaaditut istunnot"; +$DependentSessions = "Riippuvat istunnot"; +$ByDuration = "Keston mukaan"; +$ByDates = "Päivämäärien mukaan"; +$SendAnnouncementCopyToDRH = "Lähetä kopio valittujen opiskelijoiden henkilöstöpäälliköille"; +$PoweredByX = "Voimalähteenä %s"; +$AnnouncementErrorNoUserSelected = "Valitse vähintään yksi käyttäjä. Ilmoitusta ei ole tallennettu."; +$NoDependencies = "Ei riippuvuuksia"; +$SendMailToStudent = "Lähetä postia opiskelijalle"; +$SendMailToHR = "Lähetä sähköpostia henkilöstöpäällikölle"; +$CourseFields = "Kurssin kentät"; +$FieldTypeCheckbox = "Valintaruutuvaihtoehdot"; +$FieldTypeInteger = "Kokonaislukuarvo"; +$FieldTypeFileImage = "Kuvatiedosto"; +$FieldTypeFloat = "Float-arvo"; +$DocumentsDefaultVisibilityDefinedInCourseTitle = "Dokumenttien näkyvyys määritelty kurssilla"; +$DocumentsDefaultVisibilityDefinedInCourseComment = "Dokumenttien oletusnäkyvyys kaikille kursseille"; +$HtmlPurifierWikiTitle = "HTMLPurifier Wikissä"; +$HtmlPurifierWikiComment = "Ota HTML-puhdistus käyttöön wiki-työkalussa (lisää turvallisuutta, mutta vähentää tyyliominaisuuksia)."; +$ClickOrDropFilesHere = "Klikkaa tai pudota tiedostoja"; +$RemoveCourseAssistantStatus = "Poista avustajan rooli"; +$ImportGradebookInCourse = "Tuo arvostelukirja pääkurssilta"; +$InstitutionAddressTitle = "Laitoksen osoite"; +$InstitutionAddressComment = "Osoite"; +$LatestLoginInCourse = "Viimeisin loggautuminen kurssille"; +$LatestLoginInPlatform = "Viimeisin sisäänkirjautuminen alustaan"; +$FirstLoginInPlatform = "Ensimmäinen kirjautuminen alustalle"; +$FirstLoginInCourse = "Ensimmäinen pääsy kurssille"; +$QuotingToXUser = "Lainataan %s"; +$LoadMoreComments = "Lataa lisää kommentteja"; $ShowProgress = "Näytä edistyminen"; +$XPercent = "%s %%"; +$CheckRequirements = "Tarkista vaatimukset"; +$ParentLanguageX = "Pääkieli: %s"; +$RegisterTermsOfSubLanguageForX = "Määritä uudet termit alakielelle %s etsimällä jokin termi ja tallenna jokainen käännös napsauttamalla Tallenna-painiketta. Tämän jälkeen sinun on vaihdettava omaa käyttökieltäsi, jotta uudet termit näkyvät."; +$SeeSequences = "Katso sekvenssit"; +$SessionRequirements = "Istunnon vaatimukset"; +$IsRequirement = "On vaatimus"; +$ConsiderThisGradebookAsRequirementForASessionSequence = "Pidä tätä arvosanakirjaa vaatimuksena kurssin suorittamiselle (vaikuttaa istuntojen järjestykseen)"; +$DistinctUsersLogins = "Eri käyttäjien kirjautumiset"; +$AreYouSureToSubscribe = "Haluatko varmasti ilmoittautua?"; +$CheckYourEmailAndFollowInstructions = "Tarkista sähköpostisi ja noudata ohjeita."; +$LinkExpired = "Linkki vanhentunut, yritä uudelleen."; +$ResetPasswordInstructions = "Ohjeet salasanan vaihtamiseen"; +$ResetPasswordCommentWithUrl = "Saat tämän viestin, koska sinä (tai joku sinuksi tekeytyvä henkilö) on pyytänyt uuden salasanan luomista sinulle. Jotta voit asettaa uuden salasanan, sinun on aktivoitava se. Napsauta tätä linkkiä: %s Jos et ole pyytänyt tätä menettelyä, jätä tämä viesti huomiotta. Jos saat sen jatkuvasti, ota yhteyttä portaalin ylläpitäjään."; +$CronRemindCourseExpirationActivateTitle = "Muistuta kurssin päättymisestä cron -toiminnolla"; +$CronRemindCourseExpirationActivateComment = "Ota Muistuta kurssin päättymisestä -cron käyttöön"; +$CronRemindCourseExpirationFrequencyTitle = "Muistuta kurssin päättymisestä cron-ohjelman taajuus"; +$CronRemindCourseExpirationFrequencyComment = "Päivien määrä ennen kurssin päättymistä, jolloin muistutussähköposti lähetetään"; +$CronCourseFinishedActivateText = "Kurssi on päättynyt cron-toiminto"; +$CronCourseFinishedActivateComment = "Aktivoi Kurssi päättynyt -cron"; +$MailCronCourseFinishedSubject = "Kurssin %s loppu"; +$MailCronCourseFinishedBody = "PArahin %s, +
    +Kiitos osallistumisestasi kurssille %s. Toivomme, että olet saanut uutta merkityksellistä tietoa ja nauttinut kurssista. Voit tarkistaa suorituksesi kurssilla Oma edistyminen -osiosta.

    Terveisin, %s Team"; +$GenerateDefaultContent = "Luo oletussisältöä"; +$ThanksForYourSubscription = "Kiitos ilmoittautumisesta"; +$XTeam = "%s joukkue."; +$YouCanStartSubscribingToCoursesEnteringToXUrl = "Voit alkaa tilata kursseja, jotka tulevat osoitteeseen %s."; +$VideoUrl = "Videon URL-osoite"; +$AddAttachment = "Lisää liite"; +$FieldTypeOnlyLetters = "Vain tekstiä"; +$FieldTypeAlphanumeric = "Vain aakkosnumeeriset merkit"; +$OnlyLetters = "Vain kirjaimet"; +$SelectFillTheBlankSeparator = "Valitse merkki \"tyhjälle\""; +$RefreshBlanks = "Päivitä termit"; +$WordTofind = "Etsittävä sana"; +$BlankInputSize = "Täytettävän laatikon koko"; +$DateFormatLongNoDayJS = "MM dd, yy"; +$TimeFormatNoSecJS = "HH:mm"; +$AtTime = "ajassa"; +$SendSubscriptionNotification = "Lähetä opiskelijoille sähköposti-ilmoitus ilmoittautumisesta"; +$SendAnEmailWhenAUserBeingSubscribed = "Lähetä sähköpostia, kun käyttäjä on ilmoitettu istuntoon."; +$SelectDate = "Valitse päivämäärä"; +$OnlyLettersAndSpaces = "Vain kirjaimet ja välilyönnit"; +$OnlyLettersAndNumbersAndSpaces = "Vain kirjaimet, numerot ja välilyönnit"; +$FieldTypeLettersSpaces = "Tekstin kirjaimet ja välilyönnit"; +$FieldTypeAlphanumericSpaces = "Teksti aakkosnumeeriset merkit ja välilyönnit"; +$CronRemindCourseFinishedActivateTitle = "Lähetä ilmoitus kurssin päättymisestä"; +$CronRemindCourseFinishedActivateComment = "Lähetetäänkö opiskelijoille sähköpostiviesti, kun kurssi (istunto) on päättynyt. Tämä edellyttää cron-tehtävien määrittämistä (katso main/cron/-hakemisto)."; $ThanksForRegisteringToSite = "Kiitos kun rekisteröidyit %s -ympäristöön."; +$AllowCoachFeedbackExercisesTitle = "Anna valmentajien kommentoida harjoitusten tarkastelua."; +$AllowCoachFeedbackExercisesComment = "Valmentajat voivat muokata palautetta harjoitusten tarkistamisen aikana."; +$PreventMultipleSimultaneousLoginTitle = "Estä samanaikainen kirjautuminen"; +$PreventMultipleSimultaneousLoginComment = "Estä käyttäjiä muodostamasta yhteyttä samalla tilillä useammin kuin kerran. Tämä on hyvä vaihtoehto maksullisissa portaaleissa, mutta se saattaa olla rajoittava testausvaiheessa, koska vain yksi selain voi muodostaa yhteyden millä tahansa tilillä."; +$ShowAdditionalColumnsInStudentResultsPageTitle = "Näytä lisää sarakkeita arvosanakirjassa"; +$ShowAdditionalColumnsInStudentResultsPageComment = "Näyttää lisäsarakkeet arvosanakirjan opiskelijanäkymässä, joissa on kaikkien opiskelijoiden paras pistemäärä, raporttia tarkastelevan opiskelijan suhteellinen sijainti ja koko opiskelijaryhmän keskimääräinen pistemäärä."; +$CourseCatalogIsPublicTitle = "Julkaise kurssiluettelo"; +$CourseCatalogIsPublicComment = "Laita kurssiluettelo anonyymien käyttäjien (suuren yleisön) saataville ilman kirjautumista."; +$ResetPasswordTokenTitle = "Ota salasanan palautustoken käyttöön"; +$ResetPasswordTokenComment = "Tämän vaihtoehdon avulla voidaan luoda vanhentuva kertakäyttöinen token-tunniste, joka lähetetään sähköpostitse käyttäjälle salasanan palauttamiseksi."; +$ResetPasswordTokenLimitTitle = "Aikaraja salasanan palautustokenille"; +$ResetPasswordTokenLimitComment = "Sekuntien määrä ennen kuin luotu token-tunniste vanhenee automaattisesti eikä sitä voi enää käyttää (uusi token-tunniste on luotava)."; +$ViewMyCoursesListBySessionTitle = "Näytä kurssini istuntokohtaisesti"; +$ViewMyCoursesListBySessionComment = "Ota käyttöön uusi \"Omat kurssit\" -sivu, jossa istunnot näkyvät osana kursseja eikä päinvastoin."; +$UploadCorrections = "Lataa korjaukset"; +$UploadCorrection = "Lataa korjaus"; +$DurationInWords = "Kesto sanoina"; +$EnterPassword = "Anna salasana"; +$DownloadCertificatePdf = "Lataa todistus PDF-muodossa"; +$DownloadReportPdf = "Lataa raportti PDF-muodossa"; +$SkillXEnabled = "Taito \"%s\" otettu käyttöön"; +$SkillXDisabled = "Taito \"%s\" poistettu käytöstä"; +$ShowFullSkillNameOnSkillWheelTitle = "Näytä taidon koko nimi taitopyörässä"; +$ShowFullSkillNameOnSkillWheelComment = "Taitopyörässä näytetään taitonimi, kun sillä on lyhyt koodi."; +$AsciiSvgTitle = "Ota käyttöön AsciiSVG"; +$AsciiSvgComment = "Ota AsciiSVG-lisäosa käyttöön WYSIWYG-editorissa, jotta voit piirtää kaavioita matemaattisista funktioista."; +$DBPort = "Portti"; +$CreatedBy = "Luonut"; +$DropboxHideGeneralCoachTitle = "Piilota yleisvalmentaja dropboxissa"; +$DropboxHideGeneralCoachComment = "Piilota päävalmentajan nimi pudotuslaatikkotyökalussa, kun päävalmentaja on ladannut tiedoston."; $UploadMyAssignment = "Lähetä tehtäväni"; +$Inserted = "Lisätty"; +$YourBroswerDoesNotSupportWebRTC = "Selaimesi ei tue natiivia videolähetystä."; +$OtherTeachers = "Muut opettajat"; +$CourseCategory = "Kurssikategoria"; +$VideoChatBetweenUserXAndUserY = "Videokeskustelu %s ja %s välillä"; +$Enable = "Ota käyttöön"; +$Disable = "Poista käytöstä"; +$AvoidChangingPageAsThisWillCutYourCurrentVideoChatSession = "Vältä sivun vaihtamista, sillä se katkaisee nykyisen videokeskusteluistunnon."; +$ConnectingToPeer = "Yhteyden muodostaminen vertaisverkkoon"; +$ConnectionEstablished = "Yhteys muodostettu"; +$ConnectionFailed = "Yhteys epäonnistui"; +$ConnectionClosed = "Yhteys suljettu"; +$LocalConnectionFailed = "Paikallinen yhteys epäonnistui"; +$RemoteConnectionFailed = "Etäyhteys epäonnistui"; +$ViewStudents = "Näytä opiskelijat"; +$Into = "kohteeseen"; +$Sequence = "Sekvenssi"; +$Invitee = "Kutsuttu henkilö"; +$DateRange = "Päivämääräalue"; +$EditIcon = "Muokkaa kuvaketta"; +$CustomIcon = "Mukautettu kuvake"; +$CurrentIcon = "Nykyinen kuvake"; +$ConvertFormats = "Muunna tiedostomuoto"; +$AreYouSureToDeleteX = "Haluatko varmasti poistaa %s?"; +$AttachmentList = "Luettelo liitteistä"; +$SeeCourseInformationAndRequirements = "Katso kurssin tiedot ja vaatimukset"; +$DownloadAll = "Lataa kaikki"; +$DeletedDocuments = "Poistetut dokumentit"; +$GroupReporting = "Ryhmäraportointi"; +$CourseListNotAvailable = "Kurssiluettelo ei ole saatavilla"; +$CopyOfMessageSentToXUser = "Kopio viestistä, joka on lähetetty osoitteeseen %s"; +$Convert = "Muunna"; +$PortalLimitType = "Portaalin rajatyyppi"; +$PortalName = "Portaalin nimi"; +$BestScore = "Paras pistemäärä"; +$AreYouSureToDeleteJS = "Oletko varma, että haluat poistaa?"; +$ConversionToSameFileFormat = "Muunnos samaan tiedostomuotoon. Valitse toinen."; +$FileFormatNotSupported = "Tiedostomuotoa ei tueta"; +$FileConvertedFromXToY = "Tiedosto muunnettu %s:stä %s:ksi"; +$XDays = "%s päivää"; +$SkillProfile = "Taitoprofiili"; +$AchievedSkills = "Saavutetut taidot"; $BusinessCard = "Käyntikortti"; +$BadgeDetails = "Merkin tiedot"; +$TheUserXNotYetAchievedTheSkillX = "Käyttäjä %s ei ole vielä saavuttanut taitoa \"%s\"."; +$IssuedBadgeInformation = "Myönnetyn merkin tiedot"; +$RecipientDetails = "Vastaanottajan tiedot"; +$SkillAcquiredAt = "Taito, joka on hankittu"; +$BasicSkills = "Perustaidot"; +$TimeXThroughCourseY = "%s kautta %s"; +$ExportBadge = "Vie merkki"; +$SelectToSearch = "Valitse haettavaksi"; +$PlaceOnTheWheel = "Aseta pyörälle"; +$Skill = "Taito"; +$Argumentation = "Argumentointi"; +$TheUserXHasAlreadyAchievedTheSkillY = "Käyttäjä %s on jo saavuttanut taidon %s."; +$SkillXAssignedToUserY = "Taito %s on annettu käyttäjälle %s."; +$AssignSkill = "Määritä taito"; +$AddressField = "Osoite"; +$Geolocalization = "Geolokalisointi"; +$XComments = "%s kommentit"; +$RateTheSkillInPractice = "Miten hyvin havaitsit, että tämä henkilö osaa soveltaa tätä taitoa käytännössä asteikolla 1-10?"; +$AverageRatingX = "Keskimääräinen arvionti %s"; +$AverageRating = "Keskimääräinen arviointi"; +$GradebookTeacherResultsNotShown = "Opettajien tuloksia ei näytetä eikä oteta huomioon arvosanakirjassa."; $SocialWallWriteNewPostToFriend = "Kirjoita jotain ystäväsi seinälle"; +$EmptyTemplate = "Tyhjä mallipohja"; +$BaseCourse = "Pääkurssi"; +$BaseCourses = "Pääkurssit"; +$Square = "Neliö"; +$Ellipse = "Ellipsi"; +$Polygon = "Monikulmio"; +$HotspotStatus1 = "Piirrä hotspot"; +$HotspotStatus2Polygon = "Sulje monikulmio hiiren oikealla napsautuksella."; +$HotspotStatus2Other = "Vapauta hiiren nappi tallentaaksesi hotspotin"; +$HotspotStatus3 = "Hotspot tallennettu"; +$HotspotShowUserPoints = "Näytä/piilota käyttäjän klikkaukset"; +$ShowHotspots = "Näytä / Piilota hotspotit"; +$Triesleft = "Yrityksiä jäljellä"; +$NextAnswer = "Klikkaa nyt:"; +$CloseDelineation = "Tarkka määrittely"; +$Oar = "Riskialue"; +$HotspotExerciseFinished = "Klikkaa nyt alla olevaa painiketta vahvistaaksesi vastauksesi."; +$ClosePolygon = "Sulje monikulmio"; +$DelineationStatus1 = "Sulje rajaus hiiren kakkospainikkeella."; +$Beta = "Beta"; +$CropYourPicture = "Rajaa kuva"; +$DownloadBadge = "Lataa merkki"; +$NoXMLFileFoundInTheZip = "Zip-arkistosta ei löytynyt XML-tiedostoa. Tämä on tämäntyyppisen tuonnin edellytys."; +$BakedBadgeProblem = "Merkin tietojen upottamisessa kuvan sisään ilmeni ongelma, mutta voit silti käyttää tätä sivua pätevänä todisteena."; +$ConfirmAssociateForumToLPItem = "Tämä toiminto liittää foorumiketjun tähän oppimispolun kohteeseen. Haluatko jatkaa?"; +$ConfirmDissociateForumToLPItem = "Tämä toiminto poistaa tämän oppimispolun linkityksen foorumiketjun. Haluatko jatkaa?"; +$DissociateForumToLPItem = "Erota tämä foorumi oppimispolusta"; +$AssociateForumToLPItem = "Liitä foorumi tähän oppimispolun kohteeseen"; +$ForumDissociated = "Foorumi eriytetty"; +$ClickOrDropOneFileHere = "Klikkaa tai pudota yksi tiedosto tähän"; +$PDFDownloadNotAllowedForStudents = "PDF-tiedostojen lataaminen ei ole sallittua opiskelijoille"; +$ModuloPercentage = "Moduuli:\t\t\t\t%"; +$LastXDays = "Viimeiset %s päivää"; +$DisplayCertificate = "Näytä todistus"; +$ExportBadges = "Vie merkit"; +$LanguagesDisableAllExceptDefault = "Poista käytöstä kaikki kielet paitsi alustan oletuskieli"; +$ThereAreUsersUsingThisLanguagesDisableItManually = "Tällä hetkellä on käyttäjiä, jotka käyttävät seuraavaa kieltä. Poista kieli käytöstä manuaalisesti."; +$MessagingAllowSendPushNotificationTitle = "Salli Push-ilmoitukset Chamilo Messaging -mobiilisovellukseen."; +$MessagingAllowSendPushNotificationComment = "Push-ilmoitusten lähettäminen Googlen Firebase-konsolilla"; +$MessagingGDCProjectNumberTitle = "Firebase Console for Cloud Messagingin lähettäjän tunnus"; +$MessagingGDCProjectNumberComment = "Sinun täytyy rekisteröidä projekti Google Firebase -konsoliin"; +$MessagingGDCApiKeyTitle = "Firebase Console for Cloud Messaging -palvelimen palvelinavain"; +$MessagingGDCApiKeyComment = "Palvelinavain (legacy token) projektin tunnistetiedoista."; +$Overwrite = "Korvaa"; +$TheLogoMustBeSizeXAndFormatY = "Logon on oltava kooltaan %s px ja tiedostomuotona %s."; +$ResetToTheOriginalLogo = "Alkuperäinen logo palautettu"; $NewLogoUpdated = "Uusi logo päivitetty"; $CurrentLogo = "Nykyinen logo"; $UpdateLogo = "Päivitä logo"; +$FollowedStudentBosses = "Seuratut opiskelijoiden johtajat"; +$DatabaseManager = "Tietokannan ylläpitäjä"; +$CourseTemplate = "Kurssin mallipohja"; +$PickACourseAsATemplateForThisNewCourse = "Valitse kurssi mallipohjaksi tälle uudelle kurssille"; +$TeacherCanSelectCourseTemplateTitle = "Opettaja voi valita kurssin mallipohjaksi"; +$TeacherCanSelectCourseTemplateComment = "Salli valita kurssi mallipohjana uudelle kurssille, jota opettaja on luomassa."; +$TheForumAutoLaunchSettingIsOnStudentsWillBeRedirectToTheForumTool = "Foorumin automaattinen käynnistys on päällä. Opiskelijat ohjataan foorumityökaluun, kun he tulevat tälle kurssille."; +$RedirectToForumList = "Uudelleenohjaus foorumilistaan"; +$EnableForumAutoLaunch = "Ota käyttöön foorumin automaattinen käynnistys"; +$NowDownloadYourCertificateClickHere = "Voit nyt ladata todistuksesi klikkaamalla tästä"; +$AdditionallyYouHaveObtainedTheFollowingSkills = "Lisäksi olet saavuttanut seuraavat taidot"; +$IHaveObtainedSkillXOnY = "Olen saavuttanut taidon %s aiheessa %s"; $AnotherAttempt = "Toinen yritys"; +$RemainingXAttempts = "Jäljellä %d yritystä"; $Map = "Kartta"; $MyLocation = "Sijaintini"; +$ShowCourseInUserLanguage = "Näytä kurssi käyttäjän kielellä"; +$AccessData = "Pääsytiedot"; +$InvalidImageDimensions = "Kuvan mitat eivät vastaa vaatimuksia. Tarkista kuvakentän vieressä olevat ehdotukset."; +$CouldNotResetPasswordBecauseLDAP = "Salasanaa ei voitu palauttaa, ota yhteyttä asiakaspalveluun."; +$Quote = "Lainaus"; $ValueTooSmall = "Arvo on liian pieni."; $ValueTooBig = "Arvo on liian suuri."; $YouAreATeacherOfThisCourse = "Olet tämän kurssin opettaja"; +$StudentBossList = "Opiskelijajohtajien luettelo"; +$ShowScoreEveryAttemptShowAnswersLastAttempt = "Näytä pisteet jokaisesta yrityksestä, näytä oikeat vastaukset vain viimeisellä yrityksellä (toimii vain, jos yritysmäärä rajoitettu)."; +$MissingChartLibraryPleaseCheckLog = "Puuttuva kaaviokirjasto. Tarkista tarkemmat tiedot virhelokista."; +$UserXIndicated = "Käyttäjä %s ilmoitti:"; +$AcquiredLevel = "Hankittu taso"; +$ManageSkillsLevels = "Taitotasojen hallinta"; +$AddProfile = "Lisää profiili"; +$AddLevel = "Lisää taso"; +$ChangeAcquiredLevel = "Muuta hankittua tasoa"; +$NoLevelAcquiredYet = "Ei vielä hankittua tasoa"; +$RecordAudio = "Äänen tallentaminen"; +$StartRecordingAudio = "Aloita tallennus"; +$StopRecordingAudio = "Lopeta tallennus"; +$SaveRecordedAudio = "Tallenna nauhoitettu ääni"; +$GradeFromX = "Kurssin arvosanat: %s"; +$TitleMandatory = "Otsikko vaaditaan"; +$NoCourseCategorySupplied = "Kurssikategoriaa ei ole ilmoitettu"; +$ForumStartDate = "Julkaisupäivä"; +$ForumEndDate = "Määräaika"; +$ForumStartDateComment = "Foorumi on näkyvissä tästä päivästä alkaen"; +$ForumEndDateComment = "Kun tämä päivämäärä on ohitettu, foorumi suljetaan."; +$ModeratedForum = "Moderoitu foorumi"; +$DiagnosisFilledSubject = "Arviointi täytetty onnistuneesti"; +$DiagnosisFilledDescription = "Arviointi on täytetty onnistuneesti"; +$UserXHasFilledTheDiagnosis = "Käyttäjä %s on täyttänyt diagnoosin"; +$UserXHasFilledTheDiagnosisDescription = "Käyttäjä %s on täyttänyt diagnoosin alustalla, ja se on valmis tarkistettavaksi."; +$StudentBoss = "Valvoja (n+1)"; +$SendLegal = "Lähetä oikeudellinen sopimus"; +$DeleteLegal = "Poista oikeudellinen sopimus"; +$LegalAccepted = "Oikeudellisesti hyväksytty"; +$LoadTermConditionsSectionTitle = "Lataa käyttöehdot -osio"; +$LoadTermConditionsSectionDescription = "Oikeudellinen sopimus tulee näkyviin kirjautumisen yhteydessä tai kun kirjaudut kurssille."; +$SendTermsSubject = "Käyttöehtosi ovat valmiit allekirjoitettavaksi"; +$SendTermsDescriptionToUrlX = "Hei, +Opettajasi lähetti sinulle käyttöehdot. Voit allekirjoittaa ne tästä URL-osoitteesta: %s"; +$UserXSignedTheAgreement = "Käyttäjä %s allekirjoitti sopimuksen."; +$UserXSignedTheAgreementTheY = "Käyttäjä %s allekirjoitti sopimuksen %s."; +$ShowTermsIfProfileCompletedTitle = "Käyttöehdot vain, jos profiili on täytetty"; +$ShowTermsIfProfileCompletedComment = "Jos otat tämän vaihtoehdon käyttöön, käyttöehdot ovat käyttäjän saatavilla vain, kun ylimääräiset profiilikentät, jotka alkavat 'terms_'-alkuisilla kirjaimilla ja joiden arvoksi on asetettu näkyvissä, on täytetty."; +$EnableProfileUsersAddressGeolocalizationTitle = "Ota käyttäjän geolokalisointi käyttöön"; +$EnableProfileUsersAddressGeolocalizationComment = "Ota käyttöön käyttäjän osoitekenttä ja näytä se kartalla geolokaatio-ominaisuuksien avulla."; +$ProfileIsNotCompleted = "Ota käyttöön käyttäjän osoitekenttä ja näytä se kartalla geolokaatio-ominaisuuksien avulla."; +$TermActivatedIsNeededDescription = "Opettajasi ei ole vielä vahvistanut käyttöehtoja."; +$DiagnosisManagement = "Arvioinnin hallinta"; +$Diagnostic = "Arviointi"; +$TermYourProfileIsNotCompleted = "Sinun on ensin täytettävä profiilisi, jotta käyttöehtojen vahvistaminen on mahdollista."; +$AllowShowSkypeAccountTitle = "Salli käyttäjän Skype-tilin näyttäminen"; +$AllowShowSkypeAccountComment = "Lisää linkki käyttäjän sosiaaliseen lohkoon, jonka avulla voit aloittaa keskustelun Skypen kautta."; +$AllowShowLinkedInUrlTitle = "Salli käyttäjän LinkedIn URL-osoitteen näyttäminen"; +$AllowShowLinkedInUrlComment = "Lisää linkki käyttäjän sosiaaliseen lohkoon, joka mahdollistaa vierailun käyttäjän LinkedIn-profiiliin."; +$LaunchVideoConferenceRoom = "Käynnistetään videokonferenssihuone"; +$VideoConference = "Videokonferenssi"; +$TermsDuplicatedInFile = "Tiedostossa päällekkäiset termit"; +$GlossaryTermAlreadyExists = "Termi on jo olemassa"; +$LinkedInUrl = "LinkedIn-profiilin URL-osoite"; +$SaveTheCorrectAnswersForTheNextAttempt = "Tallenna oikea vastaus seuraavaa yritystä varten"; +$TranslateThisTerm = "Käännä tämä termi"; +$OnlyActiveSubLanguagesAreListed = "Vain aktiiviset alakielet näkyvät tässä luettelossa."; +$Translation = "Käännös"; +$IfThisTranslationExistsThisWillReplaceTheTerm = "Jos tämä termi on jo käännetty, tämä toiminto korvaa sen käännöksen tällä alakielellä."; +$LastConnection = "Viimeinen yhteys"; +$HisProfileIs = "Hänen profiilinsa on"; +$UserXWithLangXRegisteredTheSite = "Käyttäjä %s, jonka kieli on %s, on rekisteröitynyt sivustolle."; +$YouCanAssignATutorInThisLinkX = "Voit määrittää opettajan tästä linkistä %s"; +$UpdateExistingGlossaryTerms = "Päivitä nykyiset termit."; +$TermsUpdated = "Termit päivitetty"; +$TermsAdded = "Termit lisätty"; +$TeacherTimeReportBySession = "Opettajien aikaraportti istunnoittain"; +$NumberOfWorks = "Töiden lukumäärä"; +$LastWork = "Viimeisin työ"; +$WaitingModeration = "Odottaa moderointia"; +$WorksInSessionReport = "Työt istuntoraportissa"; +$Files = "Tiedostot"; +$TicketUpdated = "Tiketti päivitetty"; +$AssignedTo = "Määritetty kohteeseen"; +$UpdatedByX = "Päivittänyt %s"; +$AssignedChangeFromXToY = "Vastaava vaihtui %s:stä %s:ksi."; +$RequestConfirmation = "Pyydä vahvistusta"; +$ChangeAssign = "Muuta määrittelyä"; +$ToBeAssigned = "Määritetään"; +$StatusNew = "Uusi"; +$StatusPending = "Vireillä"; +$StatusUnconfirmed = "Vahvistamaton"; +$StatusClose = "Sulje"; +$StatusForwarded = "Edelleenlähetetty"; +$MyTickets = "Minun tiketit"; +$PriorityNormal = "Normaali"; +$PriorityHigh = "Korkea"; +$PriorityLow = "Matala"; +$TicketDetail = "Tiketin tiedot"; +$StatusAll = "Kaikki"; +$StatusUnread = "Lukemattomat"; +$StatusRead = "Luetut"; +$Projects = "Projektit"; +$AssignUser = "Käyttäjän määrittäminen"; +$TicketEnrollment = "Rekisteröinti"; +$TicketGeneralInformation = "Yleiset tiedot"; +$TicketRequestAndPapework = "Pyynnöt ja paperityöt"; +$TicketAcademicIncidence = "Akateemiset välikohtaukset"; +$TicketVirtualCampus = "Virtuaalinen kampus"; +$TicketOnlineEvaluation = "Verkkoarviointi"; +$TicketsAboutEnrollment = "Tiketit rekisteröitymisestä"; +$TicketsAboutGeneralInformation = "Yleisiä tietoja koskevat tiketit"; +$TicketsAboutRequestAndPapework = "Pyyntöjä ja paperityötä koskevat tiketit"; +$TicketsAboutAcademicIncidence = "Tiketit akateemisista tapahtumista, kuten kokeista, harjoituksista, tehtävistä jne."; +$TicketsAboutVirtualCampus = "Tiketit virtuaalikampuksesta"; +$TicketsAboutOnlineEvaluation = "Tiketit verkkoarvioinnista"; +$Assign = "Määritä"; +$PersonalEmail = "Henkilökohtainen sähköposti"; +$Priority = "Prioriteetti"; +$Source = "Lähde"; +$SrcPlatform = "Alusta"; +$SrcEmail = "Sähköposti"; +$SrcPhone = "Puhelin"; +$SrcPresential = "Läsnäoleva"; +$TicketXCreated = "Tiketti %s luotu"; +$ShowLinkTicketNotificationTitle = "Näytä tikettien luontilinkki"; +$ShowLinkTicketNotificationComment = "Näytä käyttäjille tiketin luomislinkki portaalin oikealla puolella."; +$LastSentWorkDate = "Viimeksi lähetetyn työn päivämäärä"; +$SSOSubclassTitle = "Single Sign On -alaluokka"; +$SSOSubclassComment = "Single Sign On -menetelmän ottamiseksi käyttöön sinun on luotava oma alaluokkasi main/auth/sso/-luokkaan, joka perustuu oletusluokkaan. Ilmoita tässä alaluokan nimi. Jos tiedosto on esimerkiksi sso.Drupal.class.php, merkitse tähän kenttään 'Drupal'."; +$CourseCreationSplashScreenTitle = "Kurssin luomisen aloitusnäyttö"; +$CourseCreationSplashScreenComment = "Kurssin aloitusnäyttö näyttää opettajalle useita ehdotettuja vaihtoehtoja, kun hän luo uuden kurssin. Poista se käytöstä, jotta opettajat pääsevät suoraan kurssin etusivulle."; +$WorksReport = "Tehtävien raportti"; +$AccumulateScormTime = "SCORM-istuntoaika kertyy"; +$AccumulateScormTimeInfo = "Kun tämä on käytössä, SCORM-oppimispolkujen istuntoaika on kumulatiivinen, muutoin se lasketaan vain viimeisimmästä päivitysajankohdasta."; +$CalendarStartDate = "Aloituspäivä"; +$DownloadTasksPackage = "Lataa tehtäväpaketti"; +$UploadCorrectionsPackage = "Lataa korjauspaketti"; +$IconsModeSVGTitle = "SVG-kuvakkeiden tila"; +$IconsModeSVGComment = "Jos otat tämän vaihtoehdon käyttöön, kaikki kuvakkeet, joilla on SVG-versio, käyttävät mieluummin SVG-muotoa kuin PNG-muotoa. Näin kuvakkeiden laatu paranee huomattavasti, mutta joissakin kuvakkeissa saattaa silti esiintyä renderöintikoko-ongelmia, ja jotkin selaimet eivät välttämättä tue sitä."; +$FilterByTags = "Suodata tunnisteiden mukaan"; +$ImportFromMoodle = "Tuo Moodlesta"; +$ImportFromMoodleInfo = "Tuo Moodle-kurssin varmuuskopiotiedosto (.mbz) tähän Chamilo-kurssiin."; +$ImportFromMoodleInstructions = "Moodlen tuontiominaisuus ei välttämättä tue kaikkia Moodlen sisältötyyppejä, koska kaikki ominaisuudet eivät ole samanlaisia ja koska Moodle ja Chamilo kehittyvät jatkuvasti ja nopeasti. Tätä tuontiominaisuutta on pidettävä keskeneräisenä työnä. Tarkista lisätietoja osoitteesta https://support.chamilo.org/projects/chamilo-18/wiki/Moodle_import."; +$MoodleFile = "Moodle-kurssin tiedosto"; +$FailedToImportThisIsNotAMoodleFile = "Tuonti epäonnistui: tämä ei näytä olevan Moodle-kurssin varmuuskopiotiedosto (.mbz)."; +$ThisQuestionIsNotSupportedYet = "Tätä kysymystyyppiä ei vielä tueta"; +$ProcessingImportPleaseDontCloseThisWindowThisActionMayTakeLongTimePlaseWait = "Tuonnin käsittely... Älä sulje tätä ikkunaa. Tämä prosessi voi kestää huomattavan kauan. Ole kärsivällinen."; +$Contact = "Ota yhteyttä"; +$WarningForDeprecatedDirectoriesForUpgrade = "Koska hakemistot newscorm ja exercice nimettiin uudelleen lp:ksi ja exercise vastaavasti, on tarpeen poistaa tai nimetä uudelleen newscorm_old ja exercice_old."; +$ExtensionNotAvailable = "Laajennus ei ole käytettävissä"; +$WebServices = "Verkkopalvelut"; +$EnableRecordAudioComment = "Ottaa käyttöön WebRTC-äänitallentimen (flashless) useissa paikoissa Chamilon sisällä."; +$EnableRecordAudioTitle = "Ota äänitallennin käyttöön"; +$ShowOfficialCodeInWhoIsOnlinePageComment = "Näytä virallinen koodi 'Kuka on verkossa' -sivulla käyttäjätunnuksen alapuolella."; +$ShowOfficialCodeInWhoIsOnlinePage = "Virallinen koodi \"Kuka on verkossa\""; +$JobPublic = "Julkinen työ"; +$ApplyJob = "Hae työpaikkaa"; +$PublicCompany = "Julkinen yhtiö"; +$PrivateCompany = "Yksityinen yritys"; +$NonForProfitCompany = "Voittoa tavoittelematon yritys"; +$Government = "Hallitus"; +$Template = "Mallipohja"; +$Palette = "Paletti"; +$Colors = "Värit"; +$Mask = "Maskaa"; +$Icon = "Kuvake"; +$DesignWithBadgeStudio = "Suunnittelu Badge Studion kanssa"; +$UseThisBadge = "Käytä tätä merkkiä"; +$Palettes = "Paletit"; +$DesignWithBadgeStudioComment = "Käytä Badge Studiota luodaksesi oma merkkisi omalla alustallasi."; +$YouAlreadySentThisFile = "Olet jo lähettänyt tämän tiedoston tai toisen samannimisen tiedoston. Varmista, että lataat kunkin tiedoston vain kerran."; +$DocumentsDefaultVisibility = "Uusien dokumenttien oletusnäkyvyys"; +$TicketAllowStudentAddTitle = "Salli käyttäjien lisätä tikettejä"; +$TicketAllowStudentAddComment = "Sallii kaikkien käyttäjien lisätä tikettejä, ei vain ylläpitäjien."; +$TicketSendWarningToAllAdminsTitle = "Lähetä tikettivaroitusviestejä ylläpitäjille"; +$TicketSendWarningToAllAdminsComment = "Lähetä viesti, jos tiketti on luotu ilman kategoriaa tai jos kategorialle ei ole määritetty ylläpitäjää."; +$TicketWarnAdminNoUserInCategoryTitle = "Lähetä hälytys ylläpitäjille, jos tiketin kategoriassa ei ole vastuuhenkilöä."; +$TicketWarnAdminNoUserInCategoryComment = "Lähetä varoitusviesti (sähköposti ja Chamilo-viesti) kaikille ylläpitäjille, jos kategorialle ei ole määritetty käyttäjää."; +$TicketAllowCategoryEditionTitle = "Salli tikettikategorioiden muokkaus"; +$TicketAllowCategoryEditionComment = "Salli ylläpitäjien suorittama kategorioiden muokkaus."; $TicketSystem = "Tiketit"; +$MoodleFileImportedSuccessfully = "Moodle-kurssitiedosto on tuotu onnistuneesti."; +$ExtensionInstalledButNotEnabled = "Laajennus asennettu, mutta ei ole otettu käyttöön"; +$MailingTestSent = "Sähköposti lähetetty. Tämä menettely toimii kaikin puolin samalla tavalla kuin Chamilon tavallinen sähköpostin lähettäminen, mutta se mahdollistaa enemmän joustavuutta kohdesähköpostin ja viestirungon suhteen."; +$EMailTester = "Sähköpostin testaaja"; +$TicketMsgWelcome = "Tervetuloa SINUN tikettiesi osastolle. Täällä voit seurata kaikkien niiden tikettien tilaa, jotka olet luonut päätikettiosiossa."; +$TicketNoHistory = "Ei historiaa"; +$RecalculateResults = "Laske tulokset uudelleen"; +$XParenthesisDeleted = "%s (poistettu)"; +$AvailableAlsoInMainPortal = "Saatavilla myös pääportaalissa"; +$EditCourseCategoryToURL = "Muokkaa kurssikategorioita yhtä URL-osoitetta varten"; +$VisibleToSelf = "Näkyy itselle"; +$VisibleToOthers = "Muiden nähtävissä"; +$UpgradeVersion = "Chamilo oppimisalustan version päivittäminen"; +$CRSTablesIntro = "Asennusskripti on havainnut aiemmista versioista jääneitä taulukoita, jotka voivat aiheuttaa ongelmia päivitysprosessin aikana. Klikkaa alla olevaa painiketta poistaaksesi ne. Suosittelemme voimakkaasti, että teet niistä täydellisen varmuuskopion ennen tämän viimeisen asennusvaiheen vahvistamista."; +$Removing = "Poistaminen"; +$CheckForCRSTables = "Tarkista aiempien versioiden taulukot"; +$YourPasswordCannotBeTheSameAsYourEmail = "Salasana ei voi olla sama kuin sähköpostiosoitteesi"; +$YourPasswordCannotContainYourUsername = "Salasana ei voi sisältää käyttäjänimeäsi"; +$WordTwoCharacterClasses = "Käytä eri merkistöä"; +$TooManyRepetitions = "Liian monta toistoa"; +$YourPasswordContainsSequences = "Salasanasi sisältää sekvenssejä"; +$PasswordVeryWeak = "Erittäin heikko"; +$UserXHasBeenAssignedToBoss = "Sinulle on annettu oppija %s."; +$UserXHasBeenAssignedToBossWithUrlX = "Sinut on nimetty oppilaan %s ohjaajaksi. Pääset hänen profiiliinsa tästä: %s"; +$ShortName = "Lyhyt nimi"; $Portal = "Portaali"; +$CourseUserDocument = "Kurssin käyttäjä dokumentti"; $Destination = "Kohde"; +$UserTestingEMailConf = "Sähköpostikokoonpanon käyttäjätestaukset"; +$CMS = "CMS"; +$SendLegalSubject = "Oikeudelliset ehdot"; +$SendLegalDescriptionToUrlX = "Hyväksy käyttöehtomme tässä: %s"; +$ExerciseInvisibleInSession = "Harjoitus näkymätön istunnoissa"; +$YouNeedToConfirmYourAgreementCheckYourEmail = "Sinun on ensin vahvistettava hyväksyväsi ehtomme. Tarkista sähköpostiosoitteesi."; +$ErrorImportingFile = "Virhe tiedoston tuonnissa"; $Hidden = "Piilotettu"; $Imported = "Tuotu"; +$ImportAsCSV = "Tuo CSV-tiedostosta"; +$EditThread = "Muokkaa lankaa"; +$AddFiles = "Lisää tiedostoja"; +$GroupForums = "Ryhmäfoorumit"; +$Generate = "Generoi"; $Ticket = "Tiketti"; +$InvalidApiKey = "Epäkelpo API-avain"; +$NoAnnouncement = "Ei ilmoitusta"; $NoForum = "Ei foorumia"; $GoToExercise = "Mene harjoitukseen"; +$ForumDissociate = "Erota foorumi"; $NoLPFound = "Oppimispolkua ei löytynyt"; +$ReportTypeLink = "Aktiivinen raporttilinkki"; +$InviteesCantBeTutors = "Kutsutut eivät voi olla ohjaajia"; +$InvalidAction = "Virheellinen toiminta"; $TicketWasThisAnswerSatisfying = "Oletko tyytyväinen vastaukseen?"; $IfYouAreSureTheTicketWillBeClosed = "Jos olet varma, tiketti suljetaan."; +$Priorities = "Prioriteetit"; $Tickets = "Tiketit"; +$ThisTextShouldBeAtLeastXCharsLong = "Tämän tekstin on oltava vähintään %s merkkiä pitkä."; +$TicketXAssignedToUserX = "Käyttäjälle %s annettu tiketti #%s"; +$ThisItemIsRelatedToOtherTickets = "Tämä kohde liittyy muihin tiketteihin."; +$WarningCategoryXDoesntHaveUsers = "Varoitus: ketään ei ole määritetty kategoriaan %s"; +$TicketXCreatedWithNoCategory = "Tiketti %s luotiin ilman kategoriaa"; $TicketInformation = "Tiketin tiedot"; +$CategoryWithNoUserNotificationSentToAdmins = "Järjestelmänvalvojille lähetettiin ilmoitus, jossa ilmoitettiin, että tälle kategorialle ei ole määritetty käyttäjää."; $VirtualSupport = "Virtuaalituki"; +$IncidentResentToVirtualSupport = "Tapaus on lähetetty virtuaalitukitiimille uudelleen."; +$YourQuestionWasSentToTheResponableAreaX = "Kysymyksesi on lähetetty %s:lle, vastuualueelle."; +$YourAnswerToTheQuestionWillBeSentToX = "Vastauksesi tähän kysymykseen lähetetään osoitteeseen %s."; +$MessageResent = "Viesti lähetetty uudelleen"; +$TicketAssignedToXCheckZAtLinkY = "Tiketti on osoitettu %s:lle. Seuranta #%s."; +$TicketXAssigned = "Tiketti %s osoitettu"; +$Historial = "Historia"; $TicketNum = "Tiketin numero"; $TicketClosed = "Tiketti suljettu"; +$Unassign = "Poista määrittely"; $PleaseSelectTasks = "Valitse tehtävät"; $PleaseSelect = "Valitse"; +$PleaseSelectThread = "Valitse lanka"; $TotalTickets = "Tikettejä yhteensä"; $ThereWasAnErrorRegisteringTheTicket = "Tikettisi rekisteröinnissä tapahtui virhe"; +$AreYouSureYouWantToUnassignTheTicket = "Oletko varma, että haluat poistaa tämän lipun määritykset?"; $AreYouSureYouWantToCloseTheTicket = "Haluatko varmasti sulkea tämän tiketin?"; +$Unassigned = "Määrittämätön"; +$SelectWeeksSpan = "Valitse aikaväli viikkoina"; +$CourseXAdded = "Kurssi %s lisätty"; $CurrentPassword = "Nykyinen salasana"; +$DeleteCorrections = "Poista kaikki korjaukset"; +$AllowMyFilesTitle = "Ota 'Omat tiedostot' -osio käyttöön"; +$AllowMyFilesComment = "Anna käyttäjien ladata tiedostoja henkilökohtaiseen tilaan alustalla."; +$YouNeedToActivateTheGoogleMapsPluginInAdminPlatformToSeeTheMap = "Alustan ylläpitäjän on otettava GoogleMaps-lisäosa käyttöön, jotta kartta voidaan näyttää."; +$InstallMultiURLDetectedNotMainURL = "Käytät tällä hetkellä moni-URL-ominaisuutta ja yrität päivittää portaaliasi käyttämällä toista URL-osoitetta. Ole hyvä ja muodosta yhteys pää-URL-osoitteeseen jatkaaksesi päivitystä: %s"; +$OnlyXQuestionsPickedRandomly = "Vain %s kysymykset valitaan satunnaisesti tietokilpailun asetusten mukaan."; +$AllowDownloadDocumentsByApiKeyTitle = "Salli kurssiasiakirjojen lataaminen API-avaimella"; +$AllowDownloadDocumentsByApiKeyComment = "Lataa asiakirjoja, jotka vahvistavat käyttäjän REST API -avaimen."; +$UploadCorrectionsExplanationWithDownloadLinkX = "Ensin sinun on ladattava korjaukset täältä . Sen jälkeen sinun on purettava tiedosto ja muokattava tiedostoja haluamallasi tavalla muuttamatta tiedostojen nimiä. Luo sitten zip-tiedosto, jossa on nämä muutetut tiedostot, ja lataa se tässä lomakkeessa."; +$PostsPendingModeration = "Moderoinnin käsittelyssä olevat viestit"; +$OnlyUsersFromCourseSession = "Vain yhden kurssin käyttäjät istunnossa"; +$ServerXForwardedForInfo = "Jos palvelin on välityspalvelimen tai palomuurin takana (ja vain näissä tapauksissa), se saattaa käyttää X_FORWARDED_FOR HTTP-otsikkoa näyttääkseen etäkäyttäjän IP-osoitteen (tässä tapauksessa sinun)."; +$GeolocalizationCoordinates = "Geopaikannus koordinaattien perusteella"; +$ExportUsersOfACourse = "Vie kurssin käyttäjät"; $PauseRecordingAudio = "Keskeytä äänitys"; $PlayRecordingAudio = "Jatka äänitystä"; +$YourSessionTimeHasExpired = "Olet jo rekisteröitynyt, mutta sallittu käyttöaikasi on päättynyt."; +$ConsideredWorkingTime = "Toimeksiannon työaika"; +$DocumentNumber = "Dokumentin tunnus"; +$SocialData = "Sosiaaliset tiedot"; +$WallMessagesPosted = "Itsensä lähettämät seinäviestit"; +$SeeAccesses = "Katso käyttöoikeudet"; +$PriorityChangeFromXToY = "Prioriteetti muutettu %s:stä %s:ksi"; +$StatusChangeFromXToY = "Tila muutettu %s:stä %s:ksi"; +$SkillFromCourseXDeletedSinceThen = "Tämä taito hankittiin kurssilla %s, joka on sittemmin poistettu."; $SaveAndAddNewItem = "Tallenna ja lisää uusi kohta"; +$AnnouncementChooseRecipientsDescription = "Oletusarvoisesti tämä ilmoitus lähetetään kaikille käyttäjille. Voit kuitenkin valita myös muita vastaanottajia."; $ChooseRecipients = "Valitse vastaanottaja"; +$SessionDurationNotStartedMaxX = "Tämän istunnon enimmäiskesto on %s päivää."; +$StudentCourseProgressX = "Edistyminen: %s %%"; +$StudentCourseScoreX = "Pisteet: %s %%"; +$StudentCourseCertificateX = "Todistus: %s"; +$ConfigureExerciseVisibilityInCourseTitle = "Salli ohittaa harjoituksen näkymättömyyden määritys istunnossa peruskurssitasolla."; +$ConfigureExerciseVisibilityInCourseComment = "Mahdollista harjoituksen näkymättömyyden määritys istunnossa peruskurssissa ohittamaan globaalin määrityksen. Jos ei ole asetettu, käytetään globaalia parametria."; $ExerciseInvisibleInSessionTitle = "Harjoitus näkymätön istunnossa"; +$ExerciseInvisibleInSessionComment = "Jos harjoitus on näkyvä pääkurssilla, se näkyy istunnossa. Jos harjoitus on näkymätön pääkurssilla, se ei näy istunnossa."; +$Ongoing = "Meneillään"; +$Unclosed = "Avoin"; +$AttemptStillOngoingPleaseWait = "Yritys jatkuu edelleen. Odottakaa."; +$MarkAttemptAsClosed = "Merkitse yritys suljetuksi"; $NewPasswordRequirementsNotMatched = "Uusi salasana ei täytä vähimmäistä turvallisuusvaatimusta"; +$NewPasswordRequirementMinXLowercase = "Vähintään %s pieniä kirjaimia"; +$NewPasswordRequirementMinXUppercase = "Vähintään %s isoja kirjaimia"; +$NewPasswordRequirementMinXNumeric = "Vähintään %s numeromerkkejä (0-9)"; +$NewPasswordRequirementMinXLength = "Vähintään %s merkkiä yhteensä"; +$NewPasswordRequirementMaxXLowercase = "Enintään %s pienaakkosia"; +$NewPasswordRequirementMaxXUppercase = "Enintään %s isoja kirjaimia"; +$NewPasswordRequirementMaxXNumeric = "Enintään %s numeromerkkejä (0-9)"; +$NewPasswordRequirementMaxXLength = "Yhteensä enintään %s merkkiä"; $YouCantNotEditThisQuestionBecauseAlreadyExistAnswers = "Et voi muokata tätä kysymystä, koska siinä on jo vastauksia"; +$StudentXIsNotSubscribedToCourse = "Opiskelija %s ei ole ilmoittautunut tälle kurssille."; +$Avatar = "Avatar"; +$StudyCycle = "Lukukausi"; +$ReadingComprehension = "Luetun ymmärtäminen"; +$ReadingQuestionCongratsSpeedXNotReachedForYWords = "Anteeksi, mutta näyttää siltä, että nopeus %s sanaa/minuutti oli liian nopea tälle %s sanan tekstille."; +$ReadingQuestionCongratsSpeedXReachedForYWords = "Onneksi olkoon, olet saavuttanut ja ymmärtänyt oikein, nopeudella %s sanaa minuutissa, yhteensä %s sanan tekstin."; +$ReadingComprehensionLevelX = "%s sanaa minuutissa"; +$TutorXIsNotSubscribedToCourse = "Opettaja %s ei ole ilmoittautunut tälle kurssille."; +$UpdateTitleInLps = "Päivitä tämä otsikko oppimispoluissa"; +$WebRTCDialogHelp = "Jos haluat ottaa videokeskustelun käyttöön selaimessasi (jos se tukee sitä), varmista, että napsautat URL-osoitteen vasemmalla puolella olevaa tietokuvaketta ja sallit sitten web-kameran ja mikrofonin käytön."; +$UpdateFile = "Päivitä tiedosto"; +$SendEmailToTeacherWhenStudentStartQuiz = "Sähköposti opettajalle, kun oppilas aloittaa harjoituksen"; +$SendEmailToTeacherWhenStudentEndQuiz = "Lähetä opettajalle sähköpostia, kun oppilas lopettaa harjoituksen"; +$SendEmailToTeacherWhenStudentEndQuizOnlyIfOpenQuestion = "Sähköposti opettajalle, kun oppilas lopettaa harjoituksen, vain jos avoimeen kysymykseen vastataan."; +$SendEmailToTeacherWhenStudentEndQuizOnlyIfOralQuestion = "Sähköposti opettajalle, kun oppilas lopettaa harjoituksen, vain jos suulliseen kysymykseen vastataan."; +$StudentStartExercise = "Opiskelija aloitti juuri harjoituksen"; +$TempScoreXQuestionsNotCorrectedYet = "Väliaikainen pistemäärä: %s avointa kysymystä (kysymyksiä) ei ole vielä korjattu."; +$Annotation = "Merkintä"; +$TeacherPicture = "Opettajan kuva"; +$FeedbackIfNotCorrect = "Palaute, jos se ei ole oikein"; +$ExtraFields = "Lisäkentät"; +$ScheduledAnnouncements = "Aikataulutetut ilmoitukset"; +$SpecificDate = "Tietty lähetyspäivä"; +$BaseDate = "Lähetys perustuu istunnon alku- ja loppupäivämääriin."; +$AfterOrBefore = "Jälkeen tai ennen"; +$Before = "Ennen"; +$ScheduleAnnouncementDescription = "Tämän lomakkeen avulla aikatauluilmoitukset voidaan lähettää automaattisesti opiskelijoille, jotka osallistuvat kurssille istunnossa. Ilmoituksia voidaan lähettää kahdenlaisia: Tietty päivämäärä: Tässä tapauksessa ilmoitusta varten valitaan tietty päivä. Jakson alku-/loppupäivän perusteella: Tässä tapauksessa on ilmoitettava, kuinka monta päivää on kulunut ennen ilmoituksen lähettämistä. Nämä päivät voidaan liittää ennen tai jälkeen alku-/loppupäivän. Esim: 3 päivää alkamispäivän jälkeen."; +$MandatorySurveyNoAnswered = "Pakollinen kysely odottaa vastaustasi. Päästäksesi kurssille sinun on ensin täytettävä kysely."; +$ShowPreviousButton = "Näytä \"edellinen\" painike"; +$AllTickets = "Kaikki tiketit"; +$IsMandatory = "Pakollinen?"; +$StudentXHasBeenAssignedNewWorkInCourseY = "%s sai uuden tehtävän kurssilla %s"; +$AsHRMYouReceiveThisMailToAlertThatXHasNewWorkInCourseY = "Henkilöstöpäällikkönä saat tämän sähköpostiviestin tietääksesi, että %s sai juuri uuden tehtävän kurssilla %s."; +$DearXComma = "Parahin %s,"; +$UserLinkingRequests = "Opiskelijoiden linkityspyynnöt"; +$NewHomeworkEmailAlertToHrmEnable = "Lähetä sähköpostia opiskelijoille ja heidän henkilöstöpäällikölleen tehtävien luomisesta."; +$UserLinkingRequestAccepted = "Opiskelijan linkityspyyntö hyväksytty"; +$UserLinkingTo = "Linkitetty opiskelijaan"; +$RequestLinkingToUser = "Pyyntö opiskelijan linkittämisestä"; +$LinkingRequestsAdded = "Linkityspyyntö lisätty"; +$HrmList = "Henkilöstöpäälliköiden luettelo"; +$AssignHrmToUser = "Henkilöstöpäällikön määrittäminen käyttäjälle"; $AddHrmToUser = "Lisää henkilöstöjohtaja käyttäjälle"; +$HrmAssignedUsersCourseList = "Henkilöstöpäällikön on määrittänyt käyttäjille kurssilistan."; $GoToSurvey = "Mene kyselyyn"; +$NotificationCertificateSubject = "Todistusilmoitus"; +$NotificationCertificateTemplate = "((user_first_name)), Onnittelut kurssin ((course_title)) suorittamisesta. Kurssista saamasi lopullinen arvosana on ((score)). Odota muutama päivä, että se näkyy järjestelmässä. Odotamme innolla tapaamistasi tulevilla kursseilla. Jos voimme auttaa sinua muulla tavoin, ota rohkeasti yhteyttä. Ystävällisin terveisin, ((author_first_name)), ((author_last_name)) ((portal_name))"; +$SendCertificateNotifications = "Lähetä todistusilmoitus kaikille käyttäjille"; +$MailSubjectForwardShort = "Fwd"; +$ForwardedMessage = "Välitetty viesti"; +$ForwardMessage = "Lähetä viesti eteenpäin"; $MyCoursePageCategoryIntroduction = "Alla näet listan kurssikategorioista. Klikkaa nimeä nähdäksesi listan kursseista"; +$FeatureDisabledByAdministrator = "Järjestelmänvalvoja poistanut ominaisuuden käytöstä"; +$SubscribeUsersToLpCategory = "Tilaa käyttäjät kategoriaan"; +$SubscribeGroupsToLpCategory = "Tilaa ryhmät kategoriaan"; +$UserLpSubscriptionDescription = "Huomaa, että jos kategorian käyttäjien merkintä on käytettävissä, niin jos olet jo tilannut käyttäjän kategoriaan, se ohittaa käyttäjien merkinnän täällä Oppimispolussa."; +$UserLpCategorySubscriptionDescription = "Huomaa, että kategorian käyttäjien merkintä ohittaa käyttäjien merkinnän oppimispolulla."; +$FieldTypeSelectWithTextField = "Valitse tekstikentällä"; +$FieldTypeTripleSelect = "Kolmoisvalinta"; +$DoubleValidationMessage = "Vahvista, että todella haluat tilata tämän alustapalvelun."; +$AddText = "Lisää teksti"; +$OralExpressionHelpText = "Kun aloitat tallennuksen, voit keskeyttää sen milloin haluat. Jos et ole tyytyväinen, rekisteröi uudelleen. Tämä korvaa edellisen version. Tyytyväinen? tiedosto lähetetään automaattisesti palvelimelle, joten voit vain jatkaa harjoitusta."; +$BestScoreInLearningPath = "Parhaat pisteet oppimispolulla"; +$BestScoreNotInLearningPath = "Paras pistemäärä joka ei ole oppimispolulla"; +$ReSendConfirmationMail = "Lähetä vahvistusviesti uudelleen"; +$UserConfirmedNowYouCanLogInThePlatform = "Käyttäjä vahvisti. Nyt voit kirjautua alustalle."; +$AgendaAvailableInCourseX = "Asialista saatavilla kurssilla %s"; +$YouHaveBeenSubscribedToCourseXTheStartDateXAndCommentX = "Sinut on merkitty kurssille %s, jonka alkamispäivä on %s ja %s."; +$EmailToTeachersWhenNewWorkFeedback = "Lähetä opettajille sähköpostia uusien käyttäjien oppilasjulkaisujen palautteista."; +$YourSessionTimeIsExpired = "Istuntosi aika on päättynyt."; +$StudentHadEnoughSkills = "Opiskelija on saavuttanut tarvittavan määrän alitaitoja, jotta hän voi validoida päätaidon."; +$StudentXHadEnoughSkillsToGetSkillXToAssignClickHereX = "Oppijalla %s on tarpeeksi alitaitoja saadakseen taidon %s. Tämän taidon osoittaminen on mahdollista tästä : %s"; +$ThisEmailWasSentViaCourseX = "Tämä sähköposti lähetettiin kurssilla %s"; +$ThisEmailWasSentViaCourseXInSessionX = "Tämä sähköposti lähetettiin kurssilla %s istunnossa %s."; +$Diagram = "Kaavio"; +$CareerXDoesntHaveADiagram = "Uralla %s ei ole kaaviota."; +$ExerciseCategoryAllSessionsReport = "Harjoitusraportti kategorioittain kaikkien istuntojen osalta"; +$MailConfirmation = "Vaadi sähköpostivahvistus"; +$RegistrationConfirmation = "Rekisteröinnin vahvistus"; +$AccountNotConfirmed = "Tilisi ei ole aktiivinen, koska et ole vielä vahvistanut sitä. Tarkista sähköpostisi ja noudata ohjeita tai klikkaa seuraavaa linkkiä lähettääksesi sähköpostin uudelleen."; +$RegistrationConfirmationEmailMessage = "Viimeistelläksesi alustan rekisteröinnin sinun on vahvistettava tilisi klikkaamalla seuraavaa linkkiä."; +$ConfirmationForNewAccount = "Uuden tilin vahvistus"; +$YouNeedConfirmYourAccountViaEmailToAccessThePlatform = "Sinun on vahvistettava tilisi sähköpostitse päästäksesi alustalle."; +$EnableAddCloudFileLinkTitle = "Ota käyttöön Cloud-tiedostojen linkin lisääminen"; +$EnableAddCloudFileLinkComment = "Salli käyttäjien linkittää julkisessa pilvipalvelussa isännöityyn tiedostoon ikään kuin ne olisivat asiakirjoja Chamilon asiakirjatyökalussa."; +$UrlAlreadyExists = "Tämä URL-osoite on jo olemassa"; +$ErrorAddCloudLink = "Pilvitiedoston linkin lisäämisessä tapahtui virhe."; +$AddCloudLink = "Lisää linkki Pilvi-tiedostoon"; +$CloudLinkDeleted = "Pilvilinkki poistettu"; +$CloudLinkMoved = "Cloud-linkki siirretty"; +$CloudLinkDeleteError = "Virhe pilvilinkin poistamisessa."; +$CloudLinkAdded = "Cloud-linkki lisätty"; +$PleaseEnterCloudLinkName = "Anna nimi tälle Cloud-linkille"; +$CloudLinkModified = "Pilvitiedoston linkki päivitetty."; +$NotValidDomain = "Verkkotunnus ei ole voimassa. Sen on oltava jokin seuraavista:"; +$ValidDomainList = "Luettelo kelvollisista verkkotunnuksista"; +$NotValidURL = "URL-kentän muoto virheellinen. Esimerkki oletetusta osoitemuodosta: http://dropbox.com/sh/loremipsum/loremipsum?dl=0"; +$FileExtension = "Tiedostopääte"; +$EventsReport = "Tarkastusraportti"; +$GoogleTranslateApiReturnedEmptyAnswer = "Tämän toiminnon käyttämä Google Translate API palautti tyhjän vastauksen. Tarkista tai kysy, onko translate_app_google_key -asetuksesi asetettu oikein, tai pyydä ylläpitäjää tekemään se."; +$LinkMeToStudent = "Yhdistä minut opiskelijalle"; +$LinkMeToStudentComment = "Valitse opiskelija, jolle haluat pyytää linkkiä, jotta ylläpitäjät voivat tarkistaa ja hyväksyä pyyntösi. Huomaa, että ensin on noudatettava asianmukaisia hallinnollisia menettelyjä, jotta ylläpitäjä voi laillisesti hyväksyä pyyntösi."; +$RequestLinkToStudent = "Pyydä linkitystä opiskelijan kanssa"; +$SendManuallyPendingAnnouncements = "Lähetä vireillä olevat ilmoitukset manuaalisesti"; +$UserLinkingRequestRejected = "Opiskelijan linkityspyyntö hylätty"; +$UserLinkRemoved = "Opiskelijalinkitys poistettu"; +$SessionTemplate = "Istunnon mallipohja"; +$CloudFileLink = "Pilvitiedoston linkki"; +$ResetFieldX = "Nollaa %s"; +$MyGeneralCertificate = "Minun yleistodistukseni"; +$ScoreNote = "Huomautus"; +$ScoreTest = "Testi"; +$MessageTracking = "Viestien seuranta"; +$MessagesExchangeBetweenXAndY = "Viestien vaihto %s ja %s välillä"; +$YouWillReceivedASecondEmail = "Saat toisen sähköpostin, jossa on salasanasi"; +$YouReceivedAnEmailWithTheUsername = "Sinun on täytynyt saada toinen sähköposti, jossa on käyttäjätunnuksesi."; +$TheScormPackageWillBeUpdatedYouMustUploadTheFileWithTheSameName = "Sinun on ladattava zip-tiedosto, jolla on sama nimi kuin alkuperäisellä SCORM-tiedostolla."; +$YourChoice = "Sinun valintasi"; +$YouNeedToCreateASkillProfile = "Sinun on luotava taitoprofiili"; +$SkillLevel = "Taitotaso"; +$Portfolio = "Portfolio"; +$AddPortfolioItem = "Lisää kohde portfolioon"; +$NewDocumentAddedToCourseX = "Uusi dokumentti lisätty kurssille %s"; +$DocumentXHasBeenAddedToDocumentInYourCourseXByUserX = "Uusi asiakirja %s on lisätty kurssisi %s:n asiakirjatyökaluun %s:n toimesta."; +$PendingSurveys = "Vireillä olevat tutkimukset"; +$NoPendingSurveys = "Ei vireillä olevia tutkimuksia"; +$HottestSessions = "Suosituimmat istunnot"; +$LPItemCanBeAccessed = "Kohde voidaan näyttää - Edellytykset täytetty"; +$ItemXBlocksThisElement = "Kohde %s estää tämän vaiheen"; +$YourResultAtXBlocksThisElement = "Tuloksesi %s estää tämän vaiheen"; +$RegistrationRoleWhatDoYouWantToDo = "Mitä haluat tehdä?"; +$RegistrationRoleFollowCourses = "Seuraa kursseja"; +$RegistrationRoleTeachCourses = "Opeta kursseja"; +$EditPortfolioItem = "Muokkaa portfoliokohdetta"; +$PortfolioItemAdded = "Portfoliokohde lisätty"; +$ExploreMoreCourses = "Selaa lisää kursseja"; +$LinksOfInterest = "Mielenkiintoiset linkit"; +$ExportToChamiloFormat = "Vie Chamilo-muotoon"; +$CoursesComingSoon = "Pian tulevat kurssit"; +$SalePrice = "Myyntihinta"; +$BuyNow = "Osta nyt"; +$DocumentGroupCollaborationMode = "Yhteistyötila"; +$DocumentGroupReadOnlyMode = "\"Vain luku\" -tila"; +$GroupDocumentAccess = "Dokumentteihin pääsy"; +$DocumentGroupShareMode = "Jakamis-tila"; +$SessionDurationXDaysTotal = "Tämän istunnon rajoitettu kesto on %s päivää."; +$LastMonth = "Viime kuussa"; +$ThisMonth = "Tässä kuussa"; +$PortalUserSessionStats = "Portaalin käyttäjän istuntotilastot"; +$AddCustomToolsIntro = "Voit lisätä johdannon tälle työkalusivulle aputekstiksi oppilaillesi. Lisää tekstiä klikkaamalla muokkauskuvaketta. Tämä lyhyt infoteksti tässä on oppilaille näkymätön, ja voit jättää tämän lohkon tyhjäksi, mutta se, mitä kirjoitat, näkyy oppilaille."; +$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "Dokumentin automaattinen käynnistysominaisuus on käytössä. Oppijat ohjataan automaattisesti dokumenttityökaluun."; +$DocumentAutoLaunch = "Dokumenttien automaattinen käynnistys"; +$RedirectToTheDocumentList = "Uudelleenohjaus asiakirjaluetteloon"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "Harjoitusten automaattinen käynnistysominaisuus on käytössä. Oppijat ohjataan automaattisesti harjoitusluetteloon."; +$PostedExpirationDate = "Lähetetty määräaika työn lähettämiselle (oppijan nähtävissä)."; +$BossAlertMsgSentToUserXTitle = "Seurantaviesti opiskelijasta %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Hei, + +Käyttäjä %s lähetti seurantaviestin opiskelijasta %s. + +Viesti on nähtävissä täällä %s"; +$include_services = "Sisällytä palvelut"; +$culqi_enable = "Ota culqi käyttöön"; +$SelectedUsersDisabled = "Kaikki valitut käyttäjät on poistettu käytöstä"; +$SomeUsersNotDisabled = "Joitakin valittuja käyttäjiä ei ole poistettu käytöstä. Suosittelemme, että varmistat ne käyttämällä laajennettua hakua."; +$SelectedUsersEnabled = "Kaikki valitut käyttäjät ovat käytössä."; +$SomeUsersNotEnabled = "Joitakin valituista käyttäjistä ei ole otettu käyttöön. Suosittelemme, että vahvistat ne käyttämällä laajennettua hakua."; +$EncryptedData = "Salatut tiedot"; +$RandomData = "Satunnaiset tiedot"; +$PersonalDataReport = "Henkilötiedot"; +$ComplexDataNotShown = "Monimutkaiset tiedot (ei esitetty)"; +$PersonalDataIntroductionTitle = "Henkilötiedot: johdanto"; +$PersonalDataKeptOnYou = "Henkilötiedot, joita säilytämme sinusta"; +$PersonalDataPermissionsYouGaveUs = "Antamasi luvat"; +$PersonalDataResponsibleOrganizationTitle = "Tietojesi käsittelystä vastaava organisaatio"; +$PersonalDataTreatmentTitle = "Henkilötietojen käsittely"; +$PersonalDataCollectionTitle = "Henkilötietojen kerääminen"; +$PersonalDataRecordingTitle = "Henkilötietojen tallentaminen"; +$PersonalDataOrganizationTitle = "Henkilötietojen järjestäminen"; +$PersonalDataStructureTitle = "Henkilötietojen rakenne"; +$PersonalDataConservationTitle = "Henkilötietojen säilyttäminen"; +$PersonalDataAdaptationTitle = "Henkilötietojen mukauttaminen tai muuttaminen"; +$PersonalDataExtractionTitle = "Henkilötietojen poiminta"; +$PersonalDataConsultationTitle = "Henkilötietoja koskevat kyselyt"; +$PersonalDataUsageTitle = "Henkilötietojen käyttö"; +$PersonalDataCommunicationTitle = "Henkilötietojen viestintä ja jakaminen"; +$PersonalDataInterconnectionTitle = "Henkilötietojen yhteenliittäminen"; +$PersonalDataLimitationTitle = "Henkilötietojen rajoittaminen"; +$PersonalDataDeletionTitle = "Henkilötietojen poistaminen"; +$PersonalDataDestructionTitle = "Henkilötietojen tuhoaminen"; +$PersonalDataProfilingTitle = "Henkilötietojen profilointi"; +$PersonalDataIntroductionText = "Kunnioitamme yksityisyyttäsi! Tällä sivulla yhdistetään kaikki näkökohdat, jotka koskevat henkilötietojasi, miten käsittelemme niitä, mitä olet antanut meille luvan tehdä niillä ja keitä me olemme, jotta voimme noudattaa useimpia saatavilla olevia tietosuojalakeja. Lue nämä tiedot huolellisesti, ja jos sinulla on kysyttävää, voit kysyä meiltä lisätietoja alla olevista yhteystiedoista."; +$YourDegreeOfCertainty = "Varmuusasteesi"; +$DegreeOfCertaintyThatMyAnswerIsCorrect = "Varmuusaste siitä, että vastaukseni katsotaan oikeaksi."; +$KindRegards = "Ystävällisin terveisin,"; +$DoNotReply = "Älkää vastatko"; +$ResultAccomplishedTest = "Suoritetun testin tulokset"; +$YourResultsByDiscipline = "Tuloksesi tieteenaloittain"; +$ForComparisonYourLastResultToThisTest = "Vertailun vuoksi, viimeisimmät tuloksesi tässä testissä"; +$YourOverallResultForTheTest = "Testin kokonaistulokset"; +$QuestionDegreeCertaintyHTMLMail = "Testin %s tulokset näet alla.
    Nähdäksesi näiden tulosten yksityiskohdat:

    +1. Muodosta yhteys alustaan (käyttäjätunnus/salasana): Alustaan

    +2. Napsauta tätä linkkiä: Katso yksityiskohtaiset tulokset."; +$DegreeOfCertaintyVerySure = "Hyvin varma"; +$DegreeOfCertaintyVerySureDescription = "Vastauksesi oli oikea ja olit siitä 80-prosenttisen varma. Onnittelut!"; +$DegreeOfCertaintyPrettySure = "Melko varma."; +$DegreeOfCertaintyPrettySureDescription = "Vastauksesi oli oikea, mutta et ollut täysin varma (vain 60-70 % varma)."; +$DegreeOfCertaintyDeclaredIgnorance = "Ilmoitettu tietämättömyys"; +$DegreeOfCertaintyDeclaredIgnoranceDescription = "Et tiennyt vastausta - vain 50 % varmuus."; +$DegreeOfCertaintyUnsure = "Epävarma"; +$DegreeOfCertaintyUnsureDescription = "Vastauksesi oli väärä, mutta arvasit sen (60-70 % varmuudella)."; +$DegreeOfCertaintyVeryUnsure = "Hyvin epävarma"; +$DegreeOfCertaintyVeryUnsureDescription = "Vastauksesi oli väärä, vaikkakin olit noin 80 % (tai enemmän) varma, että se oli väärä."; +$DegreeOfCertaintyIDeclareMyIgnorance = "En tiedä vastausta ja olen valinnut satunnaisesti."; +$DegreeOfCertaintyIAmVeryUnsure = "Olen hyvin epävarma"; +$DegreeOfCertaintyIAmUnsure = "Olen epävarma"; +$DegreeOfCertaintyIAmPrettySure = "Olen melko varma."; +$DegreeOfCertaintyIAmSure = "Olen lähes 100 % varma"; +$DegreeOfCertaintyIAmVerySure = "Olen täysin varma"; +$MultipleAnswerTrueFalseDegreeCertainty = "Monivastaukset tosi/epätosi varmuusasteet"; +$IncorrectAnswersX = "Virheelliset vastaukset: %s"; +$IgnoranceAnswersX = "Tietämättömyys: %s"; +$CorrectAnswersX = "Oikeat vastaukset: %s"; +$TotalHours = "Tunnit yhteensä"; +$MinutesPerDay = "Minuuttia päivässä"; +$ClassroomActivity = "Luokkahuoneaktiivisuus"; +$OneDay = "1 päivä"; +$UserXAnonymized = "Käyttäjän %s tiedot anonymisoitu."; +$CannotAnonymizeUserX = "Emme pystyneet anonymisoimaan käyttäjän %s tietoja. Yritä uudelleen tai tarkista lokitiedot."; +$NoPermissionToAnonymizeUserX = "Sinulla ei ole oikeuksia anonymisoida käyttäjää %s. Tarvitset samat oikeudet kuin käyttäjien poistamiseen."; +$Anonymize = "Anonymisoi"; +$XQuestions = "%d kysymyksiä"; +$WebFolderRefreshSucceeded = "Webissä / kansiossa olevat tyylit on päivitetty."; +$WebFolderRefreshFailed = "Web-kansiossa olevia tyylejä ja resursseja ei voitu päivittää, luultavasti käyttöoikeusongelman vuoksi. Varmista, että web-kansio on kirjoitettavissa verkkopalvelimellasi."; +$CopyTextToClipboard = "Kopioi teksti"; +$WeNeedYouToAcceptOurTreatmentOfYourData = "Sinun on hyväksyttävä tietojesi käsittely, jotta voimme tarjota sinulle tämän palvelun. Jos haluat rekisteröidä tilin, hyväksy ehdot ja napsauta Lähetä. Jos et hyväksy, emme käsittele sinua koskevia henkilötietoja."; +$NoTermsAndConditionsAvailable = "Käyttöehdot eivät ole saatavilla"; +$Skype = "Skype"; +$PersonalDataOfficerName = "Henkilötietojen vastuuhenkilön nimi"; +$PersonalDataOfficerRole = "Henkilötietovastaavan rooli"; +$Assets = "Materiaalit"; +$TotalLPTime = "Oppimispolun kokonaisaika"; +$AddStatus = "Lisää tila/status"; +$AddProject = "Lisää projekti"; +$AddPriority = "Lisää prioriteetti"; +$NotAccepted = "Hylätyt"; +$UserPermissions = "Käyttäjän oikeudet"; +$ExportToPdf = "Vie PDF-tiedostoksi"; +$GoToThread = "Siirry ketjuun"; +$TimeDifference = "Aikaero"; +$SessionAdministrator = "Istunnon ylläpitäjä"; +$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "Tähän istuntoon on linkitetty sekvenssiresurssi. Sinun on ensin poistettava tämä linkki."; +$AddAnnotationText = "Lisää huomautusteksti"; +$AddAnnotationPath = "Lisää huomautuspolku"; +$Driver = "Ajuri"; +$UploadTmpDirInfo = "Väliaikainen lataushakemisto on palvelimella oleva tila, johon tiedostot ladataan ennen kuin PHP suodattaa ja käsittelee ne."; +$GenerateCustomReport = "Luo mukautettu raportti"; +$ToDo = "Tehtävälista"; +$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Jos haluat saada todistuksen ja/tai tähän kurssiin liittyvät taidot, sinun on ostettava todistuspalvelu. Voit siirtyä palveluluetteloon klikkaamalla tätä linkkiä: %s"; +$SubSkill = "Alataito"; +$AddMultipleUsersToCalendar = "Lisää useita käyttäjiä kalenteriin"; +$UpdateCalendar = "Päivitä kalenteri"; +$ControlPoint = "Valvontapiste"; +$SessionMinDuration = "Istunnon minimi kesto"; +$CanNotTranslate = "Ei voida kääntää"; +$AddSkills = "Lisää taitoja"; +$Dictionary = "Sanakirja"; +$CategoryExists = "Kategoria on jo olemassa"; +$MinimumGradebookToValidate = "Validoitavien arvosanakirjojen minimimäärä"; +$NumberOfGradebookToValidateInDependence = "Validoitavien luokkakirjojen määrä riippuvuuksissa"; +$DependsOnGradebook = "Riippuvuudet arvosanakirjasta"; +$ThisGradebookDoesntHaveDependencies = "Tällä arvosanakirjalla ei ole riippuvuutta"; +$CourseIntroductionsAllImportedSuccessfully = "Kaikki kurssien esittelyt on tuotu onnistuneesti."; +$FilterSessions = "Suodata istuntoja"; +$MessageQuestionCertainty = "Tarkista testin %s tulokset noudattamalla alla olevia ohjeita. +
    +1. Muodosta yhteys alustaan (käyttäjätunnus/salasana) osoitteessa: %s
    +2. Napsauta seuraavaa linkkiä: %s"; +$PleaseEnterURL = "Kirjoita URL-osoite"; +$ScoreModel = "Pistemalli"; +$SyncDatabaseWithSchema = "Synkronoi tietokanta kaavion kanssa"; +$SkillRelCourses = "Kurssit-Taidot yhteydet"; +$UserRequestWaitingForAction = "Käyttäjä odottaa henkilötietopyyntöönsä liittyvää toimenpidettä."; +$TheUserXIsWaitingForAnActionGoHereX = "Käyttäjä %s odottaa toimia henkilötietopyyntöönsä liittyen. \n\n Voit hallita henkilötietopyyntöjä tästä linkistä: %s"; +$RequestType = "Pyynnön tyyppi"; +$DeleteAccount = "Poista tili"; +$RequestDate = "Pyynnön päivämäärä"; +$RemoveTerms = "Oikeudellisen sopimuksen poistaminen"; +$InformationRightToBeForgottenLinkX = "Lisätietoja käyttäjän oikeudesta tulla unohdetuksi löydät seuraavalta sivulta: %s"; +$ExplanationDeleteLegal = "Kerro meille, miksi haluat peruuttaa meille aiemmin antamasi oikeudet, jotta voimme tehdä sen mahdollisimman sujuvasti."; +$ExplanationDeleteAccount = "Selitä tässä laatikossa, miksi haluat tilisi poistettavan."; +$WhyYouWantToDeleteYourLegalAgreement = "Voit pyytää jäljempänä, että oikeudellinen sopimuksesi poistetaan tai tilisi poistetaan. +Kun kyseessä on oikeudellinen sopimus, kun se on poistettu, sinun on hyväksyttävä se uudelleen seuraavalla sisäänkirjautumisellasi, jotta voit käyttää alustaa ja palauttaa käyttöoikeutesi, koska emme voi kohtuudella antaa sinulle samanaikaisesti henkilökohtaista ympäristöä ja jättää käsittelemättä henkilötietojasi. Kun kyseessä on tilin poistaminen, tilisi poistetaan yhdessä kaikkien kurssitilaustesi ja kaikkien tiliisi liittyvien tietojen kanssa. Valitse vastaava vaihtoehto huolellisesti. Molemmissa tapauksissa yksi ylläpitäjistämme tarkistaa pyyntösi ennen sen voimaantuloa, jotta vältytään väärinkäsityksiltä ja tietojesi lopulliselta menettämiseltä."; +$PersonalDataPrivacy = "Henkilötietojen suoja"; +$RequestForAccountDeletion = "Pyydä tilin poistamista"; +$TheUserXAskedForAccountDeletionWithJustificationXGoHereX = "Käyttäjä %s pyysi tilinsä poistamista kertoen, että \"%s\". Voit käsitellä pyynnön täällä: %s"; +$TheUserXAskedLegalConsentWithdrawalWithJustificationXGoHereX = "Käyttäjä %s pyysi poistamaan suostumuksensa käyttöehtoihimme selittäen, että \"%s\". Voit käsitellä pyynnön täällä: %s"; +$RequestForLegalConsentWithdrawal = "Pyyntö käyttöehtoihin suostumisen peruuttamisesta"; +$Terms_and_conditionFields = "Ehtojen ja edellytysten kentät"; +$ContentNotAccessibleRequestFromDataPrivacyOfficer = "Tämä sisältö ei ole suoraan sinun käytettävissäsi kurssikohtaisten pääsysääntöjen vuoksi. Jos haluat tutustua näihin tietoihin, ota yhteyttä tietosuojavastaavaan, kuten tietosuojaehdoissa on määritelty."; +$LearningCalendar = "Oppimiskalenteri"; +$ControlPointAdded = "Valvontapiste lisätty"; +$NumberDaysAccumulatedInCalendar = "Kalenteriin kertyneiden päivien lukumäärä"; +$DifferenceOfDaysAndCalendar = "Päivien ja kalenterin välinen ero"; +$SkillUserList = "Taidot ja käyttäjät -luettelo"; +$CourseId = "Kurssin tunnus"; +$CareDetailView = "Oppilashuollon yksityiskohtainen näkymä"; +$MoreDataAvailableInTheDatabaseButTrunkedForEfficiencyReasons = "Tietokannassa on enemmän tietoja, mutta ne on tehokkuuden vuoksi siirretty."; +$SendAnnouncementCopyToMyself = "Lähetä kopio sähköpostitse itselleni."; +$CourseHoursDuration = "Kurssin kesto (h)"; +$AnnouncementWillBeSentTo = "Ilmoitus lähetetään osoitteeseen"; +$FrmReadOutTextIntro = "Sinun on liitettävä äänitiedosto tekstin mukaisesti napsauttamalla %s-kuvaketta."; +$CreateReadOutText = "Luo luettava teksti"; +$OutstandingStudents = "Erinomaiset opiskelijat"; +$PercentileScoresDistribution = "Prosentillinen pisteiden jakautuminen"; +$ProgressObtainedFromLPProgressAndTestsAverage = "Huomautus: Tämä edistyminen saadaan yhdistämällä oppimispolkujen edistyminen ja testien keskiarvopisteet."; +$CreateNewSurveyDoodle = "Luo uusi Doodle-tyyppinen kysely"; +$RemoveMultiplicateQuestions = "Poista moninkertaiset kysymykset"; +$MultiplicateQuestions = "Moninkertaiset kysymykset"; +$QuestionTags = "Voit käyttää kysymyksessä tunnisteita {{class_name}} ja {{student_full_name}}, jotta voit monistaa kysymyksiä. Kyselyn listasivulla toimintokentässä on painike monistaa kysymys, joka etsii {{class_name}}-tunnisteen ja monistaa kysymyksen kaikille kurssille merkityille luokille ja nimeää sen uudelleen luokan nimellä. Se lisää myös sivun päätteen, jotta jokaiselle luokalle voidaan tehdä uusi sivu. Sitten se etsii {{student_full_name}}-tagin ja kopioi kysymyksen kaikille luokan oppilaille (jokaiselle luokalle) ja nimeää sen uudelleen oppilaan koko nimellä."; +$CreateMeeting = "Luo kokouskysely"; +$QuestionForNextClass = "Kysymys seuraavaa luokkaa varten"; +$NewExerciseAttemptDisabled = "Portaali ei salli aloittaa uutta testiä tällä hetkellä, tule takaisin myöhemmin."; +$PersonalDataOfficer = "Henkilötietojen vastuuhenkilö"; +$MaxNumberSubscribedStudentsReached = "Opiskelijoiden enimmäismäärä on jo saavutettu, eikä uusia opiskelijoita voi enää tilata."; +$UserXAddedToCourseX = "Käyttäjä %s on rekisteröitynyt kurssille %s."; +$LpMinTime = "Vähimmäisaika (minuuttia)"; +$LpMinTimeDescription = "Vähimmäisaika (minuutteina), joka oppilaan on oltava oppimispolulla, jotta hän pääsee seuraavaan oppimispolkuun."; +$LpMinTimeWarning = "Et käyttänyt oppimispolkuun vaadittua vähimmäisaikaa."; +$YouHaveSpentXTime = "Olet käyttänyt aikaa %s"; +$TimeSpentInLp = "Oppimispolulla vietetty aika"; +$StudentXFinishedLp = "Opiskelija %s on suorittanut oppimispolkunsa."; +$IHaveFinishedTheLessonsNotifyTheTeacher = "Olen saanut valmiiksi oppitunnit, ilmoita opettajalle"; +$TheStudentXHasFinishedTheCourseYLearningPaths = "Opiskelija %s on suorittanut kurssin %s oppimispolut loppuun."; +$ThisQuestionExistsInAnotherExercisesWarning = "Tätä kysymystä käytetään ainakin yhdessä muussa harjoituksessa. Jos jatkat sen muokkaamista, muutokset vaikuttavat kaikkiin harjoituksiin, jotka sisältävät tämän kysymyksen."; +$TimeSpentTimeRequired = "Käytetty aika / Tarvittava aika"; +$ProgressSpentInLp = "Edistyminen"; +$InSessionXYouHadTheFollowingResults = "Sait seuraavat tulokset istunnossa %s"; +$TimeSpent = "Käytetty aika"; +$NumberOfVisits = "Vierailujen määrä"; +$FormationUnit = "Muodostumisyksikkö"; +$GlobalProgress = "Globaali edistyminen"; +$AttestationOfAttendance = "Todistus läsnäolosta"; +$DontShowScoreOnlyWhenUserFinishesAllAttemptsButShowFeedbackEachAttempt = "Älä näytä pistemäärää (vasta kun käyttäjä on suorittanut kaikki yritykset), mutta näytä palaute jokaisesta yrityksestä."; +$ExerciseRankingMode = "Ranking-tila: Näytä taulukko, jossa on kaikkien muiden käyttäjien sijoitus."; +$BackToTop = "Takaisin ylös"; +$PersonalDataTreatmentTitleHelp = "Mitä me pidämme henkilötietoina?"; +$PersonalDataCollectionTitleHelp = "Miksi keräämme näitä tietoja?"; +$PersonalDataRecordingTitleHelp = "Mihin tallennamme tiedot? (missä järjestelmässä, missä isännöidään, minkä palvelimia hoitavan yrityksen käytettävissä jne.)"; +$PersonalDataOrganizationTitleHelp = "Miten tiedot on jäsennelty? Missä määrin tietojen organisointi suojaa turvallisuutta? ... Onko teillä vakiintuneet prosessit, joilla varmistetaan, että hakkeri ei pysty keräämään kaikkia henkilötietoja ensimmäisellä yrityksellä? Ovatko ne salattuja?"; +$PersonalDataStructureTitleHelp = "Miten tiedot on jäsennelty tässä ohjelmistossa? (yksi välilehti kaikille tiedoille, siinä on joitakin luokitteluja/merkintöjä, ...)."; +$PersonalDataConservationTitleHelp = "Kuinka kauan tallennamme tiedot? Vanhentuvatko tiedot, vaikka tili on edelleen aktiivinen? Kuinka kauan säilytämme tietoja sen jälkeen, kun järjestelmää on viimeksi käytetty?"; +$PersonalDataAdaptationTitleHelp = "Mitä muutoksia voimme tehdä tietoihin? Mitä muutoksia tietoihin voidaan tehdä vaikuttamatta palveluun?"; +$PersonalDataExtractionTitleHelp = "Mihin tarkoitukseen otamme tietoja (muihin sisäisiin prosesseihin) ja mitä tietoja ne ovat?"; +$PersonalDataConsultationTitleHelp = "Kuka voi tutustua henkilötietoihin? Mihin tarkoitukseen?"; +$PersonalDataUsageTitleHelp = "Miten ja mihin voimme käyttää henkilötietoja?"; +$PersonalDataCommunicationTitleHelp = "Kenen kanssa voimme jakaa ne? Missä tilaisuuksissa? Minkä prosessien kautta (turvallisten tai ei)?"; +$PersonalDataInterconnectionTitleHelp = "Onko meillä toinen järjestelmä, jonka kanssa Chamilo on vuorovaikutuksessa? Mikä on yhteenkytkentäprosessi? Mitä tietoja vaihdetaan ja millä tavalla?"; +$PersonalDataLimitationTitleHelp = "Mitkä ovat ne rajat, joita noudatamme aina henkilötietoja käyttäessämme? Kuinka pitkälle voimme mennä?"; +$PersonalDataDeletionTitleHelp = "Kuinka pitkän ajan kuluttua poistamme tiedot? (tapahtuma, viimeinen käyttö, sopimuksen voimassaolo jne.) Mitkä ovat poistoprosessit?"; +$PersonalDataDestructionTitleHelp = "Mitä tapahtuu, jos tiedot tuhoutuvat teknisen vian seurauksena? (esimerkiksi aineiston luvaton poistaminen tai katoaminen)."; +$PersonalDataProfilingTitleHelp = "Mihin tarkoitukseen käsittelemme henkilötietoja? Käytämmekö niitä suodattaaksemme käyttäjien pääsyä sovelluksemme tiettyihin osiin? (negatiivinen tai positiivinen syrjintä)"; +$SearchUsersByName = "Nimen mukaan"; +$GlobalChat = "Chat"; +$AskRevision = "Pyydä tarkistusta"; +$FeatureDisabledBecauseOfUnmaintainedThirdPartyLibraries = "Tämä ominaisuus on poistettu käytöstä, koska kirjastoja, joista se riippuu, ei enää ylläpidetä."; +$SearchUserByGeolocalization = "Geolokaation mukaan"; +$GiveRevision = "Anna tarkistus"; +$ForumPostReported = "Postaus ilmiannettu"; +$UserXReportedPostXInForumX = "Käyttäjä %s on ilmoittanut viestin %s foorumilla %s"; +$MyCommunities = "Yhteisöni"; +$SeeAllCommunities = "Katso kaikki yhteisöt"; +$HideForumNotifications = "Piilota foorumin ilmoitukset"; +$Forum_categoryFields = "Foorumin kategoriakentät"; +$Forum_postFields = "Foorumin viestikentät"; +$Reported = "Ilmoitettu"; +$FromTimeX = "%s:lta"; +$ToTimeX = "%s asti"; +$SurveyInviteLink = "Kyselyn kutsulinkki"; +$RevisionProposed = "Ehdotettu revisio"; +$ExerciseShowOnlyGlobalScoreAndCorrectAnswers = "Näytä vain kokonaispisteet (ei kysymyksen pisteet) ja näytä vain oikeat vastaukset, älä näytä vääriä vastauksia lainkaan."; +$SessionsPlanCalendar = "Istuntosuunnitelman kalenteri"; +$QuizQuestionsLimitPerDay = "Kysymysten enimmäismäärä päivässä"; +$QuizQuestionsLimitPerDayComment = "Jos tämä asetus on suurempi kuin 0, tämä vaihtoehto estää oppijaa osallistumasta testiin, jossa on saatavissa pisteitä enemmän kuin päivittäinen yläraja on. Jos raja on esimerkiksi 50 ja oppilas on jo tehnyt kaksi 20 kysymyksen testiä, se ei anna oppilaan osallistua kolmanteen 20 kysymyksen testiin (20+20+20=60 > 50). Se antaa oppijan kuitenkin osallistua 10 kysymyksen testiin (20+20+10=50)."; +$QuizQuestionsLimitPerDayXReached = "Valitettavasti olet saavuttanut päivän kysymysten enimmäismäärän (%s). Yritä huomenna uudelleen."; +$VoteLike = "Tykkään"; +$VoteDislike = "En tykkää"; +$GenerateStats = "Tilastojen luominen"; +$BasicCourseDocuments = "Pääkurssin dokumentit"; +$WeekX = "Viikko %s"; +$QuizWrongAnswerHereIsTheCorrectOne = "Väärä vastaus. Oikea vastaus oli:"; +$ThisQuizCanBeEmbeddable = "Tämä tietokilpailu voidaan upottaa videoihin tai mobiilisisältöön."; +$SearchGeolocalization = "Etsi tästä sijainnista"; +$LegalTermsAgreementStatus = "Käyttöehtosopimuksen tila"; +$HideSurveyInvitationLink = "Piilota tutkimuksen kutsulinkki"; +$LeaveAMessage = "Jätä viesti"; +$OrphanQuestion = "Orpo kysymys"; +$WelcomeToPortalXInCourseSessionX = "Tervetuloa portaaliin %s Kurssijakso: %s"; +$WelcomeToPortalXInCourseSessionXCoursePartOfCareerX = "Tervetuloa portaaliin %s kurssilla %s, joka on osa uraa %s."; +$YourNextModule = "Seuraava moduuli"; +$FirstLesson = "Ensimmäinen oppitunti"; +$ImportCourseTeachersAsCourseCoach = "Tuo kurssin opettajat kurssivalmentajiksi istuntoon"; +$ResumeImport = "Jatka tuontia"; +$Candidate = "Ehdokas"; +$GeneralTotal = "Yleinen yhteensä"; +$Domains = "Verkkotunnukset"; +$ScormStartAttemptDate = "Päivämäärä"; +$LoginsByDate = "Kirjautumiset päivämäärän mukaan"; +$AllowHtaccessScormImport = "Salli htaccess SCORM-tuonnissa"; +$ExerciseAutoEvaluationAndRankingMode = "Automaattinen arviointitila ja ranking"; +$YouAreReceivingACopyBecauseYouAreACourseCoach = "Saat kopion, koska olet kurssin valmentaja."; +$GenerateReport = "Luo raportti"; +$VersionFromVersionFile = "Versio versiotiedostosta"; +$VersionFromConfigFile = "Versio konfigurointitiedostosta"; +$TheVersionFromTheVersionFileIsUpdatedWithEachVersionIfMainInstallDirectoryIsPresent = "Version.php-tiedoston versio päivitetään jokaisen version yhteydessä, mutta se on käytettävissä vain, jos main/install/-hakemisto on olemassa."; +$TheVersionFromTheConfigurationFileShowsOnTheAdminPageButHasToBeChangedManuallyOnUpgrade = "Pääasetustiedoston versio näkyy päähallintasivulla, mutta se on muutettava manuaalisesti päivityksen yhteydessä."; +$ResultsConfigurationPage = "Tulossivun konfigurointi"; +$HideExpectedAnswer = "Piilota odotetut vastaukset -sarake"; +$HideTotalScore = "Piilota kokonaispisteet"; +$HideQuestionScore = "Piilota kysymyksen pisteet"; +$SaveAnswers = "Tallenna vastaukset"; +$SaveAllAnswers = "Esitäytä edellisen yrityksen vastauksilla"; +$SubscribeUsersToAllForumNotifications = "Tilaa automaattisesti kaikille käyttäjille kaikki foorumin ilmoitukset"; +$ExerciseDirectPopUp = "Suora palaute ponnahdusikkunana"; +$MinStartDate = "Ensimmäinen yhteys"; +$MaxEndDate = "Viimeinen yhteys"; +$TotalDuration = "Käytetty aika yhteensä"; +$RealisationCertificate = "Todistus saavutuksista"; +$SurveysReport = "Kyselytutkimusraportti"; +$EnterYourNewPassword = "Kirjoita uusi salasanasi tähän."; +$RepeatYourNewPassword = "Kirjoita uusi salasanasi vielä kerran, jotta kirjoitusvirheiden todennäköisyys pienenee."; +$ExtractionFromX = "Purkaminen %s:stä"; +$Compilatio = "Compilatio"; +$CompilatioDocumentTextNotImage = "Tarkista, että se sisältää tekstiä (eikä vain kuvia)."; +$CompilatioDocumentNotCorrupt = "ja että se ei ole korruptoitunut"; +$CompilatioAnalysis = "Analysoi"; +$CompilatioAnalysisPercentage = "(Osuus tiedostojen analysoinnista)"; +$CompilatioWaitingAnalysis = "Vireillä oleva analyysi"; +$CompilatioAwaitingAnalysis = "Analyysiä odotetaan"; +$CompilatioAnalysisEnding = "Analyysiä lopetetaan"; +$CompilatioProtectedPdfVerification = "Jos tiedosto on pdf-muodossa, tarkista, ettei sitä ole suojattu muokkaamiselta."; +$CompilatioConnectionWithServer = "Yhteyden muodostaminen Compilatio-palvelimeen"; +$CompilatioWithCompilatio = "Compilation kanssa"; +$CompilatioStartAnalysis = "Aloita Compilatio-analyysi"; +$CompilatioSeeReport = "Katso raportti"; +$CompilatioNonToAnalyse = "Valintasi ei sisällä analysoitavia töitä. Vain Compilation hallinnoimat työt, joita ei ole jo skannattu, voidaan lähettää."; +$CompilatioComunicationAjaxImpossible = "AJAX-viestintä Compilatio-palvelimen kanssa mahdotonta. Yritä myöhemmin uudelleen."; +$UserClassExplanation = "Tietoja: Luettelo kursseista: Alla oleva luokkien luettelo sisältää luettelon kursseista, joihin olet jo ilmoittautunut. Jos tämä luettelo on tyhjä, voit lisätä luokkia yllä olevalla vihreällä + -painikkeella."; +$InsertTwoNames = "Lisää kaksi nimeäsi"; +$AddRightLogo = "Lisää oikea logo"; +$LearnpathUseScoreAsProgress = "Käytä pisteitä edistyksen mittarina"; +$LearnpathUseScoreAsProgressComment = "Käytä palautettua pistemäärää, tämän oppimispolun ainoa SCO, edistymisen osoittimena edistymispalkissa. Tämä muuttaa SCORM-käyttäytymistä varsinaisessa mielessä, mutta parantaa oppijan saamaa visuaalista palautetta."; +$Planned = "Suunniteltu"; +$InProgress = "Käynnissä"; +$Cancelled = "Peruutettu"; +$Finished = "Valmis"; +$SessionStatus = "Istunnon tila"; +$UpdateSessionStatus = "Istunnon tilan päivittäminen"; +$SessionListCustom = "Mukautettu luettelo"; +$NoStatus = "Ei tilaa"; +$CAS3Text = "CAS 3"; +$GoBackToVideo = "Takaisin videoon"; +$UseLearnpathScoreAsProgress = "Käytä pisteitä edistysmittarina"; +$UseLearnpathScoreAsProgressInfo = "Jotkin SCORM-oppimispolut, erityisesti ne, joissa on vain yksi SCO, voivat ilmoittaa edistymisen SCO:n pistemääränä (cmi.core.score.raw). Valitsemalla tämän vaihtoehdon (käytettävissä vain yhden SCO:n oppimispoluilla) Chamilo näyttää edistymisen SCO-kohteesta saadun pistemäärän perusteella. Varo, että käyttämällä tätä temppua menetät mahdollisuuden saada kohteen todelliset pisteet."; +$ThereIsASequenceResourceLinkedToThisCourseYouNeedToDeleteItFirst = "Tähän kurssiin on liitetty sekvenssiresurssi. Sinun on ensin poistettava tämä linkki."; +$QuizPreventBackwards = "Estä siirtyminen taaksepäin edellisiin kysymyksiin"; +$UploadPlugin = "Upload plugin"; +$PluginUploadPleaseRememberUploadingThirdPartyPluginsCanBeDangerous = "Muista, että kolmannen osapuolen lisäosien lataaminen voi olla haitallista sekä portaalillesi että palvelimellesi. Varmista aina, että asennat liitännäisiä turvallisista lähteistä tai että voit luottaa niiden kehittäjien ammattimaiseen tukeen."; +$PluginUploadingTwiceWillReplacePreviousFiles = "Saman laajennuksen lataaminen useammin kuin kerran korvaa edelliset laajennustiedostot. Kuten ensimmäisessäkin latauksessa, kolmannen osapuolen lisäosan lataamisella voi olla haitallisia vaikutuksia."; +$UploadNewPlugin = "Valitse uusi lisäosa"; +$PluginUploadIsNotEnabled = "Kolmannen osapuolen lisäosien lataus ei ole käytössä. Varmista, että 'plugin_upload_enable' on asetettu 'true'-arvoon alustan asetustiedostossa."; +$PluginUploaded = "Lisäosa ladattu"; +$PluginOfficial = "Virallinen"; +$PluginThirdParty = "Kolmannen osapuolen"; +$ErrorPluginOfficialCannotBeUploaded = "Lisäosalla on sama nimi kuin virallisella lisäosalla. Virallisia lisäosia ei voi korvata. Vaihda pluginin zip-tiedoston nimi."; +$AllSessionsShort = "Kaikki"; +$ActiveSessionsShort = "Aktiivinen"; +$ClosedSessionsShort = "Suljettu"; +$FirstnameLastnameCourses = "Kurssit %s %s"; +$CanNotSubscribeToCourseUserSessionExpired = "Et voi enää tilata kurssia, koska istuntosi on päättynyt."; +$CertificateOfAchievement = "Todistus saavutuksista"; +$CertificateOfAchievementByDay = "Todistus saavutuksista päiväkohtaisesti"; +$ReducedReport = "Vähennetty raportti"; +$NotInCourse = "Kurssien ulkopuolella"; +$LearnpathCategory = "Opintopolku-kategoria"; +$MailTemplates = "Posti-mallipohjat"; +$AnEmailToResetYourPasswordHasBeenSent = "Sähköposti salasanasi palauttamiseksi on lähetetty."; +$TotalNumberOfAvailableCourses = "Tarjolla olevien kurssien kokonaismäärä"; +$NumberOfMatchingCourses = "Täsmäävien kurssien määrä"; +$SessionsByDate = "Istunnot päivämäärän mukaan"; +$GeneralStats = "Globaalit tilastot"; +$Weeks = "Viikot"; +$SessionCount = "Istuntojen määrä"; +$SessionsPerWeek = "Istunnot viikossa"; +$AverageUserPerSession = "Käyttäjien keskimääräinen määrä istuntoa kohden"; +$AverageSessionPerGeneralCoach = "Keskimääräinen istuntojen määrä istuntojen valmentajaa kohti"; +$SessionsPerCategory = "Istunnot kategorioittain"; +$SessionsPerLanguage = "Istunnot kieltä kohti"; +$CountOfSessions = "Istuntojen lukumäärä"; +$CourseInSession = "Kurssit istunnoissa"; +$UserStats = "Käyttäjätilastot"; +$TotalNumberOfStudents = "Opiskelijoiden kokonaismäärä"; +$UsersCreatedInTheSelectedPeriod = "Valittuna ajanjaksona luodut käyttäjät"; +$UsersByLanguage = "Käyttäjät kielen mukaan"; +$Count = "Lukumäärä"; +$SortKeys = "Järjestä"; +$SubscriptionCount = "Tilausten määrä"; +$VoteCount = "Äänten määrä"; +$ExportAsCompactCSV = "Vienti kompaktina CSV-tiedostona"; +$PromotedMessages = "Mainostetut viestit"; +$SendToGroupTutors = "Julkaise ryhmänohjaajille"; +$GroupSurveyX = "Ryhmäkysely %s:lle"; +$HelloXGroupX = "Hei %s + +Ryhmän %s ryhmänohjaajana sinut kutsutaan osallistumaan seuraavaan kyselyyn :"; +$SurveyXMultiplicated = "Kysely %s monistettu"; +$SurveyXNotMultiplicated = "Kysely %s ei ole monistettu"; +$ExportSurveyResults = "Vie kyselyn tulokset"; +$PointAverage = "Keskimääräinen pistemäärä"; +$TotalScore = "Pisteiden summa"; +$ExportResults = "Tulosten vieminen"; +$QuizBrowserCheckOK = "Selaimesi on tarkistettu. Voit jatkaa turvallisesti."; +$QuizBrowserCheckKO = "Selainta ei voitu todentaa. Yritä uudelleen tai kokeile toista selainta tai laitetta ennen testin aloittamista."; +$PartialCorrect = "Osittain oikein"; +$XAnswersSavedByUsersFromXTotal = "%d / %d vastauksia tallennettu."; +$TestYourBrowser = "Testaa selaimesi"; +$DraggableQuestionIntro = "Lajittele seuraavat vaihtoehdot luettelosta haluamallasi tavalla vetämällä ne alemmille alueille. Voit laittaa ne takaisin tälle alueelle muuttaaksesi vastaustasi."; +$AverageTrainingTime = "Keskimääräinen aika kurssilla"; +$UsersActiveInATest = "Aktiiviset käyttäjät kokeessa"; +$SurveyQuestionSelectiveDisplay = "Valikoiva näyttö"; +$SurveyQuestionSelectiveDisplayComment = "Kun tämä kysymys on yhdellä kyselysivulla, jossa on ensimmäinen monivalintakysymys, se näkyy vain, jos ensimmäisen kysymyksen ensimmäinen *vaihtoehto* on valittu. Esimerkiksi: \"Olitko lomalla?\" -> jos ensimmäiseen vaihtoehtoon vastataan \"Kyllä\", valintakysymys ilmestyy näkyviin, ja siinä on luettelo mahdollisista lomakohteista, joista voi valita."; +$SurveyQuestionMultipleChoiceWithOther = "Monivalinta ja vapaa teksti"; +$SurveyQuestionMultipleChoiceWithOtherComment = "Tarjoa joitakin ennalta määritettyjä vaihtoehtoja ja anna käyttäjän vastata tekstillä, jos mikään vaihtoehto ei vastaa."; +$Multiplechoiceother = "Monivalintakysymys, jossa on vaihtoehto \"muu\""; +$SurveyOtherAnswerSpecify = "Muu..."; +$SurveyOtherAnswer = "Täsmennä:"; +$UserXPostedADocumentInCourseX = "Käyttäjä %s on lähettänyt dokumentin Tehtävät-työkalussa kurssissa %s"; +$DownloadDocumentsFirst = "Lataa asiakirjat ensin"; +$FileXHasNoData = "Tiedosto %s on tyhjä tai sisältää vain tyhjiä rivejä."; +$FileXHasYNonEmptyLines = "Tiedostossa %s on %d ei-tyhjää riviä."; +$DuplicatesOnlyXUniqueUserNames = "Löytyi kaksoiskappaleita: vain %d yksilöllistä käyttäjänimeä on poimittu."; +$NoLineMatchedAnyActualUserName = "Yksikään rivi ei vastannut mitään todellista käyttäjänimeä."; +$OnlyXLinesMatchedActualUsers = "Vain %d riviä vastasi todellisia käyttäjiä."; +$TheFollowingXLinesDoNotMatchAnyActualUser = "Seuraava(t) %d riviä ei vastaa yhtään todellista käyttäjää:"; +$XUsersAreAboutToBeAnonymized = "%d käyttäjää anonymisoidaan :"; +$LoadingXUsers = "Ladataan %d käyttäjää..."; +$AnonymizingXUsers = "Anonymisointi %d käyttäjää..."; +$AllXUsersWereAnonymized = "Kaikki %d käyttäjää anonymisoitiin."; +$OnlyXUsersWereAnonymized = "Vain %d käyttäjää anonymisoitiin."; +$AttemptedAnonymizationOfTheseXUsersFailed = "Yritys anonymisoida seuraavat %d käyttäjää epäonnistui:"; +$PleaseUploadListOfUsers = "Lataa tekstitiedosto, jossa luetellaan anonymisoitavat käyttäjät, yksi käyttäjänimi per rivi."; +$InternalInconsistencyXUsersFoundForYUserNames = "Sisäinen epäjohdonmukaisuus löytyi : %d käyttäjää löytyi %d lähetetyistä käyttäjätunnuksista. Aloita alusta."; +$BulkAnonymizeUsers = "Anonymisoi käyttäjäluettelo"; +$UsernameList = "Käyttäjätunnusluettelo"; +$UsersAboutToBeAnonymized = "Käyttäjät, jotka aiotaan anonymisoida:"; +$CouldNotReadFile = "Tiedostoa ei voitu lukea."; +$CouldNotReadFileLines = "Tiedoston rivejä ei voitu lukea."; +$CertificatesSessions = "Todistukset istunnoissa"; +$SessionFilterReport = "Suodata todistukset istunnoissa"; +$UpdateUserListXMLCSV = "Käyttäjälistan päivittäminen"; +$DonateToTheProject = "Chamilo on avoimen lähdekoodin hanke, ja tämän portaalin tarjoaa yhteisöllemme maksutta Chamilo Association, jonka tavoitteena on parantaa laadukkaan koulutuksen saatavuutta kaikkialla maailmassa. + +Chamilon kehittäminen ja tämän palvelun tarjoaminen on kuitenkin kallista, ja pienellä avustuksellasi voisit varmistaa, että nämä palvelut paranevat nopeammin ajan myötä. + +Kurssin luominen tähän portaaliin on yksi resurssi-intensiivisimmistä toiminnoista. Harkitkaa ennen kurssin luomista lahjoituksen tekemistä Chamilo Associationille, jotta tämä palvelu pysyisi ilmaisena kaikille!"; +$MyStudentPublications = "Minun tehtäväni"; +$AddToEditor = "Lisää editoriin"; +$ImageURL = "Kuvan URL-osoite"; +$PixelWidth = "px leveys"; +$AddImageWithZoom = "Lisää kuva zoomaamalla"; +$DeleteInAllLanguages = "Poista kaikilla kielillä"; +$MyStudentsSchedule = "Oppilaideni aikataulu"; +$QuizConfirmSavedAnswers = "Hyväksyn tässä kohdassa tallennettujen vastausten määrän."; +$QuizConfirmSavedAnswersHelp = "Jos et ole tyytyväinen, älä ruksaa hyväksymisruutua ja ota yhteyttä kurssin johtajaan tai alustan ylläpitäjään."; +$TCReport = "Opiskelijan valvojan seuranta"; +$TIReport = "Valmentajien yleinen suunnittelu"; +$StudentPublicationsSent = "Lähetetyt tai aiemmat tehtävät"; +$PendingStudentPublications = "Vireillä olevat tehtävät"; +$MyStudentPublicationsTitle = "Kaikki tehtävät"; +$MyStudentPublicationsExplanation = "Alta löydät kaikki tehtävät kaikilta kursseilta ja jaksoilta, joille olet ilmoittautunut."; +$RequiredCourses = "Pakolliset kurssit"; +$SimpleCourseList = "Vakiolista"; +$AdminCourseList = "Hallintaluettelo"; +$AnonymizeUserSessions = "Anonymisoi käyttäjän istunnot"; +$ContinueLastImport = "Jatka viimeistä tuontia"; +$Notifications = "Ilmoitukset"; +$Justification = "Perustelut"; +$PeriodicExport = "Määräaikainen vienti"; +$Dates = "Päivämäärät"; +$ErrorPluginFilesExtensionsInsideZip = "Virhe: Joidenkin zip-paketin sisältämien tiedostojen tiedostopäätteet ovat luvattomia."; +$UsersByStatus = "Käyttäjät tilan mukaan"; +$UsersByTargetLanguage = "Käyttäjät kohdekielen mukaan"; +$UsersByCareer = "Käyttäjät uran mukaan"; +$UsersByContract = "Käyttäjät sopimuksen mukaan"; +$UsersByCertificate = "Käyttäjät todistuksen mukaan"; +$UsersByAge = "Käyttäjät iän mukaan"; +$SessionsPerStatus = "Istunnot tilan perusteella"; +$ContinueImport = "Jatka tuontia"; +$LDAPConnectFailed = "LDAP-yhteyden muodostaminen epäonnistui."; +$LDAPBindFailed = "ldap_bind() epäonnistui."; +$LDAPSearchFailed = "ldap_search() epäonnistui."; +$LDAPFirstEntryFailed = "ldap_first_entry() epäonnistui."; +$LDAPGetValuesFailed = "ldap_get_values() epäonnistui."; +$MoreThanOneAttributeValueFound = "Löytyi useampi kuin yksi attribuutin arvo."; +$MoreThanOneUserMatched = "Useampi kuin yksi käyttäjä täsmää."; +$CourseCodeConfirmation = "Kurssikoodin vahvistus"; +$UnsupportedQtiVersion = "Ei tuettu IMS/QTI-versio."; +$ExportAllCertificatesToZIP = "Vie kaikki todistukset ZIP-tiedostoon"; +$CurrentScore = "Nykyinen pistemäärä"; +$AddAttempt = "Lisää yritys"; +$SurveysWordInASCII = "tutkimus"; +$PrivateBetweenUsers = "Yksityinen käyttäjien välillä"; +$Nothing = "Ei mitään"; +$CompilatioAnalysisInProgress = "Laadinta-analyysi käynnissä"; +$AccountExpiration = "Tilin voimassaolon päättyminen"; +$JustificationExpiration = "Perusteluiden päättyminen"; +$JustificationType = "Perustelutyyppi"; +$Persistent = "Pysyvä"; +$DaysDifference = "Päivien ero"; +$Graduated = "Valmistunut"; +$Absent = "Poissa"; +$InternalDatabaseError = "Sisäinen tietokantavirhe"; +$WrongNumberOfDays = "Väärä määrä päiviä"; +$SubscriptionNotAllowed = "Ilmoittautuminen ei ole sallittu"; +$YouPassedTheLimitOfXMinutesToSeeTheResults = "Olet ylittänyt %s minuutin rajan, jonka kuluessa voit nähdä tulokset."; +$LastUpdated = "Viimeksi päivitetty"; +$Age = "Ikä"; +$ExportToXls = "Vienti XLS:ään"; +$LogoutWithYourAccountFromX = "Kirjaudu ulos %s-tililtäsi"; +$CourseLearningPathsGenericStats = "Oppimispolkujen yleiset tilastot"; +$FailedToCreateExtraFieldCasUser = "Epäonnistuimme luomaan lisäkenttää cas_user."; +$FailedUserCreation = "Käyttäjän luominen epäonnistui."; +$NoSuchUserInLDAP = "LDAP:ssa ei ole tällaista käyttäjää."; +$NoSuchUserInInternalDatabase = "Sisäisessä tietokannassa ei ole tällaista käyttäjää."; +$CouldNotUpdateUser = "Käyttäjää ei voitu päivittää."; +$ModelSessionDoesNotExist = "Malli-istuntoa ei ole olemassa."; +$SessionNotRegistered = "Istuntoa ei ole rekisteröity."; +$CoursesNotAddedToSession = "Kursseja ei ole lisätty istuntoon."; +$SessionNotFound = "Istuntoa ei löydy."; +$UserNotFound = "Käyttäjää ei löydy."; +$UserNotSubscribed = "Käyttäjä ei ole ilmoittautunut."; +$NoSessionMatched = "Ei täsmäävää istuntoa."; +$MoreThanOneSessionMatched = "Useampi kuin yksi istunto täsmää."; +$CouldNotLoadUser = "Käyttäjää ei voitu ladata."; +$LanguageUnavailable = "Kieli ei ole käytettävissä."; +$CouldNotUpdateExtraFieldValue = "Ei voitu päivittää ylimääräisen kentän arvoa."; +$UnsupportedUpdate = "Ei tuettu päivitys."; +$NoUserMatched = "Ei täsmääviä käyttäjiä."; +$Resume = "Jatka"; +$AttendanceFromXToY = "Osallistuminen %s:stä %s:ään"; +$AddTime = "Lisää aika"; +$AddUser = "Lisää käyttäjä"; +$TimeSpentOnAssignment = "Tehtävään käytetty aika"; +$UserXSignedTheAgreementTheDateY = "Käyttäjä %s allekirjoitti sopimuksen %s"; +$Available = "Saatavilla"; +$SurveyMultipleChoiceWithOther = "Monivalintakysymys, jossa on vaihtoehto \"muu\""; +$CompilatioDescription = "Compilatio anti-plagiointimoduuli"; +$CompilatioQuota = "Kiintiöt"; +$CompilatioCreditXOnY = "Krediitit: %s kohteessa %s"; +$CompilatioConnectionTestSoap = "SOAP-yhteyden testaus..."; +$CompilatioServerConnection = "Yhteys Compilationin SOAP-palvelimeen"; +$CompilatioConnectionSuccessful = "Yhteys onnistui."; +$CompilatioSendTextToServer = "Tekstin lähettäminen Compilatio-palvelimelle"; +$CompilatioTextSendingTestKeyX = "Tämä on tekstin lähetystesti Compilatio-palvelimelle sen API:n kautta.\nKäytetty Compilatio-avain: %s"; +$CompilatioSuccessfulTransfer = "Siirto onnistui."; +$CompilatioFailedTransfer = "Siirto epäonnistui."; +$CompilatioNoConnection = "Yhteyttä Compilation SOAP-palvelimeen ei saatu muodostettua."; +$CompilatioParamVerification = "Tarkista avain, palvelimen portit ja mahdollisesti välityspalvelimen asetukset."; +$LastVisitedCourse = "Viimeksi vierailtu kurssi"; +$YouDidNotVisitACourseHereTheCourseList = "Et ole vielä käynyt yhdelläkään kurssilla, tässä on luettelo kursseistasi."; +$NoEntity = "Ei organisaatiota"; +$UserByEntityReport = "Käyttäjä organisaation mukaan"; +$LpByAuthor = "Oppimispolku tekijän mukaan"; +$SessionImportAssignments = "Tuo tehtävät peruskurssilta"; +$RedirectToPortalHome = "Uudelleenohjaus alustan etusivulle"; +$MyLps = "Minun oppimispolkuni"; +$LastVisitedLp = "Viimeksi vierailtu oppimispolku"; +$YouDidNotVisitALpHereTheLpList = "Et ole vielä käynyt yhdelläkään oppimispolulla, tässä on luettelo oppimispoluista."; +$CourseUsedInOtherURL = "Tätä kurssia käytetään vähintään yhdessä muussa portaalissa."; +$SubscribeUserGroupsToLp = "Lisää luokat oppimispolkuun"; +$ReplaceFile = "Korvaa tiedosto"; +$SubscribeClassesToLpCategory = "Tilaa luokat kategoriaan"; +$ExportResponseReport = "Vie vastausraportti"; +$ResponseReport = "Vastausraportti"; +$ResultsOnlyAvailableOnline = "Tulokset saatavilla vain verkossa"; +$QuestionStats = "Kysymyksen tilastot"; +$WrongAnswer = "Väärä vastaus"; +$WrongAttemptXInCourseX = "Epäonnistuminen yrityksessä %s osoitteessa %s"; +$ExerciseValidationInCourseX = "Harjoituksen validointi osoitteessa %s"; +$BlockCategoryExplanation = "Olet saanut valmiiksi tähän kysymysluokkaan liittyvät kysymykset, joten nyt on viimeinen tilaisuus palata ja tarkistaa kysymykset. Kun napsautat seuraa harjoitusta, siirryt seuraavaan kysymysluokkaan etkä voi enää palata testin tähän osaan."; +$RemainingTimeToFinishExercise = "Jäljellä oleva aika harjoituksen loppuun saattamiseen"; +$RemainingTimeToFinishQuestion = "Jäljellä oleva aika kysymyksen loppuun saattamiseen"; +$QuestionStatsDetailedReport = "Yksityiskohtaiset kysymystilastot"; +$MyPersonalOpenAreaHelp = "Lyhyt esittely itsestäsi, ammatillisista tai henkilökohtaisista kokemuksistasi ja uskomuksistasi."; +$MyCompetencesHelp = "hankkimasi taidot, jotka ovat muodollisia tai epämuodollisia, sosiaalisia tai teknisiä."; +$MyDiplomasHelp = "asiaankuuluvat tutkintotodistukset ja todistukset, jotka olet hankkinut ja joista olet ylpeä. Ilmoita vähintään asiakirjassa oleva nimi, organisaatio ja vuosi."; +$MyTeachingCapabilitiesHelp = "Kokemuksesi ja taitosi huomioon ottaen voit yleensä opettaa niillä aloilla, joilla taitosi ovat korkeimmalla tasolla. Jos sinusta tuntuu, että voisit todellakin opettaa jotakuta toista jollakin tietyllä alalla, mainitse se täällä. Muussa tapauksessa jätä tyhjäksi."; +$MyProductionsHelp = "Oletko kirjoittanut artikkelin, jonka voit jakaa, tai haluatko liittää CV:si ladattavaksi? Lisää ne tänne."; +$CorrectAttempts = "Oikeat yritykset"; +$WrongAttempts = "Virheelliset yritykset"; +$StudentsWithCorrectAnswers = "Opiskelijat, joilla on oikeat vastaukset"; +$StudentsWithWrongAnswers = "Opiskelijat, joilla on vääriä vastauksia"; +$ContentList = "Sisällysluettelo"; +$Tariff = "Tariffi"; +$ToInvoice = "Laskutukseen"; +$LearningPathItemByAuthor = "Oppimispolku-kohde tekijän mukaan"; +$UserGuides = "Käyttöoppaat"; +$DeleteExerciseAttempts = "Poista myös harjoitusyritykset. Jos et ruksittu, harjoitustulokset ovat edelleen käytettävissä harjoitustyökalussa."; +$ExerciseCategoriesRadarMode = "Näyttää vain pistemäärätutkan kategoroittain kategoriataulukon sijasta. Älä näytä yksittäisiä pisteitä tai palautetta."; +$ExerciseBlockBecausePercentageX = "Kaikki yritykset estetty, koska et saavuttanut vähimmäispistemäärää %s %% joistakin yrityskerroistasi."; +$RegisteredAuthors = "Rekisteröidyt kirjoittajat :"; +$Price = "Hinta"; +$PriceUpdated = "Hinta päivitetty"; +$RemoveSelected = "Poista valitut kirjoittajat"; +$DeletedAuthors = "Kirjoittajat on poistettu"; +$HideCategoryTable = "Piilota kategoriataulukko"; +$XQuestionsSelectedWithTotalScoreY = "Vain %d kysymystä valitaan testin kokoonpanon perusteella, jolloin kokonaispistemäärä on %s."; +$QuestionAlsoUsedInTheFollowingTests = "Tätä kysymystä käytetään myös seuraavissa testeissä"; +$LinkToTestEdition = "Linkki testipainokseen"; +$MoveUsersFromCourseToSession = "Siirrä käyttäjien tulokset peruskurssilta istuntoon"; +$IfYourQuizHaveHotspotQuestionsIncludedYouShouldSelectTheImagesFromTheDocuments = "Jos tietovisaan sisältyy hotspot-kysymyksiä, sinun on valittava niihin liittyvät kuvat dokumenteista."; +$BackToAttemptList = "Takaisin yrityslistaan"; +$ShowScoreEveryAttemptShowAnswersLastAttemptNoFeedback = "Näytä tulos oppijalle: Näytä pisteet, oppijan valinta ja hänen palautteensa jokaisesta yrityksestä, lisää oikea vastaus ja hänen palautteensa, kun valittu yrittämisraja on saavutettu."; +$AddGradebookComment = "Kommentti"; +$LatestLoginInAnyCourse = "Viimeisin kirjautuminen kurssille"; +$The = "\"The\""; +$MultiplicateQuestionsByClass = "Monista kysymykset luokittain"; +$MultiplicateQuestionsByUser = "Kerro kysymysmäärät käyttäjillä"; +$QuestionForNextUser = "Kysymyksiä seuraavasta käyttäjästä"; +$CourseCodeToEnteredCapitalLettersToConfirmDeletionX = "Kurssikoodi, joka on kirjoitettava isoin kirjaimin poiston vahvistamiseksi: %s."; +$BadgeXTitle = "Rintamerkki: %s"; +$PortfolioCommentFromXUser = "Kommentoinut %s"; +$PortfolioItemFromXUser = "Portfoliokohde %s"; +$CopyToMyPortfolio = "Kopioi portfoliooni"; +$CopyToStudentPortfolio = "Kopioi opiskelijan portfolioon"; +$OriginallyPublishedAsXTitleByYUser = "Julkaistu alun perin nimellä \"%s\" %s:n toimesta."; +$OriginallyCommentedByXUserInYItem = "Alun perin kommentoi %s kohteessa \"%s\""; +$PortfolioItemAddedToStudents = "Kohde lisätty opiskelijan omaan portfolioon"; +$MarkCommentAsImportant = "Merkitse kommentti tärkeäksi"; +$UnmarkCommentAsImportant = "Älä merkitse kommenttia tärkeäksi"; +$CommentMarkedAsImportant = "Tärkeäksi merkitty portfoliokohde"; +$SelectLearnerPortfolio = "Valitse oppilaan portfolio"; +$SeeMyPortfolio = "Katso portfolioni tällä kurssilla"; +$PortfolioDetails = "Portfolion tiedot"; +$PortfolioItemTitle = "Kohteen nimi"; +$CreationDateXDate = "Luontipäivämäärä: %s"; +$UpdateDateXDate = "Päivityspäivämäärä: %s"; +$CategoryXName = "Kategoria: %s"; +$DateXDate = "Päivämäärä: %s"; +$PortfolioItemTitleXName = "Kohteen nimi: %s"; +$NoItemsInYourPortfolio = "Ei kohteita portfoliossasi"; +$YouHaveNotCommented = "Et ole kommentoinut"; +$PortfolioItems = "Portfolion kohteet"; +$PortfolioComments = "Portfolion kommentit"; +$PortfolioCommentsMade = "Tehdyt kommentit"; +$QualifyThisPortfolioItem = "Arvioi tämä kohde"; +$PortfolioItemGraded = "Portfoliokohde on arvioitu"; +$ContextForCommentToBeGrade = "Arvioitavan kommentin konteksti"; +$QualifyThisPortfolioComment = "Arvioi tämä kommentti"; +$PortfolioCommentGraded = "Portfolion kommentti on arvioitu"; +$QualifyPortfolioItems = "Arvioi kohteet"; +$QualifyPortfolioComments = "Arvioi kommentit"; +$HideCorrectAnsweredQuestions = "Piilota oikein vastatut kysymykset"; +$TheSettingXWillChangeToX = "Asetus \"%s\" muuttuu muotoon \"%s\"."; +$VerificationOfAnsweredQuestions = "Vastattujen kysymysten tarkistaminen"; +$StudentPublicationToCorrect = "Opiskelijan korjattavat tehtävät"; +$StudentPublicationCorrectionWarning = "Alta löydät kaikki työt, jotka opiskelijat ovat toimittaneet jollakin kurssillasi (se voi olla peruskurssilla tai jollakin kurssilla istunnossa). Voit suodattaa luetteloa valitsemalla tietyn kurssin tai työn tilan."; +$BackToMainPortfolio = "Takaisin pääkurssin portfolioon"; +$ExportMyPortfolioDataPdf = "Vie portfolioni tiedot PDF-tiedostona"; +$ExportMyPortfolioDataZip = "Vie portfolion tiedot ZIP-tiedostona"; +$PortfolioCategoryFieldHelp = "Henkilökohtaisen portfolion kategoriat ovat vain organisointia varten."; +$ExportMytPortfolioDataPdf = "Viedä portfolion tiedot PDF-tiedostoon"; +$ExportMytPortfolioDataZip = "Vie portfolion tiedot ZIP-tiedostoon"; +$NewLearningPathSubject = "Uusi oppimispolku saatavilla"; +$NewLearningPathBody = "Tässä on uusi oppimispolku nimeltä %s, joka on lisätty %s-kurssiisi. Siirry tähän oppimispolkuun tästä : %s"; +$XPercentCompleted = "%s %% Valmistunut"; +$EmailToTeachersWhenNewPost = "Sähköposti opettajille uuden käyttäjän portfoliotyökalussa tekemästä viestistä."; +$PortfolioAlertNewPostContent = "Kurssin %s portfoliossa on uusi postaus, jonka on kirjoittanut %s. Voit katsoa sen tästä."; +$PortfolioAlertNewPostSubject = "[Portfolio] Uusi viesti kurssilla %s"; +$OngoingTraining = "Meneillään oleva koulutus"; +$QuizRemindSubject = "Sinulle on tullut uusi viesti %s:ltä"; +$QuizFirstRemindBody = "Parahin %s,\r\n\r\nKurssille %s on lisätty uusi koe/testi %s.\r\n\r\nKurssi: %s Testin/tehtävän nimi: %s"; +$QuizLastRemindBody = "Vieraile testin/tietokilpailun sivulla %s"; +$QuizDhrRemindBody = "Parahin %s,\r\n\r\nHänen vanhempanaan saat tämän sähköpostin, jossa kerromme, että %s sai juuri uuden kokeen/tehtävän %s kurssilla %s.\r\n\r\nOppilas: %s\r\nKurssi: %s\r\nTestin nimi: %s."; +$QuizRemindDuration = "Testin kesto: %s"; +$QuizRemindStartDate = "Testin alkamispäivä: %s"; +$QuizRemindEndDate = "Testin päättymispäivä: %s"; +$CareerDiagramLegend = "Urakaavion selitys"; +$CareerDiagramDisclaimer = "Urakaavio Vastuuvapauslauseke"; +$SuccessfulAttempt = "Onnistunut yritys"; +$FailedAttempt = "Epäonnistunut yritys"; +$StudentWithSuccessfulAttempt = "Opiskelijat, joilla on onnistunut yritys"; +$StudentWithFailedAttempt = "Opiskelijat, joilla on epäonnistunut yritys"; +$ExerciseAttemptStatsReport = "Harjoitusyrityksen tilastoraportti"; +$ComparativeGroupReport = "Vertaileva ryhmäraportti"; +$CoursesUsage = "Kurssien käyttö"; +$HideConnectionTime = "Piilota yhteysaika"; +$CourseInWhichTheQuestionWasInitiallyCreated = "Kurssi, jolla kysymys alun perin luotiin."; +$ApprenticeshipContract = "Oppisopimuskoulutuksen sopimus"; +$ExportCcVersion13 = "Vie Common Cartridge v1.3"; +$ImportCcVersion13 = "Tuo Common Cartridge v1.3"; +$ExportCcVersion13Info = "Vie kurssisisältö IMS Common Cartridge 1.3 -muodossa, jotta voit jakaa sen muilla alustoilla."; +$ImportCcVersion13Info = "Tuo kurssi IMS Common Cartridge 1.3 -muodossa jostain muusta alustasta, joka on yhteensopiva tämän muodon kanssa. Versio on tärkeä."; +$IMSCCCreated = "IMS CC -tiedosto luotu."; +$IMSCCFile = "IMS CC -tiedosto"; +$IMSCCFileImported = "IMS CC -tiedosto tuotu."; +$IMSCCImportInstructions = "Lataa mikä tahansa IMS CC (.imscc tai .zip) tiedosto oikeassa versiossa, ja se puretaan suoraan kurssillesi."; +$IMSCC13 = "IMS Common Cartridge v1.3"; +$HideQuestionNumber = "Piilota kysymyksen numero"; +$PendingAttempts = "Vireillä olevat yritykset"; +$EditInProfile = "Muokkaa profiilissa"; +$Guidance = "Opastus"; +$RemoveTime = "Poista aika"; +$CopyWithSessionContent = "Kopioi istunnon sisällön kanssa"; +$ExportByClass = "Vienti luokittain"; +$UploadAnswer = "Lähetä vastaus"; +$TokenExpiredActionAlreadyRealized = "Token vanhentunut, toiminta jo toteutettu"; +$Corrector = "Korjain"; +$CorrectionDate = "Korjauspäivä"; +$HideAttemptsTableOnStartPage = "Piilota yritystaulukko aloitussivulla"; +$ScormAndLPMaxProgress = "Maksimi edistyminen oppimispoluilla"; +$HideSkills = "Piilota taidot"; +$OptionsToHideInExport = "Viennin piilotusvaihtoehdot"; +$HideAssignment = "Piilota tehtävät"; +$AddSurveyToCourse = "Lisää kysely kurssille"; +$MoveTheCurrentSurvey = "Siirrä nykyinen kysely"; +$ShareEventsInSessions = "Jaa tapahtumia kurssi-istunnoissa"; +$AgendaEventsInBaseCourseWillBeVisibleInCourseSessions = "Kurssin asialistatapahtumat näkyvät istunnoissa."; +$AgendaEventsOnlyVisibleInCurrentCourse = "Asialistan tapahtumat näkyvät vain nykyisellä kurssilla"; +$TestResult = "Testitulos"; +$FilterByLp = "Suodata oppimispolun mukaan"; +$ShareForumsInSessions = "Jaa foorumit kaikissa istunnoissa"; +$YouHaveAchievedANewSkill = "Olet saavuttanut uuden taidon."; +$YouXHaveAchievedTheSkillYToSeeFollowLinkZ = "Hei, %s. Olet saavuttanut taidon \"%s\". Näet yksityiskohdat täältä: %s."; +$ToAssignNewSkillToUserClickLinkX = "Määrittääksesi uuden taidon tälle käyttäjälle, napsauta tästä."; +$AddEventInCourseCalendar = "Lisää tapahtuma kurssikalenteriin"; +$Hours = "Tunnit"; +$ReminderXEvent = "Muistutus tapahtumasta : %s"; +$AddNotification = "Lisää ilmoitus"; +$NotifyBeforeTheEventStarts = "Ilmoitus tapahtumasta muistuttamiseksi"; +$AddTags = "Lisää tunnisteet"; +$IsItEditableByTheInvitees = "Tapahtuma, joka on kutsuttujen muokattavissa"; +$Invitees = "Kutsutut"; +$RemindXLpCourseX = "Muistutuksen numero %s kurssille %s."; +$HelloX = "Hei %s"; +$YouAreRegCourseXFromDateX = "Olet ilmoittautunut koulutukseen %s vuodesta %s lähtien."; +$ThisMessageIsAboutX = "Saat tämän viestin, koska olet suorittanut oppimispolun, jossa koulutuksesi on edennyt %s%. Etenemisesi on oltava 100, jotta koulutuksesi voidaan katsoa suoritetuksi. Jos sinulla on pienintäkään ongelmaa, ota yhteyttä kouluttajaasi."; +$StepsToRemindX = "Muistutuksena, että pääset koulutusalustalle seuraavasti:\r\n1. Ota yhteys alustaan osoitteessa: %s\r\n2. Syötä sitten:\r\nKäyttäjätunnuksesi: %s\r\nSalasanasi: Tämä lähetettiin sinulle sähköpostitse\r\nJos unohdit sen etkä löydä sitä, voit hakea sen osoitteesta %s.\r\n\r\nKiitos, että teet mikä on tehtävä."; +$LpRemindFooterX = "Koulutuskeskus\r\n\r\n%s\r\n\r\nKouluttajat:\r\n%s"; +$Embed = "Hanki upotettava linkki"; +$EmbedExerciseLink = "Linkki harjoituksen upottamiseen"; +$CopyUrlToIncludeInIframe = "Kopioi tämä url sisällyttääksesi tämän harjoituksen iframeen:"; +$ExportExtraFields = "Vie ylimääräisiä kenttiä"; +$ToHideExlearners = "Piilota entiset oppilaat"; +$CertificateOfAchievement2 = "Todistus saavutuksista oppimispolkukohtaisesti"; +$YourLpResultsAre = "Olet saavuttanut seuraavat tulokset koulutuksessa:"; +$YourLpQuizzesResultsAre = "Testeissä on saatu seuraavat tulokset:"; +$ExportLpQuizResults = "Vie LP tietovisan tulokset"; +$ElearningResults = "Oppimispolun tulokset"; +$InvoicingByAccessUrl = "Aktiiviset käyttäjät istunnoissa URL-osoitteittain"; +$SelectTheNextLp = "Seuraava OP"; +$NoNotifications = "Ei ilmoituksia"; +$AllowsSkillsBySubCategories = "Salli taitojen osoittaminen alaluokittain"; +$ItAllowsTheAcquisitionOfSkillsBySubCategories = "Se mahdollistaa taitojen hankkimisen alaluokittain itsenäisesti."; +$SkillMinScore = "Vähimmäispisteet"; +$InLp = "Oppimispolussa"; +$ExportCoursesReports = "Kurssiraportit"; +$FillBlanksGlobal = "Täytä tyhjät kohdat tai lomake kokonaispistemäärällä"; +$MatchingGlobal = "Yhteensovittaminen kokonaispistemäärän avulla"; +$HotSpotGlobal = "Kuvavyöhykkeet yleispistemäärällä"; +$MatchingDraggableGlobal = "Täsmää vetämällä kokonaispistemäärän kanssa"; +$ProgressInSessionReport = "Edistyminen istuntoraportissa"; +$QuestionInOtherExercises = "Tämä kysymys on jaettu muiden harjoitusten kanssa, haluatko varmasti poistaa sen?"; +$SeeForTablet = "Näytä tabletille"; +$DisableSignature = "Poista allekirjoitus käytöstä"; +$EnableSignature = "Ota allekirjoitus käyttöön"; +$Sign = "Kirjaudu"; +$SignView = "Näytä allekirjoitus"; +$DownloadQr = "Allekirjoitus osallistumisesta lataamalla QR-koodi"; +$PasswordRequirementPassed = "Salasanavaatimus läpäisty"; +$PasswordRequirementPending = "Odottava salasanavaatimus"; +$NewPasswordRequirementMinXSpecials = "Vähintään %s erikoismerkkiä"; +$NewPasswordCannotBeSameAsCurrent = "Uusi salasana ei voi olla sama kuin nykyinen salasana."; +$FilterByClass = "Suodata luokan mukaan"; +$NotInAnyClass = "Ei missään luokassa"; +$XAccountDisabledByYAttempts = "Käyttäjänimen %s tili poistettiin käytöstä %d epäonnistuneen kirjautumisyrityksen jälkeen."; +$AnswerList = "Vastauslista"; +$EnterListOfAnswersOneAnswerByLine = "Kirjoita vastauslista (yksi vastaus riville)."; +$OrSelectCsvFileWithListOfAnswers = "Tai valitse CSV-tiedosto, jossa on luettelo vastauksista."; +$ConvertToMultipleAnswerDropdown = "Muunna usean vastauksen alasvetovalikoksi"; +$MultipleAnswerDropdown = "Usean vastauksen pudotusvalikko"; +$Highlighted = "Korostettu"; +$SeeHighlights = "Katso kohokohdat"; +$XAddedYRequired = "%d lisätty / %d vaadittu"; +$RequiredNumberOfItems = "Vaadittu määrä kohteita"; +$RequiredNumberOfComments = "Kommenttien vaadittu määrä"; +$UnmarkAsHighlighted = "Poista korostusmerkintä"; +$MarkAsHighlighted = "Merkitse korostettuna"; +$UpdatedDateX = "Päivitetty %s"; +$UpdatedOnDateXByUserY = "Päivitetty %s %s:n toimesta"; +$UpdatedDateXByUserY = "Päivitetty %s käyttäjän %s toimesta"; +$MarkedAsHighlighted = "Merkitty korostetuksi"; +$UnmarkedAsHighlighted = "Ei ole merkitty korostettuna"; +$PortfolioItemSetAsTemplate = "Portfoliokohde uudeksi mallipohjaksi"; +$PortfolioItemUnsetAsTemplate = "Portfoliokohdetta ei ole määritetty mallipohjaksi"; +$MultipleAnswerDropdownGlobal = "Globaali usean vastauksen pudotusvalikko"; +$PortfolioAlertNewCommentSubject = "[Portfolio] Uusi kommentti viestissä %s"; +$CoursePortfolioAlertNewCommentContent = "Uusi kommentti postauksessa %s %s kurssin portfoliosta. Katsoaksesi klikkaa tähän."; +$PortfolioCommentSetAsTemplate = "Portfoliokommentti uudeksi mallipohjaksi"; +$PortfolioCommentUnsetAsTemplate = "Portfolion kommenttisa ei ole asetettu mallipohjaksi"; +$MakeVisibleForTeachers = "Tee näkyväksi opettajille"; +$EmailToTeachersAndStudentWhenNewComment = "Sähköpostihälytys opettajille ja opiskelijalle uudesta kommentista Portfoliossa"; +$Tag = "Tunniste"; +$TagSaved = "Tunniste tallennettu"; +$TagDeleted = "Tunniste poistettu"; +$CommentByUserXInItemY = "Kommentoi %s paikassa %s"; +$PortfolioPostAddHelp = "Portfoliotyökalun esittely"; +$LearningPathLTI = "Pääsy LTI:n kautta oppimispolkuun"; +$UserXNotSubscribedToCourseX = "Käyttäjää %s ei ole rekisteröity kurssille %s."; +$OpenContentInNewTab = "Avaa sisältö uudessa välilehdessä"; +$ThereAreUsersOrCoursesUsingThisLanguageYouWantToDisableThisLanguageAndSetUsersAndCoursesWithTheDefaultPortalLanguage = "On käyttäjiä tai kursseja, jotka käyttävät tätä kieltä. Haluatko poistaa tämän kielen käytöstä ja asettaa kaikille näille käyttäjille ja kursseille portaalin oletuskielen?"; +$ClickToShowGraphs = "Näytä grafiikka klikkaamalla"; +$QuarterlyReport = "Neljännesvuosiraportti"; +$ReportQuarterlyUsers = "Yhdistettyjen rekisteröityjen käyttäjien määrä"; +$NumberOfUsersRegisteredTotal = "Rekisteröityjen käyttäjien määrä (yhteensä)"; +$NumberOfUsersRegisteredCompared = "Rekisteröityjen käyttäjien määrä (uudet verrattuna edelliseen vuosineljännekseen)"; +$NumberOfUsersWhoConnected = "Yhteyden muodostaneiden käyttäjien määrä"; +$IncompleteDataCurrentQuarter = "*: Kuluva vuosineljännes, tiedot puutteelliset"; +$QuarterXQY = "Q%s %s"; +$YoY = "YoY"; +$ReportQuarterlyCourses = "Olemassa olevien ja käytettävissä olevien kurssien määrä"; +$NumberOfExistingCoursesTotal = "Olemassa olevien kurssien määrä (yhteensä)"; +$NumberOfAvailableCourses = "Käytettävissä olevien kurssien lukumäärä (ei suljettuja tai piilotettuja, yhteensä)"; +$ReportQuarterlyHoursOfTraining = "Koulutustunteja"; +$NumberOfHoursTrainingFollowed = "Seurattujen koulutustuntien määrä (yhteensä)"; +$ReportQuarterlyNumberOfCertificatesGenerated = "Tuotettujen todistusten määrä"; +$NumberOfCertificatesGeneratedTotal = "Tuotettujen todistusten määrä (yhteensä)"; +$ReportQuarterlySessionsByDuration = "Istuntojen määrä kestoa kohti"; +$SessionsByDurationByQuarter = "Istunnot keston mukaan (neljännesvuosittain)"; +$ReportQuarterlyCoursesAndSessions = "Kurssien, istuntojen ja ilmottautuneiden käyttäjien määrä"; +$ListOfCoursesCodes = "Lista kurssikoodeista"; +$NumberOfSubscribedUsers = "Ilmoittautuneiden käyttäjien määrä"; +$NumberOfUsersWhoFinishedCourse = "Kurssin loppuun suorittaneiden käyttäjien määrä (arvosanakirjassa määritellyn mukaisesti)"; +$ListOfCoursesCodesAndSessions = "Luettelo kurssikoodeista ja istunnoista"; +$AllUsersIncludingInactiveIncluded = "*: Kaikki käyttäjät, myös ei-aktiiviset, ovat mukana"; +$ReportQuarterlyTotalDiskUsage = "Levyn kokonaiskäyttö"; +$EditPortfolioComment = "Muokkaa portfolion kommenttia"; +$ExerciseXNotDeleted = "Testiä '%s' ei ole poistettu"; +$RemoveUsers = "Poista käyttäjät"; +$SendFileToOtherUsers = "Lähetä tiedosto muille käyttäjille"; +$RemoveFileFromSelectedUsers = "Poista tiedosto valituilta käyttäjiltä"; +$SendOtherUsers = "Lähetä muille käyttäjille"; +$SendToUsers = "Lähetä käyttäjille"; +$DoNotIncludeUsers = "Älä sisällytä käyttäjiä"; +$ReportDoesNotIncludeListOfUsersNeitherForSessionNorForEachCourse = "Raportti ei sisällä käyttäjäluetteloa istuntokohtaisesti eikä kurssikohtaisesti."; +$IncludeExtraFields = "Sisällytä lisäkentät"; +$SkillLevelProfiles = "Taitotaso profiilit"; +$SkillLevels = "Taitotasot"; +$ImportCourseEvents = "Tuo kurssitapahtumia"; +$TagsCanBeUsed = "Tunnisteita voidaan käyttää"; +$ImportCourseAgendaReminderTitleDefault = "Kutsu ((course_title)) -kurssille"; +$ImportCourseAgendaReminderDescriptionDefault = "Hei ((user_complete_name)).\r\nSinun on suoritettava kurssi ((course_title)) ((date_start)) ja ((date_end)) välisenä aikana. Pääset kurssille täältä: ((course_link))."; +$XUserPortfolioItems = "%s:n portfoliokohteet"; +$Scored = "Pisteet"; +$Edited = "Muokattu"; +$Downloaded = "Ladattu"; +$YouCanOnlyCopyThisCourseToACourseYouTeach = "Voit kopioida tämän kurssin vain kurssille, jonka opettaja olet."; +$FirstLoginForceUsersToChangePassword = "Pakota käyttäjät vaihtamaan salasanansa, kun he kirjautuvat sisään ensimmäistä kertaa."; +$YourUsernameToAccessIsX = "Huomaa, että käyttäjätunnuksesi on %s."; +$InstructionsLostPasswordWithLinkX = "Huomautus: Jos et muista salasanaasi, klikkaa \"Unohditko salasanasi?\", syötä käyttäjätunnuksesi ja seuraa ohjeita."; +$RepeatBiweekly = "Kahden viikon välein"; +$RepeatXDays = "Joka x:s päivä"; +$NumberOfDays = "Päivien lukumäärä"; +$WriteAComment = "Jätä kommentti"; +$ProvideACommentFirst = "Ole hyvä ja jätä kommentti ensin"; +$QuizFinalizationDate = "Viimeinen tietokilpailun lopetuspäivä"; +$LpFinalizationDate = "Viimeinen lp:n päivä"; +$OnlyThoseThatCorrespondToAllTheSelectedCategories = "Oltava KAIKISSA valituissa luokissa"; +$ReportByAttempts = "Raportoi yritysten perusteella"; +$QuestionsTopic = "Kysymysten aihe"; +$QuestionsTopicHelp = "Kysymysten aihetta käytetään testin nimenä, ja se lähetetään tekoälygeneraattorille kysymysten luomiseksi tälle kurssille määritetyllä kielellä ja pyydetään, että ne luodaan Aiken-muodossa, jotta ne voidaan helposti tuoda tähän kurssiin."; +$AIQuestionsGenerator = "AI-kysymysten generaattori"; +$AIQuestionsGeneratorNumberHelper = "Useimmat tekoälygeneraattorit voivat palauttaa vain rajoitetun määrän merkkejä, ja usein organisaatiostasi veloitetaan palautettujen merkkien määrän perusteella, joten käytä niitä maltillisesti ja pyydä ensin pienempiä lukuja ja laajenna niitä sitten, kun saat varmuutta. Hyvä määrä ensimmäiselle testille on 3 kysymystä."; +$LPEndStepAddTagsToShowCertificateOrSkillAutomatically = "Käytä yhtä (tai useampaa) seuraavista ehdotetuista tunnisteista luodaksesi automaattisesti todistuksen tai taidon ja näyttääksesi ne tässä, kun oppilas pääsee tähän vaiheeseen, joka edellyttää, että kaikki muut vaiheet on ensin suoritettu loppuun."; +$ImportSessionAgendaReminderDescriptionDefault = "Hei ((user_complete_name)). Sinut on kutsuttu seuraamaan istuntoa ((session_name)) joka alkaa ((date_start)) ja loppuu ((date_end))."; +$ImportSessionAgendaReminderTitleDefault = "Kutsu istuntoon ((session_name))"; +$FillBlanksCombination = "Täytä tyhjät kohdat tai lomake tarkalla valinnalla"; +$MatchingCombination = "Täsmäytys tarkalla valinnalla"; +$HotSpotCombination = "Kuvavyöhykkeet tarkalla valinnalla"; +$MatchingDraggableCombination = "Sovita samanlaiset vetämällä tarkan valinnan avulla"; +$MultipleAnswerDropdownCombination = "Usean vastauksen pudotusvalikko tarkalla valinnalla"; +$LpAiGenerator = "Tekoälypohjainen oppimispolkujen generaattori"; +$LpAiTopic = "Aihe"; +$LpAiTopicHelp = "Kirjoita aihe, johon haluat AI-avustajan kehittävän oppimispolun. Mitä yksityiskohtaisempi aihe on, sitä tarkempi tulos on."; +$LpAiNumberOfItems = "Oppimispolun kohteiden määrä"; +$LpAiNumberOfItemsHelper = "Tämä on sivujen määrä, jonka haluat AI Helperin tuottavan oppimispolussasi. Oppimispolun jakaminen useisiin sivuihin, lukuihin, osioihin (miten ikinä haluat niitä kutsua) auttaa jäsentämään kurssin ja antaa sinulle myös mahdollisuuden jakaa sisältöä uudelleen parempaa esitystapaa varten."; +$LpAiWordsCount = "Sanojen lukumäärä"; +$LpAiWordsCountHelper = "Sanojen summittainen enimmäismäärä (merkkien määrä), jonka haluat saada sivua kohti. Suurempi määrä merkkejä tuottaa todennäköisesti parempaa sisältöä, mutta vie myös enemmän aikaa ja maksaa enemmän organisaatiollesi, joten käytä tätä arvoa varovasti."; +$OnlySelectedUsersWillSeeTheContent = "Vain valitut käyttäjät näkevät sisällön"; +$LeaveEmptyToEnableTheContentForEveryone = "Jätä tyhjäksi, jos haluat sallia sisällön kaikille"; +$ExportCoursesReportsComplete = "Vie kurssiraportit täydellisinä"; +$NumberOfQuestionsLimitedFromXToY = "Kysymysten määrä on rajoitettu %d:n ja %d:n välille."; +$AddTestAfterEachPage = "Lisää testi jokaisen sivun jälkeen"; +$HiddenButVisibleForMe = "Piilotettu mutta näkyvissä minulle"; +$EndOfLearningPath = "Päätelmä"; +$UnableToDeleteTempFile = "Tilapäistiedostoa ei voida käyttää"; +$DuplicatedUsers = "Päällekkäiset käyttäjät"; +$ThisReportOnlyListsUsersThatHaveTheSameFirstnameAndLastname = "Tässä raportissa listataan vain käyttäjät, joilla on sama etunimi ja sukunimi."; +$RemoveOldRelationshipsHelp = "Valitsemalla tämän valintaruudun poistat kaikki henkilöstöpäällikön suhteet muihin istuntoihin ja kursseihin. Jos haluat säilyttää nämä suhteet, ÄLÄ merkitse tätä ruutua."; +$ClassNameXDoesntExists = "Luokkaa nimeltä \"%s\" ei ole."; +$MaxSubscriptionsLeaveEmptyToNotLimit = "Tilausten sallittu enimmäismäärä. Jätä arvoksi 0, jos et halua rajoittaa sitä."; +$Subscriptions = "Tilaukset"; +$AllowSubscriptions = "Salli ilmoittautumiset"; +$MaxSubscriptions = "Tilausten enimmäismäärä"; +$NoMoreAccessible = "Ei enää saatavilla"; +$AccessibleFrom = "Saatavana alkaen"; +$ExportExerciseAllResults = "Vie kaikki harjoituksen tulokset"; +$ExportExerciseNoResult = "Tästä testistä ei löydetty tuloksia vientiä varten."; +$UserXChangedToYToCancelClickZ = "Käyttäjä %s on vaihdettu %s:ksi. Voit peruuttaa sen klikkaamalla tästä."; +$Exlearner = "Entinen oppilas"; +$FileSizeIsTooBig = "Tiedoston koko on liian suuri"; +$AnErrorOccured = "Tapahtui virhe"; +$EmailPicture = "Kuva otsikoille"; +$AddEmailPicture = "Lisää kuva otsikoihin"; +$AddEmailPictureComment = "Tätä kuvaa käytetään kurssin otsikossa, lähetetyissä sähköpostiviesteissä ja kurssin tuottamissa PDF-tiedostoissa. Kuvan suhde on 25:7. Voit rajata lataamasi kuvan."; +$DeleteEmailPicture = "Poista otsikoiden kuva"; +$AddPictureComment = "lopullisen kuvan on oltava 16:9-suhteessa, mutta voit rajata lataamasi kuvan."; +$ExportAllExercisesAllResults = "Kaikkien testien tulosten vienti"; +$ClickToViewDetails = "Klikkaa nähdäksesi lisätietoja"; +$CertificateOfAchievementHelp = "Tämä raportti koskee kaikkia käyttäjän alustatoimintoja."; +$DateFormatddmmyyyy = "dd/mm/yyyy"; +$ExportCertificateReport = "Todistusten antamista koskevan raportin vienti"; +$HideCareersHierarchy = "Piilota hierarkiat"; +$ShowCareersHierarchy = "Piilota hierarkiat"; +$ParentCareer = "Pääurakehitys"; +$CareerCannotBeDeletedAsItHasChildren = "Tätä uraa ei voi poistaa ennen kuin kaikki sen alaiset urat on poistettu tai siirretty toiselle uralle."; +$EmailUsedTwiceInImportFile = "Tämä sähköpostiosoite on jo toisen käyttäjän käytössä samassa tiedostossa."; +$NotificationInYourForums = "Sinulla on uusia viestejä seuraavien kurssien foorumeilla."; +$ExtraFieldIdComment = "Tämä tunniste on järjestelmän sisäinen, eikä se saa sisältää välilyöntejä eikä erikoismerkkejä. Sitä voidaan käyttää myös liitännäisistä suodattamaan elementtejä, joihin se on liitetty."; +$IncludeLastLogin = "Sisällytä viimeinen kirjautuminen"; +$DuplicatedUsersByMail = "Tuplakäyttäjät sähköpostin perusteella"; +$ThisReportOnlyListsUsersThatHaveTheSameEmail = "Tässä raportissa listataan vain käyttäjät, joilla on sama sähköpostiosoite."; +$CancelNotifyMe = "Lopeta ilmoitukset minulle"; +$EmptyExpirationDate = "Päättymispäivä ei voi olla tyhjä."; +$MailingTestNotSent = "Sähköpostia ei lähetetty. Olet ehkä antanut väärän osoitteen, osoite voi kuulua inaktiiviselle käyttäjälle tai sähköpostipalvelinta ei ole määritetty oikein (tarkista mail.conf.php-tiedosto)."; +$PasswordExpiredPleaseSetNewPassword = "Salasanasi on vanhentunut. Aseta uusi salasana ennen kuin jatkat."; +$CopyIframeCodeToIncludeExercise = "Kopioi alla oleva iframe-koodi sisällyttääksesi harjoituksen :"; +$MyMissingSignatures = "Puuttuvat allekirjoitukseni"; +$OnlyShowActiveUsers = "Näytä vain aktiiviset käyttäjät"; +$UpdateCourseListXMLCSV = "Päivitä kurssiluettelo"; +$CodeIsRequired = "Koodi vaaditaan"; +$CourseCodeDoesNotExist = "Tätä kurssikoodia ei ole olemassa"; +$DuplicateCode = "Koodin kopio"; +$CoursesUpdatedSuccessfully = "Kurssit päivitetty onnistuneesti"; +$UpdateFailedForCourses = "Päivitys epäonnistui seuraavien kurssien osalta"; +$HoursMinutesSeconds = "%02d h %02d m %02d s"; +$IfYourLPsAreScormsYouShouldSelectThemFromTheScorms = "Jos oppimispolut ovat scorm-paketteja, sinun on valittava vastaava kansio SCORM-osiosta"; +$QuestionsWithNoAutomaticCorrection = "Kysymykset ilman automaattista korjausta"; ?> \ No newline at end of file diff --git a/main/lang/french/trad4all.inc.php b/main/lang/french/trad4all.inc.php index 0cf9193505..812907dae3 100644 --- a/main/lang/french/trad4all.inc.php +++ b/main/lang/french/trad4all.inc.php @@ -9008,4 +9008,9 @@ $CreateExport = "Créer un export"; $MoodleExportAdminIDComment = "Moodle requiert une identification de l'utilisateur pour la stocker au sein de fichiers XML qui font partie du format .mbz. Merci de bien vouloir fournir un numéro interne (nombre entier) de l'utilisateur qui exporte le cours, ou d'un utilisateur de notre système, qui sera désigné (s'il y a correspondance) comme le propriétaire des ressources importées sur l'autre système. Si vous avez encore des doutes, indiquez simplement '1' et donnez des données fictives."; $DropboxVulnerabilityWarning = "Ne téléchargez que des fichiers envoyés par des personnes en qui vous avez confiance. Dans le doute, merci d'utiliser un programme anti-virus sur votre ordinateur pour réduire les risques pour vos données."; +$SessionExpiredAt = "Session expirée à"; +$DueToInactivityTheSessionIsGoingToClose = "Dû à votre inactivité, la session se fermera dans"; +$KeepGoing = "Rester connecté"; +$SessionIsClosing = "Votre session est en cours de fermeture"; +$CannotChangeVisibilityOfBaseCourseResourceX = "La visibilité de %s du cours de base ne peut être changée depuis une session."; ?> \ No newline at end of file diff --git a/main/lang/german/trad4all.inc.php b/main/lang/german/trad4all.inc.php index 38547d34a3..4e294ca7cb 100644 --- a/main/lang/german/trad4all.inc.php +++ b/main/lang/german/trad4all.inc.php @@ -5953,6 +5953,7 @@ $ToAttend = "zu beachten"; $AllUsersAreAutomaticallyRegistered = "Alle Benutzer werden automatisch als Teilnehmer eingeschrieben"; $AssignCoach = "zuordnen"; $YourAccountOnXHasJustBeenApprovedByOneOfOurAdministrators = "Ihr Zugang zu %s wurde soben von einem unserer Administratoren freigeschlaltet."; +$StudentHadEnoughSkills = "Ein Schüler hat die Anzahl der Teilfertigkeiten erworben, die zur Validierung der Mutterfertigkeit erforderlich sind."; $Off = "Aus"; $WebServer = "Webserver"; $NotInserted = "Nicht eingefügt"; @@ -7979,6 +7980,7 @@ $SendEmailToTeacherWhenStudentEndQuizOnlyIfOralQuestion = "E-Mail an den Tutor s $TempScoreXQuestionsNotCorrectedYet = "Temporäre Auswertung: %s offene Frage(n) noch nicht korrigiert."; $GoToSurvey = "Zur Umfrage"; $OralExpressionHelpText = "Du kannst während der Aufnahme auf « Aufnahme anhalten » klicken. Wenn du nicht zufrieden bist, nimm dich erneut auf. Dies wird die vorherige Aufnahme überschreiben. Zufrieden? Um deine Aufnahme zu senden, klick einfach auf « Übung beenden »."; +$StudentXHadEnoughSkillsToGetSkillXToAssignClickHereX = "%s hat genügend Dimensionen validiert, um die Kompetenz %s zu bekommen. Um die Kompetenz zuzuweisen, bitten hier klicken: %s"; $MyGeneralCertificate = "Mein Zertifikat"; $BossAlertMsgSentToUserXTitle = "Follow-up Nachricht über Lernende %s"; $BossAlertUserXSentMessageToUserYWithLinkZ = "Hallo,

    diff --git a/main/lang/hebrew/trad4all.inc.php b/main/lang/hebrew/trad4all.inc.php index 8aed7ba894..18471df5e9 100644 --- a/main/lang/hebrew/trad4all.inc.php +++ b/main/lang/hebrew/trad4all.inc.php @@ -6171,7 +6171,7 @@ $MySocialGroups = "הקבוצות החברתיות שלי"; $SocialGroups = "קבוצות חברתיות"; $CreateASocialGroup = "צור קבוצת חברה"; $StatsUsersDidNotLoginInLastPeriods = "לא היית מחובר כבר זמן מה"; -$LastXMonths = "%d חודשים אחרונים"; +$LastXMonths = "ב-%d החודשים האחרונים"; $NeverConnected = "מעולם לא התחברתם"; $EnableAccessibilityFontResizeTitle = "תכונת נגישות לשינוי גודל גופן"; $EnableAccessibilityFontResizeComment = "הפעל אפשרות זו כדי להציג קבוצה של אפשרויות שינוי גודל גופן בצד ימין למעלה של הקמפוס שלך. זה יאפשר לכבדי ראייה לקרוא את תוכן הקורס שלהם ביתר קלות."; diff --git a/main/lang/slovenian/trad4all.inc.php b/main/lang/slovenian/trad4all.inc.php index 4de0966619..18a8b170b5 100644 --- a/main/lang/slovenian/trad4all.inc.php +++ b/main/lang/slovenian/trad4all.inc.php @@ -29,10 +29,10 @@ $CotangentCot = "Kotanges:\t\t\tcot(x)"; $HyperbolicCotangentCoth = "Hiperbolični kotanges:\t\tcoth(x)"; $HelpCookieUsageValidation = "Za delovanje te strani in beleženje statistike uporabe vsebine, platforma uporablja piškotke. Nastavitve obravnave piškotkov v brskalniku lahko spremenite v brskalniku samem. Za več informacij o piškotkih obiščite stran About Cookies."; $YouAcceptCookies = "Z nadaljno rabo te strani, predpostavimo, se strinjate z uporabo piškotkov na teh stranem."; -$TemplateCertificateComment = "Primer oblike certifikata"; -$TemplateCertificateTitle = "Certifikat"; +$TemplateCertificateComment = "Primer oblike potrdila"; +$TemplateCertificateTitle = "Potrdilo"; $ResultsVisibility = "Vidnost rezultatov"; -$DownloadCertificate = "Prenesi certifikat"; +$DownloadCertificate = "Prenesi potrdilo"; $PortalActiveCoursesLimitReached = "Oprostite, ta namestitev uporablja aktivno omejitev tečajev, ki je bila sedaj dosežena. Še vedno lahko kreirate nov tečaj, vendar le v primeru, da skrijete/onemogočite vsaj enega izmed aktivnih tečajev. Za to je potrebno v upravljalnem razdelku aktivnega tečaja spremeniti vidnost tečaja. Nato lahko znova skušate ustvariti nov tečaj. Za povečanje največjega števila aktivnih tečajev v okviru te namestitve platforme, se obrnite na upravitelja platforme oz. vašega ponudnika storitev namestitve (hosting), ali če je možno, izvedite nadgraditev na zmožnejšo storitveno ponudbo (hosting plan)."; $WelcomeToInstitution = "Dobrodošli v platformo %s"; $WelcomeToSiteName = "Dobrodošli v %s"; @@ -259,6 +259,24 @@ $AreYouSureDeleteTestResultBeforeDateD = "Ste prepričani, da želite počistiti $CleanStudentsResultsBeforeDate = "Počisti vse rezultate, dobljene pred izbranim datumom"; $HGlossary = "Pomoč: besednjak (slovar)"; $GlossaryContent = "To orodje omogoča kreiranje izrazov, besed, terminov, in njihovih opisov, ki so lahko nato uporabljeni v orodju dokumentov."; +$ForumContent = "Forum je asinhrono avtorsko razpravljalno orodje pisnih del oz. izdelkov. Za razliko od elektronske pošte je forum +namenjen javni, pol-javni razpravi na določeno temo, ali pa je omejen na izbrano skupino razpravljalcev.

    + +Za uporabo foruma znotraj platforme Chamilo, potrebujejo uporabniki zgolj svoj brskalnik.

    + +Organizacijo forumov pričnete s klikom na orodje Forumi. Razprave so organizirane hierarhično +glede na naslednjo strukturo: Kategorija > Forum > Tema > Objava .

    +Da bi člani lahko sodelovali v forumu in the forum urejeno in učinkovito, je bistvenega pomena, da ustvarite prvi primer kategorije in forumov; nato je pričakovati od udeležencev, da bodo ustvarili teme in objave. Privzeto forum vsebuje eno samo (javno) kategorijo, primer teme in znotraj primer objave. Dodate lahko nove forume kategoriji, spremenite njen naslov ali kreirate nove kategorije znotraj katerih lahko kreirate nove forume. (Ne mešajte kategorij in forumov; pomnite pa, da je kategorija, ki ne vsebuje forumov kot +taka nekoristna in ne bo prikazana.)

    + +Opis foruma lahko vsebuje seznam njegovih članov, definicijo njegovega namena, opredelitev cilja, teme, itd.

    + +Forum skupine naj bo kreiran preko orodja Skupine, kjer se lahko odločite, ali bo forum privaten za člane skupine ali javen, s sočasnim zagotavljanjem lokacije za skupno rabo skupin dokumentov.

    + +Namig za poučevanje: Učni forum ni popolnoma enak forumom, ki jih običajno uporabljamo na spletu:
    +recimo, učečim je onemogočeno spreminjanje njihovih objav, ko jih enkrat dokončno objavijo, ker se tečaj logično arhivira za to, da je mogoče slediti temu, kar je bilo izrečeno/zapisanov preteklosti.
    +Nadalje, Chamilo forumi omogočajo nekaj specifičnih rab v zgolj učne namene:
    +npr., nekateri učitelji/trenerji objavljajo poprave/korekcije direktno v objave forumov kot: učeči se zaprosi za objavo poročila direktno na forum, učitelj objavo popravi/uredi z uporabo orodja Uredi (rumeno pisalo) in ga označi z uporabo grafičnega urejevalnika (barva, podčrtavanje, idr...) z namenom: drugi učeči imajo korist od vpogleda v popravke izdelka nekoga izmed njih.
    Pomnite, da se enak postopek lahko uporabi tudi med samimi učečimi, kjer kolegi izvedejo korekcijo drugemu kolegu. Vendar bo tak način zahteval prepis (kopiraj/prilepi) popravljane vsebine, ker pač učeči ne morejo urejati/popravljati objav drugih učečih."; $HForum = "Pomoč: forum (diskusije)"; $LoginToGoToThisCourse = "Prosim da se prijavite za dostop do tega tečaja"; $AreYouSureToEmptyAllTestResults = "Počistim vse rezultate tečajnikov v vseh testih?"; @@ -2325,7 +2343,7 @@ $NoFriendsInYourContactList = "Ni prijateljev v tvojem seznamu kontaktov"; $TryAndFindSomeFriends = "Poskusi poiskati nekaj prijateljev"; $SendInvitation = "Pošlji vabilo"; $SocialInvitationToFriends = "Vabilo za pridružitev k moji skupini prijateljev"; -$MyCertificates = "Moji certifikati"; +$MyCertificates = "Moja potrdila"; $NewGroupCreate = "Tvorba novih skupin"; $GroupCreation = "Tvorba novih skupin"; $NewGroups = "nove skupine"; @@ -3128,7 +3146,7 @@ $ModifyQuestion = "Shrani vprašanje"; $Example = "Primer"; $CheckAll = "Izberi vse"; $NbAnnoucement = "Obvestilo"; -$DisplayCertificate = "Prikaži certifikat"; +$DisplayCertificate = "Prikaži potrdilo"; $Doc = "Tečaj"; $PlataformAdmin = "Admin portala"; $Groups = "Skupine"; @@ -3633,7 +3651,7 @@ $ConversionFailled = "Pretvorba je bila neuspešna"; $AlreadyExists = "Že obstaja"; $TheNewWordHasBeenAdded = "Nova beseda je bila dodana"; $CommentErrorExportDocument = "Nekateri dokumenti so prekompleksni, da bi se jih s pretvornikom dokumentov dalo obravnavati avtomatično"; -$YourGradebookFirstNeedsACertificateInOrderToBeLinkedToASkill = "Certifikat redovalnice je potreben, če želite redovalnico povezati s spretnostmi"; +$YourGradebookFirstNeedsACertificateInOrderToBeLinkedToASkill = "Potrdilo redovalnice je potrebno, če želite redovalnico povezati s spretnostmi"; $DataType = "Tip podatka"; $Value = "Vrednost"; $System = "Sistem"; @@ -3691,7 +3709,7 @@ $Landscape = "Ležeče"; $FilterCategory = "Filtriraj kategorijo"; $ScoringUpdated = "Rezultati so bili ažurirani"; $CertificateWCertifiesStudentXFinishedCourseYWithGradeZ = "%s potrjuje, da je\n\n%s\n\nuspešno zaključil tečaj\n\n'%s'\n\nz oceno\n\n'%s'"; -$CertificateMinScore = "Minimalen rezultat certifikata"; +$CertificateMinScore = "Minimalen rezultat za pridobitev potrdila"; $InViMod = "Kategorija je vidna"; $ViewResult = "Poglej rezultate"; $NoResultsInEvaluation = "Trenutno v ocenjevanju ni rezultatov"; @@ -3723,8 +3741,8 @@ $CreateAllCat = "Ustvari vse kategorije tečaja"; $AddAllCat = "Dodane so bile vse kategorije"; $StatsStudent = "Statistika za"; $Results = "Rezultati in povratne informacije"; -$Certificates = "Certifikati"; -$Certificate = "Certifikat"; +$Certificates = "Potrdila"; +$Certificate = "Potrdilo"; $ChooseUser = "Izberi uporabnike za to ocenjevanje"; $ResultEdited = "Rezultat je bil ažuriran"; $ChooseFormat = "Izberi format"; @@ -3766,15 +3784,15 @@ $ToViewGraphScoreRuleMustBeEnabled = "Za ogled grafa mora biti pravilo ocenjevan $GradebookPreviousWeight = "Predhodne uteži resursov"; $AddAssessment = "Dodaj to aktivnost k ocenjevanju"; $FolderView = "Domača stran ocenjevanja"; -$GradebookSkillsRanking = "Težavnost"; +$GradebookSkillsRanking = "Ocena"; $SaveScoringRules = "Shrani pravila ocenjevanja"; -$AttachCertificate = "Pripni certifikat"; -$GradebookSeeListOfStudentsCertificates = "Poglej seznam pridobljenih certifikatov"; -$CreateCertificate = "Ustvari certifikat"; -$UploadCertificate = "Naloži certifikat"; -$CertificateName = "Naziv certifikata"; -$CertificateOverview = "Pregled certifikatov"; -$CreateCertificateWithTags = "Ustvari certifikat s to oznako"; +$AttachCertificate = "Pripni potrdilo"; +$GradebookSeeListOfStudentsCertificates = "Poglej seznam pridobljenih potrdil"; +$CreateCertificate = "Ustvari potrdilo"; +$UploadCertificate = "Naloži potrdilo"; +$CertificateName = "Naziv potrdila"; +$CertificateOverview = "Pregled potrdil"; +$CreateCertificateWithTags = "Ustvari potrdilo s to oznako"; $ViewPresenceSheets = "Poglej seznam prisotnosti"; $ViewEvaluations = "Poglej ocenjevanja"; $NewPresenceSheet = "Nova lista prisotnosti"; @@ -3783,18 +3801,18 @@ $TitlePresenceSheet = "Naslov aktivnosti"; $PresenceSheetCreatedBy = "Listo prisotnosti ustvaril"; $SavePresence = "Shrani listo prisotnosti in nadaljuj s korakom 2"; $NewPresenceStep2 = "Nova lista prisotnosti: korak 2/2 : označite prisotne"; -$NoCertificateAvailable = "Nobenega certifikata ni na voljo"; -$SaveCertificate = "Shrani certifikat"; -$CertificateNotRemoved = "Certifikat ne more biti odstranjen"; -$CertificateRemoved = "Certifikat je bil odstranjen"; +$NoCertificateAvailable = "Nobenega potrdila ni na voljo"; +$SaveCertificate = "Shrani potrdilo"; +$CertificateNotRemoved = "Potrdila ni možno odstraniti"; +$CertificateRemoved = "Potrdilo je bilo odstranjeno"; $NoDefaultCertificate = "Ni privzet"; -$DefaultCertificate = "Privzeti certifikat"; -$PreviewCertificate = "Predogled certifikata"; -$IsDefaultCertificate = "Certifikat je nastavljen kot privzeti"; +$DefaultCertificate = "Privzeto potrdilo"; +$PreviewCertificate = "Predogled potrdila"; +$IsDefaultCertificate = "Potrdilo je nastavljeno kot privzeto"; $ImportPresences = "Uvozi prisotnost/prisotne"; $AddPresences = "Dodaj prisotnost/prisotne"; $DeletePresences = "Odstrani prisotnost"; -$GradebookListOfStudentsCertificates = "Seznam certifikatov tečajnikov iz redovalnice"; +$GradebookListOfStudentsCertificates = "Seznam potrdil tečajnikov iz redovalnice"; $NewPresence = "Nova prisotnost"; $EditPresence = "Uredi prisotnost"; $SavedEditPresence = "Shrani ažurirano prisotnost"; @@ -3812,8 +3830,8 @@ $ExampleXLSFile = "Primer Excel (XLS) datoteke"; $NoResultsInPresenceSheet = "Ni registrirane prisotnosti"; $EditPresences = "Spremeni prisotnost"; $TotalWeightMustNotBeMoreThan = "Skupna utež ne more biti več kot"; -$ThereIsNotACertificateAvailableByDefault = "Noben privzeti certifikat ni na voljo"; -$CertificateMinimunScoreIsRequiredAndMustNotBeMoreThan = "Minimalen rezultat za doseganje certifikata je zahtevan in ne sme biti več kot"; +$ThereIsNotACertificateAvailableByDefault = "Nobeno privzeto potrdilo ni na voljo"; +$CertificateMinimunScoreIsRequiredAndMustNotBeMoreThan = "Minimalen rezultat za doseganje potrdila je zahtevan in ne sme biti več kot"; $CourseProgram = "Opis tečaja"; $ThisCourseDescriptionIsEmpty = "Ta tečaj še ni opisan"; $Vacancies = "Prosto"; @@ -4550,7 +4568,7 @@ $TemplateTitleGlossary = "Besednjak"; $TemplateTitleGlossaryDescription = "Seznam izrazov uporabljenih v razdelku"; $TemplateTitleEvaluation = "Ocenjevanje"; $TemplateTitleEvaluationDescription = "Ocenjevanje"; -$TemplateTitleCertificate = "Certifikat ob zaključku"; +$TemplateTitleCertificate = "Potrdilo ob zaključku"; $TemplateTitleCertificateDescription = "Za na konec učne poti"; $TemplateTitleCheckList = "Kontrolni seznam"; $TemplateTitleCourseTitle = "Naslov tečaja"; @@ -4837,7 +4855,7 @@ $MailTitle = "Predmet e-sporočila"; $InvitationsSend = "vabil poslanih."; $SurveyDeleted = "Vprašalnik je bil odstranjen."; $NoSurveysSelected = "Noben vprašalnik ni bil izbran."; -$NumberOfQuestions = "Vprašanj"; +$NumberOfQuestions = "Vprašanja"; $Invited = "Vabljeni"; $SubmitQuestionFilter = "Uveljavi filter"; $ResetQuestionFilter = "Razveljavi filter"; @@ -5723,7 +5741,7 @@ $SkillImportNoName = "Ime veščine ni definirano"; $SkillImportNoParent = "Nadrejena veščina ni nastavljena"; $SkillImportNoID = "Identiteta (ID) veščine ni definirana"; $CourseAdvance = "Napredek tečaja"; -$CertificateGenerated = "Generiran certifikat"; +$CertificateGenerated = "Generirano potrdilo"; $CountOfUsers = "Št. uporabnikov"; $CountOfSubscriptions = "Št. vpisov v tečaje"; $EnrollToCourseXSuccessful = "Vpisan ste v tečaj: %s"; @@ -5863,7 +5881,7 @@ $NumberOfCoursesPrivate = "Št. privatnih tečajev"; $NumberOfCoursesClosed = "Št. zaprtih tečajev"; $NumberOfCoursesTotal = "Skupno število tečajev"; $NumberOfUsersActive = "Št. aktivnih uporabnikov"; -$CountCertificates = "Št. certifikatov"; +$CountCertificates = "Št. potrdil"; $AverageHoursPerStudent = "Povp. ur/tečajnika"; $CountOfSubscribedUsers = "Št. vpisanih uporabnikov"; $TrainingHoursAccumulated = "Akumulacija ur usposabljanj/poučevanj"; @@ -5877,9 +5895,10 @@ $ThisValueCantBeChanged = "Te vrednosti ni moč spremeniti"; $ThisValueIsUsedInTheCourseURL = "Ta vrednost se uporablja v URL tečaja"; $TotalAvailableUsers = "Skupaj razpoložljivih uporabnikov"; $LowerCaseUser = "uporabnik"; -$GenerateCertificates = "Generiraj certifikate"; -$ExportAllCertificatesToPDF = "Izvozi vse certifikate v PDF"; -$DeleteAllCertificates = "Odstrani vse certifikate"; +$GenerateCertificates = "Generiraj potrdila"; +$ExportAllCertificatesToPDF = "Izvozi vsa potrdila v PDF"; +$DeleteAllCertificates = "Odstrani vsa potrdila"; +$QuarterlyReport = "Četrtletno poročilo"; $dateFormatLongNoDay = "%d %B %Y"; $dateFormatOnlyDayName = "%A"; $ReturnToCourseList = "Povratek na seznam tečajev"; @@ -5961,6 +5980,7 @@ $YourAccountOnXHasJustBeenApprovedByOneOfOurAdministrators = "Vaš uporabniški $Off = "Off"; $WebServer = "Spletni strežnik"; $NotInserted = "Ni vstavljeno"; +$StudentBoss = "Nadrejeni (n+1)"; $EnableMathJaxComment = "Omogoči MathJax urejevalnik matematičnih formul."; $YouCanNowLoginAtXUsingTheLoginAndThePasswordYouHaveProvided = "Sedaj se lahko prijavite v %s z uporabniškim imenom in geslom, ki ste ga podali pri registraciji."; $HaveFun = "Veliko uspeha,"; @@ -6135,9 +6155,9 @@ Uporabnikova mapa in vsa njena vsebina je privzeto skrita vsem ostalim tečajnik Še več, orodje dokumentov je sinhronizirano z upravljalcem datotek urejevalnika besedila platforme, tako da se spremembe v enem izmed njih manifestirajo tudi v drugem.

    Kot taka, uporabniška mapa ni zgolj mesto za odlaganje datotek, temveč postaja upravljalec dokumentov tečajnikov med trajanjem tečaja. In, ne pozabite, da vsak uporabnik lahko kopira vse datoteke, iz poljubne mape orodja dokumentov (če je, ali pa če ni, lastnik) v lasten portfolij ali osebne dokumente socialnega omrežja, ki mu je omogočen/dostopen."; $HelpFolderChat = "INFORMACIJA, VIDNA ZGOLJ UČITELJEM:\nTa mapa vsebuje vse seje, ki so bile odprte v klepetu. Čeprav je seje klepeta lahko trivialna, pa je občasno njena vsebina lahko takšna, da lahko služi kot del izobraževalnega procesa, npr. kot dodaten vir, dokument, ... Da bi sejo vključili v vire tečaja brez spremembe vidljivosti te mape, naredite vidno zgolj datoteko in naredite nanjo povezavo iz elementa platforme, kjer boste ta vir uporabili."; -$HelpFolderCertificates = "INFORMACIJA VIDNA ZGOLJ UČITELJEM:\nTa mapa vsebuje različne predloge certifikatov, ki se izdajajo kot rezultat uspešnosti izvedbe (dela) učnega procesa.Ni priporočljivo, da to mapo naredite vidno vsem uporabnikom."; +$HelpFolderCertificates = "INFORMACIJA VIDNA ZGOLJ UČITELJEM:\nTa mapa vsebuje različne predloge potrdil, ki se izdajajo kot rezultat uspešnosti izvedbe (dela) učnega procesa.Ni priporočljivo, da to mapo naredite vidno vsem uporabnikom."; $DestinationDirectory = "Ciljna mapa"; -$CertificatesFiles = "Certifikati"; +$CertificatesFiles = "Potrdila"; $ChatFiles = "Zgodovina konverzacije iz klepeta"; $Flash = "Flash"; $Video = "Video"; @@ -6625,7 +6645,7 @@ $StartTest = "Prični test"; $ExportAsDOC = "Izvozi kot .doc"; $Wrong = "Narobe"; $Certification = "Certificiranje"; -$CertificateOnlineLink = "Povezava na certifikat"; +$CertificateOnlineLink = "Povezava na potrdilo"; $NewExercises = "Novi testi"; $MyAverage = "Moje povprečje"; $AllAttempts = "Vsi poskusi"; @@ -6730,7 +6750,7 @@ $PersonalCalendar = "Osebni koledar"; $SkillsTree = "Kompetenčno drevo"; $Skills = "Kompetence"; $SkillsProfile = "Kompetenčni profil"; -$WithCertificate = "S certifikatom"; +$WithCertificate = "S potrdilom"; $AdminCalendar = "Koledar upravitelja"; $CourseCalendar = "Koledar tečaja"; $Reports = "Poročila"; @@ -6757,7 +6777,7 @@ $ViewSkillsTree = "Poglej kompetenčno drevo"; $MySkills = "Moje kompetence"; $GroupParentship = "Starševstvo skupine"; $NoParentship = "Brez starševstva"; -$NoCertificate = "Ni certifikatov"; +$NoCertificate = "Ni potrdil"; $AllowTextAssignments = "Dovoli izdelku, da je upravljan preko spletnega urejevalnika"; $SeeFile = "Poglej datoteko"; $ShowDocumentPreviewTitle = "Prikaži predogled dokumenta"; @@ -7019,11 +7039,11 @@ $AllowSkillsToolTitle = "Dovolji rabo orodja Spretnosti"; $AllowSkillsToolComment = "Uporabniki dobijo vpogled v dosežene spretnosti v socialnem omrežju in v bloku spretnosti na domači strani."; $UnsubscribeFromPlatform = "Če se želite izpisati iz tega kampusa in s stem odstraniti vse vaše informacije iz naših podatkovnih baz, kliknite gumb spodaj in potrdite zahtevo."; $UnsubscribeFromPlatformConfirm = "Da, želim odstraniti ta račun. Vsi podatki, povezani z računom se bodo odstranili s strežnika in vstop v portal s tem računom ne bo več mogoč. Ponovna prijava je možna zgolj z novim uporabniškim računom."; -$AllowPublicCertificatesTitle = "Dovoli javne certifikate"; -$AllowPublicCertificatesComment = "Uporabniški certifikati so vidni tudi neregistriranim uporabnikom."; +$AllowPublicCertificatesTitle = "Dovoli javna potrdila"; +$AllowPublicCertificatesComment = "Uporabniška potrdila so vidna tudi neregistriranim uporabnikom."; $DontForgetToSelectTheMediaFilesIfYourResourceNeedIt = "Ne pozabite izbrati tudi vseh pripadajočih medijskih datotek, če jih vaš vir potrebuje."; -$NoStudentCertificatesAvailableYet = "Trenutno ni na voljo noben certifikat tečajnikov. Pomnite, da mora tečajnik za generiranje certifikata dostopiti do orodja Naloge in klikniti na ikono certifikata. Ikona je dostopna zgolj v primeru, da je tečajnik izpolnil kriterije za doseganje certifikata."; -$CertificateExistsButNotPublic = "Zahtevan certifikat obstaja, vendar ni javen. Prijavite se, če si ga želite ogledati."; +$NoStudentCertificatesAvailableYet = "Trenutno ni na voljo nobeno potrdilo tečajnikov. Pomnite, da mora tečajnik za generiranje potrdila dostopiti do orodja Naloge in klikniti na ikono potrdila. Ikona je dostopna zgolj v primeru, da je tečajnik izpolnil kriterije za doseganje potrdila"; +$CertificateExistsButNotPublic = "Zahtevano potrdilo obstaja, vendar ni javno. Prijavite se, če si ga želite ogledati."; $Default = "Privzeto"; $CourseTestWasCreated = "Testni tečaj je bil ustvarjen"; $NoCategorySelected = "Nobena kategorija ni izbrana"; @@ -7149,7 +7169,7 @@ $TimelineItem = "Element"; $Listing = "Seznam"; $CourseRssTitle = "RSS tečaja"; $CourseRssDescription = "RSS vir za obveščanje o vseh tečajih"; -$AllowPublicCertificates = "Tečajnikovi certifikati so javni"; +$AllowPublicCertificates = "Tečajnikova potrdila so javna"; $GlossaryTermUpdated = "Izraz je bil ažuriran"; $DeleteAllGlossaryTerms = "Odstrani vse izraze"; $PortalHomepageEdited = "Domača stran portala je bila ažurirana"; @@ -7207,9 +7227,9 @@ $InternalLogin = "Notranja prijava"; $AlreadyLoggedIn = "Ste že prijavljeni."; $Draggable = "Urejanje zaporedja"; $Incorrect = "Nepravilno"; -$YouNotYetAchievedCertificates = "Trenutno še niste pridobili nobenega certifikata. Nadaljujte z izvajanjem učne poti za njegovo pridobitev."; -$SearchCertificates = "Poišči certifikate"; -$TheUserXNotYetAchievedCertificates = "Tečajnik %s še ni pridobil nobenega certifikata"; +$YouNotYetAchievedCertificates = "Trenutno še niste pridobili nobenega potrdila. Nadaljujte z izvajanjem učne poti za njegovo pridobitev."; +$SearchCertificates = "Poišči potrdila"; +$TheUserXNotYetAchievedCertificates = "Tečajnik %s še ni pridobil nobenega potrdila"; $CertificatesNotPublic = "Potrdila niso javno dostopna"; $MatchingDraggable = "Ujemanje z razporejanjem"; $ForumThreadPeerScoring = "Ocena niti s strani bralcev"; @@ -7279,14 +7299,14 @@ $CourseImagesInCoursesListTitle = "Uporabniško definirane ikone v tečajih"; $CourseImagesInCoursesListComment = "Uporabi slike iz tečaja kot ikono tečaja (namesto privzete ikone - zelene table)."; $StudentPublicationSelectionForGradebookTitle = "Naloge, ki pridejo v poštev za ocenjevanje v redovalnici."; $StudentPublicationSelectionForGradebookComment = "V orodju Naloge lahko tečajniki naložijo več kot eno datoteko. V takem primeru je potrebno določiti, katera izmed njih je tista, ki se upošteva pri ocenjevanju v redovalnici. Izbira je odvisna od vaše uporabljene metodologije. Uporabite 'prva' (upoštevanje časovnosti, prvi rezultat je relevanten rezultat,...) oz. 'zadnja' (upošteva sodelovanje, adaptivno delo,...)"; -$FilterCertificateByOfficialCodeTitle = "Certifikati filtrirani po uradni kodi"; -$FilterCertificateByOfficialCodeComment = "Dodaj filter glede tečajnikove uradne kode v seznamu certifikatov"; +$FilterCertificateByOfficialCodeTitle = "Potrdila filtrirana po uradni kodi"; +$FilterCertificateByOfficialCodeComment = "Dodaj filter glede tečajnikove uradne kode v seznamu potrdil"; $MaxCKeditorsOnExerciseResultsPageTitle = "Maks. št. WYSIWYG urejevalnikov pri popravljanju testov"; $MaxCKeditorsOnExerciseResultsPageComment = "Večje število vprašanj v testih lahko zaradi nalaganja velikega števila WYSIWYG urejevalnikov povzroči, da se okno popravljalnika pri dodajanju komentarjev na odgovore odziva zelo počasi. Opcija omogoča, da se število sočasno aktivnih urejevalnikov omeji na določeno število. Nastavitev števila na vrednost 5 povzroči, da se stran hitreje naloži, hkrati pa povzroči, da pri 6.,7,... urejanju ostanete brez WYSIWYG urejevalnika (zgolj vnosno polje brez možnosti vizualnega urejanja)."; $DocumentDefaultOptionIfFileExistsTitle = "Privzeti način nalaganja dokumentov"; $DocumentDefaultOptionIfFileExistsComment = "Privzeta metoda za nalaganje v področje dokumentov tečaja. Lahko se določi/spremeni v trenutku nalaganja datoteke ob vsakokratnem nalaganju, ta vrednost pa predstavlja zgolj privzeto splošno vrednost."; $GradebookCronTaskGenerationTitle = "Avtomatično generiranje certifikatov ob WS klicu"; -$GradebookCronTaskGenerationComment = "Ko je omogočena in v primeru uporabe spletne storitve WSCertificatesList, ta možnost zagotavlja generiranje certifikatov uproabnikov, ko ti dosežejo zahtevan rezultatski prag definiran v redovalnici za vse tečaje in seje (proces je relativno potrošen glede resursov strežnika)"; +$GradebookCronTaskGenerationComment = "Ko je omogočena in v primeru uporabe spletne storitve WSCertificatesList, ta možnost zagotavlja generiranje potrdil uporabnikov, ko ti dosežejo zahtevan rezultatski prag definiran v redovalnici za vse tečaje in seje (proces je relativno potrošen glede resursov strežnika)"; $OpenBadgesBackpackUrlTitle = "OpenBadge URL nahrbtnika"; $OpenBadgesBackpackUrlComment = "URL strežnika OpenBadge nahrbtnika, ki bo privzeto uporabljen za vse uporabnike, ki čakajo na izvoz svojih OpenBadge značk. Privzeto je to zastonjkarski Mozilla Foundation backpack repozitorij na naslovu: http://backpack.openbadges.org"; $CookieWarningTitle = "Piškotki: obvestilo o zasebnosti"; @@ -7307,10 +7327,10 @@ $SessionAdminPermissionsLimitTitle = "Omeji dovoljenja za upravitelje seje"; $SessionAdminPermissionsLimitComment = "Če je možnost omogočena, bosta upraviteljem seje na voljo zgolj bloka: 'Uporabniki' s funkcijo 'Dodaj uporabnika' ter blok 'Seje' z možnostjo 'Seznam sej'."; $ShowSessionDescriptionTitle = "Prikaži opis seje"; $ShowSessionDescriptionComment = "Prikaže opis seje, če je ta opisana (na straneh, ki se tičejo seje, v okviru sledenja sej, ...)"; -$CertificateHideExportLinkStudentTitle = "Certifikati: skrij povezavo za izvoz pred tečajniki"; -$CertificateHideExportLinkStudentComment = "V primeru, da je možnost omogočena, tečajniki ne morejo izvoziti svojih certifikator v PDF. Možnost je na voljo, ker je kvaliteta izvoza močno odvisna od natančne HTML strukture predloge certifikata. V primeru slabe kvalitete je bolje ne dopustiti uporabe takega certifikata."; -$CertificateHideExportLinkTitle = "Certifikati : skrij povezavo do izvoza v PDF"; -$CertificateHideExportLinkComment = "Omogoči popolno odstranitev možnosti za izvoz certifikatov v PDF (za vse uporabnike). Če je možnost omogočena, vključuje skrivanje izvoza pred tečajniki."; +$CertificateHideExportLinkStudentTitle = "Potrdila: skrij povezavo za izvoz pred tečajniki"; +$CertificateHideExportLinkStudentComment = "V primeru, da je možnost omogočena, tečajniki ne morejo izvoziti svojih potrdil v PDF. Možnost je na voljo, ker je kvaliteta izvoza močno odvisna od natančne HTML strukture predloge potrdila. V primeru slabe kvalitete je bolje ne dopustiti uporabe takega certifikata."; +$CertificateHideExportLinkTitle = "Potrdila : skrij povezavo do izvoza v PDF"; +$CertificateHideExportLinkComment = "Omogoči popolno odstranitev možnosti za izvoz potrdil v PDF (za vse uporabnike). Če je možnost omogočena, vključuje skrivanje izvoza pred tečajniki."; $DropboxHideCourseCoachTitle = "Nabiralnik: skrij učitelja(coach) tečaja"; $DropboxHideCourseCoachComment = "Skrije učitelja(coach) seje v seznamu naslovnikov nabiralnika pri pošiljanju dokumenta s strani učitelja tečajnikom seje."; $SSOForceRedirectTitle = "SSO : prisili preusmeritev"; @@ -7463,7 +7483,7 @@ $ResetPasswordTokenLimitTitle = "Časovna omejitev žetona za ponastavitev gesla $ResetPasswordTokenLimitComment = "Število sekund pred potekom generiranega žetona; ko ta postane neuporaben in je potrebno ustvariti novega."; $ViewMyCoursesListBySessionTitle = "Poglej moje tečaje po sejah"; $ViewMyCoursesListBySessionComment = "Omogoči dodatno stran 'Moji tečaji', kjer se seje pojavljajo kot del tečajev v nasprotju z obratnim (običajnim) načinom."; -$DownloadCertificatePdf = "Prenesi certifikat v obliki PDF"; +$DownloadCertificatePdf = "Prenesi potrdilo v obliki PDF"; $EnterPassword = "Vnesi geslo"; $DownloadReportPdf = "Prenesi poročilo v obliki PDF"; $SkillXEnabled = "Veščina \"%s\" je bila omogočena"; @@ -7594,7 +7614,7 @@ $TeacherCanSelectCourseTemplateComment = "Omogoča izbiro tečaja, ki se uporabi $TheForumAutoLaunchSettingIsOnStudentsWillBeRedirectToTheForumTool = "Če je ta možnost izbrana, bodo tečajniki po vstopu v tečaj avtomatično preusmerjeni na strani forumov."; $RedirectToForumList = "Preusmeri na seznam forumov"; $EnableForumAutoLaunch = "Aktiviraj avtomatični zagon foruma"; -$NowDownloadYourCertificateClickHere = "Svoj certifikat lahko prenesete s klikom tule"; +$NowDownloadYourCertificateClickHere = "Svoje potrdilo lahko prenesete s klikom tule"; $AdditionallyYouHaveObtainedTheFollowingSkills = "Dodatno, osvojili ste še naslednje veščine"; $IHaveObtainedSkillXOnY = "Osvojil sem veščino %s v %s"; $AnotherAttempt = "Naslednji poskus"; @@ -7851,6 +7871,7 @@ $PleaseSelect = "Prosim, izberi"; $PleaseSelectThread = "Prosim izberi nit"; $TotalTickets = "Skupaj zahtevkov"; $ThereWasAnErrorRegisteringTheTicket = "Napaka pri registraciji zahtevka"; +$AreYouSureYouWantToUnassignTheTicket = "Resnično želite preklicati dodelitev zahtevka?"; $AreYouSureYouWantToCloseTheTicket = "Resnično želite zapreti ta zahtevek?"; $Unassigned = "Nedodeljeno"; $SelectWeeksSpan = "Izberi časovni razpon v tednih"; @@ -7863,7 +7884,10 @@ $InstallMultiURLDetectedNotMainURL = "Trenutno uporabljate portal z omogočeno z $OnlyXQuestionsPickedRandomly = "Naključno bo izbrano zgolj %s vprašanj glede na nastavitev testa."; $AllowDownloadDocumentsByApiKeyTitle = "Dovoli prenos datotek tečaja z API ključem"; $AllowDownloadDocumentsByApiKeyComment = "Dovoli prenos dokumentov s preverjanjem REST API ključa za uporabnike"; +$UploadCorrectionsExplanationWithDownloadLinkX = "Najprej prenesite popravke od tule . Nato razpakirajte datoteke, ne da bi spreminjali njihova imena. Izvedite spremembe, nato ustvarite zip datoteko iz spremenjenih ter jo naložite preko te forme."; $PostsPendingModeration = "Objava čaka moderacijo"; +$OnlyUsersFromCourseSession = "Zgolj uporabniki iz enega tečaja seje"; +$ServerXForwardedForInfo = "Če se strežnik nahaja za proxy strežnikom ali za požarnim zidom (in zgolj v teh primerih), bo včasih potrebno uporabiti X_FORWARDED_FOR HTTP za identifikacijo originalnega IP naslova strežnika (v tem primeru vašega)."; $GeolocalizationCoordinates = "Geolokalizacija po (geo)koordinatah"; $ExportUsersOfACourse = "Izvozi uporabnike tečaja"; $PauseRecordingAudio = "Začasno zaustavi snemanje"; @@ -7883,7 +7907,9 @@ $ChooseRecipients = "Izberi prejemnike"; $StudentCourseProgressX = "Napredek: %s %%"; $SessionDurationNotStartedMaxX = "Najdaljše trajanje te seje znaša %s dni."; $StudentCourseScoreX = "Rezultat: %s %%"; -$StudentCourseCertificateX = "Certifikat: %s"; +$StudentCourseCertificateX = "Potrdilo: %s"; +$ConfigureExerciseVisibilityInCourseTitle = "Omogoči preglasitev nastavitve vidnosti za vaje/teste iz nastavitev baznega tečaja v seji tečaja."; +$ConfigureExerciseVisibilityInCourseComment = "Omogoči nastavitev vidnosti vaj/testov znotraj seje tečaja s preglasitvijo globalne nastavitve v baznem tečaju. Če ni nastavljena, se za vidnost uporabijo globalne nastavitve."; $ExerciseInvisibleInSessionTitle = "Vaja nevidna v seji"; $ExerciseInvisibleInSessionComment = "Če je vaja/test vidna v osnovnem tečaju, potem je privzeto nevidna v vseh sejah, ki ta tečaj vsebujejo. V primeru, da je nevidna v osnovnem tečaju, se v tečaju seje taka vaja/test ne pojavi."; $Ongoing = "V izvajanju"; @@ -7914,8 +7940,12 @@ $TempScoreXQuestionsNotCorrectedYet = "Trenutni rezultat: %s odprtih vprašanj $Annotation = "Označevanje"; $TeacherPicture = "Slika učitelja"; $FeedbackIfNotCorrect = "Povratna informacija ob nepravilnem odgovoru"; +$ScheduledAnnouncements = "Časovno razporejena obvestila"; +$SpecificDate = "Dostava na določen datum"; +$BaseDate = "Dostava na datum začetka/konca seje"; $AfterOrBefore = "Po ali pred"; $Before = "Pred"; +$ScheduleAnnouncementDescription = "Obrazec omogoča avtomatsko časovno razporejanje pošiljanja sporočil uporabnikom tečaja v seji. Definirana sta dva načina: pošiljanje na specifičen, vnaprej določen datum, in pošiljanje ob začetku oz. zaključku seje. V slednjem je potrebno podati koliko dni pred začetkom seje se obvestilo odpošlje oz. koliko dni po zaključku tečaja v seji se to zgodi."; $MandatorySurveyNoAnswered = "Obvezen vprašalnik, čaka na tvoje odgovore. Za dostop do tečaja, je ta vprašalnik potrebno izpolniti."; $ShowPreviousButton = "Pokaži gumb s povezavo na predhodni element"; $AllTickets = "Vsi zahtevki"; @@ -7929,9 +7959,9 @@ $AssignHrmToUser = "Priredi upravitelja človeških virov uporabniku"; $AddHrmToUser = "Dodaj upravitelja človeških virov uporabniku"; $HrmAssignedUsersCourseList = "Seznam tečajev uporabnikov dodeljenih upravitelju človeških virov"; $GoToSurvey = "Pojdi na evalvacijski vprašalnik"; -$NotificationCertificateSubject = "Obvestilu ob prejemu certifikata"; +$NotificationCertificateSubject = "Obvestilu ob prejemu potrdila"; $NotificationCertificateTemplate = "((user_first_name)), Čestitamo ob dokončanju ((course_title)). Vaša končna pridobljena ocena je ((score)). Prosimo, dovolite nam nekaj dni, da se ocena pojavi v informacijskem sistemu ocen. Vnaprej se veselimo, da vas bomo tudi v prihodnje srečevali v naših tečajih. Tudi vnaprej bomo dosegljivi za vsakršno nadaljno pomoč. Še enkrat iskrene čestitke, ((author_first_name)) ((author_last_name)) ((portal_name))"; -$SendCertificateNotifications = "Pošlji obvestila o certifikatih vsem uporabnikom"; +$SendCertificateNotifications = "Pošlji obvestila o potrdilih vsem uporabnikom"; $ForwardedMessage = "Posredovano sporočilo"; $ForwardMessage = "Posreduj sporočilo"; $MyCoursePageCategoryIntroduction = "Spodaj najdeš seznam kategorij tečajev. Klikni na eno izmed njih za seznam tečajev v izbrani kategoriji."; @@ -7946,6 +7976,7 @@ $BestScoreInLearningPath = "Najboljši rezultat v učni poti"; $BestScoreNotInLearningPath = "Najboljši rezultat izven učnih poti"; $ReSendConfirmationMail = "Ponovno pošlji potrditveno sporočilo"; $UserConfirmedNowYouCanLogInThePlatform = "Potrditev uporabnika je bila uspešna. Seaj se lahko prijavite v platformo."; +$AgendaAvailableInCourseX = "Agenda je na voljo v tečaju %s"; $YouHaveBeenSubscribedToCourseXTheStartDateXAndCommentX = "Vpisani ste bili v tečaj %s z datumom začetka %s in %s"; $YourSessionTimeIsExpired = "Čas tvoje seje je potekel"; $ThisEmailWasSentViaCourseX = "To e-sporočilo je bilo poslano preko tečaja %s"; @@ -7959,6 +7990,7 @@ $AccountNotConfirmed = "Vaš račun je neaktiven, ker ga še niste potrdili. Pre $RegistrationConfirmationEmailMessage = "Za dokončanje postopka vaše registracije v platformo morate potrditi novo kreiran račun s klikom na naslednjo povezavo"; $ConfirmationForNewAccount = "Potrditev za novo kreiran račun"; $YouNeedConfirmYourAccountViaEmailToAccessThePlatform = "Pred dostopom na platformo morate potrditi kreiranje računa preko vsebine e-poštnega sporočila."; +$EnableAddCloudFileLinkTitle = "Omogoči dodajanje povezave na oblak"; $UrlAlreadyExists = "Ta URL že obstaja."; $ErrorAddCloudLink = "Pri dodajanju povezave do datoteke v oblaku je prišlo do napake."; $AddCloudLink = "Dodaj povezo k datoteki v oblaku."; @@ -7977,7 +8009,7 @@ $SendManuallyPendingAnnouncements = "Pošlji čakajoče objave ročno"; $SessionTemplate = "Predloga seje"; $CloudFileLink = "Povezava oblačne datoteke"; $ResetFieldX = "Ponastavi %s"; -$MyGeneralCertificate = "Moj globalen certifikat"; +$MyGeneralCertificate = "Moje globalno potrdilo"; $ScoreNote = "Beležka"; $ScoreTest = "Test"; $MessageTracking = "Sledenje sporočil"; @@ -8062,6 +8094,12 @@ $ResultAccomplishedTest = "Rezultati opravljenega testa"; $YourResultsByDiscipline = "Tvoji rezultati po disciplinah"; $ForComparisonYourLastResultToThisTest = "V primerjavi, vapi zadnji rezultati za ta test"; $YourOverallResultForTheTest = "Pregledni rezultati testa"; +$QuestionDegreeCertaintyHTMLMail = "Podrobnosti rezultatov testa %s boste našli spodaj.
    +Za vpogled v podrobnosti teh rezultatov: +

    +1. Prijavite se v platformo (uporabniško ime/geslo): K platformi. +

    +2. Kliknite to povezavo: Poglej podrobnosti rezultatov."; $DegreeOfCertaintyVerySure = "Zelo prepričan"; $DegreeOfCertaintyVerySureDescription = "Vaš odgovor je bil pravilen in bili ste z 80% verjetnostjo prepričani v pravilnost odgovora, Čestitamo!"; $DegreeOfCertaintyPrettySure = "Prepričan"; @@ -8114,6 +8152,7 @@ $UploadTmpDirInfo = "Začasna mapa za nalaganje datotek je prosr na strežniku, $GenerateCustomReport = "Generiraj prilagojeno poročilo"; $ToDo = "Narediti"; $PleaseEnterURL = "Vnesite URL"; +$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Če želite prejeti potrdilo in/ali kvalifikacije, kompetence, veščine povezane s tem tečajem, morate kupiti storitev potrdil/potrjevanja. S klikom na to povezavo lahko odprete katalog storitev: %s"; $AddMultipleUsersToCalendar = "Dodaj več uporabnikov k koledarju"; $UpdateCalendar = "Ažuriraj koledar"; $ControlPoint = "Kontrolna točka"; @@ -8158,6 +8197,8 @@ $MoreDataAvailableInTheDatabaseButTrunkedForEfficiencyReasons = "Več podatkov j $SendAnnouncementCopyToMyself = "Pošlji kopijo e-poštnega sporočila tudi meni"; $CourseHoursDuration = "Trajanje tečaja (h)"; $AnnouncementWillBeSentTo = "Obvestilo bo poslano k"; +$FrmReadOutTextIntro = "Pripeti morate zvočno datoteko skladno z besedilom: kliknite na %s ikono."; +$CreateReadOutText = "Ustvarite bralno besedilo"; $OutstandingStudents = "Nadprovprečni učeči"; $PercentileScoresDistribution = "Procentualna porazdelitev rezultatov"; $ProgressObtainedFromLPProgressAndTestsAverage = "Opomba: ta napredek je določen na osnovi kombinacije napredka v učnih poteh in povprečnega rezultata testov"; @@ -8170,6 +8211,7 @@ $NewExerciseAttemptDisabled = "Sistem trenutno ne dovoljuje izvrševanje testa/v $PersonalDataOfficer = "Informacijski pooblaščenec (za varstvo osebnih podatkov)"; $MaxNumberSubscribedStudentsReached = "Največje število učečih je že bilo doseženo. Ni več mogoče vpisati dodatnih."; $UserXAddedToCourseX = "Uporabnik %s je bil vpisan v tečaj %s"; +$LpMinTime = "Minimalen čas (minute)"; $LpMinTimeDescription = "Najkraji čas (v minutah), ki ga mora učeči prebiti v učni poti da dobi dostop do naslednje."; $LpMinTimeWarning = "V učni poti nisi porabil predpisanega minimalnega časa!"; $YouHaveSpentXTime = "Porabili ste %s"; @@ -8228,6 +8270,7 @@ $QuizQuestionsLimitPerDayXReached = "Oprostite, za današnji dan ste dosegli naj $VoteLike = "Všeč mi je"; $VoteDislike = "Ni mi všeč"; $GenerateStats = "Generiraj statistiko"; +$BasicCourseDocuments = "Dokumenti baznega/izhodiščnega tečaja"; $WeekX = "Teden %s"; $QuizWrongAnswerHereIsTheCorrectOne = "Napačen odgovor. Pravilen je:"; $ThisQuizCanBeEmbeddable = "To vajo/test lahko integriramo z videoposnetkom ali poljubno drugo mobilno vsebino"; @@ -8241,6 +8284,7 @@ $WelcomeToPortalXInCourseSessionXCoursePartOfCareerX = "Dobrodošli v portal %s $YourNextModule = "Vaš naslednji modul"; $FirstLesson = "Prva lekcija"; $ImportCourseTeachersAsCourseCoach = "Uvozi učitelje tečaja kot coach-e v sejo"; +$ResumeImport = "Nadaljuj z uvozom"; $Candidate = "Kandidat"; $Domains = "Domene"; $ScormStartAttemptDate = "Datum"; @@ -8263,7 +8307,7 @@ $SubscribeUsersToAllForumNotifications = "Avtomatično vpiši vse uporabnike k p $MinStartDate = "Prva povezava"; $MaxEndDate = "Zadnja povezava"; $TotalDuration = "Celoten porabljen čas"; -$RealisationCertificate = "Certifikat dosežkov"; +$RealisationCertificate = "Potrdilo dosežka"; $SurveysReport = "Poročila vprašalnikov"; $EnterYourNewPassword = "Vpišite svoje novo geslo"; $RepeatYourNewPassword = "Vpišite svoje geslo še enkrat, da se zmajša možnost napake pri vnosu"; @@ -8286,6 +8330,7 @@ $UserClassExplanation = "Info: Seznam razredov spodaj vključuje razrede, ki ste $InsertTwoNames = "Vpiši svoji dve imeni"; $AddRightLogo = "Dodaj desni logotip"; $LearnpathUseScoreAsProgress = "Uporabi rezultat kot napredek"; +$LearnpathUseScoreAsProgressComment = "Uporabi rezultat vrnjen iz edinega SCO v tej učni poti kot indikator napredka. Izbira spremeni obnašanje SCORM v smislu točnosti, vendar pa izboljša vizualno povratno infomacijo učečemu."; $Planned = "Planirano"; $InProgress = "V izvajanju"; $Cancelled = "Preklicano"; @@ -8293,8 +8338,10 @@ $Finished = "Končano"; $SessionStatus = "Stanje seje"; $UpdateSessionStatus = "Aktualiziraj stanje seje"; $NoStatus = "Ni statusa"; +$CAS3Text = "CAS 3"; $GoBackToVideo = "Nazaj na video"; $UseLearnpathScoreAsProgress = "Uporabi rezultat kot napredek"; +$UseLearnpathScoreAsProgressInfo = "Nekatere SCORM učne poti, še posebej tiste z eno samo SCO, lahko vračajo napredek v poti kot rezultat SCO (cmi.core.score.raw). Z izbiro te opcije (dostopna je zgolj v učnih potem z eno samo SCO), bo Chamillo prikazoval rezultat iz elementa SCO kot napredek. Pazite pa, s tem sočasno izgubite možnost, da dobite kakršenkoli pravi rezultat iz tega elementa!"; $QuizPreventBackwards = "Onemogoče prehod nazaj k prejšnjemu vprašanju"; $UploadPlugin = "Naloži vtič"; $PluginUploadPleaseRememberUploadingThirdPartyPluginsCanBeDangerous = "Ne pozabite, da je nalaganje vtičev tretjih oseb lahko škodljivo za delovanje vaše storitve in vašega strežnika. Vedno se prepričajte, da nalagate vtiče iz varnih in zanesljivih virov ali da lahko računate na profesionalno pomoč razvijalcev te programske opreme."; @@ -8310,8 +8357,8 @@ $ActiveSessionsShort = "Aktivne"; $ClosedSessionsShort = "Zaprte"; $FirstnameLastnameCourses = "Tečaji up. %s %s"; $CanNotSubscribeToCourseUserSessionExpired = "V tečaj se ne morete več vpisati, ker je seja že potekla."; -$CertificateOfAchievement = "Certifikat dosežkov"; -$CertificateOfAchievementByDay = "Certifikat dosežkov za dan"; +$CertificateOfAchievement = "Potrdilo dosežka"; +$CertificateOfAchievementByDay = "Potrdilo dosežkov za dan"; $ReducedReport = "Skrajšano poročilo"; $NotInCourse = "Zunanji tečaji"; $LearnpathCategory = "Kategorije učnih poti"; @@ -8325,6 +8372,7 @@ $Weeks = "Tedni"; $SessionCount = "Število sej"; $SessionsPerWeek = "Sej na teden"; $AverageUserPerSession = "Povprečno število uporabnikov na sejo"; +$SessionsPerCategory = "Sej na kategorijo"; $SessionsPerLanguage = "Seje po jezikih"; $CountOfSessions = "Število sej"; $CourseInSession = "Tečaji v sejah"; @@ -8333,9 +8381,15 @@ $UsersCreatedInTheSelectedPeriod = "Novih uporabnikov v izbranem obdobju"; $UsersByLanguage = "Uporabnikov glede na jezik"; $Count = "Število"; $SortKeys = "Razvrščeno po"; +$SubscriptionCount = "Število prijav"; +$VoteCount = "Število glasov"; $ExportAsCompactCSV = "Izvozi kot kompakten CSV"; +$SendToGroupTutors = "Objavi za tutorje skupin"; +$GroupSurveyX = "Vprašalnik skupine za %s"; $HelloXGroupX = "Pozdravljen %s

    Kot tutor skupine %s si povabljen k sodelovanju z izpolnitvijo naslednjega vprašalnika:"; +$SurveyXMultiplicated = "Vprašalnik %s je multipliciran"; +$SurveyXNotMultiplicated = "Vprašalnik %s ni multipliciran"; $ExportSurveyResults = "Izvozi rezultate vprašalnika"; $PointAverage = "Povprečen rezultat"; $TotalScore = "Skupna vsota"; @@ -8347,7 +8401,9 @@ $XAnswersSavedByUsersFromXTotal = "%d / %d odgovorov je bilo shranjenih."; $TestYourBrowser = "Preskusi svoj brskalnik"; $AverageTrainingTime = "Povprečen čas v tečaju"; $UsersActiveInATest = "Uporabniki aktivni v testu"; +$SurveyQuestionMultipleChoiceWithOther = "Večkratna izbira s prostim besedilom"; $SurveyQuestionMultipleChoiceWithOtherComment = "Podajte nekaj pred-definiranih možnosti, potem pa pustite uporabniku, da možnost izbere ali pa odgovori z besedilom, če mu nobena od podanih možnosti ne ustreza."; +$Multiplechoiceother = "Večkratna izbira z opcijo 'drugo'"; $SurveyOtherAnswerSpecify = "Drugo:"; $SurveyOtherAnswer = "Prosim, opredelite:"; $UserXPostedADocumentInCourseX = "Tečajnik %s je oddal dokument v orodje Zadolžitve v tečaju %s"; @@ -8371,7 +8427,7 @@ $UsernameList = "Seznam uporabniških imen"; $UsersAboutToBeAnonymized = "Uporabniki, ki bodo anonimizirani"; $CouldNotReadFile = "Ne morem brati datoteke."; $CouldNotReadFileLines = "Ne morem prebrati vrstic datoteke."; -$CertificatesSessions = "Certifikati v sejah"; +$CertificatesSessions = "Potrdila v sejah"; $SessionFilterReport = "Filtriraj certifikate v sejah"; $UpdateUserListXMLCSV = "Ažuriraj seznam uporabnikov"; $DonateToTheProject = "Chamilo je odprtokodni (Open Source) projekt in je s strani združenja Chamilo (Chamilo Association) uporabnikov zagotovljen brezplačno s tendenco zasledovanja cilja izboljšanja dostopnosti do kvalitetnega izobraževanja po vsem svetu.

    @@ -8381,6 +8437,7 @@ $MyStudentPublications = "Moje zadolžitve"; $AddToEditor = "Dodaj v urejevalnik"; $ImageURL = "URL slike"; $PixelWidth = "širina v px"; +$AddImageWithZoom = "Dodaj sliko s povečavo"; $DeleteInAllLanguages = "Odstrani v vseh jezikih"; $QuizConfirmSavedAnswers = "Sprejemam število sranjenih odgovorov v tem razdelku."; $QuizConfirmSavedAnswersHelp = "Če se ne strinjate, ne potrdite strinjanja. V tem primeru vam priporočamo, da se posvetujte z upraviteljem tečaja ali upraviteljem platforme."; @@ -8399,7 +8456,9 @@ $PeriodicExport = "Periodični izvoz"; $Dates = "Datumi"; $ErrorPluginFilesExtensionsInsideZip = "Napaka: nekatere datoteke znotraj zip paketa imajo nedovoljene končnice."; $UsersByStatus = "Uporabniki po statusih"; -$UsersByCertificate = "Uporabniki po certifikatih"; +$UsersByTargetLanguage = "Uporabniki po izbranem jeziku"; +$UsersByContract = "Uporabniki po kontaktu"; +$UsersByCertificate = "Uporabniki po potrdilih"; $UsersByAge = "Uporabniki po starosti"; $ContinueImport = "Nadaljuj uvoz"; $LDAPConnectFailed = "LDAPP connect operacija ni uspela."; @@ -8409,20 +8468,31 @@ $LDAPFirstEntryFailed = "LDAP_first_entry() operacija ni uspela."; $LDAPGetValuesFailed = "LDAP_get_values() ni uspela."; $MoreThanOneAttributeValueFound = "Več kot ena vrednost za atribut je bila najdena."; $MoreThanOneUserMatched = "Več kot en sam uporabnik ustreza kriteriju."; +$CourseCodeConfirmation = "Potrditev kode tečaja"; $UnsupportedQtiVersion = "Nepodprta IMS/QTI različica."; -$ExportAllCertificatesToZIP = "Izvozi vse certifikate v ZIP datoteko."; +$ExportAllCertificatesToZIP = "Izvozi vsa potrdila v ZIP datoteko."; $CurrentScore = "Trenutni dosežek"; $AddAttempt = "Dodaj poskus"; +$SurveysWordInASCII = "vprašalnik"; +$PrivateBetweenUsers = "Privatno med uporabniki"; $Nothing = "Nič"; $CompilatioAnalysisInProgress = "Izvajanje analize Compilatio ...v teku..."; +$AccountExpiration = "Potek računa"; $JustificationExpiration = "Potek dokazila"; $JustificationType = "Tip dokazila"; +$Persistent = "Trajen"; $LogoutWithYourAccountFromX = "Odjavi se s svojega računa %s ."; +$DaysDifference = "Razlika v dnevih"; +$Graduated = "Diplomiran"; +$Absent = "Odsoten"; $InternalDatabaseError = "Napaka sistema podatkovne zbirke (notranja)"; $WrongNumberOfDays = "Napačno število dni"; $SubscriptionNotAllowed = "Vpis ni dovoljen"; +$YouPassedTheLimitOfXMinutesToSeeTheResults = "Presegli ste %s minutno omejitev za ogled rezultatov."; +$LastUpdated = "Nazadnje ažurirano"; $Age = "Starost"; $ExportToXls = "Izvozi v XLS"; +$CourseLearningPathsGenericStats = "Učne poti - splošna statistika"; $FailedToCreateExtraFieldCasUser = "Dodatnega polja cas_user ni mogoče ustvariti."; $FailedUserCreation = "Uporabnika ni bilo mogoče ustvariti."; $NoSuchUserInLDAP = "Takega uporabnika ni v LDAP."; @@ -8444,9 +8514,14 @@ $NoUserMatched = "Noben uporabnik ne ustreza."; $AttendanceFromXToY = "Prisotnosti od %s to %s"; $AddTime = "Dodaj čas"; $AddUser = "Dodaj uporabnika"; +$TimeSpentOnAssignment = "Čas porabljen za nalogo"; $UserXSignedTheAgreementTheDateY = "Uporabnik %s je podpisal soglasje na %s"; +$Available = "Na voljo"; +$SurveyMultipleChoiceWithOther = "Večkratna izbira z možnostjo 'drugo'"; $CompilatioDescription = " Compilatio anti-plagiatorski modul"; +$CompilatioQuota = "Kvote"; +$CompilatioCreditXOnY = "Krediti: %s od %s"; $CompilatioConnectionTestSoap = "Preskus povezave s SOAP strežnkom..."; $CompilatioServerConnection = "Povezava Compilatio SOAP strežnik"; $CompilatioConnectionSuccessful = "Povezava je uspela."; @@ -8458,6 +8533,10 @@ $CompilatioNoConnection = "Povezava s Compilatio SOAP strežnikom ni uspela."; $CompilatioParamVerification = "Preverite vaš ključ, št. strežnikovih vrat in morebitne nastavitve vašega proxy strežnika."; $LastVisitedCourse = "Zadnji obiskan tečaj"; $YouDidNotVisitACourseHereTheCourseList = "Niste obiskali še nobenega tečaja, tu je seznam vaših tečajev."; +$NoEntity = "Ni organizacij"; +$UserByEntityReport = "Uporabniki po organizaciji"; +$LpByAuthor = "Učne poti po avtorju"; +$SessionImportAssignments = "Uvozi naloge iz baznega tečaja"; $RedirectToPortalHome = "Preusmeritev na domačo stran platforme"; $MyLps = "Moje učne poti"; $LastVisitedLp = "Zadnja obiskana učna pot"; @@ -8465,30 +8544,58 @@ $YouDidNotVisitALpHereTheLpList = "Niste obiskali še nobene učne poti. Tu je s $CourseUsedInOtherURL = "Ta tečaj je uporavljen na vsaj še enem izmed drugih portalov"; $SubscribeUserGroupsToLp = "Dodaj razede k učni poti"; $ReplaceFile = "Nadomesti datoteko"; +$SubscribeClassesToLpCategory = "Vpiši razrede k kategoriji"; +$ResultsOnlyAvailableOnline = "Rezultati so dostopni zgolj na spletu (online)"; +$QuestionStats = "Statistika vprašanj"; $WrongAnswer = "Napačen odgovor"; +$WrongAttemptXInCourseX = "Neuspeh v poskusu %s dne %s"; $BlockCategoryExplanation = "Dokončali ste vsa vprašanja v tej kategoriji in to je vaša zadnja možnost, da se vrnete in pregledate svoje odgovore. S klikom na nadaljevanje boste prešli na naslednjo kategorijo vprašanj, s tem pa vračanje na predhodni razdelek testa/vaje ne bo več mogoč."; $RemainingTimeToFinishExercise = "Preostanek časa za dokončanje vaje/testa"; $RemainingTimeToFinishQuestion = "Preostanek časa za dokončanje vprašanja"; $QuestionStatsDetailedReport = "Podrobno poročilo o vprašanjih"; +$MyPersonalOpenAreaHelp = "Vaša kratka predstavitev, profesionalne in/ali osebne izkušnje ter prepričanja."; +$MyCompetencesHelp = "Kompetence, ki ste jih pridobili (zbrali), formalno ali neformalno pridobljene, socialne ali tehnične."; +$UserGuides = "Uporabniški priročniki"; $MyProductionsHelp = "Napisali ste članek, razpravo, objavo.. ki bi jo želeli deliti, ali pa želite pripeti vaš CV za prenos zainteresiranim? DOdajte te tule."; $CorrectAttempts = "Pravilni poskusi"; $WrongAttempts = "Nepravilni poskusi"; $StudentsWithCorrectAnswers = "Tečajniki s pravilnimi odgovori"; $StudentsWithWrongAnswers = "Tečajniki z nepravilnimi odgovori"; +$ContentList = "Seznam vsebin"; +$Tariff = "Tarifa"; +$ToInvoice = "K naročilu"; $LearningPathItemByAuthor = "Elementi učnih poti po avtorjih"; +$DeleteExerciseAttempts = "Odstrani tudi vse poskuse izvedb vaje/testa. Če možnost ni izbrana, bodo rezultati odstranjene vaje/testa še vedno na voljo."; +$ExerciseCategoriesRadarMode = "Prikaži zgolj graf radarja po kategorijah namesto tabele kategorij. Ne prikaži posameznih rezultatov niti povratne informacije."; +$ExerciseBlockBecausePercentageX = "Vsi poskusi so onemogočeni ker niste uspeli doseči minimalnega rezultata %s %% v enem izmed vaših predhodnih poskusov."; +$RegisteredAuthors = "Registrirani avtorji"; $Price = "Cena"; $PriceUpdated = "Cena je bila ažurirana"; +$RemoveSelected = "Odstrani izbrane avtorje"; +$DeletedAuthors = "Avtorji so bile odstranjeni"; +$XQuestionsSelectedWithTotalScoreY = "Zgolj %d vprašanj bo izbrano glede na nastavitev testa, za skupni možni rezultat %s."; $QuestionAlsoUsedInTheFollowingTests = "To vprašanje je uporabljeno še v naslednjih testih"; $MoveUsersFromCourseToSession = "Prestavi uporabnikove rezultate iz osnovnega tečaja v sejo"; +$IfYourQuizHaveHotspotQuestionsIncludedYouShouldSelectTheImagesFromTheDocuments = "V primeru, da vaš test vsebuje nalogo z vročo točko, morate iz izbrati tudi vse pripadajoče slike iz dokumentov."; $BackToAttemptList = "Nazaj na seznam poskusov"; +$ShowScoreEveryAttemptShowAnswersLastAttemptNoFeedback = "Prikaže rezultate učečim: prikaže rezultat, tečajnikovo izbiro in njegovo povratno informacijo za vsak poskus, pravilen odgovor in povratno informacijo, kadar je dosežena izbrana omejitev števila izvajanj."; $AddGradebookComment = "Komentar"; $LatestLoginInAnyCourse = "Zadnja prijava v tečaj"; +$QuestionForNextUser = "Vprašanja o naslednjem uporabniku"; +$CourseCodeToEnteredCapitalLettersToConfirmDeletionX = "Za potrditev odstranitve tačaja morate nejgovo kodo vnesti z velikimi črkami: %s"; $BadgeXTitle = "Značka: %s"; $PortfolioCommentFromXUser = "Komentar s strani %s"; +$PortfolioItemFromXUser = "Element portfelja '%s'"; $CopyToMyPortfolio = "Kopiraj v moj portfelj"; $CopyToStudentPortfolio = "Kopiraj v tečajnikov portfelj"; +$OriginallyPublishedAsXTitleByYUser = "Izvorno objavljeno kot \"%s\" s strani %s"; +$OriginallyCommentedByXUserInYItem = "Izvorno komentirano s strani %s v \"%s\""; +$PortfolioItemAddedToStudents = "Element je bil dodan v lasten portfelj učečega"; $MarkCommentAsImportant = "Označi komentar kot pomemben"; $UnmarkCommentAsImportant = "Razveljavi pomembnost komentarja"; +$CommentMarkedAsImportant = "Element portfelja je označen kot pomemben"; +$SelectLearnerPortfolio = "Izberi portfelj učečega"; +$SeeMyPortfolio = "Poglej moj portfelj v tem tečaju"; $PortfolioDetails = "Podrobnosti portfelja"; $PortfolioItemTitle = "Naziv elementa"; $CreationDateXDate = "Datum nastanka: %s"; @@ -8505,11 +8612,35 @@ $QualifyThisPortfolioComment = "Oceni ta komentar"; $PortfolioCommentGraded = "Komentar portfelja je bil ocenjen"; $QualifyPortfolioItems = "Oceni elemente"; $QualifyPortfolioComments = "Oceni komentarje"; +$HideCorrectAnsweredQuestions = "Skrij vprašanja s pravilnimi odgovori"; +$TheSettingXWillChangeToX = "Nastavitev \"%s\" se bo spremenila v \"%s\""; +$VerificationOfAnsweredQuestions = "Preverjanje odgovorov na vprašanja"; +$StudentPublicationToCorrect = "Zadolžitve tečajnikov za popravo"; +$StudentPublicationCorrectionWarning = "Spodaj najdete vse izdelke, ki so bili poslani s strani tečajnikov v enem izmed vaših tečajev (v izvornem tečaju ali tečaju seje). Seznam lahko filtrirate z izbiro specifičnega tečaja ali po trenutnem statusu."; +$BackToMainPortfolio = "Nazaj na izhodiščni portfelj tečaja"; +$ExportMyPortfolioDataPdf = "Izvozi moj portfelj v PDF datoteko"; +$ExportMyPortfolioDataZip = "Izvozi moj portfelj kot ZIP datoteko"; +$PortfolioCategoryFieldHelp = "Kategorije služijo organizaciji zgolj v osebnem portfelju."; $ExportMytPortfolioDataPdf = "Izvozi podatke mojega portfelja v PDF"; $ExportMytPortfolioDataZip = "Izvozi podatke mojega portfelja v ZIP datoteko"; $NewLearningPathSubject = "Nova učna pot je na voljo"; $NewLearningPathBody = "Tu je nova učna pot imenovana %s, ki je bila dodana v tvoj tečaj %s. Dostopite do učne poti preko te povezave: %s"; +$XPercentCompleted = "%s %% dokončanega"; +$EmailToTeachersWhenNewPost = "Pošlji e-poštno sporočilo učitelju ob objavi novega elementa v orodju portfelja"; +$PortfolioAlertNewPostContent = "Objava avtorja %s je novo-objavljena v portfelju tečaja %s. Za vpogled kliknite tule"; +$PortfolioAlertNewPostSubject = "[Portfelj] Nova objava v tečaju %s"; +$OngoingTraining = "Učni proces/trening v izvajanju"; $QuizRemindSubject = "Imate novo sporočilo osebe %s"; +$QuizFirstRemindBody = "Pozdravljen $s,

    +nova vaja/test je bila dodana v tečaj %s.

    +Tečaj: %s
    +Vaja/test : %s
    "; +$QuizLastRemindBody = "Obišči vajo/test %s"; +$QuizDhrRemindBody = "Pozdravljen $s,

    +kot starša vas obveščamo, da je %s prejel novo vajo/test %s v tečaj %s.

    +Učeči: %s
    +Tečaj: %s
    +Vaja/test : %s
    "; $QuizRemindDuration = "Trajanje testa: %s"; $QuizRemindStartDate = "Začetni datum testa: %s"; $QuizRemindEndDate = "Končni datum testa: %s"; @@ -8539,17 +8670,23 @@ $UploadAnswer = "Naloži odgovor"; $Corrector = "Korektor"; $CorrectionDate = "Datum korekcije"; $HideAttemptsTableOnStartPage = "Skrij tabelo poskusov na začetni strani"; +$ScormAndLPMaxProgress = "Največji napredek v učnih poteh"; +$HideSkills = "Skrij veščine"; $HideAssignment = "Skrij zadolžitve"; +$AddSurveyToCourse = "Dodaj vprašalnik tečaju"; $MoveTheCurrentSurvey = "Premakni trenuten vprašalnik"; $ShareEventsInSessions = "Deli dogodke v sejah tečaja"; $AgendaEventsInBaseCourseWillBeVisibleInCourseSessions = "Dogodki agende tečaja bodo vidni v sejah"; $AgendaEventsOnlyVisibleInCurrentCourse = "Dogodki agende vidni zgolj v trenutnem tečaju"; $TestResult = "Rezultat testa"; +$FilterByLp = "Filtriraj po učni poti"; $ShareForumsInSessions = "Deli forume v vseh sejah"; $AddEventInCourseCalendar = "Dodaj dogodek v koledar tečaja"; +$Hours = "ur"; $ReminderXEvent = "Opomnik za dogodek %s"; $AddNotification = "Dodaj obvestilo"; $NotifyBeforeTheEventStarts = "Obvestilo v opomin na dogodek"; +$AddTags = "Dodaj oznako"; $Invitees = "Vabljeni"; $RemindXLpCourseX = "Opomnik št. %s v tečaju %s"; $HelloX = "Pozdravček %s"; @@ -8563,13 +8700,18 @@ $Embed = "Pridobi povezavo za vključitev (embedable link)"; $CopyUrlToIncludeInIframe = "Kopiraj ta URL za vključitev te vaje/testa v iframe"; $ExportExtraFields = "Izvozi dodatna polja"; $ToHideExlearners = "Skrij bivše učeče"; +$YourLpResultsAre = "Dosegli ste naslednje rezultate v učnih poteh:"; +$YourLpQuizzesResultsAre = "Dosegli ste naslednje rezultate v testih:"; $ExportLpQuizResults = "Izvozi rezultate kviza/testa učne poti"; $ElearningResults = "Rezultati učne poti"; $InvoicingByAccessUrl = "Aktivni uporabniki v sejah po posameznih URL"; $SelectTheNextLp = "Naslednja učna pot"; +$NoNotifications = "Brez obvestil"; +$SkillMinScore = "Minimalen rezultat"; $InLp = "V učni poti"; $ProgressInSessionReport = "Poročilo napredka v sejah"; $QuestionInOtherExercises = "Vprašanje je deljeno z večimi drugimi vajami/testi. Ste prepričani, da ga želite odstraniti?"; +$SeeForTablet = "Pogled za tablico"; $DisableSignature = "Onemogoči podpis"; $EnableSignature = "Omogoči podpis"; $Sign = "Podpis"; @@ -8579,4 +8721,148 @@ $PasswordRequirementPassed = "Ustreza zahtevam za geslo."; $PasswordRequirementPending = "Čakanje na izpolnitev zahtev za geslo"; $NewPasswordRequirementMinXSpecials = "Najmanj %s posebnih znakov"; $NewPasswordCannotBeSameAsCurrent = "Novo geslo ne sme biti enako obstoječemu"; +$FilterByClass = "Filter po razredu"; +$NotInAnyClass = "Ni v nobenem razredu"; +$XAccountDisabledByYAttempts = "Uporabniški račun %s je bil onemogočen po %d neuspešnih poskusih prijave."; +$AnswerList = "Seznam odgovorov"; +$EnterListOfAnswersOneAnswerByLine = "Vnesite seznam odgovorov (en odgovor na vrstico)"; +$OrSelectCsvFileWithListOfAnswers = "Ali izberi CSV datoteko s seznamom odgovorov"; +$ConvertToMultipleAnswerDropdown = "Pretvori v večkraten odgovor s padajočo izbiro"; +$MultipleAnswerDropdown = "Večkraten odgovor s padajočo izbiro"; +$Highlighted = "Poudarjeno"; +$SeeHighlights = "Poglej poudarke"; +$XAddedYRequired = "%d dodano / %d zahtevano"; +$RequiredNumberOfItems = "Zahtevano število elementov"; +$RequiredNumberOfComments = "Zahtevano število komentarjev"; +$UnmarkAsHighlighted = "Odstrani poudarek"; +$MarkAsHighlighted = "Označi poudarek"; +$UpdatedDateX = "Ažurirano %s"; +$UpdatedOnDateXByUserY = "Ažurirano dne %s s strani %s"; +$UpdatedDateXByUserY = "Ažurirano %s s strani %s"; +$MarkedAsHighlighted = "Označeni kot poudarki"; +$UnmarkedAsHighlighted = "Odstranjen poudarek"; +$PortfolioAlertNewCommentSubject = "[Portfelj] Nov komentar k objavi %s"; +$MakeVisibleForTeachers = "Naredi vidno za učitelje"; +$Tag = "Oznaka"; +$TagSaved = "Oznaka je bila shranjena"; +$TagDeleted = "Oznaka je bila odstranjena"; +$CommentByUserXInItemY = "Komentar s strani %s v %s"; +$PortfolioPostAddHelp = "Uvod orodja Portfelj"; +$LearningPathLTI = "Dostop preko LTI v učno pot"; +$UserXNotSubscribedToCourseX = "Uporabnik %s ni bil vpisan v tečaj %s"; +$OpenContentInNewTab = "Odpri vsebino v novem zavihku"; +$ThereAreUsersOrCoursesUsingThisLanguageYouWantToDisableThisLanguageAndSetUsersAndCoursesWithTheDefaultPortalLanguage = "Obstajajo uporabniki ali tečaji s tem jezikom. Želite onemogočiti ta jezik in nastavite za vse obstoječe uporabnike/tečaje onemogočenega jezika na privzet jezik portala?"; +$ReportQuarterlyUsers = "Število uporabnikov registriranih in povezanih"; +$NumberOfUsersRegisteredTotal = "Število uporabnikov registriranih (skupaj)"; +$NumberOfUsersRegisteredCompared = "Število uporabnikov registriranih(novi : prejšnje četrtletje)"; +$NumberOfUsersWhoConnected = "Število uporabnikov povezanih"; +$IncompleteDataCurrentQuarter = "*: Tekoče četrletje, nepopolni podatki"; +$ReportQuarterlyCourses = "Število obstoječih in dostopnih tečajev"; +$NumberOfExistingCoursesTotal = "Število obstoječih tečajev (skupaj)"; +$NumberOfAvailableCourses = "Število dostopnih tečajev (brez zaprtih ali skritih, skupaj)"; +$ReportQuarterlyHoursOfTraining = "Ur treninga"; +$NumberOfHoursTrainingFollowed = "Število ur sledenja treningu (skupno)"; +$ReportQuarterlyNumberOfCertificatesGenerated = "Število generiranih potrdil"; +$NumberOfCertificatesGeneratedTotal = "Število generiranih potrdil (skupaj)"; +$ReportQuarterlySessionsByDuration = "Število sej po trajanju"; +$SessionsByDurationByQuarter = "Sej po trajanju (po četrtletju)"; +$ListOfCoursesCodes = "Seznam kod tečajev"; +$NumberOfSubscribedUsers = "Število vpisanih uporabnikov"; +$AllUsersIncludingInactiveIncluded = "*: Vključeni so vsi uporabniki, vključno z neaktivnimi"; +$ReportQuarterlyTotalDiskUsage = "Skupna poraba prostora diska"; +$ExerciseXNotDeleted = "Test '%s' ni bil odstranjen"; +$DoNotIncludeUsers = "Ne vključi uporabnikov"; +$ReportDoesNotIncludeListOfUsersNeitherForSessionNorForEachCourse = "Poročilo ne vključuje seznama uporabnikov niti za sejo niti za posamezen tečaj v seji."; +$IncludeExtraFields = "Vključi dodatna polja"; +$ImportCourseAgendaReminderTitleDefault = "Vabilo k tečaju ((course_title))"; +$ImportCourseAgendaReminderDescriptionDefault = "

    Ojla ((user_complete_name)).

    +

    Obiskovati in opraviti boste morali tečaj ((course_title)) med ((date_start) in ((date_end)). Do tečaja lahko dostopite preko: ((course_link)).

    +

    Pozdrav.

    "; +$Scored = "Ocenjeno"; +$Edited = "Pregledano"; +$Downloaded = "Preneseno"; +$YouCanOnlyCopyThisCourseToACourseYouTeach = "Ta tečaj lahko kopirate zgolj v tečaj, v katerem imate vlogo učitelja."; +$RemoveUsers = "Odstrani uporabnike"; +$SendFileToOtherUsers = "Pošlji datoteko ostalim uporabnikom"; +$RemoveFileFromSelectedUsers = "Odstrani datoteko naslednjim uporabnikom"; +$SendOtherUsers = "Pošlji ostalim uporabnikom"; +$SendToUsers = "Pošlji uporabnikom"; +$FirstLoginForceUsersToChangePassword = "Vsili uporabnikom menjavo gesla po prvi prijavi"; +$YourUsernameToAccessIsX = "Pomnite, da je vaše uporabniško ime za dostop %s"; +$InstructionsLostPasswordWithLinkX = "Pomnite: Če se ne spomnite gesla, kliknite na Izgubljeno geslo?, vnesite svoje uporabniško ime in sledite nadaljnim navodilom."; +$RepeatXDays = "Vsakih x dni"; +$NumberOfDays = "Število dni"; +$WriteAComment = "Podajte komentar"; +$ProvideACommentFirst = "Najprej, prosimo, podajte komentar"; +$QuizFinalizationDate = "Datum zaključka zadnjega kviza/testa"; +$LpFinalizationDate = "Datum zaključka zadnje učne poti"; +$ReportByAttempts = "Poročilo po poskusih"; +$QuestionsTopic = "Tema vprašanja"; +$QuestionsTopicHelp = "Tema vprašanja bo uporabljena kot ime testa in bo poslana AI generatorju za generiranje vprašanj v jeziku nastavljenem za tečaj skupaj z zahtevo, da se ta generirajo v Aiken formatu, ki omogoča enostaven uvoz v tečaj."; +$AIQuestionsGenerator = "AI generator vprašanj"; +$AIQuestionsGeneratorNumberHelper = "Večina AI generatorjev omejuje število znakov posredovanih v odgovoru, hkrati pa vaši organizaciji lahko za uporabo izstavijo račun glede na število v odgovoru posredovanih znakov. Uporabljajte torej zmerno; začnite z malimi zahtevki, nato povečujte v skladu s pridobljenimi izkušnjami in zaupanjem. Primerno število vprašanj za prvi test je npr. 3 ."; +$ImportSessionAgendaReminderDescriptionDefault = "Živjo ((user_complete_name)). Vabljen si k sodelovanju v seji ((session_name)) v trajanju od ((date_start)) do ((date_end))."; +$ImportSessionAgendaReminderTitleDefault = "Vabilo v sejo ((session_name))"; +$MatchingCombination = "Ujemanje s točno izbiro"; +$HotSpotCombination = "Slikovno področje s točno izbiro"; +$LpAiGenerator = "AI generator učne poti"; +$LpAiTopic = "Tema"; +$LpAiTopicHelp = "Vtipkajte temo za katero želite, da vam AI pomočnik pomaga zgraditi učno pot. Bolj podrobna je tema, bom točni bodo dobljeni rezultati."; +$LpAiNumberOfItems = "Število elementov učne poti"; +$LpAiNumberOfItemsHelper = "Predstavlja število strani, za katere želite, da jih AI pomočnik zgenerira v vašo učno pot. Razdelitev učne poti v več strani, poglavij, sekcij (kakorkoli jih že želite poimenovati) bo v pomoč strukturirnaju tečaja, hkrati pa omogoča lažjo porazdelitev vsebine za boljšo predstavitev."; +$LpAiWordsCount = "Število besed"; +$LpAiWordsCountHelper = "Grobo ocenjeno največje število besed (dejansko število elementov), ki jih želite na posamezni strani. Večje število elementov verjetneje generira boljšo vsebino, porabi pa tudi več časa za generacijo in lahko predstavlja večji strošek za vašo organizacijo."; +$OnlySelectedUsersWillSeeTheContent = "Le izbrani uporabniki bodo imeli dostop do vsebine"; +$LeaveEmptyToEnableTheContentForEveryone = "Pustite prazno za dostop do vsebine vsem uporabnikom"; +$NumberOfQuestionsLimitedFromXToY = "Število vprašanj je omejeno na vrednost med %d in %d."; +$AddTestAfterEachPage = "Dodaj test po vsaki strani"; +$HiddenButVisibleForMe = "Skrito, a vidno zame"; +$EndOfLearningPath = "Zaključek"; +$UnableToDeleteTempFile = "Ne morem dostopati do začasne/temp datoteke"; +$DuplicatedUsers = "Podvojeni uporabniki"; +$ThisReportOnlyListsUsersThatHaveTheSameFirstnameAndLastname = "To poročilo podaja seznam zgolj uporabnikov z enakimi imeni in priimki"; +$ClassNameXDoesntExists = "Ne obstaja razred z imenom \"%s\""; +$NoMoreAccessible = "Ni več na voljo"; +$ExportExerciseAllResults = "Izvozi vse rezultate tega testa"; +$ExportExerciseNoResult = "V tem testu ni rezultatov za izvoz"; +$Exlearner = "Bivši-učeči"; +$FileSizeIsTooBig = "Velikost datoteke je prevelika."; +$AnErrorOccured = "Nastopila je napaka"; +$EmailPicture = "Slika za zaglavja"; +$AddEmailPicture = "DOdaj sliko za zaglavja"; +$AddEmailPictureComment = "Ta slika bo uporabljena v zaglavju tečaja, v e-poštnih sporočilih in PDF-jih, zgeneriranih v okviru tega tečaja. Uporabljena slika bo v razmerju 25:7. Ustrezno jo lahko obrežete jo lahko v postopku nalaganja."; +$DeleteEmailPicture = "Odstrani trenutno sliko za zaglavja"; +$AddPictureComment = "Končna slika mora imeti razmerje stranic 16:9, obrežete jo lahko tudi po nalaganju."; +$ExportAllExercisesAllResults = "Izvozi vse rezultate vseh testov."; +$ClickToViewDetails = "Kliknite za podrobnosti"; +$DateFormatddmmyyyy = "dd.mm.yyyy"; +$HideCareersHierarchy = "Skrij hierarhije"; +$ShowCareersHierarchy = "Prikaži hierarhije"; +$ParentCareer = "Starševska/nadrejena kariera"; +$CareerCannotBeDeletedAsItHasChildren = "Ta kariera ne more biti odstranjena dokler niso odstranjeni vsi njeni deli, ali dokler ti niso premaknjeni v drugo kariero."; +$EmailUsedTwiceInImportFile = "Ta e-poštni naslov je že v uporabi v povezavi z drugim uporabnikom v isti datoteki."; +$NotificationInYourForums = "Imate nove objave v naslednjih forumih vaših tečajev."; +$ExtraFieldIdComment = "Ta identifikator je notranji indentifikator v sistemu in ne more vsebovati presledkov ali posebnih znakov. Uporabljan je lahko v povezavi z vtiči sistema, za filtriranje povezanih elementov."; +$IncludeLastLogin = "Vključi zadnjo povezavo"; +$DuplicatedUsersByMail = "Podvojeni uporabniki po e-pošti"; +$ThisReportOnlyListsUsersThatHaveTheSameEmail = "To poročilo vsebuje zgolj uporabnike z istim e-mail naslovom."; +$CancelNotifyMe = "Prenehaj me obveščati"; +$EmptyExpirationDate = "Datum poteka ne more neopredeljen."; +$MailingTestNotSent = "E-poštno sporočilo ni bilo poslano. Razlog je lahko v nestreznem naslovu naslovnika, lahko da je naslovnih neaktiven ali pa je poštni strežnik neustrezno nastavljen (preverite datoetke mail.conf.php)."; +$PasswordExpiredPleaseSetNewPassword = "Vaše geslo je poteklo. Prosimo, da nastavite novega pred nadaljevanjem."; +$CopyIframeCodeToIncludeExercise = "Kopiraj iframe kodo spodaj za vključitev vaje :"; +$UpdateCourseListXMLCSV = "Ažuriraj seznam tečajev"; +$CodeIsRequired = "Koda je zahtevana"; +$CourseCodeDoesNotExist = "Ta koda tečaja ne obstaja"; +$DuplicateCode = "Podvojena koda"; +$CoursesUpdatedSuccessfully = "Tečaji so bili uspešno ažurirani"; +$UpdateFailedForCourses = "Ažuriranje ni uspelo za naslednje tečaje"; +$QuestionsWithNoAutomaticCorrection = "Vprašanja brez avtomatičnega ocenjevanja"; +$UsersReportByCourseInSessions = "Poročilo o napredku uporabnikov po tečajih, v vseh sejah"; +$UsersReport = "Poročilo o uporabnikih"; +$SelectAllUsers = "Izberi vse uporabnike"; +$SelectUsers = "Izberi uporabnike"; +$LearningpathName = "Ime učne poti"; +$StartingAccessDate = "Datum začetka dostopa"; +$EndingAccessDate = "Datum konca dostopa"; ?> \ No newline at end of file diff --git a/main/lang/spanish/trad4all.inc.php b/main/lang/spanish/trad4all.inc.php index f9712e5532..d478d8824f 100644 --- a/main/lang/spanish/trad4all.inc.php +++ b/main/lang/spanish/trad4all.inc.php @@ -9098,4 +9098,9 @@ $MoodleVersion = "Versión de Moodle"; $CreateExport = "Crear archivo de exporte"; $MoodleExportAdminIDComment = "Moodle requiere la indentificación de algún usuario para almacenarla dentro de los archivos XML del formato .mbz. Por favor indique un número de ID interno (entero) del usuario quien está exportando este curso, o el ID interno del usuario en Moodle para el usuario quien será propietario de los recursos importados. Si tiene duda, puede simplemente marcar '1' y algunos datos falsos para seguir."; $DropboxVulnerabilityWarning = "Recuerde únicamente descargar archivos enviados por personas conocidas. Si tiene dudas, use un anti-virus en su computadora para reducir el riesgo de daños a sus datos."; +$SessionExpiredAt = "Sesión expirada el"; +$DueToInactivityTheSessionIsGoingToClose = "Debido a su inactividad, esta sesión se cerrará en"; +$KeepGoing = "Seguir conectado"; +$SessionIsClosing = "Su sesión se está cerrando"; +$CannotChangeVisibilityOfBaseCourseResourceX = "La visibilidad de %s del curso base no puede ser cambiada desde una sesión."; ?> \ No newline at end of file diff --git a/main/lp/learnpath.class.php b/main/lp/learnpath.class.php index 07f7346522..20bf4ac399 100755 --- a/main/lp/learnpath.class.php +++ b/main/lp/learnpath.class.php @@ -3710,18 +3710,55 @@ class learnpath 'zip', 'ppt', 'pptx', - 'ods', - 'xlsx', + 'odp', 'xls', + 'xlsx', + 'ods', 'csv', 'doc', 'docx', + 'odt', + 'pdf', 'dot', ]; + $officeExtensions = [ + 'ppt', + 'pptx', + 'odp', + 'xls', + 'xlsx', + 'ods', + 'csv', + 'doc', + 'docx', + 'odt', + 'pdf', + ]; if (in_array($extension, $extensionsToDownload)) { - $file = api_get_path(WEB_CODE_PATH). - 'lp/embed.php?type=download&source=file&lp_item_id='.$item_id.'&'.api_get_cidreq(); + $found = false; + if (in_array($extension, $officeExtensions)) { + $onlyOffice = OnlyofficePlugin::create(); + if ($onlyOffice->isEnabled()) { + $lpItem = $this->getItem($item_id); + if ($lpItem->get_type() == 'document') { + $docId = $lpItem->get_path(); + if (method_exists('OnlyofficeTools', 'getPathToView')) { + $pathToView = OnlyofficeTools::getPathToView($docId, false); + // getPathView returns empty on error, so if this is the case, + // fallback to normal viewer/downloader + if (!empty($pathToView)) { + $file = $pathToView; + $found = true; + } + } + } + } + } + if (false === $found) { + $file = api_get_path(WEB_CODE_PATH). + 'lp/embed.php?type=download&source=file&lp_item_id='.$item_id.'&'.api_get_cidreq(); + } } } } diff --git a/main/lp/learnpathList.class.php b/main/lp/learnpathList.class.php index 700d089d75..1c52358658 100755 --- a/main/lp/learnpathList.class.php +++ b/main/lp/learnpathList.class.php @@ -28,7 +28,7 @@ class LearnpathList * (only displays) items if he has enough permissions to view them. * * @param int $user_id - * @param array $courseInfo Optional course code (otherwise we use api_get_course_id()) + * @param array $courseInfo Optional course info array (otherwise we use api_get_course_info()) * @param int $session_id Optional session id (otherwise we use api_get_session_id()) * @param string $order_by * @param bool $check_publication_dates diff --git a/main/mySpace/myStudents.php b/main/mySpace/myStudents.php index 6c2b92acf1..73fef8f1a3 100755 --- a/main/mySpace/myStudents.php +++ b/main/mySpace/myStudents.php @@ -2405,11 +2405,11 @@ if (!empty($sessionId)) { $allow = api_get_configuration_value('allow_user_message_tracking'); if ($allow && (api_is_drh() || api_is_platform_admin())) { if ($filterMessages) { - $users = MessageManager::getUsersThatHadConversationWithUser($student_id, $coachAccessStartDate, $coachAccessEndDate); + $users = MessageManager::getMessageExchangeWithUser($student_id, $coachAccessStartDate, $coachAccessEndDate); } else { - $users = MessageManager::getUsersThatHadConversationWithUser($student_id); + $users = MessageManager::getMessageExchangeWithUser($student_id); } - $users = MessageManager::getUsersThatHadConversationWithUser($student_id); + echo Display::page_subheader2(get_lang('MessageTracking')); $table = new HTML_Table(['class' => 'table']); diff --git a/main/template/default/exercise/reading_comprehension.tpl b/main/template/default/exercise/reading_comprehension.tpl index 0c44d2624d..99f5b6c161 100644 --- a/main/template/default/exercise/reading_comprehension.tpl +++ b/main/template/default/exercise/reading_comprehension.tpl @@ -41,16 +41,16 @@ } .question-reading-comprehension-text .text-highlight { color: transparent; - -webkit-text-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - -khtml-text-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - -moz-text-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - -ms-text-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - text-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - -webkit-transition: color .8s linear, text-shadow .8s linear; - -khtml-transition: color .8s linear, text-shadow .8s linear; - -moz-transition: color .8s linear, text-shadow .8s linear; - -ms-transition: color .8s linear, text-shadow .8s linear; - transition: color .8s linear, text-shadow .8s linear; + -webkit-text-shadow: 0 0 12px rgba(0, 0, 0, 0.5); + -khtml-text-shadow: 0 0 12px rgba(0, 0, 0, 0.5); + -moz-text-shadow: 0 0 12px rgba(0, 0, 0, 0.5); + -ms-text-shadow: 0 0 12px rgba(0, 0, 0, 0.5); + text-shadow: 0 0 12px rgba(0, 0, 0, 0.5); + -webkit-transition: color .12s linear, text-shadow .12s linear; + -khtml-transition: color .12s linear, text-shadow .12s linear; + -moz-transition: color .12s linear, text-shadow .12s linear; + -ms-transition: color .12s linear, text-shadow .12s linear; + transition: color .12s linear, text-shadow .12s linear; } .question-reading-comprehension-text .text-highlight.active { color: #000; @@ -59,11 +59,11 @@ -moz-text-shadow: none; -ms-text-shadow: none; text-shadow: none; - -webkit-transition: color .8s linear, text-shadow .8s linear; - -khtml-transition: color .8s linear, text-shadow .8s linear; - -moz-transition: color .8s linear, text-shadow .8s linear; - -ms-transition: color .8s linear, text-shadow .8s linear; - transition: color .8s linear, text-shadow .8s linear; + -webkit-transition: color .12s linear, text-shadow .12s linear; + -khtml-transition: color .12s linear, text-shadow .12s linear; + -moz-transition: color .12s linear, text-shadow .12s linear; + -ms-transition: color .12s linear, text-shadow .12s linear; + transition: color .12s linear, text-shadow .12s linear; } .question-reading-comprehension-text .text-highlight.border { color: #bbb; @@ -72,11 +72,11 @@ -moz-text-shadow: none; -ms-text-shadow: none; text-shadow: none; - -webkit-transition: color .8s linear, text-shadow .8s linear; - -khtml-transition: color .8s linear, text-shadow .8s linear; - -moz-transition: color .8s linear, text-shadow .8s linear; - -ms-transition: color .8s linear, text-shadow .8s linear; - transition: color .8s linear, text-shadow .8s linear; + -webkit-transition: color .12s linear, text-shadow .12s linear; + -khtml-transition: color .12s linear, text-shadow .12s linear; + -moz-transition: color .12s linear, text-shadow .12s linear; + -ms-transition: color .12s linear, text-shadow .12s linear; + transition: color .12s linear, text-shadow .12s linear; } .question-reading-comprehension-text br { margin-bottom: 1em; diff --git a/main/template/default/layout/main.js.tpl b/main/template/default/layout/main.js.tpl index c1e59534d4..a16af7129d 100644 --- a/main/template/default/layout/main.js.tpl +++ b/main/template/default/layout/main.js.tpl @@ -5,6 +5,9 @@ var offline_button = ''; var connect_lang = '{{ "ChatConnected"|get_lang | escape('js')}}'; var disconnect_lang = '{{ "ChatDisconnected"|get_lang | escape('js')}}'; var chatLang = '{{ "GlobalChat"|get_lang | escape('js')}}'; +var sessionRemainingSeconds = 0; +var sessionCounterInterval; +var sessionClosing = false; {% if 'hide_chat_video'|api_get_configuration_value %} var hide_chat_video = true; @@ -443,6 +446,10 @@ $(function() { }); }); {% endif %} + + if (window.self === window.top) { + checkSessionTime(); + } }); $(window).resize(function() { @@ -731,3 +738,193 @@ function copyTextToClipBoard(elementId) /* Copy the text inside the text field */ document.execCommand("copy"); } + +function checkSessionTime() +{ + fetch('/main/inc/ajax/session_clock.ajax.php?action=time') + .then(response => { + if (!response.ok) { + throw new Error('Server error: ' + response.statusText); + } + return response.json(); + }) + .then(data => { + if (data.sessionTimeLeft <= 0) { + if (!document.getElementById('session-checker-overlay')) { + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + + var now = new Date(); + var day = String(now.getDate()).padStart(2, '0'); + var month = String(now.getMonth() + 1).padStart(2, '0'); + var year = now.getFullYear(); + var hour = String(now.getHours()).padStart(2, '0'); + var minutes = String(now.getMinutes()).padStart(2, '0'); + + var dateTimeSessionExpired = day + '/' + month + '/' + year + ' ' + hour + ':' + minutes; + + document.body.insertAdjacentHTML('afterbegin', '

    {{ 'SessionExpiredAt' | get_lang | escape('js')}} ' + dateTimeSessionExpired + '.

    '); + } + } else if (data.sessionTimeLeft <= 110) { + sessionRemainingSeconds = data.sessionTimeLeft - 5; + + if (sessionRemainingSeconds < 0) { + sessionRemainingSeconds = 0; + } + + if (!document.getElementById('session-count-overlay')) { + document.body.insertAdjacentHTML('afterbegin', '

    {{ 'DueToInactivityTheSessionIsGoingToClose' | get_lang | escape('js')}} ' + sessionRemainingSeconds + ' {{ 'Seconds' | get_lang | escape('js')}}

    '); + + sessionCounterInterval = setInterval(updateSessionTimeCounter, 1000); + } + setTimeout(checkSessionTime, 60000); + } else { + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + + setTimeout(checkSessionTime, 60000); + } + }) + .catch(error => console.error('Error:', error)); +} + +function extendSession() { + fetch('/main/inc/ajax/online.ajax.php') + .then(response => { + if (!response.ok) { + throw new Error('Server error: ' + response.statusText); + } + return response; + }) + .then(data => { + console.log('Session extended'); + + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + }) + .catch(error => console.error('Error:', error)); +} + +function updateSessionTimeCounter() { + var sessionCounter = document.getElementById('session-counter'); + if (sessionRemainingSeconds > 3) { + sessionCounter.innerHTML = '{{ 'DueToInactivityTheSessionIsGoingToClose' | get_lang | escape('js')}} ' + sessionRemainingSeconds + ' {{ 'Seconds' | get_lang | escape('js')}}'; + sessionRemainingSeconds--; + } else if (sessionRemainingSeconds <= 3 && sessionRemainingSeconds > 1) { + var currentUrl = window.location.href; + if (currentUrl.includes('lp_controller.php') && currentUrl.includes('lp_id=') && currentUrl.includes('action=view')) { + + if (!sessionClosing) { + var btnSessionExtend = document.getElementById('btn-session-extend'); + if (btnSessionExtend) { + btnSessionExtend.remove(); + } + + document.getElementById('session-counter').innerHTML = '{{ 'SessionIsClosing' | get_lang | escape('js')}}'; + + setTimeout(function() { + fetch('/main/inc/ajax/session_clock.ajax.php?action=logout') + .then(response => response.json()) + .then(data => { + if (!document.getElementById('session-checker-overlay')) { + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + + var now = new Date(); + var day = String(now.getDate()).padStart(2, '0'); + var month = String(now.getMonth() + 1).padStart(2, '0'); + var year = now.getFullYear(); + var hour = String(now.getHours()).padStart(2, '0'); + var minutes = String(now.getMinutes()).padStart(2, '0'); + + var dateTimeSessionExpired = day + '/' + month + '/' + year + ' ' + hour + ':' + minutes; + + document.body.insertAdjacentHTML('afterbegin', '

    {{ 'SessionExpiredAt' | get_lang | escape('js')}} ' + dateTimeSessionExpired + '.

    '); + } + }) + .catch((error) => { + console.error('Error:', error); + }); + }, 1000); + + lastCall(); + } + sessionClosing = true; + } + else { + if (!sessionClosing) { + var btnSessionExtend = document.getElementById('btn-session-extend'); + if (btnSessionExtend) { + btnSessionExtend.remove(); + } + + document.getElementById('session-counter').innerHTML = '{{ 'SessionIsClosing' | get_lang | escape('js')}}'; + + setTimeout(function() { + fetch('/main/inc/ajax/session_clock.ajax.php?action=logout') + .then(response => response.json()) + .then(data => { + if (!document.getElementById('session-checker-overlay')) { + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + + var now = new Date(); + var day = String(now.getDate()).padStart(2, '0'); + var month = String(now.getMonth() + 1).padStart(2, '0'); + var year = now.getFullYear(); + var hour = String(now.getHours()).padStart(2, '0'); + var minutes = String(now.getMinutes()).padStart(2, '0'); + + var dateTimeSessionExpired = day + '/' + month + '/' + year + ' ' + hour + ':' + minutes; + + document.body.insertAdjacentHTML('afterbegin', '

    {{ 'SessionExpiredAt' | get_lang | escape('js')}} ' + dateTimeSessionExpired + '.

    '); + } + }) + .catch((error) => { + console.error('Error:', error); + }); + }, 1000); + } + sessionClosing = true; + } + } + else { + clearInterval(sessionCounterInterval); + + var counterOverlay = document.getElementById('session-count-overlay'); + if (counterOverlay) { + counterOverlay.remove(); + } + + var now = new Date(); + var day = String(now.getDate()).padStart(2, '0'); + var month = String(now.getMonth() + 1).padStart(2, '0'); + var year = now.getFullYear(); + var hour = String(now.getHours()).padStart(2, '0'); + var minutes = String(now.getMinutes()).padStart(2, '0'); + + var dateTimeSessionExpired = day + '/' + month + '/' + year + ' ' + hour + ':' + minutes; + + document.body.insertAdjacentHTML('afterbegin', '

    {{ 'SessionExpiredAt' | get_lang | escape('js')}} ' + dateTimeSessionExpired + '.

    '); + } +} diff --git a/plugin/customcertificate/src/print_certificate.php b/plugin/customcertificate/src/print_certificate.php index 76b4331f65..75d2c42dff 100644 --- a/plugin/customcertificate/src/print_certificate.php +++ b/plugin/customcertificate/src/print_certificate.php @@ -402,7 +402,7 @@ foreach ($userList as $userInfo) { $list = new LearnpathList( $studentId, - $courseCode, + $courseInfo, $sessionId, null, false, diff --git a/plugin/onlyoffice/.php-cs-fixer.dist.php b/plugin/onlyoffice/.php-cs-fixer.dist.php new file mode 100644 index 0000000000..247927d73a --- /dev/null +++ b/plugin/onlyoffice/.php-cs-fixer.dist.php @@ -0,0 +1,37 @@ + true, + 'array_syntax' => [ + 'syntax' => 'short', + ], + 'blank_line_after_opening_tag' => false, + 'no_extra_blank_lines' => true, + 'multiline_comment_opening_closing' => true, + 'yoda_style' => false, + 'phpdoc_to_comment' => false, + 'phpdoc_no_package' => false, + 'phpdoc_annotation_without_dot' => false, + 'increment_style' => ['style' => 'post'], + 'no_useless_else' => false, + 'single_quote' => false, + 'no_useless_return' => true, + 'ordered_class_elements' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'no_break_comment' => true, +]; + +$finder = PhpCsFixer\Finder::create() + ->exclude('3rdparty') + ->exclude('assets') + ->exclude('layout') + ->exclude('resources') + ->in(__DIR__) +; + +$config = new PhpCsFixer\Config(); +return $config->setRules( + $rules + ) + ->setFinder($finder); \ No newline at end of file diff --git a/plugin/onlyoffice/.php-cs-fixer.php b/plugin/onlyoffice/.php-cs-fixer.php new file mode 100644 index 0000000000..4404a4e35c --- /dev/null +++ b/plugin/onlyoffice/.php-cs-fixer.php @@ -0,0 +1,3 @@ + - * @author Anant Narayanan - * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD - * @link https://github.com/firebase/php-jwt - */ -class JWT -{ - - /** - * When checking nbf, iat or expiration times, - * we want to provide some extra leeway time to - * account for clock skew. - */ - public static $leeway = 0; - - /** - * Allow the current timestamp to be specified. - * Useful for fixing a value within unit testing. - * - * Will default to PHP time() value if null. - */ - public static $timestamp = null; - - public static $supported_algs = array( - 'HS256' => array('hash_hmac', 'SHA256'), - 'HS512' => array('hash_hmac', 'SHA512'), - 'HS384' => array('hash_hmac', 'SHA384'), - 'RS256' => array('openssl', 'SHA256'), - ); - - /** - * Decodes a JWT string into a PHP object. - * - * @param string $jwt The JWT - * @param string|array $key The key, or map of keys. - * If the algorithm used is asymmetric, this is the public key - * @param array $allowed_algs List of supported verification algorithms - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' - * - * @return object The JWT's payload as a PHP object - * - * @throws UnexpectedValueException Provided JWT was invalid - * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed - * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' - * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' - * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim - * - * @uses jsonDecode - * @uses urlsafeB64Decode - */ - public static function decode($jwt, $key, $allowed_algs = array()) - { - $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp; - - if (empty($key)) { - throw new InvalidArgumentException('Key may not be empty'); - } - if (!is_array($allowed_algs)) { - throw new InvalidArgumentException('Algorithm not allowed'); - } - $tks = explode('.', $jwt); - if (count($tks) != 3) { - throw new UnexpectedValueException('Wrong number of segments'); - } - list($headb64, $bodyb64, $cryptob64) = $tks; - if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) { - throw new UnexpectedValueException('Invalid header encoding'); - } - if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) { - throw new UnexpectedValueException('Invalid claims encoding'); - } - $sig = static::urlsafeB64Decode($cryptob64); - - if (empty($header->alg)) { - throw new UnexpectedValueException('Empty algorithm'); - } - if (empty(static::$supported_algs[$header->alg])) { - throw new UnexpectedValueException('Algorithm not supported'); - } - if (!in_array($header->alg, $allowed_algs)) { - throw new UnexpectedValueException('Algorithm not allowed'); - } - if (is_array($key) || $key instanceof \ArrayAccess) { - if (isset($header->kid)) { - $key = $key[$header->kid]; - } else { - throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); - } - } - - // Check the signature - if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) { - throw new SignatureInvalidException('Signature verification failed'); - } - - // Check if the nbf if it is defined. This is the time that the - // token can actually be used. If it's not yet that time, abort. - if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) { - throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf) - ); - } - - // Check that this token has been created before 'now'. This prevents - // using tokens that have been created for later use (and haven't - // correctly used the nbf claim). - if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) { - throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat) - ); - } - - // Check if this token has expired. - if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) { - throw new ExpiredException('Expired token'); - } - - return $payload; - } - - /** - * Converts and signs a PHP object or array into a JWT string. - * - * @param object|array $payload PHP object or array - * @param string $key The secret key. - * If the algorithm used is asymmetric, this is the private key - * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' - * @param mixed $keyId - * @param array $head An array with header elements to attach - * - * @return string A signed JWT - * - * @uses jsonEncode - * @uses urlsafeB64Encode - */ - public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null) - { - $header = array('typ' => 'JWT', 'alg' => $alg); - if ($keyId !== null) { - $header['kid'] = $keyId; - } - if ( isset($head) && is_array($head) ) { - $header = array_merge($head, $header); - } - $segments = array(); - $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); - $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); - $signing_input = implode('.', $segments); - - $signature = static::sign($signing_input, $key, $alg); - $segments[] = static::urlsafeB64Encode($signature); - - return implode('.', $segments); - } - - /** - * Sign a string with a given key and algorithm. - * - * @param string $msg The message to sign - * @param string|resource $key The secret key - * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' - * - * @return string An encrypted message - * - * @throws DomainException Unsupported algorithm was specified - */ - public static function sign($msg, $key, $alg = 'HS256') - { - if (empty(static::$supported_algs[$alg])) { - throw new DomainException('Algorithm not supported'); - } - list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { - case 'hash_hmac': - return hash_hmac($algorithm, $msg, $key, true); - case 'openssl': - $signature = ''; - $success = openssl_sign($msg, $signature, $key, $algorithm); - if (!$success) { - throw new DomainException("OpenSSL unable to sign data"); - } else { - return $signature; - } - } - } - - /** - * Verify a signature with the message, key and method. Not all methods - * are symmetric, so we must have a separate verify and sign method. - * - * @param string $msg The original message (header and body) - * @param string $signature The original signature - * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key - * @param string $alg The algorithm - * - * @return bool - * - * @throws DomainException Invalid Algorithm or OpenSSL failure - */ - private static function verify($msg, $signature, $key, $alg) - { - if (empty(static::$supported_algs[$alg])) { - throw new DomainException('Algorithm not supported'); - } - - list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { - case 'openssl': - $success = openssl_verify($msg, $signature, $key, $algorithm); - if (!$success) { - throw new DomainException("OpenSSL unable to verify data: " . openssl_error_string()); - } else { - return $signature; - } - case 'hash_hmac': - default: - $hash = hash_hmac($algorithm, $msg, $key, true); - if (function_exists('hash_equals')) { - return hash_equals($signature, $hash); - } - $len = min(static::safeStrlen($signature), static::safeStrlen($hash)); - - $status = 0; - for ($i = 0; $i < $len; $i++) { - $status |= (ord($signature[$i]) ^ ord($hash[$i])); - } - $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash)); - - return ($status === 0); - } - } - - /** - * Decode a JSON string into a PHP object. - * - * @param string $input JSON string - * - * @return object Object representation of JSON string - * - * @throws DomainException Provided string was invalid JSON - */ - public static function jsonDecode($input) - { - if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) { - /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you - * to specify that large ints (like Steam Transaction IDs) should be treated as - * strings, rather than the PHP default behaviour of converting them to floats. - */ - $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING); - } else { - /** Not all servers will support that, however, so for older versions we must - * manually detect large ints in the JSON string and quote them (thus converting - *them to strings) before decoding, hence the preg_replace() call. - */ - $max_int_length = strlen((string) PHP_INT_MAX) - 1; - $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input); - $obj = json_decode($json_without_bigints); - } - - if (function_exists('json_last_error') && $errno = json_last_error()) { - static::handleJsonError($errno); - } elseif ($obj === null && $input !== 'null') { - throw new DomainException('Null result with non-null input'); - } - return $obj; - } - - /** - * Encode a PHP object into a JSON string. - * - * @param object|array $input A PHP object or array - * - * @return string JSON representation of the PHP object or array - * - * @throws DomainException Provided object could not be encoded to valid JSON - */ - public static function jsonEncode($input) - { - $json = json_encode($input); - if (function_exists('json_last_error') && $errno = json_last_error()) { - static::handleJsonError($errno); - } elseif ($json === 'null' && $input !== null) { - throw new DomainException('Null result with non-null input'); - } - return $json; - } - - /** - * Decode a string with URL-safe Base64. - * - * @param string $input A Base64 encoded string - * - * @return string A decoded string - */ - public static function urlsafeB64Decode($input) - { - $remainder = strlen($input) % 4; - if ($remainder) { - $padlen = 4 - $remainder; - $input .= str_repeat('=', $padlen); - } - return base64_decode(strtr($input, '-_', '+/')); - } - - /** - * Encode a string with URL-safe Base64. - * - * @param string $input The string you want encoded - * - * @return string The base64 encode of what you passed in - */ - public static function urlsafeB64Encode($input) - { - return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); - } - - /** - * Helper method to create a JSON error. - * - * @param int $errno An error number from json_last_error() - * - * @return void - */ - private static function handleJsonError($errno) - { - $messages = array( - JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', - JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', - JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON' - ); - throw new DomainException( - isset($messages[$errno]) - ? $messages[$errno] - : 'Unknown JSON error: ' . $errno - ); - } - - /** - * Get the number of bytes in cryptographic strings. - * - * @param string - * - * @return int - */ - private static function safeStrlen($str) - { - if (function_exists('mb_strlen')) { - return mb_strlen($str, '8bit'); - } - return strlen($str); - } -} diff --git a/plugin/onlyoffice/3rdparty/jwt/LICENSE.txt b/plugin/onlyoffice/3rdparty/jwt/LICENSE.txt deleted file mode 100644 index cb0c49b331..0000000000 --- a/plugin/onlyoffice/3rdparty/jwt/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c) 2011, Neuman Vong - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of Neuman Vong nor the names of other - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plugin/onlyoffice/3rdparty/jwt/SignatureInvalidException.php b/plugin/onlyoffice/3rdparty/jwt/SignatureInvalidException.php deleted file mode 100644 index 27332b21be..0000000000 --- a/plugin/onlyoffice/3rdparty/jwt/SignatureInvalidException.php +++ /dev/null @@ -1,7 +0,0 @@ - "Not permitted"]); + echo json_encode(['error' => 'Not permitted']); + return; } $fileExt = strtolower(pathinfo($title, PATHINFO_EXTENSION)); $baseName = strtolower(pathinfo($title, PATHINFO_FILENAME)); -$result = FileUtility::createFile( +$result = OnlyofficeDocumentManager::createFile( $baseName, $fileExt, $folderId, @@ -71,16 +70,17 @@ $result = FileUtility::createFile( $url ); -if (isset($result["error"])) { - if ($result["error"] === "fileIsExist") { - $result["error"] = "File is exist"; +if (isset($result['error'])) { + if ('fileIsExist' === $result['error']) { + $result['error'] = 'File already exists'; } - if ($result["error"] === "impossibleCreateFile") { - $result["error"] = "Impossible to create file"; + if ('impossibleCreateFile' === $result['error']) { + $result['error'] = 'Impossible to create file'; } echo json_encode($result); + return; } -echo json_encode(["success" => "File is created"]); \ No newline at end of file +echo json_encode(['success' => 'File is created']); diff --git a/plugin/onlyoffice/assets/README.md b/plugin/onlyoffice/assets/README.md index e24a9e3cae..63685d9d2a 100644 --- a/plugin/onlyoffice/assets/README.md +++ b/plugin/onlyoffice/assets/README.md @@ -3,3 +3,4 @@ Template files used to create new documents and documents with sample content in: * [Chamilo ONLYOFFICE integration plugin](https://github.com/onlyoffice/onlyoffice-chamilo) + diff --git a/plugin/onlyoffice/assets/ar/docx.zip b/plugin/onlyoffice/assets/ar/docx.zip new file mode 100644 index 0000000000..648149fe77 Binary files /dev/null and b/plugin/onlyoffice/assets/ar/docx.zip differ diff --git a/plugin/onlyoffice/assets/ar/pdf.zip b/plugin/onlyoffice/assets/ar/pdf.zip new file mode 100644 index 0000000000..c37599bfd4 Binary files /dev/null and b/plugin/onlyoffice/assets/ar/pdf.zip differ diff --git a/plugin/onlyoffice/assets/ar/pptx.zip b/plugin/onlyoffice/assets/ar/pptx.zip new file mode 100644 index 0000000000..d0856ae28a Binary files /dev/null and b/plugin/onlyoffice/assets/ar/pptx.zip differ diff --git a/plugin/onlyoffice/assets/ar/xlsx.zip b/plugin/onlyoffice/assets/ar/xlsx.zip new file mode 100644 index 0000000000..5881eb89b9 Binary files /dev/null and b/plugin/onlyoffice/assets/ar/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/az-Latn-AZ/docxf.zip b/plugin/onlyoffice/assets/az-Latn-AZ/docxf.zip deleted file mode 100644 index 955fa5b6e3..0000000000 Binary files a/plugin/onlyoffice/assets/az-Latn-AZ/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/az-Latn-AZ/docx.zip b/plugin/onlyoffice/assets/az/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/az-Latn-AZ/docx.zip rename to plugin/onlyoffice/assets/az/docx.zip diff --git a/plugin/onlyoffice/assets/az/pdf.zip b/plugin/onlyoffice/assets/az/pdf.zip new file mode 100644 index 0000000000..ed5f73aa98 Binary files /dev/null and b/plugin/onlyoffice/assets/az/pdf.zip differ diff --git a/plugin/onlyoffice/assets/az-Latn-AZ/pptx.zip b/plugin/onlyoffice/assets/az/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/az-Latn-AZ/pptx.zip rename to plugin/onlyoffice/assets/az/pptx.zip diff --git a/plugin/onlyoffice/assets/az/xlsx.zip b/plugin/onlyoffice/assets/az/xlsx.zip new file mode 100644 index 0000000000..b0e5163ee9 Binary files /dev/null and b/plugin/onlyoffice/assets/az/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/bg-BG/docxf.zip b/plugin/onlyoffice/assets/bg-BG/docxf.zip deleted file mode 100644 index 17a8f450ca..0000000000 Binary files a/plugin/onlyoffice/assets/bg-BG/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/bg-BG/docx.zip b/plugin/onlyoffice/assets/bg/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/bg-BG/docx.zip rename to plugin/onlyoffice/assets/bg/docx.zip diff --git a/plugin/onlyoffice/assets/bg/pdf.zip b/plugin/onlyoffice/assets/bg/pdf.zip new file mode 100644 index 0000000000..c77cb93f33 Binary files /dev/null and b/plugin/onlyoffice/assets/bg/pdf.zip differ diff --git a/plugin/onlyoffice/assets/bg-BG/pptx.zip b/plugin/onlyoffice/assets/bg/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/bg-BG/pptx.zip rename to plugin/onlyoffice/assets/bg/pptx.zip diff --git a/plugin/onlyoffice/assets/bg-BG/xlsx.zip b/plugin/onlyoffice/assets/bg/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/bg-BG/xlsx.zip rename to plugin/onlyoffice/assets/bg/xlsx.zip diff --git a/plugin/onlyoffice/assets/cs-CZ/docxf.zip b/plugin/onlyoffice/assets/cs-CZ/docxf.zip deleted file mode 100644 index 9f5770aa36..0000000000 Binary files a/plugin/onlyoffice/assets/cs-CZ/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/cs-CZ/xlsx.zip b/plugin/onlyoffice/assets/cs-CZ/xlsx.zip deleted file mode 100644 index 3d91bd8072..0000000000 Binary files a/plugin/onlyoffice/assets/cs-CZ/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/cs-CZ/docx.zip b/plugin/onlyoffice/assets/cs/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/cs-CZ/docx.zip rename to plugin/onlyoffice/assets/cs/docx.zip diff --git a/plugin/onlyoffice/assets/cs/pdf.zip b/plugin/onlyoffice/assets/cs/pdf.zip new file mode 100644 index 0000000000..9ee58dc383 Binary files /dev/null and b/plugin/onlyoffice/assets/cs/pdf.zip differ diff --git a/plugin/onlyoffice/assets/cs-CZ/pptx.zip b/plugin/onlyoffice/assets/cs/pptx.zip similarity index 85% rename from plugin/onlyoffice/assets/cs-CZ/pptx.zip rename to plugin/onlyoffice/assets/cs/pptx.zip index 89cae8e456..7df969d1a2 100644 Binary files a/plugin/onlyoffice/assets/cs-CZ/pptx.zip and b/plugin/onlyoffice/assets/cs/pptx.zip differ diff --git a/plugin/onlyoffice/assets/cs/xlsx.zip b/plugin/onlyoffice/assets/cs/xlsx.zip new file mode 100644 index 0000000000..4951711b8f Binary files /dev/null and b/plugin/onlyoffice/assets/cs/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/de-DE/docxf.zip b/plugin/onlyoffice/assets/de-DE/docxf.zip deleted file mode 100644 index f502c9ee1e..0000000000 Binary files a/plugin/onlyoffice/assets/de-DE/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/de-DE/pptx.zip b/plugin/onlyoffice/assets/de-DE/pptx.zip deleted file mode 100644 index 8ed32bd7d9..0000000000 Binary files a/plugin/onlyoffice/assets/de-DE/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/de-DE/docx.zip b/plugin/onlyoffice/assets/de/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/de-DE/docx.zip rename to plugin/onlyoffice/assets/de/docx.zip diff --git a/plugin/onlyoffice/assets/de/pdf.zip b/plugin/onlyoffice/assets/de/pdf.zip new file mode 100644 index 0000000000..73a6cdb600 Binary files /dev/null and b/plugin/onlyoffice/assets/de/pdf.zip differ diff --git a/plugin/onlyoffice/assets/de/pptx.zip b/plugin/onlyoffice/assets/de/pptx.zip new file mode 100644 index 0000000000..f299b21704 Binary files /dev/null and b/plugin/onlyoffice/assets/de/pptx.zip differ diff --git a/plugin/onlyoffice/assets/de-DE/xlsx.zip b/plugin/onlyoffice/assets/de/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/de-DE/xlsx.zip rename to plugin/onlyoffice/assets/de/xlsx.zip diff --git a/plugin/onlyoffice/assets/en-US/docx.zip b/plugin/onlyoffice/assets/default/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/en-US/docx.zip rename to plugin/onlyoffice/assets/default/docx.zip diff --git a/plugin/onlyoffice/assets/default/pdf.zip b/plugin/onlyoffice/assets/default/pdf.zip new file mode 100644 index 0000000000..94bfad30a1 Binary files /dev/null and b/plugin/onlyoffice/assets/default/pdf.zip differ diff --git a/plugin/onlyoffice/assets/en-US/pptx.zip b/plugin/onlyoffice/assets/default/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/en-US/pptx.zip rename to plugin/onlyoffice/assets/default/pptx.zip diff --git a/plugin/onlyoffice/assets/en-US/xlsx.zip b/plugin/onlyoffice/assets/default/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/en-US/xlsx.zip rename to plugin/onlyoffice/assets/default/xlsx.zip diff --git a/plugin/onlyoffice/assets/el-GR/docxf.zip b/plugin/onlyoffice/assets/el-GR/docxf.zip deleted file mode 100644 index c8261bc553..0000000000 Binary files a/plugin/onlyoffice/assets/el-GR/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/el-GR/pptx.zip b/plugin/onlyoffice/assets/el-GR/pptx.zip deleted file mode 100644 index 4b2ebd572c..0000000000 Binary files a/plugin/onlyoffice/assets/el-GR/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/el-GR/docx.zip b/plugin/onlyoffice/assets/el/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/el-GR/docx.zip rename to plugin/onlyoffice/assets/el/docx.zip diff --git a/plugin/onlyoffice/assets/el/pdf.zip b/plugin/onlyoffice/assets/el/pdf.zip new file mode 100644 index 0000000000..53c65339bf Binary files /dev/null and b/plugin/onlyoffice/assets/el/pdf.zip differ diff --git a/plugin/onlyoffice/assets/el/pptx.zip b/plugin/onlyoffice/assets/el/pptx.zip new file mode 100644 index 0000000000..addb11a0ae Binary files /dev/null and b/plugin/onlyoffice/assets/el/pptx.zip differ diff --git a/plugin/onlyoffice/assets/el/xlsx.zip b/plugin/onlyoffice/assets/el/xlsx.zip new file mode 100644 index 0000000000..03e2f959bb Binary files /dev/null and b/plugin/onlyoffice/assets/el/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/en-GB/docxf.zip b/plugin/onlyoffice/assets/en-GB/docxf.zip deleted file mode 100644 index 72ad98df5b..0000000000 Binary files a/plugin/onlyoffice/assets/en-GB/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/en-GB/pdf.zip b/plugin/onlyoffice/assets/en-GB/pdf.zip new file mode 100644 index 0000000000..ec490f8cee Binary files /dev/null and b/plugin/onlyoffice/assets/en-GB/pdf.zip differ diff --git a/plugin/onlyoffice/assets/en-US/docxf.zip b/plugin/onlyoffice/assets/en-US/docxf.zip deleted file mode 100644 index fb04a48d03..0000000000 Binary files a/plugin/onlyoffice/assets/en-US/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/en/docx.zip b/plugin/onlyoffice/assets/en/docx.zip new file mode 100644 index 0000000000..dfde0c595d Binary files /dev/null and b/plugin/onlyoffice/assets/en/docx.zip differ diff --git a/plugin/onlyoffice/assets/en/pdf.zip b/plugin/onlyoffice/assets/en/pdf.zip new file mode 100644 index 0000000000..4904fc9a09 Binary files /dev/null and b/plugin/onlyoffice/assets/en/pdf.zip differ diff --git a/plugin/onlyoffice/assets/en/pptx.zip b/plugin/onlyoffice/assets/en/pptx.zip new file mode 100644 index 0000000000..df6dff517e Binary files /dev/null and b/plugin/onlyoffice/assets/en/pptx.zip differ diff --git a/plugin/onlyoffice/assets/en/xlsx.zip b/plugin/onlyoffice/assets/en/xlsx.zip new file mode 100644 index 0000000000..a41b7514ad Binary files /dev/null and b/plugin/onlyoffice/assets/en/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/es-ES/docxf.zip b/plugin/onlyoffice/assets/es-ES/docxf.zip deleted file mode 100644 index 765291857a..0000000000 Binary files a/plugin/onlyoffice/assets/es-ES/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/es-ES/pptx.zip b/plugin/onlyoffice/assets/es-ES/pptx.zip deleted file mode 100644 index b8dd1489a4..0000000000 Binary files a/plugin/onlyoffice/assets/es-ES/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/es-ES/docx.zip b/plugin/onlyoffice/assets/es/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/es-ES/docx.zip rename to plugin/onlyoffice/assets/es/docx.zip diff --git a/plugin/onlyoffice/assets/es/pdf.zip b/plugin/onlyoffice/assets/es/pdf.zip new file mode 100644 index 0000000000..4b9e831ffd Binary files /dev/null and b/plugin/onlyoffice/assets/es/pdf.zip differ diff --git a/plugin/onlyoffice/assets/es/pptx.zip b/plugin/onlyoffice/assets/es/pptx.zip new file mode 100644 index 0000000000..9f2089745e Binary files /dev/null and b/plugin/onlyoffice/assets/es/pptx.zip differ diff --git a/plugin/onlyoffice/assets/es/xlsx.zip b/plugin/onlyoffice/assets/es/xlsx.zip new file mode 100644 index 0000000000..03d8d0cc5b Binary files /dev/null and b/plugin/onlyoffice/assets/es/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/eu/docx.zip b/plugin/onlyoffice/assets/eu/docx.zip new file mode 100644 index 0000000000..355e2431b5 Binary files /dev/null and b/plugin/onlyoffice/assets/eu/docx.zip differ diff --git a/plugin/onlyoffice/assets/eu/pdf.zip b/plugin/onlyoffice/assets/eu/pdf.zip new file mode 100644 index 0000000000..a2ef8e2b4f Binary files /dev/null and b/plugin/onlyoffice/assets/eu/pdf.zip differ diff --git a/plugin/onlyoffice/assets/eu/pptx.zip b/plugin/onlyoffice/assets/eu/pptx.zip new file mode 100644 index 0000000000..24c0094e25 Binary files /dev/null and b/plugin/onlyoffice/assets/eu/pptx.zip differ diff --git a/plugin/onlyoffice/assets/el-GR/xlsx.zip b/plugin/onlyoffice/assets/eu/xlsx.zip similarity index 68% rename from plugin/onlyoffice/assets/el-GR/xlsx.zip rename to plugin/onlyoffice/assets/eu/xlsx.zip index 140eaf0dce..1f6e8339bb 100644 Binary files a/plugin/onlyoffice/assets/el-GR/xlsx.zip and b/plugin/onlyoffice/assets/eu/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/fi/docx.zip b/plugin/onlyoffice/assets/fi/docx.zip new file mode 100644 index 0000000000..512e6eb359 Binary files /dev/null and b/plugin/onlyoffice/assets/fi/docx.zip differ diff --git a/plugin/onlyoffice/assets/fi/pdf.zip b/plugin/onlyoffice/assets/fi/pdf.zip new file mode 100644 index 0000000000..533fa16b5c Binary files /dev/null and b/plugin/onlyoffice/assets/fi/pdf.zip differ diff --git a/plugin/onlyoffice/assets/fi/pptx.zip b/plugin/onlyoffice/assets/fi/pptx.zip new file mode 100644 index 0000000000..320517e202 Binary files /dev/null and b/plugin/onlyoffice/assets/fi/pptx.zip differ diff --git a/plugin/onlyoffice/assets/fi/xlsx.zip b/plugin/onlyoffice/assets/fi/xlsx.zip new file mode 100644 index 0000000000..5f1a2f6d5c Binary files /dev/null and b/plugin/onlyoffice/assets/fi/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/fr-FR/docxf.zip b/plugin/onlyoffice/assets/fr-FR/docxf.zip deleted file mode 100644 index 5ab3e86b1c..0000000000 Binary files a/plugin/onlyoffice/assets/fr-FR/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/fr-FR/pptx.zip b/plugin/onlyoffice/assets/fr-FR/pptx.zip deleted file mode 100644 index 13c3e4daa3..0000000000 Binary files a/plugin/onlyoffice/assets/fr-FR/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/fr-FR/docx.zip b/plugin/onlyoffice/assets/fr/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/fr-FR/docx.zip rename to plugin/onlyoffice/assets/fr/docx.zip diff --git a/plugin/onlyoffice/assets/fr/pdf.zip b/plugin/onlyoffice/assets/fr/pdf.zip new file mode 100644 index 0000000000..3fd2db07a1 Binary files /dev/null and b/plugin/onlyoffice/assets/fr/pdf.zip differ diff --git a/plugin/onlyoffice/assets/fr/pptx.zip b/plugin/onlyoffice/assets/fr/pptx.zip new file mode 100644 index 0000000000..b77773266c Binary files /dev/null and b/plugin/onlyoffice/assets/fr/pptx.zip differ diff --git a/plugin/onlyoffice/assets/fr/xlsx.zip b/plugin/onlyoffice/assets/fr/xlsx.zip new file mode 100644 index 0000000000..df986ff8c4 Binary files /dev/null and b/plugin/onlyoffice/assets/fr/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/gl/docx.zip b/plugin/onlyoffice/assets/gl/docx.zip new file mode 100644 index 0000000000..9d116ef329 Binary files /dev/null and b/plugin/onlyoffice/assets/gl/docx.zip differ diff --git a/plugin/onlyoffice/assets/gl/pdf.zip b/plugin/onlyoffice/assets/gl/pdf.zip new file mode 100644 index 0000000000..e4fbbae06f Binary files /dev/null and b/plugin/onlyoffice/assets/gl/pdf.zip differ diff --git a/plugin/onlyoffice/assets/gl/pptx.zip b/plugin/onlyoffice/assets/gl/pptx.zip new file mode 100644 index 0000000000..90cf731f99 Binary files /dev/null and b/plugin/onlyoffice/assets/gl/pptx.zip differ diff --git a/plugin/onlyoffice/assets/es-ES/xlsx.zip b/plugin/onlyoffice/assets/gl/xlsx.zip similarity index 72% rename from plugin/onlyoffice/assets/es-ES/xlsx.zip rename to plugin/onlyoffice/assets/gl/xlsx.zip index f7a931c249..5aaf794afa 100644 Binary files a/plugin/onlyoffice/assets/es-ES/xlsx.zip and b/plugin/onlyoffice/assets/gl/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/he/docx.zip b/plugin/onlyoffice/assets/he/docx.zip new file mode 100644 index 0000000000..8cc918c3d9 Binary files /dev/null and b/plugin/onlyoffice/assets/he/docx.zip differ diff --git a/plugin/onlyoffice/assets/he/pdf.zip b/plugin/onlyoffice/assets/he/pdf.zip new file mode 100644 index 0000000000..214d36f74a Binary files /dev/null and b/plugin/onlyoffice/assets/he/pdf.zip differ diff --git a/plugin/onlyoffice/assets/he/pptx.zip b/plugin/onlyoffice/assets/he/pptx.zip new file mode 100644 index 0000000000..add2a32069 Binary files /dev/null and b/plugin/onlyoffice/assets/he/pptx.zip differ diff --git a/plugin/onlyoffice/assets/he/xlsx.zip b/plugin/onlyoffice/assets/he/xlsx.zip new file mode 100644 index 0000000000..2a7bcb43ea Binary files /dev/null and b/plugin/onlyoffice/assets/he/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/hy/docx.zip b/plugin/onlyoffice/assets/hy/docx.zip new file mode 100644 index 0000000000..e8c2a29f35 Binary files /dev/null and b/plugin/onlyoffice/assets/hy/docx.zip differ diff --git a/plugin/onlyoffice/assets/hy/pdf.zip b/plugin/onlyoffice/assets/hy/pdf.zip new file mode 100644 index 0000000000..e4fed935cd Binary files /dev/null and b/plugin/onlyoffice/assets/hy/pdf.zip differ diff --git a/plugin/onlyoffice/assets/hy/pptx.zip b/plugin/onlyoffice/assets/hy/pptx.zip new file mode 100644 index 0000000000..e7b0e1cdc2 Binary files /dev/null and b/plugin/onlyoffice/assets/hy/pptx.zip differ diff --git a/plugin/onlyoffice/assets/fr-FR/xlsx.zip b/plugin/onlyoffice/assets/hy/xlsx.zip similarity index 68% rename from plugin/onlyoffice/assets/fr-FR/xlsx.zip rename to plugin/onlyoffice/assets/hy/xlsx.zip index 8e027e2cd0..095dc050b3 100644 Binary files a/plugin/onlyoffice/assets/fr-FR/xlsx.zip and b/plugin/onlyoffice/assets/hy/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/it-IT/docxf.zip b/plugin/onlyoffice/assets/it-IT/docxf.zip deleted file mode 100644 index 44a14b24ca..0000000000 Binary files a/plugin/onlyoffice/assets/it-IT/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/it-IT/pptx.zip b/plugin/onlyoffice/assets/it-IT/pptx.zip deleted file mode 100644 index 7e5e2864cb..0000000000 Binary files a/plugin/onlyoffice/assets/it-IT/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/it-IT/xlsx.zip b/plugin/onlyoffice/assets/it-IT/xlsx.zip deleted file mode 100644 index e5f6b52ecc..0000000000 Binary files a/plugin/onlyoffice/assets/it-IT/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/it-IT/docx.zip b/plugin/onlyoffice/assets/it/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/it-IT/docx.zip rename to plugin/onlyoffice/assets/it/docx.zip diff --git a/plugin/onlyoffice/assets/it/pdf.zip b/plugin/onlyoffice/assets/it/pdf.zip new file mode 100644 index 0000000000..4cf6edd064 Binary files /dev/null and b/plugin/onlyoffice/assets/it/pdf.zip differ diff --git a/plugin/onlyoffice/assets/it/pptx.zip b/plugin/onlyoffice/assets/it/pptx.zip new file mode 100644 index 0000000000..75997388a5 Binary files /dev/null and b/plugin/onlyoffice/assets/it/pptx.zip differ diff --git a/plugin/onlyoffice/assets/it/xlsx.zip b/plugin/onlyoffice/assets/it/xlsx.zip new file mode 100644 index 0000000000..24f63f5195 Binary files /dev/null and b/plugin/onlyoffice/assets/it/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/ja-JP/docxf.zip b/plugin/onlyoffice/assets/ja-JP/docxf.zip deleted file mode 100644 index cbff106af1..0000000000 Binary files a/plugin/onlyoffice/assets/ja-JP/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ja-JP/xlsx.zip b/plugin/onlyoffice/assets/ja-JP/xlsx.zip deleted file mode 100644 index 342954a2e6..0000000000 Binary files a/plugin/onlyoffice/assets/ja-JP/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ja-JP/docx.zip b/plugin/onlyoffice/assets/ja/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/ja-JP/docx.zip rename to plugin/onlyoffice/assets/ja/docx.zip diff --git a/plugin/onlyoffice/assets/ja/pdf.zip b/plugin/onlyoffice/assets/ja/pdf.zip new file mode 100644 index 0000000000..1ec71cd9e4 Binary files /dev/null and b/plugin/onlyoffice/assets/ja/pdf.zip differ diff --git a/plugin/onlyoffice/assets/ja-JP/pptx.zip b/plugin/onlyoffice/assets/ja/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/ja-JP/pptx.zip rename to plugin/onlyoffice/assets/ja/pptx.zip diff --git a/plugin/onlyoffice/assets/ja/xlsx.zip b/plugin/onlyoffice/assets/ja/xlsx.zip new file mode 100644 index 0000000000..cee888a33c Binary files /dev/null and b/plugin/onlyoffice/assets/ja/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/ko-KR/docxf.zip b/plugin/onlyoffice/assets/ko-KR/docxf.zip deleted file mode 100644 index 30308ed31b..0000000000 Binary files a/plugin/onlyoffice/assets/ko-KR/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ko-KR/pptx.zip b/plugin/onlyoffice/assets/ko-KR/pptx.zip deleted file mode 100644 index 431b5e1f99..0000000000 Binary files a/plugin/onlyoffice/assets/ko-KR/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ko-KR/xlsx.zip b/plugin/onlyoffice/assets/ko-KR/xlsx.zip deleted file mode 100644 index 5aebd8c787..0000000000 Binary files a/plugin/onlyoffice/assets/ko-KR/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ko-KR/docx.zip b/plugin/onlyoffice/assets/ko/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/ko-KR/docx.zip rename to plugin/onlyoffice/assets/ko/docx.zip diff --git a/plugin/onlyoffice/assets/ko/pdf.zip b/plugin/onlyoffice/assets/ko/pdf.zip new file mode 100644 index 0000000000..735e2ebc36 Binary files /dev/null and b/plugin/onlyoffice/assets/ko/pdf.zip differ diff --git a/plugin/onlyoffice/assets/ko/pptx.zip b/plugin/onlyoffice/assets/ko/pptx.zip new file mode 100644 index 0000000000..ae9954e219 Binary files /dev/null and b/plugin/onlyoffice/assets/ko/pptx.zip differ diff --git a/plugin/onlyoffice/assets/ko/xlsx.zip b/plugin/onlyoffice/assets/ko/xlsx.zip new file mode 100644 index 0000000000..1709b8cb5d Binary files /dev/null and b/plugin/onlyoffice/assets/ko/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/lv-LV/docxf.zip b/plugin/onlyoffice/assets/lv-LV/docxf.zip deleted file mode 100644 index 15ee74e2c3..0000000000 Binary files a/plugin/onlyoffice/assets/lv-LV/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/lv-LV/pptx.zip b/plugin/onlyoffice/assets/lv-LV/pptx.zip deleted file mode 100644 index 2b4d410fef..0000000000 Binary files a/plugin/onlyoffice/assets/lv-LV/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/lv-LV/xlsx.zip b/plugin/onlyoffice/assets/lv-LV/xlsx.zip deleted file mode 100644 index 8b6396c797..0000000000 Binary files a/plugin/onlyoffice/assets/lv-LV/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/lv-LV/docx.zip b/plugin/onlyoffice/assets/lv/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/lv-LV/docx.zip rename to plugin/onlyoffice/assets/lv/docx.zip diff --git a/plugin/onlyoffice/assets/lv/pdf.zip b/plugin/onlyoffice/assets/lv/pdf.zip new file mode 100644 index 0000000000..9986452f6a Binary files /dev/null and b/plugin/onlyoffice/assets/lv/pdf.zip differ diff --git a/plugin/onlyoffice/assets/lv/pptx.zip b/plugin/onlyoffice/assets/lv/pptx.zip new file mode 100644 index 0000000000..5630813874 Binary files /dev/null and b/plugin/onlyoffice/assets/lv/pptx.zip differ diff --git a/plugin/onlyoffice/assets/lv/xlsx.zip b/plugin/onlyoffice/assets/lv/xlsx.zip new file mode 100644 index 0000000000..cbb825838b Binary files /dev/null and b/plugin/onlyoffice/assets/lv/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/ms/docx.zip b/plugin/onlyoffice/assets/ms/docx.zip new file mode 100644 index 0000000000..aa5af48f9f Binary files /dev/null and b/plugin/onlyoffice/assets/ms/docx.zip differ diff --git a/plugin/onlyoffice/assets/ms/pdf.zip b/plugin/onlyoffice/assets/ms/pdf.zip new file mode 100644 index 0000000000..3aebad7f43 Binary files /dev/null and b/plugin/onlyoffice/assets/ms/pdf.zip differ diff --git a/plugin/onlyoffice/assets/ms/pptx.zip b/plugin/onlyoffice/assets/ms/pptx.zip new file mode 100644 index 0000000000..a1b5e1201a Binary files /dev/null and b/plugin/onlyoffice/assets/ms/pptx.zip differ diff --git a/plugin/onlyoffice/assets/az-Latn-AZ/xlsx.zip b/plugin/onlyoffice/assets/ms/xlsx.zip similarity index 68% rename from plugin/onlyoffice/assets/az-Latn-AZ/xlsx.zip rename to plugin/onlyoffice/assets/ms/xlsx.zip index e061c35cbb..faf3f9319b 100644 Binary files a/plugin/onlyoffice/assets/az-Latn-AZ/xlsx.zip and b/plugin/onlyoffice/assets/ms/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/nl-NL/docxf.zip b/plugin/onlyoffice/assets/nl-NL/docxf.zip deleted file mode 100644 index 13da6d844a..0000000000 Binary files a/plugin/onlyoffice/assets/nl-NL/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/nl-NL/pptx.zip b/plugin/onlyoffice/assets/nl-NL/pptx.zip deleted file mode 100644 index 4e6f5b061c..0000000000 Binary files a/plugin/onlyoffice/assets/nl-NL/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/nl-NL/docx.zip b/plugin/onlyoffice/assets/nl/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/nl-NL/docx.zip rename to plugin/onlyoffice/assets/nl/docx.zip diff --git a/plugin/onlyoffice/assets/nl/pdf.zip b/plugin/onlyoffice/assets/nl/pdf.zip new file mode 100644 index 0000000000..2a8e37fc3a Binary files /dev/null and b/plugin/onlyoffice/assets/nl/pdf.zip differ diff --git a/plugin/onlyoffice/assets/nl/pptx.zip b/plugin/onlyoffice/assets/nl/pptx.zip new file mode 100644 index 0000000000..10e1b3a6d3 Binary files /dev/null and b/plugin/onlyoffice/assets/nl/pptx.zip differ diff --git a/plugin/onlyoffice/assets/nl-NL/xlsx.zip b/plugin/onlyoffice/assets/nl/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/nl-NL/xlsx.zip rename to plugin/onlyoffice/assets/nl/xlsx.zip diff --git a/plugin/onlyoffice/assets/no/docx.zip b/plugin/onlyoffice/assets/no/docx.zip new file mode 100644 index 0000000000..d0cf3e81cc Binary files /dev/null and b/plugin/onlyoffice/assets/no/docx.zip differ diff --git a/plugin/onlyoffice/assets/no/pdf.zip b/plugin/onlyoffice/assets/no/pdf.zip new file mode 100644 index 0000000000..6aa0707e90 Binary files /dev/null and b/plugin/onlyoffice/assets/no/pdf.zip differ diff --git a/plugin/onlyoffice/assets/no/pptx.zip b/plugin/onlyoffice/assets/no/pptx.zip new file mode 100644 index 0000000000..895bb2363d Binary files /dev/null and b/plugin/onlyoffice/assets/no/pptx.zip differ diff --git a/plugin/onlyoffice/assets/no/xlsx.zip b/plugin/onlyoffice/assets/no/xlsx.zip new file mode 100644 index 0000000000..8e5e092ec0 Binary files /dev/null and b/plugin/onlyoffice/assets/no/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/pl-PL/docxf.zip b/plugin/onlyoffice/assets/pl-PL/docxf.zip deleted file mode 100644 index bc635f6aba..0000000000 Binary files a/plugin/onlyoffice/assets/pl-PL/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pl-PL/pptx.zip b/plugin/onlyoffice/assets/pl-PL/pptx.zip deleted file mode 100644 index 55ec2545e0..0000000000 Binary files a/plugin/onlyoffice/assets/pl-PL/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pl-PL/xlsx.zip b/plugin/onlyoffice/assets/pl-PL/xlsx.zip deleted file mode 100644 index 6f55bb9167..0000000000 Binary files a/plugin/onlyoffice/assets/pl-PL/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pl-PL/docx.zip b/plugin/onlyoffice/assets/pl/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/pl-PL/docx.zip rename to plugin/onlyoffice/assets/pl/docx.zip diff --git a/plugin/onlyoffice/assets/pl/pdf.zip b/plugin/onlyoffice/assets/pl/pdf.zip new file mode 100644 index 0000000000..80e0d6b467 Binary files /dev/null and b/plugin/onlyoffice/assets/pl/pdf.zip differ diff --git a/plugin/onlyoffice/assets/pl/pptx.zip b/plugin/onlyoffice/assets/pl/pptx.zip new file mode 100644 index 0000000000..c167dd0dd3 Binary files /dev/null and b/plugin/onlyoffice/assets/pl/pptx.zip differ diff --git a/plugin/onlyoffice/assets/pl/xlsx.zip b/plugin/onlyoffice/assets/pl/xlsx.zip new file mode 100644 index 0000000000..4c2a5a145a Binary files /dev/null and b/plugin/onlyoffice/assets/pl/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/pt-BR/docxf.zip b/plugin/onlyoffice/assets/pt-BR/docxf.zip deleted file mode 100644 index 14497c02df..0000000000 Binary files a/plugin/onlyoffice/assets/pt-BR/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pt-BR/pdf.zip b/plugin/onlyoffice/assets/pt-BR/pdf.zip new file mode 100644 index 0000000000..4697fb1676 Binary files /dev/null and b/plugin/onlyoffice/assets/pt-BR/pdf.zip differ diff --git a/plugin/onlyoffice/assets/pt-BR/pptx.zip b/plugin/onlyoffice/assets/pt-BR/pptx.zip index a03d6b411e..2a88a6c6c4 100644 Binary files a/plugin/onlyoffice/assets/pt-BR/pptx.zip and b/plugin/onlyoffice/assets/pt-BR/pptx.zip differ diff --git a/plugin/onlyoffice/assets/pt-BR/xlsx.zip b/plugin/onlyoffice/assets/pt-BR/xlsx.zip index de6be657a3..935bbf24a7 100644 Binary files a/plugin/onlyoffice/assets/pt-BR/xlsx.zip and b/plugin/onlyoffice/assets/pt-BR/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/pt-PT/docxf.zip b/plugin/onlyoffice/assets/pt-PT/docxf.zip deleted file mode 100644 index fca50181c4..0000000000 Binary files a/plugin/onlyoffice/assets/pt-PT/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pt-PT/pptx.zip b/plugin/onlyoffice/assets/pt-PT/pptx.zip deleted file mode 100644 index eaa1578943..0000000000 Binary files a/plugin/onlyoffice/assets/pt-PT/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/pt-PT/docx.zip b/plugin/onlyoffice/assets/pt/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/pt-PT/docx.zip rename to plugin/onlyoffice/assets/pt/docx.zip diff --git a/plugin/onlyoffice/assets/pt/pdf.zip b/plugin/onlyoffice/assets/pt/pdf.zip new file mode 100644 index 0000000000..b323955db9 Binary files /dev/null and b/plugin/onlyoffice/assets/pt/pdf.zip differ diff --git a/plugin/onlyoffice/assets/pt/pptx.zip b/plugin/onlyoffice/assets/pt/pptx.zip new file mode 100644 index 0000000000..edd4acaf97 Binary files /dev/null and b/plugin/onlyoffice/assets/pt/pptx.zip differ diff --git a/plugin/onlyoffice/assets/pt-PT/xlsx.zip b/plugin/onlyoffice/assets/pt/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/pt-PT/xlsx.zip rename to plugin/onlyoffice/assets/pt/xlsx.zip diff --git a/plugin/onlyoffice/assets/ru-RU/docxf.zip b/plugin/onlyoffice/assets/ru-RU/docxf.zip deleted file mode 100644 index 03a1564fe4..0000000000 Binary files a/plugin/onlyoffice/assets/ru-RU/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ru-RU/pptx.zip b/plugin/onlyoffice/assets/ru-RU/pptx.zip deleted file mode 100644 index 8a1294d75b..0000000000 Binary files a/plugin/onlyoffice/assets/ru-RU/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/ru-RU/docx.zip b/plugin/onlyoffice/assets/ru/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/ru-RU/docx.zip rename to plugin/onlyoffice/assets/ru/docx.zip diff --git a/plugin/onlyoffice/assets/ru/pdf.zip b/plugin/onlyoffice/assets/ru/pdf.zip new file mode 100644 index 0000000000..6afddad14e Binary files /dev/null and b/plugin/onlyoffice/assets/ru/pdf.zip differ diff --git a/plugin/onlyoffice/assets/ru/pptx.zip b/plugin/onlyoffice/assets/ru/pptx.zip new file mode 100644 index 0000000000..3a24992cba Binary files /dev/null and b/plugin/onlyoffice/assets/ru/pptx.zip differ diff --git a/plugin/onlyoffice/assets/ru-RU/xlsx.zip b/plugin/onlyoffice/assets/ru/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/ru-RU/xlsx.zip rename to plugin/onlyoffice/assets/ru/xlsx.zip diff --git a/plugin/onlyoffice/assets/si/docx.zip b/plugin/onlyoffice/assets/si/docx.zip new file mode 100644 index 0000000000..f8ec653072 Binary files /dev/null and b/plugin/onlyoffice/assets/si/docx.zip differ diff --git a/plugin/onlyoffice/assets/si/pdf.zip b/plugin/onlyoffice/assets/si/pdf.zip new file mode 100644 index 0000000000..f2cd30593a Binary files /dev/null and b/plugin/onlyoffice/assets/si/pdf.zip differ diff --git a/plugin/onlyoffice/assets/si/pptx.zip b/plugin/onlyoffice/assets/si/pptx.zip new file mode 100644 index 0000000000..0b4f3e4ef5 Binary files /dev/null and b/plugin/onlyoffice/assets/si/pptx.zip differ diff --git a/plugin/onlyoffice/assets/si/xlsx.zip b/plugin/onlyoffice/assets/si/xlsx.zip new file mode 100644 index 0000000000..c874d06060 Binary files /dev/null and b/plugin/onlyoffice/assets/si/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/sk-SK/docxf.zip b/plugin/onlyoffice/assets/sk-SK/docxf.zip deleted file mode 100644 index 1ef3434928..0000000000 Binary files a/plugin/onlyoffice/assets/sk-SK/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/sk-SK/xlsx.zip b/plugin/onlyoffice/assets/sk-SK/xlsx.zip deleted file mode 100644 index ee981aa353..0000000000 Binary files a/plugin/onlyoffice/assets/sk-SK/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/sk-SK/docx.zip b/plugin/onlyoffice/assets/sk/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/sk-SK/docx.zip rename to plugin/onlyoffice/assets/sk/docx.zip diff --git a/plugin/onlyoffice/assets/sk/pdf.zip b/plugin/onlyoffice/assets/sk/pdf.zip new file mode 100644 index 0000000000..3674863e7c Binary files /dev/null and b/plugin/onlyoffice/assets/sk/pdf.zip differ diff --git a/plugin/onlyoffice/assets/sk-SK/pptx.zip b/plugin/onlyoffice/assets/sk/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/sk-SK/pptx.zip rename to plugin/onlyoffice/assets/sk/pptx.zip diff --git a/plugin/onlyoffice/assets/sk/xlsx.zip b/plugin/onlyoffice/assets/sk/xlsx.zip new file mode 100644 index 0000000000..4eb17a37ca Binary files /dev/null and b/plugin/onlyoffice/assets/sk/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/sl/docx.zip b/plugin/onlyoffice/assets/sl/docx.zip new file mode 100644 index 0000000000..f2bf1640e6 Binary files /dev/null and b/plugin/onlyoffice/assets/sl/docx.zip differ diff --git a/plugin/onlyoffice/assets/sl/pdf.zip b/plugin/onlyoffice/assets/sl/pdf.zip new file mode 100644 index 0000000000..e3a7a913a5 Binary files /dev/null and b/plugin/onlyoffice/assets/sl/pdf.zip differ diff --git a/plugin/onlyoffice/assets/sl/pptx.zip b/plugin/onlyoffice/assets/sl/pptx.zip new file mode 100644 index 0000000000..af9e1b2dc3 Binary files /dev/null and b/plugin/onlyoffice/assets/sl/pptx.zip differ diff --git a/plugin/onlyoffice/assets/sl/xlsx.zip b/plugin/onlyoffice/assets/sl/xlsx.zip new file mode 100644 index 0000000000..f379e75fe0 Binary files /dev/null and b/plugin/onlyoffice/assets/sl/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/sr-Cyrl-RS/docx.zip b/plugin/onlyoffice/assets/sr-Cyrl-RS/docx.zip new file mode 100644 index 0000000000..2936d2fe06 Binary files /dev/null and b/plugin/onlyoffice/assets/sr-Cyrl-RS/docx.zip differ diff --git a/plugin/onlyoffice/assets/sr-Cyrl-RS/pdf.zip b/plugin/onlyoffice/assets/sr-Cyrl-RS/pdf.zip new file mode 100644 index 0000000000..de481681bb Binary files /dev/null and b/plugin/onlyoffice/assets/sr-Cyrl-RS/pdf.zip differ diff --git a/plugin/onlyoffice/assets/sr-Cyrl-RS/pptx.zip b/plugin/onlyoffice/assets/sr-Cyrl-RS/pptx.zip new file mode 100644 index 0000000000..2fc64b8580 Binary files /dev/null and b/plugin/onlyoffice/assets/sr-Cyrl-RS/pptx.zip differ diff --git a/plugin/onlyoffice/assets/sv-SE/xlsx.zip b/plugin/onlyoffice/assets/sr-Cyrl-RS/xlsx.zip similarity index 71% rename from plugin/onlyoffice/assets/sv-SE/xlsx.zip rename to plugin/onlyoffice/assets/sr-Cyrl-RS/xlsx.zip index a92dde8b11..9cb81baad1 100644 Binary files a/plugin/onlyoffice/assets/sv-SE/xlsx.zip and b/plugin/onlyoffice/assets/sr-Cyrl-RS/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/sr/docx.zip b/plugin/onlyoffice/assets/sr/docx.zip new file mode 100644 index 0000000000..66090f9329 Binary files /dev/null and b/plugin/onlyoffice/assets/sr/docx.zip differ diff --git a/plugin/onlyoffice/assets/sr/pdf.zip b/plugin/onlyoffice/assets/sr/pdf.zip new file mode 100644 index 0000000000..635d5d871f Binary files /dev/null and b/plugin/onlyoffice/assets/sr/pdf.zip differ diff --git a/plugin/onlyoffice/assets/sr/pptx.zip b/plugin/onlyoffice/assets/sr/pptx.zip new file mode 100644 index 0000000000..78da1c4389 Binary files /dev/null and b/plugin/onlyoffice/assets/sr/pptx.zip differ diff --git a/plugin/onlyoffice/assets/sr/xlsx.zip b/plugin/onlyoffice/assets/sr/xlsx.zip new file mode 100644 index 0000000000..31295408fb Binary files /dev/null and b/plugin/onlyoffice/assets/sr/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/sv-SE/docxf.zip b/plugin/onlyoffice/assets/sv-SE/docxf.zip deleted file mode 100644 index 7746c6e8ea..0000000000 Binary files a/plugin/onlyoffice/assets/sv-SE/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/sv-SE/docx.zip b/plugin/onlyoffice/assets/sv/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/sv-SE/docx.zip rename to plugin/onlyoffice/assets/sv/docx.zip diff --git a/plugin/onlyoffice/assets/sv/pdf.zip b/plugin/onlyoffice/assets/sv/pdf.zip new file mode 100644 index 0000000000..8071ea07e5 Binary files /dev/null and b/plugin/onlyoffice/assets/sv/pdf.zip differ diff --git a/plugin/onlyoffice/assets/sv-SE/pptx.zip b/plugin/onlyoffice/assets/sv/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/sv-SE/pptx.zip rename to plugin/onlyoffice/assets/sv/pptx.zip diff --git a/plugin/onlyoffice/assets/sv/xlsx.zip b/plugin/onlyoffice/assets/sv/xlsx.zip new file mode 100644 index 0000000000..699950caf4 Binary files /dev/null and b/plugin/onlyoffice/assets/sv/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/tr-TR/docxf.zip b/plugin/onlyoffice/assets/tr-TR/docxf.zip deleted file mode 100644 index 11b0f23f68..0000000000 Binary files a/plugin/onlyoffice/assets/tr-TR/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/tr-TR/pptx.zip b/plugin/onlyoffice/assets/tr-TR/pptx.zip deleted file mode 100644 index c5f51070bb..0000000000 Binary files a/plugin/onlyoffice/assets/tr-TR/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/tr-TR/docx.zip b/plugin/onlyoffice/assets/tr/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/tr-TR/docx.zip rename to plugin/onlyoffice/assets/tr/docx.zip diff --git a/plugin/onlyoffice/assets/tr/pdf.zip b/plugin/onlyoffice/assets/tr/pdf.zip new file mode 100644 index 0000000000..555090b973 Binary files /dev/null and b/plugin/onlyoffice/assets/tr/pdf.zip differ diff --git a/plugin/onlyoffice/assets/tr/pptx.zip b/plugin/onlyoffice/assets/tr/pptx.zip new file mode 100644 index 0000000000..447dc826d2 Binary files /dev/null and b/plugin/onlyoffice/assets/tr/pptx.zip differ diff --git a/plugin/onlyoffice/assets/tr-TR/xlsx.zip b/plugin/onlyoffice/assets/tr/xlsx.zip similarity index 100% rename from plugin/onlyoffice/assets/tr-TR/xlsx.zip rename to plugin/onlyoffice/assets/tr/xlsx.zip diff --git a/plugin/onlyoffice/assets/uk-UA/docxf.zip b/plugin/onlyoffice/assets/uk-UA/docxf.zip deleted file mode 100644 index 202a70b2c8..0000000000 Binary files a/plugin/onlyoffice/assets/uk-UA/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/uk-UA/xlsx.zip b/plugin/onlyoffice/assets/uk-UA/xlsx.zip deleted file mode 100644 index 591223170c..0000000000 Binary files a/plugin/onlyoffice/assets/uk-UA/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/uk-UA/docx.zip b/plugin/onlyoffice/assets/uk/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/uk-UA/docx.zip rename to plugin/onlyoffice/assets/uk/docx.zip diff --git a/plugin/onlyoffice/assets/uk/pdf.zip b/plugin/onlyoffice/assets/uk/pdf.zip new file mode 100644 index 0000000000..4eedc55d63 Binary files /dev/null and b/plugin/onlyoffice/assets/uk/pdf.zip differ diff --git a/plugin/onlyoffice/assets/uk-UA/pptx.zip b/plugin/onlyoffice/assets/uk/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/uk-UA/pptx.zip rename to plugin/onlyoffice/assets/uk/pptx.zip diff --git a/plugin/onlyoffice/assets/uk/xlsx.zip b/plugin/onlyoffice/assets/uk/xlsx.zip new file mode 100644 index 0000000000..c1029c902b Binary files /dev/null and b/plugin/onlyoffice/assets/uk/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/vi-VN/docxf.zip b/plugin/onlyoffice/assets/vi-VN/docxf.zip deleted file mode 100644 index bc7e9322fc..0000000000 Binary files a/plugin/onlyoffice/assets/vi-VN/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/vi-VN/pptx.zip b/plugin/onlyoffice/assets/vi-VN/pptx.zip deleted file mode 100644 index 65151620d4..0000000000 Binary files a/plugin/onlyoffice/assets/vi-VN/pptx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/vi-VN/xlsx.zip b/plugin/onlyoffice/assets/vi-VN/xlsx.zip deleted file mode 100644 index ec0a10d123..0000000000 Binary files a/plugin/onlyoffice/assets/vi-VN/xlsx.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/vi-VN/docx.zip b/plugin/onlyoffice/assets/vi/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/vi-VN/docx.zip rename to plugin/onlyoffice/assets/vi/docx.zip diff --git a/plugin/onlyoffice/assets/vi/pdf.zip b/plugin/onlyoffice/assets/vi/pdf.zip new file mode 100644 index 0000000000..126aaf4d21 Binary files /dev/null and b/plugin/onlyoffice/assets/vi/pdf.zip differ diff --git a/plugin/onlyoffice/assets/vi/pptx.zip b/plugin/onlyoffice/assets/vi/pptx.zip new file mode 100644 index 0000000000..a048728ee0 Binary files /dev/null and b/plugin/onlyoffice/assets/vi/pptx.zip differ diff --git a/plugin/onlyoffice/assets/vi/xlsx.zip b/plugin/onlyoffice/assets/vi/xlsx.zip new file mode 100644 index 0000000000..33bad0f6dd Binary files /dev/null and b/plugin/onlyoffice/assets/vi/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/zh-CN/docxf.zip b/plugin/onlyoffice/assets/zh-CN/docxf.zip deleted file mode 100644 index 125a2985d5..0000000000 Binary files a/plugin/onlyoffice/assets/zh-CN/docxf.zip and /dev/null differ diff --git a/plugin/onlyoffice/assets/zh-TW/docx.zip b/plugin/onlyoffice/assets/zh-TW/docx.zip new file mode 100644 index 0000000000..a1add75567 Binary files /dev/null and b/plugin/onlyoffice/assets/zh-TW/docx.zip differ diff --git a/plugin/onlyoffice/assets/zh-TW/pdf.zip b/plugin/onlyoffice/assets/zh-TW/pdf.zip new file mode 100644 index 0000000000..c18403b497 Binary files /dev/null and b/plugin/onlyoffice/assets/zh-TW/pdf.zip differ diff --git a/plugin/onlyoffice/assets/zh-TW/pptx.zip b/plugin/onlyoffice/assets/zh-TW/pptx.zip new file mode 100644 index 0000000000..a3d767ab4d Binary files /dev/null and b/plugin/onlyoffice/assets/zh-TW/pptx.zip differ diff --git a/plugin/onlyoffice/assets/zh-CN/xlsx.zip b/plugin/onlyoffice/assets/zh-TW/xlsx.zip similarity index 70% rename from plugin/onlyoffice/assets/zh-CN/xlsx.zip rename to plugin/onlyoffice/assets/zh-TW/xlsx.zip index fcdeda1d0f..d34714cca3 100644 Binary files a/plugin/onlyoffice/assets/zh-CN/xlsx.zip and b/plugin/onlyoffice/assets/zh-TW/xlsx.zip differ diff --git a/plugin/onlyoffice/assets/zh-CN/docx.zip b/plugin/onlyoffice/assets/zh/docx.zip similarity index 100% rename from plugin/onlyoffice/assets/zh-CN/docx.zip rename to plugin/onlyoffice/assets/zh/docx.zip diff --git a/plugin/onlyoffice/assets/zh/pdf.zip b/plugin/onlyoffice/assets/zh/pdf.zip new file mode 100644 index 0000000000..f10cbd36f9 Binary files /dev/null and b/plugin/onlyoffice/assets/zh/pdf.zip differ diff --git a/plugin/onlyoffice/assets/zh-CN/pptx.zip b/plugin/onlyoffice/assets/zh/pptx.zip similarity index 100% rename from plugin/onlyoffice/assets/zh-CN/pptx.zip rename to plugin/onlyoffice/assets/zh/pptx.zip diff --git a/plugin/onlyoffice/assets/zh/xlsx.zip b/plugin/onlyoffice/assets/zh/xlsx.zip new file mode 100644 index 0000000000..31892f460d Binary files /dev/null and b/plugin/onlyoffice/assets/zh/xlsx.zip differ diff --git a/plugin/onlyoffice/callback.php b/plugin/onlyoffice/callback.php index 66b3ce8174..f4c468ff9d 100644 --- a/plugin/onlyoffice/callback.php +++ b/plugin/onlyoffice/callback.php @@ -1,7 +1,6 @@ readHash($_GET['hash'], api_get_security_key()); + if (null === $hashData) { + $callbackResponseArray['status'] = 'error'; + $callbackResponseArray['error'] = $error; + exit(json_encode($callbackResponseArray)); } $type = $hashData->type; @@ -56,44 +46,47 @@ if (isset($_GET["hash"]) && !empty($_GET["hash"])) { $sessionId = $hashData->sessionId; $courseInfo = api_get_course_info_by_id($courseId); - $courseCode = $courseInfo["code"]; + $courseCode = $courseInfo['code']; if (!empty($userId)) { $userInfo = api_get_user_info($userId); } else { - $result["error"] = "User not found"; - die (json_encode($result)); + $result['error'] = 'User not found'; + exit(json_encode($result)); } if (api_is_anonymous()) { $loggedUser = [ - "user_id" => $userInfo["id"], - "status" => $userInfo["status"], - "uidReset" => true, + 'user_id' => $userInfo['id'], + 'status' => $userInfo['status'], + 'uidReset' => true, ]; - Session::write("_user", $loggedUser); - Login::init_user($loggedUser["user_id"], true); + Session::write('_user', $loggedUser); + Login::init_user($loggedUser['user_id'], true); } else { $userId = api_get_user_id(); } - switch($type) { - case "track": + switch ($type) { + case 'track': $callbackResponseArray = track(); - die (json_encode($callbackResponseArray)); - case "download": + exit(json_encode($callbackResponseArray)); + case 'download': $callbackResponseArray = download(); - die (json_encode($callbackResponseArray)); + exit(json_encode($callbackResponseArray)); + case 'empty': + $callbackResponseArray = emptyFile(); + exit(json_encode($callbackResponseArray)); default: - $callbackResponseArray["status"] = "error"; - $callbackResponseArray["error"] = "404 Method not found"; - die(json_encode($callbackResponseArray)); + $callbackResponseArray['status'] = 'error'; + $callbackResponseArray['error'] = '404 Method not found'; + exit(json_encode($callbackResponseArray)); } } /** - * Handle request from the document server with the document status information + * Handle request from the document server with the document status information. */ function track(): array { @@ -106,117 +99,73 @@ function track(): array global $groupId; global $sessionId; global $courseInfo; + global $appSettings; + global $jwtManager; + + if (($body_stream = file_get_contents('php://input')) === false) { + $result['error'] = 'Bad Request'; - if (($body_stream = file_get_contents("php://input")) === false) { - $result["error"] = "Bad Request"; return $result; } $data = json_decode($body_stream, true); - if ($data === null) { - $result["error"] = "Bad Response"; + if (null === $data) { + $result['error'] = 'Bad Response'; + return $result; } - if (!empty($plugin->getDocumentServerSecret())) { - - if (!empty($data["token"])) { + if ($jwtManager->isJwtEnabled()) { + if (!empty($data['token'])) { try { - $payload = JWT::decode($data["token"], new Key($plugin->getDocumentServerSecret(), "HS256")); - } catch (\UnexpectedValueException $e) { - $result["status"] = "error"; - $result["error"] = "403 Access denied"; + $payload = $jwtManager->decode($data['token'], $appSettings->getJwtKey()); + } catch (UnexpectedValueException $e) { + $result['status'] = 'error'; + $result['error'] = '403 Access denied'; + return $result; } } else { - $token = substr(getallheaders()[$plugin->getJwtHeader()], strlen("Bearer ")); + $token = substr(getallheaders()[$appSettings->getJwtHeader()], strlen('Bearer ')); try { - $decodeToken = JWT::decode($token, new Key($plugin->getDocumentServerSecret(), "HS256")); + $decodeToken = $jwtManager->decode($token, $appSettings->getJwtKey()); $payload = $decodeToken->payload; - } catch (\UnexpectedValueException $e) { - $result["status"] = "error"; - $result["error"] = "403 Access denied"; + } catch (UnexpectedValueException $e) { + $result['status'] = 'error'; + $result['error'] = '403 Access denied'; + return $result; } } - $data["url"] = isset($payload->url) ? $payload->url : null; - $data["status"] = $payload->status; + $data['url'] = isset($payload->url) ? $payload->url : null; + $data['status'] = $payload->status; } - $status = $data["status"]; - - $track_result = 1; - switch ($status) { - case TrackerStatus_MustSave: - case TrackerStatus_Corrupted: - - $downloadUri = $data["url"]; - $downloadUri = $plugin->replaceDocumentServerUrlToInternal($downloadUri); - - if (!empty($docId) && !empty($courseCode)) { - $docInfo = DocumentManager::get_document_data_by_id($docId, $courseCode, false, $sessionId); - - if ($docInfo === false) { - $result["error"] = "File not found"; - return $result; - } - - $filePath = $docInfo["absolute_path"]; - } else { - $result["error"] = "Bad Request"; - return $result; - } - - list ($isAllowToEdit, $isMyDir, $isGroupAccess, $isReadonly) = getPermissions($docInfo, $userId, $courseCode, $groupId, $sessionId); - - if ($isReadonly) { - break; - } - - if (($new_data = file_get_contents($downloadUri)) === false) { - break; - } - - if ($isAllowToEdit || $isMyDir || $isGroupAccess) { - $groupInfo = GroupManager::get_group_properties($groupId); - - if ($fp = @fopen($filePath, "w")) { - fputs($fp, $new_data); - fclose($fp); - api_item_property_update($courseInfo, - TOOL_DOCUMENT, - $docId, - "DocumentUpdated", - $userId, - $groupInfo, - null, - null, - null, - $sessionId); - update_existing_document($courseInfo, - $docId, - filesize($filePath), - false); - $track_result = 0; - break; - } - } - - case TrackerStatus_Editing: - case TrackerStatus_Closed: - - $track_result = 0; - break; - } + $docStatus = new CallbackDocStatus($data['status']); + $callback = new OnlyofficeCallback(); + $callback->setStatus($docStatus); + $callback->setKey($docId); + $callback->setUrl($data['url']); + $callbackService = new OnlyofficeCallbackService( + $appSettings, + $jwtManager, + [ + 'courseCode' => $courseCode, + 'userId' => $userId, + 'docId' => $docId, + 'groupId' => $groupId, + 'sessionId' => $sessionId, + 'courseInfo' => $courseInfo, + ]); + $result = $callbackService->processCallback($callback, $docId); - $result["error"] = $track_result; return $result; } /** - * Downloading file by the document service + * Downloading file by the document service. */ function download() { @@ -227,15 +176,17 @@ function download() global $groupId; global $sessionId; global $courseInfo; + global $appSettings; + global $jwtManager; - if (!empty($plugin->getDocumentServerSecret())) { - $token = substr(getallheaders()[$plugin->getJwtHeader()], strlen("Bearer ")); + if ($jwtManager->isJwtEnabled()) { + $token = substr(getallheaders()[$appSettings->getJwtHeader()], strlen('Bearer ')); try { - $payload = JWT::decode($token, new Key($plugin->getDocumentServerSecret(), "HS256")); + $payload = $jwtManager->decode($token, $appSettings->getJwtKey()); + } catch (UnexpectedValueException $e) { + $result['status'] = 'error'; + $result['error'] = '403 Access denied'; - } catch (\UnexpectedValueException $e) { - $result["status"] = "error"; - $result["error"] = "403 Access denied"; return $result; } } @@ -243,42 +194,70 @@ function download() if (!empty($docId) && !empty($courseCode)) { $docInfo = DocumentManager::get_document_data_by_id($docId, $courseCode, false, $sessionId); - if ($docInfo === false) { - $result["error"] = "File not found"; + if (false === $docInfo) { + $result['error'] = 'File not found'; + return $result; } - $filePath = $docInfo["absolute_path"]; + $filePath = $docInfo['absolute_path']; } else { - $result["error"] = "File not found"; + $result['error'] = 'File not found'; + return $result; } - @header("Content-Type: application/octet-stream"); - @header("Content-Disposition: attachment; filename=" . $docInfo["title"]); + @header('Content-Type: application/octet-stream'); + @header('Content-Disposition: attachment; filename='.$docInfo['title']); readfile($filePath); - exit(); + exit; } /** - * Method checks access rights to document and returns permissions + * Downloading empty file by the document service. */ -function getPermissions(array $docInfo, int $userId, string $courseCode, int $groupId = null, int $sessionId = null): array +function emptyFile() { - $isAllowToEdit = api_is_allowed_to_edit(true, true); - $isMyDir = DocumentManager::is_my_shared_folder($userId, $docInfo["absolute_parent_path"], $sessionId); - - $isGroupAccess = false; - if (!empty($groupId)) { - $courseInfo = api_get_course_info($courseCode); - Session::write("_real_cid", $courseInfo["real_id"]); - $groupProperties = GroupManager::get_group_properties($groupId); - $docInfoGroup = api_get_item_property_info($courseInfo["real_id"], "document", $docInfo["id"], $sessionId); - $isGroupAccess = GroupManager::allowUploadEditDocument($userId, $courseCode, $groupProperties, $docInfoGroup); + global $plugin; + global $type; + global $courseCode; + global $userId; + global $docId; + global $groupId; + global $sessionId; + global $courseInfo; + global $appSettings; + global $jwtManager; + + + if ($type !== 'empty') { + $result['status'] = 'error'; + $result['error'] = 'Download empty with other action'; + return $result; + } + + if ($jwtManager->isJwtEnabled()) { + $token = substr(getallheaders()[$appSettings->getJwtHeader()], strlen('Bearer ')); + try { + $payload = $jwtManager->decode($token, $appSettings->getJwtKey()); + } catch (UnexpectedValueException $e) { + $result['status'] = 'error'; + $result['error'] = '403 Access denied'; + return $result; + } } - $isReadonly = $docInfo["readonly"]; + $template = TemplateManager::getEmptyTemplate('docx'); - return [$isAllowToEdit, $isMyDir, $isGroupAccess, $isReadonly]; -} + if (!$template) { + $result['status'] = 'error'; + $result['error'] = 'File not found'; + return $result; + } + + @header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); + @header('Content-Disposition: attachment; filename='.'docx.docx'); + readfile($template); + exit; +} \ No newline at end of file diff --git a/plugin/onlyoffice/create.php b/plugin/onlyoffice/create.php index eaed39d22d..70a080fb69 100644 --- a/plugin/onlyoffice/create.php +++ b/plugin/onlyoffice/create.php @@ -1,7 +1,6 @@ $plugin->get_lang("document"), - "spreadsheet" => $plugin->get_lang("spreadsheet"), - "presentation" => $plugin->get_lang("presentation"), - "formTemplate" => $plugin->get_lang("formTemplate") + 'text' => $plugin->get_lang('document'), + 'spreadsheet' => $plugin->get_lang('spreadsheet'), + 'presentation' => $plugin->get_lang('presentation'), + 'formTemplate' => $plugin->get_lang('formTemplate'), ]; -$userId = !empty($_GET["userId"]) ? $_GET['userId'] : 0; -$sessionId = !empty($_GET["sessionId"]) ? $_GET["sessionId"] : 0; -$courseId = !empty($_GET["courseId"]) ? $_GET["courseId"] : 0; -$groupId = !empty($_GET["groupId"]) ? $_GET["groupId"] : 0; -$folderId = !empty($_GET["folderId"]) ? $_GET["folderId"] : 0; +$userId = !empty($_GET['userId']) ? $_GET['userId'] : 0; +$sessionId = !empty($_GET['sessionId']) ? $_GET['sessionId'] : 0; +$courseId = !empty($_GET['courseId']) ? $_GET['courseId'] : 0; +$groupId = !empty($_GET['groupId']) ? $_GET['groupId'] : 0; +$folderId = !empty($_GET['folderId']) ? $_GET['folderId'] : 0; $courseInfo = api_get_course_info_by_id($courseId); -$courseCode = $courseInfo["code"]; +$courseCode = $courseInfo['code']; $isMyDir = false; if (!empty($folderId)) { @@ -49,7 +49,7 @@ if (!empty($folderId)) { ); $isMyDir = DocumentManager::is_my_shared_folder( $userId, - $folderInfo["absolute_path"], + $folderInfo['absolute_path'], $sessionId ); } @@ -60,27 +60,27 @@ if (!($isAllowToEdit || $isMyDir || $groupRights)) { } $form = new FormValidator( - "doc_create", - "post", - api_get_path(WEB_PLUGIN_PATH) . "onlyoffice/create.php?userId=" . Security::remove_XSS($userId) - . "&groupId=" . Security::remove_XSS($groupId) - . "&courseId=" . Security::remove_XSS($courseId) - . "&sessionId=" . Security::remove_XSS($sessionId) - . "&folderId=" . Security::remove_XSS($folderId) + 'doc_create', + 'post', + api_get_path(WEB_PLUGIN_PATH).'onlyoffice/create.php?userId='.Security::remove_XSS($userId) + .'&groupId='.Security::remove_XSS($groupId) + .'&courseId='.Security::remove_XSS($courseId) + .'&sessionId='.Security::remove_XSS($sessionId) + .'&folderId='.Security::remove_XSS($folderId) ); -$form->addText("fileName", $plugin->get_lang("title"), true); -$form->addSelect("fileFormat", $plugin->get_lang("chooseFileFormat"), $mapFileFormat); -$form->addButtonCreate($plugin->get_lang("create")); +$form->addText('fileName', $plugin->get_lang('title'), true); +$form->addSelect('fileFormat', $plugin->get_lang('chooseFileFormat'), $mapFileFormat); +$form->addButtonCreate($plugin->get_lang('create')); if ($form->validate()) { $values = $form->exportValues(); - $fileType = $values["fileFormat"]; - $fileExt = FileUtility::getDocExt($fileType); + $fileType = $values['fileFormat']; + $fileExt = $documentManager->getDocExtByType($fileType); - $result = FileUtility::createFile( - $values["fileName"], + $result = OnlyofficeDocumentManager::createFile( + $values['fileName'], $fileExt, $folderId, $userId, @@ -89,23 +89,23 @@ if ($form->validate()) { $groupId ); - if (isset($result["error"])) { + if (isset($result['error'])) { Display::addFlash( Display::return_message( - $plugin->get_lang($result["error"]), - "error" + $plugin->get_lang($result['error']), + 'error' ) ); } else { - header("Location: " . FileUtility::getUrlToLocation($courseCode, $sessionId, $groupId, $folderId)); - exit(); + header('Location: '.OnlyofficeDocumentManager::getUrlToLocation($courseCode, $sessionId, $groupId, $folderId)); + exit; } } - $goBackUrl = FileUtility::getUrlToLocation($courseCode, $sessionId, $groupId, $folderId); - $actionsLeft = '' . Display::return_icon("back.png", get_lang("Back") . " " . get_lang("To") . " " . get_lang("DocumentsOverview"), "", ICON_SIZE_MEDIUM) . ""; +$goBackUrl = OnlyofficeDocumentManager::getUrlToLocation($courseCode, $sessionId, $groupId, $folderId); +$actionsLeft = ''.Display::return_icon('back.png', get_lang('Back').' '.get_lang('To').' '.get_lang('DocumentsOverview'), '', ICON_SIZE_MEDIUM).''; - Display::display_header($plugin->get_lang("createNewDocument")); - echo Display::toolbarAction("actions-documents", [$actionsLeft]); - echo $form->returnForm(); - Display::display_footer(); +Display::display_header($plugin->get_lang('createNewDocument')); +echo Display::toolbarAction('actions-documents', [$actionsLeft]); +echo $form->returnForm(); +Display::display_footer(); diff --git a/plugin/onlyoffice/editor.php b/plugin/onlyoffice/editor.php index 9b548727d7..1a4658969d 100644 --- a/plugin/onlyoffice/editor.php +++ b/plugin/onlyoffice/editor.php @@ -1,7 +1,6 @@ get("enable_onlyoffice_plugin") === 'true'; +$isEnable = 'true' === $plugin->get('enable_onlyoffice_plugin'); if (!$isEnable) { - die ("Document server isn't enabled"); + exit("Document server isn't enabled"); + return; } -$documentServerUrl = $plugin->getDocumentServerUrl(); +$appSettings = new OnlyofficeAppsettings($plugin); +$documentServerUrl = $appSettings->getDocumentServerUrl(); if (empty($documentServerUrl)) { - die ("Document server isn't configured"); + exit("Document server isn't configured"); + return; } $config = []; - -$docApiUrl = $documentServerUrl . "/web-apps/apps/api/documents/api.js"; - -$docId = $_GET["docId"]; -$groupId = isset($_GET["groupId"]) && !empty($_GET["groupId"]) ? $_GET["groupId"] : null; - +$docApiUrl = $appSettings->getDocumentServerApiUrl(); +$docId = $_GET['docId']; +$groupId = isset($_GET['groupId']) && !empty($_GET['groupId']) ? $_GET['groupId'] : null; $userId = api_get_user_id(); - $userInfo = api_get_user_info($userId); - $sessionId = api_get_session_id(); $courseId = api_get_course_int_id(); $courseInfo = api_get_course_info(); if (empty($courseInfo)) { api_not_allowed(true); } -$courseCode = $courseInfo["code"]; - +$courseCode = $courseInfo['code']; $docInfo = DocumentManager::get_document_data_by_id($docId, $courseCode, false, $sessionId); - -$extension = strtolower(pathinfo($docInfo["title"], PATHINFO_EXTENSION)); - $langInfo = LangManager::getLangUser(); - -$docType = FileUtility::getDocType($extension); -$key = FileUtility::getKey($courseCode, $docId); -$fileUrl = FileUtility::getFileUrl($courseId, $userId, $docId, $sessionId, $groupId); - -if (!empty($plugin->getStorageUrl())) { - $fileUrl = str_replace(api_get_path(WEB_PATH), $plugin->getStorageUrl(), $fileUrl); -} - -$config = [ - "type" => "desktop", - "documentType" => $docType, - "document" => [ - "fileType" => $extension, - "key" => $key, - "title" => $docInfo["title"], - "url" => $fileUrl - ], - "editorConfig" => [ - "lang" => $langInfo["isocode"], - "region" => $langInfo["isocode"], - "user" => [ - "id" => strval($userId), - "name" => $userInfo["username"] - ], - "customization" => [ - "goback" => [ - "blank" => false, - "requestClose" => false, - "text" => get_lang("Back"), - "url" => FileUtility::getUrlToLocation($courseCode, $sessionId, $groupId, $docInfo["parent_id"]) - ], - "compactHeader" => true, - "toolbarNoTabs" => true - ] - ] -]; - -$userAgent = $_SERVER["HTTP_USER_AGENT"]; - -$isMobileAgent = preg_match(USER_AGENT_MOBILE, $userAgent); -if ($isMobileAgent) { - $config["type"] = "mobile"; -} - -$isAllowToEdit = api_is_allowed_to_edit(true, true); -$isMyDir = DocumentManager::is_my_shared_folder( - $userId, - $docInfo["absolute_parent_path"], - $sessionId -); - -$isGroupAccess = false; -if (!empty($groupId)) { - $groupProperties = GroupManager::get_group_properties($groupId); - $docInfoGroup = api_get_item_property_info( - api_get_course_int_id(), - "document", - $docId, - $sessionId - ); - $isGroupAccess = GroupManager::allowUploadEditDocument( - $userId, - $courseCode, - $groupProperties, - $docInfoGroup - ); - - $isMemberGroup = GroupManager::is_user_in_group($userId, $groupProperties); - - if (!$isGroupAccess) { - if (!$groupProperties["status"]) { - api_not_allowed(true); - } - if (!$isMemberGroup && $groupProperties["doc_state"] != 1) { - api_not_allowed(true); - } - } +$jwtManager = new OnlyofficeJwtManager($appSettings); +if (isset($_GET['forceEdit']) && (bool)$_GET['forceEdit'] === true) { + $docInfo['forceEdit'] = $_GET['forceEdit']; } - -$accessRights = $isAllowToEdit || $isMyDir || $isGroupAccess; -$canEdit = in_array($extension, FileUtility::$can_edit_types); - -$isVisible = DocumentManager::check_visibility_tree($docId, $courseInfo, $sessionId, $userId, $groupId); -$isReadonly = $docInfo["readonly"]; - -if (!$isVisible) { - api_not_allowed(true); -} - -if ($canEdit && $accessRights && !$isReadonly) { - $config["editorConfig"]["mode"] = "edit"; - - $callback = getCallbackUrl( - $docId, - $userId, - $courseId, - $sessionId, - $groupId - ); - - if (!empty($plugin->getStorageUrl())) { - $callback = str_replace(api_get_path(WEB_PATH), $plugin->getStorageUrl(), $callback); - } - $config["editorConfig"]["callbackUrl"] = $callback; -} else { - $canView = in_array($extension, FileUtility::$can_view_types); - if ($canView) { - $config["editorConfig"]["mode"] = "view"; - } else { - api_not_allowed(true); - } +$documentManager = new OnlyofficeDocumentManager($appSettings, $docInfo); +$extension = $documentManager->getExt($documentManager->getDocInfo('title')); +$docType = $documentManager->getDocType($extension); +$key = $documentManager->getDocumentKey($docId, $courseCode); +$fileUrl = $documentManager->getFileUrl($docId); + +if (!empty($appSettings->getStorageUrl())) { + $fileUrl = str_replace(api_get_path(WEB_PATH), $appSettings->getStorageUrl(), $fileUrl); } -$config["document"]["permissions"]["edit"] = $accessRights && !$isReadonly; -if (!empty($plugin->getDocumentServerSecret())) { - $token = JWT::encode($config, $plugin->getDocumentServerSecret(), "HS256"); - $config["token"] = $token; -} - -/** - * Return callback url - */ -function getCallbackUrl(int $docId, int $userId, int $courseId, int $sessionId, int $groupId = null): string -{ - $url = ""; - - $data = [ - "type" => "track", - "courseId" => $courseId, - "userId" => $userId, - "docId" => $docId, - "sessionId" => $sessionId - ]; - - if (!empty($groupId)) { - $data["groupId"] = $groupId; - } - - $hashUrl = Crypt::GetHash($data); - - return $url . api_get_path(WEB_PLUGIN_PATH) . "onlyoffice/callback.php?hash=" . $hashUrl; +$configService = new OnlyofficeConfigService($appSettings, $jwtManager, $documentManager); +$editorsMode = $configService->getEditorsMode(); +$config = $configService->createConfig($docId, $editorsMode, $_SERVER['HTTP_USER_AGENT']); +$config = json_decode(json_encode($config), true); +$isMobileAgent = $configService->isMobileAgent($_SERVER['HTTP_USER_AGENT']); + +$showHeaders = true; +$headerHeight = 'calc(100% - 140px)'; +if (!empty($_GET['nh'])) { + $showHeaders = false; + $headerHeight = '100%'; } ?> ONLYOFFICE - + - + diff --git a/plugin/onlyoffice/error.php b/plugin/onlyoffice/error.php index b7db5cecd8..5422008ee9 100644 --- a/plugin/onlyoffice/error.php +++ b/plugin/onlyoffice/error.php @@ -1,7 +1,6 @@ get_lang($message), - "error" + 'error' ) ); -Display::display_header(); \ No newline at end of file +Display::display_header(); diff --git a/plugin/onlyoffice/install.php b/plugin/onlyoffice/install.php index 1f934b54ed..9212ece2b8 100644 --- a/plugin/onlyoffice/install.php +++ b/plugin/onlyoffice/install.php @@ -1,7 +1,6 @@ install(); \ No newline at end of file +OnlyofficePlugin::create()->install(); diff --git a/plugin/onlyoffice/lang/bulgarian.php b/plugin/onlyoffice/lang/bulgarian.php index 14da7eda1d..67b89feab7 100644 --- a/plugin/onlyoffice/lang/bulgarian.php +++ b/plugin/onlyoffice/lang/bulgarian.php @@ -1,44 +1,43 @@ "https://onlinedocs.onlyoffice.com/", - "HEADER" => "AuthorizationJWT", - "SECRET" => "sn2puSUF7muF5Jas", - "TRIAL" => 30 - ]; - - /** - * Get demo params - * - * @return array - */ - public static function GetDemoParams() - { - return self::DEMO_PARAM; - } - - /** - * Get link to Docs Cloud - * - * @return string - */ - public function GetLinkToDocs() { - return self::linkToDocs; - } -} diff --git a/plugin/onlyoffice/lib/crypt.php b/plugin/onlyoffice/lib/crypt.php deleted file mode 100644 index 005480bceb..0000000000 --- a/plugin/onlyoffice/lib/crypt.php +++ /dev/null @@ -1,60 +0,0 @@ -getMessage(); - } - return [$result, $error]; - } -} diff --git a/plugin/onlyoffice/lib/documentService.php b/plugin/onlyoffice/lib/documentService.php deleted file mode 100644 index 57324ec458..0000000000 --- a/plugin/onlyoffice/lib/documentService.php +++ /dev/null @@ -1,511 +0,0 @@ -plugin = $plugin; - $this->newSettings = $newSettings; - } - - - /** - * Request to Document Server with turn off verification - * - * @param string $url - request address - * @param array $method - request method - * @param array $opts - request options - * - * @return string - */ - public function request($url, $method = 'GET', $opts = []) { - if (substr($url, 0, strlen('https')) === 'https') { - $opts['verify'] = false; - } - if (!array_key_exists('timeout', $opts)) { - $opts['timeout'] = 60; - } - - $curl_info = [ - CURLOPT_URL => $url, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => '', - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => $opts['timeout'], - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => $method, - CURLOPT_POSTFIELDS => $opts['body'], - CURLOPT_HTTPHEADER => $opts['headers'], - ]; - - if ($opts == []) { - unset($curl_info[CURLOPT_POSTFIELDS]); - } - - $curl = curl_init(); - curl_setopt_array($curl, $curl_info); - $response = curl_exec($curl); - curl_close($curl); - - return $response; - } - - /** - * Generate an error code table of convertion - * - * @param int $errorCode - Error code - * - * @throws Exception - */ - private function processConvServResponceError($errorCode) { - $errorMessageTemplate = $this->plugin->get_lang('docServiceError'); - $errorMessage = ''; - - switch ($errorCode) { - case -20: - $errorMessage = $errorMessageTemplate . ': Error encrypt signature'; - break; - case -8: - $errorMessage = $errorMessageTemplate . ': Invalid token'; - break; - case -7: - $errorMessage = $errorMessageTemplate . ': Error document request'; - break; - case -6: - $errorMessage = $errorMessageTemplate . ': Error while accessing the conversion result database'; - break; - case -5: - $errorMessage = $errorMessageTemplate . ': Incorrect password'; - break; - case -4: - $errorMessage = $errorMessageTemplate . ': Error while downloading the document file to be converted.'; - break; - case -3: - $errorMessage = $errorMessageTemplate . ': Conversion error'; - break; - case -2: - $errorMessage = $errorMessageTemplate . ': Timeout conversion error'; - break; - case -1: - $errorMessage = $errorMessageTemplate . ': Unknown error'; - break; - case 0: - break; - default: - $errorMessage = $errorMessageTemplate . ': ErrorCode = ' . $errorCode; - break; - } - - throw new \Exception($errorMessage); - } - - /** - * Generate an error code table of command - * - * @param string $errorCode - Error code - * - * @throws Exception - */ - private function processCommandServResponceError($errorCode) { - $errorMessageTemplate = $this->plugin->get_lang('docServiceError'); - $errorMessage = ''; - - switch ($errorCode) { - case 6: - $errorMessage = $errorMessageTemplate . ': Invalid token'; - break; - case 5: - $errorMessage = $errorMessageTemplate . ': Command not correсt'; - break; - case 3: - $errorMessage = $errorMessageTemplate . ': Internal server error'; - break; - case 0: - return; - default: - $errorMessage = $errorMessageTemplate . ': ErrorCode = ' . $errorCode; - break; - } - - throw new \Exception($errorMessage); - } - - /** - * Create temporary file for convert service testing - * - * @return array - */ - private function createTempFile() { - $fileUrl = null; - $fileName = 'convert.docx'; - $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); - $baseName = strtolower(pathinfo($fileName, PATHINFO_FILENAME)); - $templatePath = TemplateManager::getEmptyTemplate($fileExt); - $folderPath = api_get_path(SYS_PLUGIN_PATH).$this->plugin->getPluginName(); - $filePath = $folderPath . '/' . $fileName; - - if ($fp = @fopen($filePath, 'w')) { - $content = file_get_contents($templatePath); - fputs($fp, $content); - fclose($fp); - chmod($filePath, api_get_permissions_for_new_files()); - $fileUrl = api_get_path(WEB_PLUGIN_PATH).$this->plugin->getPluginName().'/'.$fileName; - } - - return [ - 'fileUrl' => $fileUrl, - 'filePath' => $filePath - ]; - } - - - /** - * Request for conversion to a service - * - * @param string $document_uri - Uri for the document to convert - * @param string $from_extension - Document extension - * @param string $to_extension - Extension to which to convert - * @param string $document_revision_id - Key for caching on service - * @param bool - $is_async - Perform conversions asynchronously - * @param string $region - Region - * - * @throws Exception - * - * @return array - */ - public function sendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async, $region = null) { - if (!empty($this->getValue('document_server_internal'))) { - $documentServerUrl = $this->getValue('document_server_internal'); - } else { - $documentServerUrl = $this->getValue('document_server_url'); - } - - if (empty($documentServerUrl)) { - throw new \Exception($this->plugin->get_lang('pluginIsNotConfigured')); - } - - $urlToConverter = $documentServerUrl . 'ConvertService.ashx'; - - if (empty($document_revision_id)) { - $document_revision_id = $document_uri; - } - - $document_revision_id = FileUtility::GenerateRevisionId($document_revision_id); - - if (empty($from_extension)) { - $from_extension = pathinfo($document_uri)['extension']; - } else { - $from_extension = trim($from_extension, '.'); - } - - $data = [ - 'async' => $is_async, - 'url' => $document_uri, - 'outputtype' => trim($to_extension, '.'), - 'filetype' => $from_extension, - 'title' => $document_revision_id . '.' . $from_extension, - 'key' => $document_revision_id - ]; - - if (!is_null($region)) { - $data['region'] = $region; - } - - $opts = [ - 'timeout' => '120', - 'headers' => [ - 'Content-type' => 'application/json' - ], - 'body' => json_encode($data) - ]; - - if (!empty($this->getValue('jwt_secret'))) { - $params = [ - 'payload' => $data - ]; - $token = JWT::encode($params, $this->getValue('jwt_secret'), 'HS256'); - $opts['headers'][$this->getValue('jwt_header')] = 'Bearer ' . $token; - $token = JWT::encode($data, $this->getValue('jwt_secret'), 'HS256'); - $data['token'] = $token; - $opts['body'] = json_encode($data); - } - - $response_xml_data = $this->request($urlToConverter, 'POST', $opts); - libxml_use_internal_errors(true); - - if (!function_exists('simplexml_load_file')) { - throw new \Exception($this->plugin->get_lang('cantReadXml')); - } - - $response_data = simplexml_load_string($response_xml_data); - - if (!$response_data) { - $exc = $this->plugin->get_lang('badResponseErrors'); - foreach(libxml_get_errors() as $error) { - $exc = $exc . '\t' . $error->message; - } - throw new \Exception ($exc); - } - - return $response_data; - } - - /** - * Request health status - * - * @throws Exception - * - * @return bool - */ - public function healthcheckRequest() { - if (!empty($this->getValue('document_server_internal'))) { - $documentServerUrl = $this->getValue('document_server_internal'); - } else { - $documentServerUrl = $this->getValue('document_server_url'); - } - - if (empty($documentServerUrl)) { - throw new \Exception($this->plugin->get_lang('appIsNotConfigured')); - } - - $urlHealthcheck = $documentServerUrl . 'healthcheck'; - $response = $this->request($urlHealthcheck); - return $response === 'true'; - } - - /** - * The method is to convert the file to the required format and return the result url - * - * @param string $document_uri - Uri for the document to convert - * @param string $from_extension - Document extension - * @param string $to_extension - Extension to which to convert - * @param string $document_revision_id - Key for caching on service - * @param string $region - Region - * - * @return string - */ - public function getConvertedUri($document_uri, $from_extension, $to_extension, $document_revision_id, $region = null) { - $responceFromConvertService = $this->sendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, false, $region); - $errorElement = $responceFromConvertService->Error; - if ($errorElement->count() > 0) { - $this->processConvServResponceError($errorElement . ''); - } - - $isEndConvert = $responceFromConvertService->EndConvert; - - if ($isEndConvert !== null && strtolower($isEndConvert) === 'true') { - return $responceFromConvertService->FileUrl; - } - - return ''; - } - - /** - * Send command - * - * @param string $method - type of command - * - * @return array - */ - public function commandRequest($method) { - //$documentServerUrl = $this->plugin->getDocumentServerInternalUrl(); - if (!empty($this->getValue('document_server_internal'))) { - $documentServerUrl = $this->getValue('document_server_internal'); - } else { - $documentServerUrl = $this->getValue('document_server_url'); - } - - - if (empty($documentServerUrl)) { - throw new \Exception($this->plugin->get_lang('cantReadXml')); - } - - $urlCommand = $documentServerUrl . 'coauthoring/CommandService.ashx'; - $data = [ - 'c' => $method - ]; - $opts = [ - 'headers' => [ - 'Content-type' => 'application/json' - ], - 'body' => json_encode($data) - ]; - - if (!empty($this->getValue('jwt_secret'))) { - $params = [ - 'payload' => $data - ]; - $token = JWT::encode($params, $this->getValue('jwt_secret'), 'HS256'); - $opts['headers'][$this->getValue('jwt_header')] = 'Bearer ' . $token; - - $token = JWT::encode($data, $this->getValue('jwt_secret'), 'HS256'); - $data['token'] = $token; - $opts['body'] = json_encode($data); - } - - $response = $this->request($urlCommand, 'POST', $opts); - $data = json_decode($response); - $this->processCommandServResponceError($data->error); - - return $data; - } - - /** - * Checking document service location - * - * @return array - */ - public function checkDocServiceUrl() { - $version = null; - try { - if (preg_match('/^https:\/\//i', api_get_path(WEB_PATH)) - && preg_match('/^http:\/\//i', $this->getValue('document_server_url'))) { - throw new \Exception($this->plugin->get_lang('mixedContent')); - } - } catch (\Exception $e) { - return [$e->getMessage(), $version]; - } - - try { - $healthcheckResponse = $this->healthcheckRequest(); - - if (!$healthcheckResponse) { - throw new \Exception($this->plugin->get_lang('badHealthcheckStatus')); - } - } catch (\Exception $e) { - return [$e->getMessage(), $version]; - } - - try { - $commandResponse = $this->commandRequest('version'); - - if (empty($commandResponse)) { - throw new \Exception($this->plugin->get_lang('errorOccuredDocService')); - } - - $version = $commandResponse->version; - $versionF = floatval($version); - - if ($versionF > 0.0 && $versionF <= 6.0) { - throw new \Exception($this->plugin->get_lang('notSupportedVersion')); - } - } catch (\Exception $e) { - return [$e->getMessage(), $version]; - } - - $convertedFileUri = null; - - try { - $emptyFile = $this->createTempFile(); - - if ($emptyFile['fileUrl'] !== null) { - if (!empty($this->getValue('storage_url'))) { - $emptyFile['fileUrl'] = str_replace(api_get_path(WEB_PATH), $this->getValue('storage_url'), $emptyFile['fileUrl']); - } - $convertedFileUri = $this->getConvertedUri($emptyFile['fileUrl'], 'docx', 'docx', 'check_' . rand()); - } - - unlink($emptyFile['filePath']); - } catch (\Exception $e) { - if (isset($emptyFile['filePath'])) { - unlink($emptyFile['filePath']); - } - return [$e->getMessage(), $version]; - } - - try { - $this->request($convertedFileUri); - } catch (\Exception $e) { - return [$e->getMessage(), $version]; - } - - return ['', $version]; - } - - /** - * Get setting value (from data base or submited form) - * - * @return string - */ - private function getValue($value) { - $result = null; - - if (!isset($this->newSettings)) { - switch ($value) { - case 'document_server_url': - $result = $this->plugin->getDocumentServerUrl(); - break; - case 'jwt_secret': - $result = $this->plugin->getDocumentServerSecret(); - break; - case 'jwt_header': - $result = $this->plugin->getJwtHeader(); - break; - case 'document_server_internal': - $result = $this->plugin->getDocumentServerInternalUrl(); - break; - case 'storage_url': - $result = $this->plugin->getStorageUrl(); - break; - default: - } - } else { - $result = isset($this->newSettings[$value]) ? (string)$this->newSettings[$value] : null; - if ($value !== 'jwt_secret' && $value !== 'jwt_header') { - if ($result !== null && $result !== "/") { - $result = rtrim($result, "/"); - if (strlen($result) > 0) { - $result = $result . "/"; - } - } - } else if ($value === 'jwt_header' && empty($this->newSettings[$value])) { - $result = 'Authorization'; - } - } - return $result; - } - -} \ No newline at end of file diff --git a/plugin/onlyoffice/lib/fileUtility.php b/plugin/onlyoffice/lib/fileUtility.php deleted file mode 100644 index f4b32bdd1f..0000000000 --- a/plugin/onlyoffice/lib/fileUtility.php +++ /dev/null @@ -1,266 +0,0 @@ - "download", - "courseId" => $courseId, - "userId" => $userId, - "docId" => $docId, - "sessionId" => $sessionId - ]; - - if (!empty($groupId)) { - $data["groupId"] = $groupId; - } - - $hashUrl = Crypt::GetHash($data); - - return api_get_path(WEB_PLUGIN_PATH) . self::app_name . "/" . "callback.php?hash=" . $hashUrl; - } - - /** - * Return location file in chamilo documents - */ - static function getUrlToLocation($courseCode, $sessionId, $groupId, $folderId) { - return api_get_path(WEB_CODE_PATH)."document/document.php" - . "?cidReq=" . Security::remove_XSS($courseCode) - . "&id_session=" . Security::remove_XSS($sessionId) - . "&gidReq=" . Security::remove_XSS($groupId) - . "&id=" . Security::remove_XSS($folderId); - } - - /** - * Return file key - */ - public static function getKey(string $courseCode, int $docId): string - { - $docInfo = DocumentManager::get_document_data_by_id($docId, $courseCode); - $mtime = filemtime($docInfo["absolute_path"]); - - $key = $mtime . $courseCode . $docId; - return self::GenerateRevisionId($key); - } - - /** - * Translation key to a supported form - */ - public static function GenerateRevisionId(string $expectedKey): string - { - if (strlen($expectedKey) > 20) $expectedKey = crc32( $expectedKey); - $key = preg_replace("[^0-9-.a-zA-Z_=]", "_", $expectedKey); - $key = substr($key, 0, min(array(strlen($key), 20))); - return $key; - } - - /** - * Create new file - */ - public static function createFile( - string $basename, - string $fileExt, - int $folderId, - int $userId, - int $sessionId, - int $courseId, - int $groupId, - string $templatePath = ""): array - { - $courseInfo = api_get_course_info_by_id($courseId); - $courseCode = $courseInfo["code"]; - $groupInfo = GroupManager::get_group_properties($groupId); - - $fileTitle = Security::remove_XSS($basename). "." .$fileExt; - - $fileNamePrefix = DocumentManager::getDocumentSuffix($courseInfo, $sessionId, $groupId); - $fileName = preg_replace('/\.\./', '', $basename) . $fileNamePrefix . "." . $fileExt; - - if (empty($templatePath)) { - $templatePath = TemplateManager::getEmptyTemplate($fileExt); - } - - $folderPath = ''; - $fileRelatedPath = "/"; - if (!empty($folderId)) { - $document_data = DocumentManager::get_document_data_by_id( - $folderId, - $courseCode, - true, - $sessionId - ); - $folderPath = $document_data["absolute_path"]; - $fileRelatedPath = $fileRelatedPath . substr($document_data["absolute_path_from_document"], 10) . "/" . $fileName; - } else { - $folderPath = api_get_path(SYS_COURSE_PATH) . api_get_course_path($courseCode) . "/document"; - if (!empty($groupId)) { - $folderPath = $folderPath . "/" . $groupInfo["directory"]; - $fileRelatedPath = $groupInfo["directory"] . "/"; - } - $fileRelatedPath = $fileRelatedPath . $fileName; - } - $filePath = $folderPath . "/" . $fileName; - - if (file_exists($filePath)) { - return ["error" => "fileIsExist"]; - } - - if ($fp = @fopen($filePath, "w")) { - $content = file_get_contents($templatePath); - fputs($fp, $content); - fclose($fp); - - chmod($filePath, api_get_permissions_for_new_files()); - - $documentId = add_document( - $courseInfo, - $fileRelatedPath, - "file", - filesize($filePath), - $fileTitle, - null, - false - ); - if ($documentId) { - api_item_property_update( - $courseInfo, - TOOL_DOCUMENT, - $documentId, - "DocumentAdded", - $userId, - $groupInfo, - null, - null, - null, - $sessionId - ); - } else { - return ["error" => "impossibleCreateFile"]; - } - } - - return ["documentId" => $documentId]; - } -} diff --git a/plugin/onlyoffice/lib/langManager.php b/plugin/onlyoffice/lib/langManager.php index 1a81dfec22..55f6cb306f 100644 --- a/plugin/onlyoffice/lib/langManager.php +++ b/plugin/onlyoffice/lib/langManager.php @@ -1,7 +1,6 @@ getEventData(); - if ($data["type"] === HOOK_EVENT_TYPE_PRE) { - $data["actions"][] = OnlyofficeTools::getButtonCreateNew(); + if (HOOK_EVENT_TYPE_PRE === $data['type']) { + $data['actions'][] = OnlyofficeTools::getButtonCreateNew(); + return $data; } } diff --git a/plugin/onlyoffice/lib/onlyofficeAppRequests.php b/plugin/onlyoffice/lib/onlyofficeAppRequests.php new file mode 100644 index 0000000000..4c4b240d90 --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeAppRequests.php @@ -0,0 +1,46 @@ + 'empty', + 'courseId' => api_get_course_int_id(), + 'userId' => api_get_user_id(), + 'sessionId' => api_get_session_id(), + ]; + $hashUrl = $this->jwtManager->getHash($data); + return api_get_path(WEB_PLUGIN_PATH).'onlyoffice/callback.php?hash='.$hashUrl; + } + +} diff --git a/plugin/onlyoffice/lib/onlyofficeAppSettings.php b/plugin/onlyoffice/lib/onlyofficeAppSettings.php new file mode 100644 index 0000000000..110c51b203 --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeAppSettings.php @@ -0,0 +1,171 @@ +plugin = $plugin; + $this->newSettings = $newSettings; + } + + public function getSetting($settingName) + { + $value = null; + if (null !== $this->newSettings) { + if (isset($this->newSettings[$settingName])) { + $value = $this->newSettings[$settingName]; + } + + if (empty($value)) { + $prefix = $this->plugin->getPluginName(); + + if (substr($settingName, 0, strlen($prefix)) == $prefix) { + $settingNameWithoutPrefix = substr($settingName, strlen($prefix) + 1); + } + + if (isset($this->newSettings[$settingNameWithoutPrefix])) { + $value = $this->newSettings[$settingNameWithoutPrefix]; + } + } + if ($this->isSettingUrl($value)) { + $value = $this->processUrl($value); + } + if (!empty($value)) { + return $value; + } + } + switch ($settingName) { + case $this->jwtHeader: + $value = api_get_setting($settingName)[$this->plugin->getPluginName()]; + if (empty($value)) { + $value = 'Authorization'; + } + break; + case $this->documentServerInternalUrl: + $value = api_get_setting($settingName)[$this->plugin->getPluginName()]; + break; + case $this->useDemoName: + $value = api_get_setting($settingName)[0]; + break; + case $this->jwtPrefix: + $value = 'Bearer '; + break; + default: + if (!empty($this->plugin) && method_exists($this->plugin, 'get')) { + $value = $this->plugin->get($settingName); + } + } + if (empty($value)) { + $value = api_get_configuration_value($settingName); + } + + return $value; + } + + public function setSetting($settingName, $value, $createSetting = false) + { + if (($settingName === $this->useDemoName) && $createSetting) { + api_add_setting($value, $settingName, null, 'setting', 'Plugins'); + + return; + } + + $prefix = $this->plugin->getPluginName(); + if (!(substr($settingName, 0, strlen($prefix)) == $prefix)) { + $settingName = $prefix.'_'.$settingName; + } + api_set_setting($settingName, $value); + } + + public function getServerUrl() + { + return api_get_path(WEB_PATH); + } + + /** + * Get link to Docs Cloud. + * + * @return string + */ + public function getLinkToDocs() + { + return self::LINK_TO_DOCS; + } + + public function isSettingUrl($settingName) + { + return in_array($settingName, [$this->documentServerUrl, $this->documentServerInternalUrl, $this->storageUrl]); + } +} diff --git a/plugin/onlyoffice/lib/onlyofficeCallbackService.php b/plugin/onlyoffice/lib/onlyofficeCallbackService.php new file mode 100644 index 0000000000..800f41b5f0 --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeCallbackService.php @@ -0,0 +1,150 @@ +docData = $docData; + $this->trackResult = 1; + } + + public function processTrackerStatusEditing($callback, string $fileid) + { + return $this->processTrackerStatusEditingAndClosed($callback, $fileid); + } + + public function processTrackerStatusMustsave($callback, string $fileid) + { + return $this->processTrackerStatusMustsaveAndCorrupted($callback, $fileid); + } + + public function processTrackerStatusCorrupted($callback, string $fileid) + { + return $this->processTrackerStatusMustsaveAndCorrupted($callback, $fileid); + } + + public function processTrackerStatusClosed($callback, string $fileid) + { + return $this->processTrackerStatusEditingAndClosed($callback, $fileid); + } + + public function processTrackerStatusForcesave($callback, string $fileid) + { + $result['error'] = $this->trackResult; + + return $result; + } + + public function processTrackerStatusMustsaveAndCorrupted($callback, string $fileid) + { + $downloadUri = $callback->getUrl(); + $this->settingsManager->replaceDocumentServerUrlToInternal($downloadUri); + try { + if (!empty($this->docData['docId']) && !empty($this->docData['courseCode'])) { + $docInfo = DocumentManager::get_document_data_by_id($fileid, $this->docData['courseCode'], false, $this->docData['sessionId']); + if (false === $docInfo) { + $result['error'] = 'File not found'; + + return $result; + } + $filePath = $docInfo['absolute_path']; + } else { + $result['error'] = 'Bad Request'; + + return $result; + } + list($isAllowToEdit, $isMyDir, $isGroupAccess, $isReadonly) = $this->getPermissionsByDocInfo($docInfo); + + if ($isReadonly) { + $result['error'] = $this->trackResult; + + return $result; + } + if (($new_data = file_get_contents($downloadUri)) === false) { + $result['error'] = $this->trackResult; + + return $result; + } + + if ($isAllowToEdit || $isMyDir || $isGroupAccess) { + $groupInfo = GroupManager::get_group_properties($this->docData['groupId']); + + if ($fp = @fopen($filePath, 'w')) { + fputs($fp, $new_data); + fclose($fp); + api_item_property_update($this->docData['courseInfo'], + TOOL_DOCUMENT, + $fileid, + 'DocumentUpdated', + $this->docData['userId'], + $groupInfo, + null, + null, + null, + $this->docData['sessionId']); + update_existing_document($this->docData['courseInfo'], + $docId, + filesize($filePath), + false); + $this->trackResult = 0; + $result['error'] = $this->trackResult; + + return $result; + } + } + } catch (UnexpectedValueException $e) { + $result['error'] = 'Bad Request'; + + return $result; + } + } + + public function processTrackerStatusEditingAndClosed($callback, string $fileid) + { + $this->trackResult = 0; + $result['error'] = $this->trackResult; + + return $result; + } + + /** + * Method checks access rights to document and returns permissions. + */ + public function getPermissionsByDocInfo(array $docInfo) + { + $isAllowToEdit = api_is_allowed_to_edit(true, true); + $isMyDir = DocumentManager::is_my_shared_folder($this->docData['userId'], $docInfo['absolute_parent_path'], $this->docData['sessionId']); + + $isGroupAccess = false; + if (!empty($groupId)) { + $courseInfo = api_get_course_info($this->docData['courseCode']); + Session::write('_real_cid', $courseInfo['real_id']); + $groupProperties = GroupManager::get_group_properties($this->docData['groupId']); + $docInfoGroup = api_get_item_property_info($courseInfo['real_id'], 'document', $docInfo['id'], $this->docData['sessionId']); + $isGroupAccess = GroupManager::allowUploadEditDocument($this->docData['userId'], $this->docData['courseCode'], $groupProperties, $docInfoGroup); + } + + $isReadonly = $docInfo['readonly']; + + return [$isAllowToEdit, $isMyDir, $isGroupAccess, $isReadonly]; + } +} diff --git a/plugin/onlyoffice/lib/onlyofficeConfigService.php b/plugin/onlyoffice/lib/onlyofficeConfigService.php new file mode 100644 index 0000000000..2e5191dd91 --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeConfigService.php @@ -0,0 +1,173 @@ +isEditable() && $this->getAccessRights() && !$this->isReadOnly()) { + $editorsMode = new EditorsMode('edit'); + } else { + if ($this->canView()) { + $editorsMode = new EditorsMode('view'); + } else { + api_not_allowed(true); + } + } + + return $editorsMode; + } + + public function isEditable() + { + return $this->documentManager->isDocumentEditable($this->documentManager->getDocInfo('title')); + } + + public function canView() + { + return $this->documentManager->isDocumentViewable($this->documentManager->getDocInfo('title')); + } + + public function getAccessRights() + { + $isAllowToEdit = api_is_allowed_to_edit(true, true); + $isMyDir = DocumentManager::is_my_shared_folder( + api_get_user_id(), + $this->documentManager->getDocInfo('absolute_parent_path'), + api_get_session_id() + ); + $isGroupAccess = false; + if (!empty($this->documentManager->getGroupId())) { + $groupProperties = GroupManager::get_group_properties($this->documentManager->getGroupId()); + $docInfoGroup = api_get_item_property_info( + api_get_course_int_id(), + 'document', + $docId, + $sessionId + ); + $isGroupAccess = GroupManager::allowUploadEditDocument( + $userId, + $courseCode, + $groupProperties, + $docInfoGroup + ); + $isMemberGroup = GroupManager::is_user_in_group($userId, $groupProperties); + if (!$isGroupAccess) { + if (!$groupProperties['status']) { + api_not_allowed(true); + } + if (!$isMemberGroup && 1 != $groupProperties['doc_state']) { + api_not_allowed(true); + } + } + } + $accessRights = $isAllowToEdit || $isMyDir || $isGroupAccess; + + return $accessRights; + } + + public function isReadOnly() + { + return $this->documentManager->getDocInfo('readonly'); + } + + public function getUser() + { + $user = new User(); + $user->setId(api_get_user_id()); + $userInfo = api_get_user_info($userId); + $user->setName($userInfo['username']); + + return $user; + } + + public function getCustomization(string $fileId) + { + $goback = new GoBack(); + + if (!empty($this->documentManager->getGobackUrl($fileId))) { + $goback->setUrl($this->documentManager->getGobackUrl($fileId)); + } + $goback->setBlank(false); + $customization = new Customization(); + $customization->setGoback($goback); + $customization->setCompactHeader(true); + $customization->setToolbarNoTabs(true); + + return $customization; + } + + public function getLang() + { + return $this->getLangInfo(); + } + + public function getRegion() + { + return $this->getLangInfo(); + } + + public function getLangInfo() + { + $langInfo = LangManager::getLangUser(); + + return $langInfo['isocode']; + } + + public function getPermissions(string $fileId = '') + { + $permsEdit = $this->getAccessRights() && !$this->isReadOnly(); + $isFillable = $this->documentManager->isDocumentFillable($this->documentManager->getDocInfo('title')); + + $permissions = new Permissions(null, + null, + null, + null, + null, + null, + $permsEdit, + null, + $isFillable, + null, + null, + null, + null, + null, + null, + null, + null + ); + + return $permissions; + } + + public function getCoEditing(string $fileId = '', $mode = null, $type) + { + return null; + } +} diff --git a/plugin/onlyoffice/lib/onlyofficeDocumentManager.php b/plugin/onlyoffice/lib/onlyofficeDocumentManager.php new file mode 100644 index 0000000000..971fa8ea0d --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeDocumentManager.php @@ -0,0 +1,260 @@ +docInfo = $docInfo; + } + + public function getDocumentKey(string $fileId, $courseCode, bool $embedded = false) + { + if (!isset($this->docInfo['absolute_path'])) { + return null; + } + $mtime = filemtime($this->docInfo['absolute_path']); + $key = $mtime.$courseCode.$fileId; + + return self::generateRevisionId($key); + } + + public function getDocumentName(string $fileId = '') + { + return $this->docInfo['title']; + } + + public static function getLangMapping() + { + } + + public function getFileUrl(string $fileId) + { + $data = [ + 'type' => 'download', + 'courseId' => api_get_course_int_id(), + 'userId' => api_get_user_id(), + 'docId' => $fileId, + 'sessionId' => api_get_session_id(), + ]; + + if (!empty($this->getGroupId())) { + $data['groupId'] = $groupId; + } + $jwtManager = new OnlyofficeJwtManager($this->settingsManager); + $hashUrl = $jwtManager->getHash($data); + + return api_get_path(WEB_PLUGIN_PATH).$this->settingsManager->plugin->getPluginName().'/callback.php?hash='.$hashUrl; + } + + public function getGroupId() + { + $groupId = isset($_GET['groupId']) && !empty($_GET['groupId']) ? $_GET['groupId'] : null; + + return $groupId; + } + + public function getCallbackUrl(string $fileId) + { + $url = ''; + + $data = [ + 'type' => 'track', + 'courseId' => api_get_course_int_id(), + 'userId' => api_get_user_id(), + 'docId' => $fileId, + 'sessionId' => api_get_session_id(), + ]; + + if (!empty($this->getGroupId())) { + $data['groupId'] = $groupId; + } + + $jwtManager = new OnlyofficeJwtManager($this->settingsManager); + $hashUrl = $jwtManager->getHash($data); + + return $url.api_get_path(WEB_PLUGIN_PATH).'onlyoffice/callback.php?hash='.$hashUrl; + } + + public function getGobackUrl(string $fileId) + { + if (!empty($this->docInfo)) { + return api_get_path(WEB_CODE_PATH).'document/document.php' + .'?cidReq='.Security::remove_XSS(api_get_course_id()) + .'&id_session='.Security::remove_XSS(api_get_session_id()) + .'&gidReq='.Security::remove_XSS($this->getGroupId()) + .'&id='.Security::remove_XSS($this->docInfo['parent_id']); + } + + return ''; + } + + /** + * Return location file in chamilo documents. + */ + public static function getUrlToLocation($courseCode, $sessionId, $groupId, $folderId) + { + return api_get_path(WEB_CODE_PATH).'document/document.php' + .'?cidReq='.Security::remove_XSS($courseCode) + .'&id_session='.Security::remove_XSS($sessionId) + .'&gidReq='.Security::remove_XSS($groupId) + .'&id='.Security::remove_XSS($folderId); + } + + public function getCreateUrl(string $fileId) + { + } + + /** + * Get the value of docInfo. + */ + public function getDocInfo($elem = null) + { + if (empty($elem)) { + return $this->docInfo; + } else { + if (isset($this->docInfo[$elem])) { + return $this->docInfo[$elem]; + } + + return []; + } + } + + /** + * Set the value of docInfo. + */ + public function setDocInfo($docInfo) + { + $this->docInfo = $docInfo; + } + + /** + * Return file extension by file type. + */ + public static function getDocExtByType(string $type): string + { + if ('text' === $type) { + return 'docx'; + } + if ('spreadsheet' === $type) { + return 'xlsx'; + } + if ('presentation' === $type) { + return 'pptx'; + } + if ('formTemplate' === $type) { + return 'pdf'; + } + + return ''; + } + + /** + * Create new file. + */ + public static function createFile( + string $basename, + string $fileExt, + int $folderId, + int $userId, + int $sessionId, + int $courseId, + int $groupId, + string $templatePath = ''): array + { + $courseInfo = api_get_course_info_by_id($courseId); + $courseCode = $courseInfo['code']; + $groupInfo = GroupManager::get_group_properties($groupId); + + $fileTitle = Security::remove_XSS($basename).'.'.$fileExt; + + $fileNamePrefix = ChamiloDocumentManager::getDocumentSuffix($courseInfo, $sessionId, $groupId); + $fileName = preg_replace('/\.\./', '', $basename).$fileNamePrefix.'.'.$fileExt; + + if (empty($templatePath)) { + $templatePath = TemplateManager::getEmptyTemplate($fileExt); + } + + $folderPath = ''; + $fileRelatedPath = '/'; + if (!empty($folderId)) { + $document_data = ChamiloDocumentManager::get_document_data_by_id( + $folderId, + $courseCode, + true, + $sessionId + ); + $folderPath = $document_data['absolute_path']; + $fileRelatedPath = $fileRelatedPath.substr($document_data['absolute_path_from_document'], 10).'/'.$fileName; + } else { + $folderPath = api_get_path(SYS_COURSE_PATH).api_get_course_path($courseCode).'/document'; + if (!empty($groupId)) { + $folderPath = $folderPath.'/'.$groupInfo['directory']; + $fileRelatedPath = $groupInfo['directory'].'/'; + } + $fileRelatedPath = $fileRelatedPath.$fileName; + } + $filePath = $folderPath.'/'.$fileName; + + if (file_exists($filePath)) { + return ['error' => 'fileIsExist']; + } + + if ($fp = @fopen($filePath, 'w')) { + $content = file_get_contents($templatePath); + fputs($fp, $content); + fclose($fp); + + chmod($filePath, api_get_permissions_for_new_files()); + + $documentId = add_document( + $courseInfo, + $fileRelatedPath, + 'file', + filesize($filePath), + $fileTitle, + null, + false + ); + if ($documentId) { + api_item_property_update( + $courseInfo, + TOOL_DOCUMENT, + $documentId, + 'DocumentAdded', + $userId, + $groupInfo, + null, + null, + null, + $sessionId + ); + } else { + return ['error' => 'impossibleCreateFile']; + } + } + + return ['documentId' => $documentId]; + } +} diff --git a/plugin/onlyoffice/lib/onlyofficeFormatsManager.php b/plugin/onlyoffice/lib/onlyofficeFormatsManager.php new file mode 100644 index 0000000000..fbfe3a792e --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeFormatsManager.php @@ -0,0 +1,73 @@ +formatsList = self::buildNamedFormatsArray($formats); + } + + private static function getFormats() + { + $formats = file_get_contents(dirname(__DIR__). + DIRECTORY_SEPARATOR. + 'vendor'. + DIRECTORY_SEPARATOR. + 'onlyoffice'. + DIRECTORY_SEPARATOR. + 'docs-integration-sdk'. + DIRECTORY_SEPARATOR. + 'resources'. + DIRECTORY_SEPARATOR. + 'assets'. + DIRECTORY_SEPARATOR. + 'document-formats'. + DIRECTORY_SEPARATOR. + 'onlyoffice-docs-formats.txt'); + + if (empty($formats)) { + $formats = file_get_contents(dirname(__DIR__). + DIRECTORY_SEPARATOR. + 'vendor'. + DIRECTORY_SEPARATOR. + 'onlyoffice'. + DIRECTORY_SEPARATOR. + 'docs-integration-sdk'. + DIRECTORY_SEPARATOR. + 'resources'. + DIRECTORY_SEPARATOR. + 'assets'. + DIRECTORY_SEPARATOR. + 'document-formats'. + DIRECTORY_SEPARATOR. + 'onlyoffice-docs-formats.json'); + } + + if (!empty($formats)) { + $formats = json_decode($formats); + if (!empty($formats)) { + return $formats; + } + throw new \Exception(CommonError::message(CommonError::EMPTY_FORMATS_ASSET)); + } + throw new \Exception(CommonError::message(CommonError::EMPTY_FORMATS_ASSET)); + } +} \ No newline at end of file diff --git a/plugin/onlyoffice/lib/onlyofficeHttpClient.php b/plugin/onlyoffice/lib/onlyofficeHttpClient.php new file mode 100644 index 0000000000..6099369d15 --- /dev/null +++ b/plugin/onlyoffice/lib/onlyofficeHttpClient.php @@ -0,0 +1,66 @@ +responseStatusCode = null; + $this->responseBody = null; + } + + /** + * Request to Document Server with turn off verification. + * + * @param string $url - request address + * @param array $method - request method + * @param array $opts - request options + */ + public function request($url, $method = 'GET', $opts = []) + { + $httpClient = new Client(['base_uri' => $url]); + try { + $response = $httpClient->request($method, $url, $opts); + $this->responseBody = $response->getBody()->getContents(); + $this->responseStatusCode = $response->getStatusCode(); + } catch (RequestException $requestException) { + throw new Exception($requestException->getMessage()); + } + } + + /** + * Get the value of responseStatusCode. + */ + public function getStatusCode() + { + return $this->responseStatusCode; + } + + /** + * Get the value of responseBody. + */ + public function getBody() + { + return $this->responseBody; + } +} diff --git a/plugin/onlyoffice/lib/onlyofficeItemActionObserver.php b/plugin/onlyoffice/lib/onlyofficeItemActionObserver.php index 6cae30dbb1..31140c9053 100644 --- a/plugin/onlyoffice/lib/onlyofficeItemActionObserver.php +++ b/plugin/onlyoffice/lib/onlyofficeItemActionObserver.php @@ -1,7 +1,6 @@ getEventData(); - if ($data["type"] === HOOK_EVENT_TYPE_PRE) { - $data["actions"][] = OnlyofficeTools::getButtonEdit($data); + if (HOOK_EVENT_TYPE_PRE === $data['type']) { + $data['actions'][] = OnlyofficeTools::getButtonEdit($data); + return $data; } } diff --git a/plugin/onlyoffice/lib/onlyofficeItemViewObserver.php b/plugin/onlyoffice/lib/onlyofficeItemViewObserver.php index a1677bddb4..378ceee0f6 100644 --- a/plugin/onlyoffice/lib/onlyofficeItemViewObserver.php +++ b/plugin/onlyoffice/lib/onlyofficeItemViewObserver.php @@ -1,7 +1,6 @@ encode($object, api_get_security_key()); + } +} diff --git a/plugin/onlyoffice/lib/onlyofficePlugin.php b/plugin/onlyoffice/lib/onlyofficePlugin.php index 94b5557e6b..019ba1512d 100644 --- a/plugin/onlyoffice/lib/onlyofficePlugin.php +++ b/plugin/onlyoffice/lib/onlyofficePlugin.php @@ -1,7 +1,6 @@ "boolean", - "document_server_url" => "text", - "jwt_secret" => "text", - "jwt_header" => "text", - "document_server_internal" => "text", - "storage_url" => "text" + 'enable_onlyoffice_plugin' => 'boolean', + 'document_server_url' => 'text', + 'jwt_secret' => 'text', + 'jwt_header' => 'text', + 'document_server_internal' => 'text', + 'storage_url' => 'text', ] ); } /** - * Create OnlyofficePlugin object + * Create OnlyofficePlugin object. */ public static function create(): OnlyofficePlugin { @@ -106,210 +103,22 @@ class OnlyofficePlugin extends Plugin implements HookPluginInterface } /** - * Get status of demo server - * - * @return bool - */ - public function useDemo() { - return $this->getDemoData()["enabled"] === true; - } - - /** - * Get demo data - * - * @return array - */ - public function getDemoData() { - $data = api_get_setting('onlyoffice_connect_demo_data')[0]; - - if (empty($data)) { - $data = [ - "available" => true, - "enabled" => false - ]; - api_add_setting(json_encode($data), 'onlyoffice_connect_demo_data', null, 'setting', 'Plugins'); - return $data; - } - $data = json_decode($data, true); - - if (isset($data['start'])) { - $overdue = $data["start"]; - $overdue += 24*60*60*AppConfig::GetDemoParams()["TRIAL"]; - if ($overdue > time()) { - $data["available"] = true; - $data["enabled"] = $data["enabled"] === true; - } else { - $data["available"] = false; - $data["enabled"] = false; - api_set_setting('onlyoffice_connect_demo_data', json_encode($data)); - } - } - return $data; - } - - /** - * Switch on demo server - * - * @param bool $value - select demo - * - * @return bool - */ - public function selectDemo($value) { - $data = $this->getDemoData(); - - if ($value === true && !$data["available"]) { - return false; - } - - $data["enabled"] = $value === true; - - if (!isset($data["start"])) { - $data["start"] = time(); - } - api_set_setting('onlyoffice_connect_demo_data', json_encode($data)); - return true; - } - - /** - * Get the document server url - * - * @param bool $origin - take origin + * Get link to plugin settings. * * @return string */ - public function getDocumentServerUrl($origin = false) + public function getConfigLink() { - if (!$origin && $this->useDemo()) { - return AppConfig::GetDemoParams()["ADDR"]; - } - - $url = $this->get("document_server_url"); - return self::processUrl($url); + return api_get_path(WEB_PATH).'main/admin/configure_plugin.php?name='.$this->pluginName; } /** - * Get the document service address available from Chamilo from the application configuration - * - * @param bool $origin - take origin + * Get plugin name. * * @return string */ - public function getDocumentServerInternalUrl($origin = false) { - if (!$origin && $this->useDemo()) { - return $this->getDocumentServerUrl(); - } - - $url = $this->get('document_server_internal'); - if (empty($url)) { - $url = AppConfig::InternalUrl(); - } - if (!$origin && empty($url)) { - $url = $this->getDocumentServerUrl(); - } - return self::processUrl($url); - } - - /** - * Replace domain in document server url with internal address from configuration - * - * @param string $url - document server url - * - * @return string - */ - public function replaceDocumentServerUrlToInternal($url) { - $documentServerUrl = $this->getDocumentServerInternalUrl(); - if (!empty($documentServerUrl)) { - $from = $this->getDocumentServerUrl(); - - if (!preg_match("/^https?:\/\//i", $from)) { - $parsedUrl = parse_url($url); - $from = $parsedUrl["scheme"] . "://" . $parsedUrl["host"] . (array_key_exists("port", $parsedUrl) ? (":" . $parsedUrl["port"]) : "") . $from; - } - - if ($from !== $documentServerUrl) - { - $url = str_replace($from, $documentServerUrl, $url); - } - } - return $url; - } - - /** - * Get the Chamilo address available from document server from the application configuration - * - * @return string - */ - public function getStorageUrl() { - $storageUrl = $this->get('storage_url'); - if (empty($storageUrl)) { - $storageUrl = AppConfig::StorageUrl(); - } - return self::processUrl($storageUrl); - } - - /** - * Get the document service secret key from the application configuration - * - * @param bool $origin - take origin - * - * @return string - */ - public function getDocumentServerSecret($origin = false) { - if (!$origin && $this->useDemo()) { - return AppConfig::GetDemoParams()["SECRET"]; - } - return $this->get("jwt_secret"); - } - - /** - * Get the jwt header setting - * - * @param bool $origin - take origin - * - * @return string - */ - public function getJwtHeader($origin = false) { - if (!$origin && $this->useDemo()) { - return AppConfig::GetDemoParams()["HEADER"]; - } - - $header = $this->get('jwt_header'); - if (empty($header)) { - $header = AppConfig::JwtHeader() ? AppConfig::JwtHeader() : "Authorization"; - } - return $header; - } - - /** - * Get link to plugin settings - * - * @return string - */ - public function getConfigLink() { - return api_get_path(WEB_PATH)."main/admin/configure_plugin.php?name=".$this->pluginName; - } - - /** - * Get plugin name - * - * @return string - */ - public function getPluginName() { + public function getPluginName() + { return $this->pluginName; } - - /** - * Add backslash to url if it's needed - * - * @return string - */ - public function processUrl($url) { - if ($url !== null && $url !== "/") { - $url = rtrim($url, "/"); - if (strlen($url) > 0) { - $url = $url . "/"; - } - } - return $url; - } } diff --git a/plugin/onlyoffice/lib/onlyofficeSettingsFormBuilder.php b/plugin/onlyoffice/lib/onlyofficeSettingsFormBuilder.php index 200ceee092..80440f8b19 100644 --- a/plugin/onlyoffice/lib/onlyofficeSettingsFormBuilder.php +++ b/plugin/onlyoffice/lib/onlyofficeSettingsFormBuilder.php @@ -1,7 +1,6 @@ $param) { - $tpl->assign($key, $param); - } - } - $parsedTemplate = $tpl->fetch(self::ONLYOFFICE_LAYOUT_DIR.$templateName.'.tpl'); - return $parsedTemplate; - } - - /** - * Display error messahe - * - * @param string $errorMessage - error message - * @param string $location - header location - * - * @return void - */ - private function displayError($errorMessage, $location = null) { - Display::addFlash( - Display::return_message( - $errorMessage, - 'error' - ) - ); - if ($location !== null) { - header('Location: '.$location); - exit; - } - } - - /** - * Build OnlyofficePlugin settings form - * - * @param OnlyofficePlugin $plugin - OnlyofficePlugin + * Build OnlyofficePlugin settings form. * * @return FormValidator */ - public function buildSettingsForm($plugin) { - $demoData = $plugin->getDemoData(); + public static function buildSettingsForm(OnlyofficeAppsettings $settingsManager) + { + $plugin = $settingsManager->plugin; + $demoData = $settingsManager->getDemoData(); $plugin_info = $plugin->get_info(); $message = ''; $connectDemoCheckbox = $plugin_info['settings_form']->createElement( @@ -84,11 +41,11 @@ class OnlyofficeSettingsFormBuilder { '', $plugin->get_lang('connect_demo') ); - if (!$demoData['available'] === true) { + if (true === !$demoData['available']) { $message = $plugin->get_lang('demoPeriodIsOver'); $connectDemoCheckbox->setAttribute('disabled'); } else { - if ($plugin->useDemo()) { + if ($settingsManager->useDemo()) { $message = $plugin->get_lang('demoUsingMessage'); $connectDemoCheckbox->setChecked(true); } else { @@ -99,9 +56,8 @@ class OnlyofficeSettingsFormBuilder { $message, 'info' ); - $appConfig = new AppConfig(); $bannerTemplate = self::buildTemplate('get_docs_cloud_banner', [ - 'docs_cloud_link' => $appConfig->GetLinkToDocs(), + 'docs_cloud_link' => $settingsManager->getLinkToDocs(), 'banner_title' => $plugin->get_lang('DocsCloudBannerTitle'), 'banner_main_text' => $plugin->get_lang('DocsCloudBannerMain'), 'banner_button_text' => $plugin->get_lang('DocsCloudBannerButton'), @@ -111,36 +67,85 @@ class OnlyofficeSettingsFormBuilder { $plugin_info['settings_form']->insertElementBefore($demoServerMessage, 'submit_button'); $banner = $plugin_info['settings_form']->createElement('html', $bannerTemplate); $plugin_info['settings_form']->insertElementBefore($banner, 'submit_button'); + return $plugin_info['settings_form']; } /** - * Validate OnlyofficePlugin settings form + * Validate OnlyofficePlugin settings form. * - * @param OnlyofficePlugin $plugin - OnlyofficePlugin + * @param OnlyofficeAppsettings $settingsManager - Onlyoffice SettingsManager * * @return OnlyofficePlugin */ - public function validateSettingsForm($plugin) { + public static function validateSettingsForm(OnlyofficeAppsettings $settingsManager) + { + $plugin = $settingsManager->plugin; $errorMsg = null; $plugin_info = $plugin->get_info(); $result = $plugin_info['settings_form']->getSubmitValues(); - if (!$plugin->selectDemo((bool)$result['connect_demo'] === true)) { + unset($result['submit_button']); + $settingsManager->newSettings = $result; + if (!$settingsManager->selectDemo(true === (bool) $result['connect_demo'])) { $errorMsg = $plugin->get_lang('demoPeriodIsOver'); self::displayError($errorMsg, $plugin->getConfigLink()); } - $documentserver = $plugin->getDocumentServerUrl(); - if (!empty($documentserver)) { - if ((bool)$result['connect_demo'] === false) { - $documentService = new DocumentService($plugin, $result); - list ($error, $version) = $documentService->checkDocServiceUrl(); - + if (!empty($settingsManager->getDocumentServerUrl())) { + if (false === (bool) $result['connect_demo']) { + $httpClient = new OnlyofficeHttpClient(); + $jwtManager = new OnlyofficeJwtManager($settingsManager); + $requestService = new OnlyofficeAppRequests($settingsManager, $httpClient, $jwtManager); + list($error, $version) = $requestService->checkDocServiceUrl(); if (!empty($error)) { $errorMsg = $plugin->get_lang('connectionError').'('.$error.')'.(!empty($version) ? '(Version '.$version.')' : ''); - self::displayError($errorMsg); + self::displayError($errorMsg); } } } + return $plugin; } + + /** + * Build HTML-template. + * + * @param string $templateName - template name (*.tpl) + * @param array $params - parameters to assign + * + * @return string + */ + private static function buildTemplate($templateName, $params = []) + { + $tpl = new Template('', false, false, false, false, false, false); + if (!empty($params)) { + foreach ($params as $key => $param) { + $tpl->assign($key, $param); + } + } + $parsedTemplate = $tpl->fetch(self::ONLYOFFICE_LAYOUT_DIR.$templateName.'.tpl'); + + return $parsedTemplate; + } + + /** + * Display error messahe. + * + * @param string $errorMessage - error message + * @param string $location - header location + * + * @return void + */ + private static function displayError($errorMessage, $location = null) + { + Display::addFlash( + Display::return_message( + $errorMessage, + 'error' + ) + ); + if (null !== $location) { + header('Location: '.$location); + exit; + } + } } diff --git a/plugin/onlyoffice/lib/onlyofficeTools.php b/plugin/onlyoffice/lib/onlyofficeTools.php index 16597df690..c5302ffe9a 100644 --- a/plugin/onlyoffice/lib/onlyofficeTools.php +++ b/plugin/onlyoffice/lib/onlyofficeTools.php @@ -1,7 +1,6 @@ get("enable_onlyoffice_plugin") === "true"; + $appSettings = new OnlyofficeAppsettings($plugin); + $documentManager = new OnlyofficeDocumentManager($appSettings, []); + $isEnable = 'true' === $plugin->get('enable_onlyoffice_plugin'); if (!$isEnable) { return ''; } - $urlToEdit = api_get_path(WEB_PLUGIN_PATH) . "onlyoffice/editor.php"; + $urlToEdit = api_get_path(WEB_PLUGIN_PATH).'onlyoffice/editor.php'; - $extension = strtolower(pathinfo($document_data["title"], PATHINFO_EXTENSION)); + $extension = strtolower(pathinfo($document_data['title'], PATHINFO_EXTENSION)); - $canEdit = in_array($extension, FileUtility::$can_edit_types); - $canView = in_array($extension, FileUtility::$can_view_types); + $canEdit = null !== $documentManager->getFormatInfo($extension) ? $documentManager->getFormatInfo($extension)->isEditable() : false; + $canView = null !== $documentManager->getFormatInfo($extension) ? $documentManager->getFormatInfo($extension)->isViewable() : false; $groupId = api_get_group_id(); if (!empty($groupId)) { - $urlToEdit = $urlToEdit . "?groupId=" . $groupId . "&"; + $urlToEdit = $urlToEdit.'?groupId='.$groupId.'&'; } else { - $urlToEdit = $urlToEdit . "?"; + $urlToEdit = $urlToEdit.'?'; } - $documentId = $document_data["id"]; - $urlToEdit = $urlToEdit . "docId=" . $documentId; + $documentId = $document_data['id']; + $urlToEdit = $urlToEdit.'docId='.$documentId; if ($canEdit || $canView) { $tooltip = $plugin->get_lang('openByOnlyoffice'); - if ($extension === "oform") { + if ('pdf' === $extension) { $tooltip = $plugin->get_lang('fillInFormInOnlyoffice'); } @@ -68,65 +66,65 @@ class OnlyofficeTools { } /** - * Return button-link to onlyoffice editor for view file + * Return button-link to onlyoffice editor for view file. */ - public static function getButtonView (array $document_data): string + public static function getButtonView(array $document_data): string { - $plugin = OnlyofficePlugin::create(); + $appSettings = new OnlyofficeAppsettings($plugin); + $documentManager = new OnlyofficeDocumentManager($appSettings, []); - $isEnable = $plugin->get("enable_onlyoffice_plugin") === "true"; + $isEnable = 'true' === $plugin->get('enable_onlyoffice_plugin'); if (!$isEnable) { return ''; } - $urlToEdit = api_get_path(WEB_PLUGIN_PATH) . "onlyoffice/editor.php"; + $urlToEdit = api_get_path(WEB_PLUGIN_PATH).'onlyoffice/editor.php'; $sessionId = api_get_session_id(); $courseInfo = api_get_course_info(); - $documentId = $document_data["id"]; + $documentId = $document_data['id']; $userId = api_get_user_id(); - $docInfo = DocumentManager::get_document_data_by_id($documentId, $courseInfo["code"], false, $sessionId); + $docInfo = DocumentManager::get_document_data_by_id($documentId, $courseInfo['code'], false, $sessionId); - $extension = strtolower(pathinfo($document_data["title"], PATHINFO_EXTENSION)); - $canView = in_array($extension, FileUtility::$can_view_types); + $extension = strtolower(pathinfo($document_data['title'], PATHINFO_EXTENSION)); + $canView = null !== $documentManager->getFormatInfo($extension) ? $documentManager->getFormatInfo($extension)->isViewable() : false; $isGroupAccess = false; $groupId = api_get_group_id(); if (!empty($groupId)) { $groupProperties = GroupManager::get_group_properties($groupId); $docInfoGroup = api_get_item_property_info(api_get_course_int_id(), 'document', $documentId, $sessionId); - $isGroupAccess = GroupManager::allowUploadEditDocument($userId, $courseInfo["code"], $groupProperties, $docInfoGroup); + $isGroupAccess = GroupManager::allowUploadEditDocument($userId, $courseInfo['code'], $groupProperties, $docInfoGroup); - $urlToEdit = $urlToEdit . "?groupId=" . $groupId . "&"; + $urlToEdit = $urlToEdit.'?groupId='.$groupId.'&'; } else { - $urlToEdit = $urlToEdit . "?"; + $urlToEdit = $urlToEdit.'?'; } $isAllowToEdit = api_is_allowed_to_edit(true, true); - $isMyDir = DocumentManager::is_my_shared_folder($userId, $docInfo["absolute_parent_path"], $sessionId); + $isMyDir = DocumentManager::is_my_shared_folder($userId, $docInfo['absolute_parent_path'], $sessionId); $accessRights = $isAllowToEdit || $isMyDir || $isGroupAccess; - $urlToEdit = $urlToEdit . "docId=" . $documentId; + $urlToEdit = $urlToEdit.'docId='.$documentId; if ($canView && !$accessRights) { - return Display::url(Display::return_icon('../../plugin/onlyoffice/resources/onlyoffice_view.png', $plugin->get_lang('openByOnlyoffice')), $urlToEdit, ["style" => "float:right; margin-right:8px"]); + return Display::url(Display::return_icon('../../plugin/onlyoffice/resources/onlyoffice_view.png', $plugin->get_lang('openByOnlyoffice')), $urlToEdit, ['style' => 'float:right; margin-right:8px']); } return ''; } /** - * Return button-link to onlyoffice create new + * Return button-link to onlyoffice create new. */ - public static function getButtonCreateNew (): string + public static function getButtonCreateNew(): string { - $plugin = OnlyofficePlugin::create(); - $isEnable = $plugin->get("enable_onlyoffice_plugin") === "true"; + $isEnable = 'true' === $plugin->get('enable_onlyoffice_plugin'); if (!$isEnable) { return ''; } @@ -136,19 +134,79 @@ class OnlyofficeTools { $groupId = api_get_group_id(); $userId = api_get_user_id(); - $urlToCreate = api_get_path(WEB_PLUGIN_PATH) . "onlyoffice/create.php" - ."?folderId=" . (empty($_GET["id"])?'0':(int)$_GET["id"]) - . "&courseId=" . $courseId - . "&groupId=" . $groupId - . "&sessionId=" . $sessionId - . "&userId=" . $userId; + $urlToCreate = api_get_path(WEB_PLUGIN_PATH).'onlyoffice/create.php' + .'?folderId='.(empty($_GET['id']) ? '0' : (int) $_GET['id']) + .'&courseId='.$courseId + .'&groupId='.$groupId + .'&sessionId='.$sessionId + .'&userId='.$userId; return Display::url( Display::return_icon( - "../../plugin/onlyoffice/resources/onlyoffice_create.png", - $plugin->get_lang("createNew") + '../../plugin/onlyoffice/resources/onlyoffice_create.png', + $plugin->get_lang('createNew') ), $urlToCreate ); } + + /** + * Return path to OnlyOffice viewer for a given file. + * @param int $documentId The ID from c_document.iid + * @param bool $showHeaders Whether to show Chamilo headers on top of the OnlyOffice frame or not + * + * @return string A link to open the OnlyOffice viewer + */ + public static function getPathToView(int $documentId, bool $showHeaders = true): string + { + $plugin = OnlyofficePlugin::create(); + $appSettings = new OnlyofficeAppsettings($plugin); + $documentManager = new OnlyofficeDocumentManager($appSettings, []); + + $isEnable = 'true' === $plugin->get('enable_onlyoffice_plugin'); + if (!$isEnable) { + return ''; + } + + $urlToEdit = api_get_path(WEB_PLUGIN_PATH).'onlyoffice/editor.php'; + + $sessionId = api_get_session_id(); + $courseInfo = api_get_course_info(); + $userId = api_get_user_id(); + + $docInfo = DocumentManager::get_document_data_by_id($documentId, $courseInfo['code'], false, $sessionId); + + $extension = strtolower(pathinfo($docInfo['path'], PATHINFO_EXTENSION)); + $canView = null !== $documentManager->getFormatInfo($extension) ? $documentManager->getFormatInfo($extension)->isViewable() : false; + + $isGroupAccess = false; + $groupId = api_get_group_id(); + if (!empty($groupId)) { + $groupProperties = GroupManager::get_group_properties($groupId); + $docInfoGroup = api_get_item_property_info(api_get_course_int_id(), 'document', $documentId, $sessionId); + $isGroupAccess = GroupManager::allowUploadEditDocument($userId, $courseInfo['code'], $groupProperties, $docInfoGroup); + + $urlToEdit = $urlToEdit.'?groupId='.$groupId.'&'; + } else { + $urlToEdit = $urlToEdit.'?'; + } + error_log(__LINE__.' '.$urlToEdit); + + $isMyDir = DocumentManager::is_my_shared_folder($userId, $docInfo['absolute_parent_path'], $sessionId); + + $accessRights = $isMyDir || $isGroupAccess; + + $urlToEdit = $urlToEdit.'docId='.$documentId; + if (false === $showHeaders) { + $urlToEdit .= '&nh=1'; + } + + if ($canView && !$accessRights) { + error_log(__LINE__.' '.$urlToEdit); + + return $urlToEdit; + } + + return ''; + } } diff --git a/plugin/onlyoffice/lib/templateManager.php b/plugin/onlyoffice/lib/templateManager.php index 340d185329..24b6054143 100644 --- a/plugin/onlyoffice/lib/templateManager.php +++ b/plugin/onlyoffice/lib/templateManager.php @@ -1,7 +1,6 @@ "bg-BG", - "cs" => "cs-CS", - "de" => "de-DE", - "el" => "el-GR", - "en" => "en-US", - "es" => "es-ES", - "eu" => "eu-ES", - "fr" => "fr-FR", - "gl" => "gl-ES", - "it" => "it-IT", - "ja" => "ja-JP", - "ko" => "ko-KR", - "lv" => "lv-LV", - "nl" => "nl-NL", - "ms" => "ms-MY", - "pl" => "pl-PL", - "pt" => "pt-PT", - "pt-BR" => "pt-BR", - "ru" => "ru-RU", - "sk" => "sk-SK", - "sv" => "sv-SE", - "tr" => "tr-TR", - "uk" => "uk-UA", - "vi" => "vi-VN", - "zh" => "zh-CN", - "zh-TW" => "zh-TW" - ]; +require_once __DIR__.'/../../../main/inc/global.inc.php'; +class TemplateManager +{ /** - * Return path to template new file + * Return path to template new file. */ public static function getEmptyTemplate($fileExtension): string { $langInfo = LangManager::getLangUser(); - $lang = $langInfo["isocode"]; - if (!array_key_exists($lang, self::$localPath)) { - $lang = "en"; + $lang = $langInfo['isocode']; + $templateFolder = api_get_path(SYS_PLUGIN_PATH).'onlyoffice/assets/'; + if (!is_dir($templateFolder.$lang)) { + $lang = 'default'; } - $templateFolder = api_get_path(SYS_PLUGIN_PATH) . "onlyoffice/assets/" . self::$localPath[$lang]; + $templateFolder = $templateFolder.$lang; - return $templateFolder . "/" . ltrim($fileExtension, ".") . ".zip"; + return $templateFolder.'/'.ltrim($fileExtension, '.').'.zip'; } } diff --git a/plugin/onlyoffice/plugin.php b/plugin/onlyoffice/plugin.php index d34f888db9..76df2f1e67 100644 --- a/plugin/onlyoffice/plugin.php +++ b/plugin/onlyoffice/plugin.php @@ -1,7 +1,6 @@ get_info(); -$form = new OnlyofficeSettingsFormBuilder(); -$plugin_info['settings_form'] = $form->buildSettingsForm($plugin); +$plugin_info['settings_form'] = OnlyofficeSettingsFormBuilder::buildSettingsForm($appSettings); if ($plugin_info['settings_form']->validate()) { - $plugin = $form->validateSettingsForm($plugin); + $plugin = OnlyofficeSettingsFormBuilder::validateSettingsForm($appSettings); } diff --git a/plugin/onlyoffice/resources/css/docsCloudBanner.css b/plugin/onlyoffice/resources/css/docsCloudBanner.css new file mode 100644 index 0000000000..957e563c44 --- /dev/null +++ b/plugin/onlyoffice/resources/css/docsCloudBanner.css @@ -0,0 +1,94 @@ +#onlyofficeDocsCloudBannerWrapper { + max-width: 596px; + min-height: 108px; + text-align: center; + background-image: url("/plugin/onlyoffice/resources/get-editors-background.svg"); + background-repeat: no-repeat; + background-color: #FFFFFF; + border: 1px solid #EFEFEF; + border-radius: 3px; + display: flex; + flex-direction: row; + margin-bottom: 10px; +} + +#onlyofficeDocsCloudBannerPicWrapper { + height: 100%; + width: 20%; + padding: 10px 0 0 20px; +} + +#onlyofficeDocsCloudBannerPic { + content: url("/plugin/onlyoffice/resources/get-editors-pic.svg"); +} + +#onlyofficeDocsCloudBannerContent { + height: 100%; + width: 80%; + color: #000000; + display: flex; + flex-direction: row; + margin: auto; +} + +#onlyofficeDocsCloudBannerContentText { + width: 60%; + height: 100%; + color: #000; + font-size: 14px; + text-align: justify; + padding-left: 15px; +} + +#onlyofficeDocsCloudBannerContentText h2 { + margin: 0; + color: #000000; +} + +#onlyofficeDocsCloudBannerContentButtonWrapper { + width: 40%; + height: 100%; + margin: auto; +} + +#onlyofficeDocsCloudBannerContentButton { + background-color: #EDEDED; + color: #000; + border: 1px solid #DBDBDB; +} + +@media (max-width: 580px) { + #onlyofficeDocsCloudBannerPicWrapper { + padding: 20px 0 0 5px; + width: 30%; + } + #onlyofficeDocsCloudBannerContent { + flex-direction: column; + width: 70%; + } + #onlyofficeDocsCloudBannerContentText { + width: 100%; + padding-right: 5px; + } + #onlyofficeDocsCloudBannerContentButtonWrapper { + width: 100%; + padding: 15px 0 15px 15px; + text-align: left; + } + #onlyofficeDocsCloudBannerContent { + flex-direction: column; + } +} + +@media (max-width: 335px) { + #onlyofficeDocsCloudBannerWrapper { + flex-direction: column; + } + #onlyofficeDocsCloudBannerPicWrapper { + width: 100%; + padding: unset; + } + #onlyofficeDocsCloudBannerContent { + width: 100%; + } +} \ No newline at end of file diff --git a/plugin/onlyoffice/resources/get-editors-background.svg b/plugin/onlyoffice/resources/get-editors-background.svg new file mode 100644 index 0000000000..ff6f91dcfa --- /dev/null +++ b/plugin/onlyoffice/resources/get-editors-background.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugin/onlyoffice/resources/get-editors-pic.svg b/plugin/onlyoffice/resources/get-editors-pic.svg new file mode 100644 index 0000000000..939d3d292f --- /dev/null +++ b/plugin/onlyoffice/resources/get-editors-pic.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin/onlyoffice/uninstall.php b/plugin/onlyoffice/uninstall.php index d031793bb9..a1617098a4 100644 --- a/plugin/onlyoffice/uninstall.php +++ b/plugin/onlyoffice/uninstall.php @@ -1,7 +1,6 @@ uninstall(); \ No newline at end of file +OnlyofficePlugin::create()->uninstall(); diff --git a/plugin/onlyoffice/vendor/autoload.php b/plugin/onlyoffice/vendor/autoload.php new file mode 100644 index 0000000000..273a05df8d --- /dev/null +++ b/plugin/onlyoffice/vendor/autoload.php @@ -0,0 +1,25 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/plugin/onlyoffice/vendor/composer/InstalledVersions.php b/plugin/onlyoffice/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000000..51e734a774 --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/plugin/onlyoffice/vendor/composer/autoload_classmap.php b/plugin/onlyoffice/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000000..5490b88d87 --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/autoload_classmap.php @@ -0,0 +1,15 @@ + $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', +); diff --git a/plugin/onlyoffice/vendor/composer/autoload_files.php b/plugin/onlyoffice/vendor/composer/autoload_files.php new file mode 100644 index 0000000000..7ff36b4ffe --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/autoload_files.php @@ -0,0 +1,12 @@ + $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', +); diff --git a/plugin/onlyoffice/vendor/composer/autoload_namespaces.php b/plugin/onlyoffice/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000000..15a2ff3ad6 --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/symfony/polyfill-php80'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), + 'Onlyoffice\\DocsIntegrationSdk\\Util\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/util'), + 'Onlyoffice\\DocsIntegrationSdk\\Service\\Request\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/service/request'), + 'Onlyoffice\\DocsIntegrationSdk\\Service\\DocEditorConfig\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/service/doceditorconfig'), + 'Onlyoffice\\DocsIntegrationSdk\\Models\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/models'), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Settings\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/manager/settings'), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Security\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/manager/security'), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Formats\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/manager/formats'), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Document\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src/manager/document'), + 'Onlyoffice\\DocsIntegrationSdk\\' => array($vendorDir . '/onlyoffice/docs-integration-sdk/src'), + 'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'), + 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), +); diff --git a/plugin/onlyoffice/vendor/composer/autoload_real.php b/plugin/onlyoffice/vendor/composer/autoload_real.php new file mode 100644 index 0000000000..31d1c1a07e --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInite2447622f5a8ba1f88ff1d49032f1f2d::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/plugin/onlyoffice/vendor/composer/autoload_static.php b/plugin/onlyoffice/vendor/composer/autoload_static.php new file mode 100644 index 0000000000..f8e72703f6 --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/autoload_static.php @@ -0,0 +1,129 @@ + __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Symfony\\Polyfill\\Php80\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, + ), + 'P' => + array ( + 'PhpOption\\' => 10, + ), + 'O' => + array ( + 'Onlyoffice\\DocsIntegrationSdk\\Util\\' => 35, + 'Onlyoffice\\DocsIntegrationSdk\\Service\\Request\\' => 46, + 'Onlyoffice\\DocsIntegrationSdk\\Service\\DocEditorConfig\\' => 54, + 'Onlyoffice\\DocsIntegrationSdk\\Models\\' => 37, + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Settings\\' => 47, + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Security\\' => 47, + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Formats\\' => 46, + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Document\\' => 47, + 'Onlyoffice\\DocsIntegrationSdk\\' => 30, + ), + 'G' => + array ( + 'GrahamCampbell\\ResultType\\' => 26, + ), + 'D' => + array ( + 'Dotenv\\' => 7, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Symfony\\Polyfill\\Php80\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'PhpOption\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Util\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/util', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Service\\Request\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/service/request', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Service\\DocEditorConfig\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/service/doceditorconfig', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Models\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/models', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Settings\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/manager/settings', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Security\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/manager/security', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Formats\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/manager/formats', + ), + 'Onlyoffice\\DocsIntegrationSdk\\Manager\\Document\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src/manager/document', + ), + 'Onlyoffice\\DocsIntegrationSdk\\' => + array ( + 0 => __DIR__ . '/..' . '/onlyoffice/docs-integration-sdk/src', + ), + 'GrahamCampbell\\ResultType\\' => + array ( + 0 => __DIR__ . '/..' . '/graham-campbell/result-type/src', + ), + 'Dotenv\\' => + array ( + 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', + ), + ); + + public static $classMap = array ( + 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInite2447622f5a8ba1f88ff1d49032f1f2d::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInite2447622f5a8ba1f88ff1d49032f1f2d::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInite2447622f5a8ba1f88ff1d49032f1f2d::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/plugin/onlyoffice/vendor/composer/installed.php b/plugin/onlyoffice/vendor/composer/installed.php new file mode 100644 index 0000000000..38efd0db95 --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/installed.php @@ -0,0 +1,86 @@ + array( + 'name' => '__root__', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'e2dac8179b6ce15fe4dfb1df7703546297a02790', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'e2dac8179b6ce15fe4dfb1df7703546297a02790', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'graham-campbell/result-type' => array( + 'pretty_version' => 'v1.1.3', + 'version' => '1.1.3.0', + 'reference' => '3ba905c11371512af9d9bdd27d99b782216b6945', + 'type' => 'library', + 'install_path' => __DIR__ . '/../graham-campbell/result-type', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'onlyoffice/docs-integration-sdk' => array( + 'pretty_version' => 'v1.0.1', + 'version' => '1.0.1.0', + 'reference' => '6f63b25db1108c469ad0d94f786f0870f403c795', + 'type' => 'library', + 'install_path' => __DIR__ . '/../onlyoffice/docs-integration-sdk', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpoption/phpoption' => array( + 'pretty_version' => '1.9.3', + 'version' => '1.9.3.0', + 'reference' => 'e3fac8b24f56113f7cb96af14958c0dd16330f54', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpoption/phpoption', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-ctype' => array( + 'pretty_version' => 'v1.31.0', + 'version' => '1.31.0.0', + 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.31.0', + 'version' => '1.31.0.0', + 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php80' => array( + 'pretty_version' => 'v1.31.0', + 'version' => '1.31.0.0', + 'reference' => '60328e362d4c2c802a54fcbf04f9d3fb892b4cf8', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php80', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'vlucas/phpdotenv' => array( + 'pretty_version' => 'v5.6.1', + 'version' => '5.6.1.0', + 'reference' => 'a59a13791077fe3d44f90e7133eb68e7d22eaff2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../vlucas/phpdotenv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/plugin/onlyoffice/vendor/composer/platform_check.php b/plugin/onlyoffice/vendor/composer/platform_check.php new file mode 100644 index 0000000000..a8b98d5ceb --- /dev/null +++ b/plugin/onlyoffice/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70205)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Error.php b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Error.php new file mode 100644 index 0000000000..2c37c3e2b7 --- /dev/null +++ b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Error.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * + * @extends \GrahamCampbell\ResultType\Result + */ +final class Error extends Result +{ + /** + * @var E + */ + private $value; + + /** + * Internal constructor for an error value. + * + * @param E $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template F + * + * @param F $value + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + public function success() + { + return None::create(); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function map(callable $f) + { + return self::create($this->value); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function flatMap(callable $f) + { + /** @var \GrahamCampbell\ResultType\Result */ + return self::create($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + public function error() + { + return Some::create($this->value); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function mapError(callable $f) + { + return self::create($f($this->value)); + } +} diff --git a/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Result.php b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Result.php new file mode 100644 index 0000000000..8c67bcdd1c --- /dev/null +++ b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Result.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +/** + * @template T + * @template E + */ +abstract class Result +{ + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + abstract public function success(); + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function map(callable $f); + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function flatMap(callable $f); + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + abstract public function error(); + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function mapError(callable $f); +} diff --git a/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Success.php b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Success.php new file mode 100644 index 0000000000..27cd85eecb --- /dev/null +++ b/plugin/onlyoffice/vendor/graham-campbell/result-type/src/Success.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * + * @extends \GrahamCampbell\ResultType\Result + */ +final class Success extends Result +{ + /** + * @var T + */ + private $value; + + /** + * Internal constructor for a success value. + * + * @param T $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template S + * + * @param S $value + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + public function success() + { + return Some::create($this->value); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function map(callable $f) + { + return self::create($f($this->value)); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function flatMap(callable $f) + { + return $f($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + public function error() + { + return None::create(); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function mapError(callable $f) + { + return self::create($this->value); + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/.env.example b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/.env.example new file mode 100644 index 0000000000..30acf0b329 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/.env.example @@ -0,0 +1,35 @@ +# ENV +DOCS_INTEGRATION_SDK_PRODUCT_NAME=ONLYOFFICE + +# Document server +DOCS_INTEGRATION_SDK_DOCUMENT_SERVER_URL= +DOCS_INTEGRATION_SDK_DOCUMENT_SERVER_API_URL=/web-apps/apps/api/documents/api.js +DOCS_INTEGRATION_SDK_DOCUMENT_SERVER_API_PRELOADER_URL=/web-apps/apps/api/documents/cache-scripts.html +DOCS_INTEGRATION_SDK_DOCUMENT_SERVER_HEALTHCHECK_URL=/healthcheck + +# JWT +DOCS_INTEGRATION_SDK_JWT_HEADER=Authorization +DOCS_INTEGRATION_SDK_JWT_PREFIX="Bearer " +DOCS_INTEGRATION_SDK_JWT_KEY= +DOCS_INTEGRATION_SDK_JWT_LEEWAY=3 + +# Editing service +DOCS_INTEGRATION_SDK_EDITING_SERVICE_INSERT_IMAGE=bmp|gif|jpeg|jpg|png|tif|tiff +DOCS_INTEGRATION_SDK_EDITING_SERVICE_MAX_FILE_SIZE=104857600 +DOCS_INTEGRATION_SDK_EDITING_SERVICE_MOBILE_USER_AGENT="android|avantgo|playbook|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino" + +# Convert service +DOCS_INTEGRATION_SDK_CONVERT_SERVICE_URL=/ConvertService.ashx +DOCS_INTEGRATION_SDK_CONVERT_SERVICE_SYNC_SOCKET_TIMEOUT=60 +DOCS_INTEGRATION_SDK_CONVERT_SERVICE_MAX_FILE_SIZE=104857600 + +# Command service +DOCS_INTEGRATION_SDK_COMMAND_SERVICE_URL=/coauthoring/CommandService.ashx + +# Docbuilder service +DOCS_INTEGRATION_SDK_DOCBUILDER_SERVICE_URL=/docbuilder + +# HTTP +DOCS_INTEGRATION_SDK_HTTP_CONNECTION_TIMEOUT=10 +DOCS_INTEGRATION_SDK_HTTP_REQUEST_TIMEOUT=10 +DOCS_INTEGRATION_SDK_HTTP_IGNORE_SSL=false \ No newline at end of file diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/AUTHORS.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/AUTHORS.md new file mode 100644 index 0000000000..686d12b0be --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/AUTHORS.md @@ -0,0 +1,4 @@ +# Authors + +* Ascensio System SIA: + diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/CHANGELOG.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/CHANGELOG.md new file mode 100644 index 0000000000..119594e0a7 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/CHANGELOG.md @@ -0,0 +1,26 @@ +# Change Log + +## 1.0.1 +- minor fixes +- fix settings check + +## 1.0.0 +- common interfaces +- list supported formats +- empty file templates +- demo server settings + +## 0.0.5 +- default empty templates + +## 0.0.4 +- minor fixes + +## 0.0.3 +- support pdf form + +## 0.0.2 +- remove git submodules + +## 0.0.1 +- Initial release diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/README.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/README.md new file mode 100644 index 0000000000..5963d7887b --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/README.md @@ -0,0 +1,162 @@ +# ONLYOFFICE Docs Integration PHP SDK + +ONLYOFFICE Docs Integration PHP SDK provides common interfaces and default implementations for integrating ONLYOFFICE Document Server into your own website or application on PHP. + +## Prerequisites +* **PHP**: version 7.4.0 and higher + +### Managers + +| Manager | Description | Default implementation | +| ----------------------------- | ----------------------------------------------------------------------- | -------------------------------- | +| DocumentManagerInterface | This manager is used for working with files, and string data associated with documents. | DocumentManager (abstract) | +| FormatsManagerInterface | This manager is used for working with document formats. | FormatsManager | +| JwtManagerInterface | This manager is used for generating and verifying authorization tokens. | JwtManager (abstract) | +| SettingsManagerInterface | This manager is used to manage integration application settings. | SettingsManager (abstract) | + +### Services + +| Service | Description | Default implementation | +| ----------------------------- | ----------------------------------------------------------------------- | -------------------------------- | +| CallbackServiceInterface | This service is used for processing the response of the Document Server. | CallbackService (abstract) | +| DocEditorConfigServiceInterface | This configuration generation service is used for opening the document editor. | DocEditorConfigService | +| RequestServiceInterface | This service is used to make requests to the ONLYOFFICE Document Server. | RequestService (abstract) | + +## Usage +1. Implement the methods of the abstract **DocumentManager** class: + ```php + public function getDocumentKey(string $fileId, bool $embedded = false) + { + return self::generateRevisionId($fileId); + } + + public function getDocumentName(string $fileId) + { + return "sample.docx"; + } + + public static function getLangMapping() + { + return null; + } + + public static function getFileUrl(string $fileId) + { + return "https://example-server.example/fileId/download/"; + } + + public static function getCallbackUrl(string $fileId) + { + return "https://example-server.example/callback"; + } + + public static function getGobackUrl(string $fileId) + { + return "https://example-server.example/filelist"; + } + + public static function getCreateUrl(string $fileId) + { + return "https://example-server.example/fileId"; + } + ``` +2. Implement the methods of the abstract **JwtManager** class (use third-party libraries for JWT encoding and decoding, whichever is convenient for you): + ```php + public function encode($token, $key, $algorithm = "HS256") + { + return "SOME.JWT.STRING"; + } + + public function decode($token, $key, $algorithm = "HS256") + { + return json_encode([]); + } + ``` +3. Implement the methods of the abstract **SettingsManager** class: + ```php + public function getServerUrl() + { + return "https://example-server.example/"; + } + + public function getSetting($settingName) + { + return null; + } + + public function setSetting($settingName, $value, $createSetting = false) + { + // if ($createSetting === true) { + // $this->yourMethodForCreateNewSetting($settingName, $value); + // return; + // } + // $this->yourMethodForSetNewValueForSetting($settingName, $value); + } + ``` +4. Implement the methods of the abstract **SettingsManager** class: + ```php + public function processTrackerStatusEditing() + { + // $someTrackResult["error"] = 0; + // return json_encode($someTrackResult); + } + + public function processTrackerStatusMustsave() + { + // $someTrackResult["error"] = 0; + // return json_encode($someTrackResult); + } + + public function processTrackerStatusCorrupted() + { + // $someTrackResult["error"] = 0; + // return json_encode($someTrackResult); + } + + public function processTrackerStatusClosed() + { + // $someTrackResult["error"] = 0; + // return json_encode($someTrackResult); + } + + public function processTrackerStatusForcesave() + { + // $someTrackResult["error"] = 0; + // return json_encode($someTrackResult); + } + ``` +5. Create a class that implements the **HttpClientInterface** interface (use PHP Client URL Library or any other third-party library to make requests): + ```php + class YourHttpClient implements HttpClientInterface + { + public function __construct() + { + $this->responseStatusCode = null; + $this->responseBody = null; + } + + public function getStatusCode() + { + return $this->responseStatusCode; + } + + public function getBody() + { + return $this->responseBody; + } + + public function request($url, $method = 'GET', $opts = []) + { + $this->responseStatusCode = 200; + $this->responseBody = "{\"status\": \"OK\"}"; + } + } + ``` +6. Implement the method of the abstract **RequestService** class: + ```php + public function getFileUrlForConvert() + { + return "https://example-server.example/file-url-for-check-convert"; + } + ``` +7. Use DocEditorConfigService to create a config model for the editors in your own controllers. \ No newline at end of file diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/phpcs.xml b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/phpcs.xml new file mode 100644 index 0000000000..2c075b0fed --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/phpcs.xml @@ -0,0 +1,18 @@ + + + A custom coding standard + + + + + + + + + + 0 + + + 0 + + \ No newline at end of file diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/AUTHORS.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/AUTHORS.md new file mode 100644 index 0000000000..686d12b0be --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/AUTHORS.md @@ -0,0 +1,4 @@ +# Authors + +* Ascensio System SIA: + diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/CHANGELOG.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/CHANGELOG.md new file mode 100644 index 0000000000..b8bf1614b2 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/CHANGELOG.md @@ -0,0 +1,15 @@ +# Change Log + +## 2.0.0 +- pdf documentType for djvu, docxf, oform, oxps, pdf, xps +- fb2 additional mime + +## 1.1.0 +- filling pdf +- conversion formats for txt, csv +- formats for auto conversion + +## 1.0.0 +- formats for viewing, editing and lossy editing +- formats for conversions +- mime-types of formats diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/README.md b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/README.md new file mode 100644 index 0000000000..d41770f99b --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/resources/assets/document-formats/README.md @@ -0,0 +1,52 @@ +## Overview + +This repository contains the list of file formats (electronic documents, forms, spreadsheets, presentations) supported by ONLYOFFICE editors and describes the properties of each file format type. + +The repository is used in: +* [Document Server integration example](https://github.com/ONLYOFFICE/document-server-integration) +* [ONLYOFFICE Docs Integration Java SDK](https://github.com/ONLYOFFICE/docs-integration-sdk-java) +* [ONLYOFFICE Docs Integration PHP SDK](https://github.com/ONLYOFFICE/docs-integration-sdk-php) +* [Nextcloud ONLYOFFICE integration app](https://github.com/ONLYOFFICE/onlyoffice-nextcloud) +* [Nuxeo ONLYOFFICE integration plugin](https://github.com/ONLYOFFICE/onlyoffice-nuxeo) +* [ONLYOFFICE integration app for Confluence Cloud](https://github.com/ONLYOFFICE/onlyoffice-confluence-cloud) +* [ownCloud ONLYOFFICE integration app](https://github.com/ONLYOFFICE/onlyoffice-owncloud) +* [Redmine ONLYOFFICE Integration Plugin](https://github.com/ONLYOFFICE/onlyoffice-redmine) +* [WordPress ONLYOFFICE integration plugin](https://github.com/ONLYOFFICE/onlyoffice-wordpress) + +## Project info + +ONLYOFFICE Docs (Document Server): [github.com/ONLYOFFICE/DocumentServer](https://github.com/ONLYOFFICE/DocumentServer) + +Official website: [www.onlyoffice.com](https://www.onlyoffice.com/) + +## Supported formats + +**For viewing:** +* **WORD**: DOC, DOCM, DOCX, DOT, DOTM, DOTX, EPUB, FB2, FODT, HTM, HTML, MHT, MHTML, ODT, OTT, RTF, STW, SXW, TXT, WPS, WPT, XML +* **CELL**: CSV, ET, ETT, FODS, ODS, OTS, SXC, XLS, XLSB, XLSM, XLSX, XLT, XLTM, XLTX +* **SLIDE**: DPS, DPT, FODP, ODP, OTP, POT, POTM, POTX, PPS, PPSM, PPSX, PPT, PPTM, PPTX, SXI +* **PDF**: DJVU, DOCXF, OFORM, OXPS, PDF, XPS + +**For editing:** + +* **WORD**: DOCM, DOCX, DOTM, DOTX +* **CELL**: XLSM, XLSX, XLTM, XLTX +* **SLIDE**: POTM, POTX, PPSM, PPSX, PPTM, PPTX +* **PDF**: PDF + +**For editing with possible loss of information:** + +* **WORD**: EPUB, FB2, HTML, ODT, OTT, RTF, TXT +* **CELL**: CSV, ODS, OTS +* **SLIDE**: ODP, OTP + +**For filling:** + +* **PDF**: PDF + +**For converting to Office Open XML formats:** + +* **WORD:** DOC, DOCM, DOT, DOTM, DOTX, EPUB, FB2, FODT, HTM, HTML, MHT, MHTML, ODT, OTT, RTF, STW, SXW, WPS, WPT, XML +* **CELL:** ET, ETT, FODS, ODS, OTS, SXC, XLS, XLSB, XLSM, XLT, XLTM, XLTX +* **SLIDE:** DPS, DPT, FODP, ODP, OTP, POT, POTM, POTX, PPS, PPSM, PPSX, PPT, PPTM, SXI +* **PDF**: DOCXF, OXPS, PDF, XPS diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManager.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManager.php new file mode 100644 index 0000000000..29e4424660 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManager.php @@ -0,0 +1,288 @@ +lang = $systemLangCode; + $this->lang = $systemLangCode; + if (empty($formats)) { + $formats = new FormatsManager(true); + } + if (isset(static::getLangMapping()[$systemLangCode]) && !empty(static::getLangMapping()[$systemLangCode])) { + $locale = static::getLangMapping()[$systemLangCode]; + } else { + $locale = "default"; + } + $this->formats = $formats; + $this->settingsManager = $settingsManager; + } + + public function getEmptyTemplate($fileExt) + { + $filePath = dirname(dirname(dirname(__DIR__))) + .DIRECTORY_SEPARATOR. + "resources". + DIRECTORY_SEPARATOR. + "assets". + DIRECTORY_SEPARATOR. + "document-templates". + DIRECTORY_SEPARATOR. + $this->locale. + DIRECTORY_SEPARATOR. + "new.". + $fileExt; + if (!file_exists($filePath)) { + throw new \Exception(CommonError::message(CommonError::FILE_TEMPLATE_IS_NOT_EXISTS)); + } + return $filePath; + } + + /** + * Get temporary file + * + * @return array + */ + public function getTempFile() + { + $fileUrl = null; + $templatePath = $this->getEmptyTemplate("docx"); + $fileUrl = $this->getFileUrl("new.docx"); + + return [ + "fileUrl" => $fileUrl, + "filePath" => $templatePath + ]; + } + + public function getFormatInfo(string $extension, string $option = null) + { + $search = null; + $formats = $this->formats->getFormatsList(); + if (!array_key_exists($extension, $formats)) { + foreach ($formats as $format) { + if ($format->getName() === $extension) { + $search = $format; + break; + } + } + if ($search === null) { + return null; + } + } else { + $search = $formats[$extension]; + } + + switch ($option) { + case self::FORMATINFO_TYPE: + return $search->getType(); + case self::FORMATINFO_ACTIONS: + return $search->getActions(); + case self::FORMATINFO_CONVERT: + return $search->getConvert(); + case self::FORMATINFO_MIMES: + return $search->getMimes(); + case self::FORMATINFO_MIME: + return $search->getMimes()[0]; + default: + return $search; + } + } + + /** + * Return file type by extension + */ + public function getDocType(string $extension) + { + return $this->getFormatInfo($extension, self::FORMATINFO_TYPE); + } + + /** + * Return actions for file by extension + */ + public function getDocActions(string $extension) + { + return $this->getFormatInfo($extension, self::FORMATINFO_ACTIONS); + } + + /** + * Return convert extensions for file by current extension + */ + public function getDocConvert(string $extension) + { + return $this->getFormatInfo($extension, self::FORMATINFO_CONVERT); + } + + /** + * Return array of all mime types for file by extension + */ + public function getDocMimes(string $extension) + { + return $this->getFormatInfo($extension, self::FORMATINFO_MIMES); + } + + /** + * Return mime type of the file by extension + */ + public function getDocMimeType(string $extension) + { + return $this->getFormatInfo($extension, self::FORMATINFO_MIME); + } + + /** + * Return file path info + */ + public function getPathInfo(string $filePath, string $option = null) + { + $result = ["dirname" => "", "basename" => "", "extension" => "", "filename" => ""]; + $pathInfo = []; + if (preg_match("#^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^.\\\\/]+?)|))[\\\\/.]*$#m", $filePath, $pathInfo)) { + if (array_key_exists(1, $pathInfo)) { + $result["dirname"] = $pathInfo[1]; + } + if (array_key_exists(2, $pathInfo)) { + $result["basename"] = $pathInfo[2]; + } + if (array_key_exists(5, $pathInfo)) { + $result["extension"] = mb_strtolower($pathInfo[5]); + } + if (array_key_exists(3, $pathInfo)) { + $result["filename"] = $pathInfo[3]; + } + } + + switch ($option) { + case self::PATHINFO_DIRNAME: + return $result["dirname"]; + case self::PATHINFO_BASENAME: + return $result["basename"]; + case self::PATHINFO_EXTENSION: + return $result["extension"]; + case self::PATHINFO_FILENAME: + return $result["filename"]; + default: + return $result; + } + } + + public function getDirName(string $filePath) + { + return $this->getPathInfo($filePath, self::PATHINFO_DIRNAME); + } + + public function getBaseName(string $filePath) + { + return $this->getPathInfo($filePath, self::PATHINFO_BASENAME); + } + + public function getExt(string $filePath) + { + return $this->getPathInfo($filePath, self::PATHINFO_EXTENSION); + } + + public function getFileName(string $filePath) + { + return $this->getPathInfo($filePath, self::PATHINFO_FILENAME); + } + + public function isDocumentViewable(string $filePath) + { + return $this->getFormatInfo($this->getExt($filePath))->isViewable(); + } + + public function isDocumentEditable(string $filePath) + { + return $this->getFormatInfo($this->getExt($filePath))->isEditable(); + } + + public function isDocumentConvertable(string $filePath) + { + return $this->getFormatInfo($this->getExt($filePath))->isAutoConvertable(); + } + + public function isDocumentFillable(string $filePath) + { + return $this->getFormatInfo($this->getExt($filePath))->isFillable(); + } + + public function isDocumentReadOnly(string $filePath = "") + { + return false; + } + + public function getDocumentAccessRights(string $filePath = "") + { + return true; + } + + /** + * Translation key to a supported form + */ + public static function generateRevisionId(string $expectedKey) + { + if (strlen($expectedKey) > 20) { + $expectedKey = crc32($expectedKey); + } + $key = preg_replace("[^0-9-.a-zA-Z_=]", "_", $expectedKey); + $key = substr($key, 0, min(array(strlen($key), 20))); + return $key; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManagerInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManagerInterface.php new file mode 100644 index 0000000000..85cbcbb668 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Document/DocumentManagerInterface.php @@ -0,0 +1,214 @@ +formatsList = self::buildDefaultFormatsArray($formats); + } else { + $this->formatsList = self::buildNamedFormatsArray($formats); + } + } + + protected static function buildDefaultFormatsArray(array $formats) + { + $formatsList = []; + foreach ($formats as $format) { + array_push($formatsList, new Format( + $format->name, + $format->type, + $format->actions, + $format->convert, + $format->mime + )); + } + return $formatsList; + } + + protected static function buildNamedFormatsArray(array $formats) + { + $formatsList = []; + foreach ($formats as $format) { + $currentFormat = new Format( + $format->name, + $format->type, + $format->actions, + $format->convert, + $format->mime + ); + $formatsList[$currentFormat->getName()] = $currentFormat; + } + return $formatsList; + } + + private static function getFormats() + { + $formats = file_get_contents(dirname(dirname(dirname(__DIR__))). + DIRECTORY_SEPARATOR. + "resources". + DIRECTORY_SEPARATOR. + "assets". + DIRECTORY_SEPARATOR. + "document-formats". + DIRECTORY_SEPARATOR. + "onlyoffice-docs-formats.json"); + if (!empty($formats)) { + $formats = json_decode($formats); + if (!empty($formats)) { + return $formats; + } + throw new \Exception(CommonError::message(CommonError::EMPTY_FORMATS_ASSET)); + } + throw new \Exception(CommonError::message(CommonError::EMPTY_FORMATS_ASSET)); + } + + public function getFormatsList() + { + return $this->formatsList; + } + + public function getViewableList() + { + $viewableList = []; + foreach ($this->formatsList as $format) { + if ($format->isViewable()) { + array_push($viewableList, $format); + } + } + return $viewableList; + } + + public function getEditableList() + { + $editableList = []; + foreach ($this->formatsList as $format) { + if ($format->isEditable()) { + array_push($editableList, $format); + } + } + return $editableList; + } + + public function getConvertableList() + { + $convertableList = []; + foreach ($this->formatsList as $format) { + if ($format->isAutoConvertable()) { + array_push($convertableList, $format); + } + } + return $convertableList; + } + + public function getFillableList() + { + $fillableList = []; + foreach ($this->formatsList as $format) { + if ($format->isFillable()) { + array_push($fillableList, $format); + } + } + return $fillableList; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Formats/FormatsManagerInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Formats/FormatsManagerInterface.php new file mode 100644 index 0000000000..bc715c6cb2 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Formats/FormatsManagerInterface.php @@ -0,0 +1,66 @@ +settingsManager = $settingsManager; + } + + abstract public function encode($payload, $key, $algorithm = "HS256"); + abstract public function decode($token, $key, $algorithm = "HS256"); + + /** + * Check if a secret key to generate token exists or not. + * + * @return bool + */ + public function isJwtEnabled() + { + return !empty($this->settingsManager->getJwtKey()); + } + + /** + * Encode a payload object into a token using a secret key + * + * @param array $payload + * + * @return string + */ + public function jwtEncode($payload, $key = null) + { + if (empty($key)) { + $key = $this->settingsManager->getJwtKey(); + } + return $this->encode($payload, $key); + } + + /** + * Decode a token into a payload object using a secret key + * + * @param string $token + * + * @return string + */ + public function jwtDecode($token) + { + try { + $payload = $this->decode($token, $this->settingsManager->getJwtKey()); + } catch (\UnexpectedValueException $e) { + $payload = ""; + } + return $payload; + } + + /** + * Create an object from the token + * + * @param string $token - token + * + * @return array + */ + public function readHash($token, $securityKey) + { + $result = null; + $error = null; + if ($token === null) { + return [$result, "Token is empty"]; + } + try { + $result = $this->decode($token, $securityKey); + } catch (\UnexpectedValueException $e) { + $error = $e->getMessage(); + } + return [$result, $error]; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Security/JwtManagerInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Security/JwtManagerInterface.php new file mode 100644 index 0000000000..ee1aaa2b40 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Security/JwtManagerInterface.php @@ -0,0 +1,59 @@ +getDemoData()["enabled"] === true; + } + + /** + * Get demo data + * + * @return array + */ + public function getDemoData() + { + $data = $this->getSetting($this->useDemoName); + + if (empty($data)) { + $data = [ + "available" => true, + "enabled" => false + ]; + $this->setSetting($this->useDemoName, json_encode($data), true); + return $data; + } + $data = json_decode($data, true); + + if (isset($data['start'])) { + $overdue = $data["start"]; + $overdue += 24 * 60 * 60 *$this->getDemoParams()["TRIAL"]; + if ($overdue > time()) { + $data["available"] = true; + $data["enabled"] = $data["enabled"] === true; + } else { + $data["available"] = false; + $data["enabled"] = false; + $this->setSetting($this->useDemoName, json_encode($data)); + } + } + return $data; + } + + /** + * Switch on demo server + * + * @param bool $value - select demo + * + * @return bool + */ + public function selectDemo($value) + { + $data = $this->getDemoData(); + + if ($value === true && !$data["available"]) { + return false; + } + + $data["enabled"] = $value === true; + + if (!isset($data["start"])) { + $data["start"] = time(); + } + $this->setSetting($this->useDemoName, json_encode($data)); + return true; + } + + private function getBaseSettingValue(string $settingKey, string $envKey, string $demoKey = "") + { + if ($this->useDemo() && !empty($demoKey)) { + return $demoKey; + } + + $settingValue = $this->getSetting($settingKey); + if (empty($settingValue) && !empty($_ENV[$envKey])) { + $settingValue = $_ENV[$envKey]; + } + + return $settingValue; + } + + /** + * Get the document service address from the application configuration + * + * @return string + */ + public function getDocumentServerUrl() + { + $url = $this->getBaseSettingValue( + $this->documentServerUrl, + EnvUtil::envKey("DOCUMENT_SERVER_URL"), + self::DEMO_URL + ); + $url = !empty($url) ? $this->normalizeUrl($url) : ""; + return (string)$url; + } + + public function getDocumentServerInternalUrl() + { + if ($this->useDemo()) { + return $this->getDocumentServerUrl(); + } + + $url = $this->getSetting($this->documentServerInternalUrl); + if (empty($url)) { + return $this->getDocumentServerUrl(); + } + + return (string)$url; + } + + public function getStorageUrl() + { + $url = $this->getSetting($this->storageUrl); + return !empty($url) ? $url : ""; + } + + /** + * Replace domain in document server url with internal address from configuration + * + * @param string $url - document server url + * + * @return string + */ + public function replaceDocumentServerUrlToInternal($url) + { + $documentServerUrl = $this->getDocumentServerInternalUrl(); + if (!empty($documentServerUrl)) { + $from = $this->getDocumentServerUrl(); + + if (!preg_match("/^https?:\/\//i", $from)) { + $parsedUrl = parse_url($url); + $from = $parsedUrl["scheme"]. + "://". + $parsedUrl["host"]. + (array_key_exists("port", $parsedUrl) ? (":" . $parsedUrl["port"]) : "") . $from; + } + + $url = $from !== $documentServerUrl ?? str_replace($from, $documentServerUrl, $url); + } + return $url; + } + + private function getDocumentServerCustomUrl($settingKey, $useInternalUrl = false) + { + if (!$useInternalUrl) { + $serverUrl = $this->getDocumentServerUrl(); + } else { + $serverUrl = $this->getDocumentServerInternalUrl(); + } + $customUrl = ""; + + if (!empty($serverUrl) && !empty($_ENV[EnvUtil::envKey($settingKey)])) { + $customUrl = $_ENV[EnvUtil::envKey($settingKey)]; + $customUrl = $this->normalizeUrl($serverUrl .= $customUrl); + } + + return (string)$customUrl; + } + + /** + * Get the document server API URL + * + * @return string + */ + public function getDocumentServerApiUrl($useInternalUrl = false) + { + return $this->getDocumentServerCustomUrl("DOCUMENT_SERVER_API_URL", $useInternalUrl) ?: + $this->normalizeUrl($this->getDocumentServerUrl()."/web-apps/apps/api/documents/api.js"); + } + + /** + * Get the document server preloader url + * + * @return string + */ + public function getDocumentServerPreloaderUrl($useInternalUrl = false) + { + return $this->getDocumentServerCustomUrl("DOCUMENT_SERVER_API_PRELOADER_URL", $useInternalUrl) ?: + $this->normalizeUrl($this->getDocumentServerUrl()."/web-apps/apps/api/documents/cache-scripts.html"); + } + + /** + * Get the document server healthcheck url + * + * @return string + */ + public function getDocumentServerHealthcheckUrl($useInternalUrl = false) + { + return $this->getDocumentServerCustomUrl("DOCUMENT_SERVER_HEALTHCHECK_URL", $useInternalUrl) ?: + $this->normalizeUrl($this->getDocumentServerUrl()."/healthcheck"); + } + + /** + * Get the convert service url + * + * @return string + */ + public function getConvertServiceUrl($useInternalUrl = false) + { + return $this->getDocumentServerCustomUrl("CONVERT_SERVICE_URL", $useInternalUrl) ?: + $this->normalizeUrl($this->getDocumentServerUrl()."/ConvertService.ashx"); + } + + /** + * Get the command service url + * + * @return string + */ + public function getCommandServiceUrl($useInternalUrl = false) + { + return $this->getDocumentServerCustomUrl("COMMAND_SERVICE_URL", $useInternalUrl) ?: + $this->normalizeUrl($this->getDocumentServerUrl()."/coauthoring/CommandService.ashx"); + } + + /** + * Get the JWT Header + * + * @return string + */ + public function getJwtHeader() + { + $jwtHeader = $this->getBaseSettingValue($this->jwtHeader, EnvUtil::envKey("JWT_HEADER"), self::DEMO_JWT_HEADER); + return (string)$jwtHeader; + } + + /** + * Get the JWT secret + * + * @return string + */ + public function getJwtKey() + { + $jwtKey = $this->getBaseSettingValue($this->jwtKey, EnvUtil::envKey("JWT_KEY"), self::DEMO_JWT_KEY); + return (string)$jwtKey; + } + + /** + * Get the JWT prefix + * + * @return string + */ + public function getJwtPrefix() + { + $jwtPrefix = $this->getBaseSettingValue($this->jwtPrefix, EnvUtil::envKey("JWT_PREFIX"), self::DEMO_JWT_PREFIX); + return (string)$jwtPrefix; + } + + /** + * Get the JWT leeway + * + * @return string + */ + public function getJwtLeeway() + { + $jwtLeeway = $this->getBaseSettingValue($this->jwtLeeway, EnvUtil::envKey("JWT_LEEWAY")); + return (string)$jwtLeeway; + } + + /** + * Get the ignore SSL value + * + * @return bool + */ + public function isIgnoreSSL() + { + if (!$this->useDemo()) { + return boolval($this->getBaseSettingValue($this->httpIgnoreSSL, EnvUtil::envKey("HTTP_IGNORE_SSL"))) + === true; + } + + return false; + } + + /** + * Get demo params + * + * @return array + */ + public function getDemoParams() + { + return [ + "ADDR" => self::DEMO_URL, + "HEADER" => self::DEMO_JWT_HEADER, + "SECRET" => self::DEMO_JWT_KEY, + "PREFIX" => self::DEMO_JWT_PREFIX, + "TRIAL" => self::DEMO_TRIAL_PERIOD + ]; + } + + /** + * Add backslash to url if it's needed + * + * @return string + */ + public function processUrl($url) + { + if ($url !== null && $url !== "/") { + $url = rtrim($url, "/"); + if (strlen($url) > 0) { + $url = $url . "/"; + } + } + return $url; + } + + public function normalizeUrl($url) + { + $url = preg_replace('/([^:])(\/{2,})/', '$1/', $url); + $url = filter_var($url, FILTER_SANITIZE_URL); + return $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Settings/SettingsManagerInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Settings/SettingsManagerInterface.php new file mode 100644 index 0000000000..97a266ea5d --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Manager/Settings/SettingsManagerInterface.php @@ -0,0 +1,150 @@ +request = $request; + $this->label = $label; + } + + /** + * Get the value of request + */ + public function getRequest() + { + return $this->request; + } + + /** + * Set the value of request + */ + public function setRequest($request) + { + $this->request = $request; + } + + /** + * Get the value of label + */ + public function getLabel() + { + return $this->label; + } + + /** + * Set the value of label + */ + public function setLabel($label) + { + $this->label = $label; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Callback.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Callback.php new file mode 100644 index 0000000000..409a5311cc --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Callback.php @@ -0,0 +1,223 @@ +actions = $actions; + $this->changesurl = $changesurl; + $this->fileType = $fileType; + $this->forceSaveType = $forceSaveType !== null ? $forceSaveType : new CallbackForceSaveType; + $this->history = $history !== null ? $history : new History; + $this->key = $key; + $this->status = $status !== null ? $status : new CallbackDocStatus; + $this->url = $url; + $this->users = $users; + $this->token = $token; + } + + /** + * Get the value of actions + */ + public function getActions() + { + return $this->actions; + } + + /** + * Set the value of actions + */ + public function setActions($actions) + { + $this->actions = $actions; + } + + /** + * Get the value of changesurl + */ + public function getChangesurl() + { + return $this->changesurl; + } + + /** + * Set the value of changesurl + */ + public function setChangesurl($changesurl) + { + $this->changesurl = $changesurl; + } + + /** + * Get the value of fileType + */ + public function getFileType() + { + return $this->fileType; + } + + /** + * Set the value of fileType + */ + public function setFileType($fileType) + { + $this->fileType = $fileType; + } + + /** + * Get the value of forceSaveType + */ + public function getForceSaveType() + { + return $this->forceSaveType; + } + + /** + * Set the value of forceSaveType + */ + public function setForceSaveType($forceSaveType) + { + $this->forceSaveType = $forceSaveType; + } + + /** + * Get the value of history + */ + public function getHistory() + { + return $this->history; + } + + /** + * Set the value of history + */ + public function setHistory($history) + { + $this->history = $history; + } + + /** + * Get the value of key + */ + public function getKey() + { + return $this->key; + } + + /** + * Set the value of key + */ + public function setKey($key) + { + $this->key = $key; + } + + /** + * Get the value of status + */ + public function getStatus() + { + return $this->status; + } + + /** + * Set the value of status + */ + public function setStatus($status) + { + $this->status = $status; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } + + /** + * Get the value of users + */ + public function getUsers() + { + return $this->users; + } + + /** + * Set the value of users + */ + public function setUsers($users) + { + $this->users = $users; + } + + /** + * Get the value of token + */ + public function getToken() + { + return $this->token; + } + + /** + * Set the value of token + */ + public function setToken($token) + { + $this->token = $token; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackAction.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackAction.php new file mode 100644 index 0000000000..680dd29fd1 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackAction.php @@ -0,0 +1,66 @@ +type = $type !== null ? $type : new CallbackActionType; + $this->userId = $userId; + } + + /** + * Get the value of type + */ + public function getType() + { + return $this->type; + } + + /** + * Set the value of type + */ + public function setType($type) + { + $this->type = $type; + } + + /** + * Get the value of userId + */ + public function getUserId() + { + return $this->userId; + } + + /** + * Set the value of userId + */ + public function setUserId($userId) + { + $this->userId = $userId; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackActionType.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackActionType.php new file mode 100644 index 0000000000..77a8aa5979 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackActionType.php @@ -0,0 +1,38 @@ +value = $type; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackDocStatus.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackDocStatus.php new file mode 100644 index 0000000000..85e6980921 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackDocStatus.php @@ -0,0 +1,41 @@ +value= $status; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackForceSaveType.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackForceSaveType.php new file mode 100644 index 0000000000..c1e1fb65b6 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CallbackForceSaveType.php @@ -0,0 +1,38 @@ +value = $type; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Changes.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Changes.php new file mode 100644 index 0000000000..2617cd7cb4 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Changes.php @@ -0,0 +1,66 @@ +created = $created; + $this->user = $histuserory !== null ? $user : new User; + } + + /** + * Get the value of created + */ + public function getCreated() + { + return $this->created; + } + + /** + * Set the value of created + */ + public function setCreated($created) + { + $this->created = $created; + } + + /** + * Get the value of user + */ + public function getUser() + { + return $this->user; + } + + /** + * Set the value of user + */ + public function setUser($user) + { + $this->user = $user; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditing.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditing.php new file mode 100644 index 0000000000..538b131f8f --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditing.php @@ -0,0 +1,67 @@ +mode = $mode !== null ? $mode : new CoEditingMode; + $this->change = $change; + } + + + /** + * Get the value of mode + */ + public function getMode() + { + return $this->mode; + } + + /** + * Set the value of mode + */ + public function setMode($mode) + { + $this->mode = $mode; + } + + /** + * Get the value of change + */ + public function getChange() + { + return $this->change; + } + + /** + * Set the value of change + */ + public function setChange($change) + { + $this->change = $change; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditingMode.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditingMode.php new file mode 100644 index 0000000000..abb5d4da52 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CoEditingMode.php @@ -0,0 +1,37 @@ +value = $mode !== null ? $mode : self::FAST; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CommentGroups.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CommentGroups.php new file mode 100644 index 0000000000..7dcf3fb7f1 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/CommentGroups.php @@ -0,0 +1,83 @@ +edit = $edit; + $this->remove = $remove; + $this->view = $view; + } + + /** + * Get the value of edit + */ + public function getEdit() + { + return $this->edit; + } + + /** + * Set the value of edit + */ + public function setEdit($edit) + { + $this->edit = $edit; + } + + /** + * Get the value of remove + */ + public function getRemove() + { + return $this->remove; + } + + /** + * Set the value of remove + */ + public function setRemove($remove) + { + $this->remove = $remove; + } + + /** + * Get the value of view + */ + public function getView() + { + return $this->view; + } + + /** + * Set the value of view + */ + public function setView($view) + { + $this->view = $view; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Config.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Config.php new file mode 100644 index 0000000000..c7c4c471cd --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Config.php @@ -0,0 +1,168 @@ +documentType = $documentType; + $this->height = $height; + $this->width = $width; + $this->token = $token; + $this->type = $type; + $this->editorConfig = $editorConfig; + $this->document = $document; + } + /** + * Get the value of documentType + */ + public function getDocumentType() + { + return $this->documentType; + } + + /** + * Set the value of documentType + */ + public function setDocumentType($documentType) + { + $this->documentType = $documentType; + } + + /** + * Get the value of height + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set the value of height + */ + public function setHeight($height) + { + $this->height = $height; + } + + /** + * Get the value of width + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set the value of width + + */ + public function setWidth($width) + { + $this->width = $width; + } + + /** + * Get the value of token + */ + public function getToken() + { + return $this->token; + } + + /** + * Set the value of token + */ + public function setToken($token) + { + $this->token = $token; + } + + /** + * Get the value of type + */ + public function getType() + { + return $this->type; + } + + /** + * Set the value of type + */ + public function setType($type) + { + $this->type = $type; + } + + /** + * Get the value of editorConfig + */ + public function getEditorConfig() + { + return $this->editorConfig; + } + + /** + * Set the value of editorConfig + */ + public function setEditorConfig($editorConfig) + { + $this->editorConfig = $editorConfig; + } + + /** + * Get the value of document + */ + public function getDocument() + { + return $this->document; + } + + /** + * Set the value of document + */ + public function setDocument($document) + { + $this->document = $document; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequest.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequest.php new file mode 100644 index 0000000000..75baa83be0 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequest.php @@ -0,0 +1,258 @@ +async = $async; + $this->codePage = $codePage; + $this->delimiter = $delimiter; + $this->filetype = $filetype; + $this->key = $key; + $this->outputtype = $outputtype; + $this->password = $password; + $this->region = $region; + $this->thumbnail = $thumbnail !== null ? $thumbnail : new ConvertRequestThumbnail; + $this->title = $title; + $this->token = $token; + $this->url = $url; + } + + /** + * Get the value of async + */ + public function getAsync() + { + return $this->async; + } + + /** + * Set the value of async + */ + public function setAsync($async) + { + $this->async = $async; + } + + /** + * Get the value of codePage + */ + public function getCodePage() + { + return $this->codePage; + } + + /** + * Set the value of codePage + */ + public function setCodePage($codePage) + { + $this->codePage = $codePage; + } + + /** + * Get the value of delimiter + */ + public function getDelimiter() + { + return $this->delimiter; + } + + /** + * Set the value of delimiter + */ + public function setDelimiter($delimiter) + { + $this->delimiter = $delimiter; + } + + /** + * Get the value of filetype + */ + public function getFiletype() + { + return $this->filetype; + } + + /** + * Set the value of filetype + */ + public function setFiletype($filetype) + { + $this->filetype = $filetype; + } + + /** + * Get the value of key + */ + public function getKey() + { + return $this->key; + } + + /** + * Set the value of key + */ + public function setKey($key) + { + $this->key = $key; + } + + /** + * Get the value of outputtype + */ + public function getOutputtype() + { + return $this->outputtype; + } + + /** + * Set the value of outputtype + */ + public function setOutputtype($outputtype) + { + $this->outputtype = $outputtype; + } + + /** + * Get the value of password + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set the value of password + */ + public function setPassword($password) + { + $this->password = $password; + } + + /** + * Get the value of region + */ + public function getRegion() + { + return $this->region; + } + + /** + * Set the value of region + */ + public function setRegion($region) + { + $this->region = $region; + } + + /** + * Get the value of thumbnail + */ + public function getThumbnail() + { + return $this->thumbnail; + } + + /** + * Set the value of thumbnail + */ + public function setThumbnail($thumbnail) + { + $this->thumbnail = $thumbnail; + } + + /** + * Get the value of title + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set the value of title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get the value of token + */ + public function getToken() + { + return $this->token; + } + + /** + * Set the value of token + */ + public function setToken($token) + { + $this->token = $token; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequestThumbnail.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequestThumbnail.php new file mode 100644 index 0000000000..ba92a029b9 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ConvertRequestThumbnail.php @@ -0,0 +1,103 @@ +aspect = $aspect; + $this->first = $first; + $this->height = $height; + $this->width = $width; + } + + + /** + * Get the value of aspect + */ + public function getAspect() + { + return $this->aspect; + } + + /** + * Set the value of aspect + */ + public function setAspect($aspect) + { + $this->aspect = $aspect; + } + + /** + * Get the value of first + */ + public function getFirst() + { + return $this->first; + } + + /** + * Set the value of first + */ + public function setFirst($first) + { + $this->first = $first; + } + + /** + * Get the value of height + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set the value of height + */ + public function setHeight($height) + { + $this->height = $height; + } + + /** + * Get the value of width + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set the value of width + */ + public function setWidth($width) + { + $this->width = $width; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customer.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customer.php new file mode 100644 index 0000000000..3c2a74da9f --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customer.php @@ -0,0 +1,181 @@ +address = $address; + $this->info = $info; + $this->logo = $logo; + $this->logoDark = $logoDark; + $this->mail = $mail; + $this->name = $name; + $this->phone = $phone; + $this->www = $www; + } + + /** + * Get the value of address + */ + public function getAddress() + { + return $this->address; + } + + /** + * Set the value of address + */ + public function setAddress($address) + { + $this->address = $address; + } + + /** + * Get the value of info + */ + public function getInfo() + { + return $this->info; + } + + /** + * Set the value of info + */ + public function setInfo($info) + { + $this->info = $info; + } + + /** + * Get the value of logo + */ + public function getLogo() + { + return $this->logo; + } + + /** + * Set the value of logo + */ + public function setLogo($logo) + { + $this->logo = $logo; + } + + /** + * Get the value of logoDark + */ + public function getLogoDark() + { + return $this->logoDark; + } + + /** + * Set the value of logoDark + */ + public function setLogoDark($logoDark) + { + $this->logoDark = $logoDark; + } + + /** + * Get the value of mail + */ + public function getMail() + { + return $this->mail; + } + + /** + * Set the value of mail + */ + public function setMail($mail) + { + $this->mail = $mail; + } + + /** + * Get the value of name + */ + public function getName() + { + return $this->name; + } + + /** + * Set the value of name + */ + public function setName($name) + { + $this->name = $name; + } + + /** + * Get the value of phone + */ + public function getPhone() + { + return $this->phone; + } + + /** + * Set the value of phone + */ + public function setPhone($phone) + { + $this->phone = $phone; + } + + /** + * Get the value of www + */ + public function getWww() + { + return $this->www; + } + + /** + * Set the value of www + */ + public function setWww($www) + { + $this->www = $www; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customization.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customization.php new file mode 100644 index 0000000000..d5e8fcc2a6 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Customization.php @@ -0,0 +1,586 @@ +anonymous = $anonymous; + $this->autosave = $autosave; + $this->comments = $comments; + $this->compactHeader = $compactHeader; + $this->compactToolbar = $compactToolbar; + $this->compatibleFeatures = $compatibleFeatures; + $this->customer = $customer; + $this->features = $features; + $this->feedback = $feedback; + $this->forcesave = $forcesave; + $this->goback = $goback; + $this->help = $help; + $this->hideNotes = $hideNotes; + $this->hideRightMenu = $hideRightMenu; + $this->hideRulers = $hideRulers; + $this->integrationMode = $integrationMode; + $this->logo = $logo; + $this->macros = $macros; + $this->macrosMode = $macrosMode; + $this->mentionShare = $mentionShare; + $this->mobileForceView = $mobileForceView; + $this->plugins = $plugins; + $this->review = $review; + $this->submitForm = $submitForm; + $this->toolbarHideFileName = $toolbarHideFileName; + $this->toolbarNoTabs = $toolbarNoTabs; + $this->uiTheme = $uiTheme; + $this->unit = $unit; + $this->zoom = $zoom; + } + + /** + * Get the value of anonymous + */ + public function getAnonymous() + { + return $this->anonymous; + } + + /** + * Set the value of anonymous + */ + public function setAnonymous($anonymous) + { + $this->anonymous = $anonymous; + } + + /** + * Get the value of autosave + */ + public function getAutosave() + { + return $this->autosave; + } + + /** + * Set the value of autosave + */ + public function setAutosave($autosave) + { + $this->autosave = $autosave; + } + + /** + * Get the value of comments + */ + public function getComments() + { + return $this->comments; + } + + /** + * Set the value of comments + */ + public function setComments($comments) + { + $this->comments = $comments; + } + + /** + * Get the value of compactHeader + */ + public function getCompactHeader() + { + return $this->compactHeader; + } + + /** + * Set the value of compactHeader + */ + public function setCompactHeader($compactHeader) + { + $this->compactHeader = $compactHeader; + } + + /** + * Get the value of compactToolbar + */ + public function getCompactToolbar() + { + return $this->compactToolbar; + } + + /** + * Set the value of compactToolbar + */ + public function setCompactToolbar($compactToolbar) + { + $this->compactToolbar = $compactToolbar; + } + + /** + * Get the value of compatibleFeatures + */ + public function getCompatibleFeatures() + { + return $this->compatibleFeatures; + } + + /** + * Set the value of compatibleFeatures + */ + public function setCompatibleFeatures($compatibleFeatures) + { + $this->compatibleFeatures = $compatibleFeatures; + } + + /** + * Get the value of customer + */ + public function getCustomer() + { + return $this->customer; + } + + /** + * Set the value of customer + */ + public function setCustomer($customer) + { + $this->customer = $customer; + } + + /** + * Get the value of features + */ + public function getFeatures() + { + return $this->features; + } + + /** + * Set the value of features + */ + public function setFeatures($features) + { + $this->features = $features; + } + + /** + * Get the value of feedback + */ + public function getFeedback() + { + return $this->feedback; + } + + /** + * Set the value of feedback + */ + public function setFeedback($feedback) + { + $this->feedback = $feedback; + } + + /** + * Get the value of forcesave + */ + public function getForcesave() + { + return $this->forcesave; + } + + /** + * Set the value of forcesave + */ + public function setForcesave($forcesave) + { + $this->forcesave = $forcesave; + } + + /** + * Get the value of goback + */ + public function getGoback() + { + return $this->goback; + } + + /** + * Set the value of goback + */ + public function setGoback($goback) + { + $this->goback = $goback; + } + + /** + * Get the value of help + */ + public function getHelp() + { + return $this->help; + } + + /** + * Set the value of help + */ + public function setHelp($help) + { + $this->help = $help; + } + + /** + * Get the value of hideNotes + */ + public function getHideNotes() + { + return $this->hideNotes; + } + + /** + * Set the value of hideNotes + */ + public function setHideNotes($hideNotes) + { + $this->hideNotes = $hideNotes; + } + + /** + * Get the value of hideRightMenu + */ + public function getHideRightMenu() + { + return $this->hideRightMenu; + } + + /** + * Set the value of hideRightMenu + */ + public function setHideRightMenu($hideRightMenu) + { + $this->hideRightMenu = $hideRightMenu; + } + + /** + * Get the value of hideRulers + */ + public function getHideRulers() + { + return $this->hideRulers; + } + + /** + * Set the value of hideRulers + */ + public function setHideRulers($hideRulers) + { + $this->hideRulers = $hideRulers; + } + + /** + * Get the value of integrationMode + */ + public function getIntegrationMode() + { + return $this->integrationMode; + } + + /** + * Set the value of integrationMode + */ + public function setIntegrationMode($integrationMode) + { + $this->integrationMode = $integrationMode; + } + + /** + * Get the value of logo + */ + public function getLogo() + { + return $this->logo; + } + + /** + * Set the value of logo + */ + public function setLogo($logo) + { + $this->logo = $logo; + } + + /** + * Get the value of macros + */ + public function getMacros() + { + return $this->macros; + } + + /** + * Set the value of macros + */ + public function setMacros($macros) + { + $this->macros = $macros; + } + + /** + * Get the value of macrosMode + */ + public function getMacrosMode() + { + return $this->macrosMode; + } + + /** + * Set the value of macrosMode + */ + public function setMacrosMode($macrosMode) + { + $this->macrosMode = $macrosMode; + } + + /** + * Get the value of mentionShare + */ + public function getMentionShare() + { + return $this->mentionShare; + } + + /** + * Set the value of mentionShare + */ + public function setMentionShare($mentionShare) + { + $this->mentionShare = $mentionShare; + } + + /** + * Get the value of mobileForceView + */ + public function getMobileForceView() + { + return $this->mobileForceView; + } + + /** + * Set the value of mobileForceView + */ + public function setMobileForceView($mobileForceView) + { + $this->mobileForceView = $mobileForceView; + } + + /** + * Get the value of plugins + */ + public function getPlugins() + { + return $this->plugins; + } + + /** + * Set the value of plugins + */ + public function setPlugins($plugins) + { + $this->plugins = $plugins; + } + + /** + * Get the value of review + */ + public function getReview() + { + return $this->review; + } + + /** + * Set the value of review + */ + public function setReview($review) + { + $this->review = $review; + } + + /** + * Get the value of submitForm + */ + public function getSubmitForm() + { + return $this->submitForm; + } + + /** + * Set the value of submitForm + */ + public function setSubmitForm($submitForm) + { + $this->submitForm = $submitForm; + } + + /** + * Get the value of toolbarHideFileName + */ + public function getToolbarHideFileName() + { + return $this->toolbarHideFileName; + } + + /** + * Set the value of toolbarHideFileName + */ + public function setToolbarHideFileName($toolbarHideFileName) + { + $this->toolbarHideFileName = $toolbarHideFileName; + } + + /** + * Get the value of toolbarNoTabs + */ + public function getToolbarNoTabs() + { + return $this->toolbarNoTabs; + } + + /** + * Set the value of toolbarNoTabs + */ + public function setToolbarNoTabs($toolbarNoTabs) + { + $this->toolbarNoTabs = $toolbarNoTabs; + } + + /** + * Get the value of uiTheme + */ + public function getUiTheme() + { + return $this->uiTheme; + } + + /** + * Set the value of uiTheme + */ + public function setUiTheme($uiTheme) + { + $this->uiTheme = $uiTheme; + } + + /** + * Get the value of unit + */ + public function getUnit() + { + return $this->unit; + } + + /** + * Set the value of unit + */ + public function setUnit($unit) + { + $this->unit = $unit; + } + + /** + * Get the value of zoom + */ + public function getZoom() + { + return $this->zoom; + } + + /** + * Set the value of zoom + */ + public function setZoom($zoom) + { + $this->zoom = $zoom; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocEditorConfig.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocEditorConfig.php new file mode 100644 index 0000000000..ea4d77a4bc --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocEditorConfig.php @@ -0,0 +1,276 @@ +callbackUrl = $callbackUrl; + $this->coEditing = $coEditing; + $this->createUrl = $createUrl; + $this->lang = $lang; + $this->location = $location; + $this->mode = $mode; + $this->recent = $recent; + $this->region = $region; + $this->templates = $templates; + $this->user = $user; + $this->customization = $customization; + $this->embedded = $embedded; + } + + /** + * Get the value of callbackUrl + */ + public function getCallbackUrl() + { + return $this->callbackUrl; + } + + /** + * Set the value of callbackUrl + * + */ + public function setCallbackUrl($callbackUrl) + { + $this->callbackUrl = $callbackUrl; + } + + /** + * Get the value of coEditing + */ + public function getCoEditing() + { + return $this->coEditing; + } + + /** + * Set the value of coEditing + * + */ + public function setCoEditing($coEditing) + { + $this->coEditing = $coEditing; + } + + /** + * Get the value of createUrl + */ + public function getCreateUrl() + { + return $this->createUrl; + } + + /** + * Set the value of createUrl + * + */ + public function setCreateUrl($createUrl) + { + $this->createUrl = $createUrl; + } + + /** + * Get the value of lang + */ + public function getLang() + { + return $this->lang; + } + + /** + * Set the value of lang + * + */ + public function setLang($lang) + { + $this->lang = $lang; + } + + /** + * Get the value of location + */ + public function getLocation() + { + return $this->location; + } + + /** + * Set the value of location + * + */ + public function setLocation($location) + { + $this->location = $location; + } + + /** + * Get the value of mode + */ + public function getMode() + { + return $this->mode; + } + + /** + * Set the value of mode + * + */ + public function setMode($mode) + { + $this->mode = $mode; + } + + /** + * Get the value of recent + */ + public function getRecent() + { + return $this->recent; + } + + /** + * Set the value of recent + * + */ + public function setRecent($recent) + { + $this->recent = $recent; + } + + /** + * Get the value of region + */ + public function getRegion() + { + return $this->region; + } + + /** + * Set the value of region + * + */ + public function setRegion($region) + { + $this->region = $region; + } + + /** + * Get the value of templates + */ + public function getTemplates() + { + return $this->templates; + } + + /** + * Set the value of templates + * + */ + public function setTemplates($templates) + { + $this->templates = $templates; + } + + /** + * Get the value of user + */ + public function getUser() + { + return $this->user; + } + + /** + * Set the value of user + * + */ + public function setUser($user) + { + $this->user = $user; + } + + /** + * Get the value of customization + */ + public function getCustomization() + { + return $this->customization; + } + + /** + * Set the value of customization + * + */ + public function setCustomization($customization) + { + $this->customization = $customization; + } + + /** + * Get the value of embedded + */ + public function getEmbedded() + { + return $this->embedded; + } + + /** + * Set the value of embedded + * + */ + public function setEmbedded($embedded) + { + $this->embedded = $embedded; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Document.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Document.php new file mode 100644 index 0000000000..aa94cdd0bf --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Document.php @@ -0,0 +1,169 @@ +fileType = $fileType; + $this->key = $key; + $this->referenceData = $referenceData; + $this->title = $title; + $this->url = $url; + $this->info = $info; + $this->permissions = $permissions; + } + + /** + * Get the value of fileType + */ + public function getFileType() + { + return $this->fileType; + } + + /** + * Set the value of fileType + */ + public function setFileType($fileType) + { + $this->fileType = $fileType; + } + + /** + * Get the value of key + */ + public function getKey() + { + return $this->key; + } + + /** + * Set the value of key + */ + public function setKey($key) + { + $this->key = $key; + } + + /** + * Get the value of referenceData + */ + public function getReferenceData() + { + return $this->referenceData; + } + + /** + * Set the value of referenceData + + */ + public function setReferenceData($referenceData) + { + $this->referenceData = $referenceData; + } + + /** + * Get the value of title + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set the value of title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } + + /** + * Get the value of info + */ + public function getInfo() + { + return $this->info; + } + + /** + * Set the value of info + */ + public function setInfo($info) + { + $this->info = $info; + } + + /** + * Get the value of permissions + */ + public function getPermissions() + { + return $this->permissions; + } + + /** + * Set the value of permissions + */ + public function setPermissions($permissions) + { + $this->permissions = $permissions; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocumentType.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocumentType.php new file mode 100644 index 0000000000..8d65631b99 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/DocumentType.php @@ -0,0 +1,39 @@ +value = $type; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/EditorsMode.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/EditorsMode.php new file mode 100644 index 0000000000..9b1e395b81 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/EditorsMode.php @@ -0,0 +1,37 @@ +value = $editorsMode !== null ? $editorsMode : self::EDIT; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Embedded.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Embedded.php new file mode 100644 index 0000000000..59fef85fe2 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Embedded.php @@ -0,0 +1,110 @@ +embedUrl = $embedUrl; + $this->fullscreenUrl = $fullscreenUrl; + $this->saveUrl = $saveUrl; + $this->shareUrl = $shareUrl; + $this->toolbarDocked = $toolbarDocked !== null ? $toolbarDocked : new Toolbar; + } + + + /** + * Get the value of embedUrl + */ + public function getEmbedUrl() + { + return $this->embedUrl; + } + + /** + * Set the value of embedUrl + */ + public function setEmbedUrl($embedUrl) + { + $this->embedUrl = $embedUrl; + } + + /** + * Get the value of fullscreenUrl + */ + public function getFullscreenUrl() + { + return $this->fullscreenUrl; + } + + /** + * Set the value of fullscreenUrl + */ + public function setFullscreenUrl($fullscreenUrl) + { + $this->fullscreenUrl = $fullscreenUrl; + } + + /** + * Get the value of saveUrl + */ + public function getSaveUrl() + { + return $this->saveUrl; + } + + /** + * Set the value of saveUrl + */ + public function setSaveUrl($saveUrl) + { + $this->saveUrl = $saveUrl; + } + + /** + * Get the value of toolbarDocked + */ + public function getToolbarDocked() + { + return $this->toolbarDocked; + } + + /** + * Set the value of toolbarDocked + */ + public function setToolbarDocked($toolbarDocked) + { + $this->toolbarDocked = $toolbarDocked; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Features.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Features.php new file mode 100644 index 0000000000..d4ace3e24d --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Features.php @@ -0,0 +1,47 @@ +spellcheck = $spellcheck; + } + + /** + * Get the value of spellcheck + */ + public function getSpellcheck() + { + return $this->spellcheck; + } + + /** + * Set the value of spellcheck + */ + public function setSpellcheck($spellcheck) + { + $this->spellcheck = $spellcheck; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Format.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Format.php new file mode 100644 index 0000000000..ce49d9c39d --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Format.php @@ -0,0 +1,129 @@ +name = $name; + $this->type = $type; + $this->actions = $actions; + $this->convert = $convert; + $this->mime = $mime; + } + + public function getName() + { + return $this->name; + } + + public function setName(string $name) + { + $this->name = $name; + } + + public function getType() + { + return $this->type; + } + + public function setType(string $type) + { + $this->type = $type; + } + + public function getActions() + { + return $this->actions; + } + + public function setActions(array $actions) + { + $this->actions = $actions; + } + + public function getConvert() + { + return $this->convert; + } + + public function setConvert(array $convert) + { + $this->convert = $convert; + } + + public function getMimes() + { + return $this->mime; + } + + public function setMimes(array $mime) + { + $this->mime = $mime; + } + + protected function hasAction(string $search) + { + return in_array($search, $this->actions); + } + + public function isViewable() + { + return $this->hasAction("view"); + } + + public function isStrictlyEditable() + { + return $this->hasAction("edit"); + } + + public function isLossyEditable() + { + return $this->hasAction("lossy-edit"); + } + + public function isEditable() + { + return $this->hasAction("edit") || $this->hasAction("lossy-edit"); + } + + public function isAutoConvertable() + { + $this->hasAction("auto-convert"); + } + + public function isFillable() + { + return $this->hasAction("fill"); + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/GoBack.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/GoBack.php new file mode 100644 index 0000000000..9d92c774a9 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/GoBack.php @@ -0,0 +1,101 @@ +blank = $blank; + $this->requestClose = $requestClose; + $this->text = $text; + $this->url = $url; + } + + /** + * Get the value of blank + */ + public function getBlank() + { + return $this->blank; + } + + /** + * Set the value of blank + */ + public function setBlank($blank) + { + $this->blank = $blank; + } + + /** + * Get the value of requestClose + */ + public function getRequestClose() + { + return $this->requestClose; + } + + /** + * Set the value of requestClose + */ + public function setRequestClose($requestClose) + { + $this->requestClose = $requestClose; + } + + /** + * Get the value of text + */ + public function getText() + { + return $this->text; + } + + /** + * Set the value of text + */ + public function setText($text) + { + $this->text = $text; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/History.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/History.php new file mode 100644 index 0000000000..44c1487fd5 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/History.php @@ -0,0 +1,58 @@ +serverVersion = $serverVersion; + $this->changes = $changes; + } + + /** + * Get the value of serverVersion + */ + public function getServerVersion() + { + return $this->serverVersion; + } + + /** + * Set the value of serverVersion + */ + public function setServerVersion($serverVersion) + { + $this->serverVersion = $serverVersion; + } + + /** + * Set the value of changes + */ + public function setChanges($changes) + { + $this->changes = $changes; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Info.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Info.php new file mode 100644 index 0000000000..44d25d30c0 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Info.php @@ -0,0 +1,125 @@ +favorite = $favorite; + $this->folder = $folder; + $this->owner = $owner; + $this->sharingSettings = $sharingSettings; + $this->uploaded = $uploaded; + } + + /** + * Get the value of favorite + */ + public function getFavorite() + { + return $this->favorite; + } + + /** + * Set the value of favorite + */ + public function setFavorite($favorite) + { + $this->favorite = $favorite; + } + + /** + * Get the value of folder + */ + public function getFolder() + { + return $this->folder; + } + + /** + * Set the value of folder + */ + public function setFolder($folder) + { + $this->folder = $folder; + } + + /** + * Get the value of owner + */ + public function getOwner() + { + return $this->owner; + } + + /** + * Set the value of owner + */ + public function setOwner($owner) + { + $this->owner = $owner; + } + + /** + * Get the value of sharingSettings + */ + public function getSharingSettings() + { + return $this->sharingSettings; + } + + /** + * Set the value of sharingSettings + */ + public function setSharingSettings($sharingSettings) + { + $this->sharingSettings = $sharingSettings; + } + + /** + * Get the value of uploaded + */ + public function getUploaded() + { + return $this->uploaded; + } + + /** + * Set the value of uploaded + */ + public function setUploaded($uploaded) + { + $this->uploaded = $uploaded; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/JsonSerializable.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/JsonSerializable.php new file mode 100644 index 0000000000..11086e56ca --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/JsonSerializable.php @@ -0,0 +1,57 @@ + $var) { + if (empty($var) && !is_bool($var)) { + unset($vars[$key]); + } else { + if (is_object($var)) { + if (property_exists($var, "value")) { + if (empty($var->value)) { + unset($vars[$key]); + } else { + $vars[$key] = $var->value; + } + } + } + } + } + return $vars; + } + + public function mapFromArray(array $values) + { + foreach ($values as $key => $value) { + try { + $mapperFunction = "set" . lcfirst($key); + $this->{$mapperFunction}($value); + } catch (\Exception $e) { + continue; + } + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Logo.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Logo.php new file mode 100644 index 0000000000..a7a8543d73 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Logo.php @@ -0,0 +1,101 @@ +image = $image; + $this->imageDark = $imageDark; + $this->url = $url; + $this->visible = $visible; + } + + /** + * Get the value of image + */ + public function getImage() + { + return $this->image; + } + + /** + * Set the value of image + */ + public function setImage($image) + { + $this->image = $image; + } + + /** + * Get the value of imageDark + */ + public function getImageDark() + { + return $this->imageDark; + } + + /** + * Set the value of imageDark + */ + public function setImageDark($imageDark) + { + $this->imageDark = $imageDark; + } + + /** + * Get the value of imageEmbedded + */ + public function getImageEmbedded() + { + return $this->imageEmbedded; + } + + /** + * Set the value of imageEmbedded + */ + public function setImageEmbedded($imageEmbedded) + { + $this->imageEmbedded = $imageEmbedded; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/MacrosMode.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/MacrosMode.php new file mode 100644 index 0000000000..985631462b --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/MacrosMode.php @@ -0,0 +1,38 @@ +value = $macrosMode !== null ? $macrosMode : self::WARN; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Permissions.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Permissions.php new file mode 100644 index 0000000000..ce3235516b --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Permissions.php @@ -0,0 +1,353 @@ +chat = $chat; + $this->comment = $comment; + $this->commentGroups = $commentGroups !== null ? $commentGroups : new CommentGroups; + $this->copy = $copy; + $this->deleteCommentAuthorOnly = $deleteCommentAuthorOnly; + $this->download = $download; + $this->edit = $edit; + $this->editCommentAuthorOnly = $editCommentAuthorOnly; + $this->fillForms = $fillForms; + $this->modifyContentControl = $modifyContentControl; + $this->modifyFilter = $modifyFilter; + $this->print = $print; + $this->protect = $protect; + $this->rename = $rename; + $this->review = $review; + $this->reviewGroups = $reviewGroups; + $this->userInfoGroups = $userInfoGroups; + } + + /** + * Get the value of chat + */ + public function getChat() + { + return $this->chat; + } + + /** + * Set the value of chat + */ + public function setChat($chat) + { + $this->chat = $chat; + } + + /** + * Get the value of comment + */ + public function getComment() + { + return $this->comment; + } + + /** + * Set the value of comment + */ + public function setComment($comment) + { + $this->comment = $comment; + } + + /** + * Get the value of commentGroups + */ + public function getCommentGroups() + { + return $this->commentGroups; + } + + /** + * Set the value of commentGroups + */ + public function setCommentGroups($commentGroups) + { + $this->commentGroups = $commentGroups; + } + + /** + * Get the value of copy + */ + public function getCopy() + { + return $this->copy; + } + + /** + * Set the value of copy + */ + public function setCopy($copy) + { + $this->copy = $copy; + } + + /** + * Get the value of deleteCommentAuthorOnly + */ + public function getDeleteCommentAuthorOnly() + { + return $this->deleteCommentAuthorOnly; + } + + /** + * Set the value of deleteCommentAuthorOnly + */ + public function setDeleteCommentAuthorOnly($deleteCommentAuthorOnly) + { + $this->deleteCommentAuthorOnly = $deleteCommentAuthorOnly; + } + + /** + * Get the value of download + */ + public function getDownload() + { + return $this->download; + } + + /** + * Set the value of download + */ + public function setDownload($download) + { + $this->download = $download; + } + + /** + * Get the value of edit + */ + public function getEdit() + { + return $this->edit; + } + + /** + * Set the value of edit + */ + public function setEdit($edit) + { + $this->edit = $edit; + } + + /** + * Get the value of editCommentAuthorOnly + */ + public function getEditCommentAuthorOnly() + { + return $this->editCommentAuthorOnly; + } + + /** + * Set the value of editCommentAuthorOnly + */ + public function setEditCommentAuthorOnly($editCommentAuthorOnly) + { + $this->editCommentAuthorOnly = $editCommentAuthorOnly; + } + + /** + * Get the value of fillForms + */ + public function getFillForms() + { + return $this->fillForms; + } + + /** + * Set the value of fillForms + */ + public function setFillForms($fillForms) + { + $this->fillForms = $fillForms; + } + + /** + * Get the value of modifyContentControl + */ + public function getModifyContentControl() + { + return $this->modifyContentControl; + } + + /** + * Set the value of modifyContentControl + */ + public function setModifyContentControl($modifyContentControl) + { + $this->modifyContentControl = $modifyContentControl; + } + + /** + * Get the value of modifyFilter + */ + public function getModifyFilter() + { + return $this->modifyFilter; + } + + /** + * Set the value of modifyFilter + */ + public function setModifyFilter($modifyFilter) + { + $this->modifyFilter = $modifyFilter; + } + + /** + * Get the value of print + */ + public function getPrint() + { + return $this->print; + } + + /** + * Set the value of print + */ + public function setPrint($print) + { + $this->print = $print; + } + + /** + * Get the value of protect + */ + public function getProtect() + { + return $this->protect; + } + + /** + * Set the value of protect + */ + public function setProtect($protect) + { + $this->protect = $protect; + } + + /** + * Get the value of rename + */ + public function getRename() + { + return $this->rename; + } + + /** + * Set the value of rename + */ + public function setRename($rename) + { + $this->rename = $rename; + } + + /** + * Get the value of review + */ + public function getReview() + { + return $this->review; + } + + /** + * Set the value of review + */ + public function setReview($review) + { + $this->review = $review; + } + + /** + * Get the value of reviewGroups + */ + public function getReviewGroups() + { + return $this->reviewGroups; + } + + /** + * Set the value of reviewGroups + */ + public function setReviewGroups($reviewGroups) + { + $this->reviewGroups = $reviewGroups; + } + + /** + * Get the value of userInfoGroups + */ + public function getUserInfoGroups() + { + return $this->userInfoGroups; + } + + /** + * Set the value of userInfoGroups + */ + public function setUserInfoGroups($userInfoGroups) + { + $this->userInfoGroups = $userInfoGroups; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Recent.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Recent.php new file mode 100644 index 0000000000..97faa77d62 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Recent.php @@ -0,0 +1,84 @@ +folder = $folder; + $this->title = $title; + $this->url = $url; + } + + /** + * Get the value of folder + */ + public function getFolder() + { + return $this->folder; + } + + /** + * Set the value of folder + */ + public function setFolder($folder) + { + $this->folder = $folder; + } + + /** + * Get the value of title + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set the value of title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReferenceData.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReferenceData.php new file mode 100644 index 0000000000..a5fd0bce9f --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReferenceData.php @@ -0,0 +1,83 @@ +fileKey = $fileKey; + $this->instanceId = $instanceId; + $this->key = $key; + } + + /** + * Get the value of fileKey + */ + public function getFileKey() + { + return $this->fileKey; + } + + /** + * Set the value of fileKey + */ + public function setFileKey($fileKey) + { + $this->fileKey = $fileKey; + } + + /** + * Get the value of instanceId + */ + public function getInstanceId() + { + return $this->instanceId; + } + + /** + * Set the value of instanceId + */ + public function setInstanceId($instanceId) + { + $this->instanceId = $instanceId; + } + + /** + * Get the value of key + */ + public function getKey() + { + return $this->key; + } + + /** + * Set the value of key + */ + public function setKey($key) + { + $this->key = $key; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Review.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Review.php new file mode 100644 index 0000000000..3c492ea7f2 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Review.php @@ -0,0 +1,125 @@ +hideReviewDisplay = $hideReviewDisplay; + $this->hoverMode = $hoverMode; + $this->reviewDisplay = $reviewDisplay !== null ? $reviewDisplay : new ReviewDisplay; + $this->showReviewChanges = $showReviewChanges; + $this->trackChanges = $trackChanges; + } + + /** + * Get the value of hideReviewDisplay + */ + public function getHideReviewDisplay() + { + return $this->hideReviewDisplay; + } + + /** + * Set the value of hideReviewDisplay + */ + public function setHideReviewDisplay($hideReviewDisplay) + { + $this->hideReviewDisplay = $hideReviewDisplay; + } + + /** + * Get the value of hoverMode + */ + public function getHoverMode() + { + return $this->hoverMode; + } + + /** + * Set the value of hoverMode + */ + public function setHoverMode($hoverMode) + { + $this->hoverMode = $hoverMode; + } + + /** + * Get the value of reviewDisplay + */ + public function getReviewDisplay() + { + return $this->reviewDisplay; + } + + /** + * Set the value of reviewDisplay + */ + public function setReviewDisplay($reviewDisplay) + { + $this->reviewDisplay = $reviewDisplay; + } + + /** + * Get the value of showReviewChanges + */ + public function getShowReviewChanges() + { + return $this->showReviewChanges; + } + + /** + * Set the value of showReviewChanges + */ + public function setShowReviewChanges($showReviewChanges) + { + $this->showReviewChanges = $showReviewChanges; + } + + /** + * Get the value of trackChanges + */ + public function getTrackChanges() + { + return $this->trackChanges; + } + + /** + * Set the value of trackChanges + */ + public function setTrackChanges($trackChanges) + { + $this->trackChanges = $trackChanges; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReviewDisplay.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReviewDisplay.php new file mode 100644 index 0000000000..fc7d2298a5 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/ReviewDisplay.php @@ -0,0 +1,39 @@ +value = $reviewDisplay !== null ? $reviewDisplay : self::ORIGINAL; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettings.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettings.php new file mode 100644 index 0000000000..be5399f543 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettings.php @@ -0,0 +1,88 @@ +isLink = $isLink; + $this->sharingSettingsPermissions = + $sharingSettingsPermissions !== null ? $sharingSettingsPermissions : new SharingSettingsPermissions; + $this->user = $user; + } + + /** + * Get the value of isLink + */ + public function getIsLink() + { + return $this->isLink; + } + + /** + * Set the value of isLink + */ + public function setIsLink($isLink) + { + $this->isLink = $isLink; + } + + /** + * Get the value of sharingSettingsPermissions + */ + public function getSharingSettingsPermissions() + { + return $this->sharingSettingsPermissions; + } + + /** + * Set the value of sharingSettingsPermissions + */ + public function setSharingSettingsPermissions($sharingSettingsPermissions) + { + $this->sharingSettingsPermissions = $sharingSettingsPermissions; + } + + /** + * Get the value of user + */ + public function getUser() + { + return $this->user; + } + + /** + * Set the value of user + */ + public function setUser($user) + { + $this->user = $user; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettingsPermissions.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettingsPermissions.php new file mode 100644 index 0000000000..b84176fd03 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/SharingSettingsPermissions.php @@ -0,0 +1,38 @@ +value = $type !== null ? $type : self::FULL_ACCESS; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Template.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Template.php new file mode 100644 index 0000000000..f7ed072ce2 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Template.php @@ -0,0 +1,84 @@ +image = $image; + $this->title = $title; + $this->url = $url; + } + + /** + * Get the value of image + */ + public function getImage() + { + return $this->image; + } + + /** + * Set the value of image + */ + public function setImage($image) + { + $this->image = $image; + } + + /** + * Get the value of title + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set the value of title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get the value of url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the value of url + */ + public function setUrl($url) + { + $this->url = $url; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Toolbar.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Toolbar.php new file mode 100644 index 0000000000..ac9fee46d3 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Toolbar.php @@ -0,0 +1,37 @@ +value = $toolbar !== null ? $toolbar : self::TOP; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Type.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Type.php new file mode 100644 index 0000000000..6835b14f58 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Type.php @@ -0,0 +1,39 @@ +value = $type !== null ? $type : self::DESKTOP; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Unit.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Unit.php new file mode 100644 index 0000000000..bb108dd9ab --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/Unit.php @@ -0,0 +1,39 @@ +value = $type !== null ? $type : self::CM; + } + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/User.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/User.php new file mode 100644 index 0000000000..cea1fd3e86 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Models/User.php @@ -0,0 +1,79 @@ +id = $id; + $this->name = $name; + $this->group = $group; + $this->image = $image; + } + + public function getGroup() + { + return $this->group; + } + + public function setGroup(string $group) + { + $this->group = $group; + } + + public function getId() + { + return $this->id; + } + + public function setId(string $id) + { + $this->id = $id; + } + + public function getImage() + { + return $this->image; + } + + public function setImage(array $image) + { + $this->image = $image; + } + + public function getName() + { + return $this->name; + } + + public function setName(string $name) + { + $this->name = $name; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackService.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackService.php new file mode 100644 index 0000000000..09ff9ddf8c --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackService.php @@ -0,0 +1,117 @@ +settingsManager = $settingsManager; + $this->jwtManager = $jwtManager; + } + + public function verifyCallback(Callback $callback, string $authorizationHeader = "") + { + if ($this->jwtManager->isJwtEnabled()) { + $token = $callback->getToken(); + $payload = null; + $fromHeader = false; + + if (!empty($authorizationHeader)) { + $compareHeaders = substr($authorizationHeader, 0, strlen($this->settingsManager->getJwtPrefix())); + if ($compareHeaders === $this->settingsManager->getJwtPrefix()) { + $token = $compareHeaders; + $fromHeader = true; + } + } + + if (empty($token)) { + throw new \Exception(CommonError::message(CommonError::CALLBACK_NO_AUTH_TOKEN)); + } + + $payload = $this->jwtManager->jwtDecode($token); + $callbackFromToken = json_decode($payload, true); + if ($fromHeader) { + $callbackFromToken = $callbackFromToken["payload"]; + } + + $callback = new Callback; + $callback->mapFromArray($callbackFromToken); + } + return $callback; + } + + public function processCallback(Callback $callback, string $fileId) + { + switch ($callback->getStatus()->getValue()) { + case CallbackDocStatus::EDITING: + return $this->processTrackerStatusEditing($callback, $fileId); + case CallbackDocStatus::SAVE: + return $this->processTrackerStatusMustsave($callback, $fileId); + case CallbackDocStatus::SAVE_CORRUPTED: + return $this->processTrackerStatusCorrupted($callback, $fileId); + case CallbackDocStatus::CLOSED: + return $this->processTrackerStatusClosed($callback, $fileId); + case CallbackDocStatus::FORCESAVE: + return $this->processTrackerStatusForcesave($callback, $fileId); + case CallbackDocStatus::FORCESAVE_CORRUPTED: + return $this->processTrackerStatusCorruptedForcesave($callback, $fileId); + default: + throw new \Exception(CommonError::message(CommonError::CALLBACK_NO_STATUS)); + } + } + + public function processTrackerStatusCorruptedForcesave(Callback $callback, string $fileid) + { + return $this->processTrackerStatusForcesave($callback, $fileid); + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackServiceInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackServiceInterface.php new file mode 100644 index 0000000000..fa35c5756c --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Callback/CallbackServiceInterface.php @@ -0,0 +1,98 @@ +settingsManager = $settingsManager; + $this->jwtManager = $jwtManager; + $this->documentManager = $documentManager; + } + + public function createConfig(string $fileId, EditorsMode $mode, string $userAgent) + { + $documentName = $this->documentManager->getDocumentName($fileId); + $type = $this->getType($userAgent); + $ext = $this->documentManager->getExt($documentName); + $documentType = new DocumentType($this->documentManager->getDocType($ext)); + $document = $this->getDocument($fileId, $type); + $editorConfig = $this->getDocEditorConfig($fileId, $mode, $type); + $config = new Config( + $documentType, + "100%", + "100%", + "", + $type, + $editorConfig, + $document + ); + + if ($this->jwtManager->isJwtEnabled()) { + $config->setToken($this->jwtManager->jwtEncode($config)); + } + return $config; + } + + public function isMobileAgent(string $userAgent = "") + { + $userAgent = !empty($userAgent) ? $userAgent : $_SERVER["HTTP_USER_AGENT"]; + $envKey = EnvUtil::envKey("EDITING_SERVICE_MOBILE_USER_AGENT"); + // phpcs:ignore + $agentList = isset($_ENV[$envKey]) && !empty($_ENV[$envKey]) ? $_ENV[$envKey] : "android|avantgo|playbook|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino"; + return preg_match($agentList, $userAgent); + } + + public function getDocEditorConfig(string $fileId, EditorsMode $mode, Type $type) + { + $permissions = $this->getPermissions($fileId); + $editorConfig = new DocEditorConfig; + $editorConfig->setCoEditing($this->getCoEditing($fileId, $mode, $type)); + $editorConfig->setCreateUrl($this->documentManager->getCreateUrl($fileId)); + $editorConfig->setUser($this->getUser()); + $editorConfig->setRecent($this->getRecent()); + $editorConfig->setTemplates($this->getTemplates($fileId)); + $editorConfig->setCustomization($this->getCustomization($fileId)); + $editorConfig->setLang($this->getLang()); + $editorConfig->setRegion($this->getRegion()); + + if (($permissions->getEdit() || $permissions->getFillForms() || + $permissions->getComment() ||$permissions->getReview()) + && $mode->getValue() === EditorsMode::EDIT) { + $editorConfig->setCallbackUrl($this->documentManager->getCallbackUrl($fileId)); + } + + if ($type->getValue() === Type::EMBEDDED) { + $editorConfig->setEmbedded($this->getEmbedded($fileId)); + } + + return $editorConfig; + } + + public function getDocument(string $fileId, Type $type) + { + $documentName = $this->documentManager->getDocumentName($fileId); + $permissions = $this->getPermissions($fileId); + $document = new Document( + $this->documentManager->getExt($documentName), + $this->documentManager->getDocumentKey($fileId, $type->getValue() === Type::EMBEDDED), + $this->getReferenceData($fileId), + $documentName, + $this->documentManager->getFileUrl($fileId), + $this->getInfo($fileId), + $permissions + ); + + return $document; + } + + public function getCustomization(string $fileId) + { + $goback = new GoBack; + + if (!empty($this->documentManager->getGobackUrl($fileId))) { + $goback->setUrl($this->documentManager->getGobackUrl($fileId)); + } + + $customization = new Customization; + $customization->setGoback($goback); + + return $customization; + } + + public function getPermissions(string $fileId = "") + { + return null; + } + + public function getReferenceData(string $fileId = "") + { + return null; + } + + public function getInfo(string $fileId = "") + { + return null; + } + + public function getCoEditing(string $fileId = "", EditorsMode $mode = null, Type $type) + { + return null; + } + + public function getType(string $userAgent = "") + { + return $this->isMobileAgent($userAgent) ? new Type(Type::MOBILE) : new Type(Type::DESKTOP); + } + + public function getUser() + { + return null; + } + + public function getRecent() + { + return null; + } + + public function getTemplates($fileId) + { + return null; + } + + public function getEmbedded($fileId) + { + return null; + } + + public function getLang() + { + return "en"; + } + + public function getRegion() + { + return "en-US"; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/DocEditorConfig/DocEditorConfigServiceInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/DocEditorConfig/DocEditorConfigServiceInterface.php new file mode 100644 index 0000000000..fc73f28a29 --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/DocEditorConfig/DocEditorConfigServiceInterface.php @@ -0,0 +1,174 @@ +settingsManager = $settingsManager; + $this->jwtManager = $jwtManager; + $this->httpClient = $httpClient; + } + + /** + * Request to Document Server + * + * @param string $url - request address + * @param array $method - request method + * @param array $opts - request options + * + * @return string + */ + public function request($url, $method = "GET", $opts = []) + { + if ($this->settingsManager->isIgnoreSSL()) { + $opts["verify"] = false; + } + + if (!array_key_exists("timeout", $opts)) { + $opts["timeout"] = 60; + } + + $this->httpClient->request($url, $method, $opts); + if ($this->httpClient->getStatusCode() === 200) { + return $this->httpClient->getBody(); + } + + return ""; + } + + /** + * Generate an error code table of convertion + * + * @param int $errorCode - Error code + * + * @throws Exception + */ + public function processConvServResponceError($errorCode) + { + $errorMessage = ''; + + switch ($errorCode) { + case ConvertResponseError::UNKNOWN: + $errorMessage = ConvertResponseError::message(ConvertResponseError::UNKNOWN); + break; + case ConvertResponseError::TIMEOUT: + $errorMessage = ConvertResponseError::message(ConvertResponseError::TIMEOUT); + break; + case ConvertResponseError::CONVERSION: + $errorMessage = ConvertResponseError::message(ConvertResponseError::CONVERSION); + break; + case ConvertResponseError::DOWNLOADING: + $errorMessage = ConvertResponseError::message(ConvertResponseError::DOWNLOADING); + break; + case ConvertResponseError::PASSWORD: + $errorMessage = ConvertResponseError::message(ConvertResponseError::PASSWORD); + break; + case ConvertResponseError::DATABASE: + $errorMessage = ConvertResponseError::message(ConvertResponseError::DATABASE); + break; + case ConvertResponseError::INPUT: + $errorMessage = ConvertResponseError::message(ConvertResponseError::INPUT); + break; + case ConvertResponseError::TOKEN: + $errorMessage = ConvertResponseError::message(ConvertResponseError::TOKEN); + break; + default: + $errorMessage = "ErrorCode = " . $errorCode; + break; + } + + throw new \Exception($errorMessage); + } + + /** + * Generate an error code table of command + * + * @param string $errorCode - Error code + * + * @throws Exception + */ + public function processCommandServResponceError($errorCode) + { + $errorMessage = ""; + + switch ($errorCode) { + case CommandResponseError::NO: + return; + case CommandResponseError::KEY: + $errorMessage = CommandResponseError::message(CommandResponseError::KEY); + break; + case CommandResponseError::CALLBACK_URL: + $errorMessage = CommandResponseError::message(CommandResponseError::CALLBACK_URL); + break; + case CommandResponseError::INTERNAL_SERVER: + $errorMessage = CommandResponseError::message(CommandResponseError::INTERNAL_SERVER); + break; + case CommandResponseError::FORCE_SAVE: + $errorMessage = CommandResponseError::message(CommandResponseError::FORCE_SAVE); + break; + case CommandResponseError::COMMAND: + $errorMessage = CommandResponseError::message(CommandResponseError::COMMAND); + break; + case CommandResponseError::TOKEN: + $errorMessage = CommandResponseError::message(CommandResponseError::TOKEN); + break; + default: + $errorMessage = "ErrorCode = " . $errorCode; + break; + } + + throw new \Exception($errorMessage); + } + + /** + * Request health status + * + * @throws Exception + * + * @return bool + */ + public function healthcheckRequest() : bool + { + $healthcheckUrl = $this->settingsManager->getDocumentServerHealthcheckUrl(); + if (empty($healthcheckUrl)) { + throw new \Exception(CommonError::message(CommonError::NO_HEALTHCHECK_ENDPOINT)); + } + + $response = $this->request($healthcheckUrl); + return $response === "true"; + } + + /** + * Request for conversion to a service + * + * @param string $documentUri - Uri for the document to convert + * @param string $fromExtension - Document extension + * @param string $toExtension - Extension to which to convert + * @param string $documentRevisionId - Key for caching on service + * @param bool - $isAsync - Perform conversions asynchronously + * @param string $region - Region + * + * @throws Exception + * + * @return array + */ + public function sendRequestToConvertService( + $documentUri, + $fromExtension, + $toExtension, + $documentRevisionId, + $isAsync, + $region = null + ) { + $urlToConverter = $this->settingsManager->getConvertServiceUrl(true); + if (empty($urlToConverter)) { + throw new \Exception(CommonError::message(CommonError::NO_CONVERT_SERVICE_ENDPOINT)); + } + + if (empty($documentRevisionId)) { + $documentRevisionId = $documentUri; + } + $documentRevisionId = DocumentManager::generateRevisionId($documentRevisionId); + + if (empty($fromExtension)) { + $fromExtension = pathinfo($documentUri)["extension"]; + } else { + $fromExtension = trim($fromExtension, "."); + } + + $data = new ConvertRequest; + $data->setAsync($isAsync); + $data->setUrl($documentUri); + $data->setOutputtype(trim($toExtension, ".")); + $data->setFiletype($fromExtension); + $data->setTitle($documentRevisionId . "." . $fromExtension); + $data->setKey($documentRevisionId); + + if (!is_null($region)) { + $data->setRegion($region); + } + + $opts = [ + "timeout" => "120", + "headers" => [ + 'Content-type' => 'application/json' + ], + "body" => json_encode($data) + ]; + + if ($this->jwtManager->isJwtEnabled()) { + $params = [ + "payload" => json_decode(json_encode($data), true) + ]; + $token = $this->jwtManager->jwtEncode($params); + $jwtHeader = $this->settingsManager->getJwtHeader(); + $jwtPrefix = $this->settingsManager->getJwtPrefix(); + + if (empty($jwtHeader)) { + throw new \Exception(CommonError::message(CommonError::NO_JWT_HEADER)); + } elseif (empty($jwtPrefix)) { + throw new \Exception(CommonError::message(CommonError::NO_JWT_PREFIX)); + } + + $opts["headers"][$jwtHeader] = (string)$jwtPrefix . $token; + $token = $this->jwtManager->jwtEncode(json_decode(json_encode($data), true)); + $data->setToken($token); + $opts["body"] = json_encode($data); + } + + + $responseXmlData = $this->request($urlToConverter, "POST", $opts); + libxml_use_internal_errors(true); + + if (!function_exists("simplexml_load_file")) { + throw new \Exception(CommonError::message(CommonError::READ_XML)); + } + + $responseData = simplexml_load_string($responseXmlData); + + if (!$responseData) { + $exc = CommonError::message(CommonError::BAD_RESPONSE_XML); + foreach (libxml_get_errors() as $error) { + $exc = $exc . PHP_EOL . $error->message; + } + throw new \Exception($exc); + } + + return $responseData; + } + + /** + * The method is to convert the file to the required format and return the result url + * + * @param string $documentUri - Uri for the document to convert + * @param string $fromExtension - Document extension + * @param string $toExtension - Extension to which to convert + * @param string $documentRevisionId - Key for caching on service + * @param string $region - Region + * + * @return string + */ + public function getConvertedUri($documentUri, $fromExtension, $toExtension, $documentRevisionId, $region = null) + { + $responseFromConvertService = $this->sendRequestToConvertService( + $documentUri, + $fromExtension, + $toExtension, + $documentRevisionId, + false, + $region + ); + // phpcs:ignore + $errorElement = $responseFromConvertService->Error; + if ($errorElement->count() > 0) { + $this->processConvServResponceError($errorElement); + } + + // phpcs:ignore + $isEndConvert = $responseFromConvertService->EndConvert; + + if ($isEndConvert !== null && strtolower($isEndConvert) === "true") { + // phpcs:ignore + return is_string($responseFromConvertService->FileUrl) ? $responseFromConvertService->FileUrl : $responseFromConvertService->FileUrl->__toString(); + } + + return ""; + } + + /** + * Send command + * + * @param string $method - type of command + * + * @return array + */ + public function commandRequest($method) + { + $urlCommand = $this->settingsManager->getCommandServiceUrl(true); + if (empty($urlCommand)) { + throw new \Exception(CommonError::message(CommonError::NO_COMMAND_ENDPOINT)); + } + + $data = [ + "c" => $method + ]; + $opts = [ + "headers" => [ + "Content-type" => "application/json" + ], + "body" => json_encode($data) + ]; + + if ($this->jwtManager->isJwtEnabled()) { + $params = [ + "payload" => $data + ]; + $token = $this->jwtManager->jwtEncode($params); + $jwtHeader = $this->settingsManager->getJwtHeader(); + $jwtPrefix = $this->settingsManager->getJwtPrefix(); + + if (empty($jwtHeader)) { + throw new \Exception(CommonError::message(CommonError::NO_JWT_HEADER)); + } elseif (empty($jwtPrefix)) { + throw new \Exception(CommonError::message(CommonError::NO_JWT_PREFIX)); + } + + $opts["headers"][$jwtHeader] = $jwtPrefix . $token; + $token = $this->jwtManager->jwtEncode($data); + $data["token"] = $token; + $opts["body"] = json_encode($data); + } + + $response = $this->request($urlCommand, "post", $opts); + + $data = json_decode($response); + $this->processCommandServResponceError($data->error); + + return $data; + } + + /** + * Checking document service location + * + * @return array + */ + public function checkDocServiceUrl() + { + $version = null; + $documentServerUrl = $this->settingsManager->getDocumentServerUrl(); + if (empty($documentServerUrl)) { + throw new \Exception(CommonError::message(CommonError::NO_DOCUMENT_SERVER_URL)); + } + + try { + if ((isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on" || $_SERVER["HTTPS"] == 1) + || isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") + && preg_match('/^http:\/\//i', $documentServerUrl)) { + throw new \Exception(CommonError::message(CommonError::MIXED_CONTENT)); + } + } catch (\Exception $e) { + return [$e->getMessage(), $version]; + } + + try { + $healthcheckResponse = $this->healthcheckRequest(); + + if (!$healthcheckResponse) { + throw new \Exception(CommonError::message(CommonError::BAD_HEALTHCHECK_STATUS)); + } + } catch (\Exception $e) { + return [$e->getMessage(), $version]; + } + + try { + $commandResponse = $this->commandRequest('version'); + + if (empty($commandResponse)) { + throw new \Exception(CommonError::message(CommonError::BAD_HEALTHCHECK_STATUS)); + } + + $version = $commandResponse->version; + $versionF = floatval($version); + + if ($versionF > 0.0 && $versionF <= self::MIN_EDITORS_VERSION) { + throw new \Exception(CommonError::message(CommonError::NOT_SUPPORTED_VERSION)); + } + } catch (\Exception $e) { + return [$e->getMessage(), $version]; + } + + try { + $fileUrl = $this->getFileUrlForConvert(); + + if (!empty($fileUrl)) { + if (!empty($this->settingsManager->getStorageUrl())) { + $fileUrl = str_replace( + $this->settingsManager->getServerUrl(), + $this->settingsManager->getStorageUrl(), + $fileUrl + ); + } + $convertedFileUri = $this->getConvertedUri($fileUrl, "docx", "docx", "check_" . rand()); + } + } catch (\Exception $e) { + return [$e->getMessage(), $version]; + } + + try { + $this->request($convertedFileUri); + } catch (\Exception $e) { + return [$e->getMessage(), $version]; + } + + return ["", $version]; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Request/RequestServiceInterface.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Request/RequestServiceInterface.php new file mode 100644 index 0000000000..a5f74c37df --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Service/Request/RequestServiceInterface.php @@ -0,0 +1,134 @@ +getConstants(); + } + return self::$constCacheArray[$calledClass]; + } + + public static function isValidName($name, $strict = false) + { + $constants = self::getConstants(); + + if ($strict) { + return array_key_exists($name, $constants); + } + + $keys = array_map("strtolower", array_keys($constants)); + return in_array(strtolower($name), $keys); + } + + public static function isValidValue($value, $strict = true) + { + $values = array_values(self::getConstants()); + return in_array($value, $values, $strict); + } + + public function getValue() + { + return $this->value; + } + + public function setValue($value) + { + $this->value = $value; + } +} diff --git a/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Util/CommandResponseError.php b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Util/CommandResponseError.php new file mode 100644 index 0000000000..1ae0b0781a --- /dev/null +++ b/plugin/onlyoffice/vendor/onlyoffice/docs-integration-sdk/src/Util/CommandResponseError.php @@ -0,0 +1,61 @@ +safeLoad(); + } + + public static function envKey($key) + { + return mb_strtoupper(self::ENV_SETTINGS_PREFIX . "_" . $key); + } +} diff --git a/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php new file mode 100644 index 0000000000..9cb77c8648 --- /dev/null +++ b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php @@ -0,0 +1,175 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use Traversable; + +/** + * @template T + * + * @extends Option + */ +final class LazyOption extends Option +{ + /** @var callable(mixed...):(Option) */ + private $callback; + + /** @var array */ + private $arguments; + + /** @var Option|null */ + private $option; + + /** + * @template S + * @param callable(mixed...):(Option) $callback + * @param array $arguments + * + * @return LazyOption + */ + public static function create($callback, array $arguments = []): self + { + return new self($callback, $arguments); + } + + /** + * @param callable(mixed...):(Option) $callback + * @param array $arguments + */ + public function __construct($callback, array $arguments = []) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Invalid callback given'); + } + + $this->callback = $callback; + $this->arguments = $arguments; + } + + public function isDefined(): bool + { + return $this->option()->isDefined(); + } + + public function isEmpty(): bool + { + return $this->option()->isEmpty(); + } + + public function get() + { + return $this->option()->get(); + } + + public function getOrElse($default) + { + return $this->option()->getOrElse($default); + } + + public function getOrCall($callable) + { + return $this->option()->getOrCall($callable); + } + + public function getOrThrow(\Exception $ex) + { + return $this->option()->getOrThrow($ex); + } + + public function orElse(Option $else) + { + return $this->option()->orElse($else); + } + + public function ifDefined($callable) + { + $this->option()->forAll($callable); + } + + public function forAll($callable) + { + return $this->option()->forAll($callable); + } + + public function map($callable) + { + return $this->option()->map($callable); + } + + public function flatMap($callable) + { + return $this->option()->flatMap($callable); + } + + public function filter($callable) + { + return $this->option()->filter($callable); + } + + public function filterNot($callable) + { + return $this->option()->filterNot($callable); + } + + public function select($value) + { + return $this->option()->select($value); + } + + public function reject($value) + { + return $this->option()->reject($value); + } + + /** + * @return Traversable + */ + public function getIterator(): Traversable + { + return $this->option()->getIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $this->option()->foldLeft($initialValue, $callable); + } + + public function foldRight($initialValue, $callable) + { + return $this->option()->foldRight($initialValue, $callable); + } + + /** + * @return Option + */ + private function option(): Option + { + if (null === $this->option) { + /** @var mixed */ + $option = call_user_func_array($this->callback, $this->arguments); + if ($option instanceof Option) { + $this->option = $option; + } else { + throw new \RuntimeException(sprintf('Expected instance of %s', Option::class)); + } + } + + return $this->option; + } +} diff --git a/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/None.php b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/None.php new file mode 100644 index 0000000000..4b85d22d2f --- /dev/null +++ b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/None.php @@ -0,0 +1,136 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use EmptyIterator; + +/** + * @extends Option + */ +final class None extends Option +{ + /** @var None|null */ + private static $instance; + + /** + * @return None + */ + public static function create(): self + { + if (null === self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function get() + { + throw new \RuntimeException('None has no value.'); + } + + public function getOrCall($callable) + { + return $callable(); + } + + public function getOrElse($default) + { + return $default; + } + + public function getOrThrow(\Exception $ex) + { + throw $ex; + } + + public function isEmpty(): bool + { + return true; + } + + public function isDefined(): bool + { + return false; + } + + public function orElse(Option $else) + { + return $else; + } + + public function ifDefined($callable) + { + // Just do nothing in that case. + } + + public function forAll($callable) + { + return $this; + } + + public function map($callable) + { + return $this; + } + + public function flatMap($callable) + { + return $this; + } + + public function filter($callable) + { + return $this; + } + + public function filterNot($callable) + { + return $this; + } + + public function select($value) + { + return $this; + } + + public function reject($value) + { + return $this; + } + + public function getIterator(): EmptyIterator + { + return new EmptyIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $initialValue; + } + + public function foldRight($initialValue, $callable) + { + return $initialValue; + } + + private function __construct() + { + } +} diff --git a/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Option.php b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Option.php new file mode 100644 index 0000000000..91fab9ca6b --- /dev/null +++ b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Option.php @@ -0,0 +1,434 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayAccess; +use IteratorAggregate; + +/** + * @template T + * + * @implements IteratorAggregate + */ +abstract class Option implements IteratorAggregate +{ + /** + * Creates an option given a return value. + * + * This is intended for consuming existing APIs and allows you to easily + * convert them to an option. By default, we treat ``null`` as the None + * case, and everything else as Some. + * + * @template S + * + * @param S $value The actual return value. + * @param S $noneValue The value which should be considered "None"; null by + * default. + * + * @return Option + */ + public static function fromValue($value, $noneValue = null) + { + if ($value === $noneValue) { + return None::create(); + } + + return new Some($value); + } + + /** + * Creates an option from an array's value. + * + * If the key does not exist in the array, the array is not actually an + * array, or the array's value at the given key is null, None is returned. + * Otherwise, Some is returned wrapping the value at the given key. + * + * @template S + * + * @param array|ArrayAccess|null $array A potential array or \ArrayAccess value. + * @param string|int|null $key The key to check. + * + * @return Option + */ + public static function fromArraysValue($array, $key) + { + if ($key === null || !(is_array($array) || $array instanceof ArrayAccess) || !isset($array[$key])) { + return None::create(); + } + + return new Some($array[$key]); + } + + /** + * Creates a lazy-option with the given callback. + * + * This is also a helper constructor for lazy-consuming existing APIs where + * the return value is not yet an option. By default, we treat ``null`` as + * None case, and everything else as Some. + * + * @template S + * + * @param callable $callback The callback to evaluate. + * @param array $arguments The arguments for the callback. + * @param S $noneValue The value which should be considered "None"; + * null by default. + * + * @return LazyOption + */ + public static function fromReturn($callback, array $arguments = [], $noneValue = null) + { + return new LazyOption(static function () use ($callback, $arguments, $noneValue) { + /** @var mixed */ + $return = call_user_func_array($callback, $arguments); + + if ($return === $noneValue) { + return None::create(); + } + + return new Some($return); + }); + } + + /** + * Option factory, which creates new option based on passed value. + * + * If value is already an option, it simply returns. If value is callable, + * LazyOption with passed callback created and returned. If Option + * returned from callback, it returns directly. On other case value passed + * to Option::fromValue() method. + * + * @template S + * + * @param Option|callable|S $value + * @param S $noneValue Used when $value is mixed or + * callable, for None-check. + * + * @return Option|LazyOption + */ + public static function ensure($value, $noneValue = null) + { + if ($value instanceof self) { + return $value; + } elseif (is_callable($value)) { + return new LazyOption(static function () use ($value, $noneValue) { + /** @var mixed */ + $return = $value(); + + if ($return instanceof self) { + return $return; + } else { + return self::fromValue($return, $noneValue); + } + }); + } else { + return self::fromValue($value, $noneValue); + } + } + + /** + * Lift a function so that it accepts Option as parameters. + * + * We return a new closure that wraps the original callback. If any of the + * parameters passed to the lifted function is empty, the function will + * return a value of None. Otherwise, we will pass all parameters to the + * original callback and return the value inside a new Option, unless an + * Option is returned from the function, in which case, we use that. + * + * @template S + * + * @param callable $callback + * @param mixed $noneValue + * + * @return callable + */ + public static function lift($callback, $noneValue = null) + { + return static function () use ($callback, $noneValue) { + /** @var array */ + $args = func_get_args(); + + $reduced_args = array_reduce( + $args, + /** @param bool $status */ + static function ($status, self $o) { + return $o->isEmpty() ? true : $status; + }, + false + ); + // if at least one parameter is empty, return None + if ($reduced_args) { + return None::create(); + } + + $args = array_map( + /** @return T */ + static function (self $o) { + // it is safe to do so because the fold above checked + // that all arguments are of type Some + /** @var T */ + return $o->get(); + }, + $args + ); + + return self::ensure(call_user_func_array($callback, $args), $noneValue); + }; + } + + /** + * Returns the value if available, or throws an exception otherwise. + * + * @throws \RuntimeException If value is not available. + * + * @return T + */ + abstract public function get(); + + /** + * Returns the value if available, or the default value if not. + * + * @template S + * + * @param S $default + * + * @return T|S + */ + abstract public function getOrElse($default); + + /** + * Returns the value if available, or the results of the callable. + * + * This is preferable over ``getOrElse`` if the computation of the default + * value is expensive. + * + * @template S + * + * @param callable():S $callable + * + * @return T|S + */ + abstract public function getOrCall($callable); + + /** + * Returns the value if available, or throws the passed exception. + * + * @param \Exception $ex + * + * @return T + */ + abstract public function getOrThrow(\Exception $ex); + + /** + * Returns true if no value is available, false otherwise. + * + * @return bool + */ + abstract public function isEmpty(); + + /** + * Returns true if a value is available, false otherwise. + * + * @return bool + */ + abstract public function isDefined(); + + /** + * Returns this option if non-empty, or the passed option otherwise. + * + * This can be used to try multiple alternatives, and is especially useful + * with lazy evaluating options: + * + * ```php + * $repo->findSomething() + * ->orElse(new LazyOption(array($repo, 'findSomethingElse'))) + * ->orElse(new LazyOption(array($repo, 'createSomething'))); + * ``` + * + * @param Option $else + * + * @return Option + */ + abstract public function orElse(self $else); + + /** + * This is similar to map() below except that the return value has no meaning; + * the passed callable is simply executed if the option is non-empty, and + * ignored if the option is empty. + * + * In all cases, the return value of the callable is discarded. + * + * ```php + * $comment->getMaybeFile()->ifDefined(function($file) { + * // Do something with $file here. + * }); + * ``` + * + * If you're looking for something like ``ifEmpty``, you can use ``getOrCall`` + * and ``getOrElse`` in these cases. + * + * @deprecated Use forAll() instead. + * + * @param callable(T):mixed $callable + * + * @return void + */ + abstract public function ifDefined($callable); + + /** + * This is similar to map() except that the return value of the callable has no meaning. + * + * The passed callable is simply executed if the option is non-empty, and ignored if the + * option is empty. This method is preferred for callables with side-effects, while map() + * is intended for callables without side-effects. + * + * @param callable(T):mixed $callable + * + * @return Option + */ + abstract public function forAll($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, + * and returns the return value of the callable wrapped in Some(). + * + * If the option is empty, then the callable is not applied. + * + * ```php + * (new Some("foo"))->map('strtoupper')->get(); // "FOO" + * ``` + * + * @template S + * + * @param callable(T):S $callable + * + * @return Option + */ + abstract public function map($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, and + * returns the return value of the callable directly. + * + * In contrast to ``map``, the return value of the callable is expected to + * be an Option itself; it is not automatically wrapped in Some(). + * + * @template S + * + * @param callable(T):Option $callable must return an Option + * + * @return Option + */ + abstract public function flatMap($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns true, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option + */ + abstract public function filter($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns false, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option + */ + abstract public function filterNot($callable); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does not equal the passed value + * (via a shallow comparison ===), then None is returned. Otherwise, the + * Option is returned. + * + * In other words, this will filter all but the passed value. + * + * @param T $value + * + * @return Option + */ + abstract public function select($value); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does equal the passed value (via + * a shallow comparison ===), then None is returned; otherwise, the Option is + * returned. + * + * In other words, this will let all values through except the passed value. + * + * @param T $value + * + * @return Option + */ + abstract public function reject($value); + + /** + * Binary operator for the initial value and the option's value. + * + * If empty, the initial value is returned. If non-empty, the callable + * receives the initial value and the option's value as arguments. + * + * ```php + * + * $some = new Some(5); + * $none = None::create(); + * $result = $some->foldLeft(1, function($a, $b) { return $a + $b; }); // int(6) + * $result = $none->foldLeft(1, function($a, $b) { return $a + $b; }); // int(1) + * + * // This can be used instead of something like the following: + * $option = Option::fromValue($integerOrNull); + * $result = 1; + * if ( ! $option->isEmpty()) { + * $result += $option->get(); + * } + * ``` + * + * @template S + * + * @param S $initialValue + * @param callable(S, T):S $callable + * + * @return S + */ + abstract public function foldLeft($initialValue, $callable); + + /** + * foldLeft() but with reversed arguments for the callable. + * + * @template S + * + * @param S $initialValue + * @param callable(T, S):S $callable + * + * @return S + */ + abstract public function foldRight($initialValue, $callable); +} diff --git a/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Some.php b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Some.php new file mode 100644 index 0000000000..032632eaab --- /dev/null +++ b/plugin/onlyoffice/vendor/phpoption/phpoption/src/PhpOption/Some.php @@ -0,0 +1,169 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayIterator; + +/** + * @template T + * + * @extends Option + */ +final class Some extends Option +{ + /** @var T */ + private $value; + + /** + * @param T $value + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * @template U + * + * @param U $value + * + * @return Some + */ + public static function create($value): self + { + return new self($value); + } + + public function isDefined(): bool + { + return true; + } + + public function isEmpty(): bool + { + return false; + } + + public function get() + { + return $this->value; + } + + public function getOrElse($default) + { + return $this->value; + } + + public function getOrCall($callable) + { + return $this->value; + } + + public function getOrThrow(\Exception $ex) + { + return $this->value; + } + + public function orElse(Option $else) + { + return $this; + } + + public function ifDefined($callable) + { + $this->forAll($callable); + } + + public function forAll($callable) + { + $callable($this->value); + + return $this; + } + + public function map($callable) + { + return new self($callable($this->value)); + } + + public function flatMap($callable) + { + /** @var mixed */ + $rs = $callable($this->value); + if (!$rs instanceof Option) { + throw new \RuntimeException('Callables passed to flatMap() must return an Option. Maybe you should use map() instead?'); + } + + return $rs; + } + + public function filter($callable) + { + if (true === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function filterNot($callable) + { + if (false === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function select($value) + { + if ($this->value === $value) { + return $this; + } + + return None::create(); + } + + public function reject($value) + { + if ($this->value === $value) { + return None::create(); + } + + return $this; + } + + /** + * @return ArrayIterator + */ + public function getIterator(): ArrayIterator + { + return new ArrayIterator([$this->value]); + } + + public function foldLeft($initialValue, $callable) + { + return $callable($initialValue, $this->value); + } + + public function foldRight($initialValue, $callable) + { + return $callable($this->value, $initialValue); + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-ctype/Ctype.php b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000000..ba75a2c95f --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param mixed $int + * @param string $function + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int, $function) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if (\PHP_VERSION_ID >= 80100) { + @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-ctype/README.md b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000000..b144d03c3c --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap.php b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000000..d54524b31b --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap80.php b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000000..ab2f8611da --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Mbstring.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 0000000000..3d45c9d9af --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,1045 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * - mb_ucfirst - Make a string's first character uppercase + * - mb_lcfirst - Make a string's first character lowercase + * - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string + * - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string + * - mb_rtrim - Strip whitespace (or other characters) from the end of a string + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas + * + * @internal + */ +final class Mbstring +{ + public const MB_CASE_FOLD = \PHP_INT_MAX; + + private const SIMPLE_CASE_FOLD = [ + ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], + ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], + ]; + + private static $encodingList = ['ASCII', 'UTF-8']; + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($s)) { + $r = []; + foreach ($s as $str) { + $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); + } + + return $r; + } + + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + + $toEncoding = self::getEncoding($toEncoding); + + if ('BASE64' === $fromEncoding) { + $s = base64_decode($s); + $fromEncoding = $toEncoding; + } + + if ('BASE64' === $toEncoding) { + return base64_encode($s); + } + + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + + return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); + } + + if ('HTML-ENTITIES' === $fromEncoding) { + $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + } + + public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) + { + $ok = true; + array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { + $ok = false; + } + }); + + return $ok ? $fromEncoding : false; + } + + public static function mb_decode_mimeheader($s) + { + return iconv_mime_decode($s, 2, self::$internalEncoding); + } + + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); + } + + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return ''; // Instead of null (cf. mb_encode_numericentity). + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $cnt = floor(\count($convmap) / 4) * 4; + + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return self::mb_chr($c - $convmap[$i + 2]); + } + } + + return $m[0]; + }, $s); + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; // Instead of '' (cf. mb_decode_numericentity). + } + + if (null !== $is_hex && !\is_scalar($is_hex)) { + trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $cnt = floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; + $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + continue 2; + } + } + $result .= $uchr; + } + + if (null === $encoding) { + return $result; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $result); + } + + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + if (\MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); + } else { + if (\MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + static $caseFolding = null; + if (null === $caseFolding) { + $caseFolding = self::getData('caseFolding'); + } + $s = strtr($s, $caseFolding); + } + + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + $normalizedEncoding = self::getEncoding($encoding); + + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + self::$internalEncoding = $normalizedEncoding; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + + switch ($normalizedLang = strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $normalizedLang; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + } + + public static function mb_list_encodings() + { + return ['UTF-8']; + } + + public static function mb_encoding_aliases($encoding) + { + switch (strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return ['utf8']; + } + + return false; + } + + public static function mb_check_encoding($var = null, $encoding = null) + { + if (null === $encoding) { + if (null === $var) { + return false; + } + $encoding = self::$internalEncoding; + } + + if (!\is_array($var)) { + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + } + + foreach ($var as $key => $value) { + if (!self::mb_check_encoding($key, $encoding)) { + return false; + } + if (!self::mb_check_encoding($value, $encoding)) { + return false; + } + } + + return true; + } + + public static function mb_detect_encoding($str, $encodingList = null, $strict = false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + } + + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!preg_match('/[\x80-\xFF]/', $str)) { + return $enc; + } + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + + default: + if (0 === strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + + return false; + } + + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (strncmp($enc, 'ISO-8859-', 9)) { + return false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encodingList = $encodingList; + + return true; + } + + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + + return @iconv_strlen($s, $encoding); + } + + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strpos($haystack, $needle, $offset); + } + + $needle = (string) $needle; + if ('' === $needle) { + if (80000 > \PHP_VERSION_ID) { + trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); + + return false; + } + + return 0; + } + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrpos($haystack, $needle, $offset); + } + + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > $offset += self::mb_strlen($needle)) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + + $pos = '' !== $needle || 80000 > \PHP_VERSION_ID + ? iconv_strrpos($haystack, $needle, $encoding) + : self::mb_strlen($haystack, $encoding); + + return false !== $pos ? $offset + $pos : false; + } + + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); + + return null; + } + + if (1 > $split_length = (int) $split_length) { + if (80000 > \PHP_VERSION_ID) { + trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + + return false; + } + + throw new \ValueError('Argument #2 ($length) must be greater than 0'); + } + + if (null === $encoding) { + $encoding = mb_internal_encoding(); + } + + if ('UTF-8' === $encoding = self::getEncoding($encoding)) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + } + + $result = []; + $length = mb_strlen($string, $encoding); + + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = mb_substr($string, $i, $split_length, $encoding); + } + + return $result; + } + + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); + } + + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); + } + + public static function mb_substitute_character($c = null) + { + if (null === $c) { + return 'none'; + } + if (0 === strcasecmp($c, 'none')) { + return true; + } + if (80000 > \PHP_VERSION_ID) { + return false; + } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return false; + } + + throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); + } + + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) substr($s, $start, null === $length ? 2147483647 : $length); + } + + if ($start < 0) { + $start = iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string) iconv_substr($s, $start, $length, $encoding); + } + + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ + self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), + self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), + ]); + + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + $pos = strrpos($haystack, $needle); + } else { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + } + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); + $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); + + $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); + $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); + + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) + { + $pos = strpos($haystack, $needle); + if (false === $pos) { + return false; + } + if ($part) { + return substr($haystack, 0, $pos); + } + + return substr($haystack, $pos); + } + + public static function mb_get_info($type = 'all') + { + $info = [ + 'internal_encoding' => self::$internalEncoding, + 'http_output' => 'pass', + 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', + 'func_overload' => 0, + 'func_overload_list' => 'no overload', + 'mail_charset' => 'UTF-8', + 'mail_header_encoding' => 'BASE64', + 'mail_body_encoding' => 'BASE64', + 'illegal_chars' => 0, + 'encoding_translation' => 'Off', + 'language' => self::$language, + 'detect_order' => self::$encodingList, + 'substitute_character' => 'none', + 'strict_detection' => 'Off', + ]; + + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + + return false; + } + + public static function mb_http_input($type = '') + { + return false; + } + + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + + if ('UTF-8' !== $encoding) { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); + + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); + } + + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return substr_count($haystack, $needle); + } + + public static function mb_output_handler($contents, $status) + { + return $contents; + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } + + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string + { + if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); + } + + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given'); + } + + if (self::mb_strlen($pad_string, $encoding) <= 0) { + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + } + + $paddingRequired = $length - self::mb_strlen($string, $encoding); + + if ($paddingRequired < 1) { + return $string; + } + + switch ($pad_type) { + case \STR_PAD_LEFT: + return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; + case \STR_PAD_RIGHT: + return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); + default: + $leftPaddingLength = floor($paddingRequired / 2); + $rightPaddingLength = $paddingRequired - $leftPaddingLength; + + return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); + } + } + + public static function mb_ucfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + public static function mb_lcfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (false === $pos) { + return false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + + return self::mb_substr($haystack, $pos, null, $encoding); + } + + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); + + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xF0 <= $m[$i]) { + $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } elseif (0xE0 <= $m[$i]) { + $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } else { + $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; + } + + $entities .= '&#'.$c.';'; + } + + return $entities; + } + + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } + + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + + $encoding = strtoupper($encoding); + + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + + return $encoding; + } + + public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__); + } + + private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given'); + } + + if ('' === $characters) { + return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding); + } + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $string)) { + $string = @iconv('UTF-8', 'UTF-8//IGNORE', $string); + } + if (null !== $characters && !preg_match('//u', $characters)) { + $characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters); + } + } else { + $string = iconv($encoding, 'UTF-8//IGNORE', $string); + + if (null !== $characters) { + $characters = iconv($encoding, 'UTF-8//IGNORE', $characters); + } + } + + if (null === $characters) { + $characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"; + } else { + $characters = preg_quote($characters); + } + + $string = preg_replace(sprintf($regex, $characters), '', $string); + + if (null === $encoding) { + return $string; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $string); + } + + private static function assertEncoding(string $encoding, string $errorFormat): void + { + try { + $validEncoding = @self::mb_check_encoding('', $encoding); + } catch (\ValueError $e) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + + // BC for PHP 7.3 and lower + if (!$validEncoding) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/README.md b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 0000000000..478b40da25 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php new file mode 100644 index 0000000000..512bba0bfd --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -0,0 +1,119 @@ + 'i̇', + 'µ' => 'μ', + 'ſ' => 's', + 'ͅ' => 'ι', + 'ς' => 'σ', + 'ϐ' => 'β', + 'ϑ' => 'θ', + 'ϕ' => 'φ', + 'ϖ' => 'π', + 'ϰ' => 'κ', + 'ϱ' => 'ρ', + 'ϵ' => 'ε', + 'ẛ' => 'ṡ', + 'ι' => 'ι', + 'ß' => 'ss', + 'ʼn' => 'ʼn', + 'ǰ' => 'ǰ', + 'ΐ' => 'ΐ', + 'ΰ' => 'ΰ', + 'և' => 'եւ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẚ' => 'aʾ', + 'ẞ' => 'ss', + 'ὐ' => 'ὐ', + 'ὒ' => 'ὒ', + 'ὔ' => 'ὔ', + 'ὖ' => 'ὖ', + 'ᾀ' => 'ἀι', + 'ᾁ' => 'ἁι', + 'ᾂ' => 'ἂι', + 'ᾃ' => 'ἃι', + 'ᾄ' => 'ἄι', + 'ᾅ' => 'ἅι', + 'ᾆ' => 'ἆι', + 'ᾇ' => 'ἇι', + 'ᾈ' => 'ἀι', + 'ᾉ' => 'ἁι', + 'ᾊ' => 'ἂι', + 'ᾋ' => 'ἃι', + 'ᾌ' => 'ἄι', + 'ᾍ' => 'ἅι', + 'ᾎ' => 'ἆι', + 'ᾏ' => 'ἇι', + 'ᾐ' => 'ἠι', + 'ᾑ' => 'ἡι', + 'ᾒ' => 'ἢι', + 'ᾓ' => 'ἣι', + 'ᾔ' => 'ἤι', + 'ᾕ' => 'ἥι', + 'ᾖ' => 'ἦι', + 'ᾗ' => 'ἧι', + 'ᾘ' => 'ἠι', + 'ᾙ' => 'ἡι', + 'ᾚ' => 'ἢι', + 'ᾛ' => 'ἣι', + 'ᾜ' => 'ἤι', + 'ᾝ' => 'ἥι', + 'ᾞ' => 'ἦι', + 'ᾟ' => 'ἧι', + 'ᾠ' => 'ὠι', + 'ᾡ' => 'ὡι', + 'ᾢ' => 'ὢι', + 'ᾣ' => 'ὣι', + 'ᾤ' => 'ὤι', + 'ᾥ' => 'ὥι', + 'ᾦ' => 'ὦι', + 'ᾧ' => 'ὧι', + 'ᾨ' => 'ὠι', + 'ᾩ' => 'ὡι', + 'ᾪ' => 'ὢι', + 'ᾫ' => 'ὣι', + 'ᾬ' => 'ὤι', + 'ᾭ' => 'ὥι', + 'ᾮ' => 'ὦι', + 'ᾯ' => 'ὧι', + 'ᾲ' => 'ὰι', + 'ᾳ' => 'αι', + 'ᾴ' => 'άι', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾶι', + 'ᾼ' => 'αι', + 'ῂ' => 'ὴι', + 'ῃ' => 'ηι', + 'ῄ' => 'ήι', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῆι', + 'ῌ' => 'ηι', + 'ῒ' => 'ῒ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'ῢ' => 'ῢ', + 'ῤ' => 'ῤ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'ῲ' => 'ὼι', + 'ῳ' => 'ωι', + 'ῴ' => 'ώι', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῶι', + 'ῼ' => 'ωι', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'մն', + 'ﬔ' => 'մե', + 'ﬕ' => 'մի', + 'ﬖ' => 'վն', + 'ﬗ' => 'մխ', +]; diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 0000000000..fac60b081a --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,1397 @@ + 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Á' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Å' => 'å', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'Ì' => 'ì', + 'Í' => 'í', + 'Î' => 'î', + 'Ï' => 'ï', + 'Ð' => 'ð', + 'Ñ' => 'ñ', + 'Ò' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ý' => 'ý', + 'Þ' => 'þ', + 'Ā' => 'ā', + 'Ă' => 'ă', + 'Ą' => 'ą', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'Ċ' => 'ċ', + 'Č' => 'č', + 'Ď' => 'ď', + 'Đ' => 'đ', + 'Ē' => 'ē', + 'Ĕ' => 'ĕ', + 'Ė' => 'ė', + 'Ę' => 'ę', + 'Ě' => 'ě', + 'Ĝ' => 'ĝ', + 'Ğ' => 'ğ', + 'Ġ' => 'ġ', + 'Ģ' => 'ģ', + 'Ĥ' => 'ĥ', + 'Ħ' => 'ħ', + 'Ĩ' => 'ĩ', + 'Ī' => 'ī', + 'Ĭ' => 'ĭ', + 'Į' => 'į', + 'İ' => 'i̇', + 'IJ' => 'ij', + 'Ĵ' => 'ĵ', + 'Ķ' => 'ķ', + 'Ĺ' => 'ĺ', + 'Ļ' => 'ļ', + 'Ľ' => 'ľ', + 'Ŀ' => 'ŀ', + 'Ł' => 'ł', + 'Ń' => 'ń', + 'Ņ' => 'ņ', + 'Ň' => 'ň', + 'Ŋ' => 'ŋ', + 'Ō' => 'ō', + 'Ŏ' => 'ŏ', + 'Ő' => 'ő', + 'Œ' => 'œ', + 'Ŕ' => 'ŕ', + 'Ŗ' => 'ŗ', + 'Ř' => 'ř', + 'Ś' => 'ś', + 'Ŝ' => 'ŝ', + 'Ş' => 'ş', + 'Š' => 'š', + 'Ţ' => 'ţ', + 'Ť' => 'ť', + 'Ŧ' => 'ŧ', + 'Ũ' => 'ũ', + 'Ū' => 'ū', + 'Ŭ' => 'ŭ', + 'Ů' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Ŵ' => 'ŵ', + 'Ŷ' => 'ŷ', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Ż' => 'ż', + 'Ž' => 'ž', + 'Ɓ' => 'ɓ', + 'Ƃ' => 'ƃ', + 'Ƅ' => 'ƅ', + 'Ɔ' => 'ɔ', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'ɖ', + 'Ɗ' => 'ɗ', + 'Ƌ' => 'ƌ', + 'Ǝ' => 'ǝ', + 'Ə' => 'ə', + 'Ɛ' => 'ɛ', + 'Ƒ' => 'ƒ', + 'Ɠ' => 'ɠ', + 'Ɣ' => 'ɣ', + 'Ɩ' => 'ɩ', + 'Ɨ' => 'ɨ', + 'Ƙ' => 'ƙ', + 'Ɯ' => 'ɯ', + 'Ɲ' => 'ɲ', + 'Ɵ' => 'ɵ', + 'Ơ' => 'ơ', + 'Ƣ' => 'ƣ', + 'Ƥ' => 'ƥ', + 'Ʀ' => 'ʀ', + 'Ƨ' => 'ƨ', + 'Ʃ' => 'ʃ', + 'Ƭ' => 'ƭ', + 'Ʈ' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ʊ', + 'Ʋ' => 'ʋ', + 'Ƴ' => 'ƴ', + 'Ƶ' => 'ƶ', + 'Ʒ' => 'ʒ', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'DŽ' => 'dž', + 'Dž' => 'dž', + 'LJ' => 'lj', + 'Lj' => 'lj', + 'NJ' => 'nj', + 'Nj' => 'nj', + 'Ǎ' => 'ǎ', + 'Ǐ' => 'ǐ', + 'Ǒ' => 'ǒ', + 'Ǔ' => 'ǔ', + 'Ǖ' => 'ǖ', + 'Ǘ' => 'ǘ', + 'Ǚ' => 'ǚ', + 'Ǜ' => 'ǜ', + 'Ǟ' => 'ǟ', + 'Ǡ' => 'ǡ', + 'Ǣ' => 'ǣ', + 'Ǥ' => 'ǥ', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'ǩ', + 'Ǫ' => 'ǫ', + 'Ǭ' => 'ǭ', + 'Ǯ' => 'ǯ', + 'DZ' => 'dz', + 'Dz' => 'dz', + 'Ǵ' => 'ǵ', + 'Ƕ' => 'ƕ', + 'Ƿ' => 'ƿ', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'ǻ', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'ǿ', + 'Ȁ' => 'ȁ', + 'Ȃ' => 'ȃ', + 'Ȅ' => 'ȅ', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'Ȋ' => 'ȋ', + 'Ȍ' => 'ȍ', + 'Ȏ' => 'ȏ', + 'Ȑ' => 'ȑ', + 'Ȓ' => 'ȓ', + 'Ȕ' => 'ȕ', + 'Ȗ' => 'ȗ', + 'Ș' => 'ș', + 'Ț' => 'ț', + 'Ȝ' => 'ȝ', + 'Ȟ' => 'ȟ', + 'Ƞ' => 'ƞ', + 'Ȣ' => 'ȣ', + 'Ȥ' => 'ȥ', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'ȩ', + 'Ȫ' => 'ȫ', + 'Ȭ' => 'ȭ', + 'Ȯ' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ⱥ' => 'ⱥ', + 'Ȼ' => 'ȼ', + 'Ƚ' => 'ƚ', + 'Ⱦ' => 'ⱦ', + 'Ɂ' => 'ɂ', + 'Ƀ' => 'ƀ', + 'Ʉ' => 'ʉ', + 'Ʌ' => 'ʌ', + 'Ɇ' => 'ɇ', + 'Ɉ' => 'ɉ', + 'Ɋ' => 'ɋ', + 'Ɍ' => 'ɍ', + 'Ɏ' => 'ɏ', + 'Ͱ' => 'ͱ', + 'Ͳ' => 'ͳ', + 'Ͷ' => 'ͷ', + 'Ϳ' => 'ϳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'Ό' => 'ό', + 'Ύ' => 'ύ', + 'Ώ' => 'ώ', + 'Α' => 'α', + 'Β' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Ν' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'π', + 'Ρ' => 'ρ', + 'Σ' => 'σ', + 'Τ' => 'τ', + 'Υ' => 'υ', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ϊ', + 'Ϋ' => 'ϋ', + 'Ϗ' => 'ϗ', + 'Ϙ' => 'ϙ', + 'Ϛ' => 'ϛ', + 'Ϝ' => 'ϝ', + 'Ϟ' => 'ϟ', + 'Ϡ' => 'ϡ', + 'Ϣ' => 'ϣ', + 'Ϥ' => 'ϥ', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'ϩ', + 'Ϫ' => 'ϫ', + 'Ϭ' => 'ϭ', + 'Ϯ' => 'ϯ', + 'ϴ' => 'θ', + 'Ϸ' => 'ϸ', + 'Ϲ' => 'ϲ', + 'Ϻ' => 'ϻ', + 'Ͻ' => 'ͻ', + 'Ͼ' => 'ͼ', + 'Ͽ' => 'ͽ', + 'Ѐ' => 'ѐ', + 'Ё' => 'ё', + 'Ђ' => 'ђ', + 'Ѓ' => 'ѓ', + 'Є' => 'є', + 'Ѕ' => 'ѕ', + 'І' => 'і', + 'Ї' => 'ї', + 'Ј' => 'ј', + 'Љ' => 'љ', + 'Њ' => 'њ', + 'Ћ' => 'ћ', + 'Ќ' => 'ќ', + 'Ѝ' => 'ѝ', + 'Ў' => 'ў', + 'Џ' => 'џ', + 'А' => 'а', + 'Б' => 'б', + 'В' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Н' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'р', + 'С' => 'с', + 'Т' => 'т', + 'У' => 'у', + 'Ф' => 'ф', + 'Х' => 'х', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ъ', + 'Ы' => 'ы', + 'Ь' => 'ь', + 'Э' => 'э', + 'Ю' => 'ю', + 'Я' => 'я', + 'Ѡ' => 'ѡ', + 'Ѣ' => 'ѣ', + 'Ѥ' => 'ѥ', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'ѩ', + 'Ѫ' => 'ѫ', + 'Ѭ' => 'ѭ', + 'Ѯ' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ѵ' => 'ѵ', + 'Ѷ' => 'ѷ', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'ѻ', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'ѿ', + 'Ҁ' => 'ҁ', + 'Ҋ' => 'ҋ', + 'Ҍ' => 'ҍ', + 'Ҏ' => 'ҏ', + 'Ґ' => 'ґ', + 'Ғ' => 'ғ', + 'Ҕ' => 'ҕ', + 'Җ' => 'җ', + 'Ҙ' => 'ҙ', + 'Қ' => 'қ', + 'Ҝ' => 'ҝ', + 'Ҟ' => 'ҟ', + 'Ҡ' => 'ҡ', + 'Ң' => 'ң', + 'Ҥ' => 'ҥ', + 'Ҧ' => 'ҧ', + 'Ҩ' => 'ҩ', + 'Ҫ' => 'ҫ', + 'Ҭ' => 'ҭ', + 'Ү' => 'ү', + 'Ұ' => 'ұ', + 'Ҳ' => 'ҳ', + 'Ҵ' => 'ҵ', + 'Ҷ' => 'ҷ', + 'Ҹ' => 'ҹ', + 'Һ' => 'һ', + 'Ҽ' => 'ҽ', + 'Ҿ' => 'ҿ', + 'Ӏ' => 'ӏ', + 'Ӂ' => 'ӂ', + 'Ӄ' => 'ӄ', + 'Ӆ' => 'ӆ', + 'Ӈ' => 'ӈ', + 'Ӊ' => 'ӊ', + 'Ӌ' => 'ӌ', + 'Ӎ' => 'ӎ', + 'Ӑ' => 'ӑ', + 'Ӓ' => 'ӓ', + 'Ӕ' => 'ӕ', + 'Ӗ' => 'ӗ', + 'Ә' => 'ә', + 'Ӛ' => 'ӛ', + 'Ӝ' => 'ӝ', + 'Ӟ' => 'ӟ', + 'Ӡ' => 'ӡ', + 'Ӣ' => 'ӣ', + 'Ӥ' => 'ӥ', + 'Ӧ' => 'ӧ', + 'Ө' => 'ө', + 'Ӫ' => 'ӫ', + 'Ӭ' => 'ӭ', + 'Ӯ' => 'ӯ', + 'Ӱ' => 'ӱ', + 'Ӳ' => 'ӳ', + 'Ӵ' => 'ӵ', + 'Ӷ' => 'ӷ', + 'Ӹ' => 'ӹ', + 'Ӻ' => 'ӻ', + 'Ӽ' => 'ӽ', + 'Ӿ' => 'ӿ', + 'Ԁ' => 'ԁ', + 'Ԃ' => 'ԃ', + 'Ԅ' => 'ԅ', + 'Ԇ' => 'ԇ', + 'Ԉ' => 'ԉ', + 'Ԋ' => 'ԋ', + 'Ԍ' => 'ԍ', + 'Ԏ' => 'ԏ', + 'Ԑ' => 'ԑ', + 'Ԓ' => 'ԓ', + 'Ԕ' => 'ԕ', + 'Ԗ' => 'ԗ', + 'Ԙ' => 'ԙ', + 'Ԛ' => 'ԛ', + 'Ԝ' => 'ԝ', + 'Ԟ' => 'ԟ', + 'Ԡ' => 'ԡ', + 'Ԣ' => 'ԣ', + 'Ԥ' => 'ԥ', + 'Ԧ' => 'ԧ', + 'Ԩ' => 'ԩ', + 'Ԫ' => 'ԫ', + 'Ԭ' => 'ԭ', + 'Ԯ' => 'ԯ', + 'Ա' => 'ա', + 'Բ' => 'բ', + 'Գ' => 'գ', + 'Դ' => 'դ', + 'Ե' => 'ե', + 'Զ' => 'զ', + 'Է' => 'է', + 'Ը' => 'ը', + 'Թ' => 'թ', + 'Ժ' => 'ժ', + 'Ի' => 'ի', + 'Լ' => 'լ', + 'Խ' => 'խ', + 'Ծ' => 'ծ', + 'Կ' => 'կ', + 'Հ' => 'հ', + 'Ձ' => 'ձ', + 'Ղ' => 'ղ', + 'Ճ' => 'ճ', + 'Մ' => 'մ', + 'Յ' => 'յ', + 'Ն' => 'ն', + 'Շ' => 'շ', + 'Ո' => 'ո', + 'Չ' => 'չ', + 'Պ' => 'պ', + 'Ջ' => 'ջ', + 'Ռ' => 'ռ', + 'Ս' => 'ս', + 'Վ' => 'վ', + 'Տ' => 'տ', + 'Ր' => 'ր', + 'Ց' => 'ց', + 'Ւ' => 'ւ', + 'Փ' => 'փ', + 'Ք' => 'ք', + 'Օ' => 'օ', + 'Ֆ' => 'ֆ', + 'Ⴀ' => 'ⴀ', + 'Ⴁ' => 'ⴁ', + 'Ⴂ' => 'ⴂ', + 'Ⴃ' => 'ⴃ', + 'Ⴄ' => 'ⴄ', + 'Ⴅ' => 'ⴅ', + 'Ⴆ' => 'ⴆ', + 'Ⴇ' => 'ⴇ', + 'Ⴈ' => 'ⴈ', + 'Ⴉ' => 'ⴉ', + 'Ⴊ' => 'ⴊ', + 'Ⴋ' => 'ⴋ', + 'Ⴌ' => 'ⴌ', + 'Ⴍ' => 'ⴍ', + 'Ⴎ' => 'ⴎ', + 'Ⴏ' => 'ⴏ', + 'Ⴐ' => 'ⴐ', + 'Ⴑ' => 'ⴑ', + 'Ⴒ' => 'ⴒ', + 'Ⴓ' => 'ⴓ', + 'Ⴔ' => 'ⴔ', + 'Ⴕ' => 'ⴕ', + 'Ⴖ' => 'ⴖ', + 'Ⴗ' => 'ⴗ', + 'Ⴘ' => 'ⴘ', + 'Ⴙ' => 'ⴙ', + 'Ⴚ' => 'ⴚ', + 'Ⴛ' => 'ⴛ', + 'Ⴜ' => 'ⴜ', + 'Ⴝ' => 'ⴝ', + 'Ⴞ' => 'ⴞ', + 'Ⴟ' => 'ⴟ', + 'Ⴠ' => 'ⴠ', + 'Ⴡ' => 'ⴡ', + 'Ⴢ' => 'ⴢ', + 'Ⴣ' => 'ⴣ', + 'Ⴤ' => 'ⴤ', + 'Ⴥ' => 'ⴥ', + 'Ⴧ' => 'ⴧ', + 'Ⴭ' => 'ⴭ', + 'Ꭰ' => 'ꭰ', + 'Ꭱ' => 'ꭱ', + 'Ꭲ' => 'ꭲ', + 'Ꭳ' => 'ꭳ', + 'Ꭴ' => 'ꭴ', + 'Ꭵ' => 'ꭵ', + 'Ꭶ' => 'ꭶ', + 'Ꭷ' => 'ꭷ', + 'Ꭸ' => 'ꭸ', + 'Ꭹ' => 'ꭹ', + 'Ꭺ' => 'ꭺ', + 'Ꭻ' => 'ꭻ', + 'Ꭼ' => 'ꭼ', + 'Ꭽ' => 'ꭽ', + 'Ꭾ' => 'ꭾ', + 'Ꭿ' => 'ꭿ', + 'Ꮀ' => 'ꮀ', + 'Ꮁ' => 'ꮁ', + 'Ꮂ' => 'ꮂ', + 'Ꮃ' => 'ꮃ', + 'Ꮄ' => 'ꮄ', + 'Ꮅ' => 'ꮅ', + 'Ꮆ' => 'ꮆ', + 'Ꮇ' => 'ꮇ', + 'Ꮈ' => 'ꮈ', + 'Ꮉ' => 'ꮉ', + 'Ꮊ' => 'ꮊ', + 'Ꮋ' => 'ꮋ', + 'Ꮌ' => 'ꮌ', + 'Ꮍ' => 'ꮍ', + 'Ꮎ' => 'ꮎ', + 'Ꮏ' => 'ꮏ', + 'Ꮐ' => 'ꮐ', + 'Ꮑ' => 'ꮑ', + 'Ꮒ' => 'ꮒ', + 'Ꮓ' => 'ꮓ', + 'Ꮔ' => 'ꮔ', + 'Ꮕ' => 'ꮕ', + 'Ꮖ' => 'ꮖ', + 'Ꮗ' => 'ꮗ', + 'Ꮘ' => 'ꮘ', + 'Ꮙ' => 'ꮙ', + 'Ꮚ' => 'ꮚ', + 'Ꮛ' => 'ꮛ', + 'Ꮜ' => 'ꮜ', + 'Ꮝ' => 'ꮝ', + 'Ꮞ' => 'ꮞ', + 'Ꮟ' => 'ꮟ', + 'Ꮠ' => 'ꮠ', + 'Ꮡ' => 'ꮡ', + 'Ꮢ' => 'ꮢ', + 'Ꮣ' => 'ꮣ', + 'Ꮤ' => 'ꮤ', + 'Ꮥ' => 'ꮥ', + 'Ꮦ' => 'ꮦ', + 'Ꮧ' => 'ꮧ', + 'Ꮨ' => 'ꮨ', + 'Ꮩ' => 'ꮩ', + 'Ꮪ' => 'ꮪ', + 'Ꮫ' => 'ꮫ', + 'Ꮬ' => 'ꮬ', + 'Ꮭ' => 'ꮭ', + 'Ꮮ' => 'ꮮ', + 'Ꮯ' => 'ꮯ', + 'Ꮰ' => 'ꮰ', + 'Ꮱ' => 'ꮱ', + 'Ꮲ' => 'ꮲ', + 'Ꮳ' => 'ꮳ', + 'Ꮴ' => 'ꮴ', + 'Ꮵ' => 'ꮵ', + 'Ꮶ' => 'ꮶ', + 'Ꮷ' => 'ꮷ', + 'Ꮸ' => 'ꮸ', + 'Ꮹ' => 'ꮹ', + 'Ꮺ' => 'ꮺ', + 'Ꮻ' => 'ꮻ', + 'Ꮼ' => 'ꮼ', + 'Ꮽ' => 'ꮽ', + 'Ꮾ' => 'ꮾ', + 'Ꮿ' => 'ꮿ', + 'Ᏸ' => 'ᏸ', + 'Ᏹ' => 'ᏹ', + 'Ᏺ' => 'ᏺ', + 'Ᏻ' => 'ᏻ', + 'Ᏼ' => 'ᏼ', + 'Ᏽ' => 'ᏽ', + 'Ა' => 'ა', + 'Ბ' => 'ბ', + 'Გ' => 'გ', + 'Დ' => 'დ', + 'Ე' => 'ე', + 'Ვ' => 'ვ', + 'Ზ' => 'ზ', + 'Თ' => 'თ', + 'Ი' => 'ი', + 'Კ' => 'კ', + 'Ლ' => 'ლ', + 'Მ' => 'მ', + 'Ნ' => 'ნ', + 'Ო' => 'ო', + 'Პ' => 'პ', + 'Ჟ' => 'ჟ', + 'Რ' => 'რ', + 'Ს' => 'ს', + 'Ტ' => 'ტ', + 'Უ' => 'უ', + 'Ფ' => 'ფ', + 'Ქ' => 'ქ', + 'Ღ' => 'ღ', + 'Ყ' => 'ყ', + 'Შ' => 'შ', + 'Ჩ' => 'ჩ', + 'Ც' => 'ც', + 'Ძ' => 'ძ', + 'Წ' => 'წ', + 'Ჭ' => 'ჭ', + 'Ხ' => 'ხ', + 'Ჯ' => 'ჯ', + 'Ჰ' => 'ჰ', + 'Ჱ' => 'ჱ', + 'Ჲ' => 'ჲ', + 'Ჳ' => 'ჳ', + 'Ჴ' => 'ჴ', + 'Ჵ' => 'ჵ', + 'Ჶ' => 'ჶ', + 'Ჷ' => 'ჷ', + 'Ჸ' => 'ჸ', + 'Ჹ' => 'ჹ', + 'Ჺ' => 'ჺ', + 'Ჽ' => 'ჽ', + 'Ჾ' => 'ჾ', + 'Ჿ' => 'ჿ', + 'Ḁ' => 'ḁ', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'ḍ', + 'Ḏ' => 'ḏ', + 'Ḑ' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'ḝ', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'Ṁ' => 'ṁ', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'ṅ', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'ṍ', + 'Ṏ' => 'ṏ', + 'Ṑ' => 'ṑ', + 'Ṓ' => 'ṓ', + 'Ṕ' => 'ṕ', + 'Ṗ' => 'ṗ', + 'Ṙ' => 'ṙ', + 'Ṛ' => 'ṛ', + 'Ṝ' => 'ṝ', + 'Ṟ' => 'ṟ', + 'Ṡ' => 'ṡ', + 'Ṣ' => 'ṣ', + 'Ṥ' => 'ṥ', + 'Ṧ' => 'ṧ', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'ṭ', + 'Ṯ' => 'ṯ', + 'Ṱ' => 'ṱ', + 'Ṳ' => 'ṳ', + 'Ṵ' => 'ṵ', + 'Ṷ' => 'ṷ', + 'Ṹ' => 'ṹ', + 'Ṻ' => 'ṻ', + 'Ṽ' => 'ṽ', + 'Ṿ' => 'ṿ', + 'Ẁ' => 'ẁ', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'ẍ', + 'Ẏ' => 'ẏ', + 'Ẑ' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'ẞ' => 'ß', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'ề', + 'Ể' => 'ể', + 'Ễ' => 'ễ', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'ọ', + 'Ỏ' => 'ỏ', + 'Ố' => 'ố', + 'Ồ' => 'ồ', + 'Ổ' => 'ổ', + 'Ỗ' => 'ỗ', + 'Ộ' => 'ộ', + 'Ớ' => 'ớ', + 'Ờ' => 'ờ', + 'Ở' => 'ở', + 'Ỡ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'ủ', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'ử', + 'Ữ' => 'ữ', + 'Ự' => 'ự', + 'Ỳ' => 'ỳ', + 'Ỵ' => 'ỵ', + 'Ỷ' => 'ỷ', + 'Ỹ' => 'ỹ', + 'Ỻ' => 'ỻ', + 'Ỽ' => 'ỽ', + 'Ỿ' => 'ỿ', + 'Ἀ' => 'ἀ', + 'Ἁ' => 'ἁ', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'Ἅ' => 'ἅ', + 'Ἆ' => 'ἆ', + 'Ἇ' => 'ἇ', + 'Ἐ' => 'ἐ', + 'Ἑ' => 'ἑ', + 'Ἒ' => 'ἒ', + 'Ἓ' => 'ἓ', + 'Ἔ' => 'ἔ', + 'Ἕ' => 'ἕ', + 'Ἠ' => 'ἠ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'ἢ', + 'Ἣ' => 'ἣ', + 'Ἤ' => 'ἤ', + 'Ἥ' => 'ἥ', + 'Ἦ' => 'ἦ', + 'Ἧ' => 'ἧ', + 'Ἰ' => 'ἰ', + 'Ἱ' => 'ἱ', + 'Ἲ' => 'ἲ', + 'Ἳ' => 'ἳ', + 'Ἴ' => 'ἴ', + 'Ἵ' => 'ἵ', + 'Ἶ' => 'ἶ', + 'Ἷ' => 'ἷ', + 'Ὀ' => 'ὀ', + 'Ὁ' => 'ὁ', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'Ὅ' => 'ὅ', + 'Ὑ' => 'ὑ', + 'Ὓ' => 'ὓ', + 'Ὕ' => 'ὕ', + 'Ὗ' => 'ὗ', + 'Ὠ' => 'ὠ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'ὢ', + 'Ὣ' => 'ὣ', + 'Ὤ' => 'ὤ', + 'Ὥ' => 'ὥ', + 'Ὦ' => 'ὦ', + 'Ὧ' => 'ὧ', + 'ᾈ' => 'ᾀ', + 'ᾉ' => 'ᾁ', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'ᾍ' => 'ᾅ', + 'ᾎ' => 'ᾆ', + 'ᾏ' => 'ᾇ', + 'ᾘ' => 'ᾐ', + 'ᾙ' => 'ᾑ', + 'ᾚ' => 'ᾒ', + 'ᾛ' => 'ᾓ', + 'ᾜ' => 'ᾔ', + 'ᾝ' => 'ᾕ', + 'ᾞ' => 'ᾖ', + 'ᾟ' => 'ᾗ', + 'ᾨ' => 'ᾠ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'ᾢ', + 'ᾫ' => 'ᾣ', + 'ᾬ' => 'ᾤ', + 'ᾭ' => 'ᾥ', + 'ᾮ' => 'ᾦ', + 'ᾯ' => 'ᾧ', + 'Ᾰ' => 'ᾰ', + 'Ᾱ' => 'ᾱ', + 'Ὰ' => 'ὰ', + 'Ά' => 'ά', + 'ᾼ' => 'ᾳ', + 'Ὲ' => 'ὲ', + 'Έ' => 'έ', + 'Ὴ' => 'ὴ', + 'Ή' => 'ή', + 'ῌ' => 'ῃ', + 'Ῐ' => 'ῐ', + 'Ῑ' => 'ῑ', + 'Ὶ' => 'ὶ', + 'Ί' => 'ί', + 'Ῠ' => 'ῠ', + 'Ῡ' => 'ῡ', + 'Ὺ' => 'ὺ', + 'Ύ' => 'ύ', + 'Ῥ' => 'ῥ', + 'Ὸ' => 'ὸ', + 'Ό' => 'ό', + 'Ὼ' => 'ὼ', + 'Ώ' => 'ώ', + 'ῼ' => 'ῳ', + 'Ω' => 'ω', + 'K' => 'k', + 'Å' => 'å', + 'Ⅎ' => 'ⅎ', + 'Ⅰ' => 'ⅰ', + 'Ⅱ' => 'ⅱ', + 'Ⅲ' => 'ⅲ', + 'Ⅳ' => 'ⅳ', + 'Ⅴ' => 'ⅴ', + 'Ⅵ' => 'ⅵ', + 'Ⅶ' => 'ⅶ', + 'Ⅷ' => 'ⅷ', + 'Ⅸ' => 'ⅸ', + 'Ⅹ' => 'ⅹ', + 'Ⅺ' => 'ⅺ', + 'Ⅻ' => 'ⅻ', + 'Ⅼ' => 'ⅼ', + 'Ⅽ' => 'ⅽ', + 'Ⅾ' => 'ⅾ', + 'Ⅿ' => 'ⅿ', + 'Ↄ' => 'ↄ', + 'Ⓐ' => 'ⓐ', + 'Ⓑ' => 'ⓑ', + 'Ⓒ' => 'ⓒ', + 'Ⓓ' => 'ⓓ', + 'Ⓔ' => 'ⓔ', + 'Ⓕ' => 'ⓕ', + 'Ⓖ' => 'ⓖ', + 'Ⓗ' => 'ⓗ', + 'Ⓘ' => 'ⓘ', + 'Ⓙ' => 'ⓙ', + 'Ⓚ' => 'ⓚ', + 'Ⓛ' => 'ⓛ', + 'Ⓜ' => 'ⓜ', + 'Ⓝ' => 'ⓝ', + 'Ⓞ' => 'ⓞ', + 'Ⓟ' => 'ⓟ', + 'Ⓠ' => 'ⓠ', + 'Ⓡ' => 'ⓡ', + 'Ⓢ' => 'ⓢ', + 'Ⓣ' => 'ⓣ', + 'Ⓤ' => 'ⓤ', + 'Ⓥ' => 'ⓥ', + 'Ⓦ' => 'ⓦ', + 'Ⓧ' => 'ⓧ', + 'Ⓨ' => 'ⓨ', + 'Ⓩ' => 'ⓩ', + 'Ⰰ' => 'ⰰ', + 'Ⰱ' => 'ⰱ', + 'Ⰲ' => 'ⰲ', + 'Ⰳ' => 'ⰳ', + 'Ⰴ' => 'ⰴ', + 'Ⰵ' => 'ⰵ', + 'Ⰶ' => 'ⰶ', + 'Ⰷ' => 'ⰷ', + 'Ⰸ' => 'ⰸ', + 'Ⰹ' => 'ⰹ', + 'Ⰺ' => 'ⰺ', + 'Ⰻ' => 'ⰻ', + 'Ⰼ' => 'ⰼ', + 'Ⰽ' => 'ⰽ', + 'Ⰾ' => 'ⰾ', + 'Ⰿ' => 'ⰿ', + 'Ⱀ' => 'ⱀ', + 'Ⱁ' => 'ⱁ', + 'Ⱂ' => 'ⱂ', + 'Ⱃ' => 'ⱃ', + 'Ⱄ' => 'ⱄ', + 'Ⱅ' => 'ⱅ', + 'Ⱆ' => 'ⱆ', + 'Ⱇ' => 'ⱇ', + 'Ⱈ' => 'ⱈ', + 'Ⱉ' => 'ⱉ', + 'Ⱊ' => 'ⱊ', + 'Ⱋ' => 'ⱋ', + 'Ⱌ' => 'ⱌ', + 'Ⱍ' => 'ⱍ', + 'Ⱎ' => 'ⱎ', + 'Ⱏ' => 'ⱏ', + 'Ⱐ' => 'ⱐ', + 'Ⱑ' => 'ⱑ', + 'Ⱒ' => 'ⱒ', + 'Ⱓ' => 'ⱓ', + 'Ⱔ' => 'ⱔ', + 'Ⱕ' => 'ⱕ', + 'Ⱖ' => 'ⱖ', + 'Ⱗ' => 'ⱗ', + 'Ⱘ' => 'ⱘ', + 'Ⱙ' => 'ⱙ', + 'Ⱚ' => 'ⱚ', + 'Ⱛ' => 'ⱛ', + 'Ⱜ' => 'ⱜ', + 'Ⱝ' => 'ⱝ', + 'Ⱞ' => 'ⱞ', + 'Ⱡ' => 'ⱡ', + 'Ɫ' => 'ɫ', + 'Ᵽ' => 'ᵽ', + 'Ɽ' => 'ɽ', + 'Ⱨ' => 'ⱨ', + 'Ⱪ' => 'ⱪ', + 'Ⱬ' => 'ⱬ', + 'Ɑ' => 'ɑ', + 'Ɱ' => 'ɱ', + 'Ɐ' => 'ɐ', + 'Ɒ' => 'ɒ', + 'Ⱳ' => 'ⱳ', + 'Ⱶ' => 'ⱶ', + 'Ȿ' => 'ȿ', + 'Ɀ' => 'ɀ', + 'Ⲁ' => 'ⲁ', + 'Ⲃ' => 'ⲃ', + 'Ⲅ' => 'ⲅ', + 'Ⲇ' => 'ⲇ', + 'Ⲉ' => 'ⲉ', + 'Ⲋ' => 'ⲋ', + 'Ⲍ' => 'ⲍ', + 'Ⲏ' => 'ⲏ', + 'Ⲑ' => 'ⲑ', + 'Ⲓ' => 'ⲓ', + 'Ⲕ' => 'ⲕ', + 'Ⲗ' => 'ⲗ', + 'Ⲙ' => 'ⲙ', + 'Ⲛ' => 'ⲛ', + 'Ⲝ' => 'ⲝ', + 'Ⲟ' => 'ⲟ', + 'Ⲡ' => 'ⲡ', + 'Ⲣ' => 'ⲣ', + 'Ⲥ' => 'ⲥ', + 'Ⲧ' => 'ⲧ', + 'Ⲩ' => 'ⲩ', + 'Ⲫ' => 'ⲫ', + 'Ⲭ' => 'ⲭ', + 'Ⲯ' => 'ⲯ', + 'Ⲱ' => 'ⲱ', + 'Ⲳ' => 'ⲳ', + 'Ⲵ' => 'ⲵ', + 'Ⲷ' => 'ⲷ', + 'Ⲹ' => 'ⲹ', + 'Ⲻ' => 'ⲻ', + 'Ⲽ' => 'ⲽ', + 'Ⲿ' => 'ⲿ', + 'Ⳁ' => 'ⳁ', + 'Ⳃ' => 'ⳃ', + 'Ⳅ' => 'ⳅ', + 'Ⳇ' => 'ⳇ', + 'Ⳉ' => 'ⳉ', + 'Ⳋ' => 'ⳋ', + 'Ⳍ' => 'ⳍ', + 'Ⳏ' => 'ⳏ', + 'Ⳑ' => 'ⳑ', + 'Ⳓ' => 'ⳓ', + 'Ⳕ' => 'ⳕ', + 'Ⳗ' => 'ⳗ', + 'Ⳙ' => 'ⳙ', + 'Ⳛ' => 'ⳛ', + 'Ⳝ' => 'ⳝ', + 'Ⳟ' => 'ⳟ', + 'Ⳡ' => 'ⳡ', + 'Ⳣ' => 'ⳣ', + 'Ⳬ' => 'ⳬ', + 'Ⳮ' => 'ⳮ', + 'Ⳳ' => 'ⳳ', + 'Ꙁ' => 'ꙁ', + 'Ꙃ' => 'ꙃ', + 'Ꙅ' => 'ꙅ', + 'Ꙇ' => 'ꙇ', + 'Ꙉ' => 'ꙉ', + 'Ꙋ' => 'ꙋ', + 'Ꙍ' => 'ꙍ', + 'Ꙏ' => 'ꙏ', + 'Ꙑ' => 'ꙑ', + 'Ꙓ' => 'ꙓ', + 'Ꙕ' => 'ꙕ', + 'Ꙗ' => 'ꙗ', + 'Ꙙ' => 'ꙙ', + 'Ꙛ' => 'ꙛ', + 'Ꙝ' => 'ꙝ', + 'Ꙟ' => 'ꙟ', + 'Ꙡ' => 'ꙡ', + 'Ꙣ' => 'ꙣ', + 'Ꙥ' => 'ꙥ', + 'Ꙧ' => 'ꙧ', + 'Ꙩ' => 'ꙩ', + 'Ꙫ' => 'ꙫ', + 'Ꙭ' => 'ꙭ', + 'Ꚁ' => 'ꚁ', + 'Ꚃ' => 'ꚃ', + 'Ꚅ' => 'ꚅ', + 'Ꚇ' => 'ꚇ', + 'Ꚉ' => 'ꚉ', + 'Ꚋ' => 'ꚋ', + 'Ꚍ' => 'ꚍ', + 'Ꚏ' => 'ꚏ', + 'Ꚑ' => 'ꚑ', + 'Ꚓ' => 'ꚓ', + 'Ꚕ' => 'ꚕ', + 'Ꚗ' => 'ꚗ', + 'Ꚙ' => 'ꚙ', + 'Ꚛ' => 'ꚛ', + 'Ꜣ' => 'ꜣ', + 'Ꜥ' => 'ꜥ', + 'Ꜧ' => 'ꜧ', + 'Ꜩ' => 'ꜩ', + 'Ꜫ' => 'ꜫ', + 'Ꜭ' => 'ꜭ', + 'Ꜯ' => 'ꜯ', + 'Ꜳ' => 'ꜳ', + 'Ꜵ' => 'ꜵ', + 'Ꜷ' => 'ꜷ', + 'Ꜹ' => 'ꜹ', + 'Ꜻ' => 'ꜻ', + 'Ꜽ' => 'ꜽ', + 'Ꜿ' => 'ꜿ', + 'Ꝁ' => 'ꝁ', + 'Ꝃ' => 'ꝃ', + 'Ꝅ' => 'ꝅ', + 'Ꝇ' => 'ꝇ', + 'Ꝉ' => 'ꝉ', + 'Ꝋ' => 'ꝋ', + 'Ꝍ' => 'ꝍ', + 'Ꝏ' => 'ꝏ', + 'Ꝑ' => 'ꝑ', + 'Ꝓ' => 'ꝓ', + 'Ꝕ' => 'ꝕ', + 'Ꝗ' => 'ꝗ', + 'Ꝙ' => 'ꝙ', + 'Ꝛ' => 'ꝛ', + 'Ꝝ' => 'ꝝ', + 'Ꝟ' => 'ꝟ', + 'Ꝡ' => 'ꝡ', + 'Ꝣ' => 'ꝣ', + 'Ꝥ' => 'ꝥ', + 'Ꝧ' => 'ꝧ', + 'Ꝩ' => 'ꝩ', + 'Ꝫ' => 'ꝫ', + 'Ꝭ' => 'ꝭ', + 'Ꝯ' => 'ꝯ', + 'Ꝺ' => 'ꝺ', + 'Ꝼ' => 'ꝼ', + 'Ᵹ' => 'ᵹ', + 'Ꝿ' => 'ꝿ', + 'Ꞁ' => 'ꞁ', + 'Ꞃ' => 'ꞃ', + 'Ꞅ' => 'ꞅ', + 'Ꞇ' => 'ꞇ', + 'Ꞌ' => 'ꞌ', + 'Ɥ' => 'ɥ', + 'Ꞑ' => 'ꞑ', + 'Ꞓ' => 'ꞓ', + 'Ꞗ' => 'ꞗ', + 'Ꞙ' => 'ꞙ', + 'Ꞛ' => 'ꞛ', + 'Ꞝ' => 'ꞝ', + 'Ꞟ' => 'ꞟ', + 'Ꞡ' => 'ꞡ', + 'Ꞣ' => 'ꞣ', + 'Ꞥ' => 'ꞥ', + 'Ꞧ' => 'ꞧ', + 'Ꞩ' => 'ꞩ', + 'Ɦ' => 'ɦ', + 'Ɜ' => 'ɜ', + 'Ɡ' => 'ɡ', + 'Ɬ' => 'ɬ', + 'Ɪ' => 'ɪ', + 'Ʞ' => 'ʞ', + 'Ʇ' => 'ʇ', + 'Ʝ' => 'ʝ', + 'Ꭓ' => 'ꭓ', + 'Ꞵ' => 'ꞵ', + 'Ꞷ' => 'ꞷ', + 'Ꞹ' => 'ꞹ', + 'Ꞻ' => 'ꞻ', + 'Ꞽ' => 'ꞽ', + 'Ꞿ' => 'ꞿ', + 'Ꟃ' => 'ꟃ', + 'Ꞔ' => 'ꞔ', + 'Ʂ' => 'ʂ', + 'Ᶎ' => 'ᶎ', + 'Ꟈ' => 'ꟈ', + 'Ꟊ' => 'ꟊ', + 'Ꟶ' => 'ꟶ', + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + '𐐀' => '𐐨', + '𐐁' => '𐐩', + '𐐂' => '𐐪', + '𐐃' => '𐐫', + '𐐄' => '𐐬', + '𐐅' => '𐐭', + '𐐆' => '𐐮', + '𐐇' => '𐐯', + '𐐈' => '𐐰', + '𐐉' => '𐐱', + '𐐊' => '𐐲', + '𐐋' => '𐐳', + '𐐌' => '𐐴', + '𐐍' => '𐐵', + '𐐎' => '𐐶', + '𐐏' => '𐐷', + '𐐐' => '𐐸', + '𐐑' => '𐐹', + '𐐒' => '𐐺', + '𐐓' => '𐐻', + '𐐔' => '𐐼', + '𐐕' => '𐐽', + '𐐖' => '𐐾', + '𐐗' => '𐐿', + '𐐘' => '𐑀', + '𐐙' => '𐑁', + '𐐚' => '𐑂', + '𐐛' => '𐑃', + '𐐜' => '𐑄', + '𐐝' => '𐑅', + '𐐞' => '𐑆', + '𐐟' => '𐑇', + '𐐠' => '𐑈', + '𐐡' => '𐑉', + '𐐢' => '𐑊', + '𐐣' => '𐑋', + '𐐤' => '𐑌', + '𐐥' => '𐑍', + '𐐦' => '𐑎', + '𐐧' => '𐑏', + '𐒰' => '𐓘', + '𐒱' => '𐓙', + '𐒲' => '𐓚', + '𐒳' => '𐓛', + '𐒴' => '𐓜', + '𐒵' => '𐓝', + '𐒶' => '𐓞', + '𐒷' => '𐓟', + '𐒸' => '𐓠', + '𐒹' => '𐓡', + '𐒺' => '𐓢', + '𐒻' => '𐓣', + '𐒼' => '𐓤', + '𐒽' => '𐓥', + '𐒾' => '𐓦', + '𐒿' => '𐓧', + '𐓀' => '𐓨', + '𐓁' => '𐓩', + '𐓂' => '𐓪', + '𐓃' => '𐓫', + '𐓄' => '𐓬', + '𐓅' => '𐓭', + '𐓆' => '𐓮', + '𐓇' => '𐓯', + '𐓈' => '𐓰', + '𐓉' => '𐓱', + '𐓊' => '𐓲', + '𐓋' => '𐓳', + '𐓌' => '𐓴', + '𐓍' => '𐓵', + '𐓎' => '𐓶', + '𐓏' => '𐓷', + '𐓐' => '𐓸', + '𐓑' => '𐓹', + '𐓒' => '𐓺', + '𐓓' => '𐓻', + '𐲀' => '𐳀', + '𐲁' => '𐳁', + '𐲂' => '𐳂', + '𐲃' => '𐳃', + '𐲄' => '𐳄', + '𐲅' => '𐳅', + '𐲆' => '𐳆', + '𐲇' => '𐳇', + '𐲈' => '𐳈', + '𐲉' => '𐳉', + '𐲊' => '𐳊', + '𐲋' => '𐳋', + '𐲌' => '𐳌', + '𐲍' => '𐳍', + '𐲎' => '𐳎', + '𐲏' => '𐳏', + '𐲐' => '𐳐', + '𐲑' => '𐳑', + '𐲒' => '𐳒', + '𐲓' => '𐳓', + '𐲔' => '𐳔', + '𐲕' => '𐳕', + '𐲖' => '𐳖', + '𐲗' => '𐳗', + '𐲘' => '𐳘', + '𐲙' => '𐳙', + '𐲚' => '𐳚', + '𐲛' => '𐳛', + '𐲜' => '𐳜', + '𐲝' => '𐳝', + '𐲞' => '𐳞', + '𐲟' => '𐳟', + '𐲠' => '𐳠', + '𐲡' => '𐳡', + '𐲢' => '𐳢', + '𐲣' => '𐳣', + '𐲤' => '𐳤', + '𐲥' => '𐳥', + '𐲦' => '𐳦', + '𐲧' => '𐳧', + '𐲨' => '𐳨', + '𐲩' => '𐳩', + '𐲪' => '𐳪', + '𐲫' => '𐳫', + '𐲬' => '𐳬', + '𐲭' => '𐳭', + '𐲮' => '𐳮', + '𐲯' => '𐳯', + '𐲰' => '𐳰', + '𐲱' => '𐳱', + '𐲲' => '𐳲', + '𑢠' => '𑣀', + '𑢡' => '𑣁', + '𑢢' => '𑣂', + '𑢣' => '𑣃', + '𑢤' => '𑣄', + '𑢥' => '𑣅', + '𑢦' => '𑣆', + '𑢧' => '𑣇', + '𑢨' => '𑣈', + '𑢩' => '𑣉', + '𑢪' => '𑣊', + '𑢫' => '𑣋', + '𑢬' => '𑣌', + '𑢭' => '𑣍', + '𑢮' => '𑣎', + '𑢯' => '𑣏', + '𑢰' => '𑣐', + '𑢱' => '𑣑', + '𑢲' => '𑣒', + '𑢳' => '𑣓', + '𑢴' => '𑣔', + '𑢵' => '𑣕', + '𑢶' => '𑣖', + '𑢷' => '𑣗', + '𑢸' => '𑣘', + '𑢹' => '𑣙', + '𑢺' => '𑣚', + '𑢻' => '𑣛', + '𑢼' => '𑣜', + '𑢽' => '𑣝', + '𑢾' => '𑣞', + '𑢿' => '𑣟', + '𖹀' => '𖹠', + '𖹁' => '𖹡', + '𖹂' => '𖹢', + '𖹃' => '𖹣', + '𖹄' => '𖹤', + '𖹅' => '𖹥', + '𖹆' => '𖹦', + '𖹇' => '𖹧', + '𖹈' => '𖹨', + '𖹉' => '𖹩', + '𖹊' => '𖹪', + '𖹋' => '𖹫', + '𖹌' => '𖹬', + '𖹍' => '𖹭', + '𖹎' => '𖹮', + '𖹏' => '𖹯', + '𖹐' => '𖹰', + '𖹑' => '𖹱', + '𖹒' => '𖹲', + '𖹓' => '𖹳', + '𖹔' => '𖹴', + '𖹕' => '𖹵', + '𖹖' => '𖹶', + '𖹗' => '𖹷', + '𖹘' => '𖹸', + '𖹙' => '𖹹', + '𖹚' => '𖹺', + '𖹛' => '𖹻', + '𖹜' => '𖹼', + '𖹝' => '𖹽', + '𖹞' => '𖹾', + '𖹟' => '𖹿', + '𞤀' => '𞤢', + '𞤁' => '𞤣', + '𞤂' => '𞤤', + '𞤃' => '𞤥', + '𞤄' => '𞤦', + '𞤅' => '𞤧', + '𞤆' => '𞤨', + '𞤇' => '𞤩', + '𞤈' => '𞤪', + '𞤉' => '𞤫', + '𞤊' => '𞤬', + '𞤋' => '𞤭', + '𞤌' => '𞤮', + '𞤍' => '𞤯', + '𞤎' => '𞤰', + '𞤏' => '𞤱', + '𞤐' => '𞤲', + '𞤑' => '𞤳', + '𞤒' => '𞤴', + '𞤓' => '𞤵', + '𞤔' => '𞤶', + '𞤕' => '𞤷', + '𞤖' => '𞤸', + '𞤗' => '𞤹', + '𞤘' => '𞤺', + '𞤙' => '𞤻', + '𞤚' => '𞤼', + '𞤛' => '𞤽', + '𞤜' => '𞤾', + '𞤝' => '𞤿', + '𞤞' => '𞥀', + '𞤟' => '𞥁', + '𞤠' => '𞥂', + '𞤡' => '𞥃', +); diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 0000000000..2a8f6e73b9 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,5 @@ + 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + 'µ' => 'Μ', + 'à' => 'À', + 'á' => 'Á', + 'â' => 'Â', + 'ã' => 'Ã', + 'ä' => 'Ä', + 'å' => 'Å', + 'æ' => 'Æ', + 'ç' => 'Ç', + 'è' => 'È', + 'é' => 'É', + 'ê' => 'Ê', + 'ë' => 'Ë', + 'ì' => 'Ì', + 'í' => 'Í', + 'î' => 'Î', + 'ï' => 'Ï', + 'ð' => 'Ð', + 'ñ' => 'Ñ', + 'ò' => 'Ò', + 'ó' => 'Ó', + 'ô' => 'Ô', + 'õ' => 'Õ', + 'ö' => 'Ö', + 'ø' => 'Ø', + 'ù' => 'Ù', + 'ú' => 'Ú', + 'û' => 'Û', + 'ü' => 'Ü', + 'ý' => 'Ý', + 'þ' => 'Þ', + 'ÿ' => 'Ÿ', + 'ā' => 'Ā', + 'ă' => 'Ă', + 'ą' => 'Ą', + 'ć' => 'Ć', + 'ĉ' => 'Ĉ', + 'ċ' => 'Ċ', + 'č' => 'Č', + 'ď' => 'Ď', + 'đ' => 'Đ', + 'ē' => 'Ē', + 'ĕ' => 'Ĕ', + 'ė' => 'Ė', + 'ę' => 'Ę', + 'ě' => 'Ě', + 'ĝ' => 'Ĝ', + 'ğ' => 'Ğ', + 'ġ' => 'Ġ', + 'ģ' => 'Ģ', + 'ĥ' => 'Ĥ', + 'ħ' => 'Ħ', + 'ĩ' => 'Ĩ', + 'ī' => 'Ī', + 'ĭ' => 'Ĭ', + 'į' => 'Į', + 'ı' => 'I', + 'ij' => 'IJ', + 'ĵ' => 'Ĵ', + 'ķ' => 'Ķ', + 'ĺ' => 'Ĺ', + 'ļ' => 'Ļ', + 'ľ' => 'Ľ', + 'ŀ' => 'Ŀ', + 'ł' => 'Ł', + 'ń' => 'Ń', + 'ņ' => 'Ņ', + 'ň' => 'Ň', + 'ŋ' => 'Ŋ', + 'ō' => 'Ō', + 'ŏ' => 'Ŏ', + 'ő' => 'Ő', + 'œ' => 'Œ', + 'ŕ' => 'Ŕ', + 'ŗ' => 'Ŗ', + 'ř' => 'Ř', + 'ś' => 'Ś', + 'ŝ' => 'Ŝ', + 'ş' => 'Ş', + 'š' => 'Š', + 'ţ' => 'Ţ', + 'ť' => 'Ť', + 'ŧ' => 'Ŧ', + 'ũ' => 'Ũ', + 'ū' => 'Ū', + 'ŭ' => 'Ŭ', + 'ů' => 'Ů', + 'ű' => 'Ű', + 'ų' => 'Ų', + 'ŵ' => 'Ŵ', + 'ŷ' => 'Ŷ', + 'ź' => 'Ź', + 'ż' => 'Ż', + 'ž' => 'Ž', + 'ſ' => 'S', + 'ƀ' => 'Ƀ', + 'ƃ' => 'Ƃ', + 'ƅ' => 'Ƅ', + 'ƈ' => 'Ƈ', + 'ƌ' => 'Ƌ', + 'ƒ' => 'Ƒ', + 'ƕ' => 'Ƕ', + 'ƙ' => 'Ƙ', + 'ƚ' => 'Ƚ', + 'ƞ' => 'Ƞ', + 'ơ' => 'Ơ', + 'ƣ' => 'Ƣ', + 'ƥ' => 'Ƥ', + 'ƨ' => 'Ƨ', + 'ƭ' => 'Ƭ', + 'ư' => 'Ư', + 'ƴ' => 'Ƴ', + 'ƶ' => 'Ƶ', + 'ƹ' => 'Ƹ', + 'ƽ' => 'Ƽ', + 'ƿ' => 'Ƿ', + 'Dž' => 'DŽ', + 'dž' => 'DŽ', + 'Lj' => 'LJ', + 'lj' => 'LJ', + 'Nj' => 'NJ', + 'nj' => 'NJ', + 'ǎ' => 'Ǎ', + 'ǐ' => 'Ǐ', + 'ǒ' => 'Ǒ', + 'ǔ' => 'Ǔ', + 'ǖ' => 'Ǖ', + 'ǘ' => 'Ǘ', + 'ǚ' => 'Ǚ', + 'ǜ' => 'Ǜ', + 'ǝ' => 'Ǝ', + 'ǟ' => 'Ǟ', + 'ǡ' => 'Ǡ', + 'ǣ' => 'Ǣ', + 'ǥ' => 'Ǥ', + 'ǧ' => 'Ǧ', + 'ǩ' => 'Ǩ', + 'ǫ' => 'Ǫ', + 'ǭ' => 'Ǭ', + 'ǯ' => 'Ǯ', + 'Dz' => 'DZ', + 'dz' => 'DZ', + 'ǵ' => 'Ǵ', + 'ǹ' => 'Ǹ', + 'ǻ' => 'Ǻ', + 'ǽ' => 'Ǽ', + 'ǿ' => 'Ǿ', + 'ȁ' => 'Ȁ', + 'ȃ' => 'Ȃ', + 'ȅ' => 'Ȅ', + 'ȇ' => 'Ȇ', + 'ȉ' => 'Ȉ', + 'ȋ' => 'Ȋ', + 'ȍ' => 'Ȍ', + 'ȏ' => 'Ȏ', + 'ȑ' => 'Ȑ', + 'ȓ' => 'Ȓ', + 'ȕ' => 'Ȕ', + 'ȗ' => 'Ȗ', + 'ș' => 'Ș', + 'ț' => 'Ț', + 'ȝ' => 'Ȝ', + 'ȟ' => 'Ȟ', + 'ȣ' => 'Ȣ', + 'ȥ' => 'Ȥ', + 'ȧ' => 'Ȧ', + 'ȩ' => 'Ȩ', + 'ȫ' => 'Ȫ', + 'ȭ' => 'Ȭ', + 'ȯ' => 'Ȯ', + 'ȱ' => 'Ȱ', + 'ȳ' => 'Ȳ', + 'ȼ' => 'Ȼ', + 'ȿ' => 'Ȿ', + 'ɀ' => 'Ɀ', + 'ɂ' => 'Ɂ', + 'ɇ' => 'Ɇ', + 'ɉ' => 'Ɉ', + 'ɋ' => 'Ɋ', + 'ɍ' => 'Ɍ', + 'ɏ' => 'Ɏ', + 'ɐ' => 'Ɐ', + 'ɑ' => 'Ɑ', + 'ɒ' => 'Ɒ', + 'ɓ' => 'Ɓ', + 'ɔ' => 'Ɔ', + 'ɖ' => 'Ɖ', + 'ɗ' => 'Ɗ', + 'ə' => 'Ə', + 'ɛ' => 'Ɛ', + 'ɜ' => 'Ɜ', + 'ɠ' => 'Ɠ', + 'ɡ' => 'Ɡ', + 'ɣ' => 'Ɣ', + 'ɥ' => 'Ɥ', + 'ɦ' => 'Ɦ', + 'ɨ' => 'Ɨ', + 'ɩ' => 'Ɩ', + 'ɪ' => 'Ɪ', + 'ɫ' => 'Ɫ', + 'ɬ' => 'Ɬ', + 'ɯ' => 'Ɯ', + 'ɱ' => 'Ɱ', + 'ɲ' => 'Ɲ', + 'ɵ' => 'Ɵ', + 'ɽ' => 'Ɽ', + 'ʀ' => 'Ʀ', + 'ʂ' => 'Ʂ', + 'ʃ' => 'Ʃ', + 'ʇ' => 'Ʇ', + 'ʈ' => 'Ʈ', + 'ʉ' => 'Ʉ', + 'ʊ' => 'Ʊ', + 'ʋ' => 'Ʋ', + 'ʌ' => 'Ʌ', + 'ʒ' => 'Ʒ', + 'ʝ' => 'Ʝ', + 'ʞ' => 'Ʞ', + 'ͅ' => 'Ι', + 'ͱ' => 'Ͱ', + 'ͳ' => 'Ͳ', + 'ͷ' => 'Ͷ', + 'ͻ' => 'Ͻ', + 'ͼ' => 'Ͼ', + 'ͽ' => 'Ͽ', + 'ά' => 'Ά', + 'έ' => 'Έ', + 'ή' => 'Ή', + 'ί' => 'Ί', + 'α' => 'Α', + 'β' => 'Β', + 'γ' => 'Γ', + 'δ' => 'Δ', + 'ε' => 'Ε', + 'ζ' => 'Ζ', + 'η' => 'Η', + 'θ' => 'Θ', + 'ι' => 'Ι', + 'κ' => 'Κ', + 'λ' => 'Λ', + 'μ' => 'Μ', + 'ν' => 'Ν', + 'ξ' => 'Ξ', + 'ο' => 'Ο', + 'π' => 'Π', + 'ρ' => 'Ρ', + 'ς' => 'Σ', + 'σ' => 'Σ', + 'τ' => 'Τ', + 'υ' => 'Υ', + 'φ' => 'Φ', + 'χ' => 'Χ', + 'ψ' => 'Ψ', + 'ω' => 'Ω', + 'ϊ' => 'Ϊ', + 'ϋ' => 'Ϋ', + 'ό' => 'Ό', + 'ύ' => 'Ύ', + 'ώ' => 'Ώ', + 'ϐ' => 'Β', + 'ϑ' => 'Θ', + 'ϕ' => 'Φ', + 'ϖ' => 'Π', + 'ϗ' => 'Ϗ', + 'ϙ' => 'Ϙ', + 'ϛ' => 'Ϛ', + 'ϝ' => 'Ϝ', + 'ϟ' => 'Ϟ', + 'ϡ' => 'Ϡ', + 'ϣ' => 'Ϣ', + 'ϥ' => 'Ϥ', + 'ϧ' => 'Ϧ', + 'ϩ' => 'Ϩ', + 'ϫ' => 'Ϫ', + 'ϭ' => 'Ϭ', + 'ϯ' => 'Ϯ', + 'ϰ' => 'Κ', + 'ϱ' => 'Ρ', + 'ϲ' => 'Ϲ', + 'ϳ' => 'Ϳ', + 'ϵ' => 'Ε', + 'ϸ' => 'Ϸ', + 'ϻ' => 'Ϻ', + 'а' => 'А', + 'б' => 'Б', + 'в' => 'В', + 'г' => 'Г', + 'д' => 'Д', + 'е' => 'Е', + 'ж' => 'Ж', + 'з' => 'З', + 'и' => 'И', + 'й' => 'Й', + 'к' => 'К', + 'л' => 'Л', + 'м' => 'М', + 'н' => 'Н', + 'о' => 'О', + 'п' => 'П', + 'р' => 'Р', + 'с' => 'С', + 'т' => 'Т', + 'у' => 'У', + 'ф' => 'Ф', + 'х' => 'Х', + 'ц' => 'Ц', + 'ч' => 'Ч', + 'ш' => 'Ш', + 'щ' => 'Щ', + 'ъ' => 'Ъ', + 'ы' => 'Ы', + 'ь' => 'Ь', + 'э' => 'Э', + 'ю' => 'Ю', + 'я' => 'Я', + 'ѐ' => 'Ѐ', + 'ё' => 'Ё', + 'ђ' => 'Ђ', + 'ѓ' => 'Ѓ', + 'є' => 'Є', + 'ѕ' => 'Ѕ', + 'і' => 'І', + 'ї' => 'Ї', + 'ј' => 'Ј', + 'љ' => 'Љ', + 'њ' => 'Њ', + 'ћ' => 'Ћ', + 'ќ' => 'Ќ', + 'ѝ' => 'Ѝ', + 'ў' => 'Ў', + 'џ' => 'Џ', + 'ѡ' => 'Ѡ', + 'ѣ' => 'Ѣ', + 'ѥ' => 'Ѥ', + 'ѧ' => 'Ѧ', + 'ѩ' => 'Ѩ', + 'ѫ' => 'Ѫ', + 'ѭ' => 'Ѭ', + 'ѯ' => 'Ѯ', + 'ѱ' => 'Ѱ', + 'ѳ' => 'Ѳ', + 'ѵ' => 'Ѵ', + 'ѷ' => 'Ѷ', + 'ѹ' => 'Ѹ', + 'ѻ' => 'Ѻ', + 'ѽ' => 'Ѽ', + 'ѿ' => 'Ѿ', + 'ҁ' => 'Ҁ', + 'ҋ' => 'Ҋ', + 'ҍ' => 'Ҍ', + 'ҏ' => 'Ҏ', + 'ґ' => 'Ґ', + 'ғ' => 'Ғ', + 'ҕ' => 'Ҕ', + 'җ' => 'Җ', + 'ҙ' => 'Ҙ', + 'қ' => 'Қ', + 'ҝ' => 'Ҝ', + 'ҟ' => 'Ҟ', + 'ҡ' => 'Ҡ', + 'ң' => 'Ң', + 'ҥ' => 'Ҥ', + 'ҧ' => 'Ҧ', + 'ҩ' => 'Ҩ', + 'ҫ' => 'Ҫ', + 'ҭ' => 'Ҭ', + 'ү' => 'Ү', + 'ұ' => 'Ұ', + 'ҳ' => 'Ҳ', + 'ҵ' => 'Ҵ', + 'ҷ' => 'Ҷ', + 'ҹ' => 'Ҹ', + 'һ' => 'Һ', + 'ҽ' => 'Ҽ', + 'ҿ' => 'Ҿ', + 'ӂ' => 'Ӂ', + 'ӄ' => 'Ӄ', + 'ӆ' => 'Ӆ', + 'ӈ' => 'Ӈ', + 'ӊ' => 'Ӊ', + 'ӌ' => 'Ӌ', + 'ӎ' => 'Ӎ', + 'ӏ' => 'Ӏ', + 'ӑ' => 'Ӑ', + 'ӓ' => 'Ӓ', + 'ӕ' => 'Ӕ', + 'ӗ' => 'Ӗ', + 'ә' => 'Ә', + 'ӛ' => 'Ӛ', + 'ӝ' => 'Ӝ', + 'ӟ' => 'Ӟ', + 'ӡ' => 'Ӡ', + 'ӣ' => 'Ӣ', + 'ӥ' => 'Ӥ', + 'ӧ' => 'Ӧ', + 'ө' => 'Ө', + 'ӫ' => 'Ӫ', + 'ӭ' => 'Ӭ', + 'ӯ' => 'Ӯ', + 'ӱ' => 'Ӱ', + 'ӳ' => 'Ӳ', + 'ӵ' => 'Ӵ', + 'ӷ' => 'Ӷ', + 'ӹ' => 'Ӹ', + 'ӻ' => 'Ӻ', + 'ӽ' => 'Ӽ', + 'ӿ' => 'Ӿ', + 'ԁ' => 'Ԁ', + 'ԃ' => 'Ԃ', + 'ԅ' => 'Ԅ', + 'ԇ' => 'Ԇ', + 'ԉ' => 'Ԉ', + 'ԋ' => 'Ԋ', + 'ԍ' => 'Ԍ', + 'ԏ' => 'Ԏ', + 'ԑ' => 'Ԑ', + 'ԓ' => 'Ԓ', + 'ԕ' => 'Ԕ', + 'ԗ' => 'Ԗ', + 'ԙ' => 'Ԙ', + 'ԛ' => 'Ԛ', + 'ԝ' => 'Ԝ', + 'ԟ' => 'Ԟ', + 'ԡ' => 'Ԡ', + 'ԣ' => 'Ԣ', + 'ԥ' => 'Ԥ', + 'ԧ' => 'Ԧ', + 'ԩ' => 'Ԩ', + 'ԫ' => 'Ԫ', + 'ԭ' => 'Ԭ', + 'ԯ' => 'Ԯ', + 'ա' => 'Ա', + 'բ' => 'Բ', + 'գ' => 'Գ', + 'դ' => 'Դ', + 'ե' => 'Ե', + 'զ' => 'Զ', + 'է' => 'Է', + 'ը' => 'Ը', + 'թ' => 'Թ', + 'ժ' => 'Ժ', + 'ի' => 'Ի', + 'լ' => 'Լ', + 'խ' => 'Խ', + 'ծ' => 'Ծ', + 'կ' => 'Կ', + 'հ' => 'Հ', + 'ձ' => 'Ձ', + 'ղ' => 'Ղ', + 'ճ' => 'Ճ', + 'մ' => 'Մ', + 'յ' => 'Յ', + 'ն' => 'Ն', + 'շ' => 'Շ', + 'ո' => 'Ո', + 'չ' => 'Չ', + 'պ' => 'Պ', + 'ջ' => 'Ջ', + 'ռ' => 'Ռ', + 'ս' => 'Ս', + 'վ' => 'Վ', + 'տ' => 'Տ', + 'ր' => 'Ր', + 'ց' => 'Ց', + 'ւ' => 'Ւ', + 'փ' => 'Փ', + 'ք' => 'Ք', + 'օ' => 'Օ', + 'ֆ' => 'Ֆ', + 'ა' => 'Ა', + 'ბ' => 'Ბ', + 'გ' => 'Გ', + 'დ' => 'Დ', + 'ე' => 'Ე', + 'ვ' => 'Ვ', + 'ზ' => 'Ზ', + 'თ' => 'Თ', + 'ი' => 'Ი', + 'კ' => 'Კ', + 'ლ' => 'Ლ', + 'მ' => 'Მ', + 'ნ' => 'Ნ', + 'ო' => 'Ო', + 'პ' => 'Პ', + 'ჟ' => 'Ჟ', + 'რ' => 'Რ', + 'ს' => 'Ს', + 'ტ' => 'Ტ', + 'უ' => 'Უ', + 'ფ' => 'Ფ', + 'ქ' => 'Ქ', + 'ღ' => 'Ღ', + 'ყ' => 'Ყ', + 'შ' => 'Შ', + 'ჩ' => 'Ჩ', + 'ც' => 'Ც', + 'ძ' => 'Ძ', + 'წ' => 'Წ', + 'ჭ' => 'Ჭ', + 'ხ' => 'Ხ', + 'ჯ' => 'Ჯ', + 'ჰ' => 'Ჰ', + 'ჱ' => 'Ჱ', + 'ჲ' => 'Ჲ', + 'ჳ' => 'Ჳ', + 'ჴ' => 'Ჴ', + 'ჵ' => 'Ჵ', + 'ჶ' => 'Ჶ', + 'ჷ' => 'Ჷ', + 'ჸ' => 'Ჸ', + 'ჹ' => 'Ჹ', + 'ჺ' => 'Ჺ', + 'ჽ' => 'Ჽ', + 'ჾ' => 'Ჾ', + 'ჿ' => 'Ჿ', + 'ᏸ' => 'Ᏸ', + 'ᏹ' => 'Ᏹ', + 'ᏺ' => 'Ᏺ', + 'ᏻ' => 'Ᏻ', + 'ᏼ' => 'Ᏼ', + 'ᏽ' => 'Ᏽ', + 'ᲀ' => 'В', + 'ᲁ' => 'Д', + 'ᲂ' => 'О', + 'ᲃ' => 'С', + 'ᲄ' => 'Т', + 'ᲅ' => 'Т', + 'ᲆ' => 'Ъ', + 'ᲇ' => 'Ѣ', + 'ᲈ' => 'Ꙋ', + 'ᵹ' => 'Ᵹ', + 'ᵽ' => 'Ᵽ', + 'ᶎ' => 'Ᶎ', + 'ḁ' => 'Ḁ', + 'ḃ' => 'Ḃ', + 'ḅ' => 'Ḅ', + 'ḇ' => 'Ḇ', + 'ḉ' => 'Ḉ', + 'ḋ' => 'Ḋ', + 'ḍ' => 'Ḍ', + 'ḏ' => 'Ḏ', + 'ḑ' => 'Ḑ', + 'ḓ' => 'Ḓ', + 'ḕ' => 'Ḕ', + 'ḗ' => 'Ḗ', + 'ḙ' => 'Ḙ', + 'ḛ' => 'Ḛ', + 'ḝ' => 'Ḝ', + 'ḟ' => 'Ḟ', + 'ḡ' => 'Ḡ', + 'ḣ' => 'Ḣ', + 'ḥ' => 'Ḥ', + 'ḧ' => 'Ḧ', + 'ḩ' => 'Ḩ', + 'ḫ' => 'Ḫ', + 'ḭ' => 'Ḭ', + 'ḯ' => 'Ḯ', + 'ḱ' => 'Ḱ', + 'ḳ' => 'Ḳ', + 'ḵ' => 'Ḵ', + 'ḷ' => 'Ḷ', + 'ḹ' => 'Ḹ', + 'ḻ' => 'Ḻ', + 'ḽ' => 'Ḽ', + 'ḿ' => 'Ḿ', + 'ṁ' => 'Ṁ', + 'ṃ' => 'Ṃ', + 'ṅ' => 'Ṅ', + 'ṇ' => 'Ṇ', + 'ṉ' => 'Ṉ', + 'ṋ' => 'Ṋ', + 'ṍ' => 'Ṍ', + 'ṏ' => 'Ṏ', + 'ṑ' => 'Ṑ', + 'ṓ' => 'Ṓ', + 'ṕ' => 'Ṕ', + 'ṗ' => 'Ṗ', + 'ṙ' => 'Ṙ', + 'ṛ' => 'Ṛ', + 'ṝ' => 'Ṝ', + 'ṟ' => 'Ṟ', + 'ṡ' => 'Ṡ', + 'ṣ' => 'Ṣ', + 'ṥ' => 'Ṥ', + 'ṧ' => 'Ṧ', + 'ṩ' => 'Ṩ', + 'ṫ' => 'Ṫ', + 'ṭ' => 'Ṭ', + 'ṯ' => 'Ṯ', + 'ṱ' => 'Ṱ', + 'ṳ' => 'Ṳ', + 'ṵ' => 'Ṵ', + 'ṷ' => 'Ṷ', + 'ṹ' => 'Ṹ', + 'ṻ' => 'Ṻ', + 'ṽ' => 'Ṽ', + 'ṿ' => 'Ṿ', + 'ẁ' => 'Ẁ', + 'ẃ' => 'Ẃ', + 'ẅ' => 'Ẅ', + 'ẇ' => 'Ẇ', + 'ẉ' => 'Ẉ', + 'ẋ' => 'Ẋ', + 'ẍ' => 'Ẍ', + 'ẏ' => 'Ẏ', + 'ẑ' => 'Ẑ', + 'ẓ' => 'Ẓ', + 'ẕ' => 'Ẕ', + 'ẛ' => 'Ṡ', + 'ạ' => 'Ạ', + 'ả' => 'Ả', + 'ấ' => 'Ấ', + 'ầ' => 'Ầ', + 'ẩ' => 'Ẩ', + 'ẫ' => 'Ẫ', + 'ậ' => 'Ậ', + 'ắ' => 'Ắ', + 'ằ' => 'Ằ', + 'ẳ' => 'Ẳ', + 'ẵ' => 'Ẵ', + 'ặ' => 'Ặ', + 'ẹ' => 'Ẹ', + 'ẻ' => 'Ẻ', + 'ẽ' => 'Ẽ', + 'ế' => 'Ế', + 'ề' => 'Ề', + 'ể' => 'Ể', + 'ễ' => 'Ễ', + 'ệ' => 'Ệ', + 'ỉ' => 'Ỉ', + 'ị' => 'Ị', + 'ọ' => 'Ọ', + 'ỏ' => 'Ỏ', + 'ố' => 'Ố', + 'ồ' => 'Ồ', + 'ổ' => 'Ổ', + 'ỗ' => 'Ỗ', + 'ộ' => 'Ộ', + 'ớ' => 'Ớ', + 'ờ' => 'Ờ', + 'ở' => 'Ở', + 'ỡ' => 'Ỡ', + 'ợ' => 'Ợ', + 'ụ' => 'Ụ', + 'ủ' => 'Ủ', + 'ứ' => 'Ứ', + 'ừ' => 'Ừ', + 'ử' => 'Ử', + 'ữ' => 'Ữ', + 'ự' => 'Ự', + 'ỳ' => 'Ỳ', + 'ỵ' => 'Ỵ', + 'ỷ' => 'Ỷ', + 'ỹ' => 'Ỹ', + 'ỻ' => 'Ỻ', + 'ỽ' => 'Ỽ', + 'ỿ' => 'Ỿ', + 'ἀ' => 'Ἀ', + 'ἁ' => 'Ἁ', + 'ἂ' => 'Ἂ', + 'ἃ' => 'Ἃ', + 'ἄ' => 'Ἄ', + 'ἅ' => 'Ἅ', + 'ἆ' => 'Ἆ', + 'ἇ' => 'Ἇ', + 'ἐ' => 'Ἐ', + 'ἑ' => 'Ἑ', + 'ἒ' => 'Ἒ', + 'ἓ' => 'Ἓ', + 'ἔ' => 'Ἔ', + 'ἕ' => 'Ἕ', + 'ἠ' => 'Ἠ', + 'ἡ' => 'Ἡ', + 'ἢ' => 'Ἢ', + 'ἣ' => 'Ἣ', + 'ἤ' => 'Ἤ', + 'ἥ' => 'Ἥ', + 'ἦ' => 'Ἦ', + 'ἧ' => 'Ἧ', + 'ἰ' => 'Ἰ', + 'ἱ' => 'Ἱ', + 'ἲ' => 'Ἲ', + 'ἳ' => 'Ἳ', + 'ἴ' => 'Ἴ', + 'ἵ' => 'Ἵ', + 'ἶ' => 'Ἶ', + 'ἷ' => 'Ἷ', + 'ὀ' => 'Ὀ', + 'ὁ' => 'Ὁ', + 'ὂ' => 'Ὂ', + 'ὃ' => 'Ὃ', + 'ὄ' => 'Ὄ', + 'ὅ' => 'Ὅ', + 'ὑ' => 'Ὑ', + 'ὓ' => 'Ὓ', + 'ὕ' => 'Ὕ', + 'ὗ' => 'Ὗ', + 'ὠ' => 'Ὠ', + 'ὡ' => 'Ὡ', + 'ὢ' => 'Ὢ', + 'ὣ' => 'Ὣ', + 'ὤ' => 'Ὤ', + 'ὥ' => 'Ὥ', + 'ὦ' => 'Ὦ', + 'ὧ' => 'Ὧ', + 'ὰ' => 'Ὰ', + 'ά' => 'Ά', + 'ὲ' => 'Ὲ', + 'έ' => 'Έ', + 'ὴ' => 'Ὴ', + 'ή' => 'Ή', + 'ὶ' => 'Ὶ', + 'ί' => 'Ί', + 'ὸ' => 'Ὸ', + 'ό' => 'Ό', + 'ὺ' => 'Ὺ', + 'ύ' => 'Ύ', + 'ὼ' => 'Ὼ', + 'ώ' => 'Ώ', + 'ᾀ' => 'ἈΙ', + 'ᾁ' => 'ἉΙ', + 'ᾂ' => 'ἊΙ', + 'ᾃ' => 'ἋΙ', + 'ᾄ' => 'ἌΙ', + 'ᾅ' => 'ἍΙ', + 'ᾆ' => 'ἎΙ', + 'ᾇ' => 'ἏΙ', + 'ᾐ' => 'ἨΙ', + 'ᾑ' => 'ἩΙ', + 'ᾒ' => 'ἪΙ', + 'ᾓ' => 'ἫΙ', + 'ᾔ' => 'ἬΙ', + 'ᾕ' => 'ἭΙ', + 'ᾖ' => 'ἮΙ', + 'ᾗ' => 'ἯΙ', + 'ᾠ' => 'ὨΙ', + 'ᾡ' => 'ὩΙ', + 'ᾢ' => 'ὪΙ', + 'ᾣ' => 'ὫΙ', + 'ᾤ' => 'ὬΙ', + 'ᾥ' => 'ὭΙ', + 'ᾦ' => 'ὮΙ', + 'ᾧ' => 'ὯΙ', + 'ᾰ' => 'Ᾰ', + 'ᾱ' => 'Ᾱ', + 'ᾳ' => 'ΑΙ', + 'ι' => 'Ι', + 'ῃ' => 'ΗΙ', + 'ῐ' => 'Ῐ', + 'ῑ' => 'Ῑ', + 'ῠ' => 'Ῠ', + 'ῡ' => 'Ῡ', + 'ῥ' => 'Ῥ', + 'ῳ' => 'ΩΙ', + 'ⅎ' => 'Ⅎ', + 'ⅰ' => 'Ⅰ', + 'ⅱ' => 'Ⅱ', + 'ⅲ' => 'Ⅲ', + 'ⅳ' => 'Ⅳ', + 'ⅴ' => 'Ⅴ', + 'ⅵ' => 'Ⅵ', + 'ⅶ' => 'Ⅶ', + 'ⅷ' => 'Ⅷ', + 'ⅸ' => 'Ⅸ', + 'ⅹ' => 'Ⅹ', + 'ⅺ' => 'Ⅺ', + 'ⅻ' => 'Ⅻ', + 'ⅼ' => 'Ⅼ', + 'ⅽ' => 'Ⅽ', + 'ⅾ' => 'Ⅾ', + 'ⅿ' => 'Ⅿ', + 'ↄ' => 'Ↄ', + 'ⓐ' => 'Ⓐ', + 'ⓑ' => 'Ⓑ', + 'ⓒ' => 'Ⓒ', + 'ⓓ' => 'Ⓓ', + 'ⓔ' => 'Ⓔ', + 'ⓕ' => 'Ⓕ', + 'ⓖ' => 'Ⓖ', + 'ⓗ' => 'Ⓗ', + 'ⓘ' => 'Ⓘ', + 'ⓙ' => 'Ⓙ', + 'ⓚ' => 'Ⓚ', + 'ⓛ' => 'Ⓛ', + 'ⓜ' => 'Ⓜ', + 'ⓝ' => 'Ⓝ', + 'ⓞ' => 'Ⓞ', + 'ⓟ' => 'Ⓟ', + 'ⓠ' => 'Ⓠ', + 'ⓡ' => 'Ⓡ', + 'ⓢ' => 'Ⓢ', + 'ⓣ' => 'Ⓣ', + 'ⓤ' => 'Ⓤ', + 'ⓥ' => 'Ⓥ', + 'ⓦ' => 'Ⓦ', + 'ⓧ' => 'Ⓧ', + 'ⓨ' => 'Ⓨ', + 'ⓩ' => 'Ⓩ', + 'ⰰ' => 'Ⰰ', + 'ⰱ' => 'Ⰱ', + 'ⰲ' => 'Ⰲ', + 'ⰳ' => 'Ⰳ', + 'ⰴ' => 'Ⰴ', + 'ⰵ' => 'Ⰵ', + 'ⰶ' => 'Ⰶ', + 'ⰷ' => 'Ⰷ', + 'ⰸ' => 'Ⰸ', + 'ⰹ' => 'Ⰹ', + 'ⰺ' => 'Ⰺ', + 'ⰻ' => 'Ⰻ', + 'ⰼ' => 'Ⰼ', + 'ⰽ' => 'Ⰽ', + 'ⰾ' => 'Ⰾ', + 'ⰿ' => 'Ⰿ', + 'ⱀ' => 'Ⱀ', + 'ⱁ' => 'Ⱁ', + 'ⱂ' => 'Ⱂ', + 'ⱃ' => 'Ⱃ', + 'ⱄ' => 'Ⱄ', + 'ⱅ' => 'Ⱅ', + 'ⱆ' => 'Ⱆ', + 'ⱇ' => 'Ⱇ', + 'ⱈ' => 'Ⱈ', + 'ⱉ' => 'Ⱉ', + 'ⱊ' => 'Ⱊ', + 'ⱋ' => 'Ⱋ', + 'ⱌ' => 'Ⱌ', + 'ⱍ' => 'Ⱍ', + 'ⱎ' => 'Ⱎ', + 'ⱏ' => 'Ⱏ', + 'ⱐ' => 'Ⱐ', + 'ⱑ' => 'Ⱑ', + 'ⱒ' => 'Ⱒ', + 'ⱓ' => 'Ⱓ', + 'ⱔ' => 'Ⱔ', + 'ⱕ' => 'Ⱕ', + 'ⱖ' => 'Ⱖ', + 'ⱗ' => 'Ⱗ', + 'ⱘ' => 'Ⱘ', + 'ⱙ' => 'Ⱙ', + 'ⱚ' => 'Ⱚ', + 'ⱛ' => 'Ⱛ', + 'ⱜ' => 'Ⱜ', + 'ⱝ' => 'Ⱝ', + 'ⱞ' => 'Ⱞ', + 'ⱡ' => 'Ⱡ', + 'ⱥ' => 'Ⱥ', + 'ⱦ' => 'Ⱦ', + 'ⱨ' => 'Ⱨ', + 'ⱪ' => 'Ⱪ', + 'ⱬ' => 'Ⱬ', + 'ⱳ' => 'Ⱳ', + 'ⱶ' => 'Ⱶ', + 'ⲁ' => 'Ⲁ', + 'ⲃ' => 'Ⲃ', + 'ⲅ' => 'Ⲅ', + 'ⲇ' => 'Ⲇ', + 'ⲉ' => 'Ⲉ', + 'ⲋ' => 'Ⲋ', + 'ⲍ' => 'Ⲍ', + 'ⲏ' => 'Ⲏ', + 'ⲑ' => 'Ⲑ', + 'ⲓ' => 'Ⲓ', + 'ⲕ' => 'Ⲕ', + 'ⲗ' => 'Ⲗ', + 'ⲙ' => 'Ⲙ', + 'ⲛ' => 'Ⲛ', + 'ⲝ' => 'Ⲝ', + 'ⲟ' => 'Ⲟ', + 'ⲡ' => 'Ⲡ', + 'ⲣ' => 'Ⲣ', + 'ⲥ' => 'Ⲥ', + 'ⲧ' => 'Ⲧ', + 'ⲩ' => 'Ⲩ', + 'ⲫ' => 'Ⲫ', + 'ⲭ' => 'Ⲭ', + 'ⲯ' => 'Ⲯ', + 'ⲱ' => 'Ⲱ', + 'ⲳ' => 'Ⲳ', + 'ⲵ' => 'Ⲵ', + 'ⲷ' => 'Ⲷ', + 'ⲹ' => 'Ⲹ', + 'ⲻ' => 'Ⲻ', + 'ⲽ' => 'Ⲽ', + 'ⲿ' => 'Ⲿ', + 'ⳁ' => 'Ⳁ', + 'ⳃ' => 'Ⳃ', + 'ⳅ' => 'Ⳅ', + 'ⳇ' => 'Ⳇ', + 'ⳉ' => 'Ⳉ', + 'ⳋ' => 'Ⳋ', + 'ⳍ' => 'Ⳍ', + 'ⳏ' => 'Ⳏ', + 'ⳑ' => 'Ⳑ', + 'ⳓ' => 'Ⳓ', + 'ⳕ' => 'Ⳕ', + 'ⳗ' => 'Ⳗ', + 'ⳙ' => 'Ⳙ', + 'ⳛ' => 'Ⳛ', + 'ⳝ' => 'Ⳝ', + 'ⳟ' => 'Ⳟ', + 'ⳡ' => 'Ⳡ', + 'ⳣ' => 'Ⳣ', + 'ⳬ' => 'Ⳬ', + 'ⳮ' => 'Ⳮ', + 'ⳳ' => 'Ⳳ', + 'ⴀ' => 'Ⴀ', + 'ⴁ' => 'Ⴁ', + 'ⴂ' => 'Ⴂ', + 'ⴃ' => 'Ⴃ', + 'ⴄ' => 'Ⴄ', + 'ⴅ' => 'Ⴅ', + 'ⴆ' => 'Ⴆ', + 'ⴇ' => 'Ⴇ', + 'ⴈ' => 'Ⴈ', + 'ⴉ' => 'Ⴉ', + 'ⴊ' => 'Ⴊ', + 'ⴋ' => 'Ⴋ', + 'ⴌ' => 'Ⴌ', + 'ⴍ' => 'Ⴍ', + 'ⴎ' => 'Ⴎ', + 'ⴏ' => 'Ⴏ', + 'ⴐ' => 'Ⴐ', + 'ⴑ' => 'Ⴑ', + 'ⴒ' => 'Ⴒ', + 'ⴓ' => 'Ⴓ', + 'ⴔ' => 'Ⴔ', + 'ⴕ' => 'Ⴕ', + 'ⴖ' => 'Ⴖ', + 'ⴗ' => 'Ⴗ', + 'ⴘ' => 'Ⴘ', + 'ⴙ' => 'Ⴙ', + 'ⴚ' => 'Ⴚ', + 'ⴛ' => 'Ⴛ', + 'ⴜ' => 'Ⴜ', + 'ⴝ' => 'Ⴝ', + 'ⴞ' => 'Ⴞ', + 'ⴟ' => 'Ⴟ', + 'ⴠ' => 'Ⴠ', + 'ⴡ' => 'Ⴡ', + 'ⴢ' => 'Ⴢ', + 'ⴣ' => 'Ⴣ', + 'ⴤ' => 'Ⴤ', + 'ⴥ' => 'Ⴥ', + 'ⴧ' => 'Ⴧ', + 'ⴭ' => 'Ⴭ', + 'ꙁ' => 'Ꙁ', + 'ꙃ' => 'Ꙃ', + 'ꙅ' => 'Ꙅ', + 'ꙇ' => 'Ꙇ', + 'ꙉ' => 'Ꙉ', + 'ꙋ' => 'Ꙋ', + 'ꙍ' => 'Ꙍ', + 'ꙏ' => 'Ꙏ', + 'ꙑ' => 'Ꙑ', + 'ꙓ' => 'Ꙓ', + 'ꙕ' => 'Ꙕ', + 'ꙗ' => 'Ꙗ', + 'ꙙ' => 'Ꙙ', + 'ꙛ' => 'Ꙛ', + 'ꙝ' => 'Ꙝ', + 'ꙟ' => 'Ꙟ', + 'ꙡ' => 'Ꙡ', + 'ꙣ' => 'Ꙣ', + 'ꙥ' => 'Ꙥ', + 'ꙧ' => 'Ꙧ', + 'ꙩ' => 'Ꙩ', + 'ꙫ' => 'Ꙫ', + 'ꙭ' => 'Ꙭ', + 'ꚁ' => 'Ꚁ', + 'ꚃ' => 'Ꚃ', + 'ꚅ' => 'Ꚅ', + 'ꚇ' => 'Ꚇ', + 'ꚉ' => 'Ꚉ', + 'ꚋ' => 'Ꚋ', + 'ꚍ' => 'Ꚍ', + 'ꚏ' => 'Ꚏ', + 'ꚑ' => 'Ꚑ', + 'ꚓ' => 'Ꚓ', + 'ꚕ' => 'Ꚕ', + 'ꚗ' => 'Ꚗ', + 'ꚙ' => 'Ꚙ', + 'ꚛ' => 'Ꚛ', + 'ꜣ' => 'Ꜣ', + 'ꜥ' => 'Ꜥ', + 'ꜧ' => 'Ꜧ', + 'ꜩ' => 'Ꜩ', + 'ꜫ' => 'Ꜫ', + 'ꜭ' => 'Ꜭ', + 'ꜯ' => 'Ꜯ', + 'ꜳ' => 'Ꜳ', + 'ꜵ' => 'Ꜵ', + 'ꜷ' => 'Ꜷ', + 'ꜹ' => 'Ꜹ', + 'ꜻ' => 'Ꜻ', + 'ꜽ' => 'Ꜽ', + 'ꜿ' => 'Ꜿ', + 'ꝁ' => 'Ꝁ', + 'ꝃ' => 'Ꝃ', + 'ꝅ' => 'Ꝅ', + 'ꝇ' => 'Ꝇ', + 'ꝉ' => 'Ꝉ', + 'ꝋ' => 'Ꝋ', + 'ꝍ' => 'Ꝍ', + 'ꝏ' => 'Ꝏ', + 'ꝑ' => 'Ꝑ', + 'ꝓ' => 'Ꝓ', + 'ꝕ' => 'Ꝕ', + 'ꝗ' => 'Ꝗ', + 'ꝙ' => 'Ꝙ', + 'ꝛ' => 'Ꝛ', + 'ꝝ' => 'Ꝝ', + 'ꝟ' => 'Ꝟ', + 'ꝡ' => 'Ꝡ', + 'ꝣ' => 'Ꝣ', + 'ꝥ' => 'Ꝥ', + 'ꝧ' => 'Ꝧ', + 'ꝩ' => 'Ꝩ', + 'ꝫ' => 'Ꝫ', + 'ꝭ' => 'Ꝭ', + 'ꝯ' => 'Ꝯ', + 'ꝺ' => 'Ꝺ', + 'ꝼ' => 'Ꝼ', + 'ꝿ' => 'Ꝿ', + 'ꞁ' => 'Ꞁ', + 'ꞃ' => 'Ꞃ', + 'ꞅ' => 'Ꞅ', + 'ꞇ' => 'Ꞇ', + 'ꞌ' => 'Ꞌ', + 'ꞑ' => 'Ꞑ', + 'ꞓ' => 'Ꞓ', + 'ꞔ' => 'Ꞔ', + 'ꞗ' => 'Ꞗ', + 'ꞙ' => 'Ꞙ', + 'ꞛ' => 'Ꞛ', + 'ꞝ' => 'Ꞝ', + 'ꞟ' => 'Ꞟ', + 'ꞡ' => 'Ꞡ', + 'ꞣ' => 'Ꞣ', + 'ꞥ' => 'Ꞥ', + 'ꞧ' => 'Ꞧ', + 'ꞩ' => 'Ꞩ', + 'ꞵ' => 'Ꞵ', + 'ꞷ' => 'Ꞷ', + 'ꞹ' => 'Ꞹ', + 'ꞻ' => 'Ꞻ', + 'ꞽ' => 'Ꞽ', + 'ꞿ' => 'Ꞿ', + 'ꟃ' => 'Ꟃ', + 'ꟈ' => 'Ꟈ', + 'ꟊ' => 'Ꟊ', + 'ꟶ' => 'Ꟶ', + 'ꭓ' => 'Ꭓ', + 'ꭰ' => 'Ꭰ', + 'ꭱ' => 'Ꭱ', + 'ꭲ' => 'Ꭲ', + 'ꭳ' => 'Ꭳ', + 'ꭴ' => 'Ꭴ', + 'ꭵ' => 'Ꭵ', + 'ꭶ' => 'Ꭶ', + 'ꭷ' => 'Ꭷ', + 'ꭸ' => 'Ꭸ', + 'ꭹ' => 'Ꭹ', + 'ꭺ' => 'Ꭺ', + 'ꭻ' => 'Ꭻ', + 'ꭼ' => 'Ꭼ', + 'ꭽ' => 'Ꭽ', + 'ꭾ' => 'Ꭾ', + 'ꭿ' => 'Ꭿ', + 'ꮀ' => 'Ꮀ', + 'ꮁ' => 'Ꮁ', + 'ꮂ' => 'Ꮂ', + 'ꮃ' => 'Ꮃ', + 'ꮄ' => 'Ꮄ', + 'ꮅ' => 'Ꮅ', + 'ꮆ' => 'Ꮆ', + 'ꮇ' => 'Ꮇ', + 'ꮈ' => 'Ꮈ', + 'ꮉ' => 'Ꮉ', + 'ꮊ' => 'Ꮊ', + 'ꮋ' => 'Ꮋ', + 'ꮌ' => 'Ꮌ', + 'ꮍ' => 'Ꮍ', + 'ꮎ' => 'Ꮎ', + 'ꮏ' => 'Ꮏ', + 'ꮐ' => 'Ꮐ', + 'ꮑ' => 'Ꮑ', + 'ꮒ' => 'Ꮒ', + 'ꮓ' => 'Ꮓ', + 'ꮔ' => 'Ꮔ', + 'ꮕ' => 'Ꮕ', + 'ꮖ' => 'Ꮖ', + 'ꮗ' => 'Ꮗ', + 'ꮘ' => 'Ꮘ', + 'ꮙ' => 'Ꮙ', + 'ꮚ' => 'Ꮚ', + 'ꮛ' => 'Ꮛ', + 'ꮜ' => 'Ꮜ', + 'ꮝ' => 'Ꮝ', + 'ꮞ' => 'Ꮞ', + 'ꮟ' => 'Ꮟ', + 'ꮠ' => 'Ꮠ', + 'ꮡ' => 'Ꮡ', + 'ꮢ' => 'Ꮢ', + 'ꮣ' => 'Ꮣ', + 'ꮤ' => 'Ꮤ', + 'ꮥ' => 'Ꮥ', + 'ꮦ' => 'Ꮦ', + 'ꮧ' => 'Ꮧ', + 'ꮨ' => 'Ꮨ', + 'ꮩ' => 'Ꮩ', + 'ꮪ' => 'Ꮪ', + 'ꮫ' => 'Ꮫ', + 'ꮬ' => 'Ꮬ', + 'ꮭ' => 'Ꮭ', + 'ꮮ' => 'Ꮮ', + 'ꮯ' => 'Ꮯ', + 'ꮰ' => 'Ꮰ', + 'ꮱ' => 'Ꮱ', + 'ꮲ' => 'Ꮲ', + 'ꮳ' => 'Ꮳ', + 'ꮴ' => 'Ꮴ', + 'ꮵ' => 'Ꮵ', + 'ꮶ' => 'Ꮶ', + 'ꮷ' => 'Ꮷ', + 'ꮸ' => 'Ꮸ', + 'ꮹ' => 'Ꮹ', + 'ꮺ' => 'Ꮺ', + 'ꮻ' => 'Ꮻ', + 'ꮼ' => 'Ꮼ', + 'ꮽ' => 'Ꮽ', + 'ꮾ' => 'Ꮾ', + 'ꮿ' => 'Ꮿ', + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + '𐐨' => '𐐀', + '𐐩' => '𐐁', + '𐐪' => '𐐂', + '𐐫' => '𐐃', + '𐐬' => '𐐄', + '𐐭' => '𐐅', + '𐐮' => '𐐆', + '𐐯' => '𐐇', + '𐐰' => '𐐈', + '𐐱' => '𐐉', + '𐐲' => '𐐊', + '𐐳' => '𐐋', + '𐐴' => '𐐌', + '𐐵' => '𐐍', + '𐐶' => '𐐎', + '𐐷' => '𐐏', + '𐐸' => '𐐐', + '𐐹' => '𐐑', + '𐐺' => '𐐒', + '𐐻' => '𐐓', + '𐐼' => '𐐔', + '𐐽' => '𐐕', + '𐐾' => '𐐖', + '𐐿' => '𐐗', + '𐑀' => '𐐘', + '𐑁' => '𐐙', + '𐑂' => '𐐚', + '𐑃' => '𐐛', + '𐑄' => '𐐜', + '𐑅' => '𐐝', + '𐑆' => '𐐞', + '𐑇' => '𐐟', + '𐑈' => '𐐠', + '𐑉' => '𐐡', + '𐑊' => '𐐢', + '𐑋' => '𐐣', + '𐑌' => '𐐤', + '𐑍' => '𐐥', + '𐑎' => '𐐦', + '𐑏' => '𐐧', + '𐓘' => '𐒰', + '𐓙' => '𐒱', + '𐓚' => '𐒲', + '𐓛' => '𐒳', + '𐓜' => '𐒴', + '𐓝' => '𐒵', + '𐓞' => '𐒶', + '𐓟' => '𐒷', + '𐓠' => '𐒸', + '𐓡' => '𐒹', + '𐓢' => '𐒺', + '𐓣' => '𐒻', + '𐓤' => '𐒼', + '𐓥' => '𐒽', + '𐓦' => '𐒾', + '𐓧' => '𐒿', + '𐓨' => '𐓀', + '𐓩' => '𐓁', + '𐓪' => '𐓂', + '𐓫' => '𐓃', + '𐓬' => '𐓄', + '𐓭' => '𐓅', + '𐓮' => '𐓆', + '𐓯' => '𐓇', + '𐓰' => '𐓈', + '𐓱' => '𐓉', + '𐓲' => '𐓊', + '𐓳' => '𐓋', + '𐓴' => '𐓌', + '𐓵' => '𐓍', + '𐓶' => '𐓎', + '𐓷' => '𐓏', + '𐓸' => '𐓐', + '𐓹' => '𐓑', + '𐓺' => '𐓒', + '𐓻' => '𐓓', + '𐳀' => '𐲀', + '𐳁' => '𐲁', + '𐳂' => '𐲂', + '𐳃' => '𐲃', + '𐳄' => '𐲄', + '𐳅' => '𐲅', + '𐳆' => '𐲆', + '𐳇' => '𐲇', + '𐳈' => '𐲈', + '𐳉' => '𐲉', + '𐳊' => '𐲊', + '𐳋' => '𐲋', + '𐳌' => '𐲌', + '𐳍' => '𐲍', + '𐳎' => '𐲎', + '𐳏' => '𐲏', + '𐳐' => '𐲐', + '𐳑' => '𐲑', + '𐳒' => '𐲒', + '𐳓' => '𐲓', + '𐳔' => '𐲔', + '𐳕' => '𐲕', + '𐳖' => '𐲖', + '𐳗' => '𐲗', + '𐳘' => '𐲘', + '𐳙' => '𐲙', + '𐳚' => '𐲚', + '𐳛' => '𐲛', + '𐳜' => '𐲜', + '𐳝' => '𐲝', + '𐳞' => '𐲞', + '𐳟' => '𐲟', + '𐳠' => '𐲠', + '𐳡' => '𐲡', + '𐳢' => '𐲢', + '𐳣' => '𐲣', + '𐳤' => '𐲤', + '𐳥' => '𐲥', + '𐳦' => '𐲦', + '𐳧' => '𐲧', + '𐳨' => '𐲨', + '𐳩' => '𐲩', + '𐳪' => '𐲪', + '𐳫' => '𐲫', + '𐳬' => '𐲬', + '𐳭' => '𐲭', + '𐳮' => '𐲮', + '𐳯' => '𐲯', + '𐳰' => '𐲰', + '𐳱' => '𐲱', + '𐳲' => '𐲲', + '𑣀' => '𑢠', + '𑣁' => '𑢡', + '𑣂' => '𑢢', + '𑣃' => '𑢣', + '𑣄' => '𑢤', + '𑣅' => '𑢥', + '𑣆' => '𑢦', + '𑣇' => '𑢧', + '𑣈' => '𑢨', + '𑣉' => '𑢩', + '𑣊' => '𑢪', + '𑣋' => '𑢫', + '𑣌' => '𑢬', + '𑣍' => '𑢭', + '𑣎' => '𑢮', + '𑣏' => '𑢯', + '𑣐' => '𑢰', + '𑣑' => '𑢱', + '𑣒' => '𑢲', + '𑣓' => '𑢳', + '𑣔' => '𑢴', + '𑣕' => '𑢵', + '𑣖' => '𑢶', + '𑣗' => '𑢷', + '𑣘' => '𑢸', + '𑣙' => '𑢹', + '𑣚' => '𑢺', + '𑣛' => '𑢻', + '𑣜' => '𑢼', + '𑣝' => '𑢽', + '𑣞' => '𑢾', + '𑣟' => '𑢿', + '𖹠' => '𖹀', + '𖹡' => '𖹁', + '𖹢' => '𖹂', + '𖹣' => '𖹃', + '𖹤' => '𖹄', + '𖹥' => '𖹅', + '𖹦' => '𖹆', + '𖹧' => '𖹇', + '𖹨' => '𖹈', + '𖹩' => '𖹉', + '𖹪' => '𖹊', + '𖹫' => '𖹋', + '𖹬' => '𖹌', + '𖹭' => '𖹍', + '𖹮' => '𖹎', + '𖹯' => '𖹏', + '𖹰' => '𖹐', + '𖹱' => '𖹑', + '𖹲' => '𖹒', + '𖹳' => '𖹓', + '𖹴' => '𖹔', + '𖹵' => '𖹕', + '𖹶' => '𖹖', + '𖹷' => '𖹗', + '𖹸' => '𖹘', + '𖹹' => '𖹙', + '𖹺' => '𖹚', + '𖹻' => '𖹛', + '𖹼' => '𖹜', + '𖹽' => '𖹝', + '𖹾' => '𖹞', + '𖹿' => '𖹟', + '𞤢' => '𞤀', + '𞤣' => '𞤁', + '𞤤' => '𞤂', + '𞤥' => '𞤃', + '𞤦' => '𞤄', + '𞤧' => '𞤅', + '𞤨' => '𞤆', + '𞤩' => '𞤇', + '𞤪' => '𞤈', + '𞤫' => '𞤉', + '𞤬' => '𞤊', + '𞤭' => '𞤋', + '𞤮' => '𞤌', + '𞤯' => '𞤍', + '𞤰' => '𞤎', + '𞤱' => '𞤏', + '𞤲' => '𞤐', + '𞤳' => '𞤑', + '𞤴' => '𞤒', + '𞤵' => '𞤓', + '𞤶' => '𞤔', + '𞤷' => '𞤕', + '𞤸' => '𞤖', + '𞤹' => '𞤗', + '𞤺' => '𞤘', + '𞤻' => '𞤙', + '𞤼' => '𞤚', + '𞤽' => '𞤛', + '𞤾' => '𞤜', + '𞤿' => '𞤝', + '𞥀' => '𞤞', + '𞥁' => '𞤟', + '𞥂' => '𞤠', + '𞥃' => '𞤡', + 'ß' => 'SS', + 'ff' => 'FF', + 'fi' => 'FI', + 'fl' => 'FL', + 'ffi' => 'FFI', + 'ffl' => 'FFL', + 'ſt' => 'ST', + 'st' => 'ST', + 'և' => 'ԵՒ', + 'ﬓ' => 'ՄՆ', + 'ﬔ' => 'ՄԵ', + 'ﬕ' => 'ՄԻ', + 'ﬖ' => 'ՎՆ', + 'ﬗ' => 'ՄԽ', + 'ʼn' => 'ʼN', + 'ΐ' => 'Ϊ́', + 'ΰ' => 'Ϋ́', + 'ǰ' => 'J̌', + 'ẖ' => 'H̱', + 'ẗ' => 'T̈', + 'ẘ' => 'W̊', + 'ẙ' => 'Y̊', + 'ẚ' => 'Aʾ', + 'ὐ' => 'Υ̓', + 'ὒ' => 'Υ̓̀', + 'ὔ' => 'Υ̓́', + 'ὖ' => 'Υ̓͂', + 'ᾶ' => 'Α͂', + 'ῆ' => 'Η͂', + 'ῒ' => 'Ϊ̀', + 'ΐ' => 'Ϊ́', + 'ῖ' => 'Ι͂', + 'ῗ' => 'Ϊ͂', + 'ῢ' => 'Ϋ̀', + 'ΰ' => 'Ϋ́', + 'ῤ' => 'Ρ̓', + 'ῦ' => 'Υ͂', + 'ῧ' => 'Ϋ͂', + 'ῶ' => 'Ω͂', + 'ᾈ' => 'ἈΙ', + 'ᾉ' => 'ἉΙ', + 'ᾊ' => 'ἊΙ', + 'ᾋ' => 'ἋΙ', + 'ᾌ' => 'ἌΙ', + 'ᾍ' => 'ἍΙ', + 'ᾎ' => 'ἎΙ', + 'ᾏ' => 'ἏΙ', + 'ᾘ' => 'ἨΙ', + 'ᾙ' => 'ἩΙ', + 'ᾚ' => 'ἪΙ', + 'ᾛ' => 'ἫΙ', + 'ᾜ' => 'ἬΙ', + 'ᾝ' => 'ἭΙ', + 'ᾞ' => 'ἮΙ', + 'ᾟ' => 'ἯΙ', + 'ᾨ' => 'ὨΙ', + 'ᾩ' => 'ὩΙ', + 'ᾪ' => 'ὪΙ', + 'ᾫ' => 'ὫΙ', + 'ᾬ' => 'ὬΙ', + 'ᾭ' => 'ὭΙ', + 'ᾮ' => 'ὮΙ', + 'ᾯ' => 'ὯΙ', + 'ᾼ' => 'ΑΙ', + 'ῌ' => 'ΗΙ', + 'ῼ' => 'ΩΙ', + 'ᾲ' => 'ᾺΙ', + 'ᾴ' => 'ΆΙ', + 'ῂ' => 'ῊΙ', + 'ῄ' => 'ΉΙ', + 'ῲ' => 'ῺΙ', + 'ῴ' => 'ΏΙ', + 'ᾷ' => 'Α͂Ι', + 'ῇ' => 'Η͂Ι', + 'ῷ' => 'Ω͂Ι', +); diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 0000000000..ff51ae0796 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language($language = null) { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap80.php b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap80.php new file mode 100644 index 0000000000..5be7d2018f --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Php80.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Php80.php new file mode 100644 index 0000000000..362dd1a959 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Php80.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Ion Bazan + * @author Nico Oelgart + * @author Nicolas Grekas + * + * @internal + */ +final class Php80 +{ + public static function fdiv(float $dividend, float $divisor): float + { + return @($dividend / $divisor); + } + + public static function get_debug_type($value): string + { + switch (true) { + case null === $value: return 'null'; + case \is_bool($value): return 'bool'; + case \is_string($value): return 'string'; + case \is_array($value): return 'array'; + case \is_int($value): return 'int'; + case \is_float($value): return 'float'; + case \is_object($value): break; + case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; + default: + if (null === $type = @get_resource_type($value)) { + return 'unknown'; + } + + if ('Unknown' === $type) { + $type = 'closed'; + } + + return "resource ($type)"; + } + + $class = \get_class($value); + + if (false === strpos($class, '@')) { + return $class; + } + + return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; + } + + public static function get_resource_id($res): int + { + if (!\is_resource($res) && null === @get_resource_type($res)) { + throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); + } + + return (int) $res; + } + + public static function preg_last_error_msg(): string + { + switch (preg_last_error()) { + case \PREG_INTERNAL_ERROR: + return 'Internal error'; + case \PREG_BAD_UTF8_ERROR: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + case \PREG_BAD_UTF8_OFFSET_ERROR: + return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; + case \PREG_BACKTRACK_LIMIT_ERROR: + return 'Backtrack limit exhausted'; + case \PREG_RECURSION_LIMIT_ERROR: + return 'Recursion limit exhausted'; + case \PREG_JIT_STACKLIMIT_ERROR: + return 'JIT stack limit exhausted'; + case \PREG_NO_ERROR: + return 'No error'; + default: + return 'Unknown error'; + } + } + + public static function str_contains(string $haystack, string $needle): bool + { + return '' === $needle || false !== strpos($haystack, $needle); + } + + public static function str_starts_with(string $haystack, string $needle): bool + { + return 0 === strncmp($haystack, $needle, \strlen($needle)); + } + + public static function str_ends_with(string $haystack, string $needle): bool + { + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/PhpToken.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 0000000000..fe6e691056 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var int + */ + public $line; + + /** + * @var int + */ + public $pos; + + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/README.md b/plugin/onlyoffice/vendor/symfony/polyfill-php80/README.md new file mode 100644 index 0000000000..3816c559d5 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/README.md @@ -0,0 +1,25 @@ +Symfony Polyfill / Php80 +======================== + +This component provides features added to PHP 8.0 core: + +- [`Stringable`](https://php.net/stringable) interface +- [`fdiv`](https://php.net/fdiv) +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class +- `FILTER_VALIDATE_BOOL` constant +- [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class +- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) +- [`str_contains`](https://php.net/str_contains) +- [`str_starts_with`](https://php.net/str_starts_with) +- [`str_ends_with`](https://php.net/str_ends_with) +- [`get_resource_id`](https://php.net/get_resource_id) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php new file mode 100644 index 0000000000..2b955423fc --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#[Attribute(Attribute::TARGET_CLASS)] +final class Attribute +{ + public const TARGET_CLASS = 1; + public const TARGET_FUNCTION = 2; + public const TARGET_METHOD = 4; + public const TARGET_PROPERTY = 8; + public const TARGET_CLASS_CONSTANT = 16; + public const TARGET_PARAMETER = 32; + public const TARGET_ALL = 63; + public const IS_REPEATABLE = 64; + + /** @var int */ + public $flags; + + public function __construct(int $flags = self::TARGET_ALL) + { + $this->flags = $flags; + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 0000000000..bd1212f6e4 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { + class PhpToken extends Symfony\Polyfill\Php80\PhpToken + { + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php new file mode 100644 index 0000000000..7c62d7508b --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + interface Stringable + { + /** + * @return string + */ + public function __toString(); + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php new file mode 100644 index 0000000000..01c6c6c8ab --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class UnhandledMatchError extends Error + { + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php new file mode 100644 index 0000000000..783dbc28c7 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class ValueError extends Error + { + } +} diff --git a/plugin/onlyoffice/vendor/symfony/polyfill-php80/bootstrap.php b/plugin/onlyoffice/vendor/symfony/polyfill-php80/bootstrap.php new file mode 100644 index 0000000000..e5f7dbc1a4 --- /dev/null +++ b/plugin/onlyoffice/vendor/symfony/polyfill-php80/bootstrap.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php80 as p; + +if (\PHP_VERSION_ID >= 80000) { + return; +} + +if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { + define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); +} + +if (!function_exists('fdiv')) { + function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } +} +if (!function_exists('preg_last_error_msg')) { + function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } +} +if (!function_exists('str_contains')) { + function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_starts_with')) { + function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('get_debug_type')) { + function get_debug_type($value): string { return p\Php80::get_debug_type($value); } +} +if (!function_exists('get_resource_id')) { + function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Dotenv.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Dotenv.php new file mode 100644 index 0000000000..6821c7d98d --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Dotenv.php @@ -0,0 +1,267 @@ +store = $store; + $this->parser = $parser; + $this->loader = $loader; + $this->repository = $repository; + } + + /** + * Create a new dotenv instance. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function create(RepositoryInterface $repository, $paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $builder = $names === null ? StoreBuilder::createWithDefaultName() : StoreBuilder::createWithNoNames(); + + foreach ((array) $paths as $path) { + $builder = $builder->addPath($path); + } + + foreach ((array) $names as $name) { + $builder = $builder->addName($name); + } + + if ($shortCircuit) { + $builder = $builder->shortCircuit(); + } + + return new self($builder->fileEncoding($fileEncoding)->make(), new Parser(), new Loader(), $repository); + } + + /** + * Create a new mutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new mutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->immutable()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->immutable() + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new dotenv instance with an array backed repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createArrayBacked($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Parse the given content and resolve nested variables. + * + * This method behaves just like load(), only without mutating your actual + * environment. We do this by using an array backed repository. + * + * @param string $content + * + * @throws \Dotenv\Exception\InvalidFileException + * + * @return array + */ + public static function parse(string $content) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + $phpdotenv = new self(new StringStore($content), new Parser(), new Loader(), $repository); + + return $phpdotenv->load(); + } + + /** + * Read and load environment file(s). + * + * @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array + */ + public function load() + { + $entries = $this->parser->parse($this->store->read()); + + return $this->loader->load($this->repository, $entries); + } + + /** + * Read and load environment file(s), silently failing if no files can be read. + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array + */ + public function safeLoad() + { + try { + return $this->load(); + } catch (InvalidPathException $e) { + // suppressing exception + return []; + } + } + + /** + * Required ensures that the specified variables exist, and returns a new validator object. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function required($variables) + { + return (new Validator($this->repository, (array) $variables))->required(); + } + + /** + * Returns a new validator object that won't check if the specified variables exist. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function ifPresent($variables) + { + return new Validator($this->repository, (array) $variables); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..1e80f53177 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php @@ -0,0 +1,12 @@ + + */ + public function load(RepositoryInterface $repository, array $entries) + { + return \array_reduce($entries, static function (array $vars, Entry $entry) use ($repository) { + $name = $entry->getName(); + + $value = $entry->getValue()->map(static function (Value $value) use ($repository) { + return Resolver::resolve($repository, $value); + }); + + if ($value->isDefined()) { + $inner = $value->get(); + if ($repository->set($name, $inner)) { + return \array_merge($vars, [$name => $inner]); + } + } else { + if ($repository->clear($name)) { + return \array_merge($vars, [$name => null]); + } + } + + return $vars; + }, []); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php new file mode 100644 index 0000000000..275d98e8d6 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php @@ -0,0 +1,20 @@ + + */ + public function load(RepositoryInterface $repository, array $entries); +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/Resolver.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/Resolver.php new file mode 100644 index 0000000000..36d7a4b9cc --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Loader/Resolver.php @@ -0,0 +1,65 @@ +getVars(), static function (string $s, int $i) use ($repository) { + return Str::substr($s, 0, $i).self::resolveVariable($repository, Str::substr($s, $i)); + }, $value->getChars()); + } + + /** + * Resolve a single nested variable. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string $str + * + * @return string + */ + private static function resolveVariable(RepositoryInterface $repository, string $str) + { + return Regex::replaceCallback( + '/\A\${([a-zA-Z0-9_.]+)}/', + static function (array $matches) use ($repository) { + return Option::fromValue($repository->get($matches[1])) + ->getOrElse($matches[0]); + }, + $str, + 1 + )->success()->getOrElse($str); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Entry.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Entry.php new file mode 100644 index 0000000000..716f422eed --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Entry.php @@ -0,0 +1,59 @@ +name = $name; + $this->value = $value; + } + + /** + * Get the entry name. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get the entry value. + * + * @return \PhpOption\Option<\Dotenv\Parser\Value> + */ + public function getValue() + { + /** @var \PhpOption\Option<\Dotenv\Parser\Value> */ + return Option::fromValue($this->value); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php new file mode 100644 index 0000000000..e286840a25 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php @@ -0,0 +1,300 @@ + + */ + public static function parse(string $entry) + { + return self::splitStringIntoParts($entry)->flatMap(static function (array $parts) { + [$name, $value] = $parts; + + return self::parseName($name)->flatMap(static function (string $name) use ($value) { + /** @var Result */ + $parsedValue = $value === null ? Success::create(null) : self::parseValue($value); + + return $parsedValue->map(static function (?Value $value) use ($name) { + return new Entry($name, $value); + }); + }); + }); + } + + /** + * Split the compound string into parts. + * + * @param string $line + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function splitStringIntoParts(string $line) + { + /** @var array{string,string|null} */ + $result = Str::pos($line, '=')->map(static function () use ($line) { + return \array_map('trim', \explode('=', $line, 2)); + })->getOrElse([$line, null]); + + if ($result[0] === '') { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(self::getErrorMessage('an unexpected equals', $line)); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($result); + } + + /** + * Parse the given variable name. + * + * That is, strip the optional quotes and leading "export" from the + * variable name. We wrap the answer in a result type. + * + * @param string $name + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function parseName(string $name) + { + if (Str::len($name) > 8 && Str::substr($name, 0, 6) === 'export' && \ctype_space(Str::substr($name, 6, 1))) { + $name = \ltrim(Str::substr($name, 6)); + } + + if (self::isQuotedName($name)) { + $name = Str::substr($name, 1, -1); + } + + if (!self::isValidName($name)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(self::getErrorMessage('an invalid name', $name)); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($name); + } + + /** + * Is the given variable name quoted? + * + * @param string $name + * + * @return bool + */ + private static function isQuotedName(string $name) + { + if (Str::len($name) < 3) { + return false; + } + + $first = Str::substr($name, 0, 1); + $last = Str::substr($name, -1, 1); + + return ($first === '"' && $last === '"') || ($first === '\'' && $last === '\''); + } + + /** + * Is the given variable name valid? + * + * @param string $name + * + * @return bool + */ + private static function isValidName(string $name) + { + return Regex::matches('~(*UTF8)\A[\p{Ll}\p{Lu}\p{M}\p{N}_.]+\z~', $name)->success()->getOrElse(false); + } + + /** + * Parse the given variable value. + * + * This has the effect of stripping quotes and comments, dealing with + * special characters, and locating nested variables, but not resolving + * them. Formally, we run a finite state automaton with an output tape: a + * transducer. We wrap the answer in a result type. + * + * @param string $value + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value,string> + */ + private static function parseValue(string $value) + { + if (\trim($value) === '') { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value,string> */ + return Success::create(Value::blank()); + } + + return \array_reduce(\iterator_to_array(Lexer::lex($value)), static function (Result $data, string $token) { + return $data->flatMap(static function (array $data) use ($token) { + return self::processToken($data[1], $token)->map(static function (array $val) use ($data) { + return [$data[0]->append($val[0], $val[1]), $val[2]]; + }); + }); + }, Success::create([Value::blank(), self::INITIAL_STATE]))->flatMap(static function (array $result) { + /** @psalm-suppress DocblockTypeContradiction */ + if (in_array($result[1], self::REJECT_STATES, true)) { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value,string> */ + return Error::create('a missing closing quote'); + } + + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value,string> */ + return Success::create($result[0]); + })->mapError(static function (string $err) use ($value) { + return self::getErrorMessage($err, $value); + }); + } + + /** + * Process the given token. + * + * @param int $state + * @param string $token + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function processToken(int $state, string $token) + { + switch ($state) { + case self::INITIAL_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::SINGLE_QUOTED_STATE]); + } elseif ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::UNQUOTED_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::SINGLE_QUOTED_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::SINGLE_QUOTED_STATE]); + } + case self::DOUBLE_QUOTED_STATE: + if ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '\\') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::ESCAPE_SEQUENCE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } + case self::ESCAPE_SEQUENCE_STATE: + if ($token === '"' || $token === '\\') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } else { + $first = Str::substr($token, 0, 1); + if (\in_array($first, ['f', 'n', 'r', 't', 'v'], true)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([\stripcslashes('\\'.$first).Str::substr($token, 1), false, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create('an unexpected escape sequence'); + } + } + case self::WHITESPACE_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (!\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create('unexpected whitespace'); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } + case self::COMMENT_STATE: + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + default: + throw new \Error('Parser entered invalid state.'); + } + } + + /** + * Generate a friendly error message. + * + * @param string $cause + * @param string $subject + * + * @return string + */ + private static function getErrorMessage(string $cause, string $subject) + { + return \sprintf( + 'Encountered %s at [%s].', + $cause, + \strtok($subject, "\n") + ); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lexer.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lexer.php new file mode 100644 index 0000000000..981af24f12 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lexer.php @@ -0,0 +1,58 @@ + + */ + public static function lex(string $content) + { + static $regex; + + if ($regex === null) { + $regex = '(('.\implode(')|(', self::PATTERNS).'))A'; + } + + $offset = 0; + + while (isset($content[$offset])) { + if (!\preg_match($regex, $content, $matches, 0, $offset)) { + throw new \Error(\sprintf('Lexer encountered unexpected character [%s].', $content[$offset])); + } + + $offset += \strlen($matches[0]); + + yield $matches[0]; + } + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lines.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lines.php new file mode 100644 index 0000000000..64979932dc --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Lines.php @@ -0,0 +1,127 @@ +map(static function () use ($line) { + return self::looksLikeMultilineStop($line, true) === false; + })->getOrElse(false); + } + + /** + * Determine if the given line can be the start of a multiline variable. + * + * @param string $line + * @param bool $started + * + * @return bool + */ + private static function looksLikeMultilineStop(string $line, bool $started) + { + if ($line === '"') { + return true; + } + + return Regex::occurrences('/(?=([^\\\\]"))/', \str_replace('\\\\', '', $line))->map(static function (int $count) use ($started) { + return $started ? $count > 1 : $count >= 1; + })->success()->getOrElse(false); + } + + /** + * Determine if the line in the file is a comment or whitespace. + * + * @param string $line + * + * @return bool + */ + private static function isCommentOrWhitespace(string $line) + { + $line = \trim($line); + + return $line === '' || (isset($line[0]) && $line[0] === '#'); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Parser.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Parser.php new file mode 100644 index 0000000000..2d30dfd6ba --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/Parser.php @@ -0,0 +1,53 @@ +mapError(static function () { + return 'Could not split into separate lines.'; + })->flatMap(static function (array $lines) { + return self::process(Lines::process($lines)); + })->mapError(static function (string $error) { + throw new InvalidFileException(\sprintf('Failed to parse dotenv file. %s', $error)); + })->success()->get(); + } + + /** + * Convert the raw entries into proper entries. + * + * @param string[] $entries + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[],string> + */ + private static function process(array $entries) + { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[],string> */ + return \array_reduce($entries, static function (Result $result, string $raw) { + return $result->flatMap(static function (array $entries) use ($raw) { + return EntryParser::parse($raw)->map(static function (Entry $entry) use ($entries) { + /** @var \Dotenv\Parser\Entry[] */ + return \array_merge($entries, [$entry]); + }); + }); + }, Success::create([])); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php new file mode 100644 index 0000000000..17cc42adf9 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php @@ -0,0 +1,19 @@ +chars = $chars; + $this->vars = $vars; + } + + /** + * Create an empty value instance. + * + * @return \Dotenv\Parser\Value + */ + public static function blank() + { + return new self('', []); + } + + /** + * Create a new value instance, appending the characters. + * + * @param string $chars + * @param bool $var + * + * @return \Dotenv\Parser\Value + */ + public function append(string $chars, bool $var) + { + return new self( + $this->chars.$chars, + $var ? \array_merge($this->vars, [Str::len($this->chars)]) : $this->vars + ); + } + + /** + * Get the string representation of the parsed value. + * + * @return string + */ + public function getChars() + { + return $this->chars; + } + + /** + * Get the locations of the variables in the value. + * + * @return int[] + */ + public function getVars() + { + $vars = $this->vars; + + \rsort($vars); + + return $vars; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php new file mode 100644 index 0000000000..5604398a58 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php @@ -0,0 +1,15 @@ + + */ + public static function create(); +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php new file mode 100644 index 0000000000..af0aae1122 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * This happens if PHP is running as an Apache module. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('apache_getenv') && \function_exists('apache_setenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromValue(apache_getenv($name))->filter(static function ($value) { + return \is_string($value) && $value !== ''; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + return apache_setenv($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + return apache_setenv($name, ''); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php new file mode 100644 index 0000000000..df64cf6dba --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php @@ -0,0 +1,80 @@ + + */ + private $variables; + + /** + * Create a new array adapter instance. + * + * @return void + */ + private function __construct() + { + $this->variables = []; + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + return Option::fromArraysValue($this->variables, $name); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $this->variables[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($this->variables[$name]); + + return true; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php new file mode 100644 index 0000000000..9eb194779f --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromArraysValue($_ENV, $name) + ->filter(static function ($value) { + return \is_scalar($value); + }) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + /** @psalm-suppress PossiblyInvalidCast */ + return (string) $value; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_ENV[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_ENV[$name]); + + return true; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php new file mode 100644 index 0000000000..fed8b9bace --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php @@ -0,0 +1,85 @@ +writer = $writer; + $this->allowList = $allowList; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't set non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->write($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->delete($name); + } + + /** + * Determine if the given variable is allowed. + * + * @param non-empty-string $name + * + * @return bool + */ + private function isAllowed(string $name) + { + return \in_array($name, $this->allowList, true); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php new file mode 100644 index 0000000000..399e6f9bc7 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php @@ -0,0 +1,110 @@ + + */ + private $loaded; + + /** + * Create a new immutable writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->loaded = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't overwrite existing environment variables + // Ruby's dotenv does this with `ENV[key] ||= value` + if ($this->isExternallyDefined($name)) { + return false; + } + + // Set the value on the inner writer + if (!$this->writer->write($name, $value)) { + return false; + } + + // Record that we have loaded the variable + $this->loaded[$name] = ''; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear existing environment variables + if ($this->isExternallyDefined($name)) { + return false; + } + + // Clear the value on the inner writer + if (!$this->writer->delete($name)) { + return false; + } + + // Leave the variable as fair game + unset($this->loaded[$name]); + + return true; + } + + /** + * Determine if the given variable is externally defined. + * + * That is, is it an "existing" variable. + * + * @param non-empty-string $name + * + * @return bool + */ + private function isExternallyDefined(string $name) + { + return $this->reader->read($name)->isDefined() && !isset($this->loaded[$name]); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php new file mode 100644 index 0000000000..0cfda6f6f8 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php @@ -0,0 +1,48 @@ +readers = $readers; + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + foreach ($this->readers as $reader) { + $result = $reader->read($name); + if ($result->isDefined()) { + return $result; + } + } + + return None::create(); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php new file mode 100644 index 0000000000..15a9d8fde3 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php @@ -0,0 +1,64 @@ +writers = $writers; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + foreach ($this->writers as $writers) { + if (!$writers->write($name, $value)) { + return false; + } + } + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + foreach ($this->writers as $writers) { + if (!$writers->delete($name)) { + return false; + } + } + + return true; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php new file mode 100644 index 0000000000..6d017cdb2f --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php @@ -0,0 +1,91 @@ + + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('getenv') && \function_exists('putenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromValue(\getenv($name), false)->filter(static function ($value) { + return \is_string($value); + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + \putenv("$name=$value"); + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + \putenv($name); + + return true; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php new file mode 100644 index 0000000000..306a63fcfa --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php @@ -0,0 +1,17 @@ + + */ + public function read(string $name); +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php new file mode 100644 index 0000000000..98c0f041b7 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php @@ -0,0 +1,104 @@ + + */ + private $seen; + + /** + * Create a new replacement writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->seen = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + if ($this->exists($name)) { + return $this->writer->write($name, $value); + } + + // succeed if nothing to do + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + if ($this->exists($name)) { + return $this->writer->delete($name); + } + + // succeed if nothing to do + return true; + } + + /** + * Does the given environment variable exist. + * + * Returns true if it currently exists, or existed at any point in the past + * that we are aware of. + * + * @param non-empty-string $name + * + * @return bool + */ + private function exists(string $name) + { + if (isset($this->seen[$name])) { + return true; + } + + if ($this->reader->read($name)->isDefined()) { + $this->seen[$name] = ''; + + return true; + } + + return false; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php new file mode 100644 index 0000000000..f93b6e5e5e --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromArraysValue($_SERVER, $name) + ->filter(static function ($value) { + return \is_scalar($value); + }) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + /** @psalm-suppress PossiblyInvalidCast */ + return (string) $value; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_SERVER[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_SERVER[$name]); + + return true; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php new file mode 100644 index 0000000000..4cb3d61f36 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php @@ -0,0 +1,27 @@ +reader = $reader; + $this->writer = $writer; + } + + /** + * Determine if the given environment variable is defined. + * + * @param string $name + * + * @return bool + */ + public function has(string $name) + { + return '' !== $name && $this->reader->read($name)->isDefined(); + } + + /** + * Get an environment variable. + * + * @param string $name + * + * @throws \InvalidArgumentException + * + * @return string|null + */ + public function get(string $name) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->reader->read($name)->getOrElse(null); + } + + /** + * Set an environment variable. + * + * @param string $name + * @param string $value + * + * @throws \InvalidArgumentException + * + * @return bool + */ + public function set(string $name, string $value) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->writer->write($name, $value); + } + + /** + * Clear an environment variable. + * + * @param string $name + * + * @throws \InvalidArgumentException + * + * @return bool + */ + public function clear(string $name) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->writer->delete($name); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php new file mode 100644 index 0000000000..7607924461 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php @@ -0,0 +1,272 @@ +readers = $readers; + $this->writers = $writers; + $this->immutable = $immutable; + $this->allowList = $allowList; + } + + /** + * Create a new repository builder instance with no adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithNoAdapters() + { + return new self(); + } + + /** + * Create a new repository builder instance with the default adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithDefaultAdapters() + { + $adapters = \iterator_to_array(self::defaultAdapters()); + + return new self($adapters, $adapters); + } + + /** + * Return the array of default adapters. + * + * @return \Generator<\Dotenv\Repository\Adapter\AdapterInterface> + */ + private static function defaultAdapters() + { + foreach (self::DEFAULT_ADAPTERS as $adapter) { + $instance = $adapter::create(); + if ($instance->isDefined()) { + yield $instance->get(); + } + } + } + + /** + * Determine if the given name if of an adapterclass. + * + * @param string $name + * + * @return bool + */ + private static function isAnAdapterClass(string $name) + { + if (!\class_exists($name)) { + return false; + } + + return (new ReflectionClass($name))->implementsInterface(AdapterInterface::class); + } + + /** + * Creates a repository builder with the given reader added. + * + * Accepts either a reader instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface|string $reader + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addReader($reader) + { + if (!(\is_string($reader) && self::isAnAdapterClass($reader)) && !($reader instanceof ReaderInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + ReaderInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($reader)->flatMap(static function ($reader) { + return \is_string($reader) ? $reader::create() : Some::create($reader); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + + return new self($readers, $this->writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given writer added. + * + * Accepts either a writer instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $writer + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addWriter($writer) + { + if (!(\is_string($writer) && self::isAnAdapterClass($writer)) && !($writer instanceof WriterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($writer)->flatMap(static function ($writer) { + return \is_string($writer) ? $writer::create() : Some::create($writer); + }); + + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($this->readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given adapter added. + * + * Accepts either an adapter instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. We will + * add the adapter as both a reader and a writer. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $adapter + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addAdapter($adapter) + { + if (!(\is_string($adapter) && self::isAnAdapterClass($adapter)) && !($adapter instanceof AdapterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($adapter)->flatMap(static function ($adapter) { + return \is_string($adapter) ? $adapter::create() : Some::create($adapter); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with mutability enabled. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function immutable() + { + return new self($this->readers, $this->writers, true, $this->allowList); + } + + /** + * Creates a repository builder with the given allow list. + * + * @param string[]|null $allowList + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function allowList(?array $allowList = null) + { + return new self($this->readers, $this->writers, $this->immutable, $allowList); + } + + /** + * Creates a new repository instance. + * + * @return \Dotenv\Repository\RepositoryInterface + */ + public function make() + { + $reader = new MultiReader($this->readers); + $writer = new MultiWriter($this->writers); + + if ($this->immutable) { + $writer = new ImmutableWriter($writer, $reader); + } + + if ($this->allowList !== null) { + $writer = new GuardedWriter($writer, $this->allowList); + } + + return new AdapterRepository($reader, $writer); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php new file mode 100644 index 0000000000..d9b18a4034 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php @@ -0,0 +1,51 @@ + + */ + public static function read(array $filePaths, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $output = []; + + foreach ($filePaths as $filePath) { + $content = self::readFromFile($filePath, $fileEncoding); + if ($content->isDefined()) { + $output[$filePath] = $content->get(); + if ($shortCircuit) { + break; + } + } + } + + return $output; + } + + /** + * Read the given file. + * + * @param string $path + * @param string|null $encoding + * + * @throws \Dotenv\Exception\InvalidEncodingException + * + * @return \PhpOption\Option + */ + private static function readFromFile(string $path, ?string $encoding = null) + { + /** @var Option */ + $content = Option::fromValue(@\file_get_contents($path), false); + + return $content->flatMap(static function (string $content) use ($encoding) { + return Str::utf8($content, $encoding)->mapError(static function (string $error) { + throw new InvalidEncodingException($error); + })->success(); + }); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/FileStore.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/FileStore.php new file mode 100644 index 0000000000..e7a4d3f121 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/FileStore.php @@ -0,0 +1,72 @@ +filePaths = $filePaths; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Read the content of the environment file(s). + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidPathException + * + * @return string + */ + public function read() + { + if ($this->filePaths === []) { + throw new InvalidPathException('At least one environment file path must be provided.'); + } + + $contents = Reader::read($this->filePaths, $this->shortCircuit, $this->fileEncoding); + + if (\count($contents) > 0) { + return \implode("\n", $contents); + } + + throw new InvalidPathException( + \sprintf('Unable to read any of the environment file(s) at [%s].', \implode(', ', $this->filePaths)) + ); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php new file mode 100644 index 0000000000..2ce085158e --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php @@ -0,0 +1,141 @@ +paths = $paths; + $this->names = $names; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Create a new store builder instance with no names. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithNoNames() + { + return new self(); + } + + /** + * Create a new store builder instance with the default name. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithDefaultName() + { + return new self([], [self::DEFAULT_NAME]); + } + + /** + * Creates a store builder with the given path added. + * + * @param string $path + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addPath(string $path) + { + return new self(\array_merge($this->paths, [$path]), $this->names, $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with the given name added. + * + * @param string $name + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addName(string $name) + { + return new self($this->paths, \array_merge($this->names, [$name]), $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with short circuit mode enabled. + * + * @return \Dotenv\Store\StoreBuilder + */ + public function shortCircuit() + { + return new self($this->paths, $this->names, true, $this->fileEncoding); + } + + /** + * Creates a store builder with the specified file encoding. + * + * @param string|null $fileEncoding + * + * @return \Dotenv\Store\StoreBuilder + */ + public function fileEncoding(?string $fileEncoding = null) + { + return new self($this->paths, $this->names, $this->shortCircuit, $fileEncoding); + } + + /** + * Creates a new store instance. + * + * @return \Dotenv\Store\StoreInterface + */ + public function make() + { + return new FileStore( + Paths::filePaths($this->paths, $this->names), + $this->shortCircuit, + $this->fileEncoding + ); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php new file mode 100644 index 0000000000..6f5b986293 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php @@ -0,0 +1,17 @@ +content = $content; + } + + /** + * Read the content of the environment file(s). + * + * @return string + */ + public function read() + { + return $this->content; + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Regex.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Regex.php new file mode 100644 index 0000000000..b17355c649 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Regex.php @@ -0,0 +1,112 @@ + + */ + public static function matches(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return @\preg_match($pattern, $subject) === 1; + }, $subject); + } + + /** + * Perform a preg match all, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function occurrences(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return (int) @\preg_match_all($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg replace callback, wrapping up the result. + * + * @param string $pattern + * @param callable $callback + * @param string $subject + * @param int|null $limit + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function replaceCallback(string $pattern, callable $callback, string $subject, ?int $limit = null) + { + return self::pregAndWrap(static function (string $subject) use ($pattern, $callback, $limit) { + return (string) @\preg_replace_callback($pattern, $callback, $subject, $limit ?? -1); + }, $subject); + } + + /** + * Perform a preg split, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function split(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + /** @var string[] */ + return (array) @\preg_split($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg operation, wrapping up the result. + * + * @template V + * + * @param callable(string):V $operation + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function pregAndWrap(callable $operation, string $subject) + { + $result = $operation($subject); + + if (\preg_last_error() !== \PREG_NO_ERROR) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(\preg_last_error_msg()); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($result); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Str.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Str.php new file mode 100644 index 0000000000..15257bdf9d --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Util/Str.php @@ -0,0 +1,98 @@ + + */ + public static function utf8(string $input, ?string $encoding = null) + { + if ($encoding !== null && !\in_array($encoding, \mb_list_encodings(), true)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create( + \sprintf('Illegal character encoding [%s] specified.', $encoding) + ); + } + $converted = $encoding === null ? + @\mb_convert_encoding($input, 'UTF-8') : + @\mb_convert_encoding($input, 'UTF-8', $encoding); + /** + * this is for support UTF-8 with BOM encoding + * @see https://en.wikipedia.org/wiki/Byte_order_mark + * @see https://github.com/vlucas/phpdotenv/issues/500 + */ + if (\substr($converted, 0, 3) == "\xEF\xBB\xBF") { + $converted = \substr($converted, 3); + } + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($converted); + } + + /** + * Search for a given substring of the input. + * + * @param string $haystack + * @param string $needle + * + * @return \PhpOption\Option + */ + public static function pos(string $haystack, string $needle) + { + /** @var \PhpOption\Option */ + return Option::fromValue(\mb_strpos($haystack, $needle, 0, 'UTF-8'), false); + } + + /** + * Grab the specified substring of the input. + * + * @param string $input + * @param int $start + * @param int|null $length + * + * @return string + */ + public static function substr(string $input, int $start, ?int $length = null) + { + return \mb_substr($input, $start, $length, 'UTF-8'); + } + + /** + * Compute the length of the given string. + * + * @param string $input + * + * @return int + */ + public static function len(string $input) + { + return \mb_strlen($input, 'UTF-8'); + } +} diff --git a/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Validator.php b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Validator.php new file mode 100644 index 0000000000..0c04ab62e3 --- /dev/null +++ b/plugin/onlyoffice/vendor/vlucas/phpdotenv/src/Validator.php @@ -0,0 +1,209 @@ +repository = $repository; + $this->variables = $variables; + } + + /** + * Assert that each variable is present. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function required() + { + return $this->assert( + static function (?string $value) { + return $value !== null; + }, + 'is missing' + ); + } + + /** + * Assert that each variable is not empty. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function notEmpty() + { + return $this->assertNullable( + static function (string $value) { + return Str::len(\trim($value)) > 0; + }, + 'is empty' + ); + } + + /** + * Assert that each specified variable is an integer. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isInteger() + { + return $this->assertNullable( + static function (string $value) { + return \ctype_digit($value); + }, + 'is not an integer' + ); + } + + /** + * Assert that each specified variable is a boolean. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isBoolean() + { + return $this->assertNullable( + static function (string $value) { + if ($value === '') { + return false; + } + + return \filter_var($value, \FILTER_VALIDATE_BOOLEAN, \FILTER_NULL_ON_FAILURE) !== null; + }, + 'is not a boolean' + ); + } + + /** + * Assert that each variable is amongst the given choices. + * + * @param string[] $choices + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedValues(array $choices) + { + return $this->assertNullable( + static function (string $value) use ($choices) { + return \in_array($value, $choices, true); + }, + \sprintf('is not one of [%s]', \implode(', ', $choices)) + ); + } + + /** + * Assert that each variable matches the given regular expression. + * + * @param string $regex + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedRegexValues(string $regex) + { + return $this->assertNullable( + static function (string $value) use ($regex) { + return Regex::matches($regex, $value)->success()->getOrElse(false); + }, + \sprintf('does not match "%s"', $regex) + ); + } + + /** + * Assert that the callback returns true for each variable. + * + * @param callable(?string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assert(callable $callback, string $message) + { + $failing = []; + + foreach ($this->variables as $variable) { + if ($callback($this->repository->get($variable)) === false) { + $failing[] = \sprintf('%s %s', $variable, $message); + } + } + + if (\count($failing) > 0) { + throw new ValidationException(\sprintf( + 'One or more environment variables failed assertions: %s.', + \implode(', ', $failing) + )); + } + + return $this; + } + + /** + * Assert that the callback returns true for each variable. + * + * Skip checking null variable values. + * + * @param callable(string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assertNullable(callable $callback, string $message) + { + return $this->assert( + static function (?string $value) use ($callback) { + if ($value === null) { + return true; + } + + return $callback($value); + }, + $message + ); + } +}