@@ -12,34 +12,29 @@ use fs_manager_language::{
1212 DateFormat , FormatVariant , HasFlag , Language , LanguageManager , LocaleSettings , NumberFormat ,
1313 TimeFormat ,
1414} ;
15- use fs_store:: { LocaleEntry , Manifest , StoreClient } ;
15+ use fs_store:: StoreReader ;
1616use serde:: Deserialize ;
1717
1818use crate :: translation_editor:: TranslationEditor ;
1919
2020// ── Store catalog helper ─────────────────────────────────────────────────────
2121
22- #[ derive( Deserialize ) ]
23- struct MinPkg {
24- id : String ,
25- name : String ,
26- version : String ,
27- category : String ,
22+ /// A single locale entry from the Store's locale catalog.
23+ #[ derive( Debug , Clone , Deserialize ) ]
24+ pub struct LocaleEntry {
25+ pub code : String ,
26+ pub name : String ,
27+ pub version : String ,
28+ pub completeness : u8 ,
29+ pub direction : String ,
30+ pub path : Option < String > ,
2831}
2932
30- impl Manifest for MinPkg {
31- fn id ( & self ) -> & str {
32- & self . id
33- }
34- fn name ( & self ) -> & str {
35- & self . name
36- }
37- fn version ( & self ) -> & str {
38- & self . version
39- }
40- fn category ( & self ) -> & str {
41- & self . category
42- }
33+ /// TOML structure of the locale catalog file in the Store.
34+ #[ derive( Deserialize ) ]
35+ struct LocaleCatalog {
36+ #[ serde( default ) ]
37+ locales : Vec < LocaleEntry > ,
4338}
4439
4540// ── Public types ─────────────────────────────────────────────────────────────
@@ -167,7 +162,7 @@ async fn install_language_pack(locale: LocaleInfo) -> Result<(), String> {
167162 . unwrap_or_else ( || format ! ( "Node/i18n/{}" , locale. code) ) ;
168163 let url = format ! ( "{base}/ui.toml" ) ;
169164
170- let file_path = match StoreClient :: node_store ( ) . fetch_raw ( & url) . await {
165+ let file_path = match StoreReader :: official ( ) . fetch_raw ( & url) . await {
171166 Ok ( content) => {
172167 let dest = fs_dir. join ( "i18n" ) . join ( & locale. code ) . join ( "ui.toml" ) ;
173168 if let Some ( p) = dest. parent ( ) {
@@ -266,8 +261,8 @@ pub fn LanguageSettings() -> Element {
266261 } ,
267262 // Right-click removes a non-builtin language.
268263 on_context_menu: {
269- let mut installed = installed. clone ( ) ;
270- let mut panel_sig = panel. clone ( ) ;
264+ let mut installed = installed;
265+ let mut panel_sig = panel;
271266 move |id: String | {
272267 let is_builtin = BUILTIN_LANGUAGES . iter( ) . any( |( c, _) | * c == id. as_str( ) ) ;
273268 if !is_builtin {
@@ -297,7 +292,7 @@ pub fn LanguageSettings() -> Element {
297292 LanguageDetailPane {
298293 entry: e,
299294 on_edit: {
300- let mut el = editor_lang. clone ( ) ;
295+ let mut el = editor_lang;
301296 move |pair| el. set( Some ( pair) )
302297 } ,
303298 }
@@ -312,7 +307,7 @@ pub fn LanguageSettings() -> Element {
312307 InstallPane {
313308 installed_ids: installed. read( ) . iter( ) . map( |e| e. code. clone( ) ) . collect( ) ,
314309 on_installed: {
315- let mut installed = installed. clone ( ) ;
310+ let mut installed = installed;
316311 move |entry: LangEntry | installed. write( ) . push( entry)
317312 } ,
318313 }
@@ -391,7 +386,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
391386 color: white; border: none; \
392387 border-radius: var(--fs-radius-md); cursor: pointer;",
393388 onclick: {
394- let mut inv = inv. clone ( ) ;
389+ let mut inv = inv;
395390 move |_| {
396391 let code = selected. read( ) . clone( ) ;
397392 // Load user-installed pack from disk before switching.
@@ -456,7 +451,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
456451 value: inv. read( ) . fallback_language. clone( )
457452 . unwrap_or_else( || effective. fallback_language. clone( ) ) ,
458453 onchange: {
459- let mut inv = inv. clone ( ) ;
454+ let mut inv = inv;
460455 move |e: Event <FormData >| {
461456 inv. write( ) . fallback_language = Some ( e. value( ) ) ;
462457 let _ = inv. read( ) . save_inventory( ) ;
@@ -493,7 +488,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
493488 if is_active { "white" } else { "var(--fs-color-text-primary)" } ,
494489 ) ,
495490 onclick: {
496- let mut inv = inv. clone ( ) ;
491+ let mut inv = inv;
497492 let f2 = f. clone( ) ;
498493 move |_| {
499494 inv. write( ) . date_format = Some ( f2. clone( ) ) ;
@@ -537,7 +532,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
537532 if is_active { "white" } else { "var(--fs-color-text-primary)" } ,
538533 ) ,
539534 onclick: {
540- let mut inv = inv. clone ( ) ;
535+ let mut inv = inv;
541536 let f2 = f. clone( ) ;
542537 move |_| {
543538 inv. write( ) . time_format = Some ( f2. clone( ) ) ;
@@ -578,7 +573,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
578573 if is_active { "white" } else { "var(--fs-color-text-primary)" } ,
579574 ) ,
580575 onclick: {
581- let mut inv = inv. clone ( ) ;
576+ let mut inv = inv;
582577 let f2 = f. clone( ) ;
583578 move |_| {
584579 inv. write( ) . number_format = Some ( f2. clone( ) ) ;
@@ -607,7 +602,7 @@ fn DefaultPane(installed: Vec<LangEntry>) -> Element {
607602 checked: inv. read( ) . auto_update_packs
608603 . unwrap_or( effective. auto_update_packs) ,
609604 onchange: {
610- let mut inv = inv. clone ( ) ;
605+ let mut inv = inv;
611606 move |e: Event <FormData >| {
612607 inv. write( ) . auto_update_packs = Some ( e. value( ) == "true" ) ;
613608 let _ = inv. read( ) . save_inventory( ) ;
@@ -768,7 +763,7 @@ fn LangEditPane(entry: LangEntry, on_edit: EventHandler<(String, String)>) -> El
768763 let contrib =
769764 use_signal ( || GitContributorCheck :: cached ( ) . unwrap_or ( ContributorStatus :: Unknown ) ) ;
770765 {
771- let mut contrib = contrib. clone ( ) ;
766+ let mut contrib = contrib;
772767 use_future ( move || async move {
773768 if * contrib. read ( ) == ContributorStatus :: Unknown {
774769 contrib. set ( GitContributorCheck :: check_and_cache ( ) ) ;
@@ -840,7 +835,7 @@ fn LangEditPane(entry: LangEntry, on_edit: EventHandler<(String, String)>) -> El
840835 border-radius: var(--fs-radius-sm); cursor: pointer; \
841836 color: var(--fs-color-text-muted); white-space: nowrap;",
842837 onclick: {
843- let mut contrib = contrib. clone ( ) ;
838+ let mut contrib = contrib;
844839 move |_| {
845840 GitContributorCheck :: clear_cache( ) ;
846841 contrib. set( ContributorStatus :: Unknown ) ;
@@ -1024,12 +1019,11 @@ fn AvailableLanguages(
10241019 let busy: Signal < Option < String > > = use_signal ( || None ) ;
10251020
10261021 {
1027- let all_locales = all_locales. clone ( ) ;
10281022 use_future ( move || {
1029- let mut all_locales = all_locales. clone ( ) ;
1023+ let mut all_locales = all_locales;
10301024 async move {
1031- match StoreClient :: node_store ( )
1032- . fetch_catalog :: < MinPkg > ( "Node" , false )
1025+ match StoreReader :: official ( )
1026+ . fetch_toml :: < LocaleCatalog > ( "Node/locale-catalog.toml" )
10331027 . await
10341028 {
10351029 Ok ( catalog) => {
@@ -1090,14 +1084,14 @@ fn AvailableLanguages(
10901084 locale: locale. clone( ) ,
10911085 installing: busy. read( ) . as_deref( ) == Some ( locale. code. as_str( ) ) ,
10921086 on_install: {
1093- let mut busy = busy. clone ( ) ;
1087+ let mut busy = busy;
10941088 move |l: LocaleInfo | {
10951089 let id = l. code. clone( ) ;
10961090 let name = l. name. clone( ) ;
10971091 busy. set( Some ( id. clone( ) ) ) ;
1098- let mut busy = busy. clone ( ) ;
1092+ let mut busy = busy;
10991093 let entry = LangEntry { code: id. clone( ) , name, builtin: false } ;
1100- let cb = on_installed. clone ( ) ;
1094+ let cb = on_installed;
11011095 spawn( async move {
11021096 match install_language_pack( l) . await {
11031097 Ok ( ( ) ) => cb. call( entry) ,
0 commit comments