@@ -253,37 +253,26 @@ impl Config {
253
253
self . get ( & key) . and_then ( Value :: as_table)
254
254
}
255
255
256
- /// Get the source directory of a localized book corresponding to language ident `index` .
257
- pub fn get_localized_src_path < I : AsRef < str > > ( & self , index : Option < I > ) -> Result < PathBuf > {
256
+ /// Gets the language configured for a book.
257
+ pub fn get_language < I : AsRef < str > > ( & self , index : Option < I > ) -> Result < Option < String > > {
258
258
match self . language . default_language ( ) {
259
259
// Languages have been specified, assume directory structure with
260
260
// language subfolders.
261
- Some ( default) => match index {
261
+ Some ( ref default) => match index {
262
262
// Make sure that the language we passed was actually
263
263
// declared in the config, and return `None` if not.
264
264
Some ( lang_ident) => match self . language . 0 . get ( lang_ident. as_ref ( ) ) {
265
- Some ( _) => {
266
- let mut buf = PathBuf :: new ( ) ;
267
- buf. push ( self . book . src . clone ( ) ) ;
268
- buf. push ( lang_ident. as_ref ( ) ) ;
269
- Ok ( buf)
270
- }
265
+ Some ( _) => Ok ( Some ( lang_ident. as_ref ( ) . into ( ) ) ) ,
271
266
None => Err ( anyhow ! (
272
267
"Expected [language.{}] to be declared in book.toml" ,
273
268
lang_ident. as_ref( )
274
269
) ) ,
275
270
} ,
276
271
// Use the default specified in book.toml.
277
- None => {
278
- let mut buf = PathBuf :: new ( ) ;
279
- buf. push ( self . book . src . clone ( ) ) ;
280
- buf. push ( default) ;
281
- Ok ( buf)
282
- }
272
+ None => Ok ( Some ( default. to_string ( ) ) ) ,
283
273
} ,
284
274
285
- // No default language was configured in book.toml. Preserve
286
- // backwards compatibility by just returning `src`.
275
+ // No default language was configured in book.toml.
287
276
None => match index {
288
277
// We passed in a language from the frontend, but the config
289
278
// offers no languages.
@@ -292,11 +281,63 @@ impl Config {
292
281
lang_ident. as_ref( )
293
282
) ) ,
294
283
// Default to previous non-localized behavior.
295
- None => Ok ( self . book . src . clone ( ) ) ,
284
+ None => Ok ( None ) ,
296
285
} ,
297
286
}
298
287
}
299
288
289
+ /// Get the source directory of a localized book corresponding to language ident `index`.
290
+ pub fn get_localized_src_path < I : AsRef < str > > ( & self , index : Option < I > ) -> Result < PathBuf > {
291
+ let language = self . get_language ( index) ?;
292
+
293
+ match language {
294
+ Some ( lang_ident) => {
295
+ let mut buf = PathBuf :: new ( ) ;
296
+ buf. push ( self . book . src . clone ( ) ) ;
297
+ buf. push ( lang_ident) ;
298
+ Ok ( buf)
299
+ }
300
+
301
+ // No default language was configured in book.toml. Preserve
302
+ // backwards compatibility by just returning `src`.
303
+ None => Ok ( self . book . src . clone ( ) ) ,
304
+ }
305
+ }
306
+
307
+ /// Gets the localized title of the book.
308
+ pub fn get_localized_title < I : AsRef < str > > ( & self , index : Option < I > ) -> Option < String > {
309
+ let language = self . get_language ( index) . unwrap ( ) ;
310
+
311
+ match language {
312
+ Some ( lang_ident) => self
313
+ . language
314
+ . 0
315
+ . get ( & lang_ident)
316
+ . unwrap ( )
317
+ . title
318
+ . clone ( )
319
+ . or ( self . book . title . clone ( ) ) ,
320
+ None => self . book . title . clone ( ) ,
321
+ }
322
+ }
323
+
324
+ /// Gets the localized description of the book.
325
+ pub fn get_localized_description < I : AsRef < str > > ( & self , index : Option < I > ) -> Option < String > {
326
+ let language = self . get_language ( index) . unwrap ( ) ;
327
+
328
+ match language {
329
+ Some ( lang_ident) => self
330
+ . language
331
+ . 0
332
+ . get ( & lang_ident)
333
+ . unwrap ( )
334
+ . description
335
+ . clone ( )
336
+ . or ( self . book . description . clone ( ) ) ,
337
+ None => self . book . description . clone ( ) ,
338
+ }
339
+ }
340
+
300
341
/// Get the fallback source directory of a book. If chapters/sections are
301
342
/// missing in a localization, any links to them will gracefully degrade to
302
343
/// the files that exist in this directory.
@@ -497,9 +538,9 @@ pub struct BookConfig {
497
538
pub description : Option < String > ,
498
539
/// Location of the book source relative to the book's root directory.
499
540
pub src : PathBuf ,
500
- /// Does this book support more than one language?
541
+ /// Does this book support more than one language? (Deprecated.)
501
542
pub multilingual : bool ,
502
- /// The main language of the book.
543
+ /// The main language of the book. (Deprecated.)
503
544
pub language : Option < String > ,
504
545
}
505
546
@@ -787,6 +828,12 @@ pub struct Language {
787
828
/// If true, this language is the default. There must be exactly one default
788
829
/// language in the config.
789
830
pub default : bool ,
831
+ /// Localized title of the book.
832
+ pub title : Option < String > ,
833
+ /// The authors of the translation.
834
+ pub authors : Option < Vec < String > > ,
835
+ /// Localized description of the book.
836
+ pub description : Option < String > ,
790
837
}
791
838
792
839
impl LanguageConfig {
@@ -873,8 +920,11 @@ mod tests {
873
920
name = "English"
874
921
default = true
875
922
876
- [language.fr]
877
- name = "Français"
923
+ [language.ja]
924
+ name = "日本語"
925
+ title = "なんかの本"
926
+ description = "何の役にも立たない本"
927
+ authors = ["Ruin0x11"]
878
928
"# ;
879
929
880
930
#[ test]
@@ -927,13 +977,19 @@ mod tests {
927
977
Language {
928
978
name : String :: from ( "English" ) ,
929
979
default : true ,
980
+ title : None ,
981
+ description : None ,
982
+ authors : None ,
930
983
} ,
931
984
) ;
932
985
language_should_be. 0 . insert (
933
- String :: from ( "fr " ) ,
986
+ String :: from ( "ja " ) ,
934
987
Language {
935
- name : String :: from ( "Français " ) ,
988
+ name : String :: from ( "日本語 " ) ,
936
989
default : false ,
990
+ title : Some ( String :: from ( "なんかの本" ) ) ,
991
+ description : Some ( String :: from ( "何の役にも立たない本" ) ) ,
992
+ authors : Some ( vec ! [ String :: from( "Ruin0x11" ) ] ) ,
937
993
} ,
938
994
) ;
939
995
0 commit comments