Me levanto por la mañana, me preparo un buen café e instalo un módulo BOOM! No me lo puedo creer, ya empezamos con un error que no se a cuento ni de que viene...
TypeError: fgets(): Argument #1 ($stream) must be of type resource, bool given in fgets() (line 248 of /var/www/htm
l/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php).
Dirás, pues tampoco parece tanto, pero claro, la consola te lo saca de esta manera, y seguramente a más de uno le ha dado un microinfarto al verlo...
No es la primera vez que me salta este error al habilitar un modulo de Drupal, pero, ¿Cuál es el motivo? y ¿Cómo podemos solucionarlo?. La verdad es que los motivos pueden ser varios, pero siempre va a ir orientado a o bien acceso a carpetas, permisos de archivos, ubicaciones establecidas de las carpetas tanto temporales como de translations. En esta ocasión el error era el siguiente (no lo he incluido todo)..
srvazquez@Desktop:~/Projects/vazcell$ ddev drush en field_permissions
> [notice] Checked es translation for field_permissions.
> [error] The specified file 'temporary://file74h1sh' could not be copied because the destination directory 'translations://' is not properly configured. This may be caused by a problem with file or directory permissions.
> [error] Unable to download translation file https://ftp.drupal.org/files/translations/all/field_permissions/field_permissions-8.x-1.1.es.po.
> [warning] fopen(translations://field_permissions-8.x-1.1.es.po): Failed to open stream: "Drupal\locale\StreamWrapper\TranslationsStream::stream_open" call failed PoStreamReader.php:154
> [error] TypeError: fgets(): Argument #1 ($stream) must be of type resource, bool given in fgets() (line 248 of /var/www/html/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php) #0 /var/www/html/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php(248): fgets(false)
> #1 /var/www/html/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php(186): Drupal\Component\Gettext\PoStreamReader->readLine()
> #2 /var/www/html/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php(217): Drupal\Component\Gettext\PoStreamReader->readItem()
> #3 /var/www/html/web/core/lib/Drupal/Component/Gettext/PoStreamReader.php(155): Drupal\Component\Gettext\PoStreamReader->readHeader()
> #4 /var/www/html/web/core/modules/locale/src/Gettext.php(56): Drupal\Component\Gettext\PoStreamReader->open()
> #5 /var/www/html/web/core/modules/locale/locale.bulk.inc(213): Drupal\locale\Gettext::fileToDatabase(Object(stdClass), Array)
> #6 /var/www/html/web/core/modules/locale/locale.batch.inc(191): locale_translate_batch_import(Object(stdClass), Array, Object(DrushBatchContext))
> #7 /var/www/html/vendor/drush/drush/includes/batch.inc(261): locale_translation_batch_fetch_import('field_permissio...', 'es', Array, Object(DrushBatchContext))
> #8 /var/www/html/vendor/drush/drush/includes/batch.inc(206): _drush_batch_worker()
> #9 /var/www/html/vendor/drush/drush/includes/batch.inc(100): _drush_batch_command('48')
> #10 /var/www/html/vendor/drush/drush/src/Drupal/Commands/core/BatchCommands.php(22): drush_batch_command('48')
> #11 [internal function]: Drush\Drupal\Commands\core\BatchCommands->process('48', Array)
> #12 /var/www/html/vendor/consolidation/annotated-command/src/CommandProcessor.php(257): call_user_func_array(Array, Array)
En mi caso, este error está relacionado con el sistema de traducciones en el cual se puede ver si seguimos leyendo el error hasta llegar al siguiente punto..
> [error] The specified file 'temporary://file74h1sh' could not be copied because the destination directory 'translations://' is not properly configured. This may be caused by a problem with file or directory permissions.
Pues bien el error es muy sencillo de solucionar. Nos tenemos que fijar en varias cosas:
- Carpeta translations: No es la primera vez que por un error la carpeta translations no está disponible y Drupal no tiene los privilegios como para poder crearla, a veces simplemente creándola en nuestro sistema y confirmando que todo funciona correctamente es suficiente para resolver el problema.
- Permisos: A veces algo tan sencillo como tener los permisos en orden puede llevarnos más de un disgusto. Accedemos a la ruta en nuestro servidor /web/sites/default/files/translations y confirmamos que tanto el dueño/grupo como el acceso a la carpeta está permitido y correcto.
- Configuración del Sistema de archivos: En mi caso algo tan sencillo como acceder al sistema de archivos y guardar la configuración resolvía dicho fallo ya que creaba los archivos faltantes para que todo fuera como es debido. Para confirmarlo accederemos a la siguiente ruta desde el panel de administración. SITE_URL/admin/config/media/file-system .
Si al entrar al file system observamos que la carpeta no es la correcta deberemos cambiarla a una que sea accesible desde nuestro entorno Drupal.
Una vez realizado todos estos pasos deberiamos tener nuestro Drupal funcionando correctamente. Para confirmarlo podremos "desinstalar" el módulo y volver a instalarlos observando que, ahora sí, las traducciones se han descargado correctamente y todo ha ido fluído.