Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Stud.IP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jan-Hendrik Willms
Stud.IP
Commits
00028bc4
Commit
00028bc4
authored
2 years ago
by
Jan-Hendrik Willms
Browse files
Options
Downloads
Patches
Plain Diff
get language from accept header only if no valid is started, fixes #1680, fixes #1394
Closes #1680 and #1394 Merge request
studip/studip!1089
parent
08f9e74a
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
lib/classes/JsonApi/Middlewares/Language.php
+7
-72
7 additions, 72 deletions
lib/classes/JsonApi/Middlewares/Language.php
lib/classes/JsonApi/middleware.php
+1
-1
1 addition, 1 deletion
lib/classes/JsonApi/middleware.php
lib/language.inc.php
+33
-17
33 additions, 17 deletions
lib/language.inc.php
with
41 additions
and
90 deletions
lib/classes/JsonApi/Middlewares/Language.php
+
7
−
72
View file @
00028bc4
...
...
@@ -4,6 +4,7 @@ namespace JsonApi\Middlewares;
use
Negotiation\LanguageNegotiator
;
use
Psr\Http\Message\ResponseInterface
;
use
Psr\Http\Message\ServerRequestInterface
as
Request
;
use
Psr\Http\Server\MiddlewareInterface
;
use
Psr\Http\Server\RequestHandlerInterface
as
RequestHandler
;
/**
...
...
@@ -12,7 +13,7 @@ use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
*
* @author Jan-Hendrik Willms <tleilax+studip@gmail.com>
*/
class
Language
final
class
Language
implements
MiddlewareInterface
{
/**
* @param Request $request das Request-Objekt
...
...
@@ -20,79 +21,13 @@ class Language
*
* @return ResponseInterface das neue Response-Objekt
*/
public
function
__invoke
(
Request
$request
,
RequestHandler
$handler
)
public
function
process
(
Request
$request
,
RequestHandler
$handler
)
:
ResponseInterface
{
$language
=
$this
->
detectValidLanguageFromRequest
(
$request
);
$language_before
=
false
;
$language
=
$_SESSION
[
'_language'
]
??
get_accepted_languages
(
$request
);
// Set language if detected
if
(
$language
)
{
$language_before
=
$_SESSION
[
'_language'
];
$_SESSION
[
'_language'
]
=
$language
;
setTempLanguage
(
false
,
$language
);
}
init_i18n
(
$language
);
$_SESSION
[
'_language'
]
=
$language
;
$response
=
$handler
->
handle
(
$request
);
if
(
$language
)
{
$_SESSION
[
'_language'
]
=
$language_before
;
restoreLanguage
();
}
return
$response
;
}
/**
* Tries to detect a valid installed language from the request.
*
* @param Request $request
* @return string|null The detected language (if any)
*/
private
function
detectValidLanguageFromRequest
(
Request
$request
):
?string
{
if
(
!
$request
->
hasHeader
(
'Accept-Language'
))
{
return
null
;
}
$negotiator
=
new
LanguageNegotiator
();
$best_language
=
$negotiator
->
getBest
(
$request
->
getHeaderLine
(
'Accept-Language'
),
$this
->
getStudIPLanguagePriorities
()
);
if
(
!
$best_language
)
{
return
null
;
}
return
$this
->
normalizeLanguageForStudIP
(
$best_language
->
getType
());
}
/**
* Returns a list of the normalized installed languages for the Stud.IP
* system.
*
* @return array
*/
private
function
getStudIPLanguagePriorities
():
array
{
return
array_map
(
function
(
$language
)
{
return
str_replace
(
'_'
,
'-'
,
$language
);
},
array_keys
(
$GLOBALS
[
'INSTALLED_LANGUAGES'
])
);
}
/**
* Normalizes the given language string (<language>-<variety>, e.g. de-de)
* for Stud.IP (e.g. de_DE).
*
* @param string $language
* @return string
*/
private
function
normalizeLanguageForStudIP
(
string
$language
):
string
{
$tags
=
explode
(
'-'
,
$language
);
return
$tags
[
0
]
.
'_'
.
strtoupper
(
$tags
[
1
]);
return
$handler
->
handle
(
$request
);
}
}
This diff is collapsed.
Click to expand it.
lib/classes/JsonApi/middleware.php
+
1
−
1
View file @
00028bc4
...
...
@@ -27,7 +27,7 @@ return function (App $app) {
$app
->
addRoutingMiddleware
();
// Add language middleware
$app
->
add
(
new
Middlewares\Language
()
);
$app
->
add
(
Middlewares\Language
::
class
);
/** @var array|null */
$corsOrigin
=
\Config
::
get
()
->
getValue
(
'JSONAPI_CORS_ORIGIN'
);
...
...
This diff is collapsed.
Click to expand it.
lib/language.inc.php
+
33
−
17
View file @
00028bc4
...
...
@@ -35,7 +35,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// +---------------------------------------------------------------------------+
use
Negotiation\AcceptHeader
;
/**
* This function tries to find the preferred language
...
...
@@ -47,22 +47,38 @@
* @return string preferred user language, given in "en_GB"-style
*
*/
function
get_accepted_languages
()
{
global
$INSTALLED_LANGUAGES
;
$_language
=
Config
::
get
()
->
DEFAULT_LANGUAGE
;
$accepted_languages
=
explode
(
","
,
getenv
(
"HTTP_ACCEPT_LANGUAGE"
));
if
(
is_array
(
$accepted_languages
)
&&
count
(
$accepted_languages
))
{
foreach
(
$accepted_languages
as
$temp_accepted_language
)
{
foreach
(
$INSTALLED_LANGUAGES
as
$temp_language
=>
$temp_language_settings
)
{
if
(
mb_substr
(
trim
(
$temp_accepted_language
),
0
,
2
)
==
mb_substr
(
$temp_language
,
0
,
2
))
{
$_language
=
$temp_language
;
break
2
;
}
}
}
function
get_accepted_languages
(
Psr
\Http\Message\RequestInterface
$request
=
null
)
{
$accepted_languages
=
null
;
if
(
$request
===
null
)
{
$accepted_languages
=
$_SERVER
[
'HTTP_ACCEPT_LANGUAGE'
];
}
elseif
(
$request
->
hasHeader
(
'Accept-Language'
))
{
$accepted_languages
=
$request
->
getHeaderLine
(
'Accept-Language'
);
}
// No languages found from http header, set default
if
(
!
$accepted_languages
)
{
return
Config
::
get
()
->
DEFAULT_LANGUAGE
;
}
return
$_language
;
// Use negotiator to identify best match
$negotiator
=
new
Negotiation\LanguageNegotiator
();
$best_language
=
$negotiator
->
getBest
(
$accepted_languages
,
array_map
(
function
(
$language
)
{
return
str_replace
(
'_'
,
'-'
,
$language
);
},
array_keys
(
$GLOBALS
[
'INSTALLED_LANGUAGES'
])
)
);
// No best match, set default
if
(
!
$best_language
)
{
return
Config
::
get
()
->
DEFAULT_LANGUAGE
;
}
// Normalize language definition for stud.ip
return
$best_language
->
getBasePart
()
.
'_'
.
strtoupper
(
$best_language
->
getSubPart
());
}
...
...
@@ -192,7 +208,7 @@ function restoreLanguage() {
* @access public
*/
function
setLocaleEnv
(
$language
,
$language_domain
=
''
){
putenv
(
'LANGUAGE'
);
//unset language preference
putenv
(
'LANGUAGE'
);
//unset language preference
$ret
=
setlocale
(
LC_ALL
,
$language
.
'.UTF-8'
);
setlocale
(
LC_NUMERIC
,
'C'
);
if
(
$language_domain
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment