2017-03-05 15:47:28 +01:00
/*************************************************************************/
/* resource_importer_csv_translation.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2017-03-05 15:47:28 +01:00
/*************************************************************************/
2022-01-13 09:45:09 +01:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2017-03-05 15:47:28 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2017-02-02 00:41:05 +01:00
# include "resource_importer_csv_translation.h"
2017-03-05 15:47:28 +01:00
2018-09-11 18:13:45 +02:00
# include "core/compressed_translation.h"
# include "core/io/resource_saver.h"
# include "core/os/file_access.h"
# include "core/translation.h"
2017-02-02 00:41:05 +01:00
String ResourceImporterCSVTranslation : : get_importer_name ( ) const {
return " csv_translation " ;
}
2017-03-05 16:44:50 +01:00
String ResourceImporterCSVTranslation : : get_visible_name ( ) const {
2017-02-02 00:41:05 +01:00
return " CSV Translation " ;
}
2017-03-05 16:44:50 +01:00
void ResourceImporterCSVTranslation : : get_recognized_extensions ( List < String > * p_extensions ) const {
2017-02-02 00:41:05 +01:00
p_extensions - > push_back ( " csv " ) ;
}
String ResourceImporterCSVTranslation : : get_save_extension ( ) const {
2018-02-21 17:30:55 +01:00
return " " ; //does not save a single resource
2017-02-02 00:41:05 +01:00
}
2017-03-05 16:44:50 +01:00
String ResourceImporterCSVTranslation : : get_resource_type ( ) const {
2017-05-20 22:49:34 +02:00
return " Translation " ;
2017-02-02 00:41:05 +01:00
}
2017-03-05 16:44:50 +01:00
bool ResourceImporterCSVTranslation : : get_option_visibility ( const String & p_option , const Map < StringName , Variant > & p_options ) const {
2017-02-02 00:41:05 +01:00
return true ;
}
int ResourceImporterCSVTranslation : : get_preset_count ( ) const {
return 0 ;
}
String ResourceImporterCSVTranslation : : get_preset_name ( int p_idx ) const {
return " " ;
}
2017-03-05 16:44:50 +01:00
void ResourceImporterCSVTranslation : : get_import_options ( List < ImportOption > * r_options , int p_preset ) const {
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " compress " ) , true ) ) ;
2017-08-27 17:14:09 +02:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " delimiter " , PROPERTY_HINT_ENUM , " Comma,Semicolon,Tab " ) , 0 ) ) ;
2017-02-02 00:41:05 +01:00
}
2019-02-26 22:43:37 +01:00
Error ResourceImporterCSVTranslation : : import ( const String & p_source_file , const String & p_save_path , const Map < StringName , Variant > & p_options , List < String > * r_platform_variants , List < String > * r_gen_files , Variant * r_metadata ) {
2017-02-02 00:41:05 +01:00
bool compress = p_options [ " compress " ] ;
2017-08-27 17:14:09 +02:00
String delimiter ;
switch ( ( int ) p_options [ " delimiter " ] ) {
2021-05-04 14:35:44 +02:00
case 0 :
delimiter = " , " ;
break ;
case 1 :
delimiter = " ; " ;
break ;
case 2 :
delimiter = " \t " ;
break ;
2017-08-27 17:14:09 +02:00
}
2017-03-05 16:44:50 +01:00
FileAccessRef f = FileAccess : : open ( p_source_file , FileAccess : : READ ) ;
2017-02-02 00:41:05 +01:00
2019-09-25 10:28:50 +02:00
ERR_FAIL_COND_V_MSG ( ! f , ERR_INVALID_PARAMETER , " Cannot open file from path ' " + p_source_file + " '. " ) ;
2017-02-02 00:41:05 +01:00
2017-08-27 17:14:09 +02:00
Vector < String > line = f - > get_csv_line ( delimiter ) ;
2017-08-27 08:48:48 +02:00
ERR_FAIL_COND_V ( line . size ( ) < = 1 , ERR_PARSE_ERROR ) ;
2017-02-02 00:41:05 +01:00
Vector < String > locales ;
2021-05-04 14:20:36 +02:00
Vector < Ref < Translation > > translations ;
2017-02-02 00:41:05 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 1 ; i < line . size ( ) ; i + + ) {
2017-02-02 00:41:05 +01:00
String locale = line [ i ] ;
2019-08-15 04:57:49 +02:00
ERR_FAIL_COND_V_MSG ( ! TranslationServer : : is_locale_valid ( locale ) , ERR_PARSE_ERROR , " Error importing CSV translation: ' " + locale + " ' is not a valid locale. " ) ;
2017-02-02 00:41:05 +01:00
locales . push_back ( locale ) ;
Ref < Translation > translation ;
translation . instance ( ) ;
translation - > set_locale ( locale ) ;
translations . push_back ( translation ) ;
}
2017-08-27 17:14:09 +02:00
line = f - > get_csv_line ( delimiter ) ;
2017-02-02 00:41:05 +01:00
2017-03-05 16:44:50 +01:00
while ( line . size ( ) = = locales . size ( ) + 1 ) {
2017-02-02 00:41:05 +01:00
String key = line [ 0 ] ;
2017-03-05 16:44:50 +01:00
if ( key ! = " " ) {
for ( int i = 1 ; i < line . size ( ) ; i + + ) {
2019-03-04 20:59:17 +01:00
translations . write [ i - 1 ] - > add_message ( key , line [ i ] . c_unescape ( ) ) ;
2017-02-02 00:41:05 +01:00
}
}
2017-08-27 17:14:09 +02:00
line = f - > get_csv_line ( delimiter ) ;
2017-02-02 00:41:05 +01:00
}
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < translations . size ( ) ; i + + ) {
2017-02-02 00:41:05 +01:00
Ref < Translation > xlt = translations [ i ] ;
if ( compress ) {
2017-03-05 16:44:50 +01:00
Ref < PHashTranslation > cxl = memnew ( PHashTranslation ) ;
cxl - > generate ( xlt ) ;
xlt = cxl ;
2017-02-02 00:41:05 +01:00
}
2017-06-16 20:42:18 +02:00
String save_path = p_source_file . get_basename ( ) + " . " + translations [ i ] - > get_locale ( ) + " .translation " ;
2017-02-02 00:41:05 +01:00
2017-03-05 16:44:50 +01:00
ResourceSaver : : save ( save_path , xlt ) ;
2017-02-02 00:41:05 +01:00
if ( r_gen_files ) {
r_gen_files - > push_back ( save_path ) ;
}
}
return OK ;
}
2017-03-05 16:44:50 +01:00
ResourceImporterCSVTranslation : : ResourceImporterCSVTranslation ( ) {
2017-02-02 00:41:05 +01:00
}