programing

로드 시 WordPress 플러그인 변환 파일 재정의

bestprogram 2023. 3. 28. 22:43

로드 시 WordPress 플러그인 변환 파일 재정의

이벤트 캘린더 플러그인과 함께 WordPress를 프랑스어로 사용하고 있습니다.

이 플러그인은 번들된 프랑스어 번역과 함께 제공되지만 오류가 있습니다.수정하고 싶지만 다음 업데이트로 대체될 예정이기 때문에 원본 파일을 교체하는 것은 좋지 않습니다.수정안을 제출하기 위해 개발자에게 연락했지만 시간이 걸릴 수 있습니다.

그동안 템플릿 디렉토리에서 복사한 것을 로드하고 싶습니다.저는 이미 다음과 같은 여러 가지 시도를 했습니다.

load_plugin_textdomain( 'tribe-events-calendar', get_template_directory() . '/languages' );

또는 를 사용하여

add_filter('override_load_textdomain', …)

할 수 있어요.php는 동작하지 않는 것 같습니다.제가 할 수 있었던 것은 번역 파일의 로드를 무효로 하는 것 뿐이었습니다.

로드 시 플러그인 번역 파일을 교체할 수 있는 방법이 있습니까?저도 WPML을 사용하고 있습니다만, "Translate with WPML"이 아닌 "Translate with .mo files" 모드로 되어 있기 때문에 플러그인 번역을 즉시 변경할 수 없습니다.WPML은 이벤트 캘린더의 내 번역본을 로드할 수 있지 않을까?

이 몇 줄을 함수에 추가할 수 있습니다.php 테마 파일

$text_domain = 'the-events-calendar';
$original_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'the-events-calendar' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.mo';
$override_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . 'your-own-theme' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.override.mo'; 

// Unload the translation for the text domain of the plugin
unload_textdomain($text_domain);
// Load first the override file
load_textdomain($text_domain, $override_language_file );
// Then load the original translation file
load_textdomain($text_domain, $original_language_file );

두 개의 파일 변수를 실제 언어 파일로 교체해야 합니다.

그러나 프랑스어 파일은 플러그인 언어 폴더에 있고 덮어쓰기 언어 파일은 언어 테마 폴더에 있다고 가정합니다.

목적은 다음과 같습니다.

  • WP에 의해 자동으로 로드된 언어 로드 해제
  • 우선 덮어쓰기 파일을 로드합니다.이 텍스트 도메인의 다른 언어 파일을 로드할 때 이미 정의된 번역은 건너뛸 수 있으므로 먼저 로드하는 것이 중요합니다(WP 코어 참조).
  • 원래 변환 파일을 로드합니다.그러면 실제로는 오버라이드 파일의 번역되지 않은 문자열이 모두 로드됩니다.

이것은 컴파일된 mo 파일에서만 동작합니다.

재정의 파일에 재정의할 문자열 몇 개만 추가할 수 있습니다.

전 트랜스포시 플러그인의 저자에요

실제로는, 다음의 4개의 필터에 회답이 있습니다.

   add_filter('gettext', ......, 3);
   add_filter('gettext_with_context', ......, 3);
   add_filter('ngettext', ......, 4);
   add_filter('ngettext_with_context', ....., 4);

(당연히 ..... 대신 기능과 priority를 추가해야 합니다.)

이러한 함수는 문자열과 도메인을 가져옵니다.이러한 함수를 사용하여 다음과 같은 기능을 수행할 수 있습니다.

function gettext_filter($translation, $orig, $domain) {
    if ($domain == 'plugin_domain') {
        if ($orig == 'some text') {
            return "some translation";
        }
    }
    return $translation;
}

이 솔루션은 워드프레스의 자동 로더를 사용하여 플러그인을 재정의하며 추가 프로그래밍 로직이 필요하지 않습니다. 대신 CMS가 재정의하도록 합니다.

해 보겠습니다.my-plugin은 2개의 「」에wp-content/languages/plugins/라고 하는my-plugin-fr_FR.po ★★★★★★★★★★★★★★★★★」my-plugin-fr_FR.mo (일). ('로케일.fr_FR프랑스어 번역의 예에 불과합니다.을 이용하다

플러그인이 이 구조를 가지고 있는 경우는, 다음의 순서에 의해서 변환이 덧쓰기됩니다.그렇지 않은 경우는, 다른 방법으로 참조할 수 있습니다.

  1. 및 을 .po .mo 합니다.wp-content/languages/my-plugin디렉토리가 존재하지 않는 경우는, 작성합니다.
  2. 원하는 대로 번역 파일을 편집하여 저장합니다.

언급URL : https://stackoverflow.com/questions/18826977/override-a-wordpress-plugin-translation-file-on-load