lesli_babel 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/lesli_babel/application.js +1 -3344
- data/app/assets/stylesheets/lesli_babel/application.css +1 -0
- data/app/models/lesli_babel/module.rb +1 -2
- data/app/services/lesli_babel/deploy_rails_service.rb +54 -5
- data/app/views/lesli_babel/partials/_engine-navigation.html.erb +2 -2
- data/app/views/lesli_babel/partials/_engine-sidebar.html.erb +2 -2
- data/config/locales/translations.en.yml +16 -1
- data/config/locales/translations.es.yml +16 -1
- data/lib/lesli_babel/engine.rb +2 -0
- data/lib/lesli_babel/version.rb +2 -2
- data/{app/assets/stylesheets/lesli_babel → lib/scss}/application.scss +10 -5
- data/{app/assets/stylesheets/lesli_babel → lib/scss}/dashboards.scss +2 -2
- data/{app/assets/stylesheets/lesli_babel → lib/scss}/modules.scss +2 -1
- data/{app/assets/stylesheets/lesli_babel → lib/scss}/translations.scss +2 -1
- data/lib/tasks/lesli_babel_tasks.rake +88 -12
- data/lib/vue/application.js +15 -6
- data/lib/vue/apps/dashboards/show.vue +10 -12
- data/lib/vue/apps/modules/show.vue +6 -6
- data/lib/vue/apps/relevants/index.vue +2 -2
- data/lib/vue/apps/translations/index.vue +4 -4
- data/lib/vue/components/actions.vue +5 -5
- data/lib/vue/components/form-label-editor.vue +3 -3
- data/lib/vue/components/form-string-new.vue +14 -43
- data/lib/vue/stores/string.js +84 -0
- data/lib/vue/stores/translations.json +32 -22
- data/readme.md +6 -5
- metadata +38 -8
@@ -0,0 +1 @@
|
|
1
|
+
body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-color-primary: var(--lesli-theme-color-primary, #193d8d);--lesli-color-background: var(--lesli-theme-color-background, #f6f8fb);--lesli-header-color: var(--lesli-theme-header-color, white);--lesli-header-height: var(--lesli-theme-header-height, 70px);--lesli-navbar-color: var(--lesli-theme-header-color, white);--lesli-footer-color: var(--lesli-theme-footer-color, white);--lesli-footer-height: var(--lesli-theme-footer-height, 84px);--lesli-sidebar-color: var(--lesli-theme-sidebar-color, white);--lesli-sidebar-width: var(--lesli-theme-sidebar-width, 50px);--lesli-logo-color: var(--lesli-theme-logo-color, white);--lesli-font-size: var(--lesli-theme-font-size, 16px);--lesli-font-color: var(--lesli-theme-font-color, #333333)}@media only screen and (max-width: 768px){body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-sidebar-width: 50px}}@media only screen and (min-width: 769px){body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-sidebar-width: 100px}}@media only screen and (min-width: 1024px){body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-sidebar-width: 200px}}@media only screen and (min-width: 1216px){body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-sidebar-width: 225px}}@media only screen and (min-width: 1408px){body.lesli-babel :root,body.lesli-babel-dashboard :root{--lesli-sidebar-width: 328px}}body.lesli-babel body.layout-expanded :root,body.lesli-babel-dashboard body.layout-expanded :root{--lesli-sidebar-width: 100px}body.lesli-babel aside.lesli-application-sidebar,body.lesli-babel-dashboard aside.lesli-application-sidebar{display:none !important}body.lesli-babel .locales,body.lesli-babel-dashboard .locales{display:flex;flex-wrap:wrap;justify-content:space-around;justify-content:center}body.lesli-babel .locales>*,body.lesli-babel-dashboard .locales>*{flex-basis:200px;max-width:200px}body.lesli-babel .locales .card,body.lesli-babel-dashboard .locales .card{padding:1.8rem 1rem;text-align:center;box-shadow:rgba(9,30,66,.25) 0px 4px 8px -2px,rgba(9,30,66,.08) 0px 0px 0px 1px;background-color:#fff;border-radius:4px}body.lesli-babel .locales .card .flag-icon,body.lesli-babel-dashboard .locales .card .flag-icon{border-radius:4px;box-shadow:rgba(9,30,66,.25) 0px 4px 8px -2px,rgba(9,30,66,.08) 0px 0px 0px 1px}body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-color-primary: var(--lesli-theme-color-primary, #193d8d);--lesli-color-background: var(--lesli-theme-color-background, #f6f8fb);--lesli-header-color: var(--lesli-theme-header-color, white);--lesli-header-height: var(--lesli-theme-header-height, 70px);--lesli-navbar-color: var(--lesli-theme-header-color, white);--lesli-footer-color: var(--lesli-theme-footer-color, white);--lesli-footer-height: var(--lesli-theme-footer-height, 84px);--lesli-sidebar-color: var(--lesli-theme-sidebar-color, white);--lesli-sidebar-width: var(--lesli-theme-sidebar-width, 50px);--lesli-logo-color: var(--lesli-theme-logo-color, white);--lesli-font-size: var(--lesli-theme-font-size, 16px);--lesli-font-color: var(--lesli-theme-font-color, #333333)}@media only screen and (max-width: 768px){body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-sidebar-width: 50px}}@media only screen and (min-width: 769px){body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-sidebar-width: 100px}}@media only screen and (min-width: 1024px){body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-sidebar-width: 200px}}@media only screen and (min-width: 1216px){body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-sidebar-width: 225px}}@media only screen and (min-width: 1408px){body.cloud_babel-modules :root,body.cloud_babel-relevants :root,body.cloud_babel-translations :root{--lesli-sidebar-width: 328px}}body.cloud_babel-modules body.layout-expanded :root,body.cloud_babel-relevants body.layout-expanded :root,body.cloud_babel-translations body.layout-expanded :root{--lesli-sidebar-width: 100px}body.cloud_babel-modules #babel-translations tbody td,body.cloud_babel-relevants #babel-translations tbody td,body.cloud_babel-translations #babel-translations tbody td{padding:0rem 1rem;height:60px}body.cloud_babel-modules #babel-translations tbody td input.input,body.cloud_babel-relevants #babel-translations tbody td input.input,body.cloud_babel-translations #babel-translations tbody td input.input{height:60px;border:none;box-shadow:none;border-radius:3px;background-color:rgba(0,0,0,0)}body.cloud_babel-modules #babel-translations tbody td input.input::placeholder,body.cloud_babel-relevants #babel-translations tbody td input.input::placeholder,body.cloud_babel-translations #babel-translations tbody td input.input::placeholder{color:#555761}body.cloud_babel-modules #babel-translations tbody td.detail-row,body.cloud_babel-relevants #babel-translations tbody td.detail-row,body.cloud_babel-translations #babel-translations tbody td.detail-row{padding-left:1rem !important}body.cloud_babel-modules #babel-translations .copied:after,body.cloud_babel-relevants #babel-translations .copied:after,body.cloud_babel-translations #babel-translations .copied:after{display:inline;position:absolute;content:"Label copied to clipboard!";animation:1s ease-in-out 0s 1 normal forwards running copyit;font-size:.8em}@keyframes copyit{0%{bottom:2em;opacity:1}100%{bottom:4em;opacity:0}}
|
@@ -29,6 +29,7 @@ module LesliBabel
|
|
29
29
|
|
30
30
|
def format_module_name
|
31
31
|
|
32
|
+
return if self.code == "main_app"
|
32
33
|
return if self.platform == "lesli_core"
|
33
34
|
return if self.platform == "lesli_engine"
|
34
35
|
|
@@ -36,9 +37,7 @@ module LesliBabel
|
|
36
37
|
.gsub(/[^0-9A-Za-z\s\-\_]/, '') # remove special characters from string
|
37
38
|
.gsub(/-/, '') # replace dashes with underscore
|
38
39
|
.gsub(/_/, '') # replace underscore with underscore
|
39
|
-
.titlecase # Capitalizes all the words
|
40
40
|
.gsub(/\s+/, '') # remove blank spaces
|
41
41
|
end
|
42
|
-
|
43
42
|
end
|
44
43
|
end
|
@@ -5,17 +5,31 @@ module LesliBabel
|
|
5
5
|
|
6
6
|
Lesli::System.engines.each do |engine, engine_info|
|
7
7
|
|
8
|
-
L2.br(30)
|
9
|
-
L2.info
|
10
|
-
|
11
8
|
# get all rails engines to buil
|
12
9
|
engine_id = Module
|
13
10
|
.where("platform in ('lesli_core', 'lesli_engine')")
|
14
11
|
.where(:code => engine_info[:code])
|
15
12
|
.pluck(:id)
|
16
13
|
|
14
|
+
engine_id_lesli = Module
|
15
|
+
.where("platform in ('lesli_core', 'lesli_engine')")
|
16
|
+
.where(:code => "lesli")
|
17
|
+
.pluck(:id)
|
18
|
+
|
19
|
+
bucket_id_shared = Bucket
|
20
|
+
.where(:code => "shared")
|
21
|
+
.where(:module_id => engine_id_lesli)
|
22
|
+
.pluck(:id)
|
23
|
+
|
24
|
+
bucket_id_application = Bucket
|
25
|
+
.where(:code => "application")
|
26
|
+
.where(:module_id => engine_id_lesli)
|
27
|
+
.pluck(:id)
|
28
|
+
|
17
29
|
# get strings filtered by module (only rails translations)
|
18
|
-
strings = StringService.new(current_user, query).list
|
30
|
+
strings = StringService.new(current_user, query).list(engine_id)
|
31
|
+
strings_shared = StringService.new(current_user, query).list(engine_id_lesli, bucket_id_shared)
|
32
|
+
strings_application = StringService.new(current_user, query).list(engine_id_lesli, bucket_id_application)
|
19
33
|
|
20
34
|
strings = strings.select(
|
21
35
|
:id,
|
@@ -52,6 +66,7 @@ module LesliBabel
|
|
52
66
|
"config", "locales", "translations.#{lang}.yml"
|
53
67
|
).to_s
|
54
68
|
|
69
|
+
# Create a collection of strings for the current module
|
55
70
|
strings.each do |string|
|
56
71
|
|
57
72
|
bucket_code = string[:bucket_code]
|
@@ -71,6 +86,40 @@ module LesliBabel
|
|
71
86
|
|
72
87
|
end
|
73
88
|
|
89
|
+
# Create a collection of strings for the shared labels of Lesli
|
90
|
+
strings_shared.each do |string|
|
91
|
+
|
92
|
+
unless translations[lang][:labels].has_key? "lesli"
|
93
|
+
translations[lang][:labels]["lesli"] = { }
|
94
|
+
end
|
95
|
+
|
96
|
+
unless translations[lang][:labels]["lesli"].has_key? "shared"
|
97
|
+
translations[lang][:labels]["lesli"]["shared"] = { }
|
98
|
+
end
|
99
|
+
|
100
|
+
# # send debug message for missing translations
|
101
|
+
string[lang] = ":" + string.path + ":" if string[lang].blank?
|
102
|
+
|
103
|
+
translations[lang][:labels]["lesli"]["shared"][string.label] = string[lang]
|
104
|
+
end
|
105
|
+
|
106
|
+
# Create a collection of strings for the application labels of Lesli
|
107
|
+
strings_application.each do |string|
|
108
|
+
|
109
|
+
unless translations[lang][:labels].has_key? "lesli"
|
110
|
+
translations[lang][:labels]["lesli"] = { }
|
111
|
+
end
|
112
|
+
|
113
|
+
unless translations[lang][:labels]["lesli"].has_key? "application"
|
114
|
+
translations[lang][:labels]["lesli"]["application"] = { }
|
115
|
+
end
|
116
|
+
|
117
|
+
# # send debug message for missing translations
|
118
|
+
string[lang] = ":" + string.path + ":" if string[lang].blank?
|
119
|
+
|
120
|
+
translations[lang][:labels]["lesli"]["application"][string.label] = string[lang]
|
121
|
+
end
|
122
|
+
|
74
123
|
end
|
75
124
|
|
76
125
|
translations.each do |lang, translations|
|
@@ -85,7 +134,7 @@ module LesliBabel
|
|
85
134
|
|
86
135
|
translation_file.close
|
87
136
|
|
88
|
-
L2.msg "file added: #{ translations[:file] }"
|
137
|
+
#L2.msg "file added: #{ translations[:file] }"
|
89
138
|
end
|
90
139
|
end
|
91
140
|
end
|
@@ -18,7 +18,7 @@ GNU General Public License for more details.
|
|
18
18
|
You should have received a copy of the GNU General Public License
|
19
19
|
along with this program. If not, see http://www.gnu.org/licenses/.
|
20
20
|
|
21
|
-
Lesli · Ruby on Rails SaaS
|
21
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
22
22
|
|
23
23
|
Made with ♥ by https://www.lesli.tech
|
24
24
|
Building a better future, one line of code at a time.
|
@@ -34,4 +34,4 @@ Building a better future, one line of code at a time.
|
|
34
34
|
|
35
35
|
<%= navigation_item(lesli_babel.dashboard_path, "Dashboard", "ri-dashboard-3-line"); %>
|
36
36
|
<%= navigation_item(lesli_babel.translations_path, "Translations", "ri-earth-line") %>
|
37
|
-
|
37
|
+
<%#= navigation_item(lesli_babel.dashboard_path, "Relevant", "ri-send-plane-line") %>
|
@@ -34,10 +34,10 @@ Building a better future, one line of code at a time.
|
|
34
34
|
|
35
35
|
|
36
36
|
<p class="menu-label">Modules</p>
|
37
|
-
<% LesliBabel::Module.all.order(:
|
37
|
+
<% LesliBabel::Module.all.order(:code).each do |engine| %>
|
38
38
|
<%= navigation_item(
|
39
39
|
lesli_babel.modules_path + "/" + engine.id.to_s,
|
40
40
|
engine.code.titleize,
|
41
|
-
"ri-folder-
|
41
|
+
"ri-folder-line"
|
42
42
|
); %>
|
43
43
|
<% end %>
|
@@ -1,5 +1,20 @@
|
|
1
1
|
---
|
2
2
|
:en:
|
3
|
-
|
3
|
+
lesli:
|
4
4
|
shared:
|
5
|
+
view_discussions: Discussions
|
6
|
+
button_add_new: Add new
|
7
|
+
button_reload: Reload
|
8
|
+
view_files: Files
|
9
|
+
view_quick_actions: Quick actions
|
10
|
+
button_list: List
|
5
11
|
button_save: Save
|
12
|
+
button_delete: Delete
|
13
|
+
button_edit: Edit
|
14
|
+
view_status_active: Active
|
15
|
+
view_status_inactive: Inactive
|
16
|
+
button_settings: Settings
|
17
|
+
button_show: Show
|
18
|
+
application:
|
19
|
+
navigation_logout: Logout
|
20
|
+
navigation_my_profile: My profile
|
@@ -1,5 +1,20 @@
|
|
1
1
|
---
|
2
2
|
:es:
|
3
|
-
|
3
|
+
lesli:
|
4
4
|
shared:
|
5
|
+
view_discussions: Discusiones
|
6
|
+
button_add_new: Agregar nuevo
|
7
|
+
button_reload: Recargar
|
8
|
+
view_files: Archivos
|
9
|
+
view_quick_actions: Acciones rapidas
|
10
|
+
button_list: Lista
|
5
11
|
button_save: Guardar
|
12
|
+
button_delete: Eliminar
|
13
|
+
button_edit: Editar
|
14
|
+
view_status_active: Activo
|
15
|
+
view_status_inactive: Inactivo
|
16
|
+
button_settings: Configuración
|
17
|
+
button_show: Ver
|
18
|
+
application:
|
19
|
+
navigation_logout: Cerrar sesión
|
20
|
+
navigation_my_profile: Mi perfil
|
data/lib/lesli_babel/engine.rb
CHANGED
@@ -43,6 +43,8 @@ module LesliBabel
|
|
43
43
|
config.i18n.default_locale = Lesli.config.locales.keys.first || :en
|
44
44
|
config.i18n.available_locales = Lesli.config.locales.keys || [:en]
|
45
45
|
|
46
|
+
config.i18n.load_path += Dir["#{Lesli::Engine.root.to_s}/config/locales/*.yml"]
|
47
|
+
|
46
48
|
# register engine migrations path
|
47
49
|
unless app.root.to_s.match root.to_s
|
48
50
|
config.paths["db/migrate"].expanded.each do |expanded_path|
|
data/lib/lesli_babel/version.rb
CHANGED
@@ -31,12 +31,17 @@ Building a better future, one line of code at a time.
|
|
31
31
|
*/
|
32
32
|
|
33
33
|
|
34
|
+
|
34
35
|
// ·
|
35
36
|
body.lesli-babel,
|
36
|
-
body.lesli-babel-dashboard {
|
37
|
+
body.lesli-babel-dashboard {
|
38
|
+
@import "./dashboards";
|
39
|
+
}
|
37
40
|
|
38
41
|
|
39
|
-
//
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
// ·
|
43
|
+
body.cloud_babel-modules,
|
44
|
+
body.cloud_babel-relevants,
|
45
|
+
body.cloud_babel-translations {
|
46
|
+
@import "./translations";
|
47
|
+
}
|
@@ -32,7 +32,7 @@ Building a better future, one line of code at a time.
|
|
32
32
|
|
33
33
|
|
34
34
|
// ·
|
35
|
-
@import "
|
35
|
+
@import "Lesli/scss/templates/dashboards";
|
36
36
|
//@import "flag-icons";
|
37
37
|
|
38
38
|
|
@@ -48,7 +48,7 @@ Building a better future, one line of code at a time.
|
|
48
48
|
background-color: white;
|
49
49
|
border-radius: 4px;
|
50
50
|
|
51
|
-
|
51
|
+
.flag-icon {
|
52
52
|
border-radius: 4px;
|
53
53
|
box-shadow: $lesli-box-shadow;
|
54
54
|
}
|
@@ -17,7 +17,7 @@ For more information read the license file including with this software.
|
|
17
17
|
|
18
18
|
*/
|
19
19
|
|
20
|
-
|
20
|
+
/*
|
21
21
|
// ·
|
22
22
|
@import "templates/component";
|
23
23
|
|
@@ -31,3 +31,4 @@ For more information read the license file including with this software.
|
|
31
31
|
.pagination-link {
|
32
32
|
justify-content: center;
|
33
33
|
}
|
34
|
+
*/
|
@@ -47,20 +47,35 @@ namespace :lesli_babel do
|
|
47
47
|
desc "Create standard structure for translations according to the objects in the app"
|
48
48
|
task build: [:environment] do
|
49
49
|
|
50
|
-
engines = Lesli::SystemController.index(matrix:
|
50
|
+
engines = Lesli::SystemController.index(matrix: true)
|
51
51
|
|
52
|
-
engines.each do |
|
52
|
+
engines.each do |engine, routes|
|
53
53
|
|
54
54
|
platform = "lesli_engine"
|
55
|
-
platform = "lesli_core" if
|
56
|
-
platform = "rails_app" if
|
55
|
+
platform = "lesli_core" if engine == "lesli"
|
56
|
+
platform = "rails_app" if engine == "main_app"
|
57
57
|
|
58
|
-
# add object to the translation workflow
|
59
|
-
translation_module = LesliBabel::Module.find_or_create_by(code: t[:engine], platform: platform)
|
60
|
-
translation_bucket = LesliBabel::Bucket.find_or_create_by(code: t[:route].sub(t[:engine]+"/", ""), module: translation_module, reference_module: translation_module.code)
|
61
|
-
translation_bucket = LesliBabel::Bucket.find_or_create_by(code: "shared", module: translation_module, reference_module: translation_module.code)
|
62
58
|
|
63
|
-
|
59
|
+
translation_module = LesliBabel::Module
|
60
|
+
.create_with(:platform => platform)
|
61
|
+
.find_or_create_by!(:code => engine)
|
62
|
+
|
63
|
+
|
64
|
+
routes.each do |controller, route|
|
65
|
+
|
66
|
+
LesliBabel::Bucket.find_or_create_by(
|
67
|
+
code: route[:route].sub("#{ engine }/", ""),
|
68
|
+
module: translation_module,
|
69
|
+
reference_module: translation_module.code
|
70
|
+
)
|
71
|
+
|
72
|
+
LesliBabel::Bucket.find_or_create_by(
|
73
|
+
code: "shared",
|
74
|
+
module: translation_module,
|
75
|
+
reference_module: translation_module.code
|
76
|
+
)
|
77
|
+
end
|
78
|
+
end
|
64
79
|
|
65
80
|
L2.msg "CloudBabel: Module/Controllers scanned and registered"
|
66
81
|
|
@@ -77,8 +92,6 @@ namespace :lesli_babel do
|
|
77
92
|
{
|
78
93
|
"file"=>"engines/#{engine}/lib/vue/stores/translations.json",
|
79
94
|
"patterns"=>[
|
80
|
-
"*.#{engine_info[:code]}",
|
81
|
-
"*.lesli.*",
|
82
95
|
"!*.date",
|
83
96
|
"!*.devise",
|
84
97
|
"!*.faker",
|
@@ -91,7 +104,11 @@ namespace :lesli_babel do
|
|
91
104
|
"!*.i18n",
|
92
105
|
"!*.activerecord",
|
93
106
|
"!*.errors",
|
94
|
-
"!*.number.nth"
|
107
|
+
"!*.number.nth",
|
108
|
+
"*.lesli.shared.*",
|
109
|
+
"*.lesli.application.*",
|
110
|
+
"*.#{engine_info[:code]}.*",
|
111
|
+
|
95
112
|
]
|
96
113
|
}
|
97
114
|
]
|
@@ -100,4 +117,63 @@ namespace :lesli_babel do
|
|
100
117
|
pp I18nJS.call(config: config)
|
101
118
|
end
|
102
119
|
end
|
120
|
+
|
121
|
+
|
122
|
+
desc "Load local translations into LesliBabel"
|
123
|
+
task :load => :environment do |task, args|
|
124
|
+
|
125
|
+
# Get all the locally installed engines
|
126
|
+
engines = Lesli::System.engines
|
127
|
+
|
128
|
+
|
129
|
+
engines.each do |engine, engine_info|
|
130
|
+
|
131
|
+
# cache the engine code
|
132
|
+
engine_code = engine_info[:code]
|
133
|
+
|
134
|
+
# platform name
|
135
|
+
platform = "lesli_engine"
|
136
|
+
platform = "lesli_core" if engine_code == "lesli"
|
137
|
+
|
138
|
+
|
139
|
+
# create the babel module if it does not exists
|
140
|
+
translation_module = LesliBabel::Module
|
141
|
+
.create_with(:platform => platform)
|
142
|
+
.find_or_create_by!(:code => engine_code)
|
143
|
+
|
144
|
+
|
145
|
+
# Iterate over the available locales
|
146
|
+
I18n.available_locales.each do |locale|
|
147
|
+
|
148
|
+
# get the translations for an specific engine for an specific locale
|
149
|
+
translations = I18n.t(engine_code, locale: locale)
|
150
|
+
|
151
|
+
# check if the translations is an object
|
152
|
+
next unless translations.class == Hash
|
153
|
+
translations.each do |bucket, labels|
|
154
|
+
|
155
|
+
# create the bucket if it does not exist
|
156
|
+
translation_bucket = LesliBabel::Bucket.find_or_create_by(
|
157
|
+
code: bucket,
|
158
|
+
module: translation_module,
|
159
|
+
reference_module: translation_module.code
|
160
|
+
)
|
161
|
+
|
162
|
+
labels.each do |label, translation|
|
163
|
+
|
164
|
+
# create or get the label
|
165
|
+
label = LesliBabel::String.create_with(
|
166
|
+
reference_bucket: "#{translation_module.code}-#{translation_bucket.code}"
|
167
|
+
).find_or_create_by(
|
168
|
+
label: label,
|
169
|
+
bucket_id: translation_bucket.id
|
170
|
+
)
|
171
|
+
|
172
|
+
# add the correct translation to the label
|
173
|
+
label.update(locale => translation)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
103
179
|
end
|
data/lib/vue/application.js
CHANGED
@@ -30,15 +30,24 @@ Building a better future, one line of code at a time.
|
|
30
30
|
*/
|
31
31
|
|
32
32
|
|
33
|
-
// ·
|
34
|
-
import application from "Lesli/application"
|
33
|
+
// · Import Lesli builders
|
34
|
+
import application from "Lesli/vue/application"
|
35
|
+
import translation from "Lesli/vue/translation"
|
36
|
+
|
37
|
+
|
38
|
+
// · Import engine translations
|
39
|
+
import translations from "LesliBabel/vue/stores/translations.json"
|
35
40
|
|
36
41
|
|
37
42
|
// ·
|
38
|
-
import appDashboardShow from "LesliBabel/apps/dashboards/show.vue"
|
39
|
-
import appRelevantsIndex from "LesliBabel/apps/relevants/index.vue"
|
40
|
-
import appTranslationsIndex from "LesliBabel/apps/translations/index.vue"
|
41
|
-
import appModulesShow from "LesliBabel/apps/modules/show.vue"
|
43
|
+
import appDashboardShow from "LesliBabel/vue/apps/dashboards/show.vue"
|
44
|
+
import appRelevantsIndex from "LesliBabel/vue/apps/relevants/index.vue"
|
45
|
+
import appTranslationsIndex from "LesliBabel/vue/apps/translations/index.vue"
|
46
|
+
import appModulesShow from "LesliBabel/vue/apps/modules/show.vue"
|
47
|
+
|
48
|
+
|
49
|
+
// · Buil Lesli translations
|
50
|
+
translation(translations)
|
42
51
|
|
43
52
|
|
44
53
|
// ·
|
@@ -23,7 +23,7 @@ import { useRouter, useRoute } from 'vue-router'
|
|
23
23
|
|
24
24
|
|
25
25
|
// · Import components
|
26
|
-
import componentActions from "LesliBabel/components/actions.vue"
|
26
|
+
import componentActions from "LesliBabel/vue/components/actions.vue"
|
27
27
|
|
28
28
|
|
29
29
|
// · initialize/inject plugins
|
@@ -33,8 +33,8 @@ const url = inject("url")
|
|
33
33
|
|
34
34
|
|
35
35
|
// · import lesli stores
|
36
|
-
import { useStatistics } from "LesliBabel/stores/statistics"
|
37
|
-
import { useStrings } from "LesliBabel/stores/strings"
|
36
|
+
import { useStatistics } from "LesliBabel/vue/stores/statistics"
|
37
|
+
import { useStrings } from "LesliBabel/vue/stores/strings"
|
38
38
|
|
39
39
|
|
40
40
|
// · implement stores
|
@@ -67,18 +67,16 @@ function search(string) {
|
|
67
67
|
<component-actions></component-actions>
|
68
68
|
</lesli-header>
|
69
69
|
<lesli-toolbar @search="search"></lesli-toolbar>
|
70
|
-
<div class="locales mt-
|
70
|
+
<div class="locales mt-5">
|
71
71
|
<router-link class="card mr-5 mb-5"
|
72
72
|
v-for="locale in storeStatistics.languages"
|
73
73
|
:key="locale.code"
|
74
|
-
:to="url.babel('translations', { locale: locale.code }).
|
75
|
-
<
|
76
|
-
|
77
|
-
|
78
|
-
</p>
|
79
|
-
<small>
|
80
|
-
missing: {{ storeStatistics.totalStrings - locale.total }} translations
|
81
|
-
</small>
|
74
|
+
:to="url.babel('translations', { locale: locale.code }).toString()" >
|
75
|
+
<svg class="flag-icon mb-2" width="64px" height="48px">
|
76
|
+
<use v-bind:xlink:href="'#locale-'+locale.code"></use>
|
77
|
+
</svg>
|
78
|
+
<p class="is-size-5">{{ locale.name }}: {{ locale.total }}</p>
|
79
|
+
<small>missing: {{ storeStatistics.totalStrings - locale.total }} translations</small>
|
82
80
|
</router-link>
|
83
81
|
</div>
|
84
82
|
</lesli-application-container>
|
@@ -37,14 +37,14 @@ import { useRouter, useRoute } from 'vue-router'
|
|
37
37
|
|
38
38
|
|
39
39
|
// · import components
|
40
|
-
import formStringNew from "LesliBabel/components/form-string-new.vue"
|
41
|
-
import formLabelEditor from "LesliBabel/components/form-label-editor.vue"
|
42
|
-
import componentActions from "LesliBabel/components/actions.vue"
|
40
|
+
import formStringNew from "LesliBabel/vue/components/form-string-new.vue"
|
41
|
+
import formLabelEditor from "LesliBabel/vue/components/form-label-editor.vue"
|
42
|
+
import componentActions from "LesliBabel/vue/components/actions.vue"
|
43
43
|
|
44
44
|
|
45
45
|
// · import lesli stores
|
46
|
-
import { useModule } from "LesliBabel/stores/module"
|
47
|
-
import { useStrings } from "LesliBabel/stores/strings"
|
46
|
+
import { useModule } from "LesliBabel/vue/stores/module"
|
47
|
+
import { useStrings } from "LesliBabel/vue/stores/strings"
|
48
48
|
|
49
49
|
|
50
50
|
// · implement stores
|
@@ -82,7 +82,7 @@ watch(() => route.params.id, () => {
|
|
82
82
|
<lesli-application-container>
|
83
83
|
<lesli-header :title="storeModule.code">
|
84
84
|
<component-actions></component-actions>
|
85
|
-
<lesli-button
|
85
|
+
<lesli-button main icon="add" @click="storeStrings.showPanel = true">
|
86
86
|
add new string
|
87
87
|
</lesli-button>
|
88
88
|
</lesli-header>
|
@@ -30,8 +30,8 @@ const url = inject("url")
|
|
30
30
|
|
31
31
|
|
32
32
|
// · import components
|
33
|
-
import componentLabelEditor from "LesliBabel/components/form-label-editor.vue"
|
34
|
-
import componentActions from "LesliBabel/components/actions.vue"
|
33
|
+
import componentLabelEditor from "LesliBabel/vue/components/form-label-editor.vue"
|
34
|
+
import componentActions from "LesliBabel/vue/components/actions.vue"
|
35
35
|
|
36
36
|
|
37
37
|
</script>
|
@@ -30,13 +30,13 @@ const url = inject("url")
|
|
30
30
|
|
31
31
|
|
32
32
|
// · import components
|
33
|
-
import componentLabelEditor from "LesliBabel/components/form-label-editor.vue"
|
34
|
-
import componentActions from "LesliBabel/components/actions.vue"
|
33
|
+
import componentLabelEditor from "LesliBabel/vue/components/form-label-editor.vue"
|
34
|
+
import componentActions from "LesliBabel/vue/components/actions.vue"
|
35
35
|
|
36
36
|
|
37
37
|
// · import lesli stores
|
38
|
-
import { useStrings } from "LesliBabel/stores/strings"
|
39
|
-
import { useTranslations } from "LesliBabel/stores/translations"
|
38
|
+
import { useStrings } from "LesliBabel/vue/stores/strings"
|
39
|
+
import { useTranslations } from "LesliBabel/vue/stores/translations"
|
40
40
|
|
41
41
|
|
42
42
|
// · implement stores
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<script setup>
|
2
2
|
|
3
3
|
// · import lesli stores
|
4
|
-
import { useTranslations } from "LesliBabel/stores/translations"
|
4
|
+
import { useTranslations } from "LesliBabel/vue/stores/translations"
|
5
5
|
|
6
6
|
|
7
7
|
// · implement stores
|
@@ -9,16 +9,16 @@ const storeTranslations = useTranslations()
|
|
9
9
|
|
10
10
|
</script>
|
11
11
|
<template>
|
12
|
-
<lesli-button icon="download" @click="storeTranslations.postRenovate()">
|
13
|
-
update
|
14
|
-
</lesli-button>
|
15
12
|
<lesli-button icon="rocket_launch" @click="storeTranslations.postDeploy()">
|
16
13
|
deploy
|
17
14
|
</lesli-button>
|
15
|
+
<!--
|
16
|
+
<lesli-button icon="download">
|
17
|
+
update
|
18
|
+
</lesli-button>
|
18
19
|
<lesli-button icon="sync" @click="storeTranslations.postSync()">
|
19
20
|
sync
|
20
21
|
</lesli-button>
|
21
|
-
<!--
|
22
22
|
<lesli-button icon="code">
|
23
23
|
javascript
|
24
24
|
</lesli-button>
|
@@ -24,9 +24,9 @@ import { useRouter, useRoute } from 'vue-router'
|
|
24
24
|
|
25
25
|
// · import lesli stores
|
26
26
|
const route = useRoute()
|
27
|
-
import { useStrings } from "LesliBabel/stores/strings"
|
28
|
-
import { useTranslations } from "LesliBabel/stores/translations"
|
29
|
-
import { useServiceTranslator } from "Lesli/
|
27
|
+
import { useStrings } from "LesliBabel/vue/stores/strings"
|
28
|
+
import { useTranslations } from "LesliBabel/vue/stores/translations"
|
29
|
+
import { useServiceTranslator } from "Lesli/vue/shared/services/translator"
|
30
30
|
|
31
31
|
|
32
32
|
// · implement stores
|