| Deutsch English Français Italiano |
|
<vovu08$18l0n$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: David Brown <david.brown@hesbynett.no> Newsgroups: comp.arch.embedded Subject: Re: How to add the second (or other) languages Date: Mon, 17 Feb 2025 19:09:12 +0100 Organization: A noiseless patient Spider Lines: 118 Message-ID: <vovu08$18l0n$1@dont-email.me> References: <voii3i$28jmm$1@dont-email.me> <voioe3.598.1@stefan.msgid.phost.de> <voiu1q$2f5ap$1@dont-email.me> <votcl3$nc20$1@dont-email.me> <vout9p$12qr8$1@dont-email.me> <vovj7p$12c64$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Mon, 17 Feb 2025 19:09:15 +0100 (CET) Injection-Info: dont-email.me; posting-host="84427c50b3b38f0c33e226ebb268a6cd"; logging-data="1332247"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/8L053ruVD3CuI4Vx/4YICe5RZp2hT7Fc=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:imGld9VggLYPTIwXCv9wPDRllbA= In-Reply-To: <vovj7p$12c64$1@dont-email.me> Content-Language: en-GB Bytes: 6051 On 17/02/2025 16:05, pozz wrote: > Il 17/02/2025 09:51, David Brown ha scritto: >> On 16/02/2025 19:59, pozz wrote: >>> Il 12/02/2025 20:50, David Brown ha scritto: >> >>>> >>>> You don't need a very fancy pre-processor to handle this yourself, >>>> if you are happy to make a few changes to the code. Have your code >>>> use something like : >>>> >>>> #define DisplayPrintf(id, desc, args...) \ >>>> display_printf(strings[language][string_ ## id], ## x) >>>> >>>> Use it like : >>>> >>>> DisplayPrintf(event_type_on, "Event on", ev->idx); >>>> >>>> >>>> A little Python preprocessor script can chew through all your C >>>> files and identify each call to "DisplayPrintf". >>> >>> Little... yes, it would be little, but not simple, at least for me. >>> How to write a correct C preprocessor in Python? >> >> You don't write a C preprocessor - that's the point. >> >> Tools like gettext have to handle any C code. That means they need to >> deal with situations with complicated macros, include files, etc. >> >> You don't need to do that when you make your own tools. You make the >> rules - /you/ decide what limitations you will accept in order to >> simplify the pre-processing script. >> >> So you would typically decide you only put these DisplayPrintf calls >> in C files, not headers, that you ignore all normal C preprocessor >> stuff, and that you keep each call entirely on one line, and that >> you'll never use the sequence "DisplayPrintf" for anything else. Then >> your Python preprocessor becomes : >> >> for this_line in open(filename).readlines() : >> if "DisplayPrintf" in line : >> handle(line) >> >> This is /vastly/ simpler than dealing with more general C code, >> without significant restrictions to you as the programmer using the >> system. >> >> If you /really/ want to handle include files, conditional compilation >> and all rest of it, get the C compiler to handle that - use "gcc -E" >> and use the output of that. Trying to duplicate that in your own >> Python code would be insane. > > And this is the reason why it appeared to me a complex task :-) > > You're right, this is my own tool and I decide the rules. Many times I > try to solve the complete and general problem when, in the reality, the > border of the the problem is much smaller. > > The only drawback is that YOU (and all the developers that work on the > project now and in the future) have to remember your own rules forever > for that project. This is embedded development. It is not always easy or straightforward. When a problem seems difficult, re-arrange it or subdivide it into things that you /can/ solve. Here I've given one solution (of many possible solutions) - it makes some things easier, but also requires other changes. You can use a big, general solution like gettext and document how that should work in your development, or you can make a much smaller and simpler, but more limited, custom solution and document /that/. There are /always/ pros and cons, tradeoffs and balances in this game. > > >>> This preprocessor should ingest a C source file after it is >>> preprocessed by the standard C preprocessor for the specific build >>> you are doing. >>> >>> For example, you could have a C source file that contains: >>> >>> #if BUILD == BUILD_FULL >>> DisplayPrintf(msg, "Press (1) for simple process, (2) for advanced >>> process"); >>> x = wait_keypress(); >>> if (x == '1') do_simple(); >>> if (x == '2') do_adv(); >>> #elif BUILD == BUILD_LIGHT >>> do_simple(); >>> #endif >>> >> >> The really simple answer is, don't do that. >> >> >>> If I'm building the project as BUILD_FULL, there's at least one >>> additional string to translate. >> >> The slightly more complex answer is that you end up with an extra >> string in one build or the other. Almost certainly, this is not worth >> bothering about. > > Oh yes, but that was only an example. We can think of other scenarios > where the preprocessor could change the string depending on the build. > As the saying goes, you can burn that bridge when you come to it. Imagining all the possible ways things can go wrong or be complicated can be a lot more effort than getting a solution for the actual practical situation. I am not guaranteeing that my ideas here will be ideal for your needs. But it is roughly in the direction of a system that I have used successfully myself, and it's where I would start out in the situation you described. Hopefully it gives you a good starting point for your own solution - or at least something to compare to other potential solutions when judging them.