Compare commits

...

12 Commits

Author SHA1 Message Date
fe5c0d5113 fix: update sitemap retrieval logic
Some checks failed
Docker Dev / docker (push) Has been cancelled
CI / scan_ruby (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
Docker Main / docker (push) Has been cancelled
- Change from using `get_object` to `head_object` to check if the
  sitemap file exists before attempting to retrieve it.
- Implement a presigned URL for accessing the sitemap, which is valid
  for 15 minutes.
- Set cache headers to allow for 1 hour of caching.
- Improved logging for better error tracking and debugging.

This change enhances the efficiency of sitemap retrieval by reducing
unnecessary data transfer and provides a more secure way to access
the sitemaps through presigned URLs. It also improves error handling
by logging specific errors related to missing sitemaps.
2025-02-24 17:42:55 +08:00
3ae870047a feat: add sitemap management feature
- Implement index action to list sitemaps
- Create view for displaying sitemaps with details
- Add helper method for generating sitemap URLs
- Enhance error handling for S3 service errors

This commit introduces a new feature for managing sitemaps in the application. It includes an index view that lists all available sitemaps with their last modified date and size, along with a link to view each sitemap. The error handling for S3 interactions has also been improved to log errors and return appropriate responses.
2025-02-24 17:28:21 +08:00
2a360a6875 style: fix formatting in Arabic locale file
- Ensure consistent formatting in the long date string
- No functional changes were made, only a formatting adjustment

This commit addresses a minor formatting issue in the Arabic locale file, ensuring that the long date format is consistent with the expected output. No changes to functionality or behavior were introduced.
2025-02-24 17:09:21 +08:00
bd04bb63a1 feat: add support for multiple languages
- Update available locales to include Bengali, Hindi, Urdu, and Arabic
- Add new locale files for each language with translations for UI elements
- Ensure the application can now support a wider audience by providing
  localized content

This change enhances the application's accessibility and usability for
users who speak these languages, allowing for a more inclusive user
experience. The new translations cover key UI components and messages,
ensuring that users can interact with the application in their native
languages.
2025-02-24 17:04:23 +08:00
5f98d9ebfd feat: enhance language switcher dropdown
- Update dropdown to support dynamic locales from I18n
- Limit dropdown height with overflow handling for better UX

This change improves the language switcher by dynamically
loading available locales from the I18n configuration. It
also enhances the user experience by limiting the height
of the dropdown and enabling scrolling, making it easier
to navigate through multiple language options.
2025-02-24 15:55:01 +08:00
9ef2a92d60 feat: add multiple language support for locales
- Extend available locales in the application to include:
  - Portuguese (Brazil)
  - Croatian
  - Persian
  - German
  - Spanish
  - French
  - Italian
  - Turkish
  - Russian
  - Ukrainian
  - Polish

- Create new locale files for each language with appropriate translations.
- Update existing locale files to include new languages.

This update enhances the application's accessibility by supporting a wider range of languages, allowing users from different regions to interact with the application in their native language.
2025-02-24 15:46:29 +08:00
03c957e654 feat: add date formats to localization
- Introduce default, short, and long date formats
- Enhance date representation for better user experience

This update allows the application to display dates in multiple formats,
including a default format of 'YYYY-MM-DD', a short format of
'"MMM DD"', and a long format of '"Month DD, YYYY"'. This
improves localization support and user interface flexibility.
2025-02-24 14:20:49 +08:00
b2cc7e7016 chore: update keywords for SEO optimization
- Refactor keywords in cities_controller.rb
- Refactor keywords in weather_arts_controller.rb
- Refactor keywords in application.html.erb

This change improves the SEO of the application by updating
keywords to include 'ai' and 'ai web', which are more relevant
and likely to enhance search visibility. The previous keywords
were less optimized for current trends in AI-related searches.
2025-02-24 14:12:51 +08:00
da2f4f6c86 fix: update keywords for better SEO
- Modify keywords in cities_controller.rb to include 'ai weather'
- Update keywords in weather_arts_controller.rb to include 'ai weather'
- Change keywords in application.html.erb to include 'ai weather'

These changes enhance the search engine optimization (SEO) of the
application by ensuring that relevant keywords are included in
meta tags, improving visibility for users searching for AI
weather-related content.
2025-02-24 14:10:32 +08:00
3661d2b008 chore: update meta keywords for SEO
- Modify keywords in CitiesController for better
  categorization of AI art and weather art.
- Update keywords in WeatherArtsController to include
  city country name and description.
- Add keywords in application layout for overall site
  SEO improvement.

These changes aim to improve search engine visibility
and better describe the content related to AI-generated
weather art.
2025-02-24 14:08:25 +08:00
0e476b546d feat: add locking mechanism to batch task worker
Some checks failed
Docker Dev / docker (push) Has been cancelled
CI / scan_ruby (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
Docker Main / docker (push) Has been cancelled
- Introduce a Redis-based lock to prevent concurrent execution of
  batch generation tasks.
- Set a TTL of 300 seconds for the lock to ensure it is released
  after a timeout.
- Add logging for situations where a task is already in progress.

This enhancement ensures that batch tasks do not overlap, which can
lead to data inconsistencies and resource contention. The locking
mechanism improves the reliability of the batch processing system.
2025-02-22 15:41:42 +08:00
d331a73a85 fix: update html lang attribute for I18n
- Change the lang attribute of the HTML tag to use the current I18n locale
- This change ensures that the application correctly reflects the user's language preferences

Updating this attribute improves accessibility and SEO by helping search engines and assistive technologies better understand the language of the content.
2025-02-22 15:19:40 +08:00
28 changed files with 1279 additions and 28 deletions

View File

@ -46,7 +46,7 @@ class CitiesController < ApplicationController
set_meta_tags(
title: @city.name,
description: "Experience #{@city.name}'s weather through AI-generated art. Daily updates of weather conditions visualized through artificial intelligence.",
keywords: "#{@city.name}, #{@city.country.name}, weather art, AI visualization",
keywords: "#{@city.name}, #{@city.country.name}, ai, ai web, ai art, ai weather, weather art, AI visualization",
og: {
image: @city.latest_weather_art&.image&.attached? ? url_for(@city.latest_weather_art.image) : nil
}

View File

@ -1,33 +1,126 @@
class SitemapsController < ApplicationController
include SitemapsHelper
before_action :set_bucket_name
def index
@sitemaps = list_sitemaps
respond_to do |format|
format.html
format.xml { render_sitemap_index }
end
rescue Aws::S3::Errors::ServiceError => e
Rails.logger.error "S3 Error: #{e.message}"
render status: :internal_server_error
end
def show
path = params[:path]
bucket_name =
Rails.env.production? ?
ENV.fetch("AWS_BUCKET", Rails.application.credentials.dig(:minio, :bucket)) :
ENV.fetch("AWS_DEV_BUCKET", Rails.application.credentials.dig(:minio_dev, :bucket))
Rails.logger.info "Sitemap: #{path}"
key = "sitemaps/#{path}"
Rails.logger.info "Requesting sitemap: #{path}"
begin
s3_client = Aws::S3::Client.new
response = s3_client.get_object(
bucket: bucket_name,
key: "sitemaps/#{path}"
# 检查文件是否存在
s3_client.head_object(
bucket: @bucket_name,
key: key
)
expires_in 12.hours, public: true
content_type = response.content_type || "application/xml"
send_data(
response.body.read,
filename: path,
type: content_type,
disposition: "inline"
# 生成预签名URL设置15分钟有效期
signer = Aws::S3::Presigner.new(client: s3_client)
url = signer.presigned_url(
:get_object,
bucket: @bucket_name,
key: key,
expires_in: 15 * 60, # 15 minutes
# response_content_type: 'application/xml', # 确保正确的内容类型
response_content_disposition: "inline" # 在浏览器中直接显示
)
rescue Aws::S3::Errors::NoSuchKey
# 设置缓存头
response.headers["Cache-Control"] = "public, max-age=3600" # 1小时缓存
# 重定向到预签名URL
redirect_to url, allow_other_host: true, status: :found
rescue Aws::S3::Errors::NotFound
Rails.logger.error "Sitemap not found: #{path}"
render status: :not_found
rescue Aws::S3::Errors::ServiceError => e
Rails.logger.error "S3 Error: #{e.message}"
render status: :internal_server_error
end
end
# def show
# path = params[:path]
# Rails.logger.info "Sitemap: #{path}"
# begin
# response = s3_client.get_object(
# bucket: @bucket_name,
# key: "sitemaps/#{path}"
# )
# expires_in 12.hours, public: true
# content_type = response.content_type || "application/xml"
# send_data(
# response.body.read,
# filename: path,
# type: content_type,
# disposition: "inline"
# )
# rescue Aws::S3::Errors::NoSuchKey
# render status: :not_found
# rescue Aws::S3::Errors::ServiceError => e
# Rails.logger.error "S3 Error: #{e.message}"
# render status: :internal_server_error
# end
# end
private
def set_bucket_name
@bucket_name = Rails.env.production? ?
ENV.fetch("AWS_BUCKET", Rails.application.credentials.dig(:minio, :bucket)) :
ENV.fetch("AWS_DEV_BUCKET", Rails.application.credentials.dig(:minio_dev, :bucket))
end
def s3_client
@s3_client ||= Aws::S3::Client.new
end
def list_sitemaps
response = s3_client.list_objects_v2(
bucket: @bucket_name,
prefix: "sitemaps/"
)
response.contents.map do |object|
{
key: object.key.sub("sitemaps/", ""),
last_modified: object.last_modified,
size: object.size,
url: sitemap_url(object.key.sub("sitemaps/", ""))
}
end.reject { |obj| obj[:key].empty? }
end
def render_sitemap_index
base_url = "#{request.protocol}#{request.host_with_port}"
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
xml.sitemapindex(xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9") do
@sitemaps.each do |sitemap|
xml.sitemap do
xml.loc "#{base_url}/sitemaps/#{sitemap[:key]}"
xml.lastmod sitemap[:last_modified].iso8601
end
end
end
end
render xml: builder.to_xml
end
end

View File

@ -17,7 +17,7 @@ class WeatherArtsController < ApplicationController
set_meta_tags(
title: "#{@city.name} Weather Art - #{@weather_art.weather_date.strftime('%B %d, %Y')}",
description: "#{@city.name}'s weather visualized through AI art. #{@weather_art.description} at #{@weather_art.temperature}°C.",
keywords: "#{@city.name}, weather art, #{@weather_art.description}, AI visualization",
keywords: "#{@city.name}, #{@city.country.name}, ai, ai web, ai art, ai weather, weather art, AI visualization, #{@weather_art.description}",
og: {
image: @weather_art.image.attached? ? url_for(@weather_art.image) : nil
}

View File

@ -1,2 +1,5 @@
module SitemapsHelper
def sitemap_url(filename)
"/sitemaps/#{filename}"
end
end

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="<%= I18n.locale %>">
<head>
<title><%= content_for(:title) || "Today Ai Weather" %></title>
<meta name="viewport" content="width=device-width,initial-scale=1">
@ -11,6 +11,7 @@
og: {
site_name: 'TodayAIWeather',
type: 'website',
keywords: "ai, ai web, ai art, ai weather, weather art, AI visualization, today ai weather",
url: request.original_url
},
alternate: {

View File

@ -6,8 +6,8 @@
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-32">
<% [:en, :'zh-CN', :ja, :ko].each do |locale| %>
<ul tabindex="0" class="dropdown-content menu p-2 max-h-80 overflow-y-auto flex-nowrap shadow bg-base-100 rounded-box w-32">
<% I18n.available_locales.each do |locale| %>
<%= link_to url_for(locale: locale),
class: "px-4 py-2 hover:bg-base-200 rounded-lg #{I18n.locale == locale ? 'bg-base-200' : ''}" do %>
<%= t("language.#{locale}") %>

View File

@ -0,0 +1,43 @@
<%# app/views/sitemaps/index.html.erb %>
<div class="container mx-auto px-4 py-8">
<div class="max-w-4xl mx-auto">
<h1 class="text-3xl font-bold mb-6">Sitemaps Index</h1>
<div class="bg-white rounded-lg shadow overflow-hidden">
<div class="overflow-x-auto">
<table class="table w-full">
<thead>
<tr>
<th>Filename</th>
<th>Last Modified</th>
<th>Size</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% @sitemaps.each do |sitemap| %>
<tr class="hover">
<td><%= sitemap[:key] %></td>
<td><%= sitemap[:last_modified].strftime("%Y-%m-%d %H:%M:%S") %></td>
<td><%= number_to_human_size(sitemap[:size]) %></td>
<td>
<%= link_to "View", sitemap[:url],
class: "btn btn-sm btn-primary",
target: "_blank" %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<div class="mt-6 bg-base-200 p-4 rounded-lg">
<h2 class="text-xl font-semibold mb-2">For Search Engines</h2>
<p class="mb-2">Sitemap Index URL:</p>
<code class="block bg-base-300 p-2 rounded">
<%= sitemaps_url(format: :xml) %>
</code>
</div>
</div>
</div>

View File

@ -8,6 +8,25 @@ class BatchGenerateWeatherArtsWorker
PER_RUN_GENERATION_LIMIT = 2 # 每次运行生成图片上限
def perform(*args)
lock_key = "batch_generate_weather_lock"
lock_ttl = 300 # 锁的生存时间,单位为秒
redis = Redis.new(url: ENV.fetch("REDIS_URL", "redis://localhost:6379/1"))
if redis.set(lock_key, Time.current.to_s, nx: true, ex: lock_ttl)
begin
batch_tasks
ensure
redis.del(lock_key)
end
else
Rails.logger.info "Sitemap refresh is already in progress"
end
end
private
def batch_tasks
start_time = Time.current
remaining_slots = calculate_remaining_slots
return if remaining_slots <= 0
@ -38,8 +57,6 @@ class BatchGenerateWeatherArtsWorker
print_summary(processed_cities, skipped_cities)
end
private
def get_recent_cities
cutoff_time = Time.current - GENERATION_INTERVAL
City.joins("LEFT JOIN (

View File

@ -5,7 +5,7 @@ require "i18n/backend/fallbacks"
I18n.load_path += Dir[Rails.root.join("config", "locales", "*.{rb,yml}")]
# Permitted locales available for the application
I18n.available_locales = [ :en, :"zh-CN", :ja, :ko ]
I18n.available_locales = [ :en, :"zh-CN", :ja, :ko, :"pt-BR", :hr, :fa, :de, :es, :fr, :it, :tr, :ru, :uk, :pl, :bn, :hi, :ur, :ar ]
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
# I18n::Backend::Simple.include I18n::Backend::Fallbacks

67
config/locales/ar.yml Normal file
View File

@ -0,0 +1,67 @@
ar:
hello: "مرحباً بالعالم"
brand:
name: "الطقس اليوم بالذكاء الاصطناعي"
title:
cities: "المدن"
arts: "الفنون"
sign_in: "تسجيل الدخول"
sign_out: "تسجيل الخروج"
settings: "الإعدادات"
admin_dashboard: "لوحة تحكم المشرف"
latest_weather_art: "أحدث فن الطقس"
popular_weather_art: "فن الطقس الشائع"
ai_prompt: "موجه الذكاء الاصطناعي"
text:
latest_from: "أحدث من"
search_cities: "البحث عن المدن..."
all_regions: "جميع المناطق"
all_countries: "جميع البلدان"
all_in: "الكل في"
showing: "عرض"
weather_arts: "فنون الطقس"
newest_first: "الأحدث أولاً"
oldest_first: "الأقدم أولاً"
cities:
title: "استكشف المدن"
arts:
title: "معرض فنون الطقس"
subtitle: "اكتشف فن الطقس المُنشأ بالذكاء الاصطناعي من مدن حول العالم"
home:
headline_html: حيث يلتقي الطقس<br>بالذكاء الاصطناعي
subtitle:
اختبر الطقس من خلال عدسة الفن المُنشأ بالذكاء الاصطناعي،
مما يجلب منظوراً جديداً للظواهر الجوية اليومية.
button:
explore_cities: "استكشف المدن"
view_detail: "عرض التفاصيل"
view_all_weather_arts: "عرض كل فنون الطقس"
back_to_cities: "العودة إلى المدن"
back_to: "العودة إلى"
card:
temperature: "درجة الحرارة"
wind: "الرياح"
humidity: "الرطوبة"
visibility: "الرؤية"
pressure: "الضغط"
cloud_cover: "الغطاء السحابي"
feel_like: "الشعور كأنها"
relative_humidity: "الرطوبة النسبية"
clear_view_distance: "مسافة الرؤية الواضحة"
atmospheric_pressure: "الضغط الجوي"
sky_coverage: "تغطية السماء"
pagination:
showing_items: "عرض %{from} إلى %{to} من %{total} %{items}"
items:
weather: "سجلات الطقس"
default: "العناصر"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

67
config/locales/bn.yml Normal file
View File

@ -0,0 +1,67 @@
bn:
hello: "ওহে বিশ্ব"
brand:
name: "টুডে এআই ওয়েদার"
title:
cities: "শহরগুলি"
arts: "শিল্প"
sign_in: "সাইন ইন"
sign_out: "সাইন আউট"
settings: "সেটিংস"
admin_dashboard: "অ্যাডমিন ড্যাশবোর্ড"
latest_weather_art: "সর্বশেষ আবহাওয়া শিল্প"
popular_weather_art: "জনপ্রিয় আবহাওয়া শিল্প"
ai_prompt: "এআই প্রম্পট"
text:
latest_from: "সর্বশেষ"
search_cities: "শহর অনুসন্ধান..."
all_regions: "সব অঞ্চল"
all_countries: "সব দেশ"
all_in: "সবগুলি"
showing: "দেখাচ্ছে"
weather_arts: "আবহাওয়া শিল্প"
newest_first: "নতুনগুলি প্রথমে"
oldest_first: "পুরানোগুলি প্রথমে"
cities:
title: "শহরগুলি অন্বেষণ করুন"
arts:
title: "আবহাওয়া শিল্প গ্যালারি"
subtitle: "বিশ্বজুড়ে শহরগুলি থেকে এআই-জেনারেটেড আবহাওয়া শিল্প আবিষ্কার করুন"
home:
headline_html: যেখানে আবহাওয়া মিলিত হয়<br>কৃত্রিম বুদ্ধিমত্তার সাথে
subtitle:
এআই-জেনারেটেড শিল্পের মাধ্যমে আবহাওয়া অনুভব করুন,
দৈনিক আবহাওয়া ঘটনার একটি নতুন দৃষ্টিভঙ্গি আনয়ন করে।
button:
explore_cities: "শহরগুলি অন্বেষণ করুন"
view_detail: "বিস্তারিত দেখুন"
view_all_weather_arts: "সমস্ত আবহাওয়া শিল্প দেখুন"
back_to_cities: "শহরগুলিতে ফিরে যান"
back_to: "ফিরে যান"
card:
temperature: "তাপমাত্রা"
wind: "বাতাস"
humidity: "আর্দ্রতা"
visibility: "দৃশ্যমানতা"
pressure: "চাপ"
cloud_cover: "মেঘাচ্ছন্নতা"
feel_like: "অনুভূত হয়"
relative_humidity: "আপেক্ষিক আর্দ্রতা"
clear_view_distance: "পরিষ্কার দৃষ্টির দূরত্ব"
atmospheric_pressure: "বায়ুমণ্ডলীয় চাপ"
sky_coverage: "আকাশ আচ্ছাদন"
pagination:
showing_items: "%{total} %{items}-এর মধ্যে %{from} থেকে %{to} দেখানো হচ্ছে"
items:
weather: "আবহাওয়া রেকর্ড"
default: "আইটেম"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

67
config/locales/de.yml Normal file
View File

@ -0,0 +1,67 @@
de:
hello: "Hallo Welt"
brand:
name: "Today AI Weather"
title:
cities: "Städte"
arts: "Kunst"
sign_in: "Anmelden"
sign_out: "Abmelden"
settings: "Einstellungen"
admin_dashboard: "Admin-Dashboard"
latest_weather_art: "Neueste Wetterkunst"
popular_weather_art: "Beliebte Wetterkunst"
ai_prompt: "KI-Prompt"
text:
latest_from: "Neuestes von"
search_cities: "Städte suchen..."
all_regions: "Alle Regionen"
all_countries: "Alle Länder"
all_in: "Alles in"
showing: "Zeigt"
weather_arts: "Wetterkunst"
newest_first: "Neueste zuerst"
oldest_first: "Älteste zuerst"
cities:
title: "Städte erkunden"
arts:
title: "Wetterkunst-Galerie"
subtitle: "Entdecken Sie KI-generierte Wetterkunst aus Städten auf der ganzen Welt"
home:
headline_html: Wo Wetter auf<br>Künstliche Intelligenz trifft
subtitle:
Erleben Sie Wetter durch die Linse KI-generierter Kunst,
die eine neue Perspektive auf tägliche meteorologische Phänomene bietet.
button:
explore_cities: "Städte erkunden"
view_detail: "Details anzeigen"
view_all_weather_arts: "Alle Wetterkunst anzeigen"
back_to_cities: "Zurück zu Städten"
back_to: "Zurück zu"
card:
temperature: "Temperatur"
wind: "Wind"
humidity: "Luftfeuchtigkeit"
visibility: "Sichtweite"
pressure: "Luftdruck"
cloud_cover: "Bewölkung"
feel_like: "Gefühlt wie"
relative_humidity: "Relative Luftfeuchtigkeit"
clear_view_distance: "Klare Sichtweite"
atmospheric_pressure: "Atmosphärischer Druck"
sky_coverage: "Himmelsbedeckung"
pagination:
showing_items: "Zeigt %{from} bis %{to} von %{total} %{items}"
items:
weather: "Wetteraufzeichnungen"
default: "Einträge"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%d. %b"
long: "%d. %B %Y"

View File

@ -32,7 +32,23 @@ en:
en: "English"
zh-CN: "简体中文"
ja: "日本語"
ko: "한국어"
ko: "한국어" # 韩语
pt-BR: "Português (Brasil)" # 巴西葡萄牙语
pt: "Português" # 葡萄牙语
hr: "Hrvatski" # 克罗地亚语
fa: "فارسی" # 波斯语(法尔西语)
de: "Deutsch" # 德语
es: "Español" # 西班牙语
fr: "Français" # 法语
it: "Italiano" # 意大利语
tr: "Türkçe" # 土耳其语
ru: "Русский" # 俄语
uk: "Українська" # 乌克兰语
pl: "Polski" # 波兰语
bn: "বাংলা" # 孟加拉
hi: "हिंदी" # 印地语
ur: " اردو" # 乌尔都语
ar: "العربية" # 阿拉伯
hello: "Hello world"
brand:
name: "Today AI Weather"
@ -94,3 +110,8 @@ en:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

67
config/locales/es.yml Normal file
View File

@ -0,0 +1,67 @@
es:
hello: "Hola mundo"
brand:
name: "Today AI Weather"
title:
cities: "Ciudades"
arts: "Arte"
sign_in: "Iniciar sesión"
sign_out: "Cerrar sesión"
settings: "Configuración"
admin_dashboard: "Panel de administración"
latest_weather_art: "Último arte del tiempo"
popular_weather_art: "Arte del tiempo popular"
ai_prompt: "Prompt de IA"
text:
latest_from: "Lo último de"
search_cities: "Buscar ciudades..."
all_regions: "Todas las regiones"
all_countries: "Todos los países"
all_in: "Todo en"
showing: "Mostrando"
weather_arts: "Arte del tiempo"
newest_first: "Más recientes primero"
oldest_first: "Más antiguos primero"
cities:
title: "Explorar ciudades"
arts:
title: "Galería de arte del tiempo"
subtitle: "Descubre arte generado por IA del tiempo de ciudades de todo el mundo"
home:
headline_html: Donde el tiempo se encuentra<br>con la Inteligencia Artificial
subtitle:
Experimenta el tiempo a través del lente del arte generado por IA,
brindando una nueva perspectiva a los fenómenos meteorológicos diarios.
button:
explore_cities: "Explorar ciudades"
view_detail: "Ver detalles"
view_all_weather_arts: "Ver todo el arte del tiempo"
back_to_cities: "Volver a ciudades"
back_to: "Volver a"
card:
temperature: "Temperatura"
wind: "Viento"
humidity: "Humedad"
visibility: "Visibilidad"
pressure: "Presión"
cloud_cover: "Cobertura de nubes"
feel_like: "Sensación térmica"
relative_humidity: "Humedad relativa"
clear_view_distance: "Distancia de visibilidad clara"
atmospheric_pressure: "Presión atmosférica"
sky_coverage: "Cobertura del cielo"
pagination:
showing_items: "Mostrando %{from} a %{to} de %{total} %{items}"
items:
weather: "registros meteorológicos"
default: "elementos"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d de %B de %Y"

67
config/locales/fa.yml Normal file
View File

@ -0,0 +1,67 @@
fa:
hello: "سلام دنیا"
brand:
name: "هوای هوش مصنوعی امروز"
title:
cities: "شهرها"
arts: "هنرها"
sign_in: "ورود"
sign_out: "خروج"
settings: "تنظیمات"
admin_dashboard: "داشبورد مدیر"
latest_weather_art: "آخرین هنر آب و هوا"
popular_weather_art: "هنر آب و هوای محبوب"
ai_prompt: "پرامپت هوش مصنوعی"
text:
latest_from: "آخرین از"
search_cities: "جستجوی شهرها..."
all_regions: "همه مناطق"
all_countries: "همه کشورها"
all_in: "همه در"
showing: "نمایش"
weather_arts: "هنرهای آب و هوا"
newest_first: "جدیدترین اول"
oldest_first: "قدیمی‌ترین اول"
cities:
title: "کاوش شهرها"
arts:
title: "گالری هنرهای آب و هوا"
subtitle: "کشف هنر آب و هوای تولید شده توسط هوش مصنوعی از شهرهای سراسر جهان"
home:
headline_html: جایی که آب و هوا با<br>هوش مصنوعی ملاقات می‌کند
subtitle:
تجربه آب و هوا از طریق لنز هنر تولید شده توسط هوش مصنوعی،
آوردن دیدگاهی جدید به پدیده‌های هواشناسی روزانه.
button:
explore_cities: "کاوش شهرها"
view_detail: "مشاهده جزئیات"
view_all_weather_arts: "مشاهده همه هنرهای آب و هوا"
back_to_cities: "بازگشت به شهرها"
back_to: "بازگشت به"
card:
temperature: "دما"
wind: "باد"
humidity: "رطوبت"
visibility: "دید"
pressure: "فشار"
cloud_cover: "پوشش ابر"
feel_like: "احساس مانند"
relative_humidity: "رطوبت نسبی"
clear_view_distance: "فاصله دید شفاف"
atmospheric_pressure: "فشار جو"
sky_coverage: "پوشش آسمان"
pagination:
showing_items: "نمایش %{from} تا %{to} از %{total} %{items}"
items:
weather: "رکوردهای آب و هوا"
default: "موارد"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

67
config/locales/fr.yml Normal file
View File

@ -0,0 +1,67 @@
fr:
hello: "Bonjour le monde"
brand:
name: "Today AI Weather"
title:
cities: "Villes"
arts: "Arts"
sign_in: "Se connecter"
sign_out: "Se déconnecter"
settings: "Paramètres"
admin_dashboard: "Tableau de bord administrateur"
latest_weather_art: "Derniers arts météorologiques"
popular_weather_art: "Arts météorologiques populaires"
ai_prompt: "Prompt IA"
text:
latest_from: "Derniers de"
search_cities: "Rechercher des villes..."
all_regions: "Toutes les régions"
all_countries: "Tous les pays"
all_in: "Tout dans"
showing: "Affichage"
weather_arts: "Arts météorologiques"
newest_first: "Plus récents d'abord"
oldest_first: "Plus anciens d'abord"
cities:
title: "Explorer les villes"
arts:
title: "Galerie d'arts météorologiques"
subtitle: "Découvrez l'art météorologique généré par l'IA des villes du monde entier"
home:
headline_html: "Là où la météo rencontre<br>l'Intelligence Artificielle"
subtitle:
Découvrez la météo à travers le prisme de l'art généré par l'IA,
apportant une nouvelle perspective aux phénomènes météorologiques quotidiens.
button:
explore_cities: "Explorer les villes"
view_detail: "Voir les détails"
view_all_weather_arts: "Voir tous les arts météorologiques"
back_to_cities: "Retour aux villes"
back_to: "Retour à"
card:
temperature: "Température"
wind: "Vent"
humidity: "Humidité"
visibility: "Visibilité"
pressure: "Pression"
cloud_cover: "Couverture nuageuse"
feel_like: "Ressenti"
relative_humidity: "Humidité relative"
clear_view_distance: "Distance de visibilité claire"
atmospheric_pressure: "Pression atmosphérique"
sky_coverage: "Couverture du ciel"
pagination:
showing_items: "Affichage de %{from} à %{to} sur %{total} %{items}"
items:
weather: "relevés météorologiques"
default: "éléments"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d %B %Y"

67
config/locales/hi.yml Normal file
View File

@ -0,0 +1,67 @@
hi:
hello: "नमस्ते दुनिया"
brand:
name: "टुडे एआई वेदर"
title:
cities: "शहर"
arts: "कला"
sign_in: "साइन इन"
sign_out: "साइन आउट"
settings: "सेटिंग्स"
admin_dashboard: "एडमिन डैशबोर्ड"
latest_weather_art: "नवीनतम मौसम कला"
popular_weather_art: "लोकप्रिय मौसम कला"
ai_prompt: "एआई प्रॉम्प्ट"
text:
latest_from: "से नवीनतम"
search_cities: "शहर खोजें..."
all_regions: "सभी क्षेत्र"
all_countries: "सभी देश"
all_in: "सभी में"
showing: "दिखा रहा है"
weather_arts: "मौसम कला"
newest_first: "नवीनतम पहले"
oldest_first: "सबसे पुराना पहले"
cities:
title: "शहरों की खोज करें"
arts:
title: "मौसम कला गैलरी"
subtitle: "दुनिया भर के शहरों से एआई-जनित मौसम कला की खोज करें"
home:
headline_html: जहां मौसम मिलता है<br>कृत्रिम बुद्धिमत्ता
subtitle:
एआई-जनित कला के माध्यम से मौसम का अनुभव करें,
दैनिक मौसम संबंधी घटनाओं को एक नया दृष्टिकोण प्रदान करें।
button:
explore_cities: "शहरों की खोज करें"
view_detail: "विवरण देखें"
view_all_weather_arts: "सभी मौसम कला देखें"
back_to_cities: "शहरों पर वापस जाएं"
back_to: "वापस जाएं"
card:
temperature: "तापमान"
wind: "हवा"
humidity: "नमी"
visibility: "दृश्यता"
pressure: "दबाव"
cloud_cover: "बादल छाए"
feel_like: "महसूस होता है"
relative_humidity: "सापेक्ष आर्द्रता"
clear_view_distance: "स्पष्ट दृश्य दूरी"
atmospheric_pressure: "वायुमंडलीय दबाव"
sky_coverage: "आकाश कवरेज"
pagination:
showing_items: "%{total} %{items} में से %{from} से %{to} तक दिखा रहा है"
items:
weather: "मौसम रिकॉर्ड"
default: "आइटम"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

67
config/locales/hr.yml Normal file
View File

@ -0,0 +1,67 @@
hr:
hello: "Pozdrav svijete"
brand:
name: "Today AI Weather"
title:
cities: "Gradovi"
arts: "Umjetnost"
sign_in: "Prijava"
sign_out: "Odjava"
settings: "Postavke"
admin_dashboard: "Administratorska ploča"
latest_weather_art: "Najnovija vremenska umjetnost"
popular_weather_art: "Popularna vremenska umjetnost"
ai_prompt: "AI upit"
text:
latest_from: "Najnovije od"
search_cities: "Pretraži gradove..."
all_regions: "Sve regije"
all_countries: "Sve države"
all_in: "Sve u"
showing: "Prikazuje se"
weather_arts: "Vremenska umjetnost"
newest_first: "Najnovije prvo"
oldest_first: "Najstarije prvo"
cities:
title: "Istražite gradove"
arts:
title: "Galerija vremenske umjetnosti"
subtitle: "Otkrijte umjetnost vremena generiranu AI-em iz gradova širom svijeta"
home:
headline_html: Gdje se vrijeme susreće<br>s umjetnom inteligencijom
subtitle:
Doživite vrijeme kroz objektiv umjetnosti generirane AI-em,
donoseći novu perspektivu svakodnevnim meteorološkim pojavama.
button:
explore_cities: "Istražite gradove"
view_detail: "Pogledaj detalje"
view_all_weather_arts: "Pogledaj svu vremensku umjetnost"
back_to_cities: "Natrag na gradove"
back_to: "Natrag na"
card:
temperature: "Temperatura"
wind: "Vjetar"
humidity: "Vlažnost"
visibility: "Vidljivost"
pressure: "Tlak"
cloud_cover: "Naoblaka"
feel_like: "Osjeća se kao"
relative_humidity: "Relativna vlažnost"
clear_view_distance: "Udaljenost čistog pogleda"
atmospheric_pressure: "Atmosferski tlak"
sky_coverage: "Pokrivenost neba"
pagination:
showing_items: "Prikazuje se %{from} do %{to} od %{total} %{items}"
items:
weather: "vremenskih zapisa"
default: "stavki"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d. %B %Y."

67
config/locales/it.yml Normal file
View File

@ -0,0 +1,67 @@
it:
hello: "Ciao mondo"
brand:
name: "Today AI Weather"
title:
cities: "Città"
arts: "Arte"
sign_in: "Accedi"
sign_out: "Esci"
settings: "Impostazioni"
admin_dashboard: "Dashboard Amministratore"
latest_weather_art: "Ultima Arte Meteorologica"
popular_weather_art: "Arte Meteorologica Popolare"
ai_prompt: "Prompt IA"
text:
latest_from: "Ultimi da"
search_cities: "Cerca città..."
all_regions: "Tutte le Regioni"
all_countries: "Tutti i Paesi"
all_in: "Tutto in"
showing: "Mostrando"
weather_arts: "Arte Meteorologica"
newest_first: "Prima i più Recenti"
oldest_first: "Prima i più Vecchi"
cities:
title: "Esplora Città"
arts:
title: "Galleria Arte Meteorologica"
subtitle: "Scopri l'arte meteorologica generata dall'IA dalle città di tutto il mondo"
home:
headline_html: Dove il Meteo Incontra<br>l'Intelligenza Artificiale
subtitle:
Vivi il meteo attraverso la lente dell'arte generata dall'IA,
portando una nuova prospettiva ai fenomeni meteorologici quotidiani.
button:
explore_cities: "Esplora Città"
view_detail: "Visualizza Dettagli"
view_all_weather_arts: "Visualizza Tutta l'Arte Meteorologica"
back_to_cities: "Torna alle Città"
back_to: "Torna a"
card:
temperature: "Temperatura"
wind: "Vento"
humidity: "Umidità"
visibility: "Visibilità"
pressure: "Pressione"
cloud_cover: "Copertura Nuvolosa"
feel_like: "Percepita"
relative_humidity: "Umidità relativa"
clear_view_distance: "Distanza di visibilità"
atmospheric_pressure: "Pressione atmosferica"
sky_coverage: "Copertura del cielo"
pagination:
showing_items: "Mostrando da %{from} a %{to} di %{total} %{items}"
items:
weather: "registrazioni meteo"
default: "elementi"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d %B %Y"

67
config/locales/pl.yml Normal file
View File

@ -0,0 +1,67 @@
pl:
hello: "Witaj świecie"
brand:
name: "Today AI Weather"
title:
cities: "Miasta"
arts: "Sztuka"
sign_in: "Zaloguj się"
sign_out: "Wyloguj się"
settings: "Ustawienia"
admin_dashboard: "Panel administratora"
latest_weather_art: "Najnowsza sztuka pogodowa"
popular_weather_art: "Popularna sztuka pogodowa"
ai_prompt: "Prompt AI"
text:
latest_from: "Najnowsze z"
search_cities: "Szukaj miast..."
all_regions: "Wszystkie regiony"
all_countries: "Wszystkie kraje"
all_in: "Wszystko w"
showing: "Wyświetlanie"
weather_arts: "Sztuka pogodowa"
newest_first: "Od najnowszych"
oldest_first: "Od najstarszych"
cities:
title: "Odkryj miasta"
arts:
title: "Galeria sztuki pogodowej"
subtitle: "Odkryj sztukę pogodową generowaną przez AI z miast na całym świecie"
home:
headline_html: Gdzie pogoda spotyka się<br>ze sztuczną inteligencją
subtitle:
Doświadcz pogody przez pryzmat sztuki generowanej przez AI,
wprowadzając nową perspektywę do codziennych zjawisk meteorologicznych.
button:
explore_cities: "Odkryj miasta"
view_detail: "Zobacz szczegóły"
view_all_weather_arts: "Zobacz całą sztukę pogodową"
back_to_cities: "Powrót do miast"
back_to: "Powrót do"
card:
temperature: "Temperatura"
wind: "Wiatr"
humidity: "Wilgotność"
visibility: "Widoczność"
pressure: "Ciśnienie"
cloud_cover: "Zachmurzenie"
feel_like: "Odczuwalna"
relative_humidity: "Wilgotność względna"
clear_view_distance: "Zasięg widoczności"
atmospheric_pressure: "Ciśnienie atmosferyczne"
sky_coverage: "Pokrycie nieba"
pagination:
showing_items: "Wyświetlanie %{from} do %{to} z %{total} %{items}"
items:
weather: "zapisów pogody"
default: "elementów"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d %B %Y"

67
config/locales/pt-BR.yml Normal file
View File

@ -0,0 +1,67 @@
pt-BR:
hello: "Olá mundo"
brand:
name: "Today AI Weather"
title:
cities: "Cidades"
arts: "Artes"
sign_in: "Entrar"
sign_out: "Sair"
settings: "Configurações"
admin_dashboard: "Painel de Administração"
latest_weather_art: "Arte Meteorológica Mais Recente"
popular_weather_art: "Arte Meteorológica Popular"
ai_prompt: "Prompt de IA"
text:
latest_from: "Mais recente de"
search_cities: "Pesquisar cidades..."
all_regions: "Todas as Regiões"
all_countries: "Todos os Países"
all_in: "Tudo em"
showing: "Mostrando"
weather_arts: "Artes Meteorológicas"
newest_first: "Mais Recentes Primeiro"
oldest_first: "Mais Antigos Primeiro"
cities:
title: "Explorar Cidades"
arts:
title: "Galeria de Artes Meteorológicas"
subtitle: "Descubra arte meteorológica gerada por IA de cidades ao redor do mundo"
home:
headline_html: Onde o Clima Encontra<br>a Inteligência Artificial
subtitle:
Experimente o clima através das lentes da arte gerada por IA,
trazendo uma nova perspectiva para os fenômenos meteorológicos diários.
button:
explore_cities: "Explorar Cidades"
view_detail: "Ver Detalhes"
view_all_weather_arts: "Ver Todas as Artes Meteorológicas"
back_to_cities: "Voltar para Cidades"
back_to: "Voltar para"
card:
temperature: "Temperatura"
wind: "Vento"
humidity: "Umidade"
visibility: "Visibilidade"
pressure: "Pressão"
cloud_cover: "Cobertura de Nuvens"
feel_like: "Sensação térmica"
relative_humidity: "Umidade relativa"
clear_view_distance: "Distância de visão clara"
atmospheric_pressure: "Pressão atmosférica"
sky_coverage: "Cobertura do céu"
pagination:
showing_items: "Mostrando %{from} até %{to} de %{total} %{items}"
items:
weather: "registros meteorológicos"
default: "itens"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%d/%m/%Y"
short: "%d %b"
long: "%d de %B de %Y"

67
config/locales/pt.yml Normal file
View File

@ -0,0 +1,67 @@
pt:
hello: "Olá mundo"
brand:
name: "Today AI Weather"
title:
cities: "Cidades"
arts: "Artes"
sign_in: "Entrar"
sign_out: "Sair"
settings: "Configurações"
admin_dashboard: "Painel de Administração"
latest_weather_art: "Arte Meteorológica Mais Recente"
popular_weather_art: "Arte Meteorológica Popular"
ai_prompt: "Prompt de IA"
text:
latest_from: "Mais recente de"
search_cities: "Pesquisar cidades..."
all_regions: "Todas as Regiões"
all_countries: "Todos os Países"
all_in: "Tudo em"
showing: "Mostrando"
weather_arts: "Artes Meteorológicas"
newest_first: "Mais Recentes Primeiro"
oldest_first: "Mais Antigos Primeiro"
cities:
title: "Explorar Cidades"
arts:
title: "Galeria de Artes Meteorológicas"
subtitle: "Descubra arte meteorológica gerada por IA de cidades ao redor do mundo"
home:
headline_html: Onde o Clima Encontra<br>a Inteligência Artificial
subtitle:
Experimente o clima através das lentes da arte gerada por IA,
trazendo uma nova perspectiva para os fenômenos meteorológicos diários.
button:
explore_cities: "Explorar Cidades"
view_detail: "Ver Detalhes"
view_all_weather_arts: "Ver Todas as Artes Meteorológicas"
back_to_cities: "Voltar para Cidades"
back_to: "Voltar para"
card:
temperature: "Temperatura"
wind: "Vento"
humidity: "Umidade"
visibility: "Visibilidade"
pressure: "Pressão"
cloud_cover: "Cobertura de Nuvens"
feel_like: "Sensação térmica"
relative_humidity: "Umidade relativa"
clear_view_distance: "Distância de visão clara"
atmospheric_pressure: "Pressão atmosférica"
sky_coverage: "Cobertura do céu"
pagination:
showing_items: "Mostrando %{from} a %{to} de %{total} %{items}"
items:
weather: "registros meteorológicos"
default: "itens"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%d de %b"
long: "%d de %B de %Y"

67
config/locales/ru.yml Normal file
View File

@ -0,0 +1,67 @@
ru:
hello: "Привет, мир"
brand:
name: "Today AI Weather"
title:
cities: "Города"
arts: "Искусство"
sign_in: "Войти"
sign_out: "Выйти"
settings: "Настройки"
admin_dashboard: "Панель администратора"
latest_weather_art: "Последнее погодное искусство"
popular_weather_art: "Популярное погодное искусство"
ai_prompt: "AI подсказка"
text:
latest_from: "Последнее от"
search_cities: "Поиск городов..."
all_regions: "Все регионы"
all_countries: "Все страны"
all_in: "Все в"
showing: "Показано"
weather_arts: "Погодное искусство"
newest_first: "Сначала новые"
oldest_first: "Сначала старые"
cities:
title: "Исследуйте города"
arts:
title: "Галерея погодного искусства"
subtitle: "Откройте для себя AI-сгенерированное погодное искусство из городов по всему миру"
home:
headline_html: Где погода встречается<br>с искусственным интеллектом
subtitle:
Познакомьтесь с погодой через призму искусства, созданного искусственным интеллектом,
открывая новый взгляд на ежедневные метеорологические явления.
button:
explore_cities: "Исследовать города"
view_detail: "Посмотреть детали"
view_all_weather_arts: "Посмотреть все погодное искусство"
back_to_cities: "Вернуться к городам"
back_to: "Вернуться к"
card:
temperature: "Температура"
wind: "Ветер"
humidity: "Влажность"
visibility: "Видимость"
pressure: "Давление"
cloud_cover: "Облачность"
feel_like: "Ощущается как"
relative_humidity: "Относительная влажность"
clear_view_distance: "Дальность видимости"
atmospheric_pressure: "Атмосферное давление"
sky_coverage: "Покрытие неба"
pagination:
showing_items: "Показано с %{from} по %{to} из %{total} %{items}"
items:
weather: "записей о погоде"
default: "элементов"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d %B %Y"

67
config/locales/tr.yml Normal file
View File

@ -0,0 +1,67 @@
tr:
hello: "Merhaba dünya"
brand:
name: "Today AI Weather"
title:
cities: "Şehirler"
arts: "Sanat"
sign_in: "Giriş yap"
sign_out: ıkış yap"
settings: "Ayarlar"
admin_dashboard: "Yönetici Paneli"
latest_weather_art: "En Son Hava Durumu Sanatı"
popular_weather_art: "Popüler Hava Durumu Sanatı"
ai_prompt: "AI Komut"
text:
latest_from: "En son"
search_cities: "Şehirleri ara..."
all_regions: "Tüm Bölgeler"
all_countries: "Tüm Ülkeler"
all_in: "Tümü"
showing: "Gösteriliyor"
weather_arts: "Hava Durumu Sanatları"
newest_first: "En Yeni Önce"
oldest_first: "En Eski Önce"
cities:
title: "Şehirleri Keşfet"
arts:
title: "Hava Durumu Sanat Galerisi"
subtitle: "Dünya genelindeki şehirlerden AI tarafından oluşturulan hava durumu sanatını keşfedin"
home:
headline_html: "Hava Durumu<br>Yapay Zeka ile Buluşuyor"
subtitle:
AI tarafından oluşturulan sanat perspektifinden hava durumunu deneyimleyin,
günlük meteorolojik olaylara yeni bir bakış açısı getirin.
button:
explore_cities: "Şehirleri Keşfet"
view_detail: "Detayları Görüntüle"
view_all_weather_arts: "Tüm Hava Durumu Sanatlarını Görüntüle"
back_to_cities: "Şehirlere Geri Dön"
back_to: "Geri Dön"
card:
temperature: "Sıcaklık"
wind: "Rüzgar"
humidity: "Nem"
visibility: "Görüş Mesafesi"
pressure: "Basınç"
cloud_cover: "Bulut Örtüsü"
feel_like: "Hissedilen"
relative_humidity: "Bağıl nem"
clear_view_distance: "Net görüş mesafesi"
atmospheric_pressure: "Atmosfer basıncı"
sky_coverage: "Gökyüzü kapsama"
pagination:
showing_items: "%{total} %{items} içinden %{from} ile %{to} arası gösteriliyor"
items:
weather: "hava durumu kayıtları"
default: "öğe"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%d %b"
long: "%d %B %Y"

67
config/locales/uk.yml Normal file
View File

@ -0,0 +1,67 @@
uk:
hello: "Привіт світ"
brand:
name: "Today AI Weather"
title:
cities: "Міста"
arts: "Мистецтво"
sign_in: "Увійти"
sign_out: "Вийти"
settings: "Налаштування"
admin_dashboard: "Панель адміністратора"
latest_weather_art: "Останнє погодне мистецтво"
popular_weather_art: "Популярне погодне мистецтво"
ai_prompt: "AI підказка"
text:
latest_from: "Останнє від"
search_cities: "Пошук міст..."
all_regions: "Всі регіони"
all_countries: "Всі країни"
all_in: "Все в"
showing: "Показано"
weather_arts: "Погодне мистецтво"
newest_first: "Спочатку нові"
oldest_first: "Спочатку старі"
cities:
title: "Огляд міст"
arts:
title: "Галерея погодного мистецтва"
subtitle: "Відкрийте для себе згенероване ШІ погодне мистецтво з міст по всьому світу"
home:
headline_html: Де погода зустрічається<br>зі штучним інтелектом
subtitle:
Відчуйте погоду через призму мистецтва, створеного ШІ,
що дає новий погляд на щоденні метеорологічні явища.
button:
explore_cities: "Огляд міст"
view_detail: "Переглянути деталі"
view_all_weather_arts: "Переглянути все погодне мистецтво"
back_to_cities: "Назад до міст"
back_to: "Назад до"
card:
temperature: "Температура"
wind: "Вітер"
humidity: "Вологість"
visibility: "Видимість"
pressure: "Тиск"
cloud_cover: "Хмарність"
feel_like: "Відчувається як"
relative_humidity: "Відносна вологість"
clear_view_distance: "Дальність видимості"
atmospheric_pressure: "Атмосферний тиск"
sky_coverage: "Покриття неба"
pagination:
showing_items: "Показано %{from} до %{to} з %{total} %{items}"
items:
weather: "погодних записів"
default: "елементів"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%d %B %Y"

67
config/locales/ur.yml Normal file
View File

@ -0,0 +1,67 @@
ur:
hello: "ہیلو دنیا"
brand:
name: "ٹوڈے اے آئی ویدر"
title:
cities: "شہر"
arts: "فن"
sign_in: "سائن ان"
sign_out: "سائن آؤٹ"
settings: "ترتیبات"
admin_dashboard: "ایڈمن ڈیش بورڈ"
latest_weather_art: "تازہ ترین موسمی فن"
popular_weather_art: "مقبول موسمی فن"
ai_prompt: "اے آئی پرامپٹ"
text:
latest_from: "تازہ ترین"
search_cities: "شہروں کی تلاش..."
all_regions: "تمام علاقے"
all_countries: "تمام ممالک"
all_in: "تمام"
showing: "دکھا رہا ہے"
weather_arts: "موسمی فن"
newest_first: "نیا پہلے"
oldest_first: "پرانا پہلے"
cities:
title: "شہروں کی دریافت"
arts:
title: "موسمی فن گیلری"
subtitle: "دنیا بھر کے شہروں سے اے آئی سے تیار کردہ موسمی فن دریافت کریں"
home:
headline_html: جہاں موسم<br>مصنوعی ذہانت سے ملتا ہے
subtitle:
اے آئی سے تیار کردہ فن کے ذریعے موسم کا تجربہ کریں،
روزمرہ موسمیاتی مظاہر کو ایک نیا نظریہ فراہم کرتا ہے۔
button:
explore_cities: "شہروں کی دریافت"
view_detail: "تفصیلات دیکھیں"
view_all_weather_arts: "تمام موسمی فن دیکھیں"
back_to_cities: "شہروں کی طرف واپس"
back_to: "واپس"
card:
temperature: "درجہ حرارت"
wind: "ہوا"
humidity: "نمی"
visibility: "دید"
pressure: "دباؤ"
cloud_cover: "بادل"
feel_like: "محسوس ہوتا ہے"
relative_humidity: "اضافی نمی"
clear_view_distance: "صاف نظر کی دوری"
atmospheric_pressure: "ہوائی دباؤ"
sky_coverage: "آسمانی احاطہ"
pagination:
showing_items: "%{items} کے %{total} میں سے %{from} سے %{to} تک دکھا رہا ہے"
items:
weather: "موسمی ریکارڈز"
default: "آئٹمز"
time:
formats:
time_only: "%H:%M"
with_zone: "%{time} %{zone}"
date_and_time: "%{date} %{time}"
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"

View File

@ -25,6 +25,7 @@ Rails.application.routes.draw do
get "cities/index"
get "cities/show"
get "home/index"
get "sitemaps", to: "sitemaps#index"
get "sitemaps/*path", to: "sitemaps#show", format: false
get "feed", to: "rss#feed", format: "rss", as: :rss_feed

View File

@ -32,7 +32,7 @@ namespace :geo do
region.update!(
name: data["name"],
code: data["name"],
translations: data["translations"].to_json,
translations: data["translations"].to_json.to_s,
flag: data["flag"] || true,
wiki_data_id: data["wikiDataId"]
)