Просмотр исходного кода

Check GMP during 32-bit installation (#9046)

* Check GMP during 32-bit installation

- add an installer prerequisite for GMP when PHP uses 32-bit integers
- stop installation before favourite export can call GMP functions that are unavailable
- cover 32-bit and 64-bit GMP requirement states

Google Reader-compatible entry identifiers require GMP on 32-bit PHP. The installer did not check that prerequisite, so a missing extension could instead cause a fatal error during favourite export.

* i18n: fr

---------

Co-authored-by: Gerard Alvear <gerard.alvear@logiqd.me>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Gerard Alvear Porras 3 дней назад
Родитель
Сommit
124dec5ef1

+ 5 - 5
README.fr.md

@@ -243,15 +243,15 @@ Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensio
 | 日本語 (ja) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 日本語 (ja) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■■・・ 82% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■■・・ 82% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Nederlands (nl) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Nederlands (nl) | ■■■■■■■■■・ 98% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 74% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 74% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Brasil) (pt-BR) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Русский (ru) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Brasil) (pt-BR) | ■■■■■■■■■・ 98% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 80% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Русский (ru) | ■■■■■■■■■・ 98% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Türkçe (tr) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Türkçe (tr) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Українська (uk) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Українська (uk) | ■■■■■■■■■・ 98% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 简体中文 (zh-CN) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 简体中文 (zh-CN) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 
 

+ 5 - 5
README.md

@@ -139,15 +139,15 @@ See the [repository dedicated to those extensions](https://github.com/FreshRSS/E
 | 日本語 (ja) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 日本語 (ja) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■■・・ 82% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■■・・ 82% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Nederlands (nl) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Nederlands (nl) | ■■■■■■■■■・ 98% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 74% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 74% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Brasil) (pt-BR) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Русский (ru) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Brasil) (pt-BR) | ■■■■■■■■■・ 98% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 80% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Русский (ru) | ■■■■■■■■■・ 98% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Türkçe (tr) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Türkçe (tr) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Українська (uk) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Українська (uk) | ■■■■■■■■■・ 98% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 简体中文 (zh-CN) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 简体中文 (zh-CN) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 
 

+ 4 - 0
app/i18n/cs/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Máte knihovnu fileinfo.',
 			'ok' => 'Máte knihovnu fileinfo.',
 		),
 		),
 		'files' => 'Instalace souborů',
 		'files' => 'Instalace souborů',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/de/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Sie verfügen über die empfohlene PHP-Bibliothek „fileinfo“ (Paket „fileinfo“).',
 			'ok' => 'Sie verfügen über die empfohlene PHP-Bibliothek „fileinfo“ (Paket „fileinfo“).',
 		),
 		),
 		'files' => 'Datei-Installation',
 		'files' => 'Datei-Installation',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Die empfohlene Bibliothek php-intl für die Internationalisierung kann nicht gefunden werden.',
 			'nok' => 'Die empfohlene Bibliothek php-intl für die Internationalisierung kann nicht gefunden werden.',
 			'ok' => 'Sie haben die empfohlene Bibliothek php-intl für die Internationalisierung.',
 			'ok' => 'Sie haben die empfohlene Bibliothek php-intl für die Internationalisierung.',

+ 4 - 0
app/i18n/el/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Βρέθηκε η βιβλιοθήκη fileinfo.',
 			'ok' => 'Βρέθηκε η βιβλιοθήκη fileinfo.',
 		),
 		),
 		'files' => 'Εγκατάσταση αρχείων',
 		'files' => 'Εγκατάσταση αρχείων',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Δεν βρέθηκε η συνιστώμενη βιβλιοθήκη php-intl για τη διεθνοποίηση.',
 			'nok' => 'Δεν βρέθηκε η συνιστώμενη βιβλιοθήκη php-intl για τη διεθνοποίηση.',
 			'ok' => 'Έχετε τη συνιστώμενη βιβλιοθήκη php-intl για τη διεθνοποίηση.',
 			'ok' => 'Έχετε τη συνιστώμενη βιβλιοθήκη php-intl για τη διεθνοποίηση.',

+ 4 - 0
app/i18n/en-US/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',	// IGNORE
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',	// IGNORE
 		),
 		),
 		'files' => 'File installation',	// IGNORE
 		'files' => 'File installation',	// IGNORE
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// IGNORE
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// IGNORE
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalization.',
 			'nok' => 'Cannot find the recommended library php-intl for internationalization.',
 			'ok' => 'You have the recommended library php-intl for internationalization.',
 			'ok' => 'You have the recommended library php-intl for internationalization.',

+ 4 - 0
app/i18n/en/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',
 		),
 		),
 		'files' => 'File installation',
 		'files' => 'File installation',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',
 			'ok' => 'You have the recommended library php-intl for internationalisation.',
 			'ok' => 'You have the recommended library php-intl for internationalisation.',

+ 4 - 0
app/i18n/es/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Dispones de la librería fileinfo.',
 			'ok' => 'Dispones de la librería fileinfo.',
 		),
 		),
 		'files' => 'Instalación de Archivos',
 		'files' => 'Instalación de Archivos',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'No se ha podido localizar la librería recomendada php-intl para internacionalización.',
 			'nok' => 'No se ha podido localizar la librería recomendada php-intl para internacionalización.',
 			'ok' => 'Dispones de la librería recomendada php-intl para internacionalización.',
 			'ok' => 'Dispones de la librería recomendada php-intl para internacionalización.',

+ 4 - 0
app/i18n/fa/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'شما کتابخانه fileinfo را دارید.',
 			'ok' => 'شما کتابخانه fileinfo را دارید.',
 		),
 		),
 		'files' => ' نصب فایل',
 		'files' => ' نصب فایل',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'کتابخانه پیشنهادی php-intl برای بین‌المللی‌سازی پیدا نشد.',
 			'nok' => 'کتابخانه پیشنهادی php-intl برای بین‌المللی‌سازی پیدا نشد.',
 			'ok' => 'کتابخانه پیشنهادی php-intl برای بین‌المللی‌سازی روی سیستم شما نصب است.',
 			'ok' => 'کتابخانه پیشنهادی php-intl برای بین‌المللی‌سازی روی سیستم شما نصب است.',

+ 4 - 0
app/i18n/fi/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Fileinfo-kirjasto löytyy.',
 			'ok' => 'Fileinfo-kirjasto löytyy.',
 		),
 		),
 		'files' => 'Tiedostojen asennus',
 		'files' => 'Tiedostojen asennus',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/fr/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Vous disposez de la librairie recommandéee php-fileinfo.',
 			'ok' => 'Vous disposez de la librairie recommandéee php-fileinfo.',
 		),
 		),
 		'files' => 'Installation des fichiers',
 		'files' => 'Installation des fichiers',
+		'gmp' => array(
+			'nok' => 'Vous ne disposez pas de l’extension GMP requise pour PHP 32 bits (paquet php-gmp).',
+			'ok' => 'Vous disposez de l’extension GMP requise pour PHP 32 bits.',
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => ' Impossible de trouver la librairie recommandée php-intl pour l’internationalisation.',
 			'nok' => ' Impossible de trouver la librairie recommandée php-intl pour l’internationalisation.',
 			'ok' => 'Vous disposez de la librairie recommandée php-intl pour l’internationalisation.',
 			'ok' => 'Vous disposez de la librairie recommandée php-intl pour l’internationalisation.',

+ 4 - 0
app/i18n/he/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',	// TODO
 			'ok' => 'You have the recommended PHP fileinfo library (fileinfo package).',	// TODO
 		),
 		),
 		'files' => 'File installation',	// TODO
 		'files' => 'File installation',	// TODO
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/hu/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'A fileinfo könyvtár telepítve van.',
 			'ok' => 'A fileinfo könyvtár telepítve van.',
 		),
 		),
 		'files' => 'Fájl telepítés',
 		'files' => 'Fájl telepítés',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Nem található a nemzetköziesítéshez javasolt php-intl könyvtár.',
 			'nok' => 'Nem található a nemzetköziesítéshez javasolt php-intl könyvtár.',
 			'ok' => 'Rendelkezik a nemzetköziesítéshez javasolt php-intl könyvtárral.',
 			'ok' => 'Rendelkezik a nemzetköziesítéshez javasolt php-intl könyvtárral.',

+ 4 - 0
app/i18n/id/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Anda memiliki pustaka fileinfo.',
 			'ok' => 'Anda memiliki pustaka fileinfo.',
 		),
 		),
 		'files' => 'Pemasangan Berkas',
 		'files' => 'Pemasangan Berkas',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/it/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Estensione fileinfo presente.',
 			'ok' => 'Estensione fileinfo presente.',
 		),
 		),
 		'files' => 'Installazione files',
 		'files' => 'Installazione files',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Impossibile trovare la libreria di internazionalizzazione php-intl.',
 			'nok' => 'Impossibile trovare la libreria di internazionalizzazione php-intl.',
 			'ok' => 'Disponi della libreria di internazionalizzazione php-intl raccomandata.',
 			'ok' => 'Disponi della libreria di internazionalizzazione php-intl raccomandata.',

+ 4 - 0
app/i18n/ja/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'fileinfoライブラリは正しく設定されています。',
 			'ok' => 'fileinfoライブラリは正しく設定されています。',
 		),
 		),
 		'files' => 'ファイルインストール',
 		'files' => 'ファイルインストール',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => '多言語・地域対応用のphp-intlライブラリが見つかりませんでした。',
 			'nok' => '多言語・地域対応用のphp-intlライブラリが見つかりませんでした。',
 			'ok' => '多言語・地域対応用のphp-intlライブラリはインストールされています。',
 			'ok' => '多言語・地域対応用のphp-intlライブラリはインストールされています。',

+ 4 - 0
app/i18n/ko/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'fileinfo 라이브러리가 설치되어 있습니다.',
 			'ok' => 'fileinfo 라이브러리가 설치되어 있습니다.',
 		),
 		),
 		'files' => '파일 시스템 설치 요구사항',
 		'files' => '파일 시스템 설치 요구사항',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/lv/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Jums ir fileinfo bibliotēka.',
 			'ok' => 'Jums ir fileinfo bibliotēka.',
 		),
 		),
 		'files' => 'Failu instalācija',
 		'files' => 'Failu instalācija',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/nl/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'U hebt de fileinfo uitbreiding.',
 			'ok' => 'U hebt de fileinfo uitbreiding.',
 		),
 		),
 		'files' => 'Bestanden installatie',
 		'files' => 'Bestanden installatie',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'De aanbevolen bibliotheek php-intl voor internationalisering kan niet worden gevonden.',
 			'nok' => 'De aanbevolen bibliotheek php-intl voor internationalisering kan niet worden gevonden.',
 			'ok' => 'U beschikt over de aanbevolen bibliotheek php-intl voor internationalisering.',
 			'ok' => 'U beschikt over de aanbevolen bibliotheek php-intl voor internationalisering.',

+ 4 - 0
app/i18n/oc/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Avètz la bibliotèca fileinfo.',
 			'ok' => 'Avètz la bibliotèca fileinfo.',
 		),
 		),
 		'files' => 'Installacion dels fichièrs',
 		'files' => 'Installacion dels fichièrs',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/pl/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Znaleziono bibliotekę fileinfo.',
 			'ok' => 'Znaleziono bibliotekę fileinfo.',
 		),
 		),
 		'files' => 'Instalacja plików',
 		'files' => 'Instalacja plików',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Nie znaleziono zalecanej biblioteki php-intl do internacjonalizacji.',
 			'nok' => 'Nie znaleziono zalecanej biblioteki php-intl do internacjonalizacji.',
 			'ok' => 'Znaleziono zalecaną bibliotekę php-intl do internacjonalizacji.',
 			'ok' => 'Znaleziono zalecaną bibliotekę php-intl do internacjonalizacji.',

+ 4 - 0
app/i18n/pt-BR/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Você tem a biblioteca fileinfo.',
 			'ok' => 'Você tem a biblioteca fileinfo.',
 		),
 		),
 		'files' => 'Instalação de arquivos',
 		'files' => 'Instalação de arquivos',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Não foi possível encontrar a biblioteca recomendada php-intl para internacionalização.',
 			'nok' => 'Não foi possível encontrar a biblioteca recomendada php-intl para internacionalização.',
 			'ok' => 'Você tem a biblioteca recomendada php-intl para internacionalização.',
 			'ok' => 'Você tem a biblioteca recomendada php-intl para internacionalização.',

+ 4 - 0
app/i18n/pt-PT/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Tem a biblioteca fileinfo.',
 			'ok' => 'Tem a biblioteca fileinfo.',
 		),
 		),
 		'files' => 'Instalação de arquivos',
 		'files' => 'Instalação de arquivos',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/ru/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'У вас установлено расширение fileinfo.',
 			'ok' => 'У вас установлено расширение fileinfo.',
 		),
 		),
 		'files' => 'Установка файлов',
 		'files' => 'Установка файлов',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Не найдена библиотека php-intl, рекомендуемая для поддержки разных языков.',
 			'nok' => 'Не найдена библиотека php-intl, рекомендуемая для поддержки разных языков.',
 			'ok' => 'Рекомендуемая библиотека php-intl для поддержки разных языков установлена.',
 			'ok' => 'Рекомендуемая библиотека php-intl для поддержки разных языков установлена.',

+ 4 - 0
app/i18n/sk/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Našla sa knižnica fileinfo.',
 			'ok' => 'Našla sa knižnica fileinfo.',
 		),
 		),
 		'files' => 'Inštalácia súborov',
 		'files' => 'Inštalácia súborov',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'nok' => 'Cannot find the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO
 			'ok' => 'You have the recommended library php-intl for internationalisation.',	// TODO

+ 4 - 0
app/i18n/tr/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'Fileinfo kütüphaneniz var.',
 			'ok' => 'Fileinfo kütüphaneniz var.',
 		),
 		),
 		'files' => 'Dosya kurulumu',
 		'files' => 'Dosya kurulumu',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Uluslararasılaştırma için önerilen php-intl kütüphanesi bulunamadı.',
 			'nok' => 'Uluslararasılaştırma için önerilen php-intl kütüphanesi bulunamadı.',
 			'ok' => 'Uluslararasılaştırma için önerilen php-intl kütüphanesine sahipsiniz.',
 			'ok' => 'Uluslararasılaştırma için önerilen php-intl kütüphanesine sahipsiniz.',

+ 4 - 0
app/i18n/uk/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => 'У вас є бібліотека fileinfo.',
 			'ok' => 'У вас є бібліотека fileinfo.',
 		),
 		),
 		'files' => 'Встановлення файлів',
 		'files' => 'Встановлення файлів',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => 'Не вдалося знайти бажану бібліотеку php-intl для інтернаціоналізації.',
 			'nok' => 'Не вдалося знайти бажану бібліотеку php-intl для інтернаціоналізації.',
 			'ok' => 'У вас є бажана бібліотека php-intl для інтернаціоналізації.',
 			'ok' => 'У вас є бажана бібліотека php-intl для інтернаціоналізації.',

+ 4 - 0
app/i18n/zh-CN/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => '已找到 fileinfo 库',
 			'ok' => '已找到 fileinfo 库',
 		),
 		),
 		'files' => '文件相关',
 		'files' => '文件相关',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => '无法找到推荐用于国际化支持的 php-intl 扩展。',
 			'nok' => '无法找到推荐用于国际化支持的 php-intl 扩展。',
 			'ok' => '已找到推荐用于国际化支持的 php-intl 扩展。',
 			'ok' => '已找到推荐用于国际化支持的 php-intl 扩展。',

+ 4 - 0
app/i18n/zh-TW/install.php

@@ -80,6 +80,10 @@ return array(
 			'ok' => '您擁有推薦的 PHP fileinfo 函式庫 (fileinfo 套件)。',
 			'ok' => '您擁有推薦的 PHP fileinfo 函式庫 (fileinfo 套件)。',
 		),
 		),
 		'files' => '檔案安裝',
 		'files' => '檔案安裝',
+		'gmp' => array(
+			'nok' => 'Cannot find the required GMP extension for 32-bit PHP (php-gmp package).',	// TODO
+			'ok' => 'You have the GMP extension required for 32-bit PHP.',	// TODO
+		),
 		'intl' => array(
 		'intl' => array(
 			'nok' => '無法找到推薦用於國際化的 php-intl 函式庫。',
 			'nok' => '無法找到推薦用於國際化的 php-intl 函式庫。',
 			'ok' => '您擁有推薦用於國際化的 php-intl 函式庫。',
 			'ok' => '您擁有推薦用於國際化的 php-intl 函式庫。',

+ 3 - 0
app/install.php

@@ -493,6 +493,9 @@ function printStep1(): void {
 	printStep1Template('intl', $res['intl']);
 	printStep1Template('intl', $res['intl']);
 	printStep1Template('fileinfo', $res['fileinfo']);
 	printStep1Template('fileinfo', $res['fileinfo']);
 	printStep1Template('zip', $res['zip']);
 	printStep1Template('zip', $res['zip']);
+	if (isset($res['gmp'])) {
+		printStep1Template('gmp', $res['gmp']);
+	}
 	?>
 	?>
 	<h2><?= _t('install.check.files') ?></h2>
 	<h2><?= _t('install.check.files') ?></h2>
 	<?php
 	<?php

+ 16 - 1
lib/lib_install.php

@@ -4,6 +4,19 @@ declare(strict_types=1);
 FreshRSS_SystemConfiguration::register('default_system', join_path(FRESHRSS_PATH, 'config.default.php'));
 FreshRSS_SystemConfiguration::register('default_system', join_path(FRESHRSS_PATH, 'config.default.php'));
 FreshRSS_UserConfiguration::register('default_user', join_path(FRESHRSS_PATH, 'config-user.default.php'));
 FreshRSS_UserConfiguration::register('default_user', join_path(FRESHRSS_PATH, 'config-user.default.php'));
 
 
+/**
+ * GMP is needed to convert entry identifiers to the Google Reader format on 32-bit PHP.
+ *
+ * @return 'ok'|'ko'|null
+ */
+function gmpRequirementStatus(int $integerSize = PHP_INT_SIZE, ?bool $gmpLoaded = null): ?string {
+	if ($integerSize >= 8) {
+		return null;
+	}
+
+	return ($gmpLoaded ?? extension_loaded('gmp')) ? 'ok' : 'ko';
+}
+
 /**
 /**
  * @param 'mysql'|'pgsql'|'sqlite'|'' $dbType
  * @param 'mysql'|'pgsql'|'sqlite'|'' $dbType
  * @return array<string,'ok'|'ko'|'warn'>
  * @return array<string,'ok'|'ko'|'warn'>
@@ -43,6 +56,7 @@ function checkRequirements(string $dbType = '', bool $checkPhp = true, bool $che
 	$intl = extension_loaded('intl');
 	$intl = extension_loaded('intl');
 	$mbstring = extension_loaded('mbstring');
 	$mbstring = extension_loaded('mbstring');
 	$zip = extension_loaded('zip');
 	$zip = extension_loaded('zip');
+	$gmp = gmpRequirementStatus();
 	$data = is_dir(DATA_PATH) && touch(DATA_PATH . '/index.html');	// is_writable() is not reliable for a folder on NFS
 	$data = is_dir(DATA_PATH) && touch(DATA_PATH . '/index.html');	// is_writable() is not reliable for a folder on NFS
 	$cache = is_dir(CACHE_PATH) && touch(CACHE_PATH . '/index.html');
 	$cache = is_dir(CACHE_PATH) && touch(CACHE_PATH . '/index.html');
 	$tmp = is_dir(TMP_PATH) && is_writable(TMP_PATH);
 	$tmp = is_dir(TMP_PATH) && is_writable(TMP_PATH);
@@ -73,6 +87,7 @@ function checkRequirements(string $dbType = '', bool $checkPhp = true, bool $che
 			'intl' => $intl ? 'ok' : 'warn',
 			'intl' => $intl ? 'ok' : 'warn',
 			'zip' => $zip ? 'ok' : 'warn',
 			'zip' => $zip ? 'ok' : 'warn',
 			'fileinfo' => $fileinfo ? 'ok' : 'warn',
 			'fileinfo' => $fileinfo ? 'ok' : 'warn',
+			'gmp' => $gmp,
 		];
 		];
 	}
 	}
 
 
@@ -89,7 +104,7 @@ function checkRequirements(string $dbType = '', bool $checkPhp = true, bool $che
 	}
 	}
 
 
 	if ($checkPhp && $checkFiles) {
 	if ($checkPhp && $checkFiles) {
-		$result['all'] = $php && $curl && $json && $pdo && $pcre && $ctype && $dom && $xml &&
+		$result['all'] = $php && $curl && $json && $pdo && $pcre && $ctype && $dom && $xml && $gmp !== 'ko' &&
 			$data && $cache && $tmp && $users && $favicons && $tokens ? 'ok' : 'ko';
 			$data && $cache && $tmp && $users && $favicons && $tokens ? 'ok' : 'ko';
 	}
 	}
 
 

+ 24 - 0
tests/lib/InstallTest.php

@@ -0,0 +1,24 @@
+<?php
+declare(strict_types=1);
+
+require_once LIB_PATH . '/lib_install.php';
+
+use PHPUnit\Framework\Attributes\DataProvider;
+
+final class InstallTest extends \PHPUnit\Framework\TestCase {
+	/**
+	 * @return list<array{int,bool,'ok'|'ko'|null}>
+	 */
+	public static function provideGmpRequirementStatus(): array {
+		return [
+			[8, false, null],
+			[4, true, 'ok'],
+			[4, false, 'ko'],
+		];
+	}
+
+	#[DataProvider('provideGmpRequirementStatus')]
+	public function testGmpRequirementStatus(int $integerSize, bool $gmpLoaded, ?string $expected): void {
+		self::assertSame($expected, gmpRequirementStatus($integerSize, $gmpLoaded));
+	}
+}