filesystem = $filesystem; $this->status = $status; $this->singleProcess = $singleProcess; } public function add_hooks() { add_action( 'admin_init', [ $this, 'checkDirectories' ] ); } public function checkDirectories() { if ( $this->isDirectoryMissing( WP_LANG_DIR ) ) { $this->resetRegenerateStatus(); $this->displayMissingFolderNotice( WP_LANG_DIR ); return; } if ( $this->isDirectoryMissing( self::getSubdir() ) ) { $this->resetRegenerateStatus(); if ( ! $this->maybeCreateSubdir() ) { $this->displayMissingFolderNotice( self::getSubdir() ); return; } } if ( ! $this->status->isComplete() ) { $this->displayRegenerateInProgressNotice(); $this->singleProcess->runPage(); } if ( $this->status->isComplete() ) { wpml_get_admin_notices()->remove_notice( RegenerationInProgressNotice::GROUP, RegenerationInProgressNotice::ID ); } } /** * @param string $dir */ public function displayMissingFolderNotice( $dir ) { $notices = wpml_get_admin_notices(); $notice = $notices->get_new_notice( self::NOTICE_ID_MISSING_FOLDER, self::missingFolderNoticeContent( $dir ), self::NOTICE_GROUP ); $notice->set_css_classes( 'error' ); $notices->add_notice( $notice ); } /** * @param string $dir * * @return string */ public static function missingFolderNoticeContent( $dir ) { $text = '

' . esc_html__( 'WPML String Translation is attempting to write .mo files with translations to folder:', 'wpml-string-translation' ) . '
' . str_replace( '\\', '/', $dir ) . '

'; $text .= '

' . esc_html__( 'This folder appears to be not writable. This is blocking translation for strings from appearing on the site.', 'wpml-string-translation' ) . '

'; $text .= '

' . esc_html__( 'To resolve this, please contact your hosting company and request that they make that folder writable.', 'wpml-string-translation' ) . '

'; $url = 'https://wpml.org/faq/cannot-write-mo-files/?utm_source=wpml-plugin&utm_medium=warning-message&utm_campaign=mo-files&utm_term=cannot-write-mo-files&utm_content=doc-link'; $link = '' . esc_html__( "WPML's documentation on troubleshooting .mo files generation.", 'wpml-string-translation' ) . ''; $text .= '

' . sprintf( esc_html__( 'For more details, see %s.', 'wpml-string-translation' ), $link ) . '

'; return $text; } private function displayRegenerateInProgressNotice() { $notices = wpml_get_admin_notices(); $notices->remove_notice( self::NOTICE_GROUP, self::NOTICE_ID_MISSING_FOLDER ); $notices->add_notice( new RegenerationInProgressNotice() ); } /** * @return string */ public static function getSubdir() { return WP_LANG_DIR . '/' . \WPML\ST\TranslationFile\Manager::SUB_DIRECTORY; } /** * @param string $dir * * @return bool */ private function isDirectoryMissing( $dir ) { return ! $this->filesystem->is_writable( $dir ); } private function resetRegenerateStatus() { $this->status->markIncomplete(); } }