Skip to content

Commit

Permalink
Merge pull request #6902 from csbisa/multi-language
Browse files Browse the repository at this point in the history
Support for translated card data
  • Loading branch information
NoahTheDuke authored Jul 30, 2023
2 parents 7687d0e + be9b3ba commit a41924c
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 29 deletions.
3 changes: 2 additions & 1 deletion src/clj/web/api.clj
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@
["/cards"
["" {:get data/cards-handler}]
["/version" {:get data/cards-version-handler}]
["/altarts" {:get data/alt-arts-handler}]]
["/altarts" {:get data/alt-arts-handler}]
["/lang/:lang" {:get data/lang-handler}]]
["/news" {:get data/news-handler}]
["/sets" {:get data/sets-handler}]
["/mwl" {:get data/mwl-handler}]
Expand Down
9 changes: 9 additions & 0 deletions src/clj/web/data.clj
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@
(defn cards-handler [{db :system/db}]
(response 200 (enriched-cards db)))

(defn- validate-lang
[lang]
(contains? #{"de" "es" "fr" "it" "ja" "ko" "pl" "zh"} lang))

(defn lang-handler [{db :system/db {lang :lang} :path-params}]
(if (validate-lang lang)
(response 200 (map #(dissoc % :_id) (mc/find-maps db (str "cards-" lang))))
(response 200 {})))

(defn alt-arts-handler [{db :system/db}]
(response 200 (map #(dissoc % :_id) (mc/find-maps db "altarts"))))

Expand Down
28 changes: 21 additions & 7 deletions src/cljs/nr/cardbrowser.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[nr.account :refer [alt-art-name]]
[nr.ajax :refer [GET]]
[nr.appstate :refer [app-state]]
[nr.translations :refer [tr tr-faction tr-format tr-side tr-sort tr-type]]
[nr.translations :refer [tr tr-faction tr-format tr-side tr-sort tr-type tr-data]]
[nr.utils :refer [banned-span deck-points-card-span faction-icon
format->slug get-image-path image-or-face influence-dots
non-game-toast render-icons restricted-span rotated-span set-scroll-top slug->format
Expand All @@ -23,6 +23,7 @@
(declare generate-flip-cards)
(declare insert-starter-info)
(declare insert-starter-ids)
(declare merge-localized-data)

(defn- format-card-key->string
[format]
Expand All @@ -32,13 +33,19 @@
{} (:cards format))))

(go (let [server-version (get-in (<! (GET "/data/cards/version")) [:json :version])
lang (get-in @app-state [:options :language] "en")
local-cards (js->clj (.parse js/JSON (.getItem js/localStorage "cards")) :keywordize-keys true)
need-update? (or (not local-cards) (not= server-version (:version local-cards)))
need-update? (or (not local-cards)
(not= server-version (:version local-cards))
(not= lang (:lang local-cards)))
latest-cards (if need-update?
(:json (<! (GET "/data/cards")))
(:cards local-cards))
localized-data (if (not= lang "en")
(:json (<! (GET (str "/data/cards/lang/" lang)))))
cards (->> latest-cards
(insert-starter-ids)
(merge-localized-data localized-data)
(sort-by :code))
sets (:json (<! (GET "/data/sets")))
cycles (:json (<! (GET "/data/cycles")))
Expand All @@ -59,7 +66,7 @@
(reset! cards/cycles cycles)
(swap! app-state assoc :sets sets :cycles cycles)
(when need-update?
(.setItem js/localStorage "cards" (.stringify js/JSON (clj->js {:cards cards :version server-version}))))
(.setItem js/localStorage "cards" (.stringify js/JSON (clj->js {:cards cards :version server-version :lang lang}))))
(reset! all-cards (into {} (map (juxt :title identity) (sort-by :code cards))))
(swap! app-state assoc
:cards-loaded true
Expand All @@ -68,6 +75,12 @@
:alt-info alt-info)
(put! cards-channel cards)))

(defn- merge-localized-data
[localized-data cards]
(let [localized-data-indexed (into {} (map (juxt :code identity) localized-data))]
(map #(assoc % :localized (dissoc (localized-data-indexed (:code %)) :code))
cards)))

(defn- insert-starter-info
[card]
(-> card
Expand Down Expand Up @@ -287,7 +300,7 @@
(defn card-as-text
"Generate text html representation a card"
[card show-extra-info]
(let [title (:title card)
(let [title (tr-data :title card)
icon (faction-icon (:faction card) title)
uniq (when (:uniqueness card) "")]
[:div
Expand Down Expand Up @@ -319,7 +332,7 @@
[:div.text.card-body
[:p [:span.type (tr-type (:type card))]
(if (empty? (:subtype card)) "" (str ": " (:subtype card)))]
[:pre (render-icons (:text (get @all-cards (:title card))))]
[:pre (render-icons (tr-data :text (get @all-cards (:title card))))]

(when show-extra-info
[:<>
Expand All @@ -328,7 +341,7 @@
(let [status (get-in card [:format (keyword k)] "unknown")
c (text-class-for-status status)]
^{:key k}
[:div.format-item {:class c} name
[:div.format-item {:class c} (tr-format name)
(cond (:banned status) banned-span
(:restricted status) restricted-span
(:rotated status) rotated-span
Expand Down Expand Up @@ -398,6 +411,7 @@
cards
(let [lcquery (s/lower-case query)]
(filter #(or (s/includes? (s/lower-case (:title %)) lcquery)
(s/includes? (s/lower-case (tr-data :title %)) lcquery)
(s/includes? (:normalizedtitle %) lcquery))
cards))))

Expand Down Expand Up @@ -438,7 +452,7 @@
[card-as-text card true]
(when-let [url (base-image-url card)]
[:img {:src url
:alt (:title card)
:alt (tr-data :title card)
:onError #(-> (swap! cv assoc :show-text true))
:onLoad #(-> % .-target js/$ .show)}]))])))

Expand Down
30 changes: 16 additions & 14 deletions src/cljs/nr/deckbuilder.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
[nr.auth :refer [authenticated] :as auth]
[nr.cardbrowser :refer [cards-channel factions filter-title image-url] :as cb]
[nr.deck-status :refer [deck-status-span]]
[nr.translations :refer [tr tr-faction tr-format tr-side tr-type]]
[nr.translations :refer [tr tr-faction tr-format tr-side tr-type tr-data]]
[nr.utils :refer [alliance-dots banned-span cond-button
deck-points-card-span dots-html format->slug format-date-time
influence-dot influence-dots mdy-formatter non-game-toast num->percent
Expand Down Expand Up @@ -96,7 +96,7 @@
(if (empty? title)
{:display-name "Missing Identity"}
(let [card (lookup side {:title title})]
(assoc card :display-name (build-identity-name title setname)))))
(assoc card :display-name (build-identity-name (tr-data :title card) setname)))))

(defn add-params-to-card
"Add art and id parameters to a card hash"
Expand Down Expand Up @@ -192,10 +192,12 @@
[all-titles card]
(let [card-title (:title card)
indexes (keep-indexed #(if (= %2 card-title) %1 nil) all-titles)
dups (> (count indexes) 1)]
dups (> (count indexes) 1)
display-title (tr-data :title card)
setname (:setname card)]
(if dups
(assoc card :display-name (str (:title card) " (" (:setname card) ")"))
(assoc card :display-name (:title card)))))
(assoc card :display-name (str display-title " (" setname ")"))
(assoc card :display-name display-title))))

(defn- insert-params
"Add card parameters into the string representation"
Expand Down Expand Up @@ -532,8 +534,8 @@
(swap! card-state assoc :query (.. e -target -textContent))
(swap! card-state assoc :selected i)
nil)
:key (:title (nth matches i))}
(:title (nth matches i))]))])))]])))
:key (tr-data :title (nth matches i))}
(tr-data :title (nth matches i))]))])))]])))

(defn deck-name
([deck] (deck-name deck 40))
Expand Down Expand Up @@ -572,7 +574,7 @@
[deck-status-span deck]
[:p (deck-date deck)]]
[:h4 (deck-name deck)]
[:span (get-in deck [:identity :title])]
[:span (tr-data :title (:identity deck))]
[deck-stats-line deck]]))

(def all-sides-filter "Any Side")
Expand Down Expand Up @@ -642,7 +644,7 @@
"Make the view of a single line in the deck - returns a span"
[{:keys [identity cards format] :as deck} {:keys [qty card] :as line}]
[:span qty " "
(if-let [title (:title card)]
(if-let [title (tr-data :title card)]
(let [infaction (no-inf-cost? identity card)
card-status (format-status format card)
banned (:banned card-status)
Expand Down Expand Up @@ -670,7 +672,7 @@
(defn line-name-span
"Make the view of a single line in the deck - returns a span"
[{:keys [identity cards format] :as deck} {:keys [qty card] :as line}]
[:span (if-let [name (:title card)]
[:span (if-let [name (tr-data :title card)]
(let [infaction (no-inf-cost? identity card)
card-status (format-status format card)
banned (:banned card-status)
Expand Down Expand Up @@ -721,7 +723,7 @@
(let [id (:identity deck)]
[:div.header
[:img {:src (image-url id)
:alt (:title id)}]
:alt (tr-data :title id)}]
[:div.header-text
[:h4 {:class (str "fake-link"
(let [status (format-status (:format deck) id)]
Expand All @@ -731,7 +733,7 @@
:art (:art id)
:id (:id id)})
:on-mouse-leave #(put! zoom-channel false) }
(:title id)
(tr-data :title id)
(let [status (format-status (:format deck) id)]
(cond (:banned status) banned-span
(:restricted status) restricted-span
Expand Down Expand Up @@ -884,7 +886,7 @@

(defn- identity-option-string
[card]
(.stringify js/JSON (clj->js {:title (:title card)
(.stringify js/JSON (clj->js {:title (tr-data :title card)
:id (:code card)})))

(defn- create-identity
Expand Down Expand Up @@ -1002,7 +1004,7 @@
(when-let [url (image-url card)]
[:div.card-preview.blue-shade
[:img {:src url
:alt (:title card)}]]))
:alt (tr-data :title card)}]]))

(defn list-panel
[s user decks decks-loaded scroll-top]
Expand Down
3 changes: 3 additions & 0 deletions src/cljs/nr/translations.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2941,3 +2941,6 @@
(def tr-lobby (partial tr-string "lobby"))
(def tr-pronouns (partial tr-string "pronouns"))
(def tr-watch-join (partial tr-string "lobby"))

(defn tr-data [key data]
(or (get-in data [:localized key]) (key data)))
21 changes: 14 additions & 7 deletions src/cljs/nr/utils.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
[goog.string :as gstring]
[goog.string.format]
[nr.appstate :refer [app-state]]
[nr.translations :refer [tr-data]]
[reagent.dom :as rd]))

;; Dot definitions
Expand Down Expand Up @@ -194,12 +195,18 @@
"A sequence of card pattern pairs consisting of a regex, used to match a card
name in text, and the span fragment that should replace it"
[]
(letfn [(span-of [title] [:span {:class "fake-link" :data-card-title title} title])]
(->> (:all-cards-and-flips @app-state)
(vals)
(remove :replaced_by)
(map (fn [c] [(:title c) (span-of (:title c))]))
(sort-by (comp count str first) >))))
(letfn [(span-of [title tr-title] [:span {:class "fake-link" :data-card-title title} tr-title])]
(distinct (concat
(->> (:all-cards-and-flips @app-state)
(vals)
(remove :replaced_by)
(map (fn [c] [(:title c) (span-of (:title c) (:title c))]))
(sort-by (comp count str first) >))
(->> (:all-cards-and-flips @app-state)
(vals)
(remove :replaced_by)
(map (fn [c] [(tr-data :title c) (span-of (:title c) (tr-data :title c))]))
(sort-by (comp count str first) >))))))

(def card-patterns (memoize card-patterns-impl))

Expand All @@ -211,7 +218,7 @@
(->> (:all-cards-and-flips @app-state)
(vals)
(filter #(not (:replaced_by %)))
(map (fn [k] (regex-escape (:title k))))
(map (fn [k] (join "|" (map regex-escape (distinct [(:title k) (tr-data :title k)])))))
(join "|"))))

(def contains-card-pattern (memoize contains-card-pattern-impl))
Expand Down

0 comments on commit a41924c

Please sign in to comment.