@@ -454,7 +454,7 @@ |
||
454 | 454 | } |
455 | 455 | |
456 | 456 | if (!encryptionStoreExpirationSupport()) { |
457 | - withPHPSession(function () use ($encryptionStore) { |
|
457 | + withPHPSession(function() use ($encryptionStore) { |
|
458 | 458 | $encryptionStore->add('smime', ''); |
459 | 459 | }); |
460 | 460 | } |
@@ -360,7 +360,7 @@ |
||
360 | 360 | ]; |
361 | 361 | $fileDependencies[$filename] = [ |
362 | 362 | 'depends' => [], |
363 | - 'core' => $core, // Based on tag or on class or on file path? |
|
363 | + 'core' => $core, // Based on tag or on class or on file path? |
|
364 | 364 | ]; |
365 | 365 | |
366 | 366 | for ($j = 0, $lenJ = count($class[1]); $j < $lenJ; ++$j) { |
@@ -195,8 +195,7 @@ |
||
195 | 195 | // TODO: move logon from MAPISession to here |
196 | 196 | |
197 | 197 | WebAppAuthentication::$_errorCode = isset($_SESSION['_keycloak_auth']) ? |
198 | - WebAppAuthentication::$_mapiSession->logon_token($username, $pass) : |
|
199 | - WebAppAuthentication::$_mapiSession->logon($username, $pass, DEFAULT_SERVER); |
|
198 | + WebAppAuthentication::$_mapiSession->logon_token($username, $pass) : WebAppAuthentication::$_mapiSession->logon($username, $pass, DEFAULT_SERVER); |
|
200 | 199 | |
201 | 200 | // Include external login plugins to be loaded |
202 | 201 | if (file_exists(BASE_PATH . 'extlogin.php')) { |
@@ -242,7 +242,7 @@ discard block |
||
242 | 242 | $abHierarchyRows = mapi_table_queryallrows($hierarchyTable, [PR_AB_PROVIDER_ID, PR_ENTRYID]); |
243 | 243 | |
244 | 244 | // Look for the 'Contacts Folders' |
245 | - for ($i = 0,$len = count($abHierarchyRows); $i < $len; ++$i) { |
|
245 | + for ($i = 0, $len = count($abHierarchyRows); $i < $len; ++$i) { |
|
246 | 246 | // Check if the folder matches the Contact Provider GUID |
247 | 247 | if ($abHierarchyRows[$i][PR_AB_PROVIDER_ID] == MUIDZCSAB) { |
248 | 248 | $abContactContainerEntryid = $abHierarchyRows[$i][PR_ENTRYID]; |
@@ -258,7 +258,7 @@ discard block |
||
258 | 258 | $abContactContainerHierarchyRows = mapi_table_queryallrows($abContactContainerHierarchyTable, [PR_DISPLAY_NAME, PR_OBJECT_TYPE, PR_ENTRYID]); |
259 | 259 | |
260 | 260 | // Loop through all the contact folders found under the 'Contacts Folders' hierarchy |
261 | - for ($j = 0,$len = count($abContactContainerHierarchyRows); $j < $len; ++$j) { |
|
261 | + for ($j = 0, $len = count($abContactContainerHierarchyRows); $j < $len; ++$j) { |
|
262 | 262 | // Open, get contents table, restrict, sort and then merge the result in the list of $rows |
263 | 263 | $abContactFolder = mapi_ab_openentry($ab, $abContactContainerHierarchyRows[$j][PR_ENTRYID]); |
264 | 264 | $abContactFolderTable = mapi_folder_getcontentstable($abContactFolder, MAPI_DEFERRED_ERRORS); |
@@ -575,7 +575,7 @@ |
||
575 | 575 | ]; |
576 | 576 | |
577 | 577 | $rule[PR_RULE_NAME] = ''; |
578 | - $rule[PR_RULE_PROVIDER_DATA] = ''; // 0 byte binary string |
|
578 | + $rule[PR_RULE_PROVIDER_DATA] = ''; // 0 byte binary string |
|
579 | 579 | $rule[PR_RULE_STATE] = ST_ENABLED; |
580 | 580 | $rule[PR_RULE_LEVEL] = 0; |
581 | 581 | $rule[PR_RULE_SEQUENCE] = 0; |
@@ -247,14 +247,14 @@ discard block |
||
247 | 247 | $properties["reminderset"] = "PT_BOOLEAN:PSETID_Common:" . PidLidReminderSet; |
248 | 248 | $properties["flag_request"] = "PT_STRING8:PSETID_Common:" . PidLidFlagRequest; |
249 | 249 | $properties["flag_due_by"] = "PT_SYSTIME:PSETID_Common:" . PidLidReminderSignalTime; |
250 | - $properties["updatecounter"] = "PT_LONG:PSETID_Appointment:" . PidLidAppointmentSequence; // AppointmentSequenceNumber |
|
251 | - $properties["last_updatecounter"] = "PT_LONG:PSETID_Appointment:0x8203"; // AppointmentLastSequence |
|
250 | + $properties["updatecounter"] = "PT_LONG:PSETID_Appointment:" . PidLidAppointmentSequence; // AppointmentSequenceNumber |
|
251 | + $properties["last_updatecounter"] = "PT_LONG:PSETID_Appointment:0x8203"; // AppointmentLastSequence |
|
252 | 252 | $properties["busystatus"] = "PT_LONG:PSETID_Appointment:" . PidLidBusyStatus; |
253 | 253 | $properties["intendedbusystatus"] = "PT_LONG:PSETID_Appointment:" . PidLidIntendedBusyStatus; |
254 | 254 | $properties["start"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentStartWhole; |
255 | 255 | $properties["responselocation"] = "PT_STRING8:PSETID_Meeting:0x2"; |
256 | 256 | $properties["location"] = "PT_STRING8:PSETID_Appointment:" . PidLidLocation; |
257 | - $properties["requestsent"] = "PT_BOOLEAN:PSETID_Appointment:0x8229"; // PidLidFInvited, MeetingRequestWasSent |
|
257 | + $properties["requestsent"] = "PT_BOOLEAN:PSETID_Appointment:0x8229"; // PidLidFInvited, MeetingRequestWasSent |
|
258 | 258 | $properties["startdate"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentStartWhole; |
259 | 259 | $properties["duedate"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentEndWhole; |
260 | 260 | $properties["commonstart"] = "PT_SYSTIME:PSETID_Common:0x8516"; |
@@ -262,11 +262,11 @@ discard block |
||
262 | 262 | $properties["recurring"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidRecurring; |
263 | 263 | $properties["clipstart"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipStart; |
264 | 264 | $properties["clipend"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipEnd; |
265 | - $properties["start_recur_date"] = "PT_LONG:PSETID_Meeting:0xD"; // StartRecurTime |
|
266 | - $properties["start_recur_time"] = "PT_LONG:PSETID_Meeting:0xE"; // StartRecurTime |
|
267 | - $properties["end_recur_date"] = "PT_LONG:PSETID_Meeting:0xF"; // EndRecurDate |
|
268 | - $properties["end_recur_time"] = "PT_LONG:PSETID_Meeting:0x10"; // EndRecurTime |
|
269 | - $properties["is_exception"] = "PT_BOOLEAN:PSETID_Meeting:0xA"; // LID_IS_EXCEPTION |
|
265 | + $properties["start_recur_date"] = "PT_LONG:PSETID_Meeting:0xD"; // StartRecurTime |
|
266 | + $properties["start_recur_time"] = "PT_LONG:PSETID_Meeting:0xE"; // StartRecurTime |
|
267 | + $properties["end_recur_date"] = "PT_LONG:PSETID_Meeting:0xF"; // EndRecurDate |
|
268 | + $properties["end_recur_time"] = "PT_LONG:PSETID_Meeting:0x10"; // EndRecurTime |
|
269 | + $properties["is_exception"] = "PT_BOOLEAN:PSETID_Meeting:0xA"; // LID_IS_EXCEPTION |
|
270 | 270 | // Propose new time properties |
271 | 271 | $properties["proposed_start_whole"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentProposedStartWhole; |
272 | 272 | $properties["proposed_end_whole"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentProposedEndWhole; |
@@ -646,7 +646,7 @@ discard block |
||
646 | 646 | $properties = []; |
647 | 647 | $properties["entryid"] = PR_ENTRYID; |
648 | 648 | $properties["parent_entryid"] = PR_PARENT_ENTRYID; |
649 | - $properties["store_entryid"] = PR_STORE_ENTRYID; // is this required ??? |
|
649 | + $properties["store_entryid"] = PR_STORE_ENTRYID; // is this required ??? |
|
650 | 650 | $properties["icon_index"] = PR_ICON_INDEX; |
651 | 651 | $properties["message_class"] = PR_MESSAGE_CLASS; |
652 | 652 | $properties["message_flags"] = PR_MESSAGE_FLAGS; |
@@ -960,9 +960,9 @@ discard block |
||
960 | 960 | $properties["appointment_location"] = "PT_STRING8:PSETID_Appointment:" . PidLidLocation; |
961 | 961 | $properties["appointment_recurring_pattern"] = "PT_STRING8:PSETID_Appointment:" . PidLidRecurrencePattern; |
962 | 962 | $properties["appointment_recurring"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidRecurring; |
963 | - $properties["appointment_startdate_recurring"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipStart; // ClipStart |
|
964 | - $properties["appointment_enddate_recurring"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipEnd; // ClipEnd |
|
965 | - $properties["appointment_exception"] = "PT_BOOLEAN:PSETID_Meeting:0xA"; // LID_IS_EXCEPTION |
|
963 | + $properties["appointment_startdate_recurring"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipStart; // ClipStart |
|
964 | + $properties["appointment_enddate_recurring"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipEnd; // ClipEnd |
|
965 | + $properties["appointment_exception"] = "PT_BOOLEAN:PSETID_Meeting:0xA"; // LID_IS_EXCEPTION |
|
966 | 966 | $properties["appointment_location"] = "PT_STRING8:PSETID_Appointment:" . PidLidLocation; |
967 | 967 | $properties["alldayevent"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidAppointmentSubType; |
968 | 968 | $properties["tzdefstart"] = "PT_BINARY:PSETID_Appointment:" . PidLidAppointmentTimeZoneDefinitionStartDisplay; |
@@ -1268,18 +1268,18 @@ discard block |
||
1268 | 1268 | $properties["object_type"] = PR_OBJECT_TYPE; |
1269 | 1269 | |
1270 | 1270 | $properties["recurring"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidRecurring; |
1271 | - $properties["reminder"] = "PT_BOOLEAN:PSETID_Common:" . PidLidReminderSet; // PidLidReminderSet |
|
1272 | - $properties["reminder_minutes"] = "PT_LONG:PSETID_Common:" . PidLidReminderDelta; // PidLidReminderDelta |
|
1273 | - $properties["reminder_time"] = "PT_SYSTIME:PSETID_Common:" . PidLidReminderTime; // PidLidReminderTime |
|
1274 | - $properties["flagdueby"] = "PT_SYSTIME:PSETID_Common:" . PidLidReminderSignalTime; // PidLidReminderSignalTime |
|
1275 | - |
|
1276 | - $properties["task_duedate"] = "PT_SYSTIME:PSETID_Task:" . PidLidTaskDueDate; // PidLidTaskDueDate |
|
1277 | - $properties["task_startdate"] = "PT_SYSTIME:PSETID_Task:" . PidLidTaskStartDate; // PidLidTaskStartDate |
|
1278 | - $properties["task_resetreminder"] = "PT_BOOLEAN:PSETID_Task:0x8107"; // PidLidTaskResetReminder |
|
1279 | - $properties["task_recurring"] = "PT_BOOLEAN:PSETID_Task:0x8126"; // PidLidTaskFRecurring |
|
1271 | + $properties["reminder"] = "PT_BOOLEAN:PSETID_Common:" . PidLidReminderSet; // PidLidReminderSet |
|
1272 | + $properties["reminder_minutes"] = "PT_LONG:PSETID_Common:" . PidLidReminderDelta; // PidLidReminderDelta |
|
1273 | + $properties["reminder_time"] = "PT_SYSTIME:PSETID_Common:" . PidLidReminderTime; // PidLidReminderTime |
|
1274 | + $properties["flagdueby"] = "PT_SYSTIME:PSETID_Common:" . PidLidReminderSignalTime; // PidLidReminderSignalTime |
|
1275 | + |
|
1276 | + $properties["task_duedate"] = "PT_SYSTIME:PSETID_Task:" . PidLidTaskDueDate; // PidLidTaskDueDate |
|
1277 | + $properties["task_startdate"] = "PT_SYSTIME:PSETID_Task:" . PidLidTaskStartDate; // PidLidTaskStartDate |
|
1278 | + $properties["task_resetreminder"] = "PT_BOOLEAN:PSETID_Task:0x8107"; // PidLidTaskResetReminder |
|
1279 | + $properties["task_recurring"] = "PT_BOOLEAN:PSETID_Task:0x8126"; // PidLidTaskFRecurring |
|
1280 | 1280 | $properties["taskmode"] = "PT_LONG:PSETID_Common:0x8518"; |
1281 | 1281 | |
1282 | - $properties["appointment_recurring"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidRecurring; // PidLidRecurring |
|
1282 | + $properties["appointment_recurring"] = "PT_BOOLEAN:PSETID_Appointment:" . PidLidRecurring; // PidLidRecurring |
|
1283 | 1283 | $properties["appointment_startdate"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentStartWhole; |
1284 | 1284 | $properties["appointment_enddate"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidAppointmentEndWhole; |
1285 | 1285 | $properties["appointment_startdate_recurring"] = "PT_SYSTIME:PSETID_Appointment:" . PidLidClipStart; |
@@ -60,13 +60,13 @@ discard block |
||
60 | 60 | $entryId = strtoupper((string) $entryid); |
61 | 61 | |
62 | 62 | $res = [ |
63 | - 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
64 | - 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
65 | - 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
66 | - 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
67 | - 'uniqueId' => '', // ULONG, 16 bytes, 32 hex characters |
|
68 | - 'server' => '', // CHAR, variable length |
|
69 | - 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
63 | + 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
64 | + 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
65 | + 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
66 | + 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
67 | + 'uniqueId' => '', // ULONG, 16 bytes, 32 hex characters |
|
68 | + 'server' => '', // CHAR, variable length |
|
69 | + 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
70 | 70 | ]; |
71 | 71 | |
72 | 72 | $res['length'] = strlen($entryId); |
@@ -111,13 +111,13 @@ discard block |
||
111 | 111 | $entryId = strtoupper((string) $entryid); |
112 | 112 | |
113 | 113 | $res = [ |
114 | - 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
115 | - 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
116 | - 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
117 | - 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
118 | - 'id' => '', // ULONG, 4 bytes, 8 hex characters |
|
119 | - 'server' => '', // CHAR, variable length |
|
120 | - 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
114 | + 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
115 | + 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
116 | + 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
117 | + 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
118 | + 'id' => '', // ULONG, 4 bytes, 8 hex characters |
|
119 | + 'server' => '', // CHAR, variable length |
|
120 | + 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
121 | 121 | ]; |
122 | 122 | |
123 | 123 | $res['length'] = strlen($entryId); |
@@ -162,13 +162,13 @@ discard block |
||
162 | 162 | $entryId = strtoupper((string) $entryId); |
163 | 163 | |
164 | 164 | $res = [ |
165 | - 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
166 | - 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
167 | - 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
168 | - 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
169 | - 'id' => '', // ULONG, 16 bytes, 32 hex characters |
|
170 | - 'extid' => '', // CHAR, variable length |
|
171 | - 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
165 | + 'abFlags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
166 | + 'guid' => '', // GUID, 16 bytes, 32 hex characters |
|
167 | + 'version' => '', // ULONG, 4 bytes, 8 hex characters |
|
168 | + 'type' => '', // ULONG, 4 bytes, 8 hex characters |
|
169 | + 'id' => '', // ULONG, 16 bytes, 32 hex characters |
|
170 | + 'extid' => '', // CHAR, variable length |
|
171 | + 'padding' => '', // TCHAR[3], 4 bytes, 8 hex characters (upto 4 bytes) |
|
172 | 172 | ]; |
173 | 173 | |
174 | 174 | $res['length'] = strlen($entryId); |
@@ -479,8 +479,7 @@ discard block |
||
479 | 479 | } |
480 | 480 | } |
481 | 481 | elseif ($checkValue !== null && $val != $checkValue) { |
482 | - $user = $GLOBALS["mapisession"] !== null ? $GLOBALS["mapisession"]->getUserName() : |
|
483 | - "<mapisession not yet initialized>"; |
|
482 | + $user = $GLOBALS["mapisession"] !== null ? $GLOBALS["mapisession"]->getUserName() : "<mapisession not yet initialized>"; |
|
484 | 483 | error_log(sprintf( |
485 | 484 | "Unexpected value in store entryid for user %s. Entryid: %s key: '%s' value: '%s' expected: %s", |
486 | 485 | $user, |
@@ -511,13 +510,13 @@ discard block |
||
511 | 510 | $entryId = strtoupper((string) $entryId); |
512 | 511 | |
513 | 512 | $res = [ |
514 | - 'providerguid' => '', // GUID, 16 bytes, 32 hex characters |
|
515 | - 'messagetype' => '', // UINT, 2 bytes, 4 hex characters |
|
516 | - 'folderdbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
517 | - 'foldercounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
518 | - 'padding' => '', // TCHAR[3], 2 bytes, 4 hex characters |
|
519 | - 'messagedbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
520 | - 'messagecounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
513 | + 'providerguid' => '', // GUID, 16 bytes, 32 hex characters |
|
514 | + 'messagetype' => '', // UINT, 2 bytes, 4 hex characters |
|
515 | + 'folderdbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
516 | + 'foldercounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
517 | + 'padding' => '', // TCHAR[3], 2 bytes, 4 hex characters |
|
518 | + 'messagedbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
519 | + 'messagecounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
521 | 520 | ]; |
522 | 521 | |
523 | 522 | if (!$entryId) { |
@@ -577,12 +576,12 @@ discard block |
||
577 | 576 | $entryId = strtoupper((string) $entryId); |
578 | 577 | |
579 | 578 | $res = [ |
580 | - 'abflags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
581 | - 'providerguid' => '', // GUID, 16 bytes, 32 hex characters |
|
582 | - 'foldertype' => '', // UINT, 2 bytes, 4 hex characters |
|
583 | - 'folderdbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
584 | - 'foldercounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
585 | - 'padding' => '', // TCHAR[3], 2 bytes, 4 hex characters |
|
579 | + 'abflags' => '', // BYTE[4], 4 bytes, 8 hex characters |
|
580 | + 'providerguid' => '', // GUID, 16 bytes, 32 hex characters |
|
581 | + 'foldertype' => '', // UINT, 2 bytes, 4 hex characters |
|
582 | + 'folderdbguid' => '', // GUID, 16 bytes, 32 hex characters |
|
583 | + 'foldercounter' => '', // ULONG, 6 bytes, 12 hex characters |
|
584 | + 'padding' => '', // TCHAR[3], 2 bytes, 4 hex characters |
|
586 | 585 | ]; |
587 | 586 | |
588 | 587 | if (!$entryId) { |
@@ -358,7 +358,7 @@ |
||
358 | 358 | |
359 | 359 | if ($themeProps['primary-color']) { |
360 | 360 | if (!$themeProps['primary-color:hover']) { |
361 | - [, , $l] = Colors::rgb2hsl(Colors::colorString2Object($themeProps['primary-color'])); |
|
361 | + [,, $l] = Colors::rgb2hsl(Colors::colorString2Object($themeProps['primary-color'])); |
|
362 | 362 | if ($l > 20) { |
363 | 363 | $themeProps['primary-color:hover'] = Colors::darker($themeProps['primary-color'], 10); |
364 | 364 | } |
@@ -396,7 +396,7 @@ discard block |
||
396 | 396 | if ($data_orig_strs[$i]['length'] > 0) { // fread does not accept length=0 |
397 | 397 | $length = $data_orig_strs[$i]['length']; |
398 | 398 | $orig_str = unpack('a' . $length . 'str', fread($fp, $length)); |
399 | - $translation_data[$i]['msgid'] = $orig_str['str']; // unpack converts to array :S |
|
399 | + $translation_data[$i]['msgid'] = $orig_str['str']; // unpack converts to array :S |
|
400 | 400 | |
401 | 401 | // Find context in the original string |
402 | 402 | if (str_contains((string) $translation_data[$i]['msgid'], "\004")) { |
@@ -423,7 +423,7 @@ discard block |
||
423 | 423 | if ($data_transl_strs[$i]['length'] > 0) { // fread does not accept length=0 |
424 | 424 | $length = $data_transl_strs[$i]['length']; |
425 | 425 | $trans_str = unpack('a' . $length . 'str', fread($fp, $length)); |
426 | - $translation_data[$i]['msgstr'] = $trans_str['str']; // unpack converts to array :S |
|
426 | + $translation_data[$i]['msgstr'] = $trans_str['str']; // unpack converts to array :S |
|
427 | 427 | |
428 | 428 | // If there are plural forms in the source string, |
429 | 429 | // then the translated string must contain plural |