1
0

Introduce formatted dates per language.

This commit is contained in:
Kevin Matsubara 2026-01-09 23:44:37 +01:00
parent 8059296e73
commit ae7cf0a117
12 changed files with 98 additions and 54 deletions

View File

@ -41,7 +41,7 @@ $endfor$
</tr> </tr>
$for(fielddays)$ $for(fielddays)$
<tr> <tr>
<td>$date$</td> <td>$formatted_date$</td>
<td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td> <td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td>
<td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ antenna<br/>$transceiver$</td> <td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ antenna<br/>$transceiver$</td>
<td class="d-none d-md-table-cell">$total-unique-qso$</td> <td class="d-none d-md-table-cell">$total-unique-qso$</td>

View File

@ -41,7 +41,7 @@ $endfor$
</tr> </tr>
$for(fielddays)$ $for(fielddays)$
<tr> <tr>
<td>$date$</td> <td>$formatted_date$</td>
<td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td> <td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td>
<td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ アンテナ<br/>$transceiver$</td> <td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ アンテナ<br/>$transceiver$</td>
<td class="d-none d-md-table-cell">$total-unique-qso$</td> <td class="d-none d-md-table-cell">$total-unique-qso$</td>

View File

@ -41,7 +41,7 @@ $endfor$
</tr> </tr>
$for(fielddays)$ $for(fielddays)$
<tr> <tr>
<td>$date$</td> <td>$formatted_date$</td>
<td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td> <td><a href="$url$">$title$</a><br/>$if(pota-locator)$<strong>POTA</strong>: $pota-locator$ $endif$ $if(wwff-locator)$<strong>WW-FF</strong>: $wwff-locator$ $endif$</td>
<td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ antenne<br/>$transceiver$</td> <td class="d-none d-md-table-cell">$mode$ - $bands$ - $antenna$ antenne<br/>$transceiver$</td>
<td class="d-none d-md-table-cell">$total-unique-qso$</td> <td class="d-none d-md-table-cell">$total-unique-qso$</td>

View File

@ -35,10 +35,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate "templates/post.html" (postCtx language) >>= loadAndApplyTemplate "templates/post.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
match "events/*" $ do match "events/*" $ do
@ -47,10 +48,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate "templates/event.html" (postCtx language) >>= loadAndApplyTemplate "templates/event.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
match "pages/en/japan/language/**" $ do match "pages/en/japan/language/**" $ do
@ -59,10 +61,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate "templates/japan-language-note.html" (postCtx language) >>= loadAndApplyTemplate "templates/japan-language-note.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
match "pages/*/plamo/equipment/**" $ do match "pages/*/plamo/equipment/**" $ do
@ -71,10 +74,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate "templates/equipment.html" (postCtx language) >>= loadAndApplyTemplate "templates/equipment.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
match "pages/*/plamo/model-kits/**" $ do match "pages/*/plamo/model-kits/**" $ do
@ -83,16 +87,17 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
let dateValue = lookupString "date" metadata let dateValue = lookupString "date" metadata
purchaseDateValue = lookupString "purchase_date" metadata purchaseDateValue = lookupString "purchase_date" metadata
formattedPurchaseDate = maybe "" formatDate purchaseDateValue formattedPurchaseDate = maybe "" (formatDate lang) purchaseDateValue
modelKitTemplate = modelKitTemplate =
if dateValue == Just "1990-01-01" if dateValue == Just "1990-01-01"
then "templates/model-kit-not-ready.html" then "templates/model-kit-not-ready.html"
else "templates/model-kit.html" else "templates/model-kit.html"
extendedCtx = constField "formatted_purchase_date" formattedPurchaseDate <> (postCtx language) extendedCtx = constField "formatted_purchase_date" formattedPurchaseDate <> (postCtx lang)
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate modelKitTemplate extendedCtx >>= loadAndApplyTemplate modelKitTemplate extendedCtx
@ -105,10 +110,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
>>= loadAndApplyTemplate "templates/radio.html" (postCtx language) >>= loadAndApplyTemplate "templates/radio.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
match "pages/*/software/**" $ do match "pages/*/software/**" $ do
@ -117,10 +123,11 @@ main = hakyll $ do
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language
pandocCompiler pandocCompiler
-- >>= loadAndApplyTemplate "templates/software-post.html" (postCtx language) -- >>= loadAndApplyTemplate "templates/software-post.html" (postCtx lang)
>>= loadAndApplyTemplate "templates/default.html" (postCtx language) >>= loadAndApplyTemplate "templates/default.html" (postCtx lang)
>>= relativizeUrls >>= relativizeUrls
create ["archive.html"] $ do create ["archive.html"] $ do
@ -133,7 +140,7 @@ main = hakyll $ do
posts <- recentFirst =<< loadAll "posts/*" posts <- recentFirst =<< loadAll "posts/*"
let archiveCtx = let archiveCtx =
listField "posts" (postCtx language) (return posts) <> listField "posts" (postCtx lang) (return posts) <>
constField "title" "Archives" <> constField "title" "Archives" <>
constField "language" lang <> constField "language" lang <>
langDict lang <> langDict lang <>
@ -151,19 +158,16 @@ main = hakyll $ do
]) $ do ]) $ do
route idRoute route idRoute
compile $ do compile $ do
-- ident <- getUnderlying
-- language <- getMetadataField' ident "language"
identifier <- getUnderlying identifier <- getUnderlying
metadata <- getMetadata identifier metadata <- getMetadata identifier
let language = lookupString "language" metadata let language = lookupString "language" metadata
let lang = fromMaybe "en" language let lang = fromMaybe "en" language
let urla = "pages/" ++ lang ++ "/plamo/model-kits/**" let url = "pages/" ++ lang ++ "/plamo/model-kits/**"
kits <- recentFirst =<< loadAll (fromGlob (urla)) kits <- recentFirst =<< loadAll (fromGlob (url))
let plamoCtx = let plamoCtx =
listField "kits" kitCtx (return kits) <> listField "kits" (kitCtx lang) (return kits) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -187,7 +191,7 @@ main = hakyll $ do
notes <- loadAll "pages/en/japan/language/notes/*" notes <- loadAll "pages/en/japan/language/notes/*"
let japanCtx = let japanCtx =
listField "notes" (postCtx language) (return notes) <> listField "notes" (postCtx lang) (return notes) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -213,8 +217,8 @@ main = hakyll $ do
fielddays <- recentFirst fielddays fielddays <- recentFirst fielddays
let radioCtx = let radioCtx =
listField "antenna" (postCtx language) (return antenna) <> listField "antenna" (postCtx lang) (return antenna) <>
listField "fielddays" (postCtx language) (return fielddays) <> listField "fielddays" (postCtx lang) (return fielddays) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -239,7 +243,7 @@ main = hakyll $ do
projects <- recentFirst projects projects <- recentFirst projects
let softwareCtx = let softwareCtx =
listField "projects" (postCtx language) (return projects) <> listField "projects" (postCtx lang) (return projects) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -263,7 +267,7 @@ main = hakyll $ do
blazorPages <- loadAll "pages/en/software/code/blazor/*" blazorPages <- loadAll "pages/en/software/code/blazor/*"
let softwareCtx = let softwareCtx =
listField "blazorPages" (postCtx language) (return blazorPages) <> listField "blazorPages" (postCtx lang) (return blazorPages) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -287,7 +291,7 @@ main = hakyll $ do
elmPages <- loadAll "pages/en/software/code/elm/*" elmPages <- loadAll "pages/en/software/code/elm/*"
let softwareCtx = let softwareCtx =
listField "elmPages" (postCtx language) (return elmPages) <> listField "elmPages" (postCtx lang) (return elmPages) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -311,7 +315,7 @@ main = hakyll $ do
haskellPages <- loadAll "pages/en/software/code/haskell/*" haskellPages <- loadAll "pages/en/software/code/haskell/*"
let softwareCtx = let softwareCtx =
listField "haskellPages" (postCtx language) (return haskellPages) <> listField "haskellPages" (postCtx lang) (return haskellPages) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -335,7 +339,7 @@ main = hakyll $ do
equipment <- loadAll $ (fromGlob ("pages/" ++ lang ++ "/plamo/equipment/*")) equipment <- loadAll $ (fromGlob ("pages/" ++ lang ++ "/plamo/equipment/*"))
let equipmentCtx = let equipmentCtx =
listField "equipment" (postCtx language) (return equipment) <> listField "equipment" (postCtx lang) (return equipment) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -393,8 +397,8 @@ main = hakyll $ do
let indexCtx = let indexCtx =
-- (<> is the modern version of `mappend`.) -- (<> is the modern version of `mappend`.)
listField "posts" (postCtx language) (return posts) <> listField "posts" (postCtx lang) (return posts) <>
listField "events" (postCtx language) (return events) <> listField "events" (postCtx lang) (return events) <>
langDict lang <> langDict lang <>
defaultContext defaultContext
@ -413,29 +417,69 @@ staticPageContext =
langDict "en" <> langDict "en" <>
defaultContext defaultContext
formatDate :: String -> String localeFor :: String -> TimeLocale
formatDate s = localeFor "nl" = dutchLocale
localeFor "jp" = japaneseLocale
localeFor _ = defaultTimeLocale
dutchLocale :: TimeLocale
dutchLocale = defaultTimeLocale
{ months =
[ ("januari", "jan"), ("februari", "feb"), ("maart", "mrt")
, ("april", "apr"), ("mei", "mei"), ("juni", "jun")
, ("juli", "jul"), ("augustus", "aug"), ("september", "sep")
, ("oktober", "okt"), ("november", "nov"), ("december", "dec")
]
}
japaneseLocale :: TimeLocale
japaneseLocale = defaultTimeLocale
{ months =
[ ("1月","1月"), ("2月","2月"), ("3月","3月")
, ("4月","4月"), ("5月","5月"), ("6月","6月")
, ("7月","7月"), ("8月","8月"), ("9月","9月")
, ("10月","10月"), ("11月","11月"), ("12月","12月")
]
}
formatStringFor :: String -> String
formatStringFor "en" = "%e %B %Y"
formatStringFor "nl" = "%e %B %Y"
formatStringFor "jp" = "%Y年 %m月 %e日"
formatStringFor _ = "%e %B %Y"
formatDate :: String -> String -> String
formatDate lang s =
case parseTimeM True defaultTimeLocale "%Y-%m-%d" s :: Maybe Day of case parseTimeM True defaultTimeLocale "%Y-%m-%d" s :: Maybe Day of
Just day -> formatTime defaultTimeLocale "%e %B %Y" day Just day -> formatTime (localeFor lang) (formatStringFor lang) day
Nothing -> s Nothing -> s
postCtx :: Maybe String -> Context String postCtx :: String -> Context String
postCtx language = postCtx language =
let lang = fromMaybe "en" language let
in -- Custom field for formatted date
formattedDateField :: Context String
formattedDateField = field "formatted_date" $ \item -> do
-- Get the metadata for this item
meta <- getMetadata (itemIdentifier item)
let mDate = lookupString "date" meta
return $ maybe "" (formatDate language) mDate
in -- Keep the original "date" field.
dateField "date" "%e %B %Y" <> dateField "date" "%e %B %Y" <>
constField "language" lang <> constField "language" language <>
langDict lang <> formattedDateField <>
langDict language <>
defaultContext defaultContext
kitCtx :: Context String kitCtx :: String -> Context String
kitCtx = kitCtx language =
(field "formatted_purchase_date" $ \item -> do (field "formatted_purchase_date" $ \item -> do
metadata <- getMetadata (itemIdentifier item) metadata <- getMetadata (itemIdentifier item)
let purchaseDateValue = lookupString "purchase_date" metadata let purchaseDateValue = lookupString "purchase_date" metadata
return $ maybe "" formatDate purchaseDateValue return $ maybe "" (formatDate language) purchaseDateValue
) )
<> postCtx Nothing <> (postCtx language)
isUpcoming :: UTCTime -> Item a -> Compiler Bool isUpcoming :: UTCTime -> Item a -> Compiler Bool
isUpcoming cutoff item = do isUpcoming cutoff item = do

View File

@ -1,6 +1,6 @@
<article> <article>
<section class="header"> <section class="header">
Posted on $date$ Posted on $formatted_date$
$if(author)$ $if(author)$
by $author$ by $author$
$endif$ $endif$

View File

@ -1,7 +1,7 @@
<ul> <ul>
$for(events)$ $for(events)$
<li> <li>
$date$ - <a href="$url$">$title$</a> $formatted_date$ - <a href="$url$">$title$</a>
</li> </li>
$endfor$ $endfor$
</ul> </ul>

View File

@ -1,7 +1,7 @@
<article> <article>
<section class="header"> <section class="header">
<a href="/$language$/plamo.html" class="back-link">$text-plamo-back$</a><br/> <a href="/$language$/plamo.html" class="back-link">$text-plamo-back$</a><br/>
<span class="text-body-secondary">Posted on: $date$</span> <span class="text-body-secondary">Posted on: $formatted_date$</span>
</section> </section>
<section> <section>
<hr/> <hr/>

View File

@ -9,7 +9,7 @@
<div class="col-6 col-md-8"> <div class="col-6 col-md-8">
<div class="card-body"> <div class="card-body">
<p class="card-text fs-xs-smaller"> <p class="card-text fs-xs-smaller">
<em class="text-body-secondary">$date$</em><br/> <em class="text-body-secondary">$formatted_date$</em><br/>
$model_name$<br/> $model_name$<br/>
<span class="badge rounded-pill text-bg-secondary ms-4 text-center">$scale$</span><br/> <span class="badge rounded-pill text-bg-secondary ms-4 text-center">$scale$</span><br/>
$if(series)$ $if(series)$

View File

@ -1,7 +1,7 @@
<ul> <ul>
$for(posts)$ $for(posts)$
<li> <li>
<a href="$url$">$title$</a> - $date$ <a href="$url$">$title$</a> - $formatted_date$
</li> </li>
$endfor$ $endfor$
</ul> </ul>

View File

@ -1,6 +1,6 @@
<article> <article>
<section class="header"> <section class="header">
Posted on $date$ Posted on $formatted_date$
$if(author)$ $if(author)$
by $author$ by $author$
$endif$ $endif$

View File

@ -1,7 +1,7 @@
<article> <article>
<section class="header"> <section class="header">
<a href="/$language$/radio.html" class="back-link">$text-radio-back$</a><br/> <a href="/$language$/radio.html" class="back-link">$text-radio-back$</a><br/>
Posted on $date$ Posted on $formatted_date$
</section> </section>
<section> <section>
$body$ $body$

View File

@ -1,7 +1,7 @@
<ul> <ul>
$for(posts)$ $for(posts)$
<li> <li>
<a href="$url$">$title$</a> - $date$ $formatted_date$ - <a href="$url$">$title$</a>
</li> </li>
$endfor$ $endfor$
</ul> </ul>