aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/user.php
blob: f97cc94d40d8bcf7db381a5cf419027599ea08c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465<# gettext catalog for cauldron web page(s)
# Copyright (C) 2014 - 2016 Mageia
# This file is distributed under the same license as
# the content of the corresponding web page(s).
#
# Generated by extract2gettext.php
# Domain: cauldron
#
# include translation strings from:
# en/6/download_index.php
# en/6/nav.php
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mageia\n"
"Report-Msgid-Bugs-To: mageia-i18n@mageia.org\n"
"POT-Creation-Date: 2016-07-01 07:24:10+0000\n"
"PO-Revision-Date: 2016-03-28 04:53+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/MageiaLinux/mageia/language/nb/)\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: "/web/en/6/download_index.php +36"
msgid "32 bit"
msgstr ""

#: "/web/en/6/download_index.php +39"
msgid "64 bit"
msgstr ""

#: "/web/en/6/download_index.php +42"
msgid "Dualarch"
msgstr ""

#: "/web/en/6/download_index.php +49"
msgid "forthcoming"
msgstr ""

#: "/web/en/6/download_index.php +67"
msgid "Download"
msgstr ""

#: "/web/en/6/download_index.php +68"
msgid "Download %s DVD, CD, LiveCD, network install ISO images."
msgstr ""

#: "/web/en/6/download_index.php +69"
msgid "mageia, %s, linux, free, download, iso, torrent, vm, http, ftp, rsync, bittorrent"
msgstr ""

#: "/web/en/6/download_index.php +144"
msgid "Be careful! This is an alpha, unstable release."
msgstr ""

#: "/web/en/6/download_index.php +145"
msgid "Be careful! This is a beta, unstable release."
msgstr ""

#: "/web/en/6/download_index.php +146"
msgid "It is only intended for developer use. <strong>DO NOT USE THIS IN PRODUCTION OR FOR OFFICIAL REVIEW.</strong>"
msgstr ""

#: "/web/en/6/download_index.php +147"
msgid "This is a Release Candidate. Release Candidate software is software that has graduated Beta testing, and should be a release-ready product suitable for advanced users and reviewers. However, beginning users and critical-applications users may wish to wait for the final release planned for %s."
msgstr ""

#: "/web/en/6/download_index.php +147"
msgid "May 2015"
msgstr ""

#: "/web/en/6/download_index.php +147"
msgid "Release Candidate is intended to identify any remaining bugs or missing packages."
msgstr ""

#: "/web/en/6/download_index.php +156"
msgid "It looks like you have JavaScript disable. Please <a href=\"%s\">enable</a> it to have better render. At the <a href=\"%s\">end</a> of this page there will be download link for you. But what is written between is important."
msgstr ""

#: "/web/en/6/download_index.php +162"
msgid "Mageia is provided as ISO image files that have to be written to blank <a href=\"%s\">CD or DVD discs</a>."
msgstr ""

#: "/web/en/6/download_index.php +162"
msgid "https://wiki.mageia.org/en/Writing_CD_and_DVD_images"
msgstr ""

#: "/web/en/6/download_index.php +164"
msgid "All ISOs can also be launched from a <a %s>USB drive</a>."
msgstr ""

#: "/web/en/6/download_index.php +164"
msgid "https://wiki.mageia.org/en/Installation_Media#Dump_Mageia_ISO_on_a_USB_flash_drive"
msgstr ""

#: "/web/en/6/download_index.php +166"
msgid "To <a %s>dump</a> a Mageia installation ISO on a USB stick, you may try one of several tools:"
msgstr ""

#: "/web/en/6/download_index.php +168"
msgid "For Linux, IsoDumper, available inside repo. Or any tools based on dd."
msgstr ""

#: "/web/en/6/download_index.php +169"
msgid "Unetbootin is not supported."
msgstr ""

#: "/web/en/6/download_index.php +171"
msgid "For Windows please have a look on our <a href=\"%s\">wiki</a> for your options."
msgstr ""

#: "/web/en/6/download_index.php +171"
msgid "https://wiki.mageia.org/en/Dump_Mageia_ISO_on_a_USB_flash_drive_-_Alternative_tools"
msgstr ""

#: "/web/en/6/download_index.php +174"
msgid "\"Dumping\" an image onto a flash device destroys any prior file-system in the partition; access to any data not destroyed will be lost, and partition capacity will be reduced to the image size. In other words, all prior data on the device is at risk."
msgstr ""

#: "/web/en/6/download_index.php +177"
msgid "If you have <a href=\"%s\">UEFI</a>, a procedure is available in the <a href=\"%s\">wiki</a>."
msgstr ""

#: "/web/en/6/download_index.php +177"
msgid "http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface"
msgstr ""

#: "/web/en/6/download_index.php +177"
msgid "https://wiki.mageia.org/en/Installing_on_systems_with_UEFI_firmware"
msgstr ""

#: "/web/en/6/download_index.php +185"
msgid "Classical Installation Flavours"
msgstr ""

#: "/web/en/6/download_index.php +187"
msgid "The Classical ISO is the traditional way to install Mageia directly. Take a look at the complete <a href=\"%s\">documentation</a> for this installer."
msgstr ""

#: "/web/en/6/download_index.php +189"
msgid "Up to 167 locales are supported:"
msgstr ""

#: "/web/en/6/download_index.php +191"
msgid "and so much more!"
msgstr ""

#: "/web/en/6/download_index.php +192"
msgid "See the comprehensive list"
msgstr ""

#: "/web/en/6/download_index.php +195"
msgid "These ISOs contains Free Software and some proprietary drivers."
msgstr ""

#: "/web/en/6/download_index.php +196"
msgid "You will be asked of which kind of Software you want to install."
msgstr ""

#: "/web/en/6/download_index.php +197"
msgid "The installer includes the capability of adding the online Mageia repositories during the installation, which means you can install even more packages than those available on the ISO."
msgstr ""

#: "/web/en/6/download_index.php +200"
msgid "For 32 and 64bit, size of the ISOs is about %sGB. For the dualarch it's about %sGB."
msgstr ""

#: "/web/en/6/download_index.php +208"
msgid "LiveCDs and LiveDVDs"
msgstr ""

#: "/web/en/6/download_index.php +210"
msgid "Live ISO's let you try %s without installation. You can run Mageia directly from a CD, DVD or USB device, and try it using one of the graphical user interfaces such as GNOME or KDE."
msgstr ""

#: "/web/en/6/download_index.php +211"
msgid "If you are happy with the Mageia experience, you can then install it onto your hard drive from the Live media."
msgstr ""

#: "/web/en/6/download_index.php +213"
msgid "Use LiveCDs and LiveDVDs for fresh new installs ONLY."
msgstr ""

#: "/web/en/6/download_index.php +214"
msgid "DO NOT use these LiveCDs or LiveDVDs to upgrade from the prior Mageia release!"
msgstr ""

#: "/web/en/6/download_index.php +215"
msgid "Use a classical installation and see <a href=\"%s\" hreflang=\"en\">upgrade guide</a>."
msgstr ""

#: "/web/en/6/download_index.php +218"
msgid "For LiveDVDs, size of the ISOs is about %sGB. For the LiveCDs it's about %sMB."
msgstr ""

#: "/web/en/6/download_index.php +223"
msgid "Wired Network-based Installation CD"
msgstr ""

#: "/web/en/6/download_index.php +224"
msgid "Download quickly and immediately boot into install mode from <em>wired</em> network or a local disk."
msgstr ""

#: "/web/en/6/download_index.php +225"
msgid "Have a look in the <a href=\"%s\">wiki</a> to get a list of possibilities."
msgstr ""

#: "/web/en/6/download_index.php +225"
msgid "https://wiki.mageia.org/en/Boot.iso_install"
msgstr ""

#: "/web/en/6/download_index.php +227"
msgid "Size of the ISOs is about 50MB."
msgstr ""

#: "/web/en/6/download_index.php +232"
msgid "Classic Installation"
msgstr ""

#: "/web/en/6/download_index.php +234"
msgid "Live Media"
msgstr ""

#: "/web/en/6/download_index.php +236"
msgid "Network Installation"
msgstr ""

#: "/web/en/6/download_index.php +240"
msgid "The dualarch is not yet available."
msgstr ""

#: "/web/en/6/download_index.php +241"
msgid "LiveCDs and LiveDVDs are not yet available."
msgstr ""

#: "/web/en/6/download_index.php +242"
msgid "Classical Installation flavours is not yet available."
msgstr ""

#: "/web/en/6/download_index.php +252"
msgid "LiveDVDs"
msgstr ""

#: "/web/en/6/download_index.php +253"
msgid "LiveDVDs contain all languages and is available in both 32 and 64bit."
msgstr ""

#: "/web/en/6/download_index.php +257"
msgid "LiveCDs"
msgstr ""

#: "/web/en/6/download_index.php +258"
msgid "LiveCDs contain only English and is available only in 32bit."
msgstr ""

#: "/web/en/6/download_index.php +259"
msgid "Do not use unless you really DON'T NEED any other language than English."
msgstr ""

#: "/web/en/6/download_index.php +266"
msgid "English only (CD)"
msgstr ""

#: "/web/en/6/download_index.php +271"
msgid "Desktop"
msgstr ""

#: "/web/en/6/download_index.php +274"
msgid "GNOME Desktop"
msgstr "GNOME-skrivebord"

#: "/web/en/6/download_index.php +278"
msgid "KDE Desktop"
msgstr "KDE-skrivebord"

#: "/web/en/6/download_index.php +291"
msgid "Network installer"
msgstr ""

#: "/web/en/6/download_index.php +294"
msgid "Network installer, Free Software CD"
msgstr ""

#: "/web/en/6/download_index.php +295"
msgid "Contain only free software"
msgstr ""

#: "/web/en/6/download_index.php +298"
msgid "Network installer + nonfree firmware CD"
msgstr ""

#: "/web/en/6/download_index.php +299"
msgid "Contain nonfree drivers needed for some disc controllers, some network cards, etc."
msgstr ""

#: "/web/en/6/download_index.php +303"
msgid "Free Software CD"
msgstr ""

#: "/web/en/6/download_index.php +305"
msgid "Nonfree Firmware CD"
msgstr ""

#: "/web/en/6/download_index.php +310"
msgid "Supported Architecture"
msgstr ""

#: "/web/en/6/download_index.php +313"
msgid "Most new computers support x86-64 (also known as AMD64 and Intel64), but some laptop processors and netbook processors do not support it."

					$accept_lang = basename($accept_lang);

					if (file_exists($this->lang_path . $accept_lang . "/common.$phpEx"))
					{
						$user_lang_name = $config['default_lang'] = $accept_lang;
						break;
					}
					else
					{
						// No match on xx_YY so try xx
						$accept_lang = substr($accept_lang, 0, 2);
						$accept_lang = basename($accept_lang);

						if (file_exists($this->lang_path . $accept_lang . "/common.$phpEx"))
						{
							$user_lang_name = $config['default_lang'] = $accept_lang;
							break;
						}
					}
				}
			}
			*/
		}

		$user_data = $this->data;
		$lang_set_ext = array();

		/**
		* Event to load language files and modify user data on every page
		*
		* @event core.user_setup
		* @var	array	user_data			Array with user's data row
		* @var	string	user_lang_name		Basename of the user's langauge
		* @var	string	user_date_format	User's date/time format
		* @var	string	user_timezone		User's timezone, should be one of
		*							http://www.php.net/manual/en/timezones.php
		* @var	mixed	lang_set			String or array of language files
		* @var	array	lang_set_ext		Array containing entries of format
		* 					array(
		* 						'ext_name' => (string) [extension name],
		* 						'lang_set' => (string|array) [language files],
		* 					)
		* 					For performance reasons, only load translations
		* 					that are absolutely needed globally using this
		* 					event. Use local events otherwise.
		* @var	mixed	style_id			Style we are going to display
		* @since 3.1-A1
		*/
		$vars = array('user_data', 'user_lang_name', 'user_date_format', 'user_timezone', 'lang_set', 'lang_set_ext', 'style_id');
		extract($phpbb_dispatcher->trigger_event('core.user_setup', compact($vars)));

		$this->data = $user_data;
		$this->lang_name = $user_lang_n
msgstr ""

#: "/web/en/6/download_index.php +496"
msgid "<a href=\"%s\">Which to choose</a>"
msgstr ""

#: "/web/en/6/download_index.php +496"
msgid "https://wiki.mageia.org/en/Installation_Media"
msgstr ""

#: "/web/en/6/download_index.php +497"
msgid "<a href=\"%s\">Get ISO on USB flash drive</a>"
msgstr ""

#: "/web/en/6/download_index.php +498"
msgid "Newcomer? <a href=\"%s\">Here's a wiki page for you.</a>"
msgstr ""

#: "/web/en/6/download_index.php +498"
msgid "https://wiki.mageia.org/en/Newcomers_start_here"
msgstr ""

#: "/web/en/6/download_index.php +499"
msgid "Help us on %s"
msgstr ""

#: "/web/en/6/download_index.php +503"
msgid "Looking for a stable release?"
msgstr ""

#: "/web/en/6/download_index.php +505"
msgid "It is <a href=\"%s\">here</a>."
msgstr ""

#: "/web/en/6/download_index.php +507"
msgid "Upgrading<br>from %s ?"
msgstr ""

#: "/web/en/6/download_index.php +509"
msgid "<strong>do not</strong> use LiveCDs;"
msgstr ""

#: "/web/en/6/download_index.php +510"
msgid "see the <a href=\"%s\" hreflang=\"en\">upgrade guide</a>"
msgstr ""

#: "/web/en/6/nav.php +7"
msgid "https://wiki.mageia.org/en/Mageia_6_Release_Notes"
msgstr ""

#: "/web/en/6/nav.php +8"
msgid "https://wiki.mageia.org/en/Mageia_6_Errata"
msgstr ""

#: "/web/en/6/nav.php +9"
msgid "https://wiki.mageia.org/en/Mageia_6_Release_Notes#Upgrading_from_Mageia_5"
msgstr ""

#: "/web/en/6/nav.php +12"
msgid "Development roadmap"
msgstr ""

#: "/web/en/6/nav.php +12"
msgid "https://wiki.mageia.org/en/Mageia_6_Development"
msgstr ""

#: "/web/en/6/nav.php +13"
msgid "Features review"
msgstr ""

#: "/web/en/6/nav.php +13"
msgid "https://wiki.mageia.org/en/FeatureMageia6_Review"
msgstr ""

#: "/web/en/6/nav.php +15"
msgid "Errata"
msgstr ""

#: "/web/en/6/nav.php +16"
msgid "Bugs Reports"
msgstr ""
ipl">$result = $db->sql_query($sql, 3600); $this->style = $db->sql_fetchrow($result); $db->sql_freeresult($result); // User has wrong style if (!$this->style && $style_id == $this->data['user_style']) { $style_id = $this->data['user_style'] = $config['default_style']; $sql = 'UPDATE ' . USERS_TABLE . " SET user_style = $style_id WHERE user_id = {$this->data['user_id']}"; $db->sql_query($sql); $sql = 'SELECT * FROM ' . STYLES_TABLE . " s WHERE s.style_id = $style_id"; $result = $db->sql_query($sql, 3600); $this->style = $db->sql_fetchrow($result); $db->sql_freeresult($result); } if (!$this->style) { trigger_error('NO_STYLE_DATA', E_USER_ERROR); } // Now parse the cfg file and cache it $parsed_items = $cache->obtain_cfg_items($this->style); $check_for = array( 'pagination_sep' => (string) ', ' ); foreach ($check_for as $key => $default_value) { $this->style[$key] = (isset($parsed_items[$key])) ? $parsed_items[$key] : $default_value; settype($this->style[$key], gettype($default_value)); if (is_string($default_value)) { $this->style[$key] = htmlspecialchars($this->style[$key]); } } $template->set_style(); $this->img_lang = $this->lang_name; // Call phpbb_user_session_handler() in case external application want to "bend" some variables or replace classes... // After calling it we continue script execution... phpbb_user_session_handler(); // If this function got called from the error handler we are finished here. if (defined('IN_ERROR_HANDLER')) { return; } // Disable board if the install/ directory is still present // For the brave development army we do not care about this, else we need to comment out this everytime we develop locally if (!defined('DEBUG') && !defined('ADMIN_START') && !defined('IN_INSTALL') && !defined('IN_LOGIN') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install')) { // Adjust the message slightly according to the permissions if ($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) { $message = 'REMOVE_INSTALL'; } else { $message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE'; } trigger_error($message); } // Is board disabled and user not an admin or moderator? if ($config['board_disable'] && !defined('IN_LOGIN') && !$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) { if ($this->data['is_bot']) { send_status_line(503, 'Service Unavailable'); } $message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE'; trigger_error($message); } // Is load exceeded? if ($config['limit_load'] && $this->load !== false) { if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN') && !defined('IN_ADMIN')) { // Set board disabled to true to let the admins/mods get the proper notification $config['board_disable'] = '1'; if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) { if ($this->data['is_bot']) { send_status_line(503, 'Service Unavailable'); } trigger_error('BOARD_UNAVAILABLE'); } } } if (isset($this->data['session_viewonline'])) { // Make sure the user is able to hide his session if (!$this->data['session_viewonline']) { // Reset online status if not allowed to hide the session... if (!$auth->acl_get('u_hideonline')) { $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET session_viewonline = 1 WHERE session_user_id = ' . $this->data['user_id']; $db->sql_query($sql); $this->data['session_viewonline'] = 1; } } else if (!$this->data['user_allow_viewonline']) { // the user wants to hide and is allowed to -> cloaking device on. if ($auth->acl_get('u_hideonline')) { $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET session_viewonline = 0 WHERE session_user_id = ' . $this->data['user_id']; $db->sql_query($sql); $this->data['session_viewonline'] = 0; } } } // Does the user need to change their password? If so, redirect to the // ucp profile reg_details page ... of course do not redirect if we're already in the ucp if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400)) { if (strpos($this->page['query_string'], 'mode=reg_details') === false && $this->page['page_name'] != "ucp.$phpEx") { redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=profile&amp;mode=reg_details')); } } return; } /** * More advanced language substitution * Function to mimic sprintf() with the possibility of using phpBB's language system to substitute nullar/singular/plural forms. * Params are the language key and the parameters to be substituted. * This function/functionality is inspired by SHS` and Ashe. * * Example call: <samp>$user->lang('NUM_POSTS_IN_QUEUE', 1);</samp> * * If the first parameter is an array, the elements are used as keys and subkeys to get the language entry: * Example: <samp>$user->lang(array('datetime', 'AGO'), 1)</samp> uses $user->lang['datetime']['AGO'] as language entry. */ function lang() { $args = func_get_args(); $key = $args[0]; if (is_array($key)) { $lang = &$this->lang[array_shift($key)]; foreach ($key as $_key) { $lang = &$lang[$_key]; } } else { $lang = &$this->lang[$key]; } // Return if language string does not exist if (!isset($lang) || (!is_string($lang) && !is_array($lang))) { return $key; } // If the language entry is a string, we simply mimic sprintf() behaviour if (is_string($lang)) { if (sizeof($args) == 1) { return $lang; } // Replace key with language entry and simply pass along... $args[0] = $lang; return call_user_func_array('sprintf', $args); } else if (sizeof($lang) == 0) { // If the language entry is an empty array, we just return the language key return $args[0]; } // It is an array... now handle different nullar/singular/plural forms $key_found = false; // We now get the first number passed and will select the key based upon this number for ($i = 1, $num_args = sizeof($args); $i < $num_args; $i++) { if (is_int($args[$i]) || is_float($args[$i])) { if ($args[$i] == 0 && isset($lang[0])) { // We allow each translation using plural forms to specify a version for the case of 0 things, // so that "0 users" may be displayed as "No users". $key_found = 0; break; } else { $use_plural_form = $this->get_plural_form($args[$i]); if (isset($lang[$use_plural_form])) { // The key we should use exists, so we use it. $key_found = $use_plural_form; } else { // If the key we need to use does not exist, we fall back to the previous one. $numbers = array_keys($lang); foreach ($numbers as $num) { if ($num > $use_plural_form) { break; } $key_found = $num; } } break; } } } // Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form) if ($key_found === false) { $numbers = array_keys($lang); $key_found = end($numbers); } // Use the language string we determined and pass it to sprintf() $args[0] = $lang[$key_found]; return call_user_func_array('sprintf', $args); } /** * Determine which plural form we should use. * For some languages this is not as simple as for English. * * @param $number int|float The number we want to get the plural case for. Float numbers are floored. * @param $force_rule mixed False to use the plural rule of the language package * or an integer to force a certain plural rule * @return int The plural-case we need to use for the number plural-rule combination */ function get_plural_form($number, $force_rule = false) { $number = (int) $number; // Default to English system $plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1); return phpbb_get_plural_form($plural_rule, $number); } /** * Add Language Items - use_db and use_help are assigned where needed (only use them to force inclusion) * * @param mixed $lang_set specifies the language entries to include * @param bool $use_db internal variable for recursion, do not use * @param bool $use_help internal variable for recursion, do not use * @param string $ext_name The extension to load language from, or empty for core files * * Examples: * <code> * $lang_set = array('posting', 'help' => 'faq'); * $lang_set = array('posting', 'viewtopic', 'help' => array('bbcode', 'faq')) * $lang_set = array(array('posting', 'viewtopic'), 'help' => array('bbcode', 'faq')) * $lang_set = 'posting' * $lang_set = array('help' => 'faq', 'db' => array('help:faq', 'posting')) * </code> */ function add_lang($lang_set, $use_db = false, $use_help = false, $ext_name = '') { global $phpEx; if (is_array($lang_set)) { foreach ($lang_set as $key => $lang_file) { // Please do not delete this line. // We have to force the type here, else [array] language inclusion will not work $key = (string) $key; if ($key == 'db') { $this->add_lang($lang_file, true, $use_help, $ext_name); } else if ($key == 'help') { $this->add_lang($lang_file, $use_db, true, $ext_name); } else if (!is_array($lang_file)) { $this->set_lang($this->lang, $this->help, $lang_file, $use_db, $use_help, $ext_name); } else { $this->add_lang($lang_file, $use_db, $use_help, $ext_name); } } unset($lang_set); } else if ($lang_set) { $this->set_lang($this->lang, $this->help, $lang_set, $use_db, $use_help, $ext_name); } } /** * Add Language Items from an extension - use_db and use_help are assigned where needed (only use them to force inclusion) * * @param string $ext_name The extension to load language from, or empty for core files * @param mixed $lang_set specifies the language entries to include * @param bool $use_db internal variable for recursion, do not use * @param bool $use_help internal variable for recursion, do not use */ function add_lang_ext($ext_name, $lang_set, $use_db = false, $use_help = false) { if ($ext_name === '/') { $ext_name = ''; } $this->add_lang($lang_set, $use_db, $use_help, $ext_name); } /** * Set language entry (called by add_lang) * @access private */ function set_lang(&$lang, &$help, $lang_file, $use_db = false, $use_help = false, $ext_name = '') { global $phpbb_root_path, $phpEx; // Make sure the language name is set (if the user setup did not happen it is not set) if (!$this->lang_name) { global $config; $this->lang_name = basename($config['default_lang']); } // $lang == $this->lang // $help == $this->help // - add appropriate variables here, name them as they are used within the language file... if (!$use_db) { if ($use_help && strpos($lang_file, '/') !== false) { $filename = dirname($lang_file) . '/help_' . basename($lang_file); } else { $filename = (($use_help) ? 'help_' : '') . $lang_file; } if ($ext_name) { global $phpbb_extension_manager; $ext_path = $phpbb_extension_manager->get_extension_path($ext_name, true); $lang_path = $ext_path . 'language/'; } else { $lang_path = $this->lang_path; } if (strpos($phpbb_root_path . $filename, $lang_path . $this->lang_name . '/') === 0) { $language_filename = $phpbb_root_path . $filename; } else { $language_filename = $lang_path . $this->lang_name . '/' . $filename . '.' . $phpEx; } // If we are in install, try to use the updated version, when available $install_language_filename = str_replace('language/', 'install/update/new/language/', $language_filename); if (defined('IN_INSTALL') && file_exists($install_language_filename)) { $language_filename = $install_language_filename; } if (!file_exists($language_filename)) { global $config; if ($this->lang_name == 'en') { // The user's selected language is missing the file, the board default's language is missing the file, and the file doesn't exist in /en. $language_filename = str_replace($lang_path . 'en', $lang_path . $this->data['user_lang'], $language_filename); trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR); } else if ($this->lang_name == basename($config['default_lang'])) { // Fall back to the English Language $this->lang_name = 'en'; $this->set_lang($lang, $help, $lang_file, $use_db, $use_help, $ext_name); } else if ($this->lang_name == $this->data['user_lang']) { // Fall back to the board default language $this->lang_name = basename($config['default_lang']); $this->set_lang($lang, $help, $lang_file, $use_db, $use_help, $ext_name); } // Reset the lang name $this->lang_name = (file_exists($lang_path . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : basename($config['default_lang']); return; } // Do not suppress error if in DEBUG mode $include_result = (defined('DEBUG')) ? (include $language_filename) : (@include $language_filename); if ($include_result === false) { trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR); } } else if ($use_db) { // Get Database Language Strings // Put them into $lang if nothing is prefixed, put them into $help if help: is prefixed // For example: help:faq, posting } } /** * Format user date * * @param int $gmepoch unix timestamp * @param string $format date format in date() notation. | used to indicate relative dates, for example |d m Y|, h:i is translated to Today, h:i. * @param bool $forcedate force non-relative date format. * * @return mixed translated date */ function format_date($gmepoch, $format = false, $forcedate = false) { static $utc; if (!isset($utc)) { $utc = new \DateTimeZone('UTC'); } $time = new \phpbb\datetime($this, "@$gmepoch", $utc); $time->setTimezone($this->timezone); return $time->format($format, $forcedate); } /** * Create a \phpbb\datetime object in the context of the current user * * @since 3.1 * @param string $time String in a format accepted by strtotime(). * @param DateTimeZone $timezone Time zone of the time. * @return \phpbb\datetime Date time object linked to the current users locale */ public function create_datetime($time = 'now', \DateTimeZone $timezone = null) { $timezone = $timezone ?: $this->timezone; return new \phpbb\datetime($this, $time, $timezone); } /** * Get the UNIX timestamp for a datetime in the users timezone, so we can store it in the database. * * @param string $format Format of the entered date/time * @param string $time Date/time with the timezone applied * @param DateTimeZone $timezone Timezone of the date/time, falls back to timezone of current user * @return int Returns the unix timestamp */ public function get_timestamp_from_format($format, $time, \DateTimeZone $timezone = null) { $timezone = $timezone ?: $this->timezone; $date = \DateTime::createFromFormat($format, $time, $timezone); return ($date !== false) ? $date->format('U') : false; } /** * Get language id currently used by the user */ function get_iso_lang_id() { global $config, $db; if (!empty($this->lang_id)) { return $this->lang_id; } if (!$this->lang_name) { $this->lang_name = $config['default_lang']; } $sql = 'SELECT lang_id FROM ' . LANG_TABLE . " WHERE lang_iso = '" . $db->sql_escape($this->lang_name) . "'"; $result = $db->sql_query($sql); $this->lang_id = (int) $db->sql_fetchfield('lang_id'); $db->sql_freeresult($result); return $this->lang_id; } /** * Get users profile fields */ function get_profile_fields($user_id) { global $db; if (isset($this->profile_fields)) { return; } $sql = 'SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE . " WHERE user_id = $user_id"; $result = $db->sql_query_limit($sql, 1); $this->profile_fields = (!($row = $db->sql_fetchrow($result))) ? array() : $row; $db->sql_freeresult($result); } /** * Specify/Get image */ function img($img, $alt = '') { $alt = (!empty($this->lang[$alt])) ? $this->lang[$alt] : $alt; return '<span class="imageset ' . $img . '">' . $alt . '</span>'; } /** * Get option bit field from user options. * * @param int $key option key, as defined in $keyoptions property. * @param int $data bit field value to use, or false to use $this->data['user_options'] * @return bool true if the option is set in the bit field, false otherwise */ function optionget($key, $data = false) { $var = ($data !== false) ? $data : $this->data['user_options']; return phpbb_optionget($this->keyoptions[$key], $var); } /** * Set option bit field for user options. * * @param int $key Option key, as defined in $keyoptions property. * @param bool $value True to set the option, false to clear the option. * @param int $data Current bit field value, or false to use $this->data['user_options'] * @return int|bool If $data is false, the bit field is modified and * written back to $this->data['user_options'], and * return value is true if the bit field changed and * false otherwise. If $data is not false, the new * bitfield value is returned. */ function optionset($key, $value, $data = false) { $var = ($data !== false) ? $data : $this->data['user_options']; $new_var = phpbb_optionset($this->keyoptions[$key], $value, $var); if ($data === false) { if ($new_var != $var) { $this->data['user_options'] = $new_var; return true; } else { return false; } } else { return $new_var; } } /** * Funtion to make the user leave the NEWLY_REGISTERED system group. * @access public */ function leave_newly_registered() { global $db; if (empty($this->data['user_new'])) { return false; } if (!function_exists('remove_newly_registered')) { global $phpbb_root_path, $phpEx; include($phpbb_root_path . 'includes/functions_user.' . $phpEx); } if ($group = remove_newly_registered($this->data['user_id'], $this->data)) { $this->data['group_id'] = $group; } $this->data['user_permissions'] = ''; $this->data['user_new'] = 0; return true; } /** * Returns all password protected forum ids the user is currently NOT authenticated for. * * @return array Array of forum ids * @access public */ function get_passworded_forums() { global $db; $sql = 'SELECT f.forum_id, fa.user_id FROM ' . FORUMS_TABLE . ' f LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($this->session_id) . "') WHERE f.forum_password <> ''"; $result = $db->sql_query($sql); $forum_ids = array(); while ($row = $db->sql_fetchrow($result)) { $forum_id = (int) $row['forum_id']; if ($row['user_id'] != $this->data['user_id']) { $forum_ids[$forum_id] = $forum_id; } } $db->sql_freeresult($result); return $forum_ids; } }