You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.2KB

  1. #[macro_use]
  2. extern crate cstr;
  3. #[macro_use]
  4. extern crate cpp;
  5. #[macro_use]
  6. extern crate qmetaobject;
  7. use qmetaobject::*;
  8. mod qrc;
  9. mod adapters;
  10. mod pairing;
  11. mod connection_connector;
  12. use crate::connection_connector::BridgeConnectionConnector;
  13. use crate::pairing::PairingManager;
  14. mod translation_src {
  15. include!(concat!(env!("OUT_DIR"), "/mo.rs"));
  16. }
  17. lazy_static! {
  18. static ref TRANSLATIONS: gettext::Catalog = {
  19. let requested = std::env::var("LANG").ok().into_iter().map(|value| {
  20. let mut spl = value.split('.');
  21. spl.next().unwrap().to_owned()
  22. }).collect::<Vec<_>>();
  23. let available: Vec<String> = translation_src::MO_FILES.keys().cloned()
  24. .chain(vec!["en_US".to_owned()].into_iter()).collect();
  25. println!("{:?} {:?}", requested, available);
  26. let negotiated = fluent_locale::negotiate_languages(
  27. &requested,
  28. &available,
  29. Some("en_US"),
  30. &fluent_locale::NegotiationStrategy::Lookup
  31. );
  32. println!("negotiated languages: {:?}", negotiated);
  33. let negotiated = if negotiated.len() > 0 {
  34. negotiated[0]
  35. } else {
  36. "en_US"
  37. };
  38. if let Some(src) = translation_src::MO_FILES.get(negotiated) {
  39. gettext::Catalog::parse(*src).unwrap()
  40. } else {
  41. gettext::Catalog::parse(&include_bytes!("../empty.mo")[..]).unwrap()
  42. }
  43. };
  44. }
  45. #[derive(QObject, Default)]
  46. struct GTTranslator {
  47. base: qt_base_class!(trait QObject),
  48. gettext: qt_method!(fn(&self, id: QString) -> QString),
  49. ngettext: qt_method!(fn(&self, id: QString, id2: QString, count: u64) -> QString),
  50. }
  51. impl GTTranslator {
  52. fn gettext<'a>(&self, msgid: QString) -> QString {
  53. let msgid: String = msgid.into();
  54. TRANSLATIONS.gettext(&msgid).into()
  55. }
  56. fn ngettext<'a>(&self, msgid: QString, msgid_plural: QString, n: u64) -> QString {
  57. let msgid: String = msgid.into();
  58. let msgid_plural: String = msgid_plural.into();
  59. TRANSLATIONS.ngettext(&msgid, &msgid_plural, n).into()
  60. }
  61. }
  62. fn main() {
  63. tokio::run(futures::lazy(move || {
  64. unsafe {
  65. cpp! { {
  66. #include <QtCore/QCoreApplication>
  67. }}
  68. cpp!{[]{
  69. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  70. QCoreApplication::setOrganizationName("radiate.vpzom");
  71. QCoreApplication::setOrganizationDomain("vpzom.click");
  72. QCoreApplication::setApplicationName("radiate");
  73. }}
  74. }
  75. if Err(std::env::VarError::NotPresent) == std::env::var("QT_QUICK_CONTROLS_STYLE") {
  76. QQuickStyle::set_style("Suru");
  77. }
  78. qrc::load();
  79. let plugin_name = cstr!("RadiateApp");
  80. qml_register_type::<PairingManager>(plugin_name, 0, 0, cstr!("PairingManager"));
  81. qml_register_type::<BridgeConnectionConnector>(plugin_name, 0, 0, cstr!("BridgeConnectionConnector"));
  82. qml_register_type::<GTTranslator>(plugin_name, 0, 0, cstr!("GTTranslator"));
  83. let mut engine = QmlEngine::new();
  84. engine.load_file("qrc:/qml/Main.qml".into());
  85. engine.exec();
  86. Ok(())
  87. }))
  88. }