diff --git a/.github/workflows/cypress-tests.yml b/.github/workflows/cypress-tests.yml
index 157f54cd..0436c50b 100644
--- a/.github/workflows/cypress-tests.yml
+++ b/.github/workflows/cypress-tests.yml
@@ -59,7 +59,16 @@ jobs:
done
- name: Populate dxcc_entities table
- run: curl "http://localhost/index.php/update/dxcc"
+ run: |
+ for i in `seq 1 10`; do
+ if curl -f "http://localhost/index.php/update/dxcc"; then
+ echo "DXCC entities populated successfully"
+ break
+ else
+ echo "Failed to populate DXCC entities, retrying in 10 seconds... (attempt $i/10)"
+ sleep 10
+ fi
+ done
- name: Run Cypress tests
run: npx cypress run
\ No newline at end of file
diff --git a/application/config/migration.php b/application/config/migration.php
index 2eb36735..f73a6e6c 100644
--- a/application/config/migration.php
+++ b/application/config/migration.php
@@ -22,7 +22,7 @@ $config['migration_enabled'] = TRUE;
|
*/
-$config['migration_version'] = 199;
+$config['migration_version'] = 201;
/*
|--------------------------------------------------------------------------
diff --git a/application/controllers/Api.php b/application/controllers/Api.php
index 7bb18b5a..3cc8bb03 100644
--- a/application/controllers/Api.php
+++ b/application/controllers/Api.php
@@ -427,6 +427,181 @@ class API extends CI_Controller {
}
+
+ /**
+ * Check if a country has been worked before and confirmed in various ways
+ *
+ * This API endpoint checks if a specific country (derived from callsign) has been
+ * worked before in a given logbook, and whether it has been confirmed via different
+ * confirmation methods (QSL, LoTW, eQSL, QRZ).
+ *
+ * @api POST /api/logbook_check_country
+ * @header Content-Type application/json
+ *
+ * @param string key Required. API authentication key
+ * @param string logbook_public_slug Required. Public slug identifier for the logbook
+ * @param string callsign Required. Callsign to lookup country for
+ * @param string type Optional. Type of contact ("sat" for satellite, empty for regular)
+ * @param string band Optional. Amateur radio band (required for non-satellite contacts)
+ * @param string mode Optional. Amateur radio mode (required for non-satellite contacts)
+ *
+ * @return json Returns JSON object with:
+ * - workedBefore: boolean indicating if country was worked before
+ * - confirmed: object with confirmation status for qsl, lotw, eqsl, qrz
+ *
+ * @throws 401 Unauthorized - Missing or invalid API key, missing required fields
+ * @throws 404 Not Found - Logbook not found or empty logbook
+ * @throws 400 Bad Request - Invalid JSON format
+ *
+ * @example
+ * Request:
+ * {
+ * "key": "your-api-key",
+ * "logbook_public_slug": "my-logbook",
+ * "callsign": "W1AW",
+ * "band": "20M",
+ * "mode": "SSB"
+ * }
+ *
+ * Response:
+ * {
+ * "workedBefore": true,
+ * "confirmed": {
+ * "qsl": true,
+ * "lotw": false,
+ * "eqsl": false,
+ * "qrz": false
+ * }
+ * }
+ */
+ function logbook_check_country()
+ {
+ header('Content-type: application/json');
+
+ $this->load->model('api_model');
+
+ // Decode JSON and store
+ $obj = json_decode(file_get_contents("php://input"), true);
+ if ($obj === NULL) {
+ echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]);
+ return;
+ }
+
+ if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) {
+ http_response_code(401);
+ echo json_encode(['status' => 'failed', 'reason' => "missing api key"]);
+ return;
+ }
+
+ if(!isset($obj['logbook_public_slug']) || !isset($obj['callsign'])) {
+ http_response_code(401);
+ echo json_encode(['status' => 'failed', 'reason' => "missing fields"]);
+ return;
+ }
+
+ // Load models
+ $this->load->model('logbook_model');
+ $this->load->model('logbooks_model');
+
+ $date = date("Y-m-d");
+ $callsign = $obj['callsign'];
+ $logbook_slug = $obj['logbook_public_slug'];
+ $type = isset($obj['type']) ? $obj['type'] : '';
+ $band = isset($obj['band']) ? $obj['band'] : '';
+ $mode = isset($obj['mode']) ? $obj['mode'] : '';
+
+ $callsign_dxcc_lookup = $this->logbook_model->dxcc_lookup($callsign, $date);
+ $country = $callsign_dxcc_lookup['entity'];
+
+ $return = [
+ "workedBefore" => false,
+ "confirmed" => [
+ "qsl" => false,
+ "lotw" => false,
+ "eqsl" => false,
+ "qrz" => false
+ ]
+ ];
+
+ if($this->logbooks_model->public_slug_exists($logbook_slug)) {
+ $logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($logbook_slug);
+ if($logbook_id != false)
+ {
+ // Get associated station locations for mysql queries
+ $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id);
+
+ if (!$logbooks_locations_array) {
+ // Logbook not found
+ http_response_code(404);
+ echo json_encode(['status' => 'failed', 'reason' => "Empty Logbook"]);
+ die();
+ }
+ } else {
+ // Logbook not found
+ http_response_code(404);
+ echo json_encode(['status' => 'failed', 'reason' => $logbook_slug." has no associated station locations"]);
+ die();
+ }
+
+ if (!empty($logbooks_locations_array)) {
+ if ($type == "sat") {
+ $this->db->where('COL_PROP_MODE', 'SAT');
+ } else {
+ $this->db->where('COL_MODE', $this->logbook_model->get_main_mode_from_mode($mode));
+ $this->db->where('COL_BAND', $band);
+ $this->db->where('COL_PROP_MODE !=', 'SAT');
+ }
+
+ $this->db->where_in('station_id', $logbooks_locations_array);
+ $this->db->where('COL_COUNTRY', urldecode($country));
+
+ $query = $this->db->get($this->config->item('table_name'), 1, 0);
+ foreach ($query->result() as $workedBeforeRow) {
+ $return['workedBefore'] = true;
+ }
+
+ // Check each confirmation type separately
+ $confirmation_types = [
+ 'qsl' => "COL_QSL_RCVD='Y'",
+ 'lotw' => "COL_LOTW_QSL_RCVD='Y'",
+ 'eqsl' => "COL_EQSL_QSL_RCVD='Y'",
+ 'qrz' => "COL_QRZCOM_QSO_DOWNLOAD_STATUS='Y'"
+ ];
+
+ foreach ($confirmation_types as $type_key => $where_clause) {
+ if ($type == "SAT") {
+ $this->db->where('COL_PROP_MODE', 'SAT');
+ } else {
+ $this->db->where('COL_MODE', $this->logbook_model->get_main_mode_from_mode($mode));
+ $this->db->where('COL_BAND', $band);
+ $this->db->where('COL_PROP_MODE !=', 'SAT');
+ }
+
+ $this->db->where_in('station_id', $logbooks_locations_array);
+ $this->db->where('COL_COUNTRY', urldecode($country));
+ $this->db->where($where_clause);
+
+ $query = $this->db->get($this->config->item('table_name'), 1, 0);
+
+ if ($query->num_rows() > 0) {
+ $return['confirmed'][$type_key] = true;
+ }
+ }
+
+ http_response_code(201);
+ echo json_encode($return, JSON_PRETTY_PRINT);
+ } else {
+ http_response_code(201);
+ echo json_encode($return, JSON_PRETTY_PRINT);
+ }
+ } else {
+ // Logbook not found
+ http_response_code(404);
+ echo json_encode(['status' => 'failed', 'reason' => "logbook not found"]);
+ die();
+ }
+ }
+
/* ENDPOINT for Rig Control */
function radio() {
diff --git a/application/controllers/Lotw.php b/application/controllers/Lotw.php
index d45bb891..4b9c0e17 100644
--- a/application/controllers/Lotw.php
+++ b/application/controllers/Lotw.php
@@ -320,7 +320,7 @@ class Lotw extends CI_Controller {
echo $station_profile->station_callsign." (".$station_profile->station_profile_name.") Upload Failed"."
";
}
- $pos = strpos($result, "");
+ $pos = strpos($result, "");
if ($pos === false) {
// Upload of TQ8 Failed for unknown reason
diff --git a/application/controllers/User.php b/application/controllers/User.php
index 42c6808b..46dfc375 100644
--- a/application/controllers/User.php
+++ b/application/controllers/User.php
@@ -739,6 +739,9 @@ class User extends CI_Controller
$post_data = $this->input->post();
+ if (!isset($post_data['user_winkey'])) {
+ $post_data['user_winkey'] = '0';
+ }
if (!isset($post_data['user_winkey_websocket'])) {
$post_data['user_winkey_websocket'] = '0';
}
diff --git a/application/language/portuguese/account_lang.php b/application/language/portuguese/account_lang.php
new file mode 100644
index 00000000..1f2d18f6
--- /dev/null
+++ b/application/language/portuguese/account_lang.php
@@ -0,0 +1,137 @@
+https://radiosocial.de";
+
+$lang['account_default_band_settings'] = 'Configurações Padrão de Banda e Confirmação';
+$lang['account_gridmap_default_band'] = 'Banda Padrão';
+$lang['account_qsl_settings'] = 'Métodos de QSL Padrão';
+
+$lang['account_winkeyer'] = 'Winkeyer';
+$lang['account_winkeyer_hint'] = "O suporte ao Winkeyer no Cloudlog é experimental.
Leia a wiki primeiro em https://github.com/magicbug/Cloudlog/wiki/Winkey antes de ativar.";
+$lang['account_winkeyer_enabled'] = "Recursos Winkeyer Ativados";
+
+$lang['account_map_params'] = "Configurações do Mapa";
+$lang['account_map_qso_by_default'] = "QSO (por padrão)";
+$lang['account_map_qso_confirm'] = "QSO (confirmado)";
+$lang['account_map_qso_confirm_same_qso'] = "(Se 'Não', exibido como ".$lang['account_map_qso_by_default'].")";
+
+$lang['account_general_information'] = "Informações Gerais";
+$lang['account_qso_logging_options'] = "Opções de Registro de QSO";
+$lang['account_third_party_services'] = "Serviços de Terceiros";
+$lang['account_default_values'] = "Valores Padrão";
+$lang['account_miscellaneous'] = "Diversos";
+
+$lang['account_hamsat'] = "Hams.at";
+$lang['account_hamsat_private_feed_key'] = "Chave de Feed Privada";
+$lang['account_hamsat_hint'] = "Veja seu perfil em https://hams.at/users/settings.";
+$lang['account_hamsat_workable_only'] = "Mostrar Apenas Passagens Operáveis";
+$lang['account_hamsat_workable_only_hint'] = "Se ativado, mostra apenas as passagens operáveis com base na Grid definida em sua conta hams.at. Requer chave de feed privada.";
+
+$lang['account_remember_me'] = 'Lembrar-me';
\ No newline at end of file
diff --git a/application/language/portuguese/adif_lang.php b/application/language/portuguese/adif_lang.php
new file mode 100644
index 00000000..6491da1e
--- /dev/null
+++ b/application/language/portuguese/adif_lang.php
@@ -0,0 +1,130 @@
+todos os QSOs do ADIF, independentemente de corresponderem ao local da estação escolhida.";
+
+$lang['adif_upload'] = "Enviar";
+
+/*
+___________________________________________________________________________________________
+Exportação ADIF
+___________________________________________________________________________________________
+*/
+
+$lang['adif_export_take_it_anywhere'] = "Leve seu arquivo de logbook para qualquer lugar!";
+$lang['adif_export_take_it_anywhere_hint'] = "Exportar ADIFs permite importar contatos em aplicações de terceiros como LoTW, prêmios ou para backup.";
+
+$lang['adif_mark_exported_lotw'] = "Marcar QSOs exportados como enviados para o LoTW";
+$lang['adif_mark_exported_no_lotw'] = "Exportar QSOs não enviados para o LoTW";
+
+$lang['adif_export_qso'] = "Exportar QSOs";
+
+$lang['adif_export_sat_only_qso'] = "Exportar apenas QSOs via satélite";
+$lang['adif_export_sat_only_qso_all'] = "Exportar todos os QSOs via satélite";
+$lang['adif_export_sat_only_qso_lotw'] = "Exportar todos os QSOs via satélite confirmados no LoTW";
+
+/*
+___________________________________________________________________________________________
+Logbook of the World
+___________________________________________________________________________________________
+*/
+
+$lang['adif_lotw_export_if_selected'] = "Se nenhum intervalo de datas for selecionado, todos os QSOs serão marcados!";
+$lang['adif_mark_qso_as_exported_to_lotw'] = "Marcar QSOs como exportados para o LoTW";
+
+$lang['adif_qso_marked'] = "QSOs marcados";
+$lang['adif_yay_its_done'] = "Pronto, está feito!";
+$lang['adif_qso_lotw_marked_confirm'] = "Os QSOs foram marcados como exportados para o LoTW.";
+
+/*
+___________________________________________________________________________________________
+DARC DCL
+___________________________________________________________________________________________
+*/
+
+$lang['adif_dcl_text_pre'] = "Vá para";
+$lang['adif_dcl_text_post'] = "e exporte seu log com DOKs confirmados. Para agilizar o processo, você pode selecionar apenas QSOs com DL (ex: insira \"DL\" na lista de prefixos). O arquivo ADIF baixado pode ser enviado aqui para atualizar os QSOs com informações de DOK.";
+
+$lang['only_confirmed_qsos'] = "Importar DOK apenas de QSOs confirmados no DCL.";
+$lang['only_confirmed_qsos_hint'] = "Desmarque se também quiser atualizar DOK com dados de QSOs não confirmados no DCL.";
+
+$lang['overwrite_by_dcl'] = "Sobrescrever DOK existente no log com DOK do DCL (se diferente).";
+$lang['overwrite_by_dcl_hint'] = "Se marcado, o Cloudlog irá sobrescrever forçadamente o DOK existente com o do log DCL.";
+
+$lang['ignore_ambiguous'] = "Ignorar QSOs que não puderem ser correspondidos.";
+$lang['ignore_ambiguous_hint'] = "Se desmarcado, informações dos QSOs não encontrados no Cloudlog serão exibidas.";
+
+/*
+___________________________________________________________________________________________
+Importação com Sucesso
+___________________________________________________________________________________________
+*/
+
+$lang['adif_imported'] = "ADIF Importado";
+$lang['adif_yay_its_imported'] = "Pronto, foi importado!";
+$lang['adif_import_confirm'] = "O arquivo ADIF foi importado com sucesso.";
+
+$lang['adif_import_dupes_inserted'] = " Duplicados foram inseridos!";
+$lang['adif_import_dupes_skipped'] = " Duplicados foram ignorados.";
+
+$lang['adif_import_errors'] = "Erros de ADIF";
+$lang['adif_import_errors_hint'] = "Você tem erros no ADIF. Os QSOs foram adicionados, mas alguns campos não foram preenchidos.";
+
+/*
+___________________________________________________________________________________________
+Sucesso DCL
+___________________________________________________________________________________________
+*/
+
+$lang['dcl_results'] = "Resultados da Atualização DOK pelo DCL";
+$lang['dcl_info_updated'] = "Informações DCL dos DOKs atualizadas.";
+$lang['dcl_qsos_updated'] = "QSOs atualizados";
+$lang['dcl_qsos_ignored'] = "QSOs ignorados";
+$lang['dcl_qsos_unmatched'] = "QSOs não encontrados";
+$lang['dcl_no_qsos_updated'] = "Nenhum QSO foi encontrado para atualização.";
+$lang['dcl_dok_errors'] = "Erros de DOK";
+$lang['dcl_dok_errors_details'] = "Há dados diferentes de DOK no seu log em comparação com o DCL";
+$lang['dcl_qsl_status'] = "Status de QSL no DCL";
+$lang['dcl_qsl_status_c'] = "confirmado por LoTW/Clublog/eQSL/Concurso";
+$lang['dcl_qsl_status_mno'] = "confirmado por gerente de prêmio";
+$lang['dcl_qsl_status_i'] = "confirmado por comparação cruzada com dados do DCL";
+$lang['dcl_qsl_status_w'] = "confirmação pendente";
+$lang['dcl_qsl_status_x'] = "não confirmado";
+$lang['dcl_qsl_status_unknown'] = "desconhecido";
+$lang['dcl_no_match'] = "QSO não pôde ser correspondido";
diff --git a/application/language/portuguese/admin_lang.php b/application/language/portuguese/admin_lang.php
new file mode 100644
index 00000000..7f7d3355
--- /dev/null
+++ b/application/language/portuguese/admin_lang.php
@@ -0,0 +1,62 @@
+CQ Magazine.";
+
+/*
+___________________________________________________________________________________________
+DOK
+___________________________________________________________________________________________
+*/
+
+$lang['awards_dok_description_ln1'] = "Prêmio DOK";
+$lang['awards_dok_description_ln2'] = "A Alemanha possui cerca de 70.000 radioamadores licenciados, sendo mais de 40.000 membros do DARC. O sistema DOK identifica associações locais ('Deutscher Ortsverband Kenner').";
+$lang['awards_dok_description_ln3'] = "O DOK é composto por uma letra do distrito e dois dígitos para o capítulo local, como P03 Friedrichshafen ou F41 Baunatal. Atenção: o número 0 é frequentemente confundido com a letra O.";
+$lang['awards_dok_description_ln4'] = "Informações disponíveis no site do DARC e as regras do prêmio podem ser vistas aqui.";
+
+/*
+___________________________________________________________________________________________
+DXCC
+___________________________________________________________________________________________
+*/
+
+$lang['awards_dxcc_description_ln1'] = "Prêmio DXCC";
+$lang['awards_dxcc_description_ln2'] = "DXCC significa 'DX Century Club', baseado em países trabalhados. Foi inspirado por um artigo de 1935 de Clinton B. DeSoto.";
+$lang['awards_dxcc_description_ln3'] = "Todas as informações estão disponíveis no site da ARRL.";
+$lang['awards_dxcc_description_ln4'] = "Nota: Entidades DXCC removidas continuam listadas no Cloudlog, mas são consideradas inválidas.";
+
+/*
+___________________________________________________________________________________________
+FFMA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_ffma_description_ln1'] = "Prêmio Fred Fish Memorial";
+$lang['awards_ffma_description_ln2'] = "Criado em homenagem a Fred Fish, W5FF (SK), o primeiro a trabalhar e confirmar todos os 488 grids Maidenhead nos EUA em 6 metros.";
+$lang['awards_ffma_description_ln3'] = "O prêmio é concedido a quem conseguir repetir o feito de W5FF.";
+$lang['awards_ffma_description_ln4'] = "Mais informações: https://www.arrl.org/ffma.";
+
+/*
+___________________________________________________________________________________________
+IOTA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_iota_description_ln1'] = "Prêmios IOTA";
+$lang['awards_iota_description_ln2'] = "O programa IOTA incentiva contatos com estações localizadas em ilhas ao redor do mundo.";
+$lang['awards_iota_description_ln3'] = "Gerenciado pelo IOTA Ltd em parceria com a RSGB. As ilhas são agrupadas em cerca de 1200 grupos com critérios definidos.";
+$lang['awards_iota_description_ln4'] = "Informações completas no site do IOTA.";
+
+/*
+___________________________________________________________________________________________
+POTA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_pota_description_ln1'] = "Prêmios POTA";
+$lang['awards_pota_description_ln2'] = "O Parks on the Air® surgiu em 2017 após o fim do evento National Parks on the Air da ARRL.";
+$lang['awards_pota_description_ln3'] = "Funciona de forma semelhante ao SOTA, com ativadores e caçadores, e múltiplas categorias.";
+$lang['awards_pota_description_ln4'] = "Mais informações: Parks on the Air®.";
+
+/*
+___________________________________________________________________________________________
+SIG
+___________________________________________________________________________________________
+*/
+
+$lang['awards_sig_description_ln1'] = "Informações SIG";
+$lang['awards_sig_description_ln2'] = "SIG permite criar marcadores personalizados de prêmios não implementados nativamente no Cloudlog.";
+$lang['awards_sig_description_ln3'] = "O formato ADIF tem campos limitados para prêmios; o SIG possibilita avaliações mais amplas.";
+$lang['awards_sig_description_ln4'] = "Na tela de QSO há os campos 'SIG' (marcador) e 'SIG INFO' (descrição), ambos customizáveis.";
+
+/*
+___________________________________________________________________________________________
+SOTA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_sota_description_ln1'] = "Prêmios SOTA";
+$lang['awards_sota_description_ln2'] = "O SOTA incentiva operações portáteis em montanhas e está presente em quase 100 países.";
+$lang['awards_sota_description_ln3'] = "Os pontos variam conforme a altitude dos picos. Há troféus como 'Mountain Goat' e 'Shack Sloth'.";
+$lang['awards_sota_description_ln4'] = "Mais informações: https://www.sota.org.uk/.";
+
+/*
+___________________________________________________________________________________________
+Condados EUA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_counties_description_ln1'] = "Prêmio Condados dos EUA";
+$lang['awards_counties_description_ln2'] = "Emitido pela CQ Magazine para contatos confirmados com condados dos EUA. Regras aqui.";
+$lang['awards_counties_description_ln3'] = "Válido para qualquer operador licenciado mundialmente, independente de indicativo ou local de operação.";
+$lang['awards_counties_description_ln4'] = "SWLs também podem obter o prêmio com base em escutas.";
+
+/*
+___________________________________________________________________________________________
+Gridmaster EUA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_us_gridmaster_description_ln1'] = "Prêmio Gridmaster EUA";
+$lang['awards_us_gridmaster_description_ln2'] = "Prêmio da AMSAT para quem confirmar os 488 grids dos EUA via satélite.";
+$lang['awards_us_gridmaster_description_ln3'] = "Exige contatos via satélite com comprovação. Regras detalhadas no site oficial.";
+$lang['awards_us_gridmaster_description_ln4'] = "Este mapa mostra apenas QSOs feitos via satélite.";
+
+/*
+___________________________________________________________________________________________
+Gridmaster Japão
+___________________________________________________________________________________________
+*/
+
+$lang['awards_ja_gridmaster_description_ln1'] = "Prêmio Gridmaster Japão";
+$lang['awards_ja_gridmaster_description_ln2'] = "Semelhante ao prêmio dos EUA, mas com foco nos grids do Japão.";
+$lang['awards_ja_gridmaster_description_ln3'] = "Informações e regras pendentes.";
+$lang['awards_ja_gridmaster_description_ln4'] = "";
+
+/*
+___________________________________________________________________________________________
+VUCC
+___________________________________________________________________________________________
+*/
+
+$lang['awards_vucc_description_ln1'] = "Prêmio VUCC - VHF/UHF Century Club";
+$lang['awards_vucc_description_ln2'] = "Concedido com base no número mínimo de grids confirmados em bandas VHF/UHF.";
+$lang['awards_vucc_description_ln3'] = "Regras e detalhes: Clique aqui.";
+$lang['awards_vucc_description_ln4'] = "Somente bandas VHF/UHF são consideradas.";
+
+/*
+___________________________________________________________________________________________
+WAS
+___________________________________________________________________________________________
+*/
+
+$lang['awards_was_description_ln1'] = "Prêmio WAS";
+$lang['awards_was_description_ln2'] = "O prêmio mais popular da ARRL: Worked All States (Trabalhados Todos os Estados).";
+$lang['awards_was_description_ln3'] = "É necessário contato com os 50 estados dos EUA. Residentes fora dos EUA não precisam ser membros da ARRL.";
+$lang['awards_was_description_ln4'] = "Regras e detalhes: aqui.";
+
+/*
+___________________________________________________________________________________________
+WWFF
+___________________________________________________________________________________________
+*/
+
+$lang['awards_wwff_description_ln1'] = "Prêmio WWFF - Flora e Fauna Mundial";
+$lang['awards_wwff_description_ln2'] = "Incentiva operação portátil em áreas naturais protegidas pelo mundo.";
+$lang['awards_wwff_description_ln3'] = "Mais de 26.000 áreas registradas. Prêmios nacionais e internacionais estão disponíveis.";
+$lang['awards_wwff_description_ln4'] = "Mais informações: https://wwff.co/awards/.";
+
+/*
+___________________________________________________________________________________________
+WAJA
+___________________________________________________________________________________________
+*/
+
+$lang['awards_waja_description_ln1'] = "Prêmio WAJA - Todas as Prefeituras do Japão";
+$lang['awards_waja_description_ln2'] = "Encoraja contatos com todas as 47 prefeituras do Japão.";
+$lang['awards_waja_description_ln3'] = "Necessário contato e QSL de cada prefeitura. Lista pode ser organizada por número WAJA.";
+$lang['awards_waja_description_ln4'] = "Mais informações: JARL - WAJA.";
+
+/*
+___________________________________________________________________________________________
+WAB
+___________________________________________________________________________________________
+*/
+
+$lang['awards_wab_description_ln1'] = "Prêmio WAB - Worked All Britain";
+$lang['awards_wab_description_ln2'] = "Reconhece contatos com áreas WAB definidas por Grids do Ordnance Survey em todo o Reino Unido.";
+$lang['awards_wab_description_ln3'] = "O objetivo é acumular pontos por contatos e conquistar níveis no programa de prêmios.";
+$lang['awards_wab_description_ln4'] = "Mais informações: https://wab.intermip.net/default.php.";
diff --git a/application/language/portuguese/contesting_lang.php b/application/language/portuguese/contesting_lang.php
new file mode 100644
index 00000000..18d245bf
--- /dev/null
+++ b/application/language/portuguese/contesting_lang.php
@@ -0,0 +1,36 @@
+aqui para fazer isso!';
+$lang['dashboard_locations_warning'] = 'Você não tem localizações de estação. Vá aqui para criar!';
+$lang['dashboard_logbooks_warning'] = 'Você não tem nenhum logbook. Vá aqui para criar!';
+
+$lang['hams_at_no_activations_found'] = 'Nenhuma ativação futura encontrada. Verifique novamente mais tarde.';
+
+$lang['datatables_language'] = "pt-BR";
+
+$lang['set_log_to_full_dates'] = "Exibir datas completas no log";
diff --git a/application/language/portuguese/gridsquares_lang.php b/application/language/portuguese/gridsquares_lang.php
new file mode 100644
index 00000000..6f9aef9e
--- /dev/null
+++ b/application/language/portuguese/gridsquares_lang.php
@@ -0,0 +1,36 @@
+
+
Directory access is forbidden.
+ + +