Author: Sergey Panteleev (saundefined)
Committer: GitHub (web-flow)
Pusher: saundefined
Date: 2024-11-19T20:34:44+03:00

Commit: 
https://github.com/php/web-php/commit/039acc1453f2348f10545e58cf1bca833407e6b7
Raw diff: 
https://github.com/php/web-php/commit/039acc1453f2348f10545e58cf1bca833407e6b7.diff

Preparing PHP 8.4 announcement page (#1079)

Co-authored-by: Tim Düsterhus <t...@bastelstu.be>
Co-authored-by: Gina Peter Banyard <girg...@php.net>
Co-authored-by: Jorg Adam Sowa <jorg.s...@gmail.com>
Co-authored-by: Tim Düsterhus <timwo...@googlemail.com>
Co-authored-by: Niels Dossche <7771979+niels...@users.noreply.github.com>
Co-authored-by: Roman Pronskiy <ro...@pronskiy.com>
Co-authored-by: Theodore Brown <theodor...@outlook.com>
Co-authored-by: Marcos Marcolin <mar...@ixcsoft.com.br>
Co-authored-by: andresayac <andresa...@gmail.com>
Co-authored-by: Marcos Marcolin 
<48370677+marcosmarco...@users.noreply.github.com>
Co-authored-by: Borislav Kosun <kosu...@yandex.com>

Changed paths:
  A  images/php8/logo_php8_4.svg
  A  images/php8/php_8_4_released.png
  A  releases/8.4/common.php
  A  releases/8.4/en.php
  A  releases/8.4/es.php
  A  releases/8.4/index.php
  A  releases/8.4/languages/en.php
  A  releases/8.4/languages/es.php
  A  releases/8.4/languages/nl.php
  A  releases/8.4/languages/pt_BR.php
  A  releases/8.4/languages/ru.php
  A  releases/8.4/nl.php
  A  releases/8.4/pt_BR.php
  A  releases/8.4/release.inc
  A  releases/8.4/ru.php
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
  M  
tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png


Diff:

diff --git a/images/php8/logo_php8_4.svg b/images/php8/logo_php8_4.svg
new file mode 100644
index 0000000000..9ca76c1c05
--- /dev/null
+++ b/images/php8/logo_php8_4.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="451" height="127" fill="none" 
viewBox="0 0 451 127">
+  <path fill="#fff" fill-rule="evenodd" d="M21.7998 
125.799h-21l18.7-96.0998h40.3c12.1 0 21 3.2 26.5 9.5 5.6 6.4 7.2 15.2 5 26.7-.9 
4.7-2.5 9-4.6 12.9-2.2 3.9-5 7.5-8.5 10.7-4.2 3.9-8.8 6.7-13.9 8.4-5.1 1.7-11.6 
2.4998-19.6 2.4998h-18l-4.9 
25.4Zm45.9-76.5998c-2.7-2.9-8-4.4-15.9-4.4h-14.3l-7.8 40.3h12.7c8.4 0 14.7-1.6 
18.9-4.8 4.1-3.2 6.9-8.5 8.4-15.9 1.3-7.2.6-12.2-2-15.2Z" clip-rule="evenodd"/>
+  <path fill="#fff" d="M106.6 4.09961h20.8l-5 25.59999h18.5c11.7 0 19.7 2 24.1 
6.1 4.4 4.1 5.8 10.7 4 19.8L160.3 
100.4h-21.1l8.3-42.6004c.9-4.8.6-8.1-1-9.9-1.6-1.8-5.1-2.6-10.4-2.6h-16.6L108.8 
100.4H87.9004L106.6 4.09961Z"/>
+  <path fill="#fff" fill-rule="evenodd" d="M185.2 
125.799h-21l18.7-96.0998h40.4c12.1 0 21 3.2 26.5 9.5 5.6 6.4 7.2 15.2 5 26.7-.9 
4.7-2.5 9-4.6 12.9-2.2 3.9-5 7.5-8.5 10.7-4.2 3.9-8.8 6.7-13.9 8.4-5.1 1.7-11.6 
2.4998-19.6 2.4998h-18l-5 25.4Zm46-76.5998c-2.7-2.9-8-4.4-15.9-4.4h-14.4l-7.8 
40.3h12.7c8.4 0 14.7-1.6 18.9-4.8 4.1-3.2 6.9-8.5 8.4-15.9 
1.3-7.2.7-12.2-1.9-15.2Z" clip-rule="evenodd"/>
+  <path fill="#fff" d="M317.5 48.5c-5.7-13.6-10.5-25.4-5.8-33.6 1.8-2.5 
3.8-3.8 6-3.8 4.5 0 8.6 4.9 8.6 4.9l5.7 
6.9-3.6-8.2c-.2-.3-6.3-14.2-17.2-14.2-3.8 0-7.8 1.7-11.7 5.1l-.1.1c-9.5 11-.2 
31.8 8.1 50.1l6.1 14.2c2.8 7.3 5.6 16 3.9 22.4-2.6 10-11.5 16.8-11.6 16.9l-5.7 
4.4 6.9-2.2c.7-.2 16-5.2 19.7-18.5 2.3-10.9-.6-21.8-3.5-30.2.4-.3-.4.3 0 0L318 
49.1"/>
+  <path fill="#0F0F0F" d="m334.4 9.89961-7.1-7.8 5.1 9.29999c.1.1 6.3 11.7-1.6 
25.2-2.9 4.2-7.4 8.4-13.1 12.6l-10.3 6.7c-.1-.1-.1-.2 0 0l-.4.3c-11.5 6.6-22.2 
10.6-22.4 10.7-15.9 7.1-25.9 18.1-27.3 30.3-1.1 9.2004 3.2 18.2004 11.6 
24.5004l.1.1c5.3 3.2 11 4.8 17 4.8 15.7 0 28-10.9 28.5-11.4l7.7-6.9-9.1 4.8c-.1 
0-7.7 4-15.6 4-7.1 0-12.1-3.1-15.1-9.4-3.8-13.4004 9.5-22.6004 24.8-33.2004 
2-1.4 4.1-2.9 6.2-4.3l.1-.1 9.1-6.8c.1-.2.4-.4.4-.4 7.5-6.2 17.4-15.9 19.7-29.5 
1.8-12.3-7.9-23-8.3-23.49999Z"/>
+  <path fill="#fff" d="M345.4 83h19.5l-3.5 17.7h-19.5l3.5-17.7Z"/>
+  <path fill="#fff" 
d="M423.85546875,50.75292969c1.28125-6.44580078,2.85058594-13.86523438,4.17089844-19.10791016h-.53613281c-3.71289062,4.95507812-7.65429688,10.38720703-11.63574219,15.09375l-16.53515625,18.59521484h49.98535156l-3.00097656,15.17285156h-70.05371094l2.71289062-13.81347656,45.89941406-51.03125h24.03125l-16.90429688,85.03613281h-17.86621094l9.73242188-49.9453125Z"/>
+</svg>
diff --git a/images/php8/php_8_4_released.png b/images/php8/php_8_4_released.png
new file mode 100644
index 0000000000..3dc88ee1b4
Binary files /dev/null and b/images/php8/php_8_4_released.png differ
diff --git a/releases/8.4/common.php b/releases/8.4/common.php
new file mode 100644
index 0000000000..3a439f2815
--- /dev/null
+++ b/releases/8.4/common.php
@@ -0,0 +1,74 @@
+<?php
+
+declare(strict_types=1);
+
+namespace releases\php84;
+
+include_once __DIR__ . '/../../include/prepend.inc';
+
+const LANGUAGES = [
+    'en' => 'English',
+    'ru' => 'Russian',
+    'pt_BR' => 'Português do Brasil',
+    'nl' => 'Nederlands',
+    'es' => 'Spanish',
+];
+
+function common_header(string $description): void {
+    global $MYSITE;
+
+    $meta_image_path = \htmlspecialchars(
+        \filter_var($MYSITE . 'images/php8/php_8_4_released.png', 
\FILTER_VALIDATE_URL));
+    $meta_description = \htmlspecialchars($description);
+
+    \site_header("PHP 8.4.0 Release Announcement", [
+        'current' => 'php8',
+        'css' => ['php8.css'],
+        'meta_tags' => <<<META
+<meta name="twitter:card" content="summary_large_image" />
+<meta name="twitter:site" content="@official_php" />
+<meta name="twitter:title" content="PHP 8.4 Released" />
+<meta name="twitter:description" content="{$meta_description}" />
+<meta name="twitter:creator" content="@official_php" />
+<meta name="twitter:image:src" content="{$meta_image_path}" />
+
+<meta itemprop="name" content="PHP 8.4 Released" />
+<meta itemprop="description" content="{$meta_description}" />
+<meta itemprop="image" content="{$meta_image_path}" />
+
+<meta property="og:image" content="{$meta_image_path}" />
+<meta property="og:description" content="{$meta_description}" />
+META
+    ]);
+}
+
+function language_chooser(string $currentLang): void {
+    // Print out the form with all the options
+    echo '
+      <form action="" method="get" id="changelang" name="changelang">
+        <fieldset>
+          <label for="changelang-langs">Change language:</label>
+          <select onchange="location = this.value + \'.php\'" name="lang" 
id="changelang-langs">
+';
+
+    $tab = '            ';
+    foreach (LANGUAGES as $lang => $text) {
+        $selected = ($lang === $currentLang) ? ' selected="selected"' : '';
+        echo $tab, "<option value='$lang'$selected>$text</option>\n";
+    }
+
+    echo '          </select>
+        </fieldset>
+      </form>
+';
+}
+
+function message($code, $language = 'en')
+{
+    $original = require __DIR__ . '/languages/en.php';
+    if (($language !== 'en') && file_exists(__DIR__ . '/languages/' . 
$language . '.php')) {
+        $translation = require __DIR__ . '/languages/' . $language . '.php';
+    }
+
+    return $translation[$code] ?? $original[$code] ?? $code;
+}
diff --git a/releases/8.4/en.php b/releases/8.4/en.php
new file mode 100644
index 0000000000..7ff380e63b
--- /dev/null
+++ b/releases/8.4/en.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'en';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/es.php b/releases/8.4/es.php
new file mode 100644
index 0000000000..70a1a68670
--- /dev/null
+++ b/releases/8.4/es.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'es';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/index.php b/releases/8.4/index.php
new file mode 100644
index 0000000000..ee9f915c90
--- /dev/null
+++ b/releases/8.4/index.php
@@ -0,0 +1,13 @@
+<?php
+
+use phpweb\LangChooser;
+use const releases\php84\LANGUAGES;
+
+$_SERVER['BASE_PAGE'] = 'releases/8.4/index.php';
+require_once __DIR__ . '/common.php';
+require_once __DIR__ . '/../../src/autoload.php';
+
+$langChooser = new LangChooser(LANGUAGES, [], "", "");
+[$lang,] = $langChooser->chooseCode("", "", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+
+mirror_redirect("/releases/8.4/$lang.php");
diff --git a/releases/8.4/languages/en.php b/releases/8.4/languages/en.php
new file mode 100644
index 0000000000..0db7d60915
--- /dev/null
+++ b/releases/8.4/languages/en.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.4 is a major update of the PHP language. It 
contains many new features, such as property hooks, asymmetric visibility, an 
updated DOM API, performance improvements, bug fixes, and general cleanup.',
+    'documentation' => 'Doc',
+    'main_title' => 'Released!',
+    'main_subtitle' => 'PHP 8.4 is a major update of the PHP language.<br 
class="display-none-md"> It contains many new features, such as property hooks, 
asymmetric visibility, an updated DOM API, performance improvements, bug fixes, 
and general cleanup.',
+    'upgrade_now' => 'Upgrade to PHP 8.4 now!',
+
+    'property_hooks_title' => 'Property hooks',
+    'property_hooks_description' => 'Property hooks provide support for 
computed properties that can natively be understood by IDEs and static analysis 
tools, without needing to write docblock comments that might go out of sync. 
Furthermore, they allow reliable pre- or post-processing of values, without 
needing to check whether a matching getter or setter exists in the class.',
+    'asymmetric_visibility_title' => 'Asymmetric Visibility',
+    'asymmetric_visibility_description' => 'The scope to write to a property 
may now be controlled independently from the scope to read the property, 
reducing the need for boilerplate getter methods to expose a property’s value 
without allowing modification from the outside of a class.',
+    'deprecated_attribute_title' => '<code>#[\Deprecated]</code> Attribute',
+    'deprecated_attribute_description' => 'The new <code>#[\Deprecated]</code> 
attribute makes PHP’s existing deprecation mechanism available to user-defined 
functions, methods, and class constants.',
+    'dom_additions_html5_title' => 'New ext-dom features and HTML5 support',
+    'dom_additions_html5_description' => '<p>New DOM API that includes 
standards-compliant support for parsing HTML5 documents, fixes several 
long-standing compliance bugs in the behavior of the DOM functionality, and 
adds several functions to make working with documents more 
convenient.</p><p>The new DOM API is available within the <code>Dom</code> 
namespace. Documents using the new DOM API can be created using the 
<code>Dom\HTMLDocument</code> and <code>Dom\XMLDocument</code> classes.</p>',
+    'new_array_find_title' => 'New <code>array_*()</code> functions',
+    'new_array_find_description' => 'New functions <a 
href="/manual/en/function.array-find.php"><code>array_find()</code></a>, <a 
href="/manual/en/function.array-find-key.php"><code>array_find_key()</code></a>,
 <a href="/manual/en/function.array-any.php"><code>array_any()</code></a>, and 
<a href="/manual/en/function.array-all.php"><code>array_all()</code></a> are 
available.',
+    'pdo_driver_specific_parsers_title' => 'PDO Driver specific SQL parsers',
+    'pdo_driver_specific_parsers_description' => 'New subclasses 
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>, <code>Pdo\MySql</code>, 
<code>Pdo\Odbc</code>, and <code>Pdo\Sqlite</code> of <code>PDO</code> are 
available.',
+    'new_without_parentheses_title' => '<code>new MyClass()->method()</code> 
without parentheses',
+    'new_without_parentheses_description' => 'Properties and methods of a 
newly instantiated object can now be accessed without wrapping the 
<code>new</code> expression in parenthesis.',
+
+    'new_classes_title' => 'New Classes, Interfaces, and Functions',
+    'new_jit_implementation' => 'New JIT implementation based on IR Framework',
+    'new_core_functions' => 'New <code>request_parse_body()</code> function.',
+    'new_bcmath_functions' => 'New <code>bcceil()</code>, 
<code>bcdivmod()</code>, <code>bcfloor()</code>, and <code>bcround()</code> 
functions.',
+    'new_round_modes' => 'New <code>RoundingMode</code> enum for 
<code>round()</code> with 4 new rounding modes <code>TowardsZero</code>, 
<code>AwayFromZero</code>, <code>NegativeInfinity</code>, and 
<code>PositiveInfinity</code>.',
+    'new_date_functions' => 'New <code>DateTime::createFromTimestamp()</code>, 
<code>DateTime::getMicrosecond()</code>, 
<code>DateTime::setMicrosecond()</code>, 
<code>DateTimeImmutable::createFromTimestamp()</code>, 
<code>DateTimeImmutable::getMicrosecond()</code>, and 
<code>DateTimeImmutable::setMicrosecond()</code> methods.',
+    'new_mb_functions' => 'New <code>mb_trim()</code>, 
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>, <code>mb_ucfirst()</code>, 
and <code>mb_lcfirst()</code> functions.',
+    'new_pcntl_functions' => 'New <code>pcntl_getcpu()</code>, 
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>, 
<code>pcntl_setns()</code>, and <code>pcntl_waitid()</code> functions.',
+    'new_reflection_functions' => 'New 
<code>ReflectionClassConstant::isDeprecated()</code>, 
<code>ReflectionGenerator::isClosed()</code>, and 
<code>ReflectionProperty::isDynamic()</code> methods.',
+    'new_standard_functions' => 'New 
<code>http_get_last_response_headers()</code>, 
<code>http_clear_last_response_headers()</code>, and <code>fpow()</code> 
functions.',
+    'new_xml_functions' => 'New <code>XMLReader::fromStream()</code>, 
<code>XMLReader::fromUri()</code>, <code>XMLReader::fromString()</code>, 
<code>XMLWriter::toStream()</code>, <code>XMLWriter::toUri()</code>, and 
<code>XMLWriter::toMemory()</code> methods.',
+    'new_grapheme_function' => 'New <code>grapheme_str_split()</code> 
function.',
+
+    'bc_title' => 'Deprecations and backward compatibility breaks',
+    'bc_pecl' => 'The IMAP, OCI8, PDO_OCI, and pspell extensions have been 
unbundled and moved to PECL.',
+    'bc_nullable_parameter_types' => 'Implicitly nullable parameter types are 
now deprecated.',
+    'bc_classname' => 'Using <code>_</code> as a class name is now 
deprecated.',
+    'bc_zero_raised_to_negative_number' => 'Raising zero to the power of a 
negative number is now deprecated.',
+    'bc_gmp' => '<code>GMP</code> class is now final.',
+    'bc_round' => 'Passing invalid mode to <code>round()</code> throws 
<code>ValueError</code>.',
+    'bc_typed_constants' => 'Class constants from extensions 
<code>date</code>, <code>intl</code>, <code>pdo</code>, 
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>, 
<code>xmlreader</code> are typed now.',
+    'bc_mysqli_constants' => '<code>MYSQLI_SET_CHARSET_DIR</code>, 
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>, 
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>, 
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, and 
<code>MYSQLI_TYPE_INTERVAL</code> constants have been removed.',
+    'bc_mysqli_functions' => '<code>mysqli_ping()</code>, 
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code> functions, 
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>, 
<code>mysqli::refresh()</code> methods, and <code>MYSQLI_REFRESH_*</code> 
constants have been deprecated.',
+    'bc_standard' => '<code>stream_bucket_make_writeable()</code> and 
<code>stream_bucket_new()</code> now return an instance of 
<code>StreamBucket</code> instead of <code>stdClass</code>.',
+    'bc_core' => '<a 
href="/manual/en/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code>
 behavioral change</a>.',
+    'bc_warnings' => '<code>E_STRICT</code> constant has been deprecated.',
+
+    'footer_title' => 'Better performance, better syntax, improved type 
safety.',
+    'footer_description' => '<p>For source downloads of PHP 8.4 please visit 
the <a href="/downloads">downloads</a> page. Windows binaries can be found on 
the <a href="https://windows.php.net/download";>PHP for Windows</a> site. The 
list of changes is recorded in the <a 
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+        <p>The <a href="/manual/en/migration84.php">migration guide</a> is 
available in the PHP Manual. Please consult it for a detailed list of new 
features and backward-incompatible changes.</p>',
+];
diff --git a/releases/8.4/languages/es.php b/releases/8.4/languages/es.php
new file mode 100644
index 0000000000..2f881a8260
--- /dev/null
+++ b/releases/8.4/languages/es.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.4 es una actualización importante del lenguaje 
PHP. Contiene muchas características nuevas, como hooks para propiedades, 
visibilidad asimétrica, una API DOM actualizada, mejoras de rendimiento, 
correcciones de errores y limpieza general.',
+    'documentation' => 'Documentación',
+    'main_title' => '¡Lanzado!',
+    'main_subtitle' => 'PHP 8.4 es una actualización importante del lenguaje 
PHP.<br class="display-none-md"> Contiene muchas características nuevas, como 
hooks para propiedades, visibilidad asimétrica, una API DOM actualizada, 
mejoras de rendimiento, correcciones de errores y limpieza general.',
+    'upgrade_now' => '¡Actualiza a PHP 8.4 ahora!',
+
+    'property_hooks_title' => 'Hooks para Propiedades',
+    'property_hooks_description' => 'Los hooks para propiedades proporcionan 
soporte para propiedades calculadas que pueden ser comprendidas nativamente por 
los IDE y las herramientas de análisis estático, sin necesidad de escribir 
comentarios docblock que podrían desincronizarse. Además, permiten un 
preprocesamiento o postprocesamiento fiable de los valores, sin necesidad de 
comprobar si existe un getter o setter coincidente en la clase.',
+    'asymmetric_visibility_title' => 'Visibilidad asimétrica',
+    'asymmetric_visibility_description' => 'El alcance para escribir en una 
propiedad ahora se puede controlar independientemente del alcance para leer la 
propiedad, lo que reduce la necesidad de métodos getter repetitivos para 
exponer el valor de una propiedad sin permitir modificaciones desde fuera de 
una clase.',
+    'deprecated_attribute_title' => 'Atributo <code>#[\Deprecated]</code>',
+    'deprecated_attribute_description' => 'El nuevo atributo 
<code>#[\Deprecated]</code> hace que el mecanismo de obsolescencia existente de 
PHP esté disponible para funciones, métodos y constantes de clase definidas por 
el usuario.',
+    'dom_additions_html5_title' => 'Nuevas características de ext-dom y 
soporte para HTML5',
+    'dom_additions_html5_description' => '<p>Nueva API DOM que incluye soporte 
conforme a los estándares para el análisis de documentos HTML5, corrige varios 
errores de cumplimiento antiguos en el comportamiento de la funcionalidad DOM, 
y añade varias funciones para hacer más conveniente trabajar con 
documentos.</p><p>La nueva API DOM está disponible dentro del espacio de 
nombres <code>Dom</code>. Los documentos que utilizan la nueva API DOM pueden 
ser creados utilizando las clases <code>Dom\HTMLDocument</code> y 
<code>Dom\XMLDocument</code>.',
+    'new_array_find_title' => 'Nuevas funciones <code>array_*()</code>',
+    'new_array_find_description' => 'Nuevas funciones disponibles: <a 
href="/manual/es/function.array-find.php"><code>array_find()</code></a>, <a 
href="/manual/es/function.array-find-key.php"><code>array_find_key()</code></a>,
 <a href="/manual/es/function.array-any.php"><code>array_any()</code></a> y <a 
href="/manual/es/function.array-all.php"><code>array_all()</code></a>.',
+    'pdo_driver_specific_parsers_title' => 'Procesadores SQL específicos para 
PDO Driver',
+    'pdo_driver_specific_parsers_description' => 'Nuevas subclases de 
<code>PDO</code>: <code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>, 
<code>Pdo\MySql</code>, <code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> están 
disponibles.',
+    'new_without_parentheses_title' => '<code>new MyClass()->method()</code> 
sin paréntesis',
+    'new_without_parentheses_description' => 'Las propiedades y métodos de un 
objeto recién instanciado ahora se pueden acceder sin envolver la expresión 
<code>new</code> entre paréntesis.',
+
+    'new_classes_title' => 'Nuevas Clases, Interfaces y Funciones',
+    'new_jit_implementation' => 'Nueva implementación JIT basada en el marco 
IR.',
+    'new_core_functions' => 'Nueva función <code>request_parse_body()</code>.',
+    'new_bcmath_functions' => 'Nuevas funciones: <code>bcceil()</code>, 
<code>bcdivmod()</code>, <code>bcfloor()</code> y <code>bcround()</code>.',
+    'new_round_modes' => 'Nuevo enum <code>RoundingMode</code> para 
<code>round()</code> con 4 nuevos modos de redondeo: <code>TowardsZero</code>, 
<code>AwayFromZero</code>, <code>NegativeInfinity</code> y 
<code>PositiveInfinity</code>.',
+    'new_date_functions' => 'Nuevos métodos: 
<code>DateTime::createFromTimestamp()</code>, 
<code>DateTime::getMicrosecond()</code>, 
<code>DateTime::setMicrosecond()</code>, 
<code>DateTimeImmutable::createFromTimestamp()</code>, 
<code>DateTimeImmutable::getMicrosecond()</code>, y 
<code>DateTimeImmutable::setMicrosecond()</code>.',
+    'new_mb_functions' => 'Nuevas funciones: <code>mb_trim()</code>, 
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>, <code>mb_ucfirst()</code>, y 
<code>mb_lcfirst()</code>.',
+    'new_pcntl_functions' => 'Nuevas funciones: <code>pcntl_getcpu()</code>, 
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>, 
<code>pcntl_setns()</code> y <code>pcntl_waitid()</code>.',
+    'new_reflection_functions' => 'Nuevos métodos: 
<code>ReflectionClassConstant::isDeprecated()</code>, 
<code>ReflectionGenerator::isClosed()</code>, y 
<code>ReflectionProperty::isDynamic()</code>.',
+    'new_standard_functions' => 'Nuevas funciones: 
<code>http_get_last_response_headers()</code>, 
<code>http_clear_last_response_headers()</code> y <code>fpow()</code>.',
+    'new_xml_functions' => 'Nuevos métodos: 
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>, 
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>, 
<code>XMLWriter::toUri()</code> y <code>XMLWriter::toMemory()</code>.',
+    'new_grapheme_function' => 'Nueva función 
<code>grapheme_str_split()</code>.',
+
+    'bc_title' => 'Deprecaciones y cambios en compatibilidad retroactiva',
+    'bc_pecl' => 'Las extensiones IMAP, OCI8, PDO_OCI y pspell han sido 
desagregadas y movidas a PECL.',
+    'bc_nullable_parameter_types' => 'Los tipos de parámetros implícitamente 
nulos ahora están en desuso.',
+    'bc_classname' => 'Usar <code>_</code> como nombre de clase ahora está en 
desuso.',
+    'bc_zero_raised_to_negative_number' => 'Elevar cero a la potencia de un 
número negativo ahora está en desuso.',
+    'bc_gmp' => 'La clase <code>GMP</code> ahora es final.',
+    'bc_round' => 'Pasar un modo inválido a <code>round()</code> lanza un 
<code>ValueError</code>.',
+    'bc_typed_constants' => 'Las constantes de clase de las extensiones 
<code>date</code>, <code>intl</code>, <code>pdo</code>, 
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>, 
<code>xmlreader</code> ahora tienen tipos.',
+    'bc_mysqli_constants' => 'Los constantes 
<code>MYSQLI_SET_CHARSET_DIR</code>, 
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>, 
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>, 
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, y <code>MYSQLI_TYPE_INTERVAL</code> 
han sido eliminadas.',
+    'bc_mysqli_functions' => 'Las funciones <code>mysqli_ping()</code>, 
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code>, los métodos 
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>, 
<code>mysqli::refresh()</code>, y los constantes <code>MYSQLI_REFRESH_*</code> 
están en desuso.',
+    'bc_standard' => '<code>stream_bucket_make_writeable()</code> y 
<code>stream_bucket_new()</code> ahora devuelven una instancia de 
<code>StreamBucket</code> en lugar de <code>stdClass</code>.',
+    'bc_core' => 'Cambio en el comportamiento de <a 
href="/manual/es/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code></a>.',
+    'bc_warnings' => 'El constante <code>E_STRICT</code> está en desuso.',
+
+    'footer_title' => 'Mejor rendimiento, mejor sintaxis, mejor seguridad de 
tipos.',
+    'footer_description' => '<p>Para descargar el código fuente de PHP 8.4, 
por favor visita la página de <a href="/downloads">descargas</a>. Los binarios 
para Windows se encuentran en el sitio <a 
href="https://windows.php.net/download";>PHP para Windows</a>. La lista de 
cambios está registrada en el <a 
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+        <p>La <a href="/manual/en/migration84.php">guía de migración</a> está 
disponible en el Manual de PHP. Por favor, consúltala para una lista detallada 
de nuevas características y cambios incompatibles con versiones 
anteriores.</p>',
+];
diff --git a/releases/8.4/languages/nl.php b/releases/8.4/languages/nl.php
new file mode 100644
index 0000000000..cb2cf3505d
--- /dev/null
+++ b/releases/8.4/languages/nl.php
@@ -0,0 +1,53 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.4 is een omvangrijke update van de PHP 
programmeertaal. Het bevat veel nieuwe functionaliteit, zoals property hooks, 
asymmetrische zichtbaarheid, een bijgewerkte DOM API, prestatieverbeteringen, 
bugfixes en meer consistentie.',
+    'documentation' => 'Documentatie',
+    'main_title' => 'Beschikbaar!',
+    'main_subtitle' => 'PHP 8.4 is een omvangrijke update van de PHP 
programmeertaal.<br class="display-none-md"> Het bevat veel nieuwe 
functionaliteit, zoals property hooks, asymmetrische zichtbaarheid, een 
bijgewerkte DOM API, prestatieverbeteringen, bugfixes en meer consistentie.',
+    'upgrade_now' => 'Upgrade nu naar PHP 8.4!',
+
+    'property_hooks_title' => 'Property hooks',
+    'property_hooks_description' => 'Property hooks geven ondersteuning voor 
berekende eigenschappen. Deze worden rechtstreeks ondersteund door IDEs en 
statische analyseprogramma’s, zonder dat documentatie blokken nodig zijn. 
Bovendien laten ze toe om waarden voor- of achteraf te verwerken zonder gebruik 
te maken van een getter of setter in de klasse.',
+    'asymmetric_visibility_title' => 'Asymmetrische zichtbaarheid',
+    'asymmetric_visibility_description' => 'De scope voor het schrijven naar 
een eigenschap kan nu onafhankelijk gecontroleerd worden ten opzichte van de 
scope om de eigenschap te lezen. Dit reduceert de nood voor repetitieve getter 
en setter methoden om de eigenschap bloot te stellen zonder aanpassing toe te 
laten buiten de klasse.',
+    'deprecated_attribute_title' => '<code>#[\Deprecated]</code> attribuut',
+    'deprecated_attribute_description' => 'Het nieuwe 
<code>#[\Deprecated]</code> attribuut maakt PHP’s bestaand 
uitfaseringsmechanisme beschikbaar voor gebruiker gedefinieerde functies, 
methoden en klasseconstanten.',
+    'dom_additions_html5_title' => 'Nieuwe ext-dom functies en HTML5 
ondersteuning',
+    'dom_additions_html5_description' => '<p>Nieuwe DOM API toe met correcte 
ondersteuning voor de HTML 5 standaard, oplossingen voor verschillende lang 
bestaande compliance bugs in the DOM functionaliteit, en verschillende nieuwe 
functies om het werken met documenten eenvoudiger te maken.</p><p>De nieuwe DOM 
API is beschikbaar via de <code>Dom</code> namespace. Documenten die de nieuwe 
API willen gebruiken, kunnen aangemaakt worden via de 
<code>Dom\HTMLDocument</code> en <code>Dom\XMLDocument</code> klassen.</p>',
+    'new_array_find_title' => 'Nieuwe <code>array_*()</code> functies',
+    'new_array_find_description' => 'Nieuwe functies <a 
href="/manual/en/function.array-find.php"><code>array_find()</code></a>, <a 
href="/manual/en/function.array-find-key.php"><code>array_find_key()</code></a>,
 <a href="/manual/en/function.array-any.php"><code>array_any()</code></a>, en 
<a href="/manual/en/function.array-all.php"><code>array_all()</code></a> zijn 
nu beschikbaar.',
+    'pdo_driver_specific_parsers_title' => 'PDO driver specifieke SQL parsers',
+    'pdo_driver_specific_parsers_description' => 'Nieuwe subklassen 
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>, <code>Pdo\MySql</code>, 
<code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> van <code>PDO</code> zijn nu 
beschikbaar.',
+    'new_without_parentheses_title' => '<code>new MyClass()->method()</code> 
zonder haakjes',
+    'new_without_parentheses_description' => 'Eigenschappen en methoden van 
een nieuw geïnstantieerd object kunnen nu opgevraagd worden zonder de 
<code>new</code> expressie tussen haakjes te zetten.',
+
+    'new_classes_title' => 'Nieuwe klassen, interfaces en functies',
+    'new_core_functions' => 'Nieuwe <code>request_parse_body()</code> 
functie.',
+    'new_bcmath_functions' => 'Nieuwe <code>bcceil()</code>, 
<code>bcdivmod()</code>, <code>bcfloor()</code>, en <code>bcround()</code> 
functies.',
+    'new_round_modes' => 'Nieuwe <code>RoundingMode</code> enum voor 
<code>round()</code> met 4 nieuwe afrondingsmodi <code>TowardsZero</code>, 
<code>AwayFromZero</code>, <code>NegativeInfinity</code>, en 
<code>PositiveInfinity</code>.',
+    'new_date_functions' => 'Nieuwe 
<code>DateTime::createFromTimestamp()</code>, 
<code>DateTime::getMicrosecond()</code>, 
<code>DateTime::setMicrosecond()</code>, 
<code>DateTimeImmutable::createFromTimestamp()</code>, 
<code>DateTimeImmutable::getMicrosecond()</code>, en 
<code>DateTimeImmutable::setMicrosecond()</code> methoden.',
+    'new_mb_functions' => 'Nieuwe <code>mb_trim()</code>, 
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>, <code>mb_ucfirst()</code>, en 
<code>mb_lcfirst()</code> functies.',
+    'new_pcntl_functions' => 'Nieuwe <code>pcntl_getcpu()</code>, 
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>, 
<code>pcntl_setns()</code>, en <code>pcntl_waitid()</code> functies.',
+    'new_reflection_functions' => 'Nieuwe 
<code>ReflectionClassConstant::isDeprecated()</code>, 
<code>ReflectionGenerator::isClosed()</code>, en 
<code>ReflectionProperty::isDynamic()</code> methoden.',
+    'new_standard_functions' => 'Nieuwe 
<code>http_get_last_response_headers()</code>, 
<code>http_clear_last_response_headers()</code>, en <code>fpow()</code> 
functies.',
+    'new_xml_functions' => 'Nieuwe <code>XMLReader::fromStream()</code>, 
<code>XMLReader::fromUri()</code>, <code>XMLReader::fromString()</code>, 
<code>XMLWriter::toStream()</code>, <code>XMLWriter::toUri()</code>, en 
<code>XMLWriter::toMemory()</code> methoden.',
+
+    'bc_title' => 'Uitfaseringen en neerwaarts incompatibele aanpassingen',
+    'bc_pecl' => 'De IMAP, OCI8, PDO_OCI en pspell-extensies zijn ontbundeld 
en verplaatst naar PECL.',
+    'bc_nullable_parameter_types' => 'Impliciet parameters als null definiëren 
is nu uitgefaseerd.',
+    'bc_classname' => 'Gebruik van <code>_</code> als een klassenaam is nu 
uitgefaseerd.',
+    'bc_zero_raised_to_negative_number' => 'Nul verheffen tot een negatieve 
macht is nu uitgefaseerd.',
+    'bc_gmp' => '<code>GMP</code> klasse is nu final.',
+    'bc_round' => 'Ongeldige modus doorgeven aan <code>round()</code> 
resulteert in een <code>ValueError</code>.',
+    'bc_typed_constants' => 'Klasseconstanten van extensies <code>date</code>, 
<code>intl</code>, <code>pdo</code>, <code>reflection</code>, <code>spl</code>, 
<code>sqlite</code>, <code>xmlreader</code> hebben nu types.',
+    'bc_mysqli_constants' => '<code>MYSQLI_SET_CHARSET_DIR</code>, 
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>, 
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>, 
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code>, en 
<code>MYSQLI_TYPE_INTERVAL</code> constanten zijn verwijderd.',
+    'bc_mysqli_functions' => '<code>mysqli_ping()</code>, 
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code> functies, 
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>, 
<code>mysqli::refresh()</code> methoden, en <code>MYSQLI_REFRESH_*</code> 
constanten zijn uitgefaseerd.',
+    'bc_standard' => '<code>stream_bucket_make_writeable()</code> en 
<code>stream_bucket_new()</code> geven nu een instantie van 
<code>StreamBucket</code> terug in plaats van <code>stdClass</code>.',
+    'bc_core' => '<a 
href="/manual/en/migration84.incompatible.php#migration84.incompatible.core.exit"><code>exit()</code>
 heeft ander gedrag</a>.',
+    'bc_warnings' => '<code>E_STRICT</code> constante is uitgefaseerd.',
+
+    'footer_title' => 'Betere prestaties, betere syntaxis, verbeterd type 
systeem.',
+    'footer_description' => '<p>Ga naar de <a 
href="http://www.php.net/downloads";>downloads</a> pagina om de PHP 8.4 code te 
verkrijgen. Uitvoerbare bestanden voor Windows kan je vinden op de <a 
href="http://windows.php.net/download";>PHP voor Windows</a> website. De 
volledige lijst met wijzigingen is vastgelegd in een <a 
href="http://www.php.net/ChangeLog-8.php#PHP_8_4";>ChangeLog</a>.</p>
+        <p>De <a href="/manual/en/migration84.php">migratie gids</a> is 
beschikbaar in de PHP Handleiding. Gebruik deze om een gedetailleerde lijst te 
krijgen van nieuwe opties en neerwaarts incompatibele aanpassingen.</p>',
+];
diff --git a/releases/8.4/languages/pt_BR.php b/releases/8.4/languages/pt_BR.php
new file mode 100644
index 0000000000..1c808a19bf
--- /dev/null
+++ b/releases/8.4/languages/pt_BR.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.4 é uma atualização importante da linguagem PHP. 
Ela contém muitos novos recursos, como hooks de propriedade, visibilidade 
assimétrica, uma API DOM atualizada, melhorias de desempenho, correções de bugs 
e uma limpeza geral.',
+    'documentation' => 'Doc',
+    'main_title' => 'Lançado!',
+    'main_subtitle' => 'PHP 8.4 é uma atualização importante da linguagem 
PHP.<br class="display-none-md"> Ela contém muitos novos recursos, como hooks 
de propriedade, visibilidade assimétrica, uma API DOM atualizada, melhorias de 
desempenho, correções de bugs e uma limpeza geral.',
+    'upgrade_now' => 'Atualize para PHP 8.4 agora!',
+
+    'property_hooks_title' => 'Hooks de Propriedade',
+    'property_hooks_description' => 'Hooks de Propriedade oferecem suporte 
para propriedades computadas que podem ser interpretadas nativamente por IDEs e 
ferramentas de análise estática, sem a necessidade de escrever comentários em 
docblocks que podem ficar desatualizados. Além disso, eles permitem o 
pré-processamento ou pós-processamento confiável de valores, sem precisar 
verificar se um getter ou setter correspondente existe na classe.',
+    'asymmetric_visibility_title' => 'Visibilidade Assimétrica',
+    'asymmetric_visibility_description' => 'O escopo para escrita em uma 
propriedade agora pode ser controlado independentemente do escopo para leitura 
da propriedade, reduzindo a necessidade de métodos getter redundantes para 
expor o valor de uma propriedade sem permitir sua modificação fora da classe.',
+    'deprecated_attribute_title' => '<code>#[\Deprecated]</code> Atributo',
+    'deprecated_attribute_description' => 'O novo atributo 
<code>#[\Deprecated]</code> torna o mecanismo de descontinuação existente no 
PHP disponível para funções, métodos e constantes de classe definidas pelo 
usuário.',
+    'dom_additions_html5_title' => 'Novos recursos ext-dom e suporte a HTML5',
+    'dom_additions_html5_description' => 'Novas classes 
<code>Dom\HTMLDocument</code>, <code>Dom\XMLDocument</code> e métodos 
<code>DOMNode::compareDocumentPosition()</code>, 
<code>DOMXPath::registerPhpFunctionNS()</code>, <code>DOMXPath::quote()</code>, 
<code>XSLTProcessor::registerPHPFunctionNS()</code> estão disponíveis.',
+    'new_array_find_title' => 'Novas funções <code>array_*()</code>',
+    'new_array_find_description' => 'Novas funções <a 
href="/manual/pt_BR/function.array-find.php"><code>array_find()</code></a>, <a 
href="/manual/pt_BR/function.array-find-key.php"><code>array_find_key()</code></a>,
 <a href="/manual/pt_BR/function.array-any.php"><code>array_any()</code></a> e 
<a href="/manual/pt_BR/function.array-all.php"><code>array_all()</code></a> 
estão disponíveis.',
+    'pdo_driver_specific_parsers_title' => 'Parsers SQL específicos para 
drivers PDO',
+    'pdo_driver_specific_parsers_description' => 'Novas subclasses 
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>, <code>Pdo\MySql</code>, 
<code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> de <code>PDO</code> estão 
disponíveis.',
+    'new_without_parentheses_title' => '<code>new MyClass()->method()</code> 
sem parênteses',
+    'new_without_parentheses_description' => 'Propriedades e métodos de um 
objeto recém-instanciado agora podem ser acessados sem a necessidade de 
envolver a expressão <code>new</code> entre parênteses.',
+
+    'new_classes_title' => 'Novas classes, interfaces e funções',
+    'new_jit_implementation' => 'Nova implementação JIT baseada no Framework 
IR',
+    'new_core_functions' => 'Nova função <code>request_parse_body()</code>.',
+    'new_bcmath_functions' => 'Novas funções <code>bcceil()</code>, 
<code>bcdivmod()</code>, <code>bcfloor()</code> e <code>bcround()</code>.',
+    'new_round_modes' => 'Novo Enum <code>RoundingMode</code> para 
<code>round()</code> com 4 novos modos de arredondamento: 
<code>TowardsZero</code>, <code>AwayFromZero</code>, 
<code>NegativeInfinity</code> e <code>PositiveInfinity</code>.',
+    'new_date_functions' => 'Novos métodos 
<code>DateTime::createFromTimestamp()</code>, 
<code>DateTime::getMicrosecond()</code>, 
<code>DateTime::setMicrosecond()</code>, 
<code>DateTimeImmutable::createFromTimestamp()</code>, 
<code>DateTimeImmutable::getMicrosecond()</code> e 
<code>DateTimeImmutable::setMicrosecond()</code>.',
+    'new_mb_functions' => 'Novas funções <code>mb_trim()</code>, 
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>, <code>mb_ucfirst()</code> e 
<code>mb_lcfirst()</code>.',
+    'new_pcntl_functions' => 'Novas funções <code>pcntl_getcpu()</code>, 
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>, 
<code>pcntl_setns()</code> e <code>pcntl_waitid()</code>.',
+    'new_reflection_functions' => 'Novos métodos 
<code>ReflectionClassConstant::isDeprecated()</code>, 
<code>ReflectionGenerator::isClosed()</code> e 
<code>ReflectionProperty::isDynamic()</code>.',
+    'new_standard_functions' => 'Novas funções 
<code>http_get_last_response_headers()</code>, 
<code>http_clear_last_response_headers()</code> e <code>fpow()</code>.',
+    'new_xml_functions' => 'Novos métodos 
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>, 
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>, 
<code>XMLWriter::toUri()</code> e <code>XMLWriter::toMemory()</code>.',
+    'new_grapheme_function' => 'Nova função 
<code>grapheme_str_split()</code>.',
+
+    'bc_title' => 'Alterações obsoletas e incompatibilidades com versões 
anteriores',
+    'bc_pecl' => 'As extensões IMAP, OCI8, PDO_OCI e pspell foram separadas e 
movidas para o PECL.',
+    'bc_nullable_parameter_types' => 'Tipos de parâmetros implicitamente 
anuláveis agora estão obsoletos.',
+    'bc_classname' => 'O uso de <code>_</code> no nome da classe agora está 
obsoleto.',
+    'bc_zero_raised_to_negative_number' => 'Elevar zero a um número negativo 
agora está obsoleto.',
+    'bc_gmp' => 'A classe <code>GMP</code> agora é final.',
+    'bc_round' => 'Passar um modo inválido para <code>round()</code> agora 
lança um <code>ValueError</code>.',
+    'bc_typed_constants' => 'As constantes de classe das extensões 
<code>date</code>, <code>intl</code>, <code>pdo</code>, 
<code>reflection</code>, <code>spl</code>, <code>sqlite</code>, 
<code>xmlreader</code> agora são tipadas.',
+    'bc_mysqli_constants' => 'As constantes 
<code>MYSQLI_SET_CHARSET_DIR</code>, 
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>, 
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>, 
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code> e <code>MYSQLI_TYPE_INTERVAL</code> 
foram removidas.',
+    'bc_mysqli_functions' => 'As funções <code>mysqli_ping()</code>, 
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code>, os métodos 
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>, 
<code>mysqli::refresh()</code> e as constantes <code>MYSQLI_REFRESH_*</code> 
estão obsoletas.',
+    'bc_standard' => '<code>stream_bucket_make_writeable()</code> e 
<code>stream_bucket_new()</code> agora retornam uma instância de 
<code>StreamBucket</code> em vez de <code>stdClass</code>.',
+    'bc_core' => '<a 
href="/manual/pt_BR/migration84.incompatible.php#migration84.incompatible.core.exit">Alteração
 de comportamento no uso de <code>exit()</code></a>.',
+    'bc_warnings' => 'A constante <code>E_STRICT</code> está obsoleta.',
+
+    'footer_title' => 'Melhor desempenho, sintaxe aprimorada e maior segurança 
de tipos.',
+    'footer_description' => '<p>Para baixar o código-fonte do PHP 8.4, visite 
a página de <a href="/downloads">downloads</a>. Os binários para Windows podem 
ser encontrados no site <a href="https://windows.php.net/download";>PHP for 
Windows</a>. A lista de alterações está registrada no <a 
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+        <p>O <a href="/manual/en/migration84.php">guia de migração</a> está 
disponível no Manual do PHP. Consulte-o para uma lista detalhada de novos 
recursos e mudanças incompatíveis com versões anteriores.</p>',
+];
diff --git a/releases/8.4/languages/ru.php b/releases/8.4/languages/ru.php
new file mode 100644
index 0000000000..ef4a077d80
--- /dev/null
+++ b/releases/8.4/languages/ru.php
@@ -0,0 +1,55 @@
+<?php
+
+return [
+    'common_header' => 'PHP 8.4 — большое обновление языка PHP. Оно содержит 
множество новых возможностей, таких как хуки свойств, асимметричная область 
видимости свойств, обновление DOM API, улучшена производительность, исправлены 
ошибки и многое другое.',
+    'documentation' => 'Документация',
+    'main_title' => 'выпущен!',
+    'main_subtitle' => 'PHP 8.4 — большое обновление языка PHP.<br 
class="display-none-md"> Оно содержит множество новых возможностей, таких как 
хуки свойств, асимметричная область видимости свойств, обновление DOM API, 
улучшена производительность, исправлены ошибки и многое другое.',
+    'upgrade_now' => 'Переходите на PHP 8.4!',
+
+    'property_hooks_title' => 'Хуки свойств',
+    'property_hooks_description' => 'Хуки свойств обеспечивают поддержку 
вычисляемых свойств, которые могут быть понятны IDE и инструментам статического 
анализа, без необходимости писать DocBlock-комментарии, которые могут не 
совпадать. Кроме того, они позволяют выполнять надёжную предварительную или 
последующую обработку значений, без необходимости проверять, существует ли в 
классе соответствующий геттер или сеттер.',
+    'asymmetric_visibility_title' => 'Асимметричная область видимости свойств',
+    'asymmetric_visibility_description' => 'Область видимости записи свойства 
теперь может контролироваться независимо от области видимости чтения свойства, 
что уменьшает необходимость использования шаблонных методов-геттеров для 
раскрытия значения свойства без возможности его изменения извне класса.',
+    'deprecated_attribute_title' => 'Атрибут <code>#[\Deprecated]</code>',
+    'deprecated_attribute_description' => 'Новый атрибут 
<code>#[\Deprecated]</code> расширяет существующий механизм объявления сущности 
устаревшей для пользовательских функций, методов и констант классов.',
+    'dom_additions_html5_title' => 'Новые возможности ext-dom и поддержка 
HTML5',
+    'dom_additions_html5_description' => '<p>Новый DOM API, который 
поддерживает разбор HTML5-документов в соответствии со стандартами, исправляет 
несколько давних ошибок в поведении DOM и добавляет несколько функций, делающих 
работу с документами более удобной.</p><p>Новый DOM API доступен в пространстве 
имён <code>Dom</code>. Документы, использующие новый DOM API, могут быть 
созданы с помощью классов <code>Dom\HTMLDocument</code> и 
<code>Dom\XMLDocument</code>.</p>',
+    'new_array_find_title' => 'Новые функции <code>array_*()</code>',
+    'new_array_find_description' => 'Добавлены функции <a 
href="/manual/ru/function.array-find.php"><code>array_find()</code></a>, <a 
href="/manual/ru/function.array-find-key.php"><code>array_find_key()</code></a>,
 <a href="/manual/ru/function.array-any.php"><code>array_any()</code></a> и <a 
href="/manual/ru/function.array-all.php"><code>array_all()</code></a>.',
+    'pdo_driver_specific_parsers_title' => 'SQL-парсеры, специфичные для 
драйверов PDO',
+    'pdo_driver_specific_parsers_description' => 'Добавлены дочерние классы 
<code>Pdo\Dblib</code>, <code>Pdo\Firebird</code>, <code>Pdo\MySql</code>, 
<code>Pdo\Odbc</code>, <code>Pdo\Sqlite</code> драйверов, наследующие 
<code>PDO</code>.',
+    'new_without_parentheses_title' => '<code>new MyClass()->method()</code> 
без скобок',
+    'new_without_parentheses_description' => 'К свойствам и методам только что 
инициализированного объекта теперь можно обращаться, не оборачивая выражение 
<code>new</code> в круглые скобки.',
+
+    'new_classes_title' => 'Новые классы, интерфейсы и функции',
+    'new_jit_implementation' => 'Новая реализация JIT на основе IR Framework',
+    'new_core_functions' => 'Добавлена функция 
<code>request_parse_body()</code>.',
+    'new_bcmath_functions' => 'Добавлены функции <code>bcceil()</code>, 
<code>bcdivmod()</code>, <code>bcfloor()</code> и <code>bcround()</code>.',
+    'new_round_modes' => 'Добавлено перечисление <code>RoundingMode</code> для 
функции <code>round()</code> с 4 режимами: <code>TowardsZero</code>, 
<code>AwayFromZero</code>, <code>NegativeInfinity</code> и 
<code>PositiveInfinity</code>.',
+    'new_date_functions' => 'Добавлены методы 
<code>DateTime::createFromTimestamp()</code>, 
<code>DateTime::getMicrosecond()</code>, 
<code>DateTime::setMicrosecond()</code>, 
<code>DateTimeImmutable::createFromTimestamp()</code>, 
<code>DateTimeImmutable::getMicrosecond()</code> и 
<code>DateTimeImmutable::setMicrosecond()</code>.',
+    'new_mb_functions' => 'Добавлены функции <code>mb_trim()</code>, 
<code>mb_ltrim()</code>, <code>mb_rtrim()</code>, <code>mb_ucfirst()</code> и 
<code>mb_lcfirst()</code>.',
+    'new_pcntl_functions' => 'Добавлены функции <code>pcntl_getcpu()</code>, 
<code>pcntl_getcpuaffinity()</code>, <code>pcntl_getqos_class()</code>, 
<code>pcntl_setns()</code> и <code>pcntl_waitid()</code>.',
+    'new_reflection_functions' => 'Добавлены методы 
<code>ReflectionClassConstant::isDeprecated()</code>, 
<code>ReflectionGenerator::isClosed()</code> и 
<code>ReflectionProperty::isDynamic()</code>.',
+    'new_standard_functions' => 'Добавлены функции 
<code>http_get_last_response_headers()</code>, 
<code>http_clear_last_response_headers()</code>, <code>fpow()</code>.',
+    'new_xml_functions' => 'Добавлены методы 
<code>XMLReader::fromStream()</code>, <code>XMLReader::fromUri()</code>, 
<code>XMLReader::fromString()</code>, <code>XMLWriter::toStream()</code>, 
<code>XMLWriter::toUri()</code> и <code>XMLWriter::toMemory()</code>.',
+    'new_grapheme_function' => 'Добавлена функция 
<code>grapheme_str_split()</code>.',
+
+    'bc_title' => 'Устаревшая функциональность и изменения в обратной 
совместимости',
+    'bc_pecl' => 'Модули IMAP, OCI8, PDO_OCI и pspell перенесены из ядра в 
PECL.',
+    'bc_nullable_parameter_types' => 'Типы параметров, неявно допускающие 
значение <code>null</code> объявлены устаревшими.',
+    'bc_classname' => 'Использование <code>_</code> в качестве имени класса 
объявлено устаревшим.',
+    'bc_zero_raised_to_negative_number' => 'Возведение нуля в степень 
отрицательного числа объявлено устаревшим.',
+    'bc_gmp' => 'Класс <code>GMP</code> теперь является окончательным.',
+    'bc_round' => 'Передача некорректного режима в функцию 
<code>round()</code> выбрасывает ошибку <code>ValueError</code>.',
+    'bc_typed_constants' => 'Константы классов модулей <code>date</code>, 
<code>intl</code>, <code>pdo</code>, <code>reflection</code>, <code>spl</code>, 
<code>sqlite</code> и <code>xmlreader</code> типизированы.',
+    'bc_mysqli_constants' => 'Удалены константы 
<code>MYSQLI_SET_CHARSET_DIR</code>, 
<code>MYSQLI_STMT_ATTR_PREFETCH_ROWS</code>, 
<code>MYSQLI_CURSOR_TYPE_FOR_UPDATE</code>, 
<code>MYSQLI_CURSOR_TYPE_SCROLLABLE</code> и 
<code>MYSQLI_TYPE_INTERVAL</code>.',
+    'bc_mysqli_functions' => 'Функции <code>mysqli_ping()</code>, 
<code>mysqli_kill()</code>, <code>mysqli_refresh()</code>, методы 
<code>mysqli::ping()</code>, <code>mysqli::kill()</code>, 
<code>mysqli::refresh()</code> и константы <code>MYSQLI_REFRESH_*</code> 
объявлены устаревшими.',
+    'bc_standard' => 'Функции <code>stream_bucket_make_writeable()</code> и 
<code>stream_bucket_new()</code> теперь возвращают экземпляр класса 
<code>StreamBucket</code> вместо <code>stdClass</code>.',
+    'bc_core' => '<a 
href="/manual/ru/migration84.incompatible.php#migration84.incompatible.core.exit">Изменение
 поведения языковой конструкции <code>exit()</code></a>.',
+    'bc_warnings' => 'Константа <code>E_STRICT</code> объявлена устаревшей.',
+
+    'footer_title' => 'Выше производительность, лучше синтаксис, надёжнее 
система типов.',
+    'footer_description' => '<p>Для загрузки исходного кода PHP 8.3 посетите 
страницу <a href="/downloads">Downloads</a>. Бинарные файлы Windows находятся 
на сайте <a href="https://windows.php.net/download";>PHP for Windows</a>. Список 
изменений перечислен на странице <a 
href="/ChangeLog-8.php#PHP_8_4">ChangeLog</a>.</p>
+        <p><a href="/manual/ru/migration84.php">Руководство по миграции</a> 
доступно в разделе документации. Ознакомьтесь с ним, чтобы узнать обо всех 
новых возможностях и изменениях, затрагивающих обратную совместимость.</p>',
+];
diff --git a/releases/8.4/nl.php b/releases/8.4/nl.php
new file mode 100644
index 0000000000..1a972eecb8
--- /dev/null
+++ b/releases/8.4/nl.php
@@ -0,0 +1,6 @@
+<?php
+
+$lang = 'nl';
+$documentation = 'en';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/pt_BR.php b/releases/8.4/pt_BR.php
new file mode 100644
index 0000000000..be7e4f4750
--- /dev/null
+++ b/releases/8.4/pt_BR.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'pt_BR';
+
+include_once __DIR__ . '/release.inc';
diff --git a/releases/8.4/release.inc b/releases/8.4/release.inc
new file mode 100644
index 0000000000..4a0bb7308a
--- /dev/null
+++ b/releases/8.4/release.inc
@@ -0,0 +1,533 @@
+<?php
+
+use function releases\php84\common_header;use function 
releases\php84\language_chooser;use function releases\php84\message;
+
+if (!isset($lang)) {
+    $lang = 'en';
+}
+if (!isset($documentation)) {
+    $documentation = $lang;
+}
+
+$_SERVER['BASE_PAGE'] = 'releases/8.4/' . $lang . '.php';
+
+include_once __DIR__ . '/common.php';
+
+common_header(message('common_header', $lang));
+
+?>
+    <section class="php8-section php8-section_dark php8-section_header center">
+        <div class="page-tools">
+            <div class="change-language">
+                <?php language_chooser($lang); ?>
+            </div>
+        </div>
+        <div class="php8-section__content">
+            <div class="php8-logo">
+                <img src="/images/php8/logo_php8_4.svg" alt="PHP 8.4" 
height="126" width="343">
+            </div>
+            <div class="php8-title"><?= message('main_title', $lang) ?></div>
+            <div class="php8-subtitle"><?= message('main_subtitle', $lang) 
?></div>
+            <div class="php8-button-wrapper center">
+                <a class="php8-button php8-button_light" href="/downloads"><?= 
message('upgrade_now', $lang) ?></a>
+            </div>
+        </div>
+    </section>
+
+    <section class="php8-section center">
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="property_hooks">
+                <?= message('property_hooks_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/property-hooks";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $documentation 
?>/migration84.new-features.php#migration84.new-features.core.property-hooks"><?=
 message('documentation', $lang) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Locale
+{
+    private string $languageCode;
+    private string $countryCode;
+
+    public function __construct(string $languageCode, string $countryCode)
+    {
+        $this->setLanguageCode($languageCode);
+        $this->setCountryCode($countryCode);
+    }
+
+    public function getLanguageCode(): string
+    {
+        return $this->languageCode;
+    }
+
+    public function setLanguageCode(string $languageCode): void
+    {
+        $this->languageCode = $languageCode;
+    }
+
+    public function getCountryCode(): string
+    {
+        return $this->countryCode;
+    }
+
+    public function setCountryCode(string $countryCode): void
+    {
+        $this->countryCode = strtoupper($countryCode);
+    }
+
+    public function setCombinedCode(string $combinedCode): void
+    {
+        [$languageCode, $countryCode] = explode('_', $combinedCode, 2);
+
+        $this->setLanguageCode($languageCode);
+        $this->setCountryCode($countryCode);
+    }
+
+    public function getCombinedCode(): string
+    {
+        return \sprintf("%s_%s", $this->languageCode, $this->countryCode);
+    }
+}
+
+$brazilianPortuguese = new Locale('pt', 'br');
+var_dump($brazilianPortuguese->getCountryCode()); // BR
+var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR
+PHP
+
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class Locale
+{
+    public string $languageCode;
+
+    public string $countryCode
+    {
+        set (string $countryCode) {
+            $this->countryCode = strtoupper($countryCode);
+        }
+    }
+
+    public string $combinedCode
+    {
+        get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
+        set (string $value) {
+            [$this->countryCode, $this->languageCode] = explode('_', $value, 
2);
+        }
+    }
+
+    public function __construct(string $languageCode, string $countryCode)
+    {
+        $this->languageCode = $languageCode;
+        $this->countryCode = $countryCode;
+    }
+}
+
+$brazilianPortuguese = new Locale('pt', 'br');
+var_dump($brazilianPortuguese->countryCode); // BR
+var_dump($brazilianPortuguese->combinedCode); // pt_BR
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('property_hooks_description', $lang) ?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="asymmetric_visibility">
+                <?= message('asymmetric_visibility_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/asymmetric-visibility-v2";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $documentation 
?>/language.oop5.visibility.php#language.oop5.visibility-members-aviz"><?= 
message('documentation', $lang) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    public string $version = '8.3';
+}
+
+$phpVersion = new PhpVersion();
+var_dump($phpVersion->version); // string(3) "8.3"
+$phpVersion->version = 'PHP 8.4'; // No error
+PHP
+
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    public private(set) string $version = '8.4';
+}
+
+$phpVersion = new PhpVersion();
+var_dump($phpVersion->version); // string(3) "8.4"
+$phpVersion->version = 'PHP 8.3'; // Visibility error
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('asymmetric_visibility_description', $lang) ?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="deprecated_attribute">
+                <?= message('deprecated_attribute_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/deprecated_attribute";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $documentation 
?>/class.deprecated.php"><?= message('documentation', $lang) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    /**
+     * @deprecated 8.3 use PhpVersion::getVersion() instead
+     */
+    public function getPhpVersion(): string
+    {
+        return $this->getVersion();
+    }
+
+    public function getVersion(): string
+    {
+        return '8.3';
+    }
+}
+
+$phpVersion = new PhpVersion();
+// No indication that the method is deprecated.
+echo $phpVersion->getPhpVersion();
+PHP
+
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    #[\Deprecated(
+        message: "use PhpVersion::getVersion() instead",
+        since: "8.4",
+    )]
+    public function getPhpVersion(): string
+    {
+        return $this->getVersion();
+    }
+
+    public function getVersion(): string
+    {
+        return '8.4';
+    }
+}
+
+$phpVersion = new PhpVersion();
+// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use 
PhpVersion::getVersion() instead
+echo $phpVersion->getPhpVersion();
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('deprecated_attribute_description', $lang) ?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="dom_additions_html5">
+                <?= message('dom_additions_html5_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/dom_additions_84";>RFC</a>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/domdocument_html5_parser";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $documentation 
?>/migration84.new-features.php#migration84.new-features.dom"><?= 
message('documentation', $lang) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$dom = new DOMDocument();
+$dom->loadHTML(
+    <<<'HTML'
+        <main>
+            <article>PHP 8.4 is a feature-rich release!</article>
+            <article class="featured">PHP 8.4 adds new DOM classes that are 
spec-compliant, keeping the old ones for compatibility.</article>
+        </main>
+        HTML,
+    LIBXML_NOERROR,
+);
+
+$xpath = new DOMXPath($dom);
+$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
+$classes = explode(" ", $node->className); // Simplified
+var_dump(in_array("featured", $classes)); // bool(true)
+PHP
+
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$dom = Dom\HTMLDocument::createFromString(
+    <<<HTML
+        <main>
+            <article>PHP 8.4 is a feature-rich release!</article>
+            <article class="featured">PHP 8.4 adds new DOM classes that are 
spec-compliant, keeping the old ones for compatibility.</article>
+        </main>
+        HTML,
+    LIBXML_NOERROR,
+);
+
+$node = $dom->querySelector('main > article:last-child');
+var_dump($node->classList->contains("featured")); // bool(true)
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('dom_additions_html5_description', $lang) ?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="new_array_find">
+                <?= message('new_array_find_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/array_find";>RFC</a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$animal = null;
+foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) {
+    if (str_starts_with($value, 'c')) {
+        $animal = $value;
+        break;
+    }
+}
+
+var_dump($animal); // string(3) "cat"
+PHP
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$animal = array_find(
+    ['dog', 'cat', 'cow', 'duck', 'goose'],
+    static function (string $value): bool {
+        return str_starts_with($value, 'c');
+    },
+);
+
+var_dump($animal); // string(3) "cat"
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('new_array_find_description', $lang) ?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="pdo_driver_specific_parsers">
+                <?= message('pdo_driver_specific_parsers_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/pdo_driver_specific_parsers";>RFC</a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$connection = new PDO(
+    'sqlite:foo.db',
+    $username,
+    $password,
+); // object(PDO)
+
+$connection->sqliteCreateFunction(
+    'prepend_php',
+    static fn ($string) => "PHP {$string}",
+);
+
+$connection->query('SELECT prepend_php(version) FROM php');
+PHP
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+$connection = PDO::connect(
+    'sqlite:foo.db',
+    $username,
+    $password,
+); // object(Pdo\Sqlite)
+
+$connection->createFunction(
+    'prepend_php',
+    static fn ($string) => "PHP {$string}",
+); // Does not exist on a mismatching driver.
+
+$connection->query('SELECT prepend_php(version) FROM php');
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('pdo_driver_specific_parsers_description', $lang) 
?>
+            </div>
+        </div>
+        <div class="php8-compare">
+            <h2 class="php8-h2" id="new_without_parentheses">
+                <?= message('new_without_parentheses_title', $lang) ?>
+                <a class="php8-rfc" 
href="https://wiki.php.net/rfc/new_without_parentheses";>RFC</a>
+                <a class="php8-rfc" href="/manual/<?= $documentation 
?>/migration84.new-features.php#migration84.new-features.core.new-chaining"><?= 
message('documentation', $lang) ?></a>
+            </h2>
+            <div class="php8-compare__main">
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label">PHP &lt; 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    public function getVersion(): string
+    {
+        return 'PHP 8.3';
+    }
+}
+
+var_dump((new PhpVersion())->getVersion());
+PHP
+
+                        ); ?>
+                    </div>
+                </div>
+                <div class="php8-compare__arrow"></div>
+                <div class="php8-compare__block example-contents">
+                    <div class="php8-compare__label 
php8-compare__label_new">PHP 8.4</div>
+                    <div class="php8-code phpcode">
+                        <?php highlight_php_trimmed(
+                            <<<'PHP'
+class PhpVersion
+{
+    public function getVersion(): string
+    {
+        return 'PHP 8.4';
+    }
+}
+
+var_dump(new PhpVersion()->getVersion());
+PHP
+                        ); ?>
+                    </div>
+                </div>
+            </div>
+            <div class="php8-compare__content">
+                <?= message('new_without_parentheses_description', $lang) ?>
+            </div>
+        </div>
+
+    </section>
+
+    <section class="php8-section center php8-section_light php8-columns">
+        <div class="php8-column">
+            <h2 class="php8-h2" id="other_new_things"><?= 
message('new_classes_title', $lang) ?></h2>
+            <div class="php8-compare__content php8-compare__content--block">
+                <ul>
+                    <li><?= message('new_jit_implementation', $lang) ?></li>
+                    <li><?= message('new_core_functions', $lang) ?></li>
+                    <li><?= message('new_bcmath_functions', $lang) ?></li>
+                    <li><?= message('new_round_modes', $lang) ?></li>
+                    <li><?= message('new_date_functions', $lang) ?></li>
+                    <li><?= message('new_mb_functions', $lang) ?></li>
+                    <li><?= message('new_pcntl_functions', $lang) ?></li>
+                    <li><?= message('new_reflection_functions', $lang) ?></li>
+                    <li><?= message('new_standard_functions', $lang) ?></li>
+                    <li><?= message('new_xml_functions', $lang) ?></li>
+                    <li><?= message('new_grapheme_function', $lang) ?></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="php8-column">
+            <h2 class="php8-h2" id="deprecations_and_bc_breaks"><?= 
message('bc_title', $lang) ?></h2>
+            <div class="php8-compare__content">
+                <ul>
+                    <li><?= message('bc_pecl', $lang) ?></li>
+                    <li><?= message('bc_nullable_parameter_types', $lang) 
?></li>
+                    <li><?= message('bc_classname', $lang) ?></li>
+                    <li><?= message('bc_zero_raised_to_negative_number', 
$lang) ?></li>
+                    <li><?= message('bc_round', $lang) ?></li>
+                    <li><?= message('bc_typed_constants', $lang) ?></li>
+                    <li><?= message('bc_gmp', $lang) ?></li>
+                    <li><?= message('bc_mysqli_constants', $lang) ?></li>
+                    <li><?= message('bc_mysqli_functions', $lang) ?></li>
+                    <li><?= message('bc_standard', $lang) ?></li>
+                    <li><?= message('bc_core', $lang) ?></li>
+                    <li><?= message('bc_warnings', $lang) ?></li>
+                </ul>
+            </div>
+        </div>
+    </section>
+
+    <section class="php8-section php8-section_dark php8-section_footer 
php8-footer">
+        <div class="php8-section__content">
+            <h2 class="php8-h2 center"><?= message('footer_title', $lang) 
?></h2>
+            <div class="php8-button-wrapper center">
+                <a class="php8-button php8-button_light" href="/downloads"><?= 
message('upgrade_now', $lang) ?></a>
+            </div>
+            <div class="php8-footer__content"><?= 
message('footer_description', $lang) ?></div>
+        </div>
+    </section>
+
+<?php
+
+site_footer();
diff --git a/releases/8.4/ru.php b/releases/8.4/ru.php
new file mode 100644
index 0000000000..4aefaf9a8c
--- /dev/null
+++ b/releases/8.4/ru.php
@@ -0,0 +1,5 @@
+<?php
+
+$lang = 'ru';
+
+include_once __DIR__ . '/release.inc';
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
index 5c0adf5b91..f70a89940d 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-archive-1998-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
index ac740916ac..ad673ed55e 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-conferences-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
index 694153ed96..43ba1b7978 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
index 17d7478f5a..c693f3c826 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
index ab87a9f7ed..272ff2b007 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-manual-php5-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
index 44d70c923a..9d1cdbc127 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-0-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
index 44b746c174..e981012ffd 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-1-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
index ad586e689f..9d20bcc7ad 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-2-index-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
index c1e6f9c7c8..7816a8f59f 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-6-php-chromium.png
 differ
diff --git 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
index 7fa7427e84..e384ec21c2 100644
Binary files 
a/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
 and 
b/tests/Visual/SmokeTest.spec.ts-snapshots/tests-screenshots-releases-8-3-index-php-chromium.png
 differ

Reply via email to