feat(dioxus): bump
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
This commit is contained in:
3240
Cargo.lock
generated
3240
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
23
Cargo.toml
23
Cargo.toml
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "athome"
|
name = "athome"
|
||||||
version = "0.4.1"
|
version = "0.2.0"
|
||||||
authors = ["Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>"]
|
authors = ["Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
@@ -8,28 +8,17 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
dioxus = { version = "0.6", features = ["fullstack", "router"] }
|
dioxus = { version = "0.7.0", features = ["fullstack", "router"] }
|
||||||
|
|
||||||
# Debug
|
# Debug
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
dioxus-logger = "0.6.0"
|
dioxus-logger = "0.7.0"
|
||||||
dioxus-i18n = "0.4.0"
|
dioxus-i18n = { git = "https://github.com/Kannen/dioxus-i18n/", branch = "main"}
|
||||||
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
|
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = ["web"]
|
||||||
web = ["dioxus/web"]
|
web = ["dioxus/web"]
|
||||||
desktop = ["dioxus/desktop"]
|
desktop = ["dioxus/desktop"]
|
||||||
|
mobile = ["dioxus/mobile"]
|
||||||
server = ["dioxus/server"]
|
server = ["dioxus/server"]
|
||||||
|
|
||||||
[profile]
|
|
||||||
|
|
||||||
[profile.wasm-dev]
|
|
||||||
inherits = "dev"
|
|
||||||
opt-level = 1
|
|
||||||
|
|
||||||
[profile.server-dev]
|
|
||||||
inherits = "dev"
|
|
||||||
|
|
||||||
[profile.android-dev]
|
|
||||||
inherits = "dev"
|
|
||||||
|
|||||||
@@ -61,15 +61,15 @@ cv_workexperience_ra_ude_description = Während meiner Tätigkeit bei der
|
|||||||
aufgebaut und verwaltet.
|
aufgebaut und verwaltet.
|
||||||
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
|
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
|
||||||
cv_workexperience_dd_devops_time = 2025 - Jetzt
|
cv_workexperience_dd_devops_time = 2025 - Jetzt
|
||||||
cv_workexperience_dd_devops_description = Als DevOps Engineer bei DextraData
|
cv_workexperience_dd_devops_description = Als DevOps Engineer war ich
|
||||||
bin ich für die Cloud-basierte Infrastruktur hinter den vielfältigen
|
verantwortlich für das Design, die Implementierung und die Wartung
|
||||||
SaaS-Produkten des Unternehmens verantwortlich. Ich arbeite eng mit
|
skalierbarer Infrastrukturlösungen in verschiedenen SaaS-Produktumgebungen.
|
||||||
Software-Entwicklern, Customer Success Managern und Customer Success Engineers
|
Dies umfasste die Standardisierung und Optimierung von CI/CD-Pipelines sowie
|
||||||
zusammen, um betriebliche Exzellenz und unterbrechungsfreie Servicebereitstellung
|
den Aufbau robuster Monitoring-Frameworks zur Gewährleistung hoher
|
||||||
für unsere Kunden zu gewährleisten, wobei ihre spezifischen Anforderungen im
|
Verfügbarkeit und Performance. Meine Arbeit konzentrierte sich auf einen
|
||||||
Vordergrund stehen. Ich verwalte Kubernetes-Cluster-Deployments, überwache
|
"Shift-Left"-Ansatz, der Entwicklungsteams durch Self-Service-Funktionen und
|
||||||
kontinuierlich Deployment-Gesundheitsmetriken und implementiere
|
optimierte operative Workflows befähigte, sowie auf die Verbesserung der
|
||||||
Infrastructure-as-Code-Lösungen.
|
Systemzuverlässigkeit und -sicherheit.
|
||||||
cv_socials_title = Profile
|
cv_socials_title = Profile
|
||||||
cv_education_title = Bildungsweg
|
cv_education_title = Bildungsweg
|
||||||
cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering
|
cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering
|
||||||
@@ -147,7 +147,7 @@ publications_projects_projects_athome_description = Diese Website ist eine mit
|
|||||||
impressum_on = Impressum
|
impressum_on = Impressum
|
||||||
component_under_construction = Diese Seite befindet sich gerade im Aufbau
|
component_under_construction = Diese Seite befindet sich gerade im Aufbau
|
||||||
footer_year = © 2025
|
footer_year = © 2025
|
||||||
footer_name = Tuan-Dat Tran
|
footer_name = Tuan-Dat Tran
|
||||||
footer_rights = . All Rights Reserved.
|
footer_rights = . All Rights Reserved.
|
||||||
footer_contact = Kontakt
|
footer_contact = Kontakt
|
||||||
link_opens_new_tab = (öffnet in neuem Tab)
|
link_opens_new_tab = (öffnet in neuem Tab)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ home_card_text =
|
|||||||
home_card_contact_button = Get in touch.
|
home_card_contact_button = Get in touch.
|
||||||
cv_introduction_title = DevOps Engineer | Homelab Enthusiast
|
cv_introduction_title = DevOps Engineer | Homelab Enthusiast
|
||||||
cv_introduction_0 =
|
cv_introduction_0 =
|
||||||
|
A results-driven DevOps Engineer with a career in technology spanning over 8 years. My journey began with foundational part-time roles in software development (C#, Python) and academic research during my university studies. Now, I apply this deep technical understanding to my full-time DevOps role, where I specialize in building and maintaining scalable, high-availability SaaS infrastructure using Kubernetes, Azure, ArgoCD, and Ansible.
|
||||||
DevOps Engineer and Software Developer with a strong academic background in
|
DevOps Engineer and Software Developer with a strong academic background in
|
||||||
networking technologies and software development. Specialized in Kubernetes,
|
networking technologies and software development. Specialized in Kubernetes,
|
||||||
Ansible, Azure, and modern cloud technologies. Hands-on research experience
|
Ansible, Azure, and modern cloud technologies. Hands-on research experience
|
||||||
@@ -57,14 +58,14 @@ cv_workexperience_ra_ude_description = While working at the Network
|
|||||||
infractructure, inventory system and online presence.
|
infractructure, inventory system and online presence.
|
||||||
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
|
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
|
||||||
cv_workexperience_dd_devops_time = 2025 - now
|
cv_workexperience_dd_devops_time = 2025 - now
|
||||||
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData,
|
cv_workexperience_dd_devops_description = As a DevOps Engineer, I was
|
||||||
I'm responsible for the cloud-based infrastructure behind the company's many
|
responsible for designing, implementing, and maintaining scalable
|
||||||
SaaS products. I work closely with software developers, Customer Success
|
infrastructure solutions across multiple SaaS product environments. This
|
||||||
Managers, and Customer Success Engineers to ensure operational excellence
|
involved standardizing and optimizing CI/CD pipelines and establishing
|
||||||
and seamless service delivery for our customers, always keeping their
|
robust monitoring frameworks to ensure high availability and performance.
|
||||||
specific needs in mind. My duties include managing Kubernetes cluster
|
My work focused on a "shift-left" approach, empowering development teams
|
||||||
deployments, continuously monitoring deployment health metrics, and
|
with self-service capabilities and streamlined operational workflows as
|
||||||
implementing Infrastructure-as-Code solutions.
|
well as enhancement of system reliability and security.
|
||||||
cv_socials_title = Socials
|
cv_socials_title = Socials
|
||||||
cv_education_title = Education
|
cv_education_title = Education
|
||||||
cv_education_bachelor_title = BSc Systems Engineering
|
cv_education_bachelor_title = BSc Systems Engineering
|
||||||
@@ -139,7 +140,7 @@ publications_projects_projects_athome_description = This website is a
|
|||||||
impressum_on = Impressum
|
impressum_on = Impressum
|
||||||
component_under_construction = This page is currently under construction
|
component_under_construction = This page is currently under construction
|
||||||
footer_year = © 2025
|
footer_year = © 2025
|
||||||
footer_name = Tuan-Dat Tran
|
footer_name = Tuan-Dat Tran
|
||||||
footer_rights = . All Rights Reserved.
|
footer_rights = . All Rights Reserved.
|
||||||
footer_contact = Contact
|
footer_contact = Contact
|
||||||
link_opens_new_tab = (opens in a new tab)
|
link_opens_new_tab = (opens in a new tab)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "1.86.0"
|
channel = "1.91.0"
|
||||||
components = ["rustfmt", "clippy", "rust-analyzer"]
|
components = ["rustfmt", "clippy", "rust-analyzer"]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ pub fn CV() -> Element {
|
|||||||
img {
|
img {
|
||||||
class: "rounded-full w-24 h-24",
|
class: "rounded-full w-24 h-24",
|
||||||
alt: "headshot",
|
alt: "headshot",
|
||||||
src: asset!("./assets/pictures/headshot.webp")
|
src: asset!("/assets/pictures/headshot.webp")
|
||||||
}
|
}
|
||||||
Introduction {},
|
Introduction {},
|
||||||
Socials {}
|
Socials {}
|
||||||
@@ -39,7 +39,7 @@ fn Introduction() -> Element {
|
|||||||
P {
|
P {
|
||||||
{ t!("cv_introduction_tools") },
|
{ t!("cv_introduction_tools") },
|
||||||
" ",
|
" ",
|
||||||
AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" },
|
AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim" },
|
||||||
", ",
|
", ",
|
||||||
AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" },
|
AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" },
|
||||||
", ",
|
", ",
|
||||||
@@ -57,7 +57,7 @@ fn WorkExperience() -> Element {
|
|||||||
ol {
|
ol {
|
||||||
class:"relative border-s border-gray-700",
|
class:"relative border-s border-gray-700",
|
||||||
CVEntry {time: t!("cv_workexperience_dd_devops_time"), title: t!("cv_workexperience_dd_devops_title"),
|
CVEntry {time: t!("cv_workexperience_dd_devops_time"), title: t!("cv_workexperience_dd_devops_title"),
|
||||||
technologies: vec!["Kubernetes".to_string(), "ArgoCD".to_string(), "Ansible".to_string(), "Azure".to_string(), "ELK".to_string(), "Helm".to_string()],
|
technologies: vec!["Kubernetes".to_string(), "ArgoCD".to_string(), "Ansible".to_string(), "Azure".to_string(), "Elastic Stack".to_string(), "Helm".to_string()],
|
||||||
description: t!("cv_workexperience_dd_devops_description")
|
description: t!("cv_workexperience_dd_devops_description")
|
||||||
},
|
},
|
||||||
CVEntry {time: t!("cv_workexperience_ra_ude_time"), title: t!("cv_workexperience_ra_ude_title"),
|
CVEntry {time: t!("cv_workexperience_ra_ude_time"), title: t!("cv_workexperience_ra_ude_title"),
|
||||||
@@ -210,7 +210,7 @@ fn Socials() -> Element {
|
|||||||
H4 { { t!("cv_socials_title") } },
|
H4 { { t!("cv_socials_title") } },
|
||||||
div {
|
div {
|
||||||
class: "flex justify-center items-center space-x-4",
|
class: "flex justify-center items-center space-x-4",
|
||||||
P { AccessibleLink { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("./assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }},
|
P { AccessibleLink { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("/assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ pub fn Home() -> Element {
|
|||||||
Card {
|
Card {
|
||||||
name: t!("home_card_name"),
|
name: t!("home_card_name"),
|
||||||
gender: t!("home_card_gender"),
|
gender: t!("home_card_gender"),
|
||||||
picture: asset!("./assets/pictures/headshot.webp"),
|
picture: asset!("/assets/pictures/headshot.webp"),
|
||||||
div {
|
div {
|
||||||
class: "py-4",
|
class: "py-4",
|
||||||
div {
|
div {
|
||||||
|
|||||||
@@ -1,59 +1,30 @@
|
|||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
use dioxus_i18n::t;
|
|
||||||
|
|
||||||
use crate::components::{H1, HR, P};
|
use crate::components::{H1, HR, P};
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Impressum() -> Element {
|
pub fn Impressum() -> Element {
|
||||||
let mut impressum = use_signal(Vec::<String>::new);
|
|
||||||
let mut contact = use_signal(Vec::<String>::new);
|
|
||||||
|
|
||||||
rsx! {
|
rsx! {
|
||||||
div {
|
div {
|
||||||
div {
|
div {
|
||||||
class: "flex flex-col items-center",
|
class: "flex flex-col items-center",
|
||||||
button {
|
H1 { "Impressum" },
|
||||||
onclick: move |_| async move {
|
|
||||||
if let Ok(data) = get_impressum().await {
|
|
||||||
impressum.set(data.clone());
|
|
||||||
}
|
|
||||||
if let Ok(data) = get_contact().await {
|
|
||||||
contact.set(data.clone());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
H1 { { t!("impressum_on") } },
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
HR{},
|
||||||
div {
|
div {
|
||||||
class: "flex flex-col items-center",
|
class: "flex flex-col items-center",
|
||||||
for line in impressum() {
|
P { {"Tuan-Dat Tran"} },
|
||||||
P { {line} }
|
P { {"c/o AutorenServices.de"} },
|
||||||
}
|
P { {"Birkenallee 24"} },
|
||||||
|
P { {"36037 Fulda"} },
|
||||||
}
|
}
|
||||||
if !impressum.read().is_empty() { HR{} },
|
HR{},
|
||||||
div {
|
div {
|
||||||
class: "flex flex-col items-center",
|
class: "flex flex-col items-center",
|
||||||
for line in contact() {
|
P { {"tuan-dat.tran(at)tudattr(dot)dev"} },
|
||||||
P { {line} }
|
P { {"+49 17(six) 83(four)683(eight)8"} },
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[server(GetServerData)]
|
|
||||||
async fn get_impressum() -> Result<Vec<String>, ServerFnError> {
|
|
||||||
Ok(vec![
|
|
||||||
"Tuan-Dat Tran".to_string(),
|
|
||||||
"c/o AutorenServices.de".to_string(),
|
|
||||||
"Birkenallee 24".to_string(),
|
|
||||||
"36037 Fulda".to_string(),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn get_contact() -> Result<Vec<String>, ServerFnError> {
|
|
||||||
Ok(vec![
|
|
||||||
"tuan-dat.tran(at)tudattr(dot)dev".to_string(),
|
|
||||||
"+49 17(six) 83(four)683(eight)8".to_string(),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ pub fn Footer() -> Element {
|
|||||||
span {
|
span {
|
||||||
class:"text-sm sm:text-center text-gray-400",
|
class:"text-sm sm:text-center text-gray-400",
|
||||||
{ t!("footer_year") },
|
{ t!("footer_year") },
|
||||||
|
" ",
|
||||||
a { href: "#", class: "hover:underline", { t!("footer_name") }},
|
a { href: "#", class: "hover:underline", { t!("footer_name") }},
|
||||||
|
" ",
|
||||||
{ t!("footer_rights") }
|
{ t!("footer_rights") }
|
||||||
}
|
}
|
||||||
ul {
|
ul {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
use dioxus_i18n::{prelude::i18n, t, unic_langid::langid};
|
use dioxus_i18n::{prelude::*, t, unic_langid::langid};
|
||||||
|
|
||||||
use crate::Route;
|
use crate::Route;
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ pub fn Header() -> Element {
|
|||||||
Link {
|
Link {
|
||||||
to: Route::Home {},
|
to: Route::Home {},
|
||||||
class: "rounded-md shadow-sm",
|
class: "rounded-md shadow-sm",
|
||||||
img { src:asset!("./assets/pictures/ClackCat_t.webp"), class:"rounded-full h-8", alt:"TuDatTr Logo" },
|
img { src:asset!("/assets/pictures/ClackCat_t.webp"), class:"rounded-full h-8", alt:"TuDatTr Logo" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
li { HeaderLink { url: Route::Home {}, text: t!("headers_home")} },
|
li { HeaderLink { url: Route::Home {}, text: t!("headers_home")} },
|
||||||
|
|||||||
14
src/main.rs
14
src/main.rs
@@ -3,10 +3,7 @@
|
|||||||
use components::H1;
|
use components::H1;
|
||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
use dioxus_i18n::prelude::use_init_i18n;
|
use dioxus_i18n::{prelude::*, unic_langid::langid};
|
||||||
use dioxus_i18n::prelude::I18nConfig;
|
|
||||||
use dioxus_i18n::prelude::Locale;
|
|
||||||
use dioxus_i18n::unic_langid::langid;
|
|
||||||
use layout::footer::Footer;
|
use layout::footer::Footer;
|
||||||
use layout::header::Header;
|
use layout::header::Header;
|
||||||
use tracing::{Level, info};
|
use tracing::{Level, info};
|
||||||
@@ -62,19 +59,16 @@ fn Health() -> Element {
|
|||||||
fn App() -> Element {
|
fn App() -> Element {
|
||||||
use_init_i18n(|| {
|
use_init_i18n(|| {
|
||||||
I18nConfig::new(langid!("en-GB"))
|
I18nConfig::new(langid!("en-GB"))
|
||||||
|
.with_locale((langid!("de-DE"), include_str!("../languages/de-DE.ftl")))
|
||||||
.with_locale(Locale::new_static(
|
.with_locale(Locale::new_static(
|
||||||
langid!("en-GB"),
|
langid!("en-GB"),
|
||||||
include_str!("../languages/en-GB.ftl"),
|
include_str!("../languages/en-GB.ftl"),
|
||||||
))
|
))
|
||||||
.with_locale(Locale::new_static(
|
|
||||||
langid!("de-DE"),
|
|
||||||
include_str!("../languages/de-DE.ftl"),
|
|
||||||
))
|
|
||||||
});
|
});
|
||||||
|
|
||||||
rsx! {
|
rsx! {
|
||||||
document::Link { rel: "stylesheet", href: asset!("./assets/tailwind.css") }
|
document::Link { rel: "stylesheet", href: asset!("/assets/tailwind.css") }
|
||||||
document::Link { rel: "icon", href: asset!("./assets/favicon.ico") }
|
document::Link { rel: "icon", href: asset!("/assets/favicon.ico") }
|
||||||
meta {
|
meta {
|
||||||
name: "description",
|
name: "description",
|
||||||
content: "Visit Tuan-Dat Tran's website for his CV, publications, projects, and consulting services. Connect for collaboration.",
|
content: "Visit Tuan-Dat Tran's website for his CV, publications, projects, and consulting services. Connect for collaboration.",
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ fn Publications() -> Element {
|
|||||||
authors: t!("publications_projects_publications_iot_fuzzers_authors"),
|
authors: t!("publications_projects_publications_iot_fuzzers_authors"),
|
||||||
technologies: vec![],
|
technologies: vec![],
|
||||||
kind: t!("publications_projects_publications_iot_fuzzers_conference"),
|
kind: t!("publications_projects_publications_iot_fuzzers_conference"),
|
||||||
url: "/#",
|
url: "/publications/#",
|
||||||
description: t!("publications_projects_publications_iot_fuzzers_description")
|
description: t!("publications_projects_publications_iot_fuzzers_description")
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -97,7 +97,7 @@ fn Projects() -> Element {
|
|||||||
authors: t!("publications_projects_projects_bpba_authors"),
|
authors: t!("publications_projects_projects_bpba_authors"),
|
||||||
technologies: vec![],
|
technologies: vec![],
|
||||||
kind: t!("publications_projects_projects_bpba_kind"),
|
kind: t!("publications_projects_projects_bpba_kind"),
|
||||||
url: "/#",
|
url: "/publications/#",
|
||||||
description: t!("publications_projects_projects_bpba_description")
|
description: t!("publications_projects_projects_bpba_description")
|
||||||
},
|
},
|
||||||
Project {
|
Project {
|
||||||
@@ -105,7 +105,7 @@ fn Projects() -> Element {
|
|||||||
authors: t!("publications_projects_projects_dotfiles_authors"),
|
authors: t!("publications_projects_projects_dotfiles_authors"),
|
||||||
technologies: vec![],
|
technologies: vec![],
|
||||||
kind: t!("publications_projects_projects_dotfiles_kind"),
|
kind: t!("publications_projects_projects_dotfiles_kind"),
|
||||||
url: "/#",
|
url: "/publications/#",
|
||||||
description: t!("publications_projects_projects_dotfiles_description")
|
description: t!("publications_projects_projects_dotfiles_description")
|
||||||
},
|
},
|
||||||
Project {
|
Project {
|
||||||
@@ -113,7 +113,7 @@ fn Projects() -> Element {
|
|||||||
authors: t!("publications_projects_projects_homelab_authors"),
|
authors: t!("publications_projects_projects_homelab_authors"),
|
||||||
technologies: vec![],
|
technologies: vec![],
|
||||||
kind: t!("publications_projects_projects_homelab_kind"),
|
kind: t!("publications_projects_projects_homelab_kind"),
|
||||||
url: "/#",
|
url: "/publications/#",
|
||||||
description: t!("publications_projects_projects_homelab_description")
|
description: t!("publications_projects_projects_homelab_description")
|
||||||
}
|
}
|
||||||
Project {
|
Project {
|
||||||
@@ -121,7 +121,7 @@ fn Projects() -> Element {
|
|||||||
authors: t!("publications_projects_projects_athome_authors"),
|
authors: t!("publications_projects_projects_athome_authors"),
|
||||||
technologies: vec![],
|
technologies: vec![],
|
||||||
kind: t!("publications_projects_projects_athome_kind"),
|
kind: t!("publications_projects_projects_athome_kind"),
|
||||||
url: "/#",
|
url: "/publications/#",
|
||||||
description: t!("publications_projects_projects_athome_description")
|
description: t!("publications_projects_projects_athome_description")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user