NextTranslationLink.php
4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
namespace WPML\TM\ATE\Review;
use WPML\Element\API\Post;
use WPML\Element\API\PostTranslations;
use WPML\FP\Fns;
use WPML\FP\Logic;
use WPML\FP\Maybe;
use WPML\FP\Obj;
use WPML\FP\Relation;
use WPML\TM\API\Translators;
use WPML_Translations_Queue;
use function WPML\FP\invoke;
use function WPML\FP\partial;
use function WPML\FP\pipe;
class NextTranslationLink {
public static function get( $currentJob, $filterTargetLanguages ) {
global $sitepress;
$doNotFilterPreviewLang = Fns::always( false );
$addPreviewLangFilter = function () use ( $doNotFilterPreviewLang ) {
add_filter( 'wpml_should_filter_preview_lang', $doNotFilterPreviewLang );
};
$removePreviewLangFilter = function () use ( $doNotFilterPreviewLang ) {
remove_filter( 'wpml_should_filter_preview_lang', $doNotFilterPreviewLang );
};
$getTranslationPostId = Fns::memorize( self::getTranslationPostId() );
$switchToPostLang = function ( $job ) use ( $sitepress, $getTranslationPostId ) {
Maybe::of( $job )
->chain( $getTranslationPostId )
->map( Post::getLang() )
->map( [ $sitepress, 'switch_lang' ] );
};
$restoreLang = function () use ( $sitepress ) {
$sitepress->switch_lang( null );
};
$getLink = Fns::converge( Fns::liftA2( PreviewLink::getWithLanguagesParam( $filterTargetLanguages ) ), [
$getTranslationPostId,
Maybe::safe( invoke( 'get_translate_job_id' ) )
] );
return Maybe::of( $currentJob )
->map( self::getNextJob( $filterTargetLanguages ) )
->map( Fns::tap( $switchToPostLang ) )
->map( Fns::tap( $addPreviewLangFilter ) )
->chain( $getLink )
->map( Fns::tap( $removePreviewLangFilter ) )
->map( Fns::tap( $restoreLang ) )
->getOrElse( null );
}
private static function getTranslationPostId() {
return function ( $nextJob ) {
return Maybe::of( $nextJob )
->map( pipe( invoke( 'get_original_element_id' ), PostTranslations::get() ) )
->map( Obj::prop( $nextJob->get_target_language() ) )
->map( Obj::prop( 'element_id' ) );
};
}
/**
* @return \Closure :: \stdClass -> \WPML_TM_Post_Job_Entity
*/
private static function getNextJob( $filterTargetLanguages ) {
return function ( $currentJob ) use ( $filterTargetLanguages ) {
$getJob = function ( $sourceLanguage, $targetLanguages ) use ( $currentJob ) {
$excludeCurrentJob = pipe( invoke( 'get_translate_job_id' ), Relation::equals( (int) $currentJob->job_id ), Logic::not() );
$samePostTypes = function ( $nextJob ) use ( $currentJob ) {
$currentJobPostType = \get_post_type( $currentJob->original_doc_id );
$nextJobPostType = \get_post_type( $nextJob->get_original_element_id() );
return $currentJobPostType === $nextJobPostType;
};
$nextJob = \wpml_collect(wpml_tm_get_jobs_repository()
->get( self::buildSearchParams( $sourceLanguage, $targetLanguages ) ) )
->filter( $samePostTypes )
->first( $excludeCurrentJob );
if ( ! $nextJob ) {
$nextJob = \wpml_collect( wpml_tm_get_jobs_repository()
->get( self::buildSearchParams( $sourceLanguage, $targetLanguages ) ) )
->first( $excludeCurrentJob );
}
return $nextJob;
};
$languagePairs = \wpml_collect( Obj::propOr( [], 'language_pairs', Translators::getCurrent() ) );
$filterTargetLanguages = function ( $targetLanguages, $sourceLanguage ) use ( $filterTargetLanguages ) {
return [
'source' => $sourceLanguage,
'targets' => is_array( $filterTargetLanguages ) ? $filterTargetLanguages : $targetLanguages,
];
};
$filterJobByPairOfLanguages = function ( $job, $pairOfLanguages ) use ( $getJob ) {
return $job ?: $getJob( Obj::prop( 'source', $pairOfLanguages ), Obj::prop( 'targets', $pairOfLanguages ) );
};
return $languagePairs
->map($filterTargetLanguages)
->reduce($filterJobByPairOfLanguages);
};
}
/**
* @param string $sourceLang
* @param string[] $targetLanguages
*
* @return \WPML_TM_Jobs_Search_Params
*/
private static function buildSearchParams( $sourceLang, array $targetLanguages ) {
return ( new \WPML_TM_Jobs_Search_Params() )
->set_needs_review()
->set_source_language( $sourceLang )
->set_target_language( $targetLanguages );
}
}