diff --git a/BrainPortal/app/controllers/application_controller.rb b/BrainPortal/app/controllers/application_controller.rb index ae9ad3a04..59b862c62 100755 --- a/BrainPortal/app/controllers/application_controller.rb +++ b/BrainPortal/app/controllers/application_controller.rb @@ -46,6 +46,7 @@ class ApplicationController < ActionController::Base # These will be executed in order before_action :check_for_banned_ip + before_action :set_locale before_action :check_account_validity before_action :count_background_activities before_action :prepare_messages @@ -71,6 +72,43 @@ class ApplicationController < ActionController::Base private + # Extract the locale from HTTP_ACCEPT_LANGUAGE + def extract_locale_from_request #:nodoc: + locale_from_cookies = cookies[:locale]&.to_sym + + return locale_from_cookies if locale_from_cookies.presence && I18n.available_locales.include?(locale_from_cookies) + + http_request_languages = request.env['HTTP_ACCEPT_LANGUAGE'] + return nil unless http_request_languages + + http_request_languages = http_request_languages.scan(/^[a-z]{2}/).map{|l| l.to_sym } + + # Return the 1st language in I18n availables locales + return http_request_languages.detect{|l| I18n.available_locales.include?(l) } + end + + # Use the parameter from the URL if it exist + def set_locale + return true if api_request? + + locale_param = params[:locale]&.to_sym + + if locale_param.presence && I18n.available_locales.include?(locale_param) && current_user + if current_user.meta[:locale] != locale_param + current_user.meta[:locale] = locale_param + current_user.save + end + cookies[:locale] = locale_param + redirect_to url_for(request.query_parameters.except(:locale)) + return + elsif current_user && current_user&.meta[:locale] + I18n.locale = current_user&.meta[:locale] + else + I18n.locale = locale_param || extract_locale_from_request() || + I18n.default_locale + end + end + # Re-compute the host and IP from the request (when not logged in, or changed) def adjust_remote_ip_and_host #:nodoc: from_ip = cbrain_session[:guessed_remote_ip].presence || '(None)' # what we had previously diff --git a/BrainPortal/app/views/access_profiles/_access_profiles_table.html.erb b/BrainPortal/app/views/access_profiles/_access_profiles_table.html.erb index 3c612fbba..9e54f96aa 100644 --- a/BrainPortal/app/views/access_profiles/_access_profiles_table.html.erb +++ b/BrainPortal/app/views/access_profiles/_access_profiles_table.html.erb @@ -23,11 +23,11 @@ -%> -
(<%= pluralize @access_profiles.count, "access profile" %>)
+
(<%= AccessProfile.model_name.human(count: @access_profiles.count) %>)
<%= dynamic_scoped_table(@access_profiles, @@ -37,32 +37,32 @@ ) do |t| %> <% - t.column("Name", :name, + t.column(t('activerecord.attributes.name'), :name, :sortable => true, ) { |s| access_profile_label(s, :with_link => true) } - t.column("Color", :color, + t.column(t('activerecord.attributes.color'), :color, :sortable => true, - ) { |s| s.color.presence || "white" } + ) { |s| s.color.presence || t('.white') } - t.column("Description", :description, + t.column(t('activerecord.attributes.description'), :description, :sortable => true, ) { |s| overlay_description(s.description) } - t.column("Projects", :projects) do |s| + t.column(t('activerecord.models.group.other'), :projects) do |s| if (s.groups.count > 4) s.groups[0..3].sort_by(&:name).map { |g| link_to_group_if_accessible(g) }.join(", ").html_safe.presence + " ... " else - s.groups.sort_by(&:name).map { |g| link_to_group_if_accessible(g) }.join(", ").html_safe.presence || "(None)" + s.groups.sort_by(&:name).map { |g| link_to_group_if_accessible(g) }.join(", ").html_safe.presence || "(#{t('none')})" end end - t.column("Users", :users) do |s| + t.column(t('activerecord.models.user.other'), :users) do |s| if (s.users.count > 4) s.users[0..3].sort_by(&:login).map { |u| link_to_user_if_accessible(u) }.join(", ").html_safe + " ... " else - s.users.sort_by(&:login).map { |u| link_to_user_if_accessible(u) }.join(", ").html_safe.presence || "(None)" + s.users.sort_by(&:login).map { |u| link_to_user_if_accessible(u) }.join(", ").html_safe.presence || "(#{t('none')})" end end %> diff --git a/BrainPortal/app/views/access_profiles/index.html.erb b/BrainPortal/app/views/access_profiles/index.html.erb index a1391d313..8dd399bfd 100644 --- a/BrainPortal/app/views/access_profiles/index.html.erb +++ b/BrainPortal/app/views/access_profiles/index.html.erb @@ -22,7 +22,7 @@ # -%> -<% title 'Access Profiles' %> +<% title t('.title') %>
<%= render :partial => 'access_profiles_table' %> diff --git a/BrainPortal/app/views/access_profiles/show.html.erb b/BrainPortal/app/views/access_profiles/show.html.erb index 52bd6966b..2abc7a985 100644 --- a/BrainPortal/app/views/access_profiles/show.html.erb +++ b/BrainPortal/app/views/access_profiles/show.html.erb @@ -22,20 +22,20 @@ # -%> -<% title @access_profile.new_record? ? "Add New Access Profile" : "Access Profile" %> +<% title @access_profile.new_record? ? t('.titles.add_new_access_profile') : t('.titles.access_profile') %> <% if @access_profile.id %> <% end %>
-<%= error_messages_for @access_profile, :header_message => "Access profile could not be #{@access_profile.new_record? ? 'saved':'updated'}." %> +<%= error_messages_for @access_profile, :header_message => t('.error_messages.saved', action: @access_profile.new_record? ? t('saved') : t('updated')) %>
@@ -43,29 +43,28 @@ <%= show_table(@access_profile, :form_helper => cf, :edit_condition => check_role(:admin_user)) do |t| %> - <% t.edit_cell(:name, :content => access_profile_label(@access_profile), :show_width => 2) do |f| %> + <% t.edit_cell(:name, :header => t('.cells.name'), :content => access_profile_label(@access_profile), :show_width => 2) do |f| %> <%= f.text_field :name, :class => "cb_colorpick_bg_target" %> <% end %> - <% t.edit_cell(:color, :show_width => 2) do |f| %> + <% t.edit_cell(:color, :header => t('.cells.color'), :show_width => 2) do |f| %> <%= f.text_field :color, :class => "cb_colorpick_val_target" %>
- Use a CSS-compliant pale color:
- e.g. #ff0 or yellow etc.

+ <%= t('.explanations.css_html') %>
<%= render :partial => 'shared/color_picker', :locals => { :step => 30, :greys => false, :dark => false } %> <% end %> - <% t.edit_cell(:description, :content => full_description(@access_profile.description), :show_width => 2 ) do |f| %> + <% t.edit_cell(:description, :header => AccessProfile.human_attribute_name(:description), :content => full_description(@access_profile.description), :show_width => 2 ) do |f| %> <%= f.text_area :description, :rows => 6, :cols => 60 %>
- These are your private notes about this profile. + <%= t('.explanations.private') %> <% end %> <% end %> <% myusers = @access_profile.users.all.sort_by(&:login) %> - <%= show_table(@access_profile, :form_helper => cf, :edit_condition => check_role(:admin_user), :header => @access_profile.new_record? ? 'Project Membership' : 'Projects In This Profile') do |t| %> - <% group_names = (@access_profile.groups.sort_by(&:name).map { |g| link_to_group_if_accessible(g) }.join(", ").html_safe.presence) || "(None)" %> - <% t.edit_cell(:group_ids, :show_width => 2, :no_header => "Projects", :td_options => { :class => "wrap" }, :content => group_names) do %> +<%= show_table(@access_profile, :form_helper => cf, :edit_condition => check_role(:admin_user), :header => (@access_profile.new_record? ? t('.headings.project_membership') : t('.headings.projects_in_this_profile'))) do |t| %> + <% group_names = (@access_profile.groups.sort_by(&:name).map { |g| link_to_group_if_accessible(g) }.join(", ").html_safe.presence) || t('none') %> + <% t.edit_cell(:group_ids, :show_width => 2, :no_header => Group.model_name.human(count: 2), :td_options => { :class => "wrap" }, :content => group_names) do %> <%= render :partial => 'shared/group_tables', :locals => { :model => @access_profile } %> @@ -73,7 +72,7 @@


- When adding or removing projects, apply the change to the users: + <%= t('.explanations.change') %> <%= select_all_checkbox "all_affected_users", :id => "togall", :checked => "1" %> <%= render :partial => 'shared/users_checkbox_table', :locals => { @@ -88,17 +87,17 @@ <% end %> <% if !@access_profile.new_record? %> - <%= show_table(@access_profile, :form_helper => cf, :edit_condition => check_role(:admin_user), :header => 'Users With This Profile') do |t| %> + <%= show_table(@access_profile, :form_helper => cf, :edit_condition => check_role(:admin_user), :header => t('.headings.with_this_profile') ) do |t| %> <% if myusers.present? && myusers.count > 0 %> <% user_names = (array_to_table(myusers.map { |u| link_to_user_if_accessible(u) }, :table_class => 'simple', :cols => 12).html_safe) %> <% else %> - <% user_names = "(None)" %> + <% user_names = t('none') %> <% end %> - <% t.edit_cell(:user_ids, :show_width => 2, :no_header => "Users", :content => user_names) do %> + <% t.edit_cell(:user_ids, :show_width => 2, :no_header => User.model_name.human(count: 2), :content => user_names) do %> - Normal Users
+ <%= t('.user_types.normal') %>
<%= render :partial => 'shared/users_checkbox_table', :locals => { :users => User.where(:account_locked => false).order(:login).all, @@ -108,7 +107,7 @@ %>
- Locked Users
+ <%= t('.user_types.locked') %>
<%= render :partial => 'shared/users_checkbox_table', :locals => { :users => User.where(:account_locked => true).order(:login).all, @@ -124,6 +123,6 @@ <% end # show_table_context %>

- <%= render :partial => "layouts/log_report", :locals => { :log => @access_profile.getlog, :title => 'Access Profile Log' } %> + <%= render :partial => "layouts/log_report", :locals => { :log => @access_profile.getlog, :title => t('.access_profile_log') } %>

diff --git a/BrainPortal/app/views/background_activities/_RubyRunner.html.erb b/BrainPortal/app/views/background_activities/_RubyRunner.html.erb index 754af42c7..7715b1ec0 100644 --- a/BrainPortal/app/views/background_activities/_RubyRunner.html.erb +++ b/BrainPortal/app/views/background_activities/_RubyRunner.html.erb @@ -1,7 +1,7 @@
- Ruby Code + <%= t('.legends.ruby_code') %> <% sections = %w( prepare_dynamic_items before_first_item process after_last_item ) %> diff --git a/BrainPortal/app/views/background_activities/_background_activity_table.html.erb b/BrainPortal/app/views/background_activities/_background_activity_table.html.erb index 1d554438d..a6e1a2a5c 100644 --- a/BrainPortal/app/views/background_activities/_background_activity_table.html.erb +++ b/BrainPortal/app/views/background_activities/_background_activity_table.html.erb @@ -23,55 +23,31 @@ -%>
- About Background Activities -

- This page shows "background activities" as progress bars. Each - activity applies a single operation to a set of things (usually, - files or tasks). These activities are often the result of clicking - on buttons in other pages, when you get a message that something - was started in background. Activities that are in progress - are shown with glowing borders. Individual operations within an - activity can succeed or fail. Sometimes, the failure is not - significant (e.g. trying to compress a file that is already - compressed). -

- You can cancel activities, but remember that cancelled activities - can never be restarted. You will have to redo whatever operation - created the activity. -

- Older, finished "background activities" are generally cleaned - up after one week and will disappear from this list. + <%= t('.legends.about') %> <% if current_user.has_role? :admin_user %> -

- As an admin, you can create maintenance activities that can be - scheduled for later. See the accompanying form for more help. You - can also suspend activities; these are resumable. You can suspend - activities that are in progress, or scheduled in the future. + <%= t('.paragraphs.about_admin_html') %> <% end %> -

- The progress bars in this page are not live, so - you need to click the Refresh button to get an update - on the progress of your activities. + <%= t('.paragraphs.about_general_bottom_html') %>

<%= @@ -113,7 +89,7 @@ <% if current_user.has_role? :admin_user - t.column("User", :user, + t.column(t('.columns.user'), :user, :sortable => true, :filters => filter_values_for( @base_scope, :user_id, @@ -122,12 +98,12 @@ ) ) { |bac| link_to_user_if_accessible(bac.user) } - t.column("Server", :remote_resource, + t.column(t('.columns.server'), :remote_resource, :sortable => true, :filters => default_filters_for(@base_scope, RemoteResource) ) { |bac| link_to_bourreau_if_accessible(bac.remote_resource) } - t.column("Status", :status, + t.column(t('.columns.status'), :status, :sortable => true, :filters => default_filters_for(@base_scope, :status) ) { |bac| colored_bac_status(bac.status) } @@ -136,7 +112,7 @@ %> <% - t.column("Activity Type", :type, + t.column(t('.columns.activity_type'), :type, :sortable => true, :filters => scoped_filters_for( @base_scope, @scope, :type, @@ -144,7 +120,7 @@ value, label, base, view = *format_info { :value => value, - :label => "#{label.demodulize.underscore.humanize} (of #{base})", + :label => t('.labels.type_filter', label: label.demodulize.underscore.humanize, base: base), :indicator => view, :empty => view == 0 } @@ -162,38 +138,38 @@ <% if current_user.has_role? :admin_user %> - <% t.column("Scheduled At", :start_at, :sortable => true) do |bac| %> + <% t.column(t('.columns.scheduled_at'), :start_at, :sortable => true) do |bac| %> <% if bac.start_at.present? %> <%= to_localtime(bac.start_at, :datetime) %>
<% if bac.start_at >= Time.now %> - (in <%= pretty_elapsed(bac.start_at.to_i - Time.now.to_i, :num_components => 2) %>) + <%= t('.scheduled_at.in_time', time: pretty_elapsed(bac.start_at.to_i - Time.now.to_i, :num_components => 2)) %> <% else %> - (overdue by <%= pretty_elapsed(Time.now.to_i - bac.start_at.to_i, :num_components => 2) %>) + <%= t('.scheduled_at.overdue_by', time: pretty_elapsed(Time.now.to_i - bac.start_at.to_i, :num_components => 2)) %> <% end %> <% end %> <% end %> - <% t.column("Repeat", :repeat, :sortable => true) do |bac| %> + <% t.column(t('.columns.repeat'), :repeat, :sortable => true) do |bac| %> <%= bac_pretty_repeat bac.repeat %> <% end %> - <% t.column("Retries", :retry_count, :sortable => false) do |bac| %> + <% t.column(t('.columns.retries'), :retry_count, :sortable => false) do |bac| %> <% if bac.retry_count.present? %> - <%= pluralize(bac.retry_count, "retry") %> allowed
- (next with <%= pluralize(bac.retry_delay || 60, "seconds delay") %>) + <%= t('.retries.allowed', count: bac.retry_count) %>
+ <%= t('.retries.next', count: bac.retry_delay || 60) %> <% end %> <% end %> <% end %> - <% t.column("Last Updated", :updated_at, :sortable => true) do |bac| %> + <% t.column(t('.columns.last_update'), :updated_at, :sortable => true) do |bac| %> <%= to_localtime(bac.updated_at, :datetime) %>
- (<%= pretty_elapsed(Time.now.to_i - bac.updated_at.to_i, :num_components => 2) %> ago) + (<%= t('ago_time', time: pretty_elapsed(Time.now.to_i - bac.updated_at.to_i, :num_components => 2)) %>) <% end %> - <% t.column("Progress", :header, :sortable => false) do |bac| %> + <% t.column(t('.columns.progress'), :header, :sortable => false) do |bac| %> <% ok_fail_class = "" ok_fail_class = "bac_all_ok" if bac.num_successes > 0 && bac.num_failures == 0 @@ -206,11 +182,11 @@ <%= bac.current_item %>/<%= bac.items.size %>
<% end %> <%= colored_bac_status(bac.status) %> - on <%= bac.remote_resource.name %> | + <%= t('.on_word') %> <%= bac.remote_resource.name %> | <% if bac.is_configured_for_dynamic_items? %> - (Dynamic items list) + <%= t('background_activities.common.dynamic_items_list') %> <% elsif is_scheduled %> - (<%= bac.items.size %> items) + <%= t('.items_count', count: bac.items.size) %> <% else %> <%= bac.current_item %>/<%= bac.items.size %> <% if bac.status != 'Completed' && (bac.num_successes > 0 || bac.num_failures > 0) %> @@ -224,14 +200,14 @@ <% end %> <% if messages.present? %> <% messages = messages.map { |m| h(m) }.join("
").html_safe %> - | <%= html_tool_tip('(Messages)') { messages } %> + | <%= html_tool_tip(t('.tooltips.messages')) { messages } %> <% end %> <% end %> <% if current_user.has_role? :admin_user - t.column("Show", :show) do |bac| - link_to("Show", background_activity_path(bac), :class => 'action_link') + t.column(t('.columns.show'), :show) do |bac| + link_to(t('.links.show'), background_activity_path(bac), :class => 'action_link') end end %> diff --git a/BrainPortal/app/views/background_activities/index.html.erb b/BrainPortal/app/views/background_activities/index.html.erb index 9996c24cc..fe4b1e79a 100644 --- a/BrainPortal/app/views/background_activities/index.html.erb +++ b/BrainPortal/app/views/background_activities/index.html.erb @@ -22,7 +22,7 @@ # -%> -<% title 'Background Activities' %> +<% title t('.title') %>
<%= render :partial => 'background_activity_table' %> diff --git a/BrainPortal/app/views/background_activities/new.html.erb b/BrainPortal/app/views/background_activities/new.html.erb index c633b85b3..1b233fe87 100644 --- a/BrainPortal/app/views/background_activities/new.html.erb +++ b/BrainPortal/app/views/background_activities/new.html.erb @@ -23,11 +23,11 @@ -%> -<% title 'Schedule Maintenance Activity' %> +<% title t('.title') %> -

Schedule Maintenance Activity

+

<%= t('.headings.main') %>

-<%= error_messages_for @bac, :object_name => "activity" %> +<%= error_messages_for @bac, :object_name => t('.errors.activity') %> <% @bac.options ||= {} %> <%= hidden_field_tag 'background_activity[options][dummy]','val' %> @@ -42,7 +42,7 @@ ############################## %> -

<%= f.label :user_id, "User" %>
+

<%= f.label :user_id, t('activerecord.models.user.one') %>
<%= user_select("background_activity[user_id]", :selector => @bac.user_id.to_s) %> <%- @@ -51,7 +51,7 @@ ############################## %> -

<%= f.label :remote_resource_id, "Portal or Execution Server" %>
+

<%= f.label :remote_resource_id, t('.labels.server') %>
<%= bourreau_select("background_activity[remote_resource_id]", { :bourreaux => RemoteResource.all.order(:name).to_a, :selector => @bac.remote_resource_id.to_s } ) %> @@ -62,7 +62,7 @@ ############################## %> -

<%= f.label :start_date, "Initial Start Date" %>
+

<%= f.label :start_date, t('.labels.start_date') %>
<%= text_field_tag :start_date, @start_date, :class => "datepicker" %> <%= select_tag :start_hour, @@ -83,7 +83,7 @@ %>M <%= label_tag :start_now do %> - ( Or <%= check_box_tag :start_now, "1", @start_now == "1" %> right away ) + <%= t('.labels.start_now_html', checkbox: check_box_tag(:start_now, "1", @start_now == "1")) %> <% end %> <%- @@ -92,27 +92,27 @@ ############################## %> -

<%= label_tag :repeat, "Repeat Frequency" %>
+

<%= label_tag :repeat, t('.labels.repeat') %>
<%= select_tag :repeat, options_for_select( [ # hardcoded for the moment - [ "(How often and when to repeat)", "" ], - [ "One Shot" , 'one_shot' ], - [ "Every 30 minutes" , 'start+30' ], - [ "Every hour" , 'start+60' ], - [ "Every 12 hours" , 'start+720' ], - [ "Every 24 hours" , 'start+1440' ], - [ "Tomorrow and everyday at..." , 'tomorrow@' ], - [ "Mondays at..." , 'monday@' ], - [ "Tuesdays at..." , 'tuesday@' ], - [ "Wednesdays at..." , 'wednesday@' ], - [ "Thursdays at..." , 'thursday@' ], - [ "Fridays at..." , 'friday@' ], - [ "Saturdays at..." , 'saturday@' ], - [ "Sundays at..." , 'sunday@' ], + [ t('.repeat_options.prompt') , "" ], + [ t('.repeat_options.one_shot') , 'one_shot' ], + [ t('.repeat_options.every_30min') , 'start+30' ], + [ t('.repeat_options.every_hour') , 'start+60' ], + [ t('.repeat_options.every_12h') , 'start+720' ], + [ t('.repeat_options.every_24h') , 'start+1440' ], + [ t('.repeat_options.tomorrow') , 'tomorrow@' ], + [ t('.repeat_options.monday') , 'monday@' ], + [ t('.repeat_options.tuesday') , 'tuesday@' ], + [ t('.repeat_options.wednesday') , 'wednesday@' ], + [ t('.repeat_options.thursday') , 'thursday@' ], + [ t('.repeat_options.friday') , 'friday@' ], + [ t('.repeat_options.saturday') , 'saturday@' ], + [ t('.repeat_options.sunday') , 'sunday@' ], ], :selected => @repeat ) %> - (For at...: + <%= t('.repeat_at_html') %> <%= select_tag :repeat_hour, options_for_select( #[['(Select hour for "at...")','']] + @@ -140,17 +140,17 @@

<%= f.radio_button :type, 'BackgroundActivity::MoveFile' %> - <%= f.label :type, 'Move', :value => 'BackgroundActivity::MoveFile' %> - or + <%= f.label :type, t('.labels.move'), :value => 'BackgroundActivity::MoveFile' %> + <%= t('.legends.or_word') %> <%= f.radio_button :type, 'BackgroundActivity::CopyFile' %> - <%= f.label :type, 'Copy', :value => 'BackgroundActivity::CopyFile' %> - Files + <%= f.label :type, t('.labels.copy'), :value => 'BackgroundActivity::CopyFile' %> + <%= t('.legends.files') %> - Remember to select a file custom filter in the Dynamic Items section below. + <%= t('.paragraphs.remember_file_filter_html') %>

- To: <%= data_provider_select 'move_file_dp_id', { :selector => @move_file_dp_id.to_s }, :include_blank => '(Select a Data Provider)' %> + <%= t('.paragraphs.move_to') %> <%= data_provider_select 'move_file_dp_id', { :selector => @move_file_dp_id.to_s }, :include_blank => t('.selects.data_provider') %>

- Crush files at destination if they exist: <%= check_box_tag :move_crush, '1', @move_crush %> + <%= t('.paragraphs.move_crush') %> <%= check_box_tag :move_crush, '1', @move_crush %>

<%- @@ -162,9 +162,9 @@
<%= f.radio_button :type, 'BackgroundActivity::RemoveTaskWorkdir' %> - <%= f.label :type, 'Remove Task Workdirs', :value => 'BackgroundActivity::RemoveTaskWorkdir' %> + <%= f.label :type, t('.labels.remove_task_workdirs'), :value => 'BackgroundActivity::RemoveTaskWorkdir' %> - Remember to select a task custom filter in the Dynamic Items section below. + <%= t('.paragraphs.remember_task_filter_html') %>
<%- @@ -176,12 +176,12 @@
<%= f.radio_button :type, 'BackgroundActivity::ArchiveTaskWorkdir' %> - <%= f.label :type, 'Archive Task Workdirs', :value => 'BackgroundActivity::ArchiveTaskWorkdir' %> + <%= f.label :type, t('.labels.archive_task_workdirs'), :value => 'BackgroundActivity::ArchiveTaskWorkdir' %> - Remember to select a task custom filter in the Dynamic Items section below. + <%= t('.paragraphs.remember_task_filter_html') %>

- To: <%= data_provider_select 'archive_task_dp_id', { :selector => @archive_task_dp_id.to_s }, :include_blank => '(Select a Data Provider)' %>
- (Leave blank to archive directly in the work directories) + <%= t('.paragraphs.move_to') %> <%= data_provider_select 'archive_task_dp_id', { :selector => @archive_task_dp_id.to_s }, :include_blank => t('.selects.data_provider') %>
+ <%= t('.paragraphs.archive_blank_note') %>

<%- @@ -193,13 +193,12 @@
<%= f.radio_button :type, 'BackgroundActivity::CompressFile' %> - <%= f.label :type, 'Compress', :value => 'BackgroundActivity::CompressFile' %> - or - <%= f.radio_button :type, 'BackgroundActivity::UncompressFile' %> - <%= f.label :type, 'Uncompress', :value => 'BackgroundActivity::UncompressFile' %> - Files + <%= f.label :type, t('.labels.compress'), :value => 'BackgroundActivity::CompressFile' %> + <%= t('.legends.or_word') %> + <%= f.label :type, t('.labels.uncompress'), :value => 'BackgroundActivity::UncompressFile' %> + <%= t('.legends.files') %> - Remember to select a file custom filter in the Dynamic Items section below. + <%= t('.paragraphs.remember_file_filter_html') %>
<%- @@ -209,26 +208,25 @@ %>
- Dynamic Items Selection: Files or Tasks - These two selection boxes allow you to specify one of your custom filters, - either for files or for tasks. + <%= t('.legends.filter') %> + <%= t('.paragraphs.filter_intro') %>

- For activities that involve files: + <%= t('.paragraphs.for_files_html') %>

- <%= label_tag 'background_activity[options][userfile_custom_filter_id]', "File Custom Filter:" %> + <%= label_tag 'background_activity[options][userfile_custom_filter_id]', t('.labels.file_custom_filter') %> <%= select_tag 'background_activity[options][userfile_custom_filter_id]', options_for_select( - [["(Select one of your filters)",""]] + UserfileCustomFilter.where(:user_id => current_user.id).order(:name).pluck(:name,:id), + [[t('.selects.filter'),""]] + UserfileCustomFilter.where(:user_id => current_user.id).order(:name).pluck(:name,:id), :selected => @bac.options[:userfile_custom_filter_id].to_s ) %>

- For activities that involve tasks: + <%= t('.paragraphs.for_tasks_html') %>

- <%= label_tag 'background_activity[options][task_custom_filter_id]', "Task Custom Filter:" %> + <%= label_tag 'background_activity[options][task_custom_filter_id]', t('.labels.task_custom_filter') %> <%= select_tag 'background_activity[options][task_custom_filter_id]', options_for_select( - [["(Select one of your filters)",""]] + TaskCustomFilter.where(:user_id => current_user.id).order(:name).pluck(:name,:id), + [[t('.selects.filter'),""]] + TaskCustomFilter.where(:user_id => current_user.id).order(:name).pluck(:name,:id), :selected => @bac.options[:task_custom_filter_id].to_s ) %> @@ -243,23 +241,23 @@

<%= f.radio_button :type, 'BackgroundActivity::CleanCache' %> - <%= f.label :type, 'Clean DataProvider Caches', :value => 'BackgroundActivity::CleanCache' %> + <%= f.label :type, t('.labels.clean_cache'), :value => 'BackgroundActivity::CleanCache' %> + + + <% @remote_r.each do |bourreau| %> + + <% end %> + + <% end %> + +
- <%= label_tag 'background_activity[options][days_older]', "Files last accessed at least:" %> + <%= label_tag 'background_activity[options][days_older]', t('.labels.last_accessed') %> - <%= text_field_tag 'background_activity[options][days_older]', @bac.options[:days_older], :size => 3 %> days ago + <%= text_field_tag 'background_activity[options][days_older]', @bac.options[:days_older], :size => 3 %> <%= t('.days_ago') %>
- <%= label_tag 'background_activity[options][with_user_ids][]', "Belonging to users:" %> + <%= label_tag 'background_activity[options][with_user_ids][]', t('.labels.belonging_users') %> <%= user_select("background_activity[options][with_user_ids][]", { :selector => @bac.options[:with_user_ids] }, :multiple => true ) %> @@ -268,7 +266,7 @@
- <%= label_tag 'background_activity[options][without_user_ids][]', "But not to users:" %> + <%= label_tag 'background_activity[options][without_user_ids][]', t('.labels.not_users') %> <%= user_select("background_activity[options][without_user_ids][]", { :selector => @bac.options[:without_user_ids] }, :multiple => true ) %> @@ -277,7 +275,7 @@
- <%= label_tag 'background_activity[options][with_types][]', "Of type:" %> + <%= label_tag 'background_activity[options][with_types][]', t('.labels.of_type') %> <%= userfile_type_select("background_activity[options][with_types][]", { :selector => @bac.options[:with_types] }, :multiple => true ) %> @@ -286,7 +284,7 @@
- <%= label_tag 'background_activity[options][without_types][]', "But not type:" %> + <%= label_tag 'background_activity[options][without_types][]', t('.labels.not_type') %> <%= userfile_type_select("background_activity[options][without_types][]", { :selector => @bac.options[:without_types] }, :multiple => true ) %> @@ -305,17 +303,17 @@
<%= f.radio_button :type, 'BackgroundActivity::EraseBackgroundActivities' %> - <%= f.label :type, 'Erase Background Activities', :value => 'BackgroundActivity::EraseBackgroundActivities' %> + <%= f.label :type, t('.labels.erase_bacs'), :value => 'BackgroundActivity::EraseBackgroundActivities' %> @@ -331,28 +329,28 @@
<%= f.radio_button :type, 'BackgroundActivity::VerifyDataProvider' %> - <%= f.label :type, 'Verify DataProvider Connectivity', :value => 'BackgroundActivity::VerifyDataProvider' %> + <%= f.label :type, t('.labels.verify_dp'), :value => 'BackgroundActivity::VerifyDataProvider' %> <% sys_dps = DataProvider.where.not( :type => [ 'UserkeyFlatDirSshDataProvider', 'S3FlatDataProvider','ScratchDataProvider' ]) user_dps = DataProvider.where( :type => [ 'UserkeyFlatDirSshDataProvider', 'S3FlatDataProvider' ]) %> - System Data Providers: + <%= t('.system_dps') %> <%= data_provider_select 'verify_dp_ids[]', { :data_providers => sys_dps, :selector => @bac.items&.map(&:to_s) }, - :include_blank => '(Select Data Providers)', :multiple => true + :include_blank => t('.selects.dps'), :multiple => true %>

- User Data Providers: + <%= t('.user_dps') %> <% #= Old select box, doesn't provide info about owners # data_provider_select 'verify_dp_ids[]', # { :data_providers => user_dps, :selector => @bac.items&.map(&:to_s) }, - # :include_blank => '(Select Data Providers)', :multiple => true + # :include_blank => t('.selects.dps'), :multiple => true %> <%= select_tag 'verify_dp_ids[]', options_for_select( - [["(Select Data Providers)",""]] + + [[t('.selects.dps'),""]] + user_dps.map { |dp| [ "#{dp.name} (#{dp.user.login})", dp.id ] }, :selected => @bac.items&.map(&:to_s), ), @@ -369,18 +367,18 @@

<%= f.radio_button :type, 'BackgroundActivity::RandomActivity' %> - <%= f.label :type, 'Fake Activity Tests', :value => 'BackgroundActivity::RandomActivity' %> + <%= f.label :type, t('.labels.fake_activity'), :value => 'BackgroundActivity::RandomActivity' %> - <%= label_tag 'background_activity[options][mintime]', "Minimum seconds:" %> + <%= label_tag 'background_activity[options][mintime]', t('.labels.min_seconds') %> <%= text_field_tag 'background_activity[options][mintime]', @bac.options[:mintime], :size => 3 %> - <%= label_tag 'background_activity[options][maxtime]', "Maximum seconds:" %> + <%= label_tag 'background_activity[options][maxtime]', t('.labels.max_seconds') %> <%= text_field_tag 'background_activity[options][maxtime]', @bac.options[:maxtime], :size => 3 %>

- <%= label_tag 'background_activity[options][count_ok]', "Number of OKs:" %> + <%= label_tag 'background_activity[options][count_ok]', t('.labels.num_oks') %> <%= text_field_tag 'background_activity[options][count_ok]', @bac.options[:count_ok], :size => 3 %> - <%= label_tag 'background_activity[options][count_fail]', "Number of FAILs:" %> + <%= label_tag 'background_activity[options][count_fail]', t('.labels.num_fails') %> <%= text_field_tag 'background_activity[options][count_fail]', @bac.options[:count_fail], :size => 3 %> - <%= label_tag 'background_activity[options][count_exc]', "Number of EXCs:" %> + <%= label_tag 'background_activity[options][count_exc]', t('.labels.num_excs') %> <%= text_field_tag 'background_activity[options][count_exc]', @bac.options[:count_exc], :size => 3 %>

@@ -393,15 +391,14 @@
<%= f.radio_button :type, 'BackgroundActivity::RubyRunner' %> - <%= f.label :type, 'Arbitrary Ruby Code Runner', :value => 'BackgroundActivity::RubyRunner' %> + <%= f.label :type, t('.labels.ruby_runner'), :value => 'BackgroundActivity::RubyRunner' %> - This activity type is only for experienced CBRAIN system developers - who understands the BackgroundActivity framework. + <%= t('.paragraphs.ruby_runner_intro_html') %>

<%= label_tag 'background_activity[options][prepare_dynamic_items]' do %> - prepare_dynamic_items() : Mandatory. Must set the list of items with self.items=[] . + <%= t('.labels.prepare') %> <% end %>
<%= text_area_tag 'background_activity[options][prepare_dynamic_items]', @@ -409,7 +406,7 @@

<%= label_tag 'background_activity[options][before_first_item]' do %> - before_first_item() : Optional. + <%= t('.labels.before') %> <% end %>
<%= text_area_tag 'background_activity[options][before_first_item]', @@ -417,21 +414,19 @@

<%= label_tag 'background_activity[options][process]' do %> - process() : Mandatory. Must return [ true, nil ] when something is processed properly, and [ false, message ] otherwise. + <%= t('.labels.process_html') %> <% end %>
<%= text_area_tag 'background_activity[options][process]', (@bac.options[:process] || "# Add a description on first line of comment\nreturn [ true, nil ] if item.odd?\nreturn [ false, \"Error: not odd\" ]"), :rows => 5, :cols => 120 %>

- Consider adding a short description of what your RubyRunner code does - on the very first line of comment; this will be shown as a description - of the BackgroundActivity within the index page. + <%= t('.paragraphs.process_explanation') %>

<%= label_tag 'background_activity[options][after_last_item]' do %> - after_last_item() : Optional. + <%= t('.labels.after') %> <% end %>
<%= text_area_tag 'background_activity[options][after_last_item]', @@ -443,7 +438,7 @@

- <%= submit_tag 'Schedule new activity' %> + <%= submit_tag t('.submit') %> <% end %> diff --git a/BrainPortal/app/views/background_activities/show.html.erb b/BrainPortal/app/views/background_activities/show.html.erb index f77567196..d023cd7b0 100644 --- a/BrainPortal/app/views/background_activities/show.html.erb +++ b/BrainPortal/app/views/background_activities/show.html.erb @@ -24,68 +24,68 @@ <% title @bac.pretty_name %> -<%= show_table(@bac, :as => :background_activity, :header => "Background Activity") do |t| %> +<%= show_table(@bac, :as => :background_activity, :header => t('.headings.main')) do |t| %> - <% t.cell("Type") do %> + <% t.cell(t('.cells.type')) do %> <%= @bac.class.to_s.demodulize %> <% end %> - <% t.cell("Status") do %> + <% t.cell(t('.cells.status')) do %> <%= @bac.status %> <% end %> - <% t.cell("User") do %> + <% t.cell(t('.cells.user')) do %> <%= link_to_user_if_accessible(@bac.user) %> <% end %> - <% t.cell("Execution Server") do %> + <% t.cell(t('.cells.execution_server')) do %> <%= link_to_bourreau_if_accessible(@bac.remote_resource) %> <% end %> - <% t.cell("Total Number Of Items") do %> + <% t.cell(t('.cells.total_items')) do %> <%= if @bac.is_configured_for_dynamic_items? - "(Dynamic items list)" + t('background_activities.common.dynamic_items_list') elsif @bac.items.size == 0 - "(None ?)" + t('.none_question') else @bac.items.size end %> <% end %> - <% t.cell("Number Of Successes") do %> + <% t.cell(t('.cells.num_successes')) do %> <%= if @bac.is_configured_for_dynamic_items? "-" elsif @bac.num_successes == 0 - "0 (None)" + t('.none') elsif @bac.items.size == @bac.num_successes - "#{@bac.num_successes} (All of them)" + t('.all_of_them', count: @bac.num_successes) else @bac.num_successes end %> <% end %> - <% t.cell("Number Of Items Processed") do %> + <% t.cell(t('.cells.num_processed')) do %> <%= if @bac.is_configured_for_dynamic_items? "-" elsif @bac.current_item == 0 - "0 (None yet!)" + t('.none_yet') elsif @bac.items.size == @bac.current_item - "#{@bac.current_item} (All of them)" + t('.all_of_them', count: @bac.current_item) else @bac.current_item end %> <% end %> - <% t.cell("Number Of Failures") do %> + <% t.cell(t('.cells.num_failures')) do %> <%= if @bac.is_configured_for_dynamic_items? "-" elsif @bac.num_failures == 0 - "0 (None)" + t('.none') elsif @bac.items.size == @bac.num_failures - "#{@bac.num_failures} (All of them)" + t('.all_of_them', count: @bac.num_failures) else @bac.num_failures end @@ -97,7 +97,7 @@ <% if (!@bac.is_configured_for_dynamic_items? && @bac.items.size > 0) %>

- Items + <%= t('.legends.items') %> <% bad_hash = @bac.failed_items.index_by(&:itself) %> <% num_processed = @bac.current_item %> <%= array_to_table(@bac.items.each_with_index.to_a, :table_class => 'xsimple', :cols => 10) do |(item,i),r,c| %> diff --git a/BrainPortal/app/views/bourreaux/_bourreaux_display.html.erb b/BrainPortal/app/views/bourreaux/_bourreaux_display.html.erb index 8d1724896..67512375a 100644 --- a/BrainPortal/app/views/bourreaux/_bourreaux_display.html.erb +++ b/BrainPortal/app/views/bourreaux/_bourreaux_display.html.erb @@ -51,12 +51,12 @@ t.selectable("remote_resource_ids[]") - t.column("Server Type", :type, + t.column(t('.columns.server_type'), :type, :sortable => true, :filters => default_filters_for(@base_scope, :type) - ) { |r| r.is_a?(Bourreau) ? "Execution" : "Portal" } + ) { |r| r.is_a?(Bourreau) ? t('activerecord.models.execution') : t('activerecord.models.portal') } - t.column("Server Name", :name, + t.column(t('.columns.server_name'), :name, :sortable => true ) do |r| link_to_bourreau_if_accessible(r, current_user, :html_options => { @@ -64,13 +64,13 @@ }) end - t.column("Live Revision", :revision, + t.column(t('.columns.live_revision'), :revision, :hidden => true ) do |r| if loaded.(r) revision = r.info(:ping).starttime_revision environment = r.info(:ping).environment - environment = 'Unk Env' if environment == '???' + environment = t('.unk.env') if environment == '???' red_if(revision != '???' && revision != CBRAIN::CBRAIN_StartTime_Revision, revision, nil, :color2 => 'red') + red_if(revision != '???' && environment != Rails.env, "", " (#{environment}!)") else @@ -78,28 +78,28 @@ end end - t.column("Owner", :owner, + t.column(t('.columns.owner'), :owner, :hidden => true, :sortable => true, :filters => default_filters_for(@base_scope, User) ) { |r| link_to_user_with_tooltip(r.user) } - t.column("Project", :group, + t.column(t('.columns.project'), :group, :sortable => true, :filters => default_filters_for(@base_scope, Group) ) { |r| link_to_group_if_accessible(r.group) } - t.column("Time Zone", :time_zone, + t.column(t('.columns.time_zone'), :time_zone, :hidden => true, :sortable => true, :filters => default_filters_for(@base_scope, :time_zone) - ) { |r| r.time_zone || "(Unset)" } + ) { |r| r.time_zone || t('unset_parentheses') } - t.column("Online?", :online, + t.column(t('.columns.online'), :online, :sortable => true - ) { |r| red_if(! r.online?, "Yes", "Offline") } + ) { |r| red_if(! r.online?, t('yes_word'), t('offline')) } - t.column("Tasks", :tasks, &(lambda do |r| + t.column(t('.columns.tasks'), :tasks, &(lambda do |r| return unless r.is_a?(Bourreau) running = CbrainTask.status(:active).where(:bourreau_id => r.id).count @@ -116,7 +116,7 @@ end end)) - t.column("Tasks Space", :tasks_space, &(lambda do |r| + t.column(t('.columns.tasks_space'), :tasks_space, &(lambda do |r| return unless r.is_a?(Bourreau) known = CbrainTask @@ -137,11 +137,11 @@ :generate => "Go" ), { :class => 'no_decorations' }) - contents += " (#{unknown} unkn)" if unknown > 0 + contents += t('.unk.par', unk: unknown) if unknown > 0 contents end)) - t.column("Cache Space (#{check_role(:admin_user) ? 'all' : 'own'})", :cache_space, + t.column(check_role(:admin_user) ? t('.columns.cache_space.all') : t('.columns.cache_space.own'), :cache_space, :hidden => true ) do |r| size = r.sync_status @@ -153,13 +153,13 @@ colored_pretty_size(size) end - t.column("Description", :description, + t.column(t('.columns.description'), :description, :hidden => true, :sortable => true ) { |r| overlay_description(r.description) } - t.column("Status page URL", :status_url) do |r| - link_to("Status", r.external_status_page_url, :class => "action_link", :target => "_blank") if + t.column(t('.columns.status_page_url'), :status_url) do |r| + link_to(t('status_colon'), r.external_status_page_url, :class => "action_link", :target => "_blank") if r.is_a?(Bourreau) && ! r.external_status_page_url.blank? end @@ -176,8 +176,8 @@ # end)) if current_user.has_role?(:admin_user) - t.column("Tools", :tools) do |r| - link_to("(Versions)", { + t.column(t('.columns.tools'), :tools) do |r| + link_to("(#{t('version.one')})", { :controller => :tool_configs, :action => :index, :bourreau_id => r.id, @@ -188,34 +188,34 @@ end if current_user.has_role?(:admin_user) - t.column("Control Tunnel", :tunnel, &(lambda do |r| + t.column(t('.columns.control_tunnel'), :tunnel, &(lambda do |r| return "-" unless r.is_a?(Bourreau) #return "-" unless r.online? master = r.ssh_master if r.online? - red_if(! master.quick_is_alive?, "Open", "DEAD!") + red_if(! master.quick_is_alive?, t('.status.open'), t('.status.dead')) else - master.quick_is_alive? ? "Open" : "-" + master.quick_is_alive? ? t('.status.open') : "-" end end)) end - t.column("Uptime", :uptime, &(lambda do |r| + t.column(t('.columns.uptime'), :uptime, &(lambda do |r| info = r.info(:ping) if loaded.(r) return html_colorize("(...)", "magenta") unless info - return red_if(r.online?, "-", "Down!") if info.name == '???' + return red_if(r.online?, "-", t('.status.down')) if info.name == '???' html_tool_tip( pretty_elapsed(info.uptime.to_i, :num_components => 2, :short => true), :offset_x => 50 ) do - "Since #{to_localtime(info.uptime.to_i.seconds.ago, :datetime)}" + - "(for #{pretty_elapsed(info.uptime.to_i)})" + t('.status.since_for', date: to_localtime(info.uptime.to_i.seconds.ago, :datetime), duration: pretty_elapsed(info.uptime.to_i)) + end end)) if current_user.has_role?(:admin_user) - t.column("Task Workers", :task_workers, &(lambda do |r| + t.column(t('.columns.task_workers'), :task_workers, &(lambda do |r| return "-" unless r.is_a?(Bourreau) return "-" unless r.online? info = r.info(:ping) if loaded.(r) @@ -226,8 +226,8 @@ exp_workers = r.workers_instances proc_workers = r.cbrain_tasks.status(:ruby).count - mess = "Workers: #{nworkers || '?'}/#{exp_workers} " - mess += "(#{proc_workers} processing) " if proc_workers > 0 + mess = t('.task_workers.workers', nworkers: nworkers || '?', exp_workers: exp_workers) + mess += t('.task_workers.workers_processing', proc_workers: proc_workers ) if proc_workers > 0 if nworkers.to_s != exp_workers.to_s html_colorize(mess, "red") else @@ -235,7 +235,7 @@ end end)) - t.column("Activity Workers", :bac_workers, &(lambda do |r| + t.column(t('.columns.activity_workers'), :bac_workers, &(lambda do |r| return "-" unless r.online? info = r.info(:ping) if loaded.(r) nbacworkers = 0 @@ -245,8 +245,8 @@ exp_bacworkers = r.activity_workers_instances proc_bac_workers = BackgroundActivity.where(:remote_resource_id => r.id).locked.count - mess = "Workers: #{nbacworkers || '?'}/#{exp_bacworkers} " - mess += "(#{proc_bac_workers} processing) " if proc_bac_workers > 0 + mess = t('.activity_workers.workers', nworkers: nbacworkers || '?', exp_workers: exp_bacworkers) + mess += t('.activity_workers.workers_processing', proc_workers: proc_bac_workers ) if proc_bac_workers > 0 if nbacworkers.to_s != exp_bacworkers.to_s html_colorize(mess, "red") else @@ -263,17 +263,17 @@ <% else %> <%= diff --git a/BrainPortal/app/views/bourreaux/_load_info.html.erb b/BrainPortal/app/views/bourreaux/_load_info.html.erb index 25edb3a14..d7f83851e 100644 --- a/BrainPortal/app/views/bourreaux/_load_info.html.erb +++ b/BrainPortal/app/views/bourreaux/_load_info.html.erb @@ -35,27 +35,27 @@ latest_in_queue_delay = latest_in_queue_delay.to_i rating = case when latest_in_queue_delay < 1.minute - html_colorize("instant", 'green') + html_colorize(t('.delay.instant'), 'green') when latest_in_queue_delay < 2.minute - html_colorize("superb", 'blue') + html_colorize(t('.delay.superb'), 'blue') when latest_in_queue_delay < 15.minutes - html_colorize("good", 'black') + html_colorize(t('.delay.good'), 'black') when latest_in_queue_delay < 1.hour - html_colorize("mediocre", 'orange') + html_colorize(t('.delay.mediocre'), 'orange') when latest_in_queue_delay < 2.hours - html_colorize("bad", 'purple') + html_colorize(t('.delay.bad'), 'purple') else - html_colorize("awful", 'red') + html_colorize(t('.delay.awful'), 'red') end %> - Last wait time: <%= pretty_elapsed(latest_in_queue_delay.to_i, :num_components => 2) %> (<%= rating %>)
+ <%= t('.last_wait_time', time: pretty_elapsed(latest_in_queue_delay.to_i, :num_components => 2), rating: rating ) %>
<% unless time_of_last_queue_delay.blank? %> - (This happened <%= pretty_elapsed(Time.now.to_i - time_of_last_queue_delay.to_i, :num_components => 2) %> ago)  - more info
+ <%= t('.queue_info', time: pretty_elapsed(Time.now.to_i - time_of_last_queue_delay.to_i, :num_components => 2)) %>  + <%= t('.more_info') %>
<% end %> <% end %>
-Number of active tasks (all users): <%= num_active %>
-Number of queued tasks (all users): <%= num_queued %>
-Number of running tasks (all users): <%= num_processing %> +<%= t('.number_of.active_tasks', num_active: num_active ) %>
+<%= t('.number_of.queued_tasks', num_queued: num_queued ) %>
+<%= t('.number_of.running_tasks', num_processing: num_processing ) %>
diff --git a/BrainPortal/app/views/bourreaux/_notes.html.erb b/BrainPortal/app/views/bourreaux/_notes.html.erb index 7511958df..dd57ea0ca 100644 --- a/BrainPortal/app/views/bourreaux/_notes.html.erb +++ b/BrainPortal/app/views/bourreaux/_notes.html.erb @@ -25,26 +25,10 @@

- <%= show_hide_toggle "Show configuration notes", "#notesbody", :class => 'action_link', :alternate_text => "Hide configuration notes" %> + <%= show_hide_toggle t('.show_configuration_notes'), "#notesbody", :class => 'action_link', :alternate_text => t('.hide_configuration_notes') %>

- diff --git a/BrainPortal/app/views/bourreaux/_runtime_info.html.erb b/BrainPortal/app/views/bourreaux/_runtime_info.html.erb index 3dc2ad134..9112e08ac 100644 --- a/BrainPortal/app/views/bourreaux/_runtime_info.html.erb +++ b/BrainPortal/app/views/bourreaux/_runtime_info.html.erb @@ -21,56 +21,57 @@ # -%> -<%= show_table(@info, :header => "Runtime Information") do |t| %> +<%= show_table(@info, :header => t('.headings.runtime_information')) do |t| %> <% if @info.name == "???" %> <% t.row do %> - This server is currently <%= html_colorize("DOWN", "red") %>. + <% colorized_down = html_colorize(t('.server_status.down'), "red")%> + <%= t('.server_status.server_status', status: colorized_down) %>. <% end %> <% else %> - <% t.cell("Rails Environment", :show_width => 2) { red_if(@info.environment != Rails.env,@info.environment) } %> + <% t.cell(t('.cells.rails_environment'), :show_width => 2) { red_if(@info.environment != Rails.env,@info.environment) } %> <% t.blank_row %> - <% t.cell("Process Start Revision", :show_width => 2) { @info.starttime_revision } %> - <% t.cell("Process Start Last Change Author", :show_width => 2) { @info.lc_author } %> - <% t.cell("Process Start Last Change Revision", :show_width => 2) { @info.lc_rev } %> - <% t.cell("Process Start Last Change Date", :show_width => 2) { @info.lc_date } %> - <% t.cell("Disk Code Revision", :show_width => 2) { red_if(@info.revision != @info.starttime_revision, @info.revision) } %> + <% t.cell(t('.cells.process.start.revision'), :show_width => 2) { @info.starttime_revision } %> + <% t.cell(t('.cells.process.start.last_change_author'), :show_width => 2) { @info.lc_author } %> + <% t.cell(t('.cells.process.start.last_change_revision'), :show_width => 2) { @info.lc_rev } %> + <% t.cell(t('.cells.process.start.last_change_date'), :show_width => 2) { @info.lc_date } %> + <% t.cell(t('.cells.disk_code_revision'), :show_width => 2) { red_if(@info.revision != @info.starttime_revision, @info.revision) } %> <% t.blank_row %> - <% t.cell("Remote Host Name", :show_width => 2) { (@info.host_name == @bourreau.ssh_control_host) ? + <% t.cell(t('.cells.process.remote_host.name'), :show_width => 2) { (@info.host_name == @bourreau.ssh_control_host) ? @info.host_name : html_colorize(@info.host_name, "red") } %> - <% t.cell("Remote Host IP Address", :show_width => 2) { @info.host_ip } %> - <% t.cell("Remote Host OS Type", :show_width => 2) { @info.host_uname } %> - <% t.cell("Remote Host Uptime", :show_width => 2) { @info.host_uptime } %> - <% t.cell("Rails Server uptime", :show_width => 2) do %> - Up since: <%= to_localtime(@info.uptime.to_i.seconds.ago,:datetime) %> - (for: <%= pretty_elapsed(@info.uptime.to_i.seconds) %>) + <% t.cell(t('.cells.process.remote_host.ip_address'), :show_width => 2) { @info.host_ip } %> + <% t.cell(t('.cells.process.remote_host.os_type'), :show_width => 2) { @info.host_uname } %> + <% t.cell(t('.cells.process.remote_host.uptime'), :show_width => 2) { @info.host_uptime } %> + <% t.cell(t('.cells.rails_server_uptime'), :show_width => 2) do %> + <%= t('.rails_server_uptime.up_since', time: @info.uptime.to_i.seconds.ago) %> + <%= t('.rails_server_uptime.for', duration: @info.uptime.to_i.seconds.ago) %> <% end %> <% t.blank_row %> <% if @bourreau.is_a?(Bourreau) %> - <% t.cell("Worker PIDs") { @info.worker_pids } %> - <% t.cell("Number of Tasks Running") { @info.tasks_tot + " / " + @info.tasks_max } %> + <% t.cell(t('.cells.worker_pids')) { @info.worker_pids } %> + <% t.cell(t('.cells.number_of_tasks_running')) { @info.tasks_tot + " / " + @info.tasks_max } %> - <% t.cell("Workers Last Change Author") { @info.worker_lc_author } %> - <% t.cell("Cluster Management System Type") { red_if(@bourreau.cms_class != @info.bourreau_cms, @info.bourreau_cms) } %> + <% t.cell(t('.cells.workers_last_change_author')) { @info.worker_lc_author } %> + <% t.cell(t('.cells.cluster_management_system_type')) { red_if(@bourreau.cms_class != @info.bourreau_cms, @info.bourreau_cms) } %> - <% t.cell("Workers Last Change Revision") { @info.worker_lc_rev } %> - <% t.cell("Cluster Management System Revision") { @info.bourreau_cms_rev} %> + <% t.cell(t('.cells.workers_last_change_revision')) { @info.worker_lc_rev } %> + <% t.cell(t('.cells.cluster_management_system_revision')) { @info.bourreau_cms_rev} %> - <% t.cell("Workers Last Change Date") { @info.worker_lc_date } %> + <% t.cell(t('.cells.workers_last_change_date')) { @info.worker_lc_date } %> <% t.empty_cell %> <% end %> <% if @bourreau.id == BrainPortal.current_resource.id %> <% t.blank_row %> - <% t.cell("SSH Public Key", :show_width => 2) do %> + <% t.cell(t('.cells.ssh_public_key'), :show_width => 2) do %>
<%= @bourreau.get_ssh_public_key %>
<% end %> <% end %> diff --git a/BrainPortal/app/views/bourreaux/index.html.erb b/BrainPortal/app/views/bourreaux/index.html.erb index 3727a2746..d7bb80736 100644 --- a/BrainPortal/app/views/bourreaux/index.html.erb +++ b/BrainPortal/app/views/bourreaux/index.html.erb @@ -18,11 +18,11 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title 'Execution Servers' %> +<% title t('.title') %>
<%= render :partial => 'bourreaux_display' %> diff --git a/BrainPortal/app/views/bourreaux/index.js.erb b/BrainPortal/app/views/bourreaux/index.js.erb index c4c8bc01b..093495607 100644 --- a/BrainPortal/app/views/bourreaux/index.js.erb +++ b/BrainPortal/app/views/bourreaux/index.js.erb @@ -18,7 +18,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> diff --git a/BrainPortal/app/views/bourreaux/new.html.erb b/BrainPortal/app/views/bourreaux/new.html.erb index 6e8bf2136..660e9e2fc 100755 --- a/BrainPortal/app/views/bourreaux/new.html.erb +++ b/BrainPortal/app/views/bourreaux/new.html.erb @@ -23,221 +23,201 @@ -%> -<% title 'Add New Server' %> +<% title t('.title') %> -

Add New Server

+

<%= t('.headings.main') %>

-<%= error_messages_for @bourreau, :object_name => "server" %> +<%= error_messages_for @bourreau, :object_name => t('activerecord.models.remote_resource.one').downcase %> <%= form_for @bourreau, :as => :bourreau, :url => { :action => "create" }, :datatype => "script" do |f| -%>
-

<%= f.label :name %>
- <%= f.text_field :name %>
-

- Important note: this name must also be changed accordingly in the config file - Bourreau/config/initializers/config_bourreau.rb - for this server to restart properly later on. -
- -

<%= f.label :system_from_email, "System 'From' reply address" %>
- <%= f.text_field :system_from_email %>
-

If set, messages sent automatically by this system will contain this return address.
- -

<%= f.label :description %>
- <%= f.text_area :description, :rows => 10, :cols => 40 %>
-

The first line should be a short summary, and the rest are for any special notes for the users.
- -

<%= f.label :user_id, "Owner" %>
- <%= user_select("bourreau[user_id]", { :selector => @bourreau }, { :disabled => ! current_user.has_role?(:admin_user) } ) %> - -

<%= f.label :group_id, "Project" %>
- <%= group_select("bourreau[group_id]", :selector => @bourreau) %> - -

<%= f.label :online, "Status" %>
- <%= f.select :online, { "Online" => true, "Offline" => false }, :prompt => "Select status" %> - -

<%= f.label :rr_timeout, "Timeout for is alive check (seconds)" %>
- <%= f.text_field :rr_timeout, :size => 5 %> - - -

<%= f.label :time_zone, "Time Zone" %>
- <%= f.time_zone_select :time_zone, - ActiveSupport::TimeZone.all.select { |t| t.name =~ /canada/i }, - { :default => ActiveSupport::TimeZone['Eastern Time (US & Canada)'], - :include_blank => true } - %> - +

<%= f.label :name %>
+ <%= f.text_field :name %>
+ <%= t('.divs.name_html') %> -

+

<%= f.label :system_from_email, t('.labels.system_from_email') %>
+ <%= f.text_field :system_from_email %>
+ <%= t('.divs.system_from_email_html') %> -

- SSH Remote Control Configuration -

<%= f.label :ssh_control_host, "Hostname" %>
- <%= f.text_field :ssh_control_host, :size => 30 %> +

<%= f.label :description %>
+ <%= f.text_area :description, :rows => 10, :cols => 40 %>
+ <%= t('.divs.description_html') %> + +

<%= f.label :user_id, t('.labels.owner') %>
+ <%= user_select("bourreau[user_id]", { :selector => @bourreau }, { :disabled => ! current_user.has_role?(:admin_user) } ) %> + +

<%= f.label :group_id, t('.labels.group') %>
+ <%= group_select("bourreau[group_id]", :selector => @bourreau) %> + +

<%= f.label :online, t('.labels.status') %>
+ <%= f.select :online, { t('.status.online') => true, t('.status.offline') => false }, :prompt => t('.status.prompt') %> + +

<%= f.label :rr_timeout, t('.labels.rr_timeout') %>
+ <%= f.text_field :rr_timeout, :size => 5 %> -

<%= f.label :ssh_control_user, "Username" %>
- <%= f.text_field :ssh_control_user, :size => 10 %> + +

<%= f.label :time_zone, t('time_zone') %>
+ <%= f.time_zone_select :time_zone, + ActiveSupport::TimeZone.all.select { |t| t.name =~ /canada/i }, + { :default => ActiveSupport::TimeZone['Eastern Time (US & Canada)'], + :include_blank => true } + %> + -

<%= f.label :ssh_control_port, "Port Number" %>
- <%= f.text_field :ssh_control_port, :size => 6 %> +

-

<%= f.label :ssh_control_rails_dir, "Rails Server Directory" %>
- <%= f.text_field :ssh_control_rails_dir, :size => 60 %> +

+ <%= t('.legends.ssh_remote_control_configuration') %> +

<%= f.label :ssh_control_host, t('.labels.ssh_control_host') %>
+ <%= f.text_field :ssh_control_host, :size => 30 %> +

<%= f.label :ssh_control_user, t('.labels.ssh_control_user') %>
+ <%= f.text_field :ssh_control_user, :size => 10 %> +

<%= f.label :ssh_control_port, t('.labels.ssh_control_port') %>
+ <%= f.text_field :ssh_control_port, :size => 6 %> +

<%= f.label :ssh_control_rails_dir, t('.labels.ssh_control_rails_dir') %>
+ <%= f.text_field :ssh_control_rails_dir, :size => 60 %>

- Optional SSH JumpHost Configuration -

<%= f.label :jumphost_host, "JumpHost hostname" %>
- <%= f.text_field :jumphost_host, :size => 30 %>
-

<%= f.label :jumphost_user, "JumpHost username" %>
- <%= f.text_field :jumphost_user, :size => 10 %>
-

<%= f.label :jumphost_port, "JumpHost port" %>
- <%= f.text_field :jumphost_port, :size => 6 %>
+ <%= t('.legends.optional_ssh_jump_host_configuration') %> +

<%= f.label :jumphost_host, t('.labels.jump_host') %>
+ <%= f.text_field :jumphost_host, :size => 30 %>
+

<%= f.label :jumphost_user, t('.labels.jump_user') %>
+ <%= f.text_field :jumphost_user, :size => 10 %>
+

<%= f.label :jumphost_port, t('.labels.jump_port') %>
+ <%= f.text_field :jumphost_port, :size => 6 %>

- Cache Management Configuration - -

<%= f.label :dp_cache_dir, "Path to Data Provider caches" %>
- <%= f.text_field :dp_cache_dir, :size => 60 %>
-

Warning! Changing this field will result in resetting the synchronization - status of all files from all Data Providers! Also, the Rails app will have to - be restarted, and all files in that directory will be erased!
- -

<%= f.label :spaced_dp_ignore_patterns, "Patterns for filenames to ignore" %>
- <%= f.text_field :spaced_dp_ignore_patterns, :size => 80 %>
-

Separate several patterns with spaces; each pattern can contain single '*'s, but no '/'s or special characters.
- -

<%= f.label :cache_trust_expire, "Cache Expiration Timeout" %>
- <%= f.select :cache_trust_expire, [ - [ "Never", "0" ], - [ "Six hours", 6.hours.to_i.to_s ], - [ "Twelve hours", 12.hours.to_i.to_s ], - [ "One day", 1.day.to_i.to_s ], - [ "Three days", 3.days.to_i.to_s ], - [ "One week", 1.week.to_i.to_s ], - [ "Two weeks", 2.weeks.to_i.to_s ], - [ "One month", 1.month.to_i.to_s ], - [ "Two months", 2.months.to_i.to_s ], - [ "Three months", 3.months.to_i.to_s ], - [ "Six months", 6.months.to_i.to_s ] + <%= t('.legends.cache_management_configuration') %> +

<%= f.label :dp_cache_dir, t('.labels.dp_cache_dir') %>
+ <%= f.text_field :dp_cache_dir, :size => 60 %>
+ <%= t('.divs.dp_cache_dir_html') %> +

<%= f.label :spaced_dp_ignore_patterns, t('.labels.spaced_dp_ignore_patterns') %>
+ <%= f.text_field :spaced_dp_ignore_patterns, :size => 80 %>
+ <%= t('.divs.spaced_dp_ignore_patterns_html') %> +

<%= f.label :cache_trust_expire, t('.labels.cache_trust_expire') %>
+ <%= f.select :cache_trust_expire, [ + [ t('bourreaux.common.cache_trust_expire_select.never'), "0" ], + [ t('bourreaux.common.cache_trust_expire_select.six_hours'), 6.hours.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.twelve_hours'), 12.hours.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_day'), 1.day.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.three_days'), 3.days.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_week'), 1.week.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.two_weeks'), 2.weeks.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_month'), 1.month.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.two_months'), 2.months.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.three_months'), 3.months.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.six_months'), 6.months.to_i.to_s ] ] %>
-

This means that in the execution server's cache, files that have been recorded - as 'InSync' but were last accessed more than this amount of time will be considered untrustworthy - and will be re-synchronized the next time they are accessed. Set this to a value less than N - if the cluster's file policy, for instance, deletes all scratch files older than N days.
+ <%= t('.divs.cache_trust_expire_html') %>

- Tool Version Configuration - A tool configuration for this Execution Server can be made once the server is created. + <%= t('.legends.tool_version_configuration') %> + <%= t('.tool_version_configuration_explanation') %>

- Cluster Management System Configuration -

<%= f.label :cms_class, "Type of cluster" %>
- <%= f.select :cms_class, [ - [ "(Unconfigured)", "" ], - [ "Sun GridEngine", "ScirSge" ], - [ "PBS", "ScirPbs" ], - [ "MOAB", "ScirMoab" ], - [ "Sharcnet custom", "ScirSharcnet" ], - [ "LSF", "ScirLsf" ], - [ "SLURM", "ScirSlurm" ], - [ "Google Cloud", "ScirGcloudBatch" ], - [ "UNIX processes", "ScirUnix" ], + <%= t('.legends.cluster_management_system_configuration') %> +

<%= f.label :cms_class, t('.labels.cms_class') %>
+ <%= f.select :cms_class, [ + [ t('.cms_class_select.unconfigured'), "" ], + [ t('.cms_class_select.scir_sge'), "ScirSge" ], + [ t('.cms_class_select.scir_pbs'), "ScirPbs" ], + [ t('.cms_class_select.scir_moab'), "ScirMoab" ], + [ t('.cms_class_select.scir_sharcnet'), "ScirSharcnet" ], + [ t('.cms_class_select.scir_lsf'), "ScirLsf" ], + [ t('.cms_class_select.scir_slurm'), "ScirSlurm" ], + [ t('.cms_class_select.scir_gcloud_batch'), "ScirGcloudBatch" ], + [ t('.cms_class_select.scir_unix'), "ScirUnix" ], ] %> -

<%= f.label :cms_shared_dir, "Path to shared work directory" %>
- <%= f.text_field :cms_shared_dir, :size => 60 %>
-

Mandatory. This directory must be visible and writable from all nodes. - This is were the work subdirectories for all tasks will be created.
- -

<%= f.label :cms_default_queue, "Default queue name" %>
- <%= f.text_field :cms_default_queue %>
-

Optional.
- -

<%= f.label :cms_extra_qsub_args, "Extra cluster submission options(sbatch, qsub)" %>
- <%= f.text_field :cms_extra_qsub_args, :size => 60 %>
-

Optional. Careful, this is inserted as-is in the command-line for submitting jobs.
- +

<%= f.label :cms_shared_dir, t('.labels.cms_shared_dir') %>
+ <%= f.text_field :cms_shared_dir, :size => 60 %>
+ <%= t('.divs.cms_shared_dir_html') %> +

<%= f.label :cms_default_queue, t('.labels.cms_default_queue') %>
+ <%= f.text_field :cms_default_queue %>
+ <%= t('.divs.cms_default_queue_html') %> +

<%= f.label :cms_extra_qsub_args, t('.labels.cms_extra_qsub_args') %>
+ <%= f.text_field :cms_extra_qsub_args, :size => 60 %>
+ <%= t('.divs.cms_extra_qsub_args_html') %>

- Task Workers Configuration - -

<%= f.label :workers_instances, "Number of Workers" %>
- <%= f.select :workers_instances, [ - [ "None (for debug)", 0 ], - [ "1", 1 ], - [ "2", 2 ], - [ "3", 3 ], - [ "4", 4 ], - [ "5", 5 ], - [ "10", 10 ], - [ "20", 20 ] + <%= t('.legends.task_workers_configuration') %> + +

<%= f.label :workers_instances, t('.labels.workers_instances') %>
+ <%= f.select :workers_instances, [ + [ t('bourreaux.common.workers_instances_select.none'), 0 ], + [ "1", 1 ], + [ "2", 2 ], + [ "3", 3 ], + [ "4", 4 ], + [ "5", 5 ], + [ "10", 10 ], + [ "20", 20 ] ] %> -

<%= f.label :workers_chk_time, "Check interval" %>
- <%= f.select :workers_chk_time, [ - [ "5 seconds", 5 ], - [ "10 seconds", 10 ], - [ "30 seconds", 30 ], - [ "1 minute (recommended)", 60 ], - [ "2 minutes", 120 ], - [ "5 minutes", 300 ], - [ "15 minutes", 900 ], - [ "1 hour", 3600 ] +

<%= f.label :workers_chk_time, t('.labels.workers_chk_time') %>
+ <%= f.select :workers_chk_time, [ + [ t('bourreaux.common.workers_chk_time_select.five_seconds'), 5 ], + [ t('bourreaux.common.workers_chk_time_select.ten_seconds'), 10 ], + [ t('bourreaux.common.workers_chk_time_select.thirty_seconds'), 30 ], + [ t('bourreaux.common.workers_chk_time_select.one_minute'), 60 ], + [ t('bourreaux.common.workers_chk_time_select.two_minutes'), 120 ], + [ t('bourreaux.common.workers_chk_time_select.five_minutes'), 300 ], + [ t('bourreaux.common.workers_chk_time_select.fifteen_minutes'), 900 ], + [ t('bourreaux.common.workers_chk_time_select.one_hour'), 3600 ] ] %> -

<%= f.label :workers_log_to, "Log destination" %>
- <%= f.select :workers_log_to, [ - [ "Combined file (recommended)", "combined" ], - [ "Separate files", "separate" ], - [ "RAILS log", "bourreau" ], - [ "RAILS stdout", "stdout" ], - [ "RAILS stderr", "stderr" ], - [ "RAILS stdout and stderr", "stdout|stderr" ], - [ "No logging", "none" ] +

<%= f.label :workers_log_to, t('.labels.workers_log_to') %>
+ <%= f.select :workers_log_to, [ + [ t('bourreaux.common.workers_log_to_select.combined_file'), "combined" ], + [ t('bourreaux.common.workers_log_to_select.separate_files'), "separate" ], + [ t('bourreaux.common.workers_log_to_select.rails_log'), "bourreau" ], + [ t('bourreaux.common.workers_log_to_select.rails_stdout'), "stdout" ], + [ t('bourreaux.common.workers_log_to_select.rails_stderr'), "stderr" ], + [ t('bourreaux.common.workers_log_to_select.rails_stdout_and_stderr'), "stdout|stderr" ], + [ t('bourreaux.common.workers_log_to_select.no_logging'), "none" ] ] %> -

<%= f.label :workers_verbose, "Log verbosity" %>
- <%= f.select :workers_verbose, [ - [ "Normal", 1 ], - [ "Debug info", 2 ] +

<%= f.label :workers_verbose, t('.labels.workers_verbose') %>
+ <%= f.select :workers_verbose, [ + [ t('bourreaux.common.workers_verbose_select.normal'), 1 ], + [ t('bourreaux.common.workers_verbose_select.debug_info'), 2 ] ] %>
-

This option has no affect if the logs are sent to the RAILS log.
- + <%= t('.divs.workers_verbose_html') %>

- Task Limits - Task limits can be set once the Execution Server is created. + <%= t('.legends.task_limits') %> + <%= t('.task_limits_explanation') %>
-

<%= submit_tag 'Create New Server' %>

+

<%= submit_tag t('.submit') %>

<% end -%> diff --git a/BrainPortal/app/views/bourreaux/rr_access.html.erb b/BrainPortal/app/views/bourreaux/rr_access.html.erb index 0930d2c99..ad9e6b594 100644 --- a/BrainPortal/app/views/bourreaux/rr_access.html.erb +++ b/BrainPortal/app/views/bourreaux/rr_access.html.erb @@ -18,7 +18,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> @@ -26,45 +26,40 @@ -<% title "Execution Server Access" %> +<% title t('.title') %> -

Execution Server Access Report

+

<%= t('.headings.main') %>

<% if @remote_r.empty? || @users.empty? %> - -There is no information to show at this time. - + <%= t('no_information') %> <% else %> + +
- <%= label_tag 'background_activity[options][days_older]', "Finished activities older than:" %> + <%= label_tag 'background_activity[options][days_older]', t('.labels.finished_older') %> - <%= text_field_tag 'background_activity[options][days_older]', @bac.options[:days_older], :size => 3 %> days ago + <%= text_field_tag 'background_activity[options][days_older]', @bac.options[:days_older], :size => 3 %> <%= t('.days_ago') %>
- -
- - - - <% @remote_r.each do |bourreau| %> - - <% end %> - - - <% @users.each do |user| %> - <% - accessible_rr = RemoteResource.find_all_accessible_by_user(user).all.index_by &:id || {} - %> - - + <% @remote_r.each do |bourreau| %> - + <% end %> - <% end %> - -
<%= link_to_bourreau_if_accessible(bourreau, current_user) %> -
<%= bourreau.is_a?(Bourreau) ? "(Execution)" : "(Portal)" %> -
<%= link_to_user_with_tooltip(user) %> <%= accessible_rr[bourreau.id] ? o_icon : times_icon %><%= link_to_bourreau_if_accessible(bourreau, current_user) %> +
<%= bourreau.is_a?(Bourreau) ? "(#{t('activerecord.models.execution')})" : "(#{t('activerecord.models.portal')})" %> +
- - <%= center_legend(nil, [ [o_icon, "accessible"], [times_icon, "not accessible"] ] ) %> - - + <% @users.each do |user| %> + <% + accessible_rr = RemoteResource.find_all_accessible_by_user(user).all.index_by &:id || {} + %> +
<%= link_to_user_with_tooltip(user) %> <%= accessible_rr[bourreau.id] ? o_icon : times_icon %>
+ + <%= center_legend(nil, [ [o_icon, t('.legends.accessible')], [times_icon, t('.legends.not_accessible')] ] ) %> + <% end %> diff --git a/BrainPortal/app/views/bourreaux/rr_access_dp.html.erb b/BrainPortal/app/views/bourreaux/rr_access_dp.html.erb index 3503b57c7..efc4771f8 100644 --- a/BrainPortal/app/views/bourreaux/rr_access_dp.html.erb +++ b/BrainPortal/app/views/bourreaux/rr_access_dp.html.erb @@ -18,37 +18,21 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title "Servers Access to Data Providers" %> +<% title t('.title') %> -

Servers Access to Data Providers

+

<%= t('.headings.main') %>

<% if @rrs.empty? || @dps.empty? %> -There is no information to show at this time. +<%= t('no_information') %> <% else %> -

-This page shows which Servers (rows) can access which Data Providers (columns). -

-

-If you want to launch tasks on a particular Execution Server, make sure they are -configured to access files on Data Providers marked by green circles ( <%= o_icon %> ). -

-

-Data Provider identified below their name with <%= html_colorize("(not syncable)", 'purple') %> -indicate their files can still be accessed through streaming APIs, but can never be fully -synchronized on any server. -

-

-Cells marked with <%= html_colorize('(no access)', 'red') %> -indicate servers that are not allowed to access files on the Data Provider -at all, in any way (streaming or synchronized), even if the Data Provider seems alive. -

+<%= t('.paragraphs.rr_access_explanation_html', o_icon: o_icon, not_syncable: html_colorize("(not syncable)", 'purple'), no_access: html_colorize('(no access)', 'red')) %> <% # We can refresh all online and accessible bourreaux, @@ -59,19 +43,19 @@ rr_can_refresh = @rrs.select { |b| b.online? && b.has_owner_access?(current_user - + - - + + - - + + <% @dps.each do |dp| %> @@ -79,30 +63,30 @@ rr_can_refresh = @rrs.select { |b| b.online? && b.has_owner_access?(current_user <%= nil and link_to_data_provider_if_accessible(dp, current_user, :html_options => { :class => dp.online? ? nil : 'error_link' }) %> <%= link_to_data_provider_if_accessible(dp, current_user) %>
- <%= html_colorize("(offline)") if ! dp.online? %> - <%= html_colorize("(not syncable)".html_safe, 'purple') if dp.not_syncable? %> - <%= html_colorize("(read only)".html_safe, 'purple') if dp.read_only? %> + <%= html_colorize(t('.status.offline')) if ! dp.online? %> + <%= html_colorize(t('.status.not_syncable'), 'purple') if dp.not_syncable? %> + <%= html_colorize(t('.status.read_only'), 'purple') if dp.read_only? %> <% end %> - + <% @rrs.each do |rr| %> - + <% dp_stats = rr.meta[:data_provider_statuses] %> @@ -119,34 +103,31 @@ rr_can_refresh = @rrs.select { |b| b.online? && b.has_owner_access?(current_user <% else %> <%= html_colorize('?','purple') %> <% end %> - <%= html_colorize('(no access)', 'red') if ! dp.rr_allowed_syncing?(rr) %> + <%= html_colorize(t('.status.no_access'), 'red') if ! dp.rr_allowed_syncing?(rr) %> <% end %> <% end %> - +
ServersData Providers<%= t('.headings.servers') %><%= t('.headings.data_providers') %>
NameType<%= t('.headings.name') %><%= t('.headings.type') %> - Last Checked + <%= t('.headings.last_checked') %> <% if rr_can_refresh.size > 1 %> - (<%= link_to "Refresh all", { :refresh => 'all' } %>) + (<%= link_to t('.links.refresh_all'), { :refresh => 'all' } %>) <% end %>
<%= nil and link_to_bourreau_if_accessible(rr, current_user, :html_options => { :class => rr.online? ? nil : 'error_link' }) %> <%= link_to_bourreau_if_accessible(rr, current_user) %> - <%= html_colorize("(offline)") unless rr.online? %> + <%= html_colorize(t('.status.offline')) unless rr.online? %> <%= rr.is_a?(Bourreau) ? "Execution" : "Portal" %><%= rr.is_a?(Bourreau) ? t('activerecord.models.execution') : t('activerecord.models.portal') %> <% last_update = rr.meta[:data_provider_statuses_last_update] %> <% if last_update.blank? %> - (Unknown) + (<%= t('unknown') %>) <% else %> - <%= pretty_elapsed(Time.now.to_i - last_update.to_i, :num_components => 2) %> ago + <%= t('ago_time', time: pretty_elapsed(Time.now.to_i - last_update.to_i, :num_components => 2))%> <% end %> <% if rr_can_refresh.include?(rr) %> - (<%= link_to "Refresh", :refresh => rr.id %>) + (<%= link_to t('refresh'), :refresh => rr.id %>) <% end %>
- - <%= center_legend("Data Provider Status:", [ [o_icon, "alive"], [times_icon, "down"], [html_colorize('?','purple'), "no information"] ] ) %> - + + <%= center_legend(t('.legends.data_provider_status'), [ [o_icon, t('.status.alive')], [times_icon, t('.status.down')], [html_colorize('?','purple'), t('no_information')] ] ) %> + <% if false && !dps_offline.empty? %> <% # commented out %> -

- Data Providers offline: +

+ <%= t('.data_providers_offline') %> <%= array_to_table(dps_offline, :ratio => "1:10", :min_data => 10) do |dp| %> <%= link_to_data_provider_if_accessible(dp, current_user) %> <% end %> <%end%> - +

- + <% if !rr_can_refresh.empty? %> - Note: Clicking on Refresh triggers a background process on the server - that will poll each Data Provider; this can take several minutes to complete. + <%= t('.note_html') %> <% end %> - - - + <% end %> diff --git a/BrainPortal/app/views/bourreaux/rr_disk_usage.html.erb b/BrainPortal/app/views/bourreaux/rr_disk_usage.html.erb index 3b3a6e1b6..78bc7d81d 100644 --- a/BrainPortal/app/views/bourreaux/rr_disk_usage.html.erb +++ b/BrainPortal/app/views/bourreaux/rr_disk_usage.html.erb @@ -27,7 +27,7 @@ -<% title "Disk Usage Caches" %> +<% title t('.title') %> <% # Precompute a hash of active tasks for all pairs [user_id,bourreau_id] # Used to provde red warnings when there are active tasks on a bourreau @@ -38,7 +38,7 @@ CbrainTask.status(:active).where(:user_id => uids, :bourreau_id => bids).group(:user_id,:bourreau_id).count %> -

Disk Usage Statistics for Server's Data Provider Caches

+

<%= t('.headings.main') %>

<%= form_tag(:action => :cleanup_caches) do %> @@ -56,7 +56,7 @@ <% else %> <%= link_to_bourreau_if_accessible(rr, current_user) %>
- <%= rr.is_a?(Bourreau) ? "(Execution)" : "(Portal)" %> + <%= rr.is_a?(Bourreau) ? "(#{t('activerecord.models.execution')})" : "(#{t('activerecord.models.portal')})" %> <% if rr.has_owner_access?(current_user) %>
<%= rr.dp_cache_dir %> <% end %> @@ -91,21 +91,21 @@ <%= disk_space_info_display(cell[:size] || 0) do %> <%= pretty_size(cell[:size]) %>
- <%= (pluralize(cell[:num_entries],"entry") + " / " + pluralize(cell[:num_files],"file")).gsub(/ / ," ").html_safe %> + <%= t('.entries_and_files_html', entries: t('.entry', count: cell[:num_entries]), files: t('.file', count: cell[:num_files])) %> <% if cell[:unknowns] > 0 %> -
<%= pluralize(cell[:unknowns],"unknown").gsub(/ / ," ").html_safe %> +
<%= t('.unknown_count', count: cell[:unknowns]).gsub(/ / ," ").html_safe %> <% end %> <% if @report_rrs.include?(rr) && @report_users.include?(user) %>
<%= check_box_tag('clean_cache[]', "#{user.id},#{rr.id}", false, :class => "clean_cache_users_#{user.id} clean_cache_rrs_#{rr.id}" ) %> <% if user.is_a?(User) && rr.is_a?(Bourreau) # && @cache_older <= 6.days.to_i %> <% active_cnt = active_counts_by_uid_bid[[user.id, rr.id]] || 0 %> - <%= red_if(active_cnt > 0, "", "(Danger! " + pluralize(active_cnt,"active task") + "!)") %> + <%= red_if(active_cnt > 0, "", "(" + t('.active_task', count: active_cnt) + ")") %> <% end %> <% elsif @report_users_all[-1] == user && ! @report_users.include?(user) %>
<% if user.is_a?(String) %> - All on <%= rr.name %>: + <%= t('.all_on', name: rr.name) %> <% end %> <%= select_all_checkbox( "clean_cache_rrs_#{rr.id}" ) %> <% end %> @@ -119,10 +119,10 @@ <% if @report_rrs.size == 0 && @report_users.size == 0 %> - (There are no entries in this report) + <%= t('.headings.no_entries') %> <% else %> - <%= submit_tag 'Cleanup Selected Caches' %> + <%= submit_tag t('.submits.cleanup_selected') %> <% end %> @@ -147,22 +147,22 @@ <%= form_tag({ :action => :rr_disk_usage }, :method => :get) do %> -

Filter this report: files reported above...

+

<%= t('.headings.filter') %>

- ... are of type:
+ <%= t('.of_type') %>
<%= userfile_type_select :types, {:selector => params[:types]} , :multiple => true, :size => 10 %> -
(None selected means any) +
<%= t('.none_means_any_html') %>
- ... were last accessed:
+ <%= t('.last_accessed') %>
<% params[:date_range] ||= {} %> <% params[:date_range]["relative_from"] ||= 50.years.to_i.to_s %> <% params[:date_range]["relative_to"] ||= 1.week.to_i.to_s %> <%= date_range_panel(params[:date_range], "date_range", :date_attributes => [], :without_abs => true) %>

- <%= submit_tag 'Refresh Report' %> + <%= submit_tag t('.submit') %>
<% end %> diff --git a/BrainPortal/app/views/bourreaux/show.html.erb b/BrainPortal/app/views/bourreaux/show.html.erb index 955de79aa..bfbc0275b 100755 --- a/BrainPortal/app/views/bourreaux/show.html.erb +++ b/BrainPortal/app/views/bourreaux/show.html.erb @@ -28,25 +28,25 @@ @info = @bourreau.info %> -<% title is_portal ? 'Portal Info' : 'Execution Server Info' %> +<% title is_portal ? t('.titles.portal') : t('.titles.execution_server') %> <% if check_role(:admin_user) || @bourreau.user_id == current_user.id %> <% end %>

-<%= error_messages_for @bourreau, :header_message => "Server could not be updated." %> +<%= error_messages_for @bourreau, :header_message => t('.headings.message_update_error') %>

<%= show_table(@bourreau, :as => :bourreau, :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> @@ -54,112 +54,108 @@ <% t.edit_cell(:name) do |f| %> <%= f.text_field :name %>
- Important note: this name must also be changed accordingly in the config file - <%= is_bourreau ? "Bourreau/config/initializers/config_bourreau.rb" : "BrainPortal/config/initializers/config_portal.rb" %> - for this server to restart properly later on. + <%= is_bourreau ? t('.field_explanations.name_note_bourreau_html') : t('.field_explanations.name_note_portal_html') %>
<% end %> <% t.edit_cell(:description, :content => full_description(@bourreau.description)) do |f| %> <%= f.text_area :description, :rows => 10, :cols => 40 %>
-
The first line should be a short summary, and the rest are for any special notes for the users.

+
<%= t('.field_explanations.description') %>

<% end %> <% t.attribute_cell(:class) %> - <% t.edit_cell(:online, :header => "Status", :content => (@bourreau.online ? "Online" : "Offline")) do |f| %> - <%= f.select :online, [["Online", true], ["Offline", false]] %> + <% t.edit_cell(:online, :header => t('.cells.status'), :content => (@bourreau.online ? t('online') : t('offline'))) do |f| %> + <%= f.select :online, [[t('online'), true], [t('offline'), false]] %> <% end %> - <% t.edit_cell(:user_id, :header => "Owner", :content => link_to_user_with_tooltip(@bourreau.user), :disabled => ! current_user.has_role?(:admin_user)) do %> + <% t.edit_cell(:user_id, :header => t('.cells.owner'), :content => link_to_user_with_tooltip(@bourreau.user), :disabled => ! current_user.has_role?(:admin_user)) do %> <%= user_select("bourreau[user_id]", { :selector => @bourreau } ) %> <% end %> - <% t.edit_cell(:time_zone, :content => (@bourreau.time_zone || "(Unset)") ) do |f| %> + <% t.edit_cell(:time_zone, :content => (@bourreau.time_zone || t('.cells.unset')) ) do |f| %> <%= f.select :time_zone, time_zone_options_for_select(@bourreau.time_zone, /canada/i), :include_blank => true %> <% end %> - <% t.edit_cell(:group_id, :header => "Project", :content => link_to_group_if_accessible(@bourreau.group)) do %> + <% t.edit_cell(:group_id, :header => t('.cells.group'), :content => link_to_group_if_accessible(@bourreau.group)) do %> <%= group_select("bourreau[group_id]", {:selector => @bourreau} ) %> <% end %> - <% t.cell("Revision Info (Client Side)") { Bourreau.revision_info.format() } %> + <% t.cell(t('.cells.revision_info_client')) { Bourreau.revision_info.format() } %> - <% licenses = @bourreau.license_agreements.count == 0 ? "(None)": @bourreau.license_agreements.join("\n") %> + <% licenses = @bourreau.license_agreements.count == 0 ? "(#{t('none')})": @bourreau.license_agreements.join("\n") %> <% t.edit_cell(:license_agreements, :content => licenses) do |f| %> <%= f.text_area :license_agreements, :value => @bourreau.license_agreements.join("\n"), :rows => 5, :cols => 40 %>
-
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+
<%= t('.field_explanations.license_agreements') %>
<% end %> <% if is_bourreau %> <% external_status_page_url = @bourreau.external_status_page_url.nil? ? - "(None)" : link_to(@bourreau.external_status_page_url, @bourreau.external_status_page_url, :class => "action_link", :target => "_blank") %> - <% t.edit_cell(:external_status_page_url, :header => "External status page URL", :content => external_status_page_url ) do |f| %> + "(#{t('none')})" : link_to(@bourreau.external_status_page_url, @bourreau.external_status_page_url, :class => "action_link", :target => "_blank") %> + <% t.edit_cell(:external_status_page_url, :header => t('.headings.external_status_page_url'), :content => external_status_page_url ) do |f| %> <%= f.text_field :external_status_page_url, :size => 60 %>
-
Link to external status page for the server.
+
<%= t('.field_explanations.external_status_page') %>
<% end %> <% end %> <% if is_portal %> - <% t.edit_cell(:help_url, :header => "User Manual URL", :show_width => 1) do |f| %> + <% t.edit_cell(:help_url, :header => t('.headings.user_manual_url'), :show_width => 1) do |f| %> <%= f.text_field :help_url, :size => 40 %>
-
If set, the portal will show a link called 'User Manual' in the account bar at the top.
+
<%= t('.field_explanations.user_manual_url') %>
<% end %> <% t.edit_cell :site_url_prefix, - :header => "Base Portal URL", - :content => (@bourreau.site_url_prefix.blank? ? "(None)" : @bourreau.site_url_prefix), + :header => t('.headings.base_portal_url'), + :content => (@bourreau.site_url_prefix.blank? ? "(#{t('none')})" : @bourreau.site_url_prefix), :show_width => 2 do |f| %> <%= f.text_field :site_url_prefix, :size => 40 %>
- Required to direct new users to the portal, this should be filled in with the base URL of the portal + <%= t('.field_explanations.base_portal_url_html') %>
<% end %> <% t.edit_cell :nh_site_url_prefix, - :header => "NeuroHub Base Portal URL", - :content => (@bourreau.nh_site_url_prefix.blank? ? "(None)" : @bourreau.nh_site_url_prefix), + :header => t('.headings.neurohub_base_url'), + :content => (@bourreau.nh_site_url_prefix.blank? ? "(#{t('none')})" : @bourreau.nh_site_url_prefix), :show_width => 2 do |f| %> <%= f.text_field :nh_site_url_prefix, :size => 40 %>
- Required to direct new users to the NeuroHub portal, this should be filled in with the base URL of the portal + <%= t('.field_explanations.neurohub_base_url_html') %>
<% end %> <% t.edit_cell :small_logo, - :header => "Small logo", - :content => (@bourreau.small_logo.blank? ? "(None)" : @bourreau.small_logo), + :header => t('.headings.small_logo'), + :content => (@bourreau.small_logo.blank? ? "(#{t('none')})" : @bourreau.small_logo), :show_width => 1 do |f| %> <%= f.text_field :small_logo, :size => 40 %>
<% end %> <% t.edit_cell :large_logo, - :header => "Large logo", - :content => (@bourreau.large_logo.blank? ? "(None)" : @bourreau.large_logo), + :header => t('.headings.large_logo'), + :content => (@bourreau.large_logo.blank? ? "(#{t('none')})" : @bourreau.large_logo), :show_width => 1 do |f| %> <%= f.text_field :large_logo, :size => 40 %>
<% end %> <% t.edit_cell 'meta[large_upload_url]', - :header => "Help URL for large uploads", - :content => (@bourreau.meta[:large_upload_url].blank? ? "(None)" : @bourreau.meta[:large_upload_url]), + :header => t('.headings.large_upload_url'), + :content => (@bourreau.meta[:large_upload_url].blank? ? "(#{t('none')})" : @bourreau.meta[:large_upload_url]), :show_width => 1 do %> <%= text_field_tag "meta[large_upload_url]", @bourreau.meta[:large_upload_url], :size => 40 %>
- If set, the portal will show a link called "Large datasets?" in the upload panel sending - users to a custom page where you can provide explanations for alternative upload methods. + <%= t('.field_explanations.large_upload_url') %>
<% end %> <% t.edit_cell 'meta[upload_size_limit]', - :header => "File upload size limit (MB)", - :content => (@bourreau.meta[:upload_size_limit].blank? ? "(None)" : @bourreau.meta[:upload_size_limit]), + :header => t('.headings.upload_size_limit'), + :content => (@bourreau.meta[:upload_size_limit].blank? ? "(#{t('none')})" : @bourreau.meta[:upload_size_limit]), :show_width => 1 do %> <%= text_field_tag "meta[upload_size_limit]", @bourreau.meta[:upload_size_limit], :size => 20 %>
- If set (and numeric), the portal will show a warning when uploading files about the maximum allowed file - size for uploads. Note that this limit needs to be manually enforced on the web server hosting this portal. + <%= t('.field_explanations.upload_size_limit') %>
<% end %> @@ -168,25 +164,25 @@ <% end %> <% if check_role(:admin_user) && is_portal %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Mail configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell(:support_email, :header => "Support email address") do |f| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.mail_configuration'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <% t.edit_cell(:support_email, :header => t('.headings.support_email')) do |f| %> <%= f.text_field :support_email, :size => 30 %>
-
If set, the portal will show a mailto: link for letting users contact support.
+
<%= t('.field_explanations.support_email_html') %>
<% end %> - <% t.edit_cell(:system_from_email, :header => "System 'From' reply address") do |f| %> + <% t.edit_cell(:system_from_email, :header => t('.headings.system_from_email')) do |f| %> <%= f.text_field :system_from_email, :size => 30 %>
-
If set, messages sent automatically by this system will contain this return address.
+
<%= t('.field_explanations.system_from_email') %>
<% end %> - <% t.edit_cell(:nh_support_email, :header => "NeuroHub Support email address") do |f| %> + <% t.edit_cell(:nh_support_email, :header => t('.headings.nh_support_email')) do |f| %> <%= f.text_field :nh_support_email, :size => 30 %>
-
If set, the portal will show a mailto: link for letting users contact NeuroHub support.
+
<%= t('.field_explanations.nh_support_email_html') %>
<% end %> - <% t.edit_cell(:nh_system_from_email, :header => "NeuroHub System 'From' reply address") do |f| %> + <% t.edit_cell(:nh_system_from_email, :header => t('.headings.nh_system_from_email')) do |f| %> <%= f.text_field :nh_system_from_email, :size => 30 %>
-
If set, NeuroHub messages sent automatically by this system will contain this return address.
+
<%= t('.field_explanations.nh_system_from_email') %>
<% end %> - <% t.edit_cell("meta[error_message_mailing_list]", :header => "Error notifications sent to members of project", :content => link_to_group_if_accessible(@bourreau.meta[:error_message_mailing_list])) do %> - <%= group_select("meta[error_message_mailing_list]", {:include_blank => "All admins", :selector => @bourreau.meta[:error_message_mailing_list], :groups => WorkGroup.where(:creator_id => AdminUser.all.map(&:id)) } ) %> + <% t.edit_cell("meta[error_message_mailing_list]", :header => t('.headings.error_notifications'), :content => link_to_group_if_accessible(@bourreau.meta[:error_message_mailing_list])) do %> + <%= group_select("meta[error_message_mailing_list]", {:include_blank => t('.all_admins'), :selector => @bourreau.meta[:error_message_mailing_list], :groups => WorkGroup.where(:creator_id => AdminUser.all.map(&:id)) } ) %> <% end %> <% end %> <% end %> @@ -196,167 +192,155 @@ <% if is_bourreau %> - <%= show_table(@bourreau, :as => :bourreau, :header => "SSH Connection Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.ssh_connection_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell(:ssh_control_host, :header => "SSH Hostname") do |f| %> + <% t.edit_cell(:ssh_control_host, :header => t('.headings.ssh_hostname')) do |f| %> <%= f.text_field :ssh_control_host, :size => 30 %> <% end %> - <% t.edit_cell(:ssh_control_rails_dir, :header => "Rails Server Directory") do |f| %> + <% t.edit_cell(:ssh_control_rails_dir, :header => t('.headings.rails_server_directory')) do |f| %> <%= f.text_field :ssh_control_rails_dir, :size => 60 %> <% end %> - <% t.edit_cell(:ssh_control_user, :header => "SSH User") do |f| %> + <% t.edit_cell(:ssh_control_user, :header => t('.headings.ssh_user')) do |f| %> <%= f.text_field :ssh_control_user, :size => 10 %> <% end %> - <% t.edit_cell(:ssh_control_port, :header => "SSH Port") do |f| %> + <% t.edit_cell(:ssh_control_port, :header => t('.headings.ssh_port')) do |f| %> <%= f.text_field :ssh_control_port, :size => 6 %> <% end %> - <% t.edit_cell(:active_resource_control_port, :header => "Local Control Port") do |f| %> + <% t.edit_cell(:active_resource_control_port, :header => t('.headings.local_control_port')) do |f| %> <%= f.text_field :active_resource_control_port, :size => 6 %> <% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Optional SSH JumpHost Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.ssh_jumphost'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell(:jumphost_host, :header => "JumpHost Hostname") do |f| %> + <% t.edit_cell(:jumphost_host, :header => t('.headings.jumphost_hostname')) do |f| %> <%= f.text_field :jumphost_host, :size => 30 %> <% end %> - <% t.edit_cell(:jumphost_user, :header => "JumpHost User") do |f| %> + <% t.edit_cell(:jumphost_user, :header => t('.headings.jumphost_user')) do |f| %> <%= f.text_field :jumphost_user, :size => 10 %> <% end %> - <% t.edit_cell(:jumphost_port, :header => "JumpHost Port") do |f| %> + <% t.edit_cell(:jumphost_port, :header => t('.headings.jumphost_port')) do |f| %> <%= f.text_field :jumphost_port, :size => 6 %> <% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Optional Reverse Service Connection Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.reverse_service_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> <% t.row() do %>

- This is an alternate mechanism to provide the Bourreau with a distinct database and SSH agent connection. For this to work, - an SSH-accessible server (provided by hostname, port number and username) must be configured to accept the main CBRAIN portal - key, and be visible from the Bourreau. That server must have a SSH agent that provides keys on a UNIX domain socket, - and a database connection for CBRAIN. The database connection specification can be provided as either as a full path - to a UNIX domain socket, or as localhost:port. + <%= t('.paragraphs.reverse_service_description_html') %>

- Some default values shown under the input boxes are guesses based on the currently running Portal. These - are useful if the portal happens to be the server to connect back to. + <%= t('.paragraphs.reverse_service_defaults_html') %>

<% end %> <% t.boolean_edit_cell('bourreau[use_reverse_service]', (@bourreau.use_reverse_service ? "1" : ""), "1", "0", - :header => "Use the SSH Reverse Service", :show_width => 2) %> + :header => t('.headings.use_reverse_service'), :show_width => 2) %> - <% t.edit_cell(:reverse_service_host, :header => "Reverse Service Hostname", :show_width => 1) do |f| %> + <% t.edit_cell(:reverse_service_host, :header => t('.headings.reverse_service_hostname'), :show_width => 1) do |f| %> <%= f.text_field :reverse_service_host, :size => 20 %> -
Default: <%= Socket.gethostname %> +
<%= t('.default_value', value: Socket.gethostname) %> <% end %> - <% t.edit_cell(:reverse_service_port, :header => "Reverse Service Port", :show_width => 1) do |f| %> + <% t.edit_cell(:reverse_service_port, :header => t('.headings.reverse_service_port'), :show_width => 1) do |f| %> <%= f.text_field :reverse_service_port, :size => 6 %> <% end %> - <% t.edit_cell(:reverse_service_user, :header => "Reverse Service User", :show_width => 1) do |f| %> + <% t.edit_cell(:reverse_service_user, :header => t('.headings.reverse_service_user'), :show_width => 1) do |f| %> <%= f.text_field :reverse_service_user, :size => 20 %> -
Default: <%= CBRAIN::Rails_UserName %> +
<%= t('.default_value', value: CBRAIN::Rails_UserName) %> <% end %> <% t.empty_cell %> - <% t.edit_cell(:reverse_service_db_socket_path, :header => "Reverse Service DB Socket Path", :show_width => 2) do |f| %> + <% t.edit_cell(:reverse_service_db_socket_path, :header => t('.headings.reverse_service_db_socket'), :show_width => 2) do |f| %> <%= f.text_field :reverse_service_db_socket_path, :size => 60 %> <% db_host = ApplicationRecord.connection.raw_connection.query_options[:host] rescue nil %> -
Default: <%= db_host == 'localhost' ? 'localhost:3306' : db_host.nil? ? '(Unknown, check your config)' : db_host %> +
<%= t('.default_value', value: (db_host == 'localhost' ? 'localhost:3306' : db_host.nil? ? t('.unknown_check_config') : db_host)) %> <% end %> - <% t.edit_cell(:reverse_service_ssh_agent_socket_path, :header => "Reverse Service SSH Agent Socket Path", :show_width => 2) do |f| %> + <% t.edit_cell(:reverse_service_ssh_agent_socket_path, :header => t('.headings.reverse_service_ssh_agent'), :show_width => 2) do |f| %> <%= f.text_field :reverse_service_ssh_agent_socket_path, :size => 60 %> -
Default: <%= SshAgent.find_current&.socket %> +
<%= t('.default_value', value: SshAgent.find_current&.socket) %> <% end %> <% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Activity Workers Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell :activity_workers_instances, :header => "Number of workers", :show_width => 2 do |f| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.activity_workers_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <% t.edit_cell :activity_workers_instances, :header => t('.headings.activity_workers_number'), :show_width => 2 do |f| %> <%= f.select :activity_workers_instances, [ - [ "None (for debug)", 0 ], - [ "1 (recommended for Bourreaux)", 1 ], - [ "2", 2 ], - [ "3 (recommended for Portals)", 3 ], - [ "4", 4 ], - [ "5", 5 ], - [ "10", 10 ], + [ t('.activity_workers_number_select.none'), 0 ], + [ t('.activity_workers_number_select.recommended_bourreaux'), 1 ], + [ "2", 2 ], + [ t('.activity_workers_number_select.recommended_portals'), 3 ], + [ "4", 4 ], + [ "5", 5 ], + [ "10", 10 ], ] %>
- In a development environment <%= Rails.env == 'development' ? "(like right now)" : "" %> - a single Activity Worker is often enough. In production, a busy Portal might - require more than one Worker, but a Bourreau could work fine with just one. + <%= t('.field_explanations.activity_workers_explanation_html', env_note: (Rails.env == 'development' ? t('.like_right_now') : "")) %>
<% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Cache Management Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell(:dp_cache_dir, :header => "Path to Data Provider caches") do |f| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.cache_management'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <% t.edit_cell(:dp_cache_dir, :header => t('.headings.path_to_dp_caches')) do |f| %> <%= f.text_field :dp_cache_dir, :size => 60 %>
-
Warning! Changing this field will result in resetting the synchronization - status of all files from all Data Providers! Also, the Rails app will have to - be restarted, and all files in that directory will be erased!
+
+ <%= t('.field_explanations.dp_cache_warning') %>
+
<% end %> - <% t.edit_cell(:spaced_dp_ignore_patterns, :header => "Patterns for filenames to ignore", :content => @bourreau.spaced_dp_ignore_patterns) do |f| %> + <% t.edit_cell(:spaced_dp_ignore_patterns, :header => t('.headings.ignore_patterns'), :content => @bourreau.spaced_dp_ignore_patterns) do |f| %> <%= f.text_field :spaced_dp_ignore_patterns, :size => 60 %>
-
Separate several patterns with spaces; each pattern can contain single '*'s, but no '/'s or special characters.
+
+ <%= t('.field_explanations.ignore_patterns') %>
+
<% end %> - <% t.edit_cell(:cache_trust_expire, :header => "Cache Expiration Timeout (in seconds)", :content => (@bourreau.cache_trust_expire == 0 ? "Never" : @bourreau.cache_trust_expire)) do |f| %> + <% t.edit_cell(:cache_trust_expire, :header => t('.headings.cache_expiration'), :content => (@bourreau.cache_trust_expire == 0 ? "Never" : @bourreau.cache_trust_expire)) do |f| %> <%= f.select :cache_trust_expire, [ - [ "Never", "0" ], - [ "Six hours", 6.hours.to_i.to_s ], - [ "Twelve hours", 12.hours.to_i.to_s ], - [ "One day", 1.day.to_i.to_s ], - [ "Three days", 3.days.to_i.to_s ], - [ "One week", 1.week.to_i.to_s ], - [ "Two weeks", 2.weeks.to_i.to_s ], - [ "One month", 1.month.to_i.to_s ], - [ "Two months", 2.months.to_i.to_s ], - [ "Three months", 3.months.to_i.to_s ], - [ "Six months", 6.months.to_i.to_s ] + [ t('bourreaux.common.cache_trust_expire_select.never'), "0" ], + [ t('bourreaux.common.cache_trust_expire_select.six_hours'), 6.hours.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.twelve_hours'), 12.hours.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_day'), 1.day.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.three_days'), 3.days.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_week'), 1.week.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.two_weeks'), 2.weeks.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.one_month'), 1.month.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.two_months'), 2.months.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.three_months'), 3.months.to_i.to_s ], + [ t('bourreaux.common.cache_trust_expire_select.six_months'), 6.months.to_i.to_s ] ] %>
-
This means that in the execution server's cache, files that have been recorded - as 'InSync' but were last accessed more than this amount of time will be considered untrustworthy - and will be re-synchronized the next time they are accessed. Set this to a value less than N - if the cluster's file policy, for instance, deletes all scratch files older than N days.
+
+
<%= t('.field_explanations.cache_expiration_html') %>
+
<% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Data Providers Options", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.dp_options'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> <% persistent = @bourreau.meta[:use_persistent_ssh_masters_for_dps] %> <% persistent = is_portal if persistent.nil? %> <% t.edit_cell 'meta[use_persistent_ssh_masters_for_dps]', - :header => "Use persistent SSH masters for SSH-based DataProviders", - :content => (persistent.to_s == 'true' ? 'Always' : 'Never') do %> + :header => t('.headings.persistent_ssh_masters'), + :content => (persistent.to_s == 'true' ? t('.options.always') : t('.options.never')) do %> <%= select_tag 'meta[use_persistent_ssh_masters_for_dps]', - options_for_select( [ [ "Always", "true" ], [ 'Never', "false" ] ], persistent ) + options_for_select( [ [ t('.options.always'), "true" ], [ t('.options.never'), "false" ] ], persistent ) %>

- When set to 'always', the SSH connections to a data - provider's host will persist after the first use. This - makes successive data transfers a bit faster because - the connection doesn't have to be re-opened every time - it is needed. The default it to have this behavior ON - ('always') for portals and OFF ('never') for execution - servers. + <%= t('.paragraphs.persistent_ssh_explanation') %>

<% # The following hidden field is needed so this table receives at least one attribute @@ -368,11 +352,11 @@ <% if is_bourreau %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Cluster Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.cluster_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell(:cms_class, :header => "Type of cluster") do |f| %> + <% t.edit_cell(:cms_class, :header => t('.headings.type_of_cluster')) do |f| %> <%= f.select :cms_class, [ - [ "(Unconfigured)", "" ], + [ t('.options.unconfigured'), "" ], [ "Sun GridEngine", "ScirSge" ], [ "PBS", "ScirPbs" ], [ "MOAB", "ScirMoab" ], @@ -385,92 +369,101 @@ %> <% end %> - <% t.edit_cell(:cms_default_queue, :header => "Default queue name") do |f| %> + <% t.edit_cell(:cms_default_queue, :header => t('.headings.default_queue_name')) do |f| %> <%= f.text_field :cms_default_queue %>
-
Optional.
+
+ <%= t('.field_explanations.cms_default_queue') %> +
<% end %> <% tool_config = ToolConfig.where(:bourreau_id => @bourreau.id, :tool_id => nil).first %> - <% tool_config_show_link = tool_config ? (link_to "Show", tool_config_path(tool_config)) : "No tool config" %> - <% tool_config_create_link = link_to "Create", new_tool_config_path(:bourreau_id => @bourreau.id) %> - <% t.edit_cell("Common configuration for all tasks", :content => tool_config_show_link) do %> + <% tool_config_show_link = tool_config ? (link_to t('show'), tool_config_path(tool_config)) : t('.links.no_tool_config') %> + <% tool_config_create_link = link_to t('create'), new_tool_config_path(:bourreau_id => @bourreau.id) %> + <% t.edit_cell(t('.cells.common_config_all_tasks'), :content => tool_config_show_link) do %> <%= tool_config ? tool_config_show_link : tool_config_create_link %> <% end %> <% t.empty_cell %> - <% t.edit_cell(:cms_extra_qsub_args, :header => "Extra cluster submission options(sbatch, qsub)", :show_width => 2) do |f| %> + <% t.edit_cell(:cms_extra_qsub_args, :header => t('.headings.extra_qsub_args'), :show_width => 2) do |f| %> <%= f.text_field :cms_extra_qsub_args, :size => 60 %>
-
Optional. Careful, this is inserted as-is in the command-line for submitting jobs.
+
+ <%= t('.field_explanations.cms_extra_qsub_args') %> +
<% end %> - <% t.edit_cell(:cms_shared_dir, :header => "Path to shared work directory", :show_width => 2) do |f| %> + <% t.edit_cell(:cms_shared_dir, :header => t('.headings.path_shared_work_dir'), :show_width => 2) do |f| %> <%= f.text_field :cms_shared_dir, :size => 60 %>
-
Mandatory. This directory must be visible and writable from all nodes. - This is were the work subdirectories for all tasks will be created.
+
+ <%= t('.field_explanations.cms_shared_dir_html') %> +
<% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Task Workers Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell :workers_instances, :header => "Number of workers" do |f| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.task_workers_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <% t.edit_cell :workers_instances, :header => t('.headings.workers_instances') do |f| %> <%= f.select :workers_instances, [ - [ "None (for debug)", 0 ], - [ "1", 1 ], - [ "2", 2 ], - [ "3", 3 ], - [ "4", 4 ], - [ "5", 5 ], - [ "10", 10 ], - [ "20", 20 ] + [ t('bourreaux.common.workers_instances_select.none'), 0 ], + [ "1", 1 ], + [ "2", 2 ], + [ "3", 3 ], + [ "4", 4 ], + [ "5", 5 ], + [ "10", 10 ], + [ "20", 20 ] ] %> <% end %> - <% t.edit_cell :workers_chk_time, :header => "Check interval" do |f| %> + <% t.edit_cell :workers_chk_time, :header => t('.headings.workers_chk_time') do |f| %> <%= f.select :workers_chk_time, [ - [ "5 seconds", 5 ], - [ "10 seconds", 10 ], - [ "30 seconds", 30 ], - [ "1 minute (recommended)", 60 ], - [ "2 minutes", 120 ], - [ "5 minutes", 300 ], - [ "15 minutes", 900 ], - [ "1 hour", 3600 ] + [ t('bourreaux.common.workers_chk_time_select.five_seconds'), 5 ], + [ t('bourreaux.common.workers_chk_time_select.ten_seconds'), 10 ], + [ t('bourreaux.common.workers_chk_time_select.thirty_seconds'), 30 ], + [ t('bourreaux.common.workers_chk_time_select.one_minute'), 60 ], + [ t('bourreaux.common.workers_chk_time_select.two_minutes'), 120 ], + [ t('bourreaux.common.workers_chk_time_select.five_minutes'), 300 ], + [ t('bourreaux.common.workers_chk_time_select.fifteen_minutes'), 900 ], + [ t('bourreaux.common.workers_chk_time_select.one_hour'), 3600 ] ] %> <% end %> - <% t.edit_cell :workers_log_to, :header => "Log destination" do |f| %> + <% t.edit_cell :workers_log_to, :header => t('.headings.workers_log_to') do |f| %> <%= f.select :workers_log_to, [ - [ "Combined file (recommended)", "combined" ], - [ "Separate files", "separate" ], - [ "RAILS log", "bourreau" ], - [ "RAILS stdout", "stdout" ], - [ "RAILS stderr", "stderr" ], - [ "RAILS stdout and stderr", "stdout|stderr" ], - [ "No logging", "none" ] + [ t('bourreaux.common.workers_log_to_select.combined_file'), "combined" ], + [ t('bourreaux.common.workers_log_to_select.separate_files'), "separate" ], + [ t('bourreaux.common.workers_log_to_select.rails_log'), "bourreau" ], + [ t('bourreaux.common.workers_log_to_select.rails_stdout'), "stdout" ], + [ t('bourreaux.common.workers_log_to_select.rails_stderr'), "stderr" ], + [ t('bourreaux.common.workers_log_to_select.rails_stdout_and_stderr'), "stdout|stderr" ], + [ t('bourreaux.common.workers_log_to_select.no_logging'), "none" ] ] %> <% end %> - <% t.edit_cell :workers_verbose, :header => "Log verbosity", :content => ['(Not configured)', 'Normal', 'Debug info' ][@bourreau.workers_verbose || 0] do |f| %> + <% t.edit_cell :workers_verbose, :header => t('.headings.workers_verbose'), :content => [t('.content.not_configured'), t('bourreaux.common.workers_verbose_select.normal'), t('bourreaux.common.workers_verbose_select.debug_info') ][@bourreau.workers_verbose || 0] do |f| %> <%= f.select :workers_verbose, [ - [ "Normal", 1 ], - [ "Debug info", 2 ] + [ t('bourreaux.common.workers_verbose_select.normal'), 1 ], + [ t('bourreaux.common.workers_verbose_select.debug_info'), 2 ] ] %> <% end %> <% end %> - <%= show_table(@bourreau, :as => :bourreau, :header => "Container Configuration", :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> + <%= show_table(@bourreau, :as => :bourreau, :header => t('.headings.container_config'), :edit_condition => @bourreau.has_owner_access?(current_user)) do |t| %> - <% t.edit_cell :docker_executable_name, :header => "Docker executable" do |f| %> + <% t.edit_cell :docker_executable_name, :header => t('.headings.docker_executable_name') do |f| %> <%= f.text_field :docker_executable_name, :size => 60 %>
-
Name of the Docker executable available on the machines where tasks will run. It should always be set if Docker is present.
+
+ <%= t('.field_explanations.docker_executable_name') %> +
<% end %> - <% t.edit_cell :singularity_executable_name, :header => "Singularity executable" do |f| %> + <% t.edit_cell :singularity_executable_name, :header => t('.headings.singularity_executable_name') do |f| %> <%= f.text_field :singularity_executable_name, :size => 60 %>
-
Name of the Singularity executable available on the machines where tasks will run. It should always be set if Singularity is present.
+
+ <%= t('.field_explanations.singularity_executable_name') %> +
<% end %> <% end %> <% end %> @@ -483,6 +476,6 @@ <% if @bourreau.has_owner_access?(current_user) %>

- <%= render :partial => "layouts/log_report", :locals => { :log => @bourreau.getlog, :title => "Server Log" } %> + <%= render :partial => "layouts/log_report", :locals => { :log => @bourreau.getlog, :title => t('.titles.server_log') } %> <% end %> diff --git a/BrainPortal/app/views/cbrain_mailer/forgotten_password.text.erb b/BrainPortal/app/views/cbrain_mailer/forgotten_password.text.erb index 8e7be5cdb..f46ce20a5 100644 --- a/BrainPortal/app/views/cbrain_mailer/forgotten_password.text.erb +++ b/BrainPortal/app/views/cbrain_mailer/forgotten_password.text.erb @@ -1,15 +1,15 @@ -Dear <%= @user.full_name %>, +<%= t('.greeting', name: @user.full_name) %> -Your <%= @service_name %> password has been reset to the following: <%= @user.password.html_safe %> +<%= t('.password_reset', service: @service_name) %> <%= @user.password.html_safe %> -This is a TEMPORARY password, only valid for your next login. Upon logging in, you will immediately be directed to your account page where you must create a new password. +<%= t('.temporary_notice') %> -Access <%= @service_name %> here: +<%= t('cbrain_mailer.common.access_service', service: @service_name) %> <%= @external_url %> -Sincerely, +<%= t('cbrain_mailer.common.closing') %> -The <%= @service_name %> administrators. +<%= t('cbrain_mailer.common.admins', service: @service_name) %> diff --git a/BrainPortal/app/views/cbrain_mailer/registration_confirmation.text.erb b/BrainPortal/app/views/cbrain_mailer/registration_confirmation.text.erb index b49b1adae..1e80c6d64 100644 --- a/BrainPortal/app/views/cbrain_mailer/registration_confirmation.text.erb +++ b/BrainPortal/app/views/cbrain_mailer/registration_confirmation.text.erb @@ -1,20 +1,19 @@ -Welcome to <%= @service_name %>, <%= @user.full_name %>, +<%= t('.welcome', service: @service_name, name: @user.full_name) %> -Your account has been set up. +<%= t('.account_set_up') %> -Access <%= @service_name %> here: +<%= t('cbrain_mailer.common.access_service', service: @service_name) %> <%= @external_url %> -Your username for logging in is: <%= @user.login %> +<%= t('.username') %> <%= @user.login %> <% unless @no_password_reset_needed %> -Your temporary password is: <%= @plain_password.html_safe %> +<%= t('.temporary_password') %> <%= @plain_password.html_safe %> -You will be asked to change your password upon first log in. +<%= t('.password_change_notice') %> <% end %> -Sincerely, - -The <%= @service_name %> administrators. +<%= t('cbrain_mailer.common.closing') %> +<%= t('cbrain_mailer.common.admins', service: @service_name) %> diff --git a/BrainPortal/app/views/cbrain_mailer/signup_notify_admin.text.erb b/BrainPortal/app/views/cbrain_mailer/signup_notify_admin.text.erb index 559fd7b2c..71d17c8ba 100644 --- a/BrainPortal/app/views/cbrain_mailer/signup_notify_admin.text.erb +++ b/BrainPortal/app/views/cbrain_mailer/signup_notify_admin.text.erb @@ -1,22 +1,21 @@ -Someone is asking for a new <%= @service_name %> account: +<%= t('.someone_asking', service: @service_name) %> -Full name: <%= @signup.full_name %> -Email: <%= @signup.email %> -Institution: <%= @signup.institution.presence || "(None provided)" %> +<%= t('activerecord.attributes.user.full_name') %> <%= @signup.full_name %> +<%= t('activerecord.attributes.user.email') %> <%= @signup.email %> +<%= t('activerecord.attributes.user.institution') %> <%= @signup.institution.presence || t('.none_provided') %> <% if @signup.comment.present? %> -The requester provided some comments: +<%= t('.comments_intro') %> ================================================= <%= @signup.comment %> ================================================= <% end %> -As an administrator, you can review the full application here: +<%= t('.review_application') %> <%= @show_url %> -Thank you, - -The <%= @service_name %> system. +<%= t('cbrain_mailer.common.thank_you') %> +<%= t('.system_signature', service: @service_name) %> diff --git a/BrainPortal/app/views/cbrain_mailer/signup_request_confirmation.text.erb b/BrainPortal/app/views/cbrain_mailer/signup_request_confirmation.text.erb index ee51f1c58..fc7b1ecc1 100644 --- a/BrainPortal/app/views/cbrain_mailer/signup_request_confirmation.text.erb +++ b/BrainPortal/app/views/cbrain_mailer/signup_request_confirmation.text.erb @@ -1,12 +1,10 @@ -This is automated message from the <%= @service_name %> signup system. +<%= t('.automated_message', service: @service_name) %> -Please confirm your email address by clicking the link below. -If you did not request an account, you can disregard this message. +<%= t('.confirm_email') %> +<%= t('.disregard') %> <%= @confirm_url %> -Once confirmed, the administrators will be -notified, will evaluate your request, and notify you -if your application has been approved. +<%= t('.once_confirmed') %> -Thank you. +<%= t('cbrain_mailer.common.thank_you') %> diff --git a/BrainPortal/app/views/custom_filters/_custom_filter_li.html.erb b/BrainPortal/app/views/custom_filters/_custom_filter_li.html.erb index 542a3f72c..ba438308f 100644 --- a/BrainPortal/app/views/custom_filters/_custom_filter_li.html.erb +++ b/BrainPortal/app/views/custom_filters/_custom_filter_li.html.erb @@ -18,7 +18,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> @@ -37,5 +37,5 @@ %> - <%= link_to "Edit/Delete", custom_filter_path(filter) %> + <%= link_to t('.links.edit_delete'), custom_filter_path(filter) %> diff --git a/BrainPortal/app/views/custom_filters/_custom_filter_list.html.erb b/BrainPortal/app/views/custom_filters/_custom_filter_list.html.erb index 2f2f82404..2c72a375b 100644 --- a/BrainPortal/app/views/custom_filters/_custom_filter_list.html.erb +++ b/BrainPortal/app/views/custom_filters/_custom_filter_list.html.erb @@ -22,9 +22,9 @@ # -%> -

By Custom Filter

+

<%= t('.headings.by_custom_filter') %>

-<%= link_to 'Create Custom Filter', {:controller => :custom_filters, :action => :new, :filter_class => @custom_filter.class.name} %> +<%= link_to t('.links.create_custom_filter'), {:controller => :custom_filters, :action => :new, :filter_class => @custom_filter.class.name} %>
+ +

+ + <%= render :partial => 'show_user_key' %> + + <% end %> + + <%= tb.tab(t('.titles.s3_tab')) do %> + <%= t('.paragraphs.before_ssh_dp') %> <%= f.radio_button :type, 'S3FlatDataProvider' %> + + <%= t('.paragraphs.s3_dp') %> - <%= render :partial => 'show_user_key' %> +

+ <%= t('.legends.s3_params') %> +
> + <%= f.label :cloud_storage_endpoint, t('.labels.cloud_storage_endpoint') %>
+ <%= f.text_field :cloud_storage_endpoint, :size => 80 %> +

+ +

> + <%= f.label :cloud_storage_region, t('.labels.cloud_storage_region') %>
+ <%= f.text_field :cloud_storage_region, :size => 20 %> +

+ +

> + <%= f.label :cloud_storage_client_bucket_name, t('.labels.cloud_storage_client_bucket_name') %>
+ <%= f.text_field :cloud_storage_client_bucket_name, :size => 40 %> +

+ +

> + <%= f.label :cloud_storage_client_path_start, t('.labels.cloud_storage_client_path_start') %>
+ <%= f.text_field :cloud_storage_client_path_start, :size => 80 %> +

+ +

> + <%= f.label :cloud_storage_client_identifier, t('.labels.cloud_storage_client_identifier') %>
+ <%= f.text_field :cloud_storage_client_identifier, :size => 40 %> +

+ +

> + <%= f.label :cloud_storage_client_token, t('.labels.cloud_storage_client_token') %>
+ <%= f.password_field :cloud_storage_client_token, :size => 80 %> +
+
+ + <% end %> + + <% end %> + +

- <%= submit_tag 'Create New Data Provider' %>

+ <%= submit_tag t('.submit') %>

<% end %> - diff --git a/BrainPortal/app/views/data_providers/report.html.erb b/BrainPortal/app/views/data_providers/report.html.erb index 94dc72daa..f7f3f33f7 100644 --- a/BrainPortal/app/views/data_providers/report.html.erb +++ b/BrainPortal/app/views/data_providers/report.html.erb @@ -22,15 +22,15 @@ # -%> -<% title 'Data Provider Report' %> +<% title t('.title') %> -

<%= @provider.name %> - Inconsistency report

+

<%= t('.headings.main', name: @provider.name) %>

<%= form_tag repair_data_provider_path(@provider), :method => :post do %> diff --git a/BrainPortal/app/views/data_providers/show.html.erb b/BrainPortal/app/views/data_providers/show.html.erb index fd5de1b3d..003bff6fb 100644 --- a/BrainPortal/app/views/data_providers/show.html.erb +++ b/BrainPortal/app/views/data_providers/show.html.erb @@ -22,7 +22,7 @@ # -%> -<% title 'Data Provider Info' %> +<% title t('.title') %> <% has_owner_access = (check_role(:admin_user) || @provider.user_id == current_user.id) %> <% is_userkey_dp = @provider.is_a?(UserkeyFlatDirSshDataProvider) %> @@ -31,15 +31,15 @@

-<%= error_messages_for @provider, :header_message => "Provider could not be updated." %> +<%= error_messages_for @provider, :header_message => t('.headings.update_error') %>

@@ -80,49 +80,49 @@ <% t.empty_cell %> <% end %> - <% t.edit_cell(:online, :content => (@provider.online ? "Online" : "Offline")) do |f| %> - <%= f.select :online, [["Online", true], ["Offline", false]] %> + <% t.edit_cell(:online, :content => (@provider.online ? t('online') : t('online'))) do |f| %> + <%= f.select :online, [[t('online'), true], [t('online'), false]] %> <% end %> - <% t.edit_cell(:user_id, :header => "Owner", :content => link_to_user_with_tooltip(@provider.user), :disabled => ! current_user.has_role?(:admin_user) ) do %> + <% t.edit_cell(:user_id, :header => t('owner'), :content => link_to_user_with_tooltip(@provider.user), :disabled => ! current_user.has_role?(:admin_user) ) do %> <%= user_select("data_provider[user_id]", { :selector => @provider } ) %> <% end %> - <% t.edit_cell(:read_only, :content => (@provider.read_only ? "Read Only" : "Read/Write"), :header => "Mode") do |f| %> - <%= f.select :read_only, [["Read/Write", false], ["Read Only", true]] %> + <% t.edit_cell(:read_only, :content => (@provider.read_only ? t('.cells.read_only') : t('.cells.read_write')), :header => t('.headings.mode')) do |f| %> + <%= f.select :read_only, [[t('.cells.read_write'), false], [t('.cells.read_only'), true]] %> <% end %> - <% t.edit_cell(:group_id, :header => "Project", :content => link_to_group_if_accessible(@provider.group) ) do %> + <% t.edit_cell(:group_id, :header => t('.headings.group'), :content => link_to_group_if_accessible(@provider.group) ) do %> <%= group_select("data_provider[group_id]", { :selector => @provider }) %> <% end %> - <% t.edit_cell(:not_syncable, :content => (@provider.not_syncable ? "NOT syncable" : "Fully syncable"), :header => "Syncability") do |f| %> - <%= f.select :not_syncable, [["Fully syncable", false], ["NOT syncable", true]] %> - <% end %> + <% t.edit_cell(:not_syncable, :content => (@provider.not_syncable ? t('.cells.not_syncable') : t('.cells.fully_syncable')), :header => t('data_providers.common.labels.syncability')) do |f| %> + <%= f.select :not_syncable, [[t('.cells.fully_syncable'), false], [t('.cells.not_syncable'), true]] %> + <% end %> <% if current_user.has_role?(:admin_user) %> - <% t.cell("Revision Info (DataProvider)", :show_width => 2) { DataProvider.revision_info.format() } %> - <% t.cell("Revision Info (#{@provider.type})", :show_width => 2) { @provider.revision_info.format() } %> + <% t.cell(t('.cells.revision_info_dp'), :show_width => 2) { DataProvider.revision_info.format() } %> + <% t.cell(t('.cells.revision_info_type_html', type: @provider.type), :show_width => 2) { @provider.revision_info.format() } %> <% end %> <% if ! is_userkey_dp %> - <% t.edit_cell(:time_zone, :content => (@provider.time_zone || "(Unset)"), :show_width => 2 ) do |f| %> + <% t.edit_cell(:time_zone, :content => (@provider.time_zone || t('unset_parentheses')), :show_width => 2 ) do |f| %> <%= f.select :time_zone, time_zone_options_for_select(@provider.time_zone, /canada/i), :include_blank => true %> <% end %> <% end %> <% if has_owner_access %> - <% t.edit_cell(:remote_dir, :header => "Physical Data Location", :show_width => 2) do |f| %> + <% t.edit_cell(:remote_dir, :header => t('.headings.physical_data_location'), :show_width => 2) do |f| %> <%= f.text_field :remote_dir, :size => 80 %> <% end %> <% end %> <% if current_user.has_role?(:admin_user) %> <% joint_licenses = @provider.license_agreements.join("\n") %> - <% licenses = @provider.license_agreements.count == 0 ? "(None)": @provider.license_agreements.join("\n") %> + <% licenses = @provider.license_agreements.count == 0 ? "(#{t('none')})": @provider.license_agreements.join("\n") %> <% t.edit_cell(:license_agreements, :content => licenses, :show_width => 2) do |f| %> <%= f.text_area :license_agreements, :value => joint_licenses, :content => joint_licenses, :rows => 5, :cols => 40 %>
-
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+
<%= t('.field_explanations.license_agreements') %>
<% end %> <% else %> <% t.empty_cell %> @@ -131,14 +131,14 @@ <% end %> <% if has_owner_access && needs_ssh_config %> - <%= show_table(@provider, :as => :data_provider, :header => "SSH parameters", :edit_condition => true) do |t| %> + <%= show_table(@provider, :as => :data_provider, :header => t('.headings.ssh_params'), :edit_condition => true) do |t| %> <% t.edit_cell(:remote_host, :show_width => 2) do |f| %> <%= f.text_field :remote_host, :size => 40 %> <% end %> <% if check_role(:admin_user) %> - <% t.edit_cell(:alternate_host, :show_width => 2, :header => "Alternate hostname(s)") do |f| %> + <% t.edit_cell(:alternate_host, :show_width => 2, :header => t('.headings.alternate_host')) do |f| %> <%= f.text_field :alternate_host, :size => 100 %>
-
Comma-separated list of alternate hostnames; hostname1,hostname2,hostname3,...
+
<%= t('.field_explanations.alternate_host') %>
<% end %> <% end %> <% t.edit_cell(:remote_user) do |f| %> @@ -151,64 +151,64 @@ <% end %> <% if @provider.is_a?(SingSquashfsDataProvider) || @provider.is_a?(SingBindmountDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Containerized Storage Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:containerized_path, :header => 'Containerized Data Path', :show_width => 2) do %> + <%= show_table(@provider, :as => :data_provider, :header => t('.headings.containerized_storage_config'), :edit_condition => true) do |t| %> + <% t.edit_cell(:containerized_path, :header => t('.headings.containerized_data_path'), :show_width => 2) do %> <%= text_field_tag "data_provider[containerized_path]", @provider.containerized_path, :size => 80 %> <% end %> <% end %> <% end %> <% if @provider.is_a?(S3DataProvider) || @provider.is_a?(S3FlatDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Cloud Storage Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:cloud_storage_client_identifier, :header => 'Client Identifier', :show_width => 2) do |f| %> + <%= show_table(@provider, :as => :data_provider, :header => t('.headings.cloud_storage_config'), :edit_condition => true) do |t| %> + <% t.edit_cell(:cloud_storage_client_identifier, :header => t('.headings.cloud_storage_client_identifier'), :show_width => 2) do |f| %> <%= f.text_field :cloud_storage_client_identifier, :size => 40, :autocomplete => 'off' %> <% end %> - <% t.edit_cell(:cloud_storage_client_token, :content => '****************', :header => 'Client Token', :show_width => 2) do |f| %> + <% t.edit_cell(:cloud_storage_client_token, :content => '****************', :header => t('.headings.cloud_storage_client_token'), :show_width => 2) do |f| %> <%= f.password_field :cloud_storage_client_token, :size => 80, :autocomplete => 'off' %> <% end %> - <% t.edit_cell(:cloud_storage_client_bucket_name, :header => 'Client Bucket Name', :show_width => 2) do %> + <% t.edit_cell(:cloud_storage_client_bucket_name, :header => t('.headings.client_bucket_name'), :show_width => 2) do %> <%= text_field_tag "data_provider[cloud_storage_client_bucket_name]", @provider.cloud_storage_client_bucket_name, :size => 80 %> <% end %> - <% t.edit_cell(:cloud_storage_client_path_start, :header => 'Client Starting Path', :show_width => 2) do %> + <% t.edit_cell(:cloud_storage_client_path_start, :header => t('.headings.client_path_start'), :show_width => 2) do %> <%= text_field_tag "data_provider[cloud_storage_client_path_start]", @provider.cloud_storage_client_path_start, :size => 80 %> <% end %> - <% t.edit_cell(:cloud_storage_endpoint, :header => 'Endpoint', :show_width => 2) do %> + <% t.edit_cell(:cloud_storage_endpoint, :header => t('.headings.endpoint'), :show_width => 2) do %> <%= text_field_tag "data_provider[cloud_storage_endpoint]", @provider.cloud_storage_endpoint, :size => 80 %> <% end %> - <% t.edit_cell(:cloud_storage_region, :header => 'Region', :show_width => 2) do %> + <% t.edit_cell(:cloud_storage_region, :header => t('.headings.region'), :show_width => 2) do %> <%= text_field_tag "data_provider[cloud_storage_region]", @provider.cloud_storage_region, :size => 80 %> <% end %> <% end %> <% end %> <% if @provider.is_a?(DataladDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Datalad Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:datalad_repository_url, :header => 'Datalad Repository URL', :show_width => 2) do |f| %> + <%= show_table(@provider, :as => :data_provider, :header => t('.headings.datalad_config'), :edit_condition => true) do |t| %> + <% t.edit_cell(:datalad_repository_url, :header => t('.headings.datalad_url'), :show_width => 2) do |f| %> <%= f.text_field :datalad_repository_url %> <% end %> - <% t.edit_cell(:datalad_relative_path, :header => 'Datalad Relative Path', :show_width => 2) do |f| %> + <% t.edit_cell(:datalad_relative_path, :header => t('.headings.datalad_relative_path'), :show_width => 2) do |f| %> <%= f.text_field :datalad_relative_path %> <% end %> <% end %> <% end %> - <%= show_table(@provider, :as => :data_provider, :header => "Other Properties", :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <%= show_table(@provider, :as => :data_provider, :header => t('.headings.other_properties'), :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> - <% t.boolean_edit_cell("meta[no_uploads]", @provider.meta["no_uploads"], "on", "", :header => "Cannot be used for uploading files in the file manager") %> + <% t.boolean_edit_cell("meta[no_uploads]", @provider.meta["no_uploads"], "on", "", :header => t('.headings.no_uploads')) %> - <% t.boolean_edit_cell("meta[no_viewers]", @provider.meta["no_viewers"], "on", "", :header => "Files cannot be viewed in the file manager") %> + <% t.boolean_edit_cell("meta[no_viewers]", @provider.meta["no_viewers"], "on", "", :header => t('.headings.no_viewers')) %> <% if @provider.is_browsable? %> - <% t.boolean_edit_cell("meta[must_move]", @provider.meta["must_move"], "on", "", :header => "Files must be copied/moved upon registration") %> + <% t.boolean_edit_cell("meta[must_move]", @provider.meta["must_move"], "on", "", :header => t('.headings.must_move')) %> <% t.edit_cell("meta[browse_gid]", - :header => "Files can be browsed only by members of this project", - :content => @provider.meta[:browse_gid].present? ? link_to_group_if_accessible(@provider.meta[:browse_gid]) : '(Any Users)', + :header => t('.headings.browse_gid'), + :content => @provider.meta[:browse_gid].present? ? link_to_group_if_accessible(@provider.meta[:browse_gid]) : t('data_providers.common.any_users'), :show_width => 2 ) do %> - <%= group_select 'meta[browse_gid]', { :selector => @provider.meta[:browse_gid] }, { :include_blank => "(Any Users)" } %> + <%= group_select 'meta[browse_gid]', { :selector => @provider.meta[:browse_gid] }, { :include_blank => t('.include_blanks.any_users') } %> <% end %> <% end %> @@ -222,9 +222,9 @@ <% if other_dps.size > 0 %> - <%= show_table(@provider, :as => :data_provider, :width => 5, :header => 'Files can be copied or moved to these other Data Providers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <%= show_table(@provider, :as => :data_provider, :width => 5, :header => t('.headings.copy_move_targets'), :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> <% if dps_by_category[:official] %> - <% t.row(:class => 'subheader') { "Official Storage".html_safe } %> + <% t.row(:class => 'subheader') { t('.headings.official_storage_html').html_safe } %> <% dps_by_category[:official].sort_by(&:name).each do |dp| %> <% meta_key = "dp_no_copy_#{dp.id}" %> <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> @@ -234,7 +234,7 @@ <% t.blank_row %> <% if dps_by_category[:user] %> - <% t.row(:class => 'subheader') { "User or Site Storage".html_safe } %> + <% t.row(:class => 'subheader') { t('.headings.user_site_storage_html').html_safe } %> <% dps_by_category[:user].sort_by(&:name).each do |dp| %> <% meta_key = "dp_no_copy_#{dp.id}" %> <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> @@ -248,22 +248,22 @@ <% if other_rrs.size > 0 %> - <%= show_table(@provider, :as => :data_provider, :width => 5, :header => 'File contents can be accessed by these Servers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <%= show_table(@provider, :as => :data_provider, :width => 5, :header => t('.headings.accessed_by_servers'), :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> <% if rrs_by_category[:portal] %> - <% t.row(:class => 'subheader') { "Portals".html_safe } %> + <% t.row(:class => 'subheader') { t('.headings.portals_html').html_safe } %> <% rrs_by_category[:portal].sort_by(&:name).each do |rr| %> <% meta_key = "rr_no_sync_#{rr.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", t('.headings.cannot_sync_html', rr: rr.name, dp: @provider.name), :header => "#{rr.name}", :class => 'checkbox_label') %> <% end%> <% end%> <% t.blank_row %> <% if rrs_by_category[:bourreau] %> - <% t.row(:class => 'subheader') { "Execution Servers".html_safe } %> + <% t.row(:class => 'subheader') { t('.headings.execution_servers_html').html_safe } %> <% rrs_by_category[:bourreau].sort_by(&:name).each do |rr| %> <% meta_key = "rr_no_sync_#{rr.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", t('.headings.cannot_sync_html', rr: rr.name, dp: @provider.name), :header => "#{rr.name}", :class => 'checkbox_label') %> <% end%> <% end%> <% end%> @@ -279,15 +279,15 @@ <% elsif needs_ssh_config %>
- - - + + +
Public SSH Key for this CBRAIN Portal
This key should be installed on this Data Provider's host machine to allow remote access.
<%= pretty_ssh_key(RemoteResource.current_resource.get_ssh_public_key || 'Unknown! Talk to sysadmin!') %>
<%= t('.headings.public_ssh_key_note') %>
<%= t('.datas.portal_key_note') %>
<%= pretty_ssh_key(RemoteResource.current_resource.get_ssh_public_key || t('.datas.unknown_key')) %>
<% end %>

- <%= render :partial => "layouts/log_report", :locals => { :log => @provider.getlog, :title => "Data Provider Log" } %> + <%= render :partial => "layouts/log_report", :locals => { :log => @provider.getlog, :title => t('.titles.log') } %> <% end %> diff --git a/BrainPortal/app/views/exception_logs/_exception_logs_table.html.erb b/BrainPortal/app/views/exception_logs/_exception_logs_table.html.erb index 706f58a28..67efb1721 100644 --- a/BrainPortal/app/views/exception_logs/_exception_logs_table.html.erb +++ b/BrainPortal/app/views/exception_logs/_exception_logs_table.html.erb @@ -23,7 +23,7 @@ -%>

<%= @@ -35,7 +35,7 @@ @@ -64,26 +64,26 @@ t.paginate t.selectable('exception_log_ids[]') - t.column("Exception", :exception_class, + t.column(t('.columns.exception'), :exception_class, :sortable => true, :filters => default_filters_for(@base_scope, :exception_class) ) { |e| link_to e.exception_class, e } - t.column("Message", :message) { |e| crop_text_to(75, e.message) } + t.column(t('.columns.message'), :message) { |e| crop_text_to(75, e.message) } - generic_column.("Method", :request_method) - generic_column.("Controller", :request_controller) - generic_column.("Action", :request_action) - generic_column.("Format", :request_format) + generic_column.(t('.columns.method'), :request_method) + generic_column.(t('.columns.controller'), :request_controller) + generic_column.(t('.columns.action'), :request_action) + generic_column.(t('.columns.format'), :request_format) - t.column("User", :user, + t.column(t('.columns.user'), :user, :sortable => true, :filters => default_filters_for(@view_scope, User) ) { |e| link_to_user_with_tooltip(e.user) } - generic_column.("Revision", :revision_no) + generic_column.(t('.columns.revision'), :revision_no) - t.column("Raised at", :created_at, + t.column(t('.columns.raised_at'), :created_at, :sortable => true ) { |e| to_localtime(e.created_at, :datetime) } %> diff --git a/BrainPortal/app/views/exception_logs/index.html.erb b/BrainPortal/app/views/exception_logs/index.html.erb index edeba6f80..0894e75a4 100644 --- a/BrainPortal/app/views/exception_logs/index.html.erb +++ b/BrainPortal/app/views/exception_logs/index.html.erb @@ -18,11 +18,11 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title 'Exception Logs' %> +<% title t('.title') %>
<%= render :partial => 'exception_logs_table' %> diff --git a/BrainPortal/app/views/exception_logs/show.html.erb b/BrainPortal/app/views/exception_logs/show.html.erb index 967ad0fa4..e90ae88d2 100644 --- a/BrainPortal/app/views/exception_logs/show.html.erb +++ b/BrainPortal/app/views/exception_logs/show.html.erb @@ -22,44 +22,44 @@ # -%> -<% title 'Exception Info' %> +<% title t('.title') %>
<%= form_tag(url_for(:action => :destroy), :method => :delete) do %> <%= hidden_field_tag "exception_log_ids[]", @exception_log.id %> - <%= submit_tag "Delete", :class => "button", :data => { :confirm => 'Delete this exception report?' } %> + <%= submit_tag t('delete'), :class => "button", :data => { :confirm => t('.submit.delete_message') } %> <% end %>
<%= @exception_log.exception_class %>: <%= @exception_log.message %> -
in <%= @exception_log.request_controller %>/<%= @exception_log.request_action %>
+
<%= t('.exception_message', location: "#{@exception_log.request_controller}/#{@exception_log.request_action}") %>
- <%= show_table(@exception_log, :width => 1, :header => "Request") do |t| %> - <% t.cell("Raised at") { to_localtime(@exception_log.created_at,:datetime) } %> - <% t.cell("URL") { @exception_log.request[:url] } %> - <% t.cell("Method") { @exception_log.request_method } %> - <% t.cell("Parameters", :td_options => { :class => "wrap" }) { @exception_log.request[:parameters] } %> - <% t.cell("Format") { @exception_log.request[:format] } %> - <% t.cell("User") { @exception_log.user.try(:login) || "(Not signed in)" } %> - <% t.cell("Start time revision") { @exception_log.revision_no} %> + <%= show_table(@exception_log, :width => 1, :header => t('.headings.request')) do |t| %> + <% t.cell(t('.cells.raised_at')) { to_localtime(@exception_log.created_at,:datetime) } %> + <% t.cell(t('.cells.url')) { @exception_log.request[:url] } %> + <% t.cell(t('.cells.method')) { @exception_log.request_method } %> + <% t.cell(t('.cells.parameters'), :td_options => { :class => "wrap" }) { @exception_log.request[:parameters] } %> + <% t.cell(t('.cells.format')) { @exception_log.request[:format] } %> + <% t.cell(t('.cells.user')) { @exception_log.user.try(:login) || t('.not_signed_in') } %> + <% t.cell(t('.cells.start_time_revision')) { @exception_log.revision_no} %> <% end %>
- Backtrace + <%= t('.legends.backtrace') %>
<%= @exception_log.backtrace.join("\n") %>
- <%= show_table(@exception_log, :width => 2, :header => "Session") do |t| %> + <%= show_table(@exception_log, :width => 2, :header => t('.headings.session')) do |t| %> <% @exception_log.session.keys.sort.each do |k| %> <% t.cell(k, :td_options => { :class => "wrap" }) { @exception_log.session[k] } %> <% end %> <% end %> - <%= show_table(@exception_log, :width => 2, :header => "Headers") do |t| %> + <%= show_table(@exception_log, :width => 2, :header => t('.headings.headers')) do |t| %> <% @exception_log.request_headers.keys.sort.each do |k| %> <% t.cell(k, :td_options => { :class => "wrap" }) { @exception_log.request_headers[k] } %> <% end %> diff --git a/BrainPortal/app/views/groups/_groups_table.html.erb b/BrainPortal/app/views/groups/_groups_table.html.erb index 5b52e0f33..971a4d013 100644 --- a/BrainPortal/app/views/groups/_groups_table.html.erb +++ b/BrainPortal/app/views/groups/_groups_table.html.erb @@ -25,23 +25,23 @@ <% button_view = @scope.custom[:button].present? %> <%= @@ -55,10 +55,10 @@
- Search by name: <%= ajax_search_box "name_like", groups_path %> + <%= t('search_by_name') %><%= ajax_search_box "name_like", groups_path %>
diff --git a/BrainPortal/app/views/groups/_users_form.html.erb b/BrainPortal/app/views/groups/_users_form.html.erb index 9e17a77a1..7b63f3bb8 100644 --- a/BrainPortal/app/views/groups/_users_form.html.erb +++ b/BrainPortal/app/views/groups/_users_form.html.erb @@ -69,14 +69,14 @@ <% user_by_lock_status_hash = @users .sort { |a,b| a.login.casecmp(b.login) } - .hashed_partition { |u| u.account_locked == false ? "Active users" : "Locked users" } + .hashed_partition { |u| u.account_locked == false ? t('.active_users') : t('.locked_users') } active_users = user_by_lock_status_hash["Active users"] || [] locked_users = user_by_lock_status_hash["Locked users"] || [] %>
- Active users + <%= t('.active_users') %>
<%= array_to_table(active_users, :cols => 5, @@ -97,8 +97,8 @@
- Locked users - <%= show_hide_toggle "(Show)", "#locked_users", :class => 'action_link' %> + <%= t('.locked_users') %> + <%= show_hide_toggle "(#{t('show')})", "#locked_users", :class => 'action_link' %> diff --git a/BrainPortal/app/views/groups/_view_list.html.erb b/BrainPortal/app/views/groups/_view_list.html.erb index 2deb8ac09..96370dcdc 100644 --- a/BrainPortal/app/views/groups/_view_list.html.erb +++ b/BrainPortal/app/views/groups/_view_list.html.erb @@ -41,18 +41,18 @@ t.row do |g| next unless (g == "ALL") - switch = link_to 'Switch', { :action => :switch, :id => "all"}, + switch = link_to t('switch'), { :action => :switch, :id => "all"}, :class => 'action_link', :method => :post row_content = - {:name => "All", - :description => "Represents all the projects", - :type => "All Projects", + {:name => t('all'), + :description => t('.row_contents.represents_all_projects'), + :type => t('.row_contents.all_projects'), :site => "", :creator_id => "", :users => "", - :files => @group_id_2_userfile_counts[nil] || "(None)", - :tasks => @group_id_2_task_counts[nil] || "(None)", + :files => @group_id_2_userfile_counts[nil] || t('none_parentheses'), + :tasks => @group_id_2_task_counts[nil] || t('none_parentheses'), :switch => switch, } { @@ -63,27 +63,25 @@ } end - - - t.column("Name", :name, + t.column(t('.columns.name'), :name, :sortable => true ) { |g| link_to_group_if_accessible(g) } - t.column("Description", :description, + t.column(t('.columns.description'), :description, :sortable => true, ) { |g| overlay_description(g.description) } - t.column("Project Type", :type, + t.column(t('.columns.type'), :type, :sortable => true, :filters => default_filters_for(@base_scope, :type) ) { |g| g.pretty_category_name(current_user) } - t.column("Site", :site, + t.column(t('.columns.site'), :site, :sortable => true, :filters => default_filters_for(@base_scope, Site) ) { |g| link_to_site_if_accessible(g.site) } - t.column("Creator", :creator_id, + t.column(t('.columns.creator'), :creator_id, :sortable => true, :filters => scoped_filters_for( @base_scope, @view_scope, :creator_id, @@ -93,18 +91,18 @@ ) ) { |g| link_to_user_if_accessible(g.creator) } - t.column("Users", :users) do |g| - @group_id_2_user_counts[g.id].to_s.presence || html_colorize("(none)", "red") + t.column(t('.columns.users'), :users) do |g| + @group_id_2_user_counts[g.id].to_s.presence || html_colorize(t('none_parentheses'), "red") end - t.column("Files", :files) do |g| + t.column(t('.columns.files'), :files) do |g| index_count_filter @group_id_2_userfile_counts[g.id], :userfiles, { :group_id => g.id }, :show_zeros => true end - t.column("Tasks", :tasks) do |g| + t.column(t('.columns.tasks'), :tasks) do |g| index_count_filter @group_id_2_task_counts[g.id], :tasks, { :group_id => g.id }, :show_zeros => true end - t.column("Switch", :switch) do |g| - link_to 'Switch', { :action => :switch, :id => g.id }, + t.column(t('.columns.switch'), :switch) do |g| + link_to t('.links.switch'), { :action => :switch, :id => g.id }, :class => 'action_link', :method => :post end diff --git a/BrainPortal/app/views/groups/index.html.erb b/BrainPortal/app/views/groups/index.html.erb index c3a067aaf..2d557269f 100644 --- a/BrainPortal/app/views/groups/index.html.erb +++ b/BrainPortal/app/views/groups/index.html.erb @@ -18,12 +18,12 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title 'Projects' %> +<% title t('.title') %>
<%= render :partial => 'groups_table' %> -
+
diff --git a/BrainPortal/app/views/groups/new.html.erb b/BrainPortal/app/views/groups/new.html.erb index ac4de26a0..f0f96154c 100644 --- a/BrainPortal/app/views/groups/new.html.erb +++ b/BrainPortal/app/views/groups/new.html.erb @@ -22,9 +22,9 @@ # -%> -<% title 'New Project' %> +<% title t('.title') %> -

New Project

+

<%= t('.headings.main') %>

<%= error_messages_for @group %> @@ -33,34 +33,29 @@

- <%= f.label :name, "Name" %>
+ <%= f.label :name, t('.labels.name') %>
<%= f.text_field :name %>

- <%= f.label :description, "Description" %>
+ <%= f.label :description, t('.labels.description') %>
<%= f.text_area :description, :rows => 4, :cols => 40 %> -

The first line should be a short summary, and the rest are for details.
+ <%= t('.paragraphs.description_html') %> <% if current_user.has_role?(:admin_user) %>

- <%= f.label :site_id, "Site:" %> - <%= site_select "group[site_id]",{}, :prompt => "(Select a site)" %> -

- Make this a system group invisible to normal users: + <%= f.label :site_id, t('.labels.site') %> + <%= site_select "group[site_id]",{}, :prompt => t('.prompts.site') %> + <%= t('.paragraphs.invisible_html') %> <%= f.check_box :invisible %> -

- Turn on usage tracking for files in this project: + <%= t('.paragraphs.track_usage_html') %> <%= f.check_box :track_usage %> <% end %> -

- Normal members will not be able to assign files or other resources - to this project (but editors are always allowed to do so): + <%= t('.paragraphs.not_assignable_html') %> <%= f.check_box :not_assignable %> -

- Make the project public, so that all users can access the files. Be careful with this option! You can always make the project public later on: + <%= t('.paragraphs.public_html') %> <%= f.check_box :public %>

<% if current_user.has_role?(:normal_user) %> @@ -69,6 +64,6 @@ <%= render :partial => 'users_form' %> <% end %>

- <%= f.submit "Create" %> + <%= f.submit t('.submit') %>

<% end %> diff --git a/BrainPortal/app/views/groups/show.html.erb b/BrainPortal/app/views/groups/show.html.erb index 8ee4f254e..71a8e0872 100644 --- a/BrainPortal/app/views/groups/show.html.erb +++ b/BrainPortal/app/views/groups/show.html.erb @@ -22,27 +22,27 @@ # -%> -<% title "Project Info" %> +<% title t('.title') %> <% if @group.is_a?(WorkGroup) %> <% end %>

-<%= error_messages_for @group, :header_message => "Project could not be updated." %> +<%= error_messages_for @group, :header_message => t('.headings.message_1') %>

@@ -52,74 +52,63 @@ <%= f.text_field :name %> <% end %> - <% t.edit_cell(:creator_id, :content => link_to_user_with_tooltip(@group.creator), :header => "Maintainer") do %> + <% t.edit_cell(:creator_id, :content => link_to_user_with_tooltip(@group.creator), :header => t('.headings.creator')) do %> <%= user_select "group[creator_id]", { :users => ( current_user.available_users | @group.users), :selector => @group.creator } %> -
Warning: If you change the maintainer to someone else you won't be able to edit this project any more
+ <%= t('.paragraphs.creator_html') %> <% end %> <% t.edit_cell(:site_id, :content => link_to_site_if_accessible(@group.site), :disabled => !current_user.has_role?(:admin_user)) do %> - <%= site_select "group[site_id]", @group.site_id, :prompt => "(Select a site)" %> + <%= site_select "group[site_id]", @group.site_id, :prompt => t('groups.common.select_site') %> <% end %> - <% t.cell("Type") { @group.pretty_category_name(current_user) } %> + <% t.cell(t('.cells.type')) { @group.pretty_category_name(current_user) } %> <% t.edit_cell(:description, :content => full_description(@group.description, @group.meta['autolink_description'] == 'yes')) do |f| %> <%= f.text_area :description, :rows => 4, :cols => 40 %>
-
The first line should be a short summary, and the rest are for details.

+ <%= t('.paragraphs.description_html') %>
<% end %> <% if current_user.has_role?(:admin_user) && @group.is_a?(WorkGroup) %> - <% t.boolean_edit_cell("meta[autolink_description]", @group.meta["autolink_description"].to_s, "yes", "", :header => "Urls are clickable ") %> + <% t.boolean_edit_cell("meta[autolink_description]", @group.meta["autolink_description"].to_s, "yes", "", :header => t('.headings.message_2')) %> <% end %> - <% t.edit_cell("Not assignable", :content => check_box_tag(nil ,nil, @group.not_assignable?, :disabled => true)) do |f| %> + <% t.edit_cell(t('.cells.not_assignable'), :content => check_box_tag(nil ,nil, @group.not_assignable?, :disabled => true)) do |f| %> <%= f.check_box :not_assignable %> -
- If checked, normal members will not be able to assign files or other - resources to this project (but editors are always allowed to do so). -
+ <%= t('.paragraphs.not_assignable_html') %> <% end %> - <% t.edit_cell("Public", :content => check_box_tag(nil ,nil, @group.public?, :disabled => true)) do |f| %> + <% t.edit_cell(t('.cells.public'), :content => check_box_tag(nil ,nil, @group.public?, :disabled => true)) do |f| %> <%= f.check_box :public %> -
- If checked, a public project makes all its files visible to all the users. Be careful - with this option! -
+ <%= t('.paragraphs.public_html') %> <% end %> <% if current_user.has_role?(:admin_user) && @group.is_a?(WorkGroup) %> - <% t.edit_cell("Invisible", :content => check_box_tag(nil ,nil, @group.invisible?, :disabled => true)) do |f| %> + <% t.edit_cell(t('.cells.invisible'), :content => check_box_tag(nil ,nil, @group.invisible?, :disabled => true)) do |f| %> <%= f.check_box :invisible %> -
- If checked, the project will not be shown in the list of projects. -
+ <%= t('.paragraphs.invisible_html') %> <% end %> - <% t.edit_cell("Track Usage", :content => check_box_tag(nil ,nil, @group.track_usage?, :disabled => true)) do |f| %> + <% t.edit_cell(t('.cells.track_usage'), :content => check_box_tag(nil ,nil, @group.track_usage?, :disabled => true)) do |f| %> <%= f.check_box :track_usage %> -
- If checked, the system will track overall usage of files in this project - (views, downloads etc) per month. -
+ <%= t('.paragraphs.track_usage_html') %> <% end %> <% end %> <% end %> - <%= show_table(@group, :header => 'Resources') do |t| %> + <%= show_table(@group, :header => t('.headings.resources')) do |t| %> - <% t.cell("Files") { index_count_filter @group.userfiles.count, :userfiles, {:group_id => @group.id}, :show_zeros => true } %> + <% t.cell(t('.cells.userfiles')) { index_count_filter @group.userfiles.count, :userfiles, {:group_id => @group.id}, :show_zeros => true } %> - <% t.cell("Tasks") { index_count_filter @group.cbrain_tasks.count, :tasks, {:group_id => @group.id}, :show_zeros => true } %> + <% t.cell(t('.cells.cbrain_tasks')) { index_count_filter @group.cbrain_tasks.count, :tasks, {:group_id => @group.id}, :show_zeros => true } %> <% if current_user.has_role?(:admin_user) %> - <% t.cell("Tools") { index_count_filter @group.tools.count, :tools, {:group_id => @group.id} }%> - <% t.cell("Data Providers") { index_count_filter @group.data_providers.count, :data_providers, {:group_id => @group.id} } %> - <% t.cell("Portal") { index_count_filter BrainPortal.where(:group_id => @group.id).count, :bourreaux, {:group_id => @group.id, :type => "BrainPortal"} } %> - <% t.cell("Execution") { index_count_filter Bourreau.where(:group_id => @group.id).count, :bourreaux, {:group_id => @group.id, :type => "Bourreau"} } %> + <% t.cell(t('.cells.tools')) { index_count_filter @group.tools.count, :tools, {:group_id => @group.id} }%> + <% t.cell(t('.cells.data_providers')) { index_count_filter @group.data_providers.count, :data_providers, {:group_id => @group.id} } %> + <% t.cell(t('.cells.portal')) { index_count_filter BrainPortal.where(:group_id => @group.id).count, :bourreaux, {:group_id => @group.id, :type => "BrainPortal"} } %> + <% t.cell(t('.cells.execution')) { index_count_filter Bourreau.where(:group_id => @group.id).count, :bourreaux, {:group_id => @group.id, :type => "Bourreau"} } %> <% end %> <% end %> @@ -129,10 +118,10 @@ .order('access_profiles.name') .map { |ap| access_profile_label(ap, :with_link => true) } .join("").html_safe - group_access_profiles = "(None)" if group_access_profiles.blank? + group_access_profiles = "(#{t('none')})" if group_access_profiles.blank? %> - <%= show_table(@group, :header => 'Assigned To Access Profiles') do |t| %> + <%= show_table(@group, :header => t('.headings.message_3')) do |t| %> <% t.cell("", :no_header => true, :show_width => 2) do %> <%= group_access_profiles %> <% end %> @@ -144,16 +133,16 @@ open_invites = Invitation.where(sender_id: current_user.id, invitation_group_id: @group.id, active: true).to_a %> - <%= show_table(@group, :as => :group, :header => 'Members', :edit_condition => @group.can_be_edited_by?(current_user) && (!current_user.has_role?(:normal_user) || group_members.count > 1 || open_invites.count > 0 )) do |t| %> + <%= show_table(@group, :as => :group, :header => t('.headings.members'), :edit_condition => @group.can_be_edited_by?(current_user) && (!current_user.has_role?(:normal_user) || group_members.count > 1 || open_invites.count > 0 )) do |t| %> <% default_text = array_to_table(group_members.sort{ |a,b| a.login.casecmp(b.login)}, :table_class => 'simple bordered float_left', :cols => 20, :min_data => 20, :fill_by_columns => true ) { |u,r,c| link_to_user_with_tooltip(u) } %> <% t.edit_cell(:user_id, :show_width => 2, - :no_header => 'Members', + :no_header => t('.cells.members'), :content => default_text) do %> <% if current_user.has_role? :normal_user %> <% group_members.each do |u| %> - <%= link_to_user_with_tooltip u %><%= link_to(": Remove", group_path(@group, "group[user_ids]" => (@group.user_ids - [u.id]), update_users: true ), :method => :put, :class => "action_link") unless u == current_user %> + <%= link_to_user_with_tooltip u %><%= link_to(t('.links.remove'), group_path(@group, "group[user_ids]" => (@group.user_ids - [u.id]), update_users: true ), :method => :put, :class => "action_link") unless u == current_user %>
<% end %> <% else %> @@ -167,10 +156,10 @@ <% default_text = array_to_table(open_invites.map(&:user).sort{ |a,b| a.login.casecmp(b.login)}, :table_class => 'simple bordered float_left', :cols => 20, :min_data => 20, :fill_by_columns => true ) { |u,r,c| u.login } %> <% t.edit_cell(:invites, :show_width => 2, - :header => 'Pending Invitations', + :header => t('.headings.pending_invitations'), :content => default_text) do %> <% open_invites.each do |i| %> - <%= link_to_user_with_tooltip i.user %>: <%= link_to("Cancel", invitation_path(i), :method => :delete, :class => "action_link") %> + <%= link_to_user_with_tooltip i.user %>: <%= link_to(t('cancel'), invitation_path(i), :method => :delete, :class => "action_link") %>
<% end %> <% end %> @@ -181,6 +170,6 @@ <% if @group.can_be_edited_by?(current_user) %>

- <%= render :partial => "layouts/log_report", :locals => { :log => @group.getlog, :title => 'Project Log' } %> + <%= render :partial => "layouts/log_report", :locals => { :log => @group.getlog, :title => t('.titles.project_log') } %> <% end %> diff --git a/BrainPortal/app/views/help_documents/_show.js.erb b/BrainPortal/app/views/help_documents/_show.js.erb index 977584d4e..c2bf81524 100644 --- a/BrainPortal/app/views/help_documents/_show.js.erb +++ b/BrainPortal/app/views/help_documents/_show.js.erb @@ -137,7 +137,7 @@ $(document).delegate('div.help_document_popup', 'new_content', function () { /* Save the document on the server */ function save() { - toggle_button(buttons.save, "Saving..."); + toggle_button(buttons.save, "<%= j t('.buttons.saving') %>"); $.ajax({ url: server_doc.url, @@ -155,13 +155,13 @@ $(document).delegate('div.help_document_popup', 'new_content', function () { buttons.remove.show(); buttons.save.hide(); }).always(function () { - toggle_button(buttons.save, "Save"); + toggle_button(buttons.save, "<%= j t('.buttons.save') %>"); }); }; /* Remove/delete the document */ function remove() { - toggle_button(buttons.remove, "Removing..."); + toggle_button(buttons.remove, "<%= j t('.buttons.removing') %>"); $.ajax({ url: server_doc.url, @@ -173,7 +173,7 @@ $(document).delegate('div.help_document_popup', 'new_content', function () { buttons.remove.hide(); }).always(function () { - toggle_button(buttons.remove, "Remove"); + toggle_button(buttons.remove, "<%= j t('.buttons.remove') %>"); }); }; diff --git a/BrainPortal/app/views/help_documents/show.html.erb b/BrainPortal/app/views/help_documents/show.html.erb index c59347df0..f0a3b064a 100644 --- a/BrainPortal/app/views/help_documents/show.html.erb +++ b/BrainPortal/app/views/help_documents/show.html.erb @@ -26,16 +26,15 @@ <% if HelpDocument.can_edit?(current_user) %> <%= stylesheet_link_tag "codemirror", "codemirror-neo" %> - - - - + + + +

<% end %> diff --git a/BrainPortal/app/views/invitations/_new.html.erb b/BrainPortal/app/views/invitations/_new.html.erb index 465f3563b..b07436524 100644 --- a/BrainPortal/app/views/invitations/_new.html.erb +++ b/BrainPortal/app/views/invitations/_new.html.erb @@ -28,10 +28,10 @@ <%= hidden_field_tag :group_id, @group.id %> <%= render :partial => 'groups/users_form', :locals => {:parameter_name => "user_ids", :show_locked => false} %>

- <%= submit_tag "Send Invitations" %> + <%= submit_tag t('.send_invitations') %>

<% end %> <% else %> - No users available to invite. + <%= t('.no_users_available') %> <% end %>
diff --git a/BrainPortal/app/views/layouts/_cbrain_application.html.erb b/BrainPortal/app/views/layouts/_cbrain_application.html.erb index c8222932a..ad0778942 100644 --- a/BrainPortal/app/views/layouts/_cbrain_application.html.erb +++ b/BrainPortal/app/views/layouts/_cbrain_application.html.erb @@ -20,7 +20,7 @@ # along with this program. If not, see . # -%> - +> <%= RemoteResource.current_resource.name.presence || "CBRAIN" %><%= yield :title %> diff --git a/BrainPortal/app/views/layouts/_section_account.html.erb b/BrainPortal/app/views/layouts/_section_account.html.erb index d7e6fd2bd..d94084293 100644 --- a/BrainPortal/app/views/layouts/_section_account.html.erb +++ b/BrainPortal/app/views/layouts/_section_account.html.erb @@ -29,7 +29,7 @@ <% # We can colorize the CBRAIN interface based on the current GIT branch # One only needs to define a CSS class 'account_git_branch_NAME' - git_branch = CBRAIN::CBRAIN_Git_Branch.presence || "unknown" + git_branch = CBRAIN::CBRAIN_Git_Branch.presence || t('unknown') # When devs are working in their own special branches, highlight the top in green colorstyle = 'style="background-color: #393"'.html_safe if git_branch !~ /^(dev|master|unknown|service)$/ %> @@ -39,52 +39,54 @@ <%= link_to 'NeuroHub', alternate_page_or_dashboard_path, :class => "home_credits-neurohub" %> <% if current_user %> - <%= link_to "Dashboard", home_path %> - <%= link_to 'My Account', user_path(current_user) %> - <%= link_to 'Projects', groups_path %> + <%= link_to t('.links.dashboard'), home_path %> + <%= link_to t('.links.my_account'), user_path(current_user) %> + <%= link_to t('.links.projects'), groups_path %> <% - message_link = 'Messages' + message_link = t('.links.messages') message_link = "#{message_link} (#{@unread_message_count})".html_safe if (@unread_message_count.presence || 0) > 0 %> - <%= link_to message_link, messages_path, :title => pluralize(@unread_message_count, "unread message") %> + <%= link_to message_link, messages_path, :title => t('.labels.unread_message', count: @unread_message_count) %> <% if current_user.has_role?(:normal_user) %> - <%= hover_dropdown("Resources", :dropdown_class => "resource_header") do %> - <%= link_to 'Data Providers', data_providers_path %>
- <%= link_to 'Quotas', quotas_path %>
- <%= link_to 'Servers', bourreaux_path %>
- <%= link_to 'Tools', tools_path %>
- <%= link_to 'Tool Versions', tool_configs_path %>
- <%= link_to 'Usage', resource_usage_index_path %>
- <%= link_to 'Full list of tools and datasets', available_path %>
+ <%= hover_dropdown(t('.dropdowns.resource'), :dropdown_class => "resource_header") do %> + <%= link_to t('.links.data_providers'), data_providers_path %>
+ <%= link_to t('.links.quotas'), quotas_path %>
+ <%= link_to t('.links.servers'), bourreaux_path %>
+ <%= link_to t('.links.tools'), tools_path %>
+ <%= link_to t('.links.tool_versions'), tool_configs_path %>
+ <%= link_to t('.links.usage'), resource_usage_index_path %>
+ <%= link_to t('.links.full_list'), available_path %>
<% end %> <% end %> <% help_url = RemoteResource.current_resource.help_url %> <% if help_url.present? %> - <%= link_to "Help Site", help_url, :target => '_blank' %> + <%= link_to t('.links.help_site'), help_url, :target => '_blank' %> <% end %> <% support_email = RemoteResource.current_resource.support_email %> <% if support_email.present? %> - <%= html_tool_tip(mail_to(support_email, "Email Support"), :offset_x => 0, :offset_y => 20) do %> - For email support about this platform, including help
- about failed tasks and file transfer please click here
- or write to: <%= support_email %> + <%= html_tool_tip(mail_to(support_email, t('.links.email_support')), :offset_x => 0, :offset_y => 20) do %> + <%= t('.tooltips.email_support_html', email: support_email) %> <% end %> <% end %> <% end %> - Rev: <%= CBRAIN::CBRAIN_StartTime_Revision %> + <%= t('.labels.revision', rev: CBRAIN::CBRAIN_StartTime_Revision) %> <% if current_user.present? && current_user.has_role?(:admin_user) %> - Branch: <%= git_branch %> + <%= t('.labels.branch', name: git_branch) %> <% end %> +
+ <%= link_to "EN", url_for(locale: 'en') %> / + <%= link_to "FR", url_for(locale: 'fr') %> +
<% if current_user %> - (last updated 0m ago) + <%= (t('.labels.last_updated_html', time: "0m")) %> - Logged in as <%= current_user.full_name %> - <%= link_to "Sign out", "/logout" %> + <%= t('.labels.as', name: current_user.full_name) %> + <%= link_to t('.links.sign_out'), "/logout" %> <% else %> - <%= link_to "Sign in", "/login" %> + <%= link_to t('.links.sign_in'), "/login" %> <% end %> diff --git a/BrainPortal/app/views/layouts/_section_cookie_notif.html.erb b/BrainPortal/app/views/layouts/_section_cookie_notif.html.erb index 4dad07945..8a82071b9 100644 --- a/BrainPortal/app/views/layouts/_section_cookie_notif.html.erb +++ b/BrainPortal/app/views/layouts/_section_cookie_notif.html.erb @@ -26,20 +26,19 @@ -
-This page describes the CBRAIN API - -

-For more information about the work in progress on the API, please look up the -API issues -on -CBRAIN's GitHub repository. - -

-This specification's YAML or JSON files can be opened -at SwaggerHUB. - -

-This will provide you a way to generate client code and inspect the same documentation -that is shown here. -In particular, this will allow you to generate client libraries in all sorts of -marvelous exotic languages, such as Python, Perl, Java, Swift and even Ruby. -

-Here is a direct link to the developer's latest version on SwaggerHub. -

+<%= t('.content_html', spec_version: @spec_version) %>
 
diff --git a/BrainPortal/app/views/portal/welcome.html.erb b/BrainPortal/app/views/portal/welcome.html.erb index 9598f8c78..5c72ba700 100644 --- a/BrainPortal/app/views/portal/welcome.html.erb +++ b/BrainPortal/app/views/portal/welcome.html.erb @@ -22,16 +22,16 @@ # -%> -<% title 'Welcome' %> +<% title t('.title') %> -

Welcome to CBRAIN, <%= current_user.full_name %>

+

<%= t('.headings.main', name: current_user.full_name) %>

<% if @dashboard_messages.count > 0 %>
-

CBRAIN News

+

<%= t('.headings.news') %>

<% @dashboard_messages.each do |message| %>

<%= message.header %>

- Posted: <%= message.created_at.strftime("%B %e, %Y") %>
+ <%= t('.news.posted_at', created_at: message.created_at.strftime("%B %e, %Y")) %>
<%= message.description.html_safe %> <% end %>
@@ -43,78 +43,77 @@
-

<%= link_to_bourreau_if_accessible(RemoteResource.current_resource, current_user, :name => "System Info") %>

+

<%= link_to_bourreau_if_accessible(RemoteResource.current_resource, current_user, :name => t('.headings.system_info')) %>

- Portal instance name: <%= link_to_bourreau_if_accessible(RemoteResource.current_resource) %> + <%= t('.system_info.instance_name_html', name: link_to_bourreau_if_accessible(RemoteResource.current_resource)) %>

<%= form_tag home_path do %> <% if BrainPortal.current_resource.portal_locked? %> <%= hidden_field_tag :lock_portal, "unlock" %> - <%= submit_tag "Unlock this Portal", :data => { :confirm => "Are you sure you wish to unlock this portal?" } %> + <%= submit_tag t('.system_info.unlock'), :data => { :confirm => t('.system_info.unlock_confirm') } %> <% else %> <% message = BrainPortal.current_resource.meta[:portal_lock_message] %> - <% message = "(lock message)" if message.blank? %> + <% message = t('.system_info.lock_message') if message.blank? %> <%= hidden_field_tag :lock_portal, "lock" %> <%= text_field_tag :message, message, :size => 30 %> - <%= submit_tag "Lock this Portal", :data => { :confirm => "Are you sure you wish to lock this portal?" } %> + <%= submit_tag t('.system_info.lock'), :data => { :confirm => t('.system_info.lock_confirm') } %> <% end %> <% end %> <% if @active_users %>

- Users currently online:<%= array_to_table(@active_users.map(&:login), :table_class => 'simple', :cols => 4) %> + <%= t('.system_info.online_users') %><%= array_to_table(@active_users.map(&:login), :table_class => 'simple', :cols => 4) %>

<% end %>

- Recent activity: - <%= link_to "(View logs)", url_for(:action => :portal_log, :hide_rendered => "1") %> + <%= t('.system_info.recent_activity') %> + <%= link_to t('.links.system_info.view_logs'), url_for(:action => :portal_log, :hide_rendered => "1") %>

<%= array_to_table(CbrainSession.recent_activity, :table_class => 'simple', :cols => 1) do |entry,r,c| %> <%= link_to_user_with_tooltip entry[:user] %><%= ", #{entry[:user].city}" if entry[:user].city %>: - <%= entry[:active] ? "Active" : "Logged out" %> - <%= distance_of_time_in_words(entry[:last_access], Time.now) %> ago + <%= entry[:active] ? t('.system_info.active') : t('.system_info.logged_out') %> + <%= t('ago_time', time: distance_of_time_in_words(entry[:last_access], Time.now)) %> <% if entry[:remote_host] || entry[:raw_user_agent] %> <% - parsed = HttpUserAgent.new(entry[:raw_user_agent] || 'unknown/unknown') - browser = (parsed.browser_name || 'unknown browser') + parsed = HttpUserAgent.new(entry[:raw_user_agent] || t('.system_info.unknown_unknown')) + browser = (parsed.browser_name || t('.system_info.unknown_browser')) brow_ver = (parsed.browser_version || '?') - os = (parsed.os_name || 'unknown OS') - pretty = "#{browser} #{brow_ver} on #{os}" + os = (parsed.os_name || t('.system_info.unknown_os')) + pretty = "#{browser} #{brow_ver} #{t('.system_info.on_word')} #{os}" %>
- From + <%= t('from') %> <%= html_tool_tip(entry[:remote_host], :offset_x => 0, :offset_y => 12) do %> <%= entry[:remote_ip] || entry[:remote_host] %> <% end %> - with + <%= t('.system_info.with') %> <%= html_tool_tip(pretty, :offset_x => 0, :offset_y => 12) do %> - <%= entry[:raw_user_agent] || 'unknown' %> + <%= entry[:raw_user_agent] || t('unknown').downcase %> <% end %> <% end %> <% end %>

- Sessions + <%= t('.headings.sessions') %>

- - There are currently <%= CbrainSession.count %> entries in the sessions table.
+ <%= t('.sessions.sessions_count', count: CbrainSession.count) %> <%= form_tag home_path do %> - Clear sessions older than + <%= t('.sessions.clear_sessions') %> <%= select_tag :session_clear, options_for_select( [ - [ "One month ago", 1.month.seconds.to_i ], - [ "One week ago", 1.week.seconds.to_i ], - [ "One day ago", 1.day.seconds.to_i ], - [ "One hour ago", 1.hour.seconds.to_i ], - [ "Now! (Including yours!)", 1.seconds.to_i ], + [ t('clear_options.month'), 1.month.seconds.to_i ], + [ t('clear_options.week'), 1.week.seconds.to_i ], + [ t('clear_options.day'), 1.day.seconds.to_i ], + [ t('clear_options.hour'), 1.hour.seconds.to_i ], + [ t('clear_options.now'), 1.seconds.to_i ], ]) %> - <%= submit_tag "Clear", :data => { :confirm => "Are you sure you want to clear the sessions?" } %> + <%= submit_tag t('clear'), :data => { :confirm => t('.sessions.clear_confirm') } %> <% end %> @@ -127,24 +126,22 @@ %> <% if all_ex > 0 %>

- Exceptions + <%= t('activerecord.models.exception.other') %>

- There are internal exceptions logged:
+ <%= t('.exceptions.logged') %>
    -
  • <%= pluralize(one_day_ex,"exception") %> in the past day.
  • -
  • <%= pluralize(three_day_ex,"exception")%> in the past three days.
  • -
  • <%= pluralize(one_week_ex,"exception") %> in the past week.
  • -
  • <%= pluralize(all_ex,"exception") %> in total.
  • +
  • <%= t('.exceptions.past_day', count: one_day_ex) %>
  • +
  • <%= t('.exceptions.past_three_days', count: three_day_ex) %>
  • +
  • <%= t('.exceptions.past_week', count: one_week_ex) %>
  • +
  • <%= t('.exceptions.total', count: all_ex) %>
-
<%= link_to "Show Exceptions", :controller => :exception_logs, :action => :index %>
+
<%= link_to t('.links.exceptions.show'), :controller => :exception_logs, :action => :index %>
<% end %>
- -
<% end %> @@ -152,32 +149,38 @@
-

<%= link_to "Account Info", user_path(current_user) %>

+

<%= link_to t('.headings.account_info'), user_path(current_user) %>

- Your login name: <%= link_to_user_if_accessible(current_user) %> + <%= t('.account_info.login_name') %> <%= link_to_user_if_accessible(current_user) %>

- Your full name: <%= current_user.full_name %> + <%= t('.account_info.full_name') %> <%= current_user.full_name %>

- Your site affiliation: <%= link_to_site_if_accessible(current_user.site) %> + <%= t('.account_info.site_affiliation') %> <%= link_to_site_if_accessible(current_user.site) %>

- Your time zone: <%= red_if(current_user.time_zone.blank?,h(current_user.time_zone),"(Unset)") %>
- Your current time: <%= to_localtime(Time.now, :datetime) %>
+ <%= t('.account_info.time_zone') %> <%= red_if(current_user.time_zone.blank?,h(current_user.time_zone), t('unset_parentheses')) %>
+ <%= t('.account_info.current_time') %> <%= to_localtime(Time.now, :datetime) %>

- Tools available to you (<%= @available_tool_names.count %> out of <%= @tool_names.count %>, <%= link_to 'full list of all tools here', available_path %>):
+ + <%= t('.headings.tools_available_info_html', + available: @available_tool_names.count, + total: @tool_names.count, + link: link_to(t('.links.full_tools_list'), available_path) + ) %> +
<%= array_to_table(@available_tool_names.sort, :table_class => 'simple', :cols => 4) %>

- Projects you belong to: <%= array_to_table(@groups, :table_class => 'simple', :cols => 4) { |g,r,c| link_to_group_if_accessible(g) } %> + <%= t('.defaults.projects') %> <%= array_to_table(@groups, :table_class => 'simple', :cols => 4) { |g,r,c| link_to_group_if_accessible(g) } %>

- Your default Data Provider: <%= link_to_data_provider_if_accessible(@default_data_provider) %> + <%= t('.defaults.provider') %> <%= link_to_data_provider_if_accessible(@default_data_provider) %>

- Your default Execution Server: <%= link_to_bourreau_if_accessible(@default_bourreau) %> + <%= t('.defaults.server') %> <%= link_to_bourreau_if_accessible(@default_bourreau) %>

@@ -189,7 +192,7 @@ <% if @tasks.size > 0 %>

<%= - scope_link('Latest Updated Tasks', + scope_link(t('.headings.latest_tasks'), 'tasks#index', { :order => [{ :a => 'updated_at', :d => 'desc' }], }, url: { :controller => :tasks, :action => :index } ) @@ -197,13 +200,16 @@ <% active_count = CbrainTask.find_all_accessible_by_user(current_user).active.count rescue 0 %> <% if active_count > 0 %> <%= - scope_filter_link("(#{active_count} active)", - 'tasks#index', :replace, { :t => 't.sts', :v => 'active' }, + scope_filter_link( + t('.latest_tasks.active_count', count: active_count), + 'tasks#index', + :replace, + { :t => 't.sts', :v => 'active' }, url: { :controller => :tasks, :action => :index } ) %> <% else %> - (None active) + <%= t('.latest_tasks.none_active') %> <% end %>

@@ -222,7 +228,7 @@ <% if @files.size > 0 %>

<%= - scope_link('Latest Updated Files', + scope_link(t('.headings.latest_files'), 'userfiles#index', { :order => [{ :a => 'updated_at', :d => 'desc' }], }, url: { :controller => :userfiles, :action => :index } ) diff --git a/BrainPortal/app/views/quotas/_cpu_quotas_table.html.erb b/BrainPortal/app/views/quotas/_cpu_quotas_table.html.erb index 265b44a7e..a2e187fff 100644 --- a/BrainPortal/app/views/quotas/_cpu_quotas_table.html.erb +++ b/BrainPortal/app/views/quotas/_cpu_quotas_table.html.erb @@ -31,7 +31,7 @@ @@ -53,73 +53,73 @@ <% t.pagination - t.column("User", :user, + t.column(t('.columns.user'), :user, :sortable => true, :filters => default_filters_for(@base_scope, User) ) do |cq| if ! cq.is_for_user? if cq.is_for_group? - html_colorize("(For all users in project)", 'orange') + html_colorize(t('.default.all_users_in_project'), 'orange') else - html_colorize("(Default for all users)", 'orange') + html_colorize(t('.default.all_users'), 'orange') end else link_to_user_if_accessible(cq.user) end end - t.column("Project", :group, + t.column(t('.columns.project'), :group, :sortable => true, :filters => default_filters_for(@base_scope, Group) ) { |cq| link_to_group_if_accessible(cq.group) } - t.column("Execution Server", :remote_resource, + t.column(t('.columns.execution_server'), :remote_resource, :sortable => true, :filters => default_filters_for(@base_scope, RemoteResource) ) do |cq| if ! cq.is_for_resource? - html_colorize("(Default for all servers)", 'orange') + html_colorize(t('.default.all_servers'), 'orange') else link_to_bourreau_if_accessible(cq.remote_resource) end end - t.column("Max Weekly CPU", :max_cpu_past_week, + t.column(t('.columns.max_weekly_cpu'), :max_cpu_past_week, :sortable => true, ) { |cq| pretty_quota_cputime(cq.max_cpu_past_week, true) } - t.column("Max Monthly CPU", :max_cpu_past_month, + t.column(t('.columns.max_monthly_cpu'), :max_cpu_past_month, :sortable => true, ) { |cq| pretty_quota_cputime(cq.max_cpu_past_month, true) } - t.column("Max CPU Total", :max_cpu_ever, + t.column(t('.columns.max_cpu_total'), :max_cpu_ever, :sortable => true, ) { |cq| pretty_quota_cputime(cq.max_cpu_ever, true) } - t.column("Max Active Tasks", :max_active_tasks, + t.column(t('.columns.max_active_tasks'), :max_active_tasks, :sortable => true, ) { |cq| pretty_max_active_tasks(cq) } # This column is a bit misleading: it shows the CURRENT USER's resources for all # quota records that are DP-wide, and the AFFECTED USER'S resources for the user-specific quotas. - t.column("My Usage") do |cq| + t.column(t('.columns.my_usage')) do |cq| if ! cq.is_for_resource? - html_colorize("(Varies by server)","orange") + html_colorize(t('.varies_by_server'),"orange") else what = cq.exceeded?(cq.user_id == 0 ? current_user.id : cq.user_id, cq.remote_resource_id) if what.nil? - html_colorize("OK","green") + + html_colorize(t('quotas.common.status.ok'),"green") + " (#{pretty_quota_current_cpu_usage(cq)})" else what = :total if what == :ever # ugh - html_colorize("Exceeded: #{what.to_s.humanize}","red") + + html_colorize(t('quotas.common.status.exceeded', what: what.to_s.humanize),"red") + " (#{pretty_quota_current_cpu_usage(cq)})" end end end - t.column("Details") do |cq| - index_count_filter('Table', :resource_usage, + t.column(t('.columns.details')) do |cq| + index_count_filter(t('quotas.common.table'), :resource_usage, { :type => 'CputimeResourceUsageForCbrainTask', :user_id => (cq.is_for_user? ? cq.user_id : current_user.id), @@ -130,12 +130,11 @@ if current_user.has_role? :admin_user - t.column("Operations") do |cq| - ( link_to("Show/Edit", quota_path(cq), :class => "action_link") + + t.column(t('.columns.operations')) do |cq| + ( link_to(t('quotas.common.show_edit'), quota_path(cq), :class => "action_link") + " " + - link_to("Delete", quota_path(cq), :class => "action_link", - :data => { :confirm => "Are you sure you want to delete this quota entry?" }, - :method => :delete) + link_to(t('delete'), quota_path(cq), :class => "action_link", + :data => { :confirm => t('confirm_delete', name: t('quotas.common.confirm_delete_name')) }, :method => :delete) ) end diff --git a/BrainPortal/app/views/quotas/_cpu_report.html.erb b/BrainPortal/app/views/quotas/_cpu_report.html.erb index 5d788bce6..7813a7cf9 100644 --- a/BrainPortal/app/views/quotas/_cpu_report.html.erb +++ b/BrainPortal/app/views/quotas/_cpu_report.html.erb @@ -22,27 +22,27 @@ # -%> -<% title "Exceeded CPU Quotas" %> +<% title t('.title') %>

- - - - - - - - - - - + + + + + + + + + + + <% @uid_bid_and_quota.each do |user_id,bourreau_id,quota| %> @@ -69,17 +69,17 @@ <% end %> diff --git a/BrainPortal/app/views/quotas/_disk_quotas_table.html.erb b/BrainPortal/app/views/quotas/_disk_quotas_table.html.erb index b142e2506..4722912e6 100644 --- a/BrainPortal/app/views/quotas/_disk_quotas_table.html.erb +++ b/BrainPortal/app/views/quotas/_disk_quotas_table.html.erb @@ -31,7 +31,7 @@ @@ -53,46 +53,45 @@ <% t.pagination - t.column("User", :user, + t.column(t('.columns.user'), :user, :sortable => true, :filters => default_filters_for(@base_scope, User) ) do |dq| if ! dq.is_for_user? - html_colorize("(Default for all users)", 'orange') + html_colorize(t('.columns.default_for_all_users'), 'orange') else link_to_user_if_accessible(dq.user) end end - t.column("Data Provider", :data_provider, + t.column(t('.columns.data_provider'), :data_provider, :sortable => true, :filters => default_filters_for(@base_scope, DataProvider) ) { |dq| link_to_data_provider_if_accessible(dq.data_provider) } - t.column("Max Size", :max_bytes, + t.column(t('.columns.max_size'), :max_bytes, :sortable => true, ) { |dq| pretty_quota_max_bytes(dq) } - t.column("Max Files", :max_files, + t.column(t('.columns.max_files'), :max_files, :sortable => true, ) { |dq| pretty_quota_max_files(dq) } # This column is a bit misleading: it shows the CURRENT USER's resources for all # quota records that are DP-wide, and the AFFECTED USER'S resources for the user-specific quotas. - t.column("My Usage") do |dq| + t.column(t('.columns.my_usage')) do |dq| what = dq.exceeded?(dq.user_id == 0 ? current_user.id : dq.user_id) what = nil if dq.cursize.zero? && dq.curfiles.zero? + usage = t('.disk_usage_html', size: colored_pretty_size(dq.cursize), files: number_with_commas(dq.curfiles)) if what.nil? - html_colorize("OK","green") + - " (#{colored_pretty_size(dq.cursize)} and #{number_with_commas(dq.curfiles)} files)".html_safe + html_colorize(t('quotas.common.status.ok'),"green") + " ".html_safe + usage else - html_colorize("Exceeded: #{what.to_s.humanize}","red") + - " (#{colored_pretty_size(dq.cursize)} and #{number_with_commas(dq.curfiles)} files)".html_safe + html_colorize(t('quotas.common.status.exceeded', what: what.to_s.humanize),"red") + " ".html_safe + usage end end - t.column("Details") do |dq| - link_to 'Table', + t.column(t('.columns.details')) do |dq| + link_to t('.links.table'), report_path( :table_name => 'userfiles.combined_file_rep', :user_id => (dq.is_for_user? ? dq.user_id : ""), @@ -105,11 +104,11 @@ if current_user.has_role? :admin_user - t.column("Operations") do |dq| - ( link_to("Show/Edit", quota_path(dq), :class => "action_link") + + t.column(t('.columns.operations')) do |dq| + ( link_to(t('.links.show_edit'), quota_path(dq), :class => "action_link") + " " + - link_to("Delete", quota_path(dq), :class => "action_link", - :data => { :confirm => "Are you sure you want to delete this quota entry?" }, + link_to(t('delete'), quota_path(dq), :class => "action_link", + :data => { :confirm => t('confirm_delete', name: t('quotas.common.confirm_delete_name')) }, :method => :delete) ) end diff --git a/BrainPortal/app/views/quotas/_disk_report.html.erb b/BrainPortal/app/views/quotas/_disk_report.html.erb index 657d2e6aa..281da9e06 100644 --- a/BrainPortal/app/views/quotas/_disk_report.html.erb +++ b/BrainPortal/app/views/quotas/_disk_report.html.erb @@ -22,25 +22,25 @@ # -%> -<% title "Exceeded Disk Quotas" %> +<% title t('.title') %>

UserExecution ServerUsage Past WeekLimit Past WeekUsage Past MonthLimit Past MonthUsage All TimeLimit All TimeSituationDetailsQuota record<%= t('.headings.user') %><%= t('.headings.execution_server') %><%= t('.headings.usage_week') %><%= t('.headings.limit_week') %><%= t('.headings.usage_month') %><%= t('.headings.limit_month') %><%= t('.headings.usage_all') %><%= t('.headings.limit_all') %><%= t('.headings.situation') %><%= t('.headings.details') %><%= t('.headings.quota_record') %>
<%= pretty_quota_cputime(quota.max_cpu_ever,true) %> <% if situation =~ /week/i %> - Past week CPU exceeded + <%= t('.exceeded.week') %> <% elsif situation =~ /month/i %> - Past month CPU exceeded + <%= t('.exceeded.month') %> <% elsif situation =~ /ever/i %> - Total lifetime CPU exceeded + <%= t('.exceeded.ever') %> <% else %> - (Unknown) + <%= (#{t('unknown')}) %> <% end %> - <%= index_count_filter('Table', :resource_usage, + <%= index_count_filter(t('.data.table'), :resource_usage, { :type => 'CputimeResourceUsageForCbrainTask', :user_id => user_id, @@ -89,7 +89,7 @@ %> - <%= link_to("Show/Edit CPU Quota", quota_path(quota), :class => "action_link") %> + <%= link_to(t('.data.show_edit_cpu_quota'), quota_path(quota), :class => "action_link") %>
- - - - - - - - - + + + + + + + + + <% @user_id_and_quota.each do |user_id,quota| %> @@ -64,7 +64,7 @@ <% end %> diff --git a/BrainPortal/app/views/quotas/_show_cpu_quota.erb b/BrainPortal/app/views/quotas/_show_cpu_quota.erb index 8aa64ca0b..89e164b97 100644 --- a/BrainPortal/app/views/quotas/_show_cpu_quota.erb +++ b/BrainPortal/app/views/quotas/_show_cpu_quota.erb @@ -22,111 +22,82 @@ # -%> -<% title @quota.new_record? ? 'Create CPU Quota' : 'Edit CPU Quota' %> +<% title @quota.new_record? ? t('.titles.create') : t('.titles.edit') %> <%= error_messages_for @quota %> - - -<%= show_table(@quota, :as => :quota, :header => "CPU Quota Record", +<%= show_table(@quota, :as => :quota, :header => t('.headings.record'), :edit_condition => check_role(:admin_user)) do |t| %> <%= hidden_field_tag :mode, 'cpu' %> - <% t.cell("User", :show_width => 2) do %> + <% t.cell(t('.cells.user'), :show_width => 2) do %> <% if @quota.new_record? %> - <%= user_select("quota[user_id]", { :selector => @quota.user_id, :include_blank => '(Default For All Users)' }) %> -
- You can leave the user field blank and instead specify a project, below. - You can also leave them both blank. -
+ <%= user_select("quota[user_id]", { :selector => @quota.user_id, :include_blank => t('.blanks.default_all_users') }) %> + <%= t('.divs.user_html') %> <% else %> <%= @quota.is_for_user? ? link_to_user_if_accessible(@quota.user) : - html_colorize("(Default for all users)", 'orange') %> + html_colorize(t('.blanks.default_all_users'), 'orange') %> <% end %> <% end %> - <% t.cell("Project", :show_width => 2) do %> + <% t.cell(t('.cells.project'), :show_width => 2) do %> <% if @quota.new_record? %> - <%= group_select("quota[group_id]", { :selector => @quota.group_id, :include_blank => '(Any Project)' }) %> -
- Instead of specifying a user, above, you can select a project, and the quota - will apply to all users of that project. User and Project are mutually exclusive - in a CPU quota. You can also leave them both blank. -
+ <%= group_select("quota[group_id]", { :selector => @quota.group_id, :include_blank => t('.blanks.any_project') }) %> + <%= t('.divs.project_html') %> <% else %> <%= @quota.is_for_group? ? link_to_group_if_accessible(@quota.group) : - html_colorize("(Any Project)", 'orange') %> + html_colorize(t('.blanks.any_project'), 'orange') %> <% end %> <% end %> - <% t.cell("Execution Server", :show_width => 2) do %> + <% t.cell(t('.cells.execution_server'), :show_width => 2) do %> <% if @quota.new_record? %> - <%= bourreau_select("quota[remote_resource_id]", { :selector => @quota.remote_resource_id, :include_blank => '(Any Execution Server)' }) %> -
- You can leave this blank, but then you must provider either a user or a project, above. -
+ <%= bourreau_select("quota[remote_resource_id]", { :selector => @quota.remote_resource_id, :include_blank => t('.blanks.any_execution_server') }) %> + <%= t('.divs.execution_server_html') %> <% else %> <%= @quota.is_for_resource? ? link_to_bourreau_if_accessible(@quota.remote_resource) : - html_colorize("(Any Execution Server)", 'orange') %> + html_colorize(t('.blanks.any_execution_server'), 'orange') %> <% end %> <% end %> - <% t.edit_cell(:max_cpu_past_week, :show_width => 2, :header => "Max CPU time past week", :content => pretty_quota_cputime(@quota.max_cpu_past_week,true)) do |f| %> + <% t.edit_cell(:max_cpu_past_week, :show_width => 2, :header => t('.headings.max_cpu_week'), :content => pretty_quota_cputime(@quota.max_cpu_past_week,true)) do |f| %> <%= f.text_field :max_cpu_past_week, :size => 12 %> -
- The limit CPU time is in seconds; when entering a new value, - you can use a unit as a suffix, such as in - 3.5h (hours), 7d (days), 4w (weeks), - 3m (months) and 1y (years). - There are no suffixes for seconds and minutes. - A value of 0 means no time is allowed at all. -
+ <%= t('.divs.max_cpu_past_week_html') %> <% end %> - <% t.edit_cell(:max_cpu_past_month, :show_width => 2, :header => "Max CPU time past month", :content => pretty_quota_cputime(@quota.max_cpu_past_month,true)) do |f| %> + <% t.edit_cell(:max_cpu_past_month, :show_width => 2, :header => t('.headings.max_cpu_month'), :content => pretty_quota_cputime(@quota.max_cpu_past_month,true)) do |f| %> <%= f.text_field :max_cpu_past_month, :size => 12 %> -
- See the explanations for Max CPU time past week. -
+ <%= t('.divs.max_cpu_past_month_html') %> <% end %> - <% t.edit_cell(:max_cpu_ever, :show_width => 2, :header => "Max CPU time in total", :content => pretty_quota_cputime(@quota.max_cpu_ever,true)) do |f| %> + <% t.edit_cell(:max_cpu_ever, :show_width => 2, :header => t('.headings.max_cpu_total'), :content => pretty_quota_cputime(@quota.max_cpu_ever,true)) do |f| %> <%= f.text_field :max_cpu_ever, :size => 12 %> -
- See the explanations for Max CPU time past week. -
+ <%= t('.divs.max_cpu_ever_html') %> <% end %> - <% t.edit_cell(:max_active_tasks, :show_width => 2, :header => "Max Active Tasks", :content => pretty_max_active_tasks(@quota)) do |f| %> + <% t.edit_cell(:max_active_tasks, :show_width => 2, :header => t('.headings.max_active_tasks'), :content => pretty_max_active_tasks(@quota)) do |f| %> <%= f.text_field :max_active_tasks, :size => 6 %> -
- The maximum number of tasks that can be active at any given time on the Execution Server. - Leave blank to not set a limit. A value of zero will prevent any tasks from being launched. - Note that projects are ignored for these values, and that if several quota records apply - to a user and differ only by project, the minimum value found in that set will be used. - The core Admin account is used to set a maximum number of tasks IN TOTAL for an Execution - server (thus, no limit specific to that admin user can be specified here). -
+ <%= t('.divs.max_active_tasks_html') %> <% end %> <% end %>

-<%= render :partial => "layouts/log_report", :locals => { :log => @quota.getlog, :title => 'CPU Quota Record Log' } %> +<%= render :partial => "layouts/log_report", :locals => { :log => @quota.getlog, :title => t('.titles.log') } %> diff --git a/BrainPortal/app/views/quotas/_show_disk_quota.erb b/BrainPortal/app/views/quotas/_show_disk_quota.erb index 391c3adf2..d6ad31f40 100644 --- a/BrainPortal/app/views/quotas/_show_disk_quota.erb +++ b/BrainPortal/app/views/quotas/_show_disk_quota.erb @@ -22,23 +22,23 @@ # -%> -<% title @quota.new_record? ? 'Create Disk Quota' : 'Edit Disk Quota' %> +<% title @quota.new_record? ? t('.titles.create') : t('.titles.edit') %> <%= error_messages_for @quota %>

UserDataProviderSizeSize quotaNumber of filesNumber of files quotaSituationDetailsQuota record<%= t('.headings.user') %><%= t('.headings.data_provider') %><%= t('.headings.size') %><%= t('.headings.size_quota') %><%= t('.headings.num_files') %><%= t('.headings.num_files_quota') %><%= t('.headings.situation') %><%= t('.headings.details') %><%= t('.headings.quota_record') %>
<%= pretty_quota_max_files(quota) %> <%= situation.to_s.humanize %> <%= - link_to 'Table', + link_to t('.links.table'), report_path( :table_name => 'userfiles.combined_file_rep', :user_id => user_id, @@ -76,8 +76,8 @@ %> - <% label = quota.is_for_user? ? "(User Quota)" : "(DP Quota)" %> - <%= link_to("Show/Edit #{label}", quota_path(quota), :class => "action_link") %> + <% label = quota.is_for_user? ? t('.labels.user_quota') : t('.labels.dp_quota') %> + <%= link_to(t('quotas.common.show_edit_label', label: label), quota_path(quota), :class => "action_link") %>
@@ -320,28 +319,28 @@ -
+
- + - ⚠ Invalid! + ⚠ <%= t('.invalid') %>
- + <%= data_provider_select('data_provider_id_for_collection', { :data_providers => writable_dps }, { :id => 'co-dp', :class => 'dlg-fld', - :'data-placeholder' => "A data provider..." + :'data-placeholder' => t('.placeholders.dp') } ) %> @@ -351,27 +350,28 @@
- Are you sure you wish to delete these file(s)? + + <%= t('.confirmations.delete_file_html') %>
- Note that quality control (QC) requires files to be synchronized locally first. + <%=t('.qc_note') %>
- Are you sure you wish to delete the tag ? + <%= t('.confirmations.delete_tag_html') %>
diff --git a/BrainPortal/app/views/userfiles/_file_menu.html.erb b/BrainPortal/app/views/userfiles/_file_menu.html.erb index 8fbfedade..7bdd37e43 100644 --- a/BrainPortal/app/views/userfiles/_file_menu.html.erb +++ b/BrainPortal/app/views/userfiles/_file_menu.html.erb @@ -34,13 +34,13 @@ class="act-btn" data-dialog="toolsDialog" data-icon="ui-icon-play" - >Launch + ><%= t('.static_actions.launch') %> Upload + ><%= t('.static_actions.upload') %> <% if @scope.custom[:view_all] %> - Show only my files + <%= t('.static_actions.show_only_my_files') %> <% else %> - Show all files + <%= t('.static_actions.show_all_files') %> <% end %> @@ -64,38 +64,38 @@ data-method="POST" data-empty-selection="0" data-icon="ui-icon-arrowthickstop-1-s" - >Download + ><%= t('.dynamic_actions.download') %> Copy + ><%= t('.dynamic_actions.copy') %> Move + ><%= t('.dynamic_actions.move') %> Rename + ><%= t('.dynamic_actions.rename') %> Compress + ><%= t('.dynamic_actions.compress') %> Uncompress + ><%= t('.dynamic_actions.uncompress') %> Delete + ><%= t('delete') %>
- - + + <% rus.each do |ru| %> @@ -18,4 +18,3 @@ <% end %> <% end %> <% end %> - diff --git a/BrainPortal/app/views/userfiles/_syncstatus.html.erb b/BrainPortal/app/views/userfiles/_syncstatus.html.erb index 35ea0f543..2120d2cba 100644 --- a/BrainPortal/app/views/userfiles/_syncstatus.html.erb +++ b/BrainPortal/app/views/userfiles/_syncstatus.html.erb @@ -28,14 +28,13 @@ <%= "#{@_syncstatus_rr_cache[syncstat.remote_resource_id].class.to_s} '#{h(@_syncstatus_rr_cache[syncstat.remote_resource_id].name)}' : #{status_html_symbol(syncstat.status)} (#{h(syncstat.status)})".html_safe %> <% if syncstat.status == 'InSync' -%>
- Last Synchronized Date: <%= pretty_past_date syncstat.synced_at %>
- Last Accessed Date: <%= pretty_past_date syncstat.accessed_at %> + <%= t('.last_synchronized_date') %> <%= pretty_past_date syncstat.synced_at %>
+ <%= t('.last_accessed_date') %> <%= pretty_past_date syncstat.accessed_at %> <% elsif syncstat.status =~ /^To/ -%>
- Transfer Started: <%= pretty_past_date syncstat.updated_at %> + <%= t('.transfer_started') %> <%= pretty_past_date syncstat.updated_at %> <% else -%>
- State Occurred: <%= pretty_past_date syncstat.updated_at %> + <%= t('.state_occurred') %> <%= pretty_past_date syncstat.updated_at %> <% end -%> <% end %> - diff --git a/BrainPortal/app/views/userfiles/_tags_table.html.erb b/BrainPortal/app/views/userfiles/_tags_table.html.erb index 8d12ccf2a..0e32090c0 100644 --- a/BrainPortal/app/views/userfiles/_tags_table.html.erb +++ b/BrainPortal/app/views/userfiles/_tags_table.html.erb @@ -51,9 +51,9 @@ - - - + + + @@ -73,7 +73,7 @@ group_select('group_id', {}, { :id => 'tag-add-prj', :class => 'tag-in-prj', - :'data-placeholder' => "A project..." + :'data-placeholder' => t('.placeholders.group') }) %> diff --git a/BrainPortal/app/views/userfiles/_tools_interface.html.erb b/BrainPortal/app/views/userfiles/_tools_interface.html.erb index 879c1072f..fe2e14274 100644 --- a/BrainPortal/app/views/userfiles/_tools_interface.html.erb +++ b/BrainPortal/app/views/userfiles/_tools_interface.html.erb @@ -27,25 +27,25 @@ tags = @my_tools.map { |t| t.application_tags :array }.flatten.sort_by { |tag| tag.downcase }.uniq %> -
+
- Search: + <%= t('labels.search_colon') %>

<% if types.present? || packages.present? || tags.present? %>

- +

<% end %> <% if types.present? %> - Type:
+ <%= t('labels.type_colon.one') %>
<% types.each do |type| %>

- Tools: + <%= t('labels.tool_colon.other') %>
DateSpace Delta<%= t('date') %><%= t('.headings.space_delta') %>
TagProjectFiles<%= t('activerecord.models.tag.one') %><%= t('activerecord.models.group.one') %><%= t('activerecord.models.userfile.other') %>
@@ -96,9 +96,9 @@ @@ -118,9 +118,9 @@ <% end # each @my_tools %> diff --git a/BrainPortal/app/views/userfiles/_userfiles_display.html.erb b/BrainPortal/app/views/userfiles/_userfiles_display.html.erb index cc97b57f0..bcf11930f 100644 --- a/BrainPortal/app/views/userfiles/_userfiles_display.html.erb +++ b/BrainPortal/app/views/userfiles/_userfiles_display.html.erb @@ -51,19 +51,19 @@ end %> - <%= pluralize(@userfiles_total," entry") %> + <%= t('.entry', count: @userfiles_total) %> <% unless @scope.custom[:view_all] %> - (own files only) + <%= t('.own_files_only') %> <% end %>, <%= colored_pretty_size(@userfiles_total_size) %> - <%= show_total.(@hidden_total, 'hidden', hidden_icon) %> - <%= show_total.(@archived_total, 'archived', archived_icon) %> - <%= show_total.(@immutable_total, 'locked', immutable_icon) %> + <%= show_total.(@hidden_total, t('.show_total.hidden'), hidden_icon) %> + <%= show_total.(@archived_total, t('.show_total.archived'), archived_icon) %> + <%= show_total.(@immutable_total, t('.show_total.locked'), immutable_icon) %> )
- Search by name: <%= ajax_search_box("name_like", userfiles_path) %> + <%= t('.search_by_name') %> <%= ajax_search_box("name_like", userfiles_path) %>
@@ -98,7 +98,7 @@ <% t.column('', :type_icon, - :pretty_name => "Type Icon" + :pretty_name => t('.columns.type_icon') ) do |u| %> <% if u.is_a?(FileCollection) %> @@ -109,7 +109,7 @@ <% end %> <% - t.column("Filename", :name, + t.column(t('.columns.filename'), :name, :sortable => true ) do |u| filename_listing(u, @@ -118,45 +118,47 @@ ) end - t.column("File Type", :type, + t.column(t('.columns.file_type'), :type, :field_name => :pretty_type, :sortable => true, :filters => default_filters_for(@base_scope, @custom_scope, :type) ) - t.column("Owner", :login, + t.column(t('.columns.owner'), :login, :sortable => true, :filters => default_filters_for(@base_scope, @custom_scope, User) ) { |u| link_to_user_if_accessible(u.user) } - t.column("Creation Date", :creation_date, + t.column(t('.columns.creation_date'), :creation_date, :sortable => true ) do |u| html_tool_tip(to_localtime(u.created_at, :date), :offset_x => 0, :offset_y => 20) do - ("Created: #{u.created_at.in_time_zone.strftime("%a %b %d, %Y at %H:%M:%S %Z")}
" + - "Updated: #{u.updated_at.in_time_zone.strftime("%a %b %d, %Y at %H:%M:%S %Z")}").html_safe + ("#{t('created_colon')} #{u.created_at.in_time_zone.strftime("%a %b %d, %Y at %H:%M:%S %Z")}
" + + "#{t('updated_colon')} #{u.updated_at.in_time_zone.strftime("%a %b %d, %Y at %H:%M:%S %Z")}").html_safe end end %> <% - t.column("Size", :size, + t.column(t('.columns.size'), :size, :sortable => true ) do |u| %> <%= u.archived? ? archived_icon : "" %> <% if u.size.present? %> - <%= u.archived ? colored_pretty_size(u.size) : colored_format_size(u) %> + <%= u.archived ? colored_pretty_size(u.size) : colored_format_size(u) %> <% else %> - <%= html_colorize("unknown","red") %> + <%= html_colorize(t('unknown').downcase,"red") %> <% end %> <% if u.archived? %> <% before_archiving_size = u.meta[:before_archiving_size].presence %> <% before_archiving_num_files = u.meta[:before_archiving_num_files].presence %> <% if before_archiving_size || before_archiving_num_files %> - (was: - <%= colored_pretty_size(before_archiving_size) %> in - <%= before_archiving_num_files ? view_pluralize(before_archiving_num_files, "file") + ")" : "unknown)" %> + <%= t('.was_html', + size: colored_pretty_size(before_archiving_size), + file_count: before_archiving_num_files ? view_pluralize(before_archiving_num_files, t('activerecord.models.userfile.other')) : t('unknown').downcase + ) + %> <% end %> <% end %> <% end %> @@ -168,7 +170,7 @@ end ).try(:value) || []).dup - t.column("Tags", :tags, + t.column(t('.columns.tags'), :tags, :filters => @tag_filters, :filter_target => lambda do |column, filter| ({ @@ -189,7 +191,7 @@ end unless current_project - t.column("Project", :group, + t.column(t('.columns.group'), :group, :sortable => true, :filters => default_filters_for(@base_scope, @custom_scope, Group) ) do |u| @@ -197,20 +199,20 @@ end end - t.column("Project Access", :group_writable, + t.column(t('.columns.project_access'), :group_writable, :sortable => true ) do |u| - u.group_writable ? 'Read/Write' : 'Read Only' if u.group + u.group_writable ? t('userfiles.common.read_write') : t('userfiles.common.read_only') if u.group end - t.column("Provider", :data_provider, + t.column(t('.columns.data_provider'), :data_provider, :sortable => true, :filters => default_filters_for(@base_scope, @custom_scope, DataProvider) ) do |u| link_to_data_provider_if_accessible(u.data_provider) end - t.column("Description") do |u| + t.column(t('.columns.description')) do |u| html_tool_tip(crop_text_to(40, u.description), :offset_x => 0, :offset_y => 20) do simple_format(u.description, :sanitize => true) end if u.description.present? diff --git a/BrainPortal/app/views/userfiles/index.html.erb b/BrainPortal/app/views/userfiles/index.html.erb index c571b421d..0c05c09da 100644 --- a/BrainPortal/app/views/userfiles/index.html.erb +++ b/BrainPortal/app/views/userfiles/index.html.erb @@ -22,7 +22,7 @@ # -%> -<% title("Files") %> +<% title(t('.title')) %> <% content_for :head do %> <%= javascript_include_tag 'userfiles' %> @@ -47,7 +47,7 @@ <% sync_statuses = ['InSync', 'ProvNewer', 'CacheNewer', 'Corrupted', 'ToCache', 'ToProvider'] %> - <%= center_legend("Synchronization symbols:", sync_statuses.map { |s| [status_html_symbol(s), s] }) %> + <%= center_legend(t('.legends.sync_symbols'), sync_statuses.map { |s| [status_html_symbol(s), s] }) %> <% end %> diff --git a/BrainPortal/app/views/userfiles/quality_control.html.erb b/BrainPortal/app/views/userfiles/quality_control.html.erb index 141fe5f4c..e0629b1c2 100644 --- a/BrainPortal/app/views/userfiles/quality_control.html.erb +++ b/BrainPortal/app/views/userfiles/quality_control.html.erb @@ -22,18 +22,18 @@ # -%> -<% title("Quality Control") %> +<% title(t('.title')) %>
<%= ajax_form_tag url_for(:action => :quality_control_panel), :target => "#qc_left_panel" do %> <%= ajax_element url_for(:action => :quality_control_panel), :data => {:file_ids => @filelist, :index => -1, :authenticity_token => form_authenticity_token, :target => "qc_left_panel"}, :method => :post, :id => "qc_left_panel" do %> - Loading panel... + <%= t('.loading_message.loading_panel') %> <% end %> <% end %>
@@ -41,10 +41,9 @@
<%= ajax_form_tag url_for(:action => :quality_control_panel), :target => "#qc_right_panel" do %> <%= ajax_element url_for(:action => :quality_control_panel), :data => {:file_ids => @filelist, :index => 0, :authenticity_token => form_authenticity_token, :target => "qc_right_panel"}, :method => :post, :id => "qc_right_panel" do %> - Loading panel... + <%= t('.loading_message.loading_panel') %> <% end %> <% end %>
<% end %>
- diff --git a/BrainPortal/app/views/userfiles/show.html.erb b/BrainPortal/app/views/userfiles/show.html.erb index ac315b56e..ea38826f8 100644 --- a/BrainPortal/app/views/userfiles/show.html.erb +++ b/BrainPortal/app/views/userfiles/show.html.erb @@ -22,31 +22,31 @@ # -%> -<% title('File Info') %> +<% title(t('.title')) %> <% is_editable_by_current_user = @userfile.can_be_accessed_by?(current_user, requested_access = :write) %>
-<%= error_messages_for @userfile, :header_message => "#{@userfile.name} could not be updated." %> +<%= error_messages_for @userfile, :header_message => t('.error_messages.update', name: @userfile.name ) %>
<%= show_table(@userfile, :as => :userfile, :edit_condition => is_editable_by_current_user ) do |t| %> @@ -59,117 +59,121 @@ <%= f.text_field :name %> <% end %> - <% t.cell("Created at") do %> + <% t.cell(t('userfiles.common.created_at')) do %> <%= h(to_localtime(@userfile.created_at,:datetime)) %> - (<%= pretty_elapsed(Time.now - @userfile.created_at, :num_components => 3) %> ago) + (<%= t('ago_time', time: pretty_elapsed(Time.now - @userfile.created_at, :num_components => 3)) %>) <% end %> - <% t.cell("Type") do %> + <% t.cell(t('activerecord.attributes.type')) do %> <%= inline_edit_field(@userfile, :type, :content => @userfile.pretty_type, :disabled => !@userfile.has_owner_access?(current_user)) do %> <% u_type = @userfile.is_a?(SingleFile) ? ["SingleFile"] : ["FileCollection"] %> <%= userfile_type_select("userfile[type]", {:userfile_types => u_type, :selector => @userfile.class.name}) %> <% end %> <% if @userfile.class.to_s =~ /^(SingleFile|FileCollection)$/ && @userfile.suggested_file_type && @userfile.suggested_file_type != @userfile.class %> - (This file appears to be a <%= @userfile.suggested_file_type.pretty_type %>.) + (<%= t('.error_messages.suggested_type', type: @userfile.suggested_file_type.pretty_type ) %>) <% end %> <% end %> - <% t.cell("Modified at") do %> + <% t.cell(t('.cells.modified_at')) do %> <%= to_localtime(@userfile.updated_at,:datetime) %> - (<%= pretty_elapsed(Time.now - @userfile.updated_at, :num_components => 3) %> ago) + + (<%= t('ago_time', time: pretty_elapsed(Time.now - @userfile.updated_at, :num_components => 3)) %>) <% end %> - <% t.cell("Size") do %> + <% t.cell(t('activerecord.attributes.size')) do %> <% if @userfile.archived? %> <%= archived_icon %> <%= colored_pretty_size(@userfile.size) %> <% if @userfile.size && @userfile.size >= 1_000 -%> - = <%= @userfile.size %> bytes + = <%= t('userfiles.common.size_bytes', size: @userfile.size) %> <% end %> <% before_archiving_size = @userfile.meta[:before_archiving_size].presence %> <% before_archiving_num_files = @userfile.meta[:before_archiving_num_files].presence %> <% if before_archiving_size || before_archiving_num_files %>
- Was: - <%= colored_pretty_size(before_archiving_size) %> in - <%= before_archiving_num_files ? view_pluralize(before_archiving_num_files, "file") : "unknown" %> + <%= + t('.was_html', + size: colored_pretty_size(before_archiving_size), + file_count: before_archiving_num_files ? view_pluralize(before_archiving_num_files, t('activerecord.models.userfile.one').downcase) : t('unknown').downcase + ) + %> <% if before_archiving_size && before_archiving_size >= 1_000 -%> - = <%= before_archiving_size %> bytes + = <%= t('userfiles.common.size_bytes', size: before_archiving_size) %> <% end %> <% end %> <% else %> <%= colored_format_size(@userfile) %> <% if @userfile.size && @userfile.size >= 1_000 -%> - = <%= @userfile.size %> bytes + <%= t('userfiles.common.size_bytes', size: @userfile.size) %> <% end %> <% end %> <% end %> - <% t.cell("Data Provider") do %> + <% t.cell(t('activerecord.models.data_provider.one')) do %> <%= link_to_data_provider_if_accessible(@userfile.data_provider) %> ( <%= @userfile.data_provider.class.to_s %> ) <% ss = @userfile.sync_status.all.to_a %> <% if ss.size > 0 %> - Cached: + <%= t('.cached') %> <% ss.each do |syncstat| %> <%= render :partial => 'syncstatus', :locals => { :syncstat => syncstat } %> <% end %> <% end %> <% end %> - <% t.edit_cell(:user_id, :content => link_to_user_with_tooltip(@userfile.user), :disabled => !(current_user.available_users.include?(@userfile.user) && @userfile.data_provider.allow_file_owner_change?), :header => "Owner") do %> + <% t.edit_cell(:user_id, :content => link_to_user_with_tooltip(@userfile.user), :disabled => !(current_user.available_users.include?(@userfile.user) && @userfile.data_provider.allow_file_owner_change?), :header => t('owner')) do %> <%= user_select("userfile[user_id]", { :selector => @userfile }) %> <% end %> - <% t.edit_cell(:group_id, :header => "Project", :content => link_to_group_if_accessible(@userfile.group), :disabled => (!@userfile.has_owner_access?(current_user))) do %> + <% t.edit_cell(:group_id, :header => t('activerecord.models.group.one'), :content => link_to_group_if_accessible(@userfile.group), :disabled => (!@userfile.has_owner_access?(current_user))) do %> <%= group_select 'userfile[group_id]', { :groups => current_user.assignable_groups, :selector => @userfile.group_id.to_s } %> <% end %> - <% t.edit_cell(:tag_ids, :header => "Tags", :content => @userfile.get_tags_for_user(current_user).map(&:name).join(", ")) do %> + <% t.edit_cell(:tag_ids, :header => t('activerecord.models.tag.one'), :content => @userfile.get_tags_for_user(current_user).map(&:name).join(", ")) do %> <% end %> - <% t.edit_cell(:group_writable, :header => "Project permission on file", :content => (@userfile.group_writable? ? "Read/Write" : "Read"), :disabled => !@userfile.has_owner_access?(current_user)) do |f| %> - <%= f.select :group_writable, [['Read Only', false],['Read/Write', true]] %> + <% t.edit_cell(:group_writable, :header => t('.headings.project_permission'), :content => (@userfile.group_writable? ? t('userfiles.common.read_write') : t('userfiles.common.read')), :disabled => !@userfile.has_owner_access?(current_user)) do |f| %> + <%= f.select :group_writable, [[t('userfiles.common.read_only'), false],[t('userfiles.common.read_write'), true]] %> <% end %> - <% t.edit_cell("Hidden file", :content => check_box_tag(nil ,nil, @userfile.hidden?, :disabled => true) + " ".html_safe + hidden_icon, :disabled => (!@userfile.has_owner_access?(current_user))) do |f| %> + <% t.edit_cell(t('.cells.hidden_file'), :content => check_box_tag(nil ,nil, @userfile.hidden?, :disabled => true) + " ".html_safe + hidden_icon, :disabled => (!@userfile.has_owner_access?(current_user))) do |f| %> <%= f.check_box :hidden %> <%= hidden_icon %> <% end %> - <% t.edit_cell("Immutable file", :content => check_box_tag(nil ,nil, @userfile.immutable?, :disabled => true) + " ".html_safe + immutable_icon, :disabled => (!@userfile.has_owner_access?(current_user))) do |f| %> + <% t.edit_cell(t('.cells.immutable_file'), :content => check_box_tag(nil ,nil, @userfile.immutable?, :disabled => true) + " ".html_safe + immutable_icon, :disabled => (!@userfile.has_owner_access?(current_user))) do |f| %> <%= f.check_box :immutable %> <%= immutable_icon %> <% end %> - <% t.cell("Zenodo Publication") do %> + <% t.cell(t('.cells.zenodo_publication')) do %> <% if @userfile.zenodo_doi.present? %> <% if @userfile.zenodo_doi.starts_with?( ZenodoHelper::ZenodoSandboxDOIPrefix ) %> - Published: <%= link_to_deposit(@userfile.zenodo_deposit_id) %> + <%= t('.zenodo_publication.published', link: link_to_deposit(@userfile.zenodo_deposit_id)) %> <% else %> - Published: <%= link_to_zenodo_doi(@userfile.zenodo_doi) %> + <%= t('.zenodo_publication.published', link: link_to_zenodo_doi(@userfile.zenodo_doi)) %> <% end %> <% elsif @userfile.zenodo_deposit_id.present? %> - In progress: <%= link_to_deposit(@userfile.zenodo_deposit_id) %> + <%= t('.zenodo_publication.in_progress', link: link_to_deposit(@userfile.zenodo_deposit_id)) %> <% else %> - None. + <%= t('none') %>. <% end %> <% end %> <% t.empty_cell %> <% if @userfile.parent %> - <% t.cell("Parent") { link_to_userfile_if_accessible(@userfile.parent) } %> + <% t.cell(t('.cells.parent')) { link_to_userfile_if_accessible(@userfile.parent) } %> <% t.empty_cell %> <% end %> <% children = @userfile.children.order(:name).all.to_a %> <% if children.size > 0 %> - <% t.cell("Children", :show_width => 2) do %> + <% t.cell(t('.cells.children'), :show_width => 2) do %> <%= array_to_table(children, :table_class => 'simple', :min_data => 3, :cols => 3, :fill_by_columns => true ) do |u,r,c| %> <%= link_to_userfile_if_accessible(u) %> <% end %> @@ -178,9 +182,9 @@ <% if current_user.has_role? :admin_user %> - <% t.attribute_cell(:cache_full_path, :header => "Local Data Provider (cache) path", :show_width => 2) %> + <% t.attribute_cell(:, :header => t('.headings.provider_full_path'), :show_width => 2) %> <% if @userfile.data_provider.respond_to?(:provider_full_path) %> - <% t.cell("Remote Data Provider path", :show_width => 2) do %> + <% t.cell(t('.cells.provider_full_path'), :show_width => 2) do %> <%= @userfile.data_provider.provider_full_path(@userfile) %> <% end %> <% end %> @@ -201,70 +205,56 @@
- Content + <%= t('.legends.content') %> <% if @userfile.archived? %> - <%= html_colorize("This #{@userfile.pretty_type} has been archived.", 'red') %>
- Content viewers are disabled until the file is unarchived. + <%= html_colorize(t('.content.archived', type: @userfile.pretty_type), 'red') %>
+ <%= t('.content.viewers_disabled') %> <% elsif ! @userfile.can_be_accessed_by?(current_user, :read) %> - (This file cannot be viewed by you; I wonder how you got here.) + <%= t('.content.cannot_view') %> <% elsif @userfile.data_provider.meta[:no_viewers] %> - (This file cannot be viewed as it is stored on Data Provider - <%= link_to_data_provider_if_accessible(@userfile.data_provider) %> - which is marked as non-viewable) + <%= t('.content.non_viewable_dp_html') %> <% elsif @userfile.data_provider.not_syncable? %> - (This file cannot be viewed as it is stored on Data Provider - <%= link_to_data_provider_if_accessible(@userfile.data_provider) %> - which is configured to not allow synchronization at all) + <%= t('.content.not_syncable_dp_html') %> <% elsif @sync_status == "Corrupted" %> - (The content of this file seems to be corrupted. This might be the result - of a bad data transfer while it was being created or a filesystem failure. - There isn't much you can do about this, although if the file was produced - by a task, consider restarting the task's Post Processing stage.) + <%= t('.content.corrupted_html') %> <% elsif ! @userfile.data_provider.rr_allowed_syncing? %> - (This file cannot be viewed as it is stored on Data Provider - <%= link_to_data_provider_if_accessible(@userfile.data_provider) %> - which is configured to not allow synchronization to this Portal) + <%= t('.content.sync_not_allowed_html') %> <% elsif (! @userfile.is_locally_synced?) && (! @userfile.data_provider.online?) %> - (This data is not currently synchronized and its Data Provider - <%= link_to_data_provider_if_accessible(@userfile.data_provider) %> - is offline, so its content is not viewable for the moment) + <%= t('.content.offline_dp_html') %> <% elsif ! @userfile.is_locally_synced? %> - <% if @sync_status =~ /^To/ %> - (This data file is currently being synchronized. Wait a few seconds for this to complete) - <% else %> - (This data file is not currently synchronized. Click - <%= link_to "here", sync_multiple_userfiles_path(:file_ids => [ @userfile.id ], :back_to_show_page => 1), :method => :post %> - to start the synchronization process. - This may allow you to view displayable content<% if @userfile.is_a?(FileCollection) %> and extract files from this collection<% end %>). - <% end %> + <% if @sync_status =~ /^To/ %> + <%= t('.content.sync_in_progress') %> + <% else %> + <% key = @userfile.is_a?(FileCollection) ? '.content.sync_start_collection_html' : '.content.sync_start_html' %> + <%= t(key, link: link_to(t('.here'), sync_multiple_userfiles_path(:file_ids => [@userfile.id], :back_to_show_page => 1), :method => :post)) %> + <% end %> <% elsif @userfile.viewers_with_applied_conditions.blank? %> - (The contents of this file cannot be viewed: no viewer code available at this moment - for files of type '<%= @userfile.pretty_type %>') + <%= t('.content.no_viewer_code_html', type: @userfile.pretty_type) %> <% else %> <% if @userfile.viewers_with_applied_conditions.size > 1 %> - Change view: + <%= t('.content.change_view') %> <%= select_tag "viewer", options_for_select(@userfile.viewers_with_applied_conditions.map { |v| [v.name, v.name] }, (@viewer.try(:name) || @userfile.class.name.underscore)), :class => :request_on_change, "data-target" => "#userfile_viewer", @@ -286,7 +276,7 @@ <% end %> <% rescue ActionView::Template::Error => e %> - An error occurred when loading the viewer plugin. + <%= t('.error_messages.viewer') %> <% raise e.original_exception unless Rails.env == 'production' %> <% ExceptionLog.log_exception(e.original_exception, current_user, request) %> @@ -301,7 +291,6 @@

-<%= render :partial => "layouts/log_report", :locals => { :log => @log, :title => 'File Log' } %> +<%= render :partial => "layouts/log_report", :locals => { :log => @log, :title => t('.titles.file_log') } %>

<%= render :partial => "resource_usage" %> - diff --git a/BrainPortal/app/views/users/_users_table.html.erb b/BrainPortal/app/views/users/_users_table.html.erb index 98dd08baa..e67b11b25 100644 --- a/BrainPortal/app/views/users/_users_table.html.erb +++ b/BrainPortal/app/views/users/_users_table.html.erb @@ -23,7 +23,7 @@ -%>

<%= @@ -36,10 +36,10 @@ @@ -78,16 +78,16 @@ <% t.pagination - t.column("Login", :login, + t.column(t('.columns.login'), :login, :sortable => true, :filters => scoped_filters_for( @base_scope, @scope, :account_locked, format: lambda do |format_info| value, label, base, view = *format_info - label = (!value || value == 0 ? 'Unlocked' : 'Locked') + label = (!value || value == 0 ? t('.unlocked') : t('.locked')) { :value => value, - :label => "#{label} (of #{base})", + :label => t('.label_of', label: label, base: base), :indicator => view, :empty => view == 0 } @@ -99,30 +99,30 @@ ) end - t.column("Full name", :full_name, + t.column(t('.columns.full_name'), :full_name, :sortable => true ) - t.column("Email", :email, + t.column(t('.columns.email'), :email, :sortable => true ) { |u| mail_to u.email } - t.column("Position", :position, + t.column(t('.columns.position'), :position, :sortable => true ) - t.column("Affiliation", :affiliation, + t.column(t('.columns.affiliation'), :affiliation, :sortable => true ) - t.column("Last Connection", :last_connection, + t.column(t('.columns.last_connection'), :last_connection, :sortable => true - ) { |u| u.last_connected_at ? to_localtime(u.last_connected_at, :datetime) : "Unknown" } + ) { |u| u.last_connected_at ? to_localtime(u.last_connected_at, :datetime) : t('unknown') } - t.column("Projects", :groups) do |u| + t.column(t('.columns.groups'), :groups) do |u| group_names = u.assignable_groups.order(:name).pluck(:name).reject { |n| n == u.login } if group_names.size > 1 && group_names.size < 40 - html_tool_tip(pluralize(group_names.size, "project"), :offset_x => 60) do + html_tool_tip(t('.project_count', count: group_names.size), :offset_x => 60) do array_to_table(group_names, :table_class => 'simple', :ratio => "3:1", @@ -130,57 +130,57 @@ ) { |name,r,c| name } end.html_safe elsif group_names.size > 1 - pluralize(group_names.size, "project") + t('.project_count', count: group_names.size) end end - t.column("Role", :type, + t.column(t('.role'), :type, :sortable => true, :filters => default_filters_for(@base_scope, :type) ) { |u| u.type.underscore.titleize } - t.column("Site", :site, + t.column(t('.columns.site'), :site, :sortable => true, :filters => default_filters_for(@base_scope, Site) ) { |u| link_to_site_if_accessible(u.site) } - t.column("City", :city, + t.column(t('activerecord.attributes.user.city'), :city, :sortable => true, :filters => default_filters_for(@base_scope, :city) ) - t.column("Country", :country, + t.column(t('activerecord.attributes.user.country'), :country, :sortable => true, :filters => default_filters_for(@base_scope, :country) ) - t.column("Time Zone", :time_zone, + t.column(t('time_zone'), :time_zone, :sortable => true, - ) { |u| u.time_zone || "(Unset)" } + ) { |u| u.time_zone || t('unset_parentheses') } - t.column("Files", :files) do |u| + t.column(t('activerecord.models.file.other'), :files) do |u| size = Userfile.where(:user_id => u.id).sum(:size) index_count_filter(@users_file_counts[u.id], :userfiles, { :user_id => u.id }, :show_zeros => 1) + - (size > 0 ? " (#{colored_pretty_size(size)} used)" : "").html_safe + (size > 0 ? " (#{t('users.common.used', size: colored_pretty_size(size))})" : "").html_safe end - t.column("Tasks", :tasks) do |u| + t.column(t('activerecord.models.cbrain_task.other'), :tasks) do |u| size = CbrainTask.real_tasks.where(:user_id => u.id).sum(:cluster_workdir_size) unk = CbrainTask.real_tasks.where(:user_id => u.id, :cluster_workdir_size => nil).where("cluster_workdir IS NOT NULL").count index_count_filter(@users_task_counts[u.id], :tasks, { :user_id => u.id }, :show_zeros => 1) + - ( (size > 0 && unk > 0) ? " (#{colored_pretty_size(size)} used, #{unk} unkn)" : - (size > 0 && unk == 0) ? " (#{colored_pretty_size(size)} used)" : - (size == 0 && unk > 0) ? " (#{unk} unkn)" : "" + ( (size > 0 && unk > 0) ? " (#{t('users.common.used', size: colored_pretty_size(size))}, #{t('users.common.unkn', count: unk)})" : + (size > 0 && unk == 0) ? " (#{t('users.common.used', size: colored_pretty_size(size))})" : + (size == 0 && unk > 0) ? " (#{t('users.common.unkn', count: unk)})" : "" ).html_safe end - t.column("Switch", :switch) do |u| - link_to 'Switch', switch_user_path(u), :class => 'action_link', :method => :post if u != User.admin + t.column(t('switch'), :switch) do |u| + link_to t('switch'), switch_user_path(u), :class => 'action_link', :method => :post if u != User.admin end if current_user.has_role? :admin_user - t.column("Access", :access) do |u| - link_to 'Access?', + t.column(t('.access'), :access) do |u| + link_to t('.access_q'), { :controller => :tool_configs, :action => :report, diff --git a/BrainPortal/app/views/users/change_password.html.erb b/BrainPortal/app/views/users/change_password.html.erb index ebf965f7f..517d9059f 100644 --- a/BrainPortal/app/views/users/change_password.html.erb +++ b/BrainPortal/app/views/users/change_password.html.erb @@ -22,25 +22,25 @@ # -%> -<% title 'Change Password' %> +<% title t('.title') %> -

Change Password

+

<%= t('.headings.main') %>

-<%= error_messages_for @user, :header_message => "Password could not be updated.", :html_options => {:style => "margin-right:auto;margin-left:auto"} %> +<%= error_messages_for @user, :header_message => t('.headings.message'), :html_options => {:style => "margin-right:auto;margin-left:auto"} %> <%= form_for(@user, :as => :user, :url => user_path(@user)) do |f| %>
<% if current_user.has_role? :admin_user %> -

No tools available. New tools may be registered from the Tools index.

+

<%= t('.headings.no_tools_admin') %>

<% else %> -

No tools available. Contact your admin to have them registered.

+

<%= t('.headings.no_tools_others') %>

<% end %>
<%= tool.name %>
<% if taglist.present? %> - Tags: <%= taglist.join(', ') %>
+ <%= t('labels.tags_colon.other') %> <%= taglist.join(', ') %>
<% end %> - <%= link_to( "Tool Website", tool.url, :target => "_blank") if tool.url.present? %> + <%= link_to( t('.links.tool_website'), tool.url, :target => "_blank") if tool.url.present? %>
- + - + <% if @user.id != current_user.id %> - + - +
<%= f.password_field :password %>
<%= f.password_field :password_confirmation %>
<%= hidden_field_tag :force_password_reset, "0", :id => 'hidden_force_password_reset' %> <%= check_box_tag :force_password_reset, "1", params[:force_password_reset] != '0' %> @@ -49,8 +49,7 @@ <% end %>

<%= submit_tag 'Submit' %>

<%= submit_tag t('submit') %>
<% end %> - diff --git a/BrainPortal/app/views/users/index.html.erb b/BrainPortal/app/views/users/index.html.erb index 94c06f689..027ef9d00 100644 --- a/BrainPortal/app/views/users/index.html.erb +++ b/BrainPortal/app/views/users/index.html.erb @@ -18,13 +18,12 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title "Users" %> +<% title t('.title') %>
<%= render :partial => 'users_table' %>
- diff --git a/BrainPortal/app/views/users/new.html.erb b/BrainPortal/app/views/users/new.html.erb index 3895882b9..6a8f9a5c6 100644 --- a/BrainPortal/app/views/users/new.html.erb +++ b/BrainPortal/app/views/users/new.html.erb @@ -22,9 +22,9 @@ # -%> -<% title 'Add New User' %> +<% title t('.title') %> -

Add New User

+

<%= t('.headings.main') %>

<%= error_messages_for @user %> @@ -32,40 +32,40 @@
-
Basic Information
+
<%= t('.headings.basic_information') %>

- <%= f.label :full_name, "Full Name" %>
+ <%= f.label :full_name, t('.labels.full_name') %>
<%= f.text_field :full_name %>

- <%= f.label :login, "Login" %>
+ <%= f.label :login, t('login') %>
<%= f.text_field :login %>
- For Tom Jones, use tjones, not 'tom' or 'jones'. + <%= t('.paragraphs.login_html') %>

- <%= f.label :email, "Email" %>
+ <%= f.label :email, t('.labels.email') %>
<%= f.text_field :email %>

- <%= f.label :position, "Position" %>
+ <%= f.label :position, t('.labels.position') %>
<%= f.text_field :position %>

- <%= f.label :affiliation, "Affiliation" %>
+ <%= f.label :affiliation, t('.labels.affiliation') %>
<%= f.text_field :affiliation %>

- <%= f.label :city, "City" %>
+ <%= f.label :city, t('.labels.city') %>
<%= f.text_field :city %>

- <%= f.label :country, "Country" %>
+ <%= f.label :country, t('.labels.country') %>
<%= f.text_field :country %>

- <%= f.label :time_zone, "Time Zone" %>
+ <%= f.label :time_zone, t('.labels.time_zone') %>
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.all.select { |t| t.name =~ /canada/i }, { :default => ActiveSupport::TimeZone['Eastern Time (US & Canada)'], @@ -73,42 +73,39 @@ %>

- <%= f.label :type, "Type" %>
+ <%= f.label :type, t('.labels.type') %>
<%= f.select :type, roles_for_user(current_user) %> <% if current_user.has_role? :admin_user %>

- <%= f.label :site_id, "Site" %>
- <%= site_select "user[site_id]",{}, :prompt => "(Select a site)" %> + <%= f.label :site_id, t('.labels.site') %>
+ <%= site_select "user[site_id]",{}, :prompt => t('users.common.select_site') %> <% end %>

- <%= label_tag 'meta_pref_data_provider_id', "Default Data Provider" %> + <%= label_tag 'meta_pref_data_provider_id', t('.labels.pref_data_provider_id') %> <%= data_provider_select("meta[pref_data_provider_id]", { :selector => (params[:meta] || {})[:pref_data_provider_id] }, { :include_blank => true } ) %>
- If set, make sure it is a Data Provider that will be accessible to the user + <%= t('.paragraphs.dp_html') %>

- <%= label_tag 'meta_allowed_globus_provider_names', "Forced OpenID Identity Providers" %> + <%= label_tag 'meta_allowed_globus_provider_names', t('.labels.allowed_globus_provider_names') %> <%= text_field_tag("meta[allowed_globus_provider_names]", (params[:meta] || {})[:allowed_globus_provider_names], :size => 30) %>
- - If set, must be exact OpenID identity provider names separated by commas - A single '*' is also allowed to mean any provider name. - + <%= t('.paragraphs.openid_html') %>

- <%= f.label :password, "Password" %>
+ <%= f.label :password, t('.labels.password') %>
<%= f.password_field :password, :value => @random_pass, :autocomplete => "new-password" %>

- <%= f.label :password_confirmation, "Confirm Password" %>
+ <%= f.label :password_confirmation, t('.labels.confirm_password') %>
<%= f.password_field :password_confirmation, :value => @random_pass, :autocomplete => "new-password" %>

- + <%= check_box_tag :no_password_reset_needed, "1", params[:no_password_reset_needed] == "1" %> <%= hidden_field_tag :signup_id, params[:signup_id] %> @@ -123,14 +120,14 @@

-
Project Membership
+
<%= t('.headings.project_membership') %>
<%= render :partial => 'shared/group_tables', :locals => {:model => @user} %>
-
Access Profiles
+
<%= t('.headings.access_profile') %>
<% AccessProfile.order(:name).all.each do |access_profile| %> <%= check_box_tag "user[access_profile_ids][]", access_profile.id, false, :id => "ap_#{access_profile.id}" %> @@ -139,7 +136,6 @@

- <%= submit_tag 'Create User' %> + <%= submit_tag t('.submit') %> <% end %> - diff --git a/BrainPortal/app/views/users/new_token.html.erb b/BrainPortal/app/views/users/new_token.html.erb index f99aa3188..b1df36806 100644 --- a/BrainPortal/app/views/users/new_token.html.erb +++ b/BrainPortal/app/views/users/new_token.html.erb @@ -22,48 +22,37 @@ # -%> -<% title 'New API Token' %> +<% title t('.title') %> -

New API Token

+

<%= t('.headings.main') %>

-We have just generated a new API token for you. +<%= t('.paragraphs.generated_intro') %>

<%= @new_token %> <%= copy_to_clipboard_button( @new_token, - label: "copy", - title: "Click this button to copy the API token to the clipboard") - %> + label: t('.labels.copy'), + title: t('.titles.copy_tooltip')) %>

-If you are a developer and want to automate working -with CBRAIN or NeuroHub, this token will be needed -to access the APIs. -

-Refer to the CBRAIN API documentation -for more information. -

-A few notes about this token: +<%= t('.paragraphs.token_html') %> +<%= t('.titles.notes') %>: <% pretty_how_long = SessionHelpers::SESSION_API_TOKEN_VALIDITY.inspect %>

  • - This token will only be valid for <%= pretty_how_long %>. + <%= t('.li.validity', duration: pretty_how_long) %>
  • - Every time a request is made with it, it becomes valid for another <%= pretty_how_long %>. + <%= t('.li.renewal', duration: pretty_how_long) %>
  • - The first time it is used, the IP address of the connecting client will be - recorded and only connections from that IP address will be valid. + <%= t('.li.ip_lock_html') %>
  • - If a subsequent connection comes from any other IP address at any time, - the token will immediately be invalidated. + <%= t('.li.ip_invalid_html') %>
  • - To copy the token to your clipboard, simply click the copy button located to the right of the token. The token will be saved to your clipboard. - Please do not forget to paste and save the token. You will not be able to see it again. + <%= t('.li.copy_html') %>
- diff --git a/BrainPortal/app/views/users/request_password.html.erb b/BrainPortal/app/views/users/request_password.html.erb index 9babc7f71..d27d57005 100644 --- a/BrainPortal/app/views/users/request_password.html.erb +++ b/BrainPortal/app/views/users/request_password.html.erb @@ -18,28 +18,27 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # -%> -<% title 'Lost Password?' %> +<% title t('.title') %> -

Lost password? Fill this form, we'll contact you.

+

<%= t('.headings.main') %>

<%= form_tag send_password_users_path do %> - + - - + + - +
<%= text_field_tag :login %>
<%= text_field_tag :email %>

<%= submit_tag 'Submit' %>

<%= submit_tag t('submit') %>
<% end %> - diff --git a/BrainPortal/app/views/users/show.html.erb b/BrainPortal/app/views/users/show.html.erb index ed20b9a11..ac8e431fb 100644 --- a/BrainPortal/app/views/users/show.html.erb +++ b/BrainPortal/app/views/users/show.html.erb @@ -22,24 +22,24 @@ # -%> -<% title "Account Info" %> +<% title t('.title') %>
-<%= error_messages_for @user, :header_message => "User could not be updated." %> +<%= error_messages_for @user, :header_message => t('.headings.message') %>
<%= show_table(@user, :as => :user, :edit_condition => edit_permission?(@user)) do |t| %> @@ -56,7 +56,7 @@ <% t.edit_cell(:site_id, :content => link_to_site_if_accessible(@user.site), :disabled => !current_user.has_role?(:admin_user)) do - site_select("user[site_id]", @user.site_id, :prompt => "(Select a site)") + site_select("user[site_id]", @user.site_id, :prompt => t('.prompts.select_site')) end %> @@ -68,15 +68,15 @@ <% t.edit_cell(:email, :content => mail_to(h(@user.email))) { |f| f.text_field :email } %> <% - t.cell("Last Connected") do - @user.last_connected_at ? "#{to_localtime(@user.last_connected_at, :datetime)} (#{pretty_elapsed(Time.now - @user.last_connected_at, :num_components => 3)} ago)" : "(Never)" + t.cell(t('.cells.last_connected')) do + @user.last_connected_at ? "#{to_localtime(@user.last_connected_at, :datetime)} (#{t('ago_time', time: pretty_elapsed(Time.now - @user.last_connected_at, :num_components => 3))})" : t('.cells.never') end %> <% t.edit_cell(:city) { |f| f.text_field :city } %> <% - t.edit_cell("meta[pref_data_provider_id]", :header => "Default Data Provider", :content => link_to_data_provider_if_accessible(DataProvider.find_by_id(@user.meta["pref_data_provider_id"])) ) do + t.edit_cell("meta[pref_data_provider_id]", :header => t('.headings.pref_data_provider_id'), :content => link_to_data_provider_if_accessible(DataProvider.find_by_id(@user.meta["pref_data_provider_id"])) ) do data_provider_select("meta[pref_data_provider_id]", { :selector => @user.meta["pref_data_provider_id"] }, { :include_blank => true } ) @@ -86,7 +86,7 @@ <% t.edit_cell(:country) { |f| f.text_field :country } %> <% - t.edit_cell("meta[pref_bourreau_id]", :header => "Default Execution Server", :content => link_to_bourreau_if_accessible(Bourreau.find_by_id(@user.meta["pref_bourreau_id"])) ) do + t.edit_cell("meta[pref_bourreau_id]", :header => t('.headings.pref_bourreau_id'), :content => link_to_bourreau_if_accessible(Bourreau.find_by_id(@user.meta["pref_bourreau_id"])) ) do bourreau_select( "meta[pref_bourreau_id]", { :bourreaux => Bourreau.find_all_accessible_by_user(current_user).all, :selector => @user.meta["pref_bourreau_id"] }, @@ -95,52 +95,47 @@ %> <% - t.edit_cell(:time_zone, :content => (@user.time_zone || "(Unset)") ) do |f| + t.edit_cell(:time_zone, :content => (@user.time_zone || t('unset_parentheses')) ) do |f| f.select :time_zone, time_zone_options_for_select(@user.time_zone, /canada/i), :include_blank => true end %> <% t.edit_cell(:password, :content => "********") do %> - <%= link_to "Change Password", change_password_user_path(@user) %> + <%= link_to t('.links.change_password'), change_password_user_path(@user) %> <% end %> <% if (current_user.has_role?(:admin_user) || current_user.has_role?(:site_manager)) && not_admin_user(@user) - t.boolean_edit_cell('user[account_locked]', (@user.account_locked ? "1" : ""), "1", "0", :header => "Account Locked") + t.boolean_edit_cell('user[account_locked]', (@user.account_locked ? "1" : ""), "1", "0", :header => t('.headings.account_locked')) end %> <% if current_user.has_role?(:admin_user) %> - <% t.edit_cell('meta[ip_whitelist]', :header => 'Source IP Whitelist', :content => @user.meta['ip_whitelist'] || '') do %> + <% t.edit_cell('meta[ip_whitelist]', :header => t('.headings.ip_whitelist'), :content => @user.meta['ip_whitelist'] || '') do %> <%= text_field_tag "meta[ip_whitelist]", @user.meta['ip_whitelist'], :size => 40 %>
-
- Comma-separated list of allowed source IPs (X.X.X.X/XX) for the user to connect from. -
+ <%= t('.paragraphs.ip_whitelist_html') %> <% end %> - <% t.edit_cell('meta[allowed_globus_provider_names]', :header => "Forced OpenID Providers", :content => @user.meta['allowed_globus_provider_names'] || '') do %> + <% t.edit_cell('meta[allowed_globus_provider_names]', :header => t('.headings.allowed_globus_provider_names'), :content => @user.meta['allowed_globus_provider_names'] || '') do %> <%= text_field_tag "meta[allowed_globus_provider_names]", @user.meta['allowed_globus_provider_names'], :size => 40 %>
-
- If set, must be a list of OpenID identity provider names separated by commas. A single '*' is - also allowed to mean any provider name. -
+ <%= t('.paragraphs.allowed_globus_provider_names_html') %> <% end %> <% end %> <% end %> <%= show_table(@user, :as => :user, - :header => 'Your System SSH Key', + :header => t('.headings.ssh_key'), :url => push_keys_user_path(@user), :edit_condition => (true || @user.id == current_user.id), ) do |t| %> - <% t.cell "Created", :show_width => 2 do %> - <%= @ssh_key ? "#{to_localtime(@ssh_key.created_at, :datetime)} (#{pretty_elapsed(Time.now - @ssh_key.created_at, :num_components => 3)} ago)" : "(Never)" %> + <% t.cell t('created'), :show_width => 2 do %> + <%= @ssh_key ? "#{to_localtime(@ssh_key.created_at, :datetime)} (#{t('ago_time', time: pretty_elapsed(Time.now - @ssh_key.created_at, :num_components => 3))})" : t('.cells.never') %> <% end %> - <% t.cell "Public Key", :show_width => 2 do %> -
<%= @ssh_key.try(:public_key) || "None" %>
+ <% t.cell t('.cells.public_key'), :show_width => 2 do %> +
<%= @ssh_key.try(:public_key) || t('none') %>
<% end %> <% @@ -149,21 +144,21 @@ installed_links = installed_sites.map { |s| link_to_bourreau_if_accessible(s) }.join(", ") all_bourreaux = Bourreau.find_all_accessible_by_user(@user).order(:online, :name) %> - <% t.edit_cell "Installation Sites", :show_with => 2, :content => installed_links.html_safe do %> + <% t.edit_cell t('.cells.installation_sites'), :show_with => 2, :content => installed_links.html_safe do %> <%= hidden_field_tag 'user[dummy]', "dummy" %> <%= array_to_table(all_bourreaux, :table_class => 'simple bordered', :fill_by_columns => true, :cols => 1) do |b,r,c| %> <% date = @user.get_ssh_key_install_date(b.id) %> <%= link_to_bourreau_if_accessible(b) %> - Last pushed: <%= date || 'Never' %> - Push: + <%= t('.datas.last_pushed', date: date || t('.cells.never')) %> + <%= t('.datas.push') %> <%= check_box_tag('push_keys_to[]', b.id.to_s, installed_site_ids.include?(b.id.to_s), :disabled => (!b.online || date.present?)) %> <% end %> <% end %> <% end %> - <%= show_table(@user, :as => :user, :header => 'Linked Identities') do |t| %> + <%= show_table(@user, :as => :user, :header => t('.headings.linked_identities')) do |t| %> <% @oidc_configs.each do |oidc| %> <% @@ -171,23 +166,23 @@ prov_id, prov_name, prov_user = oidc.linked_oidc_info(@user) %> - <% t.cell "#{oidc.name} Provider", :show_width => 2 do %> + <% t.cell t('.cells.provider', name: oidc.name), :show_width => 2 do %> <% if oidc_login_uri %> <% if prov_id %> - Provider name: <%= prov_name %>
- Provider user: <%= prov_user %>
+ <%= t('.headings.provider_name') %> <%= prov_name %>
+ <%= t('.headings.provider_user') %> <%= prov_user %>
<% if @user.id == current_user.id %> - <%= link_to("Unlink this #{oidc.name} identity", unlink_oidc_path(:oidc_name => oidc.name), + <%= link_to(t('.links.unlink_identity', name: oidc.name), unlink_oidc_path(:oidc_name => oidc.name), :class => "button", :method => :post, - :data => { :confirm => "Are you sure you want to unlink your account with this #{oidc.name} identity?" } + :data => { :confirm => t('.confirms.unlink', name: oidc.name) } ) %> <% end %> <% else %> - (No <%= oidc.name %> identity linked to your account)
+ <%= t('.no_identity', name: oidc.name) %>
<% if @user.id == current_user.id # OIDC button works only on user own account %> - <%= link_to "Link a #{oidc.name} identity", oidc_login_uri, :class => 'button globus_button' %> + <%= link_to t('.links.link_identity', name: oidc.name), oidc_login_uri, :class => 'button globus_button' %> <% end %> <% end %> <% end %> @@ -197,30 +192,30 @@ <% # Note: should be in a if/end block testing for the configuration of orcid_uri, like in NeuroHub %> - <% t.cell "ORCID Identity", :show_width => 2 do %> + <% t.cell t('.cells.orcid_identity'), :show_width => 2 do %> <% orcid_id = @user.meta["orcid"] %> <% if orcid_id %> - ORCID ID: <%= orcid_id %> + <%= t('.orcid_id') %> <%= orcid_id %> <% else %> - (No ORCID identity linked to your account) + <%= t('.no_orcid') %> <% end %> -
Note: Use the <%= link_to "NeuroHub interface", myaccount_path %> to manage the ORCID identity link +
<%= t('.orcid_note_html', link: link_to(t('.links.neurohub_interface'), myaccount_path)) %> <% end %> <% end %> - <%= show_table(@user, :as => :user, :header => 'Sessions And Tokens', :edit_condition => false) do |t| %> - <% t.cell "Active Sessions", :show_width => 2 do %> + <%= show_table(@user, :as => :user, :header => t('.headings.sessions_tokens'), :edit_condition => false) do |t| %> + <% t.cell t('.cells.active_sessions'), :show_width => 2 do %> - + <% @active_sessions.to_a.each do |sess| %> - + <% end %> @@ -228,66 +223,60 @@ <% if @user.id == current_user.id %>

- <%= link_to('Generate new API token', new_token_users_path, :class => "button", :method => :post ) %> + <%= link_to(t('.links.generate_api_token'), new_token_users_path, :class => "button", :method => :post ) %> <% end %> <% end %> <% end %> - <%= show_table(@user, :as => :user, :header => 'Zenodo Publishing', :edit_condition => edit_permission?(@user)) do |t| %> + <%= show_table(@user, :as => :user, :header => t('.headings.zenodo_publishing'), :edit_condition => edit_permission?(@user)) do |t| %> <% t.edit_cell(:zenodo_sandbox_token, - :header => 'Zenodo Sandbox Token', + :header => t('.headings.zenodo_sandbox_token'), :content => (@user.zenodo_sandbox_token.blank? ? "" : ("*" * 60)), :show_width => 2 ) do |f| %> <%= f.password_field :zenodo_sandbox_token, :size => 62 %>
-

- This token can be used for creating temporary/test Zenodo data deposits.

- You can create a token at https://sandbox.zenodo.org/account/settings/applications/. -

+ <%= t('.paragraphs.zenodo_sandbox_token_html') %> <% end %> <% t.edit_cell(:zenodo_main_token, - :header => 'Zenodo Official Token', + :header => t('.headings.zenodo_official_token'), :content => (@user.zenodo_main_token.blank? ? "" : ("*" * 60)), :show_width => 2 ) do |f| %> <%= f.password_field :zenodo_main_token, :size => 62 %> -
- This token can be used for creating real, official and permanent Zenodo data deposits.

- You can create a token at https://zenodo.org/account/settings/applications/. -

+ <%= t('.paragraphs.zenodo_main_token_html') %> <% end %> <% end %> <% if @user.signed_license_agreements.present? %> - <%= show_table(@user, :as => :user, :header => "License Agreements", :width => 3) do |t| %> + <%= show_table(@user, :as => :user, :header => t('.headings.license_agreements'), :width => 3) do |t| %> <% @user.signed_license_agreements.each do |la| %> <% t.cell("", :no_header => true) { link_to la, "/show_license/#{la}" } %> <% end %> <% end %> <% end %> - <%= show_table(@user, :as => :user, :header => 'Resources') do |t| %> + <%= show_table(@user, :as => :user, :header => t('.headings.resources')) do |t| %> - <% t.cell("Files") do + <% t.cell(t('.cells.files')) do size = Userfile.where(:user_id => @user.id).sum(:size) index_count_filter(@user.userfiles.count, :userfiles, { :user_id => @user.id }, :show_zeros => true ) + - ( (size > 0) ? " (#{colored_pretty_size(size)} used)" : "" ).html_safe + ( (size > 0) ? " (#{t('users.common.used', size: colored_pretty_size(size))})" : "" ).html_safe end %> - <% t.cell("Tasks") do + <% t.cell(t('.cells.tasks')) do size = CbrainTask.real_tasks.where(:user_id => @user.id).sum(:cluster_workdir_size) unk = CbrainTask.real_tasks.where(:user_id => @user.id, :cluster_workdir_size => nil).where("cluster_workdir IS NOT NULL").count index_count_filter(@user.cbrain_tasks.real_tasks.count, :tasks, {:user_id => @user.id}, :show_zeros => true ) + - ( (size > 0 && unk > 0) ? " (#{colored_pretty_size(size)} used, #{unk} unkn)" : - (size > 0 && unk == 0) ? " (#{colored_pretty_size(size)} used)" : - (size == 0 && unk > 0) ? " (#{unk} unkn)" : "" + ( (size > 0 && unk > 0) ? " (#{t('users.common.used', size: colored_pretty_size(size))}, #{t('users.common.unkn', count: unk)})" : + (size > 0 && unk == 0) ? " (#{t('users.common.used', size: colored_pretty_size(size))})" : + (size == 0 && unk > 0) ? " (#{t('users.common.unkn', count: unk)})" : "" ).html_safe end %> - <% t.cell("Historical Storage") do + <% t.cell(t('.cells.historical_storage')) do plus = SpaceResourceUsageForUserfile.where(:user_id => @user.id).where("value > 0").sum(:value) minus = - SpaceResourceUsageForUserfile.where(:user_id => @user.id).where("value < 0").sum(:value) pretty_plus = plus > 0 ? colored_pretty_size(plus) : nil @@ -295,22 +284,22 @@ pretty_plus &&= "+#{pretty_plus}".html_safe pretty_minus &&= "#{pretty_minus}".html_safe pretty = (pretty_plus.to_s + " " + pretty_minus.to_s).html_safe - pretty = "(none)" if pretty.blank? + pretty = t('none_parentheses') if pretty.blank? index_count_filter(pretty, :resource_usage, { :type => 'SpaceResourceUsageForUserfile'}, :show_zeros => true) end %> - <% t.cell("Historical CPU Time") do + <% t.cell(t('.cells.historical_cpu_time')) do pretty_val = pretty_elapsed(CputimeResourceUsageForCbrainTask.where(:user_id => @user.id).sum(:value), :num_components => 3) index_count_filter(pretty_val, :resource_usage, { :type => 'CputimeResourceUsageForCbrainTask'}, :show_zeros => true) end %> <% if current_user.has_role?(:admin_user) %> - <% t.cell("Tools") { index_count_filter @user.tools.count, :tools, {:user_id => @user.id} } %> - <% t.cell("Data Providers") { index_count_filter @user.data_providers.count, :data_providers, {:user_id => @user.id} } %> - <% t.cell("Portal") { index_count_filter BrainPortal.where(:user_id => @user.id).count, :bourreaux, {:user_id => @user.id, :type => "BrainPortal"} } %> - <% t.cell("Execution") { index_count_filter Bourreau.where(:user_id => @user.id).count, :bourreaux, {:user_id => @user.id, :type => "Bourreau"} } %> + <% t.cell(t('.cells.tools')) { index_count_filter @user.tools.count, :tools, {:user_id => @user.id} } %> + <% t.cell(t('.cells.data_providers')) { index_count_filter @user.data_providers.count, :data_providers, {:user_id => @user.id} } %> + <% t.cell(t('.cells.portal')) { index_count_filter BrainPortal.where(:user_id => @user.id).count, :bourreaux, {:user_id => @user.id, :type => "BrainPortal"} } %> + <% t.cell(t('.cells.execution')) { index_count_filter Bourreau.where(:user_id => @user.id).count, :bourreaux, {:user_id => @user.id, :type => "Bourreau"} } %> <% end %> <% end %> @@ -321,10 +310,10 @@ .order('access_profiles.name') .map { |ap| access_profile_label(ap, :with_link => true) } .join("").html_safe - user_access_profiles = "(None)" if user_access_profiles.blank? + user_access_profiles = t('none_parentheses') if user_access_profiles.blank? %> - <%= show_table(@user, :as => :user, :header => 'Access Profiles', :edit_condition => true) do |t| %> + <%= show_table(@user, :as => :user, :header => t('.headings.access_profiles'), :edit_condition => true) do |t| %> <% t.edit_cell(:access_profile_ids, :show_width => 2, :no_header => true, :content => user_access_profiles ) do %> <%= render :partial => 'shared/access_profile_checkbox_table', @@ -347,12 +336,12 @@
IPLast access<%= t('.headings.ip') %><%= t('.headings.last_access') %>
<%= sess.data[:guessed_remote_ip].presence || '(None yet)' %><%= sess.data[:guessed_remote_ip].presence || t('.datas.no_ip_yet') %> - <%= to_localtime(sess.updated_at, :datetime) %> (<%= pretty_elapsed(Time.now - sess.updated_at, :num_components => 3) %> ago) + <%= to_localtime(sess.updated_at, :datetime) %> (<%= t('ago_time', time: pretty_elapsed(Time.now - sess.updated_at, :num_components => 3)) %>)
- - - + + + <% (@user.assignable_groups.sort { |g1,g2| g1.name.casecmp(g2.name) }).each do |group| %> @@ -383,6 +372,5 @@ <% end %>

- <%= render :partial => "layouts/log_report", :locals => { :log => @log, :title => 'User activity report' } %> + <%= render :partial => "layouts/log_report", :locals => { :log => @log, :title => t('.titles.user_activity_report') } %> - diff --git a/BrainPortal/config/application.rb b/BrainPortal/config/application.rb index bbdcf3944..c9e0d3956 100644 --- a/BrainPortal/config/application.rb +++ b/BrainPortal/config/application.rb @@ -34,5 +34,8 @@ class Application < Rails::Application config.action_controller.include_all_helpers = true + config.i18n.available_locales = [:en, :fr] + config.i18n.default_locale = :en + config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] end end diff --git a/BrainPortal/config/locales/en/defaults/common.yml b/BrainPortal/config/locales/en/defaults/common.yml new file mode 100644 index 000000000..c439e15fe --- /dev/null +++ b/BrainPortal/config/locales/en/defaults/common.yml @@ -0,0 +1,133 @@ +en: + + labels: + user_colon: + one: "User:" + other: "Users:" + group_colon: + one: "Group:" + other: "Groups:" + project_colon: + one: "Project:" + other: "Projects:" + tool_colon: + one: "Tool:" + other: "Tools:" + data_provider_colon: + one: "Data Provider:" + other: "Data Providers:" + execution_server_colon: + one: "Execution Server:" + other: "Execution Servers:" + type_colon: + one: "Type:" + other: "Types:" + status_colon: + one: "Status:" + other: "Statuses:" + description_colon: + one: "Description:" + other: "Descriptions:" + tags_colon: + one: "Tag:" + other: "Tags:" + + created_colon: "Created:" + updated_colon: "Updated:" + owner_colon: "Owner:" + published_colon: "Published:" + year_month_colon: "Year/Month:" + dates_colon: "Dates:" + search_colon: "Search:" + upload_colon: "Upload:" + conflict_colon: "Conflict:" + + date: "Date" + ago_time: "%{time} ago" + + unknown: "Unknown" + unknown_parentheses: "(Unknown)" + unset_parentheses: "(Unset)" + yes_word: "Yes" + offline: "Offline" + online: "Online" + none: "None" + none_parentheses: "(None)" + update_parentheses: "(Update)" + show: "Show" + show_parentheses: "(Show)" + edit: "Edit" + help: "Help" + help_parentheses: "(Help)" + browse: "Browse" + cancel: "Cancel" + switch: "Switch" + clear: "Clear" + refresh: "Refresh" + select_placeholder: "..." + + no_information: "There is no information to show at this time." + + from: "From" + to: "To" + + delete: "Delete" + deleted: "Deleted" + + save: "Save" + saved: "Saved" + + create: "Create" + created: "Created" + + update: "Update" + updated: "Updated" + last_updated: "Last Updated" + + active_users: "Active Users" + locked_users: "Locked Users" + + submit: "Submit" + + status: "Status" + + search_by_name: "Search by name:" + confirm_delete: "Are you sure you want to delete %{name}?" + + dataset: + one: "Dataset" + other: "Datasets" + + agree: "I agree" + + clear_options: + month: "One month ago" + week: "One week ago" + day: "One day ago" + hour: "One hour ago" + now: "Now! (Including yours!)" + + login: "Login" + + owner: "Owner" + owner_downcase: "owner" + + version: + one: "Version" + other: "Versions" + + tool_version: + one: "Tool Version" + other: "Tool Versions" + + parameters: + one: "Parameter" + other: "Parameters" + summary: "Summary" + + + time_zone: "Time Zone" + all: "All" + + show_hide_parentheses: "(show/hide)" + hidden: "hidden" diff --git a/BrainPortal/config/locales/en/models/access_profile.yml b/BrainPortal/config/locales/en/models/access_profile.yml new file mode 100644 index 000000000..f3a28dbea --- /dev/null +++ b/BrainPortal/config/locales/en/models/access_profile.yml @@ -0,0 +1,8 @@ +en: + activerecord: + models: + access_profile: + one: "Access Profile" + other: "Access Profiles" + + diff --git a/BrainPortal/config/locales/en/models/background_activity.yml b/BrainPortal/config/locales/en/models/background_activity.yml new file mode 100644 index 000000000..530e2465b --- /dev/null +++ b/BrainPortal/config/locales/en/models/background_activity.yml @@ -0,0 +1,6 @@ +en: + activerecord: + models: + background_activity: + one: "Background Activity" + other: "Background Activities" diff --git a/BrainPortal/config/locales/en/models/cbrain_task.yml b/BrainPortal/config/locales/en/models/cbrain_task.yml new file mode 100644 index 000000000..fb2b7ae53 --- /dev/null +++ b/BrainPortal/config/locales/en/models/cbrain_task.yml @@ -0,0 +1,8 @@ +en: + activerecord: + models: + cbrain_task: + one: "Task" + other: "Tasks" + + diff --git a/BrainPortal/config/locales/en/models/common.yml b/BrainPortal/config/locales/en/models/common.yml new file mode 100644 index 000000000..48a28f134 --- /dev/null +++ b/BrainPortal/config/locales/en/models/common.yml @@ -0,0 +1,13 @@ +en: + activerecord: + attributes: + category: "Category" + city: "City" + country: "Country" + yearmonth: "Year/Month" + name: "Name" + description: "Description" + status: "Status" + type: "Type" + size: "Size" + color: "Color" diff --git a/BrainPortal/config/locales/en/models/data_provider.yml b/BrainPortal/config/locales/en/models/data_provider.yml new file mode 100644 index 000000000..721198f01 --- /dev/null +++ b/BrainPortal/config/locales/en/models/data_provider.yml @@ -0,0 +1,21 @@ +en: + activerecord: + models: + data_provider: + one: "Data Provider" + other: "Data Providers" + attributes: + data_provider: + name: "Name" + description: "Description" + type: "Type" + remote_host: "Remote Hostname" + alternate_host: "Alternate Hostname(s)" + remote_user: "Remote Username" + remote_port: "Remote Port Number" + remote_dir: "Full Directory Path" + containerized_path: "Containerized Data Path" + cloud_storage_client_identifier: "Client Identifier" + cloud_storage_client_token: "Client Token" + datalad_repository_url: "Datalad URL" + datalad_relative_path: "Datalad Relative Path" diff --git a/BrainPortal/config/locales/en/models/exception.yml b/BrainPortal/config/locales/en/models/exception.yml new file mode 100644 index 000000000..9aba82e87 --- /dev/null +++ b/BrainPortal/config/locales/en/models/exception.yml @@ -0,0 +1,6 @@ +en: + activerecord: + models: + exception: + one: "Exception" + other: "Exceptions" diff --git a/BrainPortal/config/locales/en/models/group.yml b/BrainPortal/config/locales/en/models/group.yml new file mode 100644 index 000000000..c1d9e98e8 --- /dev/null +++ b/BrainPortal/config/locales/en/models/group.yml @@ -0,0 +1,6 @@ +en: + activerecord: + models: + group: + one: "Project" + other: "Projects" diff --git a/BrainPortal/config/locales/en/models/message.yml b/BrainPortal/config/locales/en/models/message.yml new file mode 100644 index 000000000..5950d7602 --- /dev/null +++ b/BrainPortal/config/locales/en/models/message.yml @@ -0,0 +1,7 @@ +en: + activerecord: + models: + message: + one: "Message" + other: "Messages" + diff --git a/BrainPortal/config/locales/en/models/quota.yml b/BrainPortal/config/locales/en/models/quota.yml new file mode 100644 index 000000000..be7471edb --- /dev/null +++ b/BrainPortal/config/locales/en/models/quota.yml @@ -0,0 +1,6 @@ +en: + activerecord: + models: + quota: + one: "Quota" + other: "Quotas" diff --git a/BrainPortal/config/locales/en/models/remote_resource.yml b/BrainPortal/config/locales/en/models/remote_resource.yml new file mode 100644 index 000000000..6fcf34233 --- /dev/null +++ b/BrainPortal/config/locales/en/models/remote_resource.yml @@ -0,0 +1,17 @@ +en: + activerecord: + models: + remote_resource: + one: "Server" + other: "Servers" + portal: "Portal" + execution: "Execution" + execution_server: + one: "Execution Server" + other: "Execution Servers" + resource: + one: "Resource" + other: "Resources" + + + diff --git a/BrainPortal/config/locales/en/models/site.yml b/BrainPortal/config/locales/en/models/site.yml new file mode 100644 index 000000000..ed9887a1c --- /dev/null +++ b/BrainPortal/config/locales/en/models/site.yml @@ -0,0 +1,7 @@ +en: + activerecord: + models: + site: + one: "Site" + other: "Sites" + diff --git a/BrainPortal/config/locales/en/models/tag.yml b/BrainPortal/config/locales/en/models/tag.yml new file mode 100644 index 000000000..ef0698d84 --- /dev/null +++ b/BrainPortal/config/locales/en/models/tag.yml @@ -0,0 +1,9 @@ +en: + activerecord: + models: + tag: + one: "Tag" + other: "Tags" + tag_downcase: + one: "tag" + other: "tags" diff --git a/BrainPortal/config/locales/en/models/tool.yml b/BrainPortal/config/locales/en/models/tool.yml new file mode 100644 index 000000000..fd80480c8 --- /dev/null +++ b/BrainPortal/config/locales/en/models/tool.yml @@ -0,0 +1,6 @@ +en: + activerecord: + models: + tool: + one: "Tool" + other: "Tools" diff --git a/BrainPortal/config/locales/en/models/user.yml b/BrainPortal/config/locales/en/models/user.yml new file mode 100644 index 000000000..2d315a86d --- /dev/null +++ b/BrainPortal/config/locales/en/models/user.yml @@ -0,0 +1,22 @@ +en: + activerecord: + models: + user: + one: "User" + other: "Users" + attributes: + user: + login: "Login" + full_name: "Full Name" + email: "Email" + position: "Position" + department: "Department" + affiliation: "Affiliation" + institution: "Institution" + city: "City" + country: "Country" + type: "Type" + site: "Site" + default_data_provider: "Default Data Provider" + forced_openid_providers: "Forced OpenID Identity Providers" + diff --git a/BrainPortal/config/locales/en/models/userfile.yml b/BrainPortal/config/locales/en/models/userfile.yml new file mode 100644 index 000000000..cbfd06b4a --- /dev/null +++ b/BrainPortal/config/locales/en/models/userfile.yml @@ -0,0 +1,11 @@ +en: + activerecord: + models: + userfile: + one: "File" + other: "Files" + file: + one: "File" + other: "Files" + + diff --git a/BrainPortal/config/locales/en/views/access_profiles/access_profiles.yml b/BrainPortal/config/locales/en/views/access_profiles/access_profiles.yml new file mode 100644 index 000000000..71fe61524 --- /dev/null +++ b/BrainPortal/config/locales/en/views/access_profiles/access_profiles.yml @@ -0,0 +1,42 @@ +en: + access_profiles: + + access_profiles_table: + links: + create_profile: "Create Access Profile" + columns: + name: "Name" + color: "Color" + description: "Description" + projects: "Projects" + + white: "white" + + index: + title: "Access Profiles" + + show: + titles: + add_new_access_profile: "Add New Access Profile" + access_profile: "Access Profile" + access_profile_log: "Access Profile Log" + + error_messages: + saved: "Access profile could not be %{action}." + cells: + name: "Name" + color: "Color" + + headings: + with_this_profile: "Users With This Profile" + project_membership: "Project Membership" + projects_in_this_profile: "Projects In This Profile" + + explanations: + css_html: "Use a CSS-compliant pale color:
e.g. #ff0 or yellow etc." + private: "These are your private notes about this profile." + change: "When adding or removing projects, apply the change to the users:" + + user_types: + normal: "Normal Users" + locked: "Locked Users" diff --git a/BrainPortal/config/locales/en/views/background_activities/background_activities.yml b/BrainPortal/config/locales/en/views/background_activities/background_activities.yml new file mode 100644 index 000000000..86c4cea65 --- /dev/null +++ b/BrainPortal/config/locales/en/views/background_activities/background_activities.yml @@ -0,0 +1,220 @@ +en: + + background_activities: + + common: + dynamic_items_list: "(Dynamic items list)" + + background_activity_table: + toggles: + about: "About" + + submits: + cancel_activities: "Cancel Activities" + suspend_activities: "Suspend Activities" + unsuspend_activities: "Unsuspend Activities" + destroy_activities: "Destroy Activities" + activate_now: "Activate Now!" + retry_failed: "Retry Failed" + + confirms: + cancel: "Are you sure you want to cancel the selected background activities?" + suspend: "Are you sure you want to suspend the selected background activities?" + unsuspend: "Are you sure you want to reactivate the selected background activities?" + destroy: "Are you sure you want to destroy the selected background activities?" + activate: "Are you sure you want to activate the selected background activities?" + retry: "Are you sure you want to retry the failed items of the selected background activities?" + + links: + create_scheduled: "Create New Scheduled Activity" + hide_scheduled: "Hide Scheduled" + refresh_list: "Refresh This List" + show: "Show" + + legends: + about: "About Background Activities" + + paragraphs: + about_general_top_html: | +

+ This page shows "background activities" as progress bars. Each + activity applies a single operation to a set of things (usually, + files or tasks). These activities are often the result of clicking + on buttons in other pages, when you get a message that something + was started in background. Activities that are in progress + are shown with glowing borders. Individual operations within an + activity can succeed or fail. Sometimes, the failure is not + significant (e.g. trying to compress a file that is already + compressed). +

+ You can cancel activities, but remember that cancelled activities + can never be restarted. You will have to redo whatever operation + created the activity. +

+ Older, finished "background activities" are generally cleaned + up after one week and will disappear from this list. + about_admin_html: | +

+ As an admin, you can create maintenance activities that can be + scheduled for later. See the accompanying form for more help. You + can also suspend activities; these are resumable. You can suspend + activities that are in progress, or scheduled in the future. + about_general_bottom_html: | +

+ The progress bars in this page are not live, so + you need to click the Refresh button to get an update + on the progress of your activities. + + columns: + user: "User" + server: "Server" + status: "Status" + activity_type: "Activity Type" + scheduled_at: "Scheduled At" + repeat: "Repeat" + retries: "Retries" + last_update: "Last Updated" + progress: "Progress" + show: "Show" + + labels: + type_filter: "%{label} (of %{base})" + + scheduled_at: + in_time: "(in %{time})" + overdue_by: "(overdue by %{time})" + retries: + allowed: + one: "%{count} retry allowed" + other: "%{count} retries allowed" + next: + one: "(next with %{count} second delay)" + other: "(next with %{count} seconds delay)" + + on_word: "on" + + items_count: + one: "(%{count} item)" + other: "(%{count} items)" + + tooltips: + messages: "(Messages)" + + RubyRunner: + legends: + ruby_code: "Ruby Code" + + index: + title: "Background Activities" + + new: + title: "Schedule Maintenance Activity" + headings: + main: "Schedule Maintenance Activity" + errors: + activity: "activity" + + labels: + repeat: "Repeat Frequency" + remove_task_workdirs: "Remove Task Workdirs" + file_custom_filter: "File Custom Filter:" + task_custom_filter: "Task Custom Filter:" + clean_cache: "Clean DataProvider Caches" + last_accessed: "Files last accessed at least:" + belonging_users: "Belonging to users:" + not_users: "But not to users:" + of_type: "Of type:" + not_type: "But not type:" + erase_bacs: "Erase Background Activities" + finished_older: "Finished activities older than:" + verify_dp: "Verify DataProvider Connectivity" + fake_activity: "Fake Activity Tests" + min_seconds: "Minimum seconds:" + max_seconds: "Maximum seconds:" + num_oks: "Number of OKs:" + num_fails: "Number of FAILs:" + num_excs: "Number of EXCs:" + ruby_runner: "Arbitrary Ruby Code Runner" + prepare: "prepare_dynamic_items() : Mandatory. Must set the list of items with self.items=[] ." + before: "before_first_item() : Optional." + process_html: "process() : Mandatory. Must return [ true, nil ] when something is processed properly, and [ false, message ] otherwise." + after: "after_last_item() : Optional." + server: "Portal or Execution Server" + start_date: "Initial Start Date" + start_now_html: "( Or %{checkbox} right away )" + move: "Move" + copy: "Copy" + archive_task_workdirs: "Archive Task Workdirs" + compress: "Compress" + uncompress: "Uncompress" + + + selects: + data_provider: "(Select a Data Provider)" + filter: "(Select one of your filters)" + dps: "(Select Data Providers)" + + paragraphs: + remember_file_filter_html: | + This activity type is only for experienced CBRAIN system developers + who understands the BackgroundActivity framework. + move_crush: "Crush files at destination if they exist:" + filter_intro: "These two selection boxes allow you to specify one of your custom filters, either for files or for tasks." + for_files_html: "For activities that involve files:" + for_tasks_html: "For activities that involve tasks:" + move_to: "To:" + remember_task_filter_html: "Remember to select a task custom filter in the Dynamic Items section below." + archive_blank_note: "(Leave blank to archive directly in the work directories)" + ruby_runner_intro_html: "This activity type is only for experienced CBRAIN system developers who understands the BackgroundActivity framework." + process_explanation: | + Consider adding a short description of what your RubyRunner code does + on the very first line of comment; this will be shown as a description + of the BackgroundActivity within the index page. + + repeat_options: + prompt: "(How often and when to repeat)" + one_shot: "One Shot" + every_30min: "Every 30 minutes" + every_hour: "Every hour" + every_12h: "Every 12 hours" + every_24h: "Every 24 hours" + tomorrow: "Tomorrow and everyday at..." + monday: "Mondays at..." + tuesday: "Tuesdays at..." + wednesday: "Wednesdays at..." + thursday: "Thursdays at..." + friday: "Fridays at..." + saturday: "Saturdays at..." + sunday: "Sundays at..." + + legends: + filter: "Dynamic Items Selection: Files or Tasks" + or_word: "or" + files: "Files" + + repeat_at_html: "(For at...:" + + days_ago: "days ago" + system_dps: "System Data Providers:" + user_dps: "User Data Providers:" + submit: "Schedule new activity" + + show: + headings: + main: "Background Activity" + cells: + type: "Type" + status: "Status" + user: "User" + execution_server: "Execution Server" + total_items: "Total Number Of Items" + num_successes: "Number Of Successes" + num_processed: "Number Of Items Processed" + num_failures: "Number Of Failures" + legends: + items: "Items" + all_of_them: "%{count} (All of them)" + none_question: "(None ?)" + none: "0 (None)" + none_yet: "0 (None yet!)" + diff --git a/BrainPortal/config/locales/en/views/bourreaux/bourreaux.yml b/BrainPortal/config/locales/en/views/bourreaux/bourreaux.yml new file mode 100644 index 000000000..deb190507 --- /dev/null +++ b/BrainPortal/config/locales/en/views/bourreaux/bourreaux.yml @@ -0,0 +1,607 @@ +en: + + bourreaux: + + common: + cache_trust_expire_select: + never: "Never" + six_hours: "Six hours" + twelve_hours: "Twelve hours" + one_day: "One day" + three_days: "Three days" + one_week: "One week" + two_weeks: "Two weeks" + one_month: "One month" + two_months: "Two months" + three_months: "Three months" + six_months: "Six months" + workers_instances_select: + none: "None (for debug)" + workers_chk_time_select: + five_seconds: "5 seconds" + ten_seconds: "10 seconds" + thirty_seconds: "30 seconds" + one_minute: "1 minute (recommended)" + two_minutes: "2 minutes" + five_minutes: "5 minutes" + fifteen_minutes: "15 minutes" + one_hour: "1 hour" + workers_log_to_select: + combined_file: "Combined file (recommended)" + separate_files: "Separate files" + rails_log: "RAILS log" + rails_stdout: "RAILS stdout" + rails_stderr: "RAILS stderr" + rails_stdout_and_stderr: "RAILS stdout and stderr" + no_logging: "No logging" + workers_verbose_select: + normal: "Normal" + debug_info: "Debug info" + + bourreaux_display: + columns: + server_type: "Server Type" + server_name: "Server Name" + live_revision: "Live Revision" + owner: "Owner" + project: "Project" + time_zone: "Time Zone" + online: "Online?" + tasks: "Tasks" + tasks_space: "Tasks Space" + cache_space: + all: "Cache Space all" + own: "Cache Space own" + description: "Description" + status_page_url: "Status page URL" + tools: "Tools" + control_tunnel: "Control Tunnel" + uptime: "Uptime" + task_workers: "Task Workers" + activity_workers: "Activity Workers" + + unk: + env: "Unk Env" + par: " (%{unk} unkn)" + + status: + open: "Open" + dead: "DEAD!" + down: "Down!" + since_for: "Since %{date} (for %{duration})" + + task_workers: + workers: "Workers: %{nworkers} / %{exp_workers} " + workers_processing: "(%{proc_workers} processing) " + + activity_workers: + workers: "Workers: %{nworkers} / %{exp_workers} " + workers_processing: "(%{proc_workers} processing) " + + links: + create_new_server: "Create New Server" + user_access_report: "User Access Report" + disk_cache_report: "Disk Cache Report" + task_workdir_size_report: "Task Workdir Size Report" + access_to_data_providers: "Access to Data Providers" + + buttons: + start: + tunnels: "1. Start Tunnels" + execution_server: "2. Start Execution Server" + task_workers: "3a. Start Task Workers" + activity_workers: "3b. Start Activity Workers" + stop: + activity_workers: "1a. Stop Activity Workers" + task_workers: "1b. Stop Task Workers" + execution_server: "2. Stop Execution Server" + tunnels: "3. Stop Tunnels" + + dropdowns: + start_services: "Start Services" + stop_services: "Stop Services" + + confirms: + stop: + activity_workers: "Are you sure you want to stop the Activity Workers? They will finish what they are doing first." + task_workers: "Are you sure you want to stop the Task Workers? They will finish what they are doing first." + bourreau: "Are you sure? Note that workers will also shut down once they are done, if they are still active." + tunnels: "Make sure Execution Servers, Task Workers and Activity workers are all stopped!" + + + # Start services panel + start_services: + paragraphs: + introduction_html: | +

+ These buttons start the different layers of services required to + boot an Execution Server. They are listed in the same order as they + need to be started. The first three buttons + only apply to Execution Servers, while Start Activity Workers + applies to both Execution Servers and Portals. +

+

+ Refer the the last four columns of the table to find out what service + are currently operational. The four buttons in this pannel map + to them in the same order. +

+

+ Also note that your browser blocks while these requests are being processed; + be patient and check your browser's progress bar. Do not perform long operations + on multiple Execution Servers to avoid timeouts. +

+ tunnel_html: | +

+ The tunnel is the main communication channel between the Portal + and the remote server where the Execution Server is configured. It is + necessary for the Execution Server and the Task Workers. Starting the + tunnel will mark the Execution Server as "online" in the database. + Note that you can also start the tunnel with the "Start Execution Server" + button. Consider starting just the tunnel as a way to verify that the network + parameters are valid (e.g. to check hostnames, ports, firewalls, etc). +

+ execution_server_html: | +

+ The Execution Server requires the tunnel, above. Note that as convenience + feature, if the tunnel is not started, starting the Execution Server will also + start the tunnel first. +

+ start_task_workers_description_html: | +

+ Task workers require a Tunnel and the Execution Server to be up. +

+ start_activity_workers_description_html: | +

+ Activity workers are the only service that can be started or stopped + on Portals too. On portals the workers don't require any of the other layers + above. On Execution Servers these workers require both the Tunnel and the + Execution Server to be running. +

+ + stop_services: + processing_in_orange_text: "processing in orange text" + processing: "processing" + not_safe: "not safe" + paragraphs: + stop_services_description_html: | +

+ These buttons stop the different layers of services associated with + an Execution Server. They are listed in the same order as they + need to be stopped. The last three buttons + only apply to Execution Servers, while Stop Activity Workers + applies to both Execution Servers and Portals. +

+

+ Refer the the last four columns of the table to find out what service + are currently operational. The four buttons in this pannel map + to them in reverse order (right to left). +

+

+ Note that stopping the Workers (any type) is an action that asks + them to shut down gracefully. If they are processing something, they will finish it + first. The last two columns of the table indicate if they are currently busy + with the word %{html_colorize_text}. + In some cases it can take a long time for the workers to stop. Refreshing this + page will tell you when they are stopped, but remember that the page's content + is normally only updated once every 30 seconds. +

+

+ Also note that your browser blocks while these requests are being processed; + be patient and check your browser's progress bar. Do not perform long operations + on multiple Execution Servers to avoid timeouts. +

+ stop_activity_workers_description_html: | +

+ Activity Workers can run on both Portals and Execution Servers. Stopping them + will send them a signal to finish their current processing actions and then exit. +

+ stop_task_workers_description_html: | +

+ Stopping Task Workers will send them a signal to finish what they are doing + and then exit. This can take some time. +

+ stop_execution_server_description_html: | +

+ Stopping an Execution Server will also stop the Task Workers and Activity Workers running on it. + Make sure they are not actively %{processing} something. +

+ stop_tunnels_description_html: +

+ Remember that is it %{not_safe} to stop Tunnels if + any of the Workers are currently %{processing} something. +

+ + load_info: + delay: + instant: "instant" + superb: "superb" + good: "good" + mediocre: "mediocre" + bad: "bad" + awful: "awful" + number_of: + active_tasks: "Number of active tasks (all users): %{num_active}" + queued_tasks: "Number of queued tasks (all users): %{num_queued}" + running_tasks: "Number of running tasks (all users): %{num_processing}" + last_wait_time: "Last wait time: %{time} (%{rating})" + queue_info: "(This happened %{time} ago)" + more_info: "more info" + + notes: + show_configuration_notes: "Show configuration notes" + hide_configuration_notes: "Hide configuration notes" + notesbody_html: | + + + runtime_info: + headings: + runtime_information: "Runtime Information" + cells: + rails_environment: "Rails Environment" + rails_revision: "Rails Revision" + disk_code_revision: "Disk Code Revision" + rails_server_uptime: "Rails Server Uptime" + process: + start: + revision: "Process Start Revision" + last_change_author: "Process Start Last Change Author" + last_change_revision: "Process Start Last Change Revision" + last_change_date: "Process Start Last Change Date" + remote_host: + name: "Remote Host Name" + ip_address: "Remote Host IP Address" + os_type: "Remote Host OS Type" + uptime: "Remote Host Uptime" + worker_pids: "Worker PIDs" + number_of_tasks_running: "Number of Tasks Running" + workers_last_change_author: "Workers Last Change Author" + cluster_management_system_type: "Cluster Management System Type" + workers_last_change_revision: "Workers Last Change Revision" + cluster_management_system_revision: "Cluster Management System Revision" + workers_last_change_date: "Workers Last Change Date" + ssh_public_key: "SSH Public Key" + server_status: + down: "DOWN" + server_status: "This server is currently %{status}" + rails_server_uptime: + up_since: "Up since: %{time}" + for: "for: %{duration}" + + index: + title: "Execution Servers" + + new: + title: "Add New Server" + + headings: + main: "Add New Server" + + divs: + name_html: | +
+ Important note: this name must also be changed accordingly in the config file + Bourreau/config/initializers/config_bourreau.rb + for this server to restart properly later on. +
+ system_from_email_html: | +
+ If set, messages sent automatically by this system will contain this return address. +
+ description_html: | +
+ The first line should be a short summary, and the rest are for any special notes for the users. +
+ dp_cache_dir_html: | +
Warning! Changing this field will result in resetting the synchronization + status of all files from all Data Providers! Also, the Rails app will have to + be restarted, and all files in that directory will be erased!
+ spaced_dp_ignore_patterns_html: | +
+ Separate several patterns with spaces; each pattern can contain single '*'s, but no '/'s or special characters. +
+ cache_trust_expire_html: | +
+ This means that in the execution server's cache, files that have been recorded + as 'InSync' but were last accessed more than this amount of time will be considered untrustworthy + and will be re-synchronized the next time they are accessed. Set this to a value less than N + if the cluster's file policy, for instance, deletes all scratch files older than N days. +
+ cms_shared_dir_html: | +
+ Mandatory. This directory must be visible and writable from all nodes. + This is were the work subdirectories for all tasks will be created. +
+ cms_default_queue_html: | +
+ Optional. +
+ cms_extra_qsub_args_html: | +
+ Optional. Careful, this is inserted as-is in the command-line for submitting jobs. +
+ workers_verbose_html: | +
+ This option has no effect if the logs are sent to the RAILS log. +
+ + labels: + system_from_email: "System 'From' reply address" + owner: "Owner" + group: "Project" + status: "Status" + rr_timeout: "Timeout for is alive check (seconds)" + time_zone: "Time Zone" + ssh_control_host: "Hostname" + ssh_control_user: "Username" + ssh_control_port: "Port Number" + ssh_control_rails_dir: "Rails Server Directory" + jump_host: "JumpHost hostname" + jump_user: "JumpHost username" + jump_port: "JumpHost port" + spaced_dp_ignore_patterns: "Patterns for filenames to ignore" + dp_cache_dir: "Path to Data Provider caches" + cms_class: "Type of cluster" + cms_shared_dir: "Path to shared work directory" + cms_default_queue: "Default queue name" + cms_extra_qsub_args: "Extra cluster submission options" + cache_trust_expire: "Cache Expiration Timeout" + workers_instances: "Number of Workers" + workers_chk_time: "Check interval" + workers_log_to: "Log destination" + workers_verbose: "Log verbosity" + + status: + online: "Online" + offline: "Offline" + prompt: "Select status" + + titles: + time_zone: "Time zone where this server is located." + + legends: + ssh_remote_control_configuration: "SSH Remote Control Configuration" + optional_ssh_jump_host_configuration: "Optional SSH JumpHost Configuration" + cache_management_configuration: "Cache Management Configuration" + tool_version_configuration: "Tool Version Configuration" + cluster_management_system_configuration: "Cluster Management System Configuration" + task_workers_configuration: "Task Workers Configuration" + task_limits: "Task Limits" + + tool_version_configuration_explanation: "A tool configuration for this Execution Server can be made once the server is created." + task_limits_explanation: "Task limits can be set once the Execution Server is created." + + cms_class_select: + unconfigured: "(Unconfigured)" + scir_sge: "Sun GridEngine" + scir_pbs: "PBS" + scir_moab: "MOAB" + scir_sharcnet: "Sharcnet custom" + scir_lsf: "LSF" + scir_slurm: "SLURM" + scir_gcloud_batch: "Google Cloud" + scir_unix: "UNIX processes" + + + submit: "Create New Server" + + rr_access_dp: + title: "Servers Access to Data Providers" + headings: + main: "Servers Access to Data Providers" + + paragraphs: + rr_access_explanation_html: | +

+ This page shows which Servers (rows) can access which Data Providers (columns). +

+

+ If you want to launch tasks on a particular Execution Server, make sure they are + configured to access files on Data Providers marked by green circles ( %{o_icon} ). +

+

+ Data Provider identified below their name with %{not_syncable} + indicate their files can still be accessed through streaming APIs, but can never be fully + synchronized on any server. +

+

+ Cells marked with %{no_access} + indicate servers that are not allowed to access files on the Data Provider + at all, in any way (streaming or synchronized), even if the Data Provider seems alive. +

+ headings: + servers: "Servers" + data_providers: "Data Providers" + name: "Name" + type: "Type" + last_checked: "Last Checked" + links: + refresh_all: "Refresh all" + status: + offline: "(offline)" + not_syncable: "(not syncable)" + read_only: "(read only)" + no_access: "(no access)" + alive: "alive" + down: "down" + legends: + data_provider_status: "Data Provider Status:" + data_providers_offline: "Data Providers offline:" + note_html: | + Note: Clicking on Refresh triggers a background process on the server + that will poll each Data Provider; this can take several minutes to complete. + + rr_access: + title: "Execution Server Access" + headings: + main: "Execution Server Access Report" + legends: + accessible: "accessible" + not_accessible: "not accessible" + + rr_disk_usage: + title: "Disk Usage Caches" + titles: + server_log: "Server Log" + headings: + main: "Disk Usage Statistics for Server's Data Provider Caches" + no_entries: "(There are no entries in this report)" + filter: "Filter this report: files reported above..." + entry: + one: "1 entry" + other: "%{count} entries" + file: + one: "1 file" + other: "%{count} files" + entries_and_files_html: "%{entries} / %{files}" + unknown_count: + one: "%{count} unknown" + other: "%{count} unknowns" + active_task: + one: "Danger! %{count} active task!" + other: "Danger! %{count} active tasks!" + all_on: "All on %{name}: " + submits: + cleanup_selected: "Cleanup Selected Caches" + of_type: "... are of type:" + none_means_any_html: "(None selected means any)" + last_accessed: "... were last accessed:" + submit: "Refresh Report" + + show: + titles: + portal: "Portal Info" + execution_server: "Execution Server Info" + + links: + task_stats_by_status: "Task Statistics By Status" + task_stats_by_type: "Task Statistics By Type" + no_tool_config: "No tool config" + + headings: + cache_expiration: "Cache Expiration Timeout (in seconds)" + workers_instances: "Number of Workers" + workers_chk_time: "Check interval" + workers_log_to: "Log destination" + workers_verbose: "Log verbosity" + message_update_error: "Server could not be updated." + external_status_page_url: "External status page URL" + base_portal_url: "Base Portal URL" + user_manual_url: "User Manual URL" + neurohub_base_url: "NeuroHub Base Portal URL" + small_logo: "Small logo" + large_logo: "Large logo" + large_upload_url: "Help URL for large uploads" + upload_size_limit: "File upload size limit (MB)" + mail_configuration: "Mail configuration" + support_email: "Support email address" + system_from_email: "System 'From' reply address" + nh_support_email: "NeuroHub Support email address" + nh_system_from_email: "NeuroHub System 'From' reply address" + error_notifications: "Error notifications sent to members of project" + ssh_connection_config: "SSH Connection Configuration" + ssh_hostname: "SSH Hostname" + rails_server_directory: "Rails Server Directory" + ssh_user: "SSH User" + ssh_port: "SSH Port" + local_control_port: "Local Control Port" + ssh_jumphost: "Optional SSH JumpHost Configuration" + jumphost_hostname: "JumpHost Hostname" + jumphost_user: "JumpHost User" + jumphost_port: "JumpHost Port" + reverse_service_config: "Optional Reverse Service Connection Configuration" + use_reverse_service: "Use the SSH Reverse Service" + reverse_service_hostname: "Reverse Service Hostname" + reverse_service_port: "Reverse Service Port" + reverse_service_user: "Reverse Service User" + reverse_service_db_socket: "Reverse Service DB Socket Path" + reverse_service_ssh_agent: "Reverse Service SSH Agent Socket Path" + activity_workers_config: "Activity Workers Configuration" + activity_workers_number: "Number of workers" + cache_management: "Cache Management Configuration" + path_to_dp_caches: "Path to Data Provider caches" + ignore_patterns: "Patterns for filenames to ignore" + dp_options: "Data Providers Options" + persistent_ssh_masters: "Use persistent SSH masters for SSH-based DataProviders" + cluster_config: "Cluster Configuration" + type_of_cluster: "Type of cluster" + default_queue_name: "Default queue name" + extra_qsub_args: "Extra cluster submission options(sbatch, qsub)" + path_shared_work_dir: "Path to shared work directory" + task_workers_config: "Task Workers Configuration" + number_of_workers: "Number of workers" + container_config: "Container Configuration" + docker_executable_name: "Docker executable" + singularity_executable_name: "Singularity executable" + + cells: + status: "Status" + owner: "Owner" + unset: "(Unset)" + group: "Project" + revision_info_client: "Revision Info (Client Side)" + common_config_all_tasks: "Common configuration for all tasks" + + field_explanations: + description: "The first line should be a short summary, and the rest are for any special notes for the users." + system_from_email: "If set, messages sent automatically by this system will contain this return address." + cms_shared_dir_html: "Mandatory. This directory must be visible and writable from all nodes.
This is were the work subdirectories for all tasks will be created." + cms_default_queue: "Optional." + cms_extra_qsub_args: "Optional. Careful, this is inserted as-is in the command-line for submitting jobs." + dp_cache_warning: "Warning! Changing this field will result in resetting the synchronization status of all files from all Data Providers! Also, the Rails app will have to be restarted, and all files in that directory will be erased!" + ignore_patterns: "Separate several patterns with spaces; each pattern can contain single '*'s, but no '/'s or special characters." + name_note_bourreau_html: "Important note: this name must also be changed accordingly in the config file Bourreau/config/initializers/config_bourreau.rb for this server to restart properly later on." + name_note_portal_html: "Important note: this name must also be changed accordingly in the config file BrainPortal/config/initializers/config_portal.rb for this server to restart properly later on." + license_agreements: "Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted." + external_status_page: "Link to external status page for the server." + user_manual_url: "If set, the portal will show a link called 'User Manual' in the account bar at the top." + base_portal_url_html: "Required to direct new users to the portal, this should be filled in with the base URL of the portal" + neurohub_base_url_html: "Required to direct new users to the NeuroHub portal, this should be filled in with the base URL of the portal" + large_upload_url: "If set, the portal will show a link called \"Large datasets?\" in the upload panel sending users to a custom page where you can provide explanations for alternative upload methods." + upload_size_limit: "If set (and numeric), the portal will show a warning when uploading files about the maximum allowed file size for uploads. Note that this limit needs to be manually enforced on the web server hosting this portal." + support_email_html: "If set, the portal will show a mailto: link for letting users contact support." + nh_support_email_html: "If set, the portal will show a mailto: link for letting users contact NeuroHub support." + nh_system_from_email: "If set, NeuroHub messages sent automatically by this system will contain this return address." + activity_workers_explanation_html: "In a development environment %{env_note} a single Activity Worker is often enough. In production, a busy Portal might require more than one Worker, but a Bourreau could work fine with just one." + cache_expiration_html: "This means that in the execution server's cache, files that have been recorded as 'InSync' but were last accessed more than this amount of time will be considered untrustworthy and will be re-synchronized the next time they are accessed. Set this to a value less than N if the cluster's file policy, for instance, deletes all scratch files older than N days." + cms_extra_qsub_args: "Optional. Careful, this is inserted as-is in the command-line for submitting jobs." + docker_executable_name: "Name of the Docker executable available on the machines where tasks will run. It should always be set if Docker is present." + singularity_executable_name: "Name of the Singularity executable available on the machines where tasks will run. It should always be set if Singularity is present." + + all_admins: "All admins" + + paragraphs: + reverse_service_description_html: "This is an alternate mechanism to provide the Bourreau with a distinct database and SSH agent connection. For this to work, an SSH-accessible server (provided by hostname, port number and username) must be configured to accept the main CBRAIN portal key, and be visible from the Bourreau. That server must have a SSH agent that provides keys on a UNIX domain socket, and a database connection for CBRAIN. The database connection specification can be provided as either as a full path to a UNIX domain socket, or as localhost:port." + reverse_service_defaults_html: "Some default values shown under the input boxes are guesses based on the currently running Portal. These are useful if the portal happens to be the server to connect back to." + persistent_ssh_explanation: "When set to 'always', the SSH connections to a data provider's host will persist after the first use. This makes successive data transfers a bit faster because the connection doesn't have to be re-opened every time it is needed. The default is to have this behavior ON ('always') for portals and OFF ('never') for execution servers." + + default_value: "Default: %{value}" + + unknown_check_config: "(Unknown, check your config)" + activity_workers_number_select: + none: "None (for debug)" + recommended_bourreaux: "1 (recommended for Bourreaux)" + recommended_portals: "3 (recommended for Portals)" + like_right_now: "(like right now)" + options: + always: "Always" + never: "Never" + unconfigured: "(Unconfigured)" + content: + not_configured: "(Not configured)" diff --git a/BrainPortal/config/locales/en/views/cbrain_mailer/cbrain_mailer.yml b/BrainPortal/config/locales/en/views/cbrain_mailer/cbrain_mailer.yml new file mode 100644 index 000000000..e3deb7756 --- /dev/null +++ b/BrainPortal/config/locales/en/views/cbrain_mailer/cbrain_mailer.yml @@ -0,0 +1,33 @@ +en: + cbrain_mailer: + + common: + closing: "Sincerely," + admins: "The %{service} administrators." + thank_you: "Thank you," + access_service: "Access %{service} here:" + + forgotten_password: + greeting: "Dear %{name}," + password_reset: "Your %{service} password has been reset to the following:" + temporary_notice: "This is a TEMPORARY password, only valid for your next login. Upon logging in, you will immediately be directed to your account page where you must create a new password." + + registration_confirmation: + welcome: "Welcome to %{service}, %{name}," + account_set_up: "Your account has been set up." + username: "Your username for logging in is:" + temporary_password: "Your temporary password is:" + password_change_notice: "You will be asked to change your password upon first log in." + + signup_notify_admin: + someone_asking: "Someone is asking for a new %{service} account:" + none_provided: "(None provided)" + comments_intro: "The requester provided some comments:" + review_application: "As an administrator, you can review the full application here:" + system_signature: "The %{service} system." + + signup_request_confirmation: + automated_message: "This is automated message from the %{service} signup system." + confirm_email: "Please confirm your email address by clicking the link below." + disregard: "If you did not request an account, you can disregard this message." + once_confirmed: "Once confirmed, the administrators will be notified, will evaluate your request, and notify you if your application has been approved." diff --git a/BrainPortal/config/locales/en/views/custom_filters/custom_filters.yml b/BrainPortal/config/locales/en/views/custom_filters/custom_filters.yml new file mode 100644 index 000000000..b7b2dec7e --- /dev/null +++ b/BrainPortal/config/locales/en/views/custom_filters/custom_filters.yml @@ -0,0 +1,118 @@ +en: + custom_filters: + + common: + filtering_by_date: "Filtering by date" + archiving_status: "Archiving status" + owners: "Owners" + dont_filter_description: "Don't filter description" + + match_type: + match: "Matches" + match_exactly: "Match exactly" + contain: "Contains" + begin: "Begins with" + end: "Ends with" + + archiving: + dont_filter: "Don't filter by archiving status" + archived: "Archived" + not_archived: "Not archived" + on_cluster: "Archived on cluster" + as_file: "Archived as file" + + userfile: + filename: "Filename" + dont_filter_name: "Don't filter name" + parent_name_contains: "Parent name contains" + lists_children: "(lists children)" + child_name_contains: "Child name contains" + lists_parents: "(lists parents)" + dont_filter_size: "Don't filter size" + synchronization_status: "Synchronization status" + + task: + work_directory_status: "Work Directory status" + wd_status: + dont_filter: "Don't filter by work directory status" + shared: "Use another task's" + not_shared: "Have own Work Directory" + exists: "Work Directory exists on cluster" + none: "Work Directory does not exist on cluster" + + custom_filter_li: + links: + edit_delete: "Edit/Delete" + + custom_filter_list: + headings: + by_custom_filter: "By Custom Filter" + links: + create_custom_filter: "Create Custom Filter" + + new_task_custom_filter: + by: + task_types: "Task types" + status: "Status" + description: "Description" + owners: "Owners" + projects: "Projects" + execution_servers: "Execution servers" + filtering_by_date: "Filtering by date" + archiving_status: "Archiving status" + work_directory_status: "Work Directory status" + + new_userfile_custom_filter: + by: + filename: "Filename" + parent_name_contains_html: "Parent name contains (lists children)" + child_name_contains_html: "Child name contains (lists parents)" + file_types: "File types" + filtering_by_date: "Filtering by date" + size: "Size" + owners: "Owners" + projects: "Projects" + data_providers: "Data Providers" + archiving_status: "Archiving status" + synchronization_status: "Synchronization status" + tags: "Tags" + + new: + headings: + main: "New %{type}" + labels: + filter_name: "Filter name" + errors: + custom_filter: "custom filter" + submit: "Create" + + task_custom_filter: + headings: + types: "Types" + status: "Status" + description: "Description" + owners: "Owners" + projects: "Projects" + execution_servers: "Execution servers" + archiving_status: "Archiving status" + work_directory_status: "Work Directory status" + filtering_by_date: "Filtering by date" + + userfile_custom_filter: + headings: + filename: "Filename" + parent_name_contains_html: "Parent name contains (lists children):" + child_name_contains_html: "Child name contains (lists parents):" + by_file_types: "By file types" + size: "Size" + owner: "Owner" + projects: "Projects" + data_providers: "Data Providers" + archiving_status: "Archiving status" + synchronization_status: "Synchronization status" + tags: "Tags" + filtering_by_date: "Filtering by date" + + show: + errors: + update: "custom filter could not be updated." diff --git a/BrainPortal/config/locales/en/views/data_providers/data_providers.yml b/BrainPortal/config/locales/en/views/data_providers/data_providers.yml new file mode 100644 index 000000000..35938ccbf --- /dev/null +++ b/BrainPortal/config/locales/en/views/data_providers/data_providers.yml @@ -0,0 +1,614 @@ +en: + data_providers: + + common: + no_word: "No" + portal_ssh_key_title: "Public SSH Key for this CBRAIN Portal" + labels: + mode: "Mode" + syncability: "Syncability" + syncability: + fully_syncable: "Fully syncable" + not_syncable: "NOT syncable" + mode: + read_only: "Read Only" + read_write: "Read/Write" + create_new_dp: "Create New Data Provider" + field_explanation: + description: "The first line should be a short summary, and the rest are for any special notes for the users." + description: "Brief description of the data provider." + name: "The name of the data provider." + remote_dir: "Directory used for storing files" + cloud_config: "Cloud Storage Configuration" + containerized_config: "Containerized Storage Configuration" + physical_data_location: "Physical Data Location" + other_properties: "Other Properties" + ssh_params: "SSH parameters" + any_users: "(Any Users)" + unknown_key: "Unknown! Talk to sysadmin!" + + data_providers_table: + links: + create_system_dp: "Create New System Data Provider" + create_personal_dp: "Create Personal Data Provider" + check_all: "Check All" + user_access_report: "User Access Report" + transfer_restrictions_report: "Transfer Restrictions Report" + disk_usage_report: "Disk Usage Report" + disk_quotas: "Disk Quotas" + legends: + official_storage: "Official Data Storage" + user_site_storage: "User or Site Storage" + + delete_button: + buttons: + delete_files: "Delete Files" + paragraphs: + explanation_html: | +

+ This panel allows you to delete permanently files that + are present on the remote Data Provider. Note that this operation will + work whether or not the files are registered. If they are registered, + they will be unregistered first. +

+ submit: "Delete the files" + + dp_browse_table: + headings: + main: "Files Available On Remote Data Provider '%{name}'" + browsing_as_html: "(Browsing as user '%{login}')" + links: + registered: "Registered" + register_files_as: "Register files as:" + and_directories_as: "and directories as:" + unacceptable: "Unacceptable?" + belongs_to_html: "Belongs to user %{login}" + registered_with_owner_html: "%{link} %{owner}" + columns: + name: "Name" + changedir: "CD" + size: "Size" + type: "Type" + last_modified: "Last modified" + registered: "Registered?" + note: "Note" + + dp_report_table: + columns: + type: "Type" + issue: "Issue" + severity: "Severity" + action: "Action" + file: "File" + user: "User" + labels: + of_count: "%{login} (of %{count})" + + dp_show_path: + top: "(top)" + browse_path: "Browse Path:" + + dp_types_explained: + content_html: | + This document describes the different types of Data Providers + implemented in CBRAIN. Not all of them are useful. In production + environments, the recommended type is the EnCbrainSmartDataProvider + for official data storage and FlatDirSshDataProvider for user-specific + personal storage. + +

+ Many provider types come in three variations: + +

+
Local
+
TypeLocalDataProviders + store their information on the local file system where the CBRAIN service + resides; as such it means that the files will not be accessible from + other remote components of the CBRAIN installation, for instance + Execution Servers located on other hosts or supercomputers. Their + advantage is that they are fast to access, and the CBRAIN portal will + not have to make a local copy of any of the files to work on them + or visualize them. +
+ +
Ssh
+
TypeSshDataProviders + store their information on file system located on a remote UNIX machine + accessible using a SSH account; a file's content is fetched and cached using + SFTP or the rsync command and copied locally whenever any + component of CBRAIN (including the portal) need to access it. +
+ +
Smart
+
TypeSmartDataProviders + are intelligent in that they will act as either a Local or + Ssh variant of the same type. The choice is made by + each CBRAIN component (Portal, Execution server) independently. Each + component compares the hostname where it runs to the Remote Hostname + configured for the DataProvider; if they match, the Smart + DataProvider will act as a Local one, bypassing any form + of caching. If they don't match, it will act as a Ssh one, + therefore transferring files and caching them as needed. +
+
+ +
+ + The rest of this document describes the different types available, which + differ in what kind of file structure they use to store the + files of the users. + + FlatDir*DataProvider: + The provider's files are stored in a flat directory, one + level deep, directly specified by the object's Remote Directory + attribute. The file "hello" is this stored in a path like this: +
    /remote_dir/hello
+ Note that for historical reasons, the SshDataProvider + is a synonym for FlatDirSshDataProvider. + +

+ + EnCbrain*DataProvider: The + files are stored in a path uniquely determined by + the file's ID. A file named "hello" with ID 41233 will be stored + like this: +

    /root_dir/04/12/33/hello
+ Such data providers have the advantage that files can be renamed and + reassigned to new owners with minimal modifications on the filesystem's + structure. The EnCbrain*DataProviders are the officially recommended + data providers for production deployment. The data directory where + files are stored are not meant to be accessed and modified by + external means, that means no users are supposed to access + the files directly in there. +

+ + Vault*DataProvider: + The provider's files are stored in a flat directory, two levels + deep, directly specified by the object's Remote Directory + attribute and the user's login name. The file "hello" + of user "myuser" is thus stored into a path like this: +

    /remote_dir/myuser/hello
+ On such data providers, it is not possible to reassign ownership + of a file. +

+ + IncomingVault*DataProvider: This class behaves like the + VaultSshDataProvider, except that it is browsable. When browsing, only + the subdirectory named like the login name of the current user will + be visible. It is perfect for accessing + a jailed Remote Directory for incoming content, where users + can upload files to these subdirectories on other channels. A typical + setup would also use the Remote Directory as the root for + an incoming SFTP or FTP server (this is in fact the reason why this + type of provider is named like this). +

+ + S3DataProvider: This class connects to Amazon's S3 + cloud storage service. The files will be stored in a bucket named + "gbrain_{name}" where name is the name of the Data Provider. + Usage of this Data Provider requires obtaining an access key + and secret token. Do not rename this Data Provider if files + are registered with it, unless you also rename the bucket! All + FileCollections are uploaded and downloaded as .tar.gz files, so + this DP is not particularly efficient for large datasets. + +

+ + S3FlatDataProvider: This is a class that connects to + Amazon's S3 cloud storage service using the new AWS SDK for S3 Version 3.0. + A Bucket and a Starting Path must be specified that have already been created + through AWS. Usage of this Data Provider also requires obtaining an access key + and secret token for Amazon Web Services. For more information, please visit + https://aws.amazon.com for more details. + File will stored as objects in the S3Object store and the data provider mainly + acts like a FlatDataProvider. + +

+ + SingSquashfsDataProvider This class connects to a set of + one or several squashfs files (all named with .squashfs extensions) through + a Singularity container handler. The requirements are:
+

    +
  • that all the squashfs files are in the Physical Data Location, +
  • the Singularity image is also there and named %{singularity_image}, +
  • that this image contains a basic Linux system with at least rsync installed in it, +
  • and that the path to the data root inside the container must be provided in the Containerized Data Path under the Containerized Storage Configuration section. +
+ Note that this DP is already 'smart' in that if the Remote Host + configured for it matches the current host, it will not perform its + data operation through a SSH master. + + one_data_provider_table: + messages: + loading: "Loading..." + links: + check: "Check" + report: "Report" + browse: "Browse" + columns: + name: "Provider name" + type: "Type" + owner: "Owner" + group: "Project" + site: "Site" + time_zone: "Time zone" + online: "Online?" + alive: "Alive?" + inconsistency: "Inconsistency" + files: "Files" + mode: "Mode" + syncability: "Syncability" + description: "Description" + browse: "Browse" + inconsistency: "Inconsistency" + + register_button: + paragraphs: + register_html: | +

+ This panel allows you to register files that are present on + the remote Data Provider, but not yet known by the CBRAIN + interface. Once registered, a file will be visible in + the Files manager, and can be used for launching + tasks. +

+ +

+ We recommend that you use this Data Provider only to + transfer data in and out of CBRAIN. When registering files, + as you can see below, you can have them automatically moved + or copied to another official CBRAIN Data Provider. + must_move_html: | + In fact, this particular Data Provider leaves you no choice + and you MUST select another Data Provider where your files will be copied or moved. + cleanup_html: | + Once files are copied to another official Data Provider, we recommend you + clean up the files here using the Delete Files panel, further right. +

+ headings: + when_registering: "When registering, automatically..." + datas: + assign_project: "Assign the files to a project" + move_or_copy: "Move or copy the files" + to: "to" + move_option: "... MOVE the files to Data Provider ->" + copy_option: "... COPY the files to Data Provider ->" + do_nothing: "... do nothing else!" + tool_tips: + info: "(info)" + include_blanks: + select_project: "(Select a project)" + select_another_dp: "(Select another Data Provider)" + notes: + title_html: "Important notes about automatically copying and moving files:" + start: "The MOVE or COPY operation will start in background as soon as you click 'Register files'." + no_modify: "While the operation is in progress, do not modify the files on the remote Data Provider!" + copy_progress_html: "While a COPY operation is in progress, there will seem to be two registered versions of the file in the file manager (one on each Data Provider)." + copy_done_html: "After a COPY operation is done, the files will still be visible here and will no longer seem to be registered." + move_done: "After a MOVE operation is done, the files will have been erased from here." + ignored: "Attempts to COPY or MOVE files to Data Providers where identically named files already exist will be ignored silently." + button: "Register Files" + submit: "Register the files!" + + show_user_key: + headings: + instructions: "SSH Key Configuration Instructions" + your_key: "Your Personal CBRAIN Public SSH Key" + paragraphs: + ssh_configuration_html: | + + no_security_risk: | + + errors: + fetching: "Error fetching public key" + links: + download: "Download link:" + + unregister_button: + button: "Unregister Files" + paragraphs: + unregister_html: | +

+ This panel allows you to unregister files that are present on + the remote Data Provider and have already been registered by + the CBRAIN interface. Once unregistered, a file will be no longer + be visible in the Files manager, but will still be left + on the disk at the remote site. It will be your responsibility + to delete the data manually if you have an external access + to the remote files, or you can use the Delete Files + panel, further right. +

+ submit: "Unregister the files!" + + view_option_button: + button: "View Options" + browse_as_another_user: "Browse as another user:" + + browse: + title: "Browse Data Provider" + links: + refresh_list: "Refresh list of files" + + dp_access: + title: "DataProvider Access" + headings: + main: "Data Provider User Access Report" + legends: + accessible: "accessible" + not_accessible: "not accessible" + + dp_transfers: + title: "Transfer Restrictions" + headings: + main: "Data Provider Transfer Restrictions Report" + destination_dp: "Destination Data Provider" + source_dp: "Source Data Provider" + paragraphs: + intro_html: | +

+ This table shows which file transfers are allowed between Data Providers. Each cell of the table has two symbols, where %{ok} means allowed and %{no} means not allowed. Transfers will succeed if both symbols show up as %{ok} %{ok}. +

+

+ The first symbol indicates restrictions for transferring files between Data Provider pairs, independently of the states of any other resources. The restrictions are not necessarily symmetrical: it's possible to configure Data Providers A and B such that transfers from A → B are allowed (%{ok}) while transfers from B → A are not (%{no}). +

+

+ The second symbol takes into account three other factors: +

    +
  • whether or not Data Providers are online or offline;
  • +
  • whether or not Data Providers are read/write or read only;
  • +
  • whether or not the current Portal has itself access to each Data Provider.
  • +
+ In such cases, Data Providers will be annotated with %{offline}, %{read_only} and/or %{no_access}. If all three properties allow the file transfers, the second symbol will be %{ok}; otherwise it will be %{no}. +

+ access: + offline: "(offline)" + read_only: "(read only)" + no_access: "(portal has no access)" + legends: + title: "Copying or moving files:" + allowed: "allowed" + not_allowed: "not allowed" + + index: + title: "Data Providers" + + new_personal: + title: "Add New Personal Data Provider" + headings: + main: "Add New Personal Data Provider" + field_explanation: + name: "This should be a simple identifier with no special characters or spaces" + group_html: "This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '%{group}'." + labels: + name: "Name" + description: "Description" + group: "Project" + remote_host: "Remote Hostname" + remote_user: "Remote Username" + remote_port: "Remote Port Number" + remote_dir: "Full Directory Path" + cloud_storage_endpoint: "S3 Endpoint URL" + cloud_storage_region: "S3 Endpoint Region" + cloud_storage_client_bucket_name: "Bucket Name" + cloud_storage_client_path_start: "Relative Path Prefix (Optional)" + cloud_storage_client_identifier: "Client Identifier" + cloud_storage_client_token: "Client Secret Token" + titles: + name: "The name of the data provider." + description: "Brief description of the data provider." + group: "Project ownership of this data provider. Project members will have access to the provider, but will not be able configure it." + remote_host: "Name of the remote machine on which the data provider is located." + remote_user: "Username on the remote machine where the data provider is located." + remote_port: "Port number used to access remote machine on which the data provider is located." + remote_dir: "Directory used for storing files" + cloud_storage_endpoint: "S3 Endpoint" + cloud_storage_region: "S3 Region" + cloud_storage_client_bucket_name: "Bucket Name" + cloud_storage_client_path_start: "Relative Path Prefix (Optional)" + cloud_storage_bucket: "Bucket Name" + cloud_storage_path_start: "Path Prefix (Optional)" + cloud_storage_client_identifier: "Client Identifier" + cloud_storage_client_token: "Client Secret Token" + ssh_tab: "SSH Data Provider" + s3_tab: "S3 Data Provider" + paragraphs: + name: | +
The first line should be a short summary, and the rest are for any special notes for the users.
+ description: | +
This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '<%= current_user.own_group.name %>'.
+ group: | +
This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '<%= current_user.own_group.name %>'.
+ before_ssh_dp: | + Use this type: + ssh_dp: | +

+ + A SSH Data Provider connects to a UNIX server using SSH and + transfers files back and forth using the 'rsync' command and sometimes + other basic commands such as "mkdir", in a non-interactive mode. For this + to work, you'll need to make sure that: + +

+ +

    +
  • The user account on the remote host has a 'clean shell'.
    + That means when login non-interactively, no messages + are printed on stdout or stderr.
    + For more information, ask your sysadmin about this. +
  • You've installed a SSH key in that account; see the panel at the bottom of this form. +
  • The remote host is not behind a firewall or a two-Factor authentication mechanism. +
+ +

+ s3_dp: | +

+ + Provide the necessary information to connect to a S3-Compatible bucket. + +

+ + legends: + ssh_params: "SSH parameters" + s3_params: "S3 Connection Parameters" + + submit: "Create New Data Provider" + + new: + title: "Add New Data Provider" + headings: + main: "Add New Data Provider" + supertitle: "Public SSH Key for this CBRAIN Portal" + titles: + name: "The name of the data provider." + description: "Brief description of the data provider." + time_zone: "Time zone where this data provider is located." + type: "Type of data provider." + owner: "Owner of this data provider. The owner has full rights to configure and use the data provider." + group: "Project ownership of this data provider. Project members will have access to the provider, but will not be able configure it." + online: "Is this data provider currently available for use?" + read_only: "Is this data provider writable or read-only?" + not_syncable: "Is this data provider syncable?" + remote_host: "Name of the remote machine on which the data provider is located." + alternate_host: "Alternate name(s) (comma-separated) of the remote machine on which the data provider is located (required only for Smart data providers)." + remote_user: "Username on the remote machine where the data provider is located." + remote_port: "Port number used to access remote machine on which the data provider is located." + remote_dir: "Directory used for storing files" + containerized_path: "Data path inside container" + cloud_storage_client_identifier: "Identifier for cloud storage service." + cloud_storage_client_token: "Token or password for cloud storage service." + cloud_storage_client_bucket_name: "Bucket Name for cloud storage service." + cloud_storage_client_path_start: "Starting path for cloud storage service." + cloud_storage_endpoint: "Endpoint for cloud storage service." + cloud_storage_region: "Region for cloud storage service." + datalad_repository_url: "URL for the Datalad repository." + datalad_relative_path: "Relative path for the Datalad repository" + labels: + sincability: "Syncability" + name: "Name" + description: "Description" + time_zone: "Time Zone" + type: "Type" + status: "Status" + mode: "Mode" + syncability: "Syncability" + owner: "Owner" + group: "Project" + online: "Status" + read_only: "Mode" + syncable: "Syncability" + remote_host: "Remote Hostname" + alternate_host: "Alternate Hostname(s)" + remote_user: "Remote Username" + remote_port: "Remote Port Number" + remote_dir: "Full Directory Path" + containerized_path: "Containerized Data Path" + cloud_storage_client_identifier: "Client Identifier" + cloud_storage_client_token: "Client Token" + cloud_storage_client_bucket_name: "Bucket Name (Only needed for S3FlatDataProvider)" + cloud_storage_client_path_start: "Starting Path (Only needed for S3FlatDataProvider)" + cloud_storage_endpoint: "Endpoint (Only needed for S3FlatDataProvider)" + cloud_storage_region: "Region (Only needed for S3FlatDataProvider)" + datalad_repository_url: "Datalad Repository URL" + datalad_relative_path: "Datalad Relative Path" + meta_must_move: "Files must be copied/moved upon registration (browsable DPs only):" + meta_browse_gid: "Files can be browsed only by members of this project (browsable DPs only):" + meta_no_uploads: "Cannot be used for uploading files from the file manager:" + meta_no_viewers: "Files cannot be viewed in the file manager:" + legends: + ssh_params: "SSH parameters for remote Data Providers" + datalad_config: "Datalad Repository Configuration" + other_properties: "Other Properties" + cloud_storage_config: "Cloud Storage Configuration" + datas: + unknown_key: "Unknown! Talk to sysadmin!" + field_explanations: + description: "The first line should be a short summary, and the rest are for any special notes for the users." + cloud_storage_client_bucket_name: "Keep in mind, the bucket name should be specific enough to be unique to all of AWS." + type_info_toggle: "(Data Provider Type Information)" + select_provider_type: "Select Provider Type" + portal_key_note: "This key should be installed on the host machines of SSH or Smart Data Providers to allow remote access." + submit: "Create New Data Provider" + + report: + title: "Data Provider Report" + headings: + main: "%{name} - Inconsistency report" + links: + reload_report: "Reload report" + submit: "Repair selected issues" + + show: + title: "Data Provider Info" + titles: + log: "Data Provider Log" + links: + inconsistency_report: "Inconsistency Report" + file_registration_statistics: "File Registration Statistics" + test_configuration: "Test Configuration" + confirms: + delete: "Are you sure you want to delete '%{name}' ?" + cells: + group: "Project" + read_only: "Read Only" + read_write: "Read/Write" + not_syncable: "NOT syncable" + fully_syncable: "Fully syncable" + revision_info_dp: "Revision Info (DataProvider)" + revision_info_type_html: "Revision Info (%{type})" + headings: + update_error: "Provider could not be updated." + mode: "Mode" + group: "Project" + physical_data_location: "Physical Data Location" + cannot_sync_html: "%{rr} cannot sync %{dp}" + datalad_config: "Datalad Configuration" + client_path_start: "Client Starting Path" + endpoint: "Endpoint" + region: "Region" + datalad_url: "Datalad Repository URL" + datalad_path: "Datalad Relative Path" + no_uploads: "Cannot be used for uploading files in the file manager" + no_viewers: "Files cannot be viewed in the file manager" + must_move: "Files must be copied/moved upon registration" + copy_move_targets: "Files can be copied or moved to these other Data Providers" + browse_gid: "Files can be browsed only by members of this project" + accessed_by_servers: "File contents can be accessed by these Servers" + ssh_params: "SSH parameters" + alternate_host: "Alternate Hostname(s)" + containerized_storage_config: "Containerized Storage Configuration" + containerized_data_path: "Containerized Data Path" + cloud_storage_config: "Cloud Storage Configuration" + cloud_storage_client_identifier: "Client Identifier" + cloud_storage_client_token: "Client Token" + client_bucket_name: "Client Bucket Name" + datalad_relative_path: "Datalad Relative Path" + other_properties: "Other Properties" + official_storage_html: "Official Storage" + user_site_storage_html: "User or Site Storage" + portals_html: "Portals" + execution_servers_html: "Execution Servers" + public_ssh_key_note: "Public SSH Key for this CBRAIN Portal" + field_explanations: + license_agreements: "Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted." + alternate_host: "Comma-separated list of alternate hostnames; hostname1,hostname2,hostname3,..." + include_blanks: + any_users: "(Any Users)" + datas: + portal_key_note: "This key should be installed on this Data Provider's host machine to allow remote access." + unknown_key: "Unknown! Talk to sysadmin!" diff --git a/BrainPortal/config/locales/en/views/exception_logs/exception_logs.yml b/BrainPortal/config/locales/en/views/exception_logs/exception_logs.yml new file mode 100644 index 000000000..9698796cc --- /dev/null +++ b/BrainPortal/config/locales/en/views/exception_logs/exception_logs.yml @@ -0,0 +1,52 @@ +en: + exception_logs: + + index: + title: "Exception Logs" + + exception_logs_table: + submit: + delete_checked: "Delete Checked Exceptions" + delete_name: "the selected logs" + + message_count: + one: "1 message" + other: "%{count} messages" + + columns: + method: "Method" + exception: "Exception" + message: "Message" + controller: "Controller" + action: "Action" + format: "Format" + user: "User" + revision: "Revision" + raised_at: "Raised at" + + show: + title: "Exception Info" + + submit: + delete_message: "this exception report" + + headings: + request: "Request" + session: "Session" + headers: "Headers" + + cells: + raised_at: "Raised at" + url: "URL" + method: "Method" + parameters: "Parameters" + format: "Format" + user: "User" + start_time_revision: "Start time revision" + + legends: + backtrace: "Backtrace" + + exception_message: "in %{location}" + not_signed_in: "(Not signed in)" + diff --git a/BrainPortal/config/locales/en/views/groups/groups.yml b/BrainPortal/config/locales/en/views/groups/groups.yml new file mode 100644 index 000000000..bd6e0d0c1 --- /dev/null +++ b/BrainPortal/config/locales/en/views/groups/groups.yml @@ -0,0 +1,204 @@ +en: + groups: + + common: + creator: "Creator" + select_site: "(Select a site)" + + groups_table: + links: + create_project: "Create Project" + large_buttons: "Large buttons" + small_buttons: "Small buttons" + project_count: + one: "1 project" + other: "%{count} projects" + buttons: + switch_to_list_view: "Switch to List View" + switch_to_button_view: "Switch to Button View" + + + users_form: + active_users: "Active Users" + locked_users: "Locked Users" + labels: + quick_select_work: "Quick select based on other work Projects" + quick_select_site: "Quick select based on other site Projects" + + view_buttons: + paragraphs: + description_html: | +

+ A project is a way to group together under single name a set + of CBRAIN files and tasks. A project is not a folder. + Switching to a project makes it the 'active' project. When a + project is active, an automatic implicit filter will be applied + such that only files and tasks assigned to the project are shown + in the file or task manager. +
+ my_private_projects_html: | +

+ These projects are visible only to you. There is one particular + project named %{name} that is created + by the system for you, by default, and cannot be deleted. Any of + these projects can be turned into a Shared Project by inviting other + users to join. When this happens, the projects will appear in a separate tab. +

+ my_shared_projects_html: | +

+ These are projects that you created and are shared with other users. + Files and tasks assigned to a project are visible to all users of that project. +

+ projects_shared_with_me_html: | +

+ These are projects created by other users who have invited you to join them. + Files and tasks assigned to a project are visible to all users of that project. +

+ public_projects_html: | +

+ These are Public projects. All files and tasks assigned to them are visible to all users! +

+ site_projects_html: | +

+ These are Site projects. They can be used to share files and tasks among the set of users + belonging to the associated Site. +

+ admin_only_html: | +

Admin only

+ special_all_project_html: | +

+ This special ALL Project is in fact no + project at all. Selecting this as your currently active + 'project' will disable all project-based filtering, so + you will see together all files and tasks. + The file manager and task manager will each show you a new + column where you'll be able to filter by project directly + there. Selecting the ALL Project is useful + when you need to manage or browse files and tasks that are + in multiple projects. +

+ other_projects_html: | +

Projects that for some reason are not assigned to other tabs

+ tabs: + my_private_projects: "My Private Projects" + my_shared_projects: "My Shared Projects" + projects_shared_with_me: "Projects Shared With Me" + public_projects: "Public Projects" + site_projects: "Site Projects" + other_users_system_projects: "Other Users System Projects" + other_users_private_projects: "Other Users Private Projects" + other_projects: "Other Projects" + special_all_project: "Special 'ALL' Project" + + view_buttons_tab: + headings: + all: "All" + files: "Files:" + tasks: "Tasks:" + spans: + creator: "Creator:" + user_count: + one: "1 user" + other: "%{count} users" + + view_list: + row_contents: + represents_all_projects: "Represents all the projects" + all_projects: "All Projects" + columns: + name: "Name" + description: "Description" + type: "Project Type" + site: "Site" + creator: "Creator" + users: "Users" + files: "Files" + tasks: "Tasks" + switch: "Switch" + links: + switch: "Switch" + + index: + title: "Projects" + + new: + title: "New Project" + headings: + main: "New Project" + labels: + name: "Name" + description: "Description" + site: "Site" + paragraphs: + description_html: | +
The first line should be a short summary, and the rest are for details.
+ invisible_html: | +

+ Make this a system group invisible to normal users: + track_usage_html: | +

+ Turn on usage tracking for files in this project: + not_assignable_html: | +

+ Normal members will not be able to assign files or other resources + to this project (but editors are always allowed to do so): + public_html: | +

+ Make the project public, so that all users can access the files. Be careful with this option! You can always make the project public later on: + prompts: + site: "(Select a site)" + submit: "Create" + + show: + title: "Project Info" + titles: + project_log: "Project Log" + links: + leave_project: "Leave Project" + invite: "Invite Other Users" + remove: ": Remove" + headings: + message_1: "Project could not be updated." + message_2: "Urls are clickable " + message_3: "Assigned To Access Profiles" + creator: "Maintainer" + resources: "Resources" + members: "Members" + pending_invitations: "Pending Invitations" + cells: + type: "Type" + invisible: "Invisible" + userfiles: "Files" + tasks: "Tasks" + tools: "Tools" + data_providers: "Data Providers" + portal: "Portal" + execution: "Execution" + members: "Members" + track_usage: "Track Usage" + not_assignable: "Not Assignable" + paragraphs: + creator_html: | +

Warning: If you change the maintainer to someone else you won't be able to edit this project any more
+ description_html: | +
The first line should be a short summary, and the rest are for details.
+ not_assignable_html: | +
+ If checked, normal members will not be able to assign files or other + resources to this project (but editors are always allowed to do so). +
+ public_html: | +
+ If checked, a public project makes all its files visible to all the users. Be careful + with this option! +
+ invisible_html: | +
+ If checked, the project will not be shown in the list of projects. +
+ track_usage_html: | +
+ If checked, the system will track overall usage of files in this project + (views, downloads etc) per month. +
+ diff --git a/BrainPortal/config/locales/en/views/help_documents/help_documents.yml b/BrainPortal/config/locales/en/views/help_documents/help_documents.yml new file mode 100644 index 000000000..27e074677 --- /dev/null +++ b/BrainPortal/config/locales/en/views/help_documents/help_documents.yml @@ -0,0 +1,15 @@ +en: + help_documents: + + show: + buttons: + show: "Show" + edit: "Edit" + save: "Save" + remove: "Remove" + saving: "Saving..." + removing: "Removing..." + description_html: | + There is no documentation on this topic right now.
+ Add some by using the edit button in the top left corner. + diff --git a/BrainPortal/config/locales/en/views/invitations/invitations.yml b/BrainPortal/config/locales/en/views/invitations/invitations.yml new file mode 100644 index 000000000..3274db606 --- /dev/null +++ b/BrainPortal/config/locales/en/views/invitations/invitations.yml @@ -0,0 +1,6 @@ +en: + invitations: + + new: + send_invitations: "Send Invitations" + no_users_available: "No users available to invite." diff --git a/BrainPortal/config/locales/en/views/layouts/layouts.yml b/BrainPortal/config/locales/en/views/layouts/layouts.yml new file mode 100644 index 000000000..ba582adb2 --- /dev/null +++ b/BrainPortal/config/locales/en/views/layouts/layouts.yml @@ -0,0 +1,67 @@ +en: + layouts: + + common: + usage: "Usage" + + section_account: + dropdowns: + resource: "Resource" + + links: + dashboard: "Dashboard" + my_account: "My Account" + projects: "Projects" + resource: "Resource" + messages: "Messages" + data_providers: "Data Providers" + quotas: "Quotas" + servers: "Servers" + tools: "Tools" + tool_versions: "Tool Versions" + usage: "Usage" + full_list: "Full list of tools and datasets" + help_site: "Help Site" + email_support: "Email Support" + sign_out: "Sign out" + sign_in: "Sign in" + + labels: + unread_message: + one: "unread message" + other: "unread messages" + revision: "Rev: %{rev}" + branch: "Branch: %{name}" + last_updated_html: "last updated %{time} ago" + as: "Logged in as %{name}" + + tooltips: + email_support_html: "For email support about this platform, including help
about failed tasks and file transfer please click here
or write to: %{email}" + + section_cookie_notif: + legend: "Cookie Notification" + strong: "This site uses a cookie to remember you." + small_html: "This is safe and private. The cookie information is only exchanged between your browser and the site.
No information is sent to other sites, people or third parties." + unagree: "(Debug button remove agree)" + + section_footer: + powered_by: "Powered by %{name}" + credits: "Credits" + + section_menu: + all: "All" + quick_project_switcher: "Quick Project Switcher" + + links: + default_private_project: "%{group_name} (default private project)" + all_files_tasks: "All (no specific project: see all files and tasks)" + full_project_list: "(Full project list)" + select_project: "(Click here to select a Project and access Files and Tasks)" + profiles: "Profiles" + + placeholders: + search: "Search for anything" + + labels: + signups: "Signups" + ongoing: "Ongoing" diff --git a/BrainPortal/config/locales/en/views/messages/messages.yml b/BrainPortal/config/locales/en/views/messages/messages.yml new file mode 100644 index 000000000..9a3791e13 --- /dev/null +++ b/BrainPortal/config/locales/en/views/messages/messages.yml @@ -0,0 +1,92 @@ +en: + + messages: + + common: + mark_as_html: "Mark as %{state}" + updating: "Updating..." + deleting: "Deleting..." + + labels: + system: "System" + state_read: "Read" + state_unread: "Unread" + expiry_date: "Expiration date (current time: %{time})" + + time_ago: + ten_minutes: "Ten minutes" + one_hour: "One hour" + one_day: "One day" + two_days: "Two days" + one_week: "One week" + one_month: "One month" + two_months: "Two months" + one_year: "One year" + + col: + sender: "Sender" + recipient: "Recipient" + last_updated: "Last Updated" + operations: "Operations" + + message_count: + one: "1 message" + other: "%{count} messages" + + message_details: + paragraphs: + expires: "Expires:" + no_details: "(No Details)" + + message_display: + rescue: "Oh oh. Talk to devs!" + + message_index_display: + links: + leave_message: "Leave Message" + buttons: + delete_checked: "Delete Checked Messages" + scopes: + unread_link: "%{count} unread" + read_link: "%{count} read" + labels: + base: "%{label} (of %{base})" + columns: + criticality: + critical: "Critical" + not_critical: "Not critical" + type: "Type" + message: "Message" + sender: "Sender" + recipient: "Recipient" + last_updated: "Last Updated" + operations: "Operations" + + index: + title: "Messaging Center" + unread_count: + one: "1 unread message" + other: "%{count} unread messages" + + new_dashboard: + title: "Add New Dashboard Message" + headings: + main: "Add New Dashboard Message" + labels: + dashboard: "Dashboard" + explanations: + dashboard_html: | + For dashboard messages, whatever is entered here will be substituted literally + in the page's code. So you can use whatever HTML elements you want, but make sure + you know what you're doing. For NeuroHub, we recommend surrounding the entire text + with at least one <P> element. + + new: + title: "Add New Message" + links: + new_cbrain_dashboard: "New CBRAIN Dashboard Message" + new_neurohub_dashboard: "New NeuroHub Dashboard Message" + to_users_of_project: "To users of project:" + labels: + send_email: "Send E-mail" + diff --git a/BrainPortal/config/locales/en/views/noc/noc.yml b/BrainPortal/config/locales/en/views/noc/noc.yml new file mode 100644 index 000000000..4b77467c2 --- /dev/null +++ b/BrainPortal/config/locales/en/views/noc/noc.yml @@ -0,0 +1,38 @@ +en: + noc: + + cpu: + title: "CPU Over Time" + total_cpu: "Total CPU" + + dashboard: + titles: + main: "Activity %{range}" + subtitle: "%{date} at %{time}" + headings: + users: "Users" + active_tasks: "Active Tasks" + active_transfers: "Active Transfers" + cpu_time: "CPU Time" + files_deltas: "Files Deltas" + exceptions: "Exceptions" + servers: "Execution Servers Caches And Tasks" + dp: "Data Providers Updated Files" + legends: + portal_suffix: " (Portal)" + labels: + cache: "Cache" + tasks: "Tasks" + offline: "OFFLINE!" + + tools: + titles: + cpu: "Top %{count} Tools By CPU" + count: "Top %{count} Tools By count" + + users: + title: "User Growth" + spans: + new_from_country: "New Users From %{country}" + new_from_elsewhere: "New Users From Elsewhere" + cumulative: "Cumulative Users" diff --git a/BrainPortal/config/locales/en/views/portal/portal.yml b/BrainPortal/config/locales/en/views/portal/portal.yml new file mode 100644 index 000000000..54918b929 --- /dev/null +++ b/BrainPortal/config/locales/en/views/portal/portal.yml @@ -0,0 +1,375 @@ +en: + portal: + + common: + name_description: "Name and description" + availability: "Availability" + open: "Generally open" + restricted: "Restricted/on demand" + + logo_footer: + supported_by: "Supported By The Following Organizations" + + about_us: + title: "About" + header: "About Us" + platform_revision: "Platform Revision Information" + last_author: "Portal Last Changed Author:" + last_revision: "Portal Last Changed Revision:" + last_changed: "Portal Last Changed Date:" + up_since_html: "Portal Up Since: %{started_at} (for: %{uptime})" + plugins_revision_header: "CBRAIN Plugins Revision Information" + plugins_package: "Plugins Package: %{plugin}" + platform_info: "Platform Information" + env_vars: "Environment Variables" + licensing_info: "Licensing Information" + credits_link_html: "Credits for the project can be found on the %{credits_link} page, as well as in the %{github_link} page." + credits: "credits" + github_contributors: "GitHub contributors" + gnu_license: "GNU Public License" + gnu_desc_html: "The CBRAIN code base is distributed under the GNU Public License (GPL).
Copyright Alan C. Evans - McGill University 2008-2022
A copy of the text of the license can be found here." + other_licenses: "Other licenses" + other_desc_html: "Some packages or libraries developed by external entities
are used in the CBRAIN code base; here is a summary of their
respective licenses." + error_getting_license: "Error getting license file." + + available: + title: "List of tools and datasets" + note_html: "These tables list all tools and datasets configured on this CBRAIN portal.
Not all of them are available to all users." + + credits: + title: "Credits" + + headings: + citing: "Citing CBRAIN" + project_info: "CBRAIN Project Information" + credits_box: "Software Development Credits" + + paragraphs: + citing_html: | + Results published from data gathered or processed with a CBRAIN + installation should cite the following reference: + +

+ +

+ + Sherif T, Rioux P, Rousseau M-E, Kassis N, Beck N, Adalat R, Das S, Glatard T and Evans AC (2014)
+ CBRAIN: a web-based, distributed computing platform for collaborative neuroimaging research.
+ Front. Neuroinform. 8:54. doi: 10.3389/fninf.2014.00054 + +
+ project_info_html: | + This platform's origin and purpose is described further at the MCIN website (McGill Centre for Integrative Neuroscience).
+ + The code for the project is maintained and distributed on GitHub. + credits_box_html: | +
    +
  • Principal Investigator: Alan C. Evans, Montreal Neurological Institute, McGill University
  • +
  • Program Manager: Reza Adalat
  • +
  • Technology Managers: Shawn T. Brown, Marc Rousseau
  • +
  • System Architecture: Pierre Rioux, Tarek Sherif, Tristan Glatard
  • +
  • Lead Developers: Pierre Rioux, Tarek Sherif, Nicolas Kassis, Natacha Beck, Tristan Glatard, Andrew Doyle
  • +
  • Additional Developers: Angela McCloskey, Rémi Bernard, Tristan Aumentado-Armstrong, Anton Zoubarev, Mathieu Desrosiers, Ehsan Afkhami, Armin Taheri
  • +
  • Additional UX Design, Testing, Documentation: Najmeh Khalili-Mahani
  • +
  • IT Team: Alden Woodward, Chris Steele, Pamela Patterson, Pierre Rioux
  • +
  • Consultants: Samir Das, Penelope Kostopoulos, Pierre Bellec, Robert Vincent, Christine Rogers, Claude Lepage, Linsday Lewis, Carolina Makowski
  • +
  • Platform and licensing information: (Available here)
  • +
+ +

+ The CBRAIN team would like to thank all users of the original CBRAIN service + at McGill for their invaluable feedback and support. + + portal_log: + title: "Portal Logs" + filters: + lines_to_show_html: "Number of lines to show: %{dropdown}" + min_request_time_html: "Minimum request time: %{dropdown} ms" + filter: "Filter:" + by_user_html: "By user: %{dropdown}" + by_instance_html: "By instance name: %{textfield}" + by_method_html: "By method: %{dropdown}" + by_controller_html: "By controller: %{dropdown}" + + toggles: + hide_lines: "Hide lines:" + started_html: "'Started': %{checkbox}" + processing_html: "'Processing': %{checkbox}" + parameters_html: "'Parameters': %{checkbox}" + rendered_html: "'Rendered': %{checkbox}" + redirected_html: "'Redirected': %{checkbox}" + user_html: "'User': %{checkbox}" + completed_html: "'Completed': %{checkbox}" + sql_html: "'SQL': %{checkbox}" + load_html: "'Load': %{checkbox}" + exists_html: "'Exists': %{checkbox}" + cache_html: "'CACHE': %{checkbox}" + + provenance: + title: "Provenance" + + headings: + statement: "CBRAIN Provenance Statement" + + paragraphs: + statement_html: | + New features and bug fixes are tested and released into the + development branch upon completion. Continuous integration testing + is performed in an automated fashion and is applied to all code + incorporated into the development repository. All pull requests + are reviewed and validated by the senior development team before + either being accepted or returned so as to undergo further + modification and testing by the submitting developer. + +

+ + Major releases are made so as amalgamate together collections of + bug fixes, patches and new features assessed as beneficial for + issuance as a cumulative, integrated release for community use. + Major releases are performed by the CBRAIN Lead Developer and + authorized together with the CBRAIN Team Director. + +

+ + Each release contains an associated set of release notes documentation + clearly identifying the new features and issues that are addressed + within a given release. + +

+ + Release Notes + are available in the CBRAIN GitHub repository. + +

+ + footer: + last_updated_html: "Document last updated: %{date}" + + report: + title: "Tabular Reports" + + headings: + main: "Automatic Tabular Report Maker" + + paragraphs: + steps_html: | +

+ This form allows you to generate many different kind of reports + in a tabular layout. Proceed as follow: +

+ +
    +
  • Select the type of report in the grey box. Most reports + will count the number of objects accessible to you, but some of them + will perform summation of some attributes. +
  • +
  • Click on "Lookup columns and rows" and the form will be adjusted + to show you which attributes you can select for the rows and columns of + your table. +
  • +
  • Select an attribute for the rows and columns using each of the selection + boxes shown at the top and left of the table area. +
  • +
  • Click on "Generate Report" and the table will be created with + hot links to the appropriate index pages for your objects. You can + modify the report's properties and regenerate it anew any time you want. +
  • +
+ + report_types: + select: "(Select the report type)" + files_count: "Files - count" + files_sum: "Files - sum of sizes" + files_total: "Files - total files in collections" + files_combined: "Files - combined report" + tasks_count: "Tasks - count" + tasks_sum: "Tasks - sum of workdir space" + tasks_combined: "Tasks - combined report" + servers_count: "Servers - count" + dp_count: "Data Providers - count" + users_count: "Users - count" + projects_count: "Projects - count" + tools_count: "Tools - count" + tv_count: "Tool Versions - count" + du_views: "Data Usage - file views" + du_downloads: "Data Usage - file downloads" + du_copies: "Data Usage - file copies" + du_processed: "Data Usage - processed" + + actions: + lookup_btn: "Lookup columns and rows" + refresh_btn: "Refresh Report" + flip_btn: "Flip Rows/Columns" + generate_btn: "Generate Report" + + selectors: + select_row: "(Select row type)" + select_col: "(Select column type)" + + counters: + total: "Total" + entry: + one: "1 entry" + other: "%{count} entries" + file: + one: "1 file" + other: "%{count} files" + file_unk: + one: "1 file w/ unk size" + other: "%{count} files w/ unk size" + + empty_state: + no_objects_html: "There are %{no_objects} found for this report.
Try with other reporting parameters." + no_objects_red: "no objects" + waiting_html: "The report will appear here once you've selected
the proper table content and types for the rows and columns." + + notes: + optional_fix_html: "Optional: fix some attributes:" + date_html: "(Note: the links in the report will NOT include the date restrictions)" + + stats: + title: "Detailed Service Stats" + + headings: + main: "CBRAIN Web Service Statistics" + by_client: "Totals by client type" + by_controller_html: "Totals by controller & action" + by_status: "Totals by HTTP status codes" + + columns: + client_type: "Client Type" + successes: "Successes" + failures: "Failures" + controller: "Controller" + action: "Action" + status_code: "Status Code" + count: "Count" + + footer: + last_reset: "Counters last reset:" + + search: + title: "Search" + + placeholders: + search: "Search for anything" + + explanations: + search: "This will search files, tasks, users, tools, projects, etc by ID, by name or by description. %{limit} results shown maximum." + + actions: + switch: "(switch)" + + results: + found: "(found: %{count})" + registered_files: "Registered files" + + swagger: + title: "CBRAIN API" + + content_html: | +
+ This page describes the CBRAIN API + +

+ For more information about the work in progress on the API, please look up the + API issues + on + CBRAIN's GitHub repository. + +

+ This specification's YAML or JSON files can be opened + at SwaggerHUB. + +

+ This will provide you a way to generate client code and inspect the same documentation + that is shown here. + In particular, this will allow you to generate client libraries in all sorts of + marvelous exotic languages, such as Python, Perl, Java, Swift and even Ruby. +

+ Here is a direct link to the developer's latest version on SwaggerHub. +

+ + welcome: + title: "Welcome" + + headings: + main: "Welcome to %{name}" + news: "CBRAIN News" + system_info: "System Information" + sessions: "Sessions" + account_info: "Account Information" + tools_available_info_html: "Tools available to you (%{available} out of %{total}, %{link}):" + latest_tasks: "Latest Updated Tasks" + latest_files: "Latest Updated Files" + + news: + posted_at: "Posted: %{created_at}" + + system_info: + instance_name_html: "Portal instance name: %{name}" + unlock: "Unlock this Portal" + unlock_confirm: "Are you sure you wish to unlock this portal?" + lock_message: "(lock message)" + lock: "Lock this Portal" + lock_confirm: "Are you sure you wish to lock this portal?" + online_users: "Users currently online: " + recent_activity: "Recent activity:" + active: "Active" + logged_out: "Logged out" + unknown_unknown: "unknown/unknown" + unknown_browser: "unknown browser" + unknown_os: "unknown OS" + on_word: "on" + with: "with" + + sessions: + sessions_count: "There are currently %{count} entries in the sessions table." + clear_sessions: "Clear sessions older than" + clear_confirm: "Are you sure you want to clear the sessions?" + + exceptions: + logged: "There are internal exceptions logged:" + past_day: + one: "1 exception in the past day." + other: "%{count} exceptions in the past day." + past_three_days: + one: "1 exception in the past three days." + other: "%{count} exceptions in the past three days." + past_week: + one: "1 exception in the past week." + other: "%{count} exceptions in the past week." + total: + one: "1 exception in total." + other: "%{count} exceptions in total." + + account_info: + login_name: "Your login name:" + full_name: "Your full name:" + site_affiliation: "Your site affiliation:" + time_zone: "Your time zone:" + current_time: "Your current time:" + + defaults: + projects: "Projects you belong to:" + provider: "Your default Data Provider:" + server: "Your default Execution Server:" + + latest_tasks: + active_count: "(%{count} active)" + none_active: "(None active)" + + links: + system_info: + view_logs: "(View logs)" + full_tools_list: "full list of all tools here" + exceptions: + show: "Show Exceptions" + + show_license: + error_fetching: "(Error fetching license text)" + already_signed: "You have already signed this agreement." + disagree: "I do not agree" + + + diff --git a/BrainPortal/config/locales/en/views/quotas/quotas.yml b/BrainPortal/config/locales/en/views/quotas/quotas.yml new file mode 100644 index 000000000..5f27a5af2 --- /dev/null +++ b/BrainPortal/config/locales/en/views/quotas/quotas.yml @@ -0,0 +1,239 @@ +en: + + quotas: + + common: + config_count: + one: "1 quota configuration" + other: "%{count} quota configurations" + status: + ok: "OK" + exceeded: "Exceeded: %{what}" + show_edit: "Show/Edit" + show_edit_label: "Show/Edit %{label}" + table: "Table" + situation: "Situation" + quota_record: "Quota record" + confirm_delete_name: "this quota entry" + + cpu_quotas_table: + links: + config_count: + one: "1 CPU quota configuration" + other: "%{count} CPU quota configurations" + default: + all_users_in_project: "(For all users in project)" + all_users: "(Default for all Users)" + all_servers: "(Default for all servers)" + varies_by_server: "(Varies by server)" + columns: + user: "User" + project: "Project" + execution_server: "Execution Server" + max_weekly_cpu: "Max Weekly CPU" + max_monthly_cpu: "Max Monthly CPU" + max_cpu_total: "Max CPU Total" + max_active_tasks: "Max Active Tasks" + my_usage: "My Usage" + details: "Details" + operations: "Operations" + + cpu_report: + title: "Exceeded CPU Quotas" + links: + back_to_cpu_quotas: "Back To CPU Quotas" + headings: + user: "User" + execution_server: "Execution Server" + situation: "Situation" + details: "Details" + quota_record: "Quota Record" + usage_week: "Usage Past Week" + limit_week: "Limit Past Week" + usage_month: "Usage Past Month" + limit_month: "Limit Past Month" + usage_all: "Usage All Time" + limit_all: "Limit All Time" + exceeded: + week: "Past week CPU exceeded" + month: "Past month CPU exceeded" + ever: "Total lifetime CPU exceeded" + data: + table: "Table" + show_edit_cpu_quota: "Show/Edit CPU Quota" + + disk_quotas_table: + links: + config_count: + one: "1 disk quota configuration" + other: "%{count} disk quota configurations" + table: "Table" + show_edit: "Show/Edit" + show_edit_disk_quota: "Show/Edit Disk Quota" + columns: + user: "User" + default_for_all_users: "(Default for all Users)" + data_provider: "Data Provider" + max_size: "Max Size" + max_files: "Max Files" + my_usage: "My Usage" + details: "Details" + operations: "Operations" + disk_usage_html: "(%{size} and %{files} files)" + + disk_report: + title: "Exceeded Disk Quotas" + links: + back_to_disk_quotas: "Back To Disk Quotas" + table: "Table" + show_edit_disk_quota: "Show/Edit Disk Quota" + headings: + user: "User" + data_provider: "Data Provider" + situation: "Situation" + details: "Details" + quota_record: "Quota Record" + size: "Size" + size_quota: "Size quota" + num_files: "Number of files" + num_files_quota: "Number of files quota" + labels: + user_quota: "(User Quota)" + dp_quota: "(DP Quota)" + + show_cpu_quota: + titles: + create: "Create CPU Quota" + edit: "Edit CPU Quota" + log: "CPU Quota Record Log" + links: + cpu_quotas_table: "CPU Quotas Table" + new_cpu_quota: "New CPU Quota" + headings: + record: "CPU Quota Record" + max_cpu_week: "Max CPU time past week" + max_cpu_month: "Max CPU time past month" + max_cpu_total: "Max CPU time in total" + max_active_tasks: "Max Active Tasks" + cells: + user: "User" + project: "Project" + execution_server: "Execution Server" + blanks: + any_project: "(Any Project)" + any_execution_server: "(Any Execution Server)" + default_all_users: "(Default for all Users)" + divs: + user_html: | +
+ You can leave the user field blank and instead specify a project, below. + You can also leave them both blank. +
+ project_html: | +
+ Instead of specifying a user, above, you can select a project, and the quota + will apply to all users of that project. User and Project are mutually exclusive + in a CPU quota. You can also leave them both blank. +
+ execution_server_html: | +
+ You can leave this blank, but then you must provide either a user or a project, above. +
+ max_cpu_past_week_html: | +
+ The limit CPU time is in seconds; when entering a new value, + you can use a unit as a suffix, such as in + 3.5h (hours), 7d (days), 4w (weeks), + 3m (months) and 1y (years). + There are no suffixes for seconds and minutes. + A value of 0 means no time is allowed at all. +
+ max_cpu_past_month_html: | +
+ See the explanations for Max CPU time past week. +
+ max_cpu_ever_html: | +
+ See the explanations for Max CPU time past week. +
+ max_active_tasks_html: | +
+ The maximum number of tasks that can be active at any given time on the Execution Server. + Leave blank to not set a limit. A value of zero will prevent any tasks from being launched. + Note that projects are ignored for these values, and that if several quota records apply + to a user and differ only by project, the minimum value found in that set will be used. + The core Admin account is used to set a maximum number of tasks IN TOTAL for an Execution + server (thus, no limit specific to that admin user can be specified here). +
+ + show_disk_quota: + titles: + create: "Create Disk Quota" + edit: "Edit Disk Quota" + log: "Disk Quota Record Log" + links: + disk_quotas_table: "Disk Quotas Table" + new_disk_quota: "New Disk Quota" + new_quota_same_provider: "New Quota With Same Provider" + new_quota_same_user: "New Quota With Same User" + headings: + record: "Disk Quota Record" + max_disk_space: "Max Disk Space" + max_num_files: "Max Number Of Files" + columns: + user: "User" + data_provider: "Data Provider" + blanks: + default_all_users: "(Default for all Users)" + select_data_provider: "(Select a DataProvider)" + divs: + max_bytes_html: | +
+ Sizes are in bytes; when entering a new value, + you can use a unit as a suffix, such as in 2.3 kb and 10 G. + A value of 0 means no files allowed at all. +
+ max_files_html: | +
+ A value of 0 means no files allowed at all. +
+ + index: + title: "%{mode} Quotas Configurations" + mode: + disk: "Disk" + cpu: "CPU" + about: "About" + links: + exceeded_report: "Exceeded %{mode} Quotas Report" + new_entry: "New %{mode} Quota Entry" + to_disk: "Switch to Disk Quotas" + to_cpu: "Switch to CPU Quotas" + legends: + about_disk: "About Disk Quotas" + about_cpu: "About CPU Quotas" + paragraphs: + disk_quota_explanations_html: | +

+ This page shows the limits for the amount of disk space and number + of files that can be stored on each DataProvider. Each row is + a quota entry that applies to a user or all users, for a particular + DataProvider. When a user exceeds the one of the two limits for + a DataProvider, the user will no longer be able to create new + files. + cpu_quota_explanations_html: | +

+ This page shows the limits for the amount of CPU processing time + that a user can historically accumulate. There are three rolling + windows: for the CPU time accumulated over the past week, over + the past month, and over the entire lifetime of the user's account. +

+ Each row contains a quota entry with all three limits. Quotas + can apply to one or several Execution Servers, and can apply to + a single specific user, all users, or all the users of a particular + project. +

+ When a user has exceeded their quota on an Execution Server, their + tasks in status 'New' will not be set up, and they will stay in 'New' + until the quota window has moved ahead far enough to free some time. + diff --git a/BrainPortal/config/locales/en/views/resource_usage/resource_usage.yml b/BrainPortal/config/locales/en/views/resource_usage/resource_usage.yml new file mode 100644 index 000000000..b4917131f --- /dev/null +++ b/BrainPortal/config/locales/en/views/resource_usage/resource_usage.yml @@ -0,0 +1,84 @@ +en: + resource_usage: + + common: + task_walltime: "Task Walltime" + task_cpu_time: "Task CPU Time" + task_final_status: "Task Final Status" + + index: + title: "Resource Usage" + + resource_usage_table: + title: + file_deltas: "File Deltas" + + buttons: + userfile_disk_space: "Userfile Disk Space" + + legends: + table_description: "Table Description" + usage_summary: "Usage Summary (including filters)" + additional_filtering: "Additional filtering" + + paragraphs: + description_intro_html: | +

+ This is a very wide report table. It contains + resource usage records for disk space and time consumed. + Feel free to hide columns using the + + menu at the right side of the main table header. + description_space_userfile_html: | + It displays the changes of the sizes of all the files, + existing as well as deleted. + description_cputime_html: | + It displays the CPU time accumulated by tasks. + description_walltime_html: | + It displays the wall time accumulated by tasks. + description_space_task_html: | + It displays the disk space in the work directory, + as well as the final status of past tasks. The disk space + is not guaranteed to be accurate, as this is an expensive resource to compute + and is only provided FYI. The real, main purpose of this report is to gather statistics about the + final status of tasks. + description_cached_html: | +

+ Columns labeled Cached record pieces of information + about resources as they were at the time the record was made. + If a resource was destroyed (e.g. a non-Cached column is empty), these stay behind + and provide filtering options. It makes it possible to gather statistics about + these deleted resources. + + labels: + only_deleted_items: "Only deleted items" + positive_size_delta: "With positive size delta" + negative_size_delta: "With negative size delta" + task_type: "%{label} (of %{base})" + + submits: + refresh_table: "Refresh Table" + + columns: + date: "Date" + disk_space: "Disk Space" + time: "Time" + cached_owner_type: "Cached Owner Type" + cached_owner_login: "Cached Owner Login" + cached_project_type: "Cached Project Type" + cached_project_name: "Cached Project Name" + cached_server_name: "Cached Server Name" + cached_userfile_type: "Cached Userfile Type" + cached_userfile_name: "Cached Userfile Name" + cached_provider_type: "Cached Provider Type" + cached_provider_name: "Cached Provider Name" + cached_task_type: "Cached Task Type" + cached_task_status: "Cached Task Status" + cached_tool_name: "Cached Tool Name" + cached_version: "Cached Version" + + usage_record_count: + one: "1 usage record" + other: "%{count} usage records" + total: "Total" + average: "Average" + by_creation_date: "By creation date" diff --git a/BrainPortal/config/locales/en/views/sessions/sessions.yml b/BrainPortal/config/locales/en/views/sessions/sessions.yml new file mode 100644 index 000000000..2da1cb0c5 --- /dev/null +++ b/BrainPortal/config/locales/en/views/sessions/sessions.yml @@ -0,0 +1,61 @@ +en: + sessions: + + mandatory_oidc: + title: "Mandatory Identity provider Link" + headings: + before_message_html: "Before you can continue, your CBRAIN account must be linked to an identity provider." + explanations: "Explanations" + allowed_providers: "The identity providers that are allowed for your account are:" + + paragraphs: + explanations: | +

+ When you click on the button below, your browser will be redirected + to an identity provider login page; from there you can choose one of the + supported identity providers. This will in turn redirect you + to the provider's own login page. Once you've successfully authenticated + there, your browser will be redirected back here to finalize + the link with your CBRAIN account. +

+ no_provider: | +

+ No identity provider is currently available for your account. + Please contact the CBRAIN administrator for more information. +

+ already_logged_in: | +

+ If you already are logged in using a different identity provider, you + might want to log out first. This can be accomplished by the button below: +

+ + any_provider: "(Any identity provider)" + + links: + login_with: "Login with %{name}" + logout_from: "Logout from %{name}" + + new: + title: "Login" + + divs: + only_available_html: | +
+ (Only available if you have already linked your
+ CBRAIN account to a %{name} identity) +
+ labels: + login: "Login" + password: "Password" + + submit: + sign_in: "Sign in" + + links: + forgot_password: "Forgot your password?" + sign_in_with: "Sign In With %{name}" + request_account: "Request an account." + full_list: "Full list of all tools and datasets" + + or: "OR" + not_a_user: "Not a user?" diff --git a/BrainPortal/config/locales/en/views/shared/shared.yml b/BrainPortal/config/locales/en/views/shared/shared.yml new file mode 100644 index 000000000..8fac05019 --- /dev/null +++ b/BrainPortal/config/locales/en/views/shared/shared.yml @@ -0,0 +1,33 @@ +en: + shared: + + common: + do_not_filter: "Do not filter" + + active_filters: + active_filters: "Active Filters" + + date_range_info: + from_to: "from %{from} to %{to}" + + dynamic_table: + no_records_found: "No records found" + filter: "Filter - %{name}" + columns: "Columns" + per_page: "per page." + + error_messages: + header_message: "%{object_errors} prohibited this %{object_name} from being saved:" + message: "There were problems with the following fields:" + + group_tables: + labels: + work_groups: "Work Projects" + invisible_groups: "Invisible Projects" + + persistent_selection: + currently_selected: "%{item_name} currently selected" + select_all: "select all" + select_all_on_all_pages_tooltip: "Select all %{item_name} on all pages" + clear_tooltip: "Clear selected %{item_name}" + diff --git a/BrainPortal/config/locales/en/views/signups/signups.yml b/BrainPortal/config/locales/en/views/signups/signups.yml new file mode 100644 index 000000000..3314ffea6 --- /dev/null +++ b/BrainPortal/config/locales/en/views/signups/signups.yml @@ -0,0 +1,227 @@ +en: + signups: + + common: + comment: "Comments or special requests:" + + result_action_one: + headings: + main: "Result for %{name}, %{institution}" + + signups_table: + links: + new_request: "New Request" + hide_hidden_records: "Hide Hidden Records" + show_all_records: "Show All Records" + latest_todo: "Latest TODO" + edit: "Edit" + signup_request: + one: "%{count} signup" + other: "%{count} signups" + columns: + name: "Name" + edit: "Edit" + email: "Email" + position: "Position" + department: "Department" + institution: "Institution" + country: "Country" + username: "Username" + comments: "Comments" + private_comments: "Private Comments" + in_cbrain: "In CBRAIN" + portal: "Portal" + origin: "Origin" + created: "Created" + approved_by: "Approved By" + status: "Status" + labels: + not_approved: "(Not approved)" + buttons: + adjust_login: "Adjust Login" + resend_confirm_email: "Resend Confirm Email" + toggle_hidden: "Toggle Hidden" + tooltips: + updated_at: "Updated: %{time}" + delete_confirm: "Delete the selected signup requests?" + + status: + approved_by: "Approved by: %{name}" + approved_at: "Approved at: %{time}" + email_confirmed: "Email confirmed." + warnings: + email_unconfirmed: "(Email unconfirmed)" + conflicting_email: "(Conflicting email)" + login_conflict: "(Login conflict)" + links: + approve: "(Approve)" + + confirm_button: + title: "Confirm Your Request" + headings: + main: "Please confirm your new account request." + paragraphs: + main_html: | + Thank you for following the link from CBRAIN in your mailbox. +

+ To ensure you are indeed the owner of the email address that has + requested the creation of an account on CBRAIN, please complete the + final required step by clicking the button below. This will tell + the CBRAIN administrators that your request is legitimate and + official. +

+ links: + confirm_request: "Confirm request" + + confirm: + title: "Request Confirmed" + headings: + main: "Confirmed!" + links: + have_a_look: "have a look" + paragraphs: + main_html: | + Thank you. You've confirmed your email address. +

+ Now it's up to the administrators to review your request + and you'll be notified if and when they approve it. +

+ propose_view_html: | + In the meantime you can %{look} at your request, or even %{edit} it. + footer: | + (There is nothing else to do here, you might as well have a coffee and read the news) + + index: + title: "Account Signup Requests" + headings: + main: "Account Signup Requests" + + multi_action: + title: "Batch action results" + headings: + main: "Batch action summary results" + links: + go_back_html: "You can go %{link}." + back_to_list: "back to the request list" + + new: + title: "New Account Request" + warnings: + mandatory_fields: "Fields with an asterisk (*) are mandatory." + legends: + personal_info: "Personal Info" + institution_info: "Institution Info" + labels: + title: "Title:" + first: "* First Name:" + middle: "Middle Name:" + last: "* Last Name:" + login: "* Preferred 'login' name:" + institution: "* Name of Institution/Organization:" + department: "* Department" + position: "* Current position or role:" + affiliation: "* Current affiliation:" + email: "* Institutional Email address:" + street1: "Institution Street Address (line 1):" + street2: "Institution Street Address (line 2):" + city: "* City of Institution:" + province: "* Province/State:" + country: "* Country:" + postal_code: "Postal/ZIP Code:" + admin_comment: "Private, admin-only comments:" + comment: "Comments or special requests:" + paragraphs: + title_html: | +

+ for example: 'Mrs.', 'Mr', 'Dr.', etc. +
+ login_html: | +
+ + one letter + alphanums. By convention: the first letter of your first name + last name. + For example, John Doe login: 'jdoe' + +
+ email_html: | +
+ Please supply the address of your research institution. + Requests with non-institutional address or email + will be ignored + +
+ comment_html: | +
+ Please tell us the name of the laboratory you work for, + the name of its Principal Investigator (if not you), and if possible + anyone else you know in your lab who are already CBRAIN users.
+ We'll use this information to create or add you to a + Site within CBRAIN. +
+ privacy_note: | +
+ Privacy note +
+ The information you supply in this form is + only used in order to review your application and,
when approved, to + automatically generate your user account.
+ This information will not be used in any other way, or passed on to + any other entities or persons. + selects: + position_options: + faculty: "Faculty" + postdoctoral: "Postdoctoral" + phd_candidate: "PhD. candidate" + masters_student: "Masters student" + student: "Student" + researcher: "Researcher" + other: "Other" + affiliation_options: + academic: "Academic" + private_sector: "Private sector" + government: "Government" + non_profit: "Non-profit" + other: "Other" + select_one: "(select one)" + submits: + request_account: "Request Account" + update_request: "Update Request" + contact_html: "For more information, contact %{email}." + + + show: + title: "Account Request Info" + headings: + main: "Account Request Summary" + full_name: "Full Name" + login: "Preferred 'login' name:" + institution: "Name of Institution/Organization:" + department: "Department:" + position: "Position or role:" + affiliation: "Affiliation:" + email: "Email address:" + street1: "Street Address (line 1):" + street2: "Street Address (line 2):" + city: "City:" + province: "Province/State:" + country: "Country:" + postal_code: "Postal Code:" + comment: "Comments or special requests:" + admin_comments: "Admin Comments" + status_of_request: "Status of request:" + time_zone: "Time Zone:" + links: + approve: "approve" + email_confirmation_request: "email confirmation request" + paragraphs: + made_from_portal_html: "This account request was made from portal %{portal} using the form located on %{form_page}." + admin_can_edit_html: "As an administrator, you can %{link} this request." + login_conflict: "This user's login conflicts with a user already in the system." + can_approve_html: "You can also %{link} this request." + not_confirmed: "The user has not yet confirmed their email address." + confirmed: "The user has confirmed the email address." + resend_admin_html: "If the user hasn't received the confirmation email, you can ask for another %{link} to be sent again." + edit_session_note_html: "You can %{link} this form, but this option will only be available while you are using the same browser session you used for submitting this form originally. Do it now while you can!" + confirmation_sent: "A confirmation email has been sent to the address you provided. Once you receive it, please click on the provided link so we can confirm your identity." + resend_user_html: "If you haven't received the email, you can ask for another %{link} to be sent to you." + summary_intro: "Below is a summary of the information in this account request." + delete_html: "You can %{link} this request." diff --git a/BrainPortal/config/locales/en/views/sites/sites.yml b/BrainPortal/config/locales/en/views/sites/sites.yml new file mode 100644 index 000000000..cba5263e6 --- /dev/null +++ b/BrainPortal/config/locales/en/views/sites/sites.yml @@ -0,0 +1,74 @@ +en: + sites: + + sites_table: + links: + create_new_site: "Create new site" + headings: + main: + one: "Site" + other: "Sites" + columns: + name: "Name" + description: "Description" + type: "Type" + site_manager: "Site Manager" + number_of_users: "Number of Users" + number_of_projects: "Number of Projects" + + index: + title: "Sites" + + new: + title: "Add New Site" + headings: + main: "Add New Site" + titles: + brief_description_title: "Brief description of the site." + labels: + description: "Description" + paragraphs: + brief_description_html: | +
The first line should be a short summary, and the rest are for any special notes for the users.
+ lock_status: + active: "Active users" + locked: "Locked users" + datas: + login: "Login" + regular_user: "Regular user" + site_manager: "Site manager" + buttons: + groups: "Projects" + submit: "Create" + hide: "(Hide)" + + show: + title: "Site" + headings: + could_not_be_updated: "Site could not be updated." + resources: "Resources" + groups: "Projects" + users: "Users" + data_providers: "Data Providers" + remote_resources: "Remote Resources" + paragraphs: + description_html: | +
The first line should be a short summary, and the rest are for any special notes for the users.

+ cells: + managers: "Site Manager" + users: "Users" + groups: "Projects" + userfiles: "Files" + data_providers: "Data Providers" + remote_resources: "Remote Resources" + datas: + login: "Login" + regular_user: "Regular user" + site_manager: "Site manager" + labels: + users: "Users" + submits: + update_users: "Update Users" + update_projects: "Update Projects" + titles: + site_log: "Site Log" diff --git a/BrainPortal/config/locales/en/views/tasks/tasks.yml b/BrainPortal/config/locales/en/views/tasks/tasks.yml new file mode 100644 index 000000000..d67910725 --- /dev/null +++ b/BrainPortal/config/locales/en/views/tasks/tasks.yml @@ -0,0 +1,365 @@ +en: + tasks: + + control: + headings: + main: "Task Control:" + server_version_html: "Server & Version:" + select_server_version: "Select Server & Version" + save_results_to_html: "Save results to:" + select_data_provider: "(Select a Data Provider for your results)" + description_note: "(This first line should be a short summary, and the rest are your notes)" + + output_renaming_fieldset: + legends: + output_filenames_renaming: "Output filenames renaming" + output_files_pattern: "Output files can be named or renamed automatically using this pattern:" + leave_blank_html: "(Leave blank to let the program name the files automatically using its own rules)" + supported_keywords_html: "Patterns can include the following special
{keywords} in curly brackets that will be substituted
automatically.


The supported keywords are:" + + params: + headings: + main: "Task Parameters" + + presets: + headings: + main: "Preset Management:" + + submit_tag: + load_preset: "Load Preset" + delete_preset: "Delete Preset" + save_preset: "Save Preset" + + load_preset_configuration: "Load a preset configuration:" + select_preset: "(Select a preset to load)" + delete_this_preset: "Delete this preset?" + save_as_preset: "Save as a preset configuration:" + select_preset_to_overwrite: "(Select a preset to overwrite)" + or_as_new_name: " (or as new name)" + save_as_site_preset: "Save as site preset:" + + resource_usage: + legends: + main: "Resource Usage History" + + headings: + task_status: "Task Status" + usage_type: "Usage Type" + time_used: "Time Used" + disk_space_used: "Disk Space Used" + + labels: + cpu: "CPU" + walltime: "Walltime" + disk_space: "Disk Space" + + show_prereqs: + other_tasks: "These other tasks..." + must_be: "...must be in these states" + destroyed_task_parentheses: "(DestroyedTask)" + + task_menu: + + dropdown: + update_attributes: "Update Attributes" + for_failed_tasks: "For Failed Tasks" + for_completed_tasks: "For Completed Tasks" + terminating_and_cleaning_up: "Terminating And Cleaning Up" + archiving: "Archiving" + filters: "Filters" + + paragraphs: + for_failed_tasks_html: "This panel allows you to affect tasks that have failed, one way or another.
Trying to recover from errors will trigger cleanup code and a restart at
the closest successful processing stage before it failed. It doesn't always
work but it's often useful to try at least once!" + for_completed_tasks_intro_html: "This panel allows you to affect tasks that have completed successfully.
You can try to restart them at three different stages in their lifecycle:" + for_completed_tasks_list_html: "

  • At Setup, when input data files
    are synchronized on the Execution server and the
    processing scripts are created.
  • At Cluster, when the scientific scripts
    are actually run on the Execution Server's nodes.
  • At Post Processing, when the resulting output
    files are sent back to the CBRAIN Data Providers.
" + for_completed_tasks_note_html: "You can also duplicate tasks and recreate them on a different
Execution Server. Before restarting them, make sure to adjust
their tool version, though." + terminating_and_cleaning_up_html: "This panel allows you to affect tasks that you no longer need.
You can terminate tasks that are at any point in their lifecycle, even
failed tasks. Tasks marked Terminated can be restarted
later on." + remove_work_directories_note_html: "It's also possible to remove the tasks' work directories
on the Execution Server while leaving the rest of the tasks'
information intact. This is useful to free space on the Server
or when the tasks have processed confidential information that
you'd rather not leave over there. The panel Archiving
on the left provides you with other options for disposing of
the tasks' work directories." + remove_tasks_html: "Finally, you can remove tasks completely. This will erase the task's work directory
on the Execution Server, including temporary data files, but will not erase
a successful task's output files. This is useful if you have
confidential data, for instance. Removing a task will delete any
archives of the task's work directory, if any (as indicated by
the symbols %{workdir_status} and
%{userfile_status} in the 'Workdir Size' column)." + archiving_1_html: "This panel allows you to archive the content of the work directory
of your tasks. This can only be done on tasks that are in a final
state, such as Completed, Failed or Terminated." + archiving_2_html: "The process can take a very long time for each task being archived or restored, so
be patient and do not request this action multiple times in parallel." + archiving_3_html: "There are two different 'levels' of archiving:
\n
    \n
  • \n Archiving On Cluster means that the task's files will be compressed and archived but will stay on the cluster's side. Such tasks are shown with the symbol %{workdir_status} in the index table.\n
  • \n
  • \n Archiving As File means that the archive will be brought back to your file manager as a '%{type}' file and no data at all will be left on the cluster side. Such tasks are shown with the symbol %{userfile_status} in the index table.\n
  • \n
" + archiving_4_html: "The rest of the information about the tasks will not be affected in any way
when they are archived. No operation can be performed on archived task, except
of course unarchiving them." + + change: + owner: "Change Owner:" + group: "Change Project:" + data_provider: "Change Data Provider For Results:" + tool_version: "Change Tool Version:" + + blanks: + select_another_owner: "(Select another Owner)" + select_another_group: "(Select another Project)" + select_another_data_provider: "(Select another Data Provider)" + select_another_tool_version: "(Select another Tool Version)" + + hijacker: + trigger_error_recovery: "Trigger Error Recovery" + setup_stage: "\"Setup\" stage" + cluster_stage: "\"Cluster\" stage" + post_processing_stage: "\"Post Processing\" stage" + duplicate_tasks: "Duplicate Tasks" + terminate_tasks: "Terminate Tasks" + remove_work_directories: "Remove Work Directories" + remove_tasks: "Remove Tasks" + archive_on_cluster: "Archive On Cluster" + archive_as_file: "Archive As File" + unarchive_tasks: "Unarchive Tasks" + + confirm: + terminate_tasks: "Are you sure you want to terminate the selected tasks?" + remove_work_directories: "Are you sure you want to remove the\nWORK DIRECTORIES of the selected tasks?" + remove_tasks: "Are you sure you want to remove the selected tasks?\n\nIMPORTANT NOTE: This will also remove their archived work directories, if any." + + restart_at: "Restart at:" + on_execution_server: "on Execution Server: " + optional_destination_dp_html: "Optional: when archiving As File, choose a destination Data Provider:
" + do_not_compress: "Do not compress while archiving" + + tasks_display: + titles: + expand_batch: "Expand batch" + open_batch: "Open batch" + + switches: + switch_to_list_view: "Switch to List View" + switch_to_batch_view: "Switch to Batch View" + + columns: + batch: "Batch" + task_type: "Task Type" + version: "Version" + description: "Description" + owner: "Owner" + project: "Project" + server: "Execution Server" + current_status: "Current Status" + run_number: "Run Number" + workdir_size: "Workdir Size" + results_on: "Results On" + time_submitted: "Time Submitted" + last_updated: "Last Updated" + + legends: + on_cluster: "On Cluster" + as_file: "As File" + + task_count_colon: + one: "%{count} task:" + other: "%{count} tasks:" + + total_space: "Total space used by tasks: %{space}" + tasks_without_estimates: + one: "(1 task without space estimates)" + other: "(%{count} tasks without space estimates)" + disappeared_tasks: "This batch of tasks has disappeared" + shared_parentheses: "(Shared)" + workdir_archiving_status_symbols: "Workdir archiving status symbols:" + + + utility_interface_file_list: + run_on: "Run %{name} on:" + + zenodo_deposit_form: + legends: + basic_deposit_information: "Basic Deposit Information" + labels: + select_zenodo_token: "Select which of your Zenodo token to use:" + title: "Title" + description: "Description" + creators: "Creators" + options: + sandbox: "Sandbox" + main: "Main" + explanation_html: "Should be in lastname, firstname format.
You can add even more creators later on, once the deposit is created." + submit: "Create Deposit" + + edit: + edit_task: "Edit Task %{name}" + submit: "Save modified parameters for this task" + + index: + title: "Tasks" + + new: + title: "Launch %{name}" + headings: + main: "Launch %{name} Task" + submit: "Start %{name}" + + show: + title: "%{name} Task Information" + + headings: + cluster_job_id: "Cluster Job's ID" + setup_prerequisites: "Setup Prerequisites" + post_processing_prerequisites: "Post Processing Prerequisites" + + links: + edit_parameters: "Edit Parameters" + refresh: "Refresh" + retry_failed: "Retry Failed" + restart_at_setup: "Restart At Setup" + restart_on_cluster: "Restart On Cluster" + restart_at_post_processing: "Restart At Post-Processing" + archive_on_cluster: "Archive On Cluster" + unarchive: "Unarchive" + terminate_task: "Terminate Task" + remove_work_directory: "Remove Work Directory" + save_work_directory: "Save Work Directory" + publish_to_zenodo: "Publish to Zenodo" + remove_task: "Remove Task" + list_of_tasks: "List of tasks (%{count})" + + confirm: + terminate_task: "Are you sure you want to terminate this task?" + remove_work_directory: "Are you sure you want to remove the task's work directory?" + remove_task: "Are you sure you want to remove this task?" + remove_task_note: "\n\nIMPORTANT NOTE: This will also remove its archived work directory." + + cells: + task_name: "Task Name" + task_description: "Task Description" + execution_server: "Execution Server" + owner: "Owner" + tool_version: "Tool Version" + group: "Project" + current_status: "Current Status" + time_submitted: "Time Submitted" + data_provider_for_results: "Data Provider For Results" + zenodo_publication: "Zenodo Publication" + cluster_job_work_directory: "Cluster Job's Work Directory" + not_yet_created_or_erased: "(Not yet created or erased)" + size_of_work_directory: "Size of Work Directory" + archiving_status: "Archiving Status" + last_updated: "Last Updated" + + zenodo_publication: + published: "Published" + in_progress: "In Progress" + none: "None." + + shared_with_task: "Shared with task:" + + archiving_status: + not: "Not archived" + on_cluster: "Archived on cluster." + as_file: "Archived as file %{link}" + + rescue: + no_template_html: "
Problem loading summary view (no template provided by task author).
" + template_error_html: "
Problem loading summary view (template error).
" + show_summary_of_params_for_task: "Show summary of params for task %{name}" + error_rendering_yaml: "(Error rendering YAML)" + + in_the_task_manager: "In the task manager, you can view the full" + in_this_batch: "in this batch." + + tabs: + parameters_in_yaml: "Parameters in YAML" + parameters_in_json: "Parameters in JSON" + full_task_object_in_json: "Full Task Object in JSON" + stdout: "Standard Out" + stderr: "Standard Error" + script: "Script" + runtime_info: "RuntimeInfo" + + paragraphs: + parameters_description_html: | +

+ This shows only the scientific parameters associated with + this task. See the description in the last panel for more + information. +

+ parameters_in_json: | +

+ This shows only the scientific parameters associated with + this task. See the description in the last panel for more + information. +

+ full_task_object_in_json_html: | +

+ This structure shows the minimal amount of information needed + to create a CBRAIN task similar to this one, using the CBRAIN API. + This is provided to help developers working with the API. The top + level contains the IDs of the CBRAIN resources needed for the task + (e.g. the group (project) ID, the user's ID, the version of the + tool etc). These are the values you see at the top of the page in + the Info section. +

+

+ The information under "params" is exactly what + is shown in the previous tab. It generally contains the scientific + parameters for the tool, where file names are replaced by the IDs + of files registered within CBRAIN. +

+

+ For tools integrated with + Boutiques, + the "params" structure will contain a substructure called + "invoke" where most of the scientific parameters are + relocated. This structure should match exactly the invoke structure that + the Boutiques program bosh expect, but again with filenames + replaced by CBRAIN file IDs. +

+

+ Note that some keys and values are added to these structures during or + at the end of processing and are not required at the time the task is + submitted. +

+ + legends: + processing_log: "Processing Log" + prerequisites: "Prerequisites" + cluster_job_captured_output: "Cluster Job's Captured Output" + + outputs_not_available: "Since this task is archived, outputs aren't available right now." + outputs_available: "Outputs are available for several runs:" + + stdout_lim: "Only the last %{stdout_lim} lines are shown here. See more lines of Standard Output:" + stderr_lim: "Only the last %{stderr_lim} lines are shown here. See more lines of Standard Error:" + + zenodo: + title: "%{name} Zenodo Publishing Status" + + links: + task_info: "Task Info" + zenodo_deposit_editor: "Zenodo Deposit Editor" + refresh_message: "refresh this page" + reset_deposit: "Reset Deposition" + + status: + complete: "complete" + in_progress: "in progress" + incomplete: "incomplete" + + legends: + prepare: "Step 1: creation of the deposit" + upload: "Step 2: upload of data files" + publish: "Step 3: publishing the deposit" + reset_deposit_html: "Be aware: this deposit is in the Zenodo Sandbox" + + paragraphs: + prepare: + complete_html: "Assuming you are the author, you can review and edit the deposit
at this link: %{link}" + incomplete_html: "Proceed to fill the form below to create the initial deposit.

You will be able to edit the content of the form at any time
later on, directly on Zenodo's web site." + upload: + incomplete_html: "Warning: already published: in %{link}" + publish: + doi_1_html: "This task's outputs have been published as DOI %{doi}" + doi_2_html: "You can edit further the deposit here: %{link}" + no_doi_1_html: "You can edit further the deposit here and click the Publish button here: %{link}" + no_doi_2_html: "Once the deposit has been published, please return to this page right here (or just %{link}) so that the DOI of the deposit can be recorded in CBRAIN." + waiting: "Waiting for steps 1 and 2." + reset: + deposit_1_description_html: "You can erase all recorded information about the Zenodo deposit and publication
state in CBRAIN, in order to start over or publish in the main Zenodo site." + deposit_2_description_html: "Doing this will not erase anything on Zenodo that has been published,
but will erase any unpublished deposition and uploads." + deposit_confirmation: "Are you sure you want to reset the deposition information for this task?" + + prepare: + scheduled_for_upload: "Scheduled for upload:" + will_be_ignored: "Will be ignored:" + upload: + waiting_for_initial_deposit: "Waiting for the initial deposit to be created in step 1." + it_can_take_some_time: "It can take some time to transfer the content of all the files to Zenodo." + diff --git a/BrainPortal/config/locales/en/views/tool_configs/tool_configs.yml b/BrainPortal/config/locales/en/views/tool_configs/tool_configs.yml new file mode 100644 index 000000000..9c9362688 --- /dev/null +++ b/BrainPortal/config/locales/en/views/tool_configs/tool_configs.yml @@ -0,0 +1,261 @@ +en: + + tool_configs: + + common: + all_tools: "(All tools)" + all_servers: "(All servers)" + no_versions_configured: "No versions configured" + version_config_name: "version configuration '%{name}'" + in_project_html: "in project '%{group}'" + everyone: "'everyone'" + access_yes: "Yes" + access_no: "NO!" + container_engine: "Container Engine" + + by_resource: + labels: + tool: "Tool:" + execution_server: "Execution Server:" + no_versions: + for_servers: "No versions configured for these servers: " + for_tools: "No versions configured for these tools: " + headings: + execution_servers: "Execution Servers" + tools: "Tools" + versions_configured: "Versions Configured" + projects_in_effect: "Projects In Effect" + users_access_summary: "Users Access Summary" + have_access_html: "%{count} user(s) have access," + have_no_access_html: "user(s) have no access" + + by_user: + legends: + user: "User:" + member_of_projects: "Member Of Editable Projects:" + execution_servers_access: "Execution Servers Access:" + tool_access_summary: "Tool Access Summary:" + tool_versions_access_details: "Tool Versions Access Details:" + headings: + execution_server: "Execution Server" + tool: "Tool" + servers_project: "Server's Project" + accessible_to_user: "Accessible To User?" + tool_summary: "Tool Summary" + versions_per_server: "Number Of Versions Accessible, Per Server" + tools_project: "Tool's Project" + tool_version: "Tool Version" + effective_project: "Effective Project" + n_ok: "%{count} OK" + n_no: "%{count} NO" + + tooltip: + server_project_html: "* Execution Server's project
" + tool_project_html: "* Tool's project
" + version_project_html: "* Version configuration's project
" + + env_key_value_pair: + headings: + name: "Name" + value: "Value" + + form_fields: + headings: + version_config_info: "Version configuration info" + version: "Version" + project_access: "Project access" + suggested_cpus: "Suggested CPUs per task" + description: "Description" + inputs_readonly: "Does not modify its inputs files" + boutiques_path: "Path to Boutiques descriptor" + exec_server_control: "Execution Server Control" + extra_qsub: "Extra cluster submission options(sbatch, qsub)" + env_vars: "Environment variables" + bash_prologue: "BASH initialization prologue" + bash_epilogue: "BASH initialization epilogue" + container: "Container" + container_engine: "Container engine" + container_index: "Index of the container image" + container_image_name: "Container image name" + container_image_id: "ID of the container image" + singularity_overlays: "Singularity Overlays" + misc_singularity: "Misc Singularity Options" + short_workdir: "Use short workdirs inside Singularity" + field_explanations: + version: "Must be a simple string that represent a short identifier for the version. First character must be alphanum, and can contain only alphanums, '.', '-', '_', ':' and '@'" + description: | + The first line must be a short summary, and the rest are for any special + notes for the users. + inputs_readonly_html: + Check this if the tool is known not to modify its input files . + This will allow a user to launch the tool on files that are not marked as group-writable in the file manager. + boutiques_path_html: | + You can use this field to provide an explicit path to a + Boutiques descriptor; an absolute path will be used as-is, + while a relative path will be resolved relative to the + boutiques_descriptor folder in the installed plugins + subdirectory. The page indicates the source location of the + effective descriptor: 'Automatic' means the configuration has + been mapped automatically to an installed descriptor, 'Manual' + means the value in the input field here is used, and 'Overriden' + means both values exists, but the 'Manual' version is in effect. + extra_qsub_html: | + Note:This string will be appended to the extra 'qsub' option defined at the bourreau level. + container_index_html: | + The index (url) of the container image in which the docker or singularity container is + accessible through. + Examples for Docker are: quay.io, index.docker.io (default). + Examples for Singularity are: docker://, shub:// (default). + container_image_name: | + The name and tag of the container image in which the tool is installed, + for instance "centos:latest". This name refers to the Docker/Singularity index + accessed by the Bourreau, which is configured manually in the Bourreau + for now. + container_image_id: | + The ID number of the container image in which the tool is installed. + This ID refers to a proper image file registered in CBRAIN by the admin. + singularity_overlays_html: | + This field can contain one or several specifications for data overlays and bindmounts + to be included when the task is started with Singularity. +

+ Each overlay or bindmount specification should be on a separate line. +

+ An overlay specification can be either: +

+

    +
  • a full path (e.g. file:/a/b/data.squashfs),
  • +
  • a path with a pattern (e.g. file:/a/b/data*.squashfs),
  • +
  • a registered file identified by ID (e.g. userfile:123),
  • +
  • a SquashFS Data Provider identified by its ID or name (e.g. dp:123, dp:DpNameHere)
  • +
  • or an ext3 capture overlay basename (e.g. ext3capture:basename=SIZE where size is 12G or 12M).
  • +
+

+ In the case of a Data Provider, the overlays will be the SquashFS files that the provider uses for its storage. The provider of course must be local to the current execution server. +

+ A bindmount specification is one of: +

    +
  • bindmount:/bourreau/path/to/data:/containerized/path/to/data or
  • +
  • bindmount:/bourreau/path/to/data:/containerized/path/to/data:ro
  • +
+

+ You can add comments, indicated with a hash symbol #. + For example, file:/a/b/atlas.squashfs # brain atlas + container_exec_args_html: | + This field can contain singularity exec command options. Please use appropriate quotation or escaping + For example, --cleanenv --env MYPATH='/My Documents'. + container_none: "None" + container_type_title: "Container type" + env_vars_note_top: "In the generated script, the values shown here will be placed in double quotes automatically." + env_vars_note_bottom: "Note: More environment variables lines can be added by saving and editing again." + prologue_explanation_html: | + This is a multi line partial BASH script. It can use the environment variables defined above + and do anything else you feel is needed to activate this configuration. + Note that this script should usually be silent, as outputing text (like in echo statements) + could interfere with the proper processing of the tasks output. + epilogue_explanation_html: | + This is a multi line partial BASH script, meant to match the prologue above. The code + here will be execute after the task's processing code. + Note that this script MUST be silent, as outputing text (like in echo statements) + could interfere with the proper processing of the tasks output. + legends: + merge: "Import and merge" + merge_explanation_both: | + The description, environment variables and prologue script will be appended to whatever + values are currently in the form. The project and suggested number of CPUs will be changed. + merge_explanation_env: | + The environment variables and prologue script will be appended to whatever + values are currently in the form. + merge_intro: "This panel allows you to merge another configuration into the current form." + merge_from: "Merge from..." + submits: + merge_preview: "Merge Configuration (Preview)" + save_everything: "Save everything!" + reload_original: "Reload original" + merge_note: | + You need to first click the Merge Configuration (Preview), carefully check the results, and only if + everything is ok click this or any other Update button, and the changed values will persist. + + tool_configs_table: + links: + tool_list: "Back to Tools List" + tool_config_count: + one: "1 tool configuration" + other: "%{count} tool configurations" + show_edit: "Show/Edit" + columns: + access: "Access?" + tool_name: "Tool Name" + execution_server: "Execution Server" + tool_project: "Tool Project" + version: "Version" + version_project: "Version Project" + cpus: "CPUs" + boutiques: "Boutiques" + container_index: "Container Index" + container_image: "Container Image" + description: "Description" + operations: "Operations" + + boutiques_descriptor: + title: "Boutiques Descriptor" + present_html: "This is the Boutiques Descriptor for tool %{tool} on Execution Server %{server}." + absent_html: "There is no Boutiques Descriptor for tool %{tool} on Execution Server %{server}." + + index: + title: "Tools and their versions" + + report: + title: "Access Summary" + all: + of_them: "all of them" + servers_or: "(All servers, or...)" + tools_or: "(All tools, or...)" + users_or: "(All users, or...)" + pick_best: "(Pick best)" + view_by: + server: "By Server" + tool: "By Tool" + user: "By User" + submit: "Get report!" + headings: + execution_server: "Execution Server" + tool: "Tool" + by: "Access Report, By %{type}" + access_by_user: "Tool Access Report, By User" + by_server_html: "By Execution Server(or %{link})" + by_tool_html: "By Tool (or %{link})" + quick_links: "Quick Links To Individual Access Reports" + by_user: "By User" + by_combination: "By a more specific combinations of resources" + + labels: + execution_server: "Execution Server:" + tool: "Tool:" + user: "User:" + view_by: "View By:" + + show: + title: + create: "Create Tool Version" + edit: "Edit Tool Version" + + important_note: "Important note:" + applies_to_tool_html: "This form applies to tool %{tool}" + applies_to_all_tools_html: "This form applies to ALL tools" + + running_on_all_servers_html: "running on ALL Execution Servers." + running_on_server_html: "running on Execution Server %{server}." + + common_config_tool: "Common Config for tool %{tool} on ALL Servers" + common_config_server: "Common Config for ALL tools on %{server} Server" + + bash_wrappers: + legend: "BASH scripts wrappers" + intro: "This section displays the full BASH initialization prologue and epilogue script for the configuration shown above." + surrounded: "It is surrounded by the BASH prologues or epilogues of other relevant global configurations." + order: "The commands are shown in the order of execution." + + log: + global_bourreau: "Log of Global Bourreau Tool Config #%{id}" + global_tool: "Log of Global Tool Config #%{id}" + specific: "Log of Specific Tool Config #%{id}" diff --git a/BrainPortal/config/locales/en/views/tools/tools.yml b/BrainPortal/config/locales/en/views/tools/tools.yml new file mode 100644 index 000000000..86aadc251 --- /dev/null +++ b/BrainPortal/config/locales/en/views/tools/tools.yml @@ -0,0 +1,111 @@ +en: + tools: + + form_fields: + titles: + cbrain_task_class_name: "PortalTask subclass which implements this tool." + headings: + general_info: "General info" + name: "Tool Name" + cbrain_task_class_name: "CbrainTask Class name" + last_updated: "Last Updated" + belongs_to: "Belongs to" + available_to_project: "Available to members of project" + category: "Category" + license_agreements: "License agreements" + description: "Description" + package_name: "Package name" + tool_type: "Tool type" + comma_separated_tags: "Comma separated tags" + url: "Tool URL" + select_menu_text: "Text for select box on the userfiles page" + cells: + created: "Created" + last_updated: "Last updated" + belongs_to: "Belongs to" + paragraphs: + license_agreements_html: | +

Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+ description_html: | +
The first line is a short summary, and the rest are for any special notes for the users.
+ labels: + common_config: "Common configuration this tool on all servers:" + versions_installed: "Versions installed on the following execution servers:" + links: + add_new: "Add new" + datas: + cpu_count: + one: "1 cpu" + other: "%{count} cpus" + no_versions_configured: "(No specific versions configured)." + versions_configured: + one: "1 version configured." + other: "%{count} versions configured." + version_config_name: "version configuration '%{name}'" + + tool_config_select: + include_blanks: + no_online_server: "No online server for this tool!" + select_server_version: "Select Server & Version" + labels: + server_version_html: + "Server & Version:" + submits: + launch: "Launch %{name}" + + tools_table: + links: + create_new_tool: "Create New Tool" + autoload_tools: "Autoload Tools" + access_reports: "Access Reports" + tool_versions_list: "Tool Versions List" + version_count: + one: "(1 version)" + other: "(%{count} versions)" + access: "Access?" + titles: + autoload_tools: "Registers all subclasses of PortalTask as Tools" + columns: + name: "Tool Name" + description: "Description" + category: "Category" + owner: "Owner" + group: "Project" + execution_versions: "Execution & Versions" + access: "Access?" + help: "Help" + info: "Info" + + edit: + title: "Tool Info" + titles: + log_title: "Tool Log" + + index: + title: "Tools" + + new: + title: "Add New Tool" + titles: + cbrain_task_class: "CbrainTask Class:" + headings: + main: "Add New Tool" + labels: + name: "Tool Name:" + cbrain_task_class: "CbrainTask Class:" + belongs_to: "Belongs to:" + group: "Available to members of project:" + category: "Category:" + license_agreements: "License agreements:" + description: "Description:" + package_name: "Package name:" + tool_type: "Tool type:" + application_tags: "Comma separated tags:" + url: "Tool URL:" + select_menu_text: "Text for select box on the userfiles page:" + paragraphs: + license_agreements_html: | +
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+ description_html: | +
The first line must should be a short summary, and the rest are for any special notes for the users.
+ submit: "Create new tool" diff --git a/BrainPortal/config/locales/en/views/userfiles/userfiles.yml b/BrainPortal/config/locales/en/views/userfiles/userfiles.yml new file mode 100644 index 000000000..b0d55f90f --- /dev/null +++ b/BrainPortal/config/locales/en/views/userfiles/userfiles.yml @@ -0,0 +1,275 @@ +en: + userfiles: + + common: + download: "Download" + copy: "Copy" + move: "Move" + rename: "Rename" + compress: "Compress" + uncompress: "Uncompress" + properties: "Properties" + synchronize: "Synchronize" + mark_newer: "Mark as newer" + upload: "Upload" + and_go: " (and go to next file)" + exception: "Exception:" + read_only: "Read Only" + read_write: "Read/Write" + read: "Read" + size_bytes: "%{size} bytes" + created_at: "Created at" + qc: "Quality Control" + + default_qc_panel: + not_synced: "This file must be synced locally to view QC data." + no_qc_data: "This file does not seem to contain any QC data, or no template is available to QC this file type." + + dialogs: + titles: + upload_sf: "Upload - Single file" + file_properties: "File properties" + new_collection: "New collection" + + blanks: + keep_current_parentheses: "(Keep current %{attribute})" + + placeholders: + dp: "A data provider..." + group: "A project..." + tags: "Some tags..." + file_type: "A file type..." + keep_current: "Keep current %{attribute}" + + labels: + extract: "Extract" + as_single_collection: "As a single collection" + as_multiple_files: "As multiple files" + advanced_options: "Advanced options..." + detect_as: "Detect as" + allow_modification: "Allow modification by other project members" + overwrite: "Overwrite existing file(s) with the same name" + clear_tags: "Clear tags" + hidden_html: "Hidden (H)" + locked_html: "Locked (I)" + + divs: + hidden_html: | + Hidden files are invisible by default, and are usually reserved for + maintenance, internal and archiving purposes. + locked: | + Locked files cannot be modified or moved across data providers. + + confirmations: + delete_file_html: "Are you sure you wish to delete these file(s)?" + delete_tag_html: "Are you sure you wish to delete the tag ?" + + actions: + proceed: "Proceed" + + new_collection: "NewCollection" + autodetect: "(autodetected)" + unknown_file_type: "Unknown file type!" + qc_note: "Note that quality control (QC) requires files to be synchronized locally first." + invalid: "Invalid!" + + file_menu: + static_actions: + launch: "Launch" + upload: "Upload" + show_only_my_files: "Show only my files" + show_all_files: "Show all files" + + dynamic_actions: + download: "Download" + copy: "Copy" + move: "Move" + rename: "Rename" + compress: "Compress" + uncompress: "Uncompress" + + menu_actions: + more: "More..." + custom_filters: "Custom filters" + new_collection: "New collection" + export_as_csv: "Export as CSV" + create_file_list: "Create a file list" + show_only_my_files: "Show only my files" + show_all_files: "Show all files" + hide_hidden_files: "Hide hidden files" + show_hidden_files: "Show hidden files" + list_view: "List view" + tree_view: "Tree view" + + filter_items: + new_filter: "New filter" + has_no_parent: "Has no parent" + has_no_children: "Has no children" + + quality_control_panel: + legends: + navigation_info: "Navigation info" + file_tags: "File tags" + file_description: "File description" + + submit: + previous_file: "Previous File" + next_file: "Next File" + pass : "Pass" + fail: "Fail" + + error_messages: + qc_error: "There was an error generating the QC panel for this file. Please talk to the developers." + + full_list_of_tags: "Full list of tags:" + + resource_usage: + section: + disk_space_history: "Disk Space History" + headings: + space_delta: "Space Delta" + + syncstatus: + last_synchronized_date: "Last Synchronized Date:" + last_accessed_date: "Last Accessed Date:" + transfer_started: "Transfer Started:" + state_occurred: "State Occurred:" + + tags_table: + placeholders: + group: "A project..." + + tools_interface: + titles: + toolsDialog: "Select Tool" + + headings: + no_tools_admin: "No tools available. New tools may be registered from the Tools index." + no_tools_others: "No tools available. Contact your admin to have them registered." + + labels: + all_tools: "All tools" + software_package: "Software Package:" + + links: + tool_website: "Tool Website" + + userfiles_display: + entry: + one: "1 entry" + other: "%{count} entries" + own_files_only: "(own files only)" + show_total: + hidden: "hidden" + archived: "archived" + locked: "locked" + columns: + type_icon: "Type Icon" + filename: "Filename" + file_type: "File Type" + owner: "Owner" + creation_date: "Creation Date" + size: "Size" + project_access: "Project Access" + tags: "Tags" + group: "Project" + description: "Description" + data_provider: "Provider" + + search_by_name: "Search by name:" + was_html: "(was: %{size} in %{file_count})" + + index: + title: "Files" + legends: + sync_symbols: "Synchronization symbols:" + + quality_control: + title: "Quality Control" + links: + finished: "Finished" + buttons: + one_panel: "1 panel" + loading_message: + loading_panel: "Loading panel..." + + show: + title: "File Info" + titles: + file_log: "File Log" + + links: + download_collection: "Download Collection" + download_file: "Download File" + + error_messages: + suggested_type: "This file appears to be a %{type}." + update: "%{name} could not be updated." + viewer: "An error occurred when loading the viewer plugin." + + headings: + provider_full_path: "Local Data Provider (cache) path" + project_permission: "Project permission on file" + + cells: + zenodo_publication: "Zenodo Publication" + parent: "Parent" + children: "Children" + provider_full_path: "Remote Data Provider path" + modified_at: "Modified at" + immutable_file: "Immutable file" + hidden_file: "Hidden file" + + zenodo_publication: + published: "Published: %{link}" + in_progress: "In progress: %{link}" + + legends: + content: "Content" + + content: + archived: "This %{type} has been archived." + viewers_disabled: "Content viewers are disabled until the file is unarchived." + cannot_view: "(This file cannot be viewed by you; I wonder how you got here.)" + non_viewable_dp_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is marked as non-viewable) + not_syncable_dp_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is configured to not allow synchronizationat all) + corrupted_html: | + + (The content of this file seems to be corrupted. This might be the result + of a bad data transfer while it was being created or a filesystem failure. + There isn't much you can do about this, although if the file was produced + by a task, consider restarting the task's Post Processing stage.) + + sync_not_allowed_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is configured to not allow synchronization to this Portal) + offline_dp_html: | + (This data is not currently synchronized and its Data Provider + %{dp_link} + is offline, so its content is not viewable for the moment) + sync_in_progress: "(This data file is currently being synchronized. Wait a few seconds for this to complete)" + sync_start_html: | + (This data file is not currently synchronized. Click + %{link} + to start the synchronization process. + This may allow you to view displayable content.) + sync_start_collection_html: | + (This data file is not currently synchronized. Click + %{link} + to start the synchronization process. + This may allow you to view displayable content and extract files from this collection.) + no_viewer_code_html: | + (The contents of this file cannot be viewed: no viewer code available at this moment + for files of type '%{type}') + change_view: "Change view:" + + was_html: "Was:
%{size} in %{file_count}" + cached: "Cached:" + here: "here" diff --git a/BrainPortal/config/locales/en/views/users/users.yml b/BrainPortal/config/locales/en/views/users/users.yml new file mode 100644 index 000000000..658e9693c --- /dev/null +++ b/BrainPortal/config/locales/en/views/users/users.yml @@ -0,0 +1,214 @@ +en: + users: + + common: + select_site: "(Select a site)" + used: "%{size} used" + unkn: "%{count} unkn" + + users_table: + links: + create_user: "Create User" + active_count: "%{count} active" + locked_count: "%{count} locked" + access: "Access" + columns: + login: "Login" + full_name: "Full Name" + email: "E-mail" + position: "Position" + affiliation: "Affiliation" + last_connection: "Last Connection" + groups: "Projects" + role: "Role" + site: "Site" + city: "City" + country: "Country" + timezone: "Time Zone" + files: "Files" + tasks: "Tasks" + switch: "Switch" + access: "Access" + user_count: + one: "1 user" + other: "%{count} users" + unlocked: "Unlocked" + locked: "Locked" + label_of: "%{label} (of %{base})" + last_connection: "Last Connection" + project_count: + one: "1 project" + other: "%{count} projects" + role: "Role" + access: "Access" + access_q: "Access?" + + change_password: + title: "Change Password" + headings: + main: "Change Password" + message: "Password could not be updated." + labels: + new_password: "New password:" + confirm_new_password: "Confirm new password:" + force_password_reset: "User WILL need to reset own password:" + + index: + title: "Users" + + new: + title: "Add New User" + headings: + main: "Add New User" + basic_information: "Basic Information" + access_profile: "Access Profile" + project_membership: "Project Membership" + labels: + full_name: "Full Name" + login: "Login" + email: "Email" + position: "Position" + affiliation: "Affiliation" + city: "City" + country: "Country" + time_zone: "Time Zone" + type: "Type" + site: "Site" + pref_data_provider_id: "Default Data Provider" + allowed_globus_provider_names: "Forced OpenID Identity Providers" + password: "Password" + confirm_password: "Confirm Password" + no_password_reset: "No need to reset initial password:" + paragraphs: + login_html: | + For Tom Jones, use tjones, not 'tom' or 'jones'. + dp_html: | + If set, make sure it is a Data Provider that will be accessible to the user + openid_html: | + + If set, must be exact OpenID identity provider names separated by commas + A single '*' is also allowed to mean any provider name. + + submit: "Create User" + + new_token: + title: "New API Token" + headings: + main: "New API Token" + titles: + notes: "A few notes about this token" + copy_tooltip: "Click this button to copy the API token to the clipboard" + paragraphs: + generated_intro: "We have just generated a new API token for you." + token_html: | + If you are a developer and want to automate working + with CBRAIN or NeuroHub, this token will be needed + to access the APIs. +

+ Refer to the CBRAIN API documentation + for more information. +

+ labels: + copy: "copy" + li: + validity: "This token will only be valid for %{duration}." + renewal: "Every time a request is made with it, it becomes valid for another %{duration}." + ip_lock_html: "The first time it is used, the IP address of the connecting client will be
recorded and only connections from that IP address will be valid." + ip_invalid_html: "If a subsequent connection comes from any other IP address at any time,
the token will immediately be invalidated." + copy_html: "To copy the token to your clipboard, simply click the copy button located to the right of the token. The token will be saved to your clipboard.
Please do not forget to paste and save the token. You will not be able to see it again." + + request_password: + title: "Lost Password?" + headings: + main: "Lost password? Fill this form, we'll contact you." + labels: + login: "CBRAIN login:" + email: "E-mail address on your CBRAIN account:" + submit: "Submit" + + show: + title: "Account Info" + titles: + user_activity_report: "User activity report" + links: + tool_access_reports: "Tool Access Reports" + switch_to_user: "Switch To User" + report_maker: "Report Maker" + change_password: "Change Password" + generate_api_token: "Generate new API token" + unlink_identity: "Unlink this %{name} identity" + link_identity: "Link a %{name} identity" + neurohub_interface: "NeuroHub interface" + prompts: + select_site: "(Select a site)" + cells: + last_connected: "Last Connected" + never: "(Never)" + public_key: "Public Key" + provider: "%{name} Provider" + orcid_identity: "ORCID Identity" + active_sessions: "Active Sessions" + files: "Files" + tasks: "Tasks" + data_providers: "Data Providers" + historical_storage: "Historical Storage" + historical_cpu_time: "Historical CPU Time" + tools: "Tools" + portal: "Portal" + execution: "Execution" + installation_sites: "Installation Sites" + headings: + message: "User could not be updated." + pref_data_provider_id: "Default Data Provider" + pref_bourreau_id: "Default Execution Server" + account_locked: "Account Locked" + ip_whitelist: "Source IP Whitelist" + allowed_globus_provider_names: "Forced OpenID Providers" + ssh_key: "Your System SSH Key" + sessions_tokens: "Sessions And Tokens" + zenodo_publishing: "Zenodo Publishing" + zenodo_sandbox_token: "Zenodo Sandbox Token" + zenodo_official_token: "Zenodo Official Token" + license_agreements: "License Agreements" + linked_identities: "Linked Identities" + provider_name: "Provider name:" + provider_user: "Provider user:" + ip: "IP" + last_access: "Last access" + resources: "Resources" + access_profiles: "Access Profiles" + groups: "Projects" + project_name: "Project Name" + project_type: "Project Type" + members: "Members" + paragraphs: + ip_whitelist_html: | +

+ Comma-separated list of allowed source IPs (X.X.X.X/XX) for the user to connect from. +
+ allowed_globus_provider_names_html: | +
+ If set, must be a list of OpenID identity provider names separated by commas. A single '*' is + also allowed to mean any provider name. +
+ zenodo_sandbox_token_html: | +
+ This token can be used for creating temporary/test Zenodo data deposits.

+ You can create a token at https://sandbox.zenodo.org/account/settings/applications/. +

+ zenodo_main_token_html: | +
+ This token can be used for creating real, official and permanent Zenodo data deposits.

+ You can create a token at https://zenodo.org/account/settings/applications/. +

+ datas: + last_pushed: "Last pushed: %{date}" + push: "Push:" + no_ip_yet: "(None yet)" + confirms: + unlink: "Are you sure you want to unlink your account with this %{name} identity?" + no_identity: "(No %{name} identity linked to your account)" + orcid_id: "ORCID ID:" + no_orcid: "(No ORCID identity linked to your account)" + orcid_note_html: "Note: Use the %{link} to manage the ORCID identity link" + submit: "Update Projects" diff --git a/BrainPortal/config/locales/fr.yml b/BrainPortal/config/locales/fr.yml new file mode 100644 index 000000000..8e6c0dd0f --- /dev/null +++ b/BrainPortal/config/locales/fr.yml @@ -0,0 +1,76 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +fr: + activerecord: + attributes: + id: "Identifiant" + created_at: "Créé le" + updated_at: "Mis à jour le" + name: "Nom" + description: "Description" + type: "Type" + status: "Statut" + user_id: &user "Utilisateur" + user: *user + group_id: &group "Groupe" + group: *group + active_record_log: + ar_id: &ar_id "ID ActiveRecord" + ar_table_name: &ar_table_name "Nom de la table ActiveRecord" + cbrain_task: + cluster_jobid: "ID du job sur le cluster" + cluster_workdir: "Dossier de travail sur le cluster" + share_wd_tid: "Dossier de travail partagé avec la tâche" + cluster_workdir_size: "Taille du dossier de travail sur le cluster" + workdir_archive_userfile_id: "Archive du dossier de travail" + data_provider: + remote_dir: "Dossier distant" + meta_data_store: + ar_id: *ar_id + ar_table_name: *ar_table_name + meta_key: "Clé de métadonnée" + meta_value: "Valeur de métadonnée" + remote_resource: + ssh_control_rails_dir: "Dossier racine Rails" + dp_cache_dir: "Dossier de cache du fournisseur de données" + dp_ignore_patterns: &ignore_patterns "Motifs de fichiers à ignorer" + spaced_dp_ignore_patterns: *ignore_patterns + cms_extra_qsub_args: "Options qsub supplémentaires" + cms_shared_dir: "Dossier partagé CMS" + workers_chk_time: "Intervalle de vérification des workers" + rr_timeout: "Délai d'expiration de la ressource distante" + tool_config: + env_array: "Tableau de variables d'environnement" + ncpus: "Nombre de processeurs (CPU)" + tool: + select_menu_text: "Texte de la liste déroulante" + userfile: + num_files: "Nombre de fichiers dans la collection" + user: + email: "Adresse e-mail" + signup: + first: "Prénom" + last: "Nom" + will_paginate: + previous_label: "← Précédent" + next_label: "Suivant →" + diff --git a/BrainPortal/config/locales/fr/cbrain_mailer/cbrain_mailer.yml b/BrainPortal/config/locales/fr/cbrain_mailer/cbrain_mailer.yml new file mode 100644 index 000000000..3d710db48 --- /dev/null +++ b/BrainPortal/config/locales/fr/cbrain_mailer/cbrain_mailer.yml @@ -0,0 +1,10 @@ +fr: + cbrain_mailer: + + forgotten_password: + + registration_confirmation: + + signup_notify_admin: + + signup_request_confirmation: diff --git a/BrainPortal/config/locales/fr/defaults/common.yml b/BrainPortal/config/locales/fr/defaults/common.yml new file mode 100644 index 000000000..8258f2f7a --- /dev/null +++ b/BrainPortal/config/locales/fr/defaults/common.yml @@ -0,0 +1,65 @@ +fr: + ago_time: "depuis %{time}" + + unknown: "Inconnu" + unset: "(Non défini)" + yes: "Oui" + offline: "Hors ligne" + none: "Aucun" + show: "Afficher" + edit: "Modifier" + help: "Aide" + browse: "Parcourir" + cancel: "Annuler" + switch: "Changer" + clear: "Effacer" + refresh: "Rafraîchir" + + delete: "Supprimer" + deleted: "Supprimé" + + save: "Enregistrer" + saved: "Enregistré" + + create: "Créer" + created: "Créé" + + update: "Mettre à jour" + updated: "Mis à jour" + last_updated: "Dernière mise à jour" + + active_users: "Utilisateurs actifs" + locked_users: "Utilisateurs verrouillés" + + search_by_name: "Rechercher par nom:" + confirm_delete: "Êtes-vous sûr de vouloir supprimer %{name}?" + + dataset: + one: "Jeu de données" + other: "Jeux de données" + + agree: "J'accepte" + + clear_options: + month: "Il y a un mois" + week: "Il y a une semaine" + day: "Il y a un jour" + hour: "Il y a une heure" + now: "Maintenant! (Y compris la vôtre!)" + + login: "Connexion" + owner: "Propriétaire" + version: + one: "Version" + other: "Versions" + tool_version: "Version de l'outil" + + parameters: + one: "Paramètre" + other: "Paramètres" + summary: "Résumé" + + status: "Statut:" + + time_zone: "Fuseau horaire" + all: "Tous" diff --git a/BrainPortal/config/locales/fr/models/access_profile.yml b/BrainPortal/config/locales/fr/models/access_profile.yml new file mode 100644 index 000000000..f01b6e567 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/access_profile.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + models: + access_profile: + one: "Profil d'accès" + other: "Profils d'accès" + + diff --git a/BrainPortal/config/locales/fr/models/background_activity.yml b/BrainPortal/config/locales/fr/models/background_activity.yml new file mode 100644 index 000000000..effbdb993 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/background_activity.yml @@ -0,0 +1,6 @@ +fr: + activerecord: + models: + background_activity: + one: "" + other: "" diff --git a/BrainPortal/config/locales/fr/models/cbrain_task.yml b/BrainPortal/config/locales/fr/models/cbrain_task.yml new file mode 100644 index 000000000..06da0a4c8 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/cbrain_task.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + models: + cbrain_task: + one: "Tâche" + other: "Tâches" + + diff --git a/BrainPortal/config/locales/fr/models/common.yml b/BrainPortal/config/locales/fr/models/common.yml new file mode 100644 index 000000000..109764d56 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/common.yml @@ -0,0 +1,13 @@ +fr: + activerecord: + attributes: + category: "Catégorie" + city: "Ville" + country: "Pays" + yearmonth: "Année/Mois" + name: "Nom" + description: "Description" + status: "Statut" + type: "Type" + size: "Taille" + color: "Couleur" diff --git a/BrainPortal/config/locales/fr/models/data_provider.yml b/BrainPortal/config/locales/fr/models/data_provider.yml new file mode 100644 index 000000000..f8f271d5c --- /dev/null +++ b/BrainPortal/config/locales/fr/models/data_provider.yml @@ -0,0 +1,21 @@ +fr: + activerecord: + models: + data_provider: + one: "Fournisseur de données" + other: "Fournisseurs de données" + attributes: + data_provider: + name: "" + description: "" + type: "" + remote_host: "" + alternate_host: "" + remote_user: "" + remote_port: "" + remote_dir: "" + containerized_path: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + datalad_repository_url: "" + datalad_relative_path: "" diff --git a/BrainPortal/config/locales/fr/models/exception.yml b/BrainPortal/config/locales/fr/models/exception.yml new file mode 100644 index 000000000..a6bb6ed86 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/exception.yml @@ -0,0 +1,6 @@ +fr: + activerecord: + models: + exception: + one: "Exception" + other: "Exceptions" diff --git a/BrainPortal/config/locales/fr/models/group.yml b/BrainPortal/config/locales/fr/models/group.yml new file mode 100644 index 000000000..ccd307883 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/group.yml @@ -0,0 +1,6 @@ +fr: + activerecord: + models: + group: + one: "Projet" + other: "Projets" diff --git a/BrainPortal/config/locales/fr/models/message.yml b/BrainPortal/config/locales/fr/models/message.yml new file mode 100644 index 000000000..83fa89e52 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/message.yml @@ -0,0 +1,7 @@ +fr: + activerecord: + models: + message: + one: "Message" + other: "Messages" + diff --git a/BrainPortal/config/locales/fr/models/remote_resource.yml b/BrainPortal/config/locales/fr/models/remote_resource.yml new file mode 100644 index 000000000..cd2579e9a --- /dev/null +++ b/BrainPortal/config/locales/fr/models/remote_resource.yml @@ -0,0 +1,11 @@ +fr: + activerecord: + models: + remote_resource: + one: "Serveur" + other: "Serveurs" + portal: "Portail" + execution: "Exécution" + execution_server: "Serveur d'exécution" + + diff --git a/BrainPortal/config/locales/fr/models/site.yml b/BrainPortal/config/locales/fr/models/site.yml new file mode 100644 index 000000000..22f3d1df4 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/site.yml @@ -0,0 +1,7 @@ +fr: + activerecord: + models: + site: + one: "Site" + other: "Sites" + diff --git a/BrainPortal/config/locales/fr/models/tag.yml b/BrainPortal/config/locales/fr/models/tag.yml new file mode 100644 index 000000000..9364aa668 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/tag.yml @@ -0,0 +1,6 @@ +fr: + activerecord: + models: + tag: + one: "Label" + other: "Labels" diff --git a/BrainPortal/config/locales/fr/models/tool.yml b/BrainPortal/config/locales/fr/models/tool.yml new file mode 100644 index 000000000..2fb08eb81 --- /dev/null +++ b/BrainPortal/config/locales/fr/models/tool.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + models: + tool: + one: "Outil" + other: "Outils" + + diff --git a/BrainPortal/config/locales/fr/models/user.yml b/BrainPortal/config/locales/fr/models/user.yml new file mode 100644 index 000000000..a855a88de --- /dev/null +++ b/BrainPortal/config/locales/fr/models/user.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + models: + user: + one: "Utilisateur" + other: "Utilisateurs" + + diff --git a/BrainPortal/config/locales/fr/models/userfile.yml b/BrainPortal/config/locales/fr/models/userfile.yml new file mode 100644 index 000000000..4aa7a43fe --- /dev/null +++ b/BrainPortal/config/locales/fr/models/userfile.yml @@ -0,0 +1,11 @@ +fr: + activerecord: + models: + userfile: + one: "Fichier" + other: "Fichiers" + file: + one: "Fichier" + other: "Fichiers" + + diff --git a/BrainPortal/config/locales/fr/views/access_profiles/access_profiles.yml b/BrainPortal/config/locales/fr/views/access_profiles/access_profiles.yml new file mode 100644 index 000000000..f8b493bb7 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/access_profiles/access_profiles.yml @@ -0,0 +1,42 @@ +fr: + access_profiles: + + access_profiles_table: + links: + create_profile: "" + columns: + name: "" + color: "" + description: "" + projects: "" + + white: "" + + index: + title: "" + + show: + titles: + add_new_access_profile: "" + access_profile: "" + access_profile_log: "" + + error_messages: + saved: "" + cells: + name: "" + color: "" + + headings: + with_this_profile: "" + project_membership: "" + projects_in_this_profile: "" + + explanations: + css_html: "" + private: "" + change: "" + + user_types: + normal: "" + locked: "" diff --git a/BrainPortal/config/locales/fr/views/background_activities/background_activities.yml b/BrainPortal/config/locales/fr/views/background_activities/background_activities.yml new file mode 100644 index 000000000..dd27167dd --- /dev/null +++ b/BrainPortal/config/locales/fr/views/background_activities/background_activities.yml @@ -0,0 +1,220 @@ +fr: + + background_activities: + + common: + dynamic_items_list: "" + + background_activity_table: + toggles: + about: "" + + submits: + cancel_activities: "" + suspend_activities: "" + unsuspend_activities: "" + destroy_activities: "" + activate_now: "" + retry_failed: "" + + confirms: + cancel: "" + suspend: "" + unsuspend: "" + destroy: "" + activate: "" + retry: "" + + links: + create_scheduled: "" + hide_scheduled: "" + refresh_list: "" + show: "" + + legends: + about: "" + + paragraphs: + about_general_top_html: | +

+ This page shows "background activities" as progress bars. Each + activity applies a single operation to a set of things (usually, + files or tasks). These activities are often the result of clicking + on buttons in other pages, when you get a message that something + was started in background. Activities that are in progress + are shown with glowing borders. Individual operations within an + activity can succeed or fail. Sometimes, the failure is not + significant (e.g. trying to compress a file that is already + compressed). +

+ You can cancel activities, but remember that cancelled activities + can never be restarted. You will have to redo whatever operation + created the activity. +

+ Older, finished "background activities" are generally cleaned + up after one week and will disappear from this list. + about_admin_html: | +

+ As an admin, you can create maintenance activities that can be + scheduled for later. See the accompanying form for more help. You + can also suspend activities; these are resumable. You can suspend + activities that are in progress, or scheduled in the future. + about_general_bottom_html: | +

+ The progress bars in this page are not live, so + you need to click the Refresh button to get an update + on the progress of your activities. + + columns: + user: "" + server: "" + status: "" + activity_type: "" + scheduled_at: "" + repeat: "" + retries: "" + last_update: "" + progress: "" + show: "" + + labels: + type_filter: "" + + scheduled_at: + in_time: "" + overdue_by: "" + retries: + allowed: + one: "" + other: "" + next: + one: "" + other: "" + + on_word: "" + + items_count: + one: "" + other: "" + + tooltips: + messages: "" + + RubyRunner: + legends: + ruby_code: "" + + index: + title: "" + + new: + title: "" + headings: + main: "" + errors: + activity: "" + + labels: + repeat: "" + remove_task_workdirs: "" + file_custom_filter: "" + task_custom_filter: "" + clean_cache: "" + last_accessed: "" + belonging_users: "" + not_users: "" + of_type: "" + not_type: "" + erase_bacs: "" + finished_older: "" + verify_dp: "" + fake_activity: "" + min_seconds: "" + max_seconds: "" + num_oks: "" + num_fails: "" + num_excs: "" + ruby_runner: "" + prepare: "" + before: "" + process_html: "" + after: "" + server: "" + start_date: "" + start_now_html: "" + move: "" + copy: "" + archive_task_workdirs: "" + compress: "" + uncompress: "" + + + selects: + data_provider: "" + filter: "" + dps: "" + + paragraphs: + remember_file_filter_html: | + This activity type is only for experienced CBRAIN system developers + who understands the BackgroundActivity framework. + move_crush: "" + filter_intro: "" + for_files_html: "" + for_tasks_html: "" + move_to: "" + remember_task_filter_html: "" + archive_blank_note: "" + ruby_runner_intro_html: "" + process_explanation: | + Consider adding a short description of what your RubyRunner code does + on the very first line of comment; this will be shown as a description + of the BackgroundActivity within the index page. + + repeat_options: + prompt: "" + one_shot: "" + every_30min: "" + every_hour: "" + every_12h: "" + every_24h: "" + tomorrow: "" + monday: "" + tuesday: "" + wednesday: "" + thursday: "" + friday: "" + saturday: "" + sunday: "" + + legends: + filter: "" + or_word: "" + files: "" + + repeat_at_html: "" + + days_ago: "" + system_dps: "" + user_dps: "" + submit: "" + + show: + headings: + main: "" + cells: + type: "" + status: "" + user: "" + execution_server: "" + total_items: "" + num_successes: "" + num_processed: "" + num_failures: "" + legends: + items: "" + all_of_them: "" + none_question: "" + none: "" + none_yet: "" + diff --git a/BrainPortal/config/locales/fr/views/bourreaux/bourreaux.yml b/BrainPortal/config/locales/fr/views/bourreaux/bourreaux.yml new file mode 100644 index 000000000..03b90c1cd --- /dev/null +++ b/BrainPortal/config/locales/fr/views/bourreaux/bourreaux.yml @@ -0,0 +1,607 @@ +fr: + + bourreaux: + + common: + cache_trust_expire_select: + never: "" + six_hours: "" + twelve_hours: "" + one_day: "" + three_days: "" + one_week: "" + two_weeks: "" + one_month: "" + two_months: "" + three_months: "" + six_months: "" + workers_instances_select: + none: "" + workers_chk_time_select: + five_seconds: "" + ten_seconds: "" + thirty_seconds: "" + one_minute: "" + two_minutes: "" + five_minutes: "" + fifteen_minutes: "" + one_hour: "" + workers_log_to_select: + combined_file: "" + separate_files: "" + rails_log: "" + rails_stdout: "" + rails_stderr: "" + rails_stdout_and_stderr: "" + no_logging: "" + workers_verbose_select: + normal: "" + debug_info: "" + + bourreaux_display: + columns: + server_type: "" + server_name: "" + live_revision: "" + owner: "" + project: "" + time_zone: "" + online: "" + tasks: "" + tasks_space: "" + cache_space: + all: "" + own: "" + description: "" + status_page_url: "" + tools: "" + control_tunnel: "" + uptime: "" + task_workers: "" + activity_workers: "" + + unk: + env: "" + par: "" + + status: + open: "" + dead: "" + down: "" + since_for: "" + + task_workers: + workers: "" + workers_processing: "" + + activity_workers: + workers: "" + workers_processing: "" + + links: + create_new_server: "" + user_access_report: "" + disk_cache_report: "" + task_workdir_size_report: "" + access_to_data_providers: "" + + buttons: + start: + tunnels: "" + execution_server: "" + task_workers: "" + activity_workers: "" + stop: + activity_workers: "" + task_workers: "" + execution_server: "" + tunnels: "" + + dropdowns: + start_services: "" + stop_services: "" + + confirms: + stop: + activity_workers: "" + task_workers: "" + bourreau: "" + tunnels: "" + + + # Start services panel + start_services: + paragraphs: + introduction_html: | +

+ These buttons start the different layers of services required to + boot an Execution Server. They are listed in the same order as they + need to be started. The first three buttons + only apply to Execution Servers, while Start Activity Workers + applies to both Execution Servers and Portals. +

+

+ Refer the the last four columns of the table to find out what service + are currently operational. The four buttons in this pannel map + to them in the same order. +

+

+ Also note that your browser blocks while these requests are being processed; + be patient and check your browser's progress bar. Do not perform long operations + on multiple Execution Servers to avoid timeouts. +

+ tunnel_html: | +

+ The tunnel is the main communication channel between the Portal + and the remote server where the Execution Server is configured. It is + necessary for the Execution Server and the Task Workers. Starting the + tunnel will mark the Execution Server as "" in the database. + Note that you can also start the tunnel with the "" + button. Consider starting just the tunnel as a way to verify that the network + parameters are valid (e.g. to check hostnames, ports, firewalls, etc). +

+ execution_server_html: | +

+ The Execution Server requires the tunnel, above. Note that as convenience + feature, if the tunnel is not started, starting the Execution Server will also + start the tunnel first. +

+ start_task_workers_description_html: | +

+ Task workers require a Tunnel and the Execution Server to be up. +

+ start_activity_workers_description_html: | +

+ Activity workers are the only service that can be started or stopped + on Portals too. On portals the workers don't require any of the other layers + above. On Execution Servers these workers require both the Tunnel and the + Execution Server to be running. +

+ + stop_services: + processing_in_orange_text: "" + processing: "" + not_safe: "" + paragraphs: + stop_services_description_html: | +

+ These buttons stop the different layers of services associated with + an Execution Server. They are listed in the same order as they + need to be stopped. The last three buttons + only apply to Execution Servers, while Stop Activity Workers + applies to both Execution Servers and Portals. +

+

+ Refer the the last four columns of the table to find out what service + are currently operational. The four buttons in this pannel map + to them in reverse order (right to left). +

+

+ Note that stopping the Workers (any type) is an action that asks + them to shut down gracefully. If they are processing something, they will finish it + first. The last two columns of the table indicate if they are currently busy + with the word %{html_colorize_text}. + In some cases it can take a long time for the workers to stop. Refreshing this + page will tell you when they are stopped, but remember that the page's content + is normally only updated once every 30 seconds. +

+

+ Also note that your browser blocks while these requests are being processed; + be patient and check your browser's progress bar. Do not perform long operations + on multiple Execution Servers to avoid timeouts. +

+ stop_activity_workers_description_html: | +

+ Activity Workers can run on both Portals and Execution Servers. Stopping them + will send them a signal to finish their current processing actions and then exit. +

+ stop_task_workers_description_html: | +

+ Stopping Task Workers will send them a signal to finish what they are doing + and then exit. This can take some time. +

+ stop_execution_server_description_html: | +

+ Stopping an Execution Server will also stop the Task Workers and Activity Workers running on it. + Make sure they are not actively %{processing} something. +

+ stop_tunnels_description_html: +

+ Remember that is it %{not_safe} to stop Tunnels if + any of the Workers are currently %{processing} something. +

+ + load_info: + delay: + instant: "" + superb: "" + good: "" + mediocre: "" + bad: "" + awful: "" + number_of: + active_tasks: "" + queued_tasks: "" + running_tasks: "" + last_wait_time: "" + queue_info: "" + more_info: "" + + notes: + show_configuration_notes: "" + hide_configuration_notes: "" + notesbody_html: | +
+ +

Some Notes About Configuring A Execution Server

+ + An Execution Server is a remote Rails application that is used by the + BrainPortal. Like all Rails applications, it runs on some host + somewhere, it listens to HTTP connections on some port and needs + to connect to the same database server as the BrainPortal. + +

+ + Unlike the BrainPortal, the HTTP connections it expects are not + from a user's browser, but they are XML requests issued by the + BrainPortal using a Rails protocol called ActiveResource. There + are several ways that the BrainPortal can be told how to connect to + and manage the Execution Server, which explains all the fields in this form. + +

+ + runtime_info: + headings: + runtime_information: "" + cells: + rails_environment: "" + rails_revision: "" + disk_code_revision: "" + rails_server_uptime: "" + process: + start: + revision: "" + last_change_author: "" + last_change_revision: "" + last_change_date: "" + remote_host: + name: "" + ip_address: "" + os_type: "" + uptime: "" + worker_pids: "" + number_of_tasks_running: "" + workers_last_change_author: "" + cluster_management_system_type: "" + workers_last_change_revision: "" + cluster_management_system_revision: "" + workers_last_change_date: "" + ssh_public_key: "" + server_status: + down: "" + server_status: "" + rails_server_uptime: + up_since: "" + for: "" + + index: + title: "" + + new: + title: "" + + headings: + main: "" + + divs: + name_html: | +
+ Important note: this name must also be changed accordingly in the config file + Bourreau/config/initializers/config_bourreau.rb + for this server to restart properly later on. +
+ system_from_email_html: | +
+ If set, messages sent automatically by this system will contain this return address. +
+ description_html: | +
+ The first line should be a short summary, and the rest are for any special notes for the users. +
+ dp_cache_dir_html: | +
Warning! Changing this field will result in resetting the synchronization + status of all files from all Data Providers! Also, the Rails app will have to + be restarted, and all files in that directory will be erased!
+ spaced_dp_ignore_patterns_html: | +
+ Separate several patterns with spaces; each pattern can contain single '*'s, but no '/'s or special characters. +
+ cache_trust_expire_html: | +
+ This means that in the execution server's cache, files that have been recorded + as 'InSync' but were last accessed more than this amount of time will be considered untrustworthy + and will be re-synchronized the next time they are accessed. Set this to a value less than N + if the cluster's file policy, for instance, deletes all scratch files older than N days. +
+ cms_shared_dir_html: | +
+ Mandatory. This directory must be visible and writable from all nodes. + This is were the work subdirectories for all tasks will be created. +
+ cms_default_queue_html: | +
+ Optional. +
+ cms_extra_qsub_args_html: | +
+ Optional. Careful, this is inserted as-is in the command-line for submitting jobs. +
+ workers_verbose_html: | +
+ This option has no effect if the logs are sent to the RAILS log. +
+ + labels: + system_from_email: "" + owner: "" + group: "" + status: "" + rr_timeout: "" + time_zone: "" + ssh_control_host: "" + ssh_control_user: "" + ssh_control_port: "" + ssh_control_rails_dir: "" + jump_host: "" + jump_user: "" + jump_port: "" + spaced_dp_ignore_patterns: "" + dp_cache_dir: "" + cms_class: "" + cms_shared_dir: "" + cms_default_queue: "" + cms_extra_qsub_args: "" + cache_trust_expire: "" + workers_instances: "" + workers_chk_time: "" + workers_log_to: "" + workers_verbose: "" + + status: + online: "" + offline: "" + prompt: "" + + titles: + time_zone: "" + + legends: + ssh_remote_control_configuration: "" + optional_ssh_jump_host_configuration: "" + cache_management_configuration: "" + tool_version_configuration: "" + cluster_management_system_configuration: "" + task_workers_configuration: "" + task_limits: "" + + tool_version_configuration_explanation: "" + task_limits_explanation: "" + + cms_class_select: + unconfigured: "" + scir_sge: "" + scir_pbs: "" + scir_moab: "" + scir_sharcnet: "" + scir_lsf: "" + scir_slurm: "" + scir_gcloud_batch: "" + scir_unix: "" + + + submit: "" + + rr_access_dp: + title: "" + headings: + main: "" + + paragraphs: + rr_access_explanation_html: | +

+ This page shows which Servers (rows) can access which Data Providers (columns). +

+

+ If you want to launch tasks on a particular Execution Server, make sure they are + configured to access files on Data Providers marked by green circles ( %{o_icon} ). +

+

+ Data Provider identified below their name with %{not_syncable} + indicate their files can still be accessed through streaming APIs, but can never be fully + synchronized on any server. +

+

+ Cells marked with %{no_access} + indicate servers that are not allowed to access files on the Data Provider + at all, in any way (streaming or synchronized), even if the Data Provider seems alive. +

+ headings: + servers: "" + data_providers: "" + name: "" + type: "" + last_checked: "" + links: + refresh_all: "" + status: + offline: "" + not_syncable: "" + read_only: "" + no_access: "" + alive: "" + down: "" + legends: + data_provider_status: "" + data_providers_offline: "" + note_html: | + Note: Clicking on Refresh triggers a background process on the server + that will poll each Data Provider; this can take several minutes to complete. + + rr_access: + title: "" + headings: + main: "" + legends: + accessible: "" + not_accessible: "" + + rr_disk_usage: + title: "" + titles: + server_log: "" + headings: + main: "" + no_entries: "" + filter: "" + entry: + one: "" + other: "" + file: + one: "" + other: "" + entries_and_files_html: "" + unknown_count: + one: "" + other: "" + active_task: + one: "" + other: "" + all_on: "" + submits: + cleanup_selected: "" + of_type: "" + none_means_any_html: "" + last_accessed: "" + submit: "" + + show: + titles: + portal: "" + execution_server: "" + + links: + task_stats_by_status: "" + task_stats_by_type: "" + no_tool_config: "" + + headings: + cache_expiration: "" + workers_instances: "" + workers_chk_time: "" + workers_log_to: "" + workers_verbose: "" + message_update_error: "" + external_status_page_url: "" + base_portal_url: "" + user_manual_url: "" + neurohub_base_url: "" + small_logo: "" + large_logo: "" + large_upload_url: "" + upload_size_limit: "" + mail_configuration: "" + support_email: "" + system_from_email: "" + nh_support_email: "" + nh_system_from_email: "" + error_notifications: "" + ssh_connection_config: "" + ssh_hostname: "" + rails_server_directory: "" + ssh_user: "" + ssh_port: "" + local_control_port: "" + ssh_jumphost: "" + jumphost_hostname: "" + jumphost_user: "" + jumphost_port: "" + reverse_service_config: "" + use_reverse_service: "" + reverse_service_hostname: "" + reverse_service_port: "" + reverse_service_user: "" + reverse_service_db_socket: "" + reverse_service_ssh_agent: "" + activity_workers_config: "" + activity_workers_number: "" + cache_management: "" + path_to_dp_caches: "" + ignore_patterns: "" + dp_options: "" + persistent_ssh_masters: "" + cluster_config: "" + type_of_cluster: "" + default_queue_name: "" + extra_qsub_args: "" + path_shared_work_dir: "" + task_workers_config: "" + number_of_workers: "" + container_config: "" + docker_executable_name: "" + singularity_executable_name: "" + + cells: + status: "" + owner: "" + unset: "" + group: "" + revision_info_client: "" + common_config_all_tasks: "" + + field_explanations: + description: "" + system_from_email: "" + cms_shared_dir_html: "" + cms_default_queue: "" + cms_extra_qsub_args: "" + dp_cache_warning: "" + ignore_patterns: "" + name_note_bourreau_html: "" + name_note_portal_html: "" + license_agreements: "" + external_status_page: "" + user_manual_url: "" + base_portal_url_html: "" + neurohub_base_url_html: "" + large_upload_url: "" + upload_size_limit: "" + support_email_html: "" + nh_support_email_html: "" + nh_system_from_email: "" + activity_workers_explanation_html: "" + cache_expiration_html: "" + cms_extra_qsub_args: "" + docker_executable_name: "" + singularity_executable_name: "" + + all_admins: "" + + paragraphs: + reverse_service_description_html: "" + reverse_service_defaults_html: "" + persistent_ssh_explanation: "" + + default_value: "" + + unknown_check_config: "" + activity_workers_number_select: + none: "" + recommended_bourreaux: "" + recommended_portals: "" + like_right_now: "" + options: + always: "" + never: "" + unconfigured: "" + content: + not_configured: "" diff --git a/BrainPortal/config/locales/fr/views/cbrain_mailer/cbrain_mailer.yml b/BrainPortal/config/locales/fr/views/cbrain_mailer/cbrain_mailer.yml new file mode 100644 index 000000000..b58f468e3 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/cbrain_mailer/cbrain_mailer.yml @@ -0,0 +1,35 @@ +fr: + + cbrain_mailer: + + common: + closing: "" + admins: "" + thank_you: "" + access_service: "" + + + forgotten_password: + greeting: "" + password_reset: "" + temporary_notice: "" + + registration_confirmation: + welcome: "" + account_set_up: "" + username: "" + temporary_password: "" + password_change_notice: "" + + signup_notify_admin: + someone_asking: "" + none_provided: "" + comments_intro: "" + review_application: "" + system_signature: "" + + signup_request_confirmation: + automated_message: "" + confirm_email: "" + disregard: "" + once_confirmed: "" diff --git a/BrainPortal/config/locales/fr/views/custom_filters/custom_filters.yml b/BrainPortal/config/locales/fr/views/custom_filters/custom_filters.yml new file mode 100644 index 000000000..dea2ae162 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/custom_filters/custom_filters.yml @@ -0,0 +1,119 @@ +fr: + + custom_filters: + + common: + filtering_by_date: "" + archiving_status: "" + owners: "" + dont_filter_description: "" + + match_type: + match: "" + match_exactly: "" + contain: "" + begin: "" + end: "" + + archiving: + dont_filter: "" + archived: "" + not_archived: "" + on_cluster: "" + as_file: "" + + userfile: + filename: "" + dont_filter_name: "" + parent_name_contains: "" + lists_children: "" + child_name_contains: "" + lists_parents: "" + dont_filter_size: "" + synchronization_status: "" + + task: + work_directory_status: "" + wd_status: + dont_filter: "" + shared: "" + not_shared: "" + exists: "" + none: "" + + custom_filter_li: + links: + edit_delete: "" + + custom_filter_list: + headings: + by_custom_filter: "" + links: + create_custom_filter: "" + + new_task_custom_filter: + by: + task_types: "" + status: "" + description: "" + owners: "" + projects: "" + execution_servers: "" + filtering_by_date: "" + archiving_status: "" + work_directory_status: "" + + new_userfile_custom_filter: + by: + filename: "" + parent_name_contains_html: "" + child_name_contains_html: "" + file_types: "" + filtering_by_date: "" + size: "" + owners: "" + projects: "" + data_providers: "" + archiving_status: "" + synchronization_status: "" + tags: "" + + new: + headings: + main: "" + labels: + filter_name: "" + errors: + custom_filter: "" + submit: "" + + task_custom_filter: + headings: + types: "" + status: "" + description: "" + owners: "" + projects: "" + execution_servers: "" + archiving_status: "" + work_directory_status: "" + filtering_by_date: "" + + userfile_custom_filter: + headings: + filename: "" + parent_name_contains_html: "" + child_name_contains_html: "" + by_file_types: "" + size: "" + owner: "" + projects: "" + data_providers: "" + archiving_status: "" + synchronization_status: "" + tags: "" + filtering_by_date: "" + + show: + errors: + update: "" diff --git a/BrainPortal/config/locales/fr/views/data_providers/data_providers.yml b/BrainPortal/config/locales/fr/views/data_providers/data_providers.yml new file mode 100644 index 000000000..f133e8957 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/data_providers/data_providers.yml @@ -0,0 +1,613 @@ +fr: + data_providers: + + common: + no_word: "" + portal_ssh_key_title: "" + labels: + mode: "" + syncability: "" + syncability: + fully_syncable: "" + not_syncable: "" + mode: + read_only: "" + read_write: "" + create_new_dp: "" + field_explanation: + description: "" + description: "" + name: "" + remote_dir: "" + cloud_config: "" + containerized_config: "" + physical_data_location: "" + other_properties: "" + ssh_params: "" + any_users: "" + unknown_key: "" + + data_providers_table: + links: + create_system_dp: "" + create_personal_dp: "" + check_all: "" + user_access_report: "" + transfer_restrictions_report: "" + disk_usage_report: "" + disk_quotas: "" + legends: + official_storage: "" + user_site_storage: "" + + delete_button: + buttons: + delete_files: "" + paragraphs: + explanation_html: | +

+ This panel allows you to delete permanently files that + are present on the remote Data Provider. Note that this operation will + work whether or not the files are registered. If they are registered, + they will be unregistered first. +

+ submit: "" + + dp_browse_table: + headings: + main: "" + browsing_as_html: "" + links: + registered: "" + register_files_as: "" + and_directories_as: "" + unacceptable: "" + belongs_to_html: "" + registered_with_owner_html: "" + columns: + name: "" + changedir: "" + size: "" + type: "" + last_modified: "" + registered: "" + note: "" + + dp_report_table: + columns: + type: "" + issue: "" + severity: "" + action: "" + file: "" + user: "" + labels: + of_count: "" + + dp_show_path: + top: "" + browse_path: "" + + dp_types_explained: + content_html: | + This document describes the different types of Data Providers + implemented in CBRAIN. Not all of them are useful. In production + environments, the recommended type is the EnCbrainSmartDataProvider + for official data storage and FlatDirSshDataProvider for user-specific + personal storage. + +

+ Many provider types come in three variations: + +

+
Local
+
TypeLocalDataProviders + store their information on the local file system where the CBRAIN service + resides; as such it means that the files will not be accessible from + other remote components of the CBRAIN installation, for instance + Execution Servers located on other hosts or supercomputers. Their + advantage is that they are fast to access, and the CBRAIN portal will + not have to make a local copy of any of the files to work on them + or visualize them. +
+ +
Ssh
+
TypeSshDataProviders + store their information on file system located on a remote UNIX machine + accessible using a SSH account; a file's content is fetched and cached using + SFTP or the rsync command and copied locally whenever any + component of CBRAIN (including the portal) need to access it. +
+ +
Smart
+
TypeSmartDataProviders + are intelligent in that they will act as either a Local or + Ssh variant of the same type. The choice is made by + each CBRAIN component (Portal, Execution server) independently. Each + component compares the hostname where it runs to the Remote Hostname + configured for the DataProvider; if they match, the Smart + DataProvider will act as a Local one, bypassing any form + of caching. If they don't match, it will act as a Ssh one, + therefore transferring files and caching them as needed. +
+
+ +
+ + The rest of this document describes the different types available, which + differ in what kind of file structure they use to store the + files of the users. + + FlatDir*DataProvider: + The provider's files are stored in a flat directory, one + level deep, directly specified by the object's Remote Directory + attribute. The file "hello" is this stored in a path like this: +
    /remote_dir/hello
+ Note that for historical reasons, the SshDataProvider + is a synonym for FlatDirSshDataProvider. + +

+ + EnCbrain*DataProvider: The + files are stored in a path uniquely determined by + the file's ID. A file named "hello" with ID 41233 will be stored + like this: +

    /root_dir/04/12/33/hello
+ Such data providers have the advantage that files can be renamed and + reassigned to new owners with minimal modifications on the filesystem's + structure. The EnCbrain*DataProviders are the officially recommended + data providers for production deployment. The data directory where + files are stored are not meant to be accessed and modified by + external means, that means no users are supposed to access + the files directly in there. +

+ + Vault*DataProvider: + The provider's files are stored in a flat directory, two levels + deep, directly specified by the object's Remote Directory + attribute and the user's login name. The file "hello" + of user "myuser" is thus stored into a path like this: +

    /remote_dir/myuser/hello
+ On such data providers, it is not possible to reassign ownership + of a file. +

+ + IncomingVault*DataProvider: This class behaves like the + VaultSshDataProvider, except that it is browsable. When browsing, only + the subdirectory named like the login name of the current user will + be visible. It is perfect for accessing + a jailed Remote Directory for incoming content, where users + can upload files to these subdirectories on other channels. A typical + setup would also use the Remote Directory as the root for + an incoming SFTP or FTP server (this is in fact the reason why this + type of provider is named like this). +

+ + S3DataProvider: This class connects to Amazon's S3 + cloud storage service. The files will be stored in a bucket named + "gbrain_{name}" where name is the name of the Data Provider. + Usage of this Data Provider requires obtaining an access key + and secret token. Do not rename this Data Provider if files + are registered with it, unless you also rename the bucket! All + FileCollections are uploaded and downloaded as .tar.gz files, so + this DP is not particularly efficient for large datasets. + +

+ + S3FlatDataProvider: This is a class that connects to + Amazon's S3 cloud storage service using the new AWS SDK for S3 Version 3.0. + A Bucket and a Starting Path must be specified that have already been created + through AWS. Usage of this Data Provider also requires obtaining an access key + and secret token for Amazon Web Services. For more information, please visit + https://aws.amazon.com for more details. + File will stored as objects in the S3Object store and the data provider mainly + acts like a FlatDataProvider. + +

+ + SingSquashfsDataProvider This class connects to a set of + one or several squashfs files (all named with .squashfs extensions) through + a Singularity container handler. The requirements are:
+

    +
  • that all the squashfs files are in the Physical Data Location, +
  • the Singularity image is also there and named %{singularity_image}, +
  • that this image contains a basic Linux system with at least rsync installed in it, +
  • and that the path to the data root inside the container must be provided in the Containerized Data Path under the Containerized Storage Configuration section. +
+ Note that this DP is already 'smart' in that if the Remote Host + configured for it matches the current host, it will not perform its + data operation through a SSH master. + + one_data_provider_table: + messages: + loading: "" + links: + check: "" + report: "" + browse: "" + columns: + name: "" + type: "" + owner: "" + group: "" + site: "" + time_zone: "" + online: "" + alive: "" + inconsistency: "" + files: "" + mode: "" + syncability: "" + description: "" + browse: "" + inconsistency: "" + + register_button: + paragraphs: + register_html: | +

+ This panel allows you to register files that are present on + the remote Data Provider, but not yet known by the CBRAIN + interface. Once registered, a file will be visible in + the Files manager, and can be used for launching + tasks. +

+ +

+ We recommend that you use this Data Provider only to + transfer data in and out of CBRAIN. When registering files, + as you can see below, you can have them automatically moved + or copied to another official CBRAIN Data Provider. + must_move_html: | + In fact, this particular Data Provider leaves you no choice + and you MUST select another Data Provider where your files will be copied or moved. + cleanup_html: | + Once files are copied to another official Data Provider, we recommend you + clean up the files here using the Delete Files panel, further right. +

+ headings: + when_registering: "" + datas: + assign_project: "" + move_or_copy: "" + to: "" + move_option: "" + copy_option: "" + do_nothing: "" + tool_tips: + info: "" + include_blanks: + select_project: "" + select_another_dp: "" + notes: + title_html: "" + start: "" + no_modify: "" + copy_progress_html: "" + copy_done_html: "" + move_done: "" + ignored: "" + button: "" + submit: "" + + show_user_key: + headings: + instructions: "" + your_key: "" + paragraphs: + ssh_configuration_html: | + + no_security_risk: | + + errors: + fetching: "" + links: + download: "" + + unregister_button: + button: "" + paragraphs: + unregister_html: | +

+ This panel allows you to unregister files that are present on + the remote Data Provider and have already been registered by + the CBRAIN interface. Once unregistered, a file will be no longer + be visible in the Files manager, but will still be left + on the disk at the remote site. It will be your responsibility + to delete the data manually if you have an external access + to the remote files, or you can use the Delete Files + panel, further right. +

+ submit: "" + + view_option_button: + button: "" + browse_as_another_user: "" + + browse: + title: "" + links: + refresh_list: "" + + dp_access: + title: "" + headings: + main: "" + legends: + accessible: "" + not_accessible: "" + + dp_transfers: + title: "" + headings: + main: "" + destination_dp: "" + source_dp: "" + paragraphs: + intro_html: | +

+ This table shows which file transfers are allowed between Data Providers. Each cell of the table has two symbols, where %{ok} means allowed and %{no} means not allowed. Transfers will succeed if both symbols show up as %{ok} %{ok}. +

+

+ The first symbol indicates restrictions for transferring files between Data Provider pairs, independently of the states of any other resources. The restrictions are not necessarily symmetrical: it's possible to configure Data Providers A and B such that transfers from A → B are allowed (%{ok}) while transfers from B → A are not (%{no}). +

+

+ The second symbol takes into account three other factors: +

    +
  • whether or not Data Providers are online or offline;
  • +
  • whether or not Data Providers are read/write or read only;
  • +
  • whether or not the current Portal has itself access to each Data Provider.
  • +
+ In such cases, Data Providers will be annotated with %{offline}, %{read_only} and/or %{no_access}. If all three properties allow the file transfers, the second symbol will be %{ok}; otherwise it will be %{no}. +

+ access: + offline: "" + read_only: "" + no_access: "" + legends: + title: "" + allowed: "" + not_allowed: "" + + index: + title: "" + + new_personal: + title: "" + headings: + main: "" + field_explanation: + name: "" + group_html: "" + labels: + name: "" + description: "" + group: "" + remote_host: "" + remote_user: "" + remote_port: "" + remote_dir: "" + cloud_storage_endpoint: "" + cloud_storage_region: "" + cloud_storage_client_bucket_name: "" + cloud_storage_client_path_start: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + titles: + name: "" + description: "" + group: "" + remote_host: "" + remote_user: "" + remote_port: "" + remote_dir: "" + cloud_storage_endpoint: "" + cloud_storage_region: "" + cloud_storage_client_bucket_name: "" + cloud_storage_client_path_start: "" + cloud_storage_bucket: "" + cloud_storage_path_start: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + ssh_tab: "" + s3_tab: "" + paragraphs: + name: | +
The first line should be a short summary, and the rest are for any special notes for the users.
+ description: | +
This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '<%= current_user.own_group.name %>'.
+ group: | +
This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '<%= current_user.own_group.name %>'.
+ before_ssh_dp: | + Use this type: + ssh_dp: | +

+ + A SSH Data Provider connects to a UNIX server using SSH and + transfers files back and forth using the 'rsync' command and sometimes + other basic commands such as "mkdir", in a non-interactive mode. For this + to work, you'll need to make sure that: + +

+ +

    +
  • The user account on the remote host has a 'clean shell'.
    + That means when login non-interactively, no messages + are printed on stdout or stderr.
    + For more information, ask your sysadmin about this. +
  • You've installed a SSH key in that account; see the panel at the bottom of this form. +
  • The remote host is not behind a firewall or a two-Factor authentication mechanism. +
+ +

+ s3_dp: | +

+ + Provide the necessary information to connect to a S3-Compatible bucket. + +

+ + legends: + ssh_params: "" + s3_params: "" + + submit: "" + + new: + title: "" + headings: + main: "" + supertitle: "" + titles: + name: "" + description: "" + time_zone: "" + type: "" + owner: "" + group: "" + online: "" + read_only: "" + not_syncable: "" + remote_host: "" + alternate_host: "" + remote_user: "" + remote_port: "" + remote_dir: "" + containerized_path: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + cloud_storage_client_bucket_name: "" + cloud_storage_client_path_start: "" + cloud_storage_endpoint: "" + cloud_storage_region: "" + datalad_repository_url: "" + datalad_relative_path: "" + labels: + sincability: "" + name: "" + description: "" + time_zone: "" + type: "" + status: "" + mode: "" + owner: "" + group: "" + online: "" + read_only: "" + syncable: "" + remote_host: "" + alternate_host: "" + remote_user: "" + remote_port: "" + remote_dir: "" + containerized_path: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + cloud_storage_client_bucket_name: "" + cloud_storage_client_path_start: "" + cloud_storage_endpoint: "" + cloud_storage_region: "" + datalad_repository_url: "" + datalad_relative_path: "" + meta_must_move: "" + meta_browse_gid: "" + meta_no_uploads: "" + meta_no_viewers: "" + legends: + ssh_params: "" + datalad_config: "" + other_properties: "" + cloud_storage_config: "" + datas: + unknown_key: "" + field_explanations: + description: "" + cloud_storage_client_bucket_name: "" + type_info_toggle: "" + select_provider_type: "" + portal_key_note: "" + submit: "" + + report: + title: "" + headings: + main: "" + links: + reload_report: "" + submit: "" + + show: + title: "" + titles: + log: "" + links: + inconsistency_report: "" + file_registration_statistics: "" + test_configuration: "" + confirms: + delete: "" + cells: + group: "" + read_only: "" + read_write: "" + not_syncable: "" + fully_syncable: "" + revision_info_dp: "" + revision_info_type_html: "" + headings: + update_error: "" + mode: "" + group: "" + physical_data_location: "" + cannot_sync_html: "" + datalad_config: "" + client_path_start: "" + endpoint: "" + region: "" + datalad_url: "" + datalad_path: "" + no_uploads: "" + no_viewers: "" + must_move: "" + copy_move_targets: "" + browse_gid: "" + accessed_by_servers: "" + ssh_params: "" + alternate_host: "" + containerized_storage_config: "" + containerized_data_path: "" + cloud_storage_config: "" + cloud_storage_client_identifier: "" + cloud_storage_client_token: "" + client_bucket_name: "" + datalad_relative_path: "" + other_properties: "" + official_storage_html: "" + user_site_storage_html: "" + portals_html: "" + execution_servers_html: "" + public_ssh_key_note: "" + field_explanations: + license_agreements: "" + alternate_host: "" + include_blanks: + any_users: "" + datas: + portal_key_note: "" + unknown_key: "" diff --git a/BrainPortal/config/locales/fr/views/exception_logs/exception_logs.yml b/BrainPortal/config/locales/fr/views/exception_logs/exception_logs.yml new file mode 100644 index 000000000..497943a4c --- /dev/null +++ b/BrainPortal/config/locales/fr/views/exception_logs/exception_logs.yml @@ -0,0 +1,50 @@ +fr: + exception_logs: + + index: + title: "" + + exception_logs_table: + submit: + delete_checked: "" + delete_name: "" + + message_count: + one: "" + other: "" + + columns: + exception: "" + message: "" + controller: "" + action: "" + user: "" + revision: "" + raised_at: "" + + show: + title: "" + + submit: + delete_message: "" + + headings: + request: "" + session: "" + headers: "" + + cells: + raised_at: "" + url: "" + method: "" + parameters: "" + format: "" + user: "" + start_time_revision: "" + + legends: + backtrace: "" + + exception_message: "" + not_signed_in: "" + diff --git a/BrainPortal/config/locales/fr/views/groups/groups.yml b/BrainPortal/config/locales/fr/views/groups/groups.yml new file mode 100644 index 000000000..fd96b1cae --- /dev/null +++ b/BrainPortal/config/locales/fr/views/groups/groups.yml @@ -0,0 +1,201 @@ +fr: + groups: + + common: + creator: "Creator" + select_site: "" + + groups_table: + links: + create_project: "" + large_buttons: "" + small_buttons: "" + project_count: + one: "" + other: "" + buttons: + switch_to_list_view: "" + switch_to_button_view: "" + + + users_form: + active_users: "" + locked_users: "" + labels: + quick_select_work: "" + quick_select_site: "" + + view_buttons: + paragraphs: + description_html: | +

+ A project is a way to group together under single name a set + of CBRAIN files and tasks. A project is not a folder. + Switching to a project makes it the 'active' project. When a + project is active, an automatic implicit filter will be applied + such that only files and tasks assigned to the project are shown + in the file or task manager. +
+ my_private_projects_html: | +

+ These projects are visible only to you. There is one particular + project named %{name} that is created + by the system for you, by default, and cannot be deleted. Any of + these projects can be turned into a Shared Project by inviting other + users to join. When this happens, the projects will appear in a separate tab. +

+ my_shared_projects_html: | +

+ These are projects that you created and are shared with other users. + Files and tasks assigned to a project are visible to all users of that project. +

+ projects_shared_with_me_html: | +

+ These are projects created by other users who have invited you to join them. + Files and tasks assigned to a project are visible to all users of that project. +

+ public_projects_html: | +

+ These are Public projects. All files and tasks assigned to them are visible to all users! +

+ site_projects_html: | +

+ These are Site projects. They can be used to share files and tasks among the set of users + belonging to the associated Site. +

+ admin_only_html: | +

Admin only

+ special_all_project_html: | +

+ This special ALL Project is in fact no + project at all. Selecting this as your currently active + 'project' will disable all project-based filtering, so + you will see together all files and tasks. + The file manager and task manager will each show you a new + column where you'll be able to filter by project directly + there. Selecting the ALL Project is useful + when you need to manage or browse files and tasks that are + in multiple projects. +

+ other_projects_html: | +

Projects that for some reason are not assigned to other tabs

+ tabs: + my_private_projects: "" + my_shared_projects: "" + projects_shared_with_me: "" + public_projects: "" + site_projects: "" + other_users_system_projects: "" + other_users_private_projects: "" + other_projects: "" + + view_buttons_tab: + headings: + all: "" + spans: + files: "" + tasks: "" + creator: "" + user_count: + one: "" + other: "" + + view_list: + row_contents: + represents_all_projects: "" + all_projects: "" + columns: + name: "" + description: "" + type: "" + site: "" + creator: "" + users: "" + files: "" + tasks: "" + switch: "" + links: + switch: "" + + index: + title: "" + + new: + title: "" + headings: + main: "" + labels: + name: "" + description: "" + site: "" + paragraphs: + description_html: | +
The first line should be a short summary, and the rest are for details.
+ invisible_html: | +

+ Make this a system group invisible to normal users: + track_usage_html: | +

+ Turn on usage tracking for files in this project: + not_assignable_html: | +

+ Normal members will not be able to assign files or other resources + to this project (but editors are always allowed to do so): + public_html: | +

+ Make the project public, so that all users can access the files. Be careful with this option! You can always make the project public later on: + prompts: + site: "" + submit: "" + + show: + title: "" + titles: + project_log: "" + links: + leave_project: "" + invite: "" + remove: "" + headings: + message_1: "" + message_2: "" + message_3: "" + creator: "" + resources: "" + members: "" + pending_invitations: "" + cells: + type: "" + invisible: "" + userfiles: "" + tasks: "" + tools: "" + data_providers: "" + execution: "" + members: "" + track_usage: "" + paragraphs: + creator_html: | +

Warning: If you change the maintainer to someone else you won't be able to edit this project any more
+ description_html: | +
The first line should be a short summary, and the rest are for details.
+ not_assignable_html: | +
+ If checked, normal members will not be able to assign files or other + resources to this project (but editors are always allowed to do so). +
+ public_html: | +
+ If checked, a public project makes all its files visible to all the users. Be careful + with this option! +
+ invisible_html: | +
+ If checked, the project will not be shown in the list of projects. +
+ track_usage_html: | +
+ If checked, the system will track overall usage of files in this project + (views, downloads etc) per month. +
+ diff --git a/BrainPortal/config/locales/fr/views/help_documents/help_documents.yml b/BrainPortal/config/locales/fr/views/help_documents/help_documents.yml new file mode 100644 index 000000000..cc5f48300 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/help_documents/help_documents.yml @@ -0,0 +1,15 @@ +fr: + help_documents: + + show: + buttons: + show: "" + edit: "" + save: "" + remove: "" + saving: "" + removing: "" + description_html: | + There is no documentation on this topic right now.
+ Add some by using the edit button in the top left corner. + diff --git a/BrainPortal/config/locales/fr/views/invitations/invitations.yml b/BrainPortal/config/locales/fr/views/invitations/invitations.yml new file mode 100644 index 000000000..23b0b2e66 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/invitations/invitations.yml @@ -0,0 +1,6 @@ +fr: + invitations: + + new: + send_invitations: "Envoyer des invitations" + no_users_available: "Aucun utilisateur n'est disponible pour être invité." diff --git a/BrainPortal/config/locales/fr/views/layouts/layouts.yml b/BrainPortal/config/locales/fr/views/layouts/layouts.yml new file mode 100644 index 000000000..c56d00165 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/layouts/layouts.yml @@ -0,0 +1,56 @@ +fr: + layouts: + + common: + usage: "" + + section_account: + links: + dashboard: "" + my_account: "" + resource: "" + full_list: "" + help_site: "" + email_support: "" + sign_out: "" + sign_in: "" + + labels: + unread_message: + one: "" + other: "" + revision: "" + branch: "" + last_updated_html: "" + as: "" + + tooltips: + email_support_html: "" + + section_cookie_notif: + legend: "" + strong: "" + small_html: "" + unagree: "" + + section_footer: + powered_by: "" + credits: "" + + section_menu: + all: "" + quick_project_switcher: "" + + links: + default_private_project: "" + all_files_tasks: "" + full_project_list: "" + select_project: "" + profiles: "" + + placeholders: + search: "" + + labels: + signups: "" + ongoing: "" diff --git a/BrainPortal/config/locales/fr/views/messages/messages.yml b/BrainPortal/config/locales/fr/views/messages/messages.yml new file mode 100644 index 000000000..1350542db --- /dev/null +++ b/BrainPortal/config/locales/fr/views/messages/messages.yml @@ -0,0 +1,92 @@ +fr: + + messages: + + common: + mark_as_html: "" + updating: "" + deleting: "" + + labels: + system: "" + state_read: "" + state_unread: "" + expiry_date: "" + + time_ago: + ten_minutes: "" + one_hour: "" + one_day: "" + two_days: "" + one_week: "" + one_month: "" + two_months: "" + one_year: "" + + col: + sender: "" + recipient: "" + last_updated: "" + operations: "" + + message_count: + one: "" + other: "" + + message_details: + paragraphs: + expires: "" + no_details: "" + + message_display: + rescue: "" + + message_index_display: + links: + leave_message: "" + buttons: + delete_checked: "" + scopes: + unread_link: "" + read_link: "" + labels: + base: "" + columns: + criticality: + critical: "" + not_critical: "" + type: "" + message: "" + sender: "" + recipient: "" + last_updated: "" + operations: "" + + index: + title: "" + unread_count: + one: "" + other: "" + + new_dashboard: + title: "" + headings: + main: "" + labels: + dashboard: "" + explanations: + dashboard_html: | + For dashboard messages, whatever is entered here will be substituted literally + in the page's code. So you can use whatever HTML elements you want, but make sure + you know what you're doing. For NeuroHub, we recommend surrounding the entire text + with at least one <P> element. + + new: + title: "" + links: + new_cbrain_dashboard: "" + new_neurohub_dashboard: "" + to_users_of_project: "" + labels: + send_email: "" + diff --git a/BrainPortal/config/locales/fr/views/noc/noc.yml b/BrainPortal/config/locales/fr/views/noc/noc.yml new file mode 100644 index 000000000..317aab4ac --- /dev/null +++ b/BrainPortal/config/locales/fr/views/noc/noc.yml @@ -0,0 +1,38 @@ +fr: + noc: + + cpu: + title: "" + total_cpu: "" + + dashboard: + titles: + main: "" + subtitle: "" + headings: + users: "" + active_tasks: "" + active_transfers: "" + cpu_time: "" + files_deltas: "" + exceptions: "" + servers: "" + dp: "" + legends: + portal_suffix: "" + labels: + cache: "" + tasks: "" + offline: "" + + tools: + titles: + cpu: "" + count: "" + + users: + title: "" + spans: + new_from_country: "" + new_from_elsewhere: "" + cumulative: "" diff --git a/BrainPortal/config/locales/fr/views/portal/portal.yml b/BrainPortal/config/locales/fr/views/portal/portal.yml new file mode 100644 index 000000000..d8ea9a826 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/portal/portal.yml @@ -0,0 +1,374 @@ +fr: + portal: + + common: + name_description: "" + availability: "" + open: "" + restricted: "" + + logo_footer: + supported_by: "" + + about_us: + title: "" + header: "" + platform_revision: "" + last_author: "" + last_revision: "" + last_changed: "" + up_since_html: "" + plugins_revision_header: "" + plugins_package: "" + platform_info: "" + env_vars: "" + licensing_info: "" + credits_link_html: "" + credits: "" + github_contributors: "" + gnu_license: "" + gnu_desc_html: "" + other_licenses: "" + other_desc_html: "" + error_getting_license: "" + + available: + title: "" + note_html: "" + + credits: + title: "" + + headings: + citing: "" + project_info: "" + credits_box: "" + + paragraphs: + citing_html: | + Results published from data gathered or processed with a CBRAIN + installation should cite the following reference: + +

+ +

+ + Sherif T, Rioux P, Rousseau M-E, Kassis N, Beck N, Adalat R, Das S, Glatard T and Evans AC (2014)
+ CBRAIN: a web-based, distributed computing platform for collaborative neuroimaging research.
+ Front. Neuroinform. 8:54. doi: 10.3389/fninf.2014.00054 + +
+ project_info_html: | + This platform's origin and purpose is described further at the MCIN website (McGill Centre for Integrative Neuroscience).
+ + The code for the project is maintained and distributed on GitHub. + credits_box_html: | +
    +
  • Principal Investigator: Alan C. Evans, Montreal Neurological Institute, McGill University
  • +
  • Program Manager: Reza Adalat
  • +
  • Technology Managers: Shawn T. Brown, Marc Rousseau
  • +
  • System Architecture: Pierre Rioux, Tarek Sherif, Tristan Glatard
  • +
  • Lead Developers: Pierre Rioux, Tarek Sherif, Nicolas Kassis, Natacha Beck, Tristan Glatard, Andrew Doyle
  • +
  • Additional Developers: Angela McCloskey, Rémi Bernard, Tristan Aumentado-Armstrong, Anton Zoubarev, Mathieu Desrosiers, Ehsan Afkhami, Armin Taheri
  • +
  • Additional UX Design, Testing, Documentation: Najmeh Khalili-Mahani
  • +
  • IT Team: Alden Woodward, Chris Steele, Pamela Patterson, Pierre Rioux
  • +
  • Consultants: Samir Das, Penelope Kostopoulos, Pierre Bellec, Robert Vincent, Christine Rogers, Claude Lepage, Linsday Lewis, Carolina Makowski
  • +
  • Platform and licensing information: (Available here)
  • +
+ +

+ The CBRAIN team would like to thank all users of the original CBRAIN service + at McGill for their invaluable feedback and support. + + portal_log: + filters: + lines_to_show_html: "" + min_request_time_html: "" + filter: "" + by_user_html: "" + by_instance_html: "" + by_method_html: "" + by_controller_html: "" + + toggles: + hide_lines: "" + started_html: "" + processing_html: "" + parameters_html: "" + rendered_html: "" + redirected_html: "" + user_html: "" + completed_html: "" + sql_html: "" + load_html: "" + exists_html: "" + cache_html: "" + + provenance: + title: "" + + headings: + statement: "" + + paragraphs: + statement_html: | + New features and bug fixes are tested and released into the + development branch upon completion. Continuous integration testing + is performed in an automated fashion and is applied to all code + incorporated into the development repository. All pull requests + are reviewed and validated by the senior development team before + either being accepted or returned so as to undergo further + modification and testing by the submitting developer. + +

+ + Major releases are made so as amalgamate together collections of + bug fixes, patches and new features assessed as beneficial for + issuance as a cumulative, integrated release for community use. + Major releases are performed by the CBRAIN Lead Developer and + authorized together with the CBRAIN Team Director. + +

+ + Each release contains an associated set of release notes documentation + clearly identifying the new features and issues that are addressed + within a given release. + +

+ + Release Notes + are available in the CBRAIN GitHub repository. + +

+ + footer: + last_updated_html: "" + + report: + title: "" + + headings: + main: "" + + paragraphs: + steps_html: | +

+ This form allows you to generate many different kind of reports + in a tabular layout. Proceed as follow: +

+ +
    +
  • Select the type of report in the grey box. Most reports + will count the number of objects accessible to you, but some of them + will perform summation of some attributes. +
  • +
  • Click on "Lookup columns and rows" and the form will be adjusted + to show you which attributes you can select for the rows and columns of + your table. +
  • +
  • Select an attribute for the rows and columns using each of the selection + boxes shown at the top and left of the table area. +
  • +
  • Click on "Generate Report" and the table will be created with + hot links to the appropriate index pages for your objects. You can + modify the report's properties and regenerate it anew any time you want. +
  • +
+ + report_types: + select: "" + files_count: "" + files_sum: "" + files_total: "" + files_combined: "" + tasks_count: "" + tasks_sum: "" + tasks_combined: "" + servers_count: "" + dp_count: "" + users_count: "" + projects_count: "" + tools_count: "" + tv_count: "" + du_views: "" + du_downloads: "" + du_copies: "" + du_processed: "" + + actions: + lookup_btn: "" + refresh_btn: "" + flip_btn: "" + generate_btn: "" + + selectors: + select_row: "" + select_col: "" + + counters: + total: "" + entry: + one: "" + other: "" + file: + one: "" + other: "" + file_unk: + one: "" + other: "" + + empty_state: + no_objects_html: "" + no_objects_red: "" + waiting_html: "" + + notes: + optional_fix_html: "" + date_html: "" + + stats: + title: "" + + headings: + main: "" + by_client: "" + by_controller_html: "" + by_status: "" + + columns: + client_type: "" + successes: "" + failures: "" + controller: "" + action: "" + status_code: "" + count: "" + + footer: + last_reset: "" + + search: + title: "" + + placeholders: + search: "" + + explanations: + search: "" + + actions: + switch: "" + + results: + found: "" + registered_files: "" + + swagger: + title: "" + + content_html: | +
+ This page describes the CBRAIN API + +

+ For more information about the work in progress on the API, please look up the + API issues + on + CBRAIN's GitHub repository. + +

+ This specification's YAML or JSON files can be opened + at SwaggerHUB. + +

+ This will provide you a way to generate client code and inspect the same documentation + that is shown here. + In particular, this will allow you to generate client libraries in all sorts of + marvelous exotic languages, such as Python, Perl, Java, Swift and even Ruby. +

+ Here is a direct link to the developer's latest version on SwaggerHub. +

+ + welcome: + title: "" + + headings: + main: "" + news: "" + system_info: "" + sessions: "" + account_info: "" + tools_available_info_html: "" + latest_tasks: "" + latest_files: "" + + news: + posted_at: "" + + system_info: + instance_name_html: "" + unlock: "" + unlock_confirm: "" + lock_message: "" + lock: "" + lock_confirm: "" + online_users: "" + recent_activity: "" + active: "" + logged_out: "" + unknown_unknown: "" + unknown_browser: "" + unknown_os: "" + on_word: "" + with: "" + + sessions: + sessions_count: "" + clear_sessions: "" + clear_confirm: "" + + exceptions: + logged: "" + past_day: + one: "" + other: "" + past_three_days: + one: "" + other: "" + past_week: + one: "" + other: "" + total: + one: "" + other: "" + + account_info: + login_name: "" + full_name: "" + site_affiliation: "" + time_zone: "" + current_time: "" + + defaults: + projects: "" + provider: "" + server: "" + + latest_tasks: + active_count: "" + none_active: "" + + links: + system_info: + view_logs: "" + full_tools_list: "" + exceptions: + show: "" + + show_license: + error_fetching: "" + already_signed: "" + disagree: "" + + + diff --git a/BrainPortal/config/locales/fr/views/quotas/quotas.yml b/BrainPortal/config/locales/fr/views/quotas/quotas.yml new file mode 100644 index 000000000..d1915cbcc --- /dev/null +++ b/BrainPortal/config/locales/fr/views/quotas/quotas.yml @@ -0,0 +1,239 @@ +fr: + + quotas: + + common: + config_count: + one: "" + other: "" + status: + ok: "" + exceeded: "" + show_edit: "" + show_edit_label: "" + table: "" + situation: "" + quota_record: "" + confirm_delete_name: "" + + cpu_quotas_table: + links: + config_count: + one: "" + other: "" + default: + all_users_in_project: "" + all_users: "" + all_servers: "" + varies_by_server: "" + columns: + user: "" + project: "" + execution_server: "" + max_weekly_cpu: "" + max_monthly_cpu: "" + max_cpu_total: "" + max_active_tasks: "" + my_usage: "" + details: "" + operations: "" + + cpu_report: + title: "" + links: + back_to_cpu_quotas: "" + headings: + user: "" + execution_server: "" + situation: "" + details: "" + quota_record: "" + usage_week: "" + limit_week: "" + usage_month: "" + limit_month: "" + usage_all: "" + limit_all: "" + exceeded: + week: "" + month: "" + ever: "" + data: + table: "" + show_edit_cpu_quota: "" + + disk_quotas_table: + links: + config_count: + one: "" + other: "" + table: "" + show_edit: "" + show_edit_disk_quota: "" + columns: + user: "" + default_for_all_users: "" + data_provider: "" + max_size: "" + max_files: "" + my_usage: "" + details: "" + operations: "" + disk_usage_html: "" + + disk_report: + title: "" + links: + back_to_disk_quotas: "" + table: "" + show_edit_disk_quota: "" + headings: + user: "" + data_provider: "" + situation: "" + details: "" + quota_record: "" + size: "" + size_quota: "" + num_files: "" + num_files_quota: "" + labels: + user_quota: "" + dp_quota: "" + + show_cpu_quota: + titles: + create: "" + edit: "" + log: "" + links: + cpu_quotas_table: "" + new_cpu_quota: "" + headings: + record: "" + max_cpu_week: "" + max_cpu_month: "" + max_cpu_total: "" + max_active_tasks: "" + cells: + user: "" + project: "" + execution_server: "" + blanks: + any_project: "" + any_execution_server: "" + default_all_users: "" + divs: + user_html: | +
+ You can leave the user field blank and instead specify a project, below. + You can also leave them both blank. +
+ project_html: | +
+ Instead of specifying a user, above, you can select a project, and the quota + will apply to all users of that project. User and Project are mutually exclusive + in a CPU quota. You can also leave them both blank. +
+ execution_server_html: | +
+ You can leave this blank, but then you must provide either a user or a project, above. +
+ max_cpu_past_week_html: | +
+ The limit CPU time is in seconds; when entering a new value, + you can use a unit as a suffix, such as in + 3.5h (hours), 7d (days), 4w (weeks), + 3m (months) and 1y (years). + There are no suffixes for seconds and minutes. + A value of 0 means no time is allowed at all. +
+ max_cpu_past_month_html: | +
+ See the explanations for Max CPU time past week. +
+ max_cpu_ever_html: | +
+ See the explanations for Max CPU time past week. +
+ max_active_tasks_html: | +
+ The maximum number of tasks that can be active at any given time on the Execution Server. + Leave blank to not set a limit. A value of zero will prevent any tasks from being launched. + Note that projects are ignored for these values, and that if several quota records apply + to a user and differ only by project, the minimum value found in that set will be used. + The core Admin account is used to set a maximum number of tasks IN TOTAL for an Execution + server (thus, no limit specific to that admin user can be specified here). +
+ + show_disk_quota: + titles: + create: "" + edit: "" + log: "" + links: + disk_quotas_table: "" + new_disk_quota: "" + new_quota_same_provider: "" + new_quota_same_user: "" + headings: + record: "" + max_disk_space: "" + max_num_files: "" + columns: + user: "" + data_provider: "" + blanks: + default_all_users: "" + select_data_provider: "" + divs: + max_bytes_html: | +
+ Sizes are in bytes; when entering a new value, + you can use a unit as a suffix, such as in 2.3 kb and 10 G. + A value of 0 means no files allowed at all. +
+ max_files_html: | +
+ A value of 0 means no files allowed at all. +
+ + index: + title: "" + mode: + disk: "" + cpu: "" + about: "" + links: + exceeded_report: "" + new_entry: "" + to_disk: "" + to_cpu: "" + legends: + about_disk: "" + about_cpu: "" + paragraphs: + disk_quota_explanations_html: | +

+ This page shows the limits for the amount of disk space and number + of files that can be stored on each DataProvider. Each row is + a quota entry that applies to a user or all users, for a particular + DataProvider. When a user exceeds the one of the two limits for + a DataProvider, the user will no longer be able to create new + files. + cpu_quota_explanations_html: | +

+ This page shows the limits for the amount of CPU processing time + that a user can historically accumulate. There are three rolling + windows: for the CPU time accumulated over the past week, over + the past month, and over the entire lifetime of the user's account. +

+ Each row contains a quota entry with all three limits. Quotas + can apply to one or several Execution Servers, and can apply to + a single specific user, all users, or all the users of a particular + project. +

+ When a user has exceeded their quota on an Execution Server, their + tasks in status 'New' will not be set up, and they will stay in 'New' + until the quota window has moved ahead far enough to free some time. + diff --git a/BrainPortal/config/locales/fr/views/resource_usage/resource_usage.yml b/BrainPortal/config/locales/fr/views/resource_usage/resource_usage.yml new file mode 100644 index 000000000..98f332fa6 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/resource_usage/resource_usage.yml @@ -0,0 +1,84 @@ +fr: + resource_usage: + + common: + task_walltime: "" + task_cpu_time: "" + task_final_status: "" + + index: + title: "" + + resource_usage_table: + title: + file_deltas: "" + + buttons: + userfile_disk_space: "" + + legends: + table_description: "" + usage_summary: "" + additional_filtering: "" + + paragraphs: + description_intro_html: | +

+ This is a very wide report table. It contains + resource usage records for disk space and time consumed. + Feel free to hide columns using the + + menu at the right side of the main table header. + description_space_userfile_html: | + It displays the changes of the sizes of all the files, + existing as well as deleted. + description_cputime_html: | + It displays the CPU time accumulated by tasks. + description_walltime_html: | + It displays the wall time accumulated by tasks. + description_space_task_html: | + It displays the disk space in the work directory, + as well as the final status of past tasks. The disk space + is not guaranteed to be accurate, as this is an expensive resource to compute + and is only provided FYI. The real, main purpose of this report is to gather statistics about the + final status of tasks. + description_cached_html: | +

+ Columns labeled Cached record pieces of information + about resources as they were at the time the record was made. + If a resource was destroyed (e.g. a non-Cached column is empty), these stay behind + and provide filtering options. It makes it possible to gather statistics about + these deleted resources. + + labels: + only_deleted_items: "" + positive_size_delta: "" + negative_size_delta: "" + task_type: "" + + submits: + refresh_table: "" + + columns: + date: "" + disk_space: "" + time: "" + cached_owner_type: "" + cached_owner_login: "" + cached_project_type: "" + cached_project_name: "" + cached_server_name: "" + cached_userfile_type: "" + cached_userfile_name: "" + cached_provider_type: "" + cached_provider_name: "" + cached_task_type: "" + cached_task_status: "" + cached_tool_name: "" + cached_version: "" + + usage_record_count: + one: "" + other: "" + total: "" + average: "" + by_creation_date: "" diff --git a/BrainPortal/config/locales/fr/views/sessions/sessions.yml b/BrainPortal/config/locales/fr/views/sessions/sessions.yml new file mode 100644 index 000000000..2491628e6 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/sessions/sessions.yml @@ -0,0 +1,61 @@ +fr: + sessions: + + mandatory_oidc: + title: "" + headings: + before_message_html: "" + explanations: "" + allowed_providers: "" + + paragraphs: + explanations: | +

+ When you click on the button below, your browser will be redirected + to an identity provider login page; from there you can choose one of the + supported identity providers. This will in turn redirect you + to the provider's own login page. Once you've successfully authenticated + there, your browser will be redirected back here to finalize + the link with your CBRAIN account. +

+ no_provider: | +

+ No identity provider is currently available for your account. + Please contact the CBRAIN administrator for more information. +

+ already_logged_in: | +

+ If you already are logged in using a different identity provider, you + might want to log out first. This can be accomplished by the button below: +

+ + any_provider: "" + + links: + login_with: "" + logout_from: "" + + new: + title: "" + + divs: + only_available_html: | +
+ (Only available if you have already linked your
+ CBRAIN account to a %{name} identity) +
+ labels: + login: "" + password: "" + + submit: + sign_in: "" + + links: + forgot_password: "" + sign_in_with: "" + request_account: "" + full_list: "" + + or: "" + not_a_user: "" diff --git a/BrainPortal/config/locales/fr/views/shared/shared.yml b/BrainPortal/config/locales/fr/views/shared/shared.yml new file mode 100644 index 000000000..f6fc91169 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/shared/shared.yml @@ -0,0 +1,33 @@ +fr: + shared: + + common: + do_not_filter: "" + + active_filters: + active_filters: "" + + date_range_info: + from_to: "" + + dynamic_table: + no_records_found: "" + filter: "" + columns: "" + per_page: "" + + error_messages: + header_message: "" + message: "" + + group_tables: + labels: + work_groups: "" + invisible_groups: "" + + persistent_selection: + currently_selected: "" + select_all: "" + select_all_on_all_pages_tooltip: "" + clear_tooltip: "" + diff --git a/BrainPortal/config/locales/fr/views/signups/signups.yml b/BrainPortal/config/locales/fr/views/signups/signups.yml new file mode 100644 index 000000000..9fef3f1ce --- /dev/null +++ b/BrainPortal/config/locales/fr/views/signups/signups.yml @@ -0,0 +1,226 @@ +fr: + signups: + + common: + comment: "" + + result_action_one: + headings: + main: "" + + signups_table: + links: + new_request: "" + hide_hidden_records: "" + show_all_records: "" + latest_todo: "" + edit: "" + signup_request: + one: "" + other: "" + columns: + name: "" + edit: "" + email: "" + position: "" + department: "" + institution: "" + country: "" + username: "" + comments: "" + private_comments: "" + in_cbrain: "" + portal: "" + origin: "" + created: "" + approved_by: "" + status: "" + labels: + not_approved: "" + buttons: + adjust_login: "" + resend_confirm_email: "" + toggle_hidden: "" + tooltips: + updated_at: "" + delete_confirm: "" + + status: + approved_by: "" + approved_at: "" + email_confirmed: "" + warnings: + email_unconfirmed: "" + conflicting_email: "" + login_conflict: "" + links: + approve: "" + + confirm_button: + title: "" + headings: + main: "" + paragraphs: + main_html: | + Thank you for following the link from CBRAIN in your mailbox. +

+ To ensure you are indeed the owner of the email address that has + requested the creation of an account on CBRAIN, please complete the + final required step by clicking the button below. This will tell + the CBRAIN administrators that your request is legitimate and + official. +

+ links: + confirm_request: "" + + confirm: + title: "" + headings: + main: "" + paragraphs: + main_html: | + Thank you. You've confirmed your email address. +

+ Now it's up to the administrators to review your request + and you'll be notified if and when they approve it. +

+ propose_view_html: | + In the meantime you can %{look} at your request, or even %{edit} it. + have_a_look: "" + footer: | + (There is nothing else to do here, you might as well have a coffee and read the news) + + index: + title: "" + headings: + main: "" + + multi_action: + title: "" + headings: + main: "" + links: + go_back_html: "" + back_to_list: "" + + new: + title: "" + warnings: + mandatory_fields: "" + legends: + personal_info: "" + institution_info: "" + labels: + title: "" + first: "" + middle: "" + last: "" + login: "" + institution: "" + department: "" + position: "" + affiliation: "" + email: "" + street1: "" + street2: "" + city: "" + province: "" + country: "" + postal_code: "" + admin_comment: "" + comment: "" + paragraphs: + title_html: | +

+ for example: 'Mrs.', 'Mr', 'Dr.', etc. +
+ login_html: | +
+ + one letter + alphanums. By convention: the first letter of your first name + last name. + For example, John Doe login: 'jdoe' + +
+ email_html: | +
+ Please supply the address of your research institution. + Requests with non-institutional address or email + will be ignored + +
+ comment_html: | +
+ Please tell us the name of the laboratory you work for, + the name of its Principal Investigator (if not you), and if possible + anyone else you know in your lab who are already CBRAIN users.
+ We'll use this information to create or add you to a + Site within CBRAIN. +
+ privacy_note: | +
+ Privacy note +
+ The information you supply in this form is + only used in order to review your application and,
when approved, to + automatically generate your user account.
+ This information will not be used in any other way, or passed on to + any other entities or persons. + selects: + position_options: + faculty: "" + postdoctoral: "" + phd_candidate: "" + masters_student: "" + student: "" + researcher: "" + other: "" + affiliation_options: + academic: "" + private_sector: "" + government: "" + non_profit: "" + other: "" + select_one: "" + submits: + request_account: "" + update_request: "" + contact_html: "" + + + show: + title: "" + headings: + main: "" + full_name: "" + login: "" + institution: "" + department: "" + position: "" + affiliation: "" + email: "" + street1: "" + street2: "" + city: "" + province: "" + country: "" + postal_code: "" + comment: "" + admin_comments: "" + status_of_request: "" + time_zone: "" + links: + approve: "" + email_confirmation_request: "" + paragraphs: + made_from_portal_html: "" + admin_can_edit_html: "" + login_conflict: "" + can_approve_html: "" + not_confirmed: "" + confirmed: "" + resend_admin_html: "" + edit_session_note_html: "" + confirmation_sent: "" + resend_user_html: "" + summary_intro: "" + delete_html: "" diff --git a/BrainPortal/config/locales/fr/views/sites/sites.yml b/BrainPortal/config/locales/fr/views/sites/sites.yml new file mode 100644 index 000000000..71b376850 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/sites/sites.yml @@ -0,0 +1,73 @@ +fr: + sites: + + sites_table: + links: + create_new_site: "" + headings: + main: + one: "" + other: "" + columns: + name: "" + description: "" + type: "" + site_manager: "" + number_of_users: "" + number_of_projects: "" + + index: + title: "" + + new: + title: "" + headings: + main: "" + titles: + brief_description_title: "" + labels: + description: "" + paragraphs: + brief_description_html: | +
The first line should be a short summary, and the rest are for any special notes for the users.
+ lock_status: + active: "" + locked: "" + datas: + login: "" + regular_user: "" + site_manager: "" + buttons: + groups: "" + submit: "" + hide: "" + + show: + title: "" + headings: + could_not_be_updated: "" + resources: "" + groups: "" + data_providers: "" + remote_resources: "" + paragraphs: + description_html: | +
The first line should be a short summary, and the rest are for any special notes for the users.

+ cells: + manager: "" + users: "" + projects: "" + userfiles: "" + data_providers: "" + remote_resources: "" + datas: + login: "" + regular_user: "" + site_manager: "" + labels: + users: "" + submits: + update_users: "" + update_projects: "" + titles: + site_log: "" diff --git a/BrainPortal/config/locales/fr/views/tasks/tasks.yml b/BrainPortal/config/locales/fr/views/tasks/tasks.yml new file mode 100644 index 000000000..dccf07f82 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/tasks/tasks.yml @@ -0,0 +1,364 @@ +fr: + tasks: + + control: + headings: + main: "Contrôle des tâches:" + server_version_html: "Serveur & version:" + select_server_version: "Sélectionner le serveur et la version" + save_results_to_html: "Enregistrer les résultats dans:" + select_data_provider: "(Sélectionner un fournisseur de données pour vos résultats)" + description_note: "(La première ligne doit être un court résumé, et les suivantes vos notes.)" + + output_renaming_fieldset: + legends: + output_filenames_renaming: "Renommage des noms de fichiers de sortie" + output_files_pattern: "Les fichiers de sortie peuvent être nommés ou renommés automatiquement à l'aide de ce modèle:" + leave_blank_html: "(Laissez ce champ vide pour que le programme nomme automatiquement les fichiers selon ses propres règles)" + supported_keywords_html: "Les modèles peuvent inclure les
{mots-clés} suivants entre accolades, qui seront remplacés
automatiquement.


Les mots-clés pris en charge sont:" + + params: + headings: + main: "Paramètres de la tâche" + + presets: + headings: + main: "Gestion des préréglages:" + + submit_tag: + load_preset: "Charger un préréglage" + delete_preset: "Supprimer le préréglage" + save_preset: "Enregistrer le préréglage" + + load_preset_configuration: "Charger une configuration prédéfinie:" + select_preset: "(Sélectionner un préréglage à charger)" + delete_this_preset: "Supprimer ce préréglage?" + save_as_preset: "Enregistrer comme configuration prédéfinie:" + select_preset_to_overwrite: "(Sélectionner un préréglage à remplacer)" + or_as_new_name: " (ou sous un nouveau nom)" + save_as_site_preset: "Enregistrer comme préréglage du site:" + + resource_usage: + legends: + main: "Historique de l'utilisation des ressources" + + headings: + task_status: "État de la tâche" + usage_type: "Type d'utilisation" + time_used: "Temps utilisé" + disk_space_used: "Espace disque utilisé" + + labels: + cpu: "CPU" + walltime: "Temps écoulé" + disk_space: "Espace disque" + + show_prereqs: + other_tasks: "Ces autres tâches..." + must_be: "...doivent être dans les états suivants" + destroyed_task_parentheses: "(Tâche supprimée)" + + task_menu: + + dropdown: + update_attributes: "Mettre à jour les attributs" + for_failed_tasks: "Pour les tâches en échec" + for_completed_tasks: "Pour les tâches terminées" + terminating_and_cleaning_up: "Arrêt et nettoyage" + archiving: "Archivage" + filters: "Filtres" + + paragraphs: + for_failed_tasks_html: "Ce panneau vous permet d'agir sur les tâches ayant échoué, d'une manière ou d'une autre.
La tentative de récupération après une erreur déclenchera le code de nettoyage ainsi qu'un redémarrage au
dernier stade de traitement réussi avant l'échec. Cela ne fonctionne pas toujours,
mais il est souvent utile d'essayer au moins une fois!" + for_completed_tasks_intro_html: "Ce panneau vous permet d'agir sur les tâches terminées avec succès.
Vous pouvez essayer de les redémarrer à trois étapes différentes de leur cycle de vie:" + for_completed_tasks_list_html: "

  • À l'étape Configuration, lorsque les fichiers de données d'entrée
    sont synchronisés sur le serveur d'exécution et que les
    scripts de traitement sont créés.
  • À l'étape Cluster, lorsque les scripts scientifiques
    sont exécutés sur les nœuds du serveur d'exécution.
  • À l'étape Post-traitement, lorsque les fichiers de sortie
    résultants sont renvoyés vers les fournisseurs de données de CBRAIN.
" + for_completed_tasks_note_html: "Vous pouvez également dupliquer des tâches et les recréer sur un autre
serveur d'exécution. Avant de les redémarrer, assurez-vous toutefois d'ajuster
la version de leur outil." + terminating_and_cleaning_up_html: "Ce panneau vous permet d'agir sur les tâches dont vous n'avez plus besoin.
Vous pouvez interrompre des tâches à n'importe quelle étape de leur cycle de vie, même
celles ayant échoué. Les tâches marquées Terminées peuvent être redémarrées
ultérieurement." + remove_work_directories_note_html: "Il est également possible de supprimer les répertoires de travail des tâches
sur le serveur d'exécution tout en conservant le reste des
informations des tâches. Cela est utile pour libérer de l'espace sur le serveur
ou lorsque les tâches ont traité des données confidentielles que
vous préférez ne pas laisser sur le serveur. Le panneau Archivage
à gauche offre d'autres options pour gérer les
répertoires de travail des tâches." + remove_tasks_html: "Enfin, vous pouvez supprimer complètement des tâches. Cela effacera le répertoire de travail de la tâche
sur le serveur d'exécution, y compris les fichiers de données temporaires, mais n'effacera pas
les fichiers de sortie d'une tâche terminée avec succès. Cela est utile si vous avez,
par exemple, des données confidentielles. La suppression d'une tâche supprimera également toute
archive du répertoire de travail de cette tâche, le cas échéant (comme indiqué par
les symboles %{workdir_status} et
%{userfile_status} dans la colonne « Taille du répertoire de travail »)." + archiving_1_html: "Ce panneau vous permet d'archiver le contenu du répertoire de travail
de vos tâches. Cela ne peut être effectué que pour les tâches dans un état
final, comme Terminée, Échec ou Interrompue." + archiving_2_html: "Le processus peut prendre beaucoup de temps pour chaque tâche archivée ou restaurée.
Veuillez donc patienter et ne demandez pas cette action plusieurs fois en parallèle." + archiving_3_html: "Il existe deux différents « niveaux » d'archivage:
\n
    \n
  • \n L'archivage sur le cluster signifie que les fichiers de la tâche seront compressés et archivés, mais resteront sur le cluster. Ces tâches sont indiquées par le symbole %{workdir_status} dans la table d'index.\n
  • \n
  • \n L'archivage comme fichier signifie que l'archive sera rapatriée dans votre gestionnaire de fichiers sous la forme d'un fichier « %{type} » et qu'aucune donnée ne restera sur le cluster. Ces tâches sont indiquées par le symbole %{userfile_status} dans la table d'index.\n
  • \n
" + archiving_4_html: "Le reste des informations sur les tâches ne sera en aucun cas modifié
lorsqu'elles seront archivées. Aucune opération ne peut être effectuée sur une tâche archivée, sauf
bien entendu sa désarchivage." + + change: + owner: "Changer le propriétaire:" + group: "Changer le projet:" + data_provider: "Changer le fournisseur de données des résultats:" + tool_version: "Changer la version de l'outil:" + + blanks: + select_another_owner: "(Sélectionner un autre propriétaire)" + select_another_group: "(Sélectionner un autre projet)" + select_another_data_provider: "(Sélectionner un autre fournisseur de données)" + select_another_tool_version: "(Sélectionner une autre version de l'outil)" + + hijacker: + trigger_error_recovery: "" + setup_stage: "" + cluster_stage: "" + post_processing_stage: "" + duplicate_tasks: "" + terminate_tasks: "" + remove_work_directories: "" + remove_tasks: "" + archive_on_cluster: "" + archive_as_file: "" + unarchive_tasks: "" + + confirm: + terminate_tasks: "" + remove_work_directories: "" + remove_tasks: "" + + restart_at: "" + on_execution_server: "" + optional_destination_dp_html: "" + do_not_compress: "" + + tasks_display: + titles: + expand_batch: "" + open_batch: "" + + switches: + switch_to_list_view: "" + switch_to_batch_view: "" + + columns: + batch: "" + task_type: "" + version: "" + description: "" + owner: "" + project: "" + server: "" + current_status: "" + run_number: "" + workdir_size: "" + results_on: "" + time_submitted: "" + last_updated: "" + + legends: + on_cluster: "" + as_file: "" + + task_count_colon: + one: "" + other: "" + + total_space: "" + tasks_without_estimates: + one: "" + other: "" + disappeared_tasks: "" + shared_parentheses: "" + workdir_archiving_status_symbols: "" + + + utility_interface_file_list: + run_on: "" + + zenodo_deposit_form: + legends: + basic_deposit_information: "" + labels: + select_zenodo_token: "" + title: "" + description: "" + creators: "" + options: + sandbox: "" + main: "" + explanation_html: "" + submit: "" + + edit: + edit_task: "" + submit: "" + + index: + title: "" + + new: + title: "" + headings: + main: "" + submit: "" + + show: + title: "" + + headings: + cluster_job_id: "" + setup_prerequisites: "" + post_processing_prerequisites: "" + + links: + edit_parameters: "" + refresh: "" + retry_failed: "" + restart_at_setup: "" + restart_on_cluster: "" + restart_at_post_processing: "" + archive_on_cluster: "" + unarchive: "" + terminate_task: "" + remove_work_directory: "" + save_work_directory: "" + publish_to_zenodo: "" + remove_task: "" + list_of_tasks: "" + + confirm: + terminate_task: "" + remove_work_directory: "" + remove_task: "" + remove_task_note: "" + + cells: + task_name: "" + task_description: "" + execution_server: "" + owner: "" + tool_version: "" + group: "" + current_status: "" + time_submitted: "" + data_provider_for_results: "" + zenodo_publication: "" + cluster_job_work_directory: "" + not_yet_created_or_erased: "" + size_of_work_directory: "" + archiving_status: "" + + zenodo_publication: + published: "" + in_progress: "" + none: "" + + shared_with_task: "" + + archiving_status: + not: "" + on_cluster: "" + as_file: "" + + rescue: + no_template_html: "" + template_error_html: "" + show_summary_of_params_for_task: "" + error_rendering_yaml: "" + + in_the_task_manager: "" + in_this_batch: "" + + tabs: + parameters_in_yaml: "" + parameters_in_json: "" + full_task_object_in_json: "" + stdout: "" + stderr: "" + script: "" + runtime_info: "" + + paragraphs: + parameters_description_html: | +

+ This shows only the scientific parameters associated with + this task. See the description in the last panel for more + information. +

+ parameters_in_json: | +

+ This shows only the scientific parameters associated with + this task. See the description in the last panel for more + information. +

+ full_task_object_in_json_html: | +

+ This structure shows the minimal amount of information needed + to create a CBRAIN task similar to this one, using the CBRAIN API. + This is provided to help developers working with the API. The top + level contains the IDs of the CBRAIN resources needed for the task + (e.g. the group (project) ID, the user's ID, the version of the + tool etc). These are the values you see at the top of the page in + the Info section. +

+

+ The information under "params" is exactly what + is shown in the previous tab. It generally contains the scientific + parameters for the tool, where file names are replaced by the IDs + of files registered within CBRAIN. +

+

+ For tools integrated with + Boutiques, + the "params" structure will contain a substructure called + "invoke" where most of the scientific parameters are + relocated. This structure should match exactly the invoke structure that + the Boutiques program bosh expect, but again with filenames + replaced by CBRAIN file IDs. +

+

+ Note that some keys and values are added to these structures during or + at the end of processing and are not required at the time the task is + submitted. +

+ + legends: + processing_log: "" + prerequisites: "" + cluster_job_captured_output: "" + + outputs_not_available: "" + outputs_available: "" + + stdout_lim: "" + stderr_lim: "" + + zenodo: + title: "" + + links: + task_info: "" + zenodo_deposit_editor: "" + refresh_message: "" + reset_deposit: "" + + status: + complete: "" + in_progress: "" + incomplete: "" + + legends: + prepare: "" + upload: "" + publish: "" + reset_deposit_html: "" + + paragraphs: + prepare: + complete_html: "" + incomplete_html: "" + upload: + incomplete_html: "" + publish: + doi_1_html: "" + doi_2_html: "" + no_doi_1_html: "" + no_doi_2_html: "" + waiting: "" + reset: + deposit_1_description_html: "" + deposit_2_description_html: "" + deposit_confirmation: "" + + prepare: + scheduled_for_upload: "" + will_be_ignored: "" + upload: + waiting_for_initial_deposit: "" + it_can_take_some_time: "" + diff --git a/BrainPortal/config/locales/fr/views/tool_configs/tool_configs.yml b/BrainPortal/config/locales/fr/views/tool_configs/tool_configs.yml new file mode 100644 index 000000000..0fd1e2756 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/tool_configs/tool_configs.yml @@ -0,0 +1,258 @@ +fr: + tool_configs: + + common: + all_tools: "" + all_servers: "" + no_versions_configured: "" + version_config_name: "" + in_project_html: "" + everyone: "" + access_yes: "" + access_no: "" + container_engine: "" + + by_resource: + labels: + tool: "" + execution_server: "" + no_versions: + for_servers: "" + for_tools: "" + headings: + execution_servers: "" + tools: "" + versions_configured: "" + projects_in_effect: "" + users_access_summary: "" + have_access_html: "" + have_no_access_html: "" + + by_user: + legends: + user: "" + member_of_projects: "" + execution_servers_access: "" + tool_access_summary: "" + tool_versions_access_details: "" + headings: + execution_server: "" + tool: "" + servers_project: "" + accessible_to_user: "" + tool_summary: "" + versions_per_server: "" + tools_project: "" + tool_version: "" + effective_project: "" + n_ok: "" + n_no: "" + + tooltip: + server_project_html: "" + tool_project_html: "" + version_project_html: "" + + env_key_value_pair: + headings: + name: "" + value: "" + + form_fields: + headings: + version_config_info: "" + version: "" + project_access: "" + suggested_cpus: "" + description: "" + inputs_readonly: "" + boutiques_path: "" + exec_server_control: "" + extra_qsub: "" + env_vars: "" + bash_prologue: "" + bash_epilogue: "" + container: "" + container_engine: "" + container_index: "" + container_image_name: "" + container_image_id: "" + singularity_overlays: "" + misc_singularity: "" + short_workdir: "" + field_explanations: + version: "" + description: | + The first line must be a short summary, and the rest are for any special + notes for the users. + inputs_readonly_html: + Check this if the tool is known not to modify its input files . + This will allow a user to launch the tool on files that are not marked as group-writable in the file manager. + boutiques_path_html: | + You can use this field to provide an explicit path to a + Boutiques descriptor; an absolute path will be used as-is, + while a relative path will be resolved relative to the + boutiques_descriptor folder in the installed plugins + subdirectory. The page indicates the source location of the + effective descriptor: 'Automatic' means the configuration has + been mapped automatically to an installed descriptor, 'Manual' + means the value in the input field here is used, and 'Overriden' + means both values exists, but the 'Manual' version is in effect. + extra_qsub_html: | + Note:This string will be appended to the extra 'qsub' option defined at the bourreau level. + container_index_html: | + The index (url) of the container image in which the docker or singularity container is + accessible through. + Examples for Docker are: quay.io, index.docker.io (default). + Examples for Singularity are: docker://, shub:// (default). + container_image_name: | + The name and tag of the container image in which the tool is installed, + for instance "centos:latest". This name refers to the Docker/Singularity index + accessed by the Bourreau, which is configured manually in the Bourreau + for now. + container_image_id: | + The ID number of the container image in which the tool is installed. + This ID refers to a proper image file registered in CBRAIN by the admin. + singularity_overlays_html: | + This field can contain one or several specifications for data overlays and bindmounts + to be included when the task is started with Singularity. +

+ Each overlay or bindmount specification should be on a separate line. +

+ An overlay specification can be either: +

+

    +
  • a full path (e.g. file:/a/b/data.squashfs),
  • +
  • a path with a pattern (e.g. file:/a/b/data*.squashfs),
  • +
  • a registered file identified by ID (e.g. userfile:123),
  • +
  • a SquashFS Data Provider identified by its ID or name (e.g. dp:123, dp:DpNameHere)
  • +
  • or an ext3 capture overlay basename (e.g. ext3capture:basename=SIZE where size is 12G or 12M).
  • +
+

+ In the case of a Data Provider, the overlays will be the SquashFS files that the provider uses for its storage. The provider of course must be local to the current execution server. +

+ A bindmount specification is one of: +

    +
  • bindmount:/bourreau/path/to/data:/containerized/path/to/data or
  • +
  • bindmount:/bourreau/path/to/data:/containerized/path/to/data:ro
  • +
+

+ You can add comments, indicated with a hash symbol #. + For example, file:/a/b/atlas.squashfs # brain atlas + container_exec_args_html: | + This field can contain singularity exec command options. Please use appropriate quotation or escaping + For example, --cleanenv --env MYPATH='/My Documents'. + container_none: "" + container_type_title: "" + env_vars_note_top: "" + env_vars_note_bottom: "" + prologue_explanation_html: | + This is a multi line partial BASH script. It can use the environment variables defined above + and do anything else you feel is needed to activate this configuration. + Note that this script should usually be silent, as outputing text (like in echo statements) + could interfere with the proper processing of the tasks output. + epilogue_explanation_html: | + This is a multi line partial BASH script, meant to match the prologue above. The code + here will be execute after the task's processing code. + Note that this script MUST be silent, as outputing text (like in echo statements) + could interfere with the proper processing of the tasks output. + legends: + merge: "Import and merge" + merge_explanation_both: | + The description, environment variables and prologue script will be appended to whatever + values are currently in the form. The project and suggested number of CPUs will be changed. + merge_explanation_env: | + The environment variables and prologue script will be appended to whatever + values are currently in the form. + merge_intro: "" + merge_from: "" + submits: + merge_preview: "" + save_everything: "" + reload_original: "" + merge_note: | + You need to first click the Merge Configuration (Preview), carefully check the results, and only if + everything is ok click this or any other Update button, and the changed values will persist. + + tool_configs_table: + links: + tool_list: "" + tool_config_count: + one: "" + other: "" + show_edit: "" + columns: + access: "" + tool_name: "" + tool_project: "" + version: "" + version_project: "" + cpus: "" + boutiques: "" + container_index: "" + container_image: "" + description: "" + operations: "" + + boutiques_descriptor: + title: "" + present_html: "" + absent_html: "" + + index: + title: "" + + report: + title: "" + all: + of_them: "" + servers_or: "" + tools_or: "" + users_or: "" + pick_best: "" + view_by: + server: "" + tool: "" + user: "" + submit: "" + + headings: + by: "" + access_by_user: "" + by_server_html: "" + by_tool_html: "" + quick_links: "" + by_user: "" + by_combination: "" + + labels: + execution_server: "" + tool: "" + user: "" + view_by: "" + + show: + title: + create: "" + edit: "" + + important_note: "" + applies_to_tool_html: "" + applies_to_all_tools_html: "" + + running_on_all_servers_html: "" + running_on_server_html: "" + + common_config_tool: "" + common_config_server: "" + + bash_wrappers: + legend: "" + intro: "" + surrounded: "" + order: "" + + log: + global_bourreau: "" + global_tool: "" + specific: "" diff --git a/BrainPortal/config/locales/fr/views/tools/tools.yml b/BrainPortal/config/locales/fr/views/tools/tools.yml new file mode 100644 index 000000000..5d9a6c0ea --- /dev/null +++ b/BrainPortal/config/locales/fr/views/tools/tools.yml @@ -0,0 +1,111 @@ +fr: + tools: + + form_fields: + titles: + cbrain_task_class_name: "PortalTask subclass which implements this tool." + headings: + general_info: "" + name: "" + cbrain_task_class_name: "" + last_updated: "" + belongs_to: "" + available_to_project: "" + category: "" + license_agreements: "" + description: "" + package_name: "" + tool_type: "" + comma_separated_tags: "" + url: "" + select_menu_text: "" + cells: + created: "" + last_updated: "" + belongs_to: "" + paragraphs: + license_agreements_html: | +

Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+ description_html: | +
The first line is a short summary, and the rest are for any special notes for the users.
+ labels: + common_config: "" + versions_installed: "" + links: + add_new: "" + datas: + cpu_count: + one: "" + other: "" + no_versions_configured: "" + versions_configured: + one: "" + other: "" + version_config_name: "" + + tool_config_select: + include_blanks: + no_online_server: "" + select_server_version: "" + labels: + server_version_html: + "" + submits: + launch: "" + + tools_table: + links: + create_new_tool: "" + autoload_tools: "" + access_reports: "" + tool_versions_list: "" + version_count: + one: "" + other: "" + access: "" + titles: + autoload_tools: "" + columns: + name: "" + description: "" + category: "" + owner: "" + group: "" + execution_versions: "" + access: "" + help: "" + info: "" + + edit: + title: "" + titles: + log_title: "" + + index: + title: "" + + new: + title: "" + titles: + cbrain_task_class: "" + headings: + main: "" + labels: + name: "" + cbrain_task_class: "" + belongs_to: "" + group: "" + category: "" + license_agreements: "" + description: "" + package_name: "" + tool_type: "" + application_tags: "" + url: "" + select_menu_text: "" + paragraphs: + license_agreements_html: | +
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+ description_html: | +
The first line must should be a short summary, and the rest are for any special notes for the users.
+ submit: "" diff --git a/BrainPortal/config/locales/fr/views/userfiles/userfiles.yml b/BrainPortal/config/locales/fr/views/userfiles/userfiles.yml new file mode 100644 index 000000000..27de75a14 --- /dev/null +++ b/BrainPortal/config/locales/fr/views/userfiles/userfiles.yml @@ -0,0 +1,315 @@ +fr: + userfiles: + + common: + download: "Télécharger" + copy: "Copier" + move: "Déplacer" + rename: "Renommer" + compress: "Compresser" + uncompress: "Décompresser" + properties: "Propriétés" + synchronize: "Synchroniser" + mark_newer: "Marquer comme plus récent" + upload: "Importer" + and_go: " (et passer au fichier suivant)" + exception: "Exception:" + read_only: "Lecture seule" + read_write: "Lecture/Écriture" + read: "Lecture" + size_bytes: "%{size} octets" + created_at: "Créé le" + qc: "Contrôle qualité" + + default_qc_panel: + not_synced: "Ce fichier doit être synchronisé localement pour afficher les données de contrôle qualité." + no_qc_data: "Ce fichier ne semble pas contenir de données de contrôle qualité, ou aucun modèle n'est disponible pour effectuer le contrôle qualité de ce type de fichier." + + dialogs: + titles: + upload_sf: "Importation - Fichier unique" + file_properties: "Propriétés du fichier" + new_collection: "Nouvelle collection" + + blanks: + keep_current_parentheses: "(Conserver %{attribute} actuel)" + + placeholders: + dp: "Un fournisseur de données..." + group: "Un projet..." + tags: "Des étiquettes..." + file_type: "Un type de fichier..." + keep_current: "Conserver %{attribute} actuel" + + labels: + extract: "Extraire" + as_single_collection: "Comme une seule collection" + as_multiple_files: "Comme plusieurs fichiers" + advanced_options: "Options avancées..." + detect_as: "Détecter comme" + allow_modification: "Autoriser la modification par les autres membres du projet" + overwrite: "Écraser les fichiers existants portant le même nom" + clear_tags: "Effacer les étiquettes" + hidden_html: "Masqué (H)" + locked_html: "Verrouillé (I)" + copy: "" + move: "" + rename: "" + compress: "" + uncompress: "" + properties: "" + synchronize: "" + mark_newer: "" + upload: "" + and_go: "" + exception: "" + read_only: "" + read_write: "" + read: "" + size_bytes: "" + created_at: "" + + default_qc_panel: + not_synced: "" + no_qc_data: "" + + dialogs: + titles: + upload_sf: "" + file_properties: "" + new_collection: "" + + blanks: + keep_current_parentheses: "" + + placeholders: + dp: "" + group: "" + tags: "" + file_type: "" + keep_current: "" + + labels: + extract: "" + as_single_collection: "" + as_multiple_files: "" + advanced_options: "" + detect_as: "" + allow_modification: "" + overwrite: "" + clear_tags: "" + hidden_html: "" + locked_html: "" + + divs: + hidden_html: | + Hidden files are invisible by default, and are usually reserved for + maintenance, internal and archiving purposes. + locked: | + Locked files cannot be modified or moved across data providers. + + confirmations: + delete_file_html: "" + delete_tag_html: "" + + actions: + proceed: "" + + new_collection: "" + autodetect: "" + unknown_file_type: "" + qc_note: "" + invalid: "" + + file_menu: + static_actions: + launch: "" + upload: "" + show_only_my_files: "" + show_all_files: "" + + dynamic_actions: + download: "" + copy: "" + move: "" + rename: "" + compress: "" + uncompress: "" + + menu_actions: + more: "" + custom_filters: "" + new_collection: "" + export_as_csv: "" + create_file_list: "" + show_only_my_files: "" + show_all_files: "" + hide_hidden_files: "" + show_hidden_files: "" + list_view: "" + tree_view: "" + + filter_items: + new_filter: "" + has_no_parent: "" + has_no_children: "" + + quality_control_panel: + legends: + navigation_info: "" + file_tags: "" + file_description: "" + + submit: + previous_file: "" + next_file: "" + pass : "" + fail: "" + + error_messages: + qc_error: "" + + full_list_of_tags: "" + + resource_usage: + section: + disk_space_history: "" + headings: + space_delta: "" + + syncstatus: + last_synchronized_date: "" + last_accessed_date: "" + transfer_started: "" + state_occurred: "" + + tags_table: + placeholders: + group: "" + + tools_interface: + titles: + toolsDialog: "" + + headings: + no_tools_admin: "" + no_tools_others: "" + + labels: + all_tools: "" + software_package: "" + + links: + tool_website: "" + + userfiles_display: + entry: + one: "" + other: "" + own_files_only: "" + show_total: + hidden: "" + archived: "" + locked: "" + columns: + type_icon: "" + filename: "" + file_type: "" + owner: "" + creation_date: "" + size: "" + project_access: "" + tags: "" + group: "" + description: "" + data_provider: "" + + search_by_name: "" + was_html: "" + + index: + title: "" + legends: + sync_symbols: "" + + quality_control: + title: "" + links: + finished: "" + buttons: + one_panel: "" + loading_message: + loading_panel: "" + + show: + title: "" + titles: + file_log: "" + + links: + download_collection: "" + download_file: "" + + error_messages: + suggested_type: "" + update: "" + viewer: "" + + cells: + zenodo_publication: "" + parent: "" + children: "" + + zenodo_publication: + published: "" + in_progress: "" + + legends: + content: "" + + content: + archived: "" + viewers_disabled: "" + cannot_view: "" + non_viewable_dp_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is marked as non-viewable) + not_syncable_dp_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is configured to not allow synchronizationat all) + corrupted_html: | + + (The content of this file seems to be corrupted. This might be the result + of a bad data transfer while it was being created or a filesystem failure. + There isn't much you can do about this, although if the file was produced + by a task, consider restarting the task's Post Processing stage.) + + sync_not_allowed_html: | + (This file cannot be viewed as it is stored on Data Provider + %{dp_link} + which is configured to not allow synchronization to this Portal) + offline_dp_html: | + (This data is not currently synchronized and its Data Provider + %{dp_link} + is offline, so its content is not viewable for the moment) + sync_in_progress: "" + sync_start_html: | + (This data file is not currently synchronized. Click + %{link} + to start the synchronization process. + This may allow you to view displayable content.) + sync_start_collection_html: | + (This data file is not currently synchronized. Click + %{link} + to start the synchronization process. + This may allow you to view displayable content and extract files from this collection.) + no_viewer_code_html: | + (The contents of this file cannot be viewed: no viewer code available at this moment + for files of type '%{type}') + change_view: "" + + was_html: "" + cached: "" + here: "" diff --git a/BrainPortal/config/locales/fr/views/users/users.yml b/BrainPortal/config/locales/fr/views/users/users.yml new file mode 100644 index 000000000..de9b179ce --- /dev/null +++ b/BrainPortal/config/locales/fr/views/users/users.yml @@ -0,0 +1,214 @@ +fr: + users: + + common: + select_site: "" + used: "" + unkn: "" + + users_table: + links: + create_user: "" + active_count: "" + locked_count: "" + access: "" + columns: + login: "" + full_name: "" + email: "" + position: "" + affiliation: "" + last_connection: "" + groups: "" + role: "" + site: "" + city: "" + country: "" + timezone: "" + files: "" + tasks: "" + switch: "" + access: "" + user_count: + one: "" + other: "" + unlocked: "" + locked: "" + label_of: "" + last_connection: "" + project_count: + one: "" + other: "" + role: "" + access: "" + access_q: "" + + change_password: + title: "" + headings: + main: "" + message: "" + labels: + new_password: "" + confirm_new_password: "" + force_password_reset: "" + + index: + title: "" + + new: + title: "" + headings: + main: "" + basic_information: "" + access_profile: "" + project_membership: "" + labels: + full_name: "" + login: "" + email: "" + position: "" + affiliation: "" + city: "" + country: "" + time_zone: "" + type: "" + site: "" + pref_data_provider_id: "" + allowed_globus_provider_names: "" + password: "" + confirm_password: "" + no_password_reset: "" + paragraphs: + login_html: | + For Tom Jones, use tjones, not 'tom' or 'jones'. + dp_html: | + If set, make sure it is a Data Provider that will be accessible to the user + openid_html: | + + If set, must be exact OpenID identity provider names separated by commas + A single '*' is also allowed to mean any provider name. + + submit: "" + + new_token: + title: "" + headings: + main: "" + titles: + notes: "" + copy_tooltip: "" + paragraphs: + generated_intro: "" + token_html: | + If you are a developer and want to automate working + with CBRAIN or NeuroHub, this token will be needed + to access the APIs. +

+ Refer to the CBRAIN API documentation + for more information. +

+ labels: + copy: "" + li: + validity: "" + renewal: "" + ip_lock_html: "" + ip_invalid_html: "" + copy_html: "" + + request_password: + title: "" + headings: + main: "" + labels: + login: "" + email: "" + submit: "" + + show: + title: "" + titles: + user_activity_report: "" + links: + tool_access_reports: "" + switch_to_user: "" + report_maker: "" + change_password: "" + generate_api_token: "" + unlink_identity: "" + link_identity: "" + neurohub_interface: "" + prompts: + select_site: "" + cells: + last_connected: "" + never: "" + public_key: "" + provider: "" + orcid_identity: "" + active_sessions: "" + files: "" + tasks: "" + data_providers: "" + historical_storage: "" + historical_cpu_time: "" + tools: "" + portal: "" + execution: "" + installation_sites: "" + headings: + message: "" + pref_data_provider_id: "" + pref_bourreau_id: "" + account_locked: "" + ip_whitelist: "" + allowed_globus_provider_names: "" + ssh_key: "" + sessions_tokens: "" + zenodo_publishing: "" + zenodo_sandbox_token: "" + zenodo_official_token: "" + license_agreements: "" + linked_identities: "" + provider_name: "" + provider_user: "" + ip: "" + last_access: "" + resources: "" + access_profiles: "" + groups: "" + project_name: "" + project_type: "" + members: "" + paragraphs: + ip_whitelist_html: | +

+ Comma-separated list of allowed source IPs (X.X.X.X/XX) for the user to connect from. +
+ allowed_globus_provider_names_html: | +
+ If set, must be a list of OpenID identity provider names separated by commas. A single '*' is + also allowed to mean any provider name. +
+ zenodo_sandbox_token_html: | +
+ This token can be used for creating temporary/test Zenodo data deposits.

+ You can create a token at https://sandbox.zenodo.org/account/settings/applications/. +

+ zenodo_main_token_html: | +
+ This token can be used for creating real, official and permanent Zenodo data deposits.

+ You can create a token at https://zenodo.org/account/settings/applications/. +

+ datas: + last_pushed: "" + push: "" + no_ip_yet: "" + confirms: + unlink: "" + no_identity: "" + orcid_id: "" + no_orcid: "" + orcid_note_html: "" + submit: "" diff --git a/BrainPortal/public/doc/access_profiles/access_profiles.html b/BrainPortal/public/doc/en/access_profiles/access_profiles.html similarity index 100% rename from BrainPortal/public/doc/access_profiles/access_profiles.html rename to BrainPortal/public/doc/en/access_profiles/access_profiles.html diff --git a/BrainPortal/public/doc/data_providers/data_provider_info.html b/BrainPortal/public/doc/en/data_providers/data_provider_info.html similarity index 100% rename from BrainPortal/public/doc/data_providers/data_provider_info.html rename to BrainPortal/public/doc/en/data_providers/data_provider_info.html diff --git a/BrainPortal/public/doc/feedback/feedback.html b/BrainPortal/public/doc/en/feedback/feedback.html similarity index 100% rename from BrainPortal/public/doc/feedback/feedback.html rename to BrainPortal/public/doc/en/feedback/feedback.html diff --git a/BrainPortal/public/doc/feedback/feedback.png b/BrainPortal/public/doc/en/feedback/feedback.png similarity index 100% rename from BrainPortal/public/doc/feedback/feedback.png rename to BrainPortal/public/doc/en/feedback/feedback.png diff --git a/BrainPortal/public/doc/groups/groups_info.html b/BrainPortal/public/doc/en/groups/groups_info.html similarity index 100% rename from BrainPortal/public/doc/groups/groups_info.html rename to BrainPortal/public/doc/en/groups/groups_info.html diff --git a/BrainPortal/public/doc/messages/message_info.html b/BrainPortal/public/doc/en/messages/message_info.html similarity index 100% rename from BrainPortal/public/doc/messages/message_info.html rename to BrainPortal/public/doc/en/messages/message_info.html diff --git a/BrainPortal/public/doc/server/view_server.html b/BrainPortal/public/doc/en/server/view_server.html similarity index 100% rename from BrainPortal/public/doc/server/view_server.html rename to BrainPortal/public/doc/en/server/view_server.html diff --git a/BrainPortal/public/doc/server/view_server.png b/BrainPortal/public/doc/en/server/view_server.png similarity index 100% rename from BrainPortal/public/doc/server/view_server.png rename to BrainPortal/public/doc/en/server/view_server.png diff --git a/BrainPortal/public/doc/sites/site_info.html b/BrainPortal/public/doc/en/sites/site_info.html similarity index 100% rename from BrainPortal/public/doc/sites/site_info.html rename to BrainPortal/public/doc/en/sites/site_info.html diff --git a/BrainPortal/public/doc/tool/tool.png b/BrainPortal/public/doc/en/tool/tool.png similarity index 100% rename from BrainPortal/public/doc/tool/tool.png rename to BrainPortal/public/doc/en/tool/tool.png diff --git a/BrainPortal/public/doc/tool/tool_info.html b/BrainPortal/public/doc/en/tool/tool_info.html similarity index 100% rename from BrainPortal/public/doc/tool/tool_info.html rename to BrainPortal/public/doc/en/tool/tool_info.html diff --git a/BrainPortal/public/doc/userfiles/file_formats_overview.html b/BrainPortal/public/doc/en/userfiles/file_formats_overview.html similarity index 100% rename from BrainPortal/public/doc/userfiles/file_formats_overview.html rename to BrainPortal/public/doc/en/userfiles/file_formats_overview.html diff --git a/BrainPortal/public/doc/userfiles/tools_overview.html b/BrainPortal/public/doc/en/userfiles/tools_overview.html similarity index 100% rename from BrainPortal/public/doc/userfiles/tools_overview.html rename to BrainPortal/public/doc/en/userfiles/tools_overview.html diff --git a/BrainPortal/public/doc/fr/access_profiles/access_profiles.html b/BrainPortal/public/doc/fr/access_profiles/access_profiles.html new file mode 100644 index 000000000..9559a638b --- /dev/null +++ b/BrainPortal/public/doc/fr/access_profiles/access_profiles.html @@ -0,0 +1,102 @@ + + + + + +

Introduction au profil d'accès

+ +

+ +Les profils d'accès permettent de simplifier l'affectation des utilisateurs aux projets. + +

+ +Un profil d'accès est essentiellement un ensemble de projets. Lorsqu'un utilisateur est créé +ou modifié, il peut être associé à un ou plusieurs profils d'accès. En étant associé à ces profils d'accès, +l'utilisateur devient automatiquement membre de tous les projets inclus dans ces profils. + +

+ +Pour clarifier, utilisons trois termes pour faire le lien entre ces trois concepts. + utilisateurs, projets et profils d'accès. + +

    +
  • Utilisateurs sont membres de projets
  • +
  • Projets sont attribués aux profils d'accès
  • +
  • Utilisateurs sont liés aux profils d'accès
  • +
+ +

+ +Un même projet peut être attribué à plusieurs profils d'accès, et un utilisateur peut être associé +à plusieurs de ces profils. Si un projet est attribué à plusieurs profils auxquels l'utilisateur est associé, +celui-ci demeure membre du projet tant qu'il est attribué à au moins un de ces profils. +Autrement dit, l'ensemble des projets dont un utilisateur est membre correspond à l' union +de tous les projets attribués aux profils d'accès auxquels il est associé. + +

+ +Les profils d'accès et l'ensemble de leurs propriétés ne sont jamais visibles pour les utilisateurs standard. +Pour ces utilisateurs, seule leur appartenance aux projets est visible. + +

Creating an Access Profile

+ +

+ +Lors de la création d'un nouveau profil d'accès, l'administrateur peut lui attribuer une couleur afin +de le distinguer des autres profils d'accès. Il peut également lui attribuer des projets dès sa création + +

Suppression d'un profil d'accès

+ +

+ +La suppression d'un profil d'accès n'entraîne pas la suppression des projets qui lui sont attribués. +Cependant, tous les utilisateurs associés à ce profil ne seront plus membres des projets qui lui étaient attribués, +à l'exception des projets également attribués à d'autres profils d'accès. + +

Modification d'un profil d'accès : gestion des projets

+ +

+ +La modification de l'ensemble des projets attribués à un profil d'accès prend effet immédiatement (par défaut) pour +tous les utilisateurs associés à ce profil d'accès. Si de nouveaux projets sont attribués au profil, les utilisateurs +en deviennent automatiquement membres. Si des projets sont retirés du profil, les utilisateurs peuvent perdre leur +appartenance à ces projets. + +

+ +Dans le formulaire, l'administrateur peut sélectionner, à l'aide des cases à cocher situées au bas de la liste des projets, +les utilisateurs qui seront affectés par les modifications. Si la case à cocher d'un utilisateur n'est pas sélectionnée, +son appartenance aux projets ne sera pas modifiée, quelles que soient les modifications apportées au profil d'accès. + +

Modification d'un profil d'accès : gestion des utilisateurs

+ +

+ +La modification de la liste des utilisateurs associés à un profil d'accès affectera tous les utilisateurs concernés: +ils deviendront membres de tous les projets de ce profil d'accès (si l'utilisateur est ajouté) ou pourront perdre +l'accès à l'ensemble de ces projets. + +

+ diff --git a/BrainPortal/public/doc/fr/data_providers/data_provider_info.html b/BrainPortal/public/doc/fr/data_providers/data_provider_info.html new file mode 100644 index 000000000..7cea9c7cc --- /dev/null +++ b/BrainPortal/public/doc/fr/data_providers/data_provider_info.html @@ -0,0 +1,99 @@ + + + + + +

omment enregistrer des fichiers dans CBRAIN

+ +Un fournisseur de données est un espace de stockage de données reconnu par CBRAIN. +Un utilisateur typique a accès à deux fournisseurs de données nommés MainStore et +MindStore, ainsi qu'à deux "fournisseurs de données entrants". +Un "fournisseur de données entrant" est un espace de stockage configuré par l'administrateur du réseau, +auquel il est possible d'accéder au moyen d'un protocole externe à l'environnement CBRAIN. +Les deux fournisseurs de données entrants actuellement configurés sont "SFTP-Incoming" et "SFTP-Brainstorm", +accessibles à l'aide du protocole SFTP (Secure File Transfer Protocol). + +

+Les fichiers de données peuvent être importés vers CBRAIN à l'aide d'un client SFTP installé sur votre ordinateur. +Vous pouvez vous connecter à l'aide de n'importe quel client SFTP pour UNIX, +macOS ou Windows aux hôtes mindstorm.cbrain.mcgill.ca ou brainstorm.cbrain.mcgill.ca +en utilisant le port 7500. Votre nom d'utilisateur et votre mot de passe sont les mêmes que ceux de +votre compte CBRAIN. Les fichiers téléversés vers mindstorm apparaîtront dans CBRAIN lorsque vous +cliquerez sur le bouton « Parcourir » du fournisseur de données « SFTP-Incoming », tandis que les fichiers téléversés +vers brainstorm apparaîtront dans le fournisseur de données « SFTP-Brainstorm ». + +

+ +Clients SFTP recommandés +
+

    +
  • Client SFTP en ligne de commande sous Unix
  • +
      +
    • sftp -o port=7500 username@mindstorm.cbrain.mcgill.ca
    • +
    • Les options disponibles peuvent être affichées en saisissant la ligne de commande help.
    • +
    +
  • SFTP client disponible pour macOS et Windows: FileZilla
  • +
      +
    • Sélectionnez le fichier -> Site Manager
    • +
    • Sélectionnez Nouveau Site
    • +
    • Dans l'onglet General du Site Manager
    • +
        +
      • Saisissez le nom d'hôte : mindstorm.cbrain.mcgill.ca
      • +
      • Saisissez le numéro de port: 7500
      • +
      • Sélectionnez le Type de Serveur: SFTP - SSH File Transfer Protocol
      • +
      • Sélectionnez le Type de Logon: Normal
      • +
      • Saisissez le nom d'utilisateur de votre compte CBRAIN
      • +
      • Saisissez le mot de passe de votre compte CBRAIN
      • +
      +
    • Dans l'onglet Advanced
    • +
        +
      • Sélectionnez Unix comme Type de Serveur
      • +
      • Sélectionnez Bypass proxy
      • +
      +
    • Cliquez sur connect
    • +
    • Les fichiers de votre ordinateur local sont affichés dans le panneau de gauche
    • +
    • Les fichiers de l'ordinateur à distance sont affichés dans le panneau de droite
    • +
        +
      • Vous pouvez faire glisser les fichiers pour les transférer entre l'ordinateur local et l'ordinateur à distance
      • +
      • Les options de gestion des fichiers s'affichent lorsque vous sélectionnez un fichier et cliquez dessus avec le bouton droit de la souris
      • +
      +
    +
  • SFTP Client disponible sur macOS: Cyberduck:
  • +
      +
    • Sélectionnez Open Connection
    • +
    • Sélectionnez SFTP comme protocole de transfer de fichiers
    • +
    • Saisissez mindstorm.cbrain.mcgill.ca comme serveur, le port 7500, ainsi que le nom d'utilisateur et le mot de passe de votre compte CBRAIN
    • +
    • Les fichiers affichés dans le panneau correspondent aux fichiers de l'ordinateur à distance +
    • Faites un clic droit dans le panneau, puis sélectionnez Upload pour transférer des fichiers de votre ordinateur local vers l'ordinateur à distance
    • +
    • Sélectionnez un fichier, et faites un clic droit pour le télécharger vers votre ordinateur local
    • +
    +
+ +
+Importez ou téléchargez vos fichiers au besoin à l'aide du client configuré. +Ensuite, accédez à l'onglet fournisseurs de données, repérez le "fournisseur de données entrant", puis cliquez sur le lien "Browse". +Enregistrez vos fichiers dans CBRAIN; ils apparaîtront alors dans le gestionnaire de fichiers. Il est recommandé de DÉPLACER ces fichiers vers l'un des fournisseurs de données officiels de CBRAIN. +Lors de l'enregistrement, les fichiers peuvent être automatiquement associés à un projet, puis déplacés ou copiés vers le fournisseur de données sélectionné.

+

+ diff --git a/BrainPortal/public/doc/fr/feedback/feedback.html b/BrainPortal/public/doc/fr/feedback/feedback.html new file mode 100644 index 000000000..88b8e80ad --- /dev/null +++ b/BrainPortal/public/doc/fr/feedback/feedback.html @@ -0,0 +1,35 @@ + + + + + +

Laisser des Commentaires

+
+ +Les Commentairesvous permettent d'accéder à une interface où vous pouvez transmettre vos commentaires sur CBRAIN en cliquant sur le lienLaisser des Commentaires. +Tous les commentaires concernant CBRAIN sont les bienvenus et seront publiés sur cette page. +
+
+ + diff --git a/BrainPortal/public/doc/fr/feedback/feedback.png b/BrainPortal/public/doc/fr/feedback/feedback.png new file mode 100644 index 000000000..6506af86b Binary files /dev/null and b/BrainPortal/public/doc/fr/feedback/feedback.png differ diff --git a/BrainPortal/public/doc/fr/groups/groups_info.html b/BrainPortal/public/doc/fr/groups/groups_info.html new file mode 100644 index 000000000..fbb384e77 --- /dev/null +++ b/BrainPortal/public/doc/fr/groups/groups_info.html @@ -0,0 +1,60 @@ + + + + + +

Comprendre les Projets

+En sélectionnant la liste déroulante Créer un projet sous l'onglet Projets, vous pouvez créer un nouveau projet. Le projet créé est un projet de travail auquel seul son créateur a accès. Des utilisateurs supplémentaires peuvent être ajoutés au projet par l'administrateur du système. + +

+Projets +
+
+Les projets facilitent le partage de fichiers et de ressources entre les utilisateurs. Lorsqu'un projet actif est sélectionné, les fichiers et les ressources associés à ce projet deviennent accessibles dans les différents onglets. +
+
+Il existe quatre types de projets : les projets système, les projets de site, les projets utilisateur et les projets de travail. +
+
    +
  • Projets Système
  • +
      +
    • Tous les utilisateurs de CBRAIN sont automatiquement membres du projet système everyone.
    • +
    +
  • Projets de Site
  • +
      +
    • Un projet de site est automatiquement associé à chaque site..
    • +
    +
  • Projets d'utilisateur
  • +
      +
    • Chaque utilisateur de CBRAIN est automatiquement associé à un projet dont il est le seul membre. Ce projet porte le nom d'utilisateur de ce dernier.
    • +
    +
  • Projets de Travail
  • +
      +
    • Un projet de travail est un type de projet que tout utilisateur peut créer.
    • +
    +
+En haut de la page, vous pouvez sélectionner le projet actif. +
+
+ diff --git a/BrainPortal/public/doc/fr/messages/message_info.html b/BrainPortal/public/doc/fr/messages/message_info.html new file mode 100644 index 000000000..e3c4ced6b --- /dev/null +++ b/BrainPortal/public/doc/fr/messages/message_info.html @@ -0,0 +1,46 @@ + + + + + +

Messages

+ +
+
+Il existe trois types de messages: +
    +
  • Système
  • +
      +
    • Les messages système sont affichés en bleu et sont envoyés par l'administrateur du système..
    • +
    +
  • Notifications
  • +
      +
    • Les avis sont affichés en vert et indiquent la réussite des tâches..
    • +
    +
  • Erreur
  • +
      +
    • Les messages d'erreur sont affichés en rouge et signalent les erreurs survenues lors de l'exécution des tâches..
    • +
    +
+ diff --git a/BrainPortal/public/doc/fr/server/view_server.html b/BrainPortal/public/doc/fr/server/view_server.html new file mode 100644 index 000000000..60541e8c4 --- /dev/null +++ b/BrainPortal/public/doc/fr/server/view_server.html @@ -0,0 +1,33 @@ + + + +

Consulter les informations sur les serveurs

+
+
+L'onglet Serveurs permet d'accéder à une page (voir ci-dessous) affichant les détails des serveurs d'exécution disponibles. Les serveurs peuvent être associés à un site ou à un groupe. Vous pouvez également définir s'ils sont en ligne ou hors ligne, ainsi que s'ils sont actifs ou non. Les workers exécutent les tâches sur le cluster, et la charge (load) correspond aux tâches actuellement en cours d'exécution sur le cluster. + +
+
+ + diff --git a/BrainPortal/public/doc/fr/server/view_server.png b/BrainPortal/public/doc/fr/server/view_server.png new file mode 100644 index 000000000..119219dde Binary files /dev/null and b/BrainPortal/public/doc/fr/server/view_server.png differ diff --git a/BrainPortal/public/doc/fr/sites/site_info.html b/BrainPortal/public/doc/fr/sites/site_info.html new file mode 100644 index 000000000..ed26a35b2 --- /dev/null +++ b/BrainPortal/public/doc/fr/sites/site_info.html @@ -0,0 +1,29 @@ + + + +

Consulter les informations sur les sites

+
+
+Les sites sont essentiellement des abstractions des différentes organisations associées à CBRAIN. Les informations affichées sur la page d'information du site comprennent le nombre d'utilisateurs, de groupes, de fichiers, de fournisseurs de données et de ressources distantes associés au site. +
diff --git a/BrainPortal/public/doc/fr/tool/tool.png b/BrainPortal/public/doc/fr/tool/tool.png new file mode 100644 index 000000000..c8167e436 Binary files /dev/null and b/BrainPortal/public/doc/fr/tool/tool.png differ diff --git a/BrainPortal/public/doc/fr/tool/tool_info.html b/BrainPortal/public/doc/fr/tool/tool_info.html new file mode 100644 index 000000000..68ce2e824 --- /dev/null +++ b/BrainPortal/public/doc/fr/tool/tool_info.html @@ -0,0 +1,30 @@ + + + +

Consulter l'accessibilité des outils

+ +

La page d'information des outils (voir la figure ci-dessous) affiche des informations sur tous les outils disponibles, l'utilisateur qui en est le propriétaire, le groupe auquel ils appartiennent, le serveur d'exécution sur lequel ils sont installés ainsi que le type d'outil (conversion ou scientifique). Pour pouvoir utiliser un outil, vous devez appartenir à un groupe auquel celui-ci est attribué, et le serveur d'exécution sur lequel il est installé doit être disponible.

+ + + diff --git a/BrainPortal/public/doc/fr/userfiles/file_formats_overview.html b/BrainPortal/public/doc/fr/userfiles/file_formats_overview.html new file mode 100644 index 000000000..c1de7d154 --- /dev/null +++ b/BrainPortal/public/doc/fr/userfiles/file_formats_overview.html @@ -0,0 +1,91 @@ + + + + + +

Medical Imaging File Formats

+ +
+
+MINC 1 and MINC 2 +
+MINC is a software system for storing and manipulating medical images, originally developed in 1993 by Peter Neelin at the McConnell Brain Imaging Centre. The name MINC is an acronym for Medical Imaging NetCDF. MINC was conceived as a means to allow researchers to use a common set of tools and files to work with medical images in a variety of modalities. The file format was originally defined as a specialization of the NetCDF (Network Common Data Form) file format created by the Unidata Program Center at UCAR (University Corporation for Atmospheric Research). The NetCDF format, libraries, and tools were created to store generic datasets of arbitrary dimensionality. NetCDF was chosen because it implements many of the functions that were envisioned for the MINC system. +
+
+Like most other medical imaging data formats, MINC allows medical image data to take on a wide range of data types or ranges, and defines a set of standard supporting data describing the image acquisition parameters or patient details. +
+
+However, MINC is different from most other medical imaging formats in several respects: +
+
    +
  • MINC is inherently N-dimensional. MINC data can be structured with any number of spatial, temporal, or other dimensions, and these dimensions may be organized an an arbitrary order. Actually, NetCDF limits data to at most 100 dimensions, but this has not proven to be a meaningful restriction.
  • +
  • MINC is multi-modal. MINC has been used to store CT, MRI, PET, EEG, and other medical imaging data.
  • +
  • MINC is extensible. MINC file may contain an arbitrary collection of supporting attributes and data. If your study requires that you keep track of a patient's blood pressure or psychiatric history, this information can be added to the header of your MINC files without having to concern yourself with.
  • +
  • MINC is self-describing. Most of the attributes and variables used in MINC have descriptive names and values which can be easily interpreted by a user.
  • +
  • MINC permits scaling of voxel data on either a per-image or per-slice basis.
  • +
  • MINC defines both a voxel and a world coordinate system. A MINC file effectively stores a linear transform which defines the relationship between the logical layout of the voxels in the file and some reference physical coordinate system. The physical coordinate system could be the scanner's native coordinates, or it could be a more universal coordinate space such as the Talairach system.
  • +
+Like many specialized computing terms, the term 'MINC' has been used in several different ways over the years. It may refer to the file format itself, that is, the definition of the physical and logical layout of data within a MINC file. It is also applied to the programming environment which exists to provide access to MINC format files. Lastly, the term sometimes refers to the rapidly evolving set of programs and scripts which analyses, modify, or display MINC files. +
+
+The 'core' MINC system can be considered to include the following: +
+
    +
  • The file format itself
  • +
  • The 'libminc' programming interface, which allows programmers full access to the format.
  • +
  • The 'volume_io' programming interface, which provides a simplified but restricted programming interface to the MINC format.
  • +
  • A set of tools written using these libraries.
  • +
+In addition to the core MINC tools, a large set of additional application programs exist which perform more sophisticated operations on MINC files. These include programs for visualization, image enhancement or correction, automatic tissue classification, and image registration. +
+
+ +Versions +
+MINC 2 has been designed to address a few specific problems that had been identified in MINC 1. +
+
    +
  • Limited file size. The NetCDF file format used 32-bit pointers to address objects within the file. This effectively restricted files to a maximum size of 2 gigabytes. With the advent of very high resolution brain atlas data (from macrotome or other sources) and large fMRI datasets, it became clear that this restriction might become a serious problem. +
  • +
  • Restricted data types. The NetCDF format defines a small fixed set of data types - integers, floating point, and ASCII strings. Neither aggregate data (arrays or structures) nor labeled (enumerated) data are supported as fundamental data types in NetCDF.
  • +
  • Limited storage options. NetCDF files store data in a contiguous array. This inhibits the addition of either block addressable data or internal data compression to the NetCDF format.
  • +
+ +Since most of these problems were inherent in the MINC 1 file format, it was clear that the design of MINC 2 would require a major revision of the file format. The team developing MINC 2 chose to replace NetCDF with the HDF5 library to form the basis of the MINC 2 format. HDF5 provides a number of advanced features which are not available in NetCDF. +
+
+ +Other File Formats Available +
    +
  • hrtt
  • +
  • analyze
  • +
  • asipro
  • +
  • dicom
  • +
  • nii
  • +
  • cw5
  • +
+ +
+
+ diff --git a/BrainPortal/public/doc/fr/userfiles/tools_overview.html b/BrainPortal/public/doc/fr/userfiles/tools_overview.html new file mode 100644 index 000000000..f1cb6f921 --- /dev/null +++ b/BrainPortal/public/doc/fr/userfiles/tools_overview.html @@ -0,0 +1,57 @@ + + + +

Outils scientifiques MINC disponibles


+ +Civet
+ Par défaut, CIVET s'exécute sur des données multispectrales (pondérées en T1, T2 et densité de protons). Les outils de symétrie peuvent être activés en option. L'exécution sur des images T1 uniquement, l'exécution sans ANIMAL et l'ajout de modèles d'enregistrement personnalisés (par exemple, pour l'enregistrement de données pédiatriques) constituent d'autres options principales. CIVET calcule l'épaisseur corticale à chaque sommet à l'aide de la métrique t_link (dans les espaces enregistré et natif) sur des surfaces hémisphériques ayant fait l'objet d'un enregistrement non linéaire. Les surfaces par défaut sont constituées de 81,920 polygones et de 40,962 sommets chacune. CIVET produit également des cartes régionales d'épaisseur ainsi que des mesures de surface fondées sur l'intersection d'ANIMAL avec les surfaces du cortex. +
+
+ Un développement récent consiste en l'introduction d'étapes automatisées de contrôle de la qualité, proposées comme procédures de post-traitement facultatives à exécuter une fois les données traitées par CIVET. Comme CIVET est désormais composé de « modules » contrôlés par un « shell » et que chaque module regroupe plusieurs étapes connexes, le contrôle de la qualité peut désormais être effectué au niveau des modules. Cette modularisation a été introduite afin de faciliter la gestion de CIVET, qui serait autrement constitué d'un script relativement volumineux. +
+
+Mincmath +
+ Mincmath effectue de simples opérations mathématiques voxel par voxel sur un ou plusieurs fichiers MINC ayant la même forme et le même échantillonnage des coordonnées afin de produire un seul fichier de sortie. Les opérations peuvent être unaires (sur un seul fichier), binaires (sur deux fichiers d'entrée) ou cumulatives (sur deux fichiers d'entrée ou plus). Les opérations cumulatives peuvent également être effectuées selon une dimension spécifiée des fichiers d'entrée.
+
+
+ +Mincaverage +
+ Mincaverage calcule la moyenne de plusieurs fichiers MINC. Diverses options sont également disponibles, notamment : la normalisation préalable des volumes, la création d'un volume d'écart-type et le calcul de la moyenne selon une dimension spécifiée des fichiers d'entrée. +
+
+ +Mincpik +
+ Mincpik génère des fichiers d'image à partir de volumes MINC à l'aide de l'utilitaire convert d'ImageMagick. +
+
+ +Mincresample +
+ Mincresample rééchantillonne un fichier MINC selon de nouvelles dimensions spatiales et de nouvelles positions de voxels. Chaque volume du fichier d'entrée (défini par les dimensions spatiales xspace, yspace et zspace) est rééchantillonné conformément aux options de la ligne de commande. Les dimensions non spatiales sont conservées dans leur ordre d'origine, tandis que les dimensions spatiales peuvent être réordonnées afin de produire des images transversales, sagittales ou coronales. Les nouvelles valeurs des voxels sont calculées au moyen d'une interpolation trilinéaire, tricubique ou par plus proche voisin. +
+
+
- Projects + <%= t('.headings.groups') %> <% if current_user.has_role?(:site_manager) || current_user.has_role?(:admin_user) %> - <%= overlay_content_link "(Update)", :style => "text-decoration: underline; font-size: 0.9em", :enclosing_element => "span" do %> + <%= overlay_content_link t('update_parentheses'), :style => "text-decoration: underline; font-size: 0.9em", :enclosing_element => "span" do %> <%= form_for @user, :as => :user, :url => { :action => "update" } do |f| -%> <%= render :partial => 'shared/group_tables', :locals => {:model => @user} %>
- <%= submit_tag 'Update Projects' %> + <%= submit_tag t('.submit') %> <% end %> <% end %> <% end %> @@ -360,9 +349,9 @@
Project NameProject TypeMembers<%= t('.headings.project_name') %><%= t('.headings.project_type') %><%= t('.headings.members') %>
+ The box below shows your personal, public SSH key that the CBRAIN system will use + to connect to your Data Provider. It is one line of text that needs to be installed + in your home directory on the remote host you configured for your Data Provider. +

+ For experts: if you are already familiar with this type of setup, you can simply cut-and-paste the + key with a text editor in the file .ssh/authorized_keys on the remote system. + Make sure permissions on the folder .ssh are 'rwx------' and on the file authorized_keys are 'rw-------'. +

+ For newcomers: consider downloading the key using the link below and saving it as a file 'mykey.pub' on + your current computer (or any computer). Then in a bash shell, run the 'ssh-copy-id' command as + explained below and it will automatically connect to the remote host + and install the key for you. The full command is:

+

+ Note that revealing this key's content to other people causes no security risks. + The information in this key is meant to be public and people cannot use it to access your information. +
+ The box below shows your personal, public SSH key that the CBRAIN system will use + to connect to your Data Provider. It is one line of text that needs to be installed + in your home directory on the remote host you configured for your Data Provider. +

+ For experts: if you are already familiar with this type of setup, you can simply cut-and-paste the + key with a text editor in the file .ssh/authorized_keys on the remote system. + Make sure permissions on the folder .ssh are 'rwx------' and on the file authorized_keys are 'rw-------'. +

+ For newcomers: consider downloading the key using the link below and saving it as a file 'mykey.pub' on + your current computer (or any computer). Then in a bash shell, run the 'ssh-copy-id' command as + explained below and it will automatically connect to the remote host + and install the key for you. The full command is:

+

+ Note that revealing this key's content to other people causes no security risks. + The information in this key is meant to be public and people cannot use it to access your information. +