22namespace Grav \Plugin ;
33
44use Composer \Autoload \ClassLoader ;
5+ use Grav \Common \Language \Language ;
56use Grav \Common \Language \LanguageCodes ;
67use Grav \Common \Page \Page ;
8+ use Grav \Common \Page \Pages ;
79use \Grav \Common \Plugin ;
810
911class LangSwitcherPlugin extends Plugin
@@ -72,36 +74,21 @@ public function onTwigTemplatePaths()
7274 */
7375 protected function getTranslatedUrl ($ lang , $ path )
7476 {
75- $ translated_url_parts = array ();
77+ /** @var Language $language */
78+ $ url = null ;
79+ /** @var Pages $pages */
7680 $ pages = $ this ->grav ['pages ' ];
81+ /** @var Language $language */
82+ $ language = $ this ->grav ['language ' ];
83+
84+ $ language ->init ();
85+ $ language ->setActive ($ lang );
86+ $ pages ->reset ();
7787 $ page = $ pages ->get ($ path );
78- $ current_node = $ page ;
79- $ max_recursions = 10 ;
80- while ($ max_recursions > 0 && $ current_node !== null && $ current_node ->slug () != 'pages ' && $ path != 'pages ' ) {
81- $ translated_md_filepath = "{$ path }/ {$ current_node ->template ()}. {$ lang }.md " ;
82- if (file_exists ($ translated_md_filepath )) {
83- $ translated_page = new Page ();
84- $ translated_page ->init (new \SplFileInfo ($ translated_md_filepath ));
85- $ translated_slug = $ translated_page ->slug ();
86- if (!empty ($ translated_slug )) {
87- array_unshift ($ translated_url_parts , $ translated_slug );
88- } else {
89- $ untranslated_slug = $ current_node ->slug ();
90- if (!empty ($ untranslated_slug )) {
91- array_unshift ($ translated_url_parts , $ untranslated_slug );
92- }
93- }
94- $ current_node = $ current_node ->parent ();
95- $ path = dirname ($ path );
96- }
97- $ max_recursions --;
98- }
99- if (!empty ($ translated_url_parts )) {
100- array_unshift ($ translated_url_parts , '' );
101- return implode ('/ ' , $ translated_url_parts );
102- } else {
103- return '' ;
88+ if ($ page ) {
89+ $ url = $ page ->url ();
10490 }
91+ return $ url ;
10592 }
10693
10794 /**
@@ -126,6 +113,9 @@ public function onTwigSiteVariables()
126113 $ translated_pages [$ language ] = null ;
127114 $ page_name_without_ext = substr ($ page ->name (), 0 , -(strlen ($ page ->extension ())));
128115 $ translated_page_path = $ page ->path () . DS . $ page_name_without_ext . '. ' . $ language . '.md ' ;
116+ if (!file_exists ($ translated_page_path ) and $ language == $ this ->grav ['language ' ]->getDefault ()) {
117+ $ translated_page_path = $ page ->path () . DS . $ page_name_without_ext . '.md ' ;
118+ }
129119 if (file_exists ($ translated_page_path )) {
130120 $ translated_page = new Page ();
131121 $ translated_page ->init (new \SplFileInfo ($ translated_page_path ), $ language . '.md ' );
@@ -135,15 +125,31 @@ public function onTwigSiteVariables()
135125 $ data ->translated_pages = $ translated_pages ;
136126 }
137127
138- $ data ->translated_routes = array ();
139- foreach ($ data ->languages as $ language ) {
140- $ data ->translated_routes [$ language ] = $ this ->getTranslatedUrl ($ language , $ page ->path ());
141- if (empty ($ data ->translated_routes [$ language ])) {
142- $ data ->translated_routes [$ language ] = $ data ->page_route ;
128+ $ language = $ this ->grav ['language ' ];
129+ $ active = $ language ->getActive () ?? $ language ->getDefault ();
130+
131+ if ($ this ->config ->get ('plugins.langswitcher.translated_urls ' , true )) {
132+ $ data ->translated_routes = array ();
133+ $ translate_langs = $ data ->languages ;
134+
135+ if (($ key = array_search ($ active , $ translate_langs )) !== false ) {
136+ $ data ->translated_routes [$ active ] = $ page ->url ();
137+ unset($ translate_langs [$ key ]);
138+ }
139+
140+ foreach ($ translate_langs as $ lang ) {
141+ $ data ->translated_routes [$ lang ] = $ this ->getTranslatedUrl ($ lang , $ page ->path ());
142+ if (is_null ($ data ->translated_routes [$ lang ])) {
143+ $ data ->translated_routes [$ lang ] = $ data ->page_route ;
144+ }
143145 }
146+ // Reset pages to current active language
147+ $ language ->init ();
148+ $ language ->setActive ($ active );
149+ $ this ->grav ['pages ' ]->reset ();
144150 }
145151
146- $ data ->current = $ this -> grav [ ' language ' ] ->getLanguage ();
152+ $ data ->current = $ language ->getLanguage ();
147153
148154 $ this ->grav ['twig ' ]->twig_vars ['langswitcher ' ] = $ this ->grav ['langswitcher ' ] = $ data ;
149155
0 commit comments