Merge pull request #22 from DeveloperPaul123/feature/language-support

Add multi-langauge support
This commit is contained in:
Paul T
2024-04-15 13:05:34 -07:00
committed by GitHub
9 changed files with 70 additions and 7 deletions

View File

@@ -79,6 +79,22 @@ Documentation for this template is published with each commit. See the attached
| ![Resume](assets/images/resume.png) | ![Cover Letter](assets/images/coverletter.png) | | ![Resume](assets/images/resume.png) | ![Cover Letter](assets/images/coverletter.png) |
| ![Resume 2](assets/images/resume2.png) | ![Cover Letter 2](assets/images/coverletter2.png)| | ![Resume 2](assets/images/resume2.png) | ![Cover Letter 2](assets/images/coverletter2.png)|
## Building and Testing Locally
To build and test the project locally, you will need to install the `typst` CLI. You can find instructions on how to do this [here](https://typst.app/docs/getting-started).
With typst installed you can make changes to `lib.typ` and then `install_package_locally.ps1` to install the package locally. Change the import statements in the template files to point to the local package:
```typst
#import "@local/modern-cv:0.3.0": *
````
Note that the script parses the `typst.toml` to determine the version number and the folder the local files are installed to.
### Formatting
This project uses [typstyle](https://github.com/Enter-tainer/typstyle) to format the code. The script `format_typst.ps1` will format all the `*.typ` files in the project. Be sure to install `typstyle` before running the script.
## License ## License
The project is licensed under the MIT license. See [LICENSE](LICENSE) for more details. The project is licensed under the MIT license. See [LICENSE](LICENSE) for more details.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 210 KiB

30
lang.toml Normal file
View File

@@ -0,0 +1,30 @@
[conf]
default-lang = "en"
[lang.en]
resume = "Résumé"
dear = "Dear"
cover-letter = "Cover Letter"
attached = "Attached"
curriculum-vitae = "Curriculum Vitae"
[lang.de]
resume = "Lebenslauf"
dear = "Sehr geehrte"
cover-letter = "Anschreiben"
attached = "Angehängt"
curriculum-vitae = "Lebenslauf"
[lang.gr]
resume = "Βιογραφικό"
dear = "Αγαπητέ"
cover-letter = "Συνοδευτική Επιστολή"
attached = "Συνημμένο"
curriculum-vitae = "Βιογραφικό"
[lang.sp]
resume = "Currículum"
dear = "Estimado"
cover-letter = "Carta de Presentación"
attached = "Adjunto"
curriculum-vitae = "Currículum"

28
lib.typ
View File

@@ -1,4 +1,5 @@
#import "@preview/fontawesome:0.1.0": * #import "@preview/fontawesome:0.1.0": *
#import "@preview/linguify:0.4.0": *
// const color // const color
#let color-darknight = rgb("#131A28") #let color-darknight = rgb("#131A28")
@@ -126,6 +127,7 @@
/// - date (string): The date the resume was created /// - date (string): The date the resume was created
/// - accent-color (color): The accent color of the resume /// - accent-color (color): The accent color of the resume
/// - colored-headers (boolean): Whether the headers should be colored or not /// - colored-headers (boolean): Whether the headers should be colored or not
/// - language (string): The language of the resume, defaults to "en". See lang.toml for available languages
/// - body (content): The body of the resume /// - body (content): The body of the resume
/// -> none /// -> none
#let resume( #let resume(
@@ -133,12 +135,15 @@
date: datetime.today().display("[month repr:long] [day], [year]"), date: datetime.today().display("[month repr:long] [day], [year]"),
accent-color: default-accent-color, accent-color: default-accent-color,
colored-headers: true, colored-headers: true,
language: "en",
body, body,
) = { ) = {
if type(accent-color) == "string" { if type(accent-color) == "string" {
accent-color = rgb(accent-color) accent-color = rgb(accent-color)
} }
let lang_data = toml("lang.toml")
set document( set document(
author: author.firstname + " " + author.lastname, author: author.firstname + " " + author.lastname,
title: "resume", title: "resume",
@@ -146,7 +151,7 @@
set text( set text(
font: ("Source Sans Pro"), font: ("Source Sans Pro"),
lang: "en", lang: language,
size: 11pt, size: 11pt,
fill: color-darkgray, fill: color-darkgray,
fallback: true, fallback: true,
@@ -167,7 +172,7 @@
#author.firstname #author.firstname
#author.lastname #author.lastname
#sym.dot.c #sym.dot.c
#"Résumé" #linguify("resume", from: lang_data)
] ]
][ ][
#counter(page).display() #counter(page).display()
@@ -410,20 +415,24 @@
profile-picture: image, profile-picture: image,
date: datetime.today().display("[month repr:long] [day], [year]"), date: datetime.today().display("[month repr:long] [day], [year]"),
accent-color: default-accent-color, accent-color: default-accent-color,
language: "en",
body, body,
) = { ) = {
if type(accent-color) == "string" { if type(accent-color) == "string" {
accent-color = rgb(accent-color) accent-color = rgb(accent-color)
} }
// language data
let lang_data = toml("lang.toml")
set document( set document(
author: author.firstname + " " + author.lastname, author: author.firstname + " " + author.lastname,
title: "resume", title: "cover-letter",
) )
set text( set text(
font: ("Source Sans Pro"), font: ("Source Sans Pro"),
lang: "en", lang: language,
size: 11pt, size: 11pt,
fill: color-darkgray, fill: color-darkgray,
fallback: true, fallback: true,
@@ -444,7 +453,7 @@
#author.firstname #author.firstname
#author.lastname #author.lastname
#sym.dot.c #sym.dot.c
#"Cover Letter" #linguify("cover-letter", from: lang_data)
] ]
][ ][
#counter(page).display() #counter(page).display()
@@ -594,7 +603,10 @@
#pad(bottom: 2em)[ #pad(bottom: 2em)[
#text(weight: "light")[Sincerely,] \ #text(weight: "light")[Sincerely,] \
#text(weight: "bold")[#author.firstname #author.lastname] \ \ #text(weight: "bold")[#author.firstname #author.lastname] \ \
#text(weight: "light", style: "italic")[Attached: Curriculum Vitae] #text(weight: "light", style: "italic")[ #linguify(
"attached",
from: lang_data,
)#sym.colon #linguify("curriculum-vitae", from: lang_data)]
] ]
] ]
} }
@@ -635,13 +647,15 @@
/// - job-position (string): The job position you are applying for /// - job-position (string): The job position you are applying for
/// - addressee (string): The person you are addressing the letter to /// - addressee (string): The person you are addressing the letter to
#let letter-heading(job-position: "", addressee: "") = { #let letter-heading(job-position: "", addressee: "") = {
let lang_data = toml("lang.toml")
// TODO: Make this adaptable to content // TODO: Make this adaptable to content
underline(evade: false, stroke: 0.5pt, offset: 0.3em)[ underline(evade: false, stroke: 0.5pt, offset: 0.3em)[
#text(weight: "bold", size: 12pt)[Job Application for #job-position] #text(weight: "bold", size: 12pt)[Job Application for #job-position]
] ]
pad(top: 1em, bottom: 1em)[ pad(top: 1em, bottom: 1em)[
#text(weight: "light", fill: color-gray)[ #text(weight: "light", fill: color-gray)[
Dear #addressee, #linguify("dear", from: lang_data) #addressee,
] ]
] ]
} }

View File

@@ -15,6 +15,7 @@
), ),
), ),
profile-picture: image("./profile.png"), profile-picture: image("./profile.png"),
language: "en",
) )
#hiring-entity-info(entity-info: ( #hiring-entity-info(entity-info: (

View File

@@ -15,6 +15,7 @@
), ),
), ),
profile-picture: none, profile-picture: none,
language: "en"
) )
#hiring-entity-info(entity-info: ( #hiring-entity-info(entity-info: (

View File

@@ -16,6 +16,7 @@
), ),
), ),
date: datetime.today().display(), date: datetime.today().display(),
language: "en",
colored-headers: true, colored-headers: true,
) )