feat(faqs): i18n
This commit is contained in:
parent
10d44d189b
commit
a1a0fa3a44
@ -1,3 +1,3 @@
|
|||||||
FAQNoCampusAccount: Ich habe keinen LMU Campus-Login; kann ich trotzdem Zugang zum System erhalten?
|
FAQNoCampusAccount: Ich habe keine LMU-Benutzerkennung (ehem. Campus-Kennung); kann ich trotzdem Zugang zum System erhalten?
|
||||||
FAQForgottenPassword: Ich habe mein Passwort vergessen
|
FAQForgottenPassword: Ich habe mein Passwort vergessen
|
||||||
FAQCampusCantLogin: Ich kann mich mit meinem LMU Campus-Login nicht anmelden
|
FAQCampusCantLogin: Ich kann mich mit meiner LMU-Benutzerkennung (ehem. Campus-Kennung) nicht anmelden
|
||||||
3
messages/faq/en-eu.msg
Normal file
3
messages/faq/en-eu.msg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
FAQNoCampusAccount: I don't have a LMU user ID (formerly Campus-ID); can I still get access to Uni2work?
|
||||||
|
FAQForgottenPassword: I have forgotten my password
|
||||||
|
FAQCampusCantLogin: I can't log in using my LMU user ID (formerly Campus-ID)
|
||||||
@ -1249,6 +1249,7 @@ MenuAllocationUsers: Applicants
|
|||||||
MenuAllocationPriorities: Central priorities
|
MenuAllocationPriorities: Central priorities
|
||||||
MenuAllocationCompute: Compute allocation
|
MenuAllocationCompute: Compute allocation
|
||||||
MenuAllocationAccept: Accept allocation
|
MenuAllocationAccept: Accept allocation
|
||||||
|
MenuFaq: FAQ
|
||||||
|
|
||||||
BreadcrumbSubmissionFile: File
|
BreadcrumbSubmissionFile: File
|
||||||
BreadcrumbSubmissionUserInvite: Invitation to participate in a submission
|
BreadcrumbSubmissionUserInvite: Invitation to participate in a submission
|
||||||
@ -1319,6 +1320,7 @@ BreadcrumbAllocationPriorities: Central priorities
|
|||||||
BreadcrumbAllocationCompute: Compute allocation
|
BreadcrumbAllocationCompute: Compute allocation
|
||||||
BreadcrumbAllocationAccept: Accept allocation
|
BreadcrumbAllocationAccept: Accept allocation
|
||||||
BreadcrumbMessageHide: Hide
|
BreadcrumbMessageHide: Hide
|
||||||
|
BreadcrumbFaq: FAQ
|
||||||
|
|
||||||
ExternalExamEdit coursen examn: Edit: #{coursen}, #{examn}
|
ExternalExamEdit coursen examn: Edit: #{coursen}, #{examn}
|
||||||
ExternalExamGrades coursen examn: Exam achievements: #{coursen}, #{examn}
|
ExternalExamGrades coursen examn: Exam achievements: #{coursen}, #{examn}
|
||||||
@ -2479,3 +2481,6 @@ BearerTokenExpires: Expiration time
|
|||||||
BearerTokenExpiresTip: If no expiration time is given, the token will not expire. It will be valid forever.
|
BearerTokenExpiresTip: If no expiration time is given, the token will not expire. It will be valid forever.
|
||||||
BearerTokenOverrideStart: Start time
|
BearerTokenOverrideStart: Start time
|
||||||
BearerTokenOverrideStartTip: If no start time is given, only the expiration time will be checked when the token is used.
|
BearerTokenOverrideStartTip: If no start time is given, only the expiration time will be checked when the token is used.
|
||||||
|
|
||||||
|
FaqTitle: Frequently asked questions
|
||||||
|
AdditionalFaqs: More frequently asked questions
|
||||||
|
|||||||
@ -79,11 +79,19 @@ for msgDirectory (${msgDirectories}); do
|
|||||||
|
|
||||||
# printf ">>> %s\n" ${msgDirectory}
|
# printf ">>> %s\n" ${msgDirectory}
|
||||||
if [[ $fix != 0 ]]; then
|
if [[ $fix != 0 ]]; then
|
||||||
diff -u0 --suppress-common-lines -wB ${diffArgs} | grep -vE '^@@.*@@'
|
if [[ ${#dirMsgFiles} -gt 1 ]]; then
|
||||||
diffStatus=$pipestatus[0]
|
diff -u0 --suppress-common-lines -wB ${diffArgs} | grep -vE '^@@.*@@'
|
||||||
|
diffStatus=$pipestatus[0]
|
||||||
|
else
|
||||||
|
diffStatus=1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
diff -u0 --suppress-common-lines -wB ${diffArgs} >/dev/null
|
if [[ ${#dirMsgFiles} -gt 1 ]]; then
|
||||||
diffStatus=$?
|
diff -u0 --suppress-common-lines -wB ${diffArgs} >/dev/null
|
||||||
|
diffStatus=$?
|
||||||
|
else
|
||||||
|
diffStatus=1
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ ${diffStatus} == 1 ]]; then
|
if [[ ${diffStatus} == 1 ]]; then
|
||||||
./translate.hs msgs ${dirMsgFiles} && diffStatus=0
|
./translate.hs msgs ${dirMsgFiles} && diffStatus=0
|
||||||
@ -118,13 +126,18 @@ for templateDirectory (templates/i18n/**/*(FN)); do
|
|||||||
|
|
||||||
for ext (${templateExtensions}); do
|
for ext (${templateExtensions}); do
|
||||||
for lang (${requiredLangs}); do
|
for lang (${requiredLangs}); do
|
||||||
|
# printf ">> %s %s\n" ${ext} ${lang}
|
||||||
|
|
||||||
foundLang=0
|
foundLang=0
|
||||||
for templateFile (${templateDirectory}/*.${ext}); do
|
for templateFile (${templateDirectory}/*.${ext}); do
|
||||||
[[ ${templateFile:t} =~ "(^|.)${lang}[-.]" ]] || continue
|
# printf "%s\n" ${templateFile}
|
||||||
|
[[ ${templateFile:t} =~ "(^|\.)${lang}[-.]" ]] || continue
|
||||||
foundLang=1
|
foundLang=1
|
||||||
break
|
break
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# printf ">> %s\n" ${foundLang}
|
||||||
|
|
||||||
if [[ $foundLang -ne 1 ]]; then
|
if [[ $foundLang -ne 1 ]]; then
|
||||||
templateDifference=1
|
templateDifference=1
|
||||||
[[ $fix != 0 ]] && printf "%s: %s (%s)\n" $templateDirectory $lang $ext
|
[[ $fix != 0 ]] && printf "%s: %s (%s)\n" $templateDirectory $lang $ext
|
||||||
|
|||||||
@ -1,5 +1,12 @@
|
|||||||
$newline never
|
$newline never
|
||||||
<dl .deflist>
|
<dl .deflist>
|
||||||
|
<dt .deflist__dt>
|
||||||
|
^{formatGregorianW 2020 04 24}
|
||||||
|
<dd .deflist__dd>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Häufig gestellte Fragen
|
||||||
|
|
||||||
<dt .deflist__dt>
|
<dt .deflist__dt>
|
||||||
^{formatGregorianW 2020 04 17}
|
^{formatGregorianW 2020 04 17}
|
||||||
<dd .deflist__dd>
|
<dd .deflist__dd>
|
||||||
|
|||||||
@ -1,5 +1,12 @@
|
|||||||
$newline never
|
$newline never
|
||||||
<dl .deflist>
|
<dl .deflist>
|
||||||
|
<dt .deflist__dt>
|
||||||
|
^{formatGregorianW 2020 04 24}
|
||||||
|
<dd .deflist__dd>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Frequently asked questions
|
||||||
|
|
||||||
<dt .deflist__dt>
|
<dt .deflist__dt>
|
||||||
^{formatGregorianW 2020 04 17}
|
^{formatGregorianW 2020 04 17}
|
||||||
<dd .deflist__dd>
|
<dd .deflist__dd>
|
||||||
|
|||||||
@ -6,9 +6,9 @@ $newline never
|
|||||||
im <a href="https://www.portal.uni-muenchen.de">Campus-Portal</a> #
|
im <a href="https://www.portal.uni-muenchen.de">Campus-Portal</a> #
|
||||||
anmelden?<br />
|
anmelden?<br />
|
||||||
|
|
||||||
Falls nicht ist davon auszugehen, dass Sie Ihre Anmeldedaten falsch #
|
Falls nicht, ist davon auszugehen, dass Sie Ihre Anmeldedaten falsch #
|
||||||
eingeben oder <a href=^{faqLink FAQNoCampusAccount}>keinen #
|
eingeben oder <a href=^{faqLink FAQNoCampusAccount}>keine #
|
||||||
Campus-Login besitzen</a>.
|
LMU-Benutzerkennung (ehem. Campus-Kennung) besitzen</a>.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Beachten Sie dabei auch, dass Uni2work Leerzeichen sowohl im #
|
Beachten Sie dabei auch, dass Uni2work Leerzeichen sowohl im #
|
||||||
@ -19,8 +19,8 @@ $newline never
|
|||||||
<p>
|
<p>
|
||||||
Uni2work bietet zwei Login-Formulare.<br />
|
Uni2work bietet zwei Login-Formulare.<br />
|
||||||
|
|
||||||
Für die Anmeldung mit der LMU Campus-Kennung müssen Sie das Formular #
|
Für die Anmeldung mit der LMU-Benutzerkennung (ehem. Campus-Kennung) #
|
||||||
„Campus-Login“ verwenden.
|
müssen Sie das Formular „Campus-Login“ verwenden.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Falls Sie sich #
|
Falls Sie sich #
|
||||||
|
|||||||
33
templates/i18n/faq/campus-cant-login.en-eu.hamlet
Normal file
33
templates/i18n/faq/campus-cant-login.en-eu.hamlet
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
$newline never
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Can you log in to #
|
||||||
|
the <a href="https://www.portal.uni-muenchen.de">Campus-Portal</a> #
|
||||||
|
using the <i>exact same</i> (ideally copied & pasted) login data?
|
||||||
|
<br>
|
||||||
|
|
||||||
|
If you cannot you can assume that you are entering your login data #
|
||||||
|
wrong or do that you <a href=^{faqLink FAQNoCampusAccount}>do not #
|
||||||
|
have a LMU user ID (formerly Campus-ID)</a>.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Please consider that for Uni2work both your user ID and password are #
|
||||||
|
sensitive to whitespace characters.
|
||||||
|
<br>
|
||||||
|
Your password is also case-sensitive.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Uni2work offers to login forms.
|
||||||
|
<br>
|
||||||
|
To log in using your LMU user ID (formerly Campus-ID) you need to #
|
||||||
|
use the form titled “Campus login”.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
If you can log in to #
|
||||||
|
the <a href="https://www.portal.uni-muenchen.de">Campus-Portal</a> #
|
||||||
|
but can't log in to Uni2work, please contact a #
|
||||||
|
Uni2work-Administrator using the <a href=@{HelpR}>Support form</a> #
|
||||||
|
(at the top right of every page).
|
||||||
@ -1,12 +1,22 @@
|
|||||||
$newline never
|
$newline never
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Wenn Sie sich gewöhnlicherweise mit Ihrem LMU Campus-Login anmelden, #
|
Wenn Sie sich gewöhnlicherweise mit Ihrer LMU-Benutzerkennug #
|
||||||
wenden Sie sich bitte an #
|
(ehem. Campus-Kennung) anmelden, wenden Sie sich bitte an #
|
||||||
den <a href="https://www.it-servicedesk.uni-muenchen.de">IT-Servicedesk</a> #
|
den <a href="https://www.it-servicedesk.uni-muenchen.de/faq/index.html#campuskennung-passwort-vergessen">IT-Servicedesk</a> #
|
||||||
um Ihr Passwort zurücksetzen zu lassen.
|
um Ihr Passwort zurücksetzen zu lassen.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Wenn Sie sich mit einer Uni2work-internen Kennung anmelden wenden #
|
Wenn Sie sich mit einer Uni2work-internen Kennung anmelden wenden #
|
||||||
Sie sich dafür bitte über das <a href=@{HelpR}>Hilfe-Formular</a>, #
|
Sie sich dafür bitte über das <a href=@{HelpR}>Hilfe-Formular</a> #
|
||||||
oben rechts auf jeder Seite, an die Uni2work-Administration.
|
(oben rechts auf jeder Seite) an die Uni2work-Administration.
|
||||||
|
<br>
|
||||||
|
Tragen sie dabei unter „Antworten an“ die Adresse ein, an die #
|
||||||
|
Uni2work gewöhnlicherweise Mitteilungen verschickt.
|
||||||
|
<br>
|
||||||
|
Bitte geben Sie zusätzlich mind. eine nicht-öffentliche #
|
||||||
|
personenbezogene Information an, um den Administratoren zu helfen #
|
||||||
|
die Anfrage zu authorisieren. #
|
||||||
|
|
||||||
|
Geeignet ist z.B. die Matrikelnummer oder der ungefähre Zeitpunkt #
|
||||||
|
des letzten Logins.
|
||||||
|
|||||||
21
templates/i18n/faq/forgotten-password.en-eu.hamlet
Normal file
21
templates/i18n/faq/forgotten-password.en-eu.hamlet
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
$newline never
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you usually log in using your LMU user ID (formerly Campus-ID) #
|
||||||
|
please contact #
|
||||||
|
the <a href="https://www.it-servicedesk.uni-muenchen.de/faq/index.html#campuskennung-passwort-vergessen">IT #
|
||||||
|
servicedesk (german)</a> to reset your password.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you log in using a Uni2work-internal account please use #
|
||||||
|
the <a href=@{HelpR}>Support form</a> (at the top right of every #
|
||||||
|
page) to contact a Uni2work-administrator.
|
||||||
|
<br>
|
||||||
|
Specify the email to which Uni2work usually sends notifications #
|
||||||
|
under “Send answers to”.
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Please also include at least one non-public piece of information to #
|
||||||
|
help authorise your request. #
|
||||||
|
We suggest your Matriculation number or the approximate time of your #
|
||||||
|
last successful login.
|
||||||
@ -24,12 +24,15 @@ $newline never
|
|||||||
<dt>Vollständiger Name
|
<dt>Vollständiger Name
|
||||||
<dd>Der vollständige Name muss mindestens den kompletten Nachnamen enthalten
|
<dd>Der vollständige Name muss mindestens den kompletten Nachnamen enthalten
|
||||||
<dd>Der vollständige Name kann zudem beliebige Teile der Vornamen und des akademischen Titels enthalten
|
<dd>Der vollständige Name kann zudem beliebige Teile der Vornamen und des akademischen Titels enthalten
|
||||||
<dt>E-Mail Addresse zur Anzeige
|
<dd>So wird der Name anderen Benutzern angezeigt
|
||||||
<dd>Wird anderen Benutzern angezeigt, wenn man z.B. als Kursverwalter oder Korrektor eingetragen ist
|
|
||||||
<dt>Matrikelnummer
|
<dt>Matrikelnummer
|
||||||
<dt>Geschlecht
|
<dt>Geschlecht
|
||||||
<dd>„Unbekannt“, „Männlich“, „Weiblich“ oder „Keine Angabe“
|
<dd>„Unbekannt“, „Männlich“, „Weiblich“ oder „Keine Angabe“
|
||||||
<dd>Nach <a href="https://en.wikipedia.org/wiki/ISO/IEC_5218">ISO 5218</a>
|
$# <dd>Nach <a href="https://en.wikipedia.org/wiki/ISO/IEC_5218">ISO 5218</a>
|
||||||
<dt>E-Mail Addresse zum Versand
|
<dt>E-Mail Adresse zur Anzeige
|
||||||
<dd>An diese Addresse werden Mitteilungen von Uni2work versandt
|
<dd>Wird öffentlich angezeigt, wenn man z.B. als Kursverwalter oder Korrektor eingetragen ist
|
||||||
|
<dd>Kursverwalter von Kursen, in denen man Teilnehmer ist, sehen die E-Mail Adresse zum Versand
|
||||||
|
<dt>E-Mail Adresse zum Versand
|
||||||
|
<dd>An diese Adresse werden Mitteilungen von Uni2work versandt
|
||||||
<dd>Die zuverlässige Zustellung muss gewährleistet sein, daher keine Emails von freien Mailanbietern wie GMail, Hotmail, GMX, etc.
|
<dd>Die zuverlässige Zustellung muss gewährleistet sein, daher keine Emails von freien Mailanbietern wie GMail, Hotmail, GMX, etc.
|
||||||
|
<dd>Bei externen Studierenden sollte die E-Mail Adresse der externen Institution verwendet werden, z.B. <code>@mytum.de</code> für TUM-Studierende
|
||||||
|
|||||||
35
templates/i18n/faq/no-campus-account.en-eu.hamlet
Normal file
35
templates/i18n/faq/no-campus-account.en-eu.hamlet
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
$newline never
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Uni2work-administrators can create Uni2work-internal accounts.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Please use the <a href=@{HelpR}>Support form</a> (at the top right #
|
||||||
|
of every page) to contact a Uni2work-administrator.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Explain your situation and provide a reason for requiring access to #
|
||||||
|
Uni2work.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Please send the following information with your request:
|
||||||
|
|
||||||
|
<dl .deflist--no-grid>
|
||||||
|
<dt>Academic title
|
||||||
|
<dt>Given name(s)
|
||||||
|
<dt>Full surname
|
||||||
|
<dd>The surname may consist of multiple words
|
||||||
|
<dt>Full name
|
||||||
|
<dd>The full name must contain the complete surname
|
||||||
|
<dd>The full name may also contain arbitrary components of the given name(s) and academic title
|
||||||
|
<dt>Matriculation number
|
||||||
|
<dt>Sex
|
||||||
|
<dd>“Not known”, “Male”, “Female”, or “Not specified”
|
||||||
|
<dt>Email address for display
|
||||||
|
<dd>This email address is published if you are for example a course administrator or corrector
|
||||||
|
<dd>Course administrators for courses in which you participate are shown the email address for sending
|
||||||
|
<dt>Email address for sending
|
||||||
|
<dd>Uni2work sends notifications to this address
|
||||||
|
<dd>Reliable delivery of email must be ensured. Therefore free mail hosters like GMail, Hotmail, GMX, etc. are not permitted
|
||||||
|
<dd>For external students the email address provided by their institution should be used, e.g. <code>@mytum.de</code> for TUM-students
|
||||||
89
translate.hs
89
translate.hs
@ -52,6 +52,7 @@ import System.Process
|
|||||||
import System.IO
|
import System.IO
|
||||||
import System.Exit
|
import System.Exit
|
||||||
import System.IO.Temp (withSystemTempFile, writeSystemTempFile)
|
import System.IO.Temp (withSystemTempFile, writeSystemTempFile)
|
||||||
|
import System.IO.Error
|
||||||
|
|
||||||
import Data.Ord (Down(..))
|
import Data.Ord (Down(..))
|
||||||
|
|
||||||
@ -61,6 +62,8 @@ import Control.Monad.Catch
|
|||||||
data Translate
|
data Translate
|
||||||
= TranslateMsgs
|
= TranslateMsgs
|
||||||
{ msgFiles :: [FilePath]
|
{ msgFiles :: [FilePath]
|
||||||
|
, msgOnlyLang :: Bool
|
||||||
|
, msgRequiredLangs :: [String]
|
||||||
}
|
}
|
||||||
| TranslateI18nDirectory
|
| TranslateI18nDirectory
|
||||||
{ i18nDir :: FilePath
|
{ i18nDir :: FilePath
|
||||||
@ -74,21 +77,28 @@ $(cmdArgsQuote [d|
|
|||||||
messages = TranslateMsgs
|
messages = TranslateMsgs
|
||||||
{ msgFiles = [] &=# args
|
{ msgFiles = [] &=# args
|
||||||
&=# typFile
|
&=# typFile
|
||||||
|
, msgOnlyLang = True
|
||||||
|
&=# name "only-lang"
|
||||||
|
&=# help "Should only the language compononent (en, de, ...) be considered?"
|
||||||
|
, msgRequiredLangs = []
|
||||||
|
&=# name "required"
|
||||||
|
&=# help "Which languages are required to exist?"
|
||||||
|
&=# typ "LANG"
|
||||||
}
|
}
|
||||||
i18n = TranslateI18nDirectory
|
i18n = TranslateI18nDirectory
|
||||||
{ i18nDir = def &=# argPos 0
|
{ i18nDir = def &=# argPos 0
|
||||||
&=# typDir
|
&=# typDir
|
||||||
, i18nOnlyLang = True
|
, i18nOnlyLang = True
|
||||||
&=# name "only-lang"
|
&=# name "only-lang"
|
||||||
&=# help "Should only the language compononent (en, de, ...) be considered?"
|
&=# help "Should only the language compononent (en, de, ...) be considered?"
|
||||||
, i18nRequiredLangs = []
|
, i18nRequiredLangs = []
|
||||||
&=# name "required"
|
&=# name "required"
|
||||||
&=# help "Which languages are required to exist?"
|
&=# help "Which languages are required to exist?"
|
||||||
&=# typ "LANG"
|
|
||||||
, i18nSourceLangs = []
|
|
||||||
&=# name "source"
|
|
||||||
&=# help "Preference order for source of translation"
|
|
||||||
&=# typ "LANG"
|
&=# typ "LANG"
|
||||||
|
, i18nSourceLangs = []
|
||||||
|
&=# name "source"
|
||||||
|
&=# help "Preference order for source of translation"
|
||||||
|
&=# typ "LANG"
|
||||||
}
|
}
|
||||||
|
|
||||||
run = cmdArgs# (modes# [ messages &=# auto &=# name "msgs"
|
run = cmdArgs# (modes# [ messages &=# auto &=# name "msgs"
|
||||||
@ -118,18 +128,22 @@ data MsgFile = MsgFile
|
|||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = main' =<< run
|
main = main' =<< run
|
||||||
where
|
where
|
||||||
main' TranslateMsgs{..} = do
|
main' m@TranslateMsgs{..}
|
||||||
let
|
| null msgRequiredLangs = main' m{ msgRequiredLangs = ["de-de-formal", "en-eu"] }
|
||||||
filePairs :: [(FilePath, FilePath)]
|
| otherwise = do
|
||||||
filePairs = concat $ zipWith (fmap . (,)) msgFiles (tail $ tails msgFiles)
|
msgFiles' <- nub . (msgFiles ++) <$> getMissingFiles m
|
||||||
mapM_ (\(f1, f2) -> join $ combine <$> readMsgFile f1 <*> readMsgFile f2) filePairs
|
|
||||||
|
let
|
||||||
|
filePairs :: [(FilePath, FilePath)]
|
||||||
|
filePairs = concat $ zipWith (fmap . (,)) msgFiles (tail $ tails msgFiles')
|
||||||
|
mapM_ (\(f1, f2) -> join $ combine <$> readMsgFile f1 <*> readMsgFile f2) filePairs
|
||||||
main' m@TranslateI18nDirectory{..}
|
main' m@TranslateI18nDirectory{..}
|
||||||
| null i18nRequiredLangs = main' m{ i18nRequiredLangs = ["de-de-formal", "en-eu"] }
|
| null i18nRequiredLangs = main' m{ i18nRequiredLangs = ["de-de-formal", "en-eu"] }
|
||||||
| null i18nSourceLangs = main' m{ i18nSourceLangs = ["de-de-formal"] }
|
| null i18nSourceLangs = main' m{ i18nSourceLangs = ["de-de-formal"] }
|
||||||
| otherwise = do
|
| otherwise = do
|
||||||
missing <- getMissingFiles m
|
missing <- getMissingFiles m
|
||||||
forM_ missing $ \missing' -> do
|
forM_ missing $ \missing' -> do
|
||||||
translateSource <- getTranslateSource m
|
translateSource <- getTranslateSource m missing'
|
||||||
case translateSource of
|
case translateSource of
|
||||||
Just src -> translateFrom src missing'
|
Just src -> translateFrom src missing'
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
@ -138,7 +152,8 @@ main = main' =<< run
|
|||||||
|
|
||||||
|
|
||||||
readMsgFile :: FilePath -> IO MsgFile
|
readMsgFile :: FilePath -> IO MsgFile
|
||||||
readMsgFile f = readMsgText f <$> Text.readFile f
|
readMsgFile f = catchIf isDoesNotExistError readMsgFile' . const . return $ MsgFile f mempty mempty
|
||||||
|
where readMsgFile' = readMsgText f <$> Text.readFile f
|
||||||
|
|
||||||
readMsgText :: FilePath -> Text -> MsgFile
|
readMsgText :: FilePath -> Text -> MsgFile
|
||||||
readMsgText f (Text.lines -> ls) =
|
readMsgText f (Text.lines -> ls) =
|
||||||
@ -184,10 +199,11 @@ renderMsg MsgDefinition{..} = (<> (": " <> msgTrans)) . Text.unwords $
|
|||||||
|
|
||||||
insertIntoFile :: MsgFile -> MsgFile -> MsgFile -> IO ()
|
insertIntoFile :: MsgFile -> MsgFile -> MsgFile -> IO ()
|
||||||
insertIntoFile target reference source = do
|
insertIntoFile target reference source = do
|
||||||
|
let getLines = fmap (P.fromListEnd . Text.lines) . Text.readFile
|
||||||
|
|
||||||
forM_ (msgDefinitions source) $ \msgDef -> do
|
forM_ (msgDefinitions source) $ \msgDef -> do
|
||||||
targetLines <- P.fromListEnd . Text.lines <$> Text.readFile (msgFile target)
|
targetLines <- catchIf isDoesNotExistError (getLines $ msgFile target) . const $ return Nothing
|
||||||
referenceLines <- P.fromListEnd . Text.lines <$> Text.readFile (msgFile reference)
|
referenceLines <- getLines $ msgFile reference
|
||||||
|
|
||||||
case toList <$> targetLines of
|
case toList <$> targetLines of
|
||||||
Just lines -> do
|
Just lines -> do
|
||||||
@ -265,18 +281,29 @@ normalizeLang onlyLang
|
|||||||
| otherwise = id
|
| otherwise = id
|
||||||
|
|
||||||
getLang :: Bool -> FilePath -> String
|
getLang :: Bool -> FilePath -> String
|
||||||
getLang onlyLang = normalizeLang onlyLang . takeFileName
|
getLang onlyLang = normalizeLang onlyLang . Text.unpack . last . Text.splitOn "." . Text.pack . dropExtension . takeFileName
|
||||||
|
|
||||||
replaceLang :: FilePath -> String -> FilePath
|
replaceLang :: FilePath -> String -> FilePath
|
||||||
replaceLang reference l = takeDirectory reference </> l <.> takeExtensions reference
|
replaceLang reference l = takeDirectory reference </> withPrefix l <.> takeExtension reference
|
||||||
|
where prefix = getPrefix reference
|
||||||
|
withPrefix | not $ null prefix = (prefix <.>)
|
||||||
|
| otherwise = id
|
||||||
|
|
||||||
|
getPrefix :: FilePath -> String
|
||||||
|
getPrefix = Text.unpack . Text.intercalate "." . init . Text.splitOn "." . Text.pack . dropExtension . takeFileName
|
||||||
|
|
||||||
getFiles :: FilePath -> IO [FilePath]
|
getFiles :: FilePath -> IO [FilePath]
|
||||||
getFiles dir = filterM doesFileExist . map (dir </>) =<< listDirectory dir
|
getFiles dir = filterM doesFileExist . map (dir </>) =<< listDirectory dir
|
||||||
|
|
||||||
getTranslateSource :: Translate -> IO (Maybe FilePath)
|
getTranslateSource :: Translate -> FilePath -> IO (Maybe FilePath)
|
||||||
getTranslateSource TranslateI18nDirectory{..} = do
|
getTranslateSource TranslateI18nDirectory{..} missing = do
|
||||||
fs <- getFiles i18nDir
|
fs <- getFiles i18nDir
|
||||||
let fs' = sortOn (\(getLang i18nOnlyLang -> l) -> Down . elemIndex l . reverse $ map (normalizeLang i18nOnlyLang) i18nSourceLangs) fs
|
let fs' = sortOn (\(getLang i18nOnlyLang -> l) -> Down . elemIndex l . reverse $ map (normalizeLang i18nOnlyLang) i18nSourceLangs)
|
||||||
|
[ f
|
||||||
|
| f <- fs
|
||||||
|
, getPrefix f == getPrefix missing
|
||||||
|
, takeExtension f == takeExtension missing
|
||||||
|
]
|
||||||
return $ listToMaybe fs'
|
return $ listToMaybe fs'
|
||||||
|
|
||||||
getMissingFiles :: Translate -> IO [FilePath]
|
getMissingFiles :: Translate -> IO [FilePath]
|
||||||
@ -284,8 +311,8 @@ getMissingFiles TranslateI18nDirectory{..} = do
|
|||||||
fs <- getFiles i18nDir
|
fs <- getFiles i18nDir
|
||||||
|
|
||||||
let
|
let
|
||||||
exts :: HashMap String [FilePath]
|
exts :: HashMap (String, String) [FilePath]
|
||||||
exts = HashMap.fromListWith (<>) $ map (takeExtensions &&& pure) fs
|
exts = HashMap.fromListWith (<>) $ map ((getPrefix &&& takeExtension) &&& pure) fs
|
||||||
|
|
||||||
return . flip concatMap exts $ \refs@(r : _) ->
|
return . flip concatMap exts $ \refs@(r : _) ->
|
||||||
let ls :: [String]
|
let ls :: [String]
|
||||||
@ -293,6 +320,20 @@ getMissingFiles TranslateI18nDirectory{..} = do
|
|||||||
missing :: [String]
|
missing :: [String]
|
||||||
missing = filter (\l -> not $ any (== normalizeLang i18nOnlyLang l) ls) i18nRequiredLangs
|
missing = filter (\l -> not $ any (== normalizeLang i18nOnlyLang l) ls) i18nRequiredLangs
|
||||||
in map (replaceLang r) missing
|
in map (replaceLang r) missing
|
||||||
|
getMissingFiles TranslateMsgs{..} = do
|
||||||
|
fs <- concat <$> mapM getFiles (map takeDirectory msgFiles)
|
||||||
|
|
||||||
|
let
|
||||||
|
exts :: HashMap String [FilePath]
|
||||||
|
exts = HashMap.fromListWith (<>) $ map (takeExtension &&& pure) fs
|
||||||
|
|
||||||
|
return . flip concatMap exts $ \refs@(r : _) ->
|
||||||
|
let ls :: [String]
|
||||||
|
ls = map (getLang msgOnlyLang) refs
|
||||||
|
missing :: [String]
|
||||||
|
missing = filter (\l -> not $ any (== normalizeLang msgOnlyLang l) ls) msgRequiredLangs
|
||||||
|
in map (replaceLang r) missing
|
||||||
|
|
||||||
|
|
||||||
translateFrom :: FilePath -> FilePath -> IO ()
|
translateFrom :: FilePath -> FilePath -> IO ()
|
||||||
translateFrom from to = do
|
translateFrom from to = do
|
||||||
|
|||||||
Reference in New Issue
Block a user